:root{--brand:#0f5ba8;--brand-dark:#0a4380;--brand-light:#e8f1fb;--brand-tint:#f4f8fd;--ok:#0f8a5f;--ok-bg:#e6f6ef;--bad:#c8323c;--bad-bg:#fdecec;--warn:#b8791a;--warn-bg:#fdf3e2;--ink:#16202b;--ink-2:#4a5a6a;--ink-3:#8494a4;--line:#e3e9f0;--bg:#f2f5f9;--card:#fff;--r:14px;--r-sm:10px;--shadow:0 1px 2px rgba(16,32,54,.06),0 6px 20px rgba(16,32,54,.06);--safe-b:env(safe-area-inset-bottom,0px)}*{box-sizing:border-box;-webkit-tap-highlight-color:transparent}html,body,#root{height:100%}body{margin:0;background:var(--bg);color:var(--ink);font:15px/1.6 -apple-system,BlinkMacSystemFont,PingFang SC,Hiragino Sans GB,Microsoft YaHei,sans-serif;-webkit-font-smoothing:antialiased}a{color:var(--brand);text-decoration:none}button{font:inherit;cursor:pointer;border:0;background:none;color:inherit}input,select,textarea{font:inherit;color:inherit}.app{min-height:100%;display:flex;flex-direction:column}.wrap{width:100%;max-width:520px;margin:0 auto;padding:16px;flex:1}.wrap-wide{max-width:1180px}.pad-tabbar{padding-bottom:calc(72px + var(--safe-b))}.appbar{position:sticky;top:0;z-index:20;background:var(--brand);color:#fff;padding:14px 16px;display:flex;align-items:center;gap:10px;box-shadow:0 2px 10px #0f5ba833}.appbar h1{margin:0;font-size:17px;font-weight:600;flex:1;letter-spacing:.2px}.appbar .sub{font-size:12px;opacity:.85;font-weight:400}.appbar button{color:#fff;font-size:13px;opacity:.9;padding:4px 8px;border-radius:8px;background:#ffffff24}.card{background:var(--card);border-radius:var(--r);box-shadow:var(--shadow);padding:18px;margin-bottom:14px}.card-flat{background:var(--card);border:1px solid var(--line);border-radius:var(--r);padding:16px;margin-bottom:12px}.card h2{margin:0 0 4px;font-size:17px;font-weight:600}.card h3{margin:0 0 10px;font-size:15px;font-weight:600;color:var(--ink)}.muted{color:var(--ink-3);font-size:13px}.dim{color:var(--ink-2);font-size:14px}.row{display:flex;align-items:center;gap:10px}.row-between{display:flex;align-items:center;justify-content:space-between;gap:10px}.grow{flex:1}.stack>*+*{margin-top:10px}.btn{display:flex;align-items:center;justify-content:center;gap:6px;width:100%;padding:14px;border-radius:12px;background:var(--brand);color:#fff;font-size:16px;font-weight:600;transition:transform .08s,opacity .15s}.btn:active{transform:scale(.985)}.btn:disabled{opacity:.45;cursor:not-allowed}.btn-ghost{background:var(--brand-light);color:var(--brand)}.btn-line{background:#fff;color:var(--ink-2);border:1px solid var(--line)}.btn-sm{width:auto;padding:8px 14px;font-size:14px;border-radius:9px}.btn-xs{width:auto;padding:5px 10px;font-size:13px;border-radius:8px}.btn-danger{background:var(--bad);color:#fff}.field{margin-bottom:14px}.field label{display:block;font-size:13px;color:var(--ink-2);margin-bottom:6px;font-weight:500}.input,select.input,textarea.input{width:100%;padding:12px 13px;border:1px solid var(--line);border-radius:10px;background:#fff;font-size:16px;outline:none;transition:border-color .15s,box-shadow .15s}.input:focus{border-color:var(--brand);box-shadow:0 0 0 3px var(--brand-light)}textarea.input{min-height:90px;resize:vertical;line-height:1.6;font-size:14px}.err{background:var(--bad-bg);color:var(--bad);padding:10px 12px;border-radius:10px;font-size:14px;margin-bottom:12px}.note{background:var(--warn-bg);color:var(--warn);padding:10px 12px;border-radius:10px;font-size:13px;line-height:1.55}.ok-note{background:var(--ok-bg);color:var(--ok);padding:10px 12px;border-radius:10px;font-size:13px}.tag{display:inline-flex;align-items:center;padding:2px 8px;border-radius:6px;font-size:12px;font-weight:500;background:var(--brand-light);color:var(--brand)}.tag-ok{background:var(--ok-bg);color:var(--ok)}.tag-bad{background:var(--bad-bg);color:var(--bad)}.tag-gray{background:#eef1f5;color:var(--ink-2)}.tag-warn{background:var(--warn-bg);color:var(--warn)}.progress{height:5px;background:var(--line);border-radius:99px;overflow:hidden}.progress i{display:block;height:100%;background:var(--brand);border-radius:99px;transition:width .3s}.qmeta{display:flex;align-items:center;gap:8px;margin:14px 0 10px;font-size:13px;color:var(--ink-3)}.qstem{font-size:17px;line-height:1.7;font-weight:500;margin:0 0 16px}.opt{display:flex;gap:11px;width:100%;text-align:left;padding:13px 14px;border:1.5px solid var(--line);border-radius:12px;background:#fff;margin-bottom:9px;font-size:15px;line-height:1.55;transition:border-color .15s,background .15s}.opt:active{background:var(--brand-tint)}.opt .key{flex:none;width:24px;height:24px;border-radius:50%;background:#eef1f5;color:var(--ink-2);display:grid;place-items:center;font-size:13px;font-weight:600;transition:all .15s}.opt.sel{border-color:var(--brand);background:var(--brand-tint)}.opt.sel .key{background:var(--brand);color:#fff}.opt.right{border-color:var(--ok);background:var(--ok-bg)}.opt.right .key{background:var(--ok);color:#fff}.opt.wrong{border-color:var(--bad);background:var(--bad-bg)}.opt.wrong .key{background:var(--bad);color:#fff}.opt:disabled{cursor:default}.opt.multi .key{border-radius:7px}.mk{display:inline-block;margin-left:8px;padding:1px 7px;border-radius:5px;font-size:11.5px;font-style:normal;font-weight:600;vertical-align:middle;white-space:nowrap}.mk-ok{background:var(--ok);color:#fff}.mk-miss{background:var(--warn);color:#fff}.mk-bad{background:var(--bad);color:#fff}.feedback{border-radius:var(--r);padding:15px;margin-top:14px;animation:pop .22s ease-out}.feedback.good{background:var(--ok-bg);border:1px solid #bfe6d5}.feedback.bad{background:var(--bad-bg);border:1px solid #f3cdcf}.feedback .head{display:flex;align-items:center;gap:7px;font-weight:700;font-size:16px;margin-bottom:8px}.feedback.good .head{color:var(--ok)}.feedback.bad .head{color:var(--bad)}.feedback .body{font-size:14px;line-height:1.7;color:var(--ink);white-space:pre-wrap}.feedback .src{margin-top:8px;font-size:12px;color:var(--ink-3)}@keyframes pop{0%{opacity:0;transform:translateY(6px)}to{opacity:1;transform:none}}.sticky-btm{position:sticky;bottom:0;padding:12px 0 calc(12px + var(--safe-b));background:linear-gradient(180deg,transparent,var(--bg) 22%)}.score-ring{width:168px;height:168px;margin:6px auto 14px;border-radius:50%;display:grid;place-items:center;background:conic-gradient(var(--ring) calc(var(--pct)*1%),#e9eef4 0)}.score-ring .inner{width:136px;height:136px;border-radius:50%;background:#fff;display:grid;place-items:center;text-align:center}.score-ring .num{font-size:38px;font-weight:700;line-height:1;color:var(--ring)}.score-ring .lab{font-size:11px;color:var(--ink-3);margin-top:5px;line-height:1.4}.kpis{display:grid;grid-template-columns:repeat(3,1fr);gap:10px;text-align:center}.kpi{background:var(--brand-tint);border-radius:var(--r-sm);padding:12px 6px}.kpi b{display:block;font-size:19px;font-weight:700;color:var(--brand-dark)}.kpi span{font-size:12px;color:var(--ink-3)}.review{border-left:3px solid var(--line);padding:2px 0 2px 12px;margin-bottom:16px}.review.wrong{border-color:var(--bad)}.review.right{border-color:var(--ok)}.review .st{font-size:15px;line-height:1.6;font-weight:500;margin-bottom:8px}.review .ln{font-size:13.5px;line-height:1.65;color:var(--ink-2)}.review .ln b{color:var(--ink)}.tabs{display:flex;gap:6px;background:#e9eef4;padding:4px;border-radius:11px;margin-bottom:14px}.tabs button{flex:1;padding:9px;border-radius:8px;font-size:14px;color:var(--ink-2);font-weight:500}.tabs button.on{background:#fff;color:var(--brand);font-weight:600;box-shadow:0 1px 3px #1020361a}.rank-row{display:flex;align-items:center;gap:11px;padding:12px 4px;border-bottom:1px solid var(--line)}.rank-row:last-child{border-bottom:0}.rank-row.me{background:var(--brand-tint);margin:0 -10px;padding:12px 14px;border-radius:10px;border-bottom:0}.rank-no{flex:none;width:28px;height:28px;border-radius:8px;display:grid;place-items:center;font-size:13px;font-weight:700;background:#eef1f5;color:var(--ink-2)}.rank-no.g1{background:linear-gradient(135deg,#f6c445,#e0a419);color:#fff}.rank-no.g2{background:linear-gradient(135deg,#c3ccd6,#9aa7b4);color:#fff}.rank-no.g3{background:linear-gradient(135deg,#dda876,#c08850);color:#fff}.rank-name{flex:1;min-width:0}.rank-name b{display:block;font-size:15px;font-weight:600;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.rank-name span{font-size:12px;color:var(--ink-3)}.rank-score{text-align:right;flex:none}.rank-score b{font-size:18px;font-weight:700;color:var(--brand-dark)}.rank-score span{display:block;font-size:11px;color:var(--ink-3)}.tabbar{position:fixed;left:0;right:0;bottom:0;z-index:30;display:flex;background:#fffffff7;-webkit-backdrop-filter:blur(10px);backdrop-filter:blur(10px);border-top:1px solid var(--line);padding-bottom:var(--safe-b)}.tabbar a{flex:1;padding:9px 0 7px;text-align:center;color:var(--ink-3);font-size:11px;line-height:1.5}.tabbar a.on{color:var(--brand);font-weight:600}.tabbar .ic{display:block;font-size:19px;line-height:1.2}.list-item{display:flex;align-items:center;gap:10px;padding:13px 0;border-bottom:1px solid var(--line)}.list-item:last-child{border-bottom:0}.empty{text-align:center;padding:48px 20px;color:var(--ink-3);font-size:14px}.empty .ic{font-size:38px;display:block;margin-bottom:10px;opacity:.55}.center-page{min-height:100vh;display:grid;place-items:center;padding:24px;background:linear-gradient(165deg,#0f5ba8,#0a3a70)}.login-card{width:100%;max-width:380px;background:#fff;border-radius:18px;padding:28px 24px;box-shadow:0 20px 50px #06204047}.login-card h1{margin:0 0 4px;font-size:21px;font-weight:700;text-align:center}.login-card .sub{text-align:center;color:var(--ink-3);font-size:13px;margin-bottom:22px}.admin{display:flex;min-height:100vh;background:var(--bg)}.side{width:190px;flex:none;background:#0d2033;color:#c7d3df;padding:16px 0}.side .brand{padding:0 18px 16px;font-size:15px;font-weight:600;color:#fff;border-bottom:1px solid rgba(255,255,255,.1);margin-bottom:10px}.side a{display:block;padding:11px 18px;color:#a9bacb;font-size:14px;border-left:3px solid transparent}.side a.on{background:#ffffff12;color:#fff;border-left-color:var(--brand)}.side a:hover{color:#fff}.main{flex:1;padding:24px 28px;min-width:0;overflow-x:auto}.main h2{margin:0 0 18px;font-size:20px;font-weight:600}.tbl{width:100%;border-collapse:collapse;background:#fff;border-radius:var(--r);overflow:hidden;box-shadow:var(--shadow);font-size:14px}.tbl th{background:#f6f8fb;padding:11px 12px;text-align:left;font-weight:600;color:var(--ink-2);font-size:13px;white-space:nowrap;border-bottom:1px solid var(--line)}.tbl td{padding:11px 12px;border-bottom:1px solid var(--line);vertical-align:top}.tbl tr:last-child td{border-bottom:0}.tbl tr:hover td{background:#fafcfe}.toolbar{display:flex;flex-wrap:wrap;gap:8px;align-items:center;margin-bottom:14px}.toolbar .input{width:auto;min-width:150px;padding:8px 11px;font-size:14px}.stat-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(150px,1fr));gap:12px;margin-bottom:20px}.stat{background:#fff;border-radius:var(--r);padding:16px;box-shadow:var(--shadow)}.stat b{display:block;font-size:26px;font-weight:700;color:var(--brand-dark);line-height:1.2}.stat span{font-size:13px;color:var(--ink-3)}.modal-bg{position:fixed;top:0;right:0;bottom:0;left:0;background:#0a182880;z-index:100;display:grid;place-items:center;padding:20px}.modal{background:#fff;border-radius:var(--r);width:100%;max-width:640px;max-height:88vh;overflow:auto;padding:22px}.modal h3{margin:0 0 16px;font-size:18px}.bar{height:7px;background:#eef1f5;border-radius:99px;overflow:hidden;min-width:70px}.bar i{display:block;height:100%;border-radius:99px}.opt-edit{display:flex;gap:8px;align-items:center;margin-bottom:7px}.opt-edit .input{flex:1}.opt-edit .pick{flex:none;width:30px;height:30px;border-radius:8px;border:1.5px solid var(--line);display:grid;place-items:center;font-size:13px;font-weight:600;background:#fff;color:var(--ink-3)}.opt-edit .pick.on{background:var(--ok);border-color:var(--ok);color:#fff}.spinner{width:22px;height:22px;border:2.5px solid var(--brand-light);border-top-color:var(--brand);border-radius:50%;animation:spin .7s linear infinite;margin:40px auto}@keyframes spin{to{transform:rotate(360deg)}}@media(max-width:640px){.side{width:60px}.side .brand{font-size:0;padding:0 0 10px}.side a{padding:11px 8px;font-size:11px;text-align:center}.main{padding:14px}}.sec-title{font-size:13px;font-weight:600;color:var(--ink-2);margin:4px 2px 8px;letter-spacing:.02em}.sec-title b{color:var(--brand)}.task-card{display:flex;gap:12px;align-items:flex-start;width:100%;text-align:left;background:var(--card);border:1px solid var(--line);border-radius:14px;padding:14px;margin-bottom:10px;cursor:pointer;transition:box-shadow .15s,transform .06s}.task-card:active{transform:scale(.995)}.task-card:hover{box-shadow:0 2px 10px #0000000f}.task-ic{flex:none;font-size:22px;line-height:1.2}.task-top{display:flex;align-items:center;gap:6px;flex-wrap:wrap}.task-top b{font-size:15px;font-weight:600;color:var(--ink)}.task-sub{display:block;margin-top:4px;font-size:12.5px;color:var(--ink-3)}.task-prog{display:block;margin-top:6px;font-size:12.5px;color:var(--ink-2)}.task-prog b{color:var(--brand)}.task-go{flex:none;align-self:center;color:var(--ink-3);font-size:20px}.due{font-style:normal;margin-left:8px}.due.late{color:var(--bad);font-weight:600}.hint{font-style:normal;color:var(--ink-3)}.sharebox{display:flex;gap:8px;align-items:center;background:var(--brand-tint);border:1px solid var(--line);border-radius:10px;padding:8px 10px}.btn-xs{white-space:nowrap}.sharebox .link{flex:1;min-width:0;font-size:12.5px;font-family:ui-monospace,SFMono-Regular,monospace;color:var(--ink-2);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.tgt{display:flex;flex-wrap:wrap;gap:8px}.pick{display:inline-flex;align-items:center;gap:6px;border:1px solid var(--line);border-radius:8px;padding:5px 10px;font-size:13px;cursor:pointer;background:#fff;-webkit-user-select:none;user-select:none}.pick:hover{border-color:var(--brand)}.pick.on{border-color:var(--brand);background:var(--brand-light);color:var(--brand);font-weight:600}.pick input{margin:0}.pick em{font-style:normal}.pickbox{max-height:220px;overflow:auto;border:1px solid var(--line);border-radius:10px;padding:10px;display:flex;flex-wrap:wrap;gap:8px;background:var(--brand-tint)}.modal-wide{max-width:860px}.logo-lg{display:block;width:64px;height:64px;margin:0 auto 14px;border-radius:16px}.logo-sm{width:26px;height:26px;border-radius:7px;flex:none;background:#fff}.guide{background:linear-gradient(180deg,#f4f9ff,#fff)}.guide h3{font-size:15px}.steps{margin:0;padding-left:20px;color:#3d4c5c;font-size:14px;line-height:1.9}.steps b{color:#0f5ba8}.cardpv{display:flex;gap:10px;align-items:stretch;text-decoration:none;color:inherit;border:1px solid #e3eaf2;border-radius:10px;padding:10px;background:#fbfcfe}.cardpv:active{background:#f2f6fb}.cardpv-txt{flex:1;min-width:0;display:flex;flex-direction:column;justify-content:center;gap:5px}.cardpv-txt b{font-size:14.5px;line-height:1.4;color:#16202b;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden}.cardpv-txt span{font-size:12.5px;color:#8494a4;display:-webkit-box;-webkit-line-clamp:1;-webkit-box-orient:vertical;overflow:hidden}.cardpv img{width:58px;height:58px;flex:none;border-radius:6px;object-fit:cover;align-self:center;background:#e8eef5}
