/*
 * assets/home.css — Portada de zaalen
 *
 * ══════════════════════════════════════════════════════════════════════
 * QUÉ ES ESTO Y POR QUÉ NO ES app.css
 * ══════════════════════════════════════════════════════════════════════
 *
 * app.css viste el ARMAZÓN DE PRODUCTO: barra oscura, barra lateral
 * colapsable, panel de ajustes. Es el mueble que comparten DEZIMI, OCTABI
 * y QUMERIQ, y qumeriq.html lo reproduce a propósito para que quien pasa
 * de la web al producto reconozca el mismo sitio.
 *
 * La portada de zaalen no es eso. Es un escaparate: barra superior
 * transparente sobre vídeo, mega-menú desplegable, hero a pantalla
 * completa. Meter ambas cosas en app.css obligaría a acotar cada regla
 * con un `body.home` y las dos páginas se estorbarían en cada cambio.
 * Así que este fichero es independiente y sólo comparte con el resto los
 * TOKENS y las @font-face de theme.css, que sí es la única fuente de
 * verdad de la marca.
 *
 * Orden del fichero: base → barra superior → mega-menú → waffle → hero
 * → secciones → pie → móvil. El bloque de móvil va al final entero, en
 * vez de repartido, porque en una portada la versión estrecha es una
 * reorganización de todo el armazón y no un retoque suelto.
 */

/* ══════════════════════════════════════════════════════════════════════
   1 · BASE
   ══════════════════════════════════════════════════════════════════════ */

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

html {
  /* El scroll suave lo pide la navegación por anclas del mega-menú, pero
     se retira más abajo para quien ha pedido menos movimiento. */
  scroll-behavior: smooth;
  /* La barra es fija: sin esto, un ancla deja el titular debajo de ella. */
  scroll-padding-top: 88px;
  -webkit-text-size-adjust: 100%;
}

body {
  margin: 0;
  background: var(--bg);
  color: var(--text);
  font-family: var(--font);
  font-size: var(--fs-md);
  line-height: 1.6;
  -webkit-font-smoothing: antialiased;
  overflow-x: hidden;
}

/* Con el menú móvil o un mega-menú abiertos, el fondo no debe correr. */
body.is-locked { overflow: hidden; }

img, svg, video { display: block; max-width: 100%; }
a { color: inherit; text-decoration: none; }
button { font: inherit; color: inherit; }

h1, h2, h3, h4 {
  margin: 0;
  font-family: var(--font-display, var(--font));
  font-weight: 700;
  line-height: 1.1;
  letter-spacing: -0.02em;
}

/* Sólo para lectores de pantalla: el texto está, pero no ocupa. */
.sr-only {
  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;
}

/* El foco visible se declara una vez y para todo: es la única pista que
   tiene quien navega con el teclado, y se pierde en cuanto una regla de
   componente pone outline:none sin reponerlo. */
:focus-visible {
  outline: 3px solid var(--brand);
  outline-offset: 2px;
}
/* Sobre el vídeo, el azul de marca no se ve: ahí el foco va en blanco. */
.hero :focus-visible, .topbar:not(.is-solid) :focus-visible {
  outline-color: #fff;
}

/* Salto al contenido: el primer tabulador de la página. */
.skip {
  position: absolute; top: -60px; left: 12px; z-index: 200;
  padding: 10px 18px; background: var(--brand); color: #fff;
  font-weight: 600; transition: top var(--transition);
}
.skip:focus { top: 12px; }

.wrap {
  width: 100%;
  max-width: 1320px;
  margin-inline: auto;
  padding-inline: 32px;
}

/* ══════════════════════════════════════════════════════════════════════
   2 · BARRA SUPERIOR
   ══════════════════════════════════════════════════════════════════════

   Empieza transparente y encima del vídeo —de ahí el texto blanco— y se
   vuelve sólida en cuanto la página baja del hero, que es cuando debajo
   hay fondo claro y el blanco dejaría de leerse. La clase la pone
   home.js con un IntersectionObserver sobre el hero, no con un listener
   de scroll: el observador no corre en cada píxel.  */

.topbar {
  position: fixed;
  inset: 0 0 auto 0;
  z-index: 100;
  display: flex;
  align-items: center;
  gap: 4px;
  height: 68px;
  padding-inline: 32px;
  color: #fff;
  background: transparent;
  transition: background var(--transition), color var(--transition),
              box-shadow var(--transition), border-color var(--transition);
  border-bottom: 1px solid transparent;
}

/* Sólida: al bajar del hero, o mientras un mega-menú está abierto (el
   panel es claro y tiene que nacer de una barra clara, no del vídeo). */
.topbar.is-solid,
.topbar.has-open {
  background: var(--surface);
  color: var(--text);
  border-bottom-color: var(--border-dim);
}

.topbar-logo {
  display: flex;
  align-items: center;
  padding: 8px 10px 8px 0;
  flex: 0 0 auto;
}
.topbar-mark {
  height: 26px;
  width: auto;
  /* El logotipo trae el rojo de marca cocido en los travesaños y el azul
     como currentColor. Sobre el vídeo, ese azul sería ilegible: se hereda
     el blanco de la barra y el rojo se deja estar, que sí contrasta. */
  color: currentColor;
}
/* En cuanto la barra se vuelve sólida, el fondo pasa a ser el papel claro
   del tema y el azul de marca ya se lee: el logotipo deja de heredar y
   sale en el #0032a0 del original, con el rojo que ya trae dentro. Es la
   misma marca que en la firma de SOLUCIONES, y por la misma razón —debajo
   hay blanco—; sobre el vídeo sigue en blanco, que es donde el azul no
   aguantaría.

   No hace falta tocar la transición: .topbar ya anima `color`, así que el
   paso de blanco a azul se funde a la vez que el del resto de la barra. */
