:root{--blue:#1a5fb4;--blue-dark:#164a8c;--bg:#f3f5f9;--card:#ffffff;--line:#d7dce3;--text:#1f2937;--muted:#6b7280;--green:#188038;--red:#c5221f;--orange:#b45309}*{box-sizing:border-box}body{margin:0;font-family:Microsoft YaHei,PingFang SC,system-ui,sans-serif;background:var(--bg);color:var(--text)}a{color:var(--blue);text-decoration:none}a:hover{text-decoration:underline}.topnav{background:var(--blue);color:#fff;display:flex;align-items:center;gap:4px;padding:0 20px;height:52px;position:-webkit-sticky;position:sticky;top:0;z-index:50}.topnav .brand{font-weight:700;font-size:17px;margin-right:24px}.topnav a{color:#dbe8fb;padding:6px 12px;border-radius:6px;font-size:14px}.topnav a:hover{background:var(--blue-dark);text-decoration:none}.topnav .spacer{flex:1 1}.topnav .user{font-size:13px;color:#bcd3f5;margin-right:8px}.container{max-width:1080px;margin:24px auto;padding:0 16px}.card{background:var(--card);border:1px solid var(--line);border-radius:10px;padding:20px;margin-bottom:16px}.card h2,.card h3{margin-top:0}.btn{display:inline-block;border:1px solid var(--blue);background:var(--blue);color:#fff;border-radius:6px;padding:8px 18px;font-size:14px;cursor:pointer}.btn,.btn:hover{text-decoration:none}.btn:hover{background:var(--blue-dark)}.btn.secondary{background:#fff;color:var(--blue)}.btn.secondary:hover{background:#eaf1fb}.btn.danger{background:#fff;color:var(--red);border-color:var(--red)}.btn.danger:hover{background:#fdeceb}.btn.small{padding:4px 10px;font-size:13px}.btn:disabled{opacity:.55;cursor:not-allowed}.tag{display:inline-block;background:#eaf1fb;color:var(--blue-dark);border-radius:4px;padding:1px 8px;font-size:12px;margin-right:6px}.tag.red{background:#fdeceb;color:var(--red)}.tag.green{background:#e6f4ea;color:var(--green)}.tag.orange{background:#fef3e2;color:var(--orange)}table.data{width:100%;border-collapse:collapse;font-size:14px}table.data td,table.data th{border-bottom:1px solid var(--line);padding:8px 10px;text-align:left;vertical-align:top}table.data th{background:#f7f9fc;color:var(--muted);font-weight:600}.muted{color:var(--muted);font-size:13px}.stat-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(160px,1fr));grid-gap:12px;gap:12px}.stat{background:var(--card);border:1px solid var(--line);border-radius:10px;padding:16px;text-align:center}.stat .num{font-size:28px;font-weight:700;color:var(--blue)}.stat .label{color:var(--muted);font-size:13px;margin-top:4px}.login-wrap{min-height:100vh;display:flex;align-items:center;justify-content:center}.login-box{width:360px;background:#fff;border-radius:12px;padding:32px;box-shadow:0 8px 30px rgba(0,0,0,.08)}.login-box h1{font-size:20px;margin:0 0 6px}.login-box label{display:block;font-size:13px;color:var(--muted);margin:14px 0 4px}.login-box input{width:100%;padding:9px 10px;border:1px solid var(--line);border-radius:6px;font-size:14px}.login-box .btn{width:100%;margin-top:20px;padding:10px}.login-err{color:var(--red);font-size:13px;margin-top:10px;min-height:18px}.exam-header{position:-webkit-sticky;position:sticky;top:52px;z-index:40;background:#fff;border-bottom:1px solid var(--line);padding:10px 20px;display:flex;align-items:center;gap:16px}.exam-timer{font-size:18px;font-weight:700;color:var(--blue);font-feature-settings:"tnum";font-variant-numeric:tabular-nums}.exam-timer.warn{color:var(--red)}.exam-body{display:flex;gap:16px;max-width:1280px;margin:16px auto;padding:0 16px;align-items:flex-start}.exam-main{flex:1 1;min-width:0}.qcard{background:#fff;border:1px solid var(--line);border-radius:10px;padding:18px 20px;margin-bottom:14px}.qcard .qhead{display:flex;gap:8px;align-items:baseline;margin-bottom:8px}.qcard .qno{font-weight:700;color:var(--blue);white-space:nowrap}.qcard .stem{line-height:1.8;white-space:pre-wrap}.qcard .opt{display:block;padding:7px 10px;border-radius:6px;cursor:pointer;line-height:1.6}.qcard .opt:hover{background:#f0f5fc}.qcard .opt.sel{background:#dce9fa}.qcard .opt input{margin-right:8px}.qcard textarea{width:100%;min-height:140px;border:1px solid var(--line);border-radius:6px;padding:10px;font-size:14px;line-height:1.7;font-family:inherit}.mark-row{margin-top:8px;font-size:13px;color:var(--orange);cursor:pointer;-webkit-user-select:none;-moz-user-select:none;user-select:none}.exam-side{width:240px;flex-shrink:0;background:#fff;border:1px solid var(--line);border-radius:10px;padding:14px;position:-webkit-sticky;position:sticky;top:118px;max-height:calc(100vh - 140px);overflow:auto}.exam-side h4{margin:0 0 10px;font-size:14px}.navgrid{display:grid;grid-template-columns:repeat(5,1fr);grid-gap:6px;gap:6px}.navgrid button{aspect-ratio:1;border:1px solid var(--line);border-radius:4px;background:#fff;font-size:12px;cursor:pointer;padding:0}.navgrid button.answered{background:var(--blue);color:#fff;border-color:var(--blue)}.navgrid button.marked{background:var(--orange);color:#fff;border-color:var(--orange)}.navgrid button.current{outline:2px solid var(--blue-dark)}.legend{margin-top:10px;font-size:12px;color:var(--muted);line-height:1.9}.legend i{display:inline-block;width:10px;height:10px;border-radius:2px;margin-right:6px}.legend i,.review-q{border:1px solid var(--line)}.review-q{border-radius:10px;padding:16px;margin-bottom:12px;background:#fff}.review-q.wrong{border-left:4px solid var(--red)}.review-q.right{border-left:4px solid var(--green)}.review-q .ans-line{line-height:1.9}.expl,.review-q .ans-line{margin-top:8px;font-size:14px}.expl{background:#f7f9fc;border-radius:6px;padding:10px 12px;line-height:1.8;white-space:pre-wrap}.ai-box{background:#f3f0fd;border:1px solid #d9d0f5;border-radius:8px;padding:14px;margin-top:10px;font-size:14px;line-height:1.9}.ai-box h4{margin:0 0 8px;color:#5b3fc4}.article{background:#fff;border:1px solid var(--line);border-radius:10px;padding:28px 32px;line-height:1.9}.article h1,.article h2,.article h3{line-height:1.4}.article table{border-collapse:collapse}.article td,.article th{border:1px solid var(--line);padding:6px 12px}.article code{background:#f0f2f5;padding:1px 5px;border-radius:4px}.tts-bar{display:flex;gap:8px;align-items:center;margin:12px 0;flex-wrap:wrap}.tts-status{font-size:13px;color:var(--muted)}.form-inline{display:flex;gap:10px;align-items:center;flex-wrap:wrap}input[type=text],select{padding:7px 10px;border:1px solid var(--line);border-radius:6px;font-size:14px}