:root{color:#0f172a;font-synthesis:none;text-rendering:optimizelegibility;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;background-color:#f1f5f9;font-family:Inter,system-ui,sans-serif;font-weight:400;line-height:1.5}*{box-sizing:border-box}body{background:#f1f5f9;min-height:100vh;margin:0}a{color:inherit;text-decoration:none}.app{flex-direction:column;gap:1.5rem;max-width:1200px;margin:0 auto;padding:2rem 1.5rem 3rem;display:flex}.login-page{background:radial-gradient(1200px 600px at 10% -10%,#dbeafe 0%,#0000 65%),radial-gradient(900px 520px at 100% 10%,#d1fae5 0%,#0000 60%),#f1f5f9;place-items:center;min-height:100vh;padding:1.5rem;display:grid}.app-header{flex-wrap:wrap;justify-content:space-between;align-items:center;gap:1rem;display:flex}.app-header h1{margin:0;font-size:2rem}.app-header p{color:#6b7280;margin:.25rem 0 0}.actions button{cursor:pointer;background:#fff;border:1px solid #e5e7eb;border-radius:.6rem;padding:.6rem 1rem}.page-nav{flex-wrap:wrap;gap:.5rem;display:flex}.page-nav .nav-btn{color:#334155;background:#f1f5f9;border:1px solid #cbd5e1;padding:.5rem .8rem}.page-nav .nav-btn.active{color:#1d4ed8;background:#dbeafe;border-color:#93c5fd}.grid{grid-template-columns:repeat(auto-fit,minmax(320px,1fr));gap:1.5rem;display:grid}.card{background:#fff;border-radius:1rem;padding:1.5rem;box-shadow:0 10px 25px #0f172a0f}.card h2{margin-top:0}.login-card{width:min(560px,100vw - 2rem)}.login-shell{border:1px solid #dbeafe;box-shadow:0 24px 48px #0f172a1f}.login-brand h1{letter-spacing:.01em;margin:0;font-size:2.1rem}.login-brand p{color:#475569;margin:.3rem 0 1rem}.login-form{gap:.5rem;display:grid}.login-form .primary{justify-self:start}label{margin-top:.75rem;margin-bottom:.3rem;font-weight:600;display:block}.muted{color:#6b7280;margin:.5rem 0 0;font-size:.9rem}select,input{background:#f9fafb;border:1px solid #e5e7eb;border-radius:.6rem;width:100%;padding:.65rem .75rem}button{cursor:pointer;background:#e5e7eb;border:none;border-radius:.6rem;padding:.6rem 1rem;font-weight:600}button.primary{color:#fff;background:#2563eb;margin-top:1rem}button.secondary{color:#fff;background:#0f766e;margin-top:.5rem}button:disabled{opacity:.6;cursor:not-allowed}.repo-list{flex-direction:column;gap:.75rem;margin-top:1rem;display:flex}.test-selector{flex-direction:column;gap:.5rem;margin-top:1rem;display:flex}.test-selector-header{justify-content:space-between;align-items:center;display:flex}.test-actions{gap:.5rem;display:flex}.test-actions button{background:#e2e8f0;border-radius:.5rem;padding:.35rem .6rem;font-size:.8rem}.test-list{background:#f8fafc;border:1px solid #e5e7eb;border-radius:.75rem;gap:.5rem;max-height:220px;padding:.75rem;display:grid;overflow:auto}.test-item{grid-template-columns:auto 1fr;align-items:center;gap:.5rem;margin:0;font-weight:500;display:grid}.test-item input{width:auto;margin:0}.repo-row{grid-template-columns:minmax(120px,1fr) 180px 90px;align-items:center;gap:.75rem;display:grid}.repo-url{color:#374151;word-break:break-all;font-size:.9rem}.runs{flex-direction:column;gap:.75rem;display:flex}.run-item{cursor:pointer;background:#f8fafc;border:1px solid #0000;border-radius:.75rem;justify-content:space-between;align-items:center;padding:.75rem 1rem;display:flex}.run-item.active{background:#eff6ff;border-color:#2563eb}.status{text-transform:uppercase;border-radius:999px;padding:.2rem .6rem;font-size:.75rem;font-weight:700}.status.running{color:#92400e;background:#fef3c7}.status.completed{color:#166534;background:#dcfce7}.status.failed{color:#991b1b;background:#fee2e2}.alert.error{color:#991b1b;background:#fee2e2;border-radius:.75rem;padding:.75rem 1rem}.run-detail{flex-direction:column;gap:1rem;display:flex}.detail-header{justify-content:space-between;align-items:center;display:flex}.repo-search-row{gap:.4rem;display:grid}.repo-search-row label{margin:0}.repo-detail{border:1px solid #e5e7eb;border-radius:.75rem;padding:1rem}.repo-detail-header{text-align:left;background:#f8fafc;border:1px solid #e5e7eb;border-radius:.6rem;justify-content:space-between;align-items:center;gap:1rem;width:100%;margin-bottom:.75rem;padding:.65rem .75rem;display:flex}.repo-summary{flex-direction:column;gap:.5rem;margin-bottom:.75rem;display:flex}.summary-row{color:#1f2937;justify-content:space-between;font-weight:600;display:flex}.global-grade-row{color:#0f172a;justify-content:space-between;align-items:baseline;font-weight:700;display:flex}.global-grade-value{color:#166534;font-size:1.05rem}.global-grade-badge-wrap{align-items:center;gap:.45rem;display:flex}.grade-classes{grid-template-columns:repeat(auto-fit,minmax(150px,1fr));gap:.5rem;display:grid}.grade-class-item{background:#f8fbff;border:1px solid #dbeafe;border-radius:.6rem;flex-direction:column;gap:.15rem;padding:.5rem .65rem;display:flex}.grade-class-name{color:#1e3a8a;font-size:.85rem;font-weight:700}.grade-class-score{color:#1f2937;font-size:.95rem;font-weight:700}.grade-class-head{justify-content:space-between;align-items:center;gap:.35rem;display:flex}.role-badge{border:1px solid #0000;border-radius:999px;padding:.1rem .45rem;font-size:.72rem;font-weight:800}.role-a{color:#14532d;background:#dcfce7;border-color:#86efac}.role-b{color:#0c4a6e;background:#e0f2fe;border-color:#7dd3fc}.role-c{color:#78350f;background:#fef3c7;border-color:#fcd34d}.role-d{color:#7c2d12;background:#ffedd5;border-color:#fdba74}.role-e{color:#7f1d1d;background:#fee2e2;border-color:#fca5a5}.grade-class-item small{color:#475569}.progress{background:#e2e8f0;border-radius:999px;width:100%;height:8px;overflow:hidden}.progress-bar{background:linear-gradient(90deg,#22c55e,#16a34a);height:100%;transition:width .2s}.failure-note{color:#991b1b;background:#fee2e2;border-radius:.5rem;padding:.4rem .6rem;font-size:.85rem}.repo-error{color:#991b1b;background:#fee2e2;border-radius:.5rem;margin-bottom:.75rem;padding:.5rem .75rem;font-size:.85rem}.tests{gap:.5rem;display:grid}.test{background:#f8fafc;border-left:4px solid #e5e7eb;border-radius:.5rem;padding:.5rem .75rem}.test.failed{border-left-color:#ef4444}.test.passed{border-left-color:#22c55e}.test.skipped{border-left-color:#f59e0b}.test small{color:#6b7280;margin-top:.25rem;display:block}.test .test-io{white-space:pre-wrap;overflow-wrap:anywhere;word-break:break-word;color:#374151;background:#eef2ff;border-radius:.35rem;max-height:14rem;padding:.35rem .45rem;font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace;overflow:auto}.cheat-panel-header{justify-content:space-between;align-items:flex-start;gap:.75rem;display:flex}.cheat-group-filter{gap:.25rem;margin-top:.45rem;display:grid}.cheat-group-filter label{margin:0;font-size:.85rem}.cheat-panel-header .primary{margin-top:0}.cheat-runs-list{gap:.65rem;margin-top:.85rem;display:grid}.cheat-detail{gap:.8rem;margin-top:1rem;display:grid}.cheat-stats{grid-template-columns:repeat(auto-fit,minmax(170px,1fr));gap:.6rem;display:grid}.stat-box{background:#f8fbff;border:1px solid #dbeafe;border-radius:.65rem;gap:.2rem;padding:.6rem .7rem;display:grid}.stat-box span{color:#475569;font-size:.85rem}.stat-box strong{color:#0f172a;font-size:1.05rem}.cheat-section{gap:.5rem;display:grid}.cheat-section h4{margin:0}.cheat-item{background:#f8fafc;border:1px solid #e5e7eb;border-radius:.6rem;gap:.2rem;padding:.55rem .65rem;display:grid}.collapsible-item{padding:0}.collapsible-item>summary{cursor:pointer;gap:.2rem;padding:.55rem .65rem;list-style:none;display:grid}.collapsible-item>summary::-webkit-details-marker{display:none}.collapsible-item>summary:before{content:"▸";color:#64748b;margin-right:.35rem}.collapsible-item[open]>summary:before{content:"▾"}.cheat-item-body{border-top:1px solid #e5e7eb;gap:.2rem;padding:.5rem .65rem .6rem;display:grid}.cheat-item a{color:#1d4ed8;font-size:.9rem;text-decoration:none}.cheat-item a:hover{text-decoration:underline}.indicator-details{gap:.35rem;margin-top:.25rem;display:grid}.indicator-detail{border-left:3px solid #bfdbfe;gap:.15rem;padding-left:.45rem;display:grid}.indicator-detail>summary{cursor:pointer;list-style:none}.indicator-detail>summary::-webkit-details-marker{display:none}.indicator-detail>summary:before{content:"▸";color:#64748b;margin-right:.3rem}.indicator-detail[open]>summary:before{content:"▾"}.indicator-detail-body{gap:.15rem;margin-top:.2rem;display:grid}.student-page{gap:1rem;display:grid}.student-page-head{flex-wrap:wrap;justify-content:space-between;align-items:baseline;gap:.75rem;display:flex}.student-toolbar{grid-template-columns:220px minmax(240px,420px);gap:.75rem;display:grid}.student-layout{grid-template-columns:320px 1fr;gap:.9rem;display:grid}.student-list{gap:.55rem;max-height:70vh;padding-right:.25rem;display:grid;overflow:auto}.student-item{text-align:left;background:#f8fafc;border:1px solid #e2e8f0;border-radius:.7rem;gap:.2rem;padding:.6rem .65rem;display:grid}.student-item.active{background:#eff6ff;border-color:#2563eb}.student-item-head{justify-content:space-between;align-items:center;gap:.5rem;display:flex}.student-project-pill{color:#334155;text-transform:uppercase;background:#f1f5f9;border:1px solid #cbd5e1;border-radius:999px;padding:.12rem .45rem;font-size:.72rem;font-weight:700}.trend-up{color:#166534}.trend-down{color:#b91c1c}.student-detail{border:1px solid #e2e8f0;border-radius:.8rem;gap:.8rem;padding:.8rem;display:grid}.student-detail-head{justify-content:space-between;align-items:center;gap:.6rem;display:flex}.student-detail-head h3{margin:0}.student-chart-wrap{background:#fff;border:1px solid #e2e8f0;border-radius:.7rem;padding:.25rem}.student-chart{width:100%;height:auto;display:block}.student-runs-table{gap:.4rem;display:grid}.student-run-row{text-align:left;background:#f8fafc;border:1px solid #e2e8f0;border-radius:.6rem;grid-template-columns:50px 190px 1fr 90px 100px;align-items:center;gap:.55rem;padding:.45rem .5rem;font-size:.9rem;display:grid}.student-run-row.active{background:#eff6ff;border-color:#60a5fa}.student-run-tests{background:#fff;border:1px solid #e2e8f0;border-radius:.65rem;gap:.45rem;margin-top:.2rem;padding:.65rem;display:grid}.student-tests-head{justify-content:space-between;align-items:baseline;gap:.5rem;display:flex}@media (width<=980px){.student-toolbar,.student-layout{grid-template-columns:1fr}.student-list{max-height:280px}.student-run-row{grid-template-columns:44px 1fr}}
