:root{font-family:Inter,"Noto Sans SC",system-ui,sans-serif;color:#17382d;background:#f4f5ef;font-synthesis:none}*{box-sizing:border-box}body{margin:0}button,a,input{touch-action:manipulation}button{font:inherit;cursor:pointer}button:disabled{opacity:.4;cursor:wait}header{height:82px;border-bottom:1px solid #dce2d6;display:flex;align-items:center;justify-content:space-between;padding:0 5%}.brand{font-size:24px;font-weight:850;letter-spacing:-1.5px;color:inherit;text-decoration:none}.brand span{margin-left:14px;font-size:10px;letter-spacing:2px;border-left:1px solid #b4c1b4;padding-left:15px;vertical-align:middle}.local{font-size:10px;letter-spacing:1.4px;display:flex;gap:8px;align-items:center}.local i{width:7px;height:7px;border-radius:50%;background:#679955}.about-link{font-size:12px;color:inherit;text-decoration:none}main{max-width:1500px;margin:auto;padding:45px 5% 24px}.intro{display:flex;justify-content:space-between;align-items:center;margin-bottom:32px}.eyebrow{font-size:10px;letter-spacing:1.7px;font-weight:650;color:#667e6a;margin:0 0 13px}h1{font-size:clamp(24px,2.6vw,42px);font-weight:600;letter-spacing:-1.5px;line-height:1.35;margin:0 0 14px}h1 em{font-style:normal;color:#7d916b}.subtitle{font-size:13px;color:#778077;margin:0}.model-label{text-align:right;font-size:12px;line-height:1.9;letter-spacing:1px}.model-label span{color:#9aaa94;padding:0 8px}.model-label small{font-size:9px;color:#7f8c7e}.lab{display:grid;grid-template-columns:minmax(0,1fr) 290px;border:1px solid #d7dfd1;border-radius:14px;overflow:hidden;background:#fff}#viewport{position:relative;min-height:590px;background:#13212d;overflow:hidden}canvas{display:block;position:absolute;inset:0}.scene-top,.scene-bottom{position:absolute;z-index:2;left:22px;right:22px;display:flex;justify-content:space-between;align-items:center;pointer-events:none}.scene-top{top:20px}.scene-bottom{bottom:20px;font-size:10px;color:#f4f7ed;text-shadow:0 1px 3px #304333}.scene-bottom button{pointer-events:auto;border:1px solid #e0e5d988;background:#f6f9f0de;padding:8px 11px;border-radius:6px;color:#254a37;font-size:10px}.badge{font-size:10px;background:#f5f7edee;padding:8px 12px;border-radius:99px;font-weight:600}.scene-caption{font-size:10px;color:#35583f;background:#f1f6eacc;padding:7px 10px;border-radius:30px}#loading{position:absolute;z-index:3;inset:0;background:#e7ece2ed;display:flex;justify-content:center;align-items:center;flex-direction:column;gap:16px;text-align:center;padding:30px}#loading p{font-size:12px;color:#7b8c76;max-width:500px;overflow-wrap:anywhere}#loading.hidden{display:none}.spinner{width:26px;height:26px;border:2px solid #c5d1ba;border-top-color:#355c31;border-radius:50%;animation:spin 1s linear infinite}@keyframes spin{to{transform:rotate(360deg)}}aside{padding:26px 24px}h2{font-size:17px;font-weight:600;margin:0 0 20px}.segmented{display:flex;background:#eef2e8;border-radius:7px;padding:4px;margin-bottom:22px}.segmented button{width:50%;padding:8px;border:0;background:none;font-size:12px;color:#7b8b75;border-radius:5px}.segmented button.selected{background:#fff;color:#224b35;box-shadow:0 1px 5px #20381a14}label{display:block;font-size:11px;color:#65775f;margin:0 0 18px}output{float:right;color:#234930;font-variant-numeric:tabular-nums}input[type=range]{display:block;width:100%;margin:12px 0 0;accent-color:#5c7841;height:4px;cursor:pointer}.primary{width:100%;display:flex;justify-content:space-between;align-items:center;border:0;border-radius:7px;background:#d9ed9d;color:#274522;padding:14px 15px;font-weight:650;font-size:14px}.primary:hover{background:#cbe784}.primary span{font-size:10px;letter-spacing:1px;font-weight:500}.toggle{display:flex;align-items:center;gap:6px;margin:14px 0 0}.toggle small{margin-left:auto;color:#96a18e;font-size:10px}.toggle input{accent-color:#597140}.divider{height:1px;background:#e5eadd;margin:22px 0}.actions{display:flex;gap:7px;margin-bottom:8px}.actions button,#push{border:1px solid #dce3d5;background:#fff;color:#3f5d39;padding:9px 8px;border-radius:5px;font-size:11px;flex:1}#push{width:100%}.hint{font-size:10px;line-height:1.8;color:#91a088;margin:12px 0 0}.readouts{display:grid;grid-template-columns:repeat(4,1fr);padding:24px 0;border-bottom:1px solid #dce2d6;gap:20px}.readouts>div{border-right:1px solid #dce2d6;padding-left:20px}.readouts>div:first-child{padding-left:0}.readouts>div:last-child{border:0}.readouts small{display:block;font-size:10px;color:#819078;margin-bottom:9px}.readouts strong{font-weight:500;font-size:17px;font-variant-numeric:tabular-nums}.readouts span{font-size:10px;color:#8b9882;margin-left:5px}footer{display:flex;justify-content:space-between;gap:60px;font-size:10px;line-height:1.9;color:#89977f;padding-top:12px}footer p:first-child{max-width:640px}footer strong{color:#58714a;font-weight:500}footer p:last-child{text-align:right;white-space:nowrap}@media(max-width:900px){main{padding:28px 4%}.lab{grid-template-columns:minmax(0,1fr) 245px}aside{padding:22px 18px}.model-label{display:none}#viewport{min-height:570px}.local{display:none}.readouts{grid-template-columns:repeat(2,1fr)}footer{gap:20px}}@media(max-width:650px){header{height:65px}.lab{grid-template-columns:1fr}#viewport{min-height:440px}aside{padding:22px}.intro h1 em{display:block}.readouts strong{font-size:15px}footer{display:block}footer p:last-child{text-align:left}.scene-caption{display:none}}

#ball-reset{width:100%;border:1px solid #b9ca9f;background:#edf4dd;color:#3f5d39;padding:10px 8px;border-radius:5px;font-size:11px;margin-bottom:8px}canvas{touch-action:none}

.ball-speed{display:flex;align-items:baseline;gap:6px;color:#eef6df;background:#101d2aeb;border:1px solid #455667;padding:7px 11px;border-radius:8px;font-size:11px;white-space:nowrap}.ball-speed strong{color:#efff38;font-size:19px;font-weight:600;font-variant-numeric:tabular-nums}

/* Keep the primary interaction visible before the court, without covering it. */
.interaction-guide{margin:0 0 18px;padding:20px 24px;background:#172c39;color:#f3f7fa;border:1px solid #3b5664;border-top:3px solid #edff57;border-radius:12px}
.interaction-lead{display:flex;align-items:center;gap:14px}
.guide-ball{flex:0 0 24px;width:24px;height:24px;border-radius:50%;background:#edff57;box-shadow:0 0 0 6px #edff5714}
.interaction-lead h2{font-size:20px;line-height:1.4;font-weight:700;margin:0 0 4px;color:#edff57}
.interaction-lead p{font-size:14px;line-height:1.6;margin:0;color:#e1eaf0}
.guide-label{margin-left:auto;font-size:12px;font-weight:650;letter-spacing:2px;color:#c5d6e0;white-space:nowrap}
.interaction-shortcuts{list-style:none;padding:16px 0 0;margin:16px 0 0;border-top:1px solid #3b5362;display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:16px}
.interaction-shortcuts li{display:flex;flex-direction:column;gap:7px;font-size:14px;line-height:1.6}
.interaction-shortcuts li>span:first-child{font-weight:650;color:#fff}
.interaction-shortcuts li>span:last-child{color:#c5d6e0;font-size:13px}
.interaction-guide kbd{display:inline-block;min-width:27px;padding:1px 7px;border:1px solid #718895;border-bottom-width:3px;border-radius:5px;background:#2c4352;color:#faffcf;font:600 13px/1.5 ui-monospace,monospace;text-align:center}
@media(max-width:650px){.interaction-guide{padding:16px}.interaction-lead{gap:12px}.interaction-lead h2{font-size:17px}.interaction-lead p{font-size:13px}.guide-label{display:none}.interaction-shortcuts{grid-template-columns:1fr;gap:12px;padding-top:14px;margin-top:14px}.interaction-shortcuts li{flex-direction:row;flex-wrap:wrap;gap:4px 12px;align-items:baseline}.guide-ball{flex-basis:20px;width:20px;height:20px}}

/* Compact the standalone UI when displayed inside the project homepage. */
.embedded body>header,.embedded .intro,.embedded footer{display:none}
.embedded main{max-width:none;padding:16px}
.embedded .interaction-guide{margin-bottom:14px}
.embedded .readouts{padding:18px 0 0;border:0}
@media(max-width:650px){.embedded main{padding:10px}.embedded .readouts{gap:14px}}

.serve-preview{margin:-2px 0 18px;padding:11px 12px;border:1px solid #dce9e6;border-radius:7px;background:#f4faf8;color:#61776f;font-size:11px;line-height:1.5}
.serve-preview strong{display:block;margin-top:3px;color:#176c70;font-size:14px;font-weight:650;font-variant-numeric:tabular-nums}
.serve-preview>span{display:block;margin-top:2px;color:#85968d;font-size:10px}
.serve-preview.net{border-color:#f0d8bc;background:#fff9f0}.serve-preview.net strong{color:#a3612c}
.serve-preview.unreachable{border-color:#f2c6c9;background:#fff6f6}.serve-preview.unreachable strong{color:#ab4450}
.target-hint{margin:-8px 0 20px;color:#849283;font-size:11px;line-height:1.7}
.scene-keys{display:flex;flex-direction:column;gap:5px}.trajectory-key{display:flex;align-items:center;gap:5px;color:#e3ecec;font-size:9px}
.trajectory-key i,.trajectory-key b,.trajectory-key em{display:inline-block;width:15px;height:0;border-top:2px dashed #5ce8ed}
.trajectory-key b{border-color:#ffbc62;border-style:solid}.trajectory-key em{border-color:#efff38;border-style:solid}
@media(max-width:650px){.trajectory-key{font-size:8px}.scene-keys{gap:3px}}

/* Compact English demo controls and a high-contrast drag/trajectory legend. */
header{height:66px}
main{padding-top:30px}
.intro{margin-bottom:20px}
.intro h1{font-size:clamp(25px,3vw,40px);margin-bottom:6px}
.intro .eyebrow{margin-bottom:8px}
.subtitle{font-size:13px}
.lab{grid-template-columns:minmax(0,1fr) 275px}
#viewport{min-height:560px}
.scene-top{left:16px;right:16px;top:16px}
.scene-bottom{left:16px;right:16px;bottom:16px;gap:12px}
.scene-keys{gap:8px;max-width:calc(100% - 90px);font-size:10px}
.trajectory-key{gap:9px;font-size:10px;text-shadow:0 1px 3px #14212b}
.trajectory-key i,.trajectory-key b,.trajectory-key em{width:18px}
.trajectory-key i{border-color:#5ce8ed}
.trajectory-key b{border-color:#efff38}
.trajectory-key em{border-color:#f3c86a}
.ball-speed{font-size:10px;letter-spacing:.8px}
.ball-speed strong{font-size:17px}
aside{padding:24px 20px}
aside h2{margin-bottom:22px}
.serve-preview{margin:3px 0 14px}
.drag-help{margin:13px 0 18px;color:#768477;font-size:10px;line-height:1.75}
.drag-help .cyan{color:#168b94;font-weight:700}
.drag-help .yellow{color:#879500;font-weight:700}
.drag-help .gold{color:#b37b21;font-weight:700}
.actions{margin-top:4px}
.actions button{padding:10px}
@media(max-width:900px){.lab{grid-template-columns:minmax(0,1fr) 250px}#viewport{min-height:520px}}
@media(max-width:650px){header{height:58px}main{padding:20px 3%}.lab{grid-template-columns:1fr}#viewport{min-height:420px}.scene-keys{font-size:9px}.trajectory-key{font-size:8px;gap:6px}.scene-bottom{left:10px;right:10px;bottom:10px}.actions button{padding:9px 6px}}
