/* Gastos — móvil primero. Nada de librerías: todo cabe aquí. */
:root{
  --azul:#2563eb; --azul-claro:#3b82f6; --navy:#0f172a;
  --fondo:#f1f5f9; --tarjeta:#ffffff; --borde:#e2e8f0;
  --texto:#0f172a; --suave:#64748b; --tenue:#94a3b8;
  --verde:#16a34a; --ambar:#f59e0b; --naranja:#ea580c; --rojo:#dc2626;
  --sombra:0 1px 3px rgba(15,23,42,.08), 0 1px 2px rgba(15,23,42,.04);
  --sombra-alta:0 10px 30px rgba(15,23,42,.14);
  --r:16px; --r-s:10px;
  --safe-b:env(safe-area-inset-bottom,0px);
}
@media (prefers-color-scheme:dark){
  :root{
    --fondo:#0b1220; --tarjeta:#131c2e; --borde:#1e2a42;
    --texto:#e8eefb; --suave:#94a3b8; --tenue:#64748b;
    --sombra:0 1px 3px rgba(0,0,0,.4); --sombra-alta:0 10px 30px rgba(0,0,0,.5);
  }
}
*{box-sizing:border-box;-webkit-tap-highlight-color:transparent}
html,body{margin:0;padding:0}
body{
  background:var(--fondo); color:var(--texto);
  font:400 16px/1.5 -apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",sans-serif;
  -webkit-font-smoothing:antialiased; overscroll-behavior-y:none;
}
button,input,select,textarea{font:inherit;color:inherit}
button{cursor:pointer;border:0;background:none}
a{color:var(--azul);text-decoration:none}
.oculto{display:none !important}

/* ---------------------------------------------------------- estructura */
#app{max-width:560px;margin:0 auto;padding:0 16px calc(96px + var(--safe-b))}
.cabecera{
  position:sticky;top:0;z-index:30;margin:0 -16px 12px;padding:14px 16px 10px;
  background:color-mix(in srgb,var(--fondo) 88%,transparent);
  backdrop-filter:saturate(180%) blur(12px);border-bottom:1px solid var(--borde);
}
.cabecera h1{margin:0;font-size:20px;font-weight:700;letter-spacing:-.02em}
.cabecera .sub{color:var(--suave);font-size:13px;margin-top:2px}
.fila{display:flex;align-items:center;gap:10px}
.fila.entre{justify-content:space-between}
.crece{flex:1;min-width:0}

/* -------------------------------------------------------------- piezas */
.tarjeta{
  background:var(--tarjeta);border:1px solid var(--borde);border-radius:var(--r);
  padding:16px;margin-bottom:12px;box-shadow:var(--sombra)
}
.tarjeta.plana{box-shadow:none}
.tit{font-size:12px;font-weight:700;letter-spacing:.06em;text-transform:uppercase;
  color:var(--tenue);margin:0 0 10px}
/* Una cifra nunca se parte: «1.391 €» en dos líneas se lee fatal. */
.cifra{font-size:34px;font-weight:800;letter-spacing:-.03em;
  font-variant-numeric:tabular-nums;white-space:nowrap}
.cifra.s{font-size:22px}
.cifra.xs{font-size:17px;font-weight:700}
/* Trío de métricas (ahorro / colchón / nómina): en móviles estrechos encoge
   en vez de romper las palabras. */
.metricas{display:flex;gap:10px;margin-top:14px;align-items:flex-start}
.metricas>div{flex:1;min-width:0}
.metricas .dim{font-size:12px;line-height:1.3}
@media(max-width:379px){
  .cifra{font-size:29px}
  .cifra.s{font-size:19px}
  .cifra.xs{font-size:15.5px}
  .metricas .dim{font-size:11px}
}
.dim{color:var(--suave);font-size:13px}
/* Cifras: nunca se parten en dos líneas y siempre alinean por columnas. */
.num{font-variant-numeric:tabular-nums;white-space:nowrap}
.verde{color:var(--verde)} .rojo{color:var(--rojo)}
.ambar{color:var(--ambar)} .naranja{color:var(--naranja)} .azul{color:var(--azul)}

.pastilla{
  display:inline-flex;align-items:center;gap:6px;padding:5px 11px;border-radius:999px;
  background:color-mix(in srgb,var(--azul) 12%,transparent);color:var(--azul);
  font-size:13px;font-weight:600;white-space:nowrap
}
.pastilla.gris{background:color-mix(in srgb,var(--suave) 14%,transparent);color:var(--suave)}
.pastilla.verde{background:color-mix(in srgb,var(--verde) 14%,transparent);color:var(--verde)}
.pastilla.rojo{background:color-mix(in srgb,var(--rojo) 14%,transparent);color:var(--rojo)}
.pastilla.ambar{background:color-mix(in srgb,var(--ambar) 18%,transparent);color:var(--ambar)}

