/* ══════════════════════════════════════════════════════════════════════
   KZA · sistema de diseño
   Hereda el ADN v9 "Cristal premium" de Bizly: blur 26 saturate 180,
   aurora mesh, SF Pro 300/450/560/700, tracking −.012em, radios 18-26,
   padding 22, iconografía SVG stroke 1.6.
   Lo propio: dicromía por persona (índigo + rosa), cifras en peso 300 y
   un solo modo — claro. La casa no se administra a oscuras.
   ══════════════════════════════════════════════════════════════════════ */

:root {
  color-scheme: light;

  /* Tierra — blanco con sesgo frío, nunca gris muerto */
  --bg: #F4F5FA;
  --bg-2: #FFFFFF;
  --glass: rgba(255,255,255,0.78);
  --glass-alto: rgba(255,255,255,0.92);
  --gline: rgba(16,18,40,0.09);
  --gline-2: rgba(16,18,40,0.055);

  /* Sombras: dos capas, una de contacto y otra de aire */
  --sombra: 0 1px 2px rgba(20,20,50,.05), 0 10px 30px rgba(20,20,50,.06);
  --sombra-alta: 0 2px 6px rgba(20,20,50,.06), 0 26px 64px rgba(20,20,50,.10);
  --glow-indigo: 0 8px 26px rgba(76,70,208,.28);
  --glow-rosa: 0 8px 26px rgba(217,52,91,.24);

  /* Tinta */
  --ink: #14162B;
  --ink-2: #575A72;
  --ink-3: #8A8DA3;

  /* Dicromía */
  --indigo: #4C46D0;
  --indigo-ink: #3B35B8;
  --indigo-suave: rgba(76,70,208,0.10);
  --rosa: #D9345B;
  --rosa-ink: #BC2149;
  --rosa-suave: rgba(217,52,91,0.10);

  /* Semántica */
  --menta: #0E9384;
  --menta-suave: rgba(14,147,132,0.12);
  --ambar: #B87400;
  --ambar-suave: rgba(184,116,0,0.12);
  --rojo: #D70015;

  --sf: -apple-system, BlinkMacSystemFont, "SF Pro Display", "SF Pro Text", "Helvetica Neue", system-ui, sans-serif;
  --pad: 20px;
  --r: 24px;
}

* { margin: 0; padding: 0; box-sizing: border-box; }

body {
  background: var(--bg);
  color: var(--ink);
  font-family: var(--sf);
  font-size: 17px; /* el cuerpo de iOS, no el de la web */
  line-height: 1.47;
  letter-spacing: -0.012em;
  -webkit-font-smoothing: antialiased;
  min-height: 100svh;
  /* Ni a los lados ni con dos dedos. Una app de dinero que se puede arrastrar
     de lado enseña medio renglón y esconde la otra mitad de una cifra; y el
     zoom por gesto convierte cualquier toque doble en un salto de escala.
     `hidden` en <body> no basta: el que se mueve es el documento. */
  overflow-x: clip;
  touch-action: pan-y;
  -webkit-text-size-adjust: 100%;
  overscroll-behavior-x: none;
}

html {
  overflow-x: clip;
  overscroll-behavior-x: none;
}

::selection { background: var(--indigo-suave); }
:focus-visible { outline: 2px solid var(--indigo); outline-offset: 3px; border-radius: 10px; }
img { max-width: 100%; display: block; }
button, input, select, textarea { font: inherit; letter-spacing: inherit; color: inherit; }

