:root{--bg:#f4f6fb;--surface:#fff;--text:#1c2333;--muted:#6b7489;--border:#e3e7ef;--primary:#4f46e5;--primary-hover:#4338ca;--primary-soft:#eef0ff;--success:#16a34a;--success-soft:#e7f7ec;--danger:#dc2626;--danger-soft:#fdecec;--warn-soft:#fff6e0;--warn:#9a6700;--radius:12px;--shadow:0 1px 2px #1018280d, 0 2px 8px #1018280a;color:var(--text);background:var(--bg);font-family:Noto Sans Thai,system-ui,-apple-system,sans-serif;line-height:1.55}*{box-sizing:border-box}body{background:var(--bg);min-height:100vh;margin:0}h1,h2,h3,h4{margin:0;line-height:1.3}h1{font-size:1.6rem}h2{font-size:1.25rem}p{margin:0}a{color:var(--primary);text-decoration:none}a:hover{text-decoration:underline}code{background:var(--primary-soft);border-radius:6px;padding:1px 6px;font-size:.9em}.muted{color:var(--muted)}.small{font-size:.85rem}.center{text-align:center}.pre-line{white-space:pre-line}.stack{flex-direction:column;gap:16px;display:flex}.row-gap{flex-wrap:wrap;align-items:center;gap:8px;display:flex}.row-between{flex-wrap:wrap;justify-content:space-between;align-items:center;gap:12px;display:flex}.container{max-width:1100px;margin:0 auto;padding:28px 16px 64px}.navbar{background:var(--surface);border-bottom:1px solid var(--border);z-index:10;position:sticky;top:0}.navbar-inner{flex-wrap:wrap;align-items:center;gap:24px;max-width:1100px;margin:0 auto;padding:10px 16px;display:flex}.brand{color:var(--text);align-items:center;gap:8px;font-size:1.15rem;font-weight:700;display:flex}.brand:hover{text-decoration:none}.brand-mark{background:var(--primary);color:#fff;border-radius:8px;place-items:center;width:30px;height:30px;font-weight:700;display:inline-grid}.brand-mark-lg{border-radius:14px;width:52px;height:52px;font-size:1.6rem}.nav-links{flex:1;gap:4px;display:flex}.nav-links a{color:var(--muted);border-radius:8px;padding:6px 12px;font-weight:500}.nav-links a:hover{background:var(--bg);text-decoration:none}.nav-links a.active{color:var(--primary);background:var(--primary-soft)}.nav-user{align-items:center;gap:8px;display:flex}.nav-name{font-weight:500}.page-head{flex-wrap:wrap;justify-content:space-between;align-items:flex-end;gap:16px;display:flex}.back-link{font-size:.95rem}.card{background:var(--surface);border:1px solid var(--border);border-radius:var(--radius);box-shadow:var(--shadow);padding:20px}.empty{text-align:center;color:var(--muted);background:var(--surface);border:1px dashed var(--border);border-radius:var(--radius);padding:48px 16px}.alert{background:var(--primary-soft);color:var(--text);border-radius:10px;padding:12px 16px}.alert-error{background:var(--danger-soft);color:var(--danger)}.alert-warn{background:var(--warn-soft);color:var(--warn)}.alert-success{background:var(--success-soft);color:var(--success)}.text-success{color:var(--success)}.text-danger{color:var(--danger)}.row-error td{background:#fff8f8}.badge{background:var(--bg);color:var(--muted);white-space:nowrap;border-radius:999px;padding:2px 10px;font-size:.8rem;font-weight:600;display:inline-block}.badge-admin{color:#c2410c;background:#fff1e6}.badge-student{background:var(--primary-soft);color:var(--primary)}.badge-success{background:var(--success-soft);color:var(--success)}.badge-danger{background:var(--danger-soft);color:var(--danger)}.loading{color:var(--muted);justify-content:center;align-items:center;gap:10px;padding:48px;display:flex}.loading-full{min-height:100vh}.spinner{border:3px solid var(--border);border-top-color:var(--primary);border-radius:50%;width:22px;height:22px;animation:.8s linear infinite spin}@keyframes spin{to{transform:rotate(360deg)}}input,textarea,select{font:inherit;color:inherit;border:1px solid var(--border);background:var(--surface);border-radius:8px;width:100%;padding:9px 12px;transition:border-color .15s,box-shadow .15s}select{cursor:pointer;width:auto}textarea{resize:vertical}input:focus,textarea:focus,select:focus{border-color:var(--primary);box-shadow:0 0 0 3px var(--primary-soft);outline:none}.field{flex-direction:column;gap:6px;display:flex}.field>span{font-size:.9rem;font-weight:500}.field-row{grid-template-columns:1fr 1fr;gap:16px;display:grid}.search{max-width:280px}.btn{font:inherit;border:1px solid var(--border);background:var(--surface);color:var(--text);cursor:pointer;white-space:nowrap;border-radius:8px;justify-content:center;align-items:center;gap:6px;padding:8px 16px;font-weight:500;transition:background .15s,border-color .15s;display:inline-flex}.btn:hover{background:var(--bg);text-decoration:none}.btn:disabled{opacity:.5;cursor:not-allowed}.btn-primary{background:var(--primary);border-color:var(--primary);color:#fff}.btn-primary:hover{background:var(--primary-hover)}.btn-danger{color:var(--danger);border-color:#f5c2c2}.btn-danger:hover{background:var(--danger-soft)}.btn-ghost{background:0 0;border-color:#0000}.btn-sm{padding:4px 10px;font-size:.85rem}.btn-block{width:100%}.switch{cursor:pointer;align-items:center;gap:8px;display:inline-flex}.switch input{display:none}.slider{background:#cfd5e1;border-radius:999px;flex-shrink:0;width:38px;height:22px;transition:background .2s;position:relative}.slider:after{content:"";background:#fff;border-radius:50%;width:16px;height:16px;transition:transform .2s;position:absolute;top:3px;left:3px}.switch input:checked+.slider{background:var(--success)}.switch input:checked+.slider:after{transform:translate(16px)}.switch-text{font-size:.9rem}.switch-lg{padding-top:8px}.auth-page{background:linear-gradient(135deg,#eef0ff 0%,#f4f6fb 50%,#e9f7f1 100%);place-items:center;min-height:100vh;padding:24px 16px;display:grid}.auth-card{flex-direction:column;gap:16px;width:100%;max-width:440px;padding:32px;display:flex}.auth-brand{text-align:center;flex-direction:column;align-items:center;gap:6px;display:flex}.auth-switch{text-align:center;font-size:.95rem}.setup-card{flex-direction:column;gap:12px;max-width:520px;display:flex}.setup-card ol{flex-direction:column;gap:6px;margin:0;padding-left:20px;display:flex}.table-wrap{padding:0;overflow-x:auto}.table{border-collapse:collapse;width:100%}.table th,.table td{text-align:left;border-bottom:1px solid var(--border);vertical-align:middle;padding:12px 16px}.table th{color:var(--muted);background:#fafbfd;font-size:.85rem;font-weight:600}.table tr:last-child td{border-bottom:none}.actions{justify-content:flex-end;gap:6px;display:flex}.stats{grid-template-columns:repeat(auto-fit,minmax(180px,1fr));gap:12px;display:grid}.stat{flex-direction:column;gap:4px;padding:16px 20px;display:flex}.stat strong{font-size:1.6rem}.steps{flex-direction:column;gap:4px;margin:0;padding-left:20px;display:flex}.file-drop{border:2px dashed var(--border);border-radius:var(--radius);cursor:pointer;color:var(--muted);text-align:center;background:#fafbfd;justify-content:center;align-items:center;padding:28px 16px;font-weight:500;transition:border-color .15s,background .15s;display:flex}.file-drop:hover{border-color:var(--primary);background:var(--primary-soft);color:var(--primary)}.file-drop input{display:none}.lookup-card{max-width:400px}.id-input{text-align:center;letter-spacing:.4em;padding:14px;font-size:2rem;font-weight:700}.btn-lg{padding:12px 20px;font-size:1.05rem}.public-page{background:var(--bg);min-height:100vh;padding:24px 16px 64px}.public-inner{max-width:640px;margin:0 auto}.empty-card{text-align:center;flex-direction:column;gap:8px;padding:40px 20px;display:flex}.student-head{align-items:center;gap:16px;display:flex}.student-avatar{background:var(--primary);color:#fff;border-radius:50%;flex-shrink:0;place-items:center;width:56px;height:56px;font-size:1.5rem;font-weight:700;display:grid}.score-card{flex-direction:column;gap:10px;display:flex}.score-card-main{justify-content:space-between;align-items:center;gap:12px;display:flex}.score-big{white-space:nowrap;font-size:2rem;font-weight:700}.score-big span{color:var(--muted);font-size:1rem;font-weight:500}.score-good{color:var(--success)}.score-ok{color:#a16207}.score-bad{color:var(--danger)}.bar{background:var(--bg);border-radius:999px;height:8px;overflow:hidden}.bar-fill{border-radius:999px;height:100%}.bar-good{background:var(--success)}.bar-ok{background:#eab308}.bar-bad{background:var(--danger)}.tag{background:var(--primary-soft);color:var(--primary);border-radius:999px;margin-left:6px;padding:2px 8px;font-size:.75rem}.container-wide,.navbar-inner{max-width:1500px}.stack-sm{flex-direction:column;gap:10px;display:flex}.room-title{color:var(--text);font-size:1.1rem}.save-state{color:var(--muted);text-align:right;min-width:90px;font-size:.85rem}.save-saved{color:var(--success)}.save-error{color:var(--danger);font-weight:600}.tabs{border-bottom:1px solid var(--border);gap:4px;display:flex;overflow-x:auto}.tab{font:inherit;color:var(--muted);cursor:pointer;white-space:nowrap;background:0 0;border:1px solid #0000;border-bottom:none;border-radius:10px 10px 0 0;margin-bottom:-1px;padding:8px 18px;font-weight:600}.tab:hover{color:var(--text);background:var(--surface)}.tab.active{background:var(--surface);color:var(--primary);border-color:var(--border);border-bottom:1px solid var(--surface)}.tab-add{color:var(--primary);font-weight:500}.gb-wrap{min-height:240px;max-height:calc(100vh - 250px);padding:0;overflow:auto}.gb{border-collapse:separate;border-spacing:0;font-size:.9rem}.gb th,.gb td{border-right:1px solid var(--border);border-bottom:1px solid var(--border);background:var(--surface);white-space:nowrap;padding:0}.gb thead th{z-index:2;color:var(--muted);background:#fafbfd;padding:6px 8px;font-size:.8rem;font-weight:600;position:sticky;top:0}.gb tfoot td{z-index:2;background:#fafbfd;position:sticky;bottom:0}.gb .gb-sticky{z-index:1;position:sticky}.gb thead .gb-sticky,.gb tfoot .gb-sticky{z-index:3}.gb .gb-no{width:56px;min-width:56px;max-width:56px;left:0}.gb .gb-id{width:76px;min-width:76px;max-width:76px;left:56px}.gb .gb-name{width:250px;min-width:250px;max-width:250px;box-shadow:2px 0 0 var(--border);left:132px}.gb td.gb-no input{text-align:center;color:var(--muted)}.gb input{background:0 0;border:0;border-radius:0;width:100%;min-width:0;padding:7px 8px;font-size:.9rem}.gb input:focus{box-shadow:inset 0 0 0 2px var(--primary);background:#fff}.gb input::placeholder{color:#c5cad6}.gb input::-webkit-calendar-picker-indicator{display:none!important}.gb .gb-cell{width:104px;min-width:104px;max-width:104px}.gb .gb-cell input{text-align:center}.gb .cell-missing{background:#fde7b0}.gb .cell-missing input{color:#8a5a00;font-weight:500}.gb .cell-empty{background:#fffbf0}.gb .cell-note{background:#eef0ff}.gb .cell-note input{color:var(--primary)}.gb .cell-over input{color:var(--danger);font-weight:700}.gb .cell-bad{background:var(--danger-soft)}.gb-head{vertical-align:top}.gb thead th.gb-head{padding:0}.gb-head-btn{font:inherit;cursor:pointer;width:104px;color:var(--muted);background:0 0;border:0;flex-direction:column;align-items:center;gap:1px;padding:6px 4px;display:flex}.gb-head-btn:hover{background:var(--primary-soft)}.gb-head-title{color:var(--text);text-overflow:ellipsis;max-width:96px;font-size:.85rem;font-weight:700;overflow:hidden}.gb-head-meta{font-size:.7rem;font-weight:500}.gb-head-quiz{border-top:3px solid var(--primary)!important}.gb-head-work{border-top:3px solid #eab308!important}.gb-head-hidden .gb-head-btn{opacity:.5}.gb .gb-sum{text-align:center;width:56px;min-width:56px;color:var(--muted);font-weight:600}.gb td.gb-sum-bad{color:var(--danger);background:var(--danger-soft)}.gb .gb-add{text-align:center;border-right:0;min-width:70px}.gb-del{color:#c5cad6;cursor:pointer;background:0 0;border:0;border-radius:6px;padding:6px 10px;font-size:.85rem}.gb tr:hover .gb-del{color:var(--danger)}.gb-del:hover{background:var(--danger-soft)}.gb-foot{color:var(--muted);text-align:center;font-size:.72rem;line-height:1.35;padding:4px!important}.gb-hint{padding:24px}.legend{flex-wrap:wrap;align-items:center;gap:14px;display:flex}.legend span{align-items:center;gap:6px;display:inline-flex}.sw{border:1px solid var(--border);border-radius:4px;width:14px;height:14px;display:inline-block}.sw-missing{background:#fde7b0}.sw-empty{background:#fffbf0}.sw-note{background:#eef0ff}.sw-over{background:var(--danger)}.modal-backdrop{z-index:50;background:#0f172a73;place-items:center;padding:16px;display:grid;position:fixed;inset:0}.modal{width:100%;max-width:520px;max-height:calc(100vh - 32px);overflow:auto}.modal-wide{max-width:760px}.seg{background:var(--bg);border-radius:10px;align-self:flex-start;gap:3px;padding:3px;display:inline-flex}.seg button{font:inherit;cursor:pointer;color:var(--muted);background:0 0;border:0;border-radius:8px;padding:6px 16px;font-weight:600}.seg button.active{background:var(--surface);color:var(--primary);box-shadow:var(--shadow)}.check{cursor:pointer;align-items:center;gap:8px;font-size:.95rem;display:flex}.check input,.check-input{width:18px;height:18px;accent-color:var(--primary)}.sub-box{background:var(--bg);border-radius:10px;gap:8px;padding:12px}.fill-input{max-width:220px}.preview-list{background:var(--bg);border-radius:8px;max-height:180px;padding:8px 12px;font-family:ui-monospace,Menlo,monospace;overflow:auto}.stat-sub{color:var(--muted);font-size:1rem;font-weight:500}.stat-bad{background:var(--danger-soft);color:var(--danger);border-color:#f5c2c2}.stat-good{background:var(--success-soft);color:var(--success);border-color:#bfe6cb}.list-card{padding:4px 20px}.list-row{border-bottom:1px solid var(--border);justify-content:space-between;align-items:center;gap:12px;padding:12px 0;display:flex}.list-row:last-child{border-bottom:0}.all-done{color:var(--success);text-align:center;font-weight:500}.auth-page{grid-template-rows:1fr auto}.site-footer{text-align:center;color:var(--muted);padding:16px;font-size:.8rem}.site-footer strong{color:var(--text);font-weight:600}.container+.site-footer{margin-top:-40px}@media (width<=760px){.field-row{grid-template-columns:1fr}.nav-links{flex-basis:100%;order:3}.nav-name{display:none}.search{max-width:none}.auth-card{padding:20px}.gb .gb-name{width:150px;min-width:150px;max-width:150px}.gb-wrap{max-height:calc(100vh - 200px)}.stats{grid-template-columns:repeat(auto-fit,minmax(90px,1fr));gap:8px}.stat{padding:12px}.stat strong{font-size:1.3rem}}