.btn{
  display:inline-flex;align-items:center;justify-content:center;gap:8px;
  padding:13px 18px;border-radius:12px;background:var(--azul);color:#fff;
  font-weight:600;font-size:15px;transition:transform .06s,filter .15s;width:100%
}
.btn:active{transform:scale(.985)}
.btn:disabled{opacity:.5}
.btn.suave{background:color-mix(in srgb,var(--azul) 12%,transparent);color:var(--azul)}
.btn.gris{background:color-mix(in srgb,var(--suave) 14%,transparent);color:var(--texto)}
.btn.peligro{background:color-mix(in srgb,var(--rojo) 12%,transparent);color:var(--rojo)}
.btn.auto{width:auto}
.btn.chico{padding:9px 14px;font-size:14px}

label.campo{display:block;margin-bottom:12px}
label.campo>span{display:block;font-size:13px;font-weight:600;color:var(--suave);margin-bottom:6px}
input[type=text],input[type=password],input[type=number],input[type=date],
input[type=month],select,textarea{
  width:100%;padding:12px 14px;border:1px solid var(--borde);border-radius:12px;
  background:var(--fondo);outline:none;transition:border-color .15s,box-shadow .15s
}
input:focus,select:focus,textarea:focus{
  border-color:var(--azul);box-shadow:0 0 0 3px color-mix(in srgb,var(--azul) 18%,transparent)}
select{appearance:none;background-image:linear-gradient(45deg,transparent 50%,var(--suave) 50%),
  linear-gradient(135deg,var(--suave) 50%,transparent 50%);
  background-position:calc(100% - 18px) 20px,calc(100% - 13px) 20px;
  background-size:5px 5px,5px 5px;background-repeat:no-repeat;padding-right:38px}

/* ---------------------------------------------------------- movimientos */
.movs{list-style:none;margin:0;padding:0}
.mov{display:flex;align-items:center;gap:12px;padding:11px 0;border-bottom:1px solid var(--borde)}
.mov:last-child{border-bottom:0}
.mov .ico{
  width:40px;height:40px;flex:none;border-radius:12px;display:grid;place-items:center;
  font-size:19px;background:color-mix(in srgb,var(--suave) 12%,transparent)}
.mov .txt{flex:1;min-width:0}
.mov .txt b{display:block;font-weight:600;font-size:15px;white-space:nowrap;
  overflow:hidden;text-overflow:ellipsis}
.mov .txt small{color:var(--suave);font-size:12.5px}
.mov .imp{font-weight:700;font-variant-numeric:tabular-nums;white-space:nowrap;font-size:15.5px}
.mov.marcado{background:color-mix(in srgb,var(--ambar) 8%,transparent);
  margin:0 -8px;padding-left:8px;padding-right:8px;border-radius:10px}

/* ------------------------------------------------------------- barras */
.barra{height:8px;border-radius:999px;background:color-mix(in srgb,var(--suave) 16%,transparent);
  overflow:hidden;margin-top:6px}
.barra>i{display:block;height:100%;border-radius:999px;background:var(--azul);
  transition:width .4s cubic-bezier(.2,.8,.2,1)}
.cat{margin-bottom:13px}
.cat:last-child{margin-bottom:0}

/* gráfico de días del mes */
.dias{display:flex;align-items:flex-end;gap:2px;height:60px;margin-top:8px}
.dias>i{flex:1;background:color-mix(in srgb,var(--azul) 30%,transparent);border-radius:2px 2px 0 0;
  min-height:2px;transition:height .3s}
.dias>i.hoy{background:var(--azul)}

/* --------------------------------------------------------------- avisos */
.aviso{display:flex;gap:11px;padding:13px;border-radius:var(--r-s);margin-bottom:9px;
  border:1px solid transparent;align-items:flex-start}
.aviso b{display:block;font-size:14.5px;margin-bottom:2px}
.aviso p{margin:0;font-size:13.5px;color:var(--suave);line-height:1.45}
.aviso .em{font-size:19px;line-height:1.2}
.aviso.rojo{background:color-mix(in srgb,var(--rojo) 9%,transparent);
  border-color:color-mix(in srgb,var(--rojo) 25%,transparent)}
.aviso.naranja{background:color-mix(in srgb,var(--naranja) 9%,transparent);
  border-color:color-mix(in srgb,var(--naranja) 25%,transparent)}
.aviso.info{background:color-mix(in srgb,var(--azul) 8%,transparent);
  border-color:color-mix(in srgb,var(--azul) 22%,transparent)}
.aviso.verde{background:color-mix(in srgb,var(--verde) 9%,transparent);
  border-color:color-mix(in srgb,var(--verde) 25%,transparent)}