.topbar.is-solid .topbar-mark,
.topbar.has-open .topbar-mark { color: #0032a0; }

/* Los cinco apartados. Van en un <nav> propio para que el orden de
   tabulación sea marca → apartados → acciones. */
.topnav {
  display: flex;
  align-items: center;
  gap: 2px;
  margin-left: 14px;
}

.topnav-item {
  position: relative;
  display: inline-flex;
  align-items: center;
  gap: 5px;
  padding: 9px 13px;
  border: 0;
  background: none;
  font-size: var(--fs-base);
  font-weight: 500;
  cursor: pointer;
  white-space: nowrap;
  border-radius: var(--radius-sm);
  transition: background var(--transition), opacity var(--transition);
}
.topnav-item:hover { background: rgb(127 127 127 / 0.16); }
.topnav-item[aria-expanded="true"] { background: rgb(127 127 127 / 0.12); }

/* El galón de los que despliegan. Gira al abrirse: es la señal de que el
   panel de abajo pertenece a este botón y no es una capa suelta. */
.topnav-caret {
  width: 10px; height: 10px;
  flex: 0 0 auto;
  transition: transform var(--transition);
}
.topnav-item[aria-expanded="true"] .topnav-caret { transform: rotate(180deg); }

/* Empuja las acciones al extremo contrario sin recurrir a un margin
   automático, que en RTL habría que invertir a mano. */
.topbar-spacer { flex: 1 1 auto; }

.topbar-actions {
  display: flex;
  align-items: center;
  gap: 6px;
  flex: 0 0 auto;
}

.icon-btn {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  gap: 6px;
  width: 40px; height: 40px;
  padding: 0;
  border: 0;
  background: none;
  cursor: pointer;
  border-radius: var(--radius-sm);
  transition: background var(--transition);
}
.icon-btn:hover { background: rgb(127 127 127 / 0.16); }
.icon-btn[aria-expanded="true"] { background: rgb(127 127 127 / 0.12); }
.icon-btn svg { width: 20px; height: 20px; }

/* El botón de idioma muestra el código ('es', 'ar'…) en vez de un globo:
   dice en qué idioma está la página ahora, que es la información que
   busca quien lo pulsa. */
.lang-btn {
  width: auto;
  min-width: 40px;
  padding-inline: 11px;
  font-size: var(--fs-sm);
  font-weight: 600;
  text-transform: uppercase;
  letter-spacing: 0.04em;
}

/* Iniciar sesión. Va en píldora aunque el tema imponga --radius:0 a todo
   lo demás: es el único elemento de la barra que tiene que leerse como
   botón desde el rabillo del ojo, como en la referencia. */
.signin-btn {
  display: inline-flex;
  align-items: center;
  height: 40px;
  padding-inline: 20px;
  margin-left: 4px;
  border: 1px solid currentColor;
  border-radius: 999px;
  background: transparent;
  color: inherit;
  font-size: var(--fs-base);
  font-weight: 600;
  white-space: nowrap;
  cursor: pointer;
  transition: background var(--transition), color var(--transition),
              border-color var(--transition);
}
.signin-btn:hover { background: currentColor; }
/* El texto invierte con el fondo, y se hace con un hijo porque el propio
   botón usa currentColor para pintar ese fondo.
   Sobre el vídeo, currentColor es BLANCO: el hover deja el botón blanco,
   y el rótulo tiene que irse a oscuro o desaparece. Aquí decía
   var(--surface) —el papel del tema, casi blanco— y el resultado era
   blanco sobre blanco: el botón se quedaba vacío al pasar por encima.
   El valor es el mismo #14161a que usa .btn-primary, que es el otro
   botón claro de esta página. */
.signin-btn:hover .signin-label { color: #14161a; }
.topbar.is-solid .signin-btn,
.topbar.has-open .signin-btn {
  border-color: var(--text);
  background: var(--text);
}
.topbar.is-solid .signin-label,
.topbar.has-open .signin-label { color: var(--surface); }
/* Con la barra sólida el hover es otro: el botón ya era oscuro y pasa a
   azul de marca, así que ahí el rótulo sí se queda en el papel claro. */
.topbar.is-solid .signin-btn:hover,
.topbar.has-open .signin-btn:hover { background: var(--brand); border-color: var(--brand); }
.topbar.is-solid .signin-btn:hover .signin-label,
.topbar.has-open .signin-btn:hover .signin-label { color: var(--surface); }

/* La hamburguesa sólo existe en pantallas estrechas. */
.burger-btn { display: none; }
.burger { display: block; width: 18px; height: 12px; position: relative; }
.burger span {
  position: absolute; left: 0; width: 100%; height: 2px;
  background: currentColor; transition: transform var(--transition), opacity var(--transition);
}
.burger span:nth-child(1) { top: 0; }
.burger span:nth-child(2) { top: 5px; }
.burger span:nth-child(3) { top: 10px; }
.burger-btn[aria-expanded="true"] .burger span:nth-child(1) { transform: translateY(5px) rotate(45deg); }
.burger-btn[aria-expanded="true"] .burger span:nth-child(2) { opacity: 0; }
.burger-btn[aria-expanded="true"] .burger span:nth-child(3) { transform: translateY(-5px) rotate(-45deg); }

/* ══════════════════════════════════════════════════════════════════════
   3 · MEGA-MENÚ
   ══════════════════════════════════════════════════════════════════════

   Un panel por apartado desplegable, todos hijos del mismo contenedor
   fijo bajo la barra. Se ocultan con [hidden] y no con display:none en
   una clase: así el atributo es a la vez el estado del CSS y lo que lee
   la tecnología de apoyo, y no hay dos verdades que sincronizar.  */

.megawrap {
  position: fixed;
  inset: 68px 0 auto 0;
  z-index: 99;
}

.mega {
  background: var(--surface);
  border-bottom: 1px solid var(--border-dim);
  box-shadow: 0 18px 34px -22px rgb(0 0 0 / 0.45);
  color: var(--text);
  /* La animación es de opacidad y desplazamiento, nunca de height: animar
     la altura de un panel con seis fichas dentro obliga al navegador a
     recalcular la maqueta en cada fotograma.

     La opacidad se declara además en la regla base, y no sólo en el
     fotograma final. Un panel cuyo único estado visible viniera de la
     animación queda INVISIBLE pero clicable en cuanto algo impide que
     ésta corra —una impresión, un modo de contraste forzado, un motor que
     retiene el fotograma inicial—, que es la peor avería posible: ocupa
     la pantalla y no se ve. Así el estado normal es "visible" y la
     animación sólo decora la entrada. */
  opacity: 1;
  animation: mega-in 180ms cubic-bezier(0.4, 0, 0.2, 1);
}
.mega[hidden] { display: none; }

@keyframes mega-in {
  from { opacity: 0; transform: translateY(-8px); }
  to   { opacity: 1; transform: none; }
}

.mega-inner {
  display: grid;
  gap: 22px;
  padding-block: 30px 34px;
}

.mega-grid {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(250px, 1fr));
  gap: 14px;
}

/* Cada ficha del panel. Es un <a> entero y no un titular enlazado dentro
   de un div: el destino es la ficha completa, y hacerlo con el enlace
   real evita tener que simularlo con un click en JavaScript, que dejaría
   fuera la rueda del ratón y el "abrir en pestaña nueva". */
.mega-card {
  display: grid;
  grid-template-columns: auto 1fr;
  align-items: start;
  gap: 14px;
  padding: 16px 18px;
  border: 1px solid var(--border-dim);
  border-radius: var(--radius-md);
  background: var(--surface);
  transition: border-color var(--transition), background var(--transition),
              transform var(--transition);
}
.mega-card:hover {
  border-color: var(--brand-mid);
  background: var(--brand-bg);
  transform: translateY(-2px);
}

.mega-card-icon { width: 34px; height: 34px; flex: 0 0 auto; }
/* El icono de app va en color, tal cual lo sirve el waffle. Los iconos de
   sección son de trazo y heredan el azul de marca. */
.mega-card-icon.is-stroke { color: var(--brand); }

.mega-card-name {
  display: block;
  margin-bottom: 3px;
  font-size: var(--fs-md);
  font-weight: 700;
  letter-spacing: -0.01em;
}
/* El nombre de una app no se compone con la fuente de interfaz: es el
   trazado del logotipo, en currentColor. Ver la nota de AppLockup. */
.mega-card-lockup { height: 15px; width: auto; margin-bottom: 6px; color: var(--text); }
.mega-card-desc {
  margin: 0;
  font-size: var(--fs-sm);
  line-height: 1.5;
  color: var(--text-2);
}

.mega-foot {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: 8px 18px;
  padding-top: 18px;
  border-top: 1px solid var(--border-dim);
  font-size: var(--fs-sm);
  color: var(--text-2);
}
.mega-link {
  display: inline-flex;
  align-items: center;
  gap: 6px;
  font-weight: 600;
  color: var(--brand);
}
.mega-link:hover { color: var(--brand-dark); text-decoration: underline; }
.mega-link svg { width: 13px; height: 13px; }

/* La cortina que oscurece la página bajo un mega-menú abierto. Además de
   señalar dónde está el foco, es la superficie que cierra el panel al
   pulsar fuera, sin necesidad de un listener en todo el documento. */
.scrim {
  position: fixed;
  inset: 0;
  z-index: 90;
  background: rgb(0 0 0 / 0.34);
  border: 0;
  opacity: 1;                      /* ver la nota de .mega */
  animation: fade-in 180ms ease;
}
.scrim[hidden] { display: none; }
@keyframes fade-in { from { opacity: 0; } to { opacity: 1; } }

/* ══════════════════════════════════════════════════════════════════════
   4 · WAFFLE DE APLICACIONES Y MENÚ DE IDIOMA
   ══════════════════════════════════════════════════════════════════════

   Los dos son desplegables anclados a su botón, no paneles a lo ancho.
   Comparten caja para que se abran igual y no haya dos estilos de
   ventanita en la misma barra.  */

.pop {
  position: absolute;
  top: 58px;
  right: 24px;
  z-index: 101;
  min-width: 230px;
  padding: 10px;
  background: var(--surface);
  color: var(--text);
  border: 1px solid var(--border-dim);
  border-radius: var(--radius-md);
  box-shadow: 0 20px 40px -20px rgb(0 0 0 / 0.5);
  opacity: 1;                      /* ver la nota de .mega */
  animation: mega-in 160ms cubic-bezier(0.4, 0, 0.2, 1);
}
.pop[hidden] { display: none; }

.pop-title {
  padding: 4px 10px 10px;
  font-size: var(--fs-xxs);
  font-weight: 700;
  text-transform: uppercase;
  letter-spacing: 0.09em;
  color: var(--text-3);
}

/* ── Waffle ────────────────────────────────────────────────────────────
   Mismo lanzador que llevan DEZIMI, OCTABI y QUMERIQ, reproducido aquí
   pieza por pieza: quien viene de una app y pulsa el mismo icono en el
   mismo sitio tiene que encontrarse el mismo panel.

   Y no es una rejilla de tres iguales, que es lo que había: es una
   jerarquía. QUMERIQ arriba, solo y centrado a lo ancho del panel,
   porque es la suite; una línea; y debajo las aplicaciones que viven
   dentro, en filas de identidad + descripción. Puestas las tres en fila
   parecerían hermanas, que es justo el malentendido que el apartado de
   productos se pasa media página deshaciendo.

   El ancho fijo es el del panel de las apps. Sin él, el .pop se
   encogería a su min-width y las descripciones saldrían en tiras de tres
   palabras.  */
.pop-waffle { width: 420px; max-width: calc(100vw - 32px); }

.waffle-suite {
  display: grid;
  justify-items: center;
  gap: 9px;
  padding: 14px 10px 12px;
  border-radius: var(--radius-sm);
  transition: background var(--transition);
}
.waffle-suite:hover { background: var(--brand-bg); }
.waffle-suite img { width: 34px; height: 34px; }

/* El divisor entre la suite y lo que hay dentro de ella. Es la pieza que
   dice "lo de abajo está dentro de lo de arriba" sin escribirlo. */
.waffle-rule {
  height: 1px;
  margin: 8px 4px;
  background: var(--border-dim);
}

/* 1fr 2fr, como en las apps: la identidad ocupa un tercio y la
   descripción dos. Con las dos columnas iguales, la descripción se
   partía en cuatro líneas y la marca quedaba flotando en un hueco. */
.waffle-app {
  display: grid;
  grid-template-columns: 1fr 2fr;
  align-items: center;
  gap: 10px;
  padding: 10px;
  border: 1px solid transparent;
  border-radius: var(--radius-sm);
  text-align: start;
  transition: background var(--transition), border-color var(--transition);
}
.waffle-app:hover { background: var(--brand-bg); border-color: var(--brand-mid); }

.waffle-app-id {
  display: grid;
  justify-items: center;
  gap: 6px;
}
.waffle-app img { width: 30px; height: 30px; }
.waffle-name { height: 11px; width: auto; color: var(--text); }

.waffle-app-desc {
  font-size: var(--fs-xs);
  line-height: 1.4;
  color: var(--text-2);
}

.lang-list {
  display: grid;
  grid-template-columns: repeat(2, 1fr);
  gap: 2px;
  max-height: min(60vh, 420px);
  overflow-y: auto;
}
.lang-opt {
  display: block;
  width: 100%;
  padding: 8px 11px;
  border: 0;
  background: none;
  text-align: start;
  font-size: var(--fs-sm);
  cursor: pointer;
  border-radius: var(--radius-sm);
  transition: background var(--transition);
}
.lang-opt:hover { background: var(--brand-bg); }
.lang-opt[aria-current="true"] { background: var(--brand); color: #fff; font-weight: 600; }

/* ══════════════════════════════════════════════════════════════════════
   5 · HERO CON VÍDEO
   ══════════════════════════════════════════════════════════════════════

   Tres escenas, una visible cada vez. Todas están en el DOM a la vez
   —apiladas en la misma celda de la rejilla— y sólo cambia la opacidad:
   así el navegador ya tiene decodificado el vídeo siguiente cuando le
   toca, y la transición es un fundido y no un salto en negro.  */

.hero {
  position: relative;
  display: flex;
  align-items: flex-end;
  min-height: min(92vh, 860px);
  padding-top: 68px;               /* el hueco de la barra fija */
  overflow: hidden;
  background: #0b0d10;             /* lo que se ve mientras nada ha cargado */
  color: #fff;
  isolation: isolate;
}

.hero-media {
  position: absolute;
  inset: 0;
  z-index: -2;
}
/* El relevo entre escenas es un CORTE, no un fundido: la escena que entra
   sustituye a la anterior de un fotograma al siguiente. Sin transición de
   opacidad, que es lo que hacía el cruce.

   Con el cruce puesto, los dos vídeos se veían a la vez durante casi un
   segundo y la imagen se emborronaba justo en el momento en que cambia
   también el titular; el corte deja el cambio en un solo instante y lo
   hace legible. Es además lo que hace cualquier montaje que se respete:
   el fundido encadenado significa "ha pasado el tiempo", y aquí no ha
   pasado nada, sólo cambia el plano.

   El texto de la escena sí conserva su fundido —ver .hero-slide—: es
   media línea de opacidad sobre un bloque pequeño, no una imagen a
   pantalla completa, y ahí el cruce no emborrona nada. */
.hero-video {
  position: absolute;
  inset: 0;
  width: 100%;
  height: 100%;
  object-fit: cover;
  opacity: 0;
}
.hero-video.is-active { opacity: 1; }

/* El degradado. Mismo planteamiento que el lienzo de células de QUMERIQ:
   una capa de negro a transparente por delante del movimiento, para que
   el texto tenga contraste sin apagar la imagen. Son dos: una en
   vertical, que ata el titular al suelo y da fondo a la barra, y otra en
   horizontal, que despeja el lado del texto. Van en un pseudo-elemento y
   no en un <div> porque no son contenido. */
.hero-media::after {
  content: '';
  position: absolute;
  inset: 0;
  background:
    linear-gradient(to bottom, rgb(0 0 0 / 0.72) 0%, rgb(0 0 0 / 0.30) 26%,
                    rgb(0 0 0 / 0.34) 55%, rgb(0 0 0 / 0.88) 100%),
    linear-gradient(to right, rgb(0 0 0 / 0.80) 0%, rgb(0 0 0 / 0.45) 46%,
                    rgb(0 0 0 / 0.05) 78%);
}
/* En RTL el texto va a la derecha, así que el degradado lateral se gira.
   Es la única regla direccional del fichero: el resto usa propiedades
   lógicas (padding-inline, text-align:start) y no necesita gemela. */
[dir="rtl"] .hero-media::after {
  background:
    linear-gradient(to bottom, rgb(0 0 0 / 0.72) 0%, rgb(0 0 0 / 0.30) 26%,
                    rgb(0 0 0 / 0.34) 55%, rgb(0 0 0 / 0.88) 100%),
    linear-gradient(to left, rgb(0 0 0 / 0.80) 0%, rgb(0 0 0 / 0.45) 46%,
                    rgb(0 0 0 / 0.05) 78%);
}

.hero-body {
  position: relative;
  z-index: 1;
  width: 100%;
  padding-block: 60px 34px;
}

.hero-copy { max-width: 640px; }

/* Las tres redacciones se apilan en la misma celda para que el bloque no
   cambie de altura al pasar de escena y las fichas de abajo no bailen. */
.hero-slides { display: grid; }
.hero-slide {
  grid-area: 1 / 1;
  opacity: 0;
  transform: translateY(10px);
  transition: opacity 520ms ease, transform 520ms ease;
  pointer-events: none;
}
.hero-slide.is-active {
  opacity: 1;
  transform: none;
  pointer-events: auto;
}

/* ── Palabras que no caben ──────────────────────────────────────────────
   Un elemento de rejilla no baja de su ancho mínimo de contenido, y en un
   titular ese mínimo es la PALABRA MÁS LARGA. En castellano no da
   problemas, pero el sitio se sirve en trece idiomas: en alemán había un
   "Tabellenkalkulation" que medía 458 px a este cuerpo de letra —más que
   un móvil entero— y el titular se salía de la pantalla arrastrando
   consigo toda la columna del hero. Esa palabra ya se cambió en el
   paquete de alemán, pero el euskera sigue teniendo
   "Sekuentziagailutik" y la próxima traducción traerá la suya.

   min-width:0 le devuelve a la rejilla el permiso para encoger el
   elemento, y las dos propiedades de partición le dicen a la palabra qué
   hacer con el espacio que le queda: guionarse si el navegador sabe
   hacerlo en ese idioma —de ahí que <html lang> se mantenga al día— y
   partirse en seco si no. Sin la segunda, un navegador sin diccionario
   alemán volvería a desbordar.

   Va también en los titulares de sección y de ficha, que corren el mismo
   riesgo con los mismos idiomas. */
.hero-slide { min-width: 0; }
.head h2,
.card h3,
.band h3,
.mega-card-name {
  overflow-wrap: break-word;
  hyphens: auto;
}

/* Los titulares del hero se quedan fuera de la guionación, y a propósito.
   Son las cuatro palabras más grandes de la página, a cuerpo 41 px: un
   guion ahí no pasa desapercibido como en un párrafo, parte la frase por
   la mitad y se lee antes el guion que el titular. Aquí las líneas se
   cortan por los espacios y nada más.

   overflow-wrap sí se queda, y no contradice lo anterior: no toca ninguna
   palabra que quepa. Sólo actúa sobre una que no entre ni ella sola en el
   ancho de la columna, y entonces la parte en seco —sin guion— en vez de
   dejar que se salga de la pantalla arrastrando la columna entera. Es la red de seguridad para el alemán y el euskera en
   un móvil estrecho; con los textos de hoy no llega a dispararse. */
.hero-slide h1 { hyphens: none; overflow-wrap: break-word; }

.hero-kicker {
  margin: 0 0 14px;
  font-size: var(--fs-sm);
  font-weight: 600;
  letter-spacing: 0.11em;
  text-transform: uppercase;
  color: rgb(255 255 255 / 0.82);
}
.hero-slide h1 {
  margin: 0 0 18px;
  font-size: clamp(2.4rem, 5.2vw, 4.1rem);
  line-height: 1.02;
  letter-spacing: -0.03em;
  text-wrap: balance;
}
.hero-desc {
  margin: 0 0 26px;
  max-width: 52ch;
  font-size: var(--fs-lg);
  line-height: 1.5;
  color: rgb(255 255 255 / 0.88);
}

.hero-actions { display: flex; flex-wrap: wrap; gap: 12px; }

.btn {
  display: inline-flex;
  align-items: center;
  gap: 8px;
  padding: 13px 26px;
  border: 1px solid transparent;
  border-radius: 999px;
  font-size: var(--fs-base);
  font-weight: 600;
  cursor: pointer;
  white-space: nowrap;
  transition: background var(--transition), color var(--transition),
              border-color var(--transition), transform var(--transition);
}
.btn:hover { transform: translateY(-1px); }
.btn-primary { background: #fff; color: #14161a; }
.btn-primary:hover { background: var(--brand); color: #fff; }
.btn-ghost { border-color: rgb(255 255 255 / 0.6); color: #fff; }
.btn-ghost:hover { background: rgb(255 255 255 / 0.14); border-color: #fff; }
/* Sobre fondo claro, en las secciones de abajo. */
.btn-solid { background: var(--brand); color: #fff; }
.btn-solid:hover { background: var(--brand-dark); }
.btn-line { border-color: var(--text); color: var(--text); }
.btn-line:hover { background: var(--text); color: var(--surface); }

/* ── Fichas de escena ──────────────────────────────────────────────────
   La fila de abajo del hero. Son botones y no enlaces: no llevan a otra
   página, cambian lo que se está viendo. */

.hero-rail {
  display: flex;
  align-items: stretch;
  gap: 12px;
  margin-top: 46px;
}

.hero-card {
  flex: 1 1 0;
  min-width: 0;
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 12px;
  padding: 16px 18px;
  text-align: start;
  border: 1px solid rgb(255 255 255 / 0.30);
  border-radius: var(--radius-md);
  /* El desenfoque de fondo es lo que mantiene legible el rótulo sobre un
     vídeo en movimiento sin tapar la imagen con un rectángulo opaco. */
  background: rgb(20 22 26 / 0.42);
  -webkit-backdrop-filter: blur(10px);
          backdrop-filter: blur(10px);
  color: #fff;
  font-size: var(--fs-base);
  font-weight: 600;
  cursor: pointer;
  transition: background var(--transition), border-color var(--transition),
              transform var(--transition);
}
.hero-card:hover { background: rgb(20 22 26 / 0.66); transform: translateY(-2px); }
/* La activa se invierte a blanco, como en la referencia: es el único
   estado que se distingue de un vistazo sobre imagen cambiante. */
.hero-card[aria-selected="true"] {
  background: #fff;
  border-color: #fff;
  color: #14161a;
}
.hero-card svg { width: 15px; height: 15px; flex: 0 0 auto; opacity: 0.75; }
.hero-card-label { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }

/* Pausa. Va suelto al final del carril, redondo, como el de Adobe. */
.hero-toggle {
  flex: 0 0 auto;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 44px; height: 44px;
  align-self: center;
  border: 1px solid rgb(255 255 255 / 0.34);
  border-radius: 999px;
  background: rgb(20 22 26 / 0.42);
  -webkit-backdrop-filter: blur(10px);
          backdrop-filter: blur(10px);
  color: #fff;
  cursor: pointer;
  transition: background var(--transition);
}
.hero-toggle:hover { background: rgb(20 22 26 / 0.7); }
.hero-toggle svg { width: 15px; height: 15px; }

/* ══════════════════════════════════════════════════════════════════════
   6 · SECCIONES
   ══════════════════════════════════════════════════════════════════════ */

.section { padding-block: clamp(64px, 8vw, 116px); }
.section.alt { background: var(--surface); }
.section.dark {
  background: var(--topbar);
  color: var(--topbar-text);
}
.section.dark .lead, .section.dark .card-desc { color: var(--topbar-dim); }
.section.dark .card {
  background: rgb(255 255 255 / 0.05);
  border-color: rgb(255 255 255 / 0.14);
}
.section.dark .card:hover { border-color: rgb(255 255 255 / 0.4); background: rgb(255 255 255 / 0.09); }

.head { max-width: 760px; margin-bottom: 46px; }
.kicker {
  margin: 0 0 12px;
  font-size: var(--fs-sm);
  font-weight: 600;
  letter-spacing: 0.11em;
  text-transform: uppercase;
  color: var(--brand);
}
.section.dark .kicker { color: #8fb0e8; }
.head h2 {
  margin: 0 0 16px;
  font-size: clamp(1.9rem, 3.4vw, 2.9rem);
  text-wrap: balance;
}
.lead {
  margin: 0;
  font-size: var(--fs-lg);
  line-height: 1.55;
  color: var(--text-2);
}

.grid { display: grid; gap: 18px; }
.grid.c2 { grid-template-columns: repeat(auto-fit, minmax(320px, 1fr)); }
.grid.c3 { grid-template-columns: repeat(auto-fit, minmax(290px, 1fr)); }
.grid.c4 { grid-template-columns: repeat(auto-fit, minmax(250px, 1fr)); }

.card {
  display: flex;
  flex-direction: column;
  gap: 12px;
  padding: 28px;
  background: var(--surface);
  border: 1px solid var(--border-dim);
  border-radius: var(--radius-md);
  transition: border-color var(--transition), transform var(--transition),
              box-shadow var(--transition);
}
.section.alt .card { background: var(--surface-2); }
.card:hover {
  border-color: var(--brand-mid);
  transform: translateY(-3px);
  box-shadow: 0 22px 40px -30px rgb(0 0 0 / 0.55);
}

.card-icon { width: 40px; height: 40px; color: var(--brand); }
.section.dark .card-icon { color: #8fb0e8; }
/* align-self es obligatorio, no cosmético: la ficha es un flex en columna
   y su align-items por defecto (stretch) estira el <svg> a todo el ancho.
   Un SVG con viewBox no se recorta al estirarse, centra su contenido
   (preserveAspectRatio vale xMidYMid), así que el nombre de la marca
   aparecía centrado en la ficha en vez de alineado con el icono. */
.card-lockup {
  height: 19px;
  width: auto;
  align-self: flex-start;
  color: currentColor;
}
.card h3 { font-size: var(--fs-xl); letter-spacing: -0.015em; }
.card-kicker {
  font-size: var(--fs-xs);
  font-weight: 600;
  letter-spacing: 0.09em;
  text-transform: uppercase;
  color: var(--text-3);
}
.card-desc { margin: 0; font-size: var(--fs-base); line-height: 1.6; color: var(--text-2); }
/* Empuja el enlace al pie de la ficha, para que todos queden alineados
   aunque las descripciones tengan distinto largo. */
.card-link {
  margin-top: auto;
  padding-top: 6px;
  display: inline-flex;
  align-items: center;
  gap: 7px;
  font-size: var(--fs-base);
  font-weight: 600;
  color: var(--brand);
}
.section.dark .card-link { color: #8fb0e8; }
.card-link svg { width: 13px; height: 13px; transition: transform var(--transition); }
.card:hover .card-link svg { transform: translateX(3px); }
/* ── Flechas en árabe ──────────────────────────────────────────────────
   Todo lo demás de esta hoja usa propiedades lógicas y se refleja solo,
   pero un icono no: una flecha dibujada hacia la derecha sigue apuntando
   a la derecha aunque el texto vaya al revés, y en árabe "seguir" es
   hacia la IZQUIERDA. Se espeja el dibujo, que es más fiable que
   mantener un segundo juego de trazados.

   Sólo las flechas de dirección. Los iconos de las fichas de solución
   —el birrete, el matraz, el escudo— no llevan dirección y espejarlos
   sería estropearlos. */
[dir="rtl"] .card-link svg,
[dir="rtl"] .mega-link svg,
[dir="rtl"] .hero-card svg { transform: scaleX(-1); }
[dir="rtl"] .card:hover .card-link svg { transform: scaleX(-1) translateX(3px); }

/* ── La marca en NOSOTROS ──────────────────────────────────────────────
   El tamaño grande es el punto: aquí la marca encabeza el apartado que
   habla de la sociedad, no señaliza una barra. Escala con la ventana pero
   con suelo, porque por debajo de unos 50 px de alto los cinco trazos del
   acento se empastan y el logotipo deja de leerse como tal.

   El color es el del original —el azul #0032a0, con el rojo que el
   símbolo ya trae dentro— y no el blanco que heredaría de .section.dark.
   Conviene saber lo que eso implica: sobre el carbón del apartado
   (#1b1b19) ese azul da 1,6:1, muy por debajo de lo que se le exigiría a
   un texto. Aquí se sostiene porque la marca es decorativa —el nombre va
   al lado en texto para el lector de pantalla— y porque a este tamaño los
   trazos son anchos y macizos: es una forma, no una palabra que haya que
   descifrar. Ésa es la otra razón del suelo de 52 px; encogida, el azul
   sobre el negro sí se perdería. */
.about-mark {
  display: block;
  height: clamp(52px, 9vw, 104px);
  width: auto;
  margin-bottom: clamp(26px, 3.2vw, 44px);
  color: #0032a0;
}

/* ── Firma de la casa ──────────────────────────────────────────────────
   Cierra SOLUCIONES con el logotipo en los colores del original. Es la
   única pieza de la página con color fijo, y es a propósito: los dos
   colores de la marca —#0032a0 y #e4002b— están calibrados sobre blanco,
   y sobre el fondo del tema oscuro el azul cae a 2,2:1 contra el papel.
   Antes que reencuadrar la marca en cada tema, se le pone su propio papel
   blanco debajo, que es lo que se hace al imprimirla en cualquier sitio.

   Y en cuanto el fondo deja de seguir al tema, TODO lo que va encima
   tiene que dejar de seguirlo también: heredar var(--text) daría letra
   clara sobre blanco en dataramsdark. De ahí que el texto y el botón de
   aquí dentro repitan los valores en vez de usar los tokens. */
.signature {
  margin-top: 22px;
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: clamp(18px, 3vw, 40px);
  padding: clamp(24px, 3.2vw, 40px);
  border: 1px solid #dfe4ee;
  border-radius: var(--radius-md);
  background: #fff;
  color: #141416;
}
/* El rojo ya va escrito dentro del símbolo; lo que se hereda —o sea el
   currentColor de las letras— es este azul. */
.signature-mark {
  height: clamp(30px, 4vw, 44px);
  width: auto;
  flex: 0 0 auto;
  color: #0032a0;
}
/* flex-basis en la columna de texto y no en el logotipo: cuando la placa
   se estrecha, lo que tiene que romper la fila es el texto, quedándose la
   marca y el botón donde estaban. */
.signature-body { flex: 1 1 320px; min-width: 0; }
.signature-title {
  margin: 0 0 6px;
  font-size: var(--fs-xl);
  letter-spacing: -0.015em;
  overflow-wrap: break-word;
  hyphens: auto;
}
.signature-desc { margin: 0; font-size: var(--fs-base); line-height: 1.6; color: #4a4d55; }
.signature .btn-solid { flex: 0 0 auto; background: #0032a0; color: #fff; }
.signature .btn-solid:hover { background: #00206b; }

/* ── Banda de normativa (SaMD) ─────────────────────────────────────────
   Un bloque a dos columnas: a la izquierda el argumento, a la derecha la
   lista de normas. La lista se saca del párrafo a propósito: quien busca
   "¿cumplís la MDR?" quiere ver el número del reglamento, no leerlo
   dentro de una frase. */

.band {
  display: grid;
  grid-template-columns: minmax(0, 1.05fr) minmax(0, 0.95fr);
  gap: clamp(28px, 4vw, 64px);
  align-items: start;
  padding: clamp(32px, 4vw, 56px);
  background: var(--surface);
  border: 1px solid var(--border-dim);
  border-radius: var(--radius-lg);
}
.band h3 { margin-bottom: 14px; font-size: clamp(1.5rem, 2.4vw, 2rem); }
.band p { margin: 0 0 14px; color: var(--text-2); line-height: 1.65; }
.band p:last-child { margin-bottom: 0; }

.norm-list { display: grid; gap: 2px; margin: 0; padding: 0; list-style: none; }
.norm-list li {
  display: grid;
  grid-template-columns: minmax(120px, auto) 1fr;
  gap: 4px 18px;
  padding: 13px 0;
  border-top: 1px solid var(--border-dim);
  font-size: var(--fs-sm);
}
.norm-list li:last-child { border-bottom: 1px solid var(--border-dim); }
.norm-code {
  font-family: var(--font-mono);
  font-size: var(--fs-xs);
  font-weight: 600;
  letter-spacing: 0.01em;
  color: var(--brand);
}
.norm-what { color: var(--text-2); }

.note {
  margin: 26px 0 0;
  padding-top: 18px;
  border-top: 1px solid var(--border-dim);
  font-size: var(--fs-sm);
  color: var(--text-3);
  max-width: 82ch;
}

/* ── Planes ────────────────────────────────────────────────────────────
   Tres fichas. La destacada no crece de tamaño —eso descuadra la fila en
   cuanto una descripción es más larga— sino que cambia de color. */

.plan { position: relative; }
.plan.featured {
  border-color: var(--brand);
  box-shadow: 0 0 0 1px var(--brand);
}
.plan-tag {
  position: absolute;
  top: -11px;
  inset-inline-start: 26px;
  padding: 3px 12px;
  background: var(--brand);
  color: #fff;
  font-size: var(--fs-xxs);
  font-weight: 700;
  letter-spacing: 0.07em;
  text-transform: uppercase;
  border-radius: 999px;
}
.plan-price {
  display: flex;
  align-items: baseline;
  flex-wrap: wrap;
  gap: 2px 8px;
  font-size: var(--fs-3xl);
  font-weight: 700;
  letter-spacing: -0.03em;
}
/* La unidad va SIEMPRE en su propia línea, no sólo cuando no cabe. En
   castellano "Gratis · un dataset y un análisis al mes" ya iba justo, y en
   alemán la unidad es más larga que la cifra: dejarlo al ajuste automático
   daba una fila con dos cuerpos de letra peleándose por la misma línea
   base. Forzarlo es además lo que hace que las tres fichas de plan tengan
   la cifra a la misma altura. */
.plan-per {
  flex: 0 0 100%;
  font-size: var(--fs-sm);
  font-weight: 400;
  line-height: 1.45;
  letter-spacing: 0;
  color: var(--text-3);
}
.plan-feats { margin: 6px 0 0; padding: 0; list-style: none; display: grid; gap: 11px; }
.plan-feats li {
  display: grid;
  grid-template-columns: auto 1fr;
  gap: 11px;
  font-size: var(--fs-base);
  line-height: 1.5;
  color: var(--text-2);
}
.plan-feats svg { width: 15px; height: 15px; margin-top: 4px; color: var(--ok); }
.plan .btn { margin-top: auto; justify-content: center; }

/* ── Nosotros ──────────────────────────────────────────────────────────
   Cifras y datos de la sociedad. Los <dl> son deliberados: es una lista
   de pares etiqueta-valor y el marcado debería decirlo. */

.facts {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(180px, 1fr));
  gap: 18px;
  margin: 0;
  padding: 34px 0 0;
  border-top: 1px solid rgb(255 255 255 / 0.16);
}
.fact dt {
  font-size: var(--fs-xs);
  font-weight: 600;
  letter-spacing: 0.09em;
  text-transform: uppercase;
  color: var(--topbar-dim);
}
.fact dd {
  margin: 6px 0 0;
  font-size: var(--fs-md);
  line-height: 1.5;
}

/* ══════════════════════════════════════════════════════════════════════
   7 · PIE
   ══════════════════════════════════════════════════════════════════════ */

.footer {
  padding-block: 54px 34px;
  background: var(--topbar);
  color: var(--topbar-dim);
  font-size: var(--fs-sm);
}
.footer-top {
  display: grid;
  grid-template-columns: minmax(0, 1.4fr) repeat(auto-fit, minmax(150px, 1fr));
  gap: 34px;
  padding-bottom: 34px;
  border-bottom: 1px solid rgb(255 255 255 / 0.14);
}
.footer-mark { height: 24px; width: auto; color: var(--topbar-text); margin-bottom: 14px; }
.footer-blurb { margin: 0; max-width: 42ch; line-height: 1.6; }
.footer-col h4 {
  margin-bottom: 13px;
  font-size: var(--fs-xs);
  font-weight: 700;
  letter-spacing: 0.09em;
  text-transform: uppercase;
  color: var(--topbar-text);
}
.footer-col ul { margin: 0; padding: 0; list-style: none; display: grid; gap: 9px; }
.footer-col a:hover { color: var(--topbar-text); text-decoration: underline; }
.footer-bottom {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: 10px 22px;
  padding-top: 22px;
  font-size: var(--fs-xs);
}
.footer-links { display: flex; flex-wrap: wrap; gap: 10px 20px; margin-inline-start: auto; }

/* ══════════════════════════════════════════════════════════════════════
   8 · PANTALLAS ESTRECHAS
   ══════════════════════════════════════════════════════════════════════

   Por debajo de 1000 px los cinco apartados no caben junto a la marca y
   las tres acciones. La barra se queda con marca + waffle + hamburguesa,
   y los apartados —con sus submenús, ya en acordeón— pasan a un cajón a
   pantalla completa. El mega-menú de escritorio no se reutiliza: un
   panel de 250 px por ficha en un móvil es una columna interminable.  */

@media (max-width: 1000px) {
  .topnav, .signin-btn { display: none; }
  .burger-btn { display: inline-flex; }
  .topbar { padding-inline: 16px; height: 60px; }
  .megawrap { display: none; }
  .wrap { padding-inline: 20px; }
  html { scroll-padding-top: 76px; }
  .hero { padding-top: 60px; }
}

.drawer {
  position: fixed;
  inset: 60px 0 0 0;
  z-index: 98;
  display: grid;
  align-content: start;
  gap: 4px;
  padding: 18px 20px 40px;
  background: var(--surface);
  color: var(--text);
  overflow-y: auto;
  overscroll-behavior: contain;
  animation: drawer-in 200ms cubic-bezier(0.4, 0, 0.2, 1);
}
.drawer[hidden] { display: none; }
@keyframes drawer-in { from { opacity: 0; transform: translateY(-10px); } to { opacity: 1; transform: none; } }

.drawer-link, .drawer-toggle {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 12px;
  width: 100%;
  padding: 15px 4px;
  border: 0;
  border-bottom: 1px solid var(--border-dim);
  background: none;
  font-size: var(--fs-lg);
  font-weight: 600;
  text-align: start;
  cursor: pointer;
}
.drawer-toggle svg { width: 13px; height: 13px; transition: transform var(--transition); }
.drawer-toggle[aria-expanded="true"] svg { transform: rotate(180deg); }

.drawer-sub { display: grid; gap: 2px; padding: 8px 4px 14px; }
.drawer-sub[hidden] { display: none; }
.drawer-sub a {
  padding: 11px 12px;
  font-size: var(--fs-base);
  color: var(--text-2);
  border-radius: var(--radius-sm);
}
.drawer-sub a:hover { background: var(--brand-bg); color: var(--brand-dark); }
.drawer .btn { margin-top: 20px; justify-content: center; }

@media (min-width: 1001px) {
  /* Fuera del móvil el cajón no existe, ni siquiera oculto: así un
     redimensionado con el cajón abierto no lo deja flotando. */
  .drawer { display: none !important; }
}

@media (max-width: 860px) {
  .hero { min-height: 0; }
  .hero-body { padding-block: 90px 26px; }
  .hero-desc { font-size: var(--fs-md); }
  /* Las fichas pasan a un carril que se arrastra con el dedo: apiladas
     ocuparían toda la pantalla y taparían el titular que anuncian. */
  .hero-rail {
    margin-top: 32px;
    margin-inline: -20px;
    padding-inline: 20px;
    overflow-x: auto;
    scroll-snap-type: x mandatory;
    scrollbar-width: none;
  }
  .hero-rail::-webkit-scrollbar { display: none; }
  .hero-card { flex: 0 0 min(74%, 280px); scroll-snap-align: start; }
  .hero-toggle { display: none; }   /* el autopase ya se detiene al tocar */
  .band { grid-template-columns: 1fr; }
  .footer-top { grid-template-columns: 1fr; gap: 26px; }
  .footer-links { margin-inline-start: 0; }
  .pop { right: 12px; left: 12px; min-width: 0; }
  .lang-list { grid-template-columns: repeat(3, 1fr); }
}

@media (max-width: 520px) {
  .norm-list li { grid-template-columns: 1fr; }
  .lang-list { grid-template-columns: repeat(2, 1fr); }
  .hero-actions .btn { flex: 1 1 100%; justify-content: center; }
}

/* ══════════════════════════════════════════════════════════════════════
   9 · MOVIMIENTO REDUCIDO E IMPRESIÓN
   ══════════════════════════════════════════════════════════════════════

   Quien ha pedido menos movimiento en su sistema ve la página quieta:
   nada de desplazamientos al pasar por encima, nada de scroll suave,
   nada que se deslice.

   El vídeo del hero sí se reproduce, también aquí: es una decisión de la
   casa y está explicada en home.js. Lo que ya no hay que apagar es el
   fundido entre escenas, porque no existe para nadie —el paso de un vídeo
   a otro es un corte seco en todas las visitas—, así que esta consulta no
   necesita decir nada al respecto.  */

@media (prefers-reduced-motion: reduce) {
  html { scroll-behavior: auto; }
  *, *::before, *::after {
    animation-duration: 0.01ms !important;
    animation-iteration-count: 1 !important;
    transition-duration: 0.01ms !important;
  }
  .hero-slide { transform: none; }
  .card:hover, .btn:hover, .hero-card:hover, .mega-card:hover { transform: none; }
}

@media print {
  .topbar, .megawrap, .scrim, .drawer, .pop, .hero-media, .hero-rail, .skip { display: none !important; }
  .hero { min-height: 0; color: #000; background: none; padding-top: 0; }
  .hero-slide { opacity: 1 !important; position: static; }
  body { background: #fff; }
}
