/* ============================================================
   adho — Sistema de diseño v3 "escritorio retro"
   Papel, tinta y pestañas de archivador. Sin sombras, sin vidrio,
   sin degradados: toda la profundidad se hace con bordes.
   El manual completo está en docs/diseno/MANUAL.md.
   ============================================================ */
:root {
  /* --- Papel y tinta --- */
  --canvas: #E7E4DE;        /* el escritorio: fondo de todo */
  --papel: #F7F5F1;         /* la hoja: tarjetas, formularios, cuerpo */
  --papel-hundido: #F1EEE8; /* franjas y zonas secundarias */
  --papel-hoja: #FFFFFF;    /* la hoja de ESCRIBIR: más blanca que el resto */
  --tinta: #141414;         /* titulares */
  --texto: #3C3931;         /* párrafos */
  --texto-suave: #6E6A63;   /* etiquetas y metadatos — 4.94 de contraste */
  --texto-tenue: #726D65;   /* lo más apagado permitido en TEXTO — 4.71 */
  --borde: #C9C4BA;         /* todas las líneas */

  /* --- Azul de acción --- */
  --azul: #2B44E0;
  --azul-hover: #1B2FA8;
  --azul-activo: #3752E4;
  --azul-borde: #7C8BEE;
  --azul-suave: #DDE0F7;
  --azul-tenue: #E9ECFD;
  /* Los dos de adentro del pie azul. Solo se usan ahí, porque solo ahí
     hay algo escrito ENCIMA del azul. Medidos contra --azul (#2B44E0):
     --azul-legal da 4.53 y --azul-suave 5.35, los dos pasan AA. */
  --azul-linea: #5A6DE8;    /* la divisoria dentro del pie */
  --azul-legal: #C6CEFA;    /* el párrafo legal del pie */

  /* --- Estados ---
     El naranja de la maqueta da 3.35 de contraste y el verde 1.65: los
     dos FALLAN para texto pequeño. Por eso cada uno tiene su gemelo
     oscuro. El claro pinta bordes, rellenos y puntos; el oscuro escribe. */
  --alerta: #E8552B;
  --alerta-texto: #C2401B;  /* 4.77 */
  --alerta-suave: #FBEAE4;
  --verde: #4ED8A0;         /* SOLO como punto de "en curso" */
  --verde-texto: #0F7A55;   /* 4.90 */
  --verde-suave: #E4F6EE;

  /* --- Alias de compatibilidad ---
     El JS y el CSS viejo todavía nombran --primario, --navy y --ambar.
     Se conservan apuntando a la paleta nueva para no romper nada
     mientras se migra página por página. No los uses en código nuevo. */
  --fondo: var(--canvas);
  --primario: var(--azul);
  --primario-hover: var(--azul-hover);
  --primario-suave: var(--azul-tenue);
  --navy: var(--tinta);
  --navy-claro: var(--azul);
  --navy-suave: var(--azul-tenue);
  --ambar: var(--alerta-texto);
  --ambar-hover: var(--alerta-texto);
  --ambar-suave: var(--alerta-suave);
  --rojo: var(--alerta-texto);
  --rojo-suave: var(--alerta-suave);

  /* --- Formas ---
     Sin sombras. Las variables se quedan en "none" en vez de borrarse
     para que cualquier regla vieja que las use deje de pintar sombra
     sola, en vez de romperse. */
  --radio: 6px;
  --radio-pestana: 6px 6px 0 0;
  --sombra: none;
  --sombra-alta: none;
  --vidrio: var(--papel);
  --desenfoque: none;

  /* --- Tipografía --- */
  --titular: 'Archivo Black', Archivo, Helvetica, sans-serif;
  --mono: 'IBM Plex Mono', ui-monospace, SFMono-Regular, Menlo, monospace;
  --cuerpo: Archivo, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif;
}

* { box-sizing: border-box; margin: 0; padding: 0; }
html { scroll-behavior: smooth; }
body {
  font-family: var(--cuerpo);
  background: var(--canvas);
  color: var(--texto);
  line-height: 1.5;
  -webkit-font-smoothing: antialiased;
}
img { max-width: 100%; }
a { color: var(--azul); text-decoration: none; }
a:hover { color: var(--azul-hover); text-decoration: underline; }

/* Los titulares van en MINÚSCULA y con Archivo Black apretado. Es el
   sello de la dirección: el contraste con las etiquetas monoespaciadas
   en mayúscula es lo que hace que se lea como un expediente. */
h1, h2, h3, .titulo-recto, .titulo-seccion, .titulo-bloque, .titulo-paso {
  font-family: var(--titular);
  font-weight: 400;
  color: var(--tinta);
  letter-spacing: -.04em;
  line-height: 1.02;
  text-transform: none;
}
h1 { font-size: clamp(2.1rem, 5.3vw, 4.75rem); line-height: .95; letter-spacing: -.045em; }
h2 { font-size: clamp(1.7rem, 3.4vw, 2.6rem); }
h3 { font-size: 1.2rem; }

/* Todo lo que sea etiqueta, dato o metadato: monoespaciada, mayúscula,
   muy espaciada. Nunca uses esta clase para un párrafo. */
.eyebrow, .etiqueta, .etiqueta-bloque, .estado, .chip, .badge-verificado,
.badge-pendiente, .marca-paso, .md-etiqueta, .tc-meta, .sub-paso {
  font-family: var(--mono);
  text-transform: uppercase;
  letter-spacing: .14em;
  font-size: .72rem;
}

.contenedor { max-width: 1140px; margin: 0 auto; padding: 0 22px; }
.contenedor-angosto { max-width: 720px; margin: 0 auto; padding: 0 22px; }

/* ---------- Header: pestañas de archivador ----------
   Las pestañas se APOYAN sobre la línea gruesa de abajo. El truco son
   tres cosas juntas: `align-items: flex-end`, `border-bottom: none` en
   cada pestaña, y `translateY(1.5px)` para que su borde inferior quede
   tapado justo por la línea del header. Si quitas cualquiera de las
   tres, las pestañas dejan de verse como carpetas y quedan flotando. */
.header {
  position: sticky; top: 0; z-index: 50;
  background: var(--papel);
  border-bottom: 1.5px solid var(--tinta);
}
.header-inner {
  display: flex; align-items: flex-end; gap: 6px;
  padding: 18px 22px 0; max-width: 1440px; margin: 0 auto;
}
.logo {
  display: flex; align-items: center; gap: 9px;
  padding: 11px 22px 10px; margin-right: 8px;
  background: var(--papel-hundido);
  border: 1px solid var(--tinta); border-bottom: none;
  border-radius: 8px 8px 0 0; transform: translateY(1.5px);
  font-family: var(--titular); color: var(--tinta);
  font-size: 1.25rem; letter-spacing: -.04em;
}
.logo:hover { text-decoration: none; color: var(--tinta); }
.logo svg { flex: none; }
.logo .pe { color: var(--azul); }

.nav { display: flex; align-items: flex-end; gap: 6px; flex-wrap: wrap; }
.nav-der { margin-left: auto; }
.nav a, .nav span {
  font-family: var(--mono); font-size: .72rem;
  text-transform: uppercase; letter-spacing: .13em;
  color: var(--texto); padding: 8px 16px 7px;
  background: var(--papel);
  border: 1px solid var(--borde); border-bottom: none;
  border-radius: var(--radio-pestana); transform: translateY(1.5px);
}
.nav a:hover { background: var(--papel-hundido); border-color: var(--tinta); color: var(--tinta); text-decoration: none; }
/* La sección donde estás parado: pestaña hundida en el papel, como la
   carpeta abierta del archivador. */
.nav a.activa { background: var(--papel-hundido); border-color: var(--tinta); color: var(--tinta); }
.nav a.nav-equipo.activa { background: var(--navy); border-color: var(--navy); color: var(--papel); }
.nav .nav-cta { background: var(--azul); border-color: var(--azul); color: var(--papel); }
.nav .nav-cta:hover { background: var(--azul-hover); border-color: var(--azul-hover); color: var(--papel); }
.nav .nav-usuario { background: var(--papel-hundido); border-color: var(--tinta); color: var(--tinta); }
.nav .nav-aviso { border-color: var(--alerta); color: var(--alerta-texto); }
/* Billetera del abogado: atajo a comprar desde cualquier página */
.nav .nav-saldo { display: inline-flex; align-items: center; gap: 6px; }
.nav .nav-saldo svg { width: 14px; height: 14px; flex: none; }
.nav .nav-saldo.con-saldo { background: var(--azul-tenue); border-color: var(--azul-borde); color: var(--azul-hover); }

/* ---------- Cinta de titulares (solo la portada) ----------
   28 s en línea recta. Se detiene al pasar el mouse y con
   prefers-reduced-motion: si algo se puede leer, tiene que poder leerse. */
.cinta-titulares {
  overflow: hidden; white-space: nowrap;
  background: var(--papel-hundido);
  border-top: 1px solid var(--borde);
  padding: 8px 0;
}
.cinta-tit-pista {
  display: inline-flex; gap: 26px; align-items: center;
  font-family: var(--mono); font-size: .69rem;
  letter-spacing: .18em; text-transform: uppercase; color: var(--texto-suave);
  animation: cinta-correr 28s linear infinite;
}
.cinta-tit-pista b { color: var(--azul); font-weight: 400; }
.cinta-titulares:hover .cinta-tit-pista { animation-play-state: paused; }
@keyframes cinta-correr { from { transform: translateX(0); } to { transform: translateX(-33.333%); } }
@media (prefers-reduced-motion: reduce) { .cinta-tit-pista { animation: none; } }

/* ---------- Footer: la carpeta azul ----------
   En las 5 maquetas el pie es lo ÚNICO que rompe el papel: un bloque
   azul con las esquinas de arriba redondeadas, metido 56 px por cada
   lado, como una carpeta que asoma por debajo de la hoja. Por eso lleva
   `margin: 0 56px` y no ocupa el ancho completo — si lo estiras de
   borde a borde deja de leerse como carpeta y vuelve a ser una barra.

   Es el único sitio donde se escribe ENCIMA del azul, así que los
   colores de texto salen de --azul-suave / --azul-legal, no de la
   paleta de papel. */
.footer {
  background: var(--azul); color: var(--papel);
  margin: 90px 56px 0; padding: 52px 44px 0;
  border-radius: 18px 18px 0 0; overflow: hidden; font-size: .88rem;
}
.footer-grid { display: grid; grid-template-columns: 1fr; gap: 28px; }
.footer h4 {
  font-family: var(--mono); font-size: .72rem; font-weight: 600;
  text-transform: uppercase; letter-spacing: .16em; color: var(--papel);
  margin-bottom: 14px;
}
/* Los títulos de columna van entre corchetes, como los rótulos de campo
   del resto del sitio. Se pone acá y no en el JS para que el corchete no
   se lo lleve el lector de pantalla como si fuera texto. */
.footer h4::before { content: "["; }
.footer h4::after  { content: "]"; }
.footer a { color: var(--azul-suave); display: block; padding: 5px 0; font-size: 1rem; }
.footer a:hover { color: var(--papel); }
.footer-marca .logo {
  display: inline-flex; padding: 0; margin: 0; background: none;
  border: none; transform: none; font-size: 1.5rem; color: var(--papel);
}
.footer-marca .logo:hover { background: none; color: var(--papel); }
/* El logo del header es tinta sobre papel; acá va al revés. */
.footer-marca .marca-adho { color: var(--papel); }
.footer-marca p { margin-top: 16px; max-width: 340px; color: var(--azul-suave); font-size: 1rem; line-height: 1.6; }
/* Redes sociales: cuadraditos de línea sobre el azul del pie, con el
   mismo lenguaje de bordes del resto del sitio. Nada de logos a color. */
.redes-footer { display: flex; gap: 8px; margin-top: 18px; }
.redes-footer a {
  display: inline-flex; align-items: center; justify-content: center;
  width: 38px; height: 38px; padding: 0;
  border: 1px solid var(--azul-linea); border-radius: 3px;
  color: var(--azul-suave);
}
.redes-footer a:hover { border-color: var(--papel); color: var(--papel); }
.redes-footer svg { width: 17px; height: 17px; }
.footer-legal {
  border-top: 1px solid var(--azul-linea); margin-top: 44px; padding: 22px 0 0;
  text-align: center; font-size: .82rem; line-height: 1.6;
  color: var(--azul-legal); max-width: 900px; margin-left: auto; margin-right: auto;
}
/* La marca gigante al pie, recortada por la mitad. El truco es la caja
   de 146 px con overflow hidden: la letra mide mucho más que eso, así
   que solo se ve la parte de arriba y se lee como un sello grabado en
   la carpeta, no como texto. Los márgenes negativos la sacan del padding
   del pie para que toque los dos bordes. */
.footer-sello {
  margin: 36px -44px 0; height: 146px; overflow: hidden;
  display: flex; justify-content: center; user-select: none;
}
.footer-sello span {
  display: block;
  font-family: var(--titular); font-size: clamp(9rem, 38vw, 542px);
  line-height: 1; letter-spacing: -.055em; color: var(--papel);
  white-space: nowrap; transform: translateY(-.28em);
}
@media (min-width: 720px) { .footer-grid { grid-template-columns: 2fr 1fr 1fr 1fr; gap: 56px; } }

/* ---------- Botones ----------
   Rectangulares con una esquina apenas marcada, monoespaciados y en
   mayúscula. Nada de pill ni de sombra al pasar el mouse. */
