:root{
  --bg:#111318;--card:#1b1e25;--card2:#232731;--line:#2e333f;--text:#eef0f4;--muted:#9aa1ae;
  --accent:#ff6b35;--accent2:#ffb38a;--ok:#2fbf71;--okbg:rgba(47,191,113,.14);--warn:#f5c04a;
  --sat:env(safe-area-inset-top,0px);--sab:env(safe-area-inset-bottom,0px);--sal:env(safe-area-inset-left,0px);--sar:env(safe-area-inset-right,0px);
  --tabh:60px;
}
*{box-sizing:border-box;-webkit-tap-highlight-color:transparent}
html,body{margin:0;background:var(--bg);color:var(--text);font:16px/1.45 -apple-system,BlinkMacSystemFont,"PingFang SC","Hiragino Sans GB","Microsoft YaHei","Noto Sans CJK SC",sans-serif;-webkit-text-size-adjust:100%}
body{padding-top:calc(52px + var(--sat));padding-bottom:calc(var(--tabh) + var(--sab) + 12px)}
body.resting{padding-bottom:calc(var(--tabh) + var(--sab) + 96px)}
button{font:inherit;color:inherit;border:0;background:none;cursor:pointer}
input{font:inherit;color:inherit}
a{color:var(--accent2)}
.hidden{display:none!important}
.topbar{position:fixed;top:0;left:0;right:0;z-index:20;background:rgba(17,19,24,.92);backdrop-filter:blur(12px);-webkit-backdrop-filter:blur(12px);border-bottom:1px solid var(--line);padding:var(--sat) var(--sar) 0 var(--sal)}
.topbar-inner{height:52px;display:flex;align-items:center;justify-content:space-between;padding:0 16px;max-width:640px;margin:0 auto}
.brand{font-weight:800;font-size:19px;letter-spacing:.5px}
.brand::before{content:"";display:inline-block;width:10px;height:10px;border-radius:50%;background:var(--accent);margin-right:8px;vertical-align:1px}
.top-right{display:flex;gap:8px;align-items:center;font-variant-numeric:tabular-nums;color:var(--muted);font-size:14px}
main{max-width:640px;margin:0 auto;padding:12px calc(14px + var(--sar)) 0 calc(14px + var(--sal))}
.tabbar{position:fixed;left:0;right:0;bottom:0;z-index:30;display:flex;background:rgba(20,22,28,.96);backdrop-filter:blur(12px);-webkit-backdrop-filter:blur(12px);border-top:1px solid var(--line);padding:0 var(--sar) var(--sab) var(--sal)}
.tabbar button{flex:1;height:var(--tabh);display:flex;flex-direction:column;align-items:center;justify-content:center;font-size:12px;color:var(--muted);gap:2px}
.tabbar .ti{font-size:20px;filter:grayscale(1);opacity:.7}
.tabbar button.active{color:var(--text)}
.tabbar button.active .ti{filter:none;opacity:1}
/* day picker */
.days{display:grid;grid-template-columns:repeat(3,1fr);gap:8px;margin-bottom:12px}
.day{background:var(--card);border:1.5px solid var(--line);border-radius:14px;padding:10px 8px;text-align:left;min-height:68px}
.day b{display:block;font-size:20px}
.day small{display:block;color:var(--muted);font-size:12px;line-height:1.3}
.day.active{border-color:var(--accent);background:linear-gradient(160deg,rgba(255,107,53,.18),var(--card) 70%)}
.day .last{color:var(--accent2);font-size:11px;margin-top:2px}
.session-head{display:flex;align-items:center;justify-content:space-between;gap:10px;margin:4px 2px 12px}
.session-head h2{margin:0;font-size:20px}
.session-head .sub{color:var(--muted);font-size:13px}
.btn{min-height:44px;padding:0 16px;border-radius:12px;background:var(--card2);border:1px solid var(--line);font-weight:600;display:inline-flex;align-items:center;justify-content:center;gap:6px;white-space:nowrap}
.btn.primary{background:var(--accent);border-color:var(--accent);color:#fff}
.btn.ok{background:var(--ok);border-color:var(--ok);color:#06150d}
.btn.ghost{background:transparent}
.btn.danger{color:#ff7b7b;border-color:#5a2a2a}
.btn.small{min-height:36px;padding:0 12px;font-size:14px;border-radius:10px}
.btn.block{width:100%}
.progress-line{height:6px;background:var(--card2);border-radius:3px;overflow:hidden;margin:-4px 2px 14px}
.progress-line div{height:100%;background:var(--ok);transition:width .3s}
/* exercise card */
.card{background:var(--card);border:1px solid var(--line);border-radius:18px;margin-bottom:12px;overflow:hidden}
.card.done{border-color:rgba(47,191,113,.45)}
.card-head{display:flex;gap:12px;padding:14px 14px 8px;align-items:flex-start}
.idx{flex:none;width:30px;height:30px;border-radius:9px;background:var(--card2);display:flex;align-items:center;justify-content:center;font-weight:700;font-size:14px;color:var(--muted)}
.card.done .idx{background:var(--ok);color:#06150d}
.card-title{flex:1;min-width:0}
.card-title h3{margin:0;font-size:17px;line-height:1.3}
.card-title .meta{color:var(--muted);font-size:13px;margin-top:2px}
.tag{display:inline-block;font-size:11px;padding:1px 7px;border-radius:6px;background:rgba(245,192,74,.15);color:var(--warn);margin-left:4px;vertical-align:2px;font-weight:600}
.swapped-name{color:var(--warn);font-size:14px;margin-top:3px;font-weight:600}
.last-info{color:var(--accent2);font-size:12px;margin-top:3px}
.thumb{flex:none;width:72px;height:48px;border-radius:10px;object-fit:cover;background:var(--card2);border:1px solid var(--line)}
.sets{padding:0 10px 6px}
.set-hd,.set{display:grid;grid-template-columns:34px 1fr 1fr 56px;gap:8px;align-items:center}
.set-hd{color:var(--muted);font-size:12px;padding:0 4px 4px}
.set{padding:5px 4px;border-radius:12px}
.set.done{background:var(--okbg)}
.set .no{text-align:center;color:var(--muted);font-weight:700}
.field{position:relative}
.field input{width:100%;height:48px;border-radius:12px;border:1px solid var(--line);background:var(--bg);text-align:center;font-size:19px;font-weight:600;font-variant-numeric:tabular-nums;padding:0 24px 0 6px;-moz-appearance:textfield;appearance:textfield}
.field input::-webkit-outer-spin-button,.field input::-webkit-inner-spin-button{-webkit-appearance:none;margin:0}
.field input:focus{outline:none;border-color:var(--accent)}
.field span{position:absolute;right:9px;top:50%;transform:translateY(-50%);font-size:11px;color:var(--muted);pointer-events:none}
.check{width:56px;height:48px;border-radius:12px;border:1.5px solid var(--line);background:var(--card2);font-size:22px;color:var(--muted);display:flex;align-items:center;justify-content:center}
.set.done .check{background:var(--ok);border-color:var(--ok);color:#06150d}
.card-actions{display:flex;gap:8px;padding:4px 14px 14px;flex-wrap:wrap}
.card-actions .btn{flex:1}
.detail{border-top:1px solid var(--line);padding:14px;background:#171a20}
.media{position:relative;border-radius:14px;overflow:hidden;background:#000;aspect-ratio:16/9}
.media video{width:100%;height:100%;display:block;object-fit:contain;background:#000}
.angles{display:flex;gap:6px;margin:8px 0 0}
.angles button{flex:1;min-height:36px;border-radius:10px;background:var(--card2);border:1px solid var(--line);font-size:13px;color:var(--muted)}
.angles button.active{color:var(--text);border-color:var(--accent)}
.cues{margin:12px 0 8px;padding:0;list-style:none}
.cues li{position:relative;padding:4px 0 4px 22px;font-size:15px}
.cues li::before{content:"✓";position:absolute;left:2px;color:var(--accent);font-weight:700}
.links{display:flex;gap:8px;flex-wrap:wrap;margin-top:6px}
.links a{flex:1;min-height:40px;border-radius:10px;border:1px solid var(--line);display:flex;align-items:center;justify-content:center;text-decoration:none;font-size:13px;color:var(--text);background:var(--card2);padding:0 8px;text-align:center}
.sec-title{font-size:13px;color:var(--muted);margin:18px 0 8px;font-weight:600;letter-spacing:.5px}
.alt{display:flex;gap:10px;align-items:center;padding:10px;border:1px solid var(--line);border-radius:14px;margin-bottom:8px;background:var(--card)}
.alt img{width:76px;height:50px;border-radius:9px;object-fit:cover;flex:none;background:var(--card2)}
.alt .an{flex:1;min-width:0}
.alt .an b{display:block;font-size:15px}
.alt .an small{display:block;color:var(--muted);font-size:12px;line-height:1.35}
.alt .btn{flex:none}
.alt.cur{border-color:var(--warn)}
.note{font-size:13px;color:var(--muted);background:var(--card2);border-radius:10px;padding:8px 10px;margin-top:8px}
/* rest bar */
.rest-bar{position:fixed;left:0;right:0;bottom:calc(var(--tabh) + var(--sab));z-index:25;background:#1f232c;border-top:1px solid var(--line);padding:0 calc(12px + var(--sar)) 10px calc(12px + var(--sal));box-shadow:0 -8px 24px rgba(0,0,0,.35)}
.rest-progress{height:4px;background:var(--line);margin:0 calc(-12px - var(--sar)) 8px calc(-12px - var(--sal))}
.rest-progress div{height:100%;background:var(--accent);width:0;transition:width .25s linear}
.rest-row{display:flex;align-items:center;gap:8px;max-width:640px;margin:0 auto}
.rest-mid{flex:1;text-align:center}
.rest-label{font-size:12px;color:var(--muted)}
.rest-time{font-size:30px;font-weight:800;font-variant-numeric:tabular-nums;line-height:1.1}
.rest-btn{min-width:56px;height:48px;border-radius:12px;background:var(--card2);border:1px solid var(--line);font-weight:600;font-size:15px}
.rest-btn.skip{color:var(--accent2)}
.rest-bar.over .rest-time{color:var(--ok)}
.rest-bar.over .rest-progress div{background:var(--ok)}
/* history */
.panel{background:var(--card);border:1px solid var(--line);border-radius:18px;padding:14px;margin-bottom:12px}
.panel h3{margin:0 0 10px;font-size:16px}
.stats{display:grid;grid-template-columns:repeat(3,1fr);gap:8px;margin-bottom:12px}
.stat{background:var(--card);border:1px solid var(--line);border-radius:14px;padding:10px;text-align:center}
.stat b{display:block;font-size:22px;font-variant-numeric:tabular-nums}
.stat small{color:var(--muted);font-size:12px}
select{width:100%;height:46px;border-radius:12px;background:var(--bg);color:var(--text);border:1px solid var(--line);padding:0 12px;font:inherit;font-size:15px}
.chart{width:100%;height:auto;display:block;margin-top:10px}
.legend{display:flex;gap:14px;font-size:12px;color:var(--muted);margin-top:6px}
.legend i{display:inline-block;width:10px;height:3px;border-radius:2px;margin-right:5px;vertical-align:3px}
.sess{border-top:1px solid var(--line);padding:12px 0}
.sess:first-of-type{border-top:0;padding-top:0}
.sess-hd{display:flex;justify-content:space-between;align-items:center;gap:8px}
.sess-hd b{font-size:15px}
.sess-hd small{color:var(--muted);font-size:12px}
.sess ul{margin:6px 0 0;padding:0;list-style:none;font-size:13px;color:var(--muted)}
.sess li{display:flex;justify-content:space-between;gap:8px;padding:2px 0}
.sess li span:last-child{color:var(--text);font-variant-numeric:tabular-nums;text-align:right}
.empty{color:var(--muted);text-align:center;padding:24px 8px;font-size:14px}
.ptable{width:100%;border-collapse:collapse;font-size:13px;margin-top:10px;font-variant-numeric:tabular-nums}
.ptable td,.ptable th{padding:6px 4px;border-top:1px solid var(--line);text-align:right}
.ptable th{color:var(--muted);font-weight:500}
.ptable td:first-child,.ptable th:first-child{text-align:left}
.row{display:flex;gap:8px;flex-wrap:wrap}
.row .btn{flex:1}
.switch{display:flex;justify-content:space-between;align-items:center;min-height:48px;border-top:1px solid var(--line)}
.switch:first-of-type{border-top:0}
.switch input{width:24px;height:24px;accent-color:var(--accent)}
.seg{display:flex;background:var(--bg);border:1px solid var(--line);border-radius:10px;overflow:hidden}
.seg button{padding:0 12px;min-height:36px;font-size:13px;color:var(--muted)}
.seg button.active{background:var(--accent);color:#fff}
.toast{position:fixed;left:50%;top:calc(64px + var(--sat));transform:translate(-50%,-20px);background:#2b303b;color:var(--text);padding:10px 16px;border-radius:12px;font-size:14px;opacity:0;pointer-events:none;transition:.25s;z-index:60;max-width:88vw;text-align:center;box-shadow:0 8px 24px rgba(0,0,0,.4)}
.toast.show{opacity:1;transform:translate(-50%,0)}
.sheet{position:fixed;inset:0;z-index:50}
.sheet-bg{position:absolute;inset:0;background:rgba(0,0,0,.55)}
.sheet-card{position:absolute;left:0;right:0;bottom:0;background:var(--card);border-radius:20px 20px 0 0;padding:18px calc(16px + var(--sar)) calc(18px + var(--sab)) calc(16px + var(--sal));max-height:85vh;overflow:auto;max-width:640px;margin:0 auto}
.sheet-card h3{margin:0 0 8px}
.sheet-card p{color:var(--muted);margin:0 0 14px;font-size:14px}
.sheet-card .row{margin-top:8px}
@media (prefers-color-scheme: light){ /* 健身房里更适合深色，保持深色主题 */ }
.sync-line{display:flex;justify-content:space-between;padding:6px 0;border-top:1px solid var(--line);font-size:14px}
.sync-line:first-child{border-top:0}
.sync-line span{color:var(--muted)}
.sync-msg{margin-top:8px;font-size:13px;padding:8px 10px;border-radius:10px;background:var(--card2)}
.sync-msg.ok{color:var(--ok)}
.sync-msg.err{color:#ff8a8a;background:rgba(255,90,90,.1)}
.sync-msg.busy{color:var(--accent2)}
.sync-dot{display:inline-block;width:9px;height:9px;border-radius:50%;background:var(--muted)}
.sync-dot.ok{background:var(--ok)}
.sync-dot.err{background:#ff5a5a}
.sync-dot.busy{background:var(--warn);animation:pulse 1s infinite}
@keyframes pulse{50%{opacity:.3}}