/* ------------------------------------------------------ barra inferior */
.tabs{
  position:fixed;left:0;right:0;bottom:0;z-index:40;display:flex;
  padding:6px 8px calc(6px + var(--safe-b));
  background:color-mix(in srgb,var(--tarjeta) 92%,transparent);
  backdrop-filter:saturate(180%) blur(14px);border-top:1px solid var(--borde)
}
/* En el ordenador la barra se queda del ancho de la columna y flota, en vez de
   estirarse de lado a lado de un monitor de 27 pulgadas. */
@media(min-width:640px){
  .tabs{left:50%;right:auto;transform:translateX(-50%);bottom:16px;width:min(560px,92vw);
    border:1px solid var(--borde);border-radius:18px;box-shadow:var(--sombra-alta);
    padding:6px 8px}
  .mas{bottom:108px}
}
.tabs button{flex:1;display:grid;place-items:center;gap:2px;padding:6px 0;
  color:var(--tenue);font-size:10.5px;font-weight:600;border-radius:10px}
.tabs button .em{font-size:21px;line-height:1.1;filter:grayscale(1);opacity:.75}
.tabs button.on{color:var(--azul)}
.tabs button.on .em{filter:none;opacity:1}
.mas{
  position:fixed;right:calc(50% - 280px + 16px);bottom:calc(78px + var(--safe-b));z-index:45;
  width:58px;height:58px;border-radius:50%;background:var(--azul);color:#fff;
  font-size:30px;display:grid;place-items:center;box-shadow:var(--sombra-alta)}
@media(max-width:592px){.mas{right:18px}}

/* --------------------------------------------------------------- hojas */
.velo{position:fixed;inset:0;z-index:50;background:rgba(2,6,23,.45);
  backdrop-filter:blur(2px);display:flex;align-items:flex-end;justify-content:center}
.hoja{
  width:100%;max-width:560px;max-height:92vh;overflow-y:auto;background:var(--tarjeta);
  border-radius:22px 22px 0 0;padding:8px 18px calc(24px + var(--safe-b));
  animation:sube .24s cubic-bezier(.2,.9,.25,1)
}
@keyframes sube{from{transform:translateY(30px);opacity:.4}to{transform:none;opacity:1}}
.asa{width:38px;height:4px;border-radius:99px;background:var(--borde);margin:8px auto 14px}
.hoja h2{margin:0 0 14px;font-size:19px;font-weight:700}

/* teclado de importe */
.importe-grande{
  width:100%;text-align:center;font-size:44px;font-weight:800;letter-spacing:-.03em;
  border:0;background:none;padding:14px 0 4px;font-variant-numeric:tabular-nums}
.importe-grande:focus{box-shadow:none;border:0}
.chips{display:flex;gap:8px;overflow-x:auto;padding:4px 0 12px;scrollbar-width:none}
.chips::-webkit-scrollbar{display:none}
.chip{flex:none;padding:8px 13px;border-radius:999px;border:1px solid var(--borde);
  background:var(--fondo);font-size:14px;font-weight:600;color:var(--suave)}
.chip.on{background:var(--azul);border-color:var(--azul);color:#fff}

.rejilla{display:grid;grid-template-columns:repeat(auto-fill,minmax(84px,1fr));gap:8px}
.rejilla button{padding:11px 6px;border-radius:12px;border:1px solid var(--borde);
  background:var(--fondo);font-size:12px;font-weight:600;line-height:1.25;text-align:center}
.rejilla button .em{display:block;font-size:22px;margin-bottom:3px}
.rejilla button.on{border-color:var(--azul);background:color-mix(in srgb,var(--azul) 12%,transparent);
  color:var(--azul)}

/* --------------------------------------------------------------- login */
.entrada{min-height:100dvh;display:grid;place-items:center;padding:24px}
.entrada .caja{width:100%;max-width:380px;text-align:center}
.entrada .logo{font-size:52px;margin-bottom:10px}
.entrada h1{margin:0 0 6px;font-size:26px;font-weight:800;letter-spacing:-.02em}
.entrada p.dim{margin:0 0 26px}
.error{color:var(--rojo);font-size:14px;margin-top:12px;min-height:20px;font-weight:500}
.qr{background:#fff;padding:14px;border-radius:16px;display:inline-block;margin:10px 0}
.qr svg{display:block;width:190px;height:190px}
code.secreto{display:block;background:var(--fondo);border:1px solid var(--borde);
  padding:11px;border-radius:10px;font-size:14px;letter-spacing:.09em;word-break:break-all;
  margin:8px 0 4px}

.cargando{display:grid;place-items:center;min-height:50vh;color:var(--tenue)}
.tostada{position:fixed;left:50%;transform:translateX(-50%);bottom:calc(96px + var(--safe-b));
  z-index:60;background:var(--navy);color:#fff;padding:11px 18px;border-radius:12px;
  font-size:14px;font-weight:600;box-shadow:var(--sombra-alta);animation:sube .2s}
@media (prefers-color-scheme:dark){.tostada{background:#e8eefb;color:#0b1220}}