/* ── Aurora · neón difuminado sobre claro ────────────────────────── */
.aurora { position: fixed; inset: 0; z-index: -1; pointer-events: none; overflow: hidden; }
.aurora::after {
  /* Velo blanco encima: baja el neón a un susurro y evita que compita con el texto */
  content: ""; position: absolute; inset: 0;
  background: radial-gradient(120% 90% at 50% 0%, rgba(255,255,255,0) 20%, rgba(244,245,250,.72) 78%);
}
.aurora i { position: absolute; display: block; border-radius: 50%; filter: blur(90px); }
.aurora i:nth-child(1) { width: 62vw; height: 62vw; min-width: 420px; min-height: 420px; left: -16vw; top: -20vw; background: #6C63FF; opacity: .34; }
.aurora i:nth-child(2) { width: 52vw; height: 52vw; min-width: 340px; min-height: 340px; right: -14vw; top: 14vh; background: #FF5C8A; opacity: .26; }
.aurora i:nth-child(3) { width: 48vw; height: 48vw; min-width: 320px; min-height: 320px; left: 26vw; bottom: -20vw; background: #2FD3C0; opacity: .22; }

/* ── Tipografía ──────────────────────────────────────────────────── */
h1, h2, h3 { font-weight: 700; letter-spacing: -0.04em; line-height: 1.08; text-wrap: balance; }
h1 { font-size: clamp(30px, 7vw, 40px); }
h2 { font-size: 25px; }
h3 { font-size: 19px; letter-spacing: -0.03em; }

.rotulo {
  font-size: 12px; font-weight: 600; color: var(--ink-3);
  text-transform: uppercase; letter-spacing: .08em;
}
.apunte { font-size: 13.5px; color: var(--ink-3); line-height: 1.5; }
.plomo { font-size: 16px; color: var(--ink-2); line-height: 1.5; }

.marca-kza {
  font-weight: 700; letter-spacing: -0.055em;
  background: linear-gradient(112deg, #5B54E8 12%, #A34AC0 52%, #E8557E 92%);
  -webkit-background-clip: text; background-clip: text; color: transparent;
}
.cifra { font-weight: 300; letter-spacing: -0.045em; font-variant-numeric: tabular-nums; }

/* ── Cristal ─────────────────────────────────────────────────────── */
.cristal {
  background: var(--glass);
  backdrop-filter: blur(26px) saturate(180%);
  -webkit-backdrop-filter: blur(26px) saturate(180%);
  border: 1px solid var(--gline);
  border-radius: var(--r);
  box-shadow: var(--sombra);
}
.cristal--alto { background: var(--glass-alto); box-shadow: var(--sombra-alta); }

/* ── Estructura ──────────────────────────────────────────────────── */
/* Columna de teléfono SIEMPRE, también en la Mac. KZA es una app, y una app no
   se estira a 1400 px porque haya monitor: se queda en su ancho y se centra. */
.centro { max-width: 430px; margin: 0 auto; padding: var(--pad); }
/* El min-width: 0 no es adorno. El body es un flex en columna y sus hijos
   nacen con min-width: auto, o sea que se niegan a encoger por debajo de su
   contenido: basta una fila del libro con su contenido ancho para que <main>
   mida 411px dentro de una pantalla de 393. Entonces los 20px de margen
   derecho se salen de la pantalla, sólo se ven los de la izquierda, y toda la
   columna se ve corrida. Es el mismo bicho que `1fr` contra `minmax(0,1fr)`. */
.ancho { max-width: 460px; margin: 0 auto; padding: var(--pad); min-width: 0; }
/* Las barras cruzan la ventana completa —el cristal se ve de borde a borde—
   y lo que se limita a 460 es su CONTENIDO, centrado. Ponerle el ancho a la
   barra la dejaba pegada a la izquierda. */
.barra { gap: 0; }
.barra__interior {
  width: 100%; max-width: 460px; margin: 0 auto;
  display: flex; justify-content: space-between; align-items: center; position: relative;
  min-height: 30px;
}
.destinos__interior {
  width: 100%; max-width: 460px; margin: 0 auto;
  display: flex; justify-content: space-around; align-items: center;
}
/* ── La regla que evita que la app se vea corrida ────────────────────
   Un grid sin plantilla usa columnas `auto`, que es minmax(min-content,
   max-content): la columna SE NIEGA a encoger por debajo de su contenido. Un
   solo renglón ancho —una fila del libro, una cifra larga— hace que el grid
   mida más que la pantalla, ese ancho sube por todos los padres hasta <main>,
   y entonces el margen derecho se sale de la vista mientras el izquierdo se
   queda: la columna entera se ve chueca sin que nada parezca estar mal.
   Con minmax(0, 1fr) la columna puede encoger y el ancho deja de propagarse. */
/* .tiles queda fuera a propósito: es de DOS columnas y este selector le gana
   por especificidad, así que incluirla apilaba "Entró" sobre "Salió". */
.pila, .pila-16, .campo, .campos-2, .sugerencias, .sugerencia, .feed,
.feed > div:has(> .tarjeta):not(.tiles), .tile, .consumo, .semaforo, .art__cuerpo,
.modos, .dialogo__datos, .dialogo__botones, .sectores, .proximo, .lista {
  grid-template-columns: minmax(0, 1fr);
}
/* Y ninguna caja de la app puede imponer su ancho hacia arriba. */
.lista, .tarjeta, .feed, main.ancho { min-width: 0; }

.pila { display: grid; gap: 12px; }
.pila-16 { display: grid; gap: 16px; }
.fila-entre { display: flex; justify-content: space-between; align-items: center; gap: 12px; }
.bloque { padding: 22px 20px 24px; }
@media (min-width: 600px) { .bloque { padding: 26px 26px 28px; } }

.tit-seccion { display: flex; align-items: center; gap: 10px; margin-bottom: 14px; }
.tit-seccion__ico {
  width: 30px; height: 30px; border-radius: 10px; flex: none;
  display: grid; place-items: center; background: var(--indigo-suave);
}
.tit-seccion__ico svg { width: 17px; height: 17px; stroke: var(--indigo); stroke-width: 1.6; fill: none; stroke-linecap: round; stroke-linejoin: round; }
.tit-seccion h3 { font-size: 17px; }

/* ── Campos ──────────────────────────────────────────────────────── */
.campo { display: grid; gap: 7px; }
.campo > label { font-size: 13px; font-weight: 560; color: var(--ink-2); }
.campo input, .campo select, .campo textarea {
  width: 100%;
  background: var(--bg-2);
  border: 1px solid var(--gline);
  border-radius: 15px;
  padding: 14px 16px;
  font-size: 16px; /* 16px o iOS hace zoom al enfocar */
  box-shadow: inset 0 1px 2px rgba(20,20,50,.03);
  transition: border-color .2s ease, box-shadow .2s ease;
  -webkit-appearance: none; appearance: none;
}
.campo select {
  background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 12 8'%3E%3Cpath d='M1 1.5 6 6.5l5-5' fill='none' stroke='%238A8DA3' stroke-width='1.6' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E");
  background-repeat: no-repeat; background-position: right 16px center; background-size: 12px;
  padding-right: 40px;
}
.campo input:focus, .campo select:focus, .campo textarea:focus {
  outline: none; border-color: var(--indigo);
  box-shadow: 0 0 0 4px var(--indigo-suave);
}
.campo input::placeholder { color: var(--ink-3); }
.campos-2 { display: grid; gap: 14px; }
@media (min-width: 520px) { .campos-2 { grid-template-columns: minmax(0, 1fr) minmax(0, 1fr); } }

/* ── Botones ─────────────────────────────────────────────────────── */
.btn {
  display: inline-flex; align-items: center; justify-content: center; gap: 8px;
  font-size: 16px; font-weight: 560; letter-spacing: -0.015em;
  padding: 15px 24px; border-radius: 980px; border: none; cursor: pointer;
  background: var(--indigo); color: #fff;
  box-shadow: var(--glow-indigo);
  transition: transform .18s cubic-bezier(.3,.8,.4,1), box-shadow .22s ease, opacity .18s ease;
}
.btn:hover { box-shadow: 0 10px 30px rgba(76,70,208,.36); }
.btn:active { transform: scale(.975); }
.btn[disabled] { opacity: .45; cursor: default; transform: none; box-shadow: none; }
.btn--bloque { width: 100%; }
/* .btn está pensado para <button>; como enlace se le cuela el subrayado del
   navegador y deja de parecer un botón. */
a.btn { text-decoration: none; }
.btn--sec { background: var(--indigo-suave); color: var(--indigo-ink); box-shadow: none; }
.btn--sec:hover { background: rgba(76,70,208,.16); box-shadow: none; }
.btn--fan { background: var(--bg-2); color: var(--ink-2); box-shadow: inset 0 0 0 1px var(--gline); }
.btn--fan:hover { box-shadow: inset 0 0 0 1px var(--ink-3); }
.btn--chico { font-size: 14px; padding: 11px 17px; }

/* ── Identidad de persona ────────────────────────────────────────── */
.avatar {
  width: 40px; height: 40px; border-radius: 50%; flex: none;
  display: grid; place-items: center; overflow: hidden;
  font-size: 15px; font-weight: 600; color: #fff;
  background: var(--ink-3);
  box-shadow: 0 3px 10px rgba(20,20,50,.14);
}
.avatar img { width: 100%; height: 100%; object-fit: cover; }
.avatar--chico { width: 30px; height: 30px; font-size: 12px; }
.avatar--grande { width: 66px; height: 66px; font-size: 25px; }
.c-indigo { background: linear-gradient(150deg, #6C63FF, #4C46D0); }
.c-rosa { background: linear-gradient(150deg, #FF5C8A, #D9345B); }
.c-menta { background: linear-gradient(150deg, #2FD3C0, #0E9384); }
.c-ambar { background: linear-gradient(150deg, #F0A63C, #B87400); }
.c-duo { background: linear-gradient(135deg, #5B54E8, #E8557E); }

/* ── Renglones ───────────────────────────────────────────────────── */
.reng { display: flex; align-items: center; gap: 13px; padding: 13px 0; }
.reng + .reng { border-top: 1px solid var(--gline-2); }
.reng__cuerpo { flex: 1; min-width: 0; }
.reng__nom { font-size: 15.5px; font-weight: 500; }
.reng__sub { font-size: 13px; color: var(--ink-3); margin-top: 1px; }
.reng__val { font-variant-numeric: tabular-nums; color: var(--ink-2); font-size: 14px; white-space: nowrap; }

/* Quien todavía no entra a la casa no cabe en un renglón: hay que ver su correo,
   en qué va su liga y qué se puede hacer al respecto. Los botones van debajo y no
   a un lado, porque en un teléfono a un lado significa cortados. */
.reng--invita { align-items: flex-start; }
.reng--invita .avatar { margin-top: 2px; }
.reng__acciones { display: flex; flex-wrap: wrap; gap: 8px; margin-top: 11px; }

.estado { font-size: 12.5px; font-weight: 560; white-space: nowrap; }
.estado--activo { color: var(--menta); }
.estado--espera { color: var(--ambar); }
.estado--nadie { color: var(--ink-3); }

/* ── Pasos del alta ──────────────────────────────────────────────── */
.pasos { display: flex; gap: 5px; margin-bottom: 8px; }
.pasos i { flex: 1; height: 4px; border-radius: 3px; background: var(--gline); display: block; transition: background .3s ease; }
.pasos i.hecho { background: var(--indigo); }
.pasos i.activo { background: linear-gradient(90deg, var(--indigo), #A34AC0); }

.paso-cab { margin: 20px 0 22px; }
.paso-cab h1 { margin-top: 8px; }
.paso-cab p { color: var(--ink-2); font-size: 15.5px; margin-top: 10px; max-width: 46ch; }

/* ── Sugerencias de dirección ────────────────────────────────────── */
.sugerencias { display: grid; gap: 1px; background: var(--gline); border: 1px solid var(--gline); border-radius: 16px; overflow: hidden; margin-top: 8px; box-shadow: var(--sombra); }
.sugerencia { background: var(--bg-2); border: none; text-align: left; padding: 13px 16px; cursor: pointer; display: grid; gap: 2px; }
.sugerencia:hover, .sugerencia:focus-visible { background: var(--indigo-suave); }
.sugerencia b { font-size: 15px; font-weight: 500; }
.sugerencia span { font-size: 13px; color: var(--ink-3); }

/* ── Foto ────────────────────────────────────────────────────────── */
.foto-caja {
  position: relative; width: 100%; aspect-ratio: 16/10;
  border-radius: 18px; overflow: hidden; cursor: pointer;
  background: linear-gradient(160deg, rgba(108,99,255,.07), rgba(255,92,138,.07));
  border: 1px dashed rgba(76,70,208,.3);
  display: grid; place-items: center; text-align: center; padding: 16px;
  transition: border-color .2s ease;
}
.foto-caja:hover { border-color: var(--indigo); }
.foto-caja img { position: absolute; inset: 0; width: 100%; height: 100%; object-fit: cover; }
.foto-caja span { font-size: 14px; color: var(--ink-2); position: relative; font-weight: 500; }
.foto-caja input { display: none; }
.foto-caja.tiene { border-style: solid; border-color: var(--gline); }
.mapa-casa { width: 100%; aspect-ratio: 2/1; border-radius: 18px; object-fit: cover; border: 1px solid var(--gline); }
.retrato { width: 100%; aspect-ratio: 16/10; object-fit: cover; border-radius: var(--r); border: 1px solid var(--gline); box-shadow: var(--sombra); }

/* ── Portada del hogar ───────────────────────────────────────────── */
/* La foto es fondo, no protagonista: altura fija y el nombre encima. */
.portada {
  position: relative; border-radius: var(--r); overflow: hidden;
  aspect-ratio: 3/2; max-height: 230px; width: 100%;
  border: 1px solid var(--gline); box-shadow: var(--sombra);
  background: linear-gradient(150deg, #6C63FF, #E8557E);
  display: flex; align-items: flex-end;
}
.portada img { position: absolute; inset: 0; width: 100%; height: 100%; object-fit: cover; }
.portada__velo {
  position: absolute; inset: 0;
  background: linear-gradient(180deg, rgba(10,12,30,0) 34%, rgba(10,12,30,.62) 100%);
}
.portada__texto { position: relative; padding: 16px 18px; color: #fff; }
.portada__texto b { display: block; font-size: 21px; font-weight: 700; letter-spacing: -.03em; }
.portada__texto span { font-size: 13px; opacity: .82; }

/* ── Tarjeta del feed ────────────────────────────────────────────── */
.tarjeta {
  background: var(--glass-alto);
  backdrop-filter: blur(26px) saturate(180%);
  -webkit-backdrop-filter: blur(26px) saturate(180%);
  border: 1px solid var(--gline);
  border-radius: 20px;
  box-shadow: var(--sombra);
  padding: 16px 16px 18px;
}
.tarjeta__cab { display: flex; align-items: center; gap: 10px; margin-bottom: 12px; }
.tarjeta__ico { width: 30px; height: 30px; border-radius: 10px; flex: none; display: grid; place-items: center; }
.tarjeta__ico svg { width: 17px; height: 17px; stroke-width: 1.7; fill: none; stroke-linecap: round; stroke-linejoin: round; }
.tarjeta__tit { font-size: 15px; font-weight: 600; letter-spacing: -.02em; flex: 1; }
.tarjeta__nota { font-size: 13px; color: var(--ink-3); font-variant-numeric: tabular-nums; }
.i-indigo { background: var(--indigo-suave); } .i-indigo svg { stroke: var(--indigo); }
.i-rosa { background: var(--rosa-suave); } .i-rosa svg { stroke: var(--rosa); }
.i-menta { background: var(--menta-suave); } .i-menta svg { stroke: var(--menta); }
.i-ambar { background: var(--ambar-suave); } .i-ambar svg { stroke: var(--ambar); }

.feed { display: grid; gap: 24px; }
/* Cualquier contenedor que agrupe tarjetas dentro del feed hereda el mismo aire.
   Se aplica por estructura y no por acordarse de poner una clase: así no vuelven
   a salir pegadas cada vez que se agrega una vista nueva. */
.feed .feed { gap: 24px; }
.feed > div:has(> .tarjeta) { display: grid; gap: 24px; }
/* Un contenedor vacío sigue siendo celda del grid y se lleva su gap completo.
   Sin esto, esconder una tarjeta deja el hueco donde estaba. */
.feed > div:empty { display: none; }

/* Fila de avatares encimados, como en Mensajes */
.caras { display: flex; align-items: center; }
.caras .avatar { margin-right: -10px; box-shadow: 0 0 0 3px var(--bg-2); }
.caras .avatar:last-child { margin-right: 0; }

/* ── Barra superior ──────────────────────────────────────────────── */
.barra {
  position: sticky; top: 0; z-index: 20;
  display: flex; flex-direction: column; align-items: stretch;
  padding: 12px var(--pad);
  /* El hueco de arriba es el de la isla o la muesca del teléfono. En el mockup
     no existe env(), así que se puede forzar con --safe-top. */
  padding-top: calc(12px + var(--safe-top, env(safe-area-inset-top, 0px)));
  background: rgba(255,255,255,.72);
  backdrop-filter: blur(26px) saturate(180%);
  -webkit-backdrop-filter: blur(26px) saturate(180%);
  border-bottom: 1px solid var(--gline);
}
.barra__marca { font-size: 20px; font-weight: 700; letter-spacing: -0.05em; }

/* La campana. El punto sólo aparece cuando hay algo sin ver: una campana con
   un cero permanente enseña a ignorarla. */
.campana { position: relative; background: none; border: none; cursor: pointer; padding: 4px; margin-left: auto; margin-right: 12px; display: grid; place-items: center; }
.campana svg { width: 21px; height: 21px; stroke: var(--ink-2); stroke-width: 1.7; fill: none; stroke-linecap: round; stroke-linejoin: round; }
.campana i {
  position: absolute; top: 1px; right: 0;
  min-width: 15px; height: 15px; padding: 0 4px; border-radius: 99px;
  background: var(--rojo); color: #fff; font-size: 10px; font-weight: 700; font-style: normal;
  display: grid; place-items: center; box-shadow: 0 0 0 2px var(--bg);
}
.campana.urgente svg { stroke: var(--rojo); }

/* La tira de dinero de la barra. Comparte el ancho de columna del contenido
   para que las cifras caigan alineadas con lo de abajo, y se encoge al hacer
   scroll: al llegar ahí uno ya la leyó. */
.barra__dinero {
  width: 100%; max-width: 460px; margin: 14px auto 2px;
  display: grid; grid-template-columns: minmax(0, 1fr) minmax(0, 1fr) auto; gap: 4px 16px;
  align-items: end;
  transition: margin .28s cubic-bezier(.2,.8,.2,1), opacity .22s, max-height .28s cubic-bezier(.2,.8,.2,1);
  max-height: 70px; overflow: hidden;
}
.barra__dinero .rotulo { display: block; margin-bottom: 1px; }
.barra__dinero .monto { font-size: 23px; font-weight: 300; letter-spacing: -.03em; line-height: 1.1; }
.barra__dinero .monto__cent { font-size: .58em; }
.barra__dinero .riel { grid-column: 1 / -1; margin-top: 3px; }
.barra__dinero__mes {
  font-size: 11px; text-transform: uppercase; letter-spacing: .07em;
  color: var(--ink-3); padding-bottom: 3px; white-space: nowrap;
}
.barra.encogida .barra__dinero { max-height: 0; margin-top: 0; opacity: 0; }

/* ── Barra de destinos ───────────────────────────────────────────── */
.destinos {
  position: sticky; bottom: 0; z-index: 20;
  display: flex; justify-content: space-around; align-items: center;
  padding: 9px 4px calc(9px + env(safe-area-inset-bottom));
  background: rgba(255,255,255,.78);
  backdrop-filter: blur(26px) saturate(180%);
  -webkit-backdrop-filter: blur(26px) saturate(180%);
  border-top: 1px solid var(--gline);
}
.destino {
  display: grid; justify-items: center; gap: 3px;
  font-size: 10px; font-weight: 500; color: var(--ink-3);
  background: none; border: none; cursor: pointer; padding: 5px 8px;
  transition: color .2s ease;
}
.destino svg { width: 23px; height: 23px; stroke: var(--ink-3); stroke-width: 1.6; fill: none; stroke-linecap: round; stroke-linejoin: round; transition: stroke .2s ease; }
.destino.act { color: var(--indigo); }
.destino.act svg { stroke: var(--indigo); }

/* ── Avisos ──────────────────────────────────────────────────────── */
.aviso { font-size: 14px; line-height: 1.45; padding: 14px 16px; border-radius: 16px; }
.aviso--error { background: var(--rosa-suave); color: var(--rosa-ink); }
.aviso--bien { background: var(--menta-suave); color: var(--menta); }
.aviso--nota { background: var(--indigo-suave); color: var(--indigo-ink); }

.proximo { text-align: center; padding: 54px 24px; display: grid; gap: 10px; justify-items: center; }
.proximo__ico {
  width: 52px; height: 52px; border-radius: 17px; display: grid; place-items: center;
  background: linear-gradient(150deg, rgba(108,99,255,.14), rgba(255,92,138,.14));
  margin-bottom: 4px;
}
.proximo__ico svg { width: 24px; height: 24px; stroke: var(--indigo); stroke-width: 1.5; fill: none; stroke-linecap: round; stroke-linejoin: round; }

.oculto { display: none !important; }

/* ══════════════════════════════════════════════════════════════════
   Modo aplicación · iOS
   Lo que separa una web de una app: no se selecciona el texto de la
   interfaz, no hay destello gris al tocar, el scroll rebota solo dentro
   del contenido y todo respeta el notch y la barra de gestos.
   ══════════════════════════════════════════════════════════════════ */

html { -webkit-text-size-adjust: 100%; }

body {
  -webkit-tap-highlight-color: transparent;
  overscroll-behavior-y: none;
}

.barra, .destinos, .rotulo, .btn, .destino, label, .pasos {
  -webkit-user-select: none; user-select: none;
  -webkit-touch-callout: none;
}

/* Título grande de iOS: manda en el contenido y se encoge al hacer scroll,
   dejando el título chico en la barra. */
.titulon { padding: 6px 0 18px; }
.titulon h1 { font-size: clamp(32px, 8.5vw, 40px); letter-spacing: -0.045em; }
.titulon .rotulo { margin-bottom: 7px; }
.titulon__sub { font-size: 14.5px; color: var(--ink-3); margin-top: 6px; }

.barra__titulo {
  font-size: 16px; font-weight: 600; letter-spacing: -0.02em;
  opacity: 0; transform: translateY(6px);
  transition: opacity .22s ease, transform .22s ease;
  pointer-events: none;
  position: absolute; left: 50%; translate: -50% 0;
}
.barra.encogida .barra__titulo { opacity: 1; transform: none; }
.barra { position: sticky; }

/* Lista agrupada estilo iOS: bloque blanco redondeado, filete que respeta
   la sangría del contenido, y encabezado en versalitas. */
.grupo { margin-bottom: 22px; }
.grupo__tit { padding: 0 4px 8px; }
.lista {
  background: var(--glass-alto);
  backdrop-filter: blur(26px) saturate(180%);
  -webkit-backdrop-filter: blur(26px) saturate(180%);
  border: 1px solid var(--gline);
  border-radius: 18px;
  box-shadow: var(--sombra);
  overflow: hidden;
}
.lista .reng { padding: 13px 16px; }
.lista .reng + .reng { border-top: 1px solid var(--gline-2); }
.lista__pie { padding: 10px 6px 0; font-size: 12.5px; color: var(--ink-3); line-height: 1.45; }

/* Fila tocable con la flechita de iOS */
.reng--toca { cursor: pointer; transition: background .15s ease; }
.reng--toca:active { background: rgba(76,70,208,.06); }
.chevron { width: 8px; height: 13px; flex: none; opacity: .45; }
.chevron path { stroke: var(--ink-3); stroke-width: 2; fill: none; stroke-linecap: round; stroke-linejoin: round; }

/* En modo instalado no hay barra de Safari: se recupera ese aire arriba */
@media (display-mode: standalone) {
  .barra { padding-top: calc(10px + env(safe-area-inset-top)); }
  main { padding-bottom: 12px; }
}

/* ══════════════════════════════════════════════════════════════════
   Dinero · fase 2
   ══════════════════════════════════════════════════════════════════ */

/* Cifra rectora: peso 300, tabular, como en Wallet */
.monto { font-weight: 300; letter-spacing: -0.05em; font-variant-numeric: tabular-nums; line-height: 1.02; }
.monto--grande { font-size: 40px; }
.monto--medio { font-size: 27px; }
.monto__cent { font-size: .52em; color: var(--ink-3); }
.signo-mas { color: var(--menta); }
.signo-menos { color: var(--ink); }

/* Regla de la casa para los grids: SIEMPRE minmax(0, 1fr), nunca 1fr a secas.
   Un `1fr` pelón es minmax(auto, 1fr) y se niega a encoger por debajo de su
   contenido: basta una cifra larga —"1,964.00" a 34px— para que la columna
   empuje el grid más ancho que el teléfono. Entonces la página entera se puede
   correr de lado y todo se ve chueco, sin que nada parezca estar mal. */
.tiles { display: grid; grid-template-columns: minmax(0, 1fr) minmax(0, 1fr); gap: 16px; }
.tile { padding: 15px 16px 17px; display: grid; gap: 3px; }
.tile .rotulo { font-size: 11px; }

/* Selector de mes */
.mes-sel { display: flex; align-items: center; justify-content: center; gap: 6px; }
.mes-sel button {
  width: 34px; height: 34px; border-radius: 50%; border: none; cursor: pointer;
  background: var(--bg-2); box-shadow: inset 0 0 0 1px var(--gline);
  display: grid; place-items: center;
}
.mes-sel button:active { background: var(--indigo-suave); }
.mes-sel button svg { width: 14px; height: 14px; stroke: var(--ink-2); stroke-width: 2; fill: none; stroke-linecap: round; stroke-linejoin: round; }
.mes-sel__nom { font-size: 15px; font-weight: 600; min-width: 132px; text-align: center; text-transform: capitalize; }

/* Día dentro del libro */
.dia { margin-bottom: 18px; }
.dia__tit { display: flex; justify-content: space-between; align-items: baseline; padding: 0 6px 7px; }
.dia__fecha { font-size: 12px; font-weight: 600; color: var(--ink-3); text-transform: uppercase; letter-spacing: .07em; }
.dia__total { font-size: 12px; color: var(--ink-3); font-variant-numeric: tabular-nums; }

.mov { display: flex; align-items: center; gap: 12px; padding: 12px 16px; cursor: pointer; }
.mov + .mov { border-top: 1px solid var(--gline-2); }
.mov:active { background: rgba(76,70,208,.05); }
.mov__cuerpo { flex: 1; min-width: 0; }
.mov__nom { font-size: 15.5px; font-weight: 500; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.mov__sub { font-size: 12.5px; color: var(--ink-3); margin-top: 1px; }
.mov__monto { font-variant-numeric: tabular-nums; font-size: 16px; font-weight: 500; white-space: nowrap; }
.mov--anulado .mov__nom, .mov--anulado .mov__monto { text-decoration: line-through; color: var(--ink-3); }

/* Botón de captura, flotando sobre la barra de destinos */
.fab {
  position: fixed; right: max(20px, calc(50% - 210px)); bottom: calc(84px + env(safe-area-inset-bottom));
  width: 56px; height: 56px; border-radius: 50%; border: none; cursor: pointer; z-index: 30;
  background: linear-gradient(150deg, #6C63FF, #4C46D0);
  box-shadow: 0 10px 26px rgba(76,70,208,.42);
  display: grid; place-items: center;
  transition: transform .18s cubic-bezier(.3,.8,.4,1);
}
.fab:active { transform: scale(.93); }
.fab svg { width: 24px; height: 24px; stroke: #fff; stroke-width: 2.2; fill: none; stroke-linecap: round; }

/* ── Hoja modal, estilo iOS ──────────────────────────────────────── */
.telon {
  position: fixed; inset: 0; z-index: 50;
  background: rgba(14,16,36,.34);
  backdrop-filter: blur(3px); -webkit-backdrop-filter: blur(3px);
  display: flex; align-items: flex-end; justify-content: center;
  animation: aparece .22s ease both;
}
@keyframes aparece { from { opacity: 0 } to { opacity: 1 } }

.hoja {
  width: 100%; max-width: 460px;
  max-height: 92svh; overflow-y: auto; -webkit-overflow-scrolling: touch;
  background: #FBFBFE;
  border-radius: 26px 26px 0 0;
  padding: 10px 18px calc(26px + env(safe-area-inset-bottom));
  box-shadow: 0 -10px 50px rgba(20,20,50,.24);
  animation: sube .3s cubic-bezier(.22,.8,.3,1) both;
}
@keyframes sube { from { transform: translateY(24px); opacity: .6 } to { transform: none; opacity: 1 } }
@media (prefers-reduced-motion: reduce) { .telon, .hoja { animation: none } }

.hoja__jalar { width: 38px; height: 5px; border-radius: 3px; background: var(--gline); margin: 0 auto 14px; }
.hoja__cab { display: flex; justify-content: space-between; align-items: center; margin-bottom: 18px; }
.hoja__cab h2 { font-size: 20px; }
.hoja__x {
  width: 32px; height: 32px; border-radius: 50%; border: none; cursor: pointer;
  background: var(--gline-2); display: grid; place-items: center;
}
.hoja__x svg { width: 13px; height: 13px; stroke: var(--ink-2); stroke-width: 2.2; fill: none; stroke-linecap: round; }

/* Segmento iOS */
/* Columnas exactamente iguales. Con flex, el sobrante se repartía de forma
   desigual entre pestañas de largos distintos y los huecos crecían de
   izquierda a derecha: se veía chueco. Un grid de fracciones iguales no se
   puede torcer, y cada texto queda centrado en su propia celda. */
.segmento {
  /* minmax(0,1fr) y no 1fr a secas: 1fr es minmax(auto,1fr), así que una
     etiqueta más ancha que su cuarto NO se encoge —crece y les roba a las
     demás—, y ahí es donde se veía chueco. Con mínimo 0, las cuatro columnas
     miden exactamente igual pase lo que pase. */
  display: grid; grid-auto-flow: column; grid-auto-columns: minmax(0, 1fr);
  gap: 2px; padding: 3px; border-radius: 13px;
  background: var(--gline-2); margin-bottom: 18px;
}
.segmento button {
  min-width: 0; white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
  border: none; cursor: pointer; padding: 10px 6px; border-radius: 10px;
  background: transparent; font-weight: 560; letter-spacing: -.015em;
  color: var(--ink-2); text-align: center;
  /* El tamaño se ata al ancho de la pantalla en vez de a un número fijo: la
     etiqueta más larga tiene que caber en su cuarto en un iPhone chico igual
     que en uno grande. El tope evita que crezca de más en escritorio. */
  font-size: clamp(12.5px, 3.7vw, 14.5px);
  transition: background .2s ease, color .2s ease;
}
.segmento button.act { background: var(--bg-2); color: var(--ink); box-shadow: 0 1px 3px rgba(20,20,50,.12); }

/* Captura del monto */
.monto-captura { text-align: center; padding: 6px 0 18px; }
.monto-captura input {
  width: 100%; border: none; background: transparent; text-align: center;
  font-size: 46px; font-weight: 300; letter-spacing: -0.05em;
  font-variant-numeric: tabular-nums; color: var(--ink);
  padding: 4px 0;
}
.monto-captura input:focus { outline: none; }
.monto-captura input::placeholder { color: var(--gline); }
.monto-captura .rotulo { margin-top: 2px; }

/* Fichas: método de pago, quién pagó, división */
.fichas { display: flex; flex-wrap: wrap; gap: 8px; }
.ficha {
  border: none; cursor: pointer; font-size: 14px; font-weight: 500;
  padding: 10px 15px; border-radius: 13px;
  background: var(--bg-2); color: var(--ink-2);
  box-shadow: inset 0 0 0 1px var(--gline);
  display: inline-flex; align-items: center; gap: 7px;
  transition: background .18s ease, color .18s ease, box-shadow .18s ease;
}
.ficha:active { transform: scale(.97); }
.ficha.act { background: var(--indigo); color: #fff; box-shadow: none; }
.ficha.act .avatar { box-shadow: 0 0 0 2px rgba(255,255,255,.6); }

/* ── Despensa ────────────────────────────────────────────────────── */
/* El nivel se lee por forma antes que por color: cinco tramos, no una barra. */
.medidor { display: inline-flex; gap: 3px; align-items: center; }
.medidor i { width: 14px; height: 5px; border-radius: 3px; background: var(--gline); display: block; }
.medidor i.on { background: var(--menta); }
.medidor.bajo i.on { background: var(--rojo); }
.medidor.medio i.on { background: var(--ambar); }

/* Riel: una barra continua para proporciones. El medidor cuenta unidades
   discretas; el riel mide un porcentaje. Admite dos tramos —lo gastado y lo
   que falta por gastar— sin que el segundo parezca gasto consumado. */
.riel {
  display: flex; height: 6px; border-radius: 4px; overflow: hidden;
  background: var(--gline); gap: 0;
}
.riel i { display: block; height: 100%; border-radius: 4px; transition: width .5s cubic-bezier(.2,.8,.2,1); }
.riel--doble i + i { margin-left: 2px; }
/* Tres tramos: lo gastado, lo que falta por salir, y el resto —que se ve como
   el hueco vacío del riel, sin pintarlo—. */
.riel--triple i + i { margin-left: 2px; }

/* Lo que más se consume: una lista con su propia barra proporcional */
.consumo { display: grid; gap: 12px; margin-top: 4px; }
.consumo__fila { display: grid; grid-template-columns: minmax(0, 1fr) auto; gap: 4px 10px; align-items: baseline; }
.consumo__nom { font-size: 15px; font-weight: 450; letter-spacing: -.012em; }
.consumo__val { font-size: 14px; color: var(--ink-2); font-variant-numeric: tabular-nums; }
.consumo__sub { grid-column: 1 / -1; display: flex; align-items: center; gap: 8px; }
.consumo__sub .riel { flex: 1; height: 4px; }
.consumo__sub span { font-size: 12px; color: var(--ink-3); white-space: nowrap; }

/* Macros: el reparto de calorías en una sola barra, con su leyenda */
.macros { display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); gap: 10px; margin-top: 14px; }
.macros div { text-align: center; }
.macros b { display: block; font-size: 19px; font-weight: 300; letter-spacing: -.02em; }
.macros span { font-size: 11px; text-transform: uppercase; letter-spacing: .06em; color: var(--ink-3); }

/* Semáforo: la alerta más barata en espacio que existe. Un punto de color y
   una línea. No lleva cápsula ni borde: el color ya es el mensaje. */
.semaforo { display: grid; gap: 5px; margin-top: 12px; }
.semaforo__l { display: flex; align-items: center; gap: 8px; font-size: 13px; line-height: 1.35; color: var(--ink-2); }
.semaforo__p { width: 7px; height: 7px; border-radius: 50%; flex: none; }
.semaforo__l b { font-weight: 560; color: var(--ink-1); }
.semaforo__l.alto .semaforo__p { background: var(--rojo); box-shadow: 0 0 0 3px color-mix(in srgb, var(--rojo) 16%, transparent); }
.semaforo__l.medio .semaforo__p { background: var(--ambar); box-shadow: 0 0 0 3px color-mix(in srgb, var(--ambar) 16%, transparent); }
.semaforo__l.bien .semaforo__p { background: var(--menta); }

/* El ahorro se ve distinto a propósito: es la única tarjeta con un borde que
   la separa del resto. No es una cifra más del mes. */
.tarjeta--ahorro { border-color: color-mix(in srgb, var(--menta) 30%, var(--gline)); }

/* El candado: la regla escrita donde no se puede ignorar. */
.candado {
  display: flex; gap: 9px; align-items: flex-start;
  margin-top: 14px; padding-top: 13px; border-top: 1px solid var(--gline);
  font-size: 12.5px; line-height: 1.45; color: var(--ink-3);
}
.candado svg {
  width: 15px; height: 15px; flex: none; margin-top: 1px;
  stroke: var(--menta); stroke-width: 1.6; fill: none; stroke-linecap: round; stroke-linejoin: round;
}

.dos-botones { display: grid; grid-template-columns: minmax(0, 1fr) minmax(0, 1fr); gap: 10px; margin-top: 14px; }
.dos-botones .btn { width: 100%; white-space: nowrap; }

/* Sección dentro de una tarjeta: un segundo tema que pertenece al primero y
   no merece tarjeta propia. El filete lo separa sin partirlo en dos. */
.seccion { margin-top: 16px; padding-top: 14px; border-top: 1px solid var(--gline); }
.seccion__cab { display: flex; align-items: baseline; justify-content: space-between; margin-bottom: 4px; }
.seccion__nota { font-size: 13px; color: var(--ink-3); font-variant-numeric: tabular-nums; }

/* ── Cocina ───────────────────────────────────────────────────────── */
/* Una tarjeta que se toca tiene que verse tocable, no sólo comportarse así. */
.tarjeta--toca { cursor: pointer; transition: transform .18s ease, box-shadow .18s ease; }
.tarjeta--toca:active { transform: scale(.988); }

/* Un renglón de compra a meses: lo que pesa AL MES manda sobre el total,
   porque es la cifra con la que se decide si cabe o no cabe. */
.msi { padding: 12px 0; }
.msi + .msi { border-top: 1px solid var(--gline-2); }
.msi__cab { display: flex; align-items: baseline; justify-content: space-between; gap: 12px; }
.msi__nom { font-size: 15px; font-weight: 500; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.msi__mes { font-size: 14px; color: var(--ink-2); font-variant-numeric: tabular-nums; white-space: nowrap; }
.msi__sub { font-size: 12.5px; color: var(--ink-3); margin: 2px 0 8px; }
.msi__acciones { display: flex; gap: 16px; margin-top: 8px; }
.msi__acciones button {
  border: none; background: none; padding: 0; cursor: pointer;
  font-size: 13px; font-weight: 560; color: var(--indigo);
}
.msi__acciones button:last-child { color: var(--ink-3); }

/* El día en el calendario de pagos: el número grande y el mes chico, como en
   una hoja de agenda. Ancho fijo para que la columna quede alineada. */
.cal__dia {
  flex: none; width: 34px; text-align: center;
  display: grid; gap: 0; line-height: 1.05;
}
.cal__dia b { font-size: 17px; font-weight: 560; letter-spacing: -.02em; font-variant-numeric: tabular-nums; }
.cal__dia span { font-size: 10.5px; text-transform: uppercase; letter-spacing: .06em; color: var(--ink-3); }

/* ── Tablero de fijos ─────────────────────────────────────────────── */
/* La cifra que uno viene a ver, sin encabezado de tarjeta: es un tablero, no
   una tarjeta más de la lista. */
.tablero { padding-top: 20px; }
.tablero .monto--grande { margin: 2px 0 2px; }
.tablero__barra {
  display: flex; height: 8px; border-radius: 5px; overflow: hidden;
  background: var(--gline); margin: 16px 0 12px; gap: 2px;
}
.tablero__barra i { display: block; height: 100%; border-radius: 5px; }
.tablero__partes { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 10px 14px; }
.tablero__partes div { display: grid; grid-template-columns: auto 1fr; gap: 2px 7px; align-items: center; }
.tablero__partes b { font-size: 15px; font-weight: 560; font-variant-numeric: tabular-nums; }
.tablero__partes > div > span:last-child { grid-column: 2; font-size: 12px; color: var(--ink-3); }
.tablero__punto { width: 8px; height: 8px; border-radius: 3px; grid-row: span 2; align-self: center; }

/* Los grupos del calendario en Hoy. "El 20" no dice nada; "la semana que
   viene" sí: es la diferencia entre una lista y una advertencia. */
.cal__grupo + .cal__grupo { margin-top: 14px; }
.cal__grupo__cab {
  display: flex; align-items: baseline; justify-content: space-between;
  padding: 0 0 4px; border-bottom: 1px solid var(--gline-2); margin-bottom: 2px;
}
.cal__grupo__cab span {
  display: inline-flex; align-items: center; gap: 7px;
  font-size: 11.5px; font-weight: 600; text-transform: uppercase;
  letter-spacing: .06em; color: var(--ink-3);
}
/* La etiqueta de estado es un punto de color y texto, nunca una cápsula: una
   píldora con borde es de las cosas que hacen que una interfaz grite plantilla. */
.cal__tag { width: 7px; height: 7px; border-radius: 2px; flex: none; }
.cal__grupo__cab b { font-size: 13px; font-weight: 600; font-variant-numeric: tabular-nums; color: var(--ink-2); }

/* El desglose de lo fijo en una línea corrida: en Hoy no hay espacio para una
   leyenda de dos columnas, y con el punto de color basta para reconocerlo. */
.fijo__partes { display: flex; flex-wrap: wrap; gap: 6px 14px; margin-top: 8px; }
.fijo__partes span {
  display: inline-flex; align-items: center; gap: 6px;
  font-size: 12.5px; color: var(--ink-3); font-variant-numeric: tabular-nums;
}
.fijo__partes i { width: 7px; height: 7px; border-radius: 2px; flex: none; }

/* ── Calendario visual ────────────────────────────────────────────── */
/* Una lista dice qué se paga; la cuadrícula dice cuándo se juntan. */
.cal__semana, .cal__rejilla { display: grid; grid-template-columns: repeat(7, minmax(0, 1fr)); gap: 4px; }
.cal__semana { margin: 4px 0 6px; }
.cal__semana span {
  text-align: center; font-size: 11px; font-weight: 600;
  color: var(--ink-3); text-transform: uppercase; letter-spacing: .04em;
}
.cal__hueco { display: block; }
.cal__celda {
  border: none; background: none; cursor: default; padding: 5px 0 6px;
  border-radius: 11px; display: grid; justify-items: center; gap: 3px;
  transition: background .18s ease;
}
.cal__celda b { font-size: 13.5px; font-weight: 450; font-variant-numeric: tabular-nums; color: var(--ink-2); }
.cal__celda.ido b { color: var(--ink-3); opacity: .55; }
.cal__celda.hoy { background: var(--indigo-suave); }
.cal__celda.hoy b { color: var(--indigo); font-weight: 700; }
.cal__celda.con { cursor: pointer; }
.cal__celda.act { background: var(--bg-2); box-shadow: inset 0 0 0 1.5px var(--indigo); }
.cal__puntos { display: flex; gap: 2px; height: 5px; align-items: center; }
.cal__puntos i { width: 5px; height: 5px; border-radius: 50%; display: block; }
.cal__detalle:not(:empty) { margin-top: 12px; padding-top: 10px; border-top: 1px solid var(--gline); }
/* Dentro del tablero la cuadrícula respira menos: ya trae el filete de la
   sección que la separa del número de arriba. */
.tablero .cal__rejilla { margin-top: 2px; }

/* ── Servicios ────────────────────────────────────────────────────── */
.srv { padding: 12px 0; cursor: pointer; }
.srv + .srv { border-top: 1px solid var(--gline-2); }
.srv:active { opacity: .7; }
.srv__cab { display: flex; align-items: baseline; justify-content: space-between; gap: 12px; }
.srv__nom { font-size: 15px; font-weight: 500; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.srv__est { font-size: 13px; font-weight: 560; white-space: nowrap; font-variant-numeric: tabular-nums; }
.srv__sub { font-size: 12.5px; color: var(--ink-3); margin-top: 2px; }
.srv__alerta { font-size: 12.5px; color: var(--ambar); margin-top: 4px; }
.srv__ver { display: grid; place-items: center; padding: 6px; flex: none; }
.srv__ver svg { width: 17px; height: 17px; stroke: var(--indigo); stroke-width: 1.7; fill: none; stroke-linecap: round; stroke-linejoin: round; }

/* Subir el recibo: misma caja que las de foto de la despensa. */
.subir {
  display: grid; justify-items: center; gap: 6px; cursor: pointer;
  padding: 22px 18px; border-radius: 18px; text-align: center;
  background: var(--bg-2); box-shadow: inset 0 0 0 1px var(--gline);
  transition: box-shadow .18s ease, background .18s ease;
}
.subir input { display: none; }
.subir svg { width: 26px; height: 26px; stroke: var(--indigo); stroke-width: 1.6; fill: none; stroke-linecap: round; stroke-linejoin: round; }
.subir b { font-size: 15px; font-weight: 560; }
.subir span { font-size: 12.5px; color: var(--ink-3); }
.subir.act { box-shadow: inset 0 0 0 1.5px var(--menta); background: var(--menta-suave); }

/* Un renglón de aviso: icono, qué pasa, y la flecha que dice que lleva a algún
   lado. Si no llevara a ningún lado no sería un aviso, sería un reproche. */
.aviso-fila {
  display: flex; align-items: center; gap: 13px; padding: 13px 0; cursor: pointer;
}
.aviso-fila + .aviso-fila { border-top: 1px solid var(--gline-2); }
.aviso-fila:active { opacity: .6; }
.aviso-fila__tit { font-size: 15.5px; font-weight: 560; letter-spacing: -.012em; }
.aviso-fila .chevron { color: var(--ink-3); }

/* ── Panel ────────────────────────────────────────────────────────── */
/* Barras a mano, sin librería: son seis formas simples y meter 200 KB para
   dibujarlas sería cobrarle a la casa en carga lo que no le da en información.
   Un solo eje siempre: dos escalas en la misma gráfica es la manera más
   elegante de mentir con datos reales. */
.gr { display: flex; align-items: flex-end; gap: 10px; height: 132px; margin: 4px 0 12px; }
.gr__mes { flex: 1 1 0; min-width: 0; display: flex; flex-direction: column; align-items: center; justify-content: flex-end; height: 100%; gap: 6px; }
.gr__barras { flex: 1; width: 100%; display: flex; align-items: flex-end; justify-content: center; gap: 3px; }
.gr__barras i { flex: 1 1 0; max-width: 15px; border-radius: 4px 4px 2px 2px; display: block; }
.gr__in { background: var(--menta); }
.gr__eg { background: var(--indigo); }
.gr__et { font-size: 11px; color: var(--ink-3); text-transform: uppercase; letter-spacing: .04em; }

.leyenda { display: flex; gap: 16px; }
.leyenda span { display: inline-flex; align-items: center; gap: 7px; font-size: 12.5px; color: var(--ink-3); }
.leyenda i { width: 8px; height: 8px; border-radius: 2px; flex: none; }

/* Los 30 días del mes: hasta dónde se trabaja para la casa y desde dónde para
   ustedes. Es la misma cifra del margen, dicha en días en vez de en pesos. */
.equilibrio { display: flex; gap: 2px; height: 34px; align-items: stretch; margin-top: 4px; }
.equilibrio i { flex: 1 1 0; border-radius: 2px; display: block; }
.equilibrio .casa { background: var(--ambar); opacity: .85; }
.equilibrio .suyo { background: var(--menta); }

/* El icono de cada renglón del carrito: el grupo si el algoritmo lo puso, un
   más si lo agregaron a mano. Se distingue de un vistazo de dónde salió. */
.carrito__ico { width: 30px; height: 30px; border-radius: 10px; flex: none; display: grid; place-items: center; background: var(--indigo-suave); }
.carrito__ico svg { width: 16px; height: 16px; stroke: var(--indigo); stroke-width: 1.7; fill: none; stroke-linecap: round; stroke-linejoin: round; }
.carrito__ico.mano { background: var(--gline-2); }
.carrito__ico.mano svg { stroke: var(--ink-3); }

/* Comparación de precios: el icono del producto, la diferencia en pesos —que
   es lo que se decide, no el porcentaje— y cada tienda marcada por color. */
.comparo { padding: 14px 0; }
.comparo + .comparo { border-top: 1px solid var(--gline-2); }
.comparo__cab { display: flex; align-items: center; gap: 12px; margin-bottom: 10px; }
.comparo__nom { flex: 1 1 auto; min-width: 0; display: grid; gap: 1px; }
.comparo__nom b { font-size: 15px; font-weight: 560; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.comparo__nom span { font-size: 12px; color: var(--ink-3); }
.comparo__ahorro { flex: none; text-align: right; display: grid; gap: 1px; }
.comparo__ahorro b { font-size: 16px; font-weight: 600; color: var(--menta); font-variant-numeric: tabular-nums; }
.comparo__ahorro span { font-size: 11px; color: var(--ink-3); }

.comparo__tiendas { display: grid; gap: 5px; }
.tienda {
  display: grid; grid-template-columns: 9px minmax(0, 1fr) auto auto; gap: 10px; align-items: center;
  padding: 8px 12px; border-radius: 11px; background: var(--bg-2); box-shadow: inset 0 0 0 1px var(--gline);
}
.tienda__punto { width: 9px; height: 9px; border-radius: 50%; background: var(--ink-3); opacity: .35; }
.tienda__nom { font-size: 14px; color: var(--ink-2); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.tienda__precio { font-size: 14.5px; font-weight: 600; font-variant-numeric: tabular-nums; }
.tienda__marca { font-size: 11.5px; font-weight: 600; color: var(--ink-3); min-width: 62px; text-align: right; }
.tienda.barata { background: var(--menta-suave); box-shadow: inset 0 0 0 1.5px var(--menta); }
.tienda.barata .tienda__punto { background: var(--menta); opacity: 1; }
.tienda.barata .tienda__precio, .tienda.barata .tienda__marca { color: var(--menta); }
.tienda.cara .tienda__punto { background: var(--ambar); opacity: 1; }
.tienda.cara .tienda__marca { color: var(--ambar); }

/* ── Pepe ─────────────────────────────────────────────────────────── */
.pepe-boton { margin-left: auto; margin-right: 2px; }
.pepe-boton + .campana { margin-left: 0; }

.hoja--pepe { display: flex; flex-direction: column; max-height: 88svh; }
.hoja--pepe .hoja__cab { align-items: center; }
.pepe__quien { display: flex; align-items: center; gap: 11px; }
.pepe__quien h2 { font-size: 19px; line-height: 1.1; }
.pepe__quien > div > span { font-size: 12.5px; color: var(--ink-3); }
.pepe__avatar {
  width: 38px; height: 38px; border-radius: 13px; flex: none;
  display: grid; place-items: center;
  background: linear-gradient(140deg, var(--indigo), var(--rosa));
}
.pepe__avatar svg { width: 19px; height: 19px; stroke: #fff; stroke-width: 1.8; fill: none; stroke-linecap: round; stroke-linejoin: round; }

.pepe__hilo { flex: 1 1 auto; overflow-y: auto; display: grid; gap: 12px; padding: 4px 0 8px; align-content: start; }
.pepe__vacio { padding: 24px 4px; display: grid; gap: 8px; }
.pepe__vacio p { font-size: 15px; color: var(--ink-2); line-height: 1.5; max-width: 40ch; }

.burbuja { padding: 13px 16px; border-radius: 18px; max-width: 92%; font-size: 15px; line-height: 1.5; }
.burbuja.mia { justify-self: end; background: var(--indigo); color: #fff; border-bottom-right-radius: 7px; }
.burbuja.de-pepe { justify-self: start; background: var(--bg-2); box-shadow: inset 0 0 0 1px var(--gline); border-bottom-left-radius: 7px; }
.burbuja p + p { margin-top: 9px; }
.burbuja ul { margin: 8px 0 0; padding-left: 18px; display: grid; gap: 5px; }
.burbuja li { line-height: 1.45; }
.burbuja b { font-weight: 600; }
.burbuja__fuente {
  margin-top: 10px; padding-top: 8px; border-top: 1px solid var(--gline-2);
  font-size: 11px; color: var(--ink-3); text-transform: uppercase; letter-spacing: .05em;
}

/* Los tres puntos mientras piensa. Sin texto: "escribiendo…" en un asistente
   que tarda ocho segundos se lee como una promesa incumplida. */
.burbuja.pensando { display: flex; gap: 5px; padding: 17px 18px; }
.burbuja.pensando i { width: 7px; height: 7px; border-radius: 50%; background: var(--ink-3); animation: late 1.3s ease-in-out infinite; }
.burbuja.pensando i:nth-child(2) { animation-delay: .18s; }
.burbuja.pensando i:nth-child(3) { animation-delay: .36s; }
@keyframes late { 0%, 60%, 100% { opacity: .28; transform: none; } 30% { opacity: 1; transform: translateY(-3px); } }
@media (prefers-reduced-motion: reduce) { .burbuja.pensando i { animation: none; opacity: .5; } }

.pepe__pie { flex: none; padding-top: 10px; }
.pepe__sugerencias { display: flex; gap: 8px; overflow-x: auto; padding-bottom: 10px; scrollbar-width: none; }
.pepe__sugerencias::-webkit-scrollbar { display: none; }
.pepe__sugerencias button {
  flex: none; border: none; cursor: pointer; white-space: nowrap;
  padding: 9px 14px; border-radius: 14px; font-size: 13.5px;
  background: var(--bg-2); color: var(--ink-2); box-shadow: inset 0 0 0 1px var(--gline);
}
.pepe__caja { display: flex; gap: 9px; align-items: flex-end; }
.pepe__caja textarea {
  flex: 1; resize: none; border-radius: 18px; padding: 13px 16px;
  background: var(--bg-2); border: 1px solid var(--gline); font-size: 16px; line-height: 1.4;
  max-height: 120px; overflow-y: auto;
}
.pepe__caja textarea:focus { outline: none; border-color: var(--indigo); box-shadow: 0 0 0 4px var(--indigo-suave); }
.pepe__caja button {
  flex: none; width: 46px; height: 46px; border-radius: 50%; border: none; cursor: pointer;
  background: var(--indigo); display: grid; place-items: center;
}
.pepe__caja button svg { width: 20px; height: 20px; stroke: #fff; stroke-width: 2; fill: none; stroke-linecap: round; stroke-linejoin: round; }

/* ── Metas ────────────────────────────────────────────────────────── */
/* El voto de cada quien, uno junto al otro. Se ve de un golpe quién dijo qué,
   que es de lo que se trata una decisión de dos. */
.votos { display: grid; grid-auto-flow: column; grid-auto-columns: minmax(0, 1fr); gap: 8px; margin-top: 4px; }
.voto {
  display: flex; flex-direction: column; align-items: center; gap: 5px;
  padding: 12px 8px; border-radius: 14px;
  background: var(--bg-2); box-shadow: inset 0 0 0 1px var(--gline);
}
.voto span { font-size: 12.5px; color: var(--ink-2); }
.voto b { font-size: 13px; font-weight: 600; color: var(--ink-3); }
.voto.si { box-shadow: inset 0 0 0 1.5px var(--menta); }
.voto.si b { color: var(--menta); }
.voto.no { box-shadow: inset 0 0 0 1.5px var(--rojo); }
.voto.no b { color: var(--rojo); }

/* ── Expediente de mascotas ──────────────────────────────────────── */
/* Un renglón de cartilla: qué toca, cuándo, y el botón de anotarla. */
.cartilla { padding: 11px 0; }
.cartilla + .cartilla { border-top: 1px solid var(--gline-2); }
.cartilla__cab { display: flex; align-items: baseline; justify-content: space-between; gap: 12px; }
.cartilla__nom { font-size: 15px; font-weight: 500; min-width: 0; }
.cartilla__est { font-size: 13px; font-weight: 560; white-space: nowrap; font-variant-numeric: tabular-nums; }
.cartilla__sub { font-size: 12.5px; color: var(--ink-3); margin-top: 2px; line-height: 1.4; }
.cartilla__ok {
  border: none; background: none; padding: 6px 0 0; cursor: pointer;
  font-size: 13px; font-weight: 560; color: var(--indigo);
}

/* Las pesadas: seis barras y su número. No es una gráfica seria, es lo justo
   para ver de un vistazo si va subiendo o bajando. */
.pesadas { display: flex; align-items: flex-end; gap: 8px; height: 72px; margin-top: 10px; }
.pesada { flex: 1 1 0; min-width: 0; display: flex; flex-direction: column; align-items: center; justify-content: flex-end; height: 100%; gap: 5px; }
.pesada i { width: 100%; max-width: 26px; background: var(--indigo-suave); border-radius: 5px 5px 3px 3px; display: block; }
.pesada:last-child i { background: var(--indigo); }
.pesada span { font-size: 11px; color: var(--ink-3); font-variant-numeric: tabular-nums; }

/* La equis para borrar un renglón del historial. */
.reng__x { border: none; background: none; cursor: pointer; padding: 6px; display: grid; place-items: center; flex: none; }
.reng__x svg { width: 13px; height: 13px; stroke: var(--ink-3); stroke-width: 1.8; fill: none; stroke-linecap: round; }
.reng__x:active svg { stroke: var(--rojo); }

/* ── Video de receta ──────────────────────────────────────────────── */
/* El "cómo se hace" de cada paso: discreto, porque casi siempre no hace falta,
   pero ahí cuando sí —con las manos sucias y sin querer leer—. */
.paso__ver {
  display: block; margin-top: 4px; padding: 0;
  border: none; background: none; cursor: pointer;
  font-size: 12.5px; font-weight: 560; color: var(--indigo);
}

.video { display: flex; align-items: center; gap: 12px; padding: 10px 0; }
.video + .video { border-top: 1px solid var(--gline-2); }
.video img { width: 76px; height: 43px; border-radius: 8px; object-fit: cover; flex: none; background: var(--gline); }
.video__cuerpo { flex: 1 1 auto; min-width: 0; }
.video__tit {
  font-size: 14px; font-weight: 500; line-height: 1.3;
  display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical; overflow: hidden;
}
.video__sub { font-size: 12px; color: var(--ink-3); margin-top: 3px; }
.video__acciones { display: grid; gap: 6px; flex: none; text-align: right; }
.video__acciones a, .video__acciones button {
  border: none; background: none; padding: 0; cursor: pointer;
  font-size: 13px; font-weight: 560; color: var(--indigo); text-decoration: none;
}
.video__acciones button { color: var(--ink-3); }

/* ── Manos a la obra ─────────────────────────────────────────────── */
/* La olla con su vapor. Es lo único animado de KZA y dura lo que dura el
   gesto: si se moviera para siempre acabaría cansando. */
.hoja--cocinando .hoja__cab { display: none; }
.cocinando { text-align: center; padding: 6px 0 20px; }
.cocinando h2 { font-size: 22px; letter-spacing: -.03em; margin-top: 12px; }
.cocinando p { font-size: 14.5px; color: var(--ink-3); margin-top: 3px; }

.olla { width: 76px; height: 76px; fill: none; stroke-linecap: round; stroke-linejoin: round; }
.olla .cuerpo, .olla .tapa, .olla .asa { stroke: var(--indigo); stroke-width: 2.4; }
.olla .cuerpo { fill: var(--indigo-suave); }
.olla .vapor path { stroke: var(--rosa); stroke-width: 2.2; opacity: 0; }

/* Cada hilo de vapor sale un poco después que el anterior: sube, se desvanece
   y no vuelve. Un bucle infinito distrae de leer los pasos. */
.olla .vapor path { animation: vapor-sube 2.4s cubic-bezier(.3,.7,.4,1) forwards; }
.olla .vapor path:nth-child(2) { animation-delay: .18s; }
.olla .vapor path:nth-child(3) { animation-delay: .34s; }
/* Nombre propio y no "sube" a secas: ya existía un @keyframes sube para la
   entrada de las hojas, y redefinirlo dejó TODOS los pop-up en opacity 0.
   Los keyframes son globales; el último con el mismo nombre gana. */
@keyframes vapor-sube {
  0%   { opacity: 0; transform: translateY(8px) scaleY(.6); }
  35%  { opacity: .9; }
  100% { opacity: 0; transform: translateY(-10px) scaleY(1.15); }
}
.olla .vapor { transform-origin: center bottom; }

@media (prefers-reduced-motion: reduce) {
  .olla .vapor path { animation: none; opacity: .55; }
}

/* La estrella de "las de siempre". Apagada es un contorno, no una estrella
   gris: una estrella gris se lee como deshabilitada. */
.fav {
  border: none; background: none; cursor: pointer; padding: 3px; margin-left: 2px;
  display: grid; place-items: center; flex: none;
  transition: transform .18s cubic-bezier(.2,.8,.2,1);
}
.fav .estrella { margin-left: 0; }
.fav .estrella path { fill: none; stroke: var(--ink-3); stroke-width: 1.7; stroke-linejoin: round; }
.fav.act .estrella path { fill: var(--ambar); stroke: var(--ambar); }
.fav:active { transform: scale(.86); }

/* La casilla para guardarla entre las de siempre al crearla. */
.marca-fav { display: flex; align-items: center; gap: 10px; cursor: pointer; font-size: 15px; color: var(--ink-2); }
.marca-fav input { width: 20px; height: 20px; accent-color: var(--indigo); flex: none; }

/* Ficha que sólo informa: mismo cuerpo que las que se eligen, sin el gesto. */
.ficha--quieta { cursor: default; pointer-events: none; }

/* Los pasos numerados de una receta. El número es de la lista, no un adorno:
   dice el orden, que en la cocina es lo único que importa. */
.pasos-receta { list-style: none; counter-reset: paso; display: grid; gap: 12px; }
.pasos-receta li {
  counter-increment: paso; position: relative; padding-left: 32px;
  font-size: 15px; line-height: 1.5; color: var(--ink-2);
}
.pasos-receta li::before {
  content: counter(paso);
  position: absolute; left: 0; top: 1px;
  width: 22px; height: 22px; border-radius: 50%;
  background: var(--indigo-suave); color: var(--indigo);
  font-size: 12px; font-weight: 600; font-variant-numeric: tabular-nums;
  display: grid; place-items: center;
}

/* Un renglón de ingrediente: nombre, cantidad, unidad y la equis para quitarlo. */
.ing-fila {
  display: grid; grid-template-columns: minmax(0, 1fr) 74px 72px 32px;
  gap: 6px; align-items: center; margin-bottom: 8px;
}
.ing-fila input, .ing-fila select { min-width: 0; }
.ing-fila button {
  border: none; background: none; cursor: pointer; padding: 6px;
  display: grid; place-items: center;
}
.ing-fila button svg {
  width: 15px; height: 15px; stroke: var(--ink-3); stroke-width: 1.8;
  fill: none; stroke-linecap: round;
}
.ing-fila button:active svg { stroke: var(--rojo); }

/* ── Carrusel de avisos ───────────────────────────────────────────
   Cuando se juntan fechas —un corte, una prueba que vence, una sugerencia—
   apilarlas empuja todo lo demás fuera de la pantalla y ninguna se lee. En
   slide ocupan el lugar de una y se pasan solas o con el dedo. */
.carrusel__pista {
  display: grid; grid-auto-flow: column; grid-auto-columns: 100%;
  gap: 12px; overflow-x: auto; overscroll-behavior-x: contain;
  scroll-snap-type: x mandatory; scroll-behavior: smooth;
  scrollbar-width: none; -webkit-overflow-scrolling: touch;
  /* Nada de padding con margen negativo para "dar aire": eso hace la pista más
     ancha que su contenedor y desborda la pantalla completa. */
}
.carrusel__pista::-webkit-scrollbar { display: none; }
.carrusel__pista > * { scroll-snap-align: center; scroll-snap-stop: always; min-width: 0; }

.carrusel__puntos { display: flex; justify-content: center; gap: 6px; margin-top: 13px; }
.carrusel__puntos button {
  width: 6px; height: 6px; padding: 0; border: none; cursor: pointer;
  border-radius: 99px; background: var(--gline-2);
  transition: width .32s cubic-bezier(.2,.8,.2,1), background .32s ease;
}
.carrusel__puntos button.act { width: 20px; background: var(--indigo); }
@media (prefers-reduced-motion: reduce) {
  .carrusel__pista { scroll-behavior: auto; }
  .carrusel__puntos button { transition: none; }
}

/* Buscador y filtros de la despensa */
.buscador { position: relative; }
.buscador input {
  width: 100%; background: var(--bg-2); border: 1px solid var(--gline);
  border-radius: 15px; padding: 13px 16px 13px 42px; font-size: 16px;
  box-shadow: inset 0 1px 2px rgba(20,20,50,.03);
}
.buscador input:focus { outline: none; border-color: var(--indigo); box-shadow: 0 0 0 4px var(--indigo-suave); }
.buscador svg {
  position: absolute; left: 14px; top: 50%; transform: translateY(-50%);
  width: 17px; height: 17px; stroke: var(--ink-3); stroke-width: 1.8; fill: none; stroke-linecap: round;
  pointer-events: none;
}

.filtros {
  display: flex; gap: 8px; overflow-x: auto; padding: 2px 0 4px;
  scrollbar-width: none; -ms-overflow-style: none;
}
.filtros::-webkit-scrollbar { display: none; }
.filtros button {
  flex: none; font: inherit; font-size: 13.5px; font-weight: 500;
  padding: 9px 15px; border-radius: 980px; border: none; cursor: pointer;
  background: var(--bg-2); color: var(--ink-2); box-shadow: inset 0 0 0 1px var(--gline);
  white-space: nowrap;
}
.filtros button.act { background: var(--indigo); color: #fff; box-shadow: none; }
.filtros button b { font-weight: 500; opacity: .7; margin-left: 4px; }

/* Estrella de favorito */
.estrella { width: 15px; height: 15px; flex: none; margin-left: 6px; vertical-align: -2px; }
.estrella path { fill: var(--ambar); stroke: none; }

.art { display: flex; align-items: center; gap: 14px; padding: 13px 0; }
.art + .art { border-top: 1px solid var(--gline-2); }
/* La columna izquierda cede y trunca; la derecha manda su ancho. Sin esto una
   frase larga empuja el número contra el borde de la tarjeta. */
.art__cuerpo { flex: 1 1 auto; min-width: 0; display: grid; gap: 6px; }
.art__nom { font-size: 15.5px; font-weight: 500; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.art__der { flex: 0 0 auto; text-align: right; display: grid; gap: 2px; }
.art__cob { font-size: 16px; font-variant-numeric: tabular-nums; font-weight: 500; white-space: nowrap; }
.art__sug { font-size: 12.5px; color: var(--ink-3); }
.art__der .art__sug { white-space: nowrap; }
.art__cuerpo .art__sug { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.art--bajo .art__cob { color: var(--rojo); }
.art--medio .art__cob { color: var(--ambar); }
.art--bien .art__cob { color: var(--menta); }

.foto-ticket {
  width: 100%; border-radius: 18px; overflow: hidden;
  border: 1px dashed rgba(76,70,208,.3);
  background: linear-gradient(160deg, rgba(108,99,255,.07), rgba(255,92,138,.07));
  padding: 26px 18px; text-align: center; cursor: pointer; display: grid; gap: 8px; justify-items: center;
}
.foto-ticket svg { width: 30px; height: 30px; stroke: var(--indigo); stroke-width: 1.5; fill: none; stroke-linecap: round; stroke-linejoin: round; }
.foto-ticket b { font-size: 15px; font-weight: 560; }
.foto-ticket span { font-size: 13px; color: var(--ink-3); }
.foto-ticket input { display: none; }
.foto-ticket.act { border-style: solid; border-color: var(--indigo); background: var(--indigo-suave); }

/* Tres modos de captura: foto del ticket, escáner uno por uno, o a mano.
   En pantalla chica van apilados para que el área de toque sea grande. */
.modos { display: grid; gap: 10px; }
.modos .foto-ticket { aspect-ratio: auto; padding: 18px 16px; }
@media (min-width: 560px) { .modos { grid-template-columns: repeat(3, minmax(0, 1fr)); } }

/* ── Diálogo propio ──────────────────────────────────────────────── */
/* Nada de alert() ni confirm() del navegador: rompen la ilusión de app y se ven
   de otro producto. Este es el mismo cristal de KZA. */
.dialogo {
  width: 100%; max-width: 340px;
  background: #FBFBFE; border-radius: 22px;
  padding: 24px 22px 18px;
  box-shadow: 0 20px 60px rgba(20,20,50,.3);
  animation: brinca .26s cubic-bezier(.2,.9,.35,1) both;
}
@keyframes brinca { from { transform: scale(.94); opacity: 0 } to { transform: none; opacity: 1 } }
.telon--centro { align-items: center; padding: 20px; }
.dialogo h3 { font-size: 18px; margin-bottom: 8px; }
.dialogo p { font-size: 14.5px; color: var(--ink-2); line-height: 1.45; }
.dialogo__datos { margin: 14px 0 4px; display: grid; gap: 7px; }
.dialogo__datos div { display: flex; justify-content: space-between; gap: 14px; font-size: 14px; }
.dialogo__datos span:first-child { color: var(--ink-3); }
.dialogo__datos span:last-child { font-variant-numeric: tabular-nums; }
.dialogo__botones { display: grid; gap: 8px; margin-top: 20px; }

/* ── Etiquetas de sector ─────────────────────────────────────────── */
.etiqueta {
  display: inline-flex; align-items: center; gap: 5px;
  font-size: 12px; font-weight: 600; letter-spacing: .01em;
  color: var(--indigo-ink);
}
/* Con dibujo propio, el cuadrito de color sobra: el icono ya lleva el color
   y dice además de qué se trata. */
.etiqueta:has(.etiqueta__ico)::before { display: none; }
.etiqueta__ico {
  width: 14px; height: 14px; flex: none;
  stroke: currentColor; stroke-width: 1.7; fill: none;
  stroke-linecap: round; stroke-linejoin: round;
}
.etiqueta::before {
  content: ""; width: 7px; height: 7px; border-radius: 2px;
  background: currentColor; flex: none;
}
.e-despensa { color: #1E7F63 } .e-casa { color: #4C46D0 } .e-servicios { color: #2F6BB8 }
.e-suscripciones { color: #8A4FBF } .e-ocio { color: #C2456F } .e-viaje { color: #C06A1E }
.e-transporte { color: #4B6584 } .e-salud { color: #148C8C } .e-personal { color: #A03D8F }
.e-mascotas { color: #B4553A } .e-educacion { color: #3E6BA8 } .e-deuda { color: #B03030 }
.e-ahorro { color: #2A7D5A } .e-sueldo { color: #0E9384 } .e-extra { color: #7A6A2E }

/* Proyección: se ve distinto porque todavía no es dinero */
.mov--proyecto .mov__monto, .mov--proyecto .mov__nom { opacity: .72; }
.proyecta {
  font-size: 11px; font-weight: 700; letter-spacing: .06em;
  color: var(--ambar); text-transform: uppercase;
}

/* Barra de sectores: dónde se fue el dinero, sin gráfica de pastel */
.sectores { display: grid; gap: 10px; }
.sector-fila { display: grid; grid-template-columns: minmax(0, 1fr) auto; gap: 6px 12px; align-items: center; }
.sector-fila__barra { grid-column: 1 / -1; height: 6px; border-radius: 3px; background: var(--gline); overflow: hidden; }
.sector-fila__barra i { display: block; height: 100%; border-radius: 3px; background: currentColor; }
.sector-fila__val { font-size: 13px; font-variant-numeric: tabular-nums; color: var(--ink-2); }

/* ── Movimiento ──────────────────────────────────────────────────── */
.entra { animation: subir .5s cubic-bezier(.22,.7,.3,1) both; }
@keyframes subir { from { opacity: 0; transform: translateY(12px); } to { opacity: 1; transform: none; } }
@media (prefers-reduced-motion: reduce) { .entra { animation: none; } }

/* ── La bienvenida ───────────────────────────────────────────────── */
/* El espejo de la despedida: la misma casa, la misma llave, al revés. La llave
   vuelve a su sitio, el cerrojo se recoge, la puerta se abre y la luz que sale
   se come la pantalla. Cuando la luz lo llena todo, ya estás dentro.
   Se ve una vez por sesión y se salta tocando. */
.bv { position: fixed; inset: 0; z-index: 300; display: grid; place-items: center; background: var(--bg); overflow: hidden; }
.bv--fuera { animation: bv-adios .5s ease forwards; }
@keyframes bv-adios { to { opacity: 0; visibility: hidden; } }

.bv__todo { position: relative; z-index: 2; display: grid; justify-items: center; gap: 24px; text-align: center; padding: 0 26px; }

.bv__casa { width: min(190px, 46vw); height: auto; }
.bv__casa * { fill: none; stroke-linecap: round; stroke-linejoin: round; }

/* El contorno se dibuja de un trazo. */
.bv__muro { stroke: var(--indigo); stroke-width: 3.4; stroke-dasharray: 420; stroke-dashoffset: 420;
            animation: bv-traza .8s cubic-bezier(.6,.05,.3,1) .05s forwards; }
@keyframes bv-traza { to { stroke-dashoffset: 0; } }

/* La llave gira de vuelta: abrir es el gesto contrario a cerrar. */
.bv__llave { transform-origin: 50px 62px; transform: rotate(-95deg);
             animation: bv-gira .5s cubic-bezier(.5,0,.2,1) .7s forwards; }
@keyframes bv-gira { to { transform: rotate(0deg); } }
.bv__llave path, .bv__llave circle { stroke: var(--rosa); stroke-width: 3.4; }

/* El cerrojo se recoge. */
.bv__cerrojo { stroke: var(--rosa); stroke-width: 3.4; stroke-dasharray: 16; stroke-dashoffset: 0;
               animation: bv-recoge .3s ease-in .95s forwards; }
@keyframes bv-recoge { to { stroke-dashoffset: 16; } }

/* Y la puerta se abre hacia adentro, sobre su bisagra. */
.bv__puerta { transform-origin: 36px 88px; transform: perspective(280px) rotateY(0deg);
              animation: bv-abre .75s cubic-bezier(.5,.02,.3,1) 1.2s forwards; }
@keyframes bv-abre { to { transform: perspective(280px) rotateY(-78deg); } }
.bv__puerta rect { stroke: var(--indigo); stroke-width: 3.2; fill: var(--bg); }

/* La luz que sale por la puerta, y que acaba siendo toda la pantalla. */
.bv__luz {
  position: absolute; left: 50%; top: 50%; width: 40px; height: 40px;
  margin: -20px 0 0 -20px; border-radius: 50%;
  background: radial-gradient(circle, #FFF 0%, #E7E3FF 38%, #FBD9E4 68%, rgba(251,217,228,0) 72%);
  transform: scale(0); opacity: 0;
  animation: bv-luz 1.05s cubic-bezier(.55,.02,.3,1) 1.5s forwards;
}
@keyframes bv-luz {
  0%   { transform: scale(0); opacity: 0; }
  22%  { opacity: 1; }
  100% { transform: scale(90); opacity: 1; }
}

.bv__dice { animation: bv-dice .7s cubic-bezier(.22,.7,.3,1) 1.75s both; }
@keyframes bv-dice { from { opacity: 0; transform: translateY(14px); } to { opacity: 1; transform: none; } }
.bv__dice .rotulo { margin-bottom: 8px; }
.bv__dice h1 { font-size: clamp(27px, 8vw, 36px); letter-spacing: -.045em; }
.bv__dice p { color: var(--ink-2); margin-top: 10px; font-size: 15px; }

@media (prefers-reduced-motion: reduce) {
  .bv__muro, .bv__llave, .bv__cerrojo, .bv__puerta, .bv__luz, .bv__dice { animation: none !important; }
  .bv__muro { stroke-dashoffset: 0; }
  .bv__llave { transform: none; }
  .bv__puerta { transform: perspective(280px) rotateY(-78deg); }
  .bv__luz { display: none; }
}

/* Un botón que se ve como enlace: cambia de cara sin navegar a ningún lado. */
.enlace {
  background: none; border: 0; padding: 0; cursor: pointer;
  color: var(--indigo-ink); font-size: 13.5px; font-weight: 500;
  text-decoration: underline; text-underline-offset: 3px;
}
.enlace:hover { color: var(--indigo); }
.acceso__otra { padding: 18px 0 0; margin-top: 4px; border-top: 1px solid var(--gline-2); text-align: center; }

/* ── Onboarding ──────────────────────────────────────────────────── */
.ob { padding-top: 26px; padding-bottom: 34px; display: grid; gap: 16px; }
.ob__cab { display: grid; justify-items: start; gap: 3px; margin-bottom: 4px; }
.ob__cab .marca-kza { font-size: clamp(34px, 11vw, 44px); line-height: .9; margin-bottom: 14px; }
.ob__cab h1 { font-size: clamp(26px, 7.5vw, 33px); letter-spacing: -.045em; }
.ob__sub { color: var(--ink-2); font-size: 15px; margin-top: 10px; text-wrap: pretty; }
.ob__caja { padding: 22px 20px 24px; }
.ob__paso { margin-bottom: 6px; }
.ob__tit { font-size: 19px; letter-spacing: -.03em; margin-bottom: 8px; }

/* La foto: un círculo grande que ya se ve como se va a ver adentro. */
.ob__foto { display: flex; align-items: center; gap: 15px; min-width: 0; }
.ob__foto > div { min-width: 0; }
.ob__fotoTit { font-size: 15px; font-weight: 560; margin-bottom: 2px; }
.ob__avatar {
  position: relative; flex: none; padding: 0; border: 0; background: none; cursor: pointer;
  border-radius: 50%; line-height: 0;
}
.avatar--grande { width: 76px; height: 76px; font-size: 26px; }
.ob__camara {
  position: absolute; right: -2px; bottom: -2px;
  width: 28px; height: 28px; border-radius: 50%;
  background: var(--indigo); display: grid; place-items: center;
  box-shadow: 0 2px 8px rgba(76,70,208,.4), 0 0 0 3px var(--bg-2);
}
.ob__camara svg { width: 14px; height: 14px; stroke: #fff; stroke-width: 1.8; fill: none; stroke-linecap: round; stroke-linejoin: round; }
.ob__avatar--cargando { opacity: .5; pointer-events: none; }

/* Los acuerdos: se leen, así que se leen. Sin cápsulas ni bordes de color;
   los separa una línea fina, como todo lo demás en la app. */
.ob__acuerdo { padding: 15px 0; border-top: 1px solid var(--gline-2); }
.ob__acuerdo b { display: block; font-size: 15.5px; font-weight: 600; letter-spacing: -.02em; }
.ob__acuerdo span { display: block; margin-top: 5px; font-size: 14px; color: var(--ink-2); line-height: 1.5; text-wrap: pretty; }

.ob__acepto {
  display: flex; align-items: flex-start; gap: 11px; cursor: pointer;
  margin-top: 18px; padding-top: 16px; border-top: 1px solid var(--gline);
  font-size: 15px; font-weight: 500;
}
.ob__acepto input { width: 21px; height: 21px; flex: none; accent-color: var(--indigo); margin-top: 1px; }

.ob__pie { position: sticky; bottom: 0; padding: 12px 0 6px; background: linear-gradient(to top, var(--bg) 62%, transparent); }

/* ── La bolsa de la casa ─────────────────────────────────────────── */
.bolsa__cifras { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 14px; margin-bottom: 14px; }
.bolsa__cifras .rotulo { display: block; margin-bottom: 4px; }
.bolsa__cifras .monto { font-size: 26px; }

.bolsa__riel { height: 7px; border-radius: 4px; background: var(--gline); overflow: hidden; }
.bolsa__riel i { display: block; height: 100%; border-radius: 4px; background: linear-gradient(90deg, var(--indigo), var(--rosa)); transition: width .5s cubic-bezier(.22,.7,.3,1); }
.bolsa__riel--fino { height: 5px; margin-top: 6px; }

.bolsa__quienes { display: grid; gap: 4px; padding-top: 4px; border-top: 1px solid var(--gline-2); }
.bolsa__quien { display: flex; align-items: center; gap: 11px; padding: 11px 0; min-width: 0; }
.bolsa__quien + .bolsa__quien { border-top: 1px solid var(--gline-2); }
.bolsa__cuerpo { flex: 1; min-width: 0; }
.bolsa__nom { font-size: 15px; font-weight: 500; display: flex; align-items: baseline; gap: 8px; }
.bolsa__nom span { font-size: 12.5px; font-weight: 400; color: var(--ink-3); }
.bolsa__val { font-size: 13px; color: var(--menta); font-weight: 560; white-space: nowrap; }
.bolsa__val--falta { color: var(--ambar); }
