:root{--bg:#f5f7fb;--card:#fff;--text:#172033;--muted:#687386;--brand:#2563eb;--good:#16804a;--bad:#c62828;--line:#e4e8f0}*{box-sizing:border-box}body{margin:0;background:var(--bg);font-family:Inter,system-ui,-apple-system,Segoe UI,Roboto,sans-serif;color:var(--text)}a{color:var(--brand);text-decoration:none}.topbar{height:58px;background:#111827;color:#fff;display:flex;align-items:center;gap:18px;padding:0 22px;position:sticky;top:0;z-index:10}.topbar strong{font-size:20px;margin-right:auto}.topbar strong span{color:#60a5fa}.topbar a{color:#dbeafe;font-size:14px}.container{max-width:1200px;margin:0 auto;padding:24px}.card{background:var(--card);border:1px solid var(--line);border-radius:16px;padding:20px;margin-bottom:18px;box-shadow:0 5px 20px rgba(15,23,42,.04)}h1,h2,h3{margin-top:0}.grid{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:16px}.two{grid-template-columns:repeat(2,minmax(0,1fr))}.stat{font-size:28px;font-weight:700}.muted{color:var(--muted)}label{font-size:13px;font-weight:600;display:block;margin:12px 0 6px}input,select,textarea{width:100%;padding:11px 12px;border:1px solid #cfd6e2;border-radius:10px;font:inherit;background:#fff}button,.btn{border:0;border-radius:10px;padding:11px 15px;background:var(--brand);color:#fff;font-weight:650;cursor:pointer;display:inline-block}.btn.secondary{background:#e8eefc;color:#1d4ed8}.btn.danger{background:#c62828}.btn.good{background:var(--good)}.tablewrap{overflow:auto}table{width:100%;border-collapse:collapse}th,td{padding:10px;border-bottom:1px solid var(--line);text-align:left;font-size:13px;white-space:nowrap}.alert{padding:12px 14px;border-radius:10px;background:#eef5ff;margin-bottom:14px}.error{background:#fff0f0;color:#a61b1b}.success{background:#edfff4;color:#126b3d}.center{text-align:center}.mobile-card{max-width:520px;margin:20px auto}.camera{width:100%;aspect-ratio:3/4;object-fit:cover;border-radius:18px;background:#0b1020}.hidden{display:none!important}.pill{padding:4px 8px;border-radius:99px;background:#eef2ff;font-size:12px}.qrbox{display:flex;justify-content:center;align-items:center;min-height:280px}.dangerText{color:var(--bad)}
.attendance-page{width:100%;}.attendance-main-card{margin-bottom:12px}.attendance-brand{font-size:18px;font-weight:800;margin-bottom:2px}.attendance-brand span{color:var(--brand)}.attendance-main-card h1{font-size:22px;margin:4px 0}.attendance-main-card>.muted{font-size:13px;margin:0 0 10px}.attendance-primary{width:100%;margin-top:8px;text-align:center}.employee-mini-card{margin:0 0 8px;padding:12px;border-radius:12px}.visitor-card{margin:10px 0 0;text-align:left;padding:14px}.visitor-card h2{font-size:18px;margin-bottom:8px}.visitor-card label{margin-top:8px}.visitor-card input,.visitor-card select,.visitor-card textarea{padding:9px 10px}.camera-card{margin-bottom:0;padding:12px}.camera-title{font-size:13px;font-weight:750;color:#344054;text-align:center;margin:0 0 8px}.camera-wrap{position:relative;width:100%;height:min(44vh,330px);min-height:230px;overflow:hidden;border-radius:15px;background:#080c14}.camera-wrap .camera,.camera-wrap canvas{width:100%;height:100%;object-fit:cover;border-radius:0}.face-guide{position:absolute;left:50%;top:50%;transform:translate(-50%,-50%);width:min(48%,220px);height:min(78%,270px);border:2px solid rgba(255,255,255,.86);border-radius:48%;box-shadow:0 0 0 9999px rgba(0,0,0,.13);pointer-events:none}.camera-tip{text-align:center;font-size:11px;color:var(--muted);padding:6px 0 5px}.camera-actions{display:grid;grid-template-columns:1fr;gap:6px}.camera-actions .btn{width:100%;min-height:40px}.attendance-result{margin-top:8px;text-align:center;border-radius:16px;padding:18px 12px 16px;background:#fff;border:1px solid var(--line)}.result-icon{width:58px;height:58px;border-radius:50%;margin:0 auto 8px;display:flex;align-items:center;justify-content:center;font-size:34px;font-weight:800}.result-icon.entry{background:#e8f8ef;color:#16804a;border:2px solid #8bd3aa}.result-icon.exit{background:#fff0f0;color:#c62828;border:2px solid #ef9a9a}.result-title{font-size:18px;font-weight:800;margin-bottom:4px}.result-when{font-size:14px;font-weight:650;color:#344054}.result-hours{font-size:12px;color:var(--muted);margin-top:5px}.result-entry{background:#edfff4;color:#126b3d}.result-exit{background:#fff0f0;color:#a61b1b}.result-mode .camera-title,.result-mode .camera-tip{display:none}
@media(max-width:800px){.grid,.two{grid-template-columns:1fr}.topbar{gap:10px;overflow:auto}.topbar a{white-space:nowrap}.container{padding:12px}.topbar{padding:0 12px}}
@media(max-width:600px){body{background:#f5f7fb}.topbar{height:42px}.topbar strong{font-size:17px}.topbar a{display:none}.container{padding:8px}.mobile-card{margin:0 auto;max-width:520px}.attendance-main-card{padding:12px;margin-bottom:7px}.attendance-brand{font-size:16px}.attendance-main-card h1{font-size:18px}.attendance-main-card>.muted{font-size:11px;margin-bottom:7px}.alert{padding:7px 9px;font-size:12px;margin-bottom:7px}.employee-mini-card{padding:8px;margin-bottom:5px}.attendance-primary{padding:9px 12px;margin-top:5px;min-height:39px}.visitor-card{padding:10px;margin-top:7px}.visitor-card h2{font-size:16px}.visitor-card label{margin:6px 0 4px;font-size:12px}.visitor-card input,.visitor-card select,.visitor-card textarea{padding:8px 9px}.camera-card{padding:8px;margin:0}.camera-title{font-size:12px;margin-bottom:5px}.camera-wrap{height:min(40vh,300px);min-height:220px}.camera-tip{font-size:10px;padding:3px 0}.camera-actions{gap:5px}.camera-actions .btn{min-height:39px;padding:8px 10px}.attendance-result{padding:14px 10px}.result-icon{width:54px;height:54px;font-size:31px}.result-title{font-size:17px}.result-when{font-size:13px}}
@media(max-width:600px) and (max-height:700px){.camera-wrap{height:calc(100svh - 410px);min-height:190px;max-height:250px}.camera-tip{display:none}.camera-actions .btn{min-height:37px;padding:7px 10px}.attendance-result{padding:12px 8px}.result-icon{width:48px;height:48px;font-size:28px}}

/* OfficeAttend shared report/media rules.
 * These rules intentionally live in the main CSS rather than only in JS,
 * so tables and selfie thumbnails remain correctly sized even if JavaScript
 * is delayed, blocked, or cached separately.
 */
.data-table-wrap{width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch}
.filter-row{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:16px;align-items:end}
.selfie-thumb{display:block!important;width:58px!important;height:58px!important;max-width:58px!important;max-height:58px!important;min-width:58px!important;min-height:58px!important;object-fit:cover!important;border-radius:8px!important;border:1px solid #dbe3ee!important;background:#f8fafc;cursor:pointer}
.small-muted{color:var(--muted);font-size:12px}
.data-table-wrap table{min-width:760px}
@media(max-width:900px){.filter-row{grid-template-columns:1fr 1fr}}
@media(max-width:600px){.filter-row{grid-template-columns:1fr}.data-table-wrap table{min-width:760px}}
