:root{--bg:#0f172a;--surface:#1e293b;--surface2:#263449;--outline:#475569;--text:#f8fafc;--muted:#94a3b8;--primary:#60a5fa;--on-primary:#0b1220;--ok:#34d399;--warn:#fbbf24;--bad:#f87171;--info:#38bdf8}
*{box-sizing:border-box;-webkit-tap-highlight-color:transparent}
html,body{margin:0;min-height:100%;background:var(--bg);color:var(--text);font-family:Roboto,'Segoe UI',system-ui,sans-serif;font-size:16px}
body{min-height:100vh;min-height:100dvh;display:flex;flex-direction:column}
#app{flex:1;display:flex;flex-direction:column;min-height:0}
[hidden]{display:none!important}
.barra{text-align:center;padding:7px 12px;font-size:14px}
.barra.warn{background:#78350f;color:#fde68a}
.barra.info{background:#1e3a5f;color:#bfdbfe}
.appbar{display:flex;align-items:center;gap:12px;padding:12px 18px;background:var(--surface);border-bottom:1px solid var(--outline);padding-top:max(12px,env(safe-area-inset-top))}
.logo{height:42px;width:auto;flex:none;display:block}
.appbar .t{font-weight:500}.appbar .s{color:var(--muted);font-size:12px}.sp{flex:1}
.pill{display:inline-flex;align-items:center;gap:6px;padding:4px 12px;border-radius:999px;font-size:13px;font-weight:500;white-space:nowrap}
.pill.ok{background:#064e3b;color:var(--ok)}.pill.warn{background:#78350f;color:var(--warn)}.pill.info{background:#0c4a6e;color:var(--info)}.pill.bad{background:#5b1d1d;color:var(--bad)}.pill.gris{background:#334155;color:var(--muted)}
.screen{flex:1;padding:22px 26px;display:flex;flex-direction:column;gap:16px;width:100%;max-width:1040px;margin:0 auto;padding-bottom:max(22px,env(safe-area-inset-bottom))}
.center{align-items:center;justify-content:center;text-align:center}
.card{background:var(--surface);border:1px solid var(--outline);border-radius:16px;padding:18px}
h2{margin:0;font-size:22px;font-weight:500}.muted{color:var(--muted)}
.small{font-size:13px;color:var(--muted)}
label.f{display:block;color:var(--muted);font-size:13px;margin:0 0 6px}
input.in,select.in,textarea.in{width:100%;height:50px;border-radius:12px;border:1px solid var(--outline);background:var(--bg);color:var(--text);padding:0 14px;font:inherit;font-size:16px}
input.in:focus,textarea.in:focus,select.in:focus{outline:2px solid var(--primary);outline-offset:0}
input.in:disabled{opacity:.4}
textarea.in{height:84px;padding:12px 14px;resize:none}
.btn{height:54px;border-radius:14px;border:0;background:var(--primary);color:var(--on-primary);font:inherit;font-size:17px;font-weight:600;padding:0 24px;cursor:pointer;display:inline-flex;align-items:center;justify-content:center;gap:10px}
.btn.big{height:80px;font-size:21px;border-radius:18px;min-width:330px}
.btn.ok{background:var(--ok)}.btn.warn{background:var(--warn)}.btn.bad{background:var(--bad)}
.btn.ghost{background:transparent;border:1px solid var(--outline);color:var(--text)}
.btn.sm{height:42px;font-size:15px;padding:0 16px}
.btn[disabled]{opacity:.4;cursor:not-allowed}
.grid2{display:grid;grid-template-columns:240px 1fr;gap:22px;align-items:stretch}
.photo{width:100%;aspect-ratio:4/5;align-self:center;border-radius:16px;background:linear-gradient(#334155,#1e293b);display:grid;place-items:center;border:1px solid var(--outline);position:relative;overflow:hidden}
.photo img{position:absolute;inset:0;width:100%;height:100%;object-fit:cover;object-position:center 22%;display:block}
.photo .av{width:100%;height:100%;display:grid;place-items:center;font-size:40px;font-weight:600;color:#e2e8f0;background:linear-gradient(160deg,#475569,#334155)}
.photo small{position:absolute;bottom:8px;left:6px;right:6px;text-align:center;color:#cbd5e1;font-size:11px;background:rgba(2,6,23,.55);border-radius:8px;padding:3px 6px}
dl.data{display:grid;grid-template-columns:140px 1fr;gap:8px 14px;margin:0}
dl.data dt{color:var(--muted);font-size:14px}dl.data dd{margin:0;font-size:16px}
.chips{display:flex;flex-wrap:wrap;gap:6px}.chip{padding:3px 10px;border-radius:8px;background:#334155;font-size:14px}.chip.off{opacity:.35;text-decoration:line-through}
.chip.pick{cursor:pointer;border:1px solid var(--outline);background:transparent;color:var(--muted);padding:7px 14px;border-radius:999px;font:inherit;font-weight:600}
.chip.pick.sel{background:#1d4ed8;border-color:#1d4ed8;color:#fff}
.scanner{flex:1;min-height:260px;border-radius:18px;background:#000;border:1px solid var(--outline);position:relative;overflow:hidden;display:grid;place-items:center}
.scanner video{position:absolute;inset:0;width:100%;height:100%;object-fit:cover}
.scanner .frame{width:230px;height:230px;border:3px solid var(--primary);border-radius:20px;position:relative;box-shadow:0 0 0 999px rgba(0,0,0,.35)}
.scanner .hint{position:absolute;bottom:12px;left:0;right:0;text-align:center;color:#e2e8f0;font-size:14px;text-shadow:0 1px 3px #000}
.row{display:flex;gap:14px;flex-wrap:wrap;align-items:center}
.row.cen{justify-content:center}
.check{width:88px;height:88px;border-radius:50%;display:grid;place-items:center;font-size:46px;margin:0 auto}
.check.ok{background:#064e3b;color:var(--ok)}.check.bad{background:#5b1d1d;color:var(--bad)}.check.warn{background:#78350f;color:var(--warn)}
.qr{width:190px;height:190px;background:#fff;padding:8px;border-radius:12px}
.aviso{display:flex;gap:10px;padding:14px 16px;border-radius:14px;font-size:15px;line-height:1.45}
.aviso.ok{background:#064e3b;color:var(--ok)}.aviso.warn{background:#78350f;color:var(--warn)}.aviso.bad{background:#5b1d1d;color:var(--bad)}.aviso.gris{background:#263449;color:var(--muted)}
.modal{position:fixed;inset:0;background:rgba(2,6,23,.75);display:flex;align-items:center;justify-content:center;padding:20px;z-index:20}
.modal .box{background:var(--surface);border:1px solid var(--outline);border-radius:18px;padding:22px;max-width:420px;width:100%;max-height:92vh;overflow:auto}
.loc{display:flex;gap:8px;align-items:center;font-size:14px;padding:9px 12px;border-radius:10px;margin:12px 0}
.loc.ok{background:#064e3b;color:var(--ok)}.loc.bad{background:#5b1d1d;color:var(--bad)}.loc.warn{background:#78350f;color:var(--warn)}
.err{color:var(--bad);font-size:14px;min-height:20px;margin:6px 0}
.stats{display:flex;gap:12px;flex-wrap:wrap}
.stat{background:var(--surface);border:1px solid var(--outline);border-radius:14px;padding:12px 18px;min-width:140px}
.stat b{display:block;font-size:26px;font-weight:500}
.lista{display:flex;flex-direction:column;gap:8px}
.item{display:flex;justify-content:space-between;gap:10px;align-items:center;padding:10px 14px;border-radius:12px;background:var(--surface2)}
.login{max-width:420px;margin:auto;width:100%}
.toast{position:fixed;left:50%;bottom:max(24px,env(safe-area-inset-bottom));transform:translateX(-50%);z-index:30;padding:14px 22px;border-radius:14px;font-size:18px;font-weight:600;max-width:92vw;text-align:center;box-shadow:0 10px 30px rgba(0,0,0,.45)}
.toast.ok{background:#064e3b;color:var(--ok);border:1px solid var(--ok)}.toast.warn{background:#78350f;color:var(--warn);border:1px solid var(--warn)}
.salir-mini{position:fixed;top:max(10px,env(safe-area-inset-top));right:14px;background:transparent;border:0;color:var(--muted);font:inherit;font-size:13px;padding:8px;cursor:pointer}
.spin{width:22px;height:22px;border:3px solid #334155;border-top-color:var(--primary);border-radius:50%;animation:g 0.8s linear infinite;display:inline-block}
@keyframes g{to{transform:rotate(360deg)}}
@media(max-width:760px){
  .screen{padding:16px;gap:12px}
  .grid2{grid-template-columns:1fr;gap:14px}.photo{max-width:210px;margin:0 auto;aspect-ratio:4/5;min-height:0}
  .btn{width:100%}.btn.big{min-width:0;height:68px;font-size:19px}.btn.sm{width:auto}
  dl.data{grid-template-columns:100px 1fr;gap:7px 10px}dl.data dd{font-size:15px}
  .appbar .btn{width:auto;height:38px;font-size:13px;padding:0 12px}
  .qr{width:170px;height:170px}
  h2{font-size:20px}
}

/* ===== Tableta en vertical (como la usan en recepción): letra y botones grandes, todo a lo ancho ===== */
@media (orientation:portrait) and (min-width:600px){
  .appbar{padding:16px 26px}.appbar .t{font-size:21px}.appbar .s{font-size:14px}.logo{height:54px}
  .pill{font-size:15px;padding:6px 15px}
  .appbar .btn.sm{height:46px;font-size:16px;padding:0 20px}
  .screen{padding:26px 30px;gap:22px}
  .scanner{flex:none;width:min(100%,60vh);aspect-ratio:1/1;align-self:center}
  .scanner .frame{width:min(60%,340px);height:auto;aspect-ratio:1/1}
  .scanner .hint{font-size:17px;padding:0 16px}
  input.in,select.in{height:68px;font-size:21px;border-radius:14px}
  textarea.in{font-size:20px}
  .btn{height:68px;font-size:21px;border-radius:16px}.btn.sm{height:50px;font-size:17px}
  form[data-form=manual]{gap:12px}
  .item{padding:18px 20px;font-size:19px;border-radius:14px}
  .grid2{grid-template-columns:230px 1fr;gap:20px;align-items:stretch}
  .photo{width:100%}
  .grid2 .card{padding:22px}
  dl.data{grid-template-columns:116px 1fr;gap:14px 12px}
  dl.data dt{font-size:16px}dl.data dd{font-size:20px}
  .chip{font-size:17px;padding:5px 13px}
  .aviso{font-size:18px;padding:18px 20px}
  .acciones{margin-top:auto !important;flex-direction:column;align-items:stretch;gap:14px;padding-top:10px}
  .acciones .btn{width:100%}.acciones .btn.big{height:104px;font-size:28px;min-width:0;border-radius:22px}
  .toast{font-size:23px;padding:22px 30px;bottom:48px}
  .modal .box{max-width:560px;padding:30px}.modal h2{font-size:26px}
  .qr{width:260px;height:260px}
  .login{max-width:560px}.login h2{font-size:28px}
}

/* ojito de la contraseña */
.campo-pass{position:relative}.campo-pass .in{padding-right:56px}
.ojo{position:absolute;right:6px;top:50%;transform:translateY(-50%);width:44px;height:44px;border:0;background:transparent;color:var(--muted);display:grid;place-items:center;cursor:pointer;border-radius:10px}
.ojo:hover{color:var(--text)}.ojo svg{width:24px;height:24px}

/* ===== Estilo cristal (mismo espíritu del login del ERP): fondo marino, superficies translúcidas con desenfoque ===== */
:root{--cristal:rgba(255,255,255,.075);--cristal-fuerte:rgba(255,255,255,.12);--cristal-borde:rgba(255,255,255,.2);--cristal-luz:rgba(255,255,255,.38)}
html,body{background:var(--bg)}
.appbar{background:var(--cristal);-webkit-backdrop-filter:blur(18px) saturate(140%);backdrop-filter:blur(18px) saturate(140%);border-bottom:1px solid var(--cristal-borde);box-shadow:0 8px 28px rgba(0,0,0,.25)}
.card,.stat,.item,.modal .box{background:linear-gradient(145deg,var(--cristal-fuerte),var(--cristal));-webkit-backdrop-filter:blur(18px) saturate(140%);backdrop-filter:blur(18px) saturate(140%);border:1px solid var(--cristal-borde);border-top-color:var(--cristal-luz);border-left-color:var(--cristal-luz);box-shadow:0 18px 44px rgba(0,0,0,.32),inset 0 0 0 1px rgba(255,255,255,.04)}
.item{box-shadow:0 8px 22px rgba(0,0,0,.22)}
.modal{background:rgba(2,6,23,.72);-webkit-backdrop-filter:blur(7px);backdrop-filter:blur(7px)}
input.in,select.in,textarea.in{background:rgba(255,255,255,.07);border:1px solid var(--cristal-borde);color:var(--text);-webkit-backdrop-filter:blur(8px);backdrop-filter:blur(8px)}
input.in::placeholder,textarea.in::placeholder{color:rgba(226,232,240,.55)}
input.in:focus,textarea.in:focus,select.in:focus{outline:none;border-color:rgba(147,197,253,.9);box-shadow:0 0 0 3px rgba(96,165,250,.28)}
.photo{border:1px solid var(--cristal-borde);border-top-color:var(--cristal-luz);box-shadow:0 14px 34px rgba(0,0,0,.35);background:linear-gradient(160deg,rgba(255,255,255,.16),rgba(255,255,255,.04))}
.photo .av{background:linear-gradient(160deg,rgba(255,255,255,.2),rgba(255,255,255,.05))}
.photo small{background:rgba(2,6,23,.55);-webkit-backdrop-filter:blur(6px);backdrop-filter:blur(6px)}
.chip{background:rgba(255,255,255,.13);border:1px solid rgba(255,255,255,.14)}
.chip.pick{background:rgba(255,255,255,.05)}.chip.pick.sel{background:rgba(59,111,214,.75);border-color:rgba(147,197,253,.7)}
.btn{box-shadow:inset 0 1px 0 rgba(255,255,255,.45),0 10px 24px rgba(0,0,0,.32)}
.btn.ghost{background:rgba(255,255,255,.06);border:1px solid var(--cristal-borde);box-shadow:none;-webkit-backdrop-filter:blur(8px);backdrop-filter:blur(8px)}
.btn.ghost:hover{background:rgba(255,255,255,.12)}
.pill{-webkit-backdrop-filter:blur(8px);backdrop-filter:blur(8px);border:1px solid rgba(255,255,255,.16)}
.pill.ok{background:rgba(6,78,59,.65)}.pill.warn{background:rgba(120,53,15,.65)}.pill.info{background:rgba(12,74,110,.65)}.pill.bad{background:rgba(91,29,29,.65)}.pill.gris{background:rgba(51,65,85,.6)}
.aviso{-webkit-backdrop-filter:blur(12px);backdrop-filter:blur(12px);border:1px solid rgba(255,255,255,.14)}
.aviso.ok{background:rgba(6,78,59,.55)}.aviso.warn{background:rgba(120,53,15,.55)}.aviso.bad{background:rgba(91,29,29,.55)}.aviso.gris{background:rgba(255,255,255,.08)}
.loc.ok{background:rgba(6,78,59,.55)}.loc.bad{background:rgba(91,29,29,.55)}.loc.warn{background:rgba(120,53,15,.55)}
.check.ok{background:rgba(6,78,59,.6)}.check.bad{background:rgba(91,29,29,.6)}.check.warn{background:rgba(120,53,15,.6)}
.toast{-webkit-backdrop-filter:blur(16px);backdrop-filter:blur(16px)}
.toast.ok{background:rgba(6,78,59,.78)}.toast.warn{background:rgba(120,53,15,.78)}
.scanner{border:1px solid var(--cristal-borde);box-shadow:0 18px 44px rgba(0,0,0,.4)}
.scanner .frame{border-color:var(--primary);box-shadow:0 0 0 999px rgba(0,0,0,.35)}
.barra.warn{background:rgba(120,53,15,.85);-webkit-backdrop-filter:blur(8px);backdrop-filter:blur(8px)}
.salir-mini{color:rgba(226,232,240,.7)}
.ojo{color:rgba(226,232,240,.7)}

/* correcciones en teléfono */
.btn{text-decoration:none}
input[type=date].in{min-width:0;max-width:100%;-webkit-appearance:none;appearance:none}
.qrgrid{grid-template-columns:210px 1fr;align-items:start}
@media(max-width:760px){.qrgrid{grid-template-columns:1fr;justify-items:center}.qrgrid dl.data{width:100%}}

/* QR del empleado: en tableta vertical el QR (260 px) no cabía en su columna de 210 px y se encimaba con los datos; ahora van apilados */
@media (orientation:portrait) and (min-width:600px){
  .qrgrid{grid-template-columns:1fr;justify-items:center}
  .qrgrid dl.data{width:100%}
}
.qr{max-width:100%;height:auto;aspect-ratio:1/1;object-fit:contain}

/* campos obligatorios sin llenar */
.in.invalido{border-color:var(--bad) !important;box-shadow:0 0 0 3px rgba(248,113,113,.28) !important}
label.f:has(+ .invalido),div:has(> .in.invalido) > label.f{color:var(--bad)}
/* botón chico (Descargar junto al estado) */
.appbar .btn.xs{height:34px;font-size:13px;padding:0 12px;border-radius:999px;white-space:nowrap;flex:none;width:auto}

/* QR del empleado: el QR ocupa todo el cuadro, la información va debajo en otra tarjeta */
.qr-grande{width:min(100%,520px);aspect-ratio:1/1;align-self:center;background:#fff;border-radius:22px;padding:14px;box-shadow:0 18px 44px rgba(0,0,0,.4);flex:none}
.qr-grande img{width:100%;height:100%;object-fit:contain;display:block;image-rendering:pixelated}
.acciones-qr{display:flex;flex-direction:column;gap:12px;width:min(100%,520px);align-self:center}
.acciones-qr .btn{width:100%}

/* campos de fecha propios y calendario (bloquea los días no permitidos, también en iPhone) */
.fecha-campo{display:flex;align-items:center;justify-content:space-between;gap:8px;text-align:left;cursor:pointer;width:100%;height:50px;padding:0 14px;box-sizing:border-box;border-radius:12px;border:1px solid var(--cristal-borde);background:rgba(255,255,255,.07);color:var(--text);font:inherit;font-size:16px;-webkit-appearance:none;appearance:none;-webkit-backdrop-filter:blur(8px);backdrop-filter:blur(8px)}
.fecha-campo:active{background:rgba(255,255,255,.12)}
.fecha-campo.invalido{border-color:var(--bad);box-shadow:0 0 0 3px rgba(248,113,113,.25)}
@media (orientation:portrait) and (min-width:600px){.fecha-campo{height:68px;font-size:21px;border-radius:14px}}
.fecha-campo svg{flex:none;color:var(--muted)}
.fecha-campo:disabled{opacity:.4;cursor:not-allowed}
.grupo.invalido > label.f{color:var(--bad)}
.grupo.invalido .chip.pick{border-color:var(--bad)}
.cal-top{display:flex;align-items:center;justify-content:space-between;margin-bottom:12px;font-size:18px}
.cal-nav{width:46px;height:46px;border-radius:12px;border:1px solid var(--cristal-borde);background:rgba(255,255,255,.06);color:var(--text);font-size:26px;line-height:1;cursor:pointer}
.cal-nav:disabled{opacity:.25;cursor:not-allowed}
.cal-sem{display:grid;grid-template-columns:repeat(7,1fr);text-align:center;color:var(--muted);font-size:13px;margin-bottom:6px}
.cal-dias{display:grid;grid-template-columns:repeat(7,1fr);gap:6px}
.dia{aspect-ratio:1/1;border-radius:12px;border:1px solid transparent;background:rgba(255,255,255,.08);color:var(--text);font:inherit;font-size:16px;cursor:pointer;padding:0}
.dia.bloq{background:transparent;color:rgba(148,163,184,.32);cursor:not-allowed}
.dia.hoy{border-color:var(--primary)}
.dia.sel{background:var(--primary);color:var(--on-primary);font-weight:700}
@media (orientation:portrait) and (min-width:600px){.dia{font-size:19px}.cal-top{font-size:21px}}
