*,:before,:after{box-sizing:border-box;margin:0;padding:0}:root{--bg:#f8f7f4;--surface:#fff;--border:#e5e7eb;--text:#1a1a2e;--muted:#6b7280;--accent:#4f46e5;--accent-lt:#eef2ff;--correct:#10b981;--hardcode:#f59e0b;--incorrect:#ef4444;--radius:8px;color:var(--text);background:var(--bg);font-family:Inter,system-ui,sans-serif;font-size:15px}body{height:100dvh;overflow:hidden}#root{height:100%}.weakness-report{background:var(--surface);border:1px solid var(--border);border-radius:12px;overflow:hidden}.wr-section{border-bottom:1px solid var(--border);padding:20px}.wr-section:last-child{border-bottom:none}.wr-heading{text-transform:uppercase;letter-spacing:.08em;color:var(--muted);margin-bottom:14px;font-size:12px;font-weight:700}.wr-skill-list{flex-direction:column;gap:10px;list-style:none;display:flex}.wr-skill-row{border-radius:var(--radius);background:#fff5f5;border:1px solid #fecaca;justify-content:space-between;align-items:center;gap:12px;padding:10px 14px;display:flex}.wr-skill-info{flex-direction:column;gap:2px;display:flex}.wr-skill-name{color:var(--text);font-size:14px;font-weight:600}.wr-skill-topic{color:var(--muted);font-size:12px}.wr-skill-right{flex-shrink:0;align-items:center;gap:10px;display:flex}.wr-pct{color:var(--incorrect);font-size:13px;font-weight:700}.wr-link{color:var(--accent);border:1px solid var(--accent);border-radius:var(--radius);white-space:nowrap;padding:4px 10px;font-size:13px;font-weight:600;text-decoration:none}.wr-link:hover{background:var(--accent-lt)}.wr-wrong-list{flex-direction:column;gap:8px;list-style:none;display:flex}.wr-wrong-row{color:var(--muted);align-items:center;gap:10px;font-size:13px;display:flex}.wr-wrong-prompt{flex:1}.wr-more{color:var(--muted);font-size:13px;font-style:italic}.wr-unstarted{color:var(--muted);font-size:14px}.wr-clean{align-items:center;gap:12px;padding:20px;display:flex}.wr-clean-icon{color:var(--correct);font-size:20px}.wr-clean p{color:var(--muted);font-size:14px}.dashboard{flex-direction:column;gap:16px;max-width:680px;height:100%;margin:0 auto;padding:24px 20px 48px;display:flex;overflow-y:auto}.dash-card{background:var(--surface);border:1px solid var(--border);border-radius:12px;flex-direction:column;gap:16px;padding:24px;display:flex}.dash-section-heading{text-transform:uppercase;letter-spacing:.08em;color:var(--muted);margin-bottom:4px;font-size:11px;font-weight:700}.dash-welcome h2{font-size:22px;font-weight:800}.dash-welcome p{color:var(--muted);font-size:15px;line-height:1.6}.dash-welcome-rec strong{color:var(--text)}.dash-cta-row{flex-wrap:wrap;gap:12px;display:flex}.dash-drill-header{justify-content:space-between;align-items:flex-start;gap:12px;display:flex}.dash-drill-header h2{font-size:18px;font-weight:700}.dash-drill-preview{color:var(--muted);margin-top:4px;font-size:13px}.dash-drill-total{color:var(--accent);flex-shrink:0;font-size:28px;font-weight:800}.dash-drill-note{color:var(--hardcode);border-radius:var(--radius);background:#fffbeb;border:1px solid #fde68a;padding:8px 12px;font-size:13px}.dash-skill-grid{flex-direction:column;gap:8px;display:flex}.dash-skill-row{border:1px solid var(--border);border-radius:var(--radius);cursor:pointer;text-align:left;background:0 0;align-items:center;gap:12px;width:100%;padding:10px 12px;transition:background .15s;display:flex}.dash-skill-row:hover{background:var(--bg)}.dash-skill-weak{background:#fff5f5;border-color:#fca5a5}.dash-skill-weak:hover{background:#fee2e2}.dash-skill-name{min-width:160px;font-size:14px;font-weight:600}.dash-meter-wrap{background:var(--border);border-radius:3px;flex:1;height:6px;overflow:hidden}.dash-meter-fill{border-radius:3px;min-width:2px;height:100%;transition:width .5s,background .3s}.dash-meter-pct{color:var(--muted);text-align:right;width:36px;font-size:13px;font-weight:600}.dash-mode-row{gap:10px;display:flex}.dash-mode-btn{border:1px solid var(--border);border-radius:var(--radius);cursor:pointer;text-align:left;background:0 0;flex-direction:column;flex:1;gap:4px;padding:14px;transition:background .15s,border-color .15s;display:flex}.dash-mode-btn:hover{background:var(--bg);border-color:var(--accent)}.dash-mode-title{color:var(--text);font-size:14px;font-weight:700}.dash-mode-sub{color:var(--muted);font-size:12px}.explain-panel{border:1px solid var(--border,#d6dce4);border-left:3px solid var(--accent,#4a6cf7);background:var(--panel-2,#4a6cf70f);border-radius:8px;margin-top:.75rem;padding:.75rem .9rem}.explain-head{margin-bottom:.4rem;font-size:.85rem;font-weight:600}.explain-summary{margin:0 0 .55rem;font-size:.86rem;line-height:1.5}.explain-link{color:var(--accent,#4a6cf7);font-size:.84rem;font-weight:600;text-decoration:none;display:inline-block}.explain-link:hover{text-decoration:underline}.feedback-panel{background:var(--surface);border-top:1px solid var(--border);border-radius:0 0 var(--radius) var(--radius);flex-direction:column;gap:16px;padding:20px;display:flex}.feedback-status{border-radius:var(--radius);border:2px solid;align-items:center;gap:8px;padding:10px 14px;font-weight:600;display:flex}.feedback-icon{font-size:18px}.feedback-score{color:var(--muted);margin-left:auto;font-size:13px;font-weight:400}.feedback-explanation{color:var(--text);font-size:14px;line-height:1.6}.feedback-solution{flex-direction:column;gap:8px;display:flex}.solution-formula{border-radius:var(--radius);color:var(--accent);white-space:pre-wrap;word-break:break-all;background:#f1f5f9;padding:10px 14px;font-family:JetBrains Mono,Fira Code,monospace;font-size:13px;display:block}.feedback-hints-used{color:var(--muted);font-size:13px}.hints-label{font-style:italic}.qv-layout{flex:1;min-height:0;display:flex;overflow:hidden}.mock-exam-wrapper>.qv-layout{height:auto}.qv-sidebar{background:var(--surface);border-right:1px solid var(--border);flex-direction:column;width:380px;min-width:320px;display:flex;overflow-y:auto}.qv-meta{border-bottom:1px solid var(--border);flex-wrap:wrap;align-items:center;gap:8px;padding:16px 20px 12px;display:flex}.qv-progress{color:var(--muted);margin-left:auto;font-size:13px}.badge{letter-spacing:.02em;border-radius:20px;padding:3px 10px;font-size:12px;font-weight:600}.badge-skill{background:var(--accent-lt);color:var(--accent)}.badge-easy{color:#166534;background:#dcfce7}.badge-medium{color:#92400e;background:#fef3c7}.badge-hard{color:#991b1b;background:#fee2e2}.qv-prompt{border-bottom:1px solid var(--border);padding:20px}.qv-prompt-heading{text-transform:uppercase;letter-spacing:.08em;color:var(--muted);margin-bottom:10px;font-size:11px;font-weight:700}.qv-prompt-text{color:var(--text);font-size:14px;line-height:1.65}.qv-schema{border-bottom:1px solid var(--border)}.qv-schema-summary{text-transform:uppercase;letter-spacing:.08em;color:var(--muted);cursor:pointer;-webkit-user-select:none;user-select:none;padding:10px 20px;font-size:11px;font-weight:700;list-style:none}.qv-schema-summary::-webkit-details-marker{display:none}.qv-schema-summary:before{content:"▶ ";font-size:9px}.qv-schema[open] .qv-schema-summary:before{content:"▼ "}.qv-schema-pre{color:var(--text);background:var(--bg);border-top:1px solid var(--border);white-space:pre;max-height:180px;padding:12px 20px;font-family:JetBrains Mono,Consolas,monospace;font-size:11px;line-height:1.55;overflow:auto}.qv-hints{border-bottom:1px solid var(--border);flex-direction:column;gap:12px;padding:16px 20px;display:flex}.hint-item{background:var(--accent-lt);border-radius:var(--radius);padding:10px 14px}.hint-num{text-transform:uppercase;letter-spacing:.08em;color:var(--accent);margin-bottom:4px;font-size:11px;font-weight:700;display:block}.hint-item p{color:var(--text);font-size:13px;line-height:1.5}.btn-hint{border:1px dashed var(--accent);border-radius:var(--radius);color:var(--accent);cursor:pointer;background:0 0;align-self:flex-start;padding:7px 14px;font-size:13px}.btn-hint:hover{background:var(--accent-lt)}.btn-submit{background:var(--accent);color:#fff;border-radius:var(--radius);cursor:pointer;border:none;margin:20px;padding:12px 20px;font-size:15px;font-weight:600;transition:opacity .15s}.btn-submit:hover:not(:disabled){opacity:.88}.btn-submit:disabled{opacity:.45;cursor:default}.qv-grading{color:var(--muted);padding:20px;font-size:14px;font-style:italic}.qv-minimal-done{flex-direction:column;gap:12px;padding:20px;display:flex}.qv-mini-status{font-size:14px;font-weight:600}.status-incorrect,.status-error{color:var(--incorrect)}.qv-init-error{color:var(--incorrect);flex-direction:column;gap:12px;padding:2rem;display:flex}.qv-init-error code{font-family:monospace;font-size:13px}.qv-editor-area{flex-direction:column;flex:1;min-width:0;display:flex;overflow:hidden}.qv-editor-section{border-bottom:2px solid var(--border);flex-direction:column;flex:0 0 50%;min-height:0;display:flex}.qv-sidebar-spacer{flex:1}.qv-panel-header{border-bottom:1px solid var(--border);background:var(--surface);flex-shrink:0;justify-content:space-between;align-items:center;padding:8px 16px;display:flex}.qv-panel-label{text-transform:uppercase;letter-spacing:.08em;color:var(--muted);font-size:11px;font-weight:700}.btn-run{background:var(--accent);color:#fff;border-radius:var(--radius);cursor:pointer;border:none;padding:4px 14px;font-size:12px;font-weight:600;transition:opacity .15s}.btn-run:hover:not(:disabled){opacity:.88}.btn-run:disabled{opacity:.4;cursor:default}.qv-sql-editor{color:#cdd6f4;resize:none;tab-size:2;background:#1e1e2e;border:none;outline:none;flex:1;width:100%;padding:16px;font-family:JetBrains Mono,Fira Code,Consolas,monospace;font-size:14px;line-height:1.65}.qv-sql-editor::placeholder{color:#585b70}.qv-sql-editor[readonly]{opacity:.75}.qv-results-section{background:var(--surface);flex-direction:column;flex:1;min-height:0;display:flex}.qv-row-count{color:var(--muted);font-size:12px}.qv-results-empty{color:var(--muted);padding:20px;font-size:13px;font-style:italic}.qv-results-error{color:var(--incorrect);padding:16px 20px}.qv-results-error strong{margin-bottom:6px;font-size:13px;display:block}.qv-results-error code{border-radius:var(--radius);white-space:pre-wrap;word-break:break-all;background:#fff0f0;padding:8px 10px;font-family:JetBrains Mono,Consolas,monospace;font-size:12px;display:block}.qv-results-scroll{flex:1;overflow:auto}.qv-results-table{border-collapse:collapse;width:max-content;min-width:100%;font-size:13px}.qv-results-table th{background:var(--bg);text-align:left;text-transform:uppercase;letter-spacing:.06em;color:var(--muted);border-bottom:1px solid var(--border);white-space:nowrap;z-index:1;padding:8px 16px;font-size:11px;font-weight:700;position:sticky;top:0}.qv-results-table td{border-bottom:1px solid var(--border);color:var(--text);white-space:nowrap;padding:7px 16px;font-family:JetBrains Mono,Consolas,monospace;font-size:12px}.qv-results-table tr:last-child td{border-bottom:none}.qv-results-table tbody tr:hover td{background:var(--bg)}.null-val{color:var(--muted);font-size:11px;font-style:italic}.practice-screen{height:100%;padding:24px;overflow-y:auto}.practice-header{align-items:center;gap:16px;margin-bottom:28px;display:flex}.practice-header h2{font-size:20px;font-weight:700}.skill-grid{grid-template-columns:repeat(auto-fill,minmax(280px,1fr));gap:16px;display:grid}.skill-card{background:var(--surface);border:1px solid var(--border);border-radius:12px;flex-direction:column;gap:12px;padding:20px;display:flex}.skill-card-top{justify-content:space-between;align-items:baseline;display:flex}.skill-name{font-size:15px;font-weight:700}.skill-mastery{color:var(--correct);font-size:13px;font-weight:600}.mastery-bar{background:var(--border);border-radius:2px;height:4px;overflow:hidden}.mastery-fill{background:var(--correct);border-radius:2px;height:100%;transition:width .4s}.diff-buttons{gap:8px;display:flex}.btn-diff{border-radius:var(--radius);cursor:pointer;background:0 0;border:2px solid;flex:1;padding:7px 0;font-size:13px;font-weight:600;transition:background .15s}.btn-diff-easy{color:#166534;border-color:#86efac}.btn-diff-easy:hover{background:#dcfce7}.btn-diff-medium{color:#92400e;border-color:#fcd34d}.btn-diff-medium:hover{background:#fef3c7}.btn-diff-hard{color:#991b1b;border-color:#fca5a5}.btn-diff-hard:hover{background:#fee2e2}.btn-diff-locked{opacity:.4;cursor:not-allowed}.btn-diff-locked:hover{background:0 0}.practice-done{text-align:center;flex-direction:column;gap:16px;max-width:480px;margin:80px auto;padding:24px;display:flex}.practice-done h2{font-size:24px;font-weight:800}.practice-done p{color:var(--muted);font-size:15px}.practice-done-actions{flex-wrap:wrap;justify-content:center;gap:12px;display:flex}.diag-screen{max-width:640px;margin:0 auto;padding:40px 24px}.diag-intro{flex-direction:column;gap:24px;display:flex}.diag-intro-card{background:var(--surface);border:1px solid var(--border);border-radius:12px;flex-direction:column;gap:16px;padding:32px;display:flex}.diag-intro-card h2{font-size:22px;font-weight:800}.diag-intro-card p{color:var(--muted);font-size:15px;line-height:1.6}.diag-skill-list{flex-direction:column;gap:6px;padding-left:0;list-style:none;display:flex}.diag-skill-list li{background:var(--bg);border-radius:var(--radius);color:var(--text);padding:8px 12px;font-size:14px}.diag-skill-list li:before{content:"→ ";color:var(--accent);font-weight:700}.diag-results{flex-direction:column;gap:24px;display:flex}.diag-results h2{font-size:22px;font-weight:800}.diag-results-sub{color:var(--muted);margin-top:-16px;font-size:14px}.diag-results-list{flex-direction:column;gap:10px;display:flex}.diag-result-row{background:var(--surface);border:1px solid var(--border);border-radius:var(--radius);align-items:center;gap:12px;padding:12px 16px;display:flex}.diag-weakest{border-color:var(--accent);background:var(--accent-lt)}.diag-rank{color:var(--muted);width:24px;font-size:13px;font-weight:700}.diag-result-skill{min-width:160px;font-size:14px;font-weight:600}.diag-result-bar-wrap{background:var(--border);border-radius:3px;flex:1;height:6px;overflow:hidden}.diag-result-bar{background:var(--accent);border-radius:3px;height:100%;transition:width .6s}.diag-result-pct{color:var(--muted);text-align:right;width:36px;font-size:13px;font-weight:600}.diag-start-tag{text-transform:uppercase;letter-spacing:.06em;color:var(--accent);background:var(--accent-lt);border-radius:10px;padding:3px 8px;font-size:11px;font-weight:700}.diag-results-actions{flex-wrap:wrap;gap:12px;display:flex}.mock-screen{max-width:640px;margin:0 auto;padding:40px 24px}.mock-setup{flex-direction:column;gap:24px;display:flex}.mock-setup-card{background:var(--surface);border:1px solid var(--border);border-radius:12px;flex-direction:column;gap:20px;padding:32px;display:flex}.mock-setup-card h2{font-size:22px;font-weight:800}.mock-setup-card p{color:var(--muted);font-size:15px;line-height:1.6}.mock-duration-row{gap:12px;display:flex}.btn-duration{border:2px solid var(--border);border-radius:var(--radius);cursor:pointer;color:var(--text);background:0 0;flex:1;padding:12px 0;font-size:15px;font-weight:600;transition:border-color .15s,background .15s}.btn-duration:hover{border-color:var(--accent);background:var(--accent-lt)}.btn-duration.selected{border-color:var(--accent);background:var(--accent-lt);color:var(--accent)}.mock-exam-wrapper{flex-direction:column;flex:1;min-height:0;display:flex;overflow:hidden}.mock-timer{background:var(--surface);border-bottom:1px solid var(--border);color:var(--text);flex-shrink:0;justify-content:space-between;align-items:center;padding:8px 20px;font-size:15px;font-weight:700;display:flex}.mock-timer-urgent{color:var(--incorrect);border-bottom-color:var(--incorrect);background:#fef2f2}.btn-submit-early{border:1px solid var(--border);border-radius:var(--radius);cursor:pointer;color:var(--muted);background:0 0;padding:6px 14px;font-size:13px}.btn-submit-early:hover{background:var(--bg)}.mock-review{flex-direction:column;gap:24px;max-height:100%;display:flex;overflow-y:auto}.mock-review-header{justify-content:space-between;align-items:baseline;gap:16px;display:flex}.mock-review-header h2{font-size:22px;font-weight:800}.mock-score{flex-direction:column;align-items:flex-end;display:flex}.mock-score-num{color:var(--accent);font-size:28px;font-weight:800}.mock-score-pct{color:var(--muted);font-size:13px}.mock-review-list{flex-direction:column;gap:8px;display:flex}.review-row{border-radius:var(--radius);border:1px solid var(--border);background:var(--surface);overflow:hidden}.review-summary{cursor:pointer;align-items:center;gap:10px;padding:12px 16px;list-style:none;display:flex}.review-summary::-webkit-details-marker{display:none}.review-summary:before{content:"▶";color:var(--muted);margin-right:4px;font-size:10px}details[open] .review-summary:before{content:"▼"}.review-skill{flex:1;font-size:14px;font-weight:600}.review-status{margin-left:auto;font-size:13px;font-weight:600}.status-correct{color:var(--correct)}.status-hardcoded,.status-partial{color:var(--hardcode)}.status-incorrect{color:var(--incorrect)}.status-skipped{color:var(--muted)}.review-detail{border-top:1px solid var(--border);background:var(--bg);flex-direction:column;gap:10px;padding:16px;display:flex}.review-prompt{color:var(--muted);font-size:13px;font-style:italic}.review-explanation{color:var(--text);font-size:14px;line-height:1.6}.review-formula{border-radius:var(--radius);color:var(--accent);background:#f1f5f9;padding:8px 12px;font-family:JetBrains Mono,Fira Code,monospace;font-size:13px;display:block}.review-skipped{opacity:.5}.mock-review-actions{flex-wrap:wrap;gap:12px;padding-bottom:40px;display:flex}.btn-ghost{border:1px solid var(--border);border-radius:var(--radius);cursor:pointer;color:var(--muted);background:0 0;padding:10px 20px;font-size:14px;transition:background .15s}.qd-loading{height:100%;color:var(--muted);justify-content:center;align-items:center;font-size:15px;font-style:italic;display:flex}.qd-screen{flex-direction:column;gap:20px;max-width:600px;height:100%;margin:0 auto;padding:32px 20px 48px;display:flex;overflow-y:auto}.btn-back{color:var(--muted);cursor:pointer;background:0 0;border:none;align-self:flex-start;padding:4px 0;font-size:14px}.qd-preview-card{background:var(--surface);border:1px solid var(--border);border-radius:12px;flex-direction:column;gap:20px;padding:28px;display:flex}.qd-preview-card h2{font-size:22px;font-weight:800}.qd-breakdown{flex-direction:column;gap:10px;display:flex}.qd-breakdown-row{border-radius:var(--radius);border:1px solid;align-items:center;gap:16px;padding:12px 16px;display:flex}.qd-wrong{background:#fff5f5;border-color:#fca5a5}.qd-fresh{background:#f0fdf4;border-color:#a7f3d0}.qd-reinforce{background:#fffbeb;border-color:#fde68a}.qd-count{text-align:center;min-width:36px;font-size:28px;font-weight:800}.qd-wrong .qd-count{color:var(--incorrect)}.qd-fresh .qd-count{color:var(--correct)}.qd-reinforce .qd-count{color:var(--hardcode)}.qd-label{flex-direction:column;gap:2px;display:flex}.qd-label strong{color:var(--text);font-size:14px;font-weight:700}.qd-label span{color:var(--muted);font-size:13px}.qd-empty-card{background:var(--surface);border:1px solid var(--border);border-radius:12px;flex-direction:column;gap:16px;padding:32px;display:flex}.qd-empty-card h2{font-size:20px;font-weight:800}.qd-empty-card p{color:var(--muted);font-size:14px;line-height:1.6}.qd-done-header{justify-content:space-between;align-items:baseline;display:flex}.qd-done-header h2{font-size:22px;font-weight:800}.qd-done-score{color:var(--accent);font-size:24px;font-weight:800}.qd-done-actions{flex-wrap:wrap;gap:12px;display:flex}.btn-primary{background:var(--accent);color:#fff;border-radius:var(--radius);cursor:pointer;border:none;align-self:flex-start;padding:10px 20px;font-size:14px;font-weight:600;transition:opacity .15s}.btn-primary:hover{opacity:.88}.btn-ghost{border:1px solid var(--border);border-radius:var(--radius);cursor:pointer;color:var(--muted);background:0 0;align-self:flex-start;padding:10px 20px;font-size:14px;transition:background .15s}.app{flex-direction:column;height:100dvh;display:flex;overflow:hidden}.app-topbar{background:var(--surface);border-bottom:1px solid var(--border);z-index:10;flex-shrink:0;justify-content:space-between;align-items:center;height:44px;padding:0 20px;display:flex}.app-logo{color:var(--text);cursor:pointer;background:0 0;border:none;padding:0;font-size:15px;font-weight:700}.app-stats{align-items:center;gap:12px;display:flex}.stat{color:var(--muted);font-size:13px;font-weight:500}.stat.level{background:var(--accent);color:#fff;border-radius:12px;padding:2px 10px;font-size:12px;font-weight:700}.app-body{flex-direction:column;flex:1;min-height:0;display:flex;overflow:hidden}.btn-primary{background:var(--accent);color:#fff;border-radius:var(--radius);cursor:pointer;border:none;padding:10px 20px;font-size:14px;font-weight:600;transition:opacity .15s}.btn-primary:hover:not(:disabled){opacity:.88}.btn-primary:disabled{opacity:.45;cursor:default}.btn-ghost{color:var(--accent);border:1px solid var(--border);border-radius:var(--radius);cursor:pointer;background:0 0;padding:10px 20px;font-size:14px;font-weight:500;transition:background .15s}.btn-ghost:hover{background:var(--accent-lt)}.btn-back{color:var(--muted);cursor:pointer;background:0 0;border:none;padding:4px 0;font-size:14px}.btn-back:hover{color:var(--text)}
