:root{color-scheme:dark;--bg: #0c1210;--bg-2: #141c18;--surface: #17211c;--line: #2a3b33;--text: #f3f6f3;--muted: #a9bbae;--green: #1fa85a;--green-2: #8ef0b8;--orange: #ff7a2f;--amber: #ffc857;--danger: #ff8f7a;font-family:Noto Sans CJK SC,Noto Sans SC,Source Han Sans SC,PingFang SC,Hiragino Sans GB,Microsoft YaHei,WenQuanYi Micro Hei,sans-serif;line-height:1.45;background:var(--bg);color:var(--text)}*{box-sizing:border-box}html,body,#root{min-height:100%}body{margin:0}button,input{font:inherit;color:inherit}button{cursor:pointer}:focus-visible{outline:2px solid var(--orange);outline-offset:2px}::selection{background:#ff7a2f59}.app{min-height:100%}.topbar{display:flex;align-items:center;justify-content:space-between;gap:12px;padding:calc(12px + env(safe-area-inset-top)) 16px 10px;border-bottom:1px solid var(--line);background:#0c1210eb;position:sticky;top:0;z-index:5}.brand{display:flex;gap:12px;align-items:center}.brand h1{margin:0;font-size:1.25rem;letter-spacing:.04em}.brand p{margin:0;color:var(--muted);font-size:.85rem}.mark{width:36px;height:36px;border-radius:10px;background:#123528;display:grid;place-items:center;box-shadow:inset 0 0 0 1px #ffffff14}.mark i{width:22px;height:14px;border-radius:2px;background:var(--green);box-shadow:inset 0 0 0 1px #ffffffb3;position:relative}.mark i:after{content:"";position:absolute;width:6px;height:6px;border-radius:50%;background:var(--orange);right:-2px;top:-3px}.badge{border:1px solid var(--line);border-radius:999px;padding:6px 10px;color:var(--green-2);font-size:.78rem;white-space:nowrap}.status{margin:0;padding:8px 16px 0;color:var(--amber);font-size:.92rem}.layout{display:grid;grid-template-columns:1fr;gap:16px;padding:12px 16px calc(24px + env(safe-area-inset-bottom))}.stage-col,.report{min-width:0}.controls{display:grid;gap:10px;margin-bottom:12px}.row{display:flex;flex-wrap:wrap;gap:8px;align-items:center}.label{color:var(--muted);font-size:.82rem}.file-input{display:none}.file-name{color:var(--muted);font-size:.82rem;max-width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.seg{display:inline-flex;flex-wrap:wrap;border:1px solid var(--line);border-radius:999px;overflow:hidden;background:var(--surface)}.seg button,.actions button,.transport button{border:0;background:transparent;min-height:44px;padding:0 14px}.seg button[aria-pressed=true]{background:var(--green);color:#062113;font-weight:700}.seg button:disabled{opacity:.4}.actions button,.transport button{border-radius:999px;background:var(--surface);border:1px solid var(--line)}.actions .primary{background:var(--orange);color:#2a1206;border-color:transparent;font-weight:700}button:disabled{cursor:not-allowed;opacity:.55}.note,.hint,.fine{margin:0;color:var(--muted);font-size:.84rem}.hint{color:var(--text)}.stage{position:relative;background:#070b09;border-radius:18px;overflow:hidden;aspect-ratio:16 / 10;min-height:220px;box-shadow:inset 0 0 0 1px #ffffff0a}.stage video,.stage canvas{position:absolute;top:0;right:0;bottom:0;left:0;width:100%;height:100%}.stage video{object-fit:contain;background:#070b09}.stage canvas{z-index:1}.stage canvas.is-calibrating{cursor:crosshair}.empty{position:absolute;top:0;right:0;bottom:0;left:0;z-index:2;display:grid;align-content:center;gap:8px;padding:24px;background:linear-gradient(180deg,#0c121033,#0c1210b8),repeating-linear-gradient(90deg,transparent,transparent 28px,rgba(31,168,90,.08) 29px)}.empty-kicker{margin:0;color:var(--orange);letter-spacing:.14em;font-size:.78rem}.empty ol{margin:0;padding-left:1.2rem}.empty li+li{margin-top:6px}.scan-bar{position:absolute;left:0;right:0;top:0;z-index:3;height:4px;background:#ffffff14}.scan-bar span{display:block;height:100%;background:var(--orange)}.scan-bar.load span{background:var(--green-2)}.transport{display:grid;grid-template-columns:auto 1fr auto;gap:8px;align-items:center;margin-top:8px}.transport input[type=range]{width:100%;accent-color:var(--orange)}.time{color:var(--muted);font-variant-numeric:tabular-nums;font-size:.82rem}.report{display:grid;gap:12px;align-content:start}.report section{background:var(--bg-2);border:1px solid var(--line);border-radius:18px;padding:14px}.section-title{display:flex;justify-content:space-between;gap:8px;align-items:baseline}.section-title h2{margin:0;font-size:1rem}.speed{color:var(--muted);font-size:.8rem;font-variant-numeric:tabular-nums}.phases{display:grid;grid-template-columns:repeat(4,1fr);gap:6px;margin:12px 0}.phases span{text-align:center;border-radius:999px;padding:8px 0;background:#101815;color:var(--muted);border:1px solid var(--line);font-size:.88rem}.phases .is-on{background:var(--orange);color:#2a1206;border-color:transparent;font-weight:700}.phase-miss{margin:0 0 8px;color:var(--danger)}.angles{display:grid;grid-template-columns:1fr 1fr;gap:8px}.angle{background:var(--surface);border-radius:12px;padding:8px 10px;display:grid;grid-template-columns:1fr auto;gap:0 8px}.angle span{color:var(--muted);font-size:.78rem}.angle strong{font-size:1.25rem;font-variant-numeric:tabular-nums}.angle em{grid-column:1 / -1;font-style:normal;color:var(--green-2);font-size:.78rem}.tips{margin:12px 0 8px;padding-left:1.1rem}.tips li+li{margin-top:6px}.spin-value{margin:8px 0;font-size:1.6rem;font-weight:750;display:flex;align-items:center;gap:8px}.est{display:inline-flex;align-items:center;border-radius:999px;padding:2px 8px;background:#ffc85729;color:var(--amber);font-size:.75rem;font-weight:700}.table-wrap{height:420px;border-radius:14px;overflow:hidden;background:#101814}.table-wrap canvas{width:100%;height:100%;display:block}.table-empty{min-height:180px;display:grid;align-content:center;justify-items:start;gap:4px;color:var(--muted)}.table-empty p{margin:0}.legend{display:flex;flex-wrap:wrap;gap:12px;margin:8px 0;color:var(--muted);font-size:.8rem}.legend span{display:inline-flex;align-items:center;gap:6px}.swatch{width:14px;height:8px;display:inline-block;border-radius:99px}.swatch.line{background:var(--orange)}.swatch.dot{width:8px;height:8px;background:#fff4e8;box-shadow:0 0 0 2px #ff5a1f}.swatch.heat{background:linear-gradient(90deg,#4aa0ff,#ffe14a,#ff4a2a)}@media(min-width:980px){.layout{grid-template-columns:minmax(0,1fr) 380px;align-items:start;padding-inline:20px}.report{position:sticky;top:76px}}@media(max-width:720px){.brand p{display:none}.table-wrap{height:360px}.phases{font-size:.8rem}}
