/* ==========================================================================
   Kelbia — hoja de estilos unica de la web.
   Grafito de fondo, azul electrico para lo que se pulsa, ambar solo para la
   accion principal. Esquinas de 6 px, bordes de 1 px, cero sombras.

   Orden del archivo:
     1. Variables            10. Listas y pasos
     2. Reajuste base        11. Precios
     3. Tipografia           12. Preguntas frecuentes
     4. Enlaces y foco       13. Conversacion de ejemplo
     5. Botones              14. Formulario
     6. Contenedores         15. Utilidades
     6b. Marca
     7. Cabecera             16. Adaptable
     8. Pie                  17. Movimiento reducido
     9. Rejillas y tarjetas  18. Impresion
   ========================================================================== */

/* 1. Variables ============================================================ */

:root {
  /* --- Los siete colores base de la identidad. No se tocan. -------------- */
  --fondo: #0D1117;        /* Fondo            */
  --superficie: #161B22;   /* Tarjetas         */
  --texto: #E9EDF2;        /* Texto primario   */
  --texto-tenue: #98A3B3;  /* Texto secundario */
  --marca: #4D7CFF;        /* Marca            */
  --accion: #FFB020;       /* Accion / CTA     */
  --banda: #F4F6FA;        /* Banda clara      */

  /* --- Derivadas en modo oscuro -----------------------------------------
     Todas salen de desplazar la luminosidad de los siete de arriba. La regla
     de la identidad es que aqui no entra ningun tono nuevo: si hace falta un
     color que no este en esta lista, es que algo se esta diseñando mal. */
  --marca-hover: #6B92FF;
  /* Ojo: el pulsado solo vale como FONDO (con blanco encima da 5.05:1). Como
     color de texto sobre el grafito se queda en 3.75:1 y no llega a AA. */
  --marca-pulsado: #3A66E0;
  --marca-fondo: #17203A;    /* fondo de estado en azul */
  --accion-hover: #FFC24D;
  --accion-pulsado: #E0930A;
  --accion-fondo: #2A2013;   /* fondo de estado en ambar */
  --superficie-hover: #1C222B;
  --borde: #232A35;

  /* Grafito. Es el color del texto que va encima del ambar: #0D1117 sobre
     #FFB020 da 10.4:1. Nunca se pone texto ambar sobre claro. */
  --tinta: #0D1117;

  /* Azul oscuro. Sobre la banda clara el azul de marca se queda en 3.4:1 y
     solo vale para iconos y titulares; para texto y enlaces se usa este, que
     llega a 5.4:1. Tambien es el fondo del boton azul, donde el blanco
     encima pasa de AA con 5.86:1. */
  --marca-oscura: #2E5BD6;

  /* El mismo azul, bajado de luminosidad: es el hover de lo anterior. No es un
     tono nuevo -tiene el mismo matiz, 225 grados- sino el desplazamiento que
     la identidad autoriza para derivar estados. Da 7.2:1 sobre la banda clara
     y 7.8:1 con blanco encima. */
  --marca-oscura-hover: #2749B5;

  /* El visto de los compromisos, dibujado aqui para no repetir el mismo SVG
     en cada sitio donde haga falta. Se pinta con mask, asi que el color lo
     pone quien lo use y no hay que tocar el dibujo. */
  --visto: url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16"><path d="M2.5 8.5l3.5 3.5 7.5-8" fill="none" stroke="black" stroke-width="2.2" stroke-linecap="round" stroke-linejoin="round"/></svg>');

  /* --- Medidas ----------------------------------------------------------- */
  --ancho: 1160px;
  --radio: 6px;
  --paso-seccion: clamp(64px, 9vw, 112px);
  --hueco: clamp(20px, 2.4vw, 28px);

  /* --- Tipografias -------------------------------------------------------
     IBM Plex Sans para todo e IBM Plex Mono para las cifras: metricas, horas
     y referencias de pedido, que con cifras tabulares quedan en columna. Se
     cargan desde fuentes/plex.css, en este mismo servidor. La pila de
     respaldo mantiene la web legible si no llegan a descargarse. */
  --fuente: "IBM Plex Sans", system-ui, -apple-system, "Segoe UI", sans-serif;
  --fuente-cifras: "IBM Plex Mono", ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;

  /* Nombres antiguos, mantenidos para que nada se rompa mientras quede algun
     uso suelto. Todo apunta ya a la misma familia. */
  --fuente-titular: var(--fuente);
  --fuente-texto: var(--fuente);
}

/* 2. Reajuste base ======================================================== */

*,
*::before,
*::after { box-sizing: border-box; }

html {
  -webkit-text-size-adjust: 100%;
  /* Deja hueco bajo la cabecera fija al saltar a un ancla. */
  scroll-padding-top: 96px;
}

@media (prefers-reduced-motion: no-preference) {
  html { scroll-behavior: smooth; }
}

body,
h1, h2, h3, h4, h5, h6,
p, figure, blockquote, dl, dd, ul, ol {
  margin: 0;
}

body {
  background: var(--fondo);
  color: var(--texto);
  font-family: var(--fuente);
  /* 17 / 27 en escritorio, que es el cuerpo de la identidad. */
  font-size: clamp(16px, 0.35vw + 15px, 17px);
  font-weight: 400;
  line-height: 1.59;
  -webkit-font-smoothing: antialiased;
}

img, svg, video { display: block; max-width: 100%; height: auto; }

hr {
  border: 0;
  border-top: 1px solid var(--borde);
  margin: var(--hueco) 0;
}

