:root{--bg: #f2f5f8;--surface: #ffffff;--surface-muted: #eef2f6;--text: #15202b;--muted: #56657a;--border: #cfd8e3;--accent: #175cd3;--accent-text: #ffffff;--focus: #b54708;--danger-bg: #fdecea;--danger-border: #b42318;--warn-bg: #fff4ce;--warn-border: #b54708;--team-colour-0: #175cd3;--team-colour-1: #c2410c;--court-surface: #7aa06b;--court-line: #ffffff;--radius: 10px;--space: 1rem;--tap: 2.75rem;font-family:system-ui,-apple-system,Segoe UI,Roboto,sans-serif;color:var(--text);background:var(--bg);line-height:1.5}*{box-sizing:border-box}body{margin:0}.app{max-width:1120px;margin:0 auto;padding:var(--space) .75rem 3rem}.app-header h1{margin:.5rem 0 .25rem;font-size:1.75rem}.app-header p{margin:0;max-width:60ch}h2{margin:0 0 .5rem;font-size:1.3rem}h3{margin:1.5rem 0 .5rem;font-size:1.05rem}.muted{color:var(--muted);font-size:.9rem}code{background:var(--surface-muted);border-radius:4px;padding:.05rem .3rem;font-size:.85em}.stepper ol{display:flex;flex-wrap:wrap;gap:.4rem;list-style:none;margin:1rem 0;padding:0}.stepper button{display:inline-flex;align-items:center;gap:.4rem;min-height:var(--tap);padding:.35rem .7rem;border:1px solid var(--border);border-radius:999px;background:var(--surface);color:var(--text);font:inherit;cursor:pointer}.stepper button.current{border-color:var(--accent);box-shadow:inset 0 0 0 2px var(--accent);font-weight:600}.stepper button:disabled{cursor:not-allowed;color:var(--muted);background:var(--surface-muted)}.step-number{display:inline-grid;place-items:center;width:1.4rem;height:1.4rem;border-radius:50%;background:var(--surface-muted);font-size:.8rem;font-weight:700}.stepper button.current .step-number{background:var(--accent);color:var(--accent-text)}.panel{background:var(--surface);border:1px solid var(--border);border-radius:var(--radius);padding:var(--space)}.fieldset{border:1px solid var(--border);border-radius:var(--radius);padding:.75rem;margin:0 0 var(--space)}.fieldset legend{padding:0 .35rem;font-weight:600}.radio-row{display:flex;flex-wrap:wrap;gap:.75rem}.radio{display:inline-flex;align-items:center;gap:.5rem;min-height:var(--tap);padding:.35rem .7rem;border:1px solid var(--border);border-radius:var(--radius);cursor:pointer}.radio input{width:1.15rem;height:1.15rem}.teams{display:grid;grid-template-columns:1fr;gap:var(--space)}.team-card{border:1px solid var(--border);border-left:5px solid var(--team-colour-0);border-radius:var(--radius);padding:.75rem;margin:0}.team-card:nth-child(2){border-left-color:var(--team-colour-1)}.team-card legend{padding:0 .35rem;font-weight:600}.field{display:block;margin-bottom:.7rem}.field>span{display:block;font-size:.9rem;font-weight:600;margin-bottom:.25rem}input[type=text],input[type=file],select{width:100%;min-height:var(--tap);padding:.4rem .6rem;border:1px solid var(--border);border-radius:8px;background:var(--surface);color:var(--text);font:inherit}.actions{display:flex;flex-wrap:wrap;gap:.6rem;margin-top:var(--space)}button{font:inherit}.actions button,.actions a{min-height:var(--tap);padding:.5rem 1rem;border:1px solid var(--border);border-radius:8px;background:var(--surface);color:var(--text);cursor:pointer}.actions button.primary{background:var(--accent);border-color:var(--accent);color:var(--accent-text);font-weight:600}.actions button:disabled{opacity:.6;cursor:not-allowed}button:focus-visible,input:focus-visible,select:focus-visible,summary:focus-visible,video:focus-visible{outline:3px solid var(--focus);outline-offset:2px}.status{margin:.75rem 0;padding:.6rem .75rem;border-radius:var(--radius);background:var(--surface-muted)}.progress{width:100%;height:.9rem}.errors{margin:.75rem 0;padding:.6rem .75rem;border:1px solid var(--danger-border);border-radius:var(--radius);background:var(--danger-bg)}.errors ul,.warnings{margin:.25rem 0 0;padding-left:1.2rem}.errors p{margin:.2rem 0}.warnings{border-left:4px solid var(--warn-border);padding:.5rem 1.2rem;background:var(--warn-bg);border-radius:var(--radius)}.banner{margin:0 0 var(--space);padding:.9rem 1rem;border-radius:var(--radius)}.banner-warning{border:3px solid var(--warn-border);background:var(--warn-bg)}.banner-warning strong{display:block;font-size:1.1rem;margin-bottom:.25rem}.banner-warning p{margin:0}.facts{display:grid;grid-template-columns:1fr;gap:.5rem 1rem;margin:var(--space) 0}.facts>div{border-left:3px solid var(--border);padding-left:.6rem}.facts dt{font-size:.8rem;text-transform:uppercase;letter-spacing:.03em;color:var(--muted)}.facts dd{margin:0;font-weight:600}.table-wrap{overflow-x:auto}table{border-collapse:collapse;width:100%;min-width:34rem}caption{text-align:left;padding-bottom:.4rem}th,td{text-align:left;padding:.45rem .6rem;border-bottom:1px solid var(--border);white-space:nowrap}thead th{background:var(--surface-muted);font-size:.85rem}.preview{position:relative;border:1px solid var(--border);border-radius:var(--radius);overflow:hidden;background:#000}.preview-image{display:block;width:100%;height:auto;cursor:crosshair}.preview-overlay{position:absolute;inset:0;width:100%;height:100%;pointer-events:none}.thumbnail{max-width:100%;border-radius:var(--radius);border:1px solid var(--border)}.marker circle{stroke:#fff;stroke-width:.18}.marker.team-0 circle,.team-dot.team-0,.marker.team-0 text,.trace.team-0{fill:var(--team-colour-0)}.marker.team-1 circle,.team-dot.team-1,.marker.team-1 text,.trace.team-1{fill:var(--team-colour-1)}.marker-label{paint-order:stroke;stroke:#000;stroke-width:.12;stroke-linejoin:round}.calibration-layout{display:grid;grid-template-columns:1fr;gap:var(--space)}.calibration-controls h3:first-of-type{margin-top:1rem}.landmark-list{margin:0;padding-left:1.2rem}.landmark-list li{display:flex;justify-content:space-between;gap:.5rem;padding:.2rem 0}.landmark-list li.active{font-weight:700}.landmark-list li.placed>span:last-child{color:var(--accent)}.chips{display:flex;flex-wrap:wrap;gap:.4rem}.chip{min-height:var(--tap);padding:.35rem .7rem;border:1px solid var(--border);border-radius:999px;background:var(--surface);cursor:pointer}.chip.active{border-color:var(--accent);box-shadow:inset 0 0 0 2px var(--accent);font-weight:600}.chip.placed{background:var(--surface-muted);color:var(--muted);cursor:default}.chip:disabled{opacity:.55;cursor:not-allowed}.team-dot{display:inline-block;width:.7rem;height:.7rem;border-radius:50%;background:var(--team-colour-0)}.team-dot.team-0{background:var(--team-colour-0)}.team-dot.team-1{background:var(--team-colour-1)}.replay-grid{display:grid;grid-template-columns:1fr;gap:var(--space)}.video{width:100%;border-radius:var(--radius);background:#000}.court{width:100%;max-height:70vh;background:var(--surface-muted);border-radius:var(--radius)}.court-surface{fill:var(--court-surface);stroke:#35502c;stroke-width:.08}.court-line{stroke:var(--court-line);stroke-width:.06}.court-net{stroke-width:.14}.trace{fill:none;stroke-width:.07;stroke-opacity:.55;stroke-linecap:round}.trace.team-0{stroke:var(--team-colour-0)}.trace.team-1{stroke:var(--team-colour-1)}.court .marker text.court-marker-label{fill:#fff;text-anchor:middle;dominant-baseline:central;font-weight:700}.legend{list-style:none;padding:0;margin:.6rem 0;display:flex;flex-direction:column;gap:.3rem}.legend li{display:flex;align-items:center;gap:.4rem}.heatmap{max-width:100%;border:1px solid var(--border);border-radius:var(--radius)}.legend-flags li{display:list-item}.summary{margin-top:var(--space)}@media(min-width:760px){.app{padding-inline:1.5rem}.teams{grid-template-columns:1fr 1fr}.facts{grid-template-columns:repeat(3,minmax(0,1fr))}.calibration-layout,.replay-grid{grid-template-columns:minmax(0,1.1fr) minmax(0,1fr);align-items:start}}
