:root{font-family:system-ui,-apple-system,Segoe UI,Roboto,sans-serif;color:#1d2939;background:#f3f6fa}*{box-sizing:border-box}body{margin:0}header{background:#173b65;color:#fff;padding:14px clamp(14px,3vw,36px);display:flex;align-items:center;justify-content:space-between;gap:16px;flex-wrap:wrap}.brand{font-size:1.25rem;font-weight:800;color:white;text-decoration:none}nav{display:flex;align-items:center;gap:14px;flex-wrap:wrap}nav a,nav span{color:#fff;text-decoration:none;font-size:.92rem}nav a:hover{text-decoration:underline}main{max-width:1200px;margin:26px auto;padding:0 16px;min-height:72vh}h1{margin:.2rem 0 .6rem;font-size:clamp(1.5rem,3vw,2rem)}h2{margin:.2rem 0 .8rem}p{line-height:1.5}.muted{color:#667085}.card{background:white;border:1px solid #e1e7ef;border-radius:16px;padding:22px;margin:18px 0;box-shadow:0 4px 16px #193c5c0a}.narrow{max-width:540px;margin:36px auto}.pagehead{display:flex;justify-content:space-between;align-items:center;gap:14px;flex-wrap:wrap}.pagehead p{margin:.2rem 0;color:#667085}.stats{display:grid;grid-template-columns:repeat(auto-fit,minmax(150px,1fr));gap:14px;margin:20px 0}.stat{background:white;border:1px solid #e1e7ef;border-radius:14px;padding:18px}.stat span{display:block;color:#667085;font-size:.9rem}.stat strong{display:block;font-size:2rem;margin-top:6px;color:#173b65}button,.button{display:inline-block;border:0;border-radius:9px;background:#1769aa;color:white;padding:11px 16px;font:inherit;font-weight:700;text-decoration:none;cursor:pointer}button:hover,.button:hover{background:#105587}.secondary{background:#e8eef5;color:#173b65}.secondary:hover{background:#d7e2ee}form label{display:block;margin:14px 0;font-weight:650}input,select{display:block;width:100%;margin-top:7px;padding:11px 12px;border:1px solid #cbd5e1;border-radius:8px;font:inherit;background:white}input:focus,select:focus{outline:2px solid #9cc9f1;border-color:#1769aa}.flash{padding:12px 14px;border-radius:9px;margin:10px 0}.flash.success{background:#e6f7ec;color:#176534}.flash.error{background:#ffeded;color:#a32424}.tablewrap{overflow-x:auto}table{width:100%;border-collapse:collapse;white-space:nowrap}th,td{text-align:left;padding:11px 12px;border-bottom:1px solid #e8edf3}th{background:#f6f8fb;color:#344054;font-size:.9rem}tbody tr:hover{background:#f8fbff}.badge{display:inline-block;border-radius:999px;padding:4px 9px;font-size:.78rem;font-weight:800}.badge.ok{background:#e3f7e9;color:#176534}.badge.late{background:#fff0d9;color:#8b4e00}.badge.absent{background:#ffe7e7;color:#a32424}.search{display:flex;align-items:end;gap:10px;flex-wrap:wrap}.search input{min-width:220px}.scanner-layout{display:grid;grid-template-columns:minmax(260px,1fr) minmax(250px,1fr);gap:26px;align-items:start}#reader{max-width:460px;width:100%;overflow:hidden;border-radius:12px}.row{display:flex;gap:10px;margin:12px 0}.scan-result{padding:18px;border-radius:12px;background:#edf3fa;font-size:1.2rem;font-weight:750;min-height:80px}.scan-result.success{background:#e3f7e9;color:#176534}.scan-result.warn{background:#fff6e0;color:#8a5a00}
.scan-result.error{background:#ffeded;color:#a32424}footer{text-align:center;color:#667085;padding:18px;font-size:.85rem}@media(max-width:700px){header{align-items:flex-start}nav{gap:10px}.scanner-layout{grid-template-columns:1fr}.card{padding:16px}.stats{grid-template-columns:repeat(2,minmax(0,1fr))}.stat:last-child{grid-column:span 2}}
.navlogout{display:inline;margin:0;padding:0}.linkbutton{background:transparent;border:0;color:#fff;padding:.35rem .5rem;text-decoration:underline;cursor:pointer;font:inherit}.linkbutton:hover{background:rgba(255,255,255,.12)}

/* ---- Etapa 1: control de alumnos (rev. 0.3.0) ---- */
.oculto{display:none!important}
.small{font-size:.85rem}
.filters{display:flex;flex-wrap:wrap;gap:12px;align-items:end;background:#fff;border:1px solid #e1e7ef;border-radius:14px;padding:14px 16px;margin:14px 0}
.filters label{margin:0;font-size:.85rem;flex:0 1 175px}
.filters label.grow{flex:1 1 240px}
.filters .row{margin:0}
.toolbar{margin-top:6px}
.button.small,button.small{padding:6px 10px;font-size:.82rem;border-radius:7px}
.danger{background:#b42318;color:#fff}.danger:hover{background:#912018}
.actions{white-space:normal;min-width:400px}.actions .button,.actions button,.actions .inline{margin:2px 3px 2px 0}
form.inline{display:inline;margin:0}
tr.inactivo{background:#fafafa;color:#667085}
.badge.inactive{background:#eceff3;color:#475467}
.sortlink{color:inherit;text-decoration:none}.sortlink:hover{text-decoration:underline}
.pager{display:flex;flex-wrap:wrap;gap:6px;align-items:center;justify-content:center;margin:8px 0 24px}
.card.tight{padding:12px 16px}
input[type=checkbox]{display:inline-block;width:auto;margin:0}

/* ---- Etapa 2: asistencia diaria (rev. 0.4.0) ---- */
.badge.just{background:#e4f0ff;color:#14509b}
.flash.info{background:#e8f1fb;color:#14509b}
.bad{color:#a32424}
.stat-bad strong{color:#a32424}
tr.totalrow td{font-weight:800;background:#f6f8fb}
.datenav{align-items:end;margin:0}.datenav label{margin:0}
.chips{display:flex;flex-wrap:wrap;gap:8px;align-items:center;margin:10px 0;max-height:9rem;overflow:auto}
.chip{background:#eef3f9;border-radius:999px;padding:5px 11px;font-size:.88rem}
form label.check{display:flex;align-items:center;gap:8px;font-weight:600}form label.check input{margin:0}
.print-only{display:none}
@media print{header,footer,.flash,.noprint{display:none!important}main{max-width:none;margin:0;padding:0}.card{box-shadow:none;border:0;padding:0}.print-only{display:block;font-weight:700}table{font-size:.8rem}}
.actions.sm{min-width:0;white-space:nowrap}

/* ---- Etapa 3: control de maestros (rev. 0.5.0) ---- */
.grouplist{display:grid;grid-template-columns:repeat(auto-fill,minmax(150px,1fr));gap:6px 14px;margin:8px 0 12px}
.grouplist label.check{margin:0;font-weight:600}
.badge.rol-admin{background:#efe4ff;color:#5b2a9e}.badge.rol-direccion{background:#e4f0ff;color:#14509b}
.badge.rol-maestro{background:#e3f7e9;color:#176534}.badge.rol-entrada{background:#eceff3;color:#475467}
.wrapcell{white-space:normal;min-width:160px}
code{background:#eef3f9;border-radius:5px;padding:1px 6px}