::selection { background: var(--marca); color: #FFFFFF; }

/* 3. Tipografia =========================================================== */

/* La escala es la de la identidad, al pie de la letra: 52/55 a peso 600 con
   -2.5% de espaciado para el titular grande, 34/39 a 500 con -2% para el
   segundo, 22/29 a 500 para el tercero. Los clamp solo encogen esos valores
   en pantallas estrechas; el maximo es siempre el numero de la identidad.

   Peso 600 y 500, nunca 700: con IBM Plex Sans el 700 pesa demasiado a estos
   tamaños y rompe el registro serio que pide la marca. */

h1, .titular-xl {
  font-family: var(--fuente);
  font-size: clamp(32px, 4.6vw, 52px);
  font-weight: 600;
  letter-spacing: -0.025em;
  line-height: 1.06;
  color: var(--texto);
  text-wrap: balance;
}

h2, .titular-l {
  font-family: var(--fuente);
  font-size: clamp(24px, 3vw, 34px);
  font-weight: 500;
  letter-spacing: -0.02em;
  line-height: 1.15;
  color: var(--texto);
  text-wrap: balance;
}

h3, .titular-m {
  font-family: var(--fuente);
  font-size: clamp(19px, 1.7vw, 22px);
  font-weight: 500;
  letter-spacing: -0.01em;
  line-height: 1.32;
  color: var(--texto);
  text-wrap: balance;
}

h4, h5, h6 {
  font-family: var(--fuente);
  font-size: 17px;
  font-weight: 600;
  letter-spacing: -0.005em;
  line-height: 1.4;
  color: var(--texto);
}

/* Cifras: metricas, horas, precios y referencias de pedido. Plex Mono a peso
   500 con cifras tabulares, para que un 1 ocupe lo mismo que un 8 y las
   columnas de numeros queden alineadas. */
.cifra {
  font-family: var(--fuente-cifras);
  font-weight: 500;
  font-variant-numeric: tabular-nums;
  letter-spacing: -0.01em;
}

/* Separacion por defecto entre un titular y lo que venga detras. */
.titular-xl + *,
.titular-l  + *,
.titular-m  + * { margin-top: 16px; }

.entradilla {
  font-size: clamp(17px, 1.4vw, 21px);
  line-height: 1.55;
  color: var(--texto-tenue);
  max-width: 62ch;
}

.apunte {
  font-size: 14px;
  line-height: 1.5;
  color: var(--texto-tenue);
}

p { margin-bottom: 1em; }
p:last-child { margin-bottom: 0; }

strong, b { font-weight: 600; color: var(--texto); }

code, kbd, samp {
  font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;
  font-size: 0.9em;
  background: var(--superficie);
  border: 1px solid var(--borde);
  border-radius: 4px;
  padding: 1px 5px;
}

/* 4. Enlaces y foco ======================================================= */

a {
  color: var(--marca);
  text-decoration: underline;
  text-underline-offset: 3px;
  text-decoration-thickness: 1px;
  transition: color 0.15s ease;
}

a:hover { color: var(--marca-hover); text-decoration-thickness: 2px; }

/* Foco de teclado. El outline no se elimina en ningun selector: solo se le
   cambia el color donde el ambar no se veria, que es la banda clara. */
:focus-visible {
  outline: 2px solid var(--accion);
  outline-offset: 3px;
  border-radius: 2px;
}

.seccion--banda :focus-visible { outline-color: var(--tinta); }

/* 5. Botones ============================================================== */

.btn {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  gap: 8px;
  min-height: 48px;
  padding: 12px 24px;
  border: 1px solid transparent;
  border-radius: var(--radio);
  font-family: var(--fuente-texto);
  font-size: 16px;
  font-weight: 600;
  line-height: 1.2;
  text-align: center;
  text-decoration: none;
  cursor: pointer;
  box-shadow: none;
  transition: background-color 0.15s ease, border-color 0.15s ease, color 0.15s ease;
}

.btn + .btn { margin-left: 12px; }

.btn-accion {
  background: var(--accion);
  color: var(--tinta);
  border-color: var(--accion);
}

.btn-accion:hover { background: var(--accion-hover); border-color: var(--accion-hover); color: var(--tinta); }
.btn-accion:active { background: var(--accion-pulsado); border-color: var(--accion-pulsado); color: var(--tinta); }

/* Azul solido. Usa el azul oscuro porque el blanco sobre el azul claro se
   queda en 3.72:1 y no llega a AA; sobre este llega a 5.69:1. */
.btn-marca {
  background: var(--marca-oscura);
  color: #FFFFFF;
  border-color: var(--marca-oscura);
}

.btn-marca:hover { background: var(--marca-pulsado); border-color: var(--marca-pulsado); color: #FFFFFF; }
.btn-marca:active { background: var(--marca-oscura-hover); border-color: var(--marca-oscura-hover); color: #FFFFFF; }

.btn-contorno {
  background: transparent;
  color: var(--texto);
  border-color: var(--borde);
}

.btn-contorno:hover { border-color: var(--marca); color: var(--marca); }

.btn:disabled,
.btn[aria-disabled="true"] { opacity: 0.5; cursor: not-allowed; }

/* Fila de botones. La regla .btn + .btn de arriba solo sabe separar en
   horizontal: cuando los botones no caben en el ancho —y a 360 px no caben—
   se apilan pegados y con el segundo sangrado 12 px. Envolverlos aqui les da
   la misma separacion en fila y apilados. */
.botonera {
  display: flex;
  flex-wrap: wrap;
  gap: 12px;
}

.botonera .btn + .btn { margin-left: 0; }

/* Sobre la banda clara el contorno necesita un borde que se vea. */
.seccion--banda .btn-contorno { color: var(--tinta); border-color: var(--borde); }
.seccion--banda .btn-contorno:hover { border-color: var(--marca); color: var(--marca); }

/* 6. Contenedores y secciones ============================================= */

.envoltura {
  width: 100%;
  max-width: var(--ancho);
  margin-inline: auto;
  padding-inline: clamp(20px, 4vw, 40px);
}

.seccion { padding-block: var(--paso-seccion); }

/* La portada no necesita el paso entero por abajo. La seccion que viene
   detras ya trae el suyo, y sumados dejaban 224 px de vacio en escritorio:
   un cuarto de pantalla en blanco que partia la pagina en dos y alejaba el
   primer argumento del titular. */
main > .seccion:first-child { padding-bottom: calc(var(--paso-seccion) * 0.3); }

/* Banda clara. Se redefinen las variables en el propio selector para que todo
   lo de dentro (titulares, texto tenue, bordes, tarjetas, tablas) se recalcule
   sin tocar una sola regla mas. */
.seccion--banda {
  --fondo: var(--banda);
  --superficie: #FFFFFF;
  --borde: #DDE3EC;
  --texto: var(--tinta);
  --texto-tenue: #5A6675;   /* 7.5:1 sobre la banda */
  --marca: #2E5BD6;         /* 5.3:1 sobre la banda; el azul claro se queda en 3.4:1 */
  --marca-hover: var(--marca-oscura-hover);   /* mas oscuro, para que el hover se note */
  background: var(--banda);
  color: var(--tinta);
}

.seccion--estrecha > .envoltura { max-width: 760px; }

/* Encabezado de seccion: titular, entradilla y aire antes del contenido. */
.seccion__cabeza { max-width: 68ch; margin-bottom: clamp(32px, 4vw, 48px); }

/* 6b. Marca =============================================================== */

/* El lockup se compone aqui, en HTML, y no dentro de un SVG con texto: asi el
   wordmark usa la IBM Plex Sans de verdad que la pagina ya tiene descargada,
   se ve nitido a cualquier tamaño y hereda el color de donde este puesto. Los
   SVG sueltos de img/ quedan para lo de fuera: documentos, redes, firma de
   correo y todo lo que no pasa por esta hoja de estilos.

   El lockup entero se escala con una sola medida, el font-size del enlace.
   Todo lo de dentro va en em, incluido el aire de 0.3 x el lado del icono que
   fija la identidad. */

.marca {
  display: inline-flex;
  align-items: center;
  gap: 0.3em;
  font-size: 32px;
  text-decoration: none;
  color: var(--texto);
}

.marca__icono {
  width: 1em;
  height: 1em;
  flex: none;
}

.marca__nombre {
  font-family: var(--fuente);
  font-size: 0.78em;
  font-weight: 600;
  letter-spacing: -0.02em;
  line-height: 1;
  color: currentColor;
}

/* Los tres puntos son lo unico que se mueve en todo el sistema. Al pasar por
   encima del logo escriben, que es exactamente lo que el simbolo representa:
   una conversacion en curso. Es un guiño, no un adorno; por eso solo ocurre
   en el hover y nunca a quien ha pedido que no se mueva nada. */
@keyframes marca-escribe {
  0%, 60%, 100% { transform: translateY(0); }
  30%           { transform: translateY(-12px); }
}

@media (prefers-reduced-motion: no-preference) {
  .marca:hover .marca__punto,
  .marca:focus-visible .marca__punto {
    animation: marca-escribe 1.1s ease-in-out infinite;
  }
  .marca:hover .marca__punto:nth-of-type(2),
  .marca:focus-visible .marca__punto:nth-of-type(2) { animation-delay: 0.12s; }
  .marca:hover .marca__punto:nth-of-type(3),
  .marca:focus-visible .marca__punto:nth-of-type(3) { animation-delay: 0.24s; }
}

/* Los tres puntos, sueltos. Son la firma del sistema: el mismo gesto del
   logotipo, repetido en el antetitulo de portada, en los iconos y en el
   widget. Van en ambar porque señalan que algo esta pasando. */
.puntos {
  display: inline-flex;
  align-items: center;
  gap: 0.34em;
  font-size: inherit;
  flex: none;
}

.puntos i {
  width: 0.44em;
  height: 0.44em;
  border-radius: 50%;
  background: var(--accion);
}

/* Sobre la banda clara el ambar en pieza pequeña se pierde; ahi los puntos
   pasan al azul oscuro, que si tiene cuerpo sobre claro. */
.seccion--banda .puntos i { background: var(--marca); }

@keyframes puntos-escriben {
  0%, 60%, 100% { transform: translateY(0);      opacity: 0.55; }
  30%           { transform: translateY(-0.28em); opacity: 1; }
}

@media (prefers-reduced-motion: no-preference) {
  .puntos--vivos i { animation: puntos-escriben 1.4s ease-in-out infinite; }
  .puntos--vivos i:nth-child(2) { animation-delay: 0.16s; }
  .puntos--vivos i:nth-child(3) { animation-delay: 0.32s; }
}

/* Antetitulo: la linea corta que va encima del titular grande. Dice de que
   va la pagina antes de que empiece el argumento, y lleva los tres puntos
   delante para que la marca se reconozca ya en la primera linea. */
.antetitulo {
  display: inline-flex;
  align-items: center;
  gap: 0.75em;
  margin-bottom: 20px;
  font-size: 13px;
  font-weight: 500;
  letter-spacing: 0.09em;
  line-height: 1.4;
  text-transform: uppercase;
  color: var(--texto-tenue);
}

/* Compromisos. Va pegado a la llamada a la accion, que es donde el visitante
   duda, y responde a lo que esta pensando en ese momento: "¿me va a costar
   algo?", "¿me van a atar?", "¿donde acaban mis datos?".

   Aqui no hay testimonios ni logos de clientes porque la regla del proyecto
   prohibe inventarlos, y sin clientes publicos no hay ninguno que enseñar. Lo
   que si hay son compromisos que se pueden cumplir hoy, y eso, dicho corto y
   junto, hace el mismo trabajo. */
.compromisos {
  display: flex;
  flex-wrap: wrap;
  gap: 10px 26px;
  margin: 0;
  padding: 0;
  list-style: none;
}

.compromisos li {
  display: flex;
  align-items: flex-start;
  gap: 8px;
  font-size: 14px;
  line-height: 1.5;
  color: var(--texto-tenue);
}

/* El visto va en azul, no en ambar: el ambar es solo de la accion, y aqui hay
   cuatro a la vez. */
.compromisos li::before {
  content: "";
  flex: none;
  width: 15px;
  height: 15px;
  margin-top: 3px;
  background: var(--marca);
  -webkit-mask: var(--visto) center / contain no-repeat;
  mask: var(--visto) center / contain no-repeat;
}

.seccion--banda .compromisos li::before { background: var(--marca-oscura); }

/* Sin mask el pseudoelemento se veria como un cuadrado azul macizo. */
@supports not ((mask: none) or (-webkit-mask: none)) {
  .compromisos li::before { background: none; }
}

/* Dato con fuente. Es la pieza que mas hace por que una inteligencia
   artificial cite la pagina: un numero concreto, dicho en una frase que se
   entiende sola, y con la fuente al lado para que se pueda comprobar.

   La regla del proyecto es que aqui no entra ninguna cifra inventada. Todas
   las que aparezcan llevan quien las publico y cuando, con enlace. */
.dato {
  border-left: 3px solid var(--accion);
  padding: 4px 0 4px 20px;
  margin-block: 28px;
  max-width: 62ch;
}

.dato__cifra {
  display: block;
  font-family: var(--fuente-cifras);
  font-size: clamp(30px, 3.4vw, 40px);
  font-weight: 500;
  font-variant-numeric: tabular-nums;
  letter-spacing: -0.02em;
  line-height: 1.1;
  color: var(--texto);
}

.dato__texto {
  margin: 8px 0 0;
  font-size: 17px;
  line-height: 1.55;
  color: var(--texto);
}

.dato__fuente {
  margin: 8px 0 0;
  font-size: 13px;
  line-height: 1.5;
  color: var(--texto-tenue);
}

/* Iconos de producto. El trazo hereda el color del texto -de ahi el azul-,
   y el acento ambar va fijado dentro de cada icono porque siempre es ambar:
   marca el punto donde algo sucede y no depende del contexto. */
.icono {
  width: 24px;
  height: 24px;
  flex: none;
  color: var(--marca);
}

.icono--grande { width: 32px; height: 32px; }

/* El sprite se pega al principio del body. No se ve; solo guarda los dibujos
   para que los <use> de la pagina los encuentren. */
.sprite {
  position: absolute;
  width: 0;
  height: 0;
  overflow: hidden;
}

/* 7. Cabecera ============================================================= */

.cabecera {
  position: sticky;
  top: 0;
  z-index: 50;
  background: color-mix(in srgb, var(--superficie) 88%, transparent);
  -webkit-backdrop-filter: blur(8px);
  backdrop-filter: blur(8px);
  border-bottom: 1px solid var(--borde);
}

/* Sin color-mix la cabecera se queda opaca, que tambien es correcto. */
@supports not (background: color-mix(in srgb, red 50%, transparent)) {
  .cabecera { background: var(--superficie); }
}

.cabecera > .envoltura {
  display: flex;
  align-items: center;
  gap: 16px;
  min-height: 68px;
}

.cabecera__logo {
  display: inline-flex;
  align-items: center;
  margin-right: auto;
  text-decoration: none;
  color: var(--texto);
}

/* El lockup de la cabecera, algo mas pequeño que el tamaño base de .marca. */
.cabecera__logo.marca { font-size: 30px; }

/* Casilla oculta que abre el menu sin JavaScript. Se mantiene enfocable con
   el teclado, por eso no lleva display:none. */
.cabecera__interruptor {
  position: absolute;
  width: 1px;
  height: 1px;
  margin: 0;
  opacity: 0;
  pointer-events: none;
}

.cabecera__hamburguesa {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 48px;
  height: 48px;
  border: 1px solid var(--borde);
  border-radius: var(--radio);
  color: var(--texto);
  font-size: 20px;
  line-height: 1;
  cursor: pointer;
}

.cabecera__hamburguesa:hover { border-color: var(--marca); color: var(--marca); }

.cabecera__interruptor:focus-visible + .cabecera__hamburguesa {
  outline: 2px solid var(--accion);
  outline-offset: 3px;
}

/* Menu plegado: es el estado de partida en pantallas estrechas. */
.cabecera__nav {
  display: none;
  position: absolute;
  top: 100%;
  left: 0;
  right: 0;
  flex-direction: column;
  gap: 2px;
  padding: 12px clamp(20px, 4vw, 40px) 20px;
  background: var(--superficie);
  border-bottom: 1px solid var(--borde);
}

/* Dos formas de abrirlo: la casilla (sin JavaScript) y la clase que pone el
   JavaScript cuando esta disponible. */
.cabecera__interruptor:checked ~ .cabecera__nav,
.cabecera__nav.abierto { display: flex; }

.cabecera__enlace {
  padding: 10px 12px;
  border: 1px solid transparent;
  border-radius: var(--radio);
  color: var(--texto-tenue);
  font-size: 15px;
  font-weight: 500;
  text-decoration: none;
  white-space: nowrap;
}

.cabecera__enlace:hover { color: var(--texto); background: var(--fondo); }

/* Disparador del desplegable "Tipos de bot". Mismo lenguaje visual que la
   flecha de las preguntas frecuentes (ver .faq__pregunta::after): un
   triangulo dibujado con dos bordes que gira al abrirse. Se sustituye el
   marcador nativo del navegador, que se dibuja distinto en cada uno. */
summary.cabecera__enlace {
  display: flex;
  align-items: center;
  gap: 6px;
  cursor: pointer;
  list-style: none;
}

summary.cabecera__enlace::-webkit-details-marker { display: none; }

summary.cabecera__enlace::after {
  content: "";
  flex: 0 0 auto;
  width: 8px;
  height: 8px;
  border-right: 2px solid var(--marca);
  border-bottom: 2px solid var(--marca);
  transform: rotate(45deg) translate(-2px, -2px);
  transition: transform 0.2s ease;
}

details[open] > summary.cabecera__enlace::after { transform: rotate(-135deg) translate(-2px, -2px); }

/* Los tres enlaces que cuelgan de "Tipos de bot". Sin esta regla salen en
   linea, como palabras sueltas dentro de la barra, porque un <a> es en linea
   por naturaleza. En movil el menu ya es una columna: basta con que cada uno
   ocupe su renglon y entre un poco hacia dentro, para que se lea que cuelgan
   del disparador y no que son hermanos suyos. El panel flotante de escritorio
   esta en la seccion 16.

   El selector lleva "a" a proposito: el <summary> tambien es hijo directo del
   <details> y tambien lleva .cabecera__enlace, asi que sin la etiqueta se
   llevaria estas reglas por delante y se saldria de la barra. */
.cabecera__nav > details > a.cabecera__enlace {
  display: block;
  margin-top: 2px;
  margin-left: 16px;
}

/* Boton principal de la cabecera. Vive fuera de <nav> a proposito: en movil
   tiene que verse siempre, sin abrir el menu, porque es la llamada a la
   accion de una web que vende y el movil es donde entra la mayoria del
   trafico. En escritorio, al ser el ultimo hijo de .envoltura, cae al final
   de la fila, a la derecha, igual que si siguiera dentro del menu. El texto
   se acorta a "Probar" por debajo de 480px para que quepa junto al logo y la
   hamburguesa sin desbordar: un solo elemento, el span se oculta con CSS, no
   se duplica el boton.

   El "gap: 0" no es un detalle. .btn separa sus hijos con un hueco de 8 px,
   pensado para un icono al lado de una palabra, y aqui los dos hijos son las
   dos mitades de la MISMA palabra escrita: con el hueco puesto se leia
   "Probar  gratis", con un espacio del doble de ancho que el de la tipografia.
   Comprobado renderizando las tres variantes al triple de tamano: quitar el
   espacio de dentro del <span> no cambia nada (el navegador ya se lo comia por
   ser un espacio al principio de linea); el ancho de mas lo ponia el hueco
   entero. Asi que el hueco se anula y el espacio lo pone un &nbsp; dentro del
   <span>, que no se colapsa y desaparece con el en movil. */
.cabecera__cta { padding-inline: 14px; flex: 0 0 auto; gap: 0; }

.cabecera__cta-extra { display: none; }

/* Enlace de la pagina actual. Se resuelve solo con CSS, a partir de la clase
   del <body>, para que el bloque de la cabecera sea identico en las 16
   paginas. Nunca se anade una clase ni un atributo al enlace.

   Las cuatro paginas de sector y las tres de bot no tienen enlace propio
   visible en la cabecera (las de sector no tienen ninguno; las de bot viven
   dentro del desplegable "Tipos de bot", cerrado por defecto), asi que se
   resalta el elemento del menu que representa donde estas: "Sectores" para
   las primeras, el disparador del desplegable para las segundas. Si el
   visitante abre el desplegable estando en una pagina de bot, el enlace
   concreto tambien queda resaltado (ultima linea del primer bloque).

   pagina-inicio/pagina-index no llevan regla propia a proposito: el menu no
   tiene un enlace "Inicio" (el logo hace ese papel), asi que una regla que
   apuntara a .cabecera__enlace[href="index.html"] no encontraria nunca ese
   elemento. Existio antes como codigo muerto y se retiro en la ronda 1 de
   ajustes de esta tarea. */
body.pagina-como-funciona      .cabecera__enlace[href="como-funciona.html"],
body.pagina-precios            .cabecera__enlace[href="precios.html"],
body.pagina-sectores           .cabecera__enlace[href="sectores.html"],
body.pagina-contacto           .cabecera__enlace[href="contacto.html"],
body.pagina-privacidad         .cabecera__enlace[href="privacidad.html"],
body.pagina-terminos           .cabecera__enlace[href="terminos.html"],
body.pagina-cookies            .cabecera__enlace[href="cookies.html"],
body.pagina-chatbot-ecommerce  .cabecera__enlace[href="sectores.html"],
body.pagina-chatbot-clinicas   .cabecera__enlace[href="sectores.html"],
body.pagina-chatbot-hosteleria .cabecera__enlace[href="sectores.html"],
body.pagina-chatbot-despachos  .cabecera__enlace[href="sectores.html"],
body.pagina-bot-reservas       summary.cabecera__enlace,
body.pagina-bot-conversacional summary.cabecera__enlace,
body.pagina-bot-catalogo       summary.cabecera__enlace,
body.pagina-bot-reservas       .cabecera__enlace[href="bot-reservas.html"],
body.pagina-bot-conversacional .cabecera__enlace[href="bot-conversacional.html"],
body.pagina-bot-catalogo       .cabecera__enlace[href="bot-catalogo.html"] {
  color: var(--texto);
  border-color: var(--borde);
  background: var(--fondo);
}

/* 8. Pie ================================================================== */

.pie {
  border-top: 1px solid var(--borde);
  background: var(--superficie);
  padding-block: clamp(40px, 6vw, 64px) 24px;
  font-size: 15px;
}

.pie > .envoltura {
  display: grid;
  gap: var(--hueco);
  grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
}

.pie__columna h2,
.pie__columna h3 {
  font-family: var(--fuente-titular);
  font-size: 15px;
  font-weight: 600;
  letter-spacing: 0.04em;
  text-transform: uppercase;
  color: var(--texto);
  margin-bottom: 12px;
}

.pie__columna ul { list-style: none; padding: 0; }
.pie__columna li { margin-bottom: 6px; }

.pie__columna a { color: var(--texto-tenue); text-decoration: none; }
.pie__columna a:hover { color: var(--texto); text-decoration: underline; }

.pie__legal {
  grid-column: 1 / -1;
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: 8px 20px;
  border-top: 1px solid var(--borde);
  margin-top: 16px;
  padding-top: 20px;
  color: var(--texto-tenue);
  font-size: 14px;
}

.pie__legal a { color: var(--texto-tenue); }
.pie__legal a:hover { color: var(--texto); }

/* Quien firma el contenido y cuando se reviso. Va aqui, a la vista, y no solo
   en los datos estructurados: un dato que dice algo que la pagina no dice en
   ninguna parte es un dato que no se sostiene. Ocupa toda la linea para que no
   se mezcle con el aviso de derechos. */
.pie__firma {
  flex-basis: 100%;
  font-size: 13px;
  line-height: 1.5;
}

/* 9. Rejillas y tarjetas ================================================== */

.rejilla {
  display: grid;
  gap: var(--hueco);
  grid-template-columns: repeat(auto-fit, minmax(240px, 1fr));
}

.rejilla--2 { grid-template-columns: repeat(auto-fit, minmax(280px, 1fr)); }
.rejilla--3 { grid-template-columns: repeat(auto-fit, minmax(240px, 1fr)); }
.rejilla--4 { grid-template-columns: repeat(auto-fit, minmax(210px, 1fr)); }

.tarjeta {
  background: var(--superficie);
  border: 1px solid var(--borde);
  border-radius: var(--radio);
  padding: 24px;
  box-shadow: none;
}

/* Icono de una tarjeta. Va dibujado en SVG con stroke="currentColor", asi que
   toma el color de aqui y se recalcula solo si la tarjeta cae en una banda
   clara, donde --marca ya apunta al azul oscuro. */
.tarjeta__icono {
  color: var(--marca);
  margin-bottom: 14px;
}

.tarjeta__titulo {
  font-family: var(--fuente-titular);
  font-size: 19px;
  font-weight: 600;
  letter-spacing: -0.01em;
  line-height: 1.25;
  color: var(--texto);
  margin-bottom: 8px;
}

.tarjeta__texto {
  color: var(--texto-tenue);
  font-size: 16px;
  margin-bottom: 0;
}

.tarjeta__texto + .tarjeta__texto { margin-top: 12px; }

/* 10. Listas y pasos ====================================================== */

.lista-marcada {
  list-style: none;
  padding: 0;
  display: grid;
  gap: 10px;
}

.lista-marcada li {
  position: relative;
  padding-left: 30px;
}

/* Marca de verificacion dibujada con dos bordes: sin imagen y sin fuente de
   iconos. */
.lista-marcada li::before {
  content: "";
  position: absolute;
  left: 4px;
  top: 0.5em;
  width: 12px;
  height: 7px;
  border-left: 2px solid var(--marca);
  border-bottom: 2px solid var(--marca);
  transform: rotate(-45deg);
}

/* Recorrido numerado: los pasos se leen hacia abajo, uno detras de otro. Con
   .rejilla se repartirian en columnas y a partir de tres pasos el orden deja
   de entenderse, asi que van en una sola columna a cualquier ancho. */
.pasos {
  display: grid;
  gap: var(--hueco);
}

.paso {
  display: grid;
  grid-template-columns: auto 1fr;
  gap: 16px;
  align-items: start;
}

.paso__numero {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 44px;
  height: 44px;
  border: 1px solid var(--borde);
  border-radius: var(--radio);
  background: var(--superficie);
  font-family: var(--fuente-titular);
  font-size: 18px;
  font-weight: 700;
  color: var(--marca);
}

/* 11. Precios ============================================================= */

.planes {
  display: grid;
  gap: var(--hueco);
  grid-template-columns: repeat(auto-fit, minmax(240px, 1fr));
  align-items: stretch;
}

.plan {
  display: flex;
  flex-direction: column;
  gap: 12px;
  background: var(--superficie);
  border: 1px solid var(--borde);
  border-radius: var(--radio);
  padding: 24px;
}

.plan--destacado { border-color: var(--marca); }

/* El recuadro azul ya decia "este", pero no lo decia con palabras: quien no
   se fija en el borde no se entera. El sello lo dice.                       */
.plan__sello {
  align-self: flex-start;
  padding: 2px 10px;
  border-radius: 999px;
  background: color-mix(in srgb, var(--marca) 18%, transparent);
  color: var(--marca);
  font-size: 12px;
  line-height: 18px;
  font-weight: 700;
}

.plan__para {
  margin: 0;
  font-size: 14px;
  line-height: 1.5;
  color: var(--texto-tenue);
}
/* El sello del plan recomendado empujaba su titulo hacia abajo y los cuatro
   dejaban de estar a la misma altura. Se reserva su sitio en las demas: 22px,
   que es lo que mide el sello (18 de linea mas 2+2 de relleno).            */
.planes .plan:not(.plan--destacado)::before { content: ""; height: 22px; }


.plan__precio {
  font-family: var(--fuente-titular);
  font-size: clamp(30px, 3.2vw, 40px);
  font-weight: 700;
  letter-spacing: -0.02em;
  line-height: 1;
  color: var(--texto);
}

.plan__precio small {
  font-family: var(--fuente-texto);
  font-size: 15px;
  font-weight: 400;
  letter-spacing: 0;
  color: var(--texto-tenue);
  margin-left: 4px;
}

.plan .lista-marcada { font-size: 15px; }
.plan .btn { margin-top: auto; width: 100%; }

.tabla-comparativa {
  width: 100%;
  border-collapse: collapse;
  font-size: 15px;
  text-align: left;
}

.tabla-comparativa th,
.tabla-comparativa td {
  border-bottom: 1px solid var(--borde);
  padding: 12px 14px;
  vertical-align: top;
}

.tabla-comparativa thead th {
  font-family: var(--fuente-titular);
  font-weight: 600;
  color: var(--texto);
  border-bottom-width: 2px;
  white-space: nowrap;
}

.tabla-comparativa tbody th { font-weight: 500; color: var(--texto); }
.tabla-comparativa td { color: var(--texto-tenue); }

.tabla-comparativa tr:last-child th,
.tabla-comparativa tr:last-child td { border-bottom: 0; }

/* Envoltorio para tablas que no caben en un movil.

   El "position: relative" no es decorativo. Las celdas de la tabla llevan
   dentro textos solo para lector de pantalla, y esos van con position
   absolute. Sin un ancestro posicionado dentro del envoltorio, el navegador
   los cuelga del documento entero en lugar de la caja que se desplaza: se
   escapan del recorte y estiran la pagina a lo ancho. Medido a 360 px en la
   pagina de precios: la pagina pedia 401 px de ancho para 345 disponibles, y
   el visitante tenia que arrastrar la pagina entera de lado. Con esta linea,
   345 y 345. */
.desplazable { overflow-x: auto; position: relative; }

/* 12. Preguntas frecuentes ================================================ */

.faq {
  border-bottom: 1px solid var(--borde);
}

.faq:first-of-type { border-top: 1px solid var(--borde); }

.faq__pregunta {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 16px;
  padding: 18px 0;
  cursor: pointer;
  font-family: var(--fuente-titular);
  font-size: 18px;
  font-weight: 600;
  line-height: 1.35;
  color: var(--texto);
  list-style: none;
}

.faq__pregunta::-webkit-details-marker { display: none; }

/* Flecha dibujada con bordes; gira al abrirse. */
.faq__pregunta::after {
  content: "";
  flex: 0 0 auto;
  width: 10px;
  height: 10px;
  margin-right: 8px;
  border-right: 2px solid var(--marca);
  border-bottom: 2px solid var(--marca);
  transform: rotate(45deg) translate(-3px, -3px);
  transition: transform 0.2s ease;
}

.faq[open] .faq__pregunta::after { transform: rotate(-135deg) translate(-3px, -3px); }

.faq__pregunta:hover { color: var(--marca); }

.faq__respuesta {
  padding: 0 0 20px;
  color: var(--texto-tenue);
  max-width: 72ch;
}

/* 13. Conversacion de ejemplo ============================================= */

/* Reparto de la seccion de demostracion: el texto a un lado y la conversacion
   al otro. Hasta 1024 px va todo apilado y la separacion entre los dos bloques
   la sigue poniendo el margen de .seccion__cabeza, igual que en el resto de
   secciones; por eso el hueco entre filas es cero y solo se declara el de
   columnas. A partir de ahi se abre en dos, para que la pieza que mas convence
   no se quede sola ocupando media pantalla. */
/* --- Capacidades --------------------------------------------------------

   Eran seis tarjetas iguales: mismo borde, mismo radio, misma sombra, una al
   lado de otra. Es el patron que delata una pagina hecha por una maquina, y
   ademas no aportaba nada: el recuadro no decia nada del contenido. Se queda
   la rejilla, se van las cajas, y la informacion la da el filete: dos
   columnas de tres, separadas por una linea de un pixel.                    */

.capacidades {
  display: grid;
  gap: 0;
  border-top: 1px solid var(--borde);
}

@media (min-width: 760px) {
  .capacidades { grid-template-columns: 1fr 1fr; column-gap: clamp(40px, 5vw, 80px); }
  /* La linea vertical entre las dos columnas la pone el borde izquierdo de
     los pares, con el hueco repartido a los dos lados. */
  .capacidades > :nth-child(even) {
    border-left: 1px solid var(--borde);
    padding-left: clamp(40px, 5vw, 80px);
    margin-left: calc(clamp(40px, 5vw, 80px) * -0.5);
  }
}

.capacidad {
  padding-block: clamp(24px, 3vw, 34px);
  border-bottom: 1px solid var(--borde);
}

.capacidad__icono { display: block; color: var(--marca); margin-bottom: 14px; }

.capacidad__titulo {
  margin: 0;
  font-family: var(--fuente-titular);
  font-size: clamp(18px, 1.6vw, 22px);
  line-height: 1.25;
  font-weight: 600;
  color: var(--texto);
}

.capacidad__texto {
  margin: 8px 0 0;
  font-size: 16px;
  line-height: 1.6;
  color: var(--texto-tenue);
  max-width: 44ch;
}

/* --- La noche -----------------------------------------------------------

   El argumento entero de Kelbia cabe en una columna de horas. Aqui no hay
   tarjetas a proposito: la pagina ya tiene siete rejillas de tarjetas y esta
   tiene que ser LA seccion que se recuerda. Filete, hora grande en la mono
   que la identidad reserva para horas y cifras, y nada mas. El ambar sale una
   sola vez, en la linea en la que el cliente se despide.                    */

.noche {
  list-style: none;
  margin: 0;
  padding: 0;
  border-top: 1px solid var(--borde);
}

.noche__fila {
  display: grid;
  grid-template-columns: auto minmax(0, 1fr) auto;
  align-items: baseline;
  column-gap: clamp(20px, 3vw, 44px);
  row-gap: 6px;
  padding-block: clamp(18px, 2.4vw, 28px);
  border-bottom: 1px solid var(--borde);
}

.noche__hora {
  font-size: clamp(26px, 3.4vw, 42px);
  line-height: 1;
  color: var(--texto-tenue);
  /* Las cinco horas tienen que caer en columna perfecta: es lo que hace que
     se lea como un parte de la noche y no como una lista cualquiera. */
  font-variant-numeric: tabular-nums;
}

.noche__mensaje {
  margin: 0;
  font-size: clamp(16px, 1.3vw, 19px);
  line-height: 1.5;
  color: var(--texto);
}

.noche__estado {
  font-size: 13px;
  line-height: 1.4;
  color: var(--texto-tenue);
  white-space: nowrap;
}

/* La ultima. No se adorna: se sube el peso de la hora y se le da el ambar,
   que en toda la pagina significa "esto es lo que importa".                 */
.noche__fila--perdida .noche__hora,
.noche__fila--perdida .noche__estado { color: var(--accion); }
.noche__fila--perdida .noche__mensaje { font-weight: 600; }

.noche__cuenta {
  margin-top: clamp(24px, 3vw, 36px);
  font-size: clamp(18px, 1.7vw, 24px);
  line-height: 1.45;
  max-width: 46ch;
  color: var(--texto);
}

/* En movil la hora manda arriba y el estado se va debajo del mensaje: con
   tres columnas a 390 px el mensaje quedaba en un canal de seis palabras. */
@media (max-width: 720px) {
  .noche__fila { grid-template-columns: auto minmax(0, 1fr); }
  .noche__estado { grid-column: 2; }
}

/* --- Portada ------------------------------------------------------------

   El texto solo no dice que esto es un chat. La muestra de conversacion
   ensena el producto sin que haya que bajar: quien entra ve en un segundo
   que aqui se escribe y alguien contesta.                                  */

.portada {
  display: grid;
  gap: clamp(32px, 5vw, 56px);
  align-items: center;
}

@media (min-width: 1024px) {
  .portada { grid-template-columns: minmax(0, 1.05fr) minmax(0, 0.95fr); }
}

/* En movil el texto manda y la muestra va detras: nadie decide por una
   captura antes de leer de que va.                                         */
.portada__muestra .widget { max-width: 100%; margin-inline: auto; }

/* Regla 3: el ambar es de la llamada a la accion, y en esta pantalla ya lo
   lleva el boton de probar. El "Enviar" del dibujo se queda en gris: sigue
   pareciendo un boton y deja de competir con el que si se puede pulsar.     */
.widget--portada .widget__enviar {
  border-color: var(--borde);
  background: transparent;
  color: var(--texto-tenue);
}

.widget__hora {
  margin-left: auto;
  font-size: 13px;
  line-height: 1;
  color: var(--texto-tenue);
  font-variant-numeric: tabular-nums;
}

.demo {
  display: grid;
  gap: 0 clamp(24px, 5vw, 64px);
}

@media (min-width: 1024px) {
  .demo {
    grid-template-columns: 1fr 1fr;
    /* Centrado y no alineado arriba: la conversacion mide el triple que el
       texto que la acompaña, y pegando los dos al borde superior quedaban
       quinientos pixeles de columna izquierda en blanco. Centrado, las dos
       mitades se leen como una sola pieza. */
    align-items: center;
  }
}

/* El widget, tal y como lo dibuja el manual de marca: cabecera grafito,
   burbujas sobre la banda clara, un solo boton ambar y la firma debajo. Es el
   mismo objeto en todos los clientes; lo unico que cambia de un sector a otro
   es el guion, nunca el marco.

   Aqui va embebido en la propia web, para que se vea antes de contratarlo. */

.widget {
  max-width: 520px;
  border: 1px solid var(--borde);
  border-radius: 10px;
  overflow: hidden;
  background: var(--banda);
}

.widget__cabecera {
  display: flex;
  align-items: center;
  gap: 12px;
  padding: 14px 16px;
  background: var(--fondo);
  border-bottom: 1px solid var(--borde);
}

.widget__avatar {
  width: 34px;
  height: 34px;
  flex: none;
}

.widget__quien { min-width: 0; }

.widget__nombre {
  margin: 0;
  font-size: 15px;
  font-weight: 600;
  line-height: 1.3;
  color: var(--texto);
}

/* El punto verde de "en linea" no existe en este sistema: el estado se dice
   con palabras y con los mismos tres puntos de la marca. */
.widget__estado {
  display: flex;
  align-items: center;
  gap: 7px;
  margin: 2px 0 0;
  font-size: 12px;
  line-height: 1.3;
  color: var(--texto-tenue);
}

.widget__estado .puntos { font-size: 11px; }

.conversacion {
  display: flex;
  flex-direction: column;
  gap: 12px;
  /* Banda clara: dentro del widget el fondo se aclara, y con el se recalculan
     los colores de las burbujas y del texto. */
  background: var(--banda);
  color: var(--tinta);
  padding: 18px 16px;
  min-height: 120px;
}

.conversacion__mensaje {
  max-width: 82%;
  padding: 12px 16px;
  border: 1px solid transparent;
  border-radius: var(--radio);
  font-size: 15px;
  line-height: 1.5;
  transition: opacity 0.4s ease, transform 0.4s ease;
}

/* El JavaScript marca los mensajes con este atributo antes de revelarlos al
   entrar en pantalla. Sin JavaScript el atributo nunca se pone y se ven
   todos, que es el comportamiento correcto. */
.conversacion__mensaje[data-oculto] {
  opacity: 0;
  transform: translateY(8px);
}

.conversacion__mensaje--cliente {
  align-self: flex-end;
  background: var(--marca-oscura);
  border-color: var(--marca-oscura);
  color: #FFFFFF;
}

/* Sobre la banda clara la burbuja del bot es blanca con un borde tenue: en el
   grafito de antes se confundia con el fondo del propio widget. */
.conversacion__mensaje--bot {
  align-self: flex-start;
  background: #FFFFFF;
  border-color: #DDE3EC;
  color: #0D1117;
}

/* El indicador de "escribiendo": los tres puntos de la marca, en su sitio
   natural. Aparece mientras el guion hace una pausa antes de responder. */
.conversacion__escribiendo {
  align-self: flex-start;
  display: inline-flex;
  align-items: center;
  padding: 14px 18px;
  background: #FFFFFF;
  border: 1px solid #DDE3EC;
  border-radius: var(--radio);
  font-size: 15px;
}

.conversacion__escribiendo .puntos i { background: var(--accion); }

/* Respuestas rapidas: lo que el visitante puede pulsar para seguir el guion. */
.widget__opciones {
  display: flex;
  flex-wrap: wrap;
  gap: 8px;
  padding: 0 16px 14px;
  background: var(--banda);
}

.widget__opcion {
  padding: 9px 14px;
  min-height: 40px;
  /* El borde del manual para banda clara. Es tenue a proposito: lo que dice
     que esto se pulsa es el texto en azul, no una caja marcada. */
  border: 1px solid #DDE3EC;
  border-radius: 999px;
  background: #FFFFFF;
  color: var(--marca-oscura);
  font-family: var(--fuente);
  font-size: 14px;
  font-weight: 500;
  line-height: 1.3;
  cursor: pointer;
  transition: background-color 0.15s ease, border-color 0.15s ease;
}

.widget__opcion:hover { background: #E6EDFF; border-color: var(--marca-oscura); }
.widget__opcion:focus-visible { outline: 2px solid var(--tinta); outline-offset: 2px; }

/* Pie del widget. El campo no es un campo de verdad: esto es una muestra, y un
   cuadro de texto que no envia nada solo sirve para decepcionar a quien
   escriba en el. Se ve como es, y se avanza con los botones de arriba. */
.widget__pie {
  display: flex;
  align-items: center;
  gap: 10px;
  padding: 12px 14px;
  background: #FFFFFF;
  border-top: 1px solid #DDE3EC;
}

.widget__campo {
  flex: 1;
  min-width: 0;
  font-size: 14px;
  color: #5A6675;
}

.widget__enviar {
  flex: none;
  padding: 9px 18px;
  min-height: 40px;
  display: inline-flex;
  align-items: center;
  border: 1px solid var(--accion);
  border-radius: var(--radio);
  background: var(--accion);
  color: var(--tinta);
  font-family: var(--fuente);
  font-size: 14px;
  font-weight: 600;
  cursor: default;
}

.widget__firma {
  display: flex;
  align-items: center;
  gap: 8px;
  margin: 0;
  padding: 10px 16px;
  background: var(--fondo);
  border-top: 1px solid var(--borde);
  font-size: 12px;
  color: var(--texto-tenue);
}

.widget__firma svg { width: 14px; height: 14px; flex: none; }

/* Aviso de que esto es una muestra. La marca no finge: si la conversacion
   lleva guion, se dice. */
.widget__aviso {
  margin-top: 10px;
  font-size: 13px;
  line-height: 1.5;
  color: var(--texto-tenue);
}

/* 14. Formulario ========================================================== */

/* Resultado del envío. El formulario lo recibe la app y devuelve al
   visitante a contacto.html#enviado o #error-envio; el aviso que toca se
   enciende con :target, así que funciona también sin JavaScript. */
.aviso-envio {
  display: none;
  margin: 0 0 var(--hueco);
  padding: 14px 16px;
  border: 1px solid var(--borde);
  border-radius: var(--radio);
  color: var(--texto);
}
.aviso-envio:target { display: block; }
.aviso-envio--bien { background: var(--marca-fondo); border-color: var(--marca); }
.aviso-envio--mal { background: var(--accion-fondo); border-color: var(--accion); }

/* Campo trampa para robots: fuera de la vista y del teclado. Una persona no
   lo ve ni lo rellena; si llega relleno, la app descarta el mensaje. */
.campo--trampa {
  position: absolute;
  left: -10000px;
  width: 1px;
  height: 1px;
  overflow: hidden;
}


.formulario {
  display: grid;
  gap: 20px;
  max-width: 640px;
}

.campo { display: grid; gap: 6px; }

.campo__etiqueta {
  font-size: 15px;
  font-weight: 500;
  color: var(--texto);
}

/* Marcar lo que se puede saltar, y no lo que es obligatorio. Un formulario
   lleno de asteriscos rojos se lee como un examen; diciendo cuales sobran, el
   visitante ve enseguida que son tres campos y no ocho. */
.campo__opcional {
  font-weight: 400;
  color: var(--texto-tenue);
}

.campo__control {
  width: 100%;
  min-height: 48px;
  padding: 12px 14px;
  background: var(--superficie);
  color: var(--texto);
  border: 1px solid var(--texto-tenue);
  border-radius: var(--radio);
  font-family: var(--fuente-texto);
  font-size: 16px;   /* 16px evita que el movil haga zoom al enfocar */
  line-height: 1.5;
}

textarea.campo__control { min-height: 140px; resize: vertical; }

.campo__control::placeholder { color: var(--texto-tenue); opacity: 1; }
.campo__control:hover { border-color: var(--texto); }
.campo__control:user-invalid { border-color: var(--accion); }

.campo__consentimiento {
  display: grid;
  grid-template-columns: auto 1fr;
  gap: 12px;
  align-items: start;
  font-size: 15px;
  color: var(--texto-tenue);
}

/* La casilla se ve de 22 px, que es lo que pide el diseño, pero se pulsa en un
   area de 44. Es el campo obligatorio justo antes de enviar, y en un movil una
   casilla de 20 px se falla una de cada tres veces: quien falla dos, se va.
   El area extra se consigue con un pseudoelemento estirado, no agrandando la
   casilla, para que el dibujo no cambie. */
.campo__consentimiento input[type="checkbox"] {
  position: relative;
  width: 22px;
  height: 22px;
  margin: 2px 0 0;
  accent-color: var(--marca);
}

.campo__consentimiento input[type="checkbox"]::after {
  content: "";
  position: absolute;
  /* (44 - 22) / 2 = 11 px por cada lado. */
  inset: -11px;
}

/* La etiqueta tambien vale para marcarla, y eso ya da un objetivo grande; el
   area de arriba es para quien va directo a la casilla. */
.campo__consentimiento label {
  cursor: pointer;
  padding-block: 4px;
}

.campo__consentimiento a { color: var(--marca); }

/* 15. Calculadora ========================================================= */

/* Tres campos en fila en pantalla ancha, uno debajo de otro en el movil. El
   minimo de 200 px es lo que necesita la etiqueta mas larga para no partirse
   en cuatro lineas. */
.calculadora__campos {
  display: grid;
  gap: 24px;
  grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
  align-items: start;
}

/* El texto de ayuda va debajo de la etiqueta y encima del campo, que es donde
   se lee antes de escribir. Puesto debajo del campo llega tarde. */
.campo__ayuda {
  font-size: 14px;
  line-height: 1.45;
  color: var(--texto-tenue);
  margin: 0;
}

/* El resultado. <output> es un elemento de formulario de verdad, no un div
   disfrazado: los lectores de pantalla lo anuncian solo cuando cambia, sin
   que haga falta mover el foco ni interrumpir a quien esta escribiendo. */
.calculadora__salida {
  display: block;
  margin-top: 32px;
  padding: 28px;
  background: var(--fondo);
  border: 1px solid var(--borde);
  border-radius: var(--radio);
}

.calculadora__espera {
  margin: 0;
  color: var(--texto-tenue);
}

.calculadora__titulillo {
  font-size: 15px;
  font-weight: 500;
  color: var(--texto-tenue);
  margin: 0 0 4px;
}

/* La cifra grande. Sin ambar: el ambar de esta pagina es el boton del cierre,
   y la identidad no admite dos. Que destaque lo hace el tamaño, no el color. */
.calculadora__total {
  font-size: clamp(38px, 6vw, 60px);
  line-height: 1.05;
  color: var(--texto);
  margin: 0;
}

.calculadora__anual {
  margin: 8px 0 0;
  color: var(--texto-tenue);
}

/* La cuenta desglosada. Va siempre a la vista, no escondida tras un
   desplegable: una calculadora que no enseña como calcula pide un acto de fe,
   y aqui lo que se vende es justo lo contrario. */
.calculadora__cuenta {
  margin: 24px 0 0;
  padding-top: 20px;
  border-top: 1px solid var(--borde);
  font-size: 15px;
  line-height: 1.6;
  color: var(--texto-tenue);
}

.calculadora__aviso {
  margin: 16px 0 0;
  font-size: 15px;
  line-height: 1.6;
  color: var(--texto-tenue);
}

/* 16. Utilidades ========================================================== */

/* Texto que solo leen los lectores de pantalla. Si recibe el foco (el enlace
   de salto al contenido), vuelve a ser visible. */
.solo-lectura-pantalla {
  position: absolute;
  width: 1px;
  height: 1px;
  padding: 0;
  margin: -1px;
  overflow: hidden;
  clip: rect(0, 0, 0, 0);
  clip-path: inset(50%);
  white-space: nowrap;
  border: 0;
}

.solo-lectura-pantalla:focus,
.solo-lectura-pantalla:focus-visible {
  position: fixed;
  top: 12px;
  left: 12px;
  z-index: 100;
  width: auto;
  height: auto;
  margin: 0;
  padding: 12px 18px;
  overflow: visible;
  clip: auto;
  clip-path: none;
  background: var(--accion);
  color: var(--tinta);
  border-radius: var(--radio);
  font-weight: 600;
  text-decoration: none;
}

/* Dato por confirmar: tiene que cantar a la vista mientras siga ahi. */
.pendiente {
  background: #FFF3DE;
  color: #8A5A00;
  padding: 2px 6px;
  border-radius: 3px;
  font-weight: 500;
}

/* Separacion superior para la linea, el enlace o el boton que va justo debajo
   de una rejilla, una tabla o la conversacion: los parrafos solo traen margen
   inferior, asi que sin esto quedan pegados al bloque de arriba. */
.separado { margin-top: var(--hueco); }

/* Ancho de lectura para un parrafo suelto que cae en una seccion ancha: sin
   esto pasa de los cien caracteres por linea a 1280 px y se lee mal. Mismo
   criterio que .faq__respuesta, un poco mas corto porque aqui el texto va a
   cuerpo normal y no en gris. */
.ancho-lectura { max-width: 68ch; }

.centrado { text-align: center; }
.centrado .entradilla { margin-inline: auto; }

/* 17. Adaptable =========================================================== */

/* Por debajo de esto el boton de la cabecera dice "Probar" a secas (ver
   .cabecera__cta en la seccion 7); a partir de aqui cabe entero. */
@media (min-width: 480px) {
  .cabecera__cta { padding-inline: 24px; }
  .cabecera__cta-extra { display: inline; }
}

@media (min-width: 640px) {
  .rejilla--2 { grid-template-columns: repeat(2, 1fr); }
  .cabecera > .envoltura { min-height: 72px; }
}

/* A partir de aqui el menu cabe en una linea y la hamburguesa sobra. */
@media (min-width: 860px) {
  .cabecera__hamburguesa,
  .cabecera__interruptor { display: none; }

  .cabecera__nav,
  .cabecera__interruptor:checked ~ .cabecera__nav,
  .cabecera__nav.abierto {
    display: flex;
    position: static;
    flex-direction: row;
    align-items: center;
    gap: 2px;
    padding: 0;
    background: transparent;
    border-bottom: 0;
  }

  /* Desplegable "Tipos de bot" abierto: un panel que flota justo debajo de su
     disparador. Los tres enlaces salen del flujo con position:absolute, y esa
     es la pieza que faltaba: en flujo estiraban la cabecera de 68 a 103 px y
     empujaban el resto del menu. Estar fuera del flujo obliga a darles la
     altura a mano, por eso va en variables: --submenu-alto son los 40 px de
     cada enlace contando su borde (18 de linea, 20 de relleno, 2 de borde), y
     si algun dia cambia el relleno se ajusta ahi y ya.

     El fondo y el borde del panel los dibuja un seudoelemento de <details>, no
     los propios enlaces. Asi los enlaces siguen sin fondo y el hover y el
     resaltado de la pagina actual, que ya existian, siguen funcionando tal
     cual sin pelearse con nada. Sin sombra: esta web no usa ninguna. */
  .cabecera__nav > details {
    position: relative;
    --submenu-ancho: 216px;
    --submenu-alto: 40px;
    --submenu-hueco: 8px;
  }

  .cabecera__nav > details[open]::before {
    content: "";
    position: absolute;
    top: calc(100% + var(--submenu-hueco));
    left: 0;
    width: var(--submenu-ancho);
    height: calc(3 * var(--submenu-alto) + 2px);
    background: var(--superficie);
    border: 1px solid var(--borde);
    border-radius: var(--radio);
  }

  .cabecera__nav > details > a.cabecera__enlace {
    position: absolute;
    left: 1px;
    width: calc(var(--submenu-ancho) - 2px);
    height: var(--submenu-alto);
    margin: 0;
    padding: 10px 12px;
    line-height: 18px;
    border-radius: 0;
  }

  .cabecera__nav > details > a.cabecera__enlace:nth-of-type(1) {
    top: calc(100% + var(--submenu-hueco) + 1px);
    border-radius: 5px 5px 0 0;
  }

  .cabecera__nav > details > a.cabecera__enlace:nth-of-type(2) {
    top: calc(100% + var(--submenu-hueco) + 1px + var(--submenu-alto));
  }

  .cabecera__nav > details > a.cabecera__enlace:nth-of-type(3) {
    top: calc(100% + var(--submenu-hueco) + 1px + 2 * var(--submenu-alto));
    border-radius: 0 0 5px 5px;
  }
}

@media (min-width: 1024px) {
  .rejilla--3 { grid-template-columns: repeat(3, 1fr); }
  .rejilla--4 { grid-template-columns: repeat(4, 1fr); }
  .planes { grid-template-columns: repeat(4, 1fr); }
  .paso { gap: 20px; }
}

/* 18. Movimiento reducido ================================================= */

@media (prefers-reduced-motion: reduce) {
  *,
  *::before,
  *::after {
    animation: none !important;
    transition: none !important;
    scroll-behavior: auto !important;
  }
}

/* 19. Impresion =========================================================== */

@media print {
  :root {
    --fondo: #FFFFFF;
    --superficie: #FFFFFF;
    --borde: #999999;
    --texto: #000000;
    --texto-tenue: #333333;
    --marca: #000000;
    --marca-hover: #000000;
  }

  body { background: #FFFFFF; color: #000000; }

  .cabecera,
  .pie,
  .cabecera__hamburguesa { display: none !important; }

  .seccion { padding-block: 24px; }
  .seccion--banda { background: #FFFFFF; color: #000000; }
  .tarjeta, .plan, .conversacion { border-color: #999999; }
  a { color: #000000; text-decoration: underline; }
}
