:root{--paper:#f6f4ee;--surface:#fff;--ink:#22262e;--muted:#6d7280;--line:#dedbd2;--accent:#2f6f45;--error:#b23a2e;--light-square:#edf0e3;--dark-square:#839c83;--radius:10px;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,sans-serif;color:var(--ink);background:var(--paper)}
*{box-sizing:border-box}
body{margin:0;min-height:100svh;background:var(--paper)}
[hidden]{display:none!important}
button,input,select{font:inherit}
button{cursor:pointer}
a{color:var(--accent)}
.primary{background:var(--accent);color:#fff;border:0;border-radius:var(--radius);padding:12px 18px;font-weight:650;min-height:46px}
.outline{background:var(--surface);color:var(--ink);border:1px solid var(--line);border-radius:var(--radius);padding:9px 14px;min-height:40px}
.text-button{background:none;border:0;color:var(--accent);padding:8px}
.danger{color:var(--error)}
.muted{color:var(--muted)}
.error{color:var(--error)}
.toast{position:fixed;bottom:24px;left:50%;transform:translateX(-50%);background:#22262e;color:#fff;padding:12px 18px;border-radius:8px;z-index:100;max-width:min(90vw,480px)}
dialog{border:1px solid var(--line);border-radius:14px;padding:20px;max-width:min(92vw,460px)}
dialog::backdrop{background:#0006}
label{display:grid;gap:6px;font-weight:600}
input,select{border:1px solid var(--line);border-radius:8px;padding:10px 12px;background:#fff;min-height:44px;min-width:0}

/* Board */
.board-frame{position:relative;width:100%}
.board{display:grid;grid-template-columns:repeat(8,1fr);aspect-ratio:1;width:100%;border-radius:4px;overflow:hidden;box-shadow:0 3px 12px #0002;user-select:none;-webkit-user-select:none;touch-action:none}
.square{position:relative;display:flex;align-items:center;justify-content:center;aspect-ratio:1;min-width:0;min-height:0;border:0;padding:0;border-radius:0;background:var(--light-square)}
.square.dark{background:var(--dark-square)}
.square.selected{background:#cbd579}
.square.last-move{background:#d4dfa3}
.square.dark.last-move{background:#a9bd77}
.square.flash-right{background:#7fd18b!important}
.square.flash-wrong{background:#e07a6a!important}
.square img{width:88%;height:88%;object-fit:contain;pointer-events:none;filter:drop-shadow(0 1px 1px #0003)}
.square.dragging img{opacity:.25}
.square .coord{position:absolute;font:600 11px ui-monospace,monospace;color:#73866e;line-height:1;pointer-events:none}
.square.dark .coord{color:#edf0e3}
.rank-coord{top:4px;left:4px}
.file-coord{right:4px;bottom:3px}
.square.legal-target:after{content:"";width:22%;height:22%;border-radius:50%;position:absolute;background:#293e3140}
.square.legal-target:has(img):after{width:88%;height:88%;background:none;border:5px solid #293e3140}
.board.locked{filter:grayscale(.6) brightness(.92)}
.board-arrows{position:absolute;inset:0;width:100%;height:100%;pointer-events:none}
.arrow-right{fill:#2f8f4e;fill-opacity:.75}
.arrow-wrong{fill:#c0392b;fill-opacity:.75}
.drag-ghost{position:fixed;pointer-events:none;z-index:50;filter:drop-shadow(0 4px 6px #0004)}
.promotion-choices{display:flex;gap:6px;margin:12px 0}
.promotion-choices button{padding:4px;border:1px solid var(--line);border-radius:8px;background:#fff}
.promotion-choices img{width:56px;height:56px}

/* Child's page */
.play-header{display:flex;justify-content:space-between;align-items:center;gap:10px;padding:10px 16px;background:var(--surface);border-bottom:1px solid var(--line)}
.who{display:flex;align-items:center;gap:10px;font-size:20px;min-width:0}
.who strong{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.team-chip{--team:#8a8f98;background:var(--team);color:#fff;font-weight:700;padding:5px 10px;border-radius:999px;font-size:15px;white-space:nowrap}
.team-chip:empty{display:none}
.play-stats{display:flex;gap:14px;align-items:center;font-size:18px;font-weight:650;white-space:nowrap}
.clock{font-variant-numeric:tabular-nums;font-size:24px}
.play-main{padding:12px 16px 24px;display:flex;flex-direction:column;align-items:center}
.play-area{width:min(100%,calc(100svh - 190px),720px)}
.task-line{display:flex;justify-content:space-between;align-items:baseline;flex-wrap:wrap;gap:4px 10px;margin:4px 0 8px;font-size:20px}
.note{margin:0 0 8px;padding:8px 12px;background:#fff6d8;border-radius:8px}
.board-wrap{position:relative}
.lock-overlay{position:absolute;inset:0;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:4px;background:#0005;color:#fff;font-size:22px;border-radius:4px;z-index:6}
.lock-overlay strong{font-size:72px;line-height:1}
.points-bubble{position:absolute;left:50%;top:40%;font-size:64px;font-weight:800;z-index:7;pointer-events:none;animation:float-up 1.1s ease-out forwards;text-shadow:0 2px 8px #0004}
.points-bubble.plus{color:#2f8f4e}
.points-bubble.minus{color:#c0392b}
@keyframes float-up{from{opacity:0;transform:translate(-50%,-30%) scale(.7)}20%{opacity:1;transform:translate(-50%,-50%) scale(1.1)}to{opacity:0;transform:translate(-50%,-120%) scale(1)}}
.message{font-size:24px;text-align:center;margin:18vh 0 0;max-width:560px}
.connection{position:fixed;bottom:16px;left:50%;transform:translateX(-50%);background:var(--error);color:#fff;padding:10px 16px;border-radius:999px;white-space:nowrap}

/* Join page */
.join-page{display:grid;place-items:center;padding:16px}
.join-card{width:min(100%,420px);background:var(--surface);border-radius:16px;padding:24px;box-shadow:0 6px 24px #0001;border-top:8px solid var(--team,var(--accent))}
.join-card h1{margin:4px 0 18px}
.join-card form{display:grid;gap:16px}
.eyebrow{margin:0;color:var(--muted);font-weight:650}

/* Admin */
.login-card{width:min(100% - 32px,400px);margin:12vh auto;background:var(--surface);padding:24px;border-radius:16px;box-shadow:0 6px 24px #0001}
.login-card form{display:grid;gap:14px}
.admin-header{display:flex;justify-content:space-between;align-items:center;gap:12px;padding:12px 16px;background:var(--surface);border-bottom:1px solid var(--line);position:sticky;top:0;z-index:10}
.admin-header nav{display:flex;gap:12px;align-items:center}
.admin-header a{font-weight:650}
.admin-main{display:grid;gap:16px;padding:16px;max-width:1100px;margin:0 auto}
.panel{background:var(--surface);border-radius:14px;padding:16px;box-shadow:0 2px 10px #0000000d;min-width:0}
.panel h2{margin:0 0 12px}
.panel h3{margin:18px 0 8px;font-size:16px}
.competition-head{display:flex;flex-wrap:wrap;gap:10px;align-items:center;font-size:20px;margin-bottom:12px}
.status{font-size:13px;padding:4px 10px;border-radius:999px;background:#eee}
.status-running{background:#d9f2df;color:#1d6b34}
.status-draft{background:#fff1cc;color:#7a5b00}
.settings{display:grid;grid-template-columns:repeat(auto-fit,minmax(150px,1fr));gap:12px}
.team-choice,.set-choice{border:1px solid var(--line);border-radius:10px;margin:12px 0 0;padding:10px 12px;display:flex;flex-wrap:wrap;gap:12px}
.radio{display:flex;gap:8px;align-items:center;font-weight:500}
.radio input{min-height:auto}
.form-actions,.dialog-actions{display:flex;flex-wrap:wrap;gap:10px;margin-top:14px;align-items:center}
a.outline{text-decoration:none;display:inline-flex;align-items:center}
.start{background:#2f8f4e}
.stop{background:var(--error)}
.plain-list{list-style:none;margin:0;padding:0;display:grid;gap:6px}
.plain-list li{display:flex;justify-content:space-between;align-items:center;border-bottom:1px solid var(--line);padding:6px 0}
.table-wrap{overflow-x:auto}
table.players{width:100%;border-collapse:collapse;font-size:15px}
.players th,.players td{text-align:left;padding:8px 6px;border-bottom:1px solid var(--line);white-space:nowrap}
.players td:last-child{display:flex;gap:6px}
.players select{min-height:36px;padding:4px 8px}
.own-points{font-weight:700;color:var(--accent)}
.small{min-height:34px;padding:5px 10px;font-size:14px}
.inline-form{display:flex;gap:10px;flex-wrap:wrap;margin-bottom:14px}
.inline-form input{flex:1 1 200px}
.teams{display:grid;grid-template-columns:repeat(auto-fill,minmax(min(100%,260px),1fr));gap:12px}
.team-card{border:1px solid var(--line);border-left:8px solid var(--team);border-radius:12px;padding:12px;display:grid;grid-template-columns:minmax(0,1fr);gap:8px;min-width:0}
.team-card p{margin:0}
.team-edit{display:flex;gap:8px}
.team-edit input[type=color]{width:46px;padding:2px;flex:none}
.team-edit input:not([type=color]){flex:1}
.join-link{word-break:break-all;font-family:ui-monospace,monospace;font-size:14px}
.team-tools{display:flex;gap:8px;flex-wrap:wrap}
.qr{width:220px;height:220px;background:#fff;shape-rendering:crispEdges}
.qr path{fill:#000}
.dialog-form{display:grid;gap:12px}
.dialog-form h2{margin:0}
.two{display:grid;grid-template-columns:1fr 1fr;gap:10px}

/* Big screen */
.screen-page{background:linear-gradient(#bfe6ff,#e9f6ff 40%,#d8efd0);min-height:100svh;overflow-x:hidden}
.screen-header{display:flex;justify-content:space-between;align-items:center;gap:16px;padding:2vh 3vw}
.screen-header h1{margin:0;font-size:clamp(26px,4vw,64px)}
.screen-clock{font-size:clamp(36px,7vw,120px);font-weight:800;font-variant-numeric:tabular-nums}
.track{display:grid;gap:2.5vh;padding:0 3vw 3vh}
.lane{--team:#888;display:grid;grid-template-columns:minmax(110px,22vw) 1fr;gap:4px 2vw;align-items:center}
.lane-label{display:grid;gap:2px;color:var(--team);font-size:clamp(18px,2.2vw,38px);font-weight:800;min-width:0}
.lane-label span{color:var(--ink);font-size:.7em;font-weight:650}
.road{position:relative;height:clamp(64px,11vh,140px);background:repeating-linear-gradient(90deg,#fff 0 40px,transparent 40px 80px) center/100% 4px no-repeat,#4a4f57;border-radius:14px;box-shadow:inset 0 0 0 6px var(--team)}
.start-line{position:absolute;left:20%;top:0;bottom:0;width:8px;background:repeating-linear-gradient(#fff 0 10px,#222 10px 20px)}
.car{position:absolute;bottom:8%;height:80%;aspect-ratio:2/1;transform:translateX(-50%);transition:left .9s cubic-bezier(.3,1.4,.5,1);color:var(--team);z-index:2}
.car svg{width:100%;height:100%;overflow:visible}
.car-body{fill:currentColor;stroke:#0005;stroke-width:2}
.car-window{fill:#dff3ff}
.car-wheel{fill:#1d1f23}
.car-hub{fill:#c9ccd1}
.car.boost{animation:hop .6s ease-out}
.car.boost:after{content:"★ ★";position:absolute;right:-30%;top:-30%;color:#ffd23f;font-size:clamp(20px,3vw,48px);animation:rise 1.1s ease-out forwards}
.car.smoke:before{content:"";position:absolute;left:-35%;bottom:10%;width:40%;height:60%;border-radius:50%;background:radial-gradient(circle,#9aa0a6 0 40%,transparent 41%) 0 50%/45% 70% repeat-x;animation:puff 1.1s ease-out forwards}
@keyframes hop{0%{translate:0 0}40%{translate:0 -25%}100%{translate:0 0}}
@keyframes rise{from{opacity:1;transform:translateY(0)}to{opacity:0;transform:translateY(-60%)}}
@keyframes puff{from{opacity:.9;transform:scale(.6)}to{opacity:0;transform:scale(1.4) translateX(-30%)}}
.lane-players{grid-column:2;font-size:clamp(14px,1.6vw,26px);color:var(--muted)}
.lane-players:empty{display:none}
.screen-message{font-size:32px;text-align:center;margin:20vh 16px 0}
.final{position:fixed;inset:6vh 6vw;background:#fffffff2;border-radius:24px;box-shadow:0 20px 60px #0003;padding:4vh 4vw;overflow:auto;z-index:20}
.final h2{text-align:center;font-size:clamp(30px,5vw,80px);margin:0 0 3vh}
.final-columns{display:grid;grid-template-columns:repeat(auto-fit,minmax(min(100%,240px),1fr));gap:3vw}
.final-team h3{color:var(--team);font-size:clamp(22px,2.6vw,44px);margin:0 0 1vh}
.final-team ol{font-size:clamp(18px,2vw,34px);line-height:1.5;margin:0;padding-left:1.4em}

/* Report */
.report-main{max-width:1000px;margin:0 auto;padding:16px;display:grid;gap:14px}
.report{display:grid;gap:14px}
.report-card h2{margin:0}
.report-card p{margin:4px 0 10px}
.report-table{width:100%;border-collapse:collapse;font-size:15px}
.report-table th,.report-table td{text-align:left;padding:8px 6px;border-bottom:1px solid var(--line);white-space:nowrap}
.report-table tbody tr{cursor:pointer}
.report-table tbody tr:hover,.report-table tbody tr:focus{background:#f3f6f0;outline:none}
.report-table .status-unsolved td:nth-child(3){color:var(--error);font-weight:650}
.report-table .status-solved td:nth-child(3){color:var(--accent);font-weight:650}
.viewer{width:min(100% - 32px,520px)}
.viewer h2{font-size:18px;margin:0 0 10px}
.viewer-steps{display:grid;gap:2px;padding-left:24px}
.step-wrong{color:var(--error)}
.step-right{color:var(--accent)}
.viewer-steps .active{text-decoration:underline;font-weight:700}
