:root{--ink: #0b0d0e;--shade: #141a17;--green: #1f3b2c;--forest: #2b3d2e;--leaf: #7e9a78;--clay: #c56b45;--clay-deep: #9c4a2f;--roof: #c95644;--cream: #f3ead7;--paper: #eadfc8;--ochre: #d9b16a;--muted: rgba(243, 234, 215, .58);--line: rgba(243, 234, 215, .13);--line-strong: rgba(243, 234, 215, .24);--glass: rgba(16, 23, 19, .62);--glass-deep: rgba(16, 23, 19, .82);--font-display: "Fraunces", "Iowan Old Style", Georgia, serif;--font-ui: "Instrument Sans", "Helvetica Neue", Arial, sans-serif;--font-mono: "IBM Plex Mono", ui-monospace, "Cascadia Mono", monospace}*{box-sizing:border-box}html,body{margin:0;width:100%;height:100%;overflow:hidden;background:#101713;color:var(--cream);font-family:var(--font-ui);-webkit-font-smoothing:antialiased;-webkit-tap-highlight-color:transparent}body{overscroll-behavior:none;touch-action:manipulation}button{font:inherit}#app{position:relative;width:100%;height:100%;overflow:hidden;background:radial-gradient(circle at 50% 42%,#27332b,#171f1a 62%,#0e1311)}#stage{position:absolute;inset:0;display:grid;place-items:center;overflow:hidden}#game-canvas{display:block;max-width:100%;max-height:100%;image-rendering:pixelated;image-rendering:crisp-edges;cursor:grab;touch-action:none}#game-canvas.is-orbiting{cursor:grabbing}#ui{position:absolute;inset:0;pointer-events:none;z-index:5}.hud{position:absolute;inset:0;pointer-events:none;user-select:none}.hud button{pointer-events:auto;cursor:pointer}.topbar,.scorecard,.ladder-card{pointer-events:auto}.topbar{position:absolute;top:22px;left:26px;right:26px;display:flex;align-items:flex-start;justify-content:space-between;gap:18px;transition:opacity .22s ease}.brand-block{display:flex;flex-direction:column;gap:7px;min-width:0}.eyebrow{display:flex;align-items:center;gap:7px;overflow:hidden;font-family:var(--font-mono);font-size:8px;font-weight:500;letter-spacing:.17em;text-transform:uppercase;white-space:nowrap;text-overflow:ellipsis;color:#f3ead7b3}.eyebrow:before{content:"";flex:0 0 auto;width:5px;height:5px;border-radius:50%;background:var(--ochre)}.eyebrow-sep{color:#f3ead752}.model-stamp{color:var(--ochre);font-weight:600;letter-spacing:.12em}.eyebrow-club{min-width:0}.wordmark{margin:0;font-family:var(--font-display);font-size:clamp(34px,4.3vw,56px);font-weight:600;font-variation-settings:"opsz" 90;line-height:.84;letter-spacing:-.045em;color:var(--cream);text-transform:uppercase;text-shadow:0 2px 22px rgba(11,13,14,.26)}.wordmark em{font-style:italic;font-weight:500;color:var(--ochre)}.status-bar{display:flex;align-items:center;gap:8px;flex:0 0 auto;margin-top:2px;padding:7px 11px;border:1px solid var(--line);border-radius:999px;background:#0e141061;backdrop-filter:blur(9px);font-family:var(--font-mono);font-size:8.5px;font-weight:500;letter-spacing:.11em;color:#f3ead7c7;line-height:1}.condition{display:inline-flex;align-items:center;justify-content:center;min-height:16px;padding:0;border:0;background:none;color:inherit;font-family:inherit;font-size:inherit;letter-spacing:inherit;white-space:nowrap}.condition.court-condition{color:var(--ochre)}.condition.clock{color:var(--cream);font-variant-numeric:tabular-nums}.condition[data-state=rain]{color:var(--ochre)}.status-sep{color:#f3ead742}.speed-condition{margin-left:1px;padding-left:9px;border-left:1px solid var(--line-strong);color:var(--ochre);font-weight:600;border-radius:0}.speed-condition[aria-pressed=true]{color:var(--cream)}.scorecard{position:absolute;top:102px;left:26px;width:min(398px,35vw);min-width:344px;padding:12px 16px 11px;background:linear-gradient(180deg,#101713c7,#10171394);border:1px solid var(--line);border-radius:2px;box-shadow:0 22px 55px #00000029;backdrop-filter:blur(12px);transition:opacity .22s ease}.scorecard:before{content:"";position:absolute;top:-1px;left:16px;width:34px;height:1px;background:var(--clay)}.scorecard-head{display:flex;align-items:baseline;justify-content:space-between;gap:10px;padding-bottom:8px;font-family:var(--font-mono);font-size:7.5px;font-weight:500;letter-spacing:.14em;text-transform:uppercase}.phase-wrap{display:inline-flex;align-items:center;gap:6px;min-width:0}.live-dot{flex:0 0 auto;width:4px;height:4px;border-radius:50%;background:var(--clay);box-shadow:0 0 0 3px #c56b451f}.phase{overflow:hidden;white-space:nowrap;text-overflow:ellipsis;color:var(--ochre)}.server-read{flex:0 0 auto;color:var(--muted);letter-spacing:.09em;text-align:right}.score-head{display:grid;grid-template-columns:8px minmax(0,1fr) 30px 34px 44px 66px;column-gap:8px;padding:0 0 5px;border-bottom:1px solid var(--line);font-family:var(--font-mono);font-size:6.5px;letter-spacing:.13em;color:#f3ead766}.score-head span:first-child{grid-column:1 / 3;padding-left:16px}.score-head span:nth-child(2),.score-head span:nth-child(3),.score-head span:nth-child(4),.score-head span:nth-child(5){text-align:center}.team-row{display:grid;grid-template-columns:8px minmax(0,1fr) 30px 34px 44px 66px;grid-template-rows:auto;column-gap:8px;align-items:center;padding:7px 0 6px;border-bottom:1px solid rgba(243,234,215,.07)}.team-row:last-of-type{border-bottom:0}.team-row.is-serving{background:linear-gradient(90deg,rgba(217,177,106,.09),transparent 72%)}.serving-pip{grid-column:1;grid-row:1;align-self:stretch;display:flex;align-items:center;color:var(--ochre);font-size:7px;line-height:1}.player-id{grid-column:2;grid-row:1;display:flex;flex-direction:column;gap:2px;min-width:0}.team-name{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-family:var(--font-display);font-size:20px;font-weight:600;font-variation-settings:"opsz" 40;letter-spacing:.01em;line-height:1.02;color:var(--cream)}.team-style{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-family:var(--font-mono);font-size:6.5px;letter-spacing:.1em;color:#f3ead775;text-transform:uppercase}.stat{display:flex;align-items:center;justify-content:center;grid-row:1}.stat.sets{grid-column:3}.stat.games{grid-column:4}.stat.points{grid-column:5}.stat b{font-family:var(--font-display);font-size:21px;font-weight:500;font-variation-settings:"opsz" 24;line-height:1;color:var(--cream)}.stat.points b{color:var(--ochre);font-size:23px}.set-scores{grid-column:6;grid-row:1;min-width:0;overflow:hidden;white-space:nowrap;text-align:right;font-family:var(--font-mono);font-size:7px;letter-spacing:.09em;color:#f3ead76b}.call-strip{display:grid;grid-template-columns:minmax(0,1fr) auto;align-items:end;gap:8px 10px;padding:10px 0 8px;border-top:1px solid var(--line)}.call-block{display:flex;flex-direction:column;gap:3px;min-width:0}.call{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-family:var(--font-display);font-size:25px;font-weight:500;font-variation-settings:"opsz" 72;line-height:1;letter-spacing:-.015em;color:var(--cream)}.call.bump{animation:call-bump .32s ease-out}@keyframes call-bump{0%{transform:translateY(2px);opacity:.45}55%{transform:translateY(0)}to{transform:translateY(0);opacity:1}}.detail{min-height:9px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-family:var(--font-mono);font-size:7px;font-weight:500;letter-spacing:.1em;text-transform:uppercase;color:var(--clay)}.rally-block{display:flex;flex-direction:column;align-items:flex-end;gap:2px;padding-bottom:1px;font-family:var(--font-mono);font-size:6px;letter-spacing:.13em;color:#f3ead76b}.rally-block b{font-family:var(--font-display);font-size:16px;font-weight:500;line-height:1;color:var(--cream)}.point-trail{grid-column:1 / -1;display:flex;align-items:center;gap:4px;min-height:5px;padding-top:1px}.point-trail i{display:block;width:5px;height:5px;border-radius:50%}.trail-point.side-0{background:var(--clay)}.trail-point.side-1{background:var(--ochre)}.trail-blank{background:#f3ead729}.serve-strip{display:grid;grid-template-columns:auto minmax(0,1fr) auto;align-items:center;gap:9px;padding-top:9px;border-top:1px solid var(--line);font-family:var(--font-mono);font-size:6.5px;letter-spacing:.12em;color:#f3ead775}.serve-label{white-space:nowrap}.serve-meter{height:2px;overflow:hidden;background:#f3ead71a}.serve-meter i{display:block;width:0;height:100%;background:var(--ochre);transition:width .24s ease}.serve-strip b{min-width:60px;text-align:right;color:var(--cream);font-weight:500;letter-spacing:.06em}.ladder-card{position:absolute;top:102px;right:26px;width:224px;overflow:hidden;background:var(--paper);color:var(--ink);border:1px solid rgba(20,26,23,.26);border-radius:2px;box-shadow:0 22px 55px #0000002e;transition:opacity .22s ease}.ladder-head{display:flex;align-items:baseline;justify-content:space-between;gap:8px;padding:9px 12px 8px;border-bottom:1px solid rgba(20,26,23,.18);font-family:var(--font-mono);font-size:8px;font-weight:600;letter-spacing:.13em}.ladder-head small{color:#141a1775;font-size:6px;font-weight:500;letter-spacing:.11em}.ladder-list{margin:0;padding:0;list-style:none}.ladder-list li{display:grid;grid-template-columns:13px minmax(0,1fr) auto;column-gap:7px;align-items:baseline;padding:6px 12px 5px;border-bottom:1px solid rgba(20,26,23,.11)}.ladder-list li:last-child{border-bottom:0}.ladder-list li.on-court{background:#c56b451f;box-shadow:inset 2px 0 0 var(--clay)}.ladder-list li.next-up{background:#d9b16a38}.pos{font-family:var(--font-mono);font-size:7px;font-weight:600;color:var(--clay-deep)}.ladder-name{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-family:var(--font-ui);font-size:11px;font-weight:600;letter-spacing:.005em}.ladder-wins{font-family:var(--font-mono);font-size:7px;color:#141a177a;white-space:nowrap}.ladder-tag{grid-column:2 / 4;padding-top:1px;font-family:var(--font-mono);font-size:5.5px;font-weight:600;letter-spacing:.13em;color:var(--clay-deep)}.ladder-tag:empty{display:none}.ladder-foot{display:flex;align-items:baseline;justify-content:space-between;gap:8px;padding:7px 12px;border-top:1px solid rgba(20,26,23,.18);background:#f3ead761;font-family:var(--font-mono);font-size:6px;letter-spacing:.12em;color:#141a1773}.ladder-foot b{font-size:8px;color:var(--clay-deep)}.controls{position:absolute;left:50%;bottom:20px;transform:translate(-50%);display:flex;align-items:stretch;max-width:calc(100vw - 32px);background:var(--glass-deep);border:1px solid rgba(243,234,215,.14);border-radius:3px;box-shadow:0 20px 60px #00000042;backdrop-filter:blur(14px);transition:opacity .22s ease}.control-block{display:flex;flex-direction:column;justify-content:space-between;gap:6px;padding:10px 14px 9px;border-right:1px solid var(--line)}.control-block:last-child{border-right:0}.shot-block{flex:0 0 262px}.view-block{flex:0 0 288px}.settings-block{flex:1 1 334px;display:grid;grid-template-columns:minmax(0,1fr) minmax(0,1fr);gap:7px 18px;align-content:center;min-width:318px}.control-label-row{display:flex;align-items:baseline;justify-content:space-between;gap:8px}.control-label{font-family:var(--font-mono);font-size:8px;font-weight:500;letter-spacing:.15em;text-transform:uppercase;color:#f3ead794}.zoom-read{font-family:var(--font-mono);font-size:7px;letter-spacing:.08em;color:var(--ochre);font-variant-numeric:tabular-nums}.button-row{display:flex;gap:5px}.view-row{display:flex;align-items:center;gap:4px}.controls button{display:inline-flex;align-items:center;justify-content:center;min-height:30px;padding:0 9px;border:1px solid transparent;border-radius:1px;background:transparent;color:var(--cream);font-family:var(--font-ui);font-size:11px;font-weight:500;letter-spacing:.01em;white-space:nowrap;transition:background-color .12s ease,border-color .12s ease,color .12s ease}.controls button:hover{background:#f3ead714}.controls button:active{background:#f3ead724}.controls button[aria-pressed=true]{color:var(--ochre);background:#d9b16a14;border-color:#d9b16a57}.shot-block .button-row button{flex:1;min-height:31px;border-color:var(--line-strong)}.shot-block .button-row button[aria-pressed=true]{border-color:#d9b16a85;background:#d9b16a1f}.view-row button{border-color:transparent}.view-row button[data-act=rotate],.view-row button[data-act=reset-view],.view-row button[data-act=focus]{border-color:var(--line)}.icon-button{min-width:26px;padding:0;font-family:var(--font-mono);font-size:14px;line-height:1}.target-hint,.view-hint{margin:0;overflow:hidden;white-space:nowrap;text-overflow:ellipsis;font-family:var(--font-mono);font-size:7.5px;font-weight:500;letter-spacing:.09em;text-transform:uppercase;color:#f3ead785}.target-hint{color:#d9b16aa3}.segmented{display:flex;align-items:center;gap:2px;min-width:0}.segmented button{flex:1;min-height:22px;padding:0 4px;border:0;border-bottom:1px solid transparent;border-radius:0;color:#f3ead79e;font-family:var(--font-mono);font-size:8.5px;font-weight:500;letter-spacing:.04em}.segmented button:hover{background:transparent;color:var(--cream)}.segmented button[aria-pressed=true]{color:var(--cream);background:transparent;border-color:var(--ochre)}.setting{display:flex;flex-direction:column;gap:2px;min-width:0}.rain-button{align-self:flex-start;min-height:22px;padding:0 10px;border-color:var(--line-strong)}.rain-button[aria-pressed=true]{color:var(--ink);background:var(--ochre);border-color:var(--ochre)}.controls button:focus-visible,.status-bar button:focus-visible,.focus-restore:focus-visible{outline:1px solid var(--ochre);outline-offset:2px}.hud.focus-mode .topbar,.hud.focus-mode .scorecard,.hud.focus-mode .ladder-card,.hud.focus-mode .controls{opacity:0;visibility:hidden;pointer-events:none}.focus-restore{position:absolute;right:24px;bottom:22px;display:none;min-height:32px;padding:0 13px;border:1px solid var(--line-strong);border-radius:999px;background:#1017139e;color:var(--cream);font-family:var(--font-mono);font-size:7px;letter-spacing:.14em;backdrop-filter:blur(9px)}.hud.focus-mode .focus-restore{display:inline-flex;align-items:center}#loading{position:absolute;inset:0;z-index:20;display:grid;place-content:center;justify-items:center;gap:18px;background:radial-gradient(circle at 50% 46%,#26312b,#131a16 62%,#0b0f0d);transition:opacity .7s ease .16s,visibility 0s linear .9s}#app.ready #loading{opacity:0;visibility:hidden;pointer-events:none}.loading-mark{font-family:var(--font-display);font-size:52px;font-weight:700;line-height:.78;letter-spacing:-.04em;text-align:center;color:var(--cream)}.loading-mark:first-line{color:var(--ochre)}.loading-line{width:128px;height:2px;background:#f3ead729;overflow:hidden}.loading-line span{display:block;width:38%;height:100%;background:var(--ochre);animation:loading-sweep 1.1s ease-in-out infinite}#loading p{margin:0;font-family:var(--font-mono);font-size:8px;letter-spacing:.16em;text-transform:uppercase;color:var(--muted)}@keyframes loading-sweep{0%{transform:translate(-110%)}to{transform:translate(360%)}}@media(prefers-reduced-motion:reduce){.loading-line span{animation:none;width:100%}.call.bump{animation:none}.controls button,.serve-meter i{transition:none}}@media(max-width:1120px){.scorecard{width:358px;min-width:0}.ladder-card{width:214px}.shot-block{flex-basis:220px}.view-block{flex-basis:255px}.settings-block{gap:7px 12px;min-width:292px}.control-block{padding:9px 11px 8px}.controls button{font-size:9.5px;padding:0 8px}}@media(max-width:980px){.scorecard{width:336px}.ladder-card{width:200px}.ladder-list li{padding:6px 10px 5px}.ladder-head{padding:9px 10px 8px}.controls{width:calc(100% - 32px)}.shot-block{flex:1.1 1 0}.view-block{flex:1 1 0}.settings-block{flex:1.2 1 280px;min-width:0}.controls button{font-size:9px}.view-row{flex-wrap:wrap}}@media(max-width:760px),(orientation:portrait){.topbar{top:8px;left:12px;right:12px;gap:8px}.brand-block{gap:0}.eyebrow{display:flex;gap:0;margin-bottom:1px;font-size:6px;letter-spacing:.12em;line-height:1}.eyebrow:before{width:4px;height:4px}.eyebrow>.eyebrow-sep,.eyebrow-club{display:none}.wordmark{font-size:clamp(30px,9.8vw,40px);line-height:.9}.status-bar{gap:5px;min-height:32px;margin-top:0;padding:5px 9px;font-size:7px;letter-spacing:.06em}.condition{min-height:24px}.speed-condition{min-height:28px;padding-left:8px}.scorecard{top:62px;left:10px;right:10px;width:auto;min-width:0;padding:9px 12px 8px}.scorecard:before{left:12px;width:26px}.scorecard-head{padding-bottom:5px;font-size:6.5px}.live-dot{width:3px;height:3px}.server-read{font-size:6px}.score-head{display:grid;grid-template-columns:6px minmax(0,1fr) 26px 30px 38px;column-gap:6px;padding-bottom:4px;font-size:5.5px;letter-spacing:.08em}.score-head span:first-child{grid-column:1 / 3;padding-left:12px}.score-head span:nth-child(5){display:none}.team-row{grid-template-columns:6px minmax(0,1fr) 26px 30px 38px;column-gap:6px;padding:5px 0 4px}.team-name{font-size:15.5px;line-height:1.05}.team-style{font-size:5.5px}.stat b{font-size:17px}.stat.points b{font-size:19px}.set-scores{display:none}.serving-pip{font-size:6px}.call-strip{padding:7px 0 6px;gap:5px 8px}.call{font-size:20px}.detail{font-size:5.5px;min-height:8px}.rally-block b{font-size:13px}.serve-strip{padding-top:6px;font-size:5.5px;gap:7px}.serve-strip b{min-width:52px}.ladder-card{top:258px;left:10px;right:10px;width:auto;border-radius:2px;box-shadow:0 12px 30px #00000029}.ladder-head{display:none}.ladder-list{display:grid;grid-template-columns:repeat(4,minmax(0,1fr))}.ladder-list li{display:flex;flex-direction:column;gap:0;min-width:0;padding:5px 7px 4px;border-right:1px solid rgba(20,26,23,.12);border-bottom:0}.ladder-list li:last-child{border-right:0}.ladder-list li.on-court{background:#c56b4524;box-shadow:inset 0 2px 0 var(--clay)}.pos{font-size:6px}.ladder-name{font-size:9px}.ladder-wins{font-size:5.5px}.ladder-tag,.ladder-foot{display:none}.ladder-wins{font-size:6px}.controls{left:10px;right:10px;bottom:10px;width:auto;max-width:none;transform:none;display:grid;grid-template-columns:minmax(0,1fr)}.control-block,.shot-block,.view-block,.settings-block{flex:none;width:auto;min-width:0;padding:7px 10px 8px;border-right:0;border-bottom:1px solid var(--line);gap:4px}.control-block:last-child{border-bottom:0}.settings-block{display:grid;grid-template-columns:minmax(0,1fr) minmax(0,1fr);gap:6px 14px;padding-bottom:8px}.controls button{min-height:38px;font-size:10px;padding:0 7px}.shot-block .button-row button{min-height:40px;font-size:11px}.view-row{gap:3px}.view-row button{flex:1}.view-row .icon-button{flex:0 0 32px}.view-row button[data-act=focus]{flex:0 0 auto}.target-hint,.view-hint{font-size:6px;letter-spacing:.06em;white-space:nowrap}.segmented button{flex:1;min-height:34px;font-size:7px}.rain-button{width:100%;min-height:34px}.focus-restore{right:10px;bottom:10px;min-height:28px;font-size:6px}}@media(max-height:600px)and (orientation:landscape){.topbar{top:10px;left:16px;right:16px}.eyebrow{display:none}.wordmark{font-size:30px}.status-bar{padding:5px 8px;font-size:6.5px}.scorecard{top:64px;left:16px;width:322px;padding:8px 12px 7px}.team-row{padding:4px 0 3px}.team-name{font-size:15px}.team-style{display:none}.stat b{font-size:16px}.stat.points b{font-size:18px}.score-head{display:none}.call-strip{padding:6px 0 5px}.call{font-size:18px}.detail{min-height:7px;font-size:5.5px}.serve-strip{display:none}.ladder-card{top:64px;right:16px;width:190px}.ladder-head{padding:7px 9px 6px}.ladder-list li{padding:4px 9px 3px}.ladder-wins{font-size:6px}.ladder-foot{display:none}.controls{bottom:8px;max-width:calc(100vw - 24px)}.control-block{padding:7px 9px 6px;gap:4px}.shot-block{flex-basis:200px}.view-block{flex-basis:238px}.settings-block{min-width:270px;gap:5px 10px}.controls button{min-height:27px;font-size:8.5px;padding:0 6px}.shot-block .button-row button{min-height:28px}.segmented button{min-height:20px;font-size:6.5px}.target-hint,.view-hint{font-size:5.5px}}@media(max-height:520px){.ladder-card{display:none}}@media(max-width:760px)and (orientation:portrait),(max-height:740px)and (orientation:portrait){.scorecard{padding:8px 11px 7px}.scorecard-head{padding-bottom:4px}.team-row{padding:3px 0}.team-style{display:none}.team-name{font-size:14.5px}.call-strip{padding:5px 0 4px}.call{font-size:17px}.detail{display:none}.serve-strip{padding-top:5px}.ladder-card{top:228px}.controls{display:grid;grid-template-columns:minmax(0,1fr) minmax(0,1fr)}.shot-block{grid-column:1;border-right:1px solid var(--line);border-bottom:1px solid var(--line)}.view-block{grid-column:2;border-right:0;border-bottom:1px solid var(--line)}.settings-block{grid-column:1 / -1;display:grid;grid-template-columns:minmax(0,1fr) minmax(0,1fr);gap:4px 12px;border-bottom:0}.settings-block .setting:nth-child(1),.settings-block .setting:nth-child(3){display:none}.view-row button[data-act=reset-view],.view-row button[data-act=focus],.view-hint{display:none}.target-hint{font-size:6px}.controls button{min-height:36px}.shot-block .button-row button{min-height:38px}.segmented button,.rain-button{min-height:34px}}
