:root{--bg:#f5f6f8;--card:#fff;--ink:#1d2330;--muted:#6b7280;--line:#e3e6eb;--brand:#0f766e;--brand-soft:#ddf1ee;
--ok:#1f7a4d;--ok-soft:#e3f4ea;--warn:#a26200;--warn-soft:#fdf1dc;--bad:#b42318;--bad-soft:#fde8e6}
*{box-sizing:border-box}body{margin:0;font-family:system-ui,-apple-system,"Segoe UI",Roboto,sans-serif;background:var(--bg);color:var(--ink);font-size:15px;line-height:1.45}
a{color:var(--brand);text-decoration:none}a:hover{text-decoration:underline}
header{background:var(--card);border-bottom:1px solid var(--line);position:sticky;top:0;z-index:5}
.bar{max-width:1180px;margin:0 auto;padding:0 16px;display:flex;align-items:center;gap:20px;height:56px;flex-wrap:wrap}
.logo{font-weight:700;color:var(--ink);white-space:nowrap}.logo span{color:var(--brand)}
nav{display:flex;gap:4px;flex:1;flex-wrap:wrap}nav a{padding:6px 10px;border-radius:6px;color:var(--ink)}
nav a.on,nav a:hover{background:var(--brand-soft);color:var(--brand);text-decoration:none}
.who{color:var(--muted);font-size:13px;white-space:nowrap}
.badge{display:inline-block;min-width:20px;padding:0 6px;border-radius:10px;background:var(--bad);color:#fff;font-size:12px;text-align:center;margin-left:4px}
main{max-width:1180px;margin:24px auto;padding:0 16px}
h1{font-size:22px;margin:0 0 16px}h2{font-size:16px;margin:0 0 12px}
.card{background:var(--card);border:1px solid var(--line);border-radius:10px;padding:20px;margin-bottom:16px}
.grid{display:grid;gap:16px}.g2{grid-template-columns:repeat(auto-fit,minmax(320px,1fr))}.g4{grid-template-columns:repeat(auto-fit,minmax(170px,1fr))}
.stat{padding:16px 20px}.stat b{display:block;font-size:30px}.stat small{color:var(--muted)}
.form{display:grid;grid-template-columns:repeat(auto-fit,minmax(240px,1fr));gap:14px 18px}
.form .full{grid-column:1/-1}
label{display:block;font-size:13px;font-weight:600;margin-bottom:4px}label i{color:var(--bad);font-style:normal}
input,select,textarea{width:100%;padding:9px 10px;border:1px solid var(--line);border-radius:7px;font:inherit;background:#fff;color:var(--ink)}
input:focus,select:focus,textarea:focus{outline:2px solid var(--brand-soft);border-color:var(--brand)}
textarea{min-height:80px;resize:vertical}
.btn{display:inline-block;padding:9px 16px;border-radius:7px;border:1px solid var(--line);background:#fff;color:var(--ink);font:inherit;font-weight:600;cursor:pointer}
.btn:hover{text-decoration:none;background:var(--bg)}
.btn.primary{background:var(--brand);border-color:var(--brand);color:#fff}.btn.primary:hover{filter:brightness(1.08)}
.btn.ok{background:var(--ok);border-color:var(--ok);color:#fff}.btn.bad{background:var(--bad);border-color:var(--bad);color:#fff}
.btn.sm{padding:5px 10px;font-size:13px}.row{display:flex;gap:8px;flex-wrap:wrap;align-items:center}
table{width:100%;border-collapse:collapse;font-size:14px}th,td{text-align:left;padding:9px 8px;border-bottom:1px solid var(--line);vertical-align:top}
th{font-size:12px;text-transform:uppercase;letter-spacing:.03em;color:var(--muted);font-weight:600}
tr:hover td{background:#fafbfc}.scroll{overflow-x:auto}
.pill{display:inline-block;padding:2px 9px;border-radius:12px;font-size:12px;font-weight:600}
.pending{background:var(--warn-soft);color:var(--warn)}.approved{background:var(--ok-soft);color:var(--ok)}.rejected{background:var(--bad-soft);color:var(--bad)}
.flash{padding:10px 14px;border-radius:8px;margin-bottom:14px}.flash.ok{background:var(--ok-soft);color:var(--ok)}.flash.error{background:var(--bad-soft);color:var(--bad)}
.muted{color:var(--muted)}.small{font-size:13px}
.bars div{display:grid;grid-template-columns:140px 1fr 36px;gap:8px;align-items:center;margin:6px 0;font-size:13px}
.bars span.t{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.bars i{display:block;height:12px;background:var(--brand);border-radius:6px;min-width:3px}
.bars b{text-align:right}
.cols{display:flex;align-items:flex-end;gap:6px;height:150px;padding-top:10px}
.cols div{flex:1;display:flex;flex-direction:column;align-items:center;justify-content:flex-end;height:100%;font-size:11px;color:var(--muted)}
.cols i{display:block;width:100%;max-width:38px;background:var(--brand);border-radius:4px 4px 0 0;min-height:2px}
.auth{max-width:380px;margin:70px auto}.auth .card{padding:28px}
dl{display:grid;grid-template-columns:160px 1fr;gap:8px 16px;margin:0}dt{color:var(--muted);font-size:13px}dd{margin:0}
.filters{display:grid;grid-template-columns:repeat(auto-fit,minmax(140px,1fr));gap:10px;align-items:end}
@media(max-width:600px){dl{grid-template-columns:1fr}.bars div{grid-template-columns:90px 1fr 30px}}
@media print{header,.noprint{display:none}.card{border:none}}

/* ---------- app / mobile ---------- */
.logo{text-decoration:none!important}.center{text-align:center}
.qr svg{width:220px;height:220px;max-width:100%}.qr{margin:8px auto}.url{word-break:break-all;font-size:17px}
h3{font-size:14px;margin:14px 0 6px}ol{margin:0 0 6px;padding-left:20px}ol li{margin:3px 0}
.profile{display:flex;gap:14px;align-items:center}
.avatar{width:48px;height:48px;border-radius:50%;background:var(--brand);color:#fff;display:grid;place-items:center;font-size:20px;font-weight:700}
.menu{padding:4px 0}.menu a{display:flex;justify-content:space-between;padding:14px 20px;color:var(--ink);border-bottom:1px solid var(--line)}
.menu a:last-child{border-bottom:none}.menu a span{color:var(--muted)}.menu a:hover{text-decoration:none;background:var(--bg)}.menu a.danger{color:var(--bad)}
.tabs{display:none}
.grid.g2{grid-template-columns:repeat(auto-fit,minmax(min(320px,100%),1fr))}

@media (max-width:760px){
  body{font-size:16px}
  header{padding-top:env(safe-area-inset-top);background:var(--brand)}
  header .bar{height:52px;gap:10px}
  header .logo{color:#fff;flex:1}header .logo span{color:#ffd56b}
  .topnav,.who{display:none}
  #installBtn{background:#fff;color:var(--brand);border-color:#fff}
  main{margin:14px auto;padding:0 12px}
  body.has-tabs main{padding-bottom:calc(76px + env(safe-area-inset-bottom))}
  h1{font-size:20px}
  .card{padding:16px;border-radius:12px}
  input,select,textarea{font-size:16px;padding:11px 12px}   /* 16px stops iPhone zooming in */
  .btn{padding:11px 18px}.btn.sm{padding:7px 12px}
  #achForm .btn.primary{width:100%}
  .auth{margin:30px auto}

  /* bottom tab bar */
  .tabs{display:flex;position:fixed;left:0;right:0;bottom:0;z-index:10;background:var(--card);border-top:1px solid var(--line);
        padding-bottom:env(safe-area-inset-bottom);box-shadow:0 -2px 10px rgba(0,0,0,.04)}
  .tabs a{flex:1;display:flex;flex-direction:column;align-items:center;gap:2px;padding:8px 0 6px;color:var(--muted);font-size:11px;position:relative}
  .tabs a:hover{text-decoration:none}.tabs a.on{color:var(--brand);font-weight:600}
  .tabs svg{width:24px;height:24px;fill:none;stroke:currentColor;stroke-width:2;stroke-linecap:round;stroke-linejoin:round}
  .tabs em{position:absolute;top:3px;left:calc(50% + 6px);background:var(--bad);color:#fff;font-style:normal;font-size:10px;
           min-width:17px;height:17px;line-height:17px;border-radius:9px;text-align:center;padding:0 4px}

  /* tables turn into stacked cards */
  .scroll table,.scroll tbody,.scroll tr,.scroll td{display:block;width:100%}
  .scroll tr:has(th){display:none}
  .scroll tr{padding:12px 0;border-bottom:1px solid var(--line);position:relative}
  .scroll tr:last-child{border-bottom:none}
  .scroll td{border:none;padding:2px 0}
  .scroll td:first-child:has(input[type=checkbox]){position:absolute;right:0;top:12px;width:auto}
  .scroll td:has(.btn){padding-top:8px}
  .scroll td:has(input[type=checkbox])+td{padding-right:36px}
  input[type=checkbox]{width:22px;height:22px}
  .scroll tr:hover td{background:none}
  .card.scroll{padding-top:6px;padding-bottom:6px}
  dl{grid-template-columns:1fr;gap:2px}dd{margin-bottom:10px}
  .filters{grid-template-columns:1fr 1fr}.filters>div:first-child{grid-column:1/-1}
}
@media (display-mode:standalone){ #installBtn,.installBtn{display:none!important} }
[hidden]{display:none!important}

/* ---------- mark entry ---------- */
.sel{display:flex;gap:10px;align-items:center;flex-wrap:wrap}.sel select{width:auto;min-width:180px}
.chips{display:flex;flex-wrap:wrap;gap:8px}
.chip{display:block;border:1px solid var(--line);border-radius:9px;padding:9px 12px;min-width:170px;flex:1 1 190px;color:var(--ink);background:#fff}
.chip:hover{text-decoration:none;border-color:var(--brand)}
.chip b{display:block;font-size:14px}.chip small{display:block;color:var(--muted);font-size:12px}
.chip.submitted{border-left:4px solid var(--ok)}.chip.draft{border-left:4px solid #e0a100}.chip.none{border-left:4px solid #cfd4da}
.chip .meter{height:5px;background:var(--line);border-radius:3px;margin-top:6px;overflow:hidden}.chip .meter i{display:block;height:100%;background:var(--brand)}
.pill.draft{background:var(--warn-soft);color:var(--warn)}.pill.submitted{background:var(--ok-soft);color:var(--ok)}.pill.none{background:#eef0f2;color:var(--muted)}
.pill.PASS{background:var(--ok-soft);color:var(--ok)}.pill.RA{background:var(--bad-soft);color:var(--bad)}
.pill.ABSENT{background:var(--warn-soft);color:var(--warn)}.pill.PENDING{background:#eef0f2;color:var(--muted)}
.info{display:flex;flex-wrap:wrap;gap:6px 22px;font-size:14px}.info span{color:var(--muted)}

/* entry list */
.entry{list-style:none;margin:0;padding:0}
.entry li{display:grid;grid-template-columns:42px 1fr auto;gap:10px;align-items:center;padding:7px 4px;border-bottom:1px solid var(--line)}
.entry li:last-child{border-bottom:none}
.entry .no{color:var(--muted);font-size:13px;text-align:right}
.entry .nm{font-weight:600;font-size:14px;line-height:1.25}.entry .nm small{display:block;font-weight:400;color:var(--muted);font-size:12px}
.entry input{width:76px;text-align:center;font-weight:700;font-size:17px;padding:8px 4px}
.entry li.err input{border-color:var(--bad);background:var(--bad-soft)}
.entry li.ab input{background:var(--warn-soft);color:var(--warn)}
.entry li.low input{color:var(--bad)}
.entry .msg{grid-column:2/4;color:var(--bad);font-size:12px;margin-top:-4px;text-align:right}
.entry li:focus-within{background:var(--brand-soft);border-radius:6px}
.savebar{position:sticky;bottom:0;background:var(--card);border-top:1px solid var(--line);margin:0 -20px -20px;padding:12px 20px;
  display:flex;gap:10px;align-items:center;flex-wrap:wrap;border-radius:0 0 10px 10px;z-index:4}
.savebar .counts{flex:1;font-size:13px;color:var(--muted);min-width:160px}.savebar .counts b{color:var(--ink)}
.lockbox{background:var(--ok-soft);color:var(--ok);padding:10px 14px;border-radius:8px;margin-bottom:12px}

/* results */
.res{font-size:13px;border-collapse:collapse;width:100%}
.res th,.res td{border:1px solid var(--line);padding:5px 6px;text-align:center;white-space:nowrap}
.res td.l,.res th.l{text-align:left}.res th{background:#f0f4f4;color:var(--ink);text-transform:none;letter-spacing:0;font-size:12px}
.res td.fail{color:var(--bad);font-weight:700}.res td.ab{color:var(--warn);font-weight:700}
.res tfoot td{background:#fafafa;font-weight:600}
.wide{overflow-x:auto;-webkit-overflow-scrolling:touch}
.sign{display:none}
@media (max-width:760px){
  .savebar{margin:0 -16px -16px;padding:10px 16px;bottom:calc(60px + env(safe-area-inset-bottom))}
  .savebar .btn{flex:1}
  .entry li{grid-template-columns:26px 1fr auto;gap:8px}.entry input{width:64px}.abBtn{padding:7px 9px!important}
  .sel select{flex:1}
}
@media print{
  body{background:#fff;font-size:11px}main{margin:0;max-width:none}.tabs,.savebar,.noprint,.flash{display:none!important}
  .card{padding:0;margin:0 0 10px}.res{font-size:10px}.res th,.res td{padding:2px 3px}
  .sign{display:flex;justify-content:space-between;margin-top:50px;font-weight:600}
}

/* ---------- analytics ---------- */
.tabsel{display:flex;gap:4px;border-bottom:1px solid var(--line);margin-bottom:14px;overflow-x:auto}
.tabsel button{background:none;border:none;border-bottom:3px solid transparent;padding:10px 14px;font:inherit;font-weight:600;color:var(--muted);cursor:pointer;white-space:nowrap}
.tabsel button.on{color:var(--brand);border-bottom-color:var(--brand)}
.pick{list-style:none;margin:0;padding:0;max-height:520px;overflow-y:auto}
.pick li a{display:flex;justify-content:space-between;gap:10px;padding:10px 6px;border-bottom:1px solid var(--line);color:var(--ink)}
.pick li a:hover{background:var(--brand-soft);text-decoration:none}.pick li small{color:var(--muted)}
.kpis{display:grid;grid-template-columns:repeat(auto-fit,minmax(130px,1fr));gap:10px;margin-bottom:16px}
.kpi{background:var(--card);border:1px solid var(--line);border-radius:10px;padding:12px 14px}
.kpi small{display:block;color:var(--muted);font-size:12px}.kpi b{display:block;font-size:24px;line-height:1.2;margin-top:2px}
.kpi em{font-style:normal;font-size:12px;color:var(--muted)}
.hb{display:grid;grid-template-columns:minmax(80px,180px) 1fr 56px;gap:10px;align-items:center;margin:9px 0;font-size:13px}
.hb .lb{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.hb .vl{text-align:right;font-weight:600}
.hb .tr{position:relative;height:16px;background:#eef1f1;border-radius:4px;cursor:default}
.hb .tr i{position:absolute;left:0;top:0;bottom:0;background:var(--brand);border-radius:0 4px 4px 0;min-width:2px}
.hb .tr i.fail{background:var(--bad)}.hb .tr i.ab{background:repeating-linear-gradient(135deg,#e0a100 0 4px,#f6d27a 4px 8px)}
.hb .tr i.dim{background:#9fc9c4}
.hb .tr b{position:absolute;top:-4px;bottom:-4px;width:3px;margin-left:-1px;background:#4b5563;border-radius:2px}
.hb .tr s{position:absolute;top:-5px;bottom:-5px;border-left:2px dashed var(--bad);opacity:.55}
.hb .tr[data-tip]:hover::after{content:attr(data-tip);position:absolute;left:0;bottom:calc(100% + 8px);background:#1d2330;color:#fff;
  padding:5px 9px;border-radius:6px;font-size:12px;white-space:nowrap;z-index:6;pointer-events:none}
.legend{display:flex;flex-wrap:wrap;gap:14px;font-size:12px;color:var(--muted);margin-top:8px}
.legend span{display:inline-flex;align-items:center;gap:6px}
.legend i{display:inline-block;width:14px;height:10px;border-radius:2px;background:var(--brand)}
.legend i.avg{width:3px;height:14px;background:#4b5563}.legend i.pass{width:0;height:14px;border-left:2px dashed var(--bad);background:none}
.legend i.fail{background:var(--bad)}.legend i.ab{background:repeating-linear-gradient(135deg,#e0a100 0 3px,#f6d27a 3px 6px)}
.hist{display:flex;align-items:flex-end;gap:8px;height:170px;padding-top:18px}
.hist div{flex:1;display:flex;flex-direction:column;align-items:center;justify-content:flex-end;height:100%;font-size:11px;color:var(--muted);position:relative}
.hist i{display:block;width:100%;max-width:56px;background:var(--brand);border-radius:4px 4px 0 0;min-height:2px}
.hist i.fail{background:var(--bad)}.hist i.ab{background:repeating-linear-gradient(135deg,#e0a100 0 4px,#f6d27a 4px 8px)}
.hist b{color:var(--ink);font-size:12px;margin-bottom:3px}.hist span{margin-top:5px;white-space:nowrap}
.up{color:var(--ok);font-weight:600}.down{color:var(--bad);font-weight:600}
.namecol a{color:var(--ink)}.namecol a:hover{color:var(--brand)}
.mini li{margin:4px 0}.mini{padding-left:18px;margin:0}
@media (max-width:760px){.hb{grid-template-columns:72px 1fr 44px;gap:8px}.kpi b{font-size:20px}}
