<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover" />
<title>PlayersLab · Coaches</title>
<link rel="icon" href="/logo.png" />
<style>
  :root{
    --bg:#06090F; --raised:#0F141D; --raised2:#161C26; --sunken:#030508; --bone:#F7F7F2;
    --sec:rgba(247,247,242,.64); --muted:rgba(247,247,242,.40); --mutedHi:rgba(247,247,242,.55);
    --line:rgba(255,255,255,.07); --lineStrong:rgba(255,255,255,.13);
    --lime:#C7FF3D; --red:#E53845; --cyan:#5CD1FA; --amber:#FFB533;
    --cardGrad:linear-gradient(162deg,#1B212A 0%,#11151E 55%,#0C0F15 100%);
    --limeGrad:linear-gradient(135deg,#DBFF6B,#C7FF3D,#66E075);
    --mono:ui-monospace,SFMono-Regular,Menlo,"Roboto Mono",monospace;
    --round:ui-rounded,"SF Pro Rounded",system-ui,-apple-system,sans-serif;
  }
  *{box-sizing:border-box;-webkit-tap-highlight-color:transparent}
  html,body{margin:0;height:100%}
  body{background:linear-gradient(150deg,#111A1D 0%,#090E12 38%,#04060A 72%,#010205 100%) fixed,var(--bg);
    color:var(--bone);font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Helvetica,Arial,sans-serif;-webkit-font-smoothing:antialiased}
  button{font-family:inherit;cursor:pointer;border:0}
  input,select,textarea{font-family:inherit}
  .wrap{max-width:1180px;margin:0 auto;padding:0 22px}
  .hidden{display:none!important}
  .muted{color:var(--muted)}
  .mono{font-family:var(--mono)}

  /* Lacquered card surface (matches Theme.Card) */
  .sec{position:relative;background:var(--cardGrad);border-radius:22px;padding:18px;margin-bottom:14px;
    border:1px solid rgba(255,255,255,.10);box-shadow:0 2px 4px rgba(0,0,0,.5),0 14px 22px rgba(0,0,0,.34)}
  .sec::before{content:"";position:absolute;inset:0;border-radius:22px;pointer-events:none;
    background:linear-gradient(to bottom,rgba(255,255,255,.055),transparent 48%)}
  .sec>*{position:relative}
  /* Accent-bar monospace section header (matches SectionHeader) */
  .sec h3{display:flex;align-items:center;gap:8px;margin:0 0 13px;font-family:var(--mono);font-size:11px;
    font-weight:700;letter-spacing:1.6px;text-transform:uppercase;color:var(--lime)}
  .sec h3::before{content:"";width:18px;height:3px;border-radius:1px;background:var(--limeGrad);
    box-shadow:0 0 7px rgba(199,255,61,.55);flex:none}
  .row{display:flex;align-items:center;gap:10px}
  .grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(248px,1fr));gap:12px}

  /* Login */
  #login{min-height:100vh;display:flex;align-items:center;justify-content:center;padding:24px}
  .login-box{width:100%;max-width:392px;padding:34px 28px;text-align:center;background:var(--cardGrad);
    border-radius:24px;border:1px solid rgba(255,255,255,.10);box-shadow:0 2px 4px rgba(0,0,0,.5),0 18px 40px rgba(0,0,0,.45);position:relative}
  .login-box::before{content:"";position:absolute;inset:0;border-radius:24px;pointer-events:none;background:linear-gradient(to bottom,rgba(255,255,255,.06),transparent 45%)}
  .login-box>*{position:relative}
  .logo-tile{width:78px;height:78px;border-radius:19px;margin:0 auto 16px;overflow:hidden;
    box-shadow:0 12px 34px rgba(0,0,0,.55);border:1px solid var(--lineStrong)}
  .logo-tile img{width:100%;height:100%;object-fit:cover}
  .brand{font-family:var(--round);font-size:25px;font-weight:800;letter-spacing:.3px}
  .sub{color:var(--lime);font-family:var(--mono);font-size:11px;font-weight:700;letter-spacing:3px;text-transform:uppercase;margin-top:5px}
  .login-box input{width:100%;margin-top:12px;padding:14px;border-radius:13px;background:var(--sunken);border:1px solid var(--line);color:var(--bone);font-size:15px;outline:none}
  .login-box input:focus{border-color:var(--lime)}
  .btn{display:inline-flex;align-items:center;justify-content:center;gap:8px;font-weight:800;border-radius:13px}
  .btn-primary{background:var(--limeGrad);color:#0c1406;padding:14px 16px;font-size:15px;box-shadow:0 6px 18px rgba(199,255,61,.22)}
  .btn-primary:disabled{opacity:.55}
  .full{width:100%;margin-top:18px}
  .err{color:#ff8b8b;font-size:13px;margin-top:12px;min-height:16px;line-height:1.4}
  .hint{color:var(--muted);font-size:11.5px;margin-top:15px;line-height:1.55}
  .badge{color:var(--muted);font-family:var(--mono);font-size:9.5px;letter-spacing:.8px;margin-top:20px}

  /* Header */
  header{position:sticky;top:0;z-index:20;background:rgba(8,12,18,.82);backdrop-filter:blur(14px);border-bottom:1px solid var(--line)}
  .hrow{display:flex;align-items:center;gap:13px;padding:12px 0}
  .hlogo{width:44px;height:44px;border-radius:13px;overflow:hidden;border:1px solid var(--lineStrong);flex:none;background:rgba(199,255,61,.14)}
  .hlogo img{width:100%;height:100%;object-fit:cover}
  .htitle{font-family:var(--round);font-size:17px;font-weight:800;line-height:1.05}
  .htag{font-family:var(--mono);font-size:10px;color:var(--lime);font-weight:700;letter-spacing:1.6px;margin-top:1px}
  .spacer{flex:1}
  .teamsel{background:var(--sunken);color:var(--bone);border:1px solid var(--line);border-radius:11px;padding:9px 11px;font-size:13px;font-weight:700;max-width:200px}
  .ghost{background:rgba(255,255,255,.06);color:var(--bone);padding:9px 14px;border-radius:11px;font-weight:700;font-size:13px;border:1px solid var(--line)}

  main{padding:16px 0 120px;min-height:60vh}
  .loading{color:var(--muted);font-size:14px;padding:48px 0;text-align:center}
  .empty{color:var(--muted);font-size:13px;padding:8px 2px}

  /* Hero strip (matches "RUN THE ROOM") */
  .hero{height:66px;border-radius:16px;margin-bottom:14px;position:relative;overflow:hidden;border:1px solid var(--line)}
  .hero img{position:absolute;inset:0;width:100%;height:100%;object-fit:cover}
  .hero::after{content:"";position:absolute;inset:0;background:rgba(6,9,15,.5)}
  .hk{position:relative;z-index:1;display:flex;align-items:center;gap:8px;height:100%;padding:0 17px;font-family:var(--mono);font-size:11px;font-weight:700;letter-spacing:1.9px;color:var(--lime)}
  .hbar{width:15px;height:3px;border-radius:1px;background:var(--limeGrad);box-shadow:0 0 7px rgba(199,255,61,.6)}

  .chip{display:inline-block;font-family:var(--mono);font-size:10.5px;font-weight:700;letter-spacing:.6px;color:var(--mutedHi);background:rgba(255,255,255,.05);padding:5px 10px;border-radius:9px;border:1px solid var(--line)}
  .chip.lime{color:var(--lime);background:rgba(199,255,61,.10);border-color:rgba(199,255,61,.25)}

  /* Player cards */
  .pcard{position:relative;background:var(--cardGrad);border:1px solid rgba(255,255,255,.09);border-radius:17px;padding:14px;display:flex;align-items:center;gap:13px;text-align:left;width:100%;transition:border-color .15s,transform .05s;box-shadow:0 2px 4px rgba(0,0,0,.4)}
  .pcard:hover{border-color:rgba(199,255,61,.45)} .pcard:active{transform:scale(.99)}
  .ring{width:48px;height:48px;border-radius:50%;display:flex;align-items:center;justify-content:center;font-family:var(--round);font-weight:800;font-size:17px;flex:none;border:2px solid currentColor}
  .pname{font-weight:800;font-size:15px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
  .psub{font-family:var(--mono);font-size:10.5px;color:var(--muted);margin-top:3px}

  /* Score + KPIs */
  .scoreWrap{display:flex;align-items:center;gap:16px;flex-wrap:nowrap}
  @media(max-width:520px){.scoreWrap{flex-wrap:wrap}}
  .scoreBig{font-family:var(--round);font-size:44px;font-weight:800;line-height:.95}
  .band{font-family:var(--mono);font-size:11px;font-weight:800;letter-spacing:1.4px;text-transform:uppercase;margin-top:5px}
  .kpis{display:grid;grid-template-columns:repeat(4,1fr);gap:7px;flex:1;min-width:0}
  @media(max-width:420px){.kpis{grid-template-columns:repeat(2,1fr)}}
  .kpi{background:var(--raised2);border:1px solid var(--line);border-radius:13px;padding:9px 5px;text-align:center;overflow:hidden}
  .kpi .v{font-family:var(--round);font-size:19px;font-weight:800;white-space:nowrap}
  .kpi .l{font-family:var(--mono);font-size:8.5px;letter-spacing:.4px;color:var(--muted);text-transform:uppercase;margin-top:3px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}

  .tblWrap{overflow-x:auto;margin:0 -4px}
  table{width:100%;border-collapse:collapse;font-size:13px;min-width:520px}
  th,td{text-align:left;padding:10px 8px;border-bottom:1px solid var(--line);font-variant-numeric:tabular-nums;white-space:nowrap}
  th{font-family:var(--mono);font-size:9.5px;letter-spacing:.8px;color:var(--muted);text-transform:uppercase;font-weight:700}
  tr.clk:hover td{background:rgba(199,255,61,.05);cursor:pointer}
  .att{display:flex;gap:11px;align-items:flex-start;padding:11px;border-radius:13px;background:var(--raised2);border:1px solid var(--line);margin-bottom:8px;width:100%;text-align:left}
  .att .nm{font-weight:800;font-size:14px}
  .att .rs{font-size:11.5px;color:var(--mutedHi);margin-top:3px}
  .sev{width:9px;height:9px;border-radius:50%;margin-top:5px;flex:none}

  /* Team Report scoreboard + merged roster (iOS parity) ------------------- */
  .kpi.tap{cursor:pointer;transition:border-color .12s,background .12s}
  .kpi.tap:hover{border-color:rgba(247,247,242,.28)}
  .kpi.on{border-color:var(--red);background:rgba(229,56,69,.10)}
  .splitWrap{margin-top:14px}
  .splitLbl{font-family:var(--mono);font-size:9px;font-weight:800;letter-spacing:1.1px;color:var(--muted);text-transform:uppercase;margin-bottom:6px}
  .splitBar{display:flex;gap:2px;height:9px}
  .splitBar i{display:block;border-radius:3px}
  .splitLeg{display:flex;gap:11px;flex-wrap:wrap;margin-top:7px}
  .splitLeg span{font-family:var(--mono);font-size:9px;font-weight:800;color:var(--mutedHi);display:flex;align-items:center;gap:4px}
  .splitLeg i{width:6px;height:6px;border-radius:2px;display:inline-block}
  .drvToggle{display:flex;align-items:center;gap:6px;margin-top:13px;background:none;border:none;padding:0;
    font-family:var(--mono);font-size:9.5px;font-weight:800;letter-spacing:1.1px;color:var(--mutedHi);text-transform:uppercase;cursor:pointer}
  .drvBody{margin-top:9px;display:none}
  .drvBody.open{display:block}
  .drv{display:flex;gap:9px;align-items:flex-start;margin-top:8px}
  .drv .ar{font-size:13px;line-height:1.3;flex:none}
  .drv b{font-size:12.5px;font-weight:800;display:block}
  .drv span{font-size:11.5px;color:var(--mutedHi);display:block;line-height:1.45}
  .chips{display:flex;gap:6px;flex-wrap:wrap;margin:12px 0 4px}
  .fchip{font-family:var(--mono);font-size:9.5px;font-weight:800;letter-spacing:.8px;padding:6px 11px;border-radius:20px;
    background:var(--raised2);color:var(--mutedHi);border:1px solid var(--line);cursor:pointer;text-transform:uppercase}
  .fchip.on{background:var(--red);color:#fff;border-color:var(--red)}
  .fchip.on.allf{background:var(--lime);color:#0a0d10;border-color:var(--lime)}
  .prow{display:flex;gap:9px;align-items:stretch;padding:9px 0;border-bottom:1px solid var(--line);width:100%;
    background:none;border-left:none;border-right:none;border-top:none;text-align:left;cursor:pointer}
  .prow:hover{background:rgba(199,255,61,.04)}
  .prow .sevbar{width:4px;border-radius:2px;flex:none}
  .prow .pn{font-size:14px;font-weight:800}
  .prow .pr{font-size:11.5px;line-height:1.4;margin-top:2px}
  .prow .chev{color:var(--muted);font-weight:800;align-self:center;flex:none}
  .mline{display:grid;grid-template-columns:repeat(6,1fr);gap:5px;margin-top:7px}
  .mchip{background:var(--sunken);border:1px solid rgba(255,255,255,.05);border-radius:9px;padding:5px 2px;text-align:center;overflow:hidden}
  .mchip .v{font-family:var(--mono);font-size:12.5px;font-weight:800;line-height:1}
  .mchip .l{font-family:var(--mono);font-size:7.5px;font-weight:800;color:var(--muted);margin-top:2px;letter-spacing:.3px}
  .showAll{display:block;width:100%;background:none;border:none;padding:10px 0 2px;cursor:pointer;
    font-family:var(--mono);font-size:9.5px;font-weight:800;letter-spacing:1.1px;color:var(--lime);text-transform:uppercase}

  .field{display:flex;flex-direction:column;gap:6px;margin-bottom:12px}
  .field label{font-family:var(--mono);font-size:10px;letter-spacing:.7px;text-transform:uppercase;color:var(--muted);font-weight:700}
  .field input,.field select,.field textarea{background:var(--sunken);border:1px solid var(--line);color:var(--bone);border-radius:11px;padding:11px 12px;font-size:14px;outline:none}
  .field input:focus,.field select:focus,.field textarea:focus{border-color:var(--lime)}
  .asg{display:flex;gap:11px;align-items:center;padding:12px 2px;border-bottom:1px solid var(--line)}
  .k{font-family:var(--mono);font-size:9px;font-weight:800;letter-spacing:.6px;padding:4px 8px;border-radius:7px;background:rgba(91,209,250,.14);color:var(--cyan);text-transform:uppercase}
  .pct{font-family:var(--round);font-weight:800;font-size:17px}

  /* Bottom floating tab bar (matches CoachTabBar) */
  nav.tabs{position:fixed;left:50%;transform:translateX(-50%);bottom:16px;z-index:35;display:flex;gap:2px;
    padding:8px 10px;border-radius:28px;background:rgba(15,20,29,.92);backdrop-filter:blur(16px);
    border:1px solid var(--lineStrong);box-shadow:0 10px 34px rgba(0,0,0,.55);max-width:calc(100vw - 14px);overflow-x:auto}
  .tab{position:relative;display:flex;flex-direction:column;align-items:center;gap:3px;min-width:54px;padding:7px 11px;border-radius:18px;background:transparent}
  .tab .ti{font-size:17px;line-height:1;filter:grayscale(.4);opacity:.6}
  .tab .tl{font-size:10px;font-weight:700;color:var(--muted)}
  .tab.on .ti{filter:none;opacity:1}
  .tab.on .tl{color:var(--bone)}
  .tab .dot{position:absolute;top:2px;right:10px;min-width:17px;height:17px;padding:0 4px;border-radius:9px;background:var(--red);color:#fff;font-family:var(--mono);font-size:9.5px;font-weight:800;display:flex;align-items:center;justify-content:center;box-shadow:0 0 0 2px rgba(15,20,29,.9)}
  /* Segmented sub-switcher (Team = Roster|Health, Plan = Calendar|Assign) */
  .segbar{display:flex;gap:6px;margin:0 0 12px}
  .segb{flex:1;padding:8px 10px;border-radius:11px;background:var(--sunken);border:1px solid var(--line);color:var(--muted);font-size:12px;font-weight:700;cursor:pointer}
  .segb.on{background:var(--lime);color:#0f141d;border-color:var(--lime)}

  /* Player overlay */
  #overlay{position:fixed;inset:0;z-index:40;background:rgba(3,5,8,.66);backdrop-filter:blur(5px);display:flex;justify-content:center;overflow-y:auto}
  .sheet{background:var(--bg);width:100%;max-width:920px;min-height:100vh;border-left:1px solid var(--line);border-right:1px solid var(--line)}
  .sheet-head{position:sticky;top:0;background:rgba(8,12,18,.93);backdrop-filter:blur(14px);border-bottom:1px solid var(--line);padding:14px 20px;display:flex;align-items:center;gap:12px;z-index:5}
  .x{width:38px;height:38px;border-radius:50%;background:rgba(255,255,255,.07);border:1px solid var(--line);color:var(--bone);font-size:16px;font-weight:800;flex:none}
  .sheet-body{padding:18px 20px 80px}
  video{width:100%;border-radius:13px;background:#000;margin-top:6px}
  .film{margin-bottom:16px} .film .meta{display:flex;align-items:center;gap:8px;margin-bottom:2px;flex-wrap:wrap}
  .pill{font-family:var(--mono);font-size:9px;font-weight:800;letter-spacing:.6px;padding:4px 8px;border-radius:7px;text-transform:uppercase}
  .pill.req{background:rgba(91,209,250,.16);color:var(--cyan)} .pill.done{background:rgba(199,255,61,.16);color:var(--lime)}
  .mk{background:var(--limeGrad);color:#0c1406;font-weight:800;font-size:12px;padding:8px 13px;border-radius:11px;margin-top:8px;box-shadow:0 4px 12px rgba(199,255,61,.18)}
  .msg{display:flex;margin:7px 0}.bub{max-width:78%;padding:9px 13px;border-radius:14px;font-size:13.5px;line-height:1.35}
  .coach{justify-content:flex-end}.coach .bub{background:var(--limeGrad);color:#0c1406;border-bottom-right-radius:4px;font-weight:500}
  .player .bub{background:var(--raised2);color:var(--bone);border-bottom-left-radius:4px;border:1px solid var(--line)}
  .composer{display:flex;gap:8px;margin-top:12px}
  .composer textarea{flex:1;resize:none;background:var(--sunken);border:1px solid var(--line);color:var(--bone);border-radius:12px;padding:11px 12px;font-size:14px;outline:none;min-height:44px}
  .send{background:var(--limeGrad);color:#0c1406;font-weight:800;border-radius:12px;padding:10px 16px}.send:disabled{opacity:.55}
  .note-card{background:var(--raised2);border:1px solid var(--line);border-radius:13px;padding:12px;margin-bottom:9px}
  .note-card img{width:100%;border-radius:10px;margin-top:6px}.note-meta{font-family:var(--mono);font-size:9.5px;color:var(--muted);margin-top:6px;letter-spacing:.4px}
  .ftr{display:flex;align-items:center;justify-content:center;gap:8px;color:var(--muted);font-family:var(--mono);font-size:9.5px;letter-spacing:.6px;padding:10px 0 28px}
  .ftr img{width:18px;height:18px;border-radius:5px;opacity:.85}

  /* Markup studio */
  #markup{position:fixed;inset:0;z-index:60;background:#000;display:flex;flex-direction:column}
  .mk-head{display:flex;align-items:center;gap:12px;padding:12px 16px;background:#080c12;border-bottom:1px solid var(--line)}
  .mk-stage{flex:1;display:flex;align-items:center;justify-content:center;overflow:hidden;position:relative;padding:10px}
  .mk-stage video{max-width:100%;max-height:100%;width:auto;margin:0}
  #mkCanvas{max-width:100%;max-height:100%;touch-action:none;border-radius:10px;cursor:crosshair}
  .mk-cap{position:absolute;bottom:16px;left:50%;transform:translateX(-50%)}
  .mk-tools{background:#080c12;border-top:1px solid var(--line);padding:12px 16px;display:flex;flex-direction:column;gap:10px}
  .mk-row{display:flex;align-items:center;gap:8px;flex-wrap:wrap}
  .toolb{display:flex;align-items:center;gap:5px;font-size:12px;font-weight:800;color:var(--muted);background:rgba(199,255,61,.12);padding:7px 12px;border-radius:20px}
  .toolb.on{background:var(--limeGrad);color:#0c1406}
  .sw{width:24px;height:24px;border-radius:50%;border:2px solid rgba(255,255,255,.25)}.sw.on{border-color:#fff}
  .mk-note{flex:1;background:var(--sunken);border:1px solid var(--line);color:var(--bone);border-radius:11px;padding:9px 11px;font-size:13px;outline:none;min-width:140px}
  .mk-status{color:#ff8b8b;font-size:12px;min-height:14px}.mk-hint{color:var(--muted);font-size:11px}

  /* Field tab — lineup diamond + bullpen */
  .diamond{position:relative;width:100%;max-width:500px;margin:2px auto 8px;aspect-ratio:1/1;border-radius:18px;overflow:hidden;border:1px solid var(--line);background:radial-gradient(120% 100% at 50% 100%,#2f6b34 0%,#235227 45%,#1a3f1f 72%,#13301a 100%)}
  .infield{position:absolute;left:50%;top:64%;width:44%;height:44%;transform:translate(-50%,-50%) rotate(45deg);background:radial-gradient(circle,#8c6b3f,#6d5130);border:2px solid rgba(255,255,255,.14);border-radius:8px}
  .mound{position:absolute;left:50%;top:60%;width:8%;height:8%;transform:translate(-50%,-50%);border-radius:50%;background:#7d5d34;border:1px solid rgba(255,255,255,.18)}
  .plate{position:absolute;left:50%;top:86%;width:11px;height:11px;transform:translate(-50%,-50%) rotate(45deg);background:#f4f1e6;border:1px solid rgba(0,0,0,.3)}
  .slot{position:absolute;transform:translate(-50%,-50%);display:flex;flex-direction:column;align-items:center;gap:2px;width:64px;background:transparent;padding:0}
  .slot .sring{width:42px;height:42px;border-radius:50%;display:flex;align-items:center;justify-content:center;font-family:var(--round);font-weight:800;font-size:14px;border:2px solid currentColor;background:rgba(6,9,15,.74);box-shadow:0 2px 8px rgba(0,0,0,.55)}
  .slot.empty .sring{color:rgba(247,247,242,.5);border-style:dashed;font-size:18px}
  .slot .spos{font-family:var(--mono);font-size:8.5px;font-weight:800;letter-spacing:.4px;color:var(--bone);background:rgba(6,9,15,.66);padding:1px 5px;border-radius:5px}
  .slot .snm{font-size:9px;color:var(--bone);max-width:66px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;text-shadow:0 1px 3px #000;font-weight:700}
  .bchip{display:inline-flex;align-items:center;gap:7px;background:var(--raised2);border:1px solid var(--line);border-radius:11px;padding:7px 11px;margin:0 7px 7px 0;font-size:13px;font-weight:700;color:var(--bone)}
  .bdot{width:9px;height:9px;border-radius:50%;flex:none}
  .pen{display:grid;grid-template-columns:repeat(auto-fit,minmax(150px,1fr));gap:10px}
  .penzone{background:var(--raised2);border:1px solid var(--line);border-radius:14px;padding:12px;min-height:84px}
  .penzone h4{margin:0 0 8px;font-family:var(--mono);font-size:10px;font-weight:800;letter-spacing:1px;text-transform:uppercase;color:var(--mutedHi);display:flex;align-items:center;gap:6px}
  .arm{display:flex;align-items:center;gap:8px;padding:6px 0;border-bottom:1px solid var(--line);font-size:13px}
  .arm:last-child{border-bottom:0}
  .batrow{display:flex;align-items:center;gap:10px;padding:8px 2px;border-bottom:1px solid var(--line)}
  .batnum{font-family:var(--round);font-weight:800;font-size:15px;color:var(--lime);width:20px;text-align:center;flex:none}
  .pick{position:fixed;inset:0;z-index:55;background:rgba(3,5,8,.7);backdrop-filter:blur(5px);display:flex;align-items:center;justify-content:center;padding:20px}
  .pick-box{width:100%;max-width:380px;max-height:76vh;overflow:auto;background:var(--cardGrad);border:1px solid var(--lineStrong);border-radius:20px;padding:16px;box-shadow:0 18px 50px rgba(0,0,0,.55)}
  .pick-item{display:flex;align-items:center;gap:11px;width:100%;text-align:left;padding:10px 11px;border-radius:13px;background:var(--raised2);border:1px solid var(--line);margin-bottom:8px;color:var(--bone)}
  .pick-item:hover{border-color:rgba(199,255,61,.42)}
  .mini{font-size:13px;font-weight:800;padding:4px 10px;border-radius:9px;background:rgba(199,255,61,.14);color:var(--lime);cursor:pointer}
  .xmini{background:rgba(255,255,255,.06);border:1px solid var(--line);color:var(--mutedHi);min-width:24px;height:24px;border-radius:7px;font-size:12px;font-weight:800;flex:none;display:flex;align-items:center;justify-content:center}

  /* Coach calendar (player folder) */
  .cal{display:grid;grid-template-columns:repeat(7,1fr);gap:4px;margin-top:8px}
  .cal .dow{font-family:var(--mono);font-size:8.5px;letter-spacing:.6px;color:var(--muted);text-align:center;text-transform:uppercase;padding:2px 0}
  .cald{position:relative;aspect-ratio:1/.82;border-radius:10px;background:var(--raised2);border:1px solid var(--line);color:var(--bone);
    font-size:12px;font-weight:700;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:3px;padding:2px}
  .cald.blank{background:transparent;border-color:transparent}
  .cald.today{border-color:rgba(199,255,61,.5)}
  .cald.sel{background:rgba(199,255,61,.14);border-color:var(--lime)}
  .cald .dots{display:flex;gap:2px;min-height:5px}
  .cald .dots i{width:5px;height:5px;border-radius:50%;display:block}
  .evrow{display:flex;gap:10px;align-items:flex-start;padding:10px 2px;border-bottom:1px solid var(--line)}
  .evrow:last-child{border-bottom:0}
  .evpill{font-family:var(--mono);font-size:8.5px;font-weight:800;letter-spacing:.5px;padding:4px 7px;border-radius:7px;text-transform:uppercase;flex:none;margin-top:1px;background:rgba(255,255,255,.07)}

  /* Day-by-day program builder */
  .pick-box.wide{max-width:600px}
  .pgday{background:var(--raised2);border:1px solid var(--line);border-radius:14px;padding:12px;margin-bottom:10px}
  .pgday h5{margin:0 0 8px;font-family:var(--mono);font-size:10px;font-weight:800;letter-spacing:1px;color:var(--lime);text-transform:uppercase;display:flex;align-items:center;gap:8px}
  .pgin{background:var(--sunken);border:1px solid var(--line);color:var(--bone);border-radius:9px;padding:8px 9px;font-size:13px;outline:none;min-width:0}
  .pgin:focus{border-color:var(--lime)}
  .pgrow{display:flex;gap:6px;margin-bottom:6px;flex-wrap:wrap}
  .pgrow .pgin{flex:1}
</style>
</head>
<body>

<section id="login">
  <div class="login-box">
    <div class="logo-tile"><img src="/logo.png" alt="PlayersLab" /></div>
    <div class="brand">PlayersLab</div>
    <div class="sub">Coaches</div>
    <form id="loginForm" autocomplete="on">
      <input id="email" type="email" placeholder="Email" autocomplete="username" required />
      <input id="password" type="password" placeholder="Password" autocomplete="current-password" required />
      <button class="btn btn-primary full" id="loginBtn" type="submit">Sign in</button>
    </form>
    <div class="err" id="loginErr"></div>
    <div class="hint" style="margin-top:8px"><a href="#" id="forgotLink" style="color:var(--lime);text-decoration:none;font-weight:700">Forgot password?</a></div>
    <div class="hint">Run your whole roster from any computer or iPad — readiness, workload, film review &amp; markup, assignments, and messaging. Sign in with your PlayersLab account.</div>
    <div class="badge">PLAYERSLAB · PATENT PENDING · A FOUNDING 500 PRODUCT</div>
  </div>
</section>

<div id="app" class="hidden">
  <header>
    <div class="wrap hrow">
      <div class="hlogo"><img src="/logo.png" alt="PlayersLab" id="hlogoImg" /></div>
      <div><div class="htitle" id="orgName">PlayersLab</div><div class="htag">COACHES</div></div>
      <div class="spacer"></div>
      <select class="teamsel hidden" id="teamSel"></select>
      <button class="ghost" id="signOut">Sign out</button>
    </div>
  </header>
  <main class="wrap" id="main"><div class="loading" id="boot">Loading your teams…</div></main>
  <nav class="tabs" id="tabs">
    <button class="tab on" data-tab="team"><span class="ti">👥</span><span class="tl">Team</span><span class="dot hidden" id="rosterDot"></span></button>
    <button class="tab" data-tab="plan"><span class="ti">📅</span><span class="tl">Plan</span></button>
    <button class="tab" data-tab="field"><span class="ti">⚾</span><span class="tl">Field</span></button>
    <button class="tab" data-tab="cy"><span class="ti">✨</span><span class="tl">Cy</span></button>
    <button class="tab" data-tab="manage"><span class="ti">⚙️</span><span class="tl">Manage</span></button>
  </nav>
  <div class="wrap ftr"><img src="/logo.png" alt="">PLAYERSLAB · PATENT PENDING · A FOUNDING 500 PRODUCT</div>
</div>

<div id="overlay" class="hidden">
  <div class="sheet">
    <div class="sheet-head"><button class="x" id="closePlayer">✕</button>
      <div><div class="htitle" id="pTitle">Player</div><div class="htag" id="pTag"></div></div></div>
    <div class="sheet-body" id="pBody"><div class="loading">Loading…</div></div>
  </div>
</div>

<div id="markup" class="hidden">
  <div class="mk-head"><button class="x" id="mkClose">✕</button>
    <div class="htitle" style="flex:1" id="mkTitle">Mark up</div>
    <button class="send" id="mkSend" disabled>Send to player</button></div>
  <div class="mk-stage" id="mkStage">
    <div class="loading" id="mkLoading">Loading clip…</div>
    <video id="mkVideo" playsinline controls class="hidden"></video>
    <canvas id="mkCanvas" class="hidden"></canvas>
    <button class="btn btn-primary mk-cap hidden" id="mkCapture">Use this frame</button>
  </div>
  <div class="mk-tools hidden" id="mkTools">
    <div class="mk-row">
      <button class="toolb on" data-tool="pen">✎ Draw</button>
      <button class="toolb" data-tool="arrow">↗ Arrow</button>
      <button class="toolb" data-tool="circle">◯ Circle</button>
      <span style="flex:1"></span>
      <span class="sw on" data-color="#E53845" style="background:#E53845"></span>
      <span class="sw" data-color="#FFB533" style="background:#FFB533"></span>
      <span class="sw" data-color="#C7FF3D" style="background:#C7FF3D"></span>
      <span class="sw" data-color="#5CD1FA" style="background:#5CD1FA"></span>
      <span class="sw" data-color="#FFFFFF" style="background:#FFFFFF"></span>
      <button class="toolb" id="mkClear">⌫ Clear</button>
      <button class="toolb" id="mkRetake">↺ Retake</button>
    </div>
    <div class="mk-row"><input class="mk-note" id="mkNote" placeholder="Add a note to the player (optional)" /><button class="toolb" id="mkVoice">🎙 Voice</button><span id="mkVoiceTag" class="hidden" style="color:var(--lime);font-size:11px;font-weight:800">✓ voice</span></div>
    <div class="mk-status" id="mkStatus"></div>
    <div class="mk-hint">Pause on the frame you want, tap “Use this frame,” draw, then send. Sending marks the clip reviewed; the player sees it under “From your coach.”</div>
  </div>
</div>

<script>
const SUPABASE_URL="https://jgvitsgbvokzqwckkjjv.supabase.co";
const ANON="eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJzdXBhYmFzZSIsInJlZiI6Impndml0c2didm9renF3Y2tramp2Iiwicm9sZSI6ImFub24iLCJpYXQiOjE3NzkwNjg0OTAsImV4cCI6MjA5NDY0NDQ5MH0.JCBEumn0WD3UYosPRAkum_3OFHVFcxNKbuD0uYgzszk";
const HIGH_WORKLOAD=120;
let TOKEN=null,REFRESH=null,MYUID=null,TEAMS=[],SEL=null,TAB="team",SUBTEAM="roster",SUBPLAN="calendar",CACHE={},FILM_BY_ID={},CURRENT_TEAM=null,CURRENT_MEMBER=null;
// Self-planned workout specifics: player-built loadouts sync with a blank
// moveName, so calendar detail lines resolve "custom:<uuid>" refs against the
// player's own custom exercises. Cached per userId as the coach opens folders.
let CUSTOM_EX_BY_PLAYER={};

const $=s=>document.querySelector(s);
// Exercise library mirror (regenerate from ios/PitchLabAi/WorkoutModels.swift +
// TrainModels.swift ArmCareExercise when those change). Player-built loadouts
// sync with a blank moveName and arm-care routines carry only exercise ids, so
// the coach view resolves names/targets/prescriptions against this map, with
// the player's custom exercises (customExercises/customArmcare) on top.
const EX_LIB={"lb-back-squat":{"name":"Barbell Back Squat","target":"Quads / Glutes","sr":"4 \u00d7 5"},"lb-front-squat":{"name":"Front Squat","target":"Quads / Trunk","sr":"4 \u00d7 5"},"lb-trap-bar-dl":{"name":"Trap-Bar Deadlift","target":"Posterior chain / Power","sr":"4 \u00d7 4"},"lb-rdl":{"name":"Romanian Deadlift","target":"Hamstrings / Glutes","sr":"3 \u00d7 8"},"lb-rfe-split":{"name":"Rear-Foot Elevated Split Squat","target":"Single-leg / Quads","sr":"3 \u00d7 6 each"},"lb-reverse-lunge":{"name":"DB Reverse Lunge","target":"Quads / Glutes","sr":"3 \u00d7 8 each"},"lb-walking-lunge":{"name":"Walking Lunge","target":"Quads / Glutes","sr":"3 \u00d7 10 yards"},"lb-single-leg-rdl":{"name":"Single-Leg RDL","target":"Hamstring / Glute / Balance","sr":"3 \u00d7 8 each"},"lb-step-up":{"name":"DB Step-Up (Knee-Height Box)","target":"Quads / Glutes","sr":"3 \u00d7 6 each"},"lb-hip-thrust":{"name":"Barbell Hip Thrust","target":"Glutes / Hip Extension","sr":"3 \u00d7 8"},"lb-glute-bridge":{"name":"Single-Leg Glute Bridge","target":"Glutes","sr":"3 \u00d7 10 each"},"lb-goblet-squat":{"name":"Goblet Squat","target":"Quads / Trunk","sr":"3 \u00d7 8"},"lb-nordic":{"name":"Nordic Hamstring Curl","target":"Hamstring Eccentric","sr":"3 \u00d7 5"},"lb-copenhagen":{"name":"Copenhagen Plank","target":"Adductor / Core","sr":"3 \u00d7 20s each"},"lb-cossack-squat":{"name":"Cossack Squat","target":"Adductor / Hip Mobility","sr":"3 \u00d7 6 each"},"lb-box-jump":{"name":"Box Jump","target":"Lower-half Power","sr":"4 \u00d7 3"},"lb-broad-jump":{"name":"Broad Jump","target":"Horizontal Power","sr":"4 \u00d7 3"},"lb-skater-bound":{"name":"Skater Bound","target":"Lateral Power","sr":"3 \u00d7 6 each"},"lb-depth-drop":{"name":"Depth Drop (Landing Mechanics)","target":"Landing Stiffness","sr":"3 \u00d7 5"},"lb-vertical-jump":{"name":"Countermovement Vertical Jump","target":"Vertical Power","sr":"4 \u00d7 3"},"ub-bench":{"name":"Barbell Bench Press","target":"Chest / Tri / Shoulder","sr":"4 \u00d7 5"},"ub-floor-press":{"name":"DB Floor Press","target":"Chest / Tri","sr":"4 \u00d7 8"},"ub-incline-db":{"name":"Incline DB Press","target":"Upper Chest / Front Delt","sr":"3 \u00d7 8"},"ub-landmine-press":{"name":"Half-Kneeling Landmine Press","target":"Shoulder / Scap","sr":"3 \u00d7 8 each"},"ub-push-up":{"name":"Push-Up","target":"Chest / Core","sr":"3 \u00d7 12"},"ub-pushup-plus":{"name":"Push-Up Plus","target":"Serratus","sr":"3 \u00d7 10"},"ub-row-chest-supported":{"name":"Chest-Supported Row","target":"Mid-back / Rhomboids","sr":"4 \u00d7 10"},"ub-pull-up":{"name":"Pull-Up / Lat Pulldown","target":"Lats","sr":"4 \u00d7 6"},"ub-1arm-row":{"name":"Single-Arm DB Row","target":"Lat / Mid-back","sr":"3 \u00d7 10 each"},"ub-meadows-row":{"name":"Meadows Row","target":"Lat","sr":"3 \u00d7 10 each"},"ub-inverted-row":{"name":"Inverted Row","target":"Mid-back / Scap","sr":"3 \u00d7 10"},"ub-face-pull":{"name":"Cable Face Pull","target":"Rear Delt / Cuff","sr":"3 \u00d7 12"},"ub-ohp":{"name":"Barbell Overhead Press","target":"Shoulder / Triceps / Trunk","sr":"4 \u00d7 5"},"ub-db-shoulder-press":{"name":"Seated DB Shoulder Press","target":"Shoulder / Triceps","sr":"3 \u00d7 8"},"ub-z-press":{"name":"Seated Z-Press","target":"Shoulder / Anti-Extension","sr":"3 \u00d7 6"},"ub-bent-row":{"name":"Barbell Bent-Over Row","target":"Mid-back / Lats","sr":"4 \u00d7 6"},"ub-pendlay-row":{"name":"Pendlay Row","target":"Mid-back / Lats","sr":"4 \u00d7 5"},"ub-dip":{"name":"Parallel Bar Dip","target":"Chest / Tri","sr":"3 \u00d7 8"},"ub-arnold-press":{"name":"Arnold Press","target":"Shoulder / Cuff","sr":"3 \u00d7 10"},"ub-pushpress":{"name":"Push Press","target":"Power / Shoulder","sr":"4 \u00d7 3"},"fb-power-clean":{"name":"Power Clean","target":"Triple Extension / Power","sr":"5 \u00d7 3"},"fb-hang-clean":{"name":"Hang Clean (Above Knee)","target":"Hip Power","sr":"4 \u00d7 3"},"fb-hang-snatch":{"name":"Hang Snatch (Above Knee)","target":"Power / Mobility","sr":"4 \u00d7 3"},"fb-clean-press":{"name":"DB Clean & Press","target":"Total-Body Power","sr":"4 \u00d7 6"},"fb-thruster":{"name":"Thruster","target":"Legs + Shoulders","sr":"4 \u00d7 8"},"fb-kb-swing":{"name":"Kettlebell Swing","target":"Posterior Chain Power","sr":"5 \u00d7 10"},"fb-tgu":{"name":"Turkish Get-Up","target":"Total-Body Stability","sr":"3 \u00d7 3 each"},"fb-burpee":{"name":"Burpee","target":"Conditioning","sr":"4 \u00d7 8"},"fb-bear-crawl":{"name":"Bear Crawl","target":"Core + Shoulder Stability","sr":"3 \u00d7 15 yards"},"fb-renegade-row":{"name":"Renegade Row","target":"Core + Lat","sr":"3 \u00d7 6 each"},"fb-db-snatch":{"name":"Single-Arm DB Snatch","target":"Hip Power","sr":"4 \u00d7 5 each"},"fb-clean-pull":{"name":"Clean Pull","target":"Triple Extension","sr":"4 \u00d7 3"},"rot-mb-rot-slam":{"name":"Med-Ball Rotational Slam","target":"Rotational Power","sr":"4 \u00d7 5 each"},"rot-mb-shotput":{"name":"Med-Ball Shot-Put Throw","target":"Power Transfer","sr":"4 \u00d7 5 each"},"rot-mb-scoop":{"name":"Med-Ball Scoop Toss","target":"Posterior Chain Power","sr":"4 \u00d7 5 each"},"rot-mb-step-and-throw":{"name":"Step-and-Throw Med Ball","target":"Sequencing","sr":"4 \u00d7 5 each"},"rot-mb-overhead-slam":{"name":"Med-Ball Overhead Slam","target":"Anterior Core","sr":"4 \u00d7 6"},"rot-cable-chop":{"name":"Cable Chop (High to Low)","target":"Trunk Rotation","sr":"3 \u00d7 8 each"},"rot-cable-lift":{"name":"Cable Lift (Low to High)","target":"Trunk Rotation","sr":"3 \u00d7 8 each"},"rot-landmine-rot":{"name":"Landmine Rotation","target":"Trunk Power","sr":"3 \u00d7 6 each"},"core-pallof":{"name":"Pallof Press","target":"Anti-Rotation","sr":"3 \u00d7 10 each"},"core-deadbug":{"name":"Dead Bug","target":"Anti-Extension","sr":"3 \u00d7 8 each"},"core-hollow-hold":{"name":"Hollow Body Hold","target":"Anterior Core","sr":"3 \u00d7 30s"},"core-side-plank":{"name":"Side Plank w/ Reach","target":"Obliques / QL","sr":"3 \u00d7 30s each"},"core-suitcase-carry":{"name":"Single-Arm Suitcase Carry","target":"Anti-Lateral Flexion","sr":"3 \u00d7 30 yards each"},"core-farmer-carry":{"name":"Farmer Carry","target":"Grip / Trunk","sr":"3 \u00d7 40 yards"},"core-hl-raise":{"name":"Hanging Leg Raise","target":"Lower Abs / Hip Flexors","sr":"3 \u00d7 8"},"core-ab-rollout":{"name":"Ab Wheel Rollout","target":"Anterior Core","sr":"3 \u00d7 6"},"core-mcgill":{"name":"McGill Curl-Up","target":"Anterior Core","sr":"3 \u00d7 8"},"core-bird-dog":{"name":"Bird Dog","target":"Core Coordination","sr":"3 \u00d7 8 each"},"acc-trap3":{"name":"Trap-3 Raise","target":"Lower Trap","sr":"3 \u00d7 10 each"},"acc-cuff-er-side":{"name":"Side-Lying DB External Rotation","target":"Infraspinatus","sr":"3 \u00d7 12 each"},"acc-cuff-prone-er":{"name":"Prone DB External Rotation","target":"Posterior Cuff","sr":"3 \u00d7 10 each"},"acc-bottoms-up-press":{"name":"Bottoms-Up KB Press","target":"Cuff Stability","sr":"3 \u00d7 5 each"},"acc-band-pullapart":{"name":"Band Pull-Apart","target":"Rear Delt / Scap","sr":"3 \u00d7 15"},"acc-no-money":{"name":"Band No-Money Drill","target":"External Rotators","sr":"3 \u00d7 12"},"acc-curl":{"name":"DB Hammer Curl","target":"Biceps / Brachialis","sr":"3 \u00d7 10"},"acc-tricep-ext":{"name":"Cable Tricep Pushdown","target":"Triceps","sr":"3 \u00d7 12"},"acc-wrist-roller":{"name":"Wrist Roller","target":"Forearm Endurance","sr":"2 \u00d7 up + down"},"cond-sprint-30":{"name":"30-Yard Sprint","target":"Alactic Power","sr":"6 \u00d7 1"},"cond-pole-sprint":{"name":"Foul Pole Sprint","target":"Aerobic / Recovery","sr":"6 \u00d7 1"},"cond-sled-push":{"name":"Sled Push","target":"Power / Posterior Chain","sr":"4 \u00d7 20 yards"},"cond-airbike":{"name":"Air Bike Sprints","target":"Anaerobic","sr":"6 \u00d7 20s on / 40s off"},"cond-jumprope":{"name":"Jump Rope","target":"Calves / Foot Speed","sr":"3 \u00d7 2 min"},"mob-openbook":{"name":"Open Book Rotation","target":"Thoracic","sr":"2 \u00d7 6 each"},"mob-90-90-switch":{"name":"90/90 Hip Switch","target":"Hip Rotation","sr":"2 \u00d7 8 each"},"mob-wgs":{"name":"World's Greatest Stretch","target":"Full-body Hip + T-spine","sr":"1 \u00d7 5 each"},"mob-couch":{"name":"Couch Stretch","target":"Hip Flexor / Quad","sr":"2 \u00d7 45s each"},"mob-crossbody":{"name":"Crossbody Stretch","target":"Posterior Capsule","sr":"2 \u00d7 30s"},"mob-shoulder-cars":{"name":"Shoulder CARs","target":"Shoulder Joint","sr":"2 \u00d7 5 each"},"mob-tspine-extension":{"name":"Foam Roller T-Spine Extension","target":"Thoracic Extension","sr":"3 \u00d7 5 levels"},"ub-1arm-db-ohp":{"name":"Single-Arm DB Overhead Press","target":"Shoulder / Anti-Lateral","sr":"3 \u00d7 8 each"},"ub-1arm-landmine-ohp":{"name":"Tall-Kneeling 1-Arm Landmine Press","target":"Shoulder / Scap / Core","sr":"3 \u00d7 8 each"},"ub-larsen-press":{"name":"Larsen Press","target":"Chest / Tri / Stability","sr":"4 \u00d7 6"},"ub-cable-y-raise":{"name":"Cable Y-Raise","target":"Lower Trap / Scap","sr":"3 \u00d7 12"},"ub-trap-bar-shrug":{"name":"Trap-Bar Shrug","target":"Upper Trap / Grip","sr":"3 \u00d7 8"},"ub-chinup-weighted":{"name":"Weighted Chin-Up","target":"Lat / Bi","sr":"4 \u00d7 5"},"ub-half-kneel-ohp":{"name":"Half-Kneeling 1-Arm KB Press","target":"Shoulder / Core","sr":"3 \u00d7 6 each"},"push-close-grip-bench":{"name":"Close-Grip Bench Press","target":"Triceps / Chest","sr":"4 \u00d7 6"},"push-spoto-press":{"name":"Spoto Press","target":"Chest / Stability","sr":"4 \u00d7 6"},"push-plyo-pushup":{"name":"Plyo Push-Up","target":"Upper-Body Power","sr":"4 \u00d7 5"},"push-banded-pushup":{"name":"Banded Push-Up","target":"Chest / Tri / Serratus","sr":"3 \u00d7 8"},"push-pin-press":{"name":"Pin Press","target":"Triceps / Lockout","sr":"4 \u00d7 4"},"pull-weighted-pullup":{"name":"Weighted Pull-Up","target":"Lats","sr":"4 \u00d7 4"},"pull-tbar-row":{"name":"Chest-Supported T-Bar Row","target":"Mid-back","sr":"4 \u00d7 8"},"pull-1arm-cable-row":{"name":"1-Arm Cable Row","target":"Lat / Rear Delt","sr":"3 \u00d7 10 each"},"pull-helms-row":{"name":"Helms Row","target":"Upper Back","sr":"3 \u00d7 12"},"pull-snatch-grip-row":{"name":"Snatch-Grip Bent Row","target":"Upper Back / Rear Delt","sr":"3 \u00d7 8"},"pull-seated-cable":{"name":"Seated Cable Row","target":"Mid-back / Lats","sr":"3 \u00d7 10"},"core-copenhagen":{"name":"Copenhagen Side Plank","target":"Adductors / Obliques","sr":"3 \u00d7 20s each"},"core-stir-the-pot":{"name":"Stir-the-Pot","target":"Anterior Core / Shoulder Stab","sr":"3 \u00d7 6 each direction"},"core-pallof-iso":{"name":"Pallof Iso-Hold","target":"Anti-Rotation","sr":"3 \u00d7 30s each"},"core-anti-walkout":{"name":"Banded Anti-Rotation Walkout","target":"Anti-Rotation","sr":"3 \u00d7 8 each"},"core-bear-hug-carry":{"name":"Sandbag Bear-Hug Carry","target":"Anti-Flexion / Breathing","sr":"3 \u00d7 30 yards"},"core-loaded-carry-overhead":{"name":"Single-Arm Overhead Carry","target":"Shoulder Stab / Anti-Lateral","sr":"3 \u00d7 20 yards each"},"rot-mb-reverse-throw":{"name":"Reverse Med-Ball Throw","target":"Posterior Chain Power","sr":"4 \u00d7 5"},"rot-mb-side-toss":{"name":"Med-Ball Side Toss (Partner/Wall)","target":"Rotational Velocity","sr":"4 \u00d7 6 each"},"rot-mb-step-back":{"name":"Step-Back Rotational Throw","target":"Coiling / Stretch-Reflex","sr":"4 \u00d7 5 each"},"rot-landmine-press-rot":{"name":"Rotational Landmine Press","target":"Hip-Drive Press","sr":"3 \u00d7 6 each"},"rot-hop-and-throw":{"name":"Lateral Hop + Rotational Throw","target":"Reactive Rotation","sr":"3 \u00d7 4 each"},"rot-cable-rotation-stand":{"name":"Standing Cable Rotation","target":"Trunk Rotation","sr":"3 \u00d7 10 each"},"plyo-single-leg-box":{"name":"Single-Leg Box Jump","target":"Unilateral Power","sr":"3 \u00d7 3 each"},"plyo-heiden":{"name":"Heiden Bound (Lateral Speed-Skater)","target":"Lateral Power / Stride","sr":"3 \u00d7 5 each"},"plyo-bounding":{"name":"Bounding (Linear)","target":"Linear Stride Power","sr":"3 \u00d7 20 yards"},"plyo-mb-chest-pass":{"name":"Med-Ball Chest Pass","target":"Upper-Body Power","sr":"4 \u00d7 6"},"plyo-mb-power-drop":{"name":"Med-Ball Power Drop","target":"Eccentric Catching Power","sr":"3 \u00d7 5"},"plyo-single-leg-pogo":{"name":"Single-Leg Pogo","target":"Ankle Stiffness","sr":"3 \u00d7 10 each"},"plyo-drop-jump":{"name":"Drop Jump","target":"Reactive Power","sr":"3 \u00d7 4"},"cond-tempo-100":{"name":"Tempo 100s","target":"Aerobic Power","sr":"10 \u00d7 100 yds @ 70%"},"cond-hill-sprint":{"name":"Hill Sprint","target":"Power-Endurance","sr":"8 \u00d7 15s up"},"cond-150-shuttle":{"name":"150-Yard Shuttle","target":"Anaerobic Capacity","sr":"6 \u00d7 25 yd \u00d7 6"},"cond-battle-ropes":{"name":"Battle Ropes","target":"Upper-Body Conditioning","sr":"5 \u00d7 30s on / 30s off"},"cond-loaded-carry-medley":{"name":"Loaded Carry Medley","target":"Work Capacity","sr":"4 \u00d7 40 yds farmer + 40 yds front-rack"},"fb-trap-bar-jump-sq":{"name":"Trap-Bar Jump Squat","target":"Power","sr":"4 \u00d7 3"},"fb-kb-snatch":{"name":"Single-Arm KB Snatch","target":"Total-Body Power","sr":"4 \u00d7 5 each"},"fb-sandbag-clean":{"name":"Sandbag Clean to Shoulder","target":"Grip / Power","sr":"4 \u00d7 4 each"},"fb-clean-and-jerk":{"name":"DB Clean & Jerk","target":"Power / Overhead","sr":"4 \u00d7 4"},"fb-1arm-kb-clean":{"name":"Single-Arm KB Clean","target":"Hip Power / Catch","sr":"4 \u00d7 5 each"},"fb-deadbug-press":{"name":"Deadbug w/ DB Press","target":"Anti-Extension + Press","sr":"3 \u00d7 6 each"},"acc-prone-y":{"name":"Prone Y Raise","target":"Lower Trap","sr":"3 \u00d7 12"},"acc-prone-t":{"name":"Prone T Raise","target":"Mid Trap / Rhomboid","sr":"3 \u00d7 12"},"acc-prone-w":{"name":"Prone W Raise","target":"Posterior Cuff","sr":"3 \u00d7 12"},"acc-powell-raise":{"name":"Side-Lying Powell Raise","target":"Cuff / Scap Control","sr":"3 \u00d7 10 each"},"acc-wrist-curl":{"name":"DB Wrist Curl","target":"Forearm Flexors","sr":"3 \u00d7 15"},"acc-reverse-wrist-curl":{"name":"Reverse Wrist Curl","target":"Forearm Extensors","sr":"3 \u00d7 15"},"acc-pronation-supination":{"name":"Hammer Pronation/Supination","target":"Forearm Rotators","sr":"3 \u00d7 10 each"},"acc-reverse-pec-deck":{"name":"Reverse Pec-Deck","target":"Rear Delt","sr":"3 \u00d7 15"},"ex-jaegerband-ir":{"name":"J-Band IR @ 90\u00b0","target":"Cuff","sr":"2 \u00d7 15"},"ex-jaegerband-er":{"name":"J-Band ER @ 90\u00b0","target":"Cuff","sr":"2 \u00d7 15"},"ex-jaegerband-fwd":{"name":"J-Band Forward Punch","target":"Serratus","sr":"2 \u00d7 15"},"ex-jaegerband-rev":{"name":"J-Band Reverse Throw","target":"Decel chain","sr":"2 \u00d7 15"},"ex-jaegerband-pull":{"name":"J-Band Lawnmower Pull","target":"Lat / scap","sr":"2 \u00d7 12 each"},"ex-jaegerband-statue":{"name":"J-Band Statue of Liberty","target":"Cuff","sr":"2 \u00d7 15"},"ex-yt-w":{"name":"Prone Y-T-W","target":"Scap","sr":"2 \u00d7 8 each"},"ex-scap-pushup":{"name":"Scap Push-Up","target":"Serratus","sr":"2 \u00d7 12"},"ex-band-pullapart":{"name":"Band Pull-Apart","target":"Rear delt / scap","sr":"3 \u00d7 15"},"ex-band-facepull":{"name":"Band Face Pull","target":"Rear delt / cuff","sr":"3 \u00d7 12"},"ex-plyo-pivot":{"name":"Plyo Pivot Pickoff (1kg)","target":"Lay-back","sr":"3 \u00d7 6"},"ex-plyo-reverse":{"name":"Reverse Plyo Throw (2lb)","target":"Cuff","sr":"3 \u00d7 6"},"ex-plyo-rollin":{"name":"Roll-In Plyo (450g)","target":"Arm path","sr":"3 \u00d7 5"},"ex-plyo-walking-windup":{"name":"Walking Windup Plyo (1kg)","target":"Sequencing","sr":"3 \u00d7 5"},"ex-plyo-rocker":{"name":"Rocker Plyo (1kg)","target":"Lower half","sr":"3 \u00d7 6"},"ex-plyo-drop-step":{"name":"Drop-Step Plyo (1kg)","target":"Hip / torque","sr":"3 \u00d7 5"},"ex-plyo-throw-down":{"name":"Throw-Down Plyo (2kg)","target":"Power transfer","sr":"3 \u00d7 6"},"ex-shoulder-tube":{"name":"Shoulder Tube Oscillations","target":"Cuff prep","sr":"1 \u00d7 30s each plane"},"ex-cuban-press":{"name":"Cuban Press (light DB)","target":"Cuff / scap","sr":"2 \u00d7 10"},"ex-armcircle":{"name":"Arm Circles (Big to Small)","target":"Shoulder warmup","sr":"1 \u00d7 30s each direction"},"ex-bw-leg-swings-fwd":{"name":"Forward Leg Swings","target":"Hip flexor / hamstring","sr":"1 \u00d7 12 each"},"ex-bw-leg-swings-side":{"name":"Lateral Leg Swings","target":"Adductor / abductor","sr":"1 \u00d7 12 each"},"ex-bw-knee-hugs":{"name":"Walking Knee Hugs","target":"Glute / hip flexor","sr":"1 \u00d7 10 each"},"ex-bw-toy-soldiers":{"name":"Toy Soldier Walks","target":"Hamstring dynamic","sr":"1 \u00d7 10 each"},"ex-bw-a-skip":{"name":"A-Skips","target":"Lower body coordination","sr":"2 \u00d7 20 yards"},"ex-bw-inchworm":{"name":"Inchworm to Push-Up","target":"Full body warmup","sr":"1 \u00d7 6"},"ex-bw-lateral-lunge":{"name":"Lateral Lunge","target":"Adductor / glute","sr":"2 \u00d7 8 each"},"ex-bw-cossack":{"name":"Cossack Squat","target":"Adductor / hip mobility","sr":"2 \u00d7 6 each"},"ex-bw-glute-bridge":{"name":"Glute Bridge March","target":"Glute activation","sr":"2 \u00d7 10 each"},"ex-bw-pogo":{"name":"Pogo Hops","target":"Reactive lower body","sr":"2 \u00d7 20"},"ex-bw-high-knees":{"name":"High Knees","target":"Hip flexor activation","sr":"2 \u00d7 20 yards"},"ex-bw-butt-kicks":{"name":"Butt Kicks","target":"Hamstring activation","sr":"2 \u00d7 20 yards"},"ex-bw-side-shuffle":{"name":"Lateral Side Shuffle","target":"Lateral hip / ankle","sr":"2 \u00d7 20 yards each"},"ex-bw-walking-lunge":{"name":"Walking Lunge w/ Reach","target":"Hip / t-spine","sr":"1 \u00d7 8 each"},"ex-bw-carioca":{"name":"Carioca","target":"Rotational ankle / hip","sr":"2 \u00d7 20 yards each"},"ex-bw-jog":{"name":"Easy Pulse Jog","target":"General warmup","sr":"1 \u00d7 3\u20135 min"},"ex-bw-jumpjacks":{"name":"Jumping Jacks","target":"Whole body prep","sr":"2 \u00d7 30s"},"ex-bw-band-monster":{"name":"Banded Monster Walks","target":"Glute med activation","sr":"2 \u00d7 10 each direction"},"ex-rice":{"name":"Rice Bucket Combo","target":"Forearm flush","sr":"1 \u00d7 3 min"},"ex-rice-deepdig":{"name":"Rice Bucket Deep Dig","target":"Forearm flush","sr":"2 \u00d7 30s"},"ex-wrist":{"name":"Wrist Flex / Ext","target":"Forearm","sr":"2 \u00d7 15"},"ex-wrist-roller":{"name":"Wrist Roller (light)","target":"Forearm endurance","sr":"2 \u00d7 Up + Down"},"ex-decel":{"name":"Deceleration Catch (Plyo)","target":"Posterior cuff","sr":"3 \u00d7 5"},"ex-armflush-bicep":{"name":"Bicep Flush Curls (3lb)","target":"Bicep flush","sr":"2 \u00d7 20"},"ex-armflush-tricep":{"name":"Tricep Kickback Flush (3lb)","target":"Tricep flush","sr":"2 \u00d7 20"},"ex-armflush-shake":{"name":"Arm Shakeouts","target":"Circulation","sr":"3 \u00d7 20s"},"ex-bandflush-pulldown":{"name":"Band Pulldown Flush","target":"Lat flush","sr":"2 \u00d7 20"},"ex-bandflush-row":{"name":"Band Row Flush","target":"Mid-back flush","sr":"2 \u00d7 20"},"ex-cuff-90-90":{"name":"Cuff 90/90 Flush","target":"Cuff flush","sr":"2 \u00d7 15 each"},"ex-postthrow-stretch":{"name":"Post-Throw Towel Stretch","target":"Internal rotation","sr":"2 \u00d7 30s each"},"ex-icecup":{"name":"Ice Cup Massage","target":"Anti-inflammation","sr":"1 \u00d7 5\u20137 min"},"ex-armpump":{"name":"Pec/Lat Foam Roll","target":"Soft tissue","sr":"1 \u00d7 60s each"},"ex-pt-hamstring-roll":{"name":"Hamstring Foam Roll","target":"Hamstring flush","sr":"1 \u00d7 60s each"},"ex-pt-quad-roll":{"name":"Quad Foam Roll","target":"Quad flush","sr":"1 \u00d7 60s each"},"ex-pt-glute-ball":{"name":"Lacrosse Ball Glute Release","target":"Glute release","sr":"1 \u00d7 60s each"},"ex-pt-itband-roll":{"name":"IT Band Foam Roll","target":"IT band flush","sr":"1 \u00d7 45s each"},"ex-pt-calf-roll":{"name":"Calf Foam Roll","target":"Calf flush","sr":"1 \u00d7 45s each"},"ex-pt-lowback-roll":{"name":"Lower Back Decompression","target":"Lumbar reset","sr":"1 \u00d7 60s"},"ex-pt-pigeon":{"name":"Pigeon Stretch","target":"Glute / hip rotator","sr":"2 \u00d7 45s each"},"ex-pt-hipflexor-stretch":{"name":"Half-Kneel Hip Flexor Stretch","target":"Hip flexor","sr":"2 \u00d7 45s each"},"ex-pt-hamstring-stretch":{"name":"Seated Hamstring Stretch","target":"Hamstring","sr":"2 \u00d7 30s each"},"ex-pt-childspose":{"name":"Child's Pose w/ Side Reach","target":"Lat / lumbar / lats","sr":"1 \u00d7 60s + 30s each side"},"ex-pt-legs-up-wall":{"name":"Legs-Up-The-Wall","target":"Venous return / CNS","sr":"1 \u00d7 3\u20135 min"},"ex-pt-90-90-breath":{"name":"90/90 Diaphragm Breathing","target":"Parasympathetic reset","sr":"1 \u00d7 8 breaths"},"ex-pt-thread-needle":{"name":"Thread-The-Needle","target":"T-spine / shoulder","sr":"2 \u00d7 6 each"},"ex-pt-windshield":{"name":"Supine Windshield Wipers","target":"Hip rotators / lumbar","sr":"1 \u00d7 8 each"},"ex-pt-couch-light":{"name":"Light Couch Stretch (post-throw)","target":"Hip flexor / quad","sr":"2 \u00d7 30s each"},"ex-pt-spinal-twist":{"name":"Supine Spinal Twist","target":"Spinal decompression","sr":"1 \u00d7 45s each"},"ex-pt-easy-spin":{"name":"Easy Stationary Bike Spin","target":"Systemic blood flow","sr":"1 \u00d7 8\u201310 min"},"ex-pt-hydrate-fuel":{"name":"Refuel: 30g Protein + Carbs + Electrolytes","target":"Glycogen / repair","sr":"1 \u00d7 within 30 min"},"ex-crossbody":{"name":"Crossbody Stretch","target":"Posterior capsule","sr":"2 \u00d7 30s"},"ex-doorway-pec":{"name":"Doorway Pec Stretch","target":"Pec minor","sr":"2 \u00d7 45s each"},"ex-recovery-walk":{"name":"Zone-1 Recovery Walk","target":"Aerobic restoration","sr":"1 \u00d7 20\u201330 min"},"ex-contrast-shower":{"name":"Contrast Shower","target":"Circulation","sr":"4 \u00d7 1 min hot / 30s cold"},"ex-cold-tub":{"name":"Cold Tub / Plunge","target":"Systemic recovery","sr":"1 \u00d7 3\u201310 min @ 50\u201358\u00b0F"},"ex-compression":{"name":"Compression Sleeve / Boots","target":"Venous return","sr":"1 \u00d7 15\u201320 min"},"ex-foamroll-tspine":{"name":"T-Spine Foam Roll","target":"Thoracic","sr":"1 \u00d7 2 min"},"ex-lacrosse-cuff":{"name":"Lacrosse Ball Cuff Release","target":"Cuff trigger points","sr":"1 \u00d7 90s each"},"ex-pec-release":{"name":"Lacrosse Ball Pec Release","target":"Pec / front shoulder","sr":"1 \u00d7 90s each"},"ex-band-distract":{"name":"Banded Shoulder Distraction","target":"Joint mobility","sr":"2 \u00d7 30s each"},"ex-breathwork":{"name":"Box Breathing (4-4-4-4)","target":"Parasympathetic","sr":"1 \u00d7 5 min"},"ex-nap":{"name":"Power Nap","target":"CNS recovery","sr":"1 \u00d7 20\u201330 min"},"ex-tspine":{"name":"T-Spine Rotation (Quadruped)","target":"Thoracic","sr":"2 \u00d7 8 each side"},"ex-tspine-openbook":{"name":"Open Book","target":"Thoracic","sr":"2 \u00d7 6 each"},"ex-hipflow":{"name":"World's Greatest Stretch","target":"Hips / T-spine","sr":"1 \u00d7 5 each"},"ex-90-90-hip":{"name":"90/90 Hip Switches","target":"Hip rotation","sr":"2 \u00d7 8 each"},"ex-couch-stretch":{"name":"Couch Stretch","target":"Hip flexor / quad","sr":"2 \u00d7 45s each"},"ex-spidermans":{"name":"Spiderman Lunge w/ Rotation","target":"Hips / t-spine","sr":"1 \u00d7 6 each"},"ex-ankle-mob":{"name":"Ankle Wall Rocks","target":"Ankle","sr":"2 \u00d7 10 each"},"ex-wrist-mob":{"name":"Wrist CARs","target":"Wrist","sr":"1 \u00d7 5 each direction"},"ex-cat-cow":{"name":"Cat-Cow","target":"Spine","sr":"1 \u00d7 10"},"ex-rdl":{"name":"Single-Leg RDL","target":"Posterior chain","sr":"3 \u00d7 8 each"},"ex-row":{"name":"Chest-Supported Row","target":"Mid-back","sr":"3 \u00d7 10"},"ex-pallof":{"name":"Pallof Press","target":"Anti-rotation core","sr":"3 \u00d7 10 each"},"ex-deadbug":{"name":"Dead Bug","target":"Anti-extension core","sr":"3 \u00d7 8 each"},"ex-side-plank":{"name":"Side Plank w/ Reach","target":"Oblique / QL","sr":"3 \u00d7 30s each"},"ex-landmine-press":{"name":"Half-Kneeling Landmine Press","target":"Shoulder / scap","sr":"3 \u00d7 8 each"},"ex-pullup":{"name":"Pull-Up / Lat Pulldown","target":"Lat","sr":"3 \u00d7 6\u20138"},"ex-farmer-carry":{"name":"Farmer Carry","target":"Grip / trunk","sr":"3 \u00d7 40 yards"},"ex-rear-foot-split":{"name":"Rear-Foot Elevated Split Squat","target":"Single-leg","sr":"3 \u00d7 6 each"},"ex-trap3":{"name":"Trap-3 Raise","target":"Lower trap","sr":"3 \u00d7 10 each"},"ex-cuff-er-side":{"name":"Side-Lying DB External Rotation","target":"Infraspinatus","sr":"3 \u00d7 12 each"},"ex-cuff-prone-er":{"name":"Prone DB External Rotation","target":"Posterior cuff","sr":"3 \u00d7 10 each"},"ex-prone-table-series":{"name":"Prone Table Series","target":"Posterior shoulder / scap","sr":"2 \u00d7 8 each move"},"ex-prone-horizontal-abduction":{"name":"Prone Horizontal Abduction (Thumbs Up)","target":"Rear delt / mid-trap","sr":"3 \u00d7 10"},"ex-prone-shoulder-extension":{"name":"Prone Shoulder Extension","target":"Lat / posterior delt","sr":"3 \u00d7 10"},"ex-prone-i-raise":{"name":"Prone I Raise","target":"Lower trap","sr":"3 \u00d7 10"},"ex-prone-er-90":{"name":"Prone ER @ 90\u00b0 (Light DB)","target":"Infraspinatus / posterior cuff","sr":"3 \u00d7 12"},"ex-prone-row-er":{"name":"Prone Row to External Rotation","target":"Mid-back / cuff combo","sr":"3 \u00d7 10"},"ex-plyo-pivot-2kg":{"name":"Pivot Pickoff Plyo (2kg)","target":"Lay-back / posterior cuff","sr":"3 \u00d7 5"},"ex-plyo-rebounder":{"name":"Rebounder Connection Throw (450g)","target":"Connection / sequencing","sr":"3 \u00d7 6"},"ex-plyo-half-kneel":{"name":"Half-Kneeling Plyo (1kg)","target":"Upper-half","sr":"3 \u00d7 6"},"ex-plyo-stride-stable":{"name":"Stride-Stable Plyo (1kg)","target":"Trunk stack","sr":"3 \u00d7 6"},"ex-medball-rotational":{"name":"Med-Ball Rotational Slam (4kg)","target":"Rotational power","sr":"3 \u00d7 6 each"},"ex-medball-scoop":{"name":"Med-Ball Scoop Toss (3kg)","target":"Posterior chain / chain","sr":"3 \u00d7 6"},"ex-medball-shotput":{"name":"Med-Ball Shot-Put (3kg)","target":"Lower-half torque","sr":"3 \u00d7 5 each"},"ex-plyo-overload-fb":{"name":"Overload FB Throw (7oz, into net)","target":"Velo prep","sr":"4 \u00d7 4"},"ex-plyo-underload-fb":{"name":"Underload FB Throw (4oz, into net)","target":"Arm speed","sr":"4 \u00d7 4"},"ex-plyo-pulldown":{"name":"Run-And-Gun Pulldown (5oz)","target":"Peak intent","sr":"6 \u00d7 1"},"ex-plyo-reverse-2lb":{"name":"Reverse Plyo Throw (2lb)","target":"ER strength","sr":"3 \u00d7 6"},"ex-plyo-wallspeed":{"name":"Wall-Speed Catch Plyo (450g)","target":"Reactive arm speed","sr":"3 \u00d7 8"},"ex-armflush-wallpush":{"name":"Wall Push Flush","target":"Tricep flush","sr":"2 \u00d7 15"},"ex-armflush-bandpump":{"name":"Light Band Tricep Pump","target":"Tricep flush","sr":"2 \u00d7 25"},"ex-armflush-bicep-light":{"name":"Light DB Bicep Pump (2\u20133lb)","target":"Bicep flush","sr":"2 \u00d7 25"},"ex-armflush-rotator":{"name":"Rotator Flush Bands","target":"Cuff flush","sr":"2 \u00d7 20 each"},"ex-armflush-supinator":{"name":"Supinator Flush (light bar)","target":"Forearm / elbow flush","sr":"2 \u00d7 15 each"},"ex-armflush-elbow-circle":{"name":"Elbow Circles + Shake","target":"Elbow flush","sr":"2 \u00d7 30s"},"ex-armflush-tennis-ball":{"name":"Tennis Ball Forearm Squeeze","target":"Grip / forearm flush","sr":"2 \u00d7 20"},"ex-armflush-towel":{"name":"Wet-Towel Wring","target":"Deep forearm flush","sr":"3 \u00d7 10 each direction"},"ex-armflush-handwalk":{"name":"Hand-Walk Plank Flush","target":"Wrist / scap flush","sr":"2 \u00d7 45s"},"ex-armflush-bandpullover":{"name":"Band Pullover Flush","target":"Lat / cuff flush","sr":"2 \u00d7 20"},"ex-elbow-marc-pro":{"name":"E-Stim / Marc Pro Session","target":"Active recovery","sr":"1 \u00d7 30 min"},"ex-percussion-cuff":{"name":"Percussion Massage Cuff","target":"Posterior cuff release","sr":"1 \u00d7 3 min"},"ex-percussion-forearm":{"name":"Percussion Massage Forearm","target":"Forearm release","sr":"1 \u00d7 2 min each"},"ex-blood-flow-restriction":{"name":"BFR Arm Pump (light)","target":"Recovery hypertrophy","sr":"4 \u00d7 15 / 12 / 10 / 8"},"ex-pec-doorway-dynamic":{"name":"Dynamic Pec Sweep (Doorway)","target":"Pec / front shoulder","sr":"3 \u00d7 8 each"},"ex-jump-rope-easy":{"name":"Easy Jump Rope Flush","target":"Systemic flush","sr":"3 \u00d7 60s"},"ex-tspine-foam-extension":{"name":"Foam Roller T-Spine Extension","target":"Thoracic extension","sr":"3 \u00d7 5 levels"},"ex-scap-cars":{"name":"Scapular CARs","target":"Scap mobility","sr":"2 \u00d7 5 each direction"},"ex-shoulder-cars":{"name":"Shoulder CARs","target":"Shoulder joint","sr":"2 \u00d7 5 each"},"ex-hip-cars":{"name":"Hip CARs","target":"Hip joint","sr":"2 \u00d7 5 each"},"ex-elbow-cars":{"name":"Elbow CARs (passive)","target":"Elbow ROM","sr":"1 \u00d7 8 each"},"ex-wallslides":{"name":"Wall Slides","target":"Scap upward rotation","sr":"2 \u00d7 10"},"ex-prayer-stretch":{"name":"Forearm Prayer Stretch","target":"Forearm flexors","sr":"2 \u00d7 30s each"},"ex-reverse-prayer":{"name":"Reverse Prayer Stretch","target":"Forearm extensors","sr":"2 \u00d7 30s each"},"ex-zercher-squat":{"name":"Zercher Squat","target":"Trunk / posterior","sr":"3 \u00d7 6"},"ex-trap-bar-dead":{"name":"Trap Bar Deadlift","target":"Posterior chain power","sr":"4 \u00d7 4"},"ex-hip-thrust":{"name":"Barbell Hip Thrust","target":"Glutes / hip extension","sr":"3 \u00d7 8"},"ex-bottoms-up-press":{"name":"Bottoms-Up KB Press","target":"Cuff stability","sr":"3 \u00d7 5 each"},"ex-band-no-money":{"name":"Band No-Money Drill","target":"External rotators","sr":"3 \u00d7 12"},"ex-suitcase-carry":{"name":"Single-Arm Suitcase Carry","target":"Anti-lateral core","sr":"3 \u00d7 30 yards each"},"ex-copenhagen":{"name":"Copenhagen Plank","target":"Adductor / core","sr":"3 \u00d7 20s each"},"ex-nordic":{"name":"Nordic Hamstring Curl","target":"Hamstring eccentric","sr":"3 \u00d7 5"},"ex-toes-elevated-split":{"name":"Toes-Elevated Split Squat","target":"Knee health","sr":"3 \u00d7 6 each"},"hx-9090-switch":{"name":"90/90 Hip Switch","target":"Hip IR / ER","sr":"2 \u00d7 8 each"},"hx-worlds-greatest":{"name":"World's Greatest Stretch","target":"Hip / t-spine","sr":"2 \u00d7 5 each"},"hx-openbook":{"name":"Open Book","target":"T-spine rotation","sr":"2 \u00d7 10 each"},"hx-quad-tspine":{"name":"Quadruped T-Spine Rotation","target":"T-spine","sr":"2 \u00d7 8 each"},"hx-thread-needle":{"name":"Thread the Needle","target":"T-spine / lat","sr":"2 \u00d7 8 each"},"hx-couch":{"name":"Couch Stretch","target":"Hip flexor","sr":"2 \u00d7 45s each"},"hx-ankle-rocks":{"name":"Ankle Dorsiflexion Rocks","target":"Ankle (back-leg drive)","sr":"2 \u00d7 12 each"},"hx-hip-airplane":{"name":"Hip Airplane","target":"Hip control","sr":"2 \u00d7 6 each"},"hx-mb-scoop":{"name":"Med-Ball Rotational Scoop Toss","target":"Rotational power","sr":"3 \u00d7 5 each"},"hx-mb-shotput":{"name":"Med-Ball Shotput Throw","target":"Rotational power","sr":"3 \u00d7 5 each"},"hx-mb-slam":{"name":"Med-Ball Rotational Slam","target":"Power transfer","sr":"3 \u00d7 6"},"hx-pallof":{"name":"Pallof Press","target":"Anti-rotation core","sr":"2 \u00d7 10 each"},"hx-deadbug":{"name":"Dead Bug","target":"Core control","sr":"2 \u00d7 10 each"},"hx-birddog":{"name":"Bird Dog","target":"Core / balance","sr":"2 \u00d7 8 each"},"hx-rfe-split":{"name":"Rear-Foot-Elevated Split Squat","target":"Lower-half strength","sr":"3 \u00d7 8 each"},"hx-lateral-drive":{"name":"Lateral Lunge to Drive","target":"Adductor / drive leg","sr":"3 \u00d7 6 each"},"hx-landmine-rot":{"name":"Landmine Rotation","target":"Rotational strength","sr":"3 \u00d7 8 each"},"hx-woodchop":{"name":"Band Woodchop (High-to-Low)","target":"Oblique power","sr":"3 \u00d7 10 each"},"hx-copenhagen":{"name":"Copenhagen Plank","target":"Adductor / core","sr":"2 \u00d7 20s each"},"hx-forearm-flush":{"name":"Forearm & Grip Flush","target":"Forearm / grip","sr":"1 \u00d7 3 min"},"hx-decompress":{"name":"Lower-Back Decompress","target":"Lumbar / hips","sr":"1 \u00d7 2 min"},"hx-foamroll":{"name":"Foam Roll: Lats / T-Spine / Glutes","target":"Tissue recovery","sr":"1 \u00d7 5 min"}};
const CUSTOM_EX={};const CUSTOM_AC={};
function exLibResolve(ref,customEx,customAc){
  if(!ref)return{name:"Exercise",detail:""};
  if(ref.startsWith("custom:")){
    const uuid=ref.slice(7);
    const c=(customEx||{})[uuid]||(customAc||{})[uuid];
    if(c){const det=[c.default_sets?c.default_sets+"×":null,c.default_reps||c.reps||null,c.target||null].filter(Boolean).join(" ");return{name:c.name||"Custom Exercise",detail:det};}
    return{name:"Custom Exercise",detail:""};
  }
  const e=EX_LIB[ref];
  if(e)return{name:e.name,detail:[e.sr,e.target].filter(Boolean).join(" · ")};
  return{name:ref,detail:""};
}


const esc=s=>(s==null?"":String(s)).replace(/[&<>"]/g,c=>({"&":"&amp;","<":"&lt;",">":"&gt;",'"':"&quot;"}[c]));
const rColor=r=>r==null?"var(--muted)":(r>=65?"var(--lime)":(r>=45?"var(--amber)":"var(--red)"));
const fmtDate=s=>{if(!s)return"";const d=new Date(s);return isNaN(d)?"":d.toLocaleDateString(undefined,{month:"short",day:"numeric"});};
/// Dedupe a date-ordered (newest-first) series to ONE row per calendar day (latest),
/// mirroring the iOS Cockpit — recovery + movement screens can write many intraday
/// rows from WHOOP/Apple Health/manual, flooding the folder with repeats.
function dedupByDay(rows,getDate){
  const seen=new Set(),out=[];
  for(const r of rows||[]){
    const raw=getDate(r)||""; const d=new Date(raw);
    const day=isNaN(d)?String(raw).slice(0,10):d.toISOString().slice(0,10);
    if(!day||seen.has(day))continue;
    seen.add(day);out.push(r);
  }
  return out;
}
/// Content-key dedupe (iOS Cockpit parity): legacy key drift pushed the SAME logged
/// item twice under different local_ids — collapse identical rows (same date + label
/// fields), keeping the first (server order is newest-first).
function dedupRows(rows,keyFn){
  const seen=new Set(),out=[];
  for(const r of rows||[]){ const k=keyFn(r); if(seen.has(k))continue; seen.add(k); out.push(r); }
  return out;
}
const dedupCatches=rows=>dedupRows(rows,c=>`${c.date||""}|${c.kind||""}|${c.throwCount??-1}|${c.maxDistanceFt??-1}`);
// Meal dedupe: legacy pre-dedupe sync drift keyed a meal by ms-precision timestamp,
// so the same logged meal sometimes landed twice under different local_ids. Collapse
// identical rows (same calendar day + type + name + calories), keep first (newest-first).
const dedupMeals=rows=>dedupRows(rows,m=>`${(m.date||"").slice(0,10)}|${(m.mealType||"").toLowerCase()}|${(m.name||"").trim().toLowerCase()}|${m.calories??-1}`);
const dedupMech=rows=>dedupRows(rows,m=>`${m.date||""}|${m.title||""}|${m.overallScore??-1}|${m.analyzedByRole||""}`);
const dedupMove=rows=>dedupRows(rows,m=>`${m.date||""}|${m.screenType||""}`);
const nm=m=>m.display_name||m.handle||"Player";
const jwtSub=t=>{try{const p=t.split(".")[1].replace(/-/g,"+").replace(/_/g,"/");return JSON.parse(atob(p+"=".repeat((4-p.length%4)%4))).sub||null;}catch(e){return null;}};
const isOwner=t=>!!(t&&MYUID&&t.coach_user_id===MYUID);

async function login(email,password){
  const r=await fetch(`${SUPABASE_URL}/auth/v1/token?grant_type=password`,{method:"POST",headers:{apikey:ANON,"Content-Type":"application/json"},body:JSON.stringify({email,password})});
  const j=await r.json().catch(()=>({}));
  if(!r.ok)throw new Error(j.error_description||j.msg||j.error||"Invalid email or password.");
  TOKEN=j.access_token;REFRESH=j.refresh_token;MYUID=jwtSub(TOKEN);try{localStorage.setItem("pl_refresh",REFRESH);}catch(e){}
}
async function refreshToken(){ if(!REFRESH)return false;
  const r=await fetch(`${SUPABASE_URL}/auth/v1/token?grant_type=refresh_token`,{method:"POST",headers:{apikey:ANON,"Content-Type":"application/json"},body:JSON.stringify({refresh_token:REFRESH})});
  if(!r.ok)return false; const j=await r.json();TOKEN=j.access_token;REFRESH=j.refresh_token;MYUID=jwtSub(TOKEN);try{localStorage.setItem("pl_refresh",REFRESH);}catch(e){}return true; }
function signOut(){TOKEN=null;REFRESH=null;MYUID=null;CACHE={};try{applyBrand(null);}catch(e){}try{localStorage.removeItem("pl_refresh");}catch(e){}
  $("#app").classList.add("hidden");$("#overlay").classList.add("hidden");$("#markup").classList.add("hidden");
  $("#login").classList.remove("hidden");$("#password").value="";}
async function invoke(slug,op,params={},retry=true){
  const r=await fetch(`${SUPABASE_URL}/functions/v1/${slug}`,{method:"POST",headers:{apikey:ANON,Authorization:`Bearer ${TOKEN}`,"Content-Type":"application/json"},body:JSON.stringify({op,params})});
  if(r.status===401&&retry){if(await refreshToken())return invoke(slug,op,params,false);signOut();throw new Error("Session expired — sign in again.");}
  const j=await r.json().catch(()=>({}));if(!r.ok)throw new Error(j.error||`Request failed (${r.status})`);return camelize(j);
}
const teamsCall=async(op,p={})=>{const j=await invoke("teams-api",op,p);if(j.error)throw new Error(j.error);return j.data;};
const coachCall=(op,p={})=>invoke("coach-player-api",op,p);
const valdCall=(op,p={})=>invoke("vald-api",op,p);

async function loadDashboard(){
  $("#login").classList.add("hidden");$("#app").classList.remove("hidden");
  $("#main").innerHTML=`<div class="loading">Loading your teams…</div>`;
  try{ TEAMS=await teamsCall("myTeams")||[]; }
  catch(e){ $("#main").innerHTML=`<div class="sec"><span style="color:#ff8b8b">${esc(e.message)}</span></div>`; return; }
  const branded=TEAMS.find(t=>t.brand_name); if(branded)$("#orgName").textContent=branded.brand_name;
  const logo=TEAMS.find(t=>t.brand_logo_url)?.brand_logo_url; if(logo)$("#hlogoImg").src=logo;
  if(!TEAMS.length){ $("#main").innerHTML=`<div class="sec"><h3>No teams yet</h3><div class="empty">Create a team in the app and share the join code to fill your roster.</div></div>`; $("#tabs").classList.add("hidden"); return; }
  const sel=$("#teamSel");
  if(TEAMS.length>1){ sel.classList.remove("hidden"); sel.innerHTML=TEAMS.map(t=>`<option value="${esc(t.id)}">${esc(t.name)}</option>`).join(""); sel.onchange=()=>{SEL=sel.value;RSEARCH="";RBADGE={};render();}; }
  SEL=TEAMS[0].id; render();
}
const team=()=>TEAMS.find(t=>t.id===SEL);
async function teamData(){
  if(CACHE[SEL])return CACHE[SEL];
  const t=team();
  const [members,snaps]=await Promise.all([teamsCall("members",{teamId:SEL}).catch(()=>[]),teamsCall("snapshots",{teamId:SEL}).catch(()=>[])]);
  const players=(members||[]).filter(m=>m.role!=="coach");
  const d={team:t,members,players,snaps:snaps||[]};
  CACHE[SEL]=d; return d;
}
let RSEARCH="", RSORT="readiness", RSEARCH_T=null, RLOCAL=false, RBADGE={};
function setTab(tab){ TAB=tab; document.querySelectorAll(".tab").forEach(b=>b.classList.toggle("on",b.dataset.tab===tab)); render(); }
async function render(){
  if(!SEL)return; applyBrand(team()); $("#main").innerHTML=`<div class="loading">Loading…</div>`;
  try{ if(TAB==="team")await renderTeam(); else if(TAB==="plan")await renderPlan(); else if(TAB==="field")await renderField(); else if(TAB==="cy")await renderCy(); else if(TAB==="manage")await renderManage(); }
  catch(e){ $("#main").innerHTML=`<div class="sec"><span style="color:#ff8b8b">${esc(e.message)}</span></div>`; }
}

/* ---------- 5-tab IA wrappers: Team (Roster+Health) · Plan (Calendar+Assign) · Cy ---------- */
function segBar(group,items,active){
  return `<div class="segbar">`+items.map(([v,l])=>`<button class="segb${v===active?" on":""}" data-seg="${group}" data-val="${v}">${esc(l)}</button>`).join("")+`</div>`;
}
function wireSeg(){
  document.querySelectorAll(".segb").forEach(b=>b.onclick=()=>{
    if(b.dataset.seg==="team")SUBTEAM=b.dataset.val; else if(b.dataset.seg==="plan")SUBPLAN=b.dataset.val;
    render();
  });
}
async function renderTeam(){
  if(SUBTEAM==="inactive")await renderInactive(); else if(SUBTEAM==="health")await renderHealth(); else await renderRoster();
  $("#main").insertAdjacentHTML("afterbegin",segBar("team",[["roster","Roster"],["health","Team Health"]],SUBTEAM));
  wireSeg();
}
async function renderPlan(){
  if(SUBPLAN==="assign")await renderAssign(); else await renderCalendar();
  $("#main").insertAdjacentHTML("afterbegin",segBar("plan",[["calendar","Calendar"],["assign","Programs & Assign"]],SUBPLAN));
  wireSeg();
}
let CYMODE="ask";
async function renderCy(){
  const d=await teamData();
  const segs=`<div class="sec" style="padding-bottom:10px"><div class="row" style="gap:6px">
    ${[["ask","Ask"],["plans","Plans"]].map(([k,l])=>`<button class="chip cyseg${CYMODE===k?" lime":""}" data-cyseg="${k}" style="cursor:pointer;border:none">${l}</button>`).join("")}
  </div></div>`;
  if(CYMODE==="plans"){ await renderCyPlans(d,segs); return; }
  $("#main").innerHTML=segs+`<div class="sec"><h3>Cy · your bench coach</h3>
    <div class="muted" style="font-size:12.5px;margin-bottom:10px">Ask about any athlete or your whole roster — Cy answers with their real data in context: readiness, workload and trends. Never medical advice.</div>
    <div id="cyLog" style="display:flex;flex-direction:column;gap:8px;margin-bottom:10px"></div>
    <div class="row" style="gap:8px"><input id="cyIn" placeholder="e.g. Who should start Friday?" style="flex:1;background:var(--sunken);border:1px solid var(--line);color:var(--bone);border-radius:11px;padding:11px 12px;font-size:14px;outline:none"/><button class="mk" id="cySend">Ask</button></div>
    <div id="cyErr" class="muted" style="font-size:11.5px;margin-top:8px"></div></div>`;
  const log=$("#cyLog"),errEl=$("#cyErr"),hist=[];
  const line=m=>{const s=d.snaps.find(x=>x.user_id===m.user_id)||{};const rd=s.readiness==null?s.readiness_score:s.readiness;const p7=s.pitches_7d!=null?s.pitches_7d:(s.pitches7d||0);const tv=s.top_velo_7d||s.topVelo7d||s.last_top_velo||s.lastTopVelo;return `- ${nm(m)}: readiness ${rd==null?"n/a":rd}, ${p7} pitches/7d${tv?`, top velo ${tv}`:""}`;};
  const sysCtx="You are advising the COACH (not an athlete) for team "+(d.team.name||"")+". Ground every answer in this live roster — name athletes, cite their numbers, respect rest. Never medical advice.\n\nROSTER:\n"+d.players.map(line).join("\n");
  function bubble(role,text){const el=document.createElement("div");el.style.cssText="align-self:"+(role==="user"?"flex-end":"flex-start")+";max-width:88%;background:"+(role==="user"?"var(--lime);color:#0f141d":"var(--raised);color:var(--bone)")+";border:1px solid var(--line);border-radius:14px;padding:9px 12px;font-size:13.5px;line-height:1.4;white-space:pre-wrap";el.textContent=text;log.appendChild(el);log.scrollTop=log.scrollHeight;}
  async function send(){
    const q=($("#cyIn").value||"").trim(); if(!q)return;
    $("#cyIn").value="";errEl.textContent="";bubble("user",q);hist.push({role:"user",content:q});
    const btn=$("#cySend");btn.disabled=true;btn.textContent="…";
    try{
      const msgs=[{role:"system",content:sysCtx}].concat(hist);
      const j=await invoke("coach-ai","chat",{messages:msgs});
      const reply=(j&&(j.text||j.reply))||"";
      if(reply){bubble("assistant",reply);hist.push({role:"assistant",content:reply});}
      else errEl.textContent="Cy isn't connected yet — ask your admin to add an AI key.";
    }catch(e){ errEl.textContent=/not connected|503/i.test(e.message)?"Cy isn't connected yet — ask your admin to add an AI key.":e.message; }
    btn.disabled=false;btn.textContent="Ask";
  }
  $("#cySend").onclick=send;
  $("#cyIn").addEventListener("keydown",e=>{if(e.key==="Enter")send();});
  wireCySegs();
}

function wireCySegs(){
  document.querySelectorAll(".cyseg").forEach(b=>{ b.onclick=()=>{ CYMODE=b.dataset.cyseg; renderCy(); }; });
}

/// Cy → Plans: the AI Staff Plan + Weekly Team Report, web parity with the iOS
/// Cy tab (#161). Prompts and STRICT-JSON shapes are ported verbatim from
/// CoachPlansView.swift so both platforms read identically off the same data.
/// Cached per team in localStorage, mirroring the iOS per-team-scope cache, so
/// a plan built for one team never bleeds onto another.
const planKey=(what,teamId)=>`pl_coach_plan_${what}_${teamId}`;
function cachedPlan(what,teamId){ try{const r=localStorage.getItem(planKey(what,teamId));return r?JSON.parse(r):null;}catch(e){return null;} }
function cachePlan(what,teamId,obj){ try{localStorage.setItem(planKey(what,teamId),JSON.stringify(obj));}catch(e){} }

/// Strip markdown fences / prose and decode the JSON object — same tolerance
/// as the iOS parseStaffPlan/parseWeekly helpers.
function parsePlanJSON(raw){
  if(!raw)return null;
  let t=String(raw).trim();
  const a=t.indexOf("{"), b=t.lastIndexOf("}");
  if(a<0||b<=a)return null;
  try{ return JSON.parse(t.slice(a,b+1)); }catch(e){ return null; }
}

/// The roster document both prompts are grounded in — same fields and ordering
/// (lowest readiness first) the iOS rosterRows builds.
function planDoc(d){
  const h=teamScore(d);
  const rows=[...d.players].map(m=>({m,s:d.snaps.find(x=>x.user_id===m.user_id)}))
    .sort((a,b)=>((a.s?.readiness??999)-(b.s?.readiness??999)));
  const lines=[`TEAM HEALTH ${h.score}/100 (${h.label}). Avg readiness ${h.avgR??"—"}, engagement ${h.engagement}%, high-workload ${h.highWL}, inactive ${h.inactive} of ${h.total}.`,"ATHLETES (newest data):"];
  for(const {m,s} of rows){
    const bits=[nm(m)];
    bits.push(s?.readiness!=null?`readiness ${s.readiness}/100`:"readiness not reported");
    bits.push(`${s?.pitches_7d??0} pitches in 7d`);
    if(s?.top_velo_7d)bits.push(`top velo ${Number(s.top_velo_7d).toFixed(1)}`);
    bits.push((s?.sessions_7d>0)?"active this week":"NO session in 7d");
    lines.push("- "+bits.join(", "));
  }
  return lines.join("\n");
}

const STAFF_TASK=`You are the team's player-development coach (pitchers AND hitters). From this roster data, output STRICT JSON ONLY — no prose, no markdown fences — exactly this shape:
{"teamCall":"the single most important team-level move this week, 1-2 sentences","players":[{"name":"<exact name from the roster data>","bucket":"ready","line":"one specific sentence with their numbers, under 120 characters"}]}
Rules: include EVERY listed athlete exactly once. "bucket" must be exactly one of "ready" (full workload), "manage" (cap volume or intent — low readiness or a workload spike), "checkin" (inactive or unreported — needs a conversation). Use each athlete's exact name. Put a real number in every line. Never medical advice — workload, readiness and engagement only.`;

const WEEKLY_TASK=`You are writing the coach's WEEKLY TEAM REPORT (shareable with staff and parents). From this roster data, output STRICT JSON ONLY — no prose, no markdown fences — exactly this shape:
{"headline":"the week in one or two confident sentences","improved":[{"name":"<exact roster name>","line":"what moved up, with the real number, under 110 characters"}],"slipping":[{"name":"<exact roster name>","line":"what slipped or is overworked, with the real number, under 110 characters"}],"note":"one sentence on attendance, assignment completion and workload discipline, plus next week's single team focus"}
Rules: only include athletes with something real to say (max 5 per list; lists may be empty). Use exact roster names and real numbers. Confident, parent-safe tone. Never medical advice.`;

async function renderCyPlans(d,segs){
  const staff=cachedPlan("staff",d.team.id), weekly=cachedPlan("weekly",d.team.id);
  $("#main").innerHTML=segs+
    `<div class="sec"><div class="row"><h3 style="flex:1;margin:0">This week's staff plan</h3><button class="mk" id="genStaff">${staff?"Regenerate":"Generate"}</button></div>
      <div class="muted" style="font-size:12px;margin-top:4px">Who's ready, who to manage, who needs a check-in — grounded in your live roster.</div>
      <div id="staffBody" style="margin-top:11px">${staff?staffHTML(staff):`<div class="muted" style="font-size:12.5px">Not generated yet.</div>`}</div>
      ${staff?`<button class="ghost" id="cpStaff" style="margin-top:9px;font-size:12px">⧉ Copy</button>`:""}
      <div class="muted" style="font-size:10.5px;margin-top:10px">Training-readiness &amp; engagement signal — not a medical assessment.</div></div>
     <div class="sec"><div class="row"><h3 style="flex:1;margin:0">Weekly team report</h3><button class="mk" id="genWeekly">${weekly?"Regenerate":"Generate"}</button></div>
      <div class="muted" style="font-size:12px;margin-top:4px">A Monday-morning digest you can share with staff and parents.</div>
      <div id="weeklyBody" style="margin-top:11px">${weekly?weeklyHTML(weekly):`<div class="muted" style="font-size:12.5px">Not generated yet.</div>`}</div>
      ${weekly?`<button class="ghost" id="cpWeekly" style="margin-top:9px;font-size:12px">⧉ Copy</button>`:""}</div>
     <div id="planErr" class="muted" style="font-size:11.5px;padding:0 4px"></div>`;
  wireCySegs();
  $("#genStaff").onclick=()=>runPlan(d,"staff");
  $("#genWeekly").onclick=()=>runPlan(d,"weekly");
  const cs=$("#cpStaff"); if(cs)cs.onclick=()=>copyPlan("staff");
  const cw=$("#cpWeekly"); if(cw)cw.onclick=()=>copyPlan("weekly");
}

async function runPlan(d,what){
  const btn=$(what==="staff"?"#genStaff":"#genWeekly"), body=$(what==="staff"?"#staffBody":"#weeklyBody"), err=$("#planErr");
  const label=btn.textContent; btn.disabled=true; btn.textContent="…"; err.textContent="";
  body.innerHTML=`<div class="muted" style="font-size:12.5px">Cy is reading your roster…</div>`;
  try{
    const task=what==="staff"?STAFF_TASK:WEEKLY_TASK;
    const msgs=[{role:"system",content:task},{role:"user",content:planDoc(d)}];
    const j=await invoke("coach-ai","chat",{messages:msgs,maxTokens:what==="staff"?1600:1400});
    const parsed=parsePlanJSON((j&&(j.text||j.reply))||"");
    if(!parsed)throw new Error("Cy returned an unreadable response — try again.");
    cachePlan(what,d.team.id,parsed);
    body.innerHTML=what==="staff"?staffHTML(parsed):weeklyHTML(parsed);
    // The Copy button is only rendered when a cached plan exists, so a
    // freshly generated plan needs it injected now rather than after a reload.
    const cid=what==="staff"?"cpStaff":"cpWeekly";
    if(!$("#"+cid)){
      const b=document.createElement("button");
      b.className="ghost"; b.id=cid; b.style.cssText="margin-top:9px;font-size:12px"; b.textContent="⧉ Copy";
      b.onclick=()=>copyPlan(what);
      body.insertAdjacentElement("afterend",b);
    }
  }catch(e){
    body.innerHTML=`<div class="muted" style="font-size:12.5px">Not generated yet.</div>`;
    err.textContent=/not connected|503/i.test(e.message)?"Cy isn't connected yet — ask your admin to add an AI key.":e.message;
  }
  btn.disabled=false; btn.textContent=label==="…"?"Generate":label;
}

/// Plain-text renderings for copy-out — mirror the iOS ShareLink text exactly,
/// including the mandatory badge line.
const BADGE_LINE="PlayersLab · Patent Pending · A Founding 500 Product";
function staffShareText(p){
  let out="THIS WEEK'S STAFF PLAN\n\n"+(p.teamCall||"")+"\n";
  const all=p.players||[];
  for(const [key,title] of [["ready","READY TO GO"],["manage","MANAGE WORKLOAD"],["check","CHECK IN"]]){
    const list=all.filter(x=>String(x.bucket||"").toLowerCase().includes(key));
    if(list.length)out+="\n"+title+"\n"+list.map(x=>`• ${x.name} — ${x.line}`).join("\n")+"\n";
  }
  return out+"\n"+BADGE_LINE;
}
function weeklyShareText(w){
  let out="WEEKLY TEAM REPORT\n\n"+(w.headline||"")+"\n";
  if((w.improved||[]).length)out+="\nTRENDING UP\n"+w.improved.map(r=>`• ${r.name} — ${r.line}`).join("\n")+"\n";
  if((w.slipping||[]).length)out+="\nNEEDS A LOOK\n"+w.slipping.map(r=>`• ${r.name} — ${r.line}`).join("\n")+"\n";
  if(w.note)out+="\n"+w.note+"\n";
  return out+"\n"+BADGE_LINE;
}
async function copyPlan(what){
  const d=await teamData();
  const p=cachedPlan(what,d.team.id); if(!p)return;
  const text=what==="staff"?staffShareText(p):weeklyShareText(p);
  const btn=$(what==="staff"?"#cpStaff":"#cpWeekly");
  try{ await navigator.clipboard.writeText(text); btn.textContent="Copied ✓"; }
  catch(e){ btn.textContent="Copy failed"; }
  setTimeout(()=>{btn.textContent="⧉ Copy";},1800);
}

function staffHTML(p){
  const buckets=[["manage","NEEDS MANAGING","var(--amber)"],["checkin","CHECK IN","var(--red)"],["ready","READY","var(--lime)"]];
  const all=p.players||[];
  let out="";
  if(p.teamCall)out+=`<div class="att" style="background:rgba(199,255,61,.08);border-color:rgba(199,255,61,.25)"><div style="font-size:15px">📣</div><div><div class="nm">${esc(p.teamCall)}</div></div></div>`;
  for(const [key,title,color] of buckets){
    const list=all.filter(x=>String(x.bucket||"").toLowerCase().includes(key));
    if(!list.length)continue;
    out+=`<div style="margin-top:10px"><div class="muted" style="font-size:10.5px;letter-spacing:.08em;color:${color}">${title} (${list.length})</div>
      ${list.map(x=>`<div style="display:flex;gap:9px;align-items:flex-start;padding:8px 0"><div style="width:3px;align-self:stretch;border-radius:2px;background:${color};flex:none"></div><div><div style="font-weight:800;font-size:13.5px">${esc(x.name||"")}</div><div class="muted" style="font-size:12px">${esc(x.line||"")}</div></div></div>`).join("")}</div>`;
  }
  return out||`<div class="muted" style="font-size:12.5px">Cy didn't return any athletes.</div>`;
}

function weeklyHTML(w){
  const grp=(title,rows,color)=>(!rows||!rows.length)?"":`<div style="margin-top:10px"><div class="muted" style="font-size:10.5px;letter-spacing:.08em;color:${color}">${title} (${rows.length})</div>
    ${rows.map(r=>`<div style="padding:7px 0"><span style="font-weight:800;font-size:13.5px">${esc(r.name||"")}</span> <span class="muted" style="font-size:12px">${esc(r.line||"")}</span></div>`).join("")}</div>`;
  let out="";
  if(w.headline)out+=`<div class="att" style="background:rgba(91,209,250,.08);border-color:rgba(91,209,250,.25)"><div style="font-size:15px">🗞</div><div><div class="nm">${esc(w.headline)}</div></div></div>`;
  out+=grp("TRENDING UP",w.improved,"var(--lime)");
  out+=grp("NEEDS A LOOK",w.slipping,"var(--amber)");
  if(w.note)out+=`<div class="muted" style="font-size:12px;margin-top:11px">${esc(w.note)}</div>`;
  return out||`<div class="muted" style="font-size:12.5px">Cy didn't return a report.</div>`;
}

const SEEN={
  get:uid=>{try{return localStorage.getItem("pl_seen_"+uid)||null;}catch(e){return null;}},
  set:(uid,iso)=>{try{if(iso)localStorage.setItem("pl_seen_"+uid,iso);}catch(e){}}
};
async function renderRoster(){
  const d=await teamData();
  const snapOf=uid=>d.snaps.find(s=>s.user_id===uid);
  // A local-only re-render (search/sort) reuses the last counts — those two
  // ops are per-team, not per-query, so refetching them per keystroke is pure waste.
  // A local-only re-render (search/sort) reuses the last counts for THIS team —
  // those ops are per-team, not per-query, so refetching per keystroke is waste.
  // Keyed by team id so switching teams never shows the previous team's badges.
  const localOnly=RLOCAL; RLOCAL=false;
  const cache=(RBADGE.teamId===SEL)?RBADGE:{teamId:SEL};
  let pending=(localOnly&&cache.pending)?cache.pending:{total:0,byPlayer:{}};
  if(!(localOnly&&cache.pending)){
    try{ const j=await coachCall("pendingFilmReviews",{teamId:SEL}); pending={total:j.total||0,byPlayer:j.byPlayer||{}}; }catch(e){}
    cache.pending=pending;
  }
  setReviewBadge(pending.total);
  let unread=(localOnly&&cache.unread)?cache.unread:{};
  if(!(localOnly&&cache.unread)){
    try{ const since={}; for(const m of d.players){const s=SEEN.get(m.user_id);if(s)since[m.user_id]=s;}
      const u=await coachCall("unreadMessages",{teamId:SEL,since}); unread=u.byPlayer||{}; }catch(e){}
    cache.unread=unread;
  }
  RBADGE=cache;
  const allPlayers=[...d.players];
  const q=(RSEARCH||"").trim().toLowerCase();
  const players=allPlayers
    .filter(m=>!q||nm(m).toLowerCase().includes(q))
    .sort((a,b)=>{
      const sa=snapOf(a.user_id),sb=snapOf(b.user_id);
      if(RSORT==="name")return nm(a).localeCompare(nm(b));
      if(RSORT==="activity")return (sb?.sessions_7d??-1)-(sa?.sessions_7d??-1);
      return (sa?.readiness??999)-(sb?.readiness??999);
    });
  let html=`<div class="hero"><img src="/hero.jpg" alt=""><div class="hk"><span class="hbar"></span>RUN THE ROOM</div></div>`;
  html+=`<div class="sec"><h3>${esc(d.team.name)} · ${players.length} athlete${players.length===1?"":"s"}</h3>
    <div class="row" style="flex-wrap:wrap;gap:8px;margin-bottom:${pending.total>0?'12px':'0'}"><span class="chip">JOIN CODE · ${esc(d.team.join_code)}</span>${d.team.org_plan==="enterprise"?'<span class="chip lime">ENTERPRISE</span>':''}<button class="chip" id="bcastBtn" style="cursor:pointer;border:none">📣 MESSAGE TEAM</button></div>`;
  if(pending.total>0) html+=`<div class="att" style="background:rgba(91,209,250,.10);border-color:rgba(91,209,250,.25)"><div class="sev" style="background:var(--cyan)"></div><div><div class="nm">${pending.total} clip${pending.total===1?"":"s"} waiting for review</div><div class="rs">Players sent film — open a folder to mark it up and send it back.</div></div></div>`;
  html+=`</div>`;
  // TRIAGE HEADER — the health score + who needs you, above the roster.
  // Mirrors the iOS Team tab so both platforms lead with the same signal, and
  // reuses needsAttention() so the thresholds can never diverge.
  if(allPlayers.length){
    const h=teamScore(d), att=needsAttention(d);
    html+=`<div class="sec"><div class="row" style="gap:14px;align-items:center">
      <div><div class="scoreBig" style="color:${h.color}">${h.score}</div><div class="band" style="color:${h.color}">${esc(h.label)}</div></div>
      <div class="muted" style="font-size:12px">${h.active}/${h.total} active this week</div></div>`;
    if(!att.length){
      html+=`<div class="muted" style="font-size:12px;margin-top:10px">Nobody's flagged today — the whole roster is clear to work.</div>`;
    }else{
      html+=`<h3 style="margin:14px 0 8px">Who needs you</h3><div id="triageList"></div>`;
      if(att.length>5) html+=`<div class="muted" style="font-size:11px">+${att.length-5} more flagged — see Team Report for the full list.</div>`;
    }
    html+=`</div>`;
  }
  // Search + sort controls (iOS roster parity).
  if(allPlayers.length){
    html+=`<div class="sec"><div class="row" style="gap:8px;flex-wrap:wrap">
      <input id="rsearch" placeholder="Search players" value="${esc(RSEARCH)}" style="flex:1;min-width:160px;background:rgba(1,2,5,.4);color:var(--bone,#F7F7F2);border:1px solid rgba(247,247,242,.14);border-radius:12px;padding:9px 12px;font:inherit">
      ${["readiness","name","activity"].map(k=>`<button class="chip rsort${RSORT===k?" lime":""}" data-sort="${k}" style="cursor:pointer;border:none">${k.toUpperCase()}</button>`).join("")}
    </div></div>`;
  }
  if(!players.length){ html+=`<div class="sec"><div class="empty">No athletes yet — share code ${esc(d.team.join_code)}.</div></div>`; $("#main").innerHTML=html; return; }
  html+=`<div class="grid" id="rgrid"></div>`;
  $("#main").innerHTML=html;
  const g=$("#rgrid");
  for(const m of players){
    const s=snapOf(m.user_id),r=s?.readiness,pend=pending.byPlayer[m.user_id]||0;
    const sub=!s?"NO DATA SYNCED YET":[s.top_velo_7d>0?`${Math.round(s.top_velo_7d)} MPH · 7D`:null,s.pitches_7d>0?`${s.pitches_7d} PITCHES · 7D`:null,s.last_session_at?`ACTIVE ${relDays(s.last_session_at).toUpperCase()}`:null].filter(Boolean).join("   ")||"READINESS TRACKED";
    const b=document.createElement("button");b.className="pcard";
    b.innerHTML=`<div class="ring" style="color:${rColor(r)}">${r??"—"}</div>
      <div style="min-width:0"><div class="pname">${esc(nm(m))}${(unread[m.user_id]||0)>0?` <span class="pill" style="background:rgba(91,209,250,.16);color:var(--cyan)">${unread[m.user_id]} new</span>`:""}${pend>0?` <span class="pill req">${pend}●</span>`:""}</div><div class="psub">${esc(sub)}</div></div>`;
    b.onclick=()=>openPlayer(d.team,m); g.appendChild(b);
  }
  const bb=$("#bcastBtn"); if(bb)bb.onclick=()=>openBroadcast(d.team);
  const tl=$("#triageList");
  if(tl){ needsAttention(d).slice(0,5).forEach(a=>{ const b=document.createElement("button"); b.className="att";
    b.innerHTML=`<div class="sev" style="background:${a.sev>=3?"var(--red)":"var(--amber)"}"></div><div style="flex:1"><div class="nm">${esc(a.name)}</div><div class="rs">${esc(a.reasons.join(" · "))}</div></div><div style="color:var(--muted)">›</div>`;
    b.onclick=()=>openPlayer(d.team,a.member); tl.appendChild(b); }); }
  const rs=$("#rsearch");
  if(rs){
    rs.oninput=()=>{
      RSEARCH=rs.value;
      clearTimeout(RSEARCH_T);
      // Debounced + marked local-only so the re-render reuses the cached
      // pending/unread counts instead of hitting the network per keystroke.
      RSEARCH_T=setTimeout(()=>{
        RLOCAL=true;
        renderRoster().then(()=>{ const el=$("#rsearch"); if(el){el.focus(); el.setSelectionRange(el.value.length,el.value.length);} });
      },180);
    };
  }
  document.querySelectorAll(".rsort").forEach(b=>{ b.onclick=()=>{ RSORT=b.dataset.sort; RLOCAL=true; renderRoster(); }; });
}

/// THE team-health computation. Used by BOTH the roster triage header and the
/// Team Report so the two surfaces can never show different numbers.
function teamScore(d){
  const snaps=d.snaps||[], total=d.players.length;
  const withR=snaps.filter(s=>s.readiness!=null);
  const avgR=withR.length?Math.round(withR.reduce((a,s)=>a+s.readiness,0)/withR.length):null;
  const active=new Set(snaps.filter(s=>s.sessions_7d>0).map(s=>s.user_id)).size;
  const engagement=total?Math.round(active/total*100):0;
  const highWL=new Set(snaps.filter(s=>isHighLoad(s)).map(s=>s.user_id)).size;
  const inactive=Math.max(0,total-active);
  const score=avgR==null?engagement:Math.round(avgR*0.6+engagement*0.4);
  const band=score>=80?["STRONG","var(--lime)"]:score>=60?["STEADY","var(--lime)"]:score>=40?["WATCH","var(--amber)"]:["AT RISK","var(--red)"];
  return {score,label:band[0],color:band[1],avgR,engagement,highWL,inactive,active,total};
}

// Team broadcast — one composed message fans out into every athlete's 1:1
// coach thread server-side (coach-player-api broadcastMessage). Same op the
// iOS 'Message Team' sheet uses.
function openBroadcast(team){
  const wrap=document.createElement("div");
  wrap.id="bcastModal";
  wrap.style.cssText="position:fixed;inset:0;background:rgba(1,2,5,.72);z-index:60;display:flex;align-items:center;justify-content:center;padding:20px";
  wrap.innerHTML=`<div style="background:var(--raised,#16211f);border:1px solid rgba(247,247,242,.12);border-radius:18px;max-width:520px;width:100%;padding:20px">
    <h3 style="margin:0 0 4px">Message ${esc(team.name)}</h3>
    <div class="muted" style="font-size:12px;margin-bottom:10px">Lands in every player's coach chat — they reply to you 1:1, not to the group.</div>
    <textarea id="bcastText" rows="4" maxlength="2000" placeholder="Practice moved to 5pm…" style="width:100%;box-sizing:border-box;background:rgba(1,2,5,.4);color:var(--bone,#F7F7F2);border:1px solid rgba(247,247,242,.14);border-radius:12px;padding:10px;font:inherit"></textarea>
    <div class="err" id="bcastErr" style="min-height:16px"></div>
    <div class="row" style="gap:8px;justify-content:flex-end;margin-top:8px">
      <button class="btn" id="bcastCancel">Cancel</button>
      <button class="btn btn-primary" id="bcastSend">Send to team</button>
    </div></div>`;
  document.body.appendChild(wrap);
  const close=()=>wrap.remove();
  wrap.addEventListener("click",e=>{if(e.target===wrap)close();});
  wrap.querySelector("#bcastCancel").onclick=close;
  const btn=wrap.querySelector("#bcastSend");
  btn.onclick=async()=>{
    const body=(wrap.querySelector("#bcastText").value||"").trim();
    const err=wrap.querySelector("#bcastErr");
    if(!body){err.textContent="Type a message first.";return;}
    btn.disabled=true;btn.textContent="Sending…";
    try{ const j=await coachCall("broadcastMessage",{teamId:team.id,body});
      err.style.color="var(--lime)";err.textContent=`Sent to ${j.sent??0} player${(j.sent??0)===1?"":"s"}.`;
      setTimeout(close,1400);
    }catch(ex){err.textContent=ex.message||"Couldn't send.";btn.disabled=false;btn.textContent="Send to team";}
  };
  wrap.querySelector("#bcastText").focus();
}
function setReviewBadge(n){ const dot=$("#rosterDot"); if(!dot)return; if(n>0){dot.textContent=n;dot.classList.remove("hidden");}else dot.classList.add("hidden"); }

function teamDriversHTML(sums,players){
  if(!sums||!sums.length)return"";
  const nameOf=uid=>{const m=(players||[]).find(p=>p.user_id===uid||p.userId===uid);return m?nm(m):"Player";};
  const flat=s=>{const p=s.payload||{};const out=[];
    [["FB",p.pitching],["EV",p.hitting],["READY",p.readiness]].forEach(pair=>{(((pair[1]||{}).results)||[]).forEach(r=>out.push(r));});
    return out;};
  const pat={};const watch=[];let withClear=0;
  for(const s of sums){let clear=false;
    for(const r of flat(s)){if(!r.clearsNoise)continue;clear=true;
      if((r.effect||0)>0){const k=r.id||r.label;if(!pat[k])pat[k]={label:r.label||k,users:new Set()};pat[k].users.add(s.userId);}
      else watch.push({name:nameOf(s.userId),label:r.label||"",eff:Number(r.effect||0).toFixed(1)+" "+(r.unit||"")});}
    if(clear)withClear++;}
  const patRows=Object.values(pat).map(p=>({label:p.label,n:p.users.size})).sort((a,b)=>b.n-a.n).slice(0,3);
  const prs=sums.filter(s=>s.payload&&s.payload.latestPR&&s.payload.latestPR.date)
    .map(s=>({name:nameOf(s.userId),pr:s.payload.latestPR}))
    .sort((a,b)=>Date.parse(b.pr.date)-Date.parse(a.pr.date)).slice(0,4);
  let inner="";
  if(patRows.length)inner+=`<div style="margin-top:4px"><strong style="font-size:12px;letter-spacing:.06em">TEAM PATTERNS</strong>${patRows.map(p=>`<div style="font-size:13px;margin-top:4px">${esc(p.label)} — clear positive for <strong>${p.n}</strong> athlete${p.n===1?"":"s"}</div>`).join("")}</div>`;
  if(watch.length)inner+=`<div style="margin-top:10px"><strong style="font-size:12px;letter-spacing:.06em;color:var(--amber)">WATCHOUTS</strong>${watch.slice(0,5).map(w=>`<div style="font-size:13px;margin-top:4px">${esc(w.name)} — ${esc(w.label)} <span style="color:var(--amber);font-weight:700">${esc(w.eff)}</span></div>`).join("")}</div>`;
  if(prs.length)inner+=`<div style="margin-top:10px"><strong style="font-size:12px;letter-spacing:.06em">RECENT PRS</strong>${prs.map(x=>`<div style="font-size:13px;margin-top:5px">${esc(x.name)} — ${esc(x.pr.kind||"PR")} <strong>${Number(x.pr.value||0).toFixed(1)}</strong> <span class="muted" style="font-size:11px">(prev ${Number(x.pr.previous||0).toFixed(1)}) · ${esc(fmtDate(x.pr.date))}</span>${(x.pr.context||[]).slice(0,2).map(c=>`<div class="muted" style="font-size:11px;margin-left:8px">${esc(c.label||"")}: ${esc(c.value||"")}</div>`).join("")}</div>`).join("")}</div>`;
  const total=(players||[]).length;
  inner+=`<div class="muted" style="font-size:11px;margin-top:10px">${sums.length} of ${total} athletes syncing driver data · ${withClear} with clear reads · personal associations, not proof of cause.</div>`;
  return `<div class="sec"><h3>Team drivers</h3>${inner}</div>`;
}
// Team Report = scoreboard + ONE roster.
//
// Previously this rendered a "Needs attention" card AND a "Roster · ranked by
// readiness" table, but needsAttention() is derived from the same snapshots as
// the table — so every flagged athlete appeared twice on one screen. The stat
// tiles now double as filters over a single list, and flagged rows carry their
// reason inline (the one thing the separate card did better). Mirrors the iOS
// Team Report exactly so the two surfaces can't drift.
let RFILTER="flagged", REXPAND=false;

/// THE definition of "high load" — used by the stat tile, the roster filter it
/// drives, and teamScore(). One predicate so the tile can never read 2 above a
/// list of 1. Mirrors TeamHealth.isHighLoad on iOS.
/// Is an assignment actually ACTIONABLE today? Mirrors TeamAssignmentDTO.isDueNow
/// on iOS. Assigning a 4-week program materializes ~28 rows at once, so listing
/// future work as "active" (or counting it in a completion %) makes a compliant
/// athlete look like they're failing. Undated = due now.
function isAssignmentDue(a,now){
  if(!a||!a.due_date)return true;
  const d=new Date(a.due_date);
  // Date-only due dates arrive as UTC midnight; compare on the calendar day.
  const day=new Date(d.getUTCFullYear(),d.getUTCMonth(),d.getUTCDate());
  const today=new Date(now||Date.now()); today.setHours(0,0,0,0);
  return day<=today;
}

function isHighLoad(s){ if(!s)return false; return (s.pitches_7d||0)>=HIGH_WORKLOAD || (s.acwr&&s.acwr>1.5); }

function readinessSplit(d){
  let ready=0,moderate=0,low=0;
  for(const s of (d.snaps||[])){
    if(s.readiness==null)continue;
    if(s.readiness>=65)ready++;else if(s.readiness>=45)moderate++;else low++;
  }
  const total=(d.players||[]).length;
  return {ready,moderate,low,unreported:Math.max(0,total-(ready+moderate+low)),counted:Math.max(total,ready+moderate+low)};
}

function healthDrivers(d,h){
  const out=[];
  if(h.avgR!=null){
    out.push({label:`Avg readiness ${h.avgR}`,positive:h.avgR>=65,
      detail:h.avgR>=70?"Squad is fresh and ready to train.":h.avgR>=50?"Readiness is moderate — watch heavy days.":"Low readiness across the room — consider lighter loads."});
  }else{
    out.push({label:"Readiness not reported",positive:false,detail:"Athletes haven't logged a daily check-in recently."});
  }
  out.push({label:`${h.engagement}% active this week`,positive:h.engagement>=60,
    detail:`${h.active} of ${h.total} athletes logged a session in the last 7 days.`});
  out.push(h.highWL>0
    ?{label:`${h.highWL} high workload`,positive:false,detail:`Above ~${HIGH_WORKLOAD} pitches in 7 days — monitor for fatigue and volume spikes.`}
    :{label:"Workload in range",positive:true,detail:"No athlete is spiking pitch volume this week."});
  if(h.inactive>0)out.push({label:`${h.inactive} inactive`,positive:false,detail:"No session logged in 7 days — worth a check-in to re-engage."});
  return out;
}

/// Rows for a filter slice. Same predicates + ordering as iOS rows(for:).
function rosterSlice(d,filter,flagMap){
  const all=(d.players||[]).map(m=>({m,s:d.snaps.find(x=>x.user_id===m.user_id)}));
  const rdy=r=>r.s?.readiness??999;
  if(filter==="all")return all.sort((a,b)=>rdy(a)-rdy(b));
  if(filter==="flagged")return all.filter(r=>flagMap[r.m.user_id]).sort((a,b)=>{
    const sa=flagMap[a.m.user_id]?.sev||0, sb=flagMap[b.m.user_id]?.sev||0;
    return sa!==sb?sb-sa:rdy(a)-rdy(b);
  });
  if(filter==="highLoad")return all.filter(r=>isHighLoad(r.s)).sort((a,b)=>rdy(a)-rdy(b));
  if(filter==="inactive")return all.filter(r=>!(r.s?.sessions_7d>0)).sort((a,b)=>rdy(a)-rdy(b));
  if(filter==="lowReadiness")return all.filter(r=>(r.s?.readiness??999)<45).sort((a,b)=>rdy(a)-rdy(b));
  return all;
}

function mchip(v,l,c){return `<div class="mchip"><div class="v" style="color:${c||'var(--bone)'}">${esc(v)}</div><div class="l">${esc(l)}</div></div>`;}

function acwrColor(a){ if(!a)return "var(--muted)"; return a>1.5?"var(--red)":(a>=1.3?"var(--amber)":"var(--lime)"); }

/// Athletes owing the coach activity — built from the ROSTER, not the snapshots.
/// An athlete who joined by code and never opened the app has a membership row
/// and NO snapshot, so a snapshot-based filter silently drops exactly the people
/// most worth chasing (the tile counted them; the list couldn't show them).
function inactiveAthletes(d){
  const out=[]; const seen=new Set();
  for(const m of (d.players||[])){
    if(seen.has(m.user_id))continue; seen.add(m.user_id);
    // An org athlete can sit on two teams and therefore have TWO snapshot rows.
    // Active ANYWHERE means active — take every row, not just the first, or a
    // player who trained with one squad shows up on the other squad's chase list.
    const mine=(d.snaps||[]).filter(x=>x.user_id===m.user_id);
    if(mine.some(x=>x.sessions_7d>0))continue;
    const s=mine[0]||null;
    const state=mine.length?"wentQuiet":"neverSynced";
    // Most recent signal across their teams.
    const last=mine.map(x=>x.last_session_at).filter(Boolean).sort().pop();
    const anchor=last||m.joined_at||null;
    const days=anchor?Math.max(0,Math.floor((Date.now()-new Date(anchor).getTime())/86400000)):0;
    out.push({m,s,state,days,anchor});
  }
  const rank=x=>x.state==="neverSynced"?0:1;
  return out.sort((a,b)=>rank(a)-rank(b)||b.days-a.days||nm(a.m).localeCompare(nm(b.m)));
}

const INACTIVE_META={
  neverSynced:{title:"Never opened the app",tint:"var(--red)",
    blurb:"On the roster but has never synced. They may not have downloaded the app or signed in yet."},
  wentQuiet:{title:"Went quiet",tint:"var(--amber)",
    blurb:"Has logged before, but nothing in the last 7 days."}
};

function idleLine(a){
  if(a.state==="neverSynced")
    return a.days<=0?"Joined today · no data yet":`Joined ${a.days} day${a.days===1?"":"s"} ago · still no data`;
  if(!a.anchor)return "No sessions in the last 7 days";
  return a.days<=0?"Last logged today · nothing this week":`Last logged ${a.days} day${a.days===1?"":"s"} ago`;
}

/// The chase list. A real page, not a filtered table — a coach works through it.
async function renderInactive(){
  const d=await teamData();
  const rows=inactiveAthletes(d);
  const total=(d.players||[]).length;
  const never=rows.filter(r=>r.state==="neverSynced"), quiet=rows.filter(r=>r.state==="wentQuiet");
  let html=`<button class="ghost" id="backBtn" style="margin-bottom:12px">‹ Back to Team Report</button>`;
  if(!rows.length){
    html+=`<div class="sec" style="text-align:center;padding:26px 18px">
      <div style="font-size:26px">✅</div>
      <h3 style="margin:8px 0 4px">Everyone's logging</h3>
      <div class="muted" style="font-size:12.5px">Every athlete on the roster has logged a session in the last 7 days.</div></div>`;
  }else{
    html+=`<div class="sec"><h3>Not showing up</h3>
      <div style="display:flex;align-items:baseline;gap:7px;margin-top:6px">
        <div style="font-family:var(--mono);font-size:34px;font-weight:800;color:var(--red)">${rows.length}</div>
        <div class="muted" style="font-size:13px">of ${total} athlete${total===1?"":"s"}</div></div>
      <div style="margin-top:9px">
        ${never.length?`<div style="font-size:12.5px;font-weight:800;margin-top:5px"><span style="color:var(--red)">●</span> ${never.length} · never opened the app</div>`:""}
        ${quiet.length?`<div style="font-size:12.5px;font-weight:800;margin-top:5px"><span style="color:var(--amber)">●</span> ${quiet.length} · went quiet</div>`:""}
      </div>
      <button class="ghost" id="msgAllBtn" style="margin-top:13px;width:100%">📣 Message the team</button></div>`;
    for(const [key,list] of [["neverSynced",never],["wentQuiet",quiet]]){
      if(!list.length)continue;
      const meta=INACTIVE_META[key];
      html+=`<div class="sec"><div class="row"><h3 style="flex:1;margin:0;color:${meta.tint}">${esc(meta.title)}</h3>
        <div style="color:${meta.tint};font-weight:800">${list.length}</div></div>
        <div class="muted" style="font-size:11.5px;margin:6px 0 10px">${esc(meta.blurb)}</div>
        <div id="inact-${key}"></div></div>`;
    }
  }
  $("#main").innerHTML=html;
  $("#backBtn").onclick=()=>{ SUBTEAM="health"; render(); };
  const mab=$("#msgAllBtn"); if(mab)mab.onclick=()=>openBroadcast(d.team);
  for(const [key,list] of [["neverSynced",never],["wentQuiet",quiet]]){
    const host=$("#inact-"+key); if(!host)continue;
    const meta=INACTIVE_META[key];
    list.forEach(a=>{
      // Row = open the folder; NUDGE = same folder, scrolled to Messages (web's
      // 1:1 chat lives inside the folder, so this is one route with two intents
      // rather than a second messaging surface). Matches the iOS row's affordances.
      const wrap=document.createElement("div");
      wrap.style.cssText="display:flex;align-items:stretch;gap:8px";
      const b=document.createElement("button"); b.className="prow"; b.style.flex="1";
      b.innerHTML=`<div class="sevbar" style="background:${meta.tint}"></div>
        <div style="flex:1;min-width:0">
          <div class="pn">${esc(nm(a.m))}</div>
          <div class="pr" style="color:${a.days>=14?meta.tint:"var(--mutedHi)"}">${esc(idleLine(a))}</div>
        </div><div class="chev">›</div>`;
      b.onclick=()=>openPlayer(d.team,a.m);
      const nudge=document.createElement("button"); nudge.className="fchip";
      nudge.style.cssText="align-self:center;white-space:nowrap";
      nudge.textContent="Nudge";
      nudge.onclick=async(e)=>{ e.stopPropagation(); await openPlayer(d.team,a.m);
        const m=document.getElementById("msgInput"); if(m){ m.scrollIntoView({block:"center"}); m.focus(); } };
      wrap.appendChild(b); wrap.appendChild(nudge); host.appendChild(wrap);
    });
  }
}

async function renderHealth(){
  const d=await teamData();
  const h=teamScore(d);
  const {avgR,engagement,highWL,inactive,total,score}=h;
  const sp=readinessSplit(d);
  const att=needsAttention(d);
  const flagMap={}; att.forEach(a=>{flagMap[a.member.user_id]=a;});
  if(RFILTER==="flagged"&&!att.length)RFILTER="all";

  const segs=[["READY",sp.ready,"var(--lime)"],["MODERATE",sp.moderate,"var(--amber)"],
              ["LOW",sp.low,"var(--red)"],["NO DATA",sp.unreported,"rgba(247,247,242,.25)"]].filter(x=>x[1]>0);
  const denom=sp.counted||1;
  const drivers=healthDrivers(d,h);

  let html=`<div class="sec"><h3>Team Health · ${esc(d.team.name)}</h3><div class="scoreWrap">
    <div><div class="scoreBig" style="color:${h.color}">${score}</div><div class="band" style="color:${h.color}">${esc(h.label)}</div></div>
    <div class="kpis">
      ${kpiTap(avgR??"—","Avg RDY",rColor(avgR),sp.low>0?"lowReadiness":null)}
      ${kpiTap(engagement+"%","Engaged",engagement>=60?"var(--lime)":"var(--amber)",null)}
      ${kpiTap(highWL,"High load",highWL>0?"var(--red)":null,highWL>0?"highLoad":null)}
      ${kpiTap(inactive,"Inactive",inactive>0?"var(--red)":null,inactive>0?"inactive":null)}
    </div></div>
    <div class="splitWrap">
      <div class="splitLbl">Readiness across ${sp.counted} athlete${sp.counted===1?"":"s"}</div>
      <div class="splitBar">${segs.map(s=>`<i style="background:${s[2]};width:${(s[1]/denom*100).toFixed(2)}%"></i>`).join("")}</div>
      <div class="splitLeg">${segs.map(s=>`<span><i style="background:${s[2]}"></i>${s[1]} ${s[0]}</span>`).join("")}</div>
    </div>
    <button class="drvToggle" id="drvBtn">▸ What's moving it (${drivers.length})</button>
    <div class="drvBody" id="drvBody">${drivers.map(x=>`<div class="drv"><div class="ar" style="color:${x.positive?"var(--lime)":"var(--red)"}">${x.positive?"↗":"↘"}</div><div><b>${esc(x.label)}</b><span>${esc(x.detail)}</span></div></div>`).join("")}</div>
    <div class="muted" style="font-size:10.5px;margin-top:12px">Training-readiness signal from synced data — not a medical assessment. Pain is a stop sign.</div></div>`;

  if((d.team.orgPlan||d.team.org_plan)==="enterprise"){
    try{const ds=await coachCall("teamDriverSummaries",{teamId:d.team.id});html+=teamDriversHTML(ds.summaries||[],d.players);}catch(e){}
  }

  const chipDefs=[];
  if(att.length)chipDefs.push(["flagged","⚠ Flagged"]);
  chipDefs.push(["all","All"]);
  if(rosterSlice(d,"highLoad",flagMap).length)chipDefs.push(["highLoad","High load"]);
  if(rosterSlice(d,"lowReadiness",flagMap).length)chipDefs.push(["lowReadiness","Low rdy"]);

  html+=`<div class="sec"><div class="row"><h3 style="flex:1;margin:0">Roster · ${(d.players||[]).length}</h3><button class="ghost" id="csvBtn">⬇ CSV</button></div>
    <div class="chips">${chipDefs.map(([k,l])=>`<button class="fchip ${k===RFILTER?"on":""} ${k==="all"?"allf":""}" data-f="${k}">${esc(l)} ${rosterSlice(d,k,flagMap).length}</button>`).join("")}</div>
    <div id="rosterList"></div></div>`;

  $("#main").innerHTML=html;

  const drvBtn=$("#drvBtn"), drvBody=$("#drvBody");
  drvBtn.onclick=()=>{const open=drvBody.classList.toggle("open");
    drvBtn.textContent=`${open?"▾":"▸"} What's moving it (${drivers.length})`;};

  document.querySelectorAll(".kpi.tap").forEach(el=>{
    el.onclick=()=>{
      const f=el.dataset.f;
      // INACTIVE opens the dedicated chase list: those athletes need working
      // through, and the in-place filter structurally can't show the ones who
      // never synced (no snapshot) even though the tile counts them.
      if(f==="inactive"){ SUBTEAM="inactive"; render(); return; }
      RFILTER=(RFILTER===f)?"all":f; REXPAND=false; renderHealth();
    };
  });
  document.querySelectorAll(".fchip").forEach(el=>{
    el.onclick=()=>{RFILTER=el.dataset.f; REXPAND=false; renderHealth();};
  });

  const rows=rosterSlice(d,RFILTER,flagMap);
  const CAP=12, shown=REXPAND?rows:rows.slice(0,CAP);
  const list=$("#rosterList");
  if(!shown.length){
    list.innerHTML=`<div class="muted" style="font-size:12px;padding:6px 0">Nobody in this slice right now.</div>`;
  }else{
    shown.forEach(({m,s})=>{
      const flag=flagMap[m.user_id];
      const sev=flag?(flag.sev>=3?"var(--red)":"var(--amber)"):rColor(s?.readiness);
      const b=document.createElement("button"); b.className="prow";
      b.innerHTML=`<div class="sevbar" style="background:${sev}"></div>
        <div style="flex:1;min-width:0">
          <div class="pn">${esc(nm(m))}${(s?.rest_days_needed>0)?' <span style="color:var(--red)">◗</span>':""}</div>
          <div class="pr" style="color:${flag?sev:"var(--mutedHi)"}">${esc(flag?flag.reasons.join(" · "):statusLineWeb(s))}</div>
          <div class="mline">
            ${mchip(s?.readiness??"—","RDY",rColor(s?.readiness))}
            ${mchip(s?.pitches_7d??"—","7D",(s?.pitches_7d||0)>=HIGH_WORKLOAD?"var(--red)":"var(--mutedHi)")}
            ${mchip(s?.acwr?s.acwr.toFixed(2):"—","ACWR",acwrColor(s?.acwr))}
            ${mchip(s?.hrv_7d?Math.round(s.hrv_7d):"—","HRV","var(--cyan)")}
            ${mchip(s?.top_velo_7d?Math.round(s.top_velo_7d):"—","VELO","var(--lime)")}
            ${mchip(s?.sessions_7d??"—","SESS","var(--mutedHi)")}
          </div>
        </div><div class="chev">›</div>`;
      b.onclick=()=>openPlayer(d.team,m); list.appendChild(b);
    });
    if(rows.length>CAP){
      const more=document.createElement("button"); more.className="showAll";
      more.textContent=REXPAND?"Show less":`Show all ${rows.length} ▾`;
      more.onclick=()=>{REXPAND=!REXPAND; renderHealth();};
      list.appendChild(more);
    }
  }
  $("#csvBtn").onclick=()=>exportCSV(d,rosterSlice(d,"all",flagMap));
}

/// Tappable KPI tile — only tappable when athletes sit behind it (a tap that
/// reveals an empty list is a dead end).
function kpiTap(v,l,c,filter){
  const on=filter&&filter===RFILTER;
  return `<div class="kpi ${filter?"tap":""} ${on?"on":""}" ${filter?`data-f="${filter}"`:""}>
    <div class="v" style="color:${c||'var(--bone)'}">${esc(v)}</div><div class="l">${esc(l)}</div></div>`;
}

/// One-line coachable status for an unflagged athlete (iOS statusLine parity).
function statusLineWeb(s){
  const bits=[];
  if(s?.readiness!=null){
    if(s.readiness<45)bits.push("Low readiness — recovery day");
    else if(s.readiness<65)bits.push("Moderate — manage intent");
    else bits.push("Ready to train");
  }else bits.push("No check-in yet");
  if((s?.pitches_7d||0)>=HIGH_WORKLOAD)bits.push("high 7-day workload");
  if(!(s?.sessions_7d>0))bits.push("no session this week");
  return bits.join(" · ");
}
function needsAttention(d){
  return d.players.map(m=>{ const s=d.snaps.find(x=>x.user_id===m.user_id); if(!s)return null;
    const reasons=[];let sev=0;
    if(s.readiness!=null&&s.readiness<45){reasons.push(`Low readiness (${s.readiness})`);sev+=3;}
    if(s.rest_days_needed>0){reasons.push(`Owed ${s.rest_days_needed} rest day${s.rest_days_needed===1?"":"s"}`);sev+=3;}
    if(s.pitches_7d>=HIGH_WORKLOAD){reasons.push(`High workload — ${s.pitches_7d} pitches/7d`);sev+=2;}
    if(s.acwr&&s.acwr>1.5){reasons.push(`Workload spike (ACWR ${s.acwr.toFixed(2)})`);sev+=2;}
    if(!(s.sessions_7d>0)){reasons.push("No activity this week");sev+=1;}
    return reasons.length?{name:nm(m),member:m,reasons,sev}:null;
  }).filter(Boolean).sort((a,b)=>b.sev-a.sev);
}
function exportCSV(d,rows){
  const head=["Athlete","Readiness","TopVelo7d","Pitches7d","ACWR","HRV7d","Sessions7d","LastSession"];
  const lines=[head.join(",")].concat(rows.map(({m,s})=>[`"${nm(m).replace(/"/g,'""')}"`,s?.readiness??"",s?.top_velo_7d??"",s?.pitches_7d??"",s?.acwr??"",s?.hrv_7d??"",s?.sessions_7d??"",s?.last_session_at??""].join(",")));
  const blob=new Blob([lines.join("\n")],{type:"text/csv"});const a=document.createElement("a");
  a.href=URL.createObjectURL(blob);a.download=`${d.team.name.replace(/[^a-z0-9]/gi,"_")}_roster.csv`;a.click();URL.revokeObjectURL(a.href);
}

async function renderAssign(){
  const d=await teamData(); const owner=isOwner(d.team);
  const [asgs,comps]=await Promise.all([teamsCall("assignmentsForTeam",{teamId:SEL}).catch(()=>[]),teamsCall("completionsForTeam",{teamId:SEL}).catch(()=>[])]);
  let templates=[],groups=[],gmap={},programs=[];
  try{templates=await listTemplates()||[];}catch(e){}
  try{groups=await listGroups(SEL)||[];}catch(e){}
  try{gmap=await groupMemberMap(groups);}catch(e){}
  try{if(owner)programs=await teamsCall("listPrograms",{teamId:SEL})||[];}catch(e){}
  ASG={d,templates,groups,gmap,programs};
  const compBy={};(comps||[]).forEach(c=>{(compBy[c.assignment_id]=compBy[c.assignment_id]||new Set()).add(c.user_id);});
  const nameOf=uid=>{const m=d.players.find(x=>x.user_id===uid);return m?nm(m):"Athlete";};
  const groupOpts=groups.length?`<optgroup label="Groups">${groups.map(g=>`<option value="group:${esc(g.id)}">Group · ${esc(g.name)} (${(gmap[g.id]||[]).length})</option>`).join("")}</optgroup>`:"";
  let html=`<div class="sec"><h3>New assignment</h3>
    ${templates.length?`<div class="field"><label>Start from template</label><select id="aTpl"><option value="">— none —</option>${templates.map(t=>`<option value="${esc(t.id)}">${esc(t.name)}</option>`).join("")}</select></div>`:""}
    <div class="field"><label>Type</label><select id="aKind"><option value="workout">Workout</option><option value="armcare">Arm care</option><option value="note">Note</option></select></div>
    <div class="field"><label>Title</label><input id="aTitle" placeholder="e.g. Long toss progression — day 1"/></div>
    <div class="field"><label>Details (optional)</label><textarea id="aNotes" rows="2" placeholder="Sets, reps, cues…"></textarea></div>
    <div class="field"><label>Assign to</label><select id="aWho"><option value="">Whole team</option>${groupOpts}<optgroup label="Players">${d.players.map(m=>`<option value="${esc(m.user_id)}">${esc(nm(m))}</option>`).join("")}</optgroup></select></div>
    <div class="field"><label>Due (optional)</label><input id="aDue" type="date"/></div>
    <div class="row" style="gap:8px;flex-wrap:wrap"><button class="btn btn-primary" id="aCreate" style="padding:12px 18px">Create assignment</button><button class="ghost" id="aSaveTpl">Save as template</button></div>
    <div id="aErr" class="err"></div></div>`;
  if(owner){
    html+=`<div class="sec"><div class="row"><h3 style="flex:1;margin:0">Programs — day by day (${programs.length})</h3><button class="ghost" id="pgImport" style="margin-right:6px">⬆ Import</button><button class="ghost" id="pgNew">＋ New program</button></div>
      <div class="muted" style="font-size:11.5px;margin:4px 0 10px">Multi-day throwing &amp; lifting plans. Assigning materializes every day onto each player's calendar + assignments — lift days install into their Workouts with one tap.</div>
      <div id="pgList"></div></div>`;
  }else{
    html+=`<div class="sec"><h3>Programs — day by day</h3><div class="muted" style="font-size:12.5px">Only the team owner can build &amp; assign structured programs.</div></div>`;
  }
  html+=`<div class="sec"><h3>Quick assignment templates (${templates.length})</h3><div id="tplList" style="margin-bottom:13px"></div>
    <div class="field"><label>Template name</label><input id="tName" placeholder="e.g. Off-day arm care"/></div>
    <div class="row" style="gap:8px;flex-wrap:wrap;margin-bottom:10px"><select id="tKind" class="teamsel" style="max-width:150px"><option value="workout">Workout</option><option value="armcare">Arm care</option><option value="note">Note</option></select><input id="tTitle" placeholder="Assignment title" style="flex:1;min-width:150px;background:var(--sunken);border:1px solid var(--line);color:var(--bone);border-radius:11px;padding:11px 12px;font-size:14px;outline:none"/></div>
    <div class="field"><textarea id="tNotes" rows="2" placeholder="Details / cues (optional)"></textarea></div>
    <input type="hidden" id="tEditId" value=""/>
    <button class="btn btn-primary" id="tSave" style="padding:11px 16px;align-self:flex-start">Save template</button>
    <div id="tErr" class="err"></div></div>`;
  if(owner) html+=`<div class="sec"><h3>Groups / cohorts (${groups.length})</h3><div id="grpList" style="margin-bottom:12px"></div>
    <div class="row" style="gap:8px;flex-wrap:wrap"><input id="gName" placeholder="New group (e.g. Starters)" style="flex:1;min-width:150px;background:var(--sunken);border:1px solid var(--line);color:var(--bone);border-radius:11px;padding:11px 12px;font-size:14px;outline:none"/><button class="btn btn-primary" id="gCreate" style="padding:11px 16px">Create group</button></div><div id="gErr" class="err"></div></div>`;
  const dueAsgs=(asgs||[]).filter(a=>isAssignmentDue(a)), upAsgs=(asgs||[]).filter(a=>!isAssignmentDue(a));
  html+=`<div class="sec"><h3>Due now (${dueAsgs.length})</h3><div id="aList"></div></div>`;
  if(upAsgs.length)html+=`<div class="sec"><div class="row"><h3 style="flex:1;margin:0">Upcoming (${upAsgs.length})</h3></div>
    <div class="muted" style="font-size:11.5px;margin:6px 0 10px">Assigned but not due yet — deliberately excluded from completion percentages.</div>
    <div id="aUpList"></div></div>`;
  $("#main").innerHTML=html;
  if(templates.length)$("#aTpl").onchange=()=>{const t=templates.find(x=>x.id===$("#aTpl").value);if(t){$("#aKind").value=t.kind;$("#aTitle").value=t.title;$("#aNotes").value=t.notes||"";}};
  const list=$("#aList"),teamSize=d.players.length||1;
  if(!dueAsgs.length) list.innerHTML=`<div class="empty">${(asgs||[]).length?"Nothing due right now — see Upcoming below.":"No assignments yet. Create one above — to the whole team, a group, or one athlete."}</div>`;
  const asgRow=(a)=>{
    const done=(compBy[a.id]||new Set()).size,denom=a.assignee_user_id?1:teamSize,pct=denom?Math.round(done/denom*100):0;
    const row=document.createElement("div");row.className="asg";
    row.innerHTML=`<span class="k">${esc(a.kind)}</span><div style="flex:1;min-width:0"><div style="font-weight:800;font-size:14px">${esc(a.title)}</div><div class="muted" style="font-size:11px;margin-top:2px">${a.assignee_user_id?esc(nameOf(a.assignee_user_id)):"Whole team"}${a.due_date?" · due "+esc(fmtDate(a.due_date)):""}${a.notes?" · "+esc(a.notes):""}</div></div><div style="text-align:right"><div class="pct" style="color:${pct>=60?"var(--lime)":"var(--amber)"}">${done}/${denom}</div><div class="muted" style="font-family:var(--mono);font-size:9px;letter-spacing:.5px">DONE</div></div>`;
    return row;
  };
  dueAsgs.sort((a,b)=>new Date(b.created_at)-new Date(a.created_at)).forEach(a=>list.appendChild(asgRow(a)));
  const upList=$("#aUpList");
  if(upList)upAsgs.sort((a,b)=>new Date(a.due_date)-new Date(b.due_date)).forEach(a=>upList.appendChild(asgRow(a)));
  if(owner){
    const pgNew=$("#pgNew"); if(pgNew)pgNew.onclick=()=>openProgramBuilder(d.team);
    const pgImp=$("#pgImport"); if(pgImp)pgImp.onclick=()=>openProgramImport(d.team);
    const pl=$("#pgList");
    if(pl){
      if(!programs.length)pl.innerHTML=`<div class="empty">No programs yet — build a day-by-day throwing or lifting plan once, assign it all season.</div>`;
      programs.forEach(pr=>{
        const row=document.createElement("div");row.className="asg";
        row.innerHTML=`<span class="k" style="background:rgba(199,255,61,.14);color:var(--lime)">${esc((pr.program_type||"mixed").toUpperCase())}</span><div style="flex:1;min-width:0"><div style="font-weight:800;font-size:14px">${esc(pr.name)}</div><div class="muted" style="font-size:11px">${pr.day_count||((pr.structure&&pr.structure.days)||[]).length} day${(pr.day_count||1)===1?"":"s"} · created ${esc(fmtDate(pr.created_at))}</div></div>`;
        const acts=document.createElement("div");acts.className="row";acts.style.gap="6px";
        const asn=document.createElement("button");asn.className="ghost";asn.style.cssText="font-size:12px;color:var(--lime)";asn.textContent="Assign";asn.onclick=()=>openAssignProgram(d.team,{programId:pr.id});
        const vw=document.createElement("button");vw.className="ghost";vw.style.fontSize="12px";vw.textContent="View";vw.onclick=()=>viewProgram(pr);
        const del=document.createElement("button");del.className="ghost";del.style.cssText="font-size:12px;color:#ff8b8b";del.textContent="Delete";del.onclick=async()=>{if(!confirm(`Delete program "${pr.name}"? Already-assigned days stay on player calendars.`))return;try{await teamsCall("deleteProgram",{programId:pr.id});await render();}catch(e){alert(e.message);}};
        acts.appendChild(asn);acts.appendChild(vw);acts.appendChild(del);row.appendChild(acts);pl.appendChild(row);
      });
    }
  }
  const tl=$("#tplList"); if(!templates.length)tl.innerHTML=`<div class="empty">No templates yet — save a reusable assignment below to bulk-assign it later.</div>`;
  templates.forEach(t=>{const row=document.createElement("div");row.className="asg";
    row.innerHTML=`<span class="k">${esc(t.kind)}</span><div style="flex:1;min-width:0"><div style="font-weight:800;font-size:14px">${esc(t.name)}</div><div class="muted" style="font-size:11px">${esc(t.title)}${t.notes?" · "+esc(t.notes):""}</div></div>`;
    const acts=document.createElement("div");acts.className="row";acts.style.gap="6px";
    const use=document.createElement("button");use.className="ghost";use.style.fontSize="12px";use.textContent="Use";use.onclick=()=>{$("#aKind").value=t.kind;$("#aTitle").value=t.title;$("#aNotes").value=t.notes||"";window.scrollTo({top:0,behavior:"smooth"});};
    const ed=document.createElement("button");ed.className="ghost";ed.style.fontSize="12px";ed.textContent="Edit";ed.onclick=()=>{$("#tEditId").value=t.id;$("#tName").value=t.name;$("#tKind").value=t.kind;$("#tTitle").value=t.title;$("#tNotes").value=t.notes||"";$("#tSave").textContent="Update template";$("#tName").scrollIntoView({behavior:"smooth",block:"center"});};
    const del=document.createElement("button");del.className="ghost";del.style.cssText="font-size:12px;color:#ff8b8b";del.textContent="Delete";del.onclick=async()=>{if(!confirm(`Delete template "${t.name}"?`))return;try{await rest("DELETE",`team_program_templates?id=eq.${t.id}`);await render();}catch(e){alert(e.message);}};
    acts.appendChild(use);acts.appendChild(ed);acts.appendChild(del);row.appendChild(acts);tl.appendChild(row);});
  if(owner){ const gl=$("#grpList"); if(!groups.length)gl.innerHTML=`<div class="empty">No groups yet — create one to assign work to a cohort in one tap.</div>`;
    groups.forEach(g=>{const mem=gmap[g.id]||[];const row=document.createElement("div");row.className="asg";
      row.innerHTML=`<span class="k" style="background:rgba(199,255,61,.14);color:var(--lime)">${mem.length}</span><div style="flex:1;min-width:0"><div style="font-weight:800;font-size:14px">${esc(g.name)}</div><div class="muted" style="font-size:11px">${mem.length?mem.map(uid=>esc(nameOf(uid))).join(", "):"No members yet"}</div></div>`;
      const acts=document.createElement("div");acts.className="row";acts.style.gap="6px";
      const mg=document.createElement("button");mg.className="ghost";mg.style.fontSize="12px";mg.textContent="Members";mg.onclick=()=>manageGroup(g);
      const as=document.createElement("button");as.className="ghost";as.style.cssText="font-size:12px;color:var(--lime)";as.textContent="Assign";as.onclick=()=>{$("#aWho").value="group:"+g.id;window.scrollTo({top:0,behavior:"smooth"});};
      const del=document.createElement("button");del.className="ghost";del.style.cssText="font-size:12px;color:#ff8b8b";del.textContent="✕";del.onclick=async()=>{if(!confirm(`Delete group "${g.name}"?`))return;try{await rest("DELETE",`team_groups?id=eq.${g.id}`);await render();}catch(e){alert(e.message);}};
      acts.appendChild(mg);acts.appendChild(as);acts.appendChild(del);row.appendChild(acts);gl.appendChild(row);});
    $("#gCreate").onclick=async()=>{const b=$("#gCreate"),e=$("#gErr");e.textContent="";const name=($("#gName").value||"").trim();if(!name){e.textContent="Enter a group name.";return;}b.disabled=true;b.textContent="…";try{await rest("POST","team_groups",{team_id:SEL,name});await render();}catch(ex){e.textContent=mgErr(ex);b.disabled=false;b.textContent="Create group";}};
  }
  $("#aCreate").onclick=async()=>{ const btn=$("#aCreate"),err=$("#aErr");err.textContent="";
    const title=($("#aTitle").value||"").trim(); if(!title){err.textContent="Add a title.";return;}
    const payload={kind:$("#aKind").value,title,notes:($("#aNotes").value||"").trim(),dueDate:$("#aDue").value||null};
    const who=$("#aWho").value; btn.disabled=true;btn.textContent="Creating…";
    try{
      if(who.indexOf("group:")===0){ const uids=ASG.gmap[who.slice(6)]||[]; if(!uids.length)throw new Error("That group has no members yet."); const res=await bulkAssign(SEL,uids,payload); delete CACHE[SEL]; await render(); if(res.ok===0)alert("Couldn't assign — only the team's owner can create assignments."); else if(res.fail)alert(`Assigned to ${res.ok}; ${res.fail} failed.`); return; }
      await teamsCall("createAssignment",{teamId:SEL,kind:payload.kind,title:payload.title,notes:payload.notes,dueDate:payload.dueDate,assigneeUserId:who||null}); delete CACHE[SEL]; await render();
    }catch(e){ err.textContent=/coach|owner|Only the/i.test(e.message)?"Only the team's owner can create assignments.":e.message; btn.disabled=false;btn.textContent="Create assignment"; }
  };
  $("#aSaveTpl").onclick=()=>{const title=($("#aTitle").value||"").trim();$("#tName").value=$("#tName").value||title;$("#tKind").value=$("#aKind").value;$("#tTitle").value=title;$("#tNotes").value=($("#aNotes").value||"").trim();$("#tName").scrollIntoView({behavior:"smooth",block:"center"});};
  $("#tSave").onclick=async()=>{const b=$("#tSave"),e=$("#tErr");e.textContent="";const name=($("#tName").value||"").trim(),title=($("#tTitle").value||"").trim();if(!name||!title){e.textContent="A template needs a name and a title.";return;}b.disabled=true;b.textContent="Saving…";
    const editId=$("#tEditId").value;const rec={kind:$("#tKind").value,title,notes:($("#tNotes").value||"").trim()};
    try{ if(editId)await rest("PATCH",`team_program_templates?id=eq.${editId}`,{name,kind:rec.kind,title:rec.title,notes:rec.notes}); else await rest("POST","team_program_templates",{coach_user_id:MYUID,name,kind:rec.kind,title:rec.title,notes:rec.notes}); await render(); }
    catch(ex){e.textContent=ex.message;b.disabled=false;b.textContent="Save template";}};
}
const kpi=(v,l,c)=>`<div class="kpi"><div class="v" style="color:${c||'var(--bone)'}">${esc(v)}</div><div class="l">${esc(l)}</div></div>`;

/* ---------- Manage tab: team management (create/rename/delete, co-coaches, members) ---------- */
function mgErr(ex){const m=(ex&&ex.message)||"";return /coach|owner|Only the/i.test(m)?"Only the team's owner can do that.":m;}
async function reloadTeams(keepId){
  TEAMS=await teamsCall("myTeams")||[];
  const sel=$("#teamSel");
  if(TEAMS.length>1){ sel.classList.remove("hidden"); sel.innerHTML=TEAMS.map(t=>`<option value="${esc(t.id)}">${esc(t.name)}</option>`).join(""); sel.onchange=()=>{SEL=sel.value;RSEARCH="";RBADGE={};render();}; }
  else sel.classList.add("hidden");
  const branded=TEAMS.find(t=>t.brand_name); $("#orgName").textContent=branded?branded.brand_name:"PlayersLab";
  const logo=TEAMS.find(t=>t.brand_logo_url)?.brand_logo_url; if(logo)$("#hlogoImg").src=logo;
  if(keepId&&TEAMS.some(t=>t.id===keepId))SEL=keepId; else if(!TEAMS.some(t=>t.id===SEL))SEL=TEAMS[0]?.id||null;
  if(SEL&&sel.value!==SEL)sel.value=SEL;
}
async function changeRole(t,m,role){ try{ await teamsCall("setMemberRole",{teamId:t.id,userId:m.user_id,role}); delete CACHE[t.id]; await render(); }catch(ex){ alert(mgErr(ex)); } }
async function removeMem(t,m){ if(!confirm(`Remove ${nm(m)} from ${t.name}?`))return; try{ await teamsCall("removeMember",{teamId:t.id,userId:m.user_id}); delete CACHE[t.id]; await render(); }catch(ex){ alert(mgErr(ex)); } }
async function deleteTeamConfirm(t){ if(!confirm(`Delete "${t.name}"? This removes the team for everyone and cannot be undone.`))return;
  try{ await teamsCall("deleteTeam",{id:t.id}); delete CACHE[t.id];
    TAB="team"; document.querySelectorAll(".tab").forEach(b=>b.classList.toggle("on",b.dataset.tab==="team")); await loadDashboard();
  }catch(ex){ alert(mgErr(ex)); } }
async function renderManage(){
  const d=await teamData(); const t=d.team, owner=isOwner(t);
  let html=`<div class="sec"><h3>Notifications</h3>
    <div class="muted" style="font-size:12.5px">Push alerts and the daily morning digest are delivered to your <strong>phone or iPad</strong>, so they're managed per-device in the app — Coaches Mode → Manage → Notifications. There's nothing to switch on here; a browser has no push token to register.</div></div>
    <div class="sec"><h3>This team</h3>`;
  if(!owner) html+=`<div class="att" style="background:rgba(255,181,51,.10);border-color:rgba(255,181,51,.28);margin-bottom:12px"><div class="sev" style="background:var(--amber)"></div><div><div class="nm">You're a co-coach here</div><div class="rs">Only the team owner${t.coach_name?` (${esc(t.coach_name)})`:""} can rename, delete, or manage coaches &amp; players. You can still post lineups, assign work, and review film.</div></div></div>`;
  html+=`<div class="field"><label>Team name</label><input id="mTeamName" value="${esc(t.name)}" ${owner?"":"disabled"}/></div>
    <div class="row" style="gap:8px;flex-wrap:wrap;margin-bottom:6px">
      ${owner?`<button class="btn btn-primary" id="mRename" style="padding:11px 16px">Save name</button>`:""}
      <span class="chip">JOIN CODE · ${esc(t.join_code)}</span>
      <button class="ghost" id="mCopyCode">⧉ Code</button>
      <button class="ghost" id="mCopyInvite">⧉ Invite text</button>
      ${t.org_plan==="enterprise"?'<span class="chip lime">ENTERPRISE</span>':''}
    </div>
    <div id="mOrgWrap"></div>
    ${owner?`<div><button class="ghost" id="mDelete" style="color:#ff8b8b">Delete this team…</button></div>`:""}
    <div id="mTeamErr" class="err"></div></div>`;
  html+=brandingSectionHTML(t,owner);
  html+=`<div class="sec"><h3>Coaches &amp; players (${d.members.length})</h3>`;
  if(owner) html+=`<div class="row" style="gap:8px;margin-bottom:6px;flex-wrap:wrap"><input id="mInvEmail" type="email" placeholder="co-coach@email.com" style="flex:1;min-width:170px;background:var(--sunken);border:1px solid var(--line);color:var(--bone);border-radius:11px;padding:11px 12px;font-size:14px;outline:none"/><button class="btn btn-primary" id="mInvite" style="padding:11px 16px">Invite coach</button></div><div class="muted" style="font-size:11px;margin-bottom:10px">They need a PlayersLab account on that email first.</div><div id="mInvErr" class="err" style="margin-bottom:6px"></div>`;
  html+=`<div id="mMembers"></div></div>`;
  html+=`<div class="sec"><h3>Create a new team</h3>
    <div class="field"><label>Team name</label><input id="mNewName" placeholder="e.g. 16U Velocity Group"/></div>
    <div class="field"><label>Your name (shown to players)</label><input id="mNewCoach" placeholder="Coach name"/></div>
    <button class="btn btn-primary" id="mCreate" style="padding:11px 16px;align-self:flex-start">Create team</button>
    <div id="mNewErr" class="err"></div></div>`;
  $("#main").innerHTML=html;
  wireBranding(t);
  const ml=$("#mMembers");
  const sorted=[...d.members].sort((a,b)=>(a.role==="coach"?0:1)-(b.role==="coach"?0:1)||nm(a).localeCompare(nm(b)));
  if(!sorted.length) ml.innerHTML=`<div class="empty">No one has joined yet — share the join code.</div>`;
  sorted.forEach(m=>{ const isMe=m.user_id===MYUID, isC=m.role==="coach";
    const row=document.createElement("div");row.className="asg";
    row.innerHTML=`<span class="k" style="${isC?'background:rgba(199,255,61,.14);color:var(--lime)':''}">${isC?"COACH":"PLAYER"}</span><div style="flex:1;min-width:0"><div style="font-weight:800;font-size:14px">${esc(nm(m))}${isMe?' <span class="muted" style="font-weight:600">(you)</span>':''}</div>${m.handle?`<div class="muted" style="font-size:11px">@${esc(m.handle)}</div>`:''}</div>`;
    if(owner&&!isMe){ const acts=document.createElement("div");acts.className="row";acts.style.gap="6px";
      const rb=document.createElement("button");rb.className="ghost";rb.style.fontSize="12px";rb.textContent=isC?"Make player":"Make coach";rb.onclick=()=>changeRole(t,m,isC?"player":"coach");
      const rm=document.createElement("button");rm.className="ghost";rm.style.cssText="font-size:12px;color:#ff8b8b";rm.textContent="Remove";rm.onclick=()=>removeMem(t,m);
      acts.appendChild(rb);acts.appendChild(rm);row.appendChild(acts); }
    ml.appendChild(row); });
  // Enterprise org code: the ONE shared code across all of the org's teams.
  // Auto-provisioned at enterprise team creation (Tier 3); orgCode backfills
  // older orgs on first load here. Owner-only (co-coaches see nothing).
  if(t.org_plan==="enterprise"&&owner){
    (async()=>{try{
      const oc=await teamsCall("orgCode");
      if(!oc||!oc.orgCode)return;
      const w=$("#mOrgWrap");if(!w)return;
      w.innerHTML=`<div class="row" style="gap:8px;flex-wrap:wrap;margin-bottom:6px">
        <span class="chip lime">ORG CODE · ${esc(oc.orgCode)}</span>
        <button class="ghost" id="mCopyOrg">⧉ Org code</button>
        <span class="muted" style="font-size:11px">One code for every team in your org · ${Number(oc.invitesUsed||0)}/${Number(oc.seatCap||45)} seats used</span>
      </div>`;
      const b=$("#mCopyOrg");if(b)b.onclick=()=>{try{navigator.clipboard.writeText(oc.orgCode);}catch(e){} b.textContent="✓ Copied";setTimeout(()=>b.textContent="⧉ Org code",1400);};
    }catch(e){/* co-coach or no org — leave hidden */}})();
  }
  $("#mCopyCode").onclick=()=>{try{navigator.clipboard.writeText(t.join_code);}catch(e){} $("#mCopyCode").textContent="✓ Copied";setTimeout(()=>$("#mCopyCode").textContent="⧉ Code",1400);};
  $("#mCopyInvite").onclick=()=>{const msg=`Join our team on PlayersLab.\n1) Get the app: https://apps.apple.com/app/id6769614769\n2) Tap “Join Team” and enter code ${t.join_code}`;try{navigator.clipboard.writeText(msg);}catch(e){} $("#mCopyInvite").textContent="✓ Copied";setTimeout(()=>$("#mCopyInvite").textContent="⧉ Invite text",1400);};
  if(owner){
    $("#mRename").onclick=async()=>{const b=$("#mRename"),e=$("#mTeamErr");e.textContent="";const name=($("#mTeamName").value||"").trim();if(!name){e.textContent="Enter a team name.";return;}b.disabled=true;b.textContent="Saving…";
      try{await teamsCall("updateTeam",{id:t.id,name});delete CACHE[SEL];await reloadTeams(t.id);await render();}catch(ex){e.textContent=mgErr(ex);b.disabled=false;b.textContent="Save name";}};
    $("#mDelete").onclick=()=>deleteTeamConfirm(t);
    $("#mInvite").onclick=async()=>{const b=$("#mInvite"),e=$("#mInvErr");e.textContent="";const email=($("#mInvEmail").value||"").trim();if(!email){e.textContent="Enter the coach's email.";return;}b.disabled=true;b.textContent="Inviting…";
      try{await teamsCall("inviteCoach",{teamId:t.id,email});$("#mInvEmail").value="";delete CACHE[SEL];await render();}catch(ex){e.textContent=mgErr(ex);b.disabled=false;b.textContent="Invite coach";}};
  }
  $("#mCreate").onclick=async()=>{const b=$("#mCreate"),e=$("#mNewErr");e.textContent="";const name=($("#mNewName").value||"").trim();if(!name){e.textContent="Enter a team name.";return;}b.disabled=true;b.textContent="Creating…";
    try{const nt=await teamsCall("createTeam",{name,coachName:($("#mNewCoach").value||"").trim()});await reloadTeams(nt.id);setTab("team");}catch(ex){e.textContent=mgErr(ex);b.disabled=false;b.textContent="Create team";}};
}

/* ---------- Field tab: lineup diamond + bullpen. The WORKING board is now
   server-synced (teams-api getWorkingLineup/setWorkingLineup) so co-coaches and
   the iOS Field tab all see one board; localStorage stays as offline fallback.
   Canonical cloud payload: {positions, bullpen, battingOrder, names}. ---------- */
const FLKEY=tid=>"pl_field_"+tid;
function normFL(v){v=v||{};return {positions:v.positions||{},bullpen:v.bullpen||{},order:Array.isArray(v.battingOrder)?v.battingOrder.slice():(Array.isArray(v.order)?v.order.slice():[])};}
function flEmpty(fl){return !Object.keys(fl.positions).length&&!Object.keys(fl.bullpen).length&&!fl.order.length;}
function loadFL(tid){let v={};try{v=JSON.parse(localStorage.getItem(FLKEY(tid)))||{};}catch(e){}return normFL(v);}
function saveFL(tid,fl){try{localStorage.setItem(FLKEY(tid),JSON.stringify(fl));}catch(e){}}
function flCloudPayload(fl,players){const names={};(players||[]).forEach(m=>{names[m.user_id]=nm(m);});
  return {positions:fl.positions,bullpen:fl.bullpen,battingOrder:fl.order,names};}
const POS_ORDER=["P","C","1B","2B","3B","SS","LF","CF","RF"];
const SLOTS=[{id:"CF",name:"Center Field",x:50,y:13},{id:"LF",name:"Left Field",x:21,y:27},{id:"RF",name:"Right Field",x:79,y:27},{id:"SS",name:"Shortstop",x:36,y:47},{id:"2B",name:"Second Base",x:64,y:47},{id:"3B",name:"Third Base",x:22,y:62},{id:"1B",name:"First Base",x:78,y:62},{id:"P",name:"Pitcher",x:50,y:60},{id:"C",name:"Catcher",x:50,y:86}];
const ZONES=[{id:"S",title:"Starters",ic:"🔥"},{id:"R",title:"Relievers",ic:"⚡"},{id:"O",title:"Day Off",ic:"🌙"}];
const wlColor=p=>p>=HIGH_WORKLOAD?"var(--red)":(p>=80?"var(--amber)":"var(--lime)");
const lastName=s=>{const a=String(s||"").trim().split(/\s+/);return a.length>1?a[a.length-1]:s;};
let FIELD={tid:null,players:[],snapOf:()=>null,fl:null,posted:null,owner:false};

function fieldPicker(title,cands,onPick,extra){
  const ov=document.createElement("div");ov.className="pick";
  ov.innerHTML=`<div class="pick-box"><div class="row" style="margin-bottom:12px"><h3 style="flex:1;margin:0;color:var(--lime);font-family:var(--mono);font-size:11px;letter-spacing:1.4px;text-transform:uppercase">${esc(title)}</h3><button class="x" id="pkX">✕</button></div><div id="pkList"></div></div>`;
  document.body.appendChild(ov);
  const close=()=>ov.remove();
  ov.addEventListener("click",e=>{if(e.target===ov)close();});
  ov.querySelector("#pkX").onclick=close;
  const list=ov.querySelector("#pkList");
  if(extra){const b=document.createElement("button");b.className="pick-item";b.style.borderColor="rgba(229,56,69,.4)";b.innerHTML=`<div class="xmini" style="color:var(--red)">⌫</div><div style="font-weight:800;color:var(--red)">${esc(extra.label)}</div>`;b.onclick=()=>{close();extra.onPick();};list.appendChild(b);}
  if(!cands.length){const e=document.createElement("div");e.className="empty";e.textContent="No available players.";list.appendChild(e);}
  cands.forEach(c=>{const b=document.createElement("button");b.className="pick-item";
    b.innerHTML=`<div class="ring" style="width:36px;height:36px;font-size:13px;color:${c.color}">${c.r==null?"—":c.r}</div><div style="flex:1;min-width:0"><div style="font-weight:800;font-size:14px">${esc(c.name)}</div>${c.sub?`<div class="muted" style="font-size:11px">${esc(c.sub)}</div>`:""}</div>`;
    b.onclick=()=>{close();onPick(c.uid);};list.appendChild(b);});
}
function candList(members){return members.map(m=>{const s=FIELD.snapOf(m.user_id);return {uid:m.user_id,name:nm(m),r:s&&s.readiness!=null?s.readiness:null,color:rColor(s?.readiness),sub:s?[s.top_velo_7d?Math.round(s.top_velo_7d)+" MPH":null,(s.pitches_7d||0)+" P/7d"].filter(Boolean).join(" · "):"no data synced"};});}
const posOf=uid=>Object.keys(FIELD.fl.positions).find(k=>FIELD.fl.positions[k]===uid)||"";
function persistField(){saveFL(FIELD.tid,FIELD.fl);paintField();queueCloudSave();}
function seedFromPosted(fl,data,players){
  const find=name=>{const m=players.find(x=>nm(x)===name);return m?m.user_id:null;};
  (data.positions||[]).forEach(sp=>{const pid=sp.pos||sp.id;if(sp.name&&pid){const uid=find(sp.name);if(uid)fl.positions[pid]=uid;}});
  (data.batting||[]).forEach(bs=>{if(bs.name){const uid=find(bs.name);if(uid&&!fl.order.includes(uid))fl.order.push(uid);}});
  const zm={starters:"S",relievers:"R",dayOff:"O"};
  Object.keys(zm).forEach(k=>{(data[k]||[]).forEach(a=>{if(a.name){const uid=find(a.name);if(uid)fl.bullpen[uid]=zm[k];}});});
}
async function renderField(){
  const d=await teamData();
  const snapOf=uid=>d.snaps.find(s=>s.user_id===uid);
  let fl=loadFL(SEL),cloud=null,cloudOK=false;
  try{ cloud=await teamsCall("getWorkingLineup",{teamId:SEL}); cloudOK=true; }catch(e){}
  if(cloudOK&&cloud&&cloud.data){ fl=normFL(cloud.data); saveFL(SEL,fl); }
  let posted=null; try{ posted=await teamsCall("getLineup",{teamId:SEL}); }catch(e){}
  if(flEmpty(fl)&&posted&&posted.data){ seedFromPosted(fl,posted.data,d.players); saveFL(SEL,fl); }
  FIELD={tid:SEL,players:d.players,members:d.members,snapOf,fl,posted,owner:isOwner(d.team),cloudOK,cloud,saveTimer:null};
  let html=`<div class="sec"><div class="row" style="flex-wrap:wrap;gap:8px"><h3 style="flex:1;margin:0;min-width:140px">Field · ${esc(d.team.name)}</h3><button class="ghost" id="fSaveAs">💾 Save as…</button><button class="ghost" id="fSavedList">📂 Saved</button><button class="mk" id="fPost">📋 Post to players</button></div><div id="fSync" class="muted" style="font-size:11px;margin-top:8px"></div><div id="fPostStatus" class="muted" style="font-size:11px;margin-top:4px"></div></div>`;
  html+=`<div class="sec"><h3>Lineup</h3><div class="diamond" id="fDiamond"></div><div class="muted" style="font-size:11px;margin-bottom:10px">Tap a position to set it from your roster · ring color = readiness (green ≥65, amber ≥45, red below).</div><div style="font-family:var(--mono);font-size:9.5px;letter-spacing:.8px;color:var(--muted);text-transform:uppercase;margin-bottom:8px">Bench</div><div id="fBench"></div></div>`;
  html+=`<div class="sec"><h3>Bullpen</h3><div class="pen" id="fPen"></div></div>`;
  html+=`<div class="sec"><div class="row"><h3 style="flex:1;margin:0">Batting order</h3><button class="ghost" id="fBatAdd">＋ Add</button></div><div id="fBat" style="margin-top:10px"></div></div>`;
  $("#main").innerHTML=html;
  paintField();
  $("#fPost").onclick=postLineup;
  $("#fSaveAs").onclick=saveLineupAs;
  $("#fSavedList").onclick=openSavedLineups;
  $("#fBatAdd").onclick=()=>{const inOrder=new Set(FIELD.fl.order);fieldPicker("Add to batting order",candList(FIELD.players.filter(m=>!inOrder.has(m.user_id))),uid=>{FIELD.fl.order.push(uid);persistField();});};
  renderPostedStatus();
  renderSyncStatus();
}
function renderSyncStatus(msg){
  const e=$("#fSync"); if(!e)return;
  if(msg){e.style.color="var(--lime)";e.textContent=msg;return;}
  e.style.color="var(--muted)";
  if(!FIELD.cloudOK){e.textContent="Offline — this board is saved on this device only. It syncs to your staff when you're back online.";return;}
  const c=FIELD.cloud;
  if(c&&c.updated_at){
    let who="";
    if(c.updated_by&&c.updated_by!==MYUID){const m=(FIELD.members||[]).find(x=>x.user_id===c.updated_by);if(m)who=" by "+nm(m);}
    e.textContent=`Shared working board — synced with your coaching staff · last edit${who} ${relDays(c.updated_at)||"today"}`;
  } else e.textContent="Shared working board — edits sync live to your whole coaching staff and the app.";
}
function queueCloudSave(){
  if(!FIELD.cloudOK)return;
  clearTimeout(FIELD.saveTimer);
  const tid=FIELD.tid;
  FIELD.saveTimer=setTimeout(async()=>{
    try{
      const row=await teamsCall("setWorkingLineup",{teamId:tid,data:flCloudPayload(FIELD.fl,FIELD.players)});
      if(FIELD.tid===tid){FIELD.cloud=row;renderSyncStatus("Synced to your staff · just now");}
    }catch(e){ if(FIELD.tid===tid){const el=$("#fSync");if(el){el.style.color="#ff8b8b";el.textContent="Couldn't sync — saved on this device. "+(e.message||"");}} }
  },900);
}
async function saveLineupAs(){
  const raw=prompt('Name this lineup (e.g. "vs LHP", "Sunday"):'); if(raw==null)return;
  const name=raw.trim(); if(!name)return;
  try{ await teamsCall("saveNamedLineup",{teamId:FIELD.tid,name,data:flCloudPayload(FIELD.fl,FIELD.players)});
    renderSyncStatus(`Saved "${name}" — load it any time from 📂 Saved.`);
  }catch(e){ alert(e.message||"Couldn't save that lineup."); }
}
async function openSavedLineups(){
  let rows=[]; try{ rows=await teamsCall("listSavedLineups",{teamId:FIELD.tid})||[]; }catch(e){ alert(e.message);return; }
  const ov=document.createElement("div");ov.className="pick";
  ov.innerHTML=`<div class="pick-box"><div class="row" style="margin-bottom:12px"><h3 style="flex:1;margin:0;color:var(--lime);font-family:var(--mono);font-size:11px;letter-spacing:1.4px;text-transform:uppercase">Saved lineups</h3><button class="x" id="slX">✕</button></div><div id="slList"></div></div>`;
  document.body.appendChild(ov);
  const close=()=>ov.remove();
  ov.addEventListener("click",e=>{if(e.target===ov)close();});
  ov.querySelector("#slX").onclick=close;
  const L=ov.querySelector("#slList");
  if(!rows.length){L.innerHTML=`<div class="empty">No saved lineups yet — build a board, then tap 💾 Save as….</div>`;return;}
  rows.forEach(r=>{
    const set=Object.keys((r.data&&r.data.positions)||{}).length;
    const row=document.createElement("div");row.className="pick-item";row.style.cursor="default";
    row.innerHTML=`<div style="flex:1;min-width:0"><div style="font-weight:800;font-size:14px">${esc(r.name)}</div><div class="muted" style="font-size:11px">${set}/9 positions · updated ${esc(relDays(r.updated_at)||"today")}</div></div>`;
    const acts=document.createElement("div");acts.className="row";acts.style.gap="6px";
    const load=document.createElement("button");load.className="mini";load.textContent="Load";
    load.onclick=()=>{FIELD.fl=normFL(r.data);persistField();close();renderSyncStatus(`Loaded "${r.name}" onto the working board.`);};
    const del=document.createElement("button");del.className="xmini";del.style.color="#ff8b8b";del.textContent="✕";
    del.onclick=async()=>{if(!confirm(`Delete saved lineup "${r.name}"?`))return;try{await teamsCall("deleteSavedLineup",{teamId:FIELD.tid,lineupId:r.id});row.remove();}catch(ex){alert(ex.message);}};
    acts.appendChild(load);acts.appendChild(del);row.appendChild(acts);
    L.appendChild(row);});
}
function paintField(){
  const {players,snapOf,fl}=FIELD; const byId=uid=>players.find(m=>m.user_id===uid);
  const dia=$("#fDiamond"); if(dia){ dia.innerHTML=`<div class="infield"></div><div class="mound"></div><div class="plate"></div>`;
    SLOTS.forEach(sl=>{const uid=fl.positions[sl.id],m=uid?byId(uid):null,s=m?snapOf(uid):null,r=s?s.readiness:null;
      const b=document.createElement("button");b.className="slot"+(m?"":" empty");b.style.left=sl.x+"%";b.style.top=sl.y+"%";
      b.innerHTML=`<div class="sring" style="color:${m?rColor(r):""}">${m?(r==null?"—":r):"＋"}</div><div class="spos">${sl.id}</div>${m?`<div class="snm">${esc(lastName(nm(m)))}</div>`:""}`;
      b.onclick=()=>pickForSlot(sl); dia.appendChild(b);}); }
  const placed=new Set(Object.values(fl.positions));
  const bench=$("#fBench"); if(bench){const bp=players.filter(m=>!placed.has(m.user_id));
    bench.innerHTML=bp.length?"":`<div class="empty">Everyone is on the field.</div>`;
    bp.forEach(m=>{const s=snapOf(m.user_id);const c=document.createElement("button");c.className="bchip";c.innerHTML=`<span class="bdot" style="background:${rColor(s?.readiness)}"></span>${esc(nm(m))}`;c.onclick=()=>pickSlotForPlayer(m);bench.appendChild(c);}); }
  const pen=$("#fPen"); if(pen){ pen.innerHTML="";
    ZONES.forEach(z=>{const arms=players.filter(m=>fl.bullpen[m.user_id]===z.id);
      const card=document.createElement("div");card.className="penzone";
      card.innerHTML=`<h4>${z.ic} ${z.title}<span style="flex:1"></span><span class="mini" data-z="${z.id}">＋</span></h4>`;
      arms.forEach(m=>{const s=snapOf(m.user_id),p=(s&&s.pitches_7d)||0;const row=document.createElement("div");row.className="arm";
        row.innerHTML=`<span class="bdot" style="background:${rColor(s?.readiness)}"></span><div style="flex:1;min-width:0;font-weight:700">${esc(nm(m))}</div><span class="mono" style="font-size:10.5px;color:${wlColor(p)}">${p} P/7d</span><button class="xmini">✕</button>`;
        row.querySelector(".xmini").onclick=()=>{delete fl.bullpen[m.user_id];persistField();};card.appendChild(row);});
      if(!arms.length)card.insertAdjacentHTML("beforeend",`<div class="muted" style="font-size:11px">—</div>`);
      card.querySelector(`.mini[data-z="${z.id}"]`).onclick=()=>fieldPicker("Add to "+z.title,candList(players.filter(m=>fl.bullpen[m.user_id]!==z.id)),uid=>{fl.bullpen[uid]=z.id;persistField();});
      pen.appendChild(card);}); }
  const bat=$("#fBat"); if(bat){ bat.innerHTML=fl.order.length?"":`<div class="empty">No batting order yet — tap Add.</div>`;
    fl.order.forEach((uid,i)=>{const m=byId(uid);if(!m)return;const s=snapOf(uid);
      const row=document.createElement("div");row.className="batrow";
      row.innerHTML=`<span class="batnum">${i+1}</span><span class="bdot" style="background:${rColor(s?.readiness)}"></span><div style="flex:1;min-width:0;font-weight:700">${esc(nm(m))}</div><span class="chip">${esc(posOf(uid)||"—")}</span>`;
      const up=document.createElement("button");up.className="xmini";up.textContent="↑";up.onclick=()=>{if(i>0){const o=fl.order;[o[i-1],o[i]]=[o[i],o[i-1]];persistField();}};
      const dn=document.createElement("button");dn.className="xmini";dn.textContent="↓";dn.onclick=()=>{const o=fl.order;if(i<o.length-1){[o[i+1],o[i]]=[o[i],o[i+1]];persistField();}};
      const rm=document.createElement("button");rm.className="xmini";rm.textContent="✕";rm.onclick=()=>{fl.order.splice(i,1);persistField();};
      const acts=document.createElement("div");acts.className="row";acts.style.gap="4px";acts.appendChild(up);acts.appendChild(dn);acts.appendChild(rm);row.appendChild(acts);
      bat.appendChild(row);}); }
}
function pickForSlot(sl){const placed=FIELD.fl.positions;const cur=placed[sl.id];
  fieldPicker(sl.name,candList(FIELD.players.filter(m=>placed[sl.id]!==m.user_id)),uid=>{Object.keys(placed).forEach(k=>{if(placed[k]===uid)delete placed[k];});placed[sl.id]=uid;persistField();},cur?{label:"Clear "+sl.id,onPick:()=>{delete placed[sl.id];persistField();}}:null);}
function pickSlotForPlayer(m){const fl=FIELD.fl;const open=SLOTS.filter(sl=>!fl.positions[sl.id]);const use=open.length?open:SLOTS;
  const list=use.map(sl=>{const occ=fl.positions[sl.id];const om=occ?FIELD.players.find(x=>x.user_id===occ):null;return {uid:sl.id,name:sl.name+" ("+sl.id+")",r:null,color:"var(--lime)",sub:om?("now: "+nm(om)):"open"};});
  fieldPicker("Place "+nm(m)+" at…",list,posId=>{Object.keys(fl.positions).forEach(k=>{if(fl.positions[k]===m.user_id)delete fl.positions[k];});fl.positions[posId]=m.user_id;persistField();});}
async function postLineup(){const b=$("#fPost"),fl=FIELD.fl,players=FIELD.players,snapOf=FIELD.snapOf;
  const nameOf=uid=>{const m=players.find(x=>x.user_id===uid);return m?nm(m):"";};
  const positions=POS_ORDER.map(pid=>({pos:pid,posName:(SLOTS.find(s=>s.id===pid)||{}).name||pid,name:nameOf(fl.positions[pid])||""}));
  const batting=fl.order.map((uid,i)=>({order:i+1,name:nameOf(uid),pos:posOf(uid)})).filter(x=>x.name);
  const arms=z=>players.filter(m=>fl.bullpen[m.user_id]===z).map(m=>({name:nm(m),pitches7d:(snapOf(m.user_id)?.pitches_7d)||0}));
  const data={positions,batting,starters:arms("S"),relievers:arms("R"),dayOff:arms("O")};
  b.disabled=true;b.textContent="Posting…"; const e=$("#fPostStatus");e.textContent="";
  try{ await teamsCall("setLineup",{teamId:FIELD.tid,data,label:""}); FIELD.posted={data,posted_at:new Date().toISOString()}; renderPostedStatus(); b.textContent="✓ Posted to players"; setTimeout(()=>{b.textContent="📋 Post to players";b.disabled=false;},1700); }
  catch(ex){ b.disabled=false;b.textContent="📋 Post to players"; e.style.color="#ff8b8b"; e.textContent=mgErr(ex); }
}
function renderPostedStatus(){const e=$("#fPostStatus");if(!e)return;const p=FIELD.posted;
  if(p&&p.posted_at){e.style.color="var(--mutedHi)";const set=(p.data&&p.data.positions||[]).filter(s=>s.name).length;e.textContent=`Players see this lineup · posted ${fmtDate(p.posted_at)} · ${set}/9 positions set`;}
  else{e.style.color="var(--muted)";e.textContent=FIELD.owner?"Not posted yet — build the lineup, then Post to players.":"You can build a lineup here; only the team owner can post it to players.";}
}

/* ---------- Phase 4: white-label branding (name/color/logo) ---------- */
function shade(hex,pct){let h=(hex||"").replace("#","");if(h.length>=6)h=h.slice(0,6);else return hex||"#C7FF3D";const n=parseInt(h,16);if(isNaN(n))return "#C7FF3D";let r=(n>>16)&255,g=(n>>8)&255,b=n&255;const f=v=>Math.max(0,Math.min(255,Math.round(v+(pct/100)*255)));return "#"+((1<<24)+(f(r)<<16)+(f(g)<<8)+f(b)).toString(16).slice(1);}
function clampAccent(hex){let h=(hex||"").replace("#","");if(h.length<6)return "#C7FF3D";h=h.slice(0,6);const n=parseInt(h,16);if(isNaN(n))return "#C7FF3D";let r=(n>>16)&255,g=(n>>8)&255,b=n&255;const lum=(0.2126*r+0.7152*g+0.0722*b)/255;if(lum<0.45){const k=0.55-lum;r=Math.round(r+(255-r)*k);g=Math.round(g+(255-g)*k);b=Math.round(b+(255-b)*k);}return "#"+((1<<24)+(r<<16)+(g<<8)+b).toString(16).slice(1);}
function applyBrand(t){const root=document.documentElement.style;const a=clampAccent((t&&t.brand_hex)||"#C7FF3D");root.setProperty("--lime",a);root.setProperty("--limeGrad",`linear-gradient(135deg,${shade(a,16)},${a},${shade(a,-14)})`);}
function fileToPngB64(file,max){return new Promise((res,rej)=>{const img=new Image();const url=URL.createObjectURL(file);img.onload=()=>{URL.revokeObjectURL(url);const sc=Math.min(1,max/Math.max(img.width,img.height||1));const w=Math.max(1,Math.round(img.width*sc)),h=Math.max(1,Math.round(img.height*sc));const c=document.createElement("canvas");c.width=w;c.height=h;c.getContext("2d").drawImage(img,0,0,w,h);res(c.toDataURL("image/png").split(",")[1]);};img.onerror=()=>{URL.revokeObjectURL(url);rej(new Error("Couldn't read that image."));};img.src=url;});}
function brandingSectionHTML(t,owner){
  if(!owner) return `<div class="sec"><h3>Branding</h3><div class="muted" style="font-size:12.5px">Only the team owner sets the white-label name, color, and logo.</div></div>`;
  const hx=(t.brand_hex||"#C7FF3D").slice(0,7);
  return `<div class="sec"><h3>Branding (white-label)</h3>
    <div class="muted" style="font-size:11.5px;margin-bottom:12px">Players on this team see your org name, accent color, and logo across the app and this dashboard.</div>
    <div class="row" style="gap:14px;align-items:flex-start;flex-wrap:wrap">
      <div style="flex:1;min-width:190px">
        <div class="field"><label>Org name (shown to players)</label><input id="bName" value="${esc(t.brand_name||"")}" placeholder="PlayersLab"/></div>
        <div class="field"><label>Accent color</label><div class="row" style="gap:10px"><input id="bHex" type="color" value="${esc(hx)}" style="width:54px;height:40px;padding:2px;background:var(--sunken);border:1px solid var(--line);border-radius:11px"/><span class="mono muted" id="bHexLbl" style="font-size:12px">${esc(hx)}</span></div></div>
        <button class="btn btn-primary" id="bSave" style="padding:11px 16px;align-self:flex-start">Save branding</button>
      </div>
      <div style="text-align:center">
        <div style="font-family:var(--mono);font-size:9px;letter-spacing:.7px;color:var(--muted);text-transform:uppercase;margin-bottom:6px">Logo</div>
        <div style="width:84px;height:84px;border-radius:18px;border:1px solid var(--line);overflow:hidden;background:rgba(199,255,61,.10);display:flex;align-items:center;justify-content:center">${t.brand_logo_url?`<img src="${esc(t.brand_logo_url)}" style="width:100%;height:100%;object-fit:cover">`:`<span class="muted" style="font-size:10px">none</span>`}</div>
        <input id="bLogoInput" type="file" accept="image/*" class="hidden"/>
        <button class="ghost" id="bLogoBtn" style="margin-top:8px;font-size:12px">Upload</button>
        ${t.brand_logo_url?`<button class="ghost" id="bLogoClear" style="margin-top:6px;font-size:12px;color:#ff8b8b">Remove</button>`:""}
      </div>
    </div>
    <div id="bErr" class="err"></div></div>`;
}
function wireBranding(t){
  const hex=$("#bHex"),lbl=$("#bHexLbl"); if(hex)hex.oninput=()=>{lbl.textContent=hex.value;applyBrand({brand_hex:hex.value});};
  const save=$("#bSave"); if(save)save.onclick=async()=>{const e=$("#bErr");e.textContent="";save.disabled=true;save.textContent="Saving…";
    try{ await teamsCall("setTeamBrand",{id:t.id,name:($("#bName").value||"").trim(),hex:$("#bHex").value}); delete CACHE[t.id]; await reloadTeams(t.id); await render(); }
    catch(ex){e.textContent=mgErr(ex);save.disabled=false;save.textContent="Save branding";} };
  const lb=$("#bLogoBtn"),li=$("#bLogoInput");
  if(lb&&li){ lb.onclick=()=>li.click(); li.onchange=async()=>{ if(!li.files[0])return; const e=$("#bErr");e.style.color="var(--muted)";e.textContent="Uploading logo…";
    try{ const b64=await fileToPngB64(li.files[0],512); await teamsCall("setTeamLogo",{id:t.id,logoBase64:b64}); delete CACHE[t.id]; await reloadTeams(t.id); await render(); }
    catch(ex){e.style.color="#ff8b8b";e.textContent=mgErr(ex);} }; }
  const lc=$("#bLogoClear"); if(lc)lc.onclick=async()=>{ if(!confirm("Remove the team logo?"))return; const e=$("#bErr");e.textContent="";
    try{ await teamsCall("setTeamLogo",{id:t.id,logoBase64:""}); delete CACHE[t.id]; await reloadTeams(t.id); await render(); }catch(ex){e.textContent=mgErr(ex);} };
}

/* ---------- PostgREST + Phase 3: program templates, groups/cohorts, bulk assign ---------- */
let ASG={};
async function rest(method,path,body){
  const headers={apikey:ANON,Authorization:`Bearer ${TOKEN}`,"Content-Type":"application/json"};
  if(method==="POST"||method==="PATCH")headers.Prefer="return=representation";
  const r=await fetch(`${SUPABASE_URL}/rest/v1/${path}`,{method,headers,body:body?JSON.stringify(body):undefined});
  if(r.status===401){ if(await refreshToken())return rest(method,path,body); signOut(); throw new Error("Session expired — sign in again."); }
  const txt=await r.text(); let j=null; try{j=txt?JSON.parse(txt):null;}catch(e){}
  if(!r.ok)throw new Error((j&&(j.message||j.hint||j.error))||`Request failed (${r.status})`);
  return j;
}
const listTemplates=()=>rest("GET","team_program_templates?select=*&order=created_at.desc");
const listGroups=tid=>rest("GET",`team_groups?team_id=eq.${tid}&select=*&order=created_at.desc`);
async function groupMemberMap(groups){ if(!groups.length)return {}; const ids=groups.map(g=>g.id).join(",");
  const rows=await rest("GET",`team_group_members?group_id=in.(${ids})&select=group_id,user_id`)||[];
  const map={}; rows.forEach(r=>{(map[r.group_id]=map[r.group_id]||[]).push(r.user_id);}); return map; }
async function bulkAssign(tid,uids,p){ let ok=0,fail=0;
  for(const uid of uids){ try{ await teamsCall("createAssignment",{teamId:tid,kind:p.kind,title:p.title,notes:p.notes,dueDate:p.dueDate,assigneeUserId:uid}); ok++; }catch(e){ fail++; } }
  return {ok,fail}; }
async function manageGroup(g){
  const d=ASG.d; const mem=new Set(ASG.gmap[g.id]||[]);
  const ov=document.createElement("div");ov.className="pick";
  ov.innerHTML=`<div class="pick-box"><div class="row" style="margin-bottom:12px"><h3 style="flex:1;margin:0;color:var(--lime);font-family:var(--mono);font-size:11px;letter-spacing:1.4px;text-transform:uppercase">${esc(g.name)} · members</h3><button class="x" id="gmX">✕</button></div><div class="muted" style="font-size:11px;margin-bottom:10px">Tap to add or remove athletes from this group.</div><div id="gmList"></div></div>`;
  document.body.appendChild(ov); const close=()=>{ov.remove();render();};
  ov.addEventListener("click",e=>{if(e.target===ov)close();}); ov.querySelector("#gmX").onclick=close;
  const paint=()=>{const L=ov.querySelector("#gmList");L.innerHTML="";
    if(!d.players.length)L.innerHTML=`<div class="empty">No athletes on this team yet.</div>`;
    d.players.forEach(m=>{const inG=mem.has(m.user_id);const b=document.createElement("button");b.className="pick-item";
      b.innerHTML=`<div class="xmini" style="${inG?'color:var(--lime);border-color:rgba(199,255,61,.45)':''}">${inG?"✓":"＋"}</div><div style="flex:1;min-width:0;font-weight:700">${esc(nm(m))}</div>`;
      b.onclick=async()=>{try{ if(inG){await rest("DELETE",`team_group_members?group_id=eq.${g.id}&user_id=eq.${m.user_id}`);mem.delete(m.user_id);}else{await rest("POST","team_group_members",{group_id:g.id,user_id:m.user_id});mem.add(m.user_id);} ASG.gmap[g.id]=[...mem]; paint(); }catch(ex){alert(ex.message);} };
      L.appendChild(b);}); };
  paint();
}

/* ---------- Day-by-day programs: builder, viewer, assign (teams-api
   createProgram / listPrograms / deleteProgram / assignProgram — owner-gated
   server-side; assignProgram takes a targetUserIds batch). ---------- */
let PB=null;
function pgBlankEx(){return {move:"",sets:"",reps:"",weight:"",rpe:""};}
function pgBlankDay(kind){return {kind:kind||"throwing",title:"",notes:"",throwing:{intensity:"",throws:"",distanceFt:"",bullpenPitches:"",notes:""},lift:{exercises:[pgBlankEx()],notes:""}};}
function pgOverlay(title,wide){
  const ov=document.createElement("div");ov.className="pick";
  ov.innerHTML=`<div class="pick-box${wide?" wide":""}"><div class="row" style="margin-bottom:12px"><h3 style="flex:1;margin:0;color:var(--lime);font-family:var(--mono);font-size:11px;letter-spacing:1.4px;text-transform:uppercase">${esc(title)}</h3><button class="x pgX">✕</button></div><div class="pgBody"></div></div>`;
  document.body.appendChild(ov);
  const close=()=>ov.remove();
  ov.addEventListener("click",e=>{if(e.target===ov)close();});
  ov.querySelector(".pgX").onclick=close;
  return {ov,body:ov.querySelector(".pgBody"),close};
}
/// Parse a pasted/uploaded program into builder days. Accepts CSV or plain
/// lines; one row per day. Recognised columns (header optional, case-insensitive):
/// day, kind, title, intensity, throws, distance, bullpen, notes.
/// Falls back to "one line = one throwing day titled by the line".
function parseProgramText(text){
  const lines=String(text||"").split(/\r?\n/).map(l=>l.trim()).filter(Boolean);
  if(!lines.length)return [];
  const splitRow=l=>{const out=[];let cur="",q=false;
    for(const ch of l){ if(ch==='"'){q=!q;continue;} if(ch===","&&!q){out.push(cur);cur="";continue;} cur+=ch; }
    out.push(cur); return out.map(x=>x.trim());};
  let header=null, start=0;
  const first=splitRow(lines[0]).map(x=>x.toLowerCase());
  if(first.some(h=>["day","kind","title","intensity","throws","notes"].includes(h))){header=first;start=1;}
  const col=(cells,name)=>{ if(!header)return null; const i=header.indexOf(name); return i>=0?(cells[i]||"").trim():null; };
  const days=[];
  for(let i=start;i<lines.length;i++){
    const cells=splitRow(lines[i]);
    if(!cells.length||!cells.join("").trim())continue;
    let kind=(col(cells,"kind")||"").toLowerCase();
    const title=(col(cells,"title")||(header?cells[0]:lines[i])||"").trim();
    const blob=lines[i].toLowerCase();
    if(!["throwing","lift","rest"].includes(kind)){
      kind=/\brest\b|\boff\b/.test(blob)?"rest":(/\blift|squat|bench|deadlift|press|gym\b/.test(blob)?"lift":"throwing");
    }
    const d=pgBlankDay(kind);
    d.title=title.slice(0,80);
    d.notes=(col(cells,"notes")||"").slice(0,300);
    if(kind==="throwing"){
      d.throwing.intensity=(col(cells,"intensity")||"").slice(0,40);
      const n=v=>{const x=parseInt(v||"",10);return isNaN(x)?null:x;};
      d.throwing.throws=n(col(cells,"throws"));
      d.throwing.distanceFt=n(col(cells,"distance"));
      d.throwing.bullpenPitches=n(col(cells,"bullpen"));
    }
    days.push(d);
    if(days.length>=60)break;
  }
  return days;
}

function openProgramImport(team){
  const {body,close}=pgOverlay("Import a program",true);
  body.innerHTML=`<div class="muted" style="font-size:12.5px;margin-bottom:9px">Paste your program or upload a CSV / text file — one line per day. Recognised columns: day, kind, title, intensity, throws, distance, bullpen, notes. Everything lands in the builder so you can review it before saving.</div>
    <input type="file" id="piFile" accept=".csv,.txt,text/csv,text/plain" style="font-size:12px;margin-bottom:8px"/>
    <textarea id="piText" rows="9" placeholder="Day 1, throwing, Long toss, 70%, 40 throws&#10;Day 2, rest, Off day&#10;Day 3, lift, Lower body" style="width:100%;box-sizing:border-box;background:var(--sunken);color:var(--bone);border:1px solid var(--line);border-radius:12px;padding:10px;font:inherit;font-size:13px"></textarea>
    <div class="row" style="gap:8px;margin-top:8px"><span class="muted" id="piCount" style="flex:1;font-size:12px"></span><button class="mini" id="piGo" style="padding:9px 18px">Review in builder</button></div>
    <div class="err" id="piErr" style="min-height:14px"></div>
    <div class="muted" style="font-size:11px;margin-top:6px">📱 Scanning a PDF or screenshot runs on-device with Apple Vision — do those imports in the app; they'll appear here once saved.</div>`;
  const ta=body.querySelector("#piText"), cnt=body.querySelector("#piCount");
  const recount=()=>{const n=parseProgramText(ta.value).length;cnt.textContent=n?`${n} day${n===1?"":"s"} detected`:"";};
  ta.addEventListener("input",recount);
  body.querySelector("#piFile").onchange=e=>{const f=e.target.files[0];if(!f)return;
    const r=new FileReader();r.onload=()=>{ta.value=String(r.result||"");recount();};r.readAsText(f);};
  body.querySelector("#piGo").onclick=()=>{
    const err=body.querySelector("#piErr");err.textContent="";
    const days=parseProgramText(ta.value);
    if(!days.length){err.textContent="Couldn't find any days — check the format.";return;}
    close();
    openProgramBuilder(team,days);
  };
}

function openProgramBuilder(team,seedDays){
  PB={team,days:(seedDays&&seedDays.length)?seedDays:[pgBlankDay("throwing")]};
  const {body,close}=pgOverlay("New day-by-day program",true);
  body.innerHTML=`<div class="pgrow"><input class="pgin" id="pbName" placeholder="Program name (e.g. 2-week velo build)" style="flex:2;min-width:170px"/><select class="pgin" id="pbType" style="flex:0 0 120px"><option value="mixed">Mixed</option><option value="throwing">Throwing</option><option value="lifting">Lifting</option></select></div>
    <div id="pbDays"></div>
    <div class="row" style="gap:8px;margin-top:2px"><button class="ghost" id="pbAdd" style="font-size:12px">＋ Add day</button><span style="flex:1"></span><button class="mini" id="pbSave" style="padding:9px 18px">Save program</button></div>
    <div class="err" id="pbErr" style="min-height:14px"></div>`;
  body.querySelector("#pbAdd").onclick=()=>{PB.days.push(pgBlankDay(PB.days[PB.days.length-1]?.kind||"throwing"));paintPBDays(body);};
  body.querySelector("#pbSave").onclick=async()=>{
    const err=body.querySelector("#pbErr");err.textContent="";
    const name=(body.querySelector("#pbName").value||"").trim();
    if(!name){err.textContent="Give the program a name.";return;}
    if(!PB.days.length){err.textContent="Add at least one day.";return;}
    const days=PB.days.map((d,i)=>{
      const out={offset:i,kind:d.kind,title:(d.title||"").trim(),notes:(d.notes||"").trim()};
      if(d.kind==="throwing")out.throwing={intensity:(d.throwing.intensity||"").trim(),throws:d.throwing.throws||null,distanceFt:d.throwing.distanceFt||null,bullpenPitches:d.throwing.bullpenPitches||null,notes:(d.throwing.notes||"").trim()};
      if(d.kind==="lift")out.lift={exercises:d.lift.exercises.filter(e=>(e.move||"").trim()).map(e=>({move:e.move.trim(),sets:e.sets||null,reps:e.reps||"",weight:e.weight||"",rpe:e.rpe||null})),notes:(d.lift.notes||"").trim()};
      return out;
    });
    const btn=body.querySelector("#pbSave");btn.disabled=true;btn.textContent="Saving…";
    try{
      await teamsCall("createProgram",{teamId:PB.team.id,name,programType:body.querySelector("#pbType").value,structure:{type:body.querySelector("#pbType").value,days}});
      close(); if(TAB==="plan")await render();
    }catch(e){err.textContent=e.message;btn.disabled=false;btn.textContent="Save program";}
  };
  paintPBDays(body);
}
function paintPBDays(body){
  const box=body.querySelector("#pbDays");box.innerHTML="";
  PB.days.forEach((d,i)=>{
    const card=document.createElement("div");card.className="pgday";
    let inner=`<h5>Day ${i+1}<select class="pgin pbKind" style="padding:4px 7px;font-size:11px">${["throwing","lift","rest"].map(k=>`<option value="${k}"${d.kind===k?" selected":""}>${k[0].toUpperCase()+k.slice(1)}</option>`).join("")}</select><span style="flex:1"></span><button class="xmini pbDel" style="color:#ff8b8b">✕</button></h5>`;
    inner+=`<div class="pgrow"><input class="pgin pbTitle" placeholder="Day title (e.g. Bullpen day)" value="${esc(d.title)}"/></div>`;
    if(d.kind==="throwing"){
      inner+=`<div class="pgrow"><input class="pgin tInt" placeholder="Intensity (e.g. 80%)" value="${esc(d.throwing.intensity)}"/><input class="pgin tThrows" type="number" placeholder="Throws" value="${esc(d.throwing.throws)}" style="flex:0 0 86px"/><input class="pgin tDist" type="number" placeholder="Dist (ft)" value="${esc(d.throwing.distanceFt)}" style="flex:0 0 86px"/><input class="pgin tPen" type="number" placeholder="Bullpen #" value="${esc(d.throwing.bullpenPitches)}" style="flex:0 0 92px"/></div>
        <div class="pgrow"><input class="pgin tNotes" placeholder="Throwing notes (optional)" value="${esc(d.throwing.notes)}"/></div>`;
    }else if(d.kind==="lift"){
      inner+=`<div class="pbExs">`+d.lift.exercises.map((e,j)=>`<div class="pgrow" data-ex="${j}"><input class="pgin exMove" placeholder="Exercise" value="${esc(e.move)}" style="flex:2;min-width:110px"/><input class="pgin exSets" type="number" placeholder="Sets" value="${esc(e.sets)}" style="flex:0 0 62px"/><input class="pgin exReps" placeholder="Reps" value="${esc(e.reps)}" style="flex:0 0 66px"/><input class="pgin exWt" placeholder="Load" value="${esc(e.weight)}" style="flex:0 0 72px"/><input class="pgin exRpe" type="number" placeholder="RPE" value="${esc(e.rpe)}" style="flex:0 0 58px"/><button class="xmini exDel" style="color:#ff8b8b">✕</button></div>`).join("")+`</div>
        <div class="pgrow"><button class="ghost pbAddEx" style="font-size:11.5px">＋ Exercise</button><input class="pgin lNotes" placeholder="Lift notes (optional)" value="${esc(d.lift.notes)}"/></div>`;
    }else{
      inner+=`<div class="pgrow"><input class="pgin rNotes" placeholder="Rest-day note (optional, e.g. mobility only)" value="${esc(d.notes)}"/></div>`;
    }
    card.innerHTML=inner;
    const bind=(sel,fn)=>{const el=card.querySelector(sel);if(el)el.oninput=()=>fn(el.value);};
    bind(".pbTitle",v=>d.title=v);
    bind(".tInt",v=>d.throwing.intensity=v);bind(".tThrows",v=>d.throwing.throws=v);bind(".tDist",v=>d.throwing.distanceFt=v);bind(".tPen",v=>d.throwing.bullpenPitches=v);bind(".tNotes",v=>d.throwing.notes=v);
    bind(".lNotes",v=>d.lift.notes=v);bind(".rNotes",v=>d.notes=v);
    card.querySelectorAll("[data-ex]").forEach(rowEl=>{
      const j=+rowEl.dataset.ex,e=d.lift.exercises[j];
      const bx=(sel,fn)=>{const el=rowEl.querySelector(sel);if(el)el.oninput=()=>fn(el.value);};
      bx(".exMove",v=>e.move=v);bx(".exSets",v=>e.sets=v);bx(".exReps",v=>e.reps=v);bx(".exWt",v=>e.weight=v);bx(".exRpe",v=>e.rpe=v);
      rowEl.querySelector(".exDel").onclick=()=>{d.lift.exercises.splice(j,1);if(!d.lift.exercises.length)d.lift.exercises.push(pgBlankEx());paintPBDays(body);};
    });
    const addEx=card.querySelector(".pbAddEx");if(addEx)addEx.onclick=()=>{d.lift.exercises.push(pgBlankEx());paintPBDays(body);};
    card.querySelector(".pbKind").onchange=ev=>{d.kind=ev.target.value;paintPBDays(body);};
    card.querySelector(".pbDel").onclick=()=>{PB.days.splice(i,1);if(!PB.days.length)PB.days.push(pgBlankDay("throwing"));paintPBDays(body);};
    box.appendChild(card);
  });
}
function pgDaySummary(d){
  const kind=(d.kind||"throwing").toLowerCase();
  if(kind==="rest")return d.notes||"Rest day";
  if(kind==="lift"){const ex=((d.lift||{}).exercises)||[];return ex.map(e=>{const bits=[e.sets&&e.reps?`${e.sets}x${e.reps}`:(e.sets?`${e.sets} sets`:e.reps||""),e.weight||"",e.rpe?`RPE ${e.rpe}`:""].filter(Boolean).join(" · ");return bits?`${e.move} — ${bits}`:e.move;}).filter(Boolean).join("\n")||(d.lift&&d.lift.notes)||"Lift";}
  const t=d.throwing||{};return [t.intensity,t.throws?`${t.throws} throws`:null,t.distanceFt?`${t.distanceFt} ft`:null,t.bullpenPitches?`${t.bullpenPitches} bullpen`:null,t.notes].filter(Boolean).join(" · ")||"Throwing";
}
function viewProgram(pr){
  const {body}=pgOverlay(pr.name,true);
  const days=((pr.structure&&pr.structure.days)||[]);
  body.innerHTML=days.length?days.map((d,i)=>`<div class="pgday"><h5>Day ${i+1} · ${esc((d.kind||"throwing").toUpperCase())}</h5><div style="font-weight:800;font-size:13.5px">${esc(d.title||"")}</div><div class="muted" style="font-size:12px;white-space:pre-line;margin-top:3px">${esc(pgDaySummary(d))}</div></div>`).join(""):`<div class="empty">This program has no days.</div>`;
}
async function openAssignProgram(team,opts){
  opts=opts||{};
  if(!isOwner(team)){alert("Only the team owner can assign programs.");return;}
  let programs=(ASG&&ASG.programs&&ASG.d&&ASG.d.team.id===team.id)?ASG.programs:[];
  if(!programs.length){ try{programs=await teamsCall("listPrograms",{teamId:team.id})||[];}catch(e){alert(e.message);return;} }
  if(!programs.length){alert("No programs yet — open the Assign tab and tap ＋ New program first.");return;}
  let players=[];
  if(!opts.userIds){ try{const dd=CACHE[team.id]||await teamData();players=dd.players||[];}catch(e){players=[];} }
  const {body,close}=pgOverlay("Assign a program");
  const today=isoDay(new Date());
  body.innerHTML=`<div class="field"><label>Program</label><select id="apProg">${programs.map(p=>`<option value="${esc(p.id)}"${opts.programId===p.id?" selected":""}>${esc(p.name)} (${p.day_count||((p.structure&&p.structure.days)||[]).length}d)</option>`).join("")}</select></div>
    <div class="field"><label>Start date (day 1)</label><input id="apDate" type="date" value="${today}"/></div>
    ${opts.userIds?`<div class="muted" style="font-size:12.5px;margin-bottom:10px">Assigning to <b style="color:var(--bone)">${esc(opts.label||"this player")}</b>.</div>`
      :`<div class="field"><label>Players</label><label class="muted" style="font-size:12px;display:flex;align-items:center;gap:7px;margin-bottom:6px"><input type="checkbox" id="apAll" checked/> Whole team (${players.length})</label><div id="apList" style="max-height:190px;overflow:auto"></div></div>`}
    <button class="btn btn-primary full" id="apGo" style="margin-top:4px">Assign program</button>
    <div class="err" id="apErr" style="min-height:14px"></div>`;
  let picked=new Set((opts.userIds)||players.map(m=>m.user_id));
  if(!opts.userIds){
    const list=body.querySelector("#apList"),all=body.querySelector("#apAll");
    const paint=()=>{list.innerHTML="";players.forEach(m=>{const on=picked.has(m.user_id);
      const b=document.createElement("button");b.className="pick-item";b.style.padding="8px 10px";
      b.innerHTML=`<div class="xmini" style="${on?'color:var(--lime);border-color:rgba(199,255,61,.45)':''}">${on?"✓":"＋"}</div><div style="flex:1;font-weight:700;font-size:13px">${esc(nm(m))}</div>`;
      b.onclick=()=>{if(picked.has(m.user_id))picked.delete(m.user_id);else picked.add(m.user_id);all.checked=picked.size===players.length;paint();};
      list.appendChild(b);});};
    all.onchange=()=>{picked=all.checked?new Set(players.map(m=>m.user_id)):new Set();paint();};
    paint();
  }
  body.querySelector("#apGo").onclick=async()=>{
    const err=body.querySelector("#apErr");err.textContent="";
    const ids=[...picked];
    if(!ids.length){err.textContent="Pick at least one player.";return;}
    const btn=body.querySelector("#apGo");btn.disabled=true;btn.textContent="Assigning…";
    try{
      const r=await teamsCall("assignProgram",{programId:body.querySelector("#apProg").value,teamId:team.id,targetUserIds:ids,startDate:body.querySelector("#apDate").value||today});
      err.style.color="var(--lime)";
      err.textContent=`Done — ${r.days??0} days × ${r.players??ids.length} player${(r.players??ids.length)===1?"":"s"} on the calendar.`;
      setTimeout(()=>{close();if($("#calSec")&&CURRENT_TEAM&&CURRENT_MEMBER)reloadPlayerCal();},1500);
    }catch(e){err.textContent=e.message;btn.disabled=false;btn.textContent="Assign program";}
  };
}

async function openPlayer(t,member){
  CURRENT_TEAM=t;CURRENT_MEMBER=member;
  $("#overlay").classList.remove("hidden");document.body.style.overflow="hidden";
  $("#pTitle").textContent=nm(member);$("#pTag").textContent=(t.name||"").toUpperCase();$("#pBody").innerHTML=`<div class="loading">Loading development folder…</div>`;
  let d; try{ d=await coachCall("developmentProfile",{teamId:t.id,playerId:member.user_id}); }
  catch(e){ $("#pBody").innerHTML=`<div class="sec"><span style="color:#ff8b8b">${esc(e.message)}</span></div>`; return; }
  if(d&&d.customExercises)CUSTOM_EX_BY_PLAYER[member.user_id]=d.customExercises;
  renderPlayer(d,t,member);
}
function closePlayer(){ $("#overlay").classList.add("hidden");document.body.style.overflow=""; }
const camelKey=s=>s.replace(/_([a-z0-9])/g,(m,c)=>c.toUpperCase());
function camelize(x){if(Array.isArray(x))return x.map(camelize);
  if(x&&typeof x==="object"){const o={};for(const k of Object.keys(x)){const v=camelize(x[k]);o[k]=v;const ck=camelKey(k);if(ck!==k)o[ck]=v;}return o;}
  return x;}
function relDays(iso){if(!iso)return"";const t=Date.parse(iso);if(isNaN(t))return"";const d=Math.floor((Date.now()-t)/86400000);return d<=0?"today":d===1?"1d ago":d+"d ago";}
function drvRows(prefix,b){return ((b&&b.results)||[]).slice(0,3).map(r=>{
  const eff=(r.effect>=0?"+":"")+Number(r.effect||0).toFixed(1)+" "+(r.unit||"");
  const col=r.effect>=0?"var(--lime)":"var(--amber)";
  const noise=r.clearsNoise?"":' <span class="muted" style="font-size:10px">within noise</span>';
  return `<tr><td class="muted" style="font-size:11px">${esc(prefix)}</td><td>${esc(r.label||"")}</td><td style="color:${col};font-weight:700;white-space:nowrap">${esc(eff)}</td><td style="white-space:nowrap">${r.exposed??"–"}/${r.control??"–"}</td><td class="muted" style="font-size:11px">${esc(r.reliability||"")}${noise}</td></tr>`;}).join("");}
function driversSectionHTML(d){const s=d.driverSummary,pl=s&&s.payload;if(!pl)return"";
  const hitName=pl.hitting&&pl.hitting.metricLabel?`EV (${pl.hitting.metricLabel})`:"EV";
  const rows=drvRows("FB",pl.pitching)+drvRows(hitName,pl.hitting)+drvRows("READY",pl.readiness);
  if(!rows)return"";
  const when=relDays(s.computedAt);
  return `<div class="sec"><h3>What&#39;s driving them</h3><div class="tblWrap"><table><tr><th></th><th>Condition</th><th>Effect</th><th>With/without</th><th>Read</th></tr>${rows}</table></div><div class="muted" style="font-size:11px;margin-top:6px">Computed on the athlete&#39;s device${when?" · updated "+when:""} · personal associations, not proof of cause.</div></div>`;}
function dayKey(iso){const d=new Date(iso);return isNaN(d)?null:`${d.getFullYear()}-${d.getMonth()}-${d.getDate()}`;}
function priorKey(iso){const d=new Date(iso);if(isNaN(d))return null;d.setDate(d.getDate()-1);return `${d.getFullYear()}-${d.getMonth()}-${d.getDate()}`;}
function latestPRIn(list,val){const asc=(list||[]).filter(x=>x.date&&val(x)>0).sort((a,b)=>Date.parse(a.date)-Date.parse(b.date));
  let best=0,seen=0,pr=null;for(const x of asc){const v=val(x);if(seen>=3&&v>best)pr={row:x,value:v,prev:best};if(v>best)best=v;seen++;}
  return pr;}
function prDaySectionHTML(d){
  const fb=latestPRIn(d.sessions,s=>s.topVelocity||s.avgVelocity||0);
  const evs=(d.kpis||[]).filter(k=>["maxExitVelo","avgExitVelo","batSpeed"].includes(k.metric));
  const ev=latestPRIn(evs,k=>k.value||0);
  let pick=null;
  if(fb)pick={...fb,kind:"Fastball velo"};
  if(ev&&(!pick||Date.parse(ev.row.date)>Date.parse(pick.row.date)))pick={...ev,kind:ev.row.metric==="batSpeed"?"Bat speed":"Exit velo"};
  if(!pick)return"";
  const dk=dayKey(pick.row.date),pk=priorKey(pick.row.date);
  const meals=(d.meals||[]).filter(m=>dayKey(m.date)===dk);
  const bf=meals.find(m=>(m.mealType||"").toLowerCase()==="breakfast")||meals[0];
  const wko=(d.workouts||[]).filter(w=>dayKey(w.date)===pk)[0];
  const log=(d.dailyLogs||[]).filter(l=>dayKey(l.date)===dk)[0];
  const plog=(d.dailyLogs||[]).filter(l=>dayKey(l.date)===pk)[0];
  const rows=[];
  const add=(k,v)=>{if(v)rows.push(`<tr><td class="muted" style="white-space:nowrap">${esc(k)}</td><td>${v}</td></tr>`);};
  add("Breakfast",bf?esc(bf.name||bf.mealType||"Logged")+(bf.calories?` <span class="muted" style="font-size:11px">${bf.calories} kcal · ${bf.proteinG??"–"}g protein</span>`:""):"");
  if(meals.length>1)add("Meals that day",esc(meals.map(m=>m.name).filter(Boolean).slice(0,4).join(", ")));
  add("Prior-day lift",wko?esc(wko.loadoutName||"Workout")+` <span class="muted" style="font-size:11px">${wko.setCount||0} sets${wko.durationMinutes?" · "+wko.durationMinutes+" min":""}</span>`:(plog&&(plog.didLowerLift||plog.didUpperLift)?"Logged in check-in":""));
  add("Sleep",log&&log.sleepHours!=null?Number(log.sleepHours).toFixed(1)+" h":"");
  add("Hydration",log&&log.hydrationLiters!=null?Number(log.hydrationLiters).toFixed(1)+" L":"");
  const pf=[];if(plog){if(plog.didMobility)pf.push("Mobility");if(plog.didLongToss)pf.push("Long toss");if(plog.didRecovery)pf.push("Recovery");}
  add("Prior-day work",pf.length?esc(pf.join(" · ")):"");
  const pl2=d.driverSummary&&d.driverSummary.payload,present=[];
  if(pl2){const all=[].concat((pl2.pitching&&pl2.pitching.results)||[],(pl2.hitting&&pl2.hitting.results)||[],(pl2.readiness&&pl2.readiness.results)||[]);
    for(const r of all){if(!r.clearsNoise||!(r.effect>0))continue;const id=r.id||"";let on=null;
      if(id.indexOf("breakfast")===0)on=!!bf;
      else if(id.indexOf("lift")===0||id==="prior-lift")on=!!wko||!!(plog&&(plog.didLowerLift||plog.didUpperLift));
      else if(id==="sleep-8-plus")on=!!(log&&log.sleepHours>=8);
      else if(id==="prior-day-mobility")on=!!(plog&&plog.didMobility);
      else if(id==="prior-day-long-toss")on=!!(plog&&plog.didLongToss);
      else if(id==="prior-recovery")on=!!(plog&&plog.didRecovery);
      if(on!=null)present.push(`<span class="pill ${on?"done":"req"}">${esc(r.label||id)} ${on?"✓":"—"}</span>`);}}
  const chips=present.length?`<div style="margin-top:8px">${present.join(" ")}</div>`:"";
  return `<div class="sec"><h3>The day behind the PR</h3><div style="font-size:15px;font-weight:700">${esc(pick.kind)} PR — ${pick.value.toFixed(1)} <span class="muted" style="font-size:12px">(prev best ${pick.prev.toFixed(1)}) · ${esc(fmtDate(pick.row.date))}</span></div>${rows.length?`<div class="tblWrap" style="margin-top:8px"><table>${rows.join("")}</table></div>`:`<div class="muted" style="font-size:12px;margin-top:6px">No day context logged yet — meals, lifts and check-ins appear here once the athlete&#39;s app syncs them.</div>`}${chips}<div class="muted" style="font-size:11px;margin-top:6px">What their logs looked like around the PR — association, not proof of cause.</div></div>`;}
/// A collapsed data section with a "See all" toggle — the web mirror of the
/// iOS Cockpit's per-section progressive disclosure. Renders nothing when the
/// athlete has no rows in that category, so sparse folders stay clean.
const HIST_OPEN=new Set();
function histSection(title,rows,fmt){
  if(!rows||!rows.length)return"";
  const id="hist-"+title.toLowerCase().replace(/[^a-z]/g,"");
  const open=HIST_OPEN.has(id), shown=open?rows.slice(0,200):rows.slice(0,5);
  const body=shown.map(r=>{const [date,head,meta]=fmt(r);
    return `<tr><td class="muted" style="white-space:nowrap">${esc(date||"")}</td><td>${esc(head||"")}</td><td class="muted">${esc(meta||"")}</td></tr>`;}).join("");
  const more=rows.length>5?`<button class="ghost hist-t" data-hist="${id}" style="margin-top:8px;font-size:12px">${open?"Show less":`See all ${rows.length}`}</button>`:"";
  return `<div class="sec"><h3>${esc(title)} (${rows.length})</h3><div class="tblWrap"><table>${body}</table></div>${more}</div>`;
}

/// Group a date-desc meal log into per-day blocks (newest day first) — each day
/// gets a dated sub-header with its calorie/macro totals, then its meals, so the
/// coach reads "what did today look like" instead of one flat calorie list.
function mealDayGroups(meals){
  const byDay={};
  for(const m of (meals||[])){
    const d=new Date(m.date||""); if(isNaN(d))continue;
    const k=d.toISOString().slice(0,10);
    (byDay[k]=byDay[k]||[]).push(m);
  }
  return Object.entries(byDay).sort((a,b)=>b[0]<a[0]?-1:1).map(([day,items])=>({day,items}));
}
function fmtDay(isoDay){ const d=new Date(isoDay+"T12:00:00Z"); return d.toLocaleDateString(undefined,{weekday:"short",month:"short",day:"numeric",timeZone:"UTC"}); }
function nutritionSection(meals){
  const days=mealDayGroups(dedupMeals(meals));
  if(!days.length)return"";
  const id="hist-nutrition", open=HIST_OPEN.has(id);
  const shown=open?days.slice(0,60):days.slice(0,5);
  const totalMeals=(meals||[]).length;
  const body=shown.map(g=>{
    const kcal=g.items.reduce((n,m)=>n+(m.calories||0),0);
    const p=g.items.reduce((n,m)=>n+(m.proteinG||0),0);
    const c=g.items.reduce((n,m)=>n+(m.carbsG||0),0);
    const f=g.items.reduce((n,m)=>n+(m.fatG||0),0);
    const rows=g.items.map(m=>`<tr><td class="muted" style="white-space:nowrap">${esc(m.mealType||"Meal")}</td><td>${esc(m.name||m.mealType||"Meal")}</td><td class="muted">${[m.calories?`${m.calories} kcal`:null,m.proteinG?`P${m.proteinG}`:null].filter(Boolean).join(" · ")}</td></tr>`).join("");
    return `<tr><td colspan="3" style="padding-top:10px"><strong style="font-size:12px">${esc(fmtDay(g.day))}</strong> <span class="muted" style="font-size:11px">— ${kcal?`${kcal} kcal`:""}${p?` · ${Math.round(p)}g protein`:""}${c?` · ${Math.round(c)}g carbs`:""}${f?` · ${Math.round(f)}g fat`:""}</span></td></tr>${rows}`;
  }).join("");
  const more=days.length>5?`<button class="ghost hist-t" data-hist="${id}" style="margin-top:8px;font-size:12px">${open?"Show less":`See all ${totalMeals} meals across ${days.length} days`}</button>`:"";
  return `<div class="sec"><h3>Nutrition (${totalMeals})</h3><div class="tblWrap"><table>${body}</table></div>${more}</div>`;
}

/// A workout row whose detail line lists the actual lifts — exercise, weight,
/// reps — instead of just "8 sets", so the coach sees WHAT was done at a glance.
function workoutSection(workouts){
  const rows=workouts||[];
  if(!rows.length)return"";
  const id="hist-workouts", open=HIST_OPEN.has(id);
  const shown=open?rows.slice(0,200):rows.slice(0,5);
  const body=shown.map(w=>{
    const sets=(w.sets||[]);
    // collapse to unique exercises in logged order, each with its best set
    const seen={}, order=[];
    for(const s of sets){
      const mv=s.move||"Lift";
      if(!seen[mv]){ seen[mv]={reps:s.reps||0,weight:s.weight||0,sets:0}; order.push(mv); }
      seen[mv].sets++;
      if((s.weight||0)>=seen[mv].weight){ seen[mv].weight=s.weight||0; seen[mv].reps=s.reps||0; }
    }
    const lifts=order.length
      ? order.map(mv=>{const e=seen[mv];return `${mv} ${e.weight?`${e.weight} lb`:""}${e.reps?` ×${e.reps}`:""}${e.sets>1?` (${e.sets} sets)`:""}`;}).join(" · ")
      : [w.setCount?`${w.setCount} sets`:null,w.durationMinutes?`${w.durationMinutes} min`:null].filter(Boolean).join(" · ");
    return `<tr><td class="muted" style="white-space:nowrap">${esc(fmtDate(w.date))}</td><td>${esc(w.loadoutName||"Workout")}</td><td class="muted">${esc(lifts)}</td></tr>`;
  }).join("");
  const more=rows.length>5?`<button class="ghost hist-t" data-hist="${id}" style="margin-top:8px;font-size:12px">${open?"Show less":`See all ${rows.length}`}</button>`:"";
  return `<div class="sec"><h3>Workouts (${rows.length})</h3><div class="tblWrap"><table>${body}</table></div>${more}</div>`;
}

function renderPlayer(d,t,member){
  const p=d.profile||{};const out=[];FILM_BY_ID={};
  const prof=[p.playerType,p.position,p.level,p.ageYears?`${p.ageYears} yrs`:null].filter(Boolean).join(" · ");
  out.push(`<div class="sec"><div class="row" style="flex-wrap:wrap;gap:8px"><h3 style="flex:1;margin:0;min-width:120px">Overview</h3><button class="ghost" id="assignProgBtn" style="font-size:12px">📆 Assign program</button><button class="mk" id="sendFileBtn">＋ Send file/clip</button></div>
    ${prof?`<div>${esc(prof)}</div>`:`<div class="muted">No profile details yet.</div>`}${p.bio?`<div class="muted" style="margin-top:6px;font-size:13px">${esc(p.bio)}</div>`:""}
    <input id="fileInput" type="file" accept="video/*,image/*" class="hidden"/><div id="sendStatus" class="muted" style="font-size:12px;margin-top:8px"></div></div>`);
  const log=(d.dailyLogs||[])[0],rec=(d.recovery||[])[0];
  if(log||rec){const k=[];
    if(log?.readinessScore!=null)k.push(kpi(log.readinessScore,"Readiness",rColor(log.readinessScore)));
    if(rec?.hrv!=null)k.push(kpi(Math.round(rec.hrv),"HRV","var(--cyan)"));
    if(rec?.restingHr!=null)k.push(kpi(Math.round(rec.restingHr),"Rest HR"));
    if(rec?.sleepHours!=null)k.push(kpi(rec.sleepHours.toFixed(1),"Sleep h"));
    if(rec?.strain!=null)k.push(kpi(rec.strain.toFixed(1),"Strain","var(--amber)"));
    if(k.length)out.push(`<div class="sec"><h3>Latest readiness &amp; recovery</h3><div class="kpis">${k.join("")}</div></div>`);}
  // ARM CARE & CATCH (iOS Cockpit parity) — one merged card. Both are arm-health /
  // workload signals (readiness, soreness, recovery, throw volume), so they live
  // together instead of two adjacent cards.
  const acLogs=(d.dailyLogs||[]).slice(0,14), acRec=dedupByDay(d.recovery||[],r=>r.date).slice(0,14);
  const catches=(d.catches||[]);
  if(acLogs.length||acRec.length||catches.length){
    const sore=acLogs.find(l=>l.armSoreness!=null);
    const feel=acRec.find(r=>r.armFeeling!=null);
    const bits=[];
    if(sore) bits.push(kpi(`${sore.armSoreness}/10`,"Arm soreness",sore.armSoreness>=6?"var(--red)":"var(--amber)"));
    if(feel) bits.push(kpi(`${feel.armFeeling}/10`,"Arm feel",feel.armFeeling<=4?"var(--amber)":"var(--lime)"));
    if(acRec[0]?.recoveryScore!=null) bits.push(kpi(acRec[0].recoveryScore,"Recovery",rColor(acRec[0].recoveryScore)));
    const trend=acLogs.slice(0,10).reverse().filter(l=>l.readinessScore!=null)
      .map(l=>`<span title="${esc(fmtDate(l.date))}" style="display:inline-block;width:9px;height:22px;border-radius:3px;margin-right:3px;background:${rColor(l.readinessScore)}"></span>`).join("");
    // Catch play merged in (throw volume is a workload input).
    let catchHtml="";
    if(catches.length){
      const last=catches[0];
      const now=Date.now();
      const throws7=catches.filter(c=>{const t=Date.parse(c.date||"");return !isNaN(t)&&(now-t)<=7*86400000;})
        .reduce((n,c)=>n+(c.throwCount||0),0);
      const anyPain=catches.slice(0,10).some(c=>c.painFlag);
      const cbits=[kpi(throws7,"Throws · 7d","var(--lime)"),kpi(last.throwCount??"—","Last session"),kpi(relDays(last.date)||"—","When","var(--cyan)")];
      if(last.maxDistanceFt)cbits.push(kpi(last.maxDistanceFt+" ft","Max dist"));
      if(anyPain)cbits.push(kpi("⚠","Pain flag","var(--red)"));
      catchHtml=`<div style="margin-top:12px"><div class="muted" style="font-size:10.5px;margin-bottom:5px">CATCH PLAY</div><div class="kpis">${cbits.join("")}</div></div>`;
    }
    out.push(`<div class="sec"><h3>Arm care &amp; catch</h3>${bits.length?`<div class="kpis">${bits.join("")}</div>`:""}
      ${trend?`<div style="margin-top:10px"><div class="muted" style="font-size:10.5px;margin-bottom:5px">READINESS · LAST 10 CHECK-INS</div>${trend}</div>`:""}
      ${catchHtml}
      <div class="muted" style="font-size:11px;margin-top:8px">Training-readiness signals from the athlete's own check-ins, recovery, and catch volume — not a medical assessment.</div></div>`);
  }
  const ses=(d.sessions||[]).slice(0,10);
  out.push(`<div class="sec"><div class="row"><h3 style="flex:1;margin:0">Import a report</h3><button class="mk" id="impToggle">＋ Import</button></div>
    <div class="muted" style="font-size:12px;margin-top:4px">Log a TrackMan / Rapsodo session for this athlete and attach the original PDF or screenshot.</div>
    <div id="impForm" class="hidden" style="margin-top:11px">
      <div class="row" style="gap:8px;flex-wrap:wrap">
        <input id="impDate" type="date" class="pgin" style="flex:0 0 150px"/>
        <select id="impKind" class="pgin" style="flex:0 0 130px"><option value="bullpen">Bullpen</option><option value="game">Game</option><option value="live">Live BP</option><option value="cage">Cage</option></select>
        <input id="impLabel" class="pgin" placeholder="Label (e.g. Rapsodo 7/24)" style="flex:1;min-width:150px"/>
      </div>
      <div class="row" style="gap:8px;flex-wrap:wrap;margin-top:8px">
        <input id="impPitches" class="pgin" type="number" min="0" placeholder="Pitches" style="flex:0 0 108px"/>
        <input id="impTop" class="pgin" type="number" step="0.1" placeholder="Top velo" style="flex:0 0 108px"/>
        <input id="impAvg" class="pgin" type="number" step="0.1" placeholder="Avg velo" style="flex:0 0 108px"/>
        <input id="impStrike" class="pgin" type="number" min="0" max="100" placeholder="Strike %" style="flex:0 0 108px"/>
      </div>
      <input id="impNotes" class="pgin" placeholder="Notes (optional)" style="width:100%;box-sizing:border-box;margin-top:8px"/>
      <div class="row" style="gap:8px;align-items:center;margin-top:8px">
        <input id="impFile" type="file" accept="application/pdf,image/*" style="flex:1;font-size:12px"/>
        <button class="mk" id="impSave">Save report</button>
      </div>
      <div id="impStatus" class="muted" style="font-size:12px;margin-top:8px"></div>
    </div></div>`);
  // RECENT SESSIONS — always render (a hidden-when-empty section reads to a
  // paying coach as a MISSING feature). When empty, explain the sync gap and
  // give the coach a one-tap "ask to sync" nudge + the import path.
  if(ses.length){out.push(`<div class="sec"><h3>Recent sessions</h3><div class="tblWrap"><table><tr><th>Date</th><th>Type</th><th>Pitch</th><th>Velo</th><th>Strike%</th><th></th></tr>${ses.map(s=>`<tr><td>${esc(fmtDate(s.date))}</td><td>${esc(s.kind||"")}</td><td>${s.totalPitches??""}</td><td>${s.topVelocity?Math.round(s.topVelocity):(s.avgVelocity?Math.round(s.avgVelocity):"")}</td><td>${s.overallStrikePct!=null?Math.round(s.overallStrikePct)+"%":""}</td><td>${s.reportUrl?`<a href="${esc(s.reportUrl)}" target="_blank" rel="noopener" class="pill" style="text-decoration:none">View report</a>`:""}</td></tr>`).join("")}</table></div></div>`);}
  else{out.push(`<div class="sec"><h3>Recent sessions</h3><div class="empty">No sessions synced yet. TrackMan / Rapsodo imports and logged bullpens show up here — <strong>they reach you only after ${esc(nm(member))} opens the app and logs or imports them.</strong></div><div class="row" style="gap:8px;margin-top:10px"><button class="mk" id="nudgeSyncBtn">🔔 Ask ${esc(nm(member).split(" ")[0])} to sync</button><span class="muted" style="font-size:11.5px;align-self:center">or use ＋ Import above to log a report for them yourself.</span></div></div>`);}
  const tb=d.teamBuildrLifts||[];
  if(tb.length)out.push(`<div class="sec"><h3>Strength (TeamBuildr)</h3><div class="tblWrap"><table><tr><th>Date</th><th>Exercise</th><th>Load</th><th>Reps</th><th>Velocity</th><th>Power</th></tr>${tb.slice(0,30).map(l=>`<tr><td>${esc(fmtDate(l.workoutDate||l.receivedAt))}</td><td>${esc(l.exercise||"Lift")}</td><td>${l.weightLbs!=null?Math.round(l.weightLbs)+" lb":(l.totalLoad!=null?Math.round(l.totalLoad)+" lb total":"")}</td><td>${l.reps??""}</td><td>${l.peakVelocity!=null?Number(l.peakVelocity).toFixed(2)+" m/s":""}</td><td>${l.peakPower!=null?Math.round(l.peakPower)+" W":""}</td></tr>`).join("")}</table></div><div class="muted" style="font-size:11px;margin-top:6px">Synced from the team's TeamBuildr webhook.</div></div>`);
  const drvSec=driversSectionHTML(d);if(drvSec)out.push(drvSec);
  const prSec=prDaySectionHTML(d);if(prSec)out.push(prSec);
  out.push(`<div class="sec" id="calSec"><div class="row"><h3 style="flex:1;margin:0">Calendar</h3><div class="row" style="gap:6px"><button class="xmini" id="calPrev">‹</button><span class="mono" id="calTitle" style="font-size:11px;color:var(--mutedHi);min-width:86px;text-align:center"></span><button class="xmini" id="calNext">›</button></div></div><div id="calBody"><div class="muted" style="font-size:12.5px">Loading…</div></div></div>`);
  const mech=dedupMech(d.mechanics||[]).slice(0,6);
  if(mech.length)out.push(`<div class="sec"><h3>Mechanics reviews</h3><div class="tblWrap"><table><tr><th>Date</th><th>Title</th><th>Score</th><th>Key angles</th></tr>${mech.map(m=>{const b=[m.hipShoulderSep!=null?`Hip-Sh ${Math.round(m.hipShoulderSep)}°`:null,m.trunkTilt!=null?`Trunk ${Math.round(m.trunkTilt)}°`:null,m.armSlot!=null?`Slot ${Math.round(m.armSlot)}°`:null].filter(Boolean).join(" · ");return `<tr><td>${esc(fmtDate(m.date))}</td><td>${esc(m.title||m.kind||"Review")}</td><td>${m.overallScore??""}</td><td class="muted">${esc(b)}</td></tr>`;}).join("")}</table></div></div>`);
  out.push(`<div class="sec"><div class="row" style="gap:9px;align-items:flex-start">
    <div style="font-size:17px;line-height:1">📱</div>
    <div><div style="font-weight:800;font-size:13.5px">Break down &amp; capture happen in the app</div>
    <div class="muted" style="font-size:11.5px;margin-top:3px">Pose analysis and slow-motion capture run on-device with Apple Vision, so they're iPhone/iPad only. Every result shows up here — watch clips, mark them up, and send them back from this dashboard.</div></div></div></div>`);
  const film=(d.film||[]).filter(f=>f.signedUrl).slice(0,12);
  // One film row. Pending clips carry a "✓ Mark reviewed" button (Brennan ask
  // 2026-08-19) so the coach can clear SENT FOR REVIEW without annotating first.
  const filmRowHTML=f=>{const fid=f.id||f.signedUrl.slice(-24);FILM_BY_ID[fid]={...f,_fid:fid};
    const pending=f.reviewRequestedAt&&!f.reviewedAt;
    return `<div class="film"><div class="meta"><strong style="font-size:14px">${esc(f.title||f.kind||"Clip")}</strong><span class="muted" style="font-size:11px">${esc(fmtDate(f.date))}</span>${pending?'<span class="pill req">SENT FOR REVIEW</span>':''}${f.reviewedAt?'<span class="pill done">REVIEWED</span>':''}</div><video controls preload="metadata" src="${esc(f.signedUrl)}"></video><div class="row" style="gap:6px;flex-wrap:wrap"><button class="mk" data-fid="${esc(fid)}">✎ Mark up &amp; send</button>${pending&&f.id?`<button class="mk mkrev" data-rev="${esc(f.id)}" style="background:var(--lime);color:var(--bg)">✓ Mark reviewed</button>`:''}</div></div>`;};
  if(film.length){
    // Grouped session imports (shared sessionGroup) collapse into one expandable
    // card; legacy single-import clips (no sessionGroup) list flat, unchanged.
    const sgroups=[];const sidx={};
    film.forEach(f=>{const g=f.sessionGroup;
      if(g){ if(sidx[g]!=null) sgroups[sidx[g]].push(f); else { sidx[g]=sgroups.length; sgroups.push([f]); } }
      else sgroups.push([f]); });
    const filmHtml=sgroups.map(clips=>{
      if(clips.length>1&&clips[0].sessionGroup){
        const pendN=clips.filter(c=>c.reviewRequestedAt&&!c.reviewedAt).length;
        const label=[fmtDate(clips[0].date),(clips[0].kind||"").toLowerCase()==="hitting"?"Cage":"Bullpen",`${clips.length} clips`].filter(Boolean).join(" · ");
        return `<div class="sec" style="margin:8px 0;padding:10px 12px"><div class="row film-sess" style="cursor:pointer;align-items:center;gap:8px"><span style="font-size:14px">🎞️</span><strong style="font-size:13px">${esc(label)}</strong>${pendN?`<span class="pill req">${pendN} TO REVIEW</span>`:''}<span class="muted" style="margin-left:auto;font-size:11px">tap to expand</span></div><div class="film-sess-body hidden" style="margin-top:8px">${clips.map(filmRowHTML).join("")}</div></div>`;
      }
      return clips.map(filmRowHTML).join("");
    }).join("");
    out.push(`<div class="sec"><h3>Film (${film.length})</h3>${filmHtml}</div>`);
  }
  const cf=(d.coachFiles||[]).slice(0,12);
  if(cf.length)out.push(`<div class="sec"><h3>Sent to player</h3>${cf.map(c=>`<div class="note-card">${c.note?`<div style="font-size:14px">${esc(c.note)}</div>`:""}${c.kind==="image"&&c.signedUrl?`<img src="${esc(c.signedUrl)}">`:""}${(c.kind==="video")&&c.signedUrl?`<video controls src="${esc(c.signedUrl)}"></video>`:""}${c.kind==="audio"&&c.signedUrl?`<audio controls src="${esc(c.signedUrl)}" style="width:100%;margin-top:6px"></audio>`:""}<div class="note-meta">${esc((c.title||c.kind||"").toUpperCase())} · ${esc(fmtDate(c.createdAt))}</div></div>`).join("")}</div>`);
  // Full-history sections, mirroring the iOS Cockpit fold-in (#166) so the web
  // folder covers every category the athlete syncs.
  out.push(histSection("Check-ins",(d.dailyLogs||[]),l=>[fmtDate(l.date),`Readiness ${l.readinessScore??"—"}`,
    [l.sleepHours?`Sleep ${l.sleepHours.toFixed(1)}h`:null,l.armSoreness!=null?`Arm ${l.armSoreness}/10`:null,
     l.energy!=null?`Energy ${l.energy}/10`:null].filter(Boolean).join(" · ")]));
  out.push(histSection("Recovery",dedupByDay(d.recovery||[],r=>r.date),r=>[fmtDate(r.date),`Recovery ${r.recoveryScore??"—"}`,
    [r.hrv?`HRV ${Math.round(r.hrv)}`:null,r.restingHr?`RHR ${Math.round(r.restingHr)}`:null,
     r.sleepHours?`Sleep ${r.sleepHours.toFixed(1)}h`:null,r.source||null].filter(Boolean).join(" · ")]));
  out.push(histSection("Movement screens",dedupMove(d.movement||[]),m=>[fmtDate(m.date),m.screenType||"Screen",
    [m.videoOverall?`Overall ${m.videoOverall}`:null,m.mobilityScore?`Mobility ${m.mobilityScore}`:null].filter(Boolean).join(" · ")]));
  out.push(nutritionSection(d.meals||[]));
  out.push(workoutSection(d.workouts||[]));
  // ROUTINES — the player's saved loadouts + arm-care routines (synced from
  // their device via LibraryCloudSync; read via the service-role edge fn).
  const loadouts=(d.loadouts||[]).slice(0,10);
  const armcare=(d.armcareRoutines||[]).slice(0,5);
  const myRoutine=d.myRoutine;
  const myItems=(myRoutine?.items||[]).slice(0,12);
  if(loadouts.length||armcare.length||myItems.length){
    let rHtml=`<div class="sec"><h3>Routines</h3>`;
    if(myItems.length){
      rHtml+=`<div class="muted" style="font-size:10.5px;margin-bottom:5px">MY ROUTINE (player-written)</div>
        <div style="background:rgba(199,255,61,.06);border:1px solid rgba(199,255,61,.15);border-radius:12px;padding:12px 14px;margin-bottom:12px">
        <div style="font-weight:700;font-size:13px;margin-bottom:6px">${esc(myRoutine.name||"My Routine")}</div>
        ${myItems.map(item=>`<div style="display:flex;gap:8px;align-items:baseline;padding:3px 0"><span style="color:var(--lime);font-size:8px">●</span><div><div style="font-size:12.5px;font-weight:600">${esc(item.title||"Step")}</div>${item.detail?`<div class="muted" style="font-size:11px">${esc(item.detail)}</div>`:""}</div></div>`).join("")}
        ${(myRoutine.items||[]).length>12?`<div class="muted" style="font-size:10px;margin-top:4px">+${(myRoutine.items||[]).length-12} more steps</div>`:""}
        </div>`;
    }
    if(loadouts.length){
      const customExMap={};(d.customExercises||[]).forEach(c=>{if(c.local_id)customExMap[c.local_id]=c;});
      const customAcMap={};(d.customArmcare||[]).forEach(c=>{if(c.local_id)customAcMap[c.local_id]=c;});
      // Each template expands to its full exercise list — every move with
      // sets × reps, target weight, block letters and per-entry notes.
      rHtml+=`<div class="row" style="margin-bottom:5px"><div class="muted" style="font-size:10.5px;flex:1">WORKOUT TEMPLATES</div><button class="xmini" id="newLoadoutBtn" style="color:var(--lime)">＋ New routine</button></div>${loadouts.map(lo=>{
        const entries=(lo.entries||[]).slice().sort((a,b)=>(a.position||0)-(b.position||0));
        const isCoachEdit=(lo.sourceAssignmentId==="coach-edit")||(String(lo.localId||"").startsWith("coach|"));
        const src=isCoachEdit?` <span class="pill" style="background:var(--lime);color:var(--bg);font-size:9px">FROM COACH</span>`:(lo.sourceAssignmentId?` <span class="pill" style="background:var(--amber);color:var(--bg);font-size:9px">COACH</span>`:"");
        const editBtn=` <button class="xmini" data-editlo="${esc(lo.localId||"")}" style="color:var(--lime)">✎ Edit</button>`;
        const rows=entries.map(e=>{
          const r0=exLibResolve(e.moveRef,customExMap,null);
          const nm=e.moveName&&e.moveName.length?e.moveName:r0.name;
          const rx=[e.sets?e.sets+"×":null,e.reps||null,e.targetWeightLbs?Math.round(e.targetWeightLbs)+" lb":null].filter(Boolean).join(" ");
          const tgt=r0.detail.split(" · ").pop()&&!r0.detail.includes("×")?r0.detail:(EX_LIB[e.moveRef]?.target||"");
          return `<div style="display:flex;gap:8px;padding:2.5px 0;align-items:baseline">${e.block?`<span class="mono" style="color:var(--cyan);font-size:9px;min-width:12px">${esc(e.block)}</span>`:""}<div style="flex:1;min-width:0"><span style="font-size:12px">${esc(nm)}</span>${tgt?` <span class="muted" style="font-size:10px">· ${esc(tgt)}</span>`:""}${e.notes?`<div class="muted" style="font-size:10.5px">${esc(e.notes)}</div>`:""}</div><span class="muted mono" style="font-size:10px;white-space:nowrap">${esc(rx)||"—"}</span></div>`;
        }).join("");
        return `<details style="margin:4px 0"><summary style="cursor:pointer;font-weight:700;font-size:13px">${lo.emoji?esc(lo.emoji)+" ":""}${esc(lo.name||"Loadout")}${src}${editBtn} <span class="muted" style="font-weight:400;font-size:11px">${entries.length} exercise${entries.length===1?"":"s"}</span></summary><div style="padding:6px 0 6px 20px">${rows||'<div class="muted" style="font-size:11px">No exercises</div>'}${lo.notes?`<div class="muted" style="font-size:10.5px;margin-top:4px">${esc(lo.notes)}</div>`:""}</div></details>`;
      }).join("")}`;
    }
    if(armcare.length){
      const customAcMap2={};(d.customArmcare||[]).forEach(c=>{if(c.local_id)customAcMap2[c.local_id]=c;});
      // Each routine expands to every exercise — name, sets × reps, target —
      // resolved against the bundled catalog + the player's custom moves.
      rHtml+=`<div class="muted" style="font-size:10.5px;margin-bottom:5px;margin-top:12px">ARM CARE ROUTINES</div>${armcare.map(r=>{
        const ids=r.payload?.exerciseIds||[];
        const blocks=r.payload?.blockMapping||{};
        const rows=ids.map(id=>{
          const r0=exLibResolve(id,null,customAcMap2);
          const letter=blocks[id]&&blocks[id]!=="A"?`<span class="mono" style="color:var(--amber);font-size:9px;min-width:12px">${esc(blocks[id])}</span>`:`<span style="min-width:12px"></span>`;
          return `<div style="display:flex;gap:8px;padding:2.5px 0;align-items:baseline">${letter}<div style="flex:1;min-width:0"><span style="font-size:12px">${esc(r0.name)}</span></div><span class="muted mono" style="font-size:10px;white-space:nowrap">${esc(r0.detail)}</span></div>`;
        }).join("");
        return `<details style="margin:4px 0"><summary style="cursor:pointer;font-weight:700;font-size:13px">${esc(r.name||"Arm Care")} <span class="muted" style="font-weight:400;font-size:11px">${ids.length} exercise${ids.length===1?"":"s"}</span></summary><div style="padding:6px 0 6px 20px">${rows||'<div class="muted" style="font-size:11px">No exercises</div>'}</div></details>`;
      }).join("")}`;
    }
    rHtml+=`</div>`;
    out.push(rHtml);
  }
  // PLANNED — future self-scheduled workouts (Workouts > Schedule), with the
  // full exercise list resolved from the matching loadout so the coach sees
  // "Bicep Curls 3×12" not just "Upper Body Lift".
  const loadoutMap={};
  (d.loadouts||[]).forEach(lo=>{if(lo.localId)loadoutMap[lo.localId]=lo;});
  const planned=(d.scheduledWorkouts||[]).filter(sw=>{
    const dt=Date.parse(sw.date||"");
    return !isNaN(dt)&&dt>=Date.now()-86400000;
  }).sort((a,b)=>(a.date||"").localeCompare(b.date||"")).slice(0,15);
  if(planned.length){
    const cx={};(d.customExercises||[]).forEach(c=>{if(c.local_id)cx[c.local_id]=c;});
    out.push(`<div class="sec"><h3>Planned</h3><div class="tblWrap"><table><tr><th>Date</th><th>Workout</th><th>Exercises</th></tr>${planned.map(sw=>{
      const lo=sw.loadoutId?loadoutMap[sw.loadoutId]:null;
      const entries=(lo?.entries||[]);
      const exList=entries.slice(0,6).map(e=>esc(e.moveName&&e.moveName.length?e.moveName:exLibResolve(e.moveRef,cx,null).name)).join(", ");
      const more=entries.length>6?` +${entries.length-6} more`:"";
      return `<tr><td style="white-space:nowrap">${esc(fmtDate(sw.date))}</td><td><strong>${esc(sw.loadoutName||lo?.name||"Workout")}</strong></td><td class="muted" style="font-size:12px">${exList||"—"}${more}</td></tr>`;
    }).join("")}</table></div></div>`);
  }
  // LAST ACTIVE — the most recent date across every synced table (computed
  // server-side by coach-player-api from the same rows this folder shows).
  if(d.lastActive){
    const la=new Date(d.lastActive);
    const ago=relDays(d.lastActive)||"";
    out.push(`<div class="sec" style="padding:10px 14px"><div class="muted" style="font-size:11px">Last active: <strong style="color:var(--bone)">${esc(ago)}</strong> (${esc(fmtDate(d.lastActive))})</div></div>`);
  }
  // Catch play full log — collapsed history (summary card is up top, iOS parity).
  out.push(histSection("Catch play log",(d.catches||[]),c=>[fmtDate(c.date),c.kind||"Catch play",
    [c.throwCount?`${c.throwCount} throws`:null,c.maxDistanceFt?`${c.maxDistanceFt} ft`:null,c.painFlag?"⚠ pain":null].filter(Boolean).join(" · ")]));
  out.push(histSection("Bodyweight",(d.bodyweight||[]),b=>[fmtDate(b.date),b.weightLbs!=null?`${b.weightLbs.toFixed(1)} lb`:"Weight",""]));
  out.push(histSection("Strike zones",(d.strikeZones||[]),z=>[fmtDate(z.date),z.label||"Strike zone",
    z.strikePct!=null?`${Math.round(z.strikePct)}% strikes`:""]));
  out.push(`<div class="sec" id="valdSec"><h3>VALD Force Plate</h3><div id="valdBody" class="muted" style="font-size:13px">Loading…</div></div>`);
  out.push(`<div class="sec"><h3>Messages</h3><div id="msgs"><div class="muted" style="font-size:13px">Loading…</div></div><div class="composer"><textarea id="msgInput" placeholder="Message ${esc(nm(member))}…" rows="1"></textarea><button class="send" id="msgSend">Send</button></div></div>`);
  $("#pBody").innerHTML=out.join("");
  document.querySelectorAll(".mk[data-fid]").forEach(b=>b.onclick=()=>openMarkup(FILM_BY_ID[b.dataset.fid]));
  // "Mark reviewed" — clears SENT FOR REVIEW with no annotation (coach already
  // handled it). Flips the badge in place and drops the roster pending count.
  document.querySelectorAll(".mkrev[data-rev]").forEach(b=>b.onclick=async()=>{
    b.disabled=true;
    try{
      await coachCall("markFilmReviewed",{teamId:t.id,playerId:member.user_id,filmId:b.dataset.rev});
      const row=b.closest(".film");
      const mkBtn=row?row.querySelector(".mk"):null;
      const film=mkBtn?FILM_BY_ID[mkBtn.dataset.fid]:null;
      if(row){const pill=row.querySelector(".pill.req");if(pill)pill.outerHTML='<span class="pill done">REVIEWED</span>';b.remove();}
      if(film)film.reviewedAt=new Date().toISOString();
    }catch(e){ b.disabled=false; alert(e.message||"Couldn't mark reviewed — try again."); }
  });
  // Session cards expand/collapse (guard the body lookup so a stray header can't throw).
  document.querySelectorAll(".film-sess").forEach(h=>h.onclick=()=>{const body=h.parentElement&&h.parentElement.querySelector(".film-sess-body");if(body)body.classList.toggle("hidden");});
  document.querySelectorAll(".hist-t").forEach(b=>b.onclick=()=>{
    const id=b.dataset.hist; if(HIST_OPEN.has(id))HIST_OPEN.delete(id); else HIST_OPEN.add(id);
    renderPlayer(d,t,member);
  });
  const fi=$("#fileInput");$("#sendFileBtn").onclick=()=>fi.click();fi.onchange=()=>{if(fi.files[0])sendFileToPlayer(t,member,fi.files[0]);};
  const impT=$("#impToggle");
  if(impT){ impT.onclick=()=>{ const f=$("#impForm"); f.classList.toggle("hidden");
      if(!f.classList.contains("hidden")&&!$("#impDate").value)$("#impDate").value=new Date().toISOString().slice(0,10); };
    $("#impSave").onclick=()=>saveCoachReport(t,member); }
  loadMessages(t,member);$("#msgSend").onclick=()=>sendMsg(t,member);
  loadVald(t,member);
  initPlayerCal(t,member);
  const ap=$("#assignProgBtn");
  if(ap)ap.onclick=()=>openAssignProgram(t,{userIds:[member.user_id],label:nm(member)});
  // Routine direct-edit (coach edits the player's workout template straight in
  // their library) + a one-tap "nudge to sync" for the session-data gap.
  const nl=$("#newLoadoutBtn"); if(nl)nl.onclick=()=>openLoadoutEditor(t,member,null,d);
  document.querySelectorAll("[data-editlo]").forEach(b=>b.onclick=(ev)=>{ev.preventDefault();ev.stopPropagation();
    const lo=(d.loadouts||[]).find(x=>x.localId===b.dataset.editlo); if(lo)openLoadoutEditor(t,member,lo,d);});
  const nj=$("#nudgeSyncBtn"); if(nj)nj.onclick=()=>nudgeToSync(t,member);
}

/* ---------- Coach calendar (player folder): month grid + day panel over the
   live teams-api calendar ops (owner-gated server-side, mirrors iOS). ---------- */
let PCAL={month:null,team:null,member:null,events:[],sel:null,editId:null};
function isoDay(d){return `${d.getFullYear()}-${String(d.getMonth()+1).padStart(2,"0")}-${String(d.getDate()).padStart(2,"0")}`;}
function monthBounds(d){const a=new Date(d.getFullYear(),d.getMonth(),1),b=new Date(d.getFullYear(),d.getMonth()+1,0);return {from:isoDay(a),to:isoDay(b),first:a,last:b};}
function evColor(t){return {practice:"var(--cyan)",lesson:"var(--lime)",bullpen:"var(--amber)",lift:"var(--cyan)",game:"var(--red)",rest:"var(--muted)",self_workout:"var(--amber)"}[t]||"var(--mutedHi)";}
function evLabel(t){return t==="self_workout"?"self-planned":(t||"other");}
// SELF-PLANNED workout specifics (2026-08-24 — coach: "I can see the workout
// but not the specifics"). teams-api embeds `details` (the loadout's exercise
// list) on derived self_workout events; render them as a tap-to-expand block
// under the calendar row. Blank moveName (player-built loadouts) resolves via
// EX_LIB + the player's custom exercises already fetched for the folder.
function selfDetailHtml(e){
  if(e.event_type!=="self_workout")return"";
  const dets=Array.isArray(e.details)?e.details:[];
  if(!dets.length)return"";
  const cx={};(CUSTOM_EX_BY_PLAYER[e.target_user_id]||[]).forEach(c=>{const id=c.local_id||c.localId;if(id)cx[id]=c;});
  const rows=dets.slice(0,10).map(en=>{
    const nm=en.moveName&&en.moveName.length?en.moveName:exLibResolve(en.moveRef,cx,null).name;
    const sr=[en.sets>0?en.sets+"×":null,en.reps||null,en.targetWeightLbs>0?Math.round(en.targetWeightLbs)+" lb":null].filter(Boolean).join(" ")||"—";
    return `<div style="display:flex;gap:8px;padding:1.5px 0;align-items:baseline"><div style="flex:1;min-width:0;font-size:11.5px;color:var(--mutedHi)">${esc(nm)}</div><span class="muted mono" style="font-size:10px;white-space:nowrap">${esc(sr)}</span></div>`;
  }).join("");
  const more=dets.length>10?`<div class="muted mono" style="font-size:9px">+ ${dets.length-10} more</div>`:"";
  return `<details style="margin:4px 0 2px"><summary style="cursor:pointer;font-size:10.5px;color:var(--amber);font-weight:700">${dets.length} exercise${dets.length===1?"":"s"} — tap to view</summary><div style="padding:4px 0 2px 4px">${rows}${more}</div></details>`;
}
function fmtTimeHM(s){if(!s)return"";const m=String(s).match(/^(\d{1,2}):(\d{2})/);if(!m)return"";let h=+m[1];const ap=h>=12?"PM":"AM";h=h%12||12;return `${h}:${m[2]} ${ap}`;}
async function initPlayerCal(t,member){
  PCAL={month:new Date(),team:t,member,events:[],sel:isoDay(new Date()),editId:null};
  const sec=$("#calSec"); if(!sec)return;
  $("#calPrev").onclick=()=>{PCAL.month=new Date(PCAL.month.getFullYear(),PCAL.month.getMonth()-1,1);PCAL.sel=null;reloadPlayerCal();};
  $("#calNext").onclick=()=>{PCAL.month=new Date(PCAL.month.getFullYear(),PCAL.month.getMonth()+1,1);PCAL.sel=null;reloadPlayerCal();};
  if(!isOwner(t)){
    $("#calTitle").textContent="";
    $("#calBody").innerHTML=`<div class="muted" style="font-size:12.5px">Only the team owner can view &amp; schedule the coach calendar.</div>`;
    $("#calPrev").style.display="none";$("#calNext").style.display="none";
    return;
  }
  await reloadPlayerCal();
}
async function reloadPlayerCal(){
  const b=monthBounds(PCAL.month);
  $("#calTitle").textContent=PCAL.month.toLocaleDateString(undefined,{month:"short",year:"numeric"}).toUpperCase();
  try{ PCAL.events=await teamsCall("listCalendarEvents",{teamId:PCAL.team.id,targetUserId:PCAL.member.user_id,fromDate:b.from,toDate:b.to})||[]; }
  catch(e){ $("#calBody").innerHTML=`<div class="muted" style="font-size:12.5px">${esc(e.message)}</div>`; return; }
  paintPlayerCal();
}
function eventsOnDay(dISO){return PCAL.events.filter(e=>String(e.event_date||"").slice(0,10)===dISO);}
function paintPlayerCal(){
  const body=$("#calBody"); if(!body)return;
  const b=monthBounds(PCAL.month), todayISO=isoDay(new Date());
  let html=`<div class="cal">`;
  ["S","M","T","W","T","F","S"].forEach(d=>html+=`<div class="dow">${d}</div>`);
  for(let i=0;i<b.first.getDay();i++)html+=`<div class="cald blank"></div>`;
  for(let day=1;day<=b.last.getDate();day++){
    const dISO=isoDay(new Date(PCAL.month.getFullYear(),PCAL.month.getMonth(),day));
    const evs=eventsOnDay(dISO);
    const dots=evs.slice(0,3).map(e=>`<i style="background:${evColor(e.event_type)}"></i>`).join("");
    html+=`<button class="cald${dISO===todayISO?" today":""}${dISO===PCAL.sel?" sel":""}" data-d="${dISO}"><span>${day}</span><span class="dots">${dots}</span></button>`;
  }
  html+=`</div><div id="calDayPanel" style="margin-top:12px"></div>`;
  body.innerHTML=html;
  body.querySelectorAll(".cald[data-d]").forEach(el=>el.onclick=()=>{PCAL.sel=el.dataset.d;PCAL.editId=null;paintPlayerCal();});
  paintCalDay();
}
function paintCalDay(){
  const p=$("#calDayPanel"); if(!p||!PCAL.sel)return;
  const evs=eventsOnDay(PCAL.sel).sort((a,b)=>String(a.start_time||"").localeCompare(String(b.start_time||"")));
  const d=new Date(PCAL.sel+"T12:00:00");
  let html=`<div style="font-family:var(--mono);font-size:10px;letter-spacing:.8px;color:var(--mutedHi);text-transform:uppercase;margin-bottom:4px">${esc(d.toLocaleDateString(undefined,{weekday:"long",month:"short",day:"numeric"}))}</div>`;
  if(!evs.length)html+=`<div class="empty">Nothing scheduled.</div>`;
  evs.forEach(e=>{
    const time=[fmtTimeHM(e.start_time),fmtTimeHM(e.end_time)].filter(Boolean).join(" – ");
    const prog=e.program_name?` · ${esc(e.program_name)}${e.program_day_index?` — day ${e.program_day_index}/${e.program_day_count||"?"}`:""}`:"";
    const who=e.target_user_id?"":" · whole team";
    const isSelf=e.event_type==="self_workout";
    const ctrls=isSelf?`<span class="evpill" style="color:var(--amber)">self</span>`:`<div class="row" style="gap:4px"><button class="xmini" data-edit="${esc(e.id)}">✎</button><button class="xmini" style="color:#ff8b8b" data-del="${esc(e.id)}">✕</button></div>`;
    html+=`<div class="evrow"><span class="evpill" style="color:${evColor(e.event_type)}">${esc(evLabel(e.event_type))}</span><div style="flex:1;min-width:0"><div style="font-weight:800;font-size:13.5px">${esc(e.title||"")}</div><div class="muted" style="font-size:11px">${esc(time)}${prog}${who}${e.notes?` · ${esc(String(e.notes).slice(0,140))}`:""}</div>${selfDetailHtml(e)}</div>${ctrls}</div>`;
  });
  const ed=PCAL.editId?PCAL.events.find(x=>x.id===PCAL.editId):null;
  html+=`<div style="margin-top:12px;border-top:1px solid var(--line);padding-top:12px">
    <div style="font-family:var(--mono);font-size:9.5px;letter-spacing:.8px;color:var(--muted);text-transform:uppercase;margin-bottom:8px">${ed?"Edit event":"Add to this day"}</div>
    <div class="pgrow"><select class="pgin" id="cevType" style="flex:0 0 118px">${["practice","lesson","bullpen","lift","rest","game","other"].map(t=>`<option value="${t}"${ed&&ed.event_type===t?" selected":""}>${t[0].toUpperCase()+t.slice(1)}</option>`).join("")}</select><input class="pgin" id="cevTitle" placeholder="Title (e.g. Bullpen — 25 pitches)" value="${ed?esc(ed.title||""):""}"/></div>
    <div class="pgrow"><input class="pgin" id="cevStart" type="time" value="${ed&&ed.start_time?esc(String(ed.start_time).slice(0,5)):""}" style="flex:0 0 118px"/><input class="pgin" id="cevEnd" type="time" value="${ed&&ed.end_time?esc(String(ed.end_time).slice(0,5)):""}" style="flex:0 0 118px"/><input class="pgin" id="cevNotes" placeholder="Notes (optional)" value="${ed?esc(ed.notes||""):""}"/></div>
    <div class="row" style="gap:8px;flex-wrap:wrap"><label class="muted" style="font-size:11.5px;display:flex;align-items:center;gap:6px"><input type="checkbox" id="cevTeam"${ed&&!ed.target_user_id?" checked":""}${ed?" disabled":""}/> Whole team</label><span style="flex:1"></span>${ed?`<button class="ghost" id="cevCancel" style="font-size:12px">Cancel</button>`:""}<button class="mini" id="cevSave" style="padding:8px 16px">${ed?"Save changes":"＋ Add event"}</button></div>
    <div class="err" id="cevErr" style="min-height:14px"></div></div>`;
  p.innerHTML=html;
  p.querySelectorAll("[data-del]").forEach(b=>b.onclick=async()=>{if(!confirm("Delete this event?"))return;
    try{await teamsCall("deleteCalendarEvent",{eventId:b.dataset.del});await reloadPlayerCal();}catch(e){alert(e.message);}});
  p.querySelectorAll("[data-edit]").forEach(b=>b.onclick=()=>{PCAL.editId=b.dataset.edit;paintCalDay();});
  const cc=p.querySelector("#cevCancel"); if(cc)cc.onclick=()=>{PCAL.editId=null;paintCalDay();};
  p.querySelector("#cevSave").onclick=async()=>{
    const err=p.querySelector("#cevErr");err.textContent="";
    const title=(p.querySelector("#cevTitle").value||"").trim();
    if(!title){err.textContent="Give the event a title.";return;}
    const params={eventDate:PCAL.sel,eventType:p.querySelector("#cevType").value,title,
      startTime:p.querySelector("#cevStart").value||"",endTime:p.querySelector("#cevEnd").value||"",
      notes:(p.querySelector("#cevNotes").value||"").trim()||null};
    const btn=p.querySelector("#cevSave");btn.disabled=true;
    try{
      if(PCAL.editId){ await teamsCall("updateCalendarEvent",{eventId:PCAL.editId,...params}); }
      else{ await teamsCall("createCalendarEvent",{teamId:PCAL.team.id,targetUserId:p.querySelector("#cevTeam").checked?null:PCAL.member.user_id,...params}); }
      PCAL.editId=null; await reloadPlayerCal();
    }catch(e){err.textContent=e.message;btn.disabled=false;}
  };
}
/* ---------- Team Calendar (whole roster): month grid + day panel over the live
   teams-api calendar ops. listCalendarEvents(targetUserId:null) returns the
   WHOLE team (team-wide + every player's). Owner-gated, mirrors iOS. ---------- */
let TCAL={month:null,events:[],assignments:[],sel:null,editId:null,players:[],groups:[],gmembers:{}};
function tcalName(uid){if(!uid)return"Whole team";const m=(TCAL.players||[]).find(x=>x.user_id===uid);return m?nm(m):"Athlete";}
async function renderCalendar(){
  const t=team();
  if(!isOwner(t)){
    $("#main").innerHTML=`<div class="sec"><h3>Team Calendar</h3><div class="empty">Only the team owner can view &amp; schedule the team calendar.</div></div>`;
    return;
  }
  const d=await teamData().catch(()=>({players:[]}));
  TCAL.players=d.players||[];
  try{
    TCAL.groups=await listGroups(SEL)||[];
    TCAL.gmembers={};
    const gids=TCAL.groups.map(g=>g.id);
    if(gids.length){ const rows=await rest("GET",`team_group_members?group_id=in.(${gids.join(",")})&select=group_id,user_id`)||[]; rows.forEach(r=>{(TCAL.gmembers[r.group_id]=TCAL.gmembers[r.group_id]||[]).push(r.user_id);}); }
  }catch(e){ TCAL.groups=[]; TCAL.gmembers={}; }
  if(!TCAL.month)TCAL.month=new Date();
  if(!TCAL.sel)TCAL.sel=isoDay(new Date());
  $("#main").innerHTML=`<div class="sec">
      <div class="row"><h3 style="flex:1;margin:0">${esc(t.name)} · Team Calendar</h3>
        <div class="row" style="gap:6px"><button class="xmini" id="tcalPrev">‹</button><span class="mono" id="tcalTitle" style="font-size:11px;color:var(--mutedHi);min-width:86px;text-align:center"></span><button class="xmini" id="tcalNext">›</button></div></div>
      <div class="muted" style="font-size:12px;margin:4px 0 10px">Schedule for the whole team or any athlete — whole-team events land on every player's calendar. Multi-day program days are managed in Assign.</div>
      <div id="tcalBody"><div class="loading">Loading…</div></div>
    </div>`;
  $("#tcalPrev").onclick=()=>{TCAL.month=new Date(TCAL.month.getFullYear(),TCAL.month.getMonth()-1,1);TCAL.sel=null;TCAL.editId=null;reloadTeamCal();};
  $("#tcalNext").onclick=()=>{TCAL.month=new Date(TCAL.month.getFullYear(),TCAL.month.getMonth()+1,1);TCAL.sel=null;TCAL.editId=null;reloadTeamCal();};
  await reloadTeamCal();
}
async function reloadTeamCal(){
  const b=monthBounds(TCAL.month);
  $("#tcalTitle").textContent=TCAL.month.toLocaleDateString(undefined,{month:"short",year:"numeric"}).toUpperCase();
  try{ TCAL.events=await teamsCall("listCalendarEvents",{teamId:SEL,targetUserId:null,fromDate:b.from,toDate:b.to})||[]; }
  catch(e){ const bd=$("#tcalBody"); if(bd)bd.innerHTML=`<div class="muted" style="font-size:12.5px">${esc(e.message)}</div>`; return; }
  try{ TCAL.assignments=await teamsCall("assignmentsForTeam",{teamId:SEL})||[]; }catch(e){ TCAL.assignments=[]; }
  paintTeamCal();
}
function tcalEventsOnDay(dISO){return TCAL.events.filter(e=>String(e.event_date||"").slice(0,10)===dISO);}
function tcalAssignsOnDay(dISO){return (TCAL.assignments||[]).filter(a=>a.due_date&&String(a.due_date).slice(0,10)===dISO);}
function paintTeamCal(){
  const body=$("#tcalBody"); if(!body)return;
  const b=monthBounds(TCAL.month), todayISO=isoDay(new Date());
  let html=`<div class="cal">`;
  ["S","M","T","W","T","F","S"].forEach(d=>html+=`<div class="dow">${d}</div>`);
  for(let i=0;i<b.first.getDay();i++)html+=`<div class="cald blank"></div>`;
  for(let day=1;day<=b.last.getDate();day++){
    const dISO=isoDay(new Date(TCAL.month.getFullYear(),TCAL.month.getMonth(),day));
    const evs=tcalEventsOnDay(dISO);
    let dots=evs.slice(0,3).map(e=>`<i style="background:${e.target_user_id?"#b892f6":"var(--cyan)"}"></i>`).join("");
    if(tcalAssignsOnDay(dISO).length)dots+=`<i style="background:var(--red)"></i>`;
    html+=`<button class="cald${dISO===todayISO?" today":""}${dISO===TCAL.sel?" sel":""}" data-d="${dISO}"><span>${day}</span><span class="dots">${dots}</span></button>`;
  }
  html+=`</div><div class="row" style="gap:14px;margin-top:8px"><span class="muted" style="font-size:10px;display:flex;align-items:center;gap:5px"><i style="width:6px;height:6px;border-radius:50%;background:var(--cyan);display:inline-block"></i>WHOLE TEAM</span><span class="muted" style="font-size:10px;display:flex;align-items:center;gap:5px"><i style="width:6px;height:6px;border-radius:50%;background:#b892f6;display:inline-block"></i>PLAYER</span><span class="muted" style="font-size:10px;display:flex;align-items:center;gap:5px"><i style="width:6px;height:6px;border-radius:50%;background:var(--red);display:inline-block"></i>WORK</span></div><div id="tcalDayPanel" style="margin-top:12px"></div>`;
  body.innerHTML=html;
  body.querySelectorAll(".cald[data-d]").forEach(el=>el.onclick=()=>{TCAL.sel=el.dataset.d;TCAL.editId=null;TCAL.picked=new Set();paintTeamCal();});
  paintTeamCalDay();
}
function wireTcalTabs(p){
  p.querySelectorAll(".tcalTab").forEach(b=>b.onclick=()=>{TCAL.dayTab=b.dataset.tab;paintTeamCalDay();});
}
/// Work-submitted view: one row per player who uploaded something on TCAL.sel,
/// tap to expand their uploads for the day (iOS DayActivityDetailSheet parity).
async function paintTcalWork(p){
  const w=p.querySelector("#tcalWork"); if(!w)return;
  let players=[];
  try{ const r=await coachCall("teamDayActivity",{teamId:SEL,date:TCAL.sel}); players=r.players||[]; }
  catch(e){ w.innerHTML=`<div class="empty">Couldn't load today's work — ${esc(e.message)}</div>`; return; }
  if(!players.length){
    const today=isoDay(new Date());
    w.innerHTML=`<div class="empty">📤<br><b>Nothing uploaded ${TCAL.sel===today?"today":"this day"}</b><br><span style="font-size:11.5px">When a player logs a session, film, catch play, recovery, or a screen, it shows up here — player by player.</span></div>`;
    return;
  }
  const meta=u=>{
    const T={session:["bolt","Session"],film:["film","Film"],mechanics:["figure","Breakdown"],catch:["baseball","Catch"],recovery:["heart","Recovery"],movement:["figure","Screen"],kpi:["chart","Report"],workout:["dumbbell","Lift"]};
    const m=T[u.type]||["upload","Upload"];
    let title=m[1], detail="";
    if(u.type==="session"){ title=(u.kind?u.kind[0].toUpperCase()+u.kind.slice(1):"Session"); detail=[u.pitches?u.pitches+" pitches":null,u.topVelo?("top "+Math.round(u.topVelo)+" mph"):null,u.strikePct?Math.round(u.strikePct)+"% strikes":null].filter(Boolean).join(" · "); }
    else if(u.type==="film"){ title="Film — "+(u.title||u.kind||"clip"); detail=u.pitchType||""; }
    else if(u.type==="mechanics"){ title=u.title||"Mechanics breakdown"; detail=u.score!=null?("score "+u.score):""; }
    else if(u.type==="catch"){ title="Catch play"; detail=[u.throws?u.throws+" throws":null,u.distanceFt?u.distanceFt+" ft":null,u.pain?"⚠ pain":null].filter(Boolean).join(" · "); }
    else if(u.type==="recovery"){ title="Recovery"; detail=[u.score!=null?("recovery "+u.score):null,u.hrv?("HRV "+Math.round(u.hrv)):null,u.source||null].filter(Boolean).join(" · "); }
    else if(u.type==="movement"){ title="Movement screen"; detail=[u.overall?("overall "+u.overall):null,u.mobility?("mobility "+u.mobility):null].filter(Boolean).join(" · "); }
    else if(u.type==="kpi"){ title="Report — "+(u.metric||"KPI"); detail=(u.value!=null?u.value:"")+(u.source?(" · "+u.source):""); }
    else if(u.type==="workout"){ title="Lift — "+(u.name||"Workout"); detail=[u.sets?u.sets+" sets":null,u.minutes?u.minutes+" min":null].filter(Boolean).join(" · "); }
    return {title,detail};
  };
  w.innerHTML=players.map((pl,i)=>{
    const counts={}; pl.uploads.forEach(u=>{counts[u.type]=(counts[u.type]||0)+1;});
    const lbl={session:"session",film:"film",mechanics:"breakdown",catch:"catch",recovery:"recovery",movement:"screen",kpi:"report",workout:"lift"};
    const summary=["session","film","mechanics","catch","recovery","movement","kpi","workout"].map(t=>counts[t]?((counts[t]>1?counts[t]+" ":"")+lbl[t]):null).filter(Boolean).join(" · ");
    const rows=pl.uploads.map(u=>{const m=meta(u);
      const view=u.reportUrl?` <a href="${esc(u.reportUrl)}" target="_blank" rel="noopener" class="pill" style="text-decoration:none">VIEW</a>`:"";
      return `<div class="evrow" style="margin-left:8px"><div style="flex:1;min-width:0"><div style="font-weight:800;font-size:13px">${esc(m.title)}</div><div class="muted" style="font-size:11px">${esc(m.detail)}</div></div>${view}</div>`;}).join("");
    return `<div class="evrow" style="align-items:center"><div style="flex:1;min-width:0"><div style="font-weight:800;font-size:14px">${esc(pl.name||"Athlete")}</div><div class="muted" style="font-size:11px">${esc(summary)}</div></div><span class="pill">${pl.uploads.length}</span><button class="xmini tcalExp" data-i="${i}">›</button></div><div class="tcalExpBody" data-body="${i}" style="display:none">${rows}</div>`;
  }).join("");
  w.querySelectorAll(".tcalExp").forEach(b=>b.onclick=()=>{
    const body=w.querySelector(`[data-body="${b.dataset.i}"]`);
    const open=body.style.display!=="none"; body.style.display=open?"none":"block"; b.textContent=open?"›":"⌄";
  });
}
function paintTeamCalDay(){
  const p=$("#tcalDayPanel"); if(!p||!TCAL.sel)return;
  const d=new Date(TCAL.sel+"T12:00:00");
  // Assigned | Work submitted toggle (iOS parity) — Assigned = what's scheduled/due
  // (existing), Work submitted = what each player actually uploaded this day, per player.
  if(!TCAL.dayTab)TCAL.dayTab="assigned";
  const tabBtn=(id,label,icon)=>`<button class="chip tcalTab${TCAL.dayTab===id?" lime":""}" data-tab="${id}" style="cursor:pointer;border:none">${icon} ${label}</button>`;
  let html=`<div style="font-family:var(--mono);font-size:10px;letter-spacing:.8px;color:var(--mutedHi);text-transform:uppercase;margin-bottom:4px">${esc(d.toLocaleDateString(undefined,{weekday:"long",month:"short",day:"numeric"}))}</div>
    <div class="row" style="gap:8px;margin-bottom:10px">${tabBtn("assigned","ASSIGNED","📅")}${tabBtn("work","WORK SUBMITTED","📤")}</div>`;
  if(TCAL.dayTab==="work"){ html+=`<div id="tcalWork"><div class="loading">Loading…</div></div>`; p.innerHTML=html; wireTcalTabs(p); paintTcalWork(p); return; }
  const evs=tcalEventsOnDay(TCAL.sel).sort((a,b)=>String(a.start_time||"").localeCompare(String(b.start_time||"")));
  if(!evs.length)html+=`<div class="empty">Nothing scheduled.</div>`;
  evs.forEach(e=>{
    const time=[fmtTimeHM(e.start_time),fmtTimeHM(e.end_time)].filter(Boolean).join(" – ");
    const prog=e.program_name?` · ${esc(e.program_name)}${e.program_day_index?` — day ${e.program_day_index}/${e.program_day_count||"?"}`:""}`:"";
    const who=e.target_user_id?`<span style="color:#b892f6;font-weight:800">${esc(tcalName(e.target_user_id))}</span>`:`<span style="color:var(--cyan);font-weight:800">Whole team</span>`;
    const isProg=!!e.program_id;
    const isSelf=e.event_type==="self_workout";
    const ctrls=isProg?`<span class="evpill" style="color:var(--muted)">program</span>`:isSelf?`<span class="evpill" style="color:var(--amber)">self</span>`:`<div class="row" style="gap:4px"><button class="xmini" data-edit="${esc(e.id)}">✎</button><button class="xmini" style="color:#ff8b8b" data-del="${esc(e.id)}">✕</button></div>`;
    html+=`<div class="evrow"><span class="evpill" style="color:${evColor(e.event_type)}">${esc(evLabel(e.event_type))}</span><div style="flex:1;min-width:0"><div style="font-weight:800;font-size:13.5px">${esc(e.title||"")}</div><div class="muted" style="font-size:11px">${who}${time?` · ${esc(time)}`:""}${prog}${e.notes?` · ${esc(String(e.notes).slice(0,140))}`:""}</div>${selfDetailHtml(e)}</div>${ctrls}</div>`;
  });
  const asn=tcalAssignsOnDay(TCAL.sel);
  if(asn.length){
    html+=`<div style="margin-top:10px;font-family:var(--mono);font-size:9.5px;letter-spacing:.8px;color:var(--muted);text-transform:uppercase;margin-bottom:4px">Work due</div>`;
    asn.forEach(a=>{
      const awho=a.assignee_user_id?`<span style="color:#b892f6;font-weight:800">${esc(tcalName(a.assignee_user_id))}</span>`:`<span style="color:var(--cyan);font-weight:800">Whole team</span>`;
      html+=`<div class="evrow"><span class="evpill" style="color:var(--red)">${esc(a.kind||"work")}</span><div style="flex:1;min-width:0"><div style="font-weight:800;font-size:13.5px">${esc(a.title||"")}</div><div class="muted" style="font-size:11px">${awho}${a.notes?` · ${esc(String(a.notes).slice(0,140))}`:""}</div></div><button class="xmini" style="color:#ff8b8b" data-adel="${esc(a.id)}">✕</button></div>`;
    });
  }
  const ed=TCAL.editId?TCAL.events.find(x=>x.id===TCAL.editId):null;
  const whoAll = ed ? !ed.target_user_id : true;
  const whoBlock=`<div style="margin-bottom:8px"><label class="muted" style="font-size:12px;display:flex;align-items:center;gap:7px"><input type="checkbox" id="tcevAll"${whoAll?" checked":""}/> Whole team (${(TCAL.players||[]).length})</label><div id="tcevGroups" style="margin:6px 0 4px"></div><div id="tcevList" style="max-height:180px;overflow:auto;margin-top:6px;display:none"></div></div>`;
  html+=`<div style="margin-top:12px;border-top:1px solid var(--line);padding-top:12px">
    <div style="font-family:var(--mono);font-size:9.5px;letter-spacing:.8px;color:var(--muted);text-transform:uppercase;margin-bottom:8px">${ed?"Edit event":"Add to this day"}</div>
    ${whoBlock}
    <div class="pgrow"><input class="pgin" id="tcevTitle" placeholder="Title (e.g. Team practice)" value="${ed?esc(ed.title||""):""}" style="flex:1"/></div>
    <div class="pgrow"><select class="pgin" id="tcevType" style="flex:0 0 118px">${["practice","lesson","bullpen","lift","rest","game","other"].map(x=>`<option value="${x}"${ed&&ed.event_type===x?" selected":""}>${x[0].toUpperCase()+x.slice(1)}</option>`).join("")}</select><input class="pgin" id="tcevStart" type="time" value="${ed&&ed.start_time?esc(String(ed.start_time).slice(0,5)):""}" style="flex:0 0 108px"/><input class="pgin" id="tcevEnd" type="time" value="${ed&&ed.end_time?esc(String(ed.end_time).slice(0,5)):""}" style="flex:0 0 108px"/></div>
    <div class="pgrow"><input class="pgin" id="tcevNotes" placeholder="Notes (optional)" value="${ed?esc(ed.notes||""):""}"/></div>
    <div class="row" style="gap:8px;flex-wrap:wrap;justify-content:flex-end">${ed?`<button class="ghost" id="tcevCancel" style="font-size:12px">Cancel</button>`:""}<button class="mini" id="tcevSave" style="padding:8px 16px">${ed?"Save changes":"＋ Add event"}</button></div>
    ${ed?"":`<div style="margin-top:16px;border-top:1px dashed var(--line);padding-top:12px">
      <div style="font-family:var(--mono);font-size:9.5px;letter-spacing:.8px;color:var(--muted);text-transform:uppercase;margin-bottom:8px">Assign work · goes to the players above</div>
      <div class="pgrow"><select class="pgin" id="twKind" style="flex:0 0 118px"><option value="workout">Workout</option><option value="armcare">Arm care</option><option value="note">Note</option></select><input class="pgin" id="twTitle" placeholder="Work title (e.g. Lower-body lift)" style="flex:1"/></div>
      <div class="pgrow"><input class="pgin" id="twNotes" placeholder="Notes (optional)"/></div>
      <div class="row" style="justify-content:flex-end"><button class="mini" id="twSave" style="padding:8px 16px">＋ Assign work</button></div>
    </div>`}
    <div class="err" id="tcevErr" style="min-height:14px"></div></div>`;
  p.innerHTML=html;
  {
    const listEl=p.querySelector("#tcevList"), allEl=p.querySelector("#tcevAll"), grpEl=p.querySelector("#tcevGroups");
    if(!TCAL.picked)TCAL.picked=new Set();
    if(listEl && allEl){
      const paintPick=()=>{
        listEl.style.display=allEl.checked?"none":"block";
        listEl.innerHTML="";
        (TCAL.players||[]).forEach(m=>{const on=TCAL.picked.has(m.user_id);
          const b=document.createElement("button");b.className="pick-item";b.style.padding="8px 10px";
          b.innerHTML=`<div class="xmini" style="${on?'color:var(--lime);border-color:rgba(199,255,61,.45)':''}">${on?"✓":"＋"}</div><div style="flex:1;font-weight:700;font-size:13px">${esc(nm(m))}</div>`;
          b.onclick=()=>{if(TCAL.picked.has(m.user_id))TCAL.picked.delete(m.user_id);else TCAL.picked.add(m.user_id);paintPick();};
          listEl.appendChild(b);});
      };
      allEl.onchange=()=>{ if(allEl.checked)TCAL.picked=new Set(); paintPick(); };
      if(grpEl){
        const chips=(TCAL.groups||[]).map(g=>`<button class="xmini" data-grp="${esc(g.id)}" style="margin:0 6px 6px 0">${esc(g.name)} · ${(TCAL.gmembers[g.id]||[]).length}</button>`).join("");
        grpEl.innerHTML=(chips?`<div class="muted" style="font-size:9.5px;letter-spacing:.5px;margin-bottom:4px">GROUPS</div>${chips}`:"")+`<button class="xmini" id="tcevSaveGrp" style="margin:0;color:var(--lime)">＋ Save selection as group</button>`;
        grpEl.querySelectorAll("[data-grp]").forEach(b=>b.onclick=()=>{const ids=TCAL.gmembers[b.dataset.grp]||[];const rset=new Set((TCAL.players||[]).map(m=>m.user_id));TCAL.picked=new Set(ids.filter(x=>rset.has(x)));allEl.checked=false;paintPick();});
        const sg=grpEl.querySelector("#tcevSaveGrp");
        if(sg)sg.onclick=async()=>{const ids=[...(TCAL.picked||[])];if(!ids.length){alert("Pick players first, then save them as a group.");return;}const name=(prompt("Group name (e.g. Pitchers)")||"").trim();if(!name)return;try{await rest("POST","team_groups",{team_id:SEL,name});const gs=await listGroups(SEL)||[];const g=gs.find(x=>x.name===name);if(g){for(const uid of ids){await rest("POST","team_group_members",{group_id:g.id,user_id:uid});}}TCAL.groups=gs;const gm={};const gids=gs.map(x=>x.id);if(gids.length){const rows=await rest("GET",`team_group_members?group_id=in.(${gids.join(",")})&select=group_id,user_id`)||[];rows.forEach(r=>{(gm[r.group_id]=gm[r.group_id]||[]).push(r.user_id);});}TCAL.gmembers=gm;paintTeamCalDay();}catch(e){alert(e.message);}};
      }
      paintPick();
    }
  }
  p.querySelectorAll("[data-del]").forEach(b=>b.onclick=async()=>{if(!confirm("Delete this event?"))return;
    try{await teamsCall("deleteCalendarEvent",{eventId:b.dataset.del});await reloadTeamCal();}catch(e){alert(e.message);}});
  p.querySelectorAll("[data-adel]").forEach(b=>b.onclick=async()=>{if(!confirm("Delete this assignment?"))return;
    try{await teamsCall("deleteAssignment",{id:b.dataset.adel});delete CACHE[SEL];await reloadTeamCal();}catch(e){alert(e.message);}});
  p.querySelectorAll("[data-edit]").forEach(b=>b.onclick=()=>{const ev=TCAL.events.find(x=>x.id===b.dataset.edit);TCAL.editId=b.dataset.edit;TCAL.picked=new Set(ev&&ev.target_user_id?[ev.target_user_id]:[]);paintTeamCalDay();});
  const cc=p.querySelector("#tcevCancel"); if(cc)cc.onclick=()=>{TCAL.editId=null;paintTeamCalDay();};
  p.querySelector("#tcevSave").onclick=async()=>{
    const err=p.querySelector("#tcevErr");err.textContent="";err.style.color="";
    const title=(p.querySelector("#tcevTitle").value||"").trim();
    if(!title){err.textContent="Give the event a title.";return;}
    const params={eventDate:TCAL.sel,eventType:p.querySelector("#tcevType").value,title,
      startTime:p.querySelector("#tcevStart").value||"",endTime:p.querySelector("#tcevEnd").value||"",
      notes:(p.querySelector("#tcevNotes").value||"").trim()||null};
    const btn=p.querySelector("#tcevSave");btn.disabled=true;
    try{
      if(TCAL.editId){
        const allEl=p.querySelector("#tcevAll");
        if(allEl && allEl.checked){ await teamsCall("updateCalendarEvent",{eventId:TCAL.editId,...params,targetUserId:null}); }
        else{
          const ids=[...(TCAL.picked||[])];
          if(!ids.length){err.textContent="Pick at least one player, or choose Whole team.";btn.disabled=false;return;}
          if(ids.length===1){ await teamsCall("updateCalendarEvent",{eventId:TCAL.editId,...params,targetUserId:ids[0]}); }
          else{ await teamsCall("deleteCalendarEvent",{eventId:TCAL.editId}); for(const uid of ids){ await teamsCall("createCalendarEvent",{teamId:SEL,targetUserId:uid,...params}); } }
        }
        TCAL.picked=new Set();
      }
      else{
        const allEl=p.querySelector("#tcevAll");
        if(allEl && allEl.checked){ await teamsCall("createCalendarEvent",{teamId:SEL,targetUserId:null,...params}); }
        else{
          const ids=[...(TCAL.picked||[])];
          if(!ids.length){err.textContent="Pick at least one player, or choose Whole team.";btn.disabled=false;return;}
          for(const uid of ids){ await teamsCall("createCalendarEvent",{teamId:SEL,targetUserId:uid,...params}); }
        }
        TCAL.picked=new Set();
      }
      TCAL.editId=null; await reloadTeamCal();
    }catch(e){err.textContent=e.message;btn.disabled=false;}
  };
  const tw=p.querySelector("#twSave");
  if(tw)tw.onclick=async()=>{
    const err=p.querySelector("#tcevErr");err.textContent="";err.style.color="";
    const title=(p.querySelector("#twTitle").value||"").trim();
    if(!title){err.textContent="Give the assignment a title.";return;}
    const kind=p.querySelector("#twKind").value, notes=(p.querySelector("#twNotes").value||"").trim(), dueDate=TCAL.sel;
    tw.disabled=true;
    try{
      const allEl=p.querySelector("#tcevAll");
      if(allEl && allEl.checked){ await teamsCall("createAssignment",{teamId:SEL,kind,title,notes,dueDate,assigneeUserId:null}); }
      else{
        const ids=[...(TCAL.picked||[])];
        if(!ids.length){err.textContent="Pick at least one player, or choose Whole team.";tw.disabled=false;return;}
        for(const uid of ids){ await teamsCall("createAssignment",{teamId:SEL,kind,title,notes,dueDate,assigneeUserId:uid}); }
      }
      delete CACHE[SEL];
      p.querySelector("#twTitle").value="";p.querySelector("#twNotes").value="";
      err.style.color="var(--lime)";err.textContent="Assigned ✓";tw.disabled=false;
    }catch(e){err.style.color="";err.textContent=e.message;tw.disabled=false;}
  };
}
async function loadVald(t,member){
  const sec=$("#valdSec"); if(!sec) return;
  let j; try{ j=await valdCall("teamSignals",{teamId:t.id}); }catch(e){ sec.style.display="none"; return; }
  if(!j || !j.tenants || !j.tenants.length){ sec.style.display="none"; return; }  // team has no VALD tenant
  const body=$("#valdBody"); if(!body) return;
  const mine=(j.linked||[]).find(x=>x.playerUserId===member.user_id);
  if(mine){
    const k=[];
    if(mine.jumpHeightCm!=null)k.push(kpi(Number(mine.jumpHeightCm).toFixed(1),"Jump cm","var(--lime)"));
    if(mine.rsiModified!=null)k.push(kpi(Number(mine.rsiModified).toFixed(2),"RSI-mod","var(--cyan)"));
    if(mine.peakForceN!=null)k.push(kpi(Math.round(mine.peakForceN),"Peak N"));
    if(mine.nbLeftMaxForceN!=null||mine.nbRightMaxForceN!=null)k.push(kpi(Math.round(mine.nbLeftMaxForceN||0)+"/"+Math.round(mine.nbRightMaxForceN||0),"NordBord L/R"));
    if(mine.worstAsymPct!=null)k.push(kpi(Number(mine.worstAsymPct).toFixed(1)+"%","Asymmetry",mine.highAsymmetryFlag?"var(--amber)":null));
    const when=mine.lastTestUtc?relDays(mine.lastTestUtc):"";
    const flag=mine.highAsymmetryFlag?`<div style="color:var(--amber);font-size:12px;margin-top:6px">⚠ Left/right asymmetry ≥15% — worth a look.</div>`:"";
    body.innerHTML=`<div class="kpis">${k.join("")||'<span class="muted">Linked — no force readings yet.</span>'}</div>${flag}<div class="muted" style="font-size:11px;margin-top:6px">Latest ForceDecks / NordBord${when?" · "+when:""} · via VALD · <a href="#" id="valdUnlink">unlink</a></div>`;
    const u=$("#valdUnlink"); if(u)u.onclick=(e)=>{e.preventDefault(); if(confirm("Unlink this athlete's VALD profile?")) unlinkVald(t,member,mine.valdTenantId,mine.valdProfileId);};
  } else {
    const cands=j.candidates||[];
    if(!cands.length){ body.innerHTML=`<div class="muted" style="font-size:12.5px">No unlinked VALD profiles with data for this team yet.</div>`; return; }
    const opts=cands.map(c=>`<option value="${esc(c.valdTenantId)}|${esc(c.valdProfileId)}">${esc([c.givenName,c.familyName].filter(Boolean).join(" ")||c.externalId||c.valdProfileId)}${c.worstAsymPct!=null?" · asym "+Number(c.worstAsymPct).toFixed(0)+"%":""}</option>`).join("");
    body.innerHTML=`<div style="font-size:13px;margin-bottom:6px">Link this athlete to their VALD profile:</div><div class="row"><select id="valdPick" style="flex:1">${opts}</select><button class="mk" id="valdLinkBtn">Link</button></div><div id="valdLinkStatus" class="muted" style="font-size:12px;margin-top:6px"></div>`;
    $("#valdLinkBtn").onclick=()=>{const v=$("#valdPick").value.split("|");linkVald(t,member,v[0],v[1]);};
  }
}
async function linkVald(t,member,tenant,profile){
  const st=$("#valdLinkStatus"); if(st){st.style.color="var(--muted)";st.textContent="Linking…";}
  try{ await valdCall("linkAthlete",{teamId:t.id,valdTenantId:tenant,valdProfileId:profile,playerUserId:member.user_id}); loadVald(t,member); }
  catch(e){ if(st){st.style.color="#ff8b8b";st.textContent=e.message;} }
}
async function unlinkVald(t,member,tenant,profile){
  try{ await valdCall("unlinkAthlete",{teamId:t.id,valdTenantId:tenant,valdProfileId:profile}); loadVald(t,member); }
  catch(e){ alert(e.message); }
}
async function sendFileToPlayer(t,member,file){
  const st=$("#sendStatus");st.style.color="var(--muted)";st.textContent=`Uploading ${file.name}…`;
  try{ const sign=await coachCall("signCoachUpload",{teamId:t.id,playerId:member.user_id,filename:file.name});
    const up=await fetch(sign.url,{method:"PUT",headers:{"Content-Type":file.type||"application/octet-stream"},body:file});if(!up.ok)throw new Error("Upload failed.");
    const kind=(file.type||"").startsWith("video")?"video":((file.type||"").startsWith("image")?"image":"file");
    await coachCall("recordCoachFile",{teamId:t.id,playerId:member.user_id,kind,title:file.name,note:"",storagePath:sign.path,mime:file.type,sizeBytes:file.size,coachName:""});
    st.style.color="var(--lime)";st.textContent="Sent to player ✓";openPlayer(t,member);
  }catch(e){st.style.color="#ff8b8b";st.textContent=e.message;}
}
/// Save a coach-entered report through the same rails the iOS import uses:
/// optional artifact -> signCoachUpload -> PUT -> saveCoachSession (which
/// stamps entered_by_role='coach' so the session shows the COACH chip).
async function saveCoachReport(t,member){
  const st=$("#impStatus"), btn=$("#impSave");
  const num=id=>{const v=($(id).value||"").trim();return v===""?null:Number(v);};
  const date=$("#impDate").value||new Date().toISOString().slice(0,10);
  btn.disabled=true; st.style.color=""; st.textContent="Saving…";
  try{
    let reportPath=null, reportKind=null;
    const f=$("#impFile").files[0];
    if(f){
      if(f.size>20*1024*1024)throw new Error("Report file must be under 20MB.");
      st.textContent="Uploading report…";
      const sign=await coachCall("signCoachUpload",{teamId:t.id,playerId:member.user_id,filename:f.name});
      const up=await fetch(sign.url,{method:"PUT",headers:{"Content-Type":f.type||"application/octet-stream"},body:f});
      if(!up.ok)throw new Error("Report upload failed.");
      reportPath=sign.path; reportKind=(f.type||"").includes("pdf")?"pdf":"image";
    }
    st.textContent="Saving session…";
    const session={
      local_id:`coach|web|${member.user_id}|${date}|${Date.now()}`,
      date:new Date(date+"T12:00:00Z").toISOString(),
      kind:$("#impKind").value, source:"Coach import",
      total_pitches:num("#impPitches"), top_velocity:num("#impTop"),
      avg_velocity:num("#impAvg"), overall_strike_pct:num("#impStrike"),
      label:($("#impLabel").value||"").trim()||null,
      notes:($("#impNotes").value||"").trim()||null,
    };
    if(reportPath){session.report_path=reportPath;session.report_bucket="coach-files";session.report_kind=reportKind;}
    await coachCall("saveCoachSession",{teamId:t.id,playerId:member.user_id,session});
    st.style.color="var(--lime)"; st.textContent="Report saved ✓";
    openPlayer(t,member);
  }catch(e){ st.style.color="#ff8b8b"; st.textContent=e.message; }
  btn.disabled=false;
}

async function loadMessages(t,member){
  const box=$("#msgs");if(!box)return;let msgs=[];
  try{const j=await coachCall("listMessages",{teamId:t.id,playerId:member.user_id});msgs=j.messages||[];
    const newest=msgs.filter(m=>m.senderRole==="player").map(m=>m.createdAt||m.created_at).filter(Boolean).sort().pop();
    if(newest)SEEN.set(member.user_id,newest);}
  catch(e){box.innerHTML=`<div class="muted" style="font-size:12.5px">Couldn't load messages.</div>`;return;}
  box.innerHTML=msgs.length?msgs.map(m=>`<div class="msg ${m.senderRole==="coach"?"coach":"player"}"><div class="bub">${esc(m.body)}</div></div>`).join(""):`<div class="muted" style="font-size:12.5px">No messages yet — say hello.</div>`;
}
// ---- Coach direct-edit of a player's workout routine (2026-08-24) ----------
// Writes straight into the player's library via teams-api savePlayerLoadout —
// the athlete's app shows the updated routine on next sync (no install needed).
// Exercise rows use the shared EX_LIB so the coach picks real moves by name.
const EX_IDS=Object.keys(EX_LIB).sort((a,b)=>EX_LIB[a].name.localeCompare(EX_LIB[b].name));
const exOptions=(sel)=>`<option value="">— pick exercise —</option>`+EX_IDS.map(id=>`<option value="${esc(id)}"${id===sel?" selected":""}>${esc(EX_LIB[id].name)}</option>`).join("");
let LE=null; // {team,member,localId,d} editor state
function leBlankRow(){return {moveRef:"",sets:"",reps:"",weight:"",notes:"",block:"A"};}
function openLoadoutEditor(t,member,lo,d){
  LE={team:t,member:member,localId:lo?lo.localId:null,d:d};
  const {body,close}=pgOverlay(lo?`Edit routine — ${nm(member)}`:`New routine — ${nm(member)}`,true);
  LE.close=close;
  const rows=(lo&&(lo.entries||[]).length?lo.entries:[leBlankRow()]).map(e=>({
    moveRef:e.moveRef||"",sets:e.sets!=null?String(e.sets):"",reps:e.reps||"",
    weight:e.targetWeightLbs?String(Math.round(e.targetWeightLbs)):"",notes:e.notes||"",block:e.block||"A"}));
  LE.rows=rows;
  body.innerHTML=`
    <div class="field"><label>Routine name</label><input class="pgin" id="leName" placeholder="e.g. Lower Body — Monday" value="${lo?esc(lo.name||""):""}" style="width:100%;box-sizing:border-box"/></div>
    <div class="field" style="margin-top:8px"><label>Notes (optional)</label><input class="pgin" id="leNotes" placeholder="Shown to the athlete with the routine" value="${lo?esc(lo.notes||""):""}" style="width:100%;box-sizing:border-box"/></div>
    <div class="muted" style="font-size:10px;letter-spacing:.6px;margin:12px 0 4px">EXERCISES</div>
    <div id="leRows"></div>
    <button class="ghost" id="leAdd" style="font-size:11.5px;margin-top:6px">＋ Exercise</button>
    <div class="row" style="gap:8px;margin-top:16px;justify-content:flex-end">
      ${lo?`<button class="ghost" id="leDel" style="color:#ff8b8b">Delete routine</button>`:""}
      <button class="mini" id="leSave" style="padding:9px 18px">${lo?"Save changes":"Add to "+esc(nm(member).split(" ")[0])+"'s library"}</button>
    </div>
    <div class="err" id="leErr" style="min-height:14px"></div>
    <div class="muted" style="font-size:11px">Saves straight into the athlete's app library — they'll see it on next open. Use Assign for a dated program instead.</div>`;
  const paint=()=>{
    const box=body.querySelector("#leRows");box.innerHTML="";
    LE.rows.forEach((r,i)=>{
      const rowEl=document.createElement("div");rowEl.className="pgrow";rowEl.style.cssText="align-items:center;gap:6px";
      rowEl.innerHTML=`<select class="pgin leMove" style="flex:2;min-width:130px">${exOptions(r.moveRef)}</select>
        <input class="pgin leSets" type="number" min="0" placeholder="Sets" value="${esc(r.sets)}" style="flex:0 0 56px"/>
        <input class="pgin leReps" placeholder="Reps" value="${esc(r.reps)}" style="flex:0 0 64px"/>
        <input class="pgin leWt" type="number" min="0" placeholder="lb" value="${esc(r.weight)}" style="flex:0 0 60px"/>
        <input class="pgin leBlock" placeholder="Blk" value="${esc(r.block)}" style="flex:0 0 46px"/>
        <button class="xmini leX" style="color:#ff8b8b">✕</button>`;
      const bnd=(sel,fn)=>{const el=rowEl.querySelector(sel);el.oninput=()=>fn(el.value);};
      bnd(".leMove",v=>r.moveRef=v);bnd(".leSets",v=>r.sets=v);bnd(".leReps",v=>r.reps=v);bnd(".leWt",v=>r.weight=v);bnd(".leBlock",v=>r.block=v||"A");
      rowEl.querySelector(".leX").onclick=()=>{LE.rows.splice(i,1);if(!LE.rows.length)LE.rows.push(leBlankRow());paint();};
      box.appendChild(rowEl);
    });
  };
  paint();
  body.querySelector("#leAdd").onclick=()=>{LE.rows.push(leBlankRow());paint();};
  const del=body.querySelector("#leDel");
  if(del)del.onclick=async()=>{
    if(!confirm("Remove this routine from "+nm(member)+"'s library?"))return;
    try{await teamsCall("deletePlayerLoadout",{teamId:t.id,playerId:member.user_id,localId:LE.localId});close();openPlayer(t,member);}
    catch(e){body.querySelector("#leErr").textContent=e.message;}
  };
  body.querySelector("#leSave").onclick=async()=>{
    const err=body.querySelector("#leErr");err.textContent="";
    const name=(body.querySelector("#leName").value||"").trim();
    if(!name){err.textContent="Give the routine a name.";return;}
    const entries=LE.rows.filter(r=>r.moveRef).map((r,i)=>({moveRef:r.moveRef,moveName:EX_LIB[r.moveRef]?.name||"",position:i,sets:parseInt(r.sets)||0,reps:r.reps||"",targetWeightLbs:parseFloat(r.weight)||0,notes:r.notes||"",block:(r.block||"A").toUpperCase().slice(0,2)}));
    if(!entries.length){err.textContent="Add at least one exercise.";return;}
    const btn=body.querySelector("#leSave");btn.disabled=true;btn.textContent="Saving…";
    try{
      await teamsCall("savePlayerLoadout",{teamId:t.id,playerId:member.user_id,localId:LE.localId,name,notes:(body.querySelector("#leNotes").value||"").trim(),entries});
      close();openPlayer(t,member);
    }catch(e){err.textContent=e.message;btn.disabled=false;btn.textContent=LE.localId?"Save changes":"Add";}
  };
}
// One-tap "ask to sync" — sessions only reach the coach once the player opens
// the current app and logs/imports, so this sends the nudge as a coach message.
async function nudgeToSync(t,member){
  const first=nm(member).split(" ")[0];
  const body=`Hey ${first} — could you open PlayersLab and log/import your latest sessions (TrackMan or bullpen)? They only show up on my dashboard once you sync them in the app. Thanks!`;
  try{await coachCall("sendMessage",{teamId:t.id,playerId:member.user_id,body});alert("Sent — "+first+" will get the nudge in their messages.");}
  catch(e){alert(e.message);}
}

async function sendMsg(t,member){
  const inp=$("#msgInput");const body=(inp.value||"").trim();if(!body)return;inp.disabled=true;
  try{await coachCall("sendMessage",{teamId:t.id,playerId:member.user_id,body});inp.value="";await loadMessages(t,member);}
  catch(e){alert(e.message);}finally{inp.disabled=false;inp.focus();}
}

const MK={film:null,tool:"pen",color:"#E53845",strokes:[],cur:null,drawing:false,frame:null,dispScale:1,objURL:null,voiceBlob:null,voiceChunks:[],voiceRec:null,voiceExt:"webm",recording:false};
async function toggleVoice(){
  if(MK.recording){ try{MK.voiceRec.stop();}catch(e){} return; }
  try{
    const stream=await navigator.mediaDevices.getUserMedia({audio:true});
    const type=['audio/mp4','audio/webm'].find(t=>window.MediaRecorder&&MediaRecorder.isTypeSupported(t))||'';
    const rec=new MediaRecorder(stream, type?{mimeType:type}:undefined);
    MK.voiceChunks=[];
    rec.ondataavailable=e=>{if(e.data&&e.data.size)MK.voiceChunks.push(e.data);};
    rec.onstop=()=>{ stream.getTracks().forEach(t=>t.stop()); MK.recording=false;
      const mt=rec.mimeType||type||"audio/webm"; MK.voiceBlob=new Blob(MK.voiceChunks,{type:mt});
      MK.voiceExt=mt.includes("mp4")||mt.includes("m4a")?"m4a":"webm";
      $("#mkVoice").textContent="🎙 Re-record"; $("#mkVoiceTag").classList.remove("hidden"); };
    rec.start(); MK.voiceRec=rec; MK.recording=true; $("#mkVoice").textContent="⏹ Stop";
  }catch(e){ $("#mkStatus").textContent="Mic blocked — allow microphone access to record a voice note."; }
}
async function openMarkup(film){ if(!film)return; MK.film=film;MK.strokes=[];MK.cur=null;MK.frame=null;
  $("#markup").classList.remove("hidden");document.body.style.overflow="hidden";
  $("#mkStatus").textContent="";$("#mkNote").value="";$("#mkSend").disabled=true;
  if(MK.recording&&MK.voiceRec){try{MK.voiceRec.stop();}catch(e){}} MK.recording=false;MK.voiceBlob=null;
  $("#mkVoice").textContent="🎙 Voice";$("#mkVoiceTag").classList.add("hidden");
  $("#mkTitle").textContent="Mark up — "+(film.title||film.kind||"Clip");
  const v=$("#mkVideo"),cv=$("#mkCanvas"),cap=$("#mkCapture");
  v.classList.add("hidden");cv.classList.add("hidden");cap.classList.add("hidden");$("#mkTools").classList.add("hidden");
  $("#mkLoading").classList.remove("hidden");$("#mkLoading").textContent="Loading clip…";
  try{ const r=await fetch(film.signedUrl);if(!r.ok)throw new Error("x");const blob=await r.blob();
    if(MK.objURL)URL.revokeObjectURL(MK.objURL);MK.objURL=URL.createObjectURL(blob);
    v.src=MK.objURL;v.classList.remove("hidden");cap.classList.remove("hidden");$("#mkLoading").classList.add("hidden");
  }catch(e){ $("#mkLoading").textContent="Couldn't load this clip in the browser. Try another clip or the app."; }
}
function closeMarkup(){ const v=$("#mkVideo");v.pause();$("#markup").classList.add("hidden");
  document.body.style.overflow=$("#overlay").classList.contains("hidden")?"":"hidden";
  if(MK.objURL){URL.revokeObjectURL(MK.objURL);MK.objURL=null;} }
function captureFrame(){ const v=$("#mkVideo");const w=v.videoWidth,h=v.videoHeight;
  if(!w||!h){$("#mkStatus").textContent="Let the clip load a moment, then try again.";return;}
  MK.frame=document.createElement("canvas");MK.frame.width=w;MK.frame.height=h;MK.frame.getContext("2d").drawImage(v,0,0,w,h);
  const cv=$("#mkCanvas"),stage=$("#mkStage");const maxW=stage.clientWidth-20,maxH=stage.clientHeight-20;
  const scale=Math.min(maxW/w,maxH/h,1);cv.width=Math.round(w*scale);cv.height=Math.round(h*scale);MK.dispScale=w/cv.width;
  v.classList.add("hidden");$("#mkCapture").classList.add("hidden");cv.classList.remove("hidden");$("#mkTools").classList.remove("hidden");
  MK.strokes=[];MK.cur=null;mkRender();$("#mkSend").disabled=false;
}
function mkRender(){const cv=$("#mkCanvas"),ctx=cv.getContext("2d");ctx.clearRect(0,0,cv.width,cv.height);
  if(MK.frame)ctx.drawImage(MK.frame,0,0,cv.width,cv.height);for(const s of MK.strokes)drawStroke(ctx,s,1);if(MK.cur)drawStroke(ctx,MK.cur,1);}
function drawStroke(ctx,s,sc){ctx.strokeStyle=s.color;ctx.lineWidth=Math.max(2.5,4*sc);ctx.lineCap="round";ctx.lineJoin="round";
  if(s.tool==="pen"){const p=s.points;if(p.length<2)return;ctx.beginPath();ctx.moveTo(p[0].x*sc,p[0].y*sc);for(let i=1;i<p.length;i++)ctx.lineTo(p[i].x*sc,p[i].y*sc);ctx.stroke();return;}
  const a=s.start,b=s.end;if(!a||!b)return;
  if(s.tool==="circle"){ctx.beginPath();ctx.ellipse((a.x+b.x)/2*sc,(a.y+b.y)/2*sc,Math.abs(b.x-a.x)/2*sc,Math.abs(b.y-a.y)/2*sc,0,0,Math.PI*2);ctx.stroke();return;}
  ctx.beginPath();ctx.moveTo(a.x*sc,a.y*sc);ctx.lineTo(b.x*sc,b.y*sc);ctx.stroke();
  const ang=Math.atan2(b.y-a.y,b.x-a.x),L=16*sc;ctx.beginPath();ctx.moveTo(b.x*sc,b.y*sc);
  ctx.lineTo(b.x*sc-L*Math.cos(ang-Math.PI/7),b.y*sc-L*Math.sin(ang-Math.PI/7));ctx.moveTo(b.x*sc,b.y*sc);
  ctx.lineTo(b.x*sc-L*Math.cos(ang+Math.PI/7),b.y*sc-L*Math.sin(ang+Math.PI/7));ctx.stroke();}
function mkPoint(e){const cv=$("#mkCanvas"),r=cv.getBoundingClientRect(),t=e.touches?e.touches[0]:e;return {x:(t.clientX-r.left)*(cv.width/r.width),y:(t.clientY-r.top)*(cv.height/r.height)};}
function mkDown(e){if(!MK.frame)return;e.preventDefault();MK.drawing=true;const pt=mkPoint(e);MK.cur=MK.tool==="pen"?{tool:"pen",color:MK.color,points:[pt]}:{tool:MK.tool,color:MK.color,start:pt,end:pt};}
function mkMove(e){if(!MK.drawing)return;e.preventDefault();const pt=mkPoint(e);if(MK.tool==="pen")MK.cur.points.push(pt);else MK.cur.end=pt;mkRender();}
function mkUp(){if(!MK.drawing)return;MK.drawing=false;if(MK.cur)MK.strokes.push(MK.cur);MK.cur=null;mkRender();}
async function mkSend(){ if(!MK.frame){$("#mkStatus").textContent="Capture a frame first.";return;}
  const btn=$("#mkSend");btn.disabled=true;$("#mkStatus").textContent="";
  try{ const out=document.createElement("canvas");out.width=MK.frame.width;out.height=MK.frame.height;
    const octx=out.getContext("2d");octx.drawImage(MK.frame,0,0);for(const s of MK.strokes)drawStroke(octx,s,MK.dispScale);
    const blob=await new Promise(res=>out.toBlob(res,"image/jpeg",0.85));if(!blob)throw new Error("Couldn't render the markup.");
    const t=CURRENT_TEAM,member=CURRENT_MEMBER;
    const sign=await coachCall("signCoachUpload",{teamId:t.id,playerId:member.user_id,filename:"markup.jpg"});if(!sign.url)throw new Error("Couldn't start upload.");
    const up=await fetch(sign.url,{method:"PUT",headers:{"Content-Type":"image/jpeg"},body:blob});if(!up.ok)throw new Error("Upload failed — check your connection.");
    const note=($("#mkNote").value||"").trim();
    await coachCall("recordCoachFile",{teamId:t.id,playerId:member.user_id,kind:"image",title:"Telestration",note,storagePath:sign.path,mime:"image/jpeg",sizeBytes:blob.size,coachName:""});
    if(note)await coachCall("recordCoachFile",{teamId:t.id,playerId:member.user_id,kind:"note",title:"Coach note",note,storagePath:"",mime:"",sizeBytes:0,coachName:""});
    if(MK.voiceBlob){ const vt=MK.voiceBlob.type||"audio/m4a";
      const vs=await coachCall("signCoachUpload",{teamId:t.id,playerId:member.user_id,filename:"voice."+MK.voiceExt});
      if(vs.url){ const vu=await fetch(vs.url,{method:"PUT",headers:{"Content-Type":vt},body:MK.voiceBlob});
        if(vu.ok) await coachCall("recordCoachFile",{teamId:t.id,playerId:member.user_id,kind:"audio",title:"Voice note",note:"",storagePath:vs.path,mime:vt,sizeBytes:MK.voiceBlob.size,coachName:""}); } }
    if(MK.film.id){try{await coachCall("markFilmReviewed",{teamId:t.id,playerId:member.user_id,filmId:MK.film.id});}catch(e){}}
    closeMarkup();openPlayer(t,member);
  }catch(e){$("#mkStatus").textContent=e.message;btn.disabled=false;}
}

document.querySelectorAll(".tab").forEach(b=>b.onclick=()=>setTab(b.dataset.tab));
$("#mkClose").onclick=closeMarkup;$("#mkCapture").onclick=captureFrame;$("#mkSend").onclick=mkSend;$("#mkVoice").onclick=toggleVoice;
$("#mkClear").onclick=()=>{MK.strokes=[];MK.cur=null;mkRender();};
$("#mkRetake").onclick=()=>{const v=$("#mkVideo");$("#mkCanvas").classList.add("hidden");$("#mkTools").classList.add("hidden");v.classList.remove("hidden");$("#mkCapture").classList.remove("hidden");$("#mkSend").disabled=true;};
document.querySelectorAll("#mkTools .toolb[data-tool]").forEach(b=>b.onclick=()=>{MK.tool=b.dataset.tool;document.querySelectorAll("#mkTools .toolb[data-tool]").forEach(x=>x.classList.toggle("on",x===b));});
document.querySelectorAll("#mkTools .sw").forEach(s=>s.onclick=()=>{MK.color=s.dataset.color;document.querySelectorAll("#mkTools .sw").forEach(x=>x.classList.toggle("on",x===s));});
(()=>{const cv=$("#mkCanvas");cv.addEventListener("mousedown",mkDown);window.addEventListener("mousemove",mkMove);window.addEventListener("mouseup",mkUp);
  cv.addEventListener("touchstart",mkDown,{passive:false});cv.addEventListener("touchmove",mkMove,{passive:false});cv.addEventListener("touchend",mkUp);})();
$("#loginForm").addEventListener("submit",async e=>{e.preventDefault();const btn=$("#loginBtn"),err=$("#loginErr");err.textContent="";btn.disabled=true;btn.textContent="Signing in…";
  try{await login($("#email").value.trim(),$("#password").value);await loadDashboard();}catch(ex){err.textContent=ex.message;}finally{btn.disabled=false;btn.textContent="Sign in";}});
$("#forgotLink").onclick=async e=>{e.preventDefault();const err=$("#loginErr");const email=($("#email").value||"").trim();
  if(!email){err.textContent="Type your email above first, then tap Forgot password.";return;}
  try{await fetch(`${SUPABASE_URL}/auth/v1/recover`,{method:"POST",headers:{apikey:ANON,"Content-Type":"application/json"},body:JSON.stringify({email})});
    err.style.color="var(--lime)";err.textContent="Reset code sent. Open the PlayersLab app \u2192 Forgot Password to set a new password, then sign in here with it.";
  }catch(ex){err.textContent="Couldn't send the reset email — try again.";}};
$("#signOut").onclick=signOut;$("#closePlayer").onclick=closePlayer;
$("#overlay").addEventListener("click",e=>{if(e.target.id==="overlay")closePlayer();});
(async()=>{try{REFRESH=localStorage.getItem("pl_refresh");}catch(e){}if(REFRESH&&await refreshToken()){try{await loadDashboard();}catch(e){signOut();}}})();
</script>
</body>
</html>
cript>
</body>
</html>
cript>
</body>
</html>
</html>