.btn {
  display: inline-flex; align-items: center; justify-content: center; gap: 8px;
  cursor: pointer; font-family: var(--mono);
  font-size: .78rem; font-weight: 500;
  text-transform: uppercase; letter-spacing: .1em;
  border: 1px solid transparent; border-radius: 3px;
  padding: 14px 26px; transition: background .15s ease, border-color .15s ease, color .15s ease;
}
.btn-primario { background: var(--azul); border-color: var(--azul); color: var(--papel); }
.btn-primario:hover { background: var(--azul-hover); border-color: var(--azul-hover); color: var(--papel); text-decoration: none; }
.btn-primario:active { background: var(--azul-activo); }
.btn-navy { background: var(--tinta); border-color: var(--tinta); color: var(--papel); }
.btn-navy:hover { background: #000; color: var(--papel); text-decoration: none; }
.btn-borde { background: var(--papel); color: var(--tinta); border-color: var(--borde); }
.btn-borde:hover { background: var(--papel-hundido); border-color: var(--tinta); color: var(--tinta); text-decoration: none; }
.btn-bloque { width: 100%; }
.btn-chico { padding: 9px 18px; font-size: .7rem; }
.btn:disabled { opacity: .45; cursor: not-allowed; }
/* El foco de teclado tiene que verse. Sin sombras, se marca con un
   contorno grueso separado del borde. */
.btn:focus-visible, .nav a:focus-visible, a:focus-visible,
input:focus-visible, textarea:focus-visible, select:focus-visible {
  outline: 2px solid var(--azul); outline-offset: 2px;
}

/* ---------- Hero de la portada ----------
   Una hoja en blanco. Sin degradados de fondo, sin blobs: el peso
   visual lo lleva el titular en Archivo Black y las carpetas. */
.hero-inicio {
  min-height: calc(100svh - 96px);
  display: flex; flex-direction: column; align-items: center; justify-content: center;
  text-align: center; padding: 64px 22px 88px; position: relative;
  background: var(--papel);
  border-bottom: 1px solid var(--borde);
}
.eyebrow {
  font-family: var(--mono); font-size: .72rem; font-weight: 500;
  letter-spacing: .2em; text-transform: uppercase;
  color: var(--texto-suave); margin-bottom: 20px;
}

/* La pregunta del inicio se DEJA ENVOLVER. Antes llevaba
   `white-space: nowrap` para forzar una sola línea, pero el texto a
   76 px es más ancho que los 1000 px de la caja: se desbordaba por los
   dos lados, aparecía scroll horizontal y el titular se veía corrido a
   la izquierda en vez de centrado. La maqueta tampoco la fuerza.
   `text-wrap: balance` reparte las líneas parejas cuando toca envolver. */
.hero-inicio .titulo-recto {
  font-size: clamp(1.5rem, 4.6vw, 4.75rem);
  max-width: 1100px; text-wrap: balance; margin-inline: auto;
}
.titulo-medio { font-size: clamp(1.7rem, 4vw, 3.2rem) !important; }
@media (max-width: 620px) {
  .hero-inicio .titulo-recto { font-size: clamp(1.85rem, 8vw, 2.4rem); }
}

.hero-sub { color: var(--texto); font-size: 1.06rem; margin: 16px auto 0; max-width: 560px; text-wrap: pretty; }

/* ---------- Renglón que se escribe solo ----------
   La comilla de apertura va acá y no en el JS a propósito: si fuera
   parte del texto se escribiría letra por letra y el primer golpe de
   vista sería una comilla suelta. Cierre no lleva: el cursor hace de
   cierre, y así se lee como una frase a medio escribir.

   La altura es FIJA. Si creciera con el texto, cada cambio de frase
   empujaría las carpetas hacia abajo y la página entera daría un salto
   cada 3 segundos. Es el detalle que arruina este efecto cuando está
   mal hecho. */
.rotativo {
  margin: 24px auto 0; max-width: 900px; padding: 0 12px;
  min-height: 34px; display: flex; align-items: center; justify-content: center;
  font-family: var(--mono); font-size: .88rem; color: var(--texto-suave); text-align: center;
}
.rotativo-texto::before { content: "\201C"; color: var(--borde); }

.cursor-escribe {
  display: inline-block; flex: none; width: 2px; height: 1.1em;
  margin-left: 3px; background: var(--azul);
  animation: latir-cursor 1.05s steps(1) infinite;
}
@keyframes latir-cursor { 0%, 49% { opacity: 1; } 50%, 100% { opacity: 0; } }

/* Debajo del rotativo el subtítulo se aprieta: son dos renglones
   seguidos y con el margen normal quedaban demasiado separados. */
.rotativo + .hero-sub { margin-top: 12px; font-size: 1rem; }

@media (max-width: 620px) {
  /* Dos líneas de alto: en celular las frases largas envuelven, y la
     altura tiene que estar reservada desde el inicio. */
  .rotativo { font-size: .78rem; min-height: 54px; margin-top: 16px; }
}
@media (prefers-reduced-motion: reduce) { .cursor-escribe { animation: none; } }

.scroll-cue {
  position: absolute; bottom: 26px; left: 50%; transform: translateX(-50%);
  color: var(--texto-suave); font-family: var(--mono); font-size: .66rem;
  text-transform: uppercase; letter-spacing: .16em;
  display: flex; flex-direction: column; align-items: center; gap: 4px;
}
.scroll-cue:hover { text-decoration: none; color: var(--tinta); }
/* Medía 30 px de alto. El padding le da zona de dedo sin moverlo de
   sitio: el `bottom` se compensa con el mismo valor. */
.scroll-cue { padding: 8px 14px; bottom: 18px; }

/* La aurora era el efecto de la versión anterior. Se neutraliza en vez
   de borrarse porque `.aurora` sigue puesta en varias tarjetas del JS:
   así dejan de brillar sin tener que tocar cada llamada. */
.aurora { position: relative; }
.aurora::before { content: none; }

/* ---------- Carpetas de categoría ----------
   Dos filas: la de arriba se APOYA sobre una línea (pestañas que
   asoman) y la de abajo CUELGA de ella. Es la silueta de un archivador.

   El truco es el mismo del header: borde inferior ausente en la fila de
   arriba y `translateY(1px)` para que la línea del contenedor tape el
   canto. En la fila de abajo pasa al revés: se le quita el borde de
   arriba y el radio se invierte. */
.carpetas { width: 100%; max-width: 1120px; margin: 52px auto 0; }
.carpetas-fila { display: flex; flex-wrap: wrap; justify-content: center; }
.carpetas-arriba { align-items: flex-end; gap: 6px; border-bottom: 1px solid var(--borde); }
/* Sin `margin-top`: la fila de abajo tiene que COLGAR de la misma línea
   sobre la que se apoya la de arriba. Con separación se leían como dos
   grupos sueltos y se perdía la silueta del archivador. */
.carpetas-abajo { gap: 8px; margin-top: 0; }

.carpeta {
  cursor: pointer; font-family: var(--mono); font-size: .72rem;
  text-transform: uppercase; letter-spacing: .12em;
  padding: 12px 20px 11px; color: var(--texto);
  background: var(--papel-hundido);
  border: 1px solid var(--borde);
  transition: background .15s ease, border-color .15s ease, color .15s ease, transform .15s ease;
}
.carpeta-arriba { border-bottom: none; border-radius: var(--radio-pestana); transform: translateY(1px); }
.carpeta-abajo  { border-top: none;    border-radius: 0 0 6px 6px; background: var(--papel); }

.carpeta:hover { background: var(--azul-tenue); border-color: var(--azul-borde); color: var(--azul-hover); }
.carpeta-arriba:hover { transform: translateY(-2px); }
.carpeta-abajo:hover  { transform: translateY(2px); }
.carpeta:focus-visible { outline: 2px solid var(--azul); outline-offset: 2px; }

/* La elegida se pinta de azul sólido, como la pestaña activa de la
   maqueta. Las demás se apagan para que el paso siguiente se lea como
   una consecuencia y no como una pantalla nueva. */
.carpeta.activa { background: var(--azul); border-color: var(--azul); color: var(--papel); }
.carpeta.apagada { opacity: .2; pointer-events: none; }

/* "No estoy seguro" es una salida, no una opción más. Va con borde
   punteado para que nadie la elija por descarte visual. */
.carpeta-omitir { border-style: dashed; color: var(--texto-suave); background: transparent; }

/* Rótulo entre corchetes encima de las carpetas del paso 2 */
.rotulo-carpetas {
  display: flex; align-items: center; justify-content: center; gap: 12px;
  margin-top: 26px; color: var(--texto-suave);
}
.etiqueta-tenue { color: var(--texto-tenue); }

@media (prefers-reduced-motion: reduce) {
  .carpeta, .carpeta:hover { transition: none; transform: none; }
}

.volver-suave {
  display: inline-block; margin-top: 32px; color: var(--texto-suave);
  font-family: var(--mono); font-size: .7rem; text-transform: uppercase; letter-spacing: .12em;
  background: none; border: none; cursor: pointer; padding: 8px 14px;
}
.volver-suave:hover { color: var(--azul); text-decoration: underline; }


/* ---------- Tarjetas ----------
   Una tarjeta es una hoja: fondo papel y un borde de 1px. Nada más.
   Sin sombra, sin vidrio, sin radio grande. */
.tarjeta {
  background: var(--papel); border: 1px solid var(--borde); border-radius: var(--radio);
  padding: 26px;
}
/* `.tarjeta-vidrio` sobrevive porque el JS todavía la usa en el modal y
   en el paso 3. Ya no es de vidrio: es la misma hoja, con más aire. */
.tarjeta-vidrio {
  background: var(--papel); border: 1px solid var(--borde);
  border-radius: var(--radio); padding: 32px; text-align: left;
}
.resumen-eleccion { display: flex; gap: 8px; flex-wrap: wrap; margin-bottom: 18px; }
.pildora {
  font-family: var(--mono); font-size: .68rem; text-transform: uppercase; letter-spacing: .12em;
  background: var(--azul-tenue); color: var(--azul-hover);
  border: 1px solid var(--azul-borde); padding: 6px 12px; border-radius: 3px;
}
.pildora.oro { background: var(--alerta-suave); color: var(--alerta-texto); border-color: var(--alerta); }

/* ---------- Formularios ----------
   El rótulo de cada campo va en monoespaciada, mayúscula y ENTRE
   CORCHETES, como los campos de un formulario oficial: [DNI].

   Historia, para que no se deshaga solo: se quitaron en agosto 2026
   porque parecían texto sin terminar, y Luis pidió devolverlos al
   comparar con las maquetas aprobadas, donde sí están. Los corchetes
   los pone el CSS y no el JS para que no se puedan colar en un dato
   que venga de la base. */
label.campo {
  display: block; font-family: var(--mono); font-size: .68rem; font-weight: 500;
  text-transform: uppercase; letter-spacing: .14em;
  color: var(--texto-suave); margin: 20px 0 7px;
}
label.campo::before { content: "["; }
label.campo::after  { content: "]"; }
/* OJO CON EL font-size: 16px — NO lo bajes a rem.
   Safari en iPhone y iPad hace zoom automático al enfocar cualquier
   campo cuya letra mida menos de 16px, y deja la página descuadrada y
   corrida hacia un lado. `.98rem` son 15.68px: por 0.32px se rompía la
   experiencia en todos los formularios del sitio.
   La diferencia visual en escritorio es imperceptible; el daño en
   celular no. Medido con pruebas/visual.js en setiembre 2026. */
input[type=text], input[type=email], input[type=password], input[type=tel], input[type=number],
input[type=date], input[type=search], input[type=url], select, textarea {
  width: 100%; padding: 13px 15px; border: 1px solid var(--borde); border-radius: 3px;
  font-family: var(--cuerpo); font-size: 16px; color: var(--tinta); background: var(--papel);
  transition: border-color .15s;
}
input::placeholder, textarea::placeholder { color: var(--texto-tenue); }
input:focus, select:focus, textarea:focus { outline: none; border-color: var(--azul); border-width: 1.5px; padding: 12.5px 14.5px; }
textarea { min-height: 150px; resize: vertical; line-height: 1.55; }
.ayuda {
  font-family: var(--mono); font-size: .64rem; text-transform: uppercase;
  letter-spacing: .1em; color: var(--texto-suave); margin-top: 7px;
}
.fila-check { display: flex; align-items: flex-start; gap: 10px; margin-top: 16px; font-size: .9rem; color: var(--texto); }
.contador {
  text-align: right; font-family: var(--mono); font-size: .68rem;
  color: var(--texto-suave); margin-top: 6px; font-variant-numeric: tabular-nums;
}
.nota-legal { font-family: var(--mono); font-size: .64rem; text-transform: uppercase; letter-spacing: .1em; color: var(--texto-suave); text-align: center; margin-top: 16px; }

/* ---------- Secciones ---------- */
.seccion { padding: 88px 0 0; }
.seccion h2.titulo-seccion { text-align: center; font-size: clamp(1.8rem, 3.6vw, 3rem); }
.seccion p.sub-seccion { text-align: center; color: var(--texto-suave); margin: 12px auto 44px; max-width: 560px; font-size: 1.04rem; }
.grid-3 { display: grid; grid-template-columns: 1fr; gap: 0; border: 1px solid var(--borde); background: var(--papel); }
/* Los tres pasos van pegados y separados solo por una línea, como las
   columnas de un formulario impreso. En celular la línea pasa a
   horizontal, si no queda un borde suelto arriba de la primera. */
.grid-3 > * + * { border-top: 1px solid var(--borde); }
@media (min-width: 720px) {
  .grid-3 { grid-template-columns: repeat(3, 1fr); }
  .grid-3 > * + * { border-top: none; border-left: 1px solid var(--borde); }
}
.tarjeta-paso { background: transparent; border: none; border-radius: 0; padding: 40px 30px; text-align: left; }
/* El número no va en un círculo: va como folio de expediente, grande y
   apagado, arriba del título. */
.tarjeta-paso .num-grande {
  width: auto; height: auto; border-radius: 0; background: none; margin: 0 0 14px;
  display: block; font-family: var(--titular); font-size: 2.6rem;
  line-height: 1; letter-spacing: -.05em; color: var(--borde);
}
.tarjeta-paso h3 { font-size: 1.25rem; }
.tarjeta-paso p { color: var(--texto-suave); font-size: .94rem; margin-top: 10px; }

/* ---------- Panel de "¿Eres abogado?" ----------
   Era un degradado azul oscuro. Ahora es la misma hoja con la tinta
   invertida: fondo tinta, texto papel. Sigue siendo el bloque que más
   pesa de la página, pero con la paleta del sitio. */
/* El bloque "¿Eres abogado?" es AZUL, no negro: en la maqueta es la
   misma carpeta azul del pie, con 18 px de radio en las cuatro esquinas
   porque acá flota dentro de la hoja en vez de asomar por abajo.
   El negro era un resto del diseño anterior. */
.bento-oscuro {
  background: var(--azul); color: var(--papel);
  border-radius: 18px; padding: 60px 40px; text-align: center;
  position: relative; overflow: hidden;
}
.bento-oscuro::before { content: none; }
.bento-oscuro > * { position: relative; z-index: 1; }
.bento-oscuro h2 { font-size: clamp(1.7rem, 3.2vw, 2.6rem); color: var(--papel); }
.bento-oscuro p { color: var(--azul-suave); margin: 14px auto 28px; max-width: 520px; }
.bento-oscuro .btn-primario { background: var(--papel); border-color: var(--papel); color: var(--tinta); }
.bento-oscuro .btn-primario:hover { background: var(--azul-hover); border-color: var(--papel); color: var(--papel); }

/* ---------- Demanda real: lo que convence a un abogado ----------
   Un abogado no se registra por una frase, se registra por ver trabajo
   esperando. Estas son consultas de verdad, sin autor ni distrito. */
.demanda { margin: 6px 0 30px; }
.pulso-chip {
  display: inline-flex; align-items: center; gap: 10px;
  background: transparent; border: 1px solid var(--papel); color: var(--papel);
  font-family: var(--mono); font-size: .68rem; text-transform: uppercase;
  letter-spacing: .13em; padding: 9px 16px; border-radius: 3px;
}
.pulso-chip i { position: relative; flex: none; width: 7px; height: 7px; border-radius: 50%; background: var(--verde); }
/* El punto no parpadea: LATE, con una onda que se expande y se apaga.
   Un parpadeo se lee como error o como aviso; un latido se lee como
   "esto está pasando en este momento", que es justo lo que dice. */
.pulso-chip i::after {
  content: ""; position: absolute; inset: 0; border-radius: 50%; background: inherit;
  animation: latido 2s ease-out infinite;
}
@keyframes latido { from { transform: scale(1); opacity: .65; } to { transform: scale(3.6); opacity: 0; } }

/* La cinta se desvanece en los bordes con una máscara en vez de
   cortarse en seco: así parece que las tarjetas vienen de más allá del
   panel y no que aparecen de la nada. */
.cinta {
  margin-top: 22px; overflow: hidden;
  -webkit-mask: linear-gradient(90deg, transparent, #000 7%, #000 93%, transparent);
  mask: linear-gradient(90deg, transparent, #000 7%, #000 93%, transparent);
}
.cinta-pista { display: flex; gap: 12px; width: max-content; animation: correr-cinta 46s linear infinite; }
/* Se detiene al pasar el mouse: si algo se puede leer, tiene que poder
   dejarse quieto. Una cinta que no para es una cinta que no se lee. */
.cinta:hover .cinta-pista { animation-play-state: paused; }
@keyframes correr-cinta { to { transform: translateX(-50%); } }
/* Las tarjetas van sobre el azul, así que llevan el azul de pulsado por
   dentro y el borde claro: sobre el fondo azul un borde oscuro
   desaparece. Los grises de antes eran del bloque negro. */
.cinta-item {
  flex: none; width: 262px; text-align: left;
  background: var(--azul-activo); border: 1px solid var(--azul-borde);
  border-radius: 3px; padding: 14px 16px;
}
.cinta-item b {
  display: block; font-family: var(--mono); font-size: .63rem; font-weight: 500;
  letter-spacing: .13em; text-transform: uppercase; color: var(--azul-tenue); margin-bottom: 7px;
}
.cinta-item span {
  font-size: .87rem; line-height: 1.45; color: var(--papel);
  display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical; overflow: hidden;
}

/* ---------- Pie ----------
   El trabajo del pie es que te encuentren, no que te guste. Un
   subrayado que crece desde la izquierda, y nada más. */
.footer { position: relative; }
.footer::before { content: none; }
.footer-grid a:not(.logo) { position: relative; }
.footer-grid a:not(.logo)::after {
  content: ""; position: absolute; left: 0; bottom: -2px; width: 100%; height: 1px;
  background: currentColor; transform: scaleX(0); transform-origin: left;
  transition: transform .28s cubic-bezier(.2,.8,.2,1);
}
.footer-grid a:not(.logo):hover { text-decoration: none; }
.footer-grid a:not(.logo):hover::after { transform: scaleX(1); }

@media (max-width: 560px) { .cinta-item { width: 220px; } }
@media (prefers-reduced-motion: reduce) {
  .pulso-chip i::after, .cinta-pista { animation: none; }
  .pulso-chip i::after { display: none; }
  .footer-grid a:not(.logo)::after { transition: none; }
}

/* ---------- Modal ---------- */
.modal-fondo {
  position: fixed; inset: 0; background: rgba(0,0,0,.34);
  z-index: 100; display: none; align-items: center; justify-content: center; padding: 20px;
}
.modal-fondo.abierto { display: flex; animation: aparecer .22s ease; }
@keyframes aparecer { from { opacity: 0; transform: translateY(8px); } to { opacity: 1; transform: none; } }
.modal { background: var(--papel); border-radius: var(--radio); box-shadow: none; width: 100%; max-width: 440px; max-height: 92vh; overflow-y: auto; padding: 30px; position: relative; }
.modal-cerrar { position: absolute; top: 14px; right: 16px; background: var(--papel-hundido); border: none; width: 30px; height: 30px; border-radius: 50%; color: var(--texto-suave); cursor: pointer; line-height: 1; display: inline-flex; align-items: center; justify-content: center; transition: background .18s ease, color .18s ease; }
.modal-cerrar svg { width: 15px; height: 15px; }
.modal-cerrar:hover { background: var(--papel-hundido); color: var(--texto); }

/* Sello circular para las pantallas de "revisa tu correo" / "confirmada".
   El anillo exterior es un box-shadow, no un borde: así no ocupa espacio
   y el círculo no se descuadra. */
.sello-correo {
  width: 62px; height: 62px; margin: 0 auto; border-radius: 50%;
  display: inline-flex; align-items: center; justify-content: center;
  background: var(--navy-suave); color: var(--navy-claro);
  box-shadow: none;
}
.sello-correo svg { width: 26px; height: 26px; }
.sello-correo.sello-ok { background: var(--verde-suave); color: var(--verde-texto); box-shadow: none; }
.sello-correo.sello-alerta { background: var(--alerta-suave); color: var(--alerta-texto); }
/* El reloj de "registro en revisión", antes un estilo inline con ámbar */
.icat.icat-espera { width: 58px; height: 58px; margin: 0 auto; background: var(--alerta-suave); color: var(--alerta-texto); }
.modal h2 { font-size: 1.3rem; letter-spacing: -.02em; }
.modal .sub-modal { color: var(--texto-suave); font-size: .92rem; margin-top: 6px; }
.tabs { display: flex; align-items: flex-end; gap: 6px; border-bottom: 1px solid var(--borde); margin: 22px 0 6px; }
.tab {
  flex: 1; cursor: pointer; font-family: var(--mono); font-size: .7rem;
  text-transform: uppercase; letter-spacing: .12em; color: var(--texto-suave);
  background: var(--papel-hundido); padding: 10px 8px 9px;
  border: 1px solid var(--borde); border-bottom: none;
  border-radius: var(--radio-pestana); transform: translateY(1px);
}
.tab.activa { background: var(--azul); border-color: var(--azul); color: var(--papel); }
.btn-social {
  width: 100%; display: flex; align-items: center; justify-content: center; gap: 10px;
  background: var(--papel); border: 1px solid var(--borde); border-radius: 3px; padding: 11px;
  font-family: inherit; font-size: .95rem; font-weight: 600; color: var(--texto); cursor: pointer; margin-top: 16px;
}
.btn-social:hover { background: var(--fondo); }
.separador { display: flex; align-items: center; gap: 12px; color: var(--texto-suave); font-size: .8rem; margin: 16px 0 2px; }
.separador::before, .separador::after { content: ""; flex: 1; height: 1px; background: var(--borde); }

/* ---------- Hero de subpáginas ---------- */
.hero { text-align: center; padding: 58px 0 8px; }
.hero h1 { font-size: clamp(1.9rem, 4.6vw, 3.2rem); }
.hero p.sub { color: var(--texto-suave); font-size: 1.08rem; margin: 12px auto 0; max-width: 560px; }
.hero .confianza {
  display: flex; justify-content: center; gap: 22px; flex-wrap: wrap; margin-top: 22px;
  font-family: var(--mono); font-size: .66rem; text-transform: uppercase;
  letter-spacing: .12em; color: var(--texto-suave);
}

/* ---------- Listas de consultas ----------

   Cada consulta del archivo es un expediente con orejitas: la cabecera
   (.hoja-cabecera, la misma del paso 3) se monta sobre el canto de la
   tarjeta. El margen negativo es de 1 px y no de 1.5 porque el marco de
   estas tarjetas es más fino que el de la hoja de escribir.

   Las orejitas van con borde de 1 px aquí. Con el 1.5 de la hoja, una
   lista de veinte consultas se convertía en un muro de recuadros
   negros: en la hoja hay UNA y tiene que pesar, en el archivo hay
   muchas y tienen que dejar leer. */
.exp-consulta { margin-bottom: 14px; }
.exp-consulta .hoja-cabecera { margin-bottom: -1px; }
.exp-consulta .hoja-cabecera .pildora:first-child { border-width: 1px; }
.exp-consulta .tarjeta-consulta { margin-bottom: 0; }

.tarjeta-consulta {
  background: var(--papel); border: 1px solid var(--borde); border-radius: var(--radio);
  padding: 22px 24px; margin-bottom: 14px; box-shadow: none;
  transition: border-color .15s ease;
}
.tarjeta-consulta:hover { border-color: var(--tinta); }
.tc-meta { display: flex; gap: 8px; flex-wrap: wrap; align-items: center; font-size: .8rem; color: var(--texto-suave); margin-bottom: 10px; }
.tc-texto { font-size: 1rem; }
.tc-texto a { color: inherit; font-weight: 600; }
.tc-pie { display: flex; justify-content: space-between; align-items: center; gap: 10px; flex-wrap: wrap; margin-top: 14px; }
.estado {
  font-family: var(--mono); font-size: .64rem; font-weight: 500;
  text-transform: uppercase; letter-spacing: .12em;
  padding: 5px 10px; border: 1px solid; border-radius: 3px;
}
/* Los estados van sobre papel con borde de color, no rellenos: con
   varios en pantalla los fondos parecían resaltador (queja de Luis). */
.estado-abierta { background: var(--papel); color: var(--verde-texto); border-color: var(--verde-texto); }
.estado-reclamada { background: var(--papel); color: var(--alerta-texto); border-color: var(--alerta); }
.estado-respondida { background: var(--papel); color: var(--azul-hover); border-color: var(--azul-borde); }

/* Estados de una ORDEN de compra. Aparte de los de consulta a
   propósito: ahí "abierta" es verde porque significa disponible, y en
   una orden sin pagar el verde diría lo contrario de la verdad. */
.estado-pagada    { background: var(--papel); color: var(--verde-texto); border-color: var(--verde-texto); }
.estado-pendiente { background: var(--papel-hundido); color: var(--texto-suave); border-color: var(--borde); }
.estado-fallida   { background: var(--papel); color: var(--alerta-texto); border-color: var(--alerta); }
.filtros-barra { display: flex; gap: 8px; flex-wrap: wrap; margin: 26px 0; justify-content: center; }
.chip {
  background: var(--papel); border: 1px solid var(--borde); border-radius: 3px;
  padding: 9px 16px; cursor: pointer; color: var(--texto);
  font-family: var(--mono); font-size: .68rem;
  text-transform: uppercase; letter-spacing: .12em;
  transition: background .15s ease, border-color .15s ease, color .15s ease;
}
.chip:hover { border-color: var(--texto-suave); }
.chip.activa { background: var(--azul); border-color: var(--azul); color: var(--papel); }

/* ---------- Detalle de consulta / respuesta ---------- */
.caja-respuesta {
  border: 1px solid var(--tinta); border-left: 4px solid var(--azul);
  background: var(--papel); border-radius: var(--radio); padding: 24px; margin-top: 20px; box-shadow: none;
}
.cabecera-abogado { display: flex; align-items: center; gap: 12px; }
.avatar {
  width: 46px; height: 46px; border-radius: 3px; flex: none;
  background: var(--papel-hundido); border: 1px solid var(--tinta); color: var(--tinta);
  font-family: var(--mono); font-size: .84rem; letter-spacing: .04em;
  display: flex; align-items: center; justify-content: center;
}
.avatar.oro { background: var(--azul); border-color: var(--azul); color: var(--papel); }

/* La foto va ENCIMA de las iniciales, en la misma caja. Si la imagen
   no carga, el `onerror` del JS la quita y debajo quedan las
   iniciales: nunca un cuadro vacío. Por eso `position: absolute` y no
   sustituir el contenido. */
.avatar.con-foto, .avatar-grande.con-foto { position: relative; overflow: hidden; }
.avatar.con-foto img, .avatar-grande.con-foto img {
  position: absolute; inset: 0;
  width: 100%; height: 100%;
  object-fit: cover;          /* recorta y centra: no deforma la cara */
  border-radius: inherit;
}

/* La fila de la foto en "Editar mi perfil" */
.fila-foto { display: flex; gap: 18px; align-items: flex-start; flex-wrap: wrap; margin-top: 14px; }
.fila-foto-texto { flex: 1; min-width: 240px; }
.fila-foto-botones { display: flex; gap: 8px; flex-wrap: wrap; margin-bottom: 10px; }
.fila-foto .ayuda { margin-top: 6px; }
.cabecera-abogado .nombre { font-weight: 700; }
.cabecera-abogado .detalle { font-size: .82rem; color: var(--texto-suave); }
.badge-verificado {
  display: inline-flex; align-items: center; gap: 5px; vertical-align: middle;
  background: var(--verde-suave); color: var(--verde-texto); border: 1px solid var(--verde-texto);
  font-family: var(--mono); font-size: .62rem; text-transform: uppercase;
  letter-spacing: .1em; padding: 3px 9px; border-radius: 3px;
}
.estrellas { display: inline-flex; gap: 3px; font-size: 1.3rem; cursor: pointer; user-select: none; }
.estrellas span { color: var(--borde); transition: color .1s; }
.estrellas span.llena { color: var(--alerta-texto); }
/* Aquí vivía `.texto-borroso`, que pintaba el final de la consulta
   transparente en el hub para que el abogado no lo leyera sin
   reclamar.

   Se borró porque NO PROTEGÍA NADA: el texto viajaba entero en el
   HTML y se leía con F12 o con Ctrl+U. Era peor que no tener nada,
   porque daba una sensación de protección que no existía.

   Lo que protege de verdad está en Postgres: `consultas.texto_publico`
   tapa teléfonos, correos y DNI antes de salir de la base. Ver
   db/tapar-contactos.sql. No reintroducir esta clase. */
.candado-respuesta { text-align: center; padding: 18px 10px 6px; margin-top: -6px; position: relative; }
.candado-respuesta::before {
  content: ""; position: absolute; left: 0; right: 0; top: -70px; height: 70px;
  background: linear-gradient(transparent, var(--papel)); pointer-events: none;
}

/* ---------- Hub del abogado ---------- */
.layout-hub { display: grid; grid-template-columns: 1fr; gap: 24px; margin-top: 30px; }
@media (min-width: 860px) { .layout-hub { grid-template-columns: 270px 1fr; align-items: start; } }
.panel-lateral { background: var(--vidrio); border: 1px solid var(--borde); border-radius: var(--radio); padding: 22px; }
@media (min-width: 860px) { .panel-lateral { position: sticky; top: 76px; } }
.panel-lateral h3 { font-size: .92rem; margin-bottom: 10px; }
.chips { display: flex; flex-wrap: wrap; gap: 8px; }
.cupo {
  background: var(--verde-suave); color: var(--verde-texto); border: 1px solid var(--verde-texto);
  border-radius: 3px; padding: 12px 14px; margin: 16px 0;
  font-family: var(--mono); font-size: .68rem; text-transform: uppercase; letter-spacing: .1em;
}
.cupo.agotado { background: var(--alerta-suave); color: var(--alerta-texto); border-color: var(--alerta); }
.aviso { border-radius: 3px; border: 1px solid; padding: 14px 16px; font-size: .9rem; margin: 16px 0; }
.aviso-info { background: var(--azul-tenue); color: var(--azul-hover); border-color: var(--azul-borde); }
.aviso-ok { background: var(--verde-suave); color: var(--verde-texto); border-color: var(--verde-texto); }
.aviso-alerta { background: var(--alerta-suave); color: var(--alerta-texto); border-color: var(--alerta); }
.aviso-error { background: var(--alerta-suave); color: var(--alerta-texto); border-color: var(--alerta); }

/* ---------- Pantallas de error (js/errores.js) ----------
   Mismo aire que el 404: tarjeta centrada, mucho espacio y una salida
   siempre visible. No usa .tarjeta porque estas pantallas aparecen
   solas en la página, sin nada alrededor que enmarcar. */
.pantalla-error { max-width: 480px; margin: 0 auto; padding: 64px 22px 40px; text-align: center; }
.pantalla-error h1 { font-size: clamp(1.35rem, 3.6vw, 1.75rem); letter-spacing: -.025em; margin-top: 18px; }
.pantalla-error p { color: var(--texto-suave); margin-top: 12px; line-height: 1.55; }
.pe-sello {
  display: inline-flex; align-items: center; justify-content: center;
  width: 62px; height: 62px; border-radius: 3px; border: 1.5px solid currentColor;
}
.pe-sello svg { width: 28px; height: 28px; }
.pe-ambar { background: var(--alerta-suave); color: var(--alerta-texto); }
.pe-rojo  { background: var(--alerta-suave); color: var(--alerta-texto); }
.pe-gris  { background: var(--papel-hundido);    color: var(--texto-suave); box-shadow: none; }
.pe-acciones { display: flex; gap: 10px; flex-wrap: wrap; justify-content: center; margin-top: 26px; }

/* El detalle técnico va cerrado. Es para que, si te llaman, puedas
   pedirle a la persona que lo abra y te lo lea. */
.pe-detalle { margin-top: 30px; font-size: .8rem; color: var(--texto-suave); }
.pe-detalle summary { cursor: pointer; opacity: .65; }
.pe-detalle summary:hover { opacity: 1; }
.pe-detalle code {
  display: block; margin-top: 10px; padding: 11px 13px; border-radius: var(--radio);
  background: rgba(0,0,0,.035); text-align: left; word-break: break-word; line-height: 1.45;
}

/* Franja de error para páginas que YA tienen contenido (las de /legal/
   llevan su texto en el HTML porque la ley pide que se lean sin
   JavaScript: taparlas sería cambiar un problema por una infracción). */
.banner-error { background: var(--ambar-suave); color: var(--ambar); border-bottom: 1px solid rgba(183,121,31,.2); }
.be-inner {
  max-width: 1080px; margin: 0 auto; padding: 12px 22px;
  display: flex; align-items: center; gap: 12px; font-size: .88rem; line-height: 1.45;
}
.be-inner svg { width: 20px; height: 20px; flex: none; }
.be-inner .btn { margin-left: auto; flex: none; }
@media (max-width: 700px) {
  .be-inner { flex-wrap: wrap; }
  .be-inner .btn { margin-left: 0; }
}

/* ---------- Registro abogado ---------- */
.form-seccion { border-top: 1px solid var(--borde); margin-top: 32px; padding-top: 24px; }
.form-seccion:first-of-type { border-top: none; margin-top: 12px; padding-top: 0; }
.form-seccion h3 { font-size: 1.35rem; display: flex; align-items: center; gap: 10px; margin-bottom: 16px; }
.form-seccion h3 + .ayuda { margin-top: -8px; margin-bottom: 12px; }

/* Numeración 01, 02, 03… de la maqueta 4d. Se hace con un contador de
   CSS y no en el JS a propósito: si mañana se agrega o se quita una
   sección, la numeración se corrige sola. `aria-hidden` no existe para
   pseudo-elementos, pero el contenido generado no lo leen los lectores
   de pantalla en la práctica, y el título sigue siendo el del <h3>. */
.form-numerado { counter-reset: seccion; }
.form-numerado .form-seccion { counter-increment: seccion; }
.form-numerado .form-seccion h3::before {
  content: counter(seccion, decimal-leading-zero);
  font-family: var(--titular); font-size: 1.5rem; letter-spacing: -.04em;
  color: var(--borde); margin-right: 4px;
}
/* Los íconos sobran cuando ya hay número: dos marcas para lo mismo. */
.form-numerado .form-seccion h3 > svg { display: none; }

.grid-2col { display: grid; grid-template-columns: 1fr; gap: 0 16px; }
@media (min-width: 640px) { .grid-2col { grid-template-columns: 1fr 1fr; } }
.zona-archivo {
  border: 1px dashed #8C8880; border-radius: 3px; padding: 20px; text-align: center;
  color: var(--texto-suave); cursor: pointer; margin-top: 6px; display: block;
  font-family: var(--mono); font-size: .68rem; text-transform: uppercase; letter-spacing: .1em;
  transition: border-color .15s, background .15s;
}
.zona-archivo:hover { border-color: var(--azul); color: var(--azul-hover); background: var(--azul-tenue); }
.zona-archivo.cargado { border-style: solid; border-color: var(--verde-texto); color: var(--verde-texto); background: var(--verde-suave); }
.zona-archivo input { display: none; }

/* ---------- Perfil abogado ---------- */
.cabecera-perfil { display: flex; gap: 18px; align-items: center; flex-wrap: wrap; }
.avatar-grande {
  width: 84px; height: 84px; border-radius: 3px; flex: none;
  background: var(--papel-hundido); border: 1px solid var(--tinta); color: var(--tinta);
  font-family: var(--mono); font-size: 1.5rem;
  display: flex; align-items: center; justify-content: center;
}
.stats { display: flex; gap: 0; margin-top: 26px; flex-wrap: wrap; border: 1px solid var(--borde); }
.stat { padding: 16px 22px; flex: 1; min-width: 120px; }
.stat + .stat { border-left: 1px solid var(--borde); }
.stat .valor { font-family: var(--titular); font-size: 1.7rem; letter-spacing: -.04em; color: var(--tinta); }
.stat .etiqueta { display: block; margin-top: 2px; }

/* ---------- Precios ---------- */
.grid-precios { display: grid; grid-template-columns: 1fr; gap: 16px; max-width: 780px; margin: 0 auto; padding: 0 22px; }
@media (min-width: 700px) { .grid-precios { grid-template-columns: 1fr 1fr; } }
/* Cada plan es una CARPETA de expediente: la pestaña con el nombre
   asoma arriba a la izquierda y la ficha cuelga de ella. Por eso el
   nombre del plan ya no es un <h3> dentro de la tarjeta — es la
   pestaña, en mono y mayúscula, igual que las de categoría.

   `.exp` es la columna entera (pestaña + ficha) y sirve para CUALQUIER
   bloque que quiera la silueta de carpeta, no solo para los planes.
   `.plan` se conserva como su alias porque es el nombre que usa la
   página de precios y se lee mejor ahí.

   El botón va empujado al fondo con `margin-top:auto`: sin eso, la
   tarjeta que no tiene la línea de "sale a S/ x por consulta" queda
   más corta y su botón sube, y se ve un escalón entre la de 1 consulta
   y las de paquete. */
.grid-precios { align-items: stretch; }
.exp, .plan { display: flex; flex-direction: column; height: 100%; }

/* En los planes es un <h3>, para que el lector de pantalla y el
   buscador sigan viendo el nombre como título aunque se pinte como
   pestaña. En bloques sin jerarquía propia puede ser un <span>. */
.exp-pestana {
  align-self: flex-start; margin: 0; font-weight: 500;
  font-family: var(--mono); font-size: .66rem;
  text-transform: uppercase; letter-spacing: .14em;
  padding: 9px 18px 8px; color: var(--tinta);
  background: var(--papel-hundido);
  border: 1.5px solid var(--tinta); border-bottom: none;
  border-radius: var(--radio-pestana);
  /* El mismo truco del header: baja 1.5 px para que su canto inferior
     lo tape el borde de la ficha y las dos piezas se lean como una. */
  transform: translateY(1.5px);
}
/* La pestaña azul marca el bloque que queremos que miren primero. */
.destacado > .exp-pestana {
  background: var(--azul); border-color: var(--azul); color: var(--papel);
}

/* Esquinas rectas a propósito: es una ficha archivada, y el único
   redondeo del conjunto está en la pestaña. */
.tarjeta-precio {
  background: var(--papel); border: 1.5px solid var(--tinta);
  border-radius: 0; padding: 28px 28px 30px; text-align: left;
  display: flex; flex-direction: column; flex: 1;
}
.tarjeta-precio.destacada { border-color: var(--azul); }

/* El monto y su unidad van en la MISMA línea base: "S/ 10" es el dato
   y "por consulta extra" su rótulo, no un subtítulo aparte. */
.plan-monto { display: flex; align-items: baseline; gap: 12px; flex-wrap: wrap; }
.tarjeta-precio .precio {
  font-family: var(--titular); font-size: clamp(2.7rem, 7vw, 4.1rem);
  letter-spacing: -.05em; line-height: 1; color: var(--tinta);
}
.tarjeta-precio.destacada .precio { color: var(--azul); }
.plan-sufijo {
  font-family: var(--mono); font-size: .68rem;
  text-transform: uppercase; letter-spacing: .14em; color: var(--texto-suave);
}

/* Punteadas, no continuas: dentro de una ficha las divisorias son
   renglones del formulario, no bordes de caja. */
.tarjeta-precio ul {
  list-style: none; text-align: left; margin: 24px 0 26px;
  border-top: 1px dashed var(--borde);
}
.tarjeta-precio li { padding: 12px 0; font-size: .94rem; color: var(--texto); border-bottom: 1px dashed var(--borde); }
.tarjeta-precio li:last-child { border-bottom: none; }
/* `auto` y no un margen fijo: así el botón cae al fondo de la ficha y
   los de las dos columnas quedan a la misma altura. El aire de arriba
   lo pone el `margin-bottom` de la lista, no el botón. */
.tarjeta-precio .btn { margin-top: auto; }
/* En las fichas sin lista (los paquetes de la pantalla de comprar) el
   aire lo tiene que poner el texto: el botón solo trae `auto`, que en
   la tarjeta más alta del grid vale 0. */
.tarjeta-precio .texto-suave { margin: 8px 0 22px; }
/* La nota de "sale a S/ x" va pegada al botón, no flotando. */
.tarjeta-precio .ayuda { margin: -12px 0 22px; }

/* ---------- Adjuntos de la consulta ----------
   Las fotos que sube el usuario van como piezas de un expediente:
   apoyadas sobre papel hundido, con borde de 1 px y sin sombra. */
.zona-adjuntos {
  border: 1px dashed var(--texto-tenue); background: var(--papel-hundido);
  border-radius: var(--radio); padding: 18px 16px; text-align: center;
}
.zona-adjuntos .ayuda { margin-top: 10px; }
.lista-adjuntos:not(:empty) { margin-top: 12px; display: flex; flex-direction: column; gap: 8px; }
.adjunto-fila {
  display: flex; align-items: center; gap: 10px;
  border: 1px solid var(--borde); background: var(--papel);
  border-radius: 3px; padding: 10px 12px; color: var(--texto);
}
a.adjunto-fila:hover { border-color: var(--tinta); text-decoration: none; }
.adjunto-fila svg { width: 16px; height: 16px; flex: none; color: var(--texto-suave); }
.adjunto-nombre {
  flex: 1; min-width: 0; font-size: .88rem;
  overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
}
.adjunto-peso {
  font-family: var(--mono); font-size: .66rem; letter-spacing: .1em;
  text-transform: uppercase; color: var(--texto-suave); flex: none;
}
.adjunto-quitar {
  flex: none; display: inline-flex; align-items: center; justify-content: center;
  width: 30px; height: 30px; padding: 0; cursor: pointer;
  background: none; border: 1px solid var(--borde); border-radius: 3px;
  color: var(--texto-suave);
}
.adjunto-quitar:hover { border-color: var(--alerta); color: var(--alerta-texto); }
.adjunto-quitar svg { width: 14px; height: 14px; }

/* Lo ya subido, en el detalle y en el hub del abogado */
.adjuntos-vistos { margin-top: 18px; border-top: 1px dashed var(--borde); padding-top: 14px; }
.adjuntos-vistos .etiqueta { color: var(--texto-suave); display: block; margin-bottom: 10px; }
.adjuntos-vistos .ayuda { margin-top: 10px; display: flex; align-items: center; gap: 6px; }
.adjuntos-vistos .ayuda svg { width: 13px; height: 13px; flex: none; }
.adjuntos-grid { display: flex; flex-wrap: wrap; gap: 10px; }
.adjunto-foto {
  display: block; flex: none; width: 132px; height: 132px;
  border: 1px solid var(--borde); border-radius: 3px; overflow: hidden; background: var(--papel-hundido);
}
.adjunto-foto:hover { border-color: var(--tinta); }
.adjunto-foto img { width: 100%; height: 100%; object-fit: cover; display: block; }
.adjuntos-grid .adjunto-fila { flex: 1 1 220px; }
@media (max-width: 560px) {
  .adjunto-foto { width: calc(50% - 5px); height: 128px; }
}

/* ---------- Utilidades ---------- */
.centro { text-align: center; }
.mt-8 { margin-top: 8px; } .mt-16 { margin-top: 16px; } .mt-24 { margin-top: 24px; } .mt-32 { margin-top: 32px; }
.oculto { display: none !important; }
.texto-suave { color: var(--texto-suave); }
/* Enlace secundario dentro de formularios: "¿Olvidaste tu contraseña?" */
.enlace-suave { color: var(--texto-suave); font-size: .88rem; text-decoration: underline; text-underline-offset: 3px; }
.enlace-suave:hover { color: var(--texto); }
.banner-exito {
  background: var(--verde-suave); color: var(--verde-texto);
  border: 1px solid var(--verde-texto); border-radius: 3px;
  padding: 16px 20px; margin-bottom: 20px; display: flex; gap: 10px; align-items: flex-start;
}

/* Los blobs de color, el gradiente animado del título y la aurora se
   quitaron con el rediseño: la dirección retro no tiene manchas de
   color ni bordes de luz. `.titulo-gradiente` sigue nombrada en algún
   sitio del JS, así que se neutraliza en vez de borrarse. */
#wizard-zona { position: relative; z-index: 1; width: 100%; }
.titulo-gradiente { background: none; color: var(--tinta); animation: none; }

/* ---------- Iconos SVG ---------- */
.icat { display: inline-flex; align-items: center; justify-content: center; width: 26px; height: 26px; border-radius: 50%; flex: none; vertical-align: -8px; }
.icat svg { width: 14px; height: 14px; }
.carpeta .icat { margin-right: 4px; }
.pildora svg { width: 13px; height: 13px; vertical-align: -2.5px; margin-right: 3px; }
.tc-meta > span > svg, .tc-meta svg { width: 13px; height: 13px; vertical-align: -2px; }
.aviso > svg { width: 16px; height: 16px; vertical-align: -3.5px; margin-right: 5px; }

/* ============================================================
   v5 — marca adho, aurora en tarjetas y paso 3 rediseñado
   ============================================================ */

/* ---------- Logo adho (recto: las 4 letras en una línea) ----------
   Cada letra es un <b> independiente para poder levantarlas en
   cascada al pasar el mouse. El retardo lo pone :nth-child. */
.logo { gap: 10px; }
.marca-adho {
  display: inline-flex; flex: none; align-items: baseline;
  font-family: var(--titular);
  font-size: 21px; font-weight: 400; line-height: 1; letter-spacing: -.05em;
  color: var(--tinta); text-transform: lowercase;
}
.marca-adho b {
  font-weight: 400;
  transition: transform .38s cubic-bezier(.34,1.4,.5,1);
}
.logo:hover .marca-adho b { transform: translateY(-2.5px); }
.logo:hover .marca-adho b:nth-child(2) { transition-delay: .04s; }
.logo:hover .marca-adho b:nth-child(3) { transition-delay: .08s; }
.logo:hover .marca-adho b:nth-child(4) { transition-delay: .12s; }

/* En el footer, un poco más presente (30 px, como en la maqueta) */
.footer-marca .marca-adho { font-size: 30px; }
.footer-marca .logo { font-size: 0; }   /* no hay texto al lado */

@media (prefers-reduced-motion: reduce) {
  .marca-adho b { transition: none; }
  .logo:hover .marca-adho b { transform: none; }
}

/* ---------- Jerarquía tipográfica ----------
   Archivo Black solo existe en un peso. Pedirle 700 hace que el
   navegador la engorde a la fuerza y sale una mancha: por eso los
   titulares van con font-weight 400 y el grosor lo da la familia. */
h1, h2, h3, h4 { font-family: var(--titular); font-weight: 400; letter-spacing: -.04em; }
h4 { font-size: 1rem; letter-spacing: -.02em; }
strong, b { font-weight: 600; }

/* ---------- Paso 3: escribir la consulta ---------- */
.lienzo-consulta { max-width: 680px; margin: 0 auto; text-align: left; }
.lienzo-consulta .eyebrow, .lienzo-consulta .titulo-paso { text-align: center; }
.titulo-paso { font-size: clamp(1.9rem, 4.4vw, 3rem); margin-bottom: 8px; }
.sub-paso {
  text-align: center; color: var(--texto); font-size: 1.02rem;
  margin: 0 auto 32px; max-width: 520px; text-transform: none;
  font-family: var(--cuerpo); letter-spacing: normal;
}

/* La hoja de escribir la consulta: marco de tinta, como un formulario
   oficial. Antes tenía un hilo de aurora al enfocar; ahora el foco se
   marca engrosando el propio marco, que es más barato y más legible. */
.hoja {
  /* Blanca y con marco de tinta, como en la maqueta 4b: es la hoja
     donde se escribe, y tiene que destacar del papel del resto. */
  background: var(--papel-hoja);
  border: 1.5px solid var(--tinta); border-radius: var(--radio);
  padding: 0; position: relative;
  transition: border-color .2s ease;
}
.hoja:focus-within { border-color: var(--azul); }


/* La cabecera NO es una franja dentro de la hoja: es la fila de
   orejitas del expediente, y vive FUERA de ella (ver irPaso(3) en
   js/app.js).

   El truco son las tres últimas líneas. El margen negativo sube la
   fila 1.5 px, justo el grosor del marco, para que las pestañas se
   monten sobre el canto de la hoja; y el z-index las deja pintarse
   POR ENCIMA de ese marco, de modo que su propio fondo tapa el trozo
   de línea que queda debajo. Eso es lo que hace que la pestaña se vea
   "abierta" y unida a la hoja, como una carpeta de archivador. Sin el
   z-index, la hoja se pinta después y le cruza la raya por encima. */
.hoja-cabecera {
  display: flex; gap: 6px; flex-wrap: wrap; align-items: flex-end;
  padding: 0; background: transparent;
  position: relative; z-index: 1; margin-bottom: -1.5px;
}
/* La categoría y el subtema elegidos van como pestañas de archivador
   apoyadas sobre la línea de la cabecera, igual que las del header:
   sin borde abajo y hundidas 1px para que la línea les tape el canto.

   El SUBTEMA es la pestaña secundaria: papel hundido y borde suave.
   La CATEGORÍA manda, así que va en azul suave con el borde en tinta,
   como la carpeta que está abierta.

   (Historia: en agosto 2026 se pasaron a gris porque Luis los marcó
   como "muy gritones", y se devolvieron al azul de la maqueta ese
   mismo mes al comparar pantalla contra pantalla. Si se vuelve a
   proponer apagarlos, que sea explícito y se actualice esta nota.) */
.hoja-cabecera .pildora, .hoja-cabecera .pildora.oro {
  background: var(--papel-hundido); color: var(--texto);
  border: 1px solid var(--borde); border-bottom: none;
  border-radius: var(--radio-pestana); padding: 7px 14px 6px;
}
/* El `border` de arriba es un atajo, así que hay que repetir el
   border-bottom: none o la pestaña recupera su canto de abajo. */
.hoja-cabecera .pildora:first-child {
  background: var(--azul-suave); color: var(--azul-hover);
  border: 1.5px solid var(--tinta); border-bottom: none;
  padding: 8px 16px 7px;
}
.hoja-folio {
  margin-left: auto; font-family: var(--mono); font-size: .64rem;
  text-transform: uppercase; letter-spacing: .14em; color: var(--texto-suave);
  padding-bottom: 10px;
}
.hoja-cuerpo { padding: 4px 18px 0; }
.hoja textarea {
  border: none; background: transparent; padding: 6px 0 0; min-height: 168px;
  font-size: 1.12rem; line-height: 1.62; resize: none;
}
.hoja textarea:focus { outline: none; box-shadow: none; }
.hoja textarea::placeholder { color: var(--texto-tenue); }
.hoja-pie {
  display: flex; justify-content: space-between; align-items: center; gap: 12px; flex-wrap: wrap;
  border-top: 1px dashed var(--borde); margin-top: 10px; padding: 12px 18px;
}
.contador-suave {
  font-family: var(--mono); font-size: .68rem; color: var(--texto-suave);
  font-variant-numeric: tabular-nums;
}
.contador-suave.cerca { color: var(--alerta-texto); }

/* La línea separadora y el padding son de la HOJA de escribir la
   consulta, donde los bloques van apilados uno bajo otro. Fuera de
   ahí, `.bloque-campo` es solo una celda de formulario: si lleva
   borde, dentro de un grid de 2 columnas cada celda dibuja su propia
   rayita suelta y se ve como un error. */
.hoja .bloque-campo {
  border-top: 1px solid var(--borde); padding: 16px 18px 10px;
}
.bloque-campo label.campo:first-child { margin-top: 0; }
.bloque-campo .ayuda { margin-top: 5px; }

/* Selects de ubicación en cascada.

   La maqueta 4b los dibuja en DOS estados bien distintos: el que toca
   ahora con el borde en tinta sobre papel, y los que todavía no se
   pueden tocar con el borde suave, fondo hundido y el texto en gris.
   Esa diferencia es la que enseña el orden sin tener que leer la nota
   de abajo.

   Antes los apagados se hacían con `opacity: .5`, que no es lo mismo:
   emborrona el texto entero y lo deja muy por debajo del mínimo de
   contraste. Ahora cada estado lleva sus propios colores y los tres se
   leen. */
.ubigeo-fila { display: grid; grid-template-columns: 1fr; gap: 10px; }
@media (min-width: 620px) { .ubigeo-fila { grid-template-columns: repeat(3, 1fr); } }

.ubigeo-sel {
  /* 16px por lo mismo que arriba. Antes decía .95rem y, al ser una
     clase, le ganaba en especificidad a la regla de `select`: estos
     tres desplegables eran los únicos campos del sitio que seguían
     haciendo zoom en iPhone. */
  border-radius: 3px; font-size: 16px;
  border-color: var(--tinta);
  /* La flecha nativa la dibuja el sistema operativo, así que en Windows
     se veía como un control de Windows y en Mac como uno de Mac. Se
     apaga y se pone la nuestra: el mismo chevrón de línea que usa el
     resto del sitio, para que el formulario se vea igual en las dos. */
  -webkit-appearance: none; -moz-appearance: none; appearance: none;
  padding: 13px 36px 13px 14px;
  background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%233C3931' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M6 9l6 6 6-6'/%3E%3C/svg%3E");
  background-repeat: no-repeat;
  background-position: right 12px center;
  background-size: 13px;
}
/* El foco de los inputs recorta el padding para compensar el borde más
   grueso. Acá hay que repetirlo conservando el hueco de la flecha, o el
   texto se le mete debajo al elegir con el teclado. */
.ubigeo-sel:focus { padding: 12.5px 35.5px 12.5px 13.5px; }

/* OJO: más abajo hay un `select:disabled { background: #... }` en forma
   corta, y esa forma corta REINICIA repeat, position y size. Como
   `select:disabled` es más específico que `.ubigeo-sel`, se llevaba por
   delante el `no-repeat` de arriba y la flecha se dibujaba en mosaico.
   Por eso acá se repiten las tres: no es copia sobrante. */
.ubigeo-sel:disabled {
  opacity: 1; cursor: not-allowed;
  border-color: var(--borde);
  background-color: var(--papel-hundido);
  color: var(--texto-suave);
  background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%236E6A63' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M6 9l6 6 6-6'/%3E%3C/svg%3E");
  background-repeat: no-repeat;
  background-position: right 12px center;
  background-size: 13px;
}

/* Interruptor de anónimo */
.fila-anonimo {
  display: flex; align-items: center; justify-content: space-between; gap: 14px;
  border-top: 1px solid var(--borde); padding: 16px 18px;
}
.fila-anonimo .texto small { display: block; color: var(--texto-suave); font-size: .8rem; margin-top: 2px; font-weight: 400; }
.fila-anonimo .texto { font-size: .95rem; font-weight: 600; color: var(--tinta); }
.palanca { position: relative; width: 47px; height: 28px; flex: none; }
.palanca input { position: absolute; opacity: 0; width: 100%; height: 100%; margin: 0; cursor: pointer; z-index: 1; }
.palanca span {
  position: absolute; inset: 0; border-radius: 3px;
  background: var(--papel-hundido); border: 1px solid var(--borde);
  transition: background .2s, border-color .2s;
}
.palanca span::after {
  content: ""; position: absolute; top: 3px; left: 3px; width: 20px; height: 20px;
  border-radius: 2px; background: var(--tinta);
  transition: transform .2s ease, background .2s ease;
}
.palanca input:checked + span { background: var(--azul-tenue); border-color: var(--azul); }
.palanca input:checked + span::after { transform: translateX(19px); background: var(--azul); }
.palanca input:focus-visible + span { outline: 2px solid var(--azul); outline-offset: 2px; }

.pie-publicar { padding: 16px 18px 18px; border-top: 1px solid var(--borde); }
.pie-publicar .nota-legal { text-align: left; margin-top: 12px; }

/* ============================================================
   v6 — tamaño de iconos y responsive de verdad
   ============================================================ */

/* ---------- El candado gigante ----------
   Nuestros iconos son SVG en línea SIN atributos width/height.
   Un SVG así no mide nada por sí mismo: se estira hasta ocupar
   todo el ancho disponible. Por eso el candado del pie medía
   600 px. Esta regla les da un tamaño por defecto ligado al
   texto que los rodea; las reglas con clase que ya existen
   (.icat svg, .pildora svg, etc.) siguen mandando sobre ella. */
svg { width: 1em; height: 1em; vertical-align: -.14em; }
.nota-legal svg, .ayuda svg { width: 13px; height: 13px; margin-right: 5px; vertical-align: -2px; opacity: .8; }
.btn svg { width: 16px; height: 16px; vertical-align: 0; flex: none; }
.btn-social svg { width: 18px; height: 18px; }
.num-grande svg { width: auto; height: auto; }

/* ---------- Nada de scroll horizontal ----------
   Usamos `clip` y no `hidden`: `overflow-x: hidden` en el body crea
   un contenedor de scroll y rompe el `position: sticky` del header.
   `clip` recorta sin crear ese contenedor. */
body { max-width: 100%; overflow-x: clip; }
.hero-inicio { overflow: hidden; }
p, h1, h2, h3, .tc-texto, .nombre, .detalle { overflow-wrap: anywhere; }

/* ---------- Celular (hasta 719 px) ----------
   Las maquetas son 1440 px fijo y no traen móvil. Estas reglas son la
   traducción, y cada una responde a un problema concreto de la
   dirección retro en una pantalla angosta. */
@media (max-width: 719px) {
  .contenedor, .contenedor-angosto { padding: 0 16px; }

  /* Header. Las pestañas de archivador no caben once en 375 px, así que
     la fila se vuelve una tira que se desliza en horizontal. El logo NO
     entra en la tira: se queda fijo a la izquierda, porque es el botón
     de volver al inicio y tiene que estar siempre en el mismo sitio. */
  .header-inner { padding: 12px 14px 0; gap: 4px; flex-wrap: nowrap; }
  .logo { padding: 8px 14px 7px; margin-right: 4px; font-size: 1.05rem; flex: none; }
  .marca-adho { font-size: 17px; }
  .nav {
    /* `flex: none` también AQUÍ, no solo en los enlaces.
       El header tiene dos <nav> (secciones y sesión) y los dos son
       hijos flex de .header-inner: se encogían como bloque y aplastaban
       las pestañas de dentro. Poner flex:none solo en los enlaces no
       bastaba, porque el contenedor seguía comprimiéndose. */
    flex: none;
    gap: 4px; flex-wrap: nowrap; overflow-x: auto;
    scrollbar-width: none; -ms-overflow-style: none;
    /* padding-bottom + margin-bottom negativos: deja sitio para que la
       pestaña sobresalga sin que la barra de scroll la recorte. */
    padding-bottom: 6px; margin-bottom: -6px;
  }
  .nav::-webkit-scrollbar { display: none; }
  /* Las pestañas medían 26 px de alto. Apple pide 44 y Google 48 para
     algo que se toca con el pulgar; a 26 px la gente falla y toca la de
     al lado. Se sube el padding vertical hasta ~40 px, que es lo máximo
     que se puede sin que el header se coma media pantalla. El ancho no
     se toca: la tira ya se desliza en horizontal. */
  .nav a, .nav span {
    font-size: .64rem; padding: 13px 11px 12px; white-space: nowrap; letter-spacing: .1em;
    display: inline-flex; align-items: center; min-height: 40px;
    /* `flex: none` es LO IMPORTANTE de esta regla.
       La tira es un flex, y por defecto un hijo flex SE ENCOGE cuando
       no hay sitio. Con `white-space: nowrap`, encogerse no parte el
       texto en dos líneas: lo recorta. Por eso "Soy abogado" salía como
       "SOY" en un iPhone de 375 px — no era el scroll, era que la
       pestaña se comprimía hasta la mitad de su ancho y parecía rota.
       El `.logo` ya lo tenía; a las pestañas se les había olvidado.
       Con esto cada pestaña mide lo que mide y la tira se desliza, que
       era la idea desde el principio. */
    flex: none;
  }
  .logo { min-height: 40px; display: inline-flex; align-items: center; }
  /* Las dos filas se juntan en una sola tira: en celular no hay ancho
     para separar "secciones" de "sesión". */
  .nav-der { margin-left: 0; }
  .header-inner { overflow-x: auto; scrollbar-width: none; }
  .header-inner::-webkit-scrollbar { display: none; }

  /* La cinta corre a la mitad de velocidad: en una pantalla angosta el
     texto pasa mucho más rápido en proporción y no da tiempo a leerlo. */
  .cinta-tit-pista { animation-duration: 46s; font-size: .62rem; letter-spacing: .14em; }
  .cinta-titulares { padding: 7px 0; }

  /* Hero: menos aire, título que no se desborda */
  .hero-inicio { min-height: auto; padding: 44px 16px 60px; }
  .hero-sub { font-size: .98rem; }
  .eyebrow { font-size: .64rem; letter-spacing: .14em; margin-bottom: 14px; }
  .scroll-cue { position: static; transform: none; margin-top: 34px; }

  /* Categorías. En desktop son dos filas de un archivador; en 375 px
     eso no se lee, así que pasan a UNA COLUMNA a lo ancho. Se pierde la
     silueta de carpeta pero se gana poder tocarlas: un objetivo de 44 px
     de alto es el mínimo que recomienda Apple, y una pestaña de 32 px
     con letra de 11 px no lo cumple. */
  .carpetas { margin-top: 34px; }
  .carpetas-arriba { border-bottom: none; }
  .carpetas-fila { flex-direction: column; gap: 0; margin-top: 0; }
  .carpeta {
    width: 100%; text-align: left; padding: 15px 16px;
    border-radius: 0 !important; transform: none !important;
    border: 1px solid var(--borde); border-bottom: none;
    font-size: .74rem;
  }
  /* Solo la última de todo el bloque lleva borde abajo y redondea:
     si cada fila lo llevara, se verían líneas dobles entre carpetas. */
  .carpetas-abajo .carpeta:last-child { border-bottom: 1px solid var(--borde); border-radius: 0 0 6px 6px !important; }
  .carpetas-arriba .carpeta:first-child { border-radius: 6px 6px 0 0 !important; }
  .carpetas-abajo:empty + * { display: none; }
  .carpeta:hover, .carpeta-arriba:hover, .carpeta-abajo:hover { transform: none !important; }
  .icat { width: 22px; height: 22px; }
  .icat svg { width: 12px; height: 12px; }

  /* Secciones y tarjetas */
  .seccion { padding: 56px 0 0; }
  .seccion p.sub-seccion { margin-bottom: 30px; }
  .tarjeta { padding: 20px; }
  .tarjeta-paso, .tarjeta-precio { padding: 26px 20px; }
  .tarjeta-paso .num-grande { font-size: 2rem; }
  .tarjeta-precio .precio { font-size: 2.3rem; }
  .bento-oscuro { padding: 36px 22px; }

  /* Formularios: 16 px evita que iPhone haga zoom al enfocar un campo */
  input[type=text], input[type=email], input[type=password], input[type=tel],
  input[type=number], select, textarea { font-size: 16px; padding: 12px 14px; }
  /* Solo los bloques DE LA HOJA llevan este padding lateral. Fuera de
     ella, `.bloque-campo` es una celda suelta y no debe sangrarse. */
  /* `.hoja-cabecera` ya NO va aquí: ahora vive fuera de la hoja y sus
     pestañas tienen que arrancar en el mismo canto izquierdo que ella.
     Con el sangrado de 14 px quedaban flotando hacia dentro. */
  .hoja-cuerpo, .hoja-pie, .hoja .bloque-campo,
  .fila-anonimo, .pie-publicar { padding-left: 14px; padding-right: 14px; }
  .hoja textarea { font-size: 16px; min-height: 150px; }
  /* El folio pasa ARRIBA de las pestañas: si quedara debajo, las
     pestañas ya no tocarían la línea de la cabecera y flotarían. */
  .hoja-folio { width: 100%; margin-left: 0; order: -1; padding: 0 0 6px; text-align: right; }
  .titulo-paso { font-size: clamp(1.6rem, 7.5vw, 2.1rem); }
  .sub-paso { font-size: .93rem; }
  .hoja-pie { flex-direction: column; align-items: flex-start; gap: 6px; }
  .form-numerado .form-seccion h3 { font-size: 1.15rem; }
  .form-numerado .form-seccion h3::before { font-size: 1.2rem; }

  /* Botones a lo ancho: el pulgar agradece */
  .btn { width: 100%; padding: 15px 20px; }
  .btn-chico { width: auto; }
  .hero .mt-24 .btn, .bento-oscuro .btn { margin: 6px 0 0; }

  /* Consultas y hub */
  .filtros-barra { justify-content: flex-start; flex-wrap: nowrap; overflow-x: auto; margin: 20px -16px; padding: 0 16px 4px; scrollbar-width: none; }
  .filtros-barra::-webkit-scrollbar { display: none; }
  .filtros-barra .chip { white-space: nowrap; flex: none; }
  .tarjeta-consulta { padding: 18px; }
  .tc-meta { font-size: .66rem; gap: 6px; }
  .tc-pie { flex-direction: column; align-items: stretch; gap: 10px; }
  .tc-pie .btn { width: 100%; }
  .layout-hub { gap: 16px; margin-top: 20px; }
  .panel-lateral { padding: 18px; }

  /* Perfil */
  .cabecera-perfil { gap: 14px; }
  .avatar-grande { width: 64px; height: 64px; font-size: 1.2rem; }
  /* Los datos del abogado pasan a dos columnas con líneas entre medio,
     como una tabla de expediente. */
  .stats { flex-wrap: wrap; }
  .stat { min-width: 50%; flex: none; padding: 13px 16px; }
  .stat:nth-child(2n) { border-left: 1px solid var(--borde); }
  .stat:nth-child(n+3) { border-top: 1px solid var(--borde); }
  .stat + .stat { border-left: none; }
  .stat:nth-child(2n) { border-left: 1px solid var(--borde); }
  .caja-respuesta { padding: 20px 18px; }

  /* Modal: sube desde abajo, pegado al borde inferior */
  .modal-fondo { align-items: flex-end; padding: 0; }
  .modal { max-width: 100%; border-radius: var(--radio) var(--radio) 0 0; padding: 24px 20px 28px; max-height: 94vh; }
  .tab { font-size: .62rem; padding: 10px 4px 9px; }

  /* Footer: la carpeta azul se mete solo 14 px por lado, si no en un
     celular queda una tira azul flaquísima en el centro. */
  .footer { margin: 60px 14px 0; padding: 36px 22px 0; border-radius: 14px 14px 0 0; }
  .footer-grid { gap: 24px; }
  .footer-legal { margin-top: 30px; }
  .footer-sello { margin: 26px -22px 0; height: 78px; }
}

/* ---------- Pantallas muy angostas (iPhone SE, 320-374 px) ---------- */
@media (max-width: 374px) {
  .carpeta { font-size: .7rem; padding: 14px 13px; }
  .nav a, .nav span { font-size: .6rem; padding: 6px 9px 5px; }
  .logo { font-size: .95rem; padding: 7px 12px 6px; }
  .stat { min-width: 100%; border-left: none !important; }
  .stat + .stat { border-top: 1px solid var(--borde); }
}

/* ---------- Tablet vertical ---------- */
@media (min-width: 720px) and (max-width: 859px) {
  .layout-hub { gap: 20px; }
  /* A este ancho caben 3 arriba y el resto colgando: con 6 arriba la
     fila envuelve y se pierde la línea que las sostiene. */
  .carpetas { max-width: 660px; }
  .carpeta { font-size: .68rem; padding: 11px 14px 10px; }
}
.btn svg { width: 16px; height: 16px; }
.form-seccion h3 svg { width: 18px; height: 18px; color: var(--primario); }
.banner-exito > svg { width: 21px; height: 21px; flex: none; margin-top: 2px; }
.zona-archivo svg { width: 17px; height: 17px; vertical-align: -3.5px; margin-right: 4px; }
.cabecera-abogado .detalle svg, .texto-suave svg { width: 13px; height: 13px; vertical-align: -2px; }

/* ============================================================
   v7 — Páginas legales (/legal/)
   Son la única excepción a las "páginas cascarón": el texto va
   escrito en el HTML para que se lea sin JavaScript.
   Prosa cómoda de leer: medida corta, buen interlineado.
   ============================================================ */
.prosa-legal { padding: 34px 22px 20px; max-width: 760px; }
.prosa-legal h1 { font-size: clamp(1.8rem, 4.5vw, 2.5rem); letter-spacing: -.03em; line-height: 1.1; margin-top: 18px; }
.prosa-legal .legal-meta { color: var(--texto-suave); font-size: .86rem; margin-top: 8px; }
.prosa-legal h2 {
  font-size: 1.28rem; margin-top: 44px; padding-top: 22px;
  border-top: 1px solid var(--borde); letter-spacing: -.02em;
}
.prosa-legal h3 { font-size: 1.04rem; margin-top: 26px; color: var(--navy-claro); }
.prosa-legal p { margin-top: 13px; color: #3a3a3f; }
.prosa-legal ul, .prosa-legal ol { margin: 13px 0 0 1.15rem; color: #3a3a3f; }
.prosa-legal li { margin-top: 7px; }
.prosa-legal li > ul { margin-top: 6px; }
.prosa-legal strong { color: var(--texto); }
.prosa-legal code {
  background: var(--papel-hundido); padding: 1px 6px; border-radius: 6px;
  font-size: .88em; font-family: ui-monospace, SFMono-Regular, Menlo, monospace;
}
.prosa-legal blockquote {
  margin-top: 18px; padding: 16px 20px; border-left: 3px solid var(--primario);
  background: var(--ambar-suave); border-radius: 0 14px 14px 0;
}
.prosa-legal blockquote p { margin-top: 8px; }
.prosa-legal blockquote p:first-child { margin-top: 0; }

/* Tablas: en celular se desplazan solas en vez de romper la página */
.tabla-envoltura { overflow-x: auto; margin-top: 18px; -webkit-overflow-scrolling: touch; }
.prosa-legal table { border-collapse: collapse; width: 100%; min-width: 420px; font-size: .92rem; }
.prosa-legal th, .prosa-legal td { text-align: left; padding: 11px 14px; border-bottom: 1px solid var(--borde); vertical-align: top; }
.prosa-legal thead th { background: var(--papel-hundido); font-weight: 600; white-space: nowrap; }
.prosa-legal tbody tr:last-child td { border-bottom: none; }

/* Los datos que solo Luis puede llenar. Imposibles de no ver. */
.pendiente {
  background: #fff3b0; color: #6b4e00; padding: 1px 6px; border-radius: 5px;
  font-weight: 600; box-shadow: inset 0 0 0 1px rgba(180,140,0,.35);
}
.aviso-borrador {
  margin-top: 22px; padding: 15px 18px; border-radius: var(--radio);
  background: var(--ambar-suave); color: #6b4e00;
  border: 1px dashed rgba(180,140,0,.45); font-size: .9rem; line-height: 1.5;
}

/* ---------- Constancia del Libro de Reclamaciones ---------- */
.constancia { text-align: center; padding: 38px 28px; margin-top: 26px; }
.numero-constancia {
  margin: 20px auto 6px; display: inline-block;
  font-family: ui-monospace, SFMono-Regular, Menlo, monospace;
  font-size: clamp(1.3rem, 5vw, 1.9rem); font-weight: 700; letter-spacing: .04em;
  color: var(--navy); background: var(--navy-suave);
  padding: 12px 22px; border-radius: var(--radio);
}
.datos-constancia {
  display: grid; grid-template-columns: auto 1fr; gap: 8px 18px;
  text-align: left; margin: 22px auto 20px; max-width: 420px; font-size: .92rem;
}
.datos-constancia dt { color: var(--texto-suave); }
.datos-constancia dd { color: var(--texto); margin: 0; }

@media (max-width: 719px) {
  .prosa-legal { padding: 24px 16px 16px; }
  .prosa-legal h2 { font-size: 1.16rem; margin-top: 34px; }
  .datos-constancia { grid-template-columns: 1fr; gap: 2px; }
  .datos-constancia dd { margin-bottom: 10px; }
}

/* ============================================================
   v8 — Compra de créditos
   ============================================================ */

/* Saldo grande en la pantalla de compra */
/* Ficha de la billetera. Antes era una caja azul redondeada: eso es de
   la dirección anterior. Ahora es papel con marco de tinta y esquinas
   rectas, para que cuelgue de su pestaña como las fichas de precio. */
.saldo-actual {
  display: flex; align-items: center; gap: 14px;
  padding: 16px 20px; border-radius: 0;
  background: var(--papel); border: 1.5px solid var(--tinta); color: var(--tinta);
}
.saldo-actual svg { width: 26px; height: 26px; flex: none; color: var(--azul); }
.saldo-actual .etiqueta {
  font-family: var(--mono); font-size: .66rem; color: var(--texto-suave);
  letter-spacing: .14em; text-transform: uppercase;
}
.saldo-actual .valor { font-family: var(--titular); font-size: 1.5rem; letter-spacing: -.04em; margin-top: 3px; }

/* Chip de saldo en el panel del hub */
.chip-saldo {
  display: flex; align-items: center; gap: 8px; margin-top: 10px;
  padding: 9px 13px; border-radius: var(--radio); font-size: .84rem;
  background: var(--papel-hundido); color: var(--texto-suave);
}
.chip-saldo.con-saldo { background: var(--verde-suave); color: var(--verde-texto); font-weight: 600; }
.chip-saldo svg { width: 16px; height: 16px; flex: none; }

.comprar-suave {
  display: inline-block; margin-top: 10px; font-size: .84rem;
  color: var(--navy-claro); border-bottom: 1px solid transparent;
}
.comprar-suave:hover { text-decoration: none; border-bottom-color: currentColor; }

/* Aviso del Anexo III. Sobrio a propósito: es un aviso legal, no
   una promoción, y tiene que verse sin competir con los precios. */
.aviso-anexo3 { background: var(--papel-hundido); border: 1px solid var(--borde); }
.aviso-anexo3 h3 {
  display: flex; align-items: center; gap: 9px;
  font-size: 1rem; letter-spacing: -.01em; margin-bottom: 8px;
}
.aviso-anexo3 h3 svg { width: 19px; height: 19px; color: var(--navy-claro); flex: none; }
.aviso-anexo3 p { font-size: .89rem; color: var(--texto-suave); line-height: 1.55; }

/* ============================================================
   v9 — Ventanas propias (reemplazan alert y confirm)
   Nunca usamos los diálogos del navegador: Chrome suprime los
   confirm() repetidos y devuelve false sin avisar, lo que hacía
   que el botón de reclamar no hiciera nada.
   ============================================================ */
.modal-dialogo { max-width: 420px; text-align: center; padding: 32px 28px 26px; }
.modal-dialogo .sello-correo { margin-bottom: 2px; }
.modal-dialogo h2 { font-size: 1.24rem; letter-spacing: -.022em; }
.cuerpo-dialogo { margin-top: 10px; color: var(--texto-suave); font-size: .94rem; line-height: 1.6; }
.cuerpo-dialogo p { margin-top: 8px; }
.cuerpo-dialogo strong { color: var(--texto); font-weight: 600; }

.acciones-dialogo { display: flex; gap: 10px; margin-top: 24px; }
.acciones-dialogo .btn { flex: 1; padding: 12px 18px; font-size: .94rem; }

/* Entrada: el fondo aparece y la tarjeta sube un poco. Da la
   sensación de que la ventana pertenece a la página, que es
   justo lo que un diálogo del navegador nunca logra. */
.modal-propio.abierto { animation: fondo-entra .2s ease; }
.modal-propio .modal-dialogo { animation: dialogo-entra .3s cubic-bezier(.2,.9,.3,1); }
@keyframes fondo-entra { from { opacity: 0; } to { opacity: 1; } }
@keyframes dialogo-entra {
  from { opacity: 0; transform: translateY(14px) scale(.97); }
  to   { opacity: 1; transform: none; }
}

@media (max-width: 480px) {
  .modal-dialogo { padding: 26px 20px 20px; }
  /* En celular los botones apilados se tocan mejor, y el principal
     va arriba para que quede bajo el pulgar. */
  .acciones-dialogo { flex-direction: column-reverse; gap: 8px; }
}

@media (prefers-reduced-motion: reduce) {
  .modal-propio.abierto, .modal-propio .modal-dialogo { animation: none; }
}

/* ============================================================
   v10 — Verificación del abogado
   Regla: sin verificar entra y mira, pero no reclama.
   ============================================================ */

/* Panel lateral del hub: el cupo, el saldo y el botón de comprar
   iban sueltos y quedaban pegados a "Tus especialidades". Ahora
   son un bloque con su propio aire. */
.bloque-billetera {
  display: flex; flex-direction: column; gap: 10px;
  margin: 16px 0 22px; padding-bottom: 20px;
  border-bottom: 1px solid var(--borde);
}
.bloque-billetera .cupo,
.bloque-billetera .chip-saldo { margin: 0; }
.bloque-billetera .btn { margin: 2px 0 0; }
.bloque-billetera .comprar-suave { margin: 0; }
.panel-lateral h3 { margin-top: 22px; }
.panel-lateral h3:first-of-type { margin-top: 0; }

/* Chip "En verificación" del panel */
.badge-pendiente {
  display: inline-flex; align-items: center; gap: 5px;
  background: var(--ambar-suave); color: #8a5c10;
  padding: 3px 10px; border-radius: 3px;
  font-size: .78rem; font-weight: 600;
}
.badge-pendiente:hover { text-decoration: none; background: #fbecd0; }
.badge-pendiente svg { width: 13px; height: 13px; }
.nav .nav-aviso { background: var(--alerta-suave); color: var(--alerta-texto); font-weight: 600; }

/* Banner de arriba del hub. Antes traía colores mostaza escritos a
   mano y rellenos rgba del diseño viejo: ahora todo sale de :root. */
.banner-verificacion {
  display: flex; align-items: center; gap: 16px; flex-wrap: wrap;
  background: var(--papel); border: 1px solid var(--alerta);
  border-left-width: 3px;
  border-radius: var(--radio); padding: 18px 20px; margin-bottom: 24px;
}
.banner-verificacion .icono {
  width: 42px; height: 42px; border-radius: 50%; flex: none;
  display: inline-flex; align-items: center; justify-content: center;
  background: var(--alerta-suave); color: var(--alerta-texto);
}
.banner-verificacion .icono svg { width: 21px; height: 21px; }
.banner-verificacion > div:nth-child(2) { flex: 1; min-width: 200px; }
.banner-verificacion strong { color: var(--tinta); }
.banner-verificacion p { color: var(--texto); font-size: .88rem; margin-top: 3px; }
.banner-verificacion .btn { flex: none; }

/* Las reglas del hub: numeradas como expediente (01, 02, 03) y en
   letra de cuerpo. Antes era un párrafo en .ayuda, mono y en
   MAYÚSCULAS: tres frases así no se leen (queja de Luis). */
.reglas-hub { list-style: none; margin: 8px 0 0; padding: 0; counter-reset: regla; }
.reglas-hub li {
  counter-increment: regla; position: relative;
  padding: 9px 0 9px 32px; font-size: .9rem; color: var(--texto);
  line-height: 1.5; border-top: 1px solid var(--borde);
}
.reglas-hub li:first-child { border-top: none; }
.reglas-hub li::before {
  content: "0" counter(regla);
  position: absolute; left: 0; top: 11px;
  font-family: var(--mono); font-size: .68rem; letter-spacing: .08em;
  color: var(--texto-suave);
}
/* La estrella de calificación del perfil, antes un color inline */
.stat .valor-estrella { color: var(--alerta-texto); }
/* Y la del archivo público, misma historia */
.estrella-archivo { color: var(--alerta-texto); font-weight: 700; }

/* La tarjeta de la consulta que YA es del abogado: lomo naranja */
.tarjeta-consulta.tc-mia { border-left: 3px solid var(--alerta); }

/* Línea de pasos del trámite */
.linea-pasos { list-style: none; margin: 0; padding: 0; }
.linea-pasos li {
  display: flex; gap: 16px; padding: 0 0 24px 0; position: relative;
}
/* La línea que une los pasos. No se dibuja en el último. */
.linea-pasos li:not(:last-child)::before {
  content: ""; position: absolute; left: 15px; top: 34px; bottom: 4px;
  width: 2px; background: var(--borde);
}
.linea-pasos li.paso-hecho:not(:last-child)::before { background: var(--verde); opacity: .35; }
.marca-paso {
  width: 32px; height: 32px; border-radius: 50%; flex: none; z-index: 1;
  display: inline-flex; align-items: center; justify-content: center;
  font-size: .85rem; font-weight: 700;
  background: var(--papel); border: 2px solid var(--borde); color: var(--texto-suave);
}
.marca-paso svg { width: 15px; height: 15px; }
.paso-hecho .marca-paso { background: var(--verde-suave); border-color: var(--verde); color: var(--verde-texto); }
.paso-actual .marca-paso { background: var(--navy); border-color: var(--navy); color: var(--papel); }
.paso-fallo .marca-paso { background: var(--rojo-suave); border-color: var(--rojo); color: var(--rojo); }
.linea-pasos strong { font-size: .98rem; }
.linea-pasos p { color: var(--texto-suave); font-size: .88rem; margin-top: 2px; }
.paso-pendiente strong, .paso-pendiente p { opacity: .55; }

/* Qué puede y qué no mientras espera */
.lista-permisos { list-style: none; margin: 12px 0 0; padding: 0; }
.lista-permisos li {
  display: flex; align-items: flex-start; gap: 9px;
  font-size: .9rem; padding: 6px 0; color: var(--texto-suave);
}
.lista-permisos svg { width: 15px; height: 15px; flex: none; margin-top: 3px; }
.lista-permisos li.si svg { color: var(--verde-texto); }
.lista-permisos li.no svg { color: var(--rojo); }

.lista-intentos { list-style: none; margin: 12px 0 0; padding: 0; }
.lista-intentos li { padding: 10px 0; border-top: 1px solid var(--borde); font-size: .9rem; }
.lista-intentos li:first-child { border-top: none; }

.acciones-revision { display: flex; gap: 10px; justify-content: center; flex-wrap: wrap; }

@media (max-width: 719px) {
  .banner-verificacion { padding: 16px; gap: 12px; }
  .banner-verificacion .btn { width: 100%; }
  .acciones-revision .btn { width: 100%; }
  .linea-pasos li { gap: 12px; padding-bottom: 20px; }
}


/* ============================================================
   v11 — Editar perfil
   ============================================================ */
.acciones-perfil { display: flex; gap: 10px; flex-wrap: wrap; }
.acciones-perfil .btn { flex: 1 1 auto; min-width: 180px; }

/* Sección con los datos que ya no se pueden tocar */
.seccion-bloqueada { opacity: .72; }
.seccion-bloqueada input:disabled,
.seccion-bloqueada select:disabled {
  background: #f2f2f5; color: var(--texto-suave); cursor: not-allowed;
}
.pildora-candado {
  display: inline-flex; align-items: center; gap: 5px; vertical-align: middle;
  margin-left: 8px; padding: 3px 10px; border-radius: 3px;
  background: var(--papel-hundido); color: var(--texto-suave);
  font-size: .72rem; font-weight: 600; letter-spacing: .01em;
}
.pildora-candado svg { width: 12px; height: 12px; }

/* Cualquier campo deshabilitado del sitio, no solo los del perfil.
   `background-color` y NO el atajo `background`: el atajo reinicia
   repeat, position y size, y eso rompía la flecha de los selects de
   ubicación. Además el gris frío de antes (#f2f2f5) no era de la
   paleta: sobre papel cálido se veía como un parche azulado. */
input:disabled, select:disabled, textarea:disabled {
  background-color: var(--papel-hundido); color: var(--texto-suave); cursor: not-allowed;
}
.ayuda svg { vertical-align: -2px; }

@media (max-width: 560px) {
  .acciones-perfil { flex-direction: column; }
  .acciones-perfil .btn { width: 100%; min-width: 0; }
  .pildora-candado { margin-left: 0; margin-top: 6px; }
  .form-seccion h3 { display: flex; flex-wrap: wrap; align-items: center; }
}

/* ============================================================
   v12 — Historial de compras y créditos
   ============================================================ */
.titulo-bloque { font-size: 1.12rem; letter-spacing: -.02em; margin: 34px 0 14px; }

/* Tres datos de resumen arriba */
.grid-resumen { display: grid; grid-template-columns: 1fr; gap: 12px; margin-top: 24px; }
@media (min-width: 620px) { .grid-resumen { grid-template-columns: repeat(3, 1fr); } }
.tarjeta-dato {
  background: var(--papel); border: 1px solid var(--borde); border-radius: var(--radio);
  padding: 18px 20px; box-shadow: none;
}
.tarjeta-dato .etiqueta { font-size: .74rem; letter-spacing: .07em; text-transform: uppercase; color: var(--texto-suave); }
.tarjeta-dato .valor { font-size: 1.7rem; font-weight: 700; letter-spacing: -.03em; margin-top: 4px; line-height: 1.1; }
.tarjeta-dato .pie { font-size: .82rem; color: var(--texto-suave); margin-top: 2px; }
.tarjeta-dato.destacado { background: var(--navy-suave); border-color: transparent; }
.tarjeta-dato.destacado .valor { color: var(--navy); }

/* Una compra */
.fila-compra {
  display: flex; align-items: flex-start; gap: 14px;
  background: var(--papel); border: 1px solid var(--borde); border-radius: var(--radio);
  padding: 16px 18px; margin-bottom: 10px;
}
.fc-icono {
  width: 38px; height: 38px; border-radius: var(--radio); flex: none;
  display: inline-flex; align-items: center; justify-content: center;
  background: var(--navy-suave); color: var(--navy-claro);
}
.fc-icono svg { width: 19px; height: 19px; }
.fc-centro { flex: 1; min-width: 0; }
.fc-titulo { font-weight: 600; letter-spacing: -.01em; }
.fc-detalle { font-size: .82rem; color: var(--texto-suave); margin-top: 2px; word-break: break-word; }
.fc-detalle code {
  background: var(--papel-hundido); padding: 1px 5px; border-radius: 5px;
  font-family: ui-monospace, SFMono-Regular, Menlo, monospace; font-size: .92em;
}
.fc-aviso { font-size: .8rem; color: var(--ambar); margin-top: 4px; }
.fc-derecha { text-align: right; flex: none; display: flex; flex-direction: column; align-items: flex-end; gap: 3px; }
.fc-monto { font-weight: 700; font-size: 1.05rem; letter-spacing: -.02em; }
.fc-creditos { font-size: .8rem; color: var(--verde-texto); font-weight: 600; }

/* El libro mayor */
.fila-mov {
  display: flex; align-items: center; gap: 14px;
  padding: 13px 0; border-top: 1px solid var(--borde);
}
.fila-mov:first-child { border-top: none; }
.fila-mov > div:first-child { flex: 1; min-width: 0; }
.fm-tipo { font-weight: 600; font-size: .92rem; }
.fm-motivo { font-size: .8rem; color: var(--texto-suave); margin-top: 1px; }
.fm-cantidad {
  font-weight: 700; font-size: 1.05rem; flex: none; min-width: 42px; text-align: right;
  font-variant-numeric: tabular-nums;
}
.fm-cantidad.suma { color: var(--verde-texto); }
.fm-cantidad.resta { color: var(--rojo); }
.fm-saldo { font-size: .78rem; color: var(--texto-suave); flex: none; min-width: 66px; text-align: right; }

@media (max-width: 560px) {
  /* En celular la compra se apila: el monto va debajo, no apretado al lado */
  .fila-compra { flex-wrap: wrap; }
  .fc-derecha { flex-direction: row; align-items: center; gap: 10px; width: 100%;
                margin-top: 4px; padding-left: 52px; justify-content: flex-start; text-align: left; }
  .fm-saldo { display: none; }
  .saldo-actual { flex-wrap: wrap; }
  .saldo-actual .btn { margin-left: 0 !important; width: 100%; margin-top: 10px; }
}

/* La línea de pasos, dentro de su tarjeta.
   Antes iba suelta en el contenedor: los círculos quedaban pegados al
   borde, desalineados de la tarjeta de arriba, y el último paso sin
   aire abajo. */
.caja-pasos { padding: 24px 26px 8px; }
.titulo-pasos { font-size: .78rem; letter-spacing: .09em; text-transform: uppercase;
                color: var(--texto-suave); margin-bottom: 20px; }
.caja-pasos .linea-pasos li:last-child { padding-bottom: 18px; }

@media (max-width: 560px) {
  .caja-pasos { padding: 20px 18px 6px; }
}

/* ============================================================
   v13 — Panel del equipo (/admin)
   Sobrio a propósito: es una herramienta de trabajo, no una
   vitrina. Nada compite con los números.
   ============================================================ */
.nav .nav-equipo { background: var(--navy); color: var(--papel); font-weight: 600; }
.nav .nav-equipo:hover { background: #0d1e38; }

.cabecera-admin {
  display: flex; align-items: flex-start; justify-content: space-between;
  gap: 16px; flex-wrap: wrap; margin-bottom: 22px;
}
.cabecera-admin h1 { font-size: clamp(1.5rem, 4vw, 2rem); letter-spacing: -.03em; }
.pildora-admin {
  display: inline-flex; align-items: center; gap: 6px; flex: none;
  background: var(--navy-suave); color: var(--navy); padding: 6px 13px;
  border-radius: 3px; font-size: .78rem; font-weight: 600;
}
.pildora-admin svg { width: 13px; height: 13px; }

/* Pestañas. En celular se desplazan en lugar de amontonarse. */
.pestanas-admin {
  display: flex; gap: 4px; border-bottom: 1px solid var(--borde);
  margin-bottom: 26px; overflow-x: auto; scrollbar-width: none;
}
.pestanas-admin::-webkit-scrollbar { display: none; }
.pestana {
  background: none; border: none; font-family: inherit; cursor: pointer;
  font-size: .92rem; font-weight: 600; color: var(--texto-suave);
  padding: 11px 16px; border-bottom: 2px solid transparent; white-space: nowrap;
  transition: color .18s ease, border-color .18s ease;
}
.pestana:hover { color: var(--texto); }
.pestana.activa { color: var(--navy); border-bottom-color: var(--navy); }

/* El indicador que más importa */
.indicador { padding: 22px 24px; }
.indicador .ind-cabeza { display: flex; align-items: flex-start; justify-content: space-between; gap: 18px; flex-wrap: wrap; }
.ind-valor { font-size: 2.6rem; font-weight: 700; letter-spacing: -.04em; line-height: 1; margin-top: 4px; }
.ind-nota { font-size: .88rem; color: var(--texto-suave); max-width: 280px; text-align: right; }
.indicador .barra { height: 8px; border-radius: 3px; background: var(--papel-hundido); margin: 18px 0 12px; overflow: hidden; }
.indicador .barra span { display: block; height: 100%; border-radius: 3px; transition: width .8s cubic-bezier(.2,.8,.2,1); }
.indicador.bien   .ind-valor { color: var(--verde-texto); }
.indicador.bien   .barra span { background: var(--verde); }
.indicador.ojo    .ind-valor { color: var(--ambar); }
.indicador.ojo    .barra span { background: var(--ambar); }
.indicador.mal    .ind-valor { color: var(--rojo); }
.indicador.mal    .barra span { background: var(--rojo); }
.indicador.neutro .ind-valor { color: var(--texto-suave); }
.indicador.neutro .barra span { background: var(--texto-suave); }

.grid-mini { display: grid; grid-template-columns: repeat(auto-fit, minmax(150px, 1fr)); gap: 10px; }
.mini-dato { background: var(--papel); border: 1px solid var(--borde); border-radius: var(--radio); padding: 14px 16px; }
.mini-dato.alerta { border-color: rgba(183,121,31,.45); background: var(--ambar-suave); }
.md-valor { font-size: 1.5rem; font-weight: 700; letter-spacing: -.03em; line-height: 1; }
.md-etiqueta { font-size: .82rem; font-weight: 600; margin-top: 5px; }
.md-pie { font-size: .75rem; color: var(--texto-suave); margin-top: 1px; }

/* Ficha de verificación */
.ficha-verif { margin-bottom: 14px; }
.fv-cabeza { display: flex; align-items: center; gap: 14px; margin-bottom: 16px; }
.fv-cabeza h3 { font-size: 1.08rem; letter-spacing: -.02em; }
.fv-cabeza p { font-size: .84rem; margin-top: 2px; }
.datos-verif {
  display: grid; grid-template-columns: auto 1fr; gap: 7px 18px;
  font-size: .9rem; margin-bottom: 14px;
}
.datos-verif dt { color: var(--texto-suave); }
.datos-verif dd { margin: 0; }
.fila-docs { display: flex; gap: 8px; flex-wrap: wrap; margin-top: 14px; }
.acciones-verif { display: flex; gap: 10px; margin-top: 20px; }
.acciones-verif .btn { flex: 1; }

/* Tabla de ventas */
.tabla-admin { border-collapse: collapse; width: 100%; min-width: 780px; font-size: .88rem; }
.tabla-admin th, .tabla-admin td { text-align: left; padding: 11px 13px; border-bottom: 1px solid var(--borde); vertical-align: top; }
.tabla-admin thead th { background: var(--papel-hundido); font-weight: 600; white-space: nowrap; font-size: .8rem; }
.tabla-admin code { background: var(--papel-hundido); padding: 1px 5px; border-radius: 5px; font-size: .85em; font-family: ui-monospace, Menlo, monospace; }
.tabla-admin .texto-suave { font-size: .8rem; }

.buscador-admin { display: flex; gap: 8px; margin-bottom: 16px; }
.buscador-admin input { flex: 1; }

/* Reclamos del Libro */
.ficha-reclamo { margin-bottom: 12px; border-left: 4px solid var(--borde); }
.ficha-reclamo.urgente { border-left-color: var(--ambar); }
.ficha-reclamo.vencido { border-left-color: var(--rojo); background: var(--rojo-suave); }
.fr-cabeza { display: flex; align-items: center; justify-content: space-between; gap: 14px; flex-wrap: wrap; }
.fr-plazo { font-size: .82rem; font-weight: 700; color: var(--texto-suave); }
.ficha-reclamo.vencido .fr-plazo { color: var(--rojo); }
.ficha-reclamo.urgente .fr-plazo { color: var(--ambar-hover); }

/* Ajustes del negocio */
.fila-cfg {
  display: flex; align-items: center; gap: 14px;
  padding: 14px 0; border-top: 1px solid var(--borde);
}
.fila-cfg:first-child { border-top: none; }
.fila-cfg > div:first-child { flex: 1; min-width: 0; }
.cfg-clave { font-family: ui-monospace, Menlo, monospace; font-size: .88rem; font-weight: 600; }
.cfg-ayuda { font-size: .8rem; color: var(--texto-suave); margin-top: 2px; }
.fila-cfg input { width: 110px; flex: none; margin: 0; }
.fila-cfg .btn { flex: none; }

@media (max-width: 719px) {
  .ind-nota { text-align: left; max-width: none; }
  .acciones-verif { flex-direction: column-reverse; }
  .datos-verif { grid-template-columns: 1fr; gap: 2px; }
  .datos-verif dd { margin-bottom: 9px; }
  .fila-cfg { flex-wrap: wrap; }
  .fila-cfg input { width: 100%; }
  .fila-cfg .btn { width: 100%; }
}

/* ============================================================
   v14 — Subida de documentos de verificación
   ============================================================ */
.bloque-subida .zona-archivo { width: 100%; }
.zona-archivo .za-texto { display: inline-block; vertical-align: middle; }
.zona-archivo.cargado {
  border-style: solid; border-color: var(--verde);
  background: var(--verde-suave); color: var(--verde-texto);
}
.zona-archivo.cargado svg { color: var(--verde-texto); }

/* En el panel: la especialidad declarada y su sustento, para poder dudar */
.etiqueta-bloque {
  font-size: .74rem; letter-spacing: .08em; text-transform: uppercase;
  color: var(--texto-suave); margin: 20px 0 8px;
}
.caja-sustento {
  background: var(--navy-suave); border-radius: var(--radio);
  padding: 14px 17px; margin-top: 12px;
}
.caja-sustento .etiqueta {
  font-size: .72rem; letter-spacing: .07em; text-transform: uppercase;
  color: var(--navy-claro); font-weight: 600;
}
.caja-sustento p { font-size: .9rem; color: #2c3d57; margin-top: 5px; line-height: 1.55; }

@media (max-width: 560px) {
  .fila-docs .btn { width: 100%; }
}

/* ============================================================
   v15 — Consentimiento (Ley 29733)
   Dos casillas separadas. La de datos sensibles NO puede ir metida
   dentro de la de términos: aceptar el servicio no es lo mismo que
   autorizar que tratemos un dato de salud.
   ============================================================ */
.bloque-consentimiento {
  padding: 18px 20px; margin-top: 4px;
  border-top: 1px solid var(--papel-hundido);
  display: flex; flex-direction: column; gap: 14px;
}
.fila-consent {
  display: flex; align-items: flex-start; gap: 11px;
  font-size: .86rem; line-height: 1.5; color: var(--texto-suave);
  cursor: pointer;
}
.fila-consent input[type=checkbox] {
  flex: none; width: 19px; height: 19px; margin: 1px 0 0;
  accent-color: var(--primario); cursor: pointer;
}
.fila-consent strong { color: var(--texto); font-weight: 600; }
.fila-consent small { display: block; margin-top: 3px; opacity: .8; }
.fila-consent a { text-decoration: underline; }

/* ============================================================
   v16 — Animaciones de entrada
   Sutiles y funcionales: dirigen la mirada, no se lucen. adho le
   habla a gente asustada, y una animación que llama la atención
   sobre sí misma le resta seriedad al sitio.

   NO duplica lo que ya existía (aurora, blobs, brillo del título,
   logo): esto es solo la ENTRADA de los elementos.
   ============================================================ */

/* El revelado.
   OJO CON EL `html.anima`: el ocultado SOLO se aplica si el JavaScript
   pudo engancharse. Si falla, si no carga, o si el navegador no
   soporta IntersectionObserver, esa clase nunca se pone y el
   contenido se ve normal.

   Al revés estaba mal: con `opacity:0` puesto desde el CSS, cualquier
   fallo del JS dejaba secciones enteras invisibles para siempre. En un
   sitio que vende confianza, una sección en blanco es mucho peor que
   no tener animación. */
html.anima .revelar {
  opacity: 0;
  transform: translateY(14px);
  transition: opacity .55s cubic-bezier(.2,.8,.2,1),
              transform .55s cubic-bezier(.2,.8,.2,1);
}
html.anima .revelar.visible { opacity: 1; transform: none; }

/* Los hijos heredan el estado del padre y salen escalonados.
   El retardo lo pone el JS con transition-delay. */
html.anima .revelar .revelar-hijo {
  opacity: 0;
  transform: translateY(12px);
  transition: opacity .5s cubic-bezier(.2,.8,.2,1),
              transform .5s cubic-bezier(.2,.8,.2,1);
}
html.anima .revelar.visible .revelar-hijo { opacity: 1; transform: none; }

/* Entrada de las carpetas de categoría.
   Una ola rápida: la mirada recorre las opciones una por una en vez de
   encontrarse un muro de diez. Suben desde abajo, como fichas que se
   acomodan en el archivador. */
@keyframes carpeta-aparece {
  from { opacity: 0; transform: translateY(8px); }
  to   { opacity: 1; transform: none; }
}
.carpeta-entra { animation: carpeta-aparece .38s cubic-bezier(.2,.9,.3,1) backwards; }

/* ---------- Selector de puerta (usuario / abogado) ----------
   Dos carpetas del archivador, una al lado de la otra. La que estás
   mirando va hundida en el papel y con el lomo azul; la otra queda
   levantada, invitando a cambiarse. Sin sombras: solo bordes. */
.selector-puerta { margin-bottom: 20px; }
.selector-puerta .etiqueta { display: block; margin-bottom: 8px; }
.puertas { display: grid; grid-template-columns: 1fr 1fr; gap: 8px; }
.puerta {
  display: block; padding: 14px 16px;
  background: var(--papel-hundido);
  border: 1px solid var(--borde); border-radius: 6px;
  color: var(--texto);
}
.puerta:hover { border-color: var(--tinta); color: var(--tinta); text-decoration: none; }
.puerta-activa {
  background: var(--papel);
  border-color: var(--tinta); border-left: 3px solid var(--azul);
}
.puerta-titulo {
  display: block; font-weight: 600; font-size: .95rem;
  color: var(--tinta); margin-bottom: 3px;
}
.puerta-detalle { display: block; font-size: .8rem; line-height: 1.45; color: var(--texto-suave); }
@media (max-width: 560px) {
  .puertas { grid-template-columns: 1fr; }
}

/* ---------- El hub del usuario (mi cuenta) ----------
   Cada consulta suya es una fila tocable que lleva a su conversación. */
.fila-mi-consulta {
  display: flex; align-items: center; justify-content: space-between;
  gap: 12px; padding: 12px 4px;
  border-top: 1px solid var(--borde);
  color: var(--texto); font-size: .9rem;
}
.fila-mi-consulta:hover { background: var(--papel-hundido); text-decoration: none; color: var(--tinta); }
.fila-mi-consulta .fmc-texto { min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.fila-mi-consulta .estado { flex: none; }
@media (max-width: 560px) {
  .fila-mi-consulta { flex-direction: column; align-items: flex-start; gap: 6px; }
  .fila-mi-consulta .fmc-texto { white-space: normal; }
}

/* ---------- Conversación 1 a 1 (detalle de consulta) ----------
   La pregunta y la respuesta como fichas de un intercambio: "tú"
   siempre a la derecha con fondo azul tenue, el otro a la izquierda
   sobre papel. Profundidad con bordes, como todo el sitio. */
.conversacion { display: flex; flex-direction: column; gap: 12px; margin-top: 16px; }
.burbuja {
  max-width: 88%; align-self: flex-start;
  background: var(--papel-hundido); border: 1px solid var(--borde);
  border-radius: 10px 10px 10px 3px; padding: 13px 16px;
}
.burbuja.mia {
  align-self: flex-end;
  background: var(--azul-tenue); border-color: var(--azul-borde);
  border-radius: 10px 10px 3px 10px;
}
.burbuja-quien {
  font-family: var(--mono); font-size: .62rem; font-weight: 500;
  text-transform: uppercase; letter-spacing: .13em;
  color: var(--texto-suave); margin-bottom: 6px;
}
.burbuja p { line-height: 1.65; overflow-wrap: anywhere; }
.burbuja-cuando { font-size: .72rem; color: var(--texto-tenue); margin-top: 8px; text-align: right; }

/* ---------- Preguntas frecuentes (portada) ----------
   Acordeón de expediente: filas separadas por la misma línea de todo
   el sitio y un signo + que gira a x al abrir. Sin fondos de color. */
.pf-lista { max-width: 780px; margin: 0 auto; border-top: 1px solid var(--borde); }
.pf-item { border-bottom: 1px solid var(--borde); }
.pf-item summary {
  display: flex; align-items: center; justify-content: space-between; gap: 16px;
  cursor: pointer; list-style: none; padding: 17px 4px;
  font-weight: 600; color: var(--tinta); font-size: .98rem;
}
.pf-item summary::-webkit-details-marker { display: none; }
.pf-item summary::after {
  content: "+"; font-family: var(--mono); font-size: 1.1rem; line-height: 1;
  color: var(--texto-suave); transition: transform .2s ease; flex: none;
}
.pf-item[open] summary::after { transform: rotate(45deg); }
.pf-item summary:hover { color: var(--azul-hover); }
.pf-item p { padding: 0 28px 18px 4px; color: var(--texto); max-width: 680px; line-height: 1.6; }
@media (prefers-reduced-motion: reduce) {
  .pf-item summary::after { transition: none; }
}

/* La cuenta atrás del wizard: al cambiar de paso, el bloque entra
   desde la derecha. Refuerza que avanzaste, no que se recargó. */
@keyframes paso-entra {
  from { opacity: 0; transform: translateX(16px); }
  to   { opacity: 1; transform: none; }
}
.paso-entra { animation: paso-entra .38s cubic-bezier(.2,.8,.2,1); }

/* Abrir la carpeta: la elegida se levanta de la línea y crece un pelo
   mientras las demás se apagan. Sin sombras ni brillos: el énfasis es
   puro movimiento, como sacar una carpeta del archivador. */
@keyframes carpeta-abre {
  0%   { transform: none; }
  55%  { transform: translateY(-8px) scale(1.06); }
  100% { transform: translateY(-5px) scale(1.04); }
}
.carpeta.carpeta-abre {
  animation: carpeta-abre .5s cubic-bezier(.2,.8,.2,1) forwards;
  position: relative; z-index: 2;
}

/* Y el paso siguiente sale DE esa carpeta: sube desde abajo como una
   hoja recién sacada del expediente. Más lento que paso-entra a
   propósito: abrir un expediente pesa. */
@keyframes paso-abre {
  from { opacity: 0; transform: translateY(24px) scale(.985); }
  to   { opacity: 1; transform: none; }
}
.paso-abre { animation: paso-abre .62s cubic-bezier(.2,.8,.2,1); }

/* Con el sistema pidiendo menos movimiento NO se apaga todo: se quita
   el DESPLAZAMIENTO y queda un fundido de opacidad.
   La especificación pide evitar el movimiento grande, no dejar la
   pantalla inerte, y un fundido no provoca mareo. Apagarlo entero
   hacía que quien tuviera esa opción activada en su Mac no viera
   absolutamente nada y creyera que el sitio está roto. */
@media (prefers-reduced-motion: reduce) {
  html.anima-suave .revelar,
  html.anima-suave .revelar .revelar-hijo {
    transform: none !important;
    transition: opacity .4s ease;
  }
  .carpeta-entra { animation: carpeta-fundido .45s ease backwards; }
  .paso-entra, .paso-abre, .carpeta.carpeta-abre { animation: none; }
}
@keyframes carpeta-fundido { from { opacity: 0; } to { opacity: 1; } }

/* ============================================================
   Maqueta animada de "cómo funciona"

   Tres escenas apiladas en el mismo hueco, solo una .viva a la vez.
   Van en position:absolute sobre un contenedor de altura fija: si
   fueran de flujo normal, cada cambio de escena movería media página
   porque las tres miden distinto.

   Todas las micro-animaciones cuelgan de .escena.viva y usan
   `backwards`, para que el estado de ANTES de empezar (invisible, o
   corrido) valga desde el primer cuadro. Sin eso se ve un parpadeo del
   elemento en su sitio final justo antes de que arranque.
   ============================================================ */
.demo { display: grid; grid-template-columns: minmax(0,1.02fr) minmax(0,.98fr); gap: 44px; align-items: center; margin-top: 42px; text-align: left; }
.demo-escenario { position: relative; min-height: 306px; }
.escena {
  position: absolute; inset: 0; display: flex; align-items: center; pointer-events: none;
  opacity: 0; transform: translateY(14px) scale(.985);
  transition: opacity .5s ease, transform .5s cubic-bezier(.2,.8,.2,1);
}
.escena.viva { opacity: 1; transform: none; }
.d-hoja {
  width: 100%; background: var(--papel); border-radius: var(--radio); padding: 22px;
  box-shadow: none;
}
.d-cab { display: flex; gap: 8px; align-items: center; flex-wrap: wrap; margin-bottom: 14px; }
.d-campo { min-height: 76px; margin: 0; font-size: .96rem; line-height: 1.55; color: var(--texto); }
.d-pie { display: flex; align-items: center; justify-content: space-between; gap: 12px; margin-top: 18px; }
.d-nota { font-size: .8rem; color: var(--texto-suave); }
.d-boton { background: var(--primario); color: var(--papel); font-size: .85rem; font-weight: 600; padding: 9px 18px; border-radius: 3px; display: inline-block; }
/* El botón se hunde solo al final de la escena 1: es el gesto que
   cierra el paso y le da pie al siguiente. */
.escena.viva .d-boton { animation: d-pulsar .5s ease 3.4s; }
@keyframes d-pulsar { 50% { transform: scale(.93); filter: brightness(.88); } }

.d-abogado { display: flex; align-items: center; gap: 12px; margin: 4px 0 18px; }
.d-abogado-txt { display: flex; flex-direction: column; gap: 5px; }
.d-abogado-txt b { font-weight: 600; }
.escena.viva .d-abogado { animation: d-entra-lado .55s cubic-bezier(.2,.9,.3,1) .25s backwards; }
@keyframes d-entra-lado { from { opacity: 0; transform: translateX(-20px); } }

/* El sello llega girado y grande y se endereza de golpe, como un
   timbre de verdad. Es el único momento brusco de todo el sitio, y es
   a propósito: acá es donde hay que entender que la consulta ya tiene
   dueño y nadie más la puede tocar. */
.d-sello {
  display: inline-block; border: 2px solid var(--verde); color: var(--verde-texto);
  font-weight: 700; font-size: .82rem; letter-spacing: .05em; text-transform: uppercase;
  padding: 7px 14px; border-radius: var(--radio);
}
.escena.viva .d-sello { animation: d-sellar .45s cubic-bezier(.2,1.6,.4,1) .95s backwards; }
@keyframes d-sellar { from { opacity: 0; transform: scale(1.9) rotate(-13deg); } }
.escena[data-escena="2"] .d-nota { display: block; margin-top: 14px; }

.d-burbuja { background: var(--navy-suave); border-radius: var(--radio); padding: 18px; display: flex; flex-direction: column; gap: 9px; }
/* Renglones borrosos en vez de texto. Decir "es privado" es una
   promesa; no poder leerlo es una demostración. */
.d-borroso { height: 11px; border-radius: 2px; background: var(--borde); filter: blur(3px); }
.d-borroso.corto { width: 58%; }
.d-borroso.medio { width: 81%; }
.d-candado { display: inline-flex; align-items: center; gap: 7px; margin-top: 10px; font-size: .84rem; font-weight: 600; color: var(--navy); }
.d-candado svg { width: 15px; height: 15px; flex: none; }
.escena.viva .d-burbuja { animation: d-entra-lado .5s cubic-bezier(.2,.9,.3,1) .2s backwards; }
.d-estrellas { display: flex; gap: 5px; margin-top: 16px; color: var(--ambar); font-size: 1.15rem; }
.escena.viva .d-estrellas span { animation: d-estrella .42s cubic-bezier(.3,1.6,.4,1) backwards; }
.escena.viva .d-estrellas span:nth-child(1) { animation-delay: 1.15s; }
.escena.viva .d-estrellas span:nth-child(2) { animation-delay: 1.25s; }
.escena.viva .d-estrellas span:nth-child(3) { animation-delay: 1.35s; }
.escena.viva .d-estrellas span:nth-child(4) { animation-delay: 1.45s; }
.escena.viva .d-estrellas span:nth-child(5) { animation-delay: 1.55s; }
@keyframes d-estrella { from { opacity: 0; transform: scale(.3) rotate(-30deg); } }

.demo-pasos { list-style: none; display: flex; flex-direction: column; gap: 4px; margin: 0; padding: 0; }
.d-paso {
  position: relative; display: flex; gap: 14px; align-items: flex-start;
  padding: 16px 18px 20px; border-radius: var(--radio); cursor: pointer; opacity: .45;
  transition: background .35s ease, opacity .35s ease, box-shadow .35s ease;
}
.d-paso.activo { opacity: 1; background: var(--papel); box-shadow: none; }
.d-paso:hover { opacity: .8; }
.d-paso.activo:hover { opacity: 1; }
.d-num {
  flex: none; width: 30px; height: 30px; border-radius: 50%; font-weight: 700; font-size: .9rem;
  background: var(--navy-suave); color: var(--navy);
  display: inline-flex; align-items: center; justify-content: center;
  transition: background .35s ease, color .35s ease;
}
.d-paso.activo .d-num { background: var(--primario); color: var(--papel); }
.d-txt { display: flex; flex-direction: column; gap: 3px; }
.d-txt b { font-weight: 600; font-size: 1rem; }
.d-txt span { font-size: .89rem; color: var(--texto-suave); line-height: 1.5; }
/* La barra dice cuánto falta para la siguiente escena. Sin ella nadie
   sabe si eso avanza solo o si hay que tocarlo. */
.d-barra { position: absolute; left: 18px; right: 18px; bottom: 10px; height: 2px; border-radius: 2px; background: rgba(31,45,80,.09); overflow: hidden; opacity: 0; transition: opacity .3s ease; }
.d-paso.activo .d-barra { opacity: 1; }
.d-barra i { display: block; height: 100%; width: 0; border-radius: 2px; background: var(--primario); }
.d-paso.activo .d-barra i { animation: d-llenar var(--dur, 4s) linear forwards; }
@keyframes d-llenar { to { width: 100%; } }

@media (max-width: 860px) {
  .demo { grid-template-columns: 1fr; gap: 22px; margin-top: 30px; }
  .demo-escenario { min-height: 288px; }
  .d-paso { padding: 13px 15px 18px; }
}
@media (prefers-reduced-motion: reduce) {
  .escena, .escena.viva * { animation: none !important; }
  .escena { transition: opacity .3s ease; transform: none; }
  .d-paso.activo .d-barra { opacity: 0; }
}

/* ============================================================
   iPhone con notch: la zona segura
   ============================================================
   En un iPhone X o posterior, la pantalla no es un rectángulo limpio:
   arriba está el notch y abajo la barra del gesto de inicio. En
   VERTICAL el navegador ya deja ese margen, pero en HORIZONTAL no: el
   contenido se mete debajo del notch y la primera pestaña del header
   queda tapada por él.

   `env(safe-area-inset-*)` es lo que iOS expone para eso. Con `max()`
   se toma el mayor entre el margen de siempre y el que pide el
   sistema, así en un teléfono sin notch —y en Android, y en el
   escritorio— no cambia absolutamente nada: env() vale 0.

   Va dentro de @supports porque los navegadores viejos que no conocen
   env() descartarían la declaración entera y se quedarían sin padding.
   ============================================================ */
@supports (padding: max(0px, env(safe-area-inset-left))) {
  .header-inner {
    padding-left:  max(22px, env(safe-area-inset-left));
    padding-right: max(22px, env(safe-area-inset-right));
  }
  .contenedor, .contenedor-angosto {
    padding-left:  max(22px, env(safe-area-inset-left));
    padding-right: max(22px, env(safe-area-inset-right));
  }
  /* El pie es la carpeta azul metida 56 px por lado. En horizontal ese
     margen puede quedar debajo del notch. */
  .footer { margin-left: max(56px, env(safe-area-inset-left)); margin-right: max(56px, env(safe-area-inset-right)); }

  @media (max-width: 719px) {
    .header-inner {
      padding-left:  max(14px, env(safe-area-inset-left));
      padding-right: max(14px, env(safe-area-inset-right));
    }
    .contenedor, .contenedor-angosto {
      padding-left:  max(16px, env(safe-area-inset-left));
      padding-right: max(16px, env(safe-area-inset-right));
    }
  }
}


/* ------------------------------------------------------------
   Zonas de toque en cualquier pantalla táctil

   `pointer: coarse` es "el que apunta es un dedo", que es la pregunta
   de verdad. Usar el ancho no alcanza: un iPad son 768 px y se toca
   igual que un celular, así que se quedaba fuera de las reglas de
   @media (max-width: 719px).
   ------------------------------------------------------------ */
@media (pointer: coarse) {
  .logo { min-height: 40px; display: inline-flex; align-items: center; }
  .scroll-cue { min-height: 44px; justify-content: center; }
}
