/* ============================================================================
   assets/elementor-native.css

   Puente entre el sistema de diseño y los WIDGETS NATIVOS de Elementor.

   Complementa a `assets/elementor-atomic.css` (que reemite el sistema de diseño
   con `.elementor` de ancestro) y resuelve lo unico que aquel no puede: la
   forma del DOM de un widget clasico.

   Un widget nativo no emite la etiqueta del fuente y ya. Emite tres capas:

     <div class="elementor-element ... LA-CLASE-DEL-SISTEMA elementor-widget-X">
       <div class="elementor-widget-container">
         <h1 class="elementor-heading-title">  <-- el texto real
       </div>
     </div>

   La clase del sistema aterriza en el envoltorio de fuera (eso es lo que hace
   `_css_classes`). Asi que:

     · las reglas del sistema ancladas a una CLASE (`.hero-title`, `.lead`,
       `.tag-pill`, `.price`) caen en el envoltorio y funcionan solas;
     · las ancladas a una ETIQUETA (`.card-property h3`, `.step-cell p`,
       `.footer-dark h4`) caen en el elemento de dentro y tambien funcionan,
       porque el puente atomico las reemite con `.elementor` delante y ganan
       por especificidad a lo de aqui;
     · lo que NO funciona sin esta hoja son los selectores de HIJO DIRECTO
       (`.hero-mask > img`), la piel propia de cada widget (boton, contador,
       acordeon, formulario, redes) y el `width:100%` que el motor pone a todo
       contenedor.

   TODA regla de este archivo esta acotada a `.lon-native`, la clase que el
   generador pone en la raiz de cada seccion del port nativo. El port ATOMICO
   (`elementor/templates/*.json`) no lleva esa clase en ningun nodo, asi que
   este archivo no puede afectarle. Es deliberado: los dos ports conviven en la
   misma base de datos y ninguno debe notar al otro.

   ORDEN DE ENCOLADO
   -----------------
     prio 10 · base-desktop.css            estilos base del motor
     prio 15 · elementor-atomic-fixes.css  neutralizacion del motor atomico
     prio 20 · elementor-atomic.css        sistema de diseño reemitido
     prio 25 · ESTE ARCHIVO                forma del DOM de los widgets clasicos

   Cero diseño nuevo: cada valor es copia de `assets/components.css`,
   `assets/site.css` o de un atributo `style` del fuente `website/site/index.html`.
   ============================================================================ */


/* ----------------------------------------------------------------------------
   1 · Neutralizacion del motor
-------------------------------------------------------------------------------*/

/* `.e-con { width: var(--width) }` con `--width:100%`. En el fuente estas cajas
   son `inline-flex` o absolutas y se ajustan a su contenido. */
.lon-native .tag-pill,
.lon-native .info-chip,
.lon-native .hero-dock,
.lon-native .brand-mark,
.lon-native .cta-pair,
.lon-native .hero-under-actions,
.lon-native .nav-actions,
.lon-native .social-row,
/* `.who` y `.glass-panel` van ancladas con `left` Y `right`: con el `width:100%`
   del motor la caja arranca en `left` y se sale por la derecha justo lo que mida
   el anclaje. Medido en `.card-listing-v2` a 1440: panel de 341px dentro de una
   tarjeta de 341, o sea 14px fuera por la derecha que el `overflow: hidden` de
   la tarjeta recorta; la maqueta lo deja en 313 (341 menos los 14 de cada lado).
   A 390 el mismo desajuste: 362 contra los 334 de la maqueta. */
.lon-native .card-video-t .who,
.lon-native .card-listing-v2 .glass-panel { width: auto; }

.lon-native .brand-mark { display: inline-flex; }

/* El motor separa widgets hermanos con 20px de margen. Ningun contenedor del
   fuente lo lleva: el aire lo pone el `gap` del sistema de diseño. */
.lon-native .elementor-widget:not(:last-child) { margin-block-end: 0; }


/* El motor tapa CUALQUIER `max-width` del sistema de diseño con
   `.elementor.elementor .e-con>.elementor-widget { max-width:100% }`. Ese
   selector vale (0,4,0) porque dobla `.elementor` a proposito; lo que declara
   el sistema vale (0,2,0) o (0,3,0) y pierde siempre. Resultado sin esto: el
   titular del cabecero se estira a 1340px en vez de 20ch, el claim va en una
   sola linea, la bajada del cierre ocupa 720px y las etiquetas de las cifras no
   se recortan a 22ch.

   No sirve apagarlo con `max-width:none`: al necesitar (0,4,0) para ganarle al
   motor, ese reset ganaria tambien al sistema. Se devuelven uno a uno, con la
   clase raiz repetida para igualar el peso del motor y ganarle por orden de
   encolado. Todos los valores son copia literal de `components.css` y
   `site.css`; aqui no hay ninguna medida nueva. */
.lon-native.lon-native.lon-native .lead { max-width: 46ch; }
.lon-native.lon-native.lon-native .hero-under .lead { max-width: 62ch; }
.lon-native.lon-native.lon-native .lon-el-lead-wide { max-width: 78ch; }
.lon-native.lon-native.lon-native .hero-mask .hero-title { max-width: 17ch; }
.lon-native.lon-native.lon-native.page-marco2 .hero-title,
.lon-native.lon-native.lon-native .page-marco2 .hero-title { max-width: 20ch; }
.lon-native.lon-native.lon-native .hero-mask .hero-claim { max-width: 18ch; }
.lon-native.lon-native.lon-native .cta-band--premium .sub { max-width: 48ch; }
.lon-native.lon-native.lon-native .stats-premium .lbl { max-width: 22ch; }
.lon-native.lon-native.lon-native .lon-el-footer-note { max-width: 32ch; }


/* ----------------------------------------------------------------------------
   2 · Texto: el envoltorio lleva la clase, el elemento de dentro obedece
-------------------------------------------------------------------------------*/

/* El titular hereda del envoltorio, que es quien lleva `.hero-title`,
   `.hero-claim`, `.n` o la regla de etiqueta del sistema. Sin esto manda el
   `h1 { font-size }` del tema padre y el titular sale con otro cuerpo. */
.lon-native .elementor-heading-title {
  font: inherit;
  color: inherit;
  letter-spacing: inherit;
  text-transform: inherit;
  text-shadow: inherit;
  text-wrap: inherit;
  margin: 0;
}

/* El parrafo NO se resetea de tipografia a proposito: un `<p>` no cambia el
   cuerpo por si mismo, hereda. Solo se le quitan los margenes del tema, que si
   descuadran el `gap` del contenedor. */
/* El widget de texto trae el gris del kit (`#7a7a7a`). El sistema de diseño
   pinta el color en la clase del envoltorio (`.who strong` en crema, `.meta` en
   tinta suave), asi que el widget tiene que dejarlo heredar. */
.lon-native .elementor-widget-text-editor { color: inherit; }
.lon-native .elementor-widget-text-editor p { margin: 0; }
.lon-native .elementor-widget-text-editor p:not(:last-child) { margin-bottom: 12px; }


/* ----------------------------------------------------------------------------
   3 · Boton: la piel la lleva `.btn` en el envoltorio, el <a> la rellena
-------------------------------------------------------------------------------*/

/* El relleno pasa al `<a>` para que todo el area de la pildora sea clicable, no
   solo su texto. */
.lon-native .elementor-widget-button.btn { padding: 0; }

.lon-native .btn .elementor-button,
.lon-native .btn .elementor-button:hover,
.lon-native .btn .elementor-button:focus,
.lon-native .btn .elementor-button:visited {
  display: inline-flex; align-items: center; gap: 10px;
  padding: 14px 26px; border-radius: var(--r-pill);
  font: inherit; color: inherit; background: none;
  border: 0; box-shadow: none; text-decoration: none;
  fill: currentColor;
}
.lon-native .btn .elementor-button-content-wrapper { display: inline-flex; align-items: center; gap: 10px; }
.lon-native .btn .elementor-button-text { font: inherit; color: inherit; }

/* El circulo con la flecha es un contenedor con `.btn-circle`; dentro va el
   widget de icono, que trae su propio color del kit. */
.lon-native .elementor-widget-icon .elementor-icon,
.lon-native .elementor-widget-icon .elementor-icon:hover { color: inherit; background: none; border: 0; padding: 0; }
.lon-native .elementor-widget-icon .elementor-icon-wrapper { line-height: 0; }

/* Elementor emite los iconos como SVG en linea y el CSS por pagina les pinta el
   azul del kit (`#6EC1E4`) con selectores de peso (0,3,0):
   `.elementor-widget-icon.elementor-view-default .elementor-icon svg`,
   `.elementor-widget-accordion .elementor-accordion-icon svg` y su variante
   `.elementor-active` en verde. El sistema de diseño los quiere del color del
   texto de su caja: crema dentro del circulo rojizo, tinta sobre el velo.
   El widget `toggle` (bloque 18) va en la misma lista: emite el mismo SVG en
   línea con las mismas reglas del kit, cambiando `accordion` por `toggle`.

   OJO, esto estuvo ROTO, y el motivo merece quedar escrito porque es fácil de
   repetir. El cierre del comentario aparecía dos líneas antes de tiempo y las
   dos que seguían quedaban sueltas: el analizador de CSS las leía como el
   arranque de un selector y se comía la lista entera hasta la primera llave,
   así que la regla NO existía en la hoja (comprobado con `document.styleSheets`:
   cero reglas con `fill: currentcolor` fuera del bloque 3). Consecuencia medida:
   los SVG del pie salían en blanco puro en vez de en crema, y los del kit se
   quedaban con su azul de fábrica.

   La trampa: la pareja de caracteres que cierra un comentario lo cierra TAMBIÉN
   dentro de comillas invertidas, que aquí se usan por todas partes para citar
   selectores y valores. Al redactar estos comentarios, NUNCA teclear esa pareja
   para citarla; describirla con palabras, como en este párrafo. */
.lon-native .elementor-widget-icon.elementor-view-default .elementor-icon svg,
.lon-native .elementor-widget-icon .elementor-icon svg,
.lon-native .elementor-widget-accordion .elementor-accordion-icon svg,
.lon-native .elementor-widget-accordion .elementor-active .elementor-accordion-icon svg,
.lon-native .elementor-widget-toggle .elementor-toggle-icon svg,
.lon-native .elementor-widget-toggle .elementor-active .elementor-toggle-icon svg,
.lon-native .elementor-widget-social-icons .elementor-social-icon svg,
.lon-native .elementor-widget-icon-list .elementor-icon-list-icon svg { fill: currentColor; }


/* ----------------------------------------------------------------------------
   4 · Imagen: los selectores de hijo directo del fuente
-------------------------------------------------------------------------------*/

/* Todos los selectores de HIJO DIRECTO del sistema de diseño que apuntan a una
   imagen (`.hero-mask > img`, `.media img`, `.media-band > img`,
   `.card-video-t > img`) se quedan cortos aquí: el hijo directo de la caja no
   es el `<img>`, es el envoltorio que mete el widget. Sin esto la imagen sale a
   su proporción natural (más alta o más baja que su caja) o directamente a cero
   de alto cuando el envoltorio es además el bloque contenedor de un `inset: 0`,
   que es lo que pasaba en `.form-premium .media`.

   El sistema recorta de DOS formas y aquí hacen falta las dos:

     A · RELLENO ABSOLUTO. La caja fija su alto (`aspect-ratio`, `min-height` o
         `height: 100%`) y la imagen la llena. El absoluto pasa al envoltorio,
         que es el hijo directo, y el `<img>` llena el envoltorio.
     B · CRECER CON LA CELDA. En los mosaicos las celdas NO están posicionadas:
         el alto de la fila lo marca la celda alta y la imagen crece con ella.
         Con absolutos la fila colapsaría, así que el envoltorio crece por
         `flex` en vez de anclarse.

   Se acota a la CLASE de la caja, no a cada pareja padre-hijo, porque `.media`
   es el nombre único de la caja de recorte en todo el sistema: `.card-property`,
   `.card-listing`, `.card-mini`, `.card-location`, `.card-sale`, `.card-post`,
   `.compare-col` y `.form-premium` declaran las tres, sin una sola excepción,
   `position: relative`, `overflow: hidden` (o un alto propio) e
   `img { width: 100%; height: 100%; object-fit: cover }`. Una regla cubre las
   ocho y las que vengan. `.col--hero` solo existe dentro de `.connect-arc`, así
   que entra por su nombre corto y `:is()` se queda en (0,1,0). */

/* A · relleno absoluto */
.lon-native :is(.media, .hero-mask, .cta-band--premium, .card-video-t, .card-listing-v2, .media-band, .col--hero) > .elementor-widget-image {
  position: absolute; inset: 0; width: 100%; height: 100%; margin: 0;
}
.lon-native :is(.media, .hero-mask, .cta-band--premium, .card-video-t, .card-listing-v2, .media-band, .col--hero) > .elementor-widget-image > .elementor-widget-container { height: 100%; }
.lon-native :is(.media, .hero-mask, .cta-band--premium, .card-video-t, .card-listing-v2, .media-band, .col--hero) > .elementor-widget-image img {
  width: 100%; height: 100%; object-fit: cover; display: block;
}

/* Las cajas que reciben esos absolutos tienen que ser el bloque contenedor. En
   el fuente casi todas ya lo son (`.compare-col .media` solo declara
   `overflow`), pero al pasar por Elementor algunas pierden el `position`.
   `.hero-mask`, `.cta-band--premium` y `.card-video-t` NO entran aquí: su
   `position: relative` y su `overflow: hidden` los pone el sistema y son parte
   de su forma (la muesca del dock, el radio de la banda). */
.lon-native :is(.media, .card-listing-v2, .media-band, .col--hero) { position: relative; overflow: hidden; }

/* B · crecer con la celda */
.lon-native :is(.photo-mosaic, .mosaic-stagger) .cell > .elementor-widget-image { flex: 1 1 auto; min-height: 0; width: 100%; }
.lon-native :is(.photo-mosaic, .mosaic-stagger) .cell > .elementor-widget-image > .elementor-widget-container { height: 100%; }
.lon-native :is(.photo-mosaic, .mosaic-stagger) .cell img { width: 100%; height: 100%; object-fit: cover; display: block; }

/* El sello de render (`Render`, `Foto real`) es un hijo absoluto de la caja de
   imagen. Al perder el `position` de su contenedor flotaba en el flujo del
   texto, debajo de la foto, en vez de ir sobre ella. */
.lon-native .render-note,
.lon-native .tag-pill--onmedia { z-index: 3; }

/* En `.media-band` ese sello NO lo coloca `components.css`, que solo lo coloca
   dentro de `.card-property`, `.hero-mask` y `.card-listing-v2`. Lo coloca un
   atributo `style` del fuente, en la ficha de El Nido:
   `<span class="render-note" style="position:absolute;top:16px;right:16px">`.
   El generador conserva la CLASE, que aterriza en el envoltorio del widget de
   texto, pero no el estilo en línea, así que el sello se queda en el flujo como
   un widget más del contenedor flexible y se estira de lado a lado. Medido a
   1440: 1248x24 pegado a la esquina superior izquierda de la banda, tapando la
   foto, contra los 62x24 de la maqueta a 16px de su esquina superior derecha.
   A 390: 358x24 contra 62x24.

   El bloque contenedor ya lo pone la regla de arriba (`.media-band` entra en la
   lista de `position: relative`), así que aquí solo van los tres valores
   copiados literalmente de ese atributo `style`. */
.lon-native .media-band .render-note { position: absolute; top: 16px; right: 16px; }

/* El isologo viaja como `<img>` de un SVG, no como SVG en linea: las reglas
   `.brand-mark svg { height }` del sistema no le llegan. */
.lon-native .navbar-frame .brand-mark img { height: 26px; width: auto; }
:is(.lon-native.footer-dark, .lon-native .footer-dark) .brand-mark img { height: 30px; width: auto; }

/* La miniatura redonda de la ficha del cabecero.

   Salía ovalada, estirada en vertical, en las diez páginas que llevan pastilla
   y en los dos idiomas. Medido a 1440 sobre el `<img>`, no sobre su envoltorio:
   44 de alto, que es lo que pide la maqueta, contra anchos de 28,02 a 36,22
   según la página. Que el ancho cambiase de una página a otra es la pista de
   que no lo mandaba ninguna medida, lo mandaba el reparto del espacio sobrante.

   La cadena, entera, porque es fácil de repetir en cualquier otro widget:
   `.thumb` no aterriza en el `<img>`, aterriza en el envoltorio del widget de
   imagen. Ese envoltorio es un hijo flexible de la pastilla con los valores de
   fábrica del motor: `flex: 0 1 auto`, que encoge, y `min-width: 0`, que le
   deja encoger hasta nada. El `nowrap` de la correctiva del 2026-08-07 (punto
   4), que es el que impide que la pastilla se parta en tres filas, obliga a
   pagar el exceso encogiendo, y el primero que lo paga es el envoltorio. La
   imagen se venía detrás porque el tema le da `max-width: 100%`: el alto de 44
   se quedaba clavado y el ancho lo dictaba el envoltorio ya encogido.

   Por eso el arreglo NO es repetir el 44 en la imagen. Eso es lo que había
   antes aquí y no bastaba. Lo que se hace es quitarle al envoltorio la
   capacidad de encoger y convertirlo en la ventana redonda; la imagen llena esa
   ventana al 100% y `object-fit: cover` recorta lo que sobre, así que vale para
   cualquier proporción de origen. Las de hoy van de 3:2 a 16:9 y ninguna es
   cuadrada, y el día que se cambie una foto seguirá dando igual.

   El `overflow` del envoltorio recorta además por su cuenta, así que la ventana
   sigue siendo redonda aunque a la imagen le quiten el radio. Nada de esto pide
   posicionar el envoltorio: recortar con radio no necesita `position`.

   Por debajo de 920 la maqueta esconde el avatar a propósito y eso no cambia:
   aquí no se toca `display`. */
.lon-native .info-chip .thumb {
  flex: 0 0 44px;
  width: 44px; height: 44px;
  border-radius: 50%; overflow: hidden;
  line-height: 0;
}
.lon-native .info-chip .thumb img {
  width: 100%; height: 100%; max-width: none;
  border-radius: 50%; object-fit: cover; display: block;
}
@media (max-width: 920px) {
  .lon-native .hero-dock .info-chip .thumb { display: none; }
}


/* ----------------------------------------------------------------------------
   5 · Cabecera
-------------------------------------------------------------------------------*/

/* `site.css` centra el isologo con una malla `1fr auto 1fr` cuyos lados son
   `nav.main-links` y `.nav-actions`. El widget de menu no emite un `<nav>` con
   la clase: la clase queda en su envoltorio. */
@media (min-width: 921px) {
  .lon-native.site-header .navbar-frame { display: grid; grid-template-columns: 1fr auto 1fr; }
  .lon-native.site-header .navbar-frame .main-links { justify-self: start; }
  .lon-native.site-header .navbar-frame .nav-actions { justify-self: end; }
}

/* El widget de menu emite DOS `<nav>`: el principal y el desplegable de movil.
   `.navbar-frame nav { display:flex }` del sistema volveria visible el segundo
   tambien en escritorio, donde no pinta nada. Se apaga SOLO en escritorio: por
   debajo de 921px manda el widget, que abre y cierra su desplegable con estilo
   en linea (ver bloque 12). */
@media (min-width: 921px) {
  .lon-native .navbar-frame .elementor-nav-menu--dropdown { display: none; }
}
.lon-native .navbar-frame .elementor-nav-menu { gap: 4px; }
.lon-native .navbar-frame .elementor-nav-menu li { margin: 0; }


/* La caja del titular es un contenedor, y el motor le da `width:100%`: la
   llamada de la derecha se caia a la linea siguiente. */
.lon-native .section-head > .e-con { width: auto; }


/* ----------------------------------------------------------------------------
   6 · Cifras (widget contador)
-------------------------------------------------------------------------------*/

/* El contador NO lleva la clase `.kpi` del fuente: `motion.js` busca
   `.stats-premium .kpi` y reescribe su `textContent`, lo que borraria el
   marcado interno del widget. La tipografia se le da por `lon-nv-kpi`, que
   solo conoce esta hoja. Copia literal de `.stats-premium .kpi`.

   OJO AL TOCAR: es una COPIA, no una herencia. Si se cambia el cuerpo de
   `.stats-premium .kpi` y no se cambia aqui, las paginas con contador animado
   quedan a un tamano y las de texto plano a otro, en la misma banda. El
   2026-08-10 paso justo eso: la regla de arriba bajo a 3,1vw y esta se quedo
   en 4,4vw. Van juntas siempre. */
.lon-native .stats-premium .lon-nv-kpi .elementor-counter-number-wrapper {
  display: block;
  font: 600 clamp(30px, 3.1vw, 52px)/1 var(--font-display);
  letter-spacing: -0.015em;
  color: inherit;
}
.lon-native .stats-premium .lon-nv-kpi--accent .elementor-counter-number-wrapper { color: var(--accent-coral); }
.lon-native .stats-premium .lon-nv-kpi .elementor-counter-title { display: none; }


/* ----------------------------------------------------------------------------
   7 · Preguntas frecuentes (widget acordeon)
-------------------------------------------------------------------------------*/

/* Copia literal de `.faq-item`, `.faq-item button`, `.faq-item button .faq-ico`
   y `.faq-item .faq-panel` de components.css, sobre el DOM del acordeon. */
.lon-native .faq-list .elementor-accordion { display: grid; }
.lon-native .faq-list .elementor-accordion-item {
  border: 0; border-bottom: 1px solid var(--line); background: none;
}
.lon-native .faq-list .elementor-tab-title {
  display: flex; align-items: center; justify-content: space-between; gap: var(--s-4);
  width: 100%; background: none; border: 0; cursor: pointer; text-align: left;
  font: 600 18px/1.35 var(--font-body); color: var(--text);
  padding: 22px 4px; margin: 0;
}
.lon-native .faq-list .elementor-accordion-title { font: inherit; color: inherit; text-decoration: none; }
.lon-native .faq-list .elementor-accordion-icon {
  order: 2; margin: 0; padding: 0; flex: 0 0 auto;
  width: 36px; height: 36px; border-radius: 50%;
  display: inline-flex; align-items: center; justify-content: center;
  background: var(--panel); color: var(--text);
}
/* Gemelo de la regla del bloque 18, que es la que está en uso: caja de 36x36 con
   6px de relleno, para que el dibujo caiga a los 21px de tinta de la maqueta.
   El porqué del relleno está documentado allí. */
.lon-native .faq-list .elementor-accordion-icon > span { line-height: 0; display: inline-flex; }
.lon-native .faq-list .elementor-accordion-icon i { font-size: 24px; line-height: 1; }
.lon-native .faq-list .elementor-accordion-icon svg {
  box-sizing: border-box; width: 36px; height: 36px; padding: 6px;
}
.lon-native .faq-list .elementor-tab-title.elementor-active .elementor-accordion-icon {
  background: var(--brand-fill); color: var(--brand-contrast);
}
.lon-native .faq-list .elementor-tab-content {
  border: 0; background: none; padding: 0 4px 22px;
  color: var(--text-muted); font: 400 15.5px/1.7 var(--font-body);
}
.lon-native .faq-list .elementor-tab-content p { margin: 0; }


/* ----------------------------------------------------------------------------
   8 · Listas del pie (widget lista de iconos)
-------------------------------------------------------------------------------*/

:is(.lon-native.footer-dark, .lon-native .footer-dark) .elementor-icon-list-items { display: grid; gap: 10px; margin: 0; padding: 0; list-style: none; }
:is(.lon-native.footer-dark, .lon-native .footer-dark) .elementor-icon-list-item { margin: 0; }
:is(.lon-native.footer-dark, .lon-native .footer-dark) .elementor-icon-list-icon { display: none; }
:is(.lon-native.footer-dark, .lon-native .footer-dark) .elementor-icon-list-text { padding: 0; color: inherit; }


/* ----------------------------------------------------------------------------
   9 · Redes (widget de iconos sociales)
-------------------------------------------------------------------------------*/

/* Copia literal de `.footer-dark .social-row .btn-circle`. */
:is(.lon-native.footer-dark, .lon-native .footer-dark) .elementor-social-icons-wrapper { display: flex; gap: 8px; }
:is(.lon-native.footer-dark, .lon-native .footer-dark) .elementor-social-icons-wrapper .elementor-grid-item { margin: 0; }

/* El círculo mide 40, NO 44. Aquí estaba copiado el `.btn-circle` BASE de
   `components.css` (sección 3, `width: 44px; height: 44px`), y el pie no usa esa
   medida: `.social-row .btn-circle { width: 40px; height: 40px }` la baja a 40
   para los cuatro iconos del pie. Medido antes del arreglo, en las 34 páginas y
   los dos idiomas: círculo 44x44 contra 40x40 y fila 200x44 contra 184x40 (los
   184 son 4x40 más los 3 huecos de 8). */
:is(.lon-native.footer-dark, .lon-native .footer-dark) .elementor-social-icon {
  width: 40px; height: 40px; border-radius: 50%; padding: 0;
  background: color-mix(in srgb, var(--cream) 12%, transparent);
  color: var(--cream);
}
:is(.lon-native.footer-dark, .lon-native .footer-dark) .elementor-social-icon:hover {
  background: color-mix(in srgb, var(--cream) 24%, transparent);
  color: var(--cream);
}

/* El icono, a los 18x18 de `.btn svg, .btn-circle svg` de `components.css`.
   La regla de abajo se queda por si algún día el kit vuelve a las fuentes de
   iconos, pero hoy NO pinta nada: Elementor emite el icono como `<svg>` en
   línea, no como `<i>`, así que `font-size` no tiene a quién aplicarse y el SVG
   se quedaba con el `1em` que le da el CSS del widget sobre un `font-size` de
   13,5px heredado del propio widget. Medido: 13,5x13,5 contra los 18x18 de la
   maqueta. El CSS de Elementor solo le pone `fill` al SVG, ningún tamaño, así
   que con la clase del pie y la del componente basta: sin `!important`. */
:is(.lon-native.footer-dark, .lon-native .footer-dark) .elementor-social-icon i { font-size: 18px; color: inherit; }
:is(.lon-native.footer-dark, .lon-native .footer-dark) .elementor-social-icon svg { width: 18px; height: 18px; }


/* ----------------------------------------------------------------------------
   10 · Formulario (widget de formulario)
-------------------------------------------------------------------------------*/

/* Copia literal de `.field > label`, `.input` y `.btn-primary`. */
.lon-native .lon-nv-form .elementor-field-group > label {
  font: 600 12px/1 var(--font-body); color: var(--text-muted);
  letter-spacing: .04em; margin-bottom: 6px;
}
.lon-native .lon-nv-form .elementor-field-textual {
  font: 400 15px/1.3 var(--font-body); color: var(--text);
  background: var(--surface); border: 1px solid var(--line);
  border-radius: var(--r-sm); padding: 12px 14px; width: 100%;
}
.lon-native .lon-nv-form .elementor-field-textual:focus-visible {
  outline: 2px solid var(--focus-ring); outline-offset: 2px;
}
.lon-native .lon-nv-form .elementor-button {
  display: inline-flex; align-items: center; gap: 10px;
  font: 600 15px/1 var(--font-body);
  padding: 14px 26px; border-radius: var(--r-pill); border: 0;
  background: var(--brand-fill); color: var(--brand-contrast);
}
.lon-native .lon-nv-form .elementor-button:hover { background: var(--brand-fill-strong); }


/* ----------------------------------------------------------------------------
   11 · Parche temporal: dos clases del sistema que le faltan a la copia del tema
-------------------------------------------------------------------------------*/

/* DEUDA, no diseño nuevo. `wp-theme/land-of-nomads/assets/components.css` es una
   copia congelada el 2026-07-13 de `website/site/assets/components.css`, que
   siguio evolucionando: le faltan `.hero-claim` (el claim sobre el cabecero,
   CEO 2026-07-13) y `.render-note--real` (la nota granate de FOTO REAL). Sin
   ellas el claim sale como parrafo negro encima del cabecero y la nota sale en
   el negro del render.

   Los valores son copia LITERAL de `website/site/assets/components.css`. Se
   borran de aqui el dia que se refresque la copia del tema y se regenere
   `elementor-atomic.css` con `_scripts/build-elementor-atomic-css.py`. */

.lon-native .hero-mask .hero-claim {
  position: absolute; left: clamp(430px, 36vw, 520px); bottom: clamp(22px, 3vw, 36px);
  font: 600 clamp(28px, 3.5vw, 44px)/1.08 var(--font-display); letter-spacing: -0.01em;
  color: var(--cream); text-align: left; max-width: 18ch; z-index: 2;
  text-shadow: 0 2px 18px rgba(28, 20, 16, .6), 0 1px 4px rgba(28, 20, 16, .5);
}
@media (max-width: 920px) {
  .lon-native .hero-mask .hero-claim { left: 20px; bottom: 108px; max-width: 12ch; }
}

.lon-native .render-note--real { background: rgba(110, 26, 42, .62); color: #FFFFFF; }


/* ----------------------------------------------------------------------------
   12 · Menu en movil: manda el conmutador nativo, no el del port atomico
-------------------------------------------------------------------------------*/

/* `elementor-atomic-fixes.css` esconde `.main-links` por debajo de 920px porque
   el port ATOMICO abre su menu con el boton propio del tema y `site.js`, que
   pone la clase `nav-open` en el marco. El port nativo no tiene ese boton: su
   menu es el widget de Elementor, que ya trae su propio conmutador y su propio
   desplegable. Aqui se deshace el escondite (solo dentro de `.lon-native`) y se
   deja que el widget haga su trabajo: se apaga la lista horizontal y aparece la
   hamburguesa. */
@media (max-width: 920px) {
  :is(.lon-native.site-header, .lon-native .site-header) .main-links {
    display: block; position: static;
    background: none; box-shadow: none; padding: 0;
  }
  .lon-native .navbar-frame .elementor-nav-menu--main { display: none; }
  .lon-native .navbar-frame .elementor-menu-toggle {
    display: flex; align-items: center; justify-content: center;
    width: 44px; height: 44px; border-radius: 50%;
    background: var(--panel); color: var(--text); border: 0;
  }
  .lon-native .navbar-frame .elementor-nav-menu--dropdown {
    position: absolute; left: 0; right: 0; top: calc(100% + 8px);
    background: var(--surface); border-radius: var(--r-lg); box-shadow: var(--sh-3);
    padding: 10px;
  }
  .lon-native .navbar-frame .elementor-nav-menu--dropdown a { padding: 14px 16px; font-size: 15px; }
}

/* ============================================================================
   13 · Formulario sobre el panel de tinta: la segunda piel de la maqueta
   ----------------------------------------------------------------------------
   Síntomas que lo delataron: en los cuatro formularios de proyecto los rótulos
   de campo salían casi ilegibles sobre el panel oscuro (1,91:1 medido, contra
   el 9,82:1 de la maqueta) y el botón de envío salía ROJO donde la maqueta lo
   pone crema.

   Causa. La maqueta tiene DOS pieles de formulario y el bloque 10 solo reemite
   la primera:

     · `.form-card` (sección 42 de components.css) va sobre `--surface`. Ahí los
       valores del sistema son los que copia el bloque 10: `--text-muted` en el
       rótulo y `--brand-fill` en el botón. Medido: 8,39:1 en claro y 8,43:1 en
       oscuro. Correcto, no se toca.
     · `.form-premium` (sección 43) es un panel de tinta (`--ink`, y `--panel`
       en oscuro, las dos veces oscuro). Ahí el sistema CAMBIA la piel:
       `.form-premium .field > label` pasa a crema al 80% y
       `.form-premium .btn-primary` pasa a `background: var(--cream)` con
       `color: var(--ink)`, y a `var(--white)` en hover.

   Esas dos reglas del sistema están ancladas a `.field > label` y a
   `.btn-primary`, y ninguna de las dos clases existe en el DOM del widget de
   formulario: el rótulo es `.elementor-field-group > label` y el botón es
   `button.elementor-button[type="submit"]`. Así que la piel de tinta no
   aterrizaba en ningún sitio y quedaba la clara sobre fondo oscuro.

   Peso. El rótulo lo pinta solo el bloque 10 (0,3,1), así que (0,4,1) basta.
   El COLOR del botón es otra historia: Elementor hornea en el CSS por página
   un `.elementor-<post> .elementor-element.elementor-element-<id>
   .elementor-button[type="submit"] { color: #ffffff }` que vale (0,5,0) y le
   gana al bloque 10. De ahí la clase raíz repetida tres veces, el mismo recurso
   documentado del bloque 1: sube a (0,6,0) sin `!important`.

   El reset del tema padre (`[type="submit"]:focus, [type="submit"]:hover
   { background-color: #c36 }`) vale (0,2,0), así que pierde contra la regla
   base y `:focus` se queda con el color de reposo, que es lo que hace la
   maqueta. No hace falta ninguna regla de `:focus` propia ni ningún
   `!important`: comprobado midiendo los tres estados.

   Todos los valores son copia literal de las secciones 42 y 43 de
   `assets/components.css`; aquí no hay ninguna decisión de color nueva.
   ========================================================================== */

/* El texto del botón, en las dos pieles: crema del sistema, no el blanco puro
   que hornea Elementor. El hover lleva su propio selector porque Elementor
   hornea TAMBIÉN un `...[type="submit"]:hover { color: #ffffff }` que vale
   (0,6,0) y le ganaría a la regla base de reposo. */
.lon-native.lon-native.lon-native .lon-nv-form .elementor-button[type="submit"],
.lon-native.lon-native.lon-native .lon-nv-form .elementor-button[type="submit"]:hover {
  color: var(--brand-contrast);
}

/* Copia literal de `.form-premium .field > label`. */
.lon-native .form-premium .lon-nv-form .elementor-field-group > label {
  color: color-mix(in srgb, var(--cream) 80%, transparent);
}

/* Copia literal de `.form-premium .btn-primary` y su hover. */
.lon-native.lon-native.lon-native .form-premium .lon-nv-form .elementor-button[type="submit"] {
  background: var(--cream);
  color: var(--ink);
}
.lon-native.lon-native.lon-native .form-premium .lon-nv-form .elementor-button[type="submit"]:hover {
  background: var(--white);
  color: var(--ink);
}


/* ============================================================================
   14 · El asterisco rojo del campo obligatorio, que la maqueta no tiene
   ----------------------------------------------------------------------------
   Elementor marca los campos obligatorios con un asterisco propio:
   `frontend.css` trae `.elementor-mark-required .elementor-field-label:after
   { content: "*"; color: red; padding-inline-start: .2em }`, y el widget añade
   la clase `elementor-mark-required` al grupo desde `form-base.php`. La maqueta
   no marca nada: el campo obligatorio se comunica con el `required` del propio
   `<input>`, que es lo que leen el navegador y el lector de pantalla, no con un
   glifo rojo que además no pertenece a la paleta.

   Se apaga con `content: none`, que no genera caja ninguna (con `content: ""`
   quedaría el hueco del `padding-inline-start`). La regla de Elementor vale
   (0,2,1); esta vale (0,4,1). El atributo `required` del campo NO se toca: la
   validación y el anuncio de campo obligatorio siguen igual.
   ========================================================================== */

.lon-native .lon-nv-form .elementor-mark-required .elementor-field-label:after {
  content: none;
}


/* ============================================================================
   15 · El número de la pregunta, separado del enunciado
   ----------------------------------------------------------------------------
   Síntoma: en las páginas de preguntas el número salía pegado al texto,
   «01¿Qué es el derecho de uso...», del mismo cuerpo y del mismo color.

   Causa. El generador SÍ emite el número en su propia etiqueta
   (`<span class="faq-num">01</span>`) dentro del titular, así que el marcado
   está bien y esto se resuelve entero en CSS. Lo que falta es la piel: la
   maqueta la cuelga de `.faq-item--num` (sección 29 de components.css), una
   clase que el widget no emite. Sin ella el número hereda la tipografía del
   enunciado y se queda inline, sin columna ni separación.

   La maqueta pone el número, el enunciado y el icono como hermanos flexibles
   del propio botón. En el widget el número y el enunciado van DENTRO del
   `<a>` del titular y el icono es hermano de ese `<a>`, así que el `<a>` pasa a
   ser el contenedor flexible y crece para que el icono siga cayendo al extremo
   derecho, que es lo que la maqueta consigue con `margin-left: auto`.

   Valores copiados literalmente de `.faq-item--num .faq-num`: 600 13px/1,
   `--text-soft`, columna de 34px y `letter-spacing: .04em`. Sirve para el
   titular del acordeón y para el del `toggle` (bloque 18).
   ========================================================================== */

.lon-native .faq-list :is(.elementor-accordion-title, .elementor-toggle-title) {
  display: flex;
  align-items: center;
  gap: var(--s-3);
  flex: 1 1 auto;
  min-width: 0;
}

.lon-native .faq-list .faq-num {
  flex: 0 0 auto;
  font: 600 13px/1 var(--font-body);
  color: var(--text-soft);
  min-width: 34px;
  letter-spacing: .04em;
}


/* ============================================================================
   16 · Enlaces del menu: quitarles el verde de fabrica de Elementor
   ----------------------------------------------------------------------------
   Sintoma que lo delato: los items de la navegacion salian en VERDE.

   Causa. El widget `nav-menu` no emite el marcado de la maqueta: donde el
   fuente tiene `<nav class="main-links"><a>`, el widget emite
   `<nav class="elementor-nav-menu--main"><ul><li><a class="elementor-item">`.
   La regla del sistema de diseno es `.navbar-frame nav a`, que vale (0,1,1),
   y la de Elementor es `.elementor-nav-menu--main .elementor-item`, que vale
   (0,2,0) y gana. Su color sale de `--e-global-color-accent`, que en un kit
   recien instalado es el verde de fabrica `#61CE70`.

   Arreglo. Se replica aqui la regla de la maqueta con peso suficiente. La
   causa de raiz (los colores globales del kit) se arregla aparte, en el propio
   kit: esto cubre el widget y aquello cubre cualquier widget futuro.

   Valores copiados literalmente de `.navbar-frame nav a` de components.css:
   font 500 14px/1, color var(--text), padding 11px 16px, radio de pildora, y
   fondo var(--panel) en hover y en la pagina actual.
   ========================================================================== */

.lon-native .navbar-frame .elementor-nav-menu .elementor-item,
.lon-native .navbar-frame .elementor-nav-menu--main .elementor-item {
  font: 500 14px/1 var(--font-body);
  color: var(--text);
  fill: var(--text);
  text-decoration: none;
  padding: 11px 16px;
  border-radius: var(--r-pill);
  background: none;
  transition: transform .18s ease, box-shadow .18s ease, background-color .18s ease;
}

.lon-native .navbar-frame .elementor-nav-menu .elementor-item:hover,
.lon-native .navbar-frame .elementor-nav-menu .elementor-item:focus-visible,
.lon-native .navbar-frame .elementor-nav-menu .elementor-item.elementor-item-active,
.lon-native .navbar-frame .elementor-nav-menu .elementor-item[aria-current="page"] {
  color: var(--text);
  background: var(--panel);
  transform: translateY(-2px);
}

/* Elementor subraya el item activo con una barra propia. La maqueta marca la
   pagina actual con el fondo de pildora, no con una barra, y el borde grueso
   decorativo esta vetado por las reglas de marca del repo. */
.lon-native .navbar-frame .elementor-nav-menu .elementor-item:after,
.lon-native .navbar-frame .elementor-nav-menu .elementor-item:before {
  content: none;
}

/* ============================================================================
   17 · Los dos controles de la barra: idioma y claro/oscuro
   ============================================================================

   La maqueta los pone DENTRO de `.nav-actions`, con una separacion de 10px entre
   el boton, el conmutador y la pildora. `inc/nav-controls.php` los inserta ahi
   mismo, asi que la separacion respecto al boton ya la pone el hueco del propio
   contenedor y aqui solo hace falta mantener juntos los dos controles.

   El orden es boton, tema, idioma: los controles de ancho fijo van a la DERECHA
   del boton, porque su ancho cambia entre idiomas y cualquier cosa a su izquierda
   daria un salto al conmutar ES/EN. */

.lon-native .navbar-frame .lon-nav-controls {
  display: flex;
  align-items: center;
  gap: 10px;
  flex: 0 0 auto;
}

/* Por debajo de 920px `components.css` esconde `.lang-switch--desktop` y saca
   `.lang-switch--mobile`. El envoltorio entero se retira ahi: sus dos copias
   viven dentro del desplegable del menu. */
@media (max-width: 920px) {
  .lon-native .navbar-frame .lon-nav-controls { display: none; }
}

/* Las copias del desplegable.
   El envoltorio SI ocupa todo el ancho, y hace falta: el desplegable de Elementor
   es un contenedor flexible, asi que sin `flex-basis` al 100% los controles se
   colocan AL LADO de la lista de enlaces, flotando a media altura sobre ella.
   Lo que nunca se estira son los controles de dentro, que se quedan compactos y
   pegados al inicio, alineados con los enlaces del menu. */
.lon-native .lon-nav-controls-movil {
  display: flex;
  align-items: center;
  justify-content: flex-start;
  flex: 0 0 100%;
  width: 100%;
  gap: 10px;
  padding: 12px 20px 14px;
}

.lon-native .lon-nav-controls-movil .lang-switch,
.lon-native .lon-nav-controls-movil .theme-toggle {
  flex: 0 0 auto;
  width: auto;
}

/* El sol del conmutador salía ovalado: 12x18 en vez de los 18x18 de la maqueta.
   `components.css` declara `.theme-toggle` con 44x44 y NO declara relleno, así
   que en la maqueta manda el del navegador (`1px 6px`). En WordPress se cuela
   antes el del tema padre (`button { padding: .5rem 1rem }`), y con
   `box-sizing: border-box` y 44px fijos esos 16px por lado dejan 12px de ancho
   útil: el SVG, que es un elemento flexible y por defecto se encoge, se
   comprimía a lo ancho sin perder alto. El círculo del botón nunca dejó de ser
   redondo; el que se deformaba era el icono.

   Se devuelve el relleno de la maqueta. `button` vale (0,0,1), así que basta
   con la clase raíz y la del componente, sin `!important`.

   El conmutador del menú móvil queda FUERA a propósito. Comparte la clase
   `.theme-toggle`, pero por debajo de 920px `site.css` lo convierte en otro
   componente: `.theme-toggle--menu` es una píldora ancha con etiqueta, de
   `width: auto`, `height: auto` y `padding: 12px 16px` propios. Ese relleno del
   sistema ya le gana al del tema padre por especificidad ((0,1,0) contra
   (0,0,1)), así que ahí no hay nada que arreglar: aplicarle `1px 6px` lo
   encogía de 50x42 a 30x20. El `:not()` sube el peso a (0,3,0), que sigue
   ganándole al reset. */
.lon-native .theme-toggle:not(.theme-toggle--menu) { padding: 1px 6px; }


/* ============================================================================
   18 · Gemelo del bloque 7 para el widget `toggle`, el que SI arranca cerrado
   ============================================================================

   Por qué existe. El acordeón clásico de Elementor abre siempre su primera
   pregunta: su JavaScript llama a `activateDefaultTab()` sin ningún ajuste que
   lo desactive, y el widget está marcado como obsoleto desde la 3.15. Eso
   contradice la regla de la casa de todo colapsado por defecto e infla el alto
   de las páginas de preguntas. El widget `toggle` arranca cerrado por diseño
   (`autoExpand: 'editor'`) y además es el equivalente honesto de la maqueta,
   cuyo `ui.js` trata cada pregunta como un conmutador independiente sin cerrar
   las demás.

   El bloque 7 no vale tal cual porque cuelga la mayoría de sus reglas de clases
   que solo emite el acordeón. El marcado del `toggle` es el mismo árbol con
   `accordion` cambiado por `toggle`, y `.elementor-tab-title` y
   `.elementor-tab-content` los emite igual, así que esas dos ya las cubre el
   bloque 7 y aquí solo están las cuatro que cambian de nombre.

   Los dos bloques CONVIVEN a propósito: mientras el generador siga emitiendo
   `accordion` las que están en uso son las del bloque 7, y este no le puede
   afectar porque ninguno de sus selectores existe en ese DOM.

   Peso. Aquí los selectores llevan `.elementor-toggle` de más respecto a sus
   gemelos del bloque 7, y no es adorno: el `toggle` de fábrica es más
   específico que el acordeón. Cuelga su hairline gris del PROPIO titular
   (`.elementor-toggle .elementor-tab-title { border-block-end: 1px solid
   #d5d8dc }`, y `.elementor-active { border-block-end: none }` con (0,3,0)) en
   vez de colgarlo del item, y le mete al SVG un `margin-inline-start: -5px` con
   (0,4,0). Con el peso del bloque 7 (0,3,0) esas dos se perderían.

   Valores copiados literalmente del bloque 7, que a su vez los copia de
   `.faq-item`, `.faq-item button`, `.faq-item button .faq-ico` y
   `.faq-item .faq-panel` de components.css.
   ========================================================================== */

.lon-native .faq-list .elementor-toggle { display: grid; }
.lon-native .faq-list .elementor-toggle-item {
  border: 0; border-bottom: 1px solid var(--line); background: none;
}

/* El separador vuelve al item, que es donde lo pone el sistema de diseño: en el
   titular la línea desaparecía al abrir la pregunta y dejaba el grupo cojo. */
.lon-native .faq-list .elementor-toggle .elementor-tab-title { border-block-end: 0; }

.lon-native .faq-list .elementor-toggle-title { font: inherit; color: inherit; text-decoration: none; }

.lon-native .faq-list .elementor-toggle .elementor-toggle-icon {
  order: 2; margin: 0; padding: 0; flex: 0 0 auto;
  width: 36px; height: 36px; border-radius: 50%;
  display: inline-flex; align-items: center; justify-content: center;
  background: var(--panel); color: var(--text);
}
/* El icono: caja de 36x36 (la píldora entera) con 6px de relleno.

   Estaba fijado a 13x13, un icono perdido dentro de una píldora de 36. La
   maqueta no le declara tamaño al SVG: su
   `<span class="faq-ico"><svg viewBox="0 0 24 24">` deja que el SVG se estire a
   los 36 del contenedor, y ahí es donde sale el 36x36 medido.

   El relleno NO es adorno, y sin él el arreglo se pasa de largo. Los dos SVG
   dibujan la misma cruz en REJILLAS distintas: el de la maqueta usa un
   `viewBox` de 24 con el trazo entre 5 y 19, o sea 14 de 24 unidades, mientras
   que el que emite Elementor es el de Font Awesome, `viewBox 0 0 448 512`, con
   la cruz ocupando las 448 unidades de ancho, el borde entero. Con la misma
   caja de 36 la tinta sale a 21px en la maqueta y a 31,5px aquí: una cruz gorda
   que casi toca el borde del círculo, medida y comprobada en captura. Los 6px
   por lado dejan el dibujo en 24 (36 menos 6 y 6), que en la rejilla de Font
   Awesome son exactamente los 21px de tinta de la maqueta. Con
   `box-sizing: border-box` la caja del SVG sigue siendo 36x36, así que la
   medida de la píldora, la del SVG y la de la tinta coinciden con la maqueta al
   píxel y en la misma posición.

   El `line-height: 0` de los dos envoltorios (`-closed` y `-opened`) es lo que
   quita un desvío vertical de 3,1px: son `<span>` en línea, y su hueco de línea
   descentraba el icono hacia arriba dentro de la píldora.

   El `margin-inline-start: 0` sigue haciendo falta, es el que anula el -5px que
   el `toggle` de fábrica le mete al SVG con (0,4,0). */
.lon-native .faq-list .elementor-toggle .elementor-tab-title .elementor-toggle-icon > span { line-height: 0; display: inline-flex; }
.lon-native .faq-list .elementor-toggle .elementor-tab-title .elementor-toggle-icon i { font-size: 24px; line-height: 1; }
.lon-native .faq-list .elementor-toggle .elementor-tab-title .elementor-toggle-icon svg {
  box-sizing: border-box; width: 36px; height: 36px; padding: 6px;
  margin-inline-start: 0;
}
.lon-native .faq-list .elementor-tab-title.elementor-active .elementor-toggle-icon {
  background: var(--brand-fill); color: var(--brand-contrast);
}


/* ============================================================================
   19 · El blanco horneado en el fondo de los campos, que es ciego al tema
   ----------------------------------------------------------------------------
   Síntoma medido, y es el peor de todo el formulario: en tema OSCURO el texto
   que escribe el visitante queda a 1,20:1 contra el fondo del campo. Cream
   sobre blanco. No se lee lo que se teclea. Pasa en los 32 campos de los 12
   formularios, en las dos pieles y en los dos idiomas. En tema claro no se ve
   porque ahí el blanco coincide con el token.

   Causa. El bloque 10 YA declara lo correcto, copiado de `.input`:
   `background: var(--surface); color: var(--text); border: 1px solid
   var(--line)`. Los tres valores voltean con el tema. Pero el generador fija
   `field_background_color` en `#ffffff` y Elementor lo hornea en el CSS por
   página como

     .elementor-<post> .elementor-element.elementor-element-<id>
     .elementor-field-group .elementor-field:not(.elementor-select-wrapper)
     { background-color: #ffffff }

   que vale (0,6,0), más la variante `.elementor-select-wrapper select` de
   (0,5,1) para el desplegable. El bloque 10 vale (0,3,0) y pierde: queda el
   fondo blanco fijo con el color de texto que SÍ voltea. De ahí el 1,20:1.

   Aquí no hay ningún valor nuevo. Lo único que se hace es devolverle el peso a
   lo que el bloque 10 ya declara: (0,7,0) para el campo (la clase raíz repetida
   tres veces más `.elementor-field.elementor-field-textual`, que el `<input>` y
   el `<textarea>` llevan las dos) y (0,6,1) para el `select`, que solo lleva
   `.elementor-field-textual` y va dentro de `.elementor-select-wrapper`.

   La causa de raíz está en el generador, no aquí: mientras siga fijando un
   color absoluto en `field_background_color` cualquier token que se le ponga
   delante es una carrera de especificidad. Lo suyo es que ese ajuste desaparezca
   del generador y el campo herede del sistema.
   ========================================================================== */

.lon-native.lon-native.lon-native .lon-nv-form .elementor-field-group .elementor-field.elementor-field-textual,
.lon-native.lon-native.lon-native .lon-nv-form .elementor-field-group .elementor-select-wrapper select {
  background: var(--surface);
  color: var(--text);
  border: 1px solid var(--line);
}

/* El texto de sugerencia, que el bloque 10 tampoco reemitía y heredaba el color
   del valor. Copia literal de `.input::placeholder`. */
.lon-native .lon-nv-form .elementor-field-textual::placeholder {
  color: var(--text-soft);
  opacity: 1;
}

/* ==========================================================================
   CORRECTIVA DE LA AUDITORIA DEL 2026-08-07

   Tres defectos con la misma raiz: el puente de `elementor-atomic.css` carga
   DESPUES de `components.css`, asi que cuando las dos hojas declaran algo con
   el mismo peso gana el puente, aunque lo que quisiera el diseño sea lo otro.
   Esta hoja carga la ultima, asi que es el sitio donde se devuelve el orden.
   ========================================================================== */

/* --- 1. La duracion del video, ilegible ----------------------------------
   `components.css` ya le daba fondo oscuro con `.card-video-t .dur`, que vale
   (0,2,0). Pero `.elementor .tag-pill--onmedia` vale lo mismo y carga despues,
   asi que ganaba el crema del cristal: crema sobre crema, contraste 1,0, el
   "7:00" invisible. Se sube a (0,3,0) desde aqui.

   La regla de `components.css` NO se toca: alli es correcta y la maqueta
   estatica se sirve sola. */
.lon-native .card-video-t .dur {
  background: rgba(28, 20, 16, .78);
  color: var(--cream);
  backdrop-filter: blur(4px);
  -webkit-backdrop-filter: blur(4px);
}

/* --- 2. La pastilla de proyecto tapando el titulo ------------------------
   En una tarjeta estrecha el panel de cristal crece a tres filas y su borde
   superior se mete debajo de la pastilla. Pasa igual en la maqueta: alli la
   pastilla queda DETRAS del panel y no se ve, y el titulo se lee entero. Aqui
   se veia al reves porque `.tag-pill--onmedia` trae `z-index: 3` del puente y
   el panel se quedaba en `auto`.

   Se le da al panel un escalon por encima. El resultado es el de la maqueta:
   en las tarjetas anchas la pastilla se ve, en las estrechas la tapa el panel.
   Que la pastilla desaparezca a ciertos anchos es decision de la maqueta
   aprobada, no un efecto colateral de esto. */
/* Solo el escalon de pintado. NADA de `position` aqui: `components.css` ya lo
   tiene en `absolute` con `bottom: 14px`, y ponerle `relative` lo saca del
   posicionado absoluto, lo manda al flujo normal arriba de la tarjeta y deja la
   foto debajo. Un elemento ya posicionado acepta `z-index` sin mas. */
.lon-native .card-listing-v2 .glass-panel {
  z-index: 4;
}

/* --- 3. "Unlimited" saliendose de su columna ----------------------------
   La banda declara `repeat(4, 1fr)` en las dos hojas, igual que la maqueta.
   La diferencia es el minimo: un `1fr` no baja de su contenido salvo que
   alguien le ponga `min-width: 0`, y eso es justo lo que Elementor hace con
   los hijos de un contenedor. Con el minimo a cero la cuarta columna se queda
   en 284px y la palabra, que pide 282px a 63px de cuerpo, se sale.

   En la maqueta las columnas salen 265/265/265/338: la cuarta crece porque su
   minimo es su contenido. Se devuelve ese minimo y la banda vuelve a repartir
   como estaba diseñada.

   Hace falta en DOS niveles, y esto es lo que no se ve a la primera: darle el
   minimo solo a la celda no sirve mientras el widget de dentro siga en
   `min-width: 0`, porque entonces el contenido de la celda puede encogerse
   hasta cero y el minimo de la celda sale cero igual. La medida tiene que
   poder subir desde el texto hasta la columna sin que nadie la corte por el
   camino. */
.lon-native .stats-premium > *,
.lon-native .stats-premium > * > * {
  min-width: auto;
}

/* --- 4. La pastilla del encabezado, partida en tres filas ----------------
   La maqueta deja el chip en una sola fila: avatar (oculto en movil), texto y
   flecha, uno al lado del otro. En el port se partia en tres y el chip pasaba
   de 62 a 130 puntos de alto. Como la muesca crece hacia arriba desde el
   fondo, ese alto de mas se comia el titular del encabezado: en la portada
   tapaba media frase de «Spaces to live in, not just to visit».

   La causa no esta en `.info-chip`, que nunca pidio envolver, sino en que
   Elementor pone `flex-wrap: wrap` en todos sus contenedores. La maqueta se
   apoyaba en el `nowrap` que trae de serie un flex.

   El texto lleva ya `min-width: 0`, asi que al no poder envolver se encoge y
   parte sus propias lineas, que es lo que hace la maqueta. */
.lon-native .hero-dock .info-chip {
  flex-wrap: nowrap;
}

/* --- 5. La fila vacia de la rejilla de descubrimiento --------------------
   `.discover-grid` sale de Elementor configurada como rejilla de 4 columnas y
   2 filas, de cuando llevaba mas tarjetas. Hoy tiene dos, que caben de sobra
   en la primera fila, pero la segunda se sigue reservando: 677 puntos de alto
   vacios, mas los 64 de relleno del contenedor. Eso es el hueco de una
   pantalla entera que se ve en /projects/ entre «Which one fits you?» y la
   banda de llamada.

   Dos columnas se calculan ademas a 0px, restos de la misma configuracion.

   Se arregla dejando que las filas y las columnas salgan del contenido en vez
   de estar fijadas: con dos tarjetas da una fila de dos, con tres daria una de
   tres, y el dia que se quite o se añada una no hay que volver aqui. */
.lon-native .discover-grid {
  grid-template-rows: auto;
  grid-auto-rows: auto;
  grid-template-columns: repeat(auto-fit, minmax(240px, 1fr));
}

/* --- 6. Las cifras de la banda, centradas en su celda --------------------
   En la maqueta las cuatro cifras van a la izquierda, en la misma vertical que
   su etiqueta de arriba y su descripcion de abajo. En el port salian centradas
   dentro de la celda, asi que cada numero caia en un sitio distinto y la
   columna se veia torcida.

   Lo hace el widget contador de Elementor, que centra su numero de serie. La
   clase del sistema aterriza en el envoltorio, no en el numero, asi que hay
   que bajar hasta el. Correccion pedida por el CEO el 2026-08-07. */
.lon-native .stats-premium .elementor-counter,
.lon-native .stats-premium .elementor-counter-number-wrapper {
  justify-content: flex-start;
  text-align: left;
}

/* El titulo que el contador trae de serie («Cool Number») esta a cero por
   cero, asi que no se ve, pero un lector de pantalla si lo lee y en el texto
   de la pagina cuenta. Se saca del arbol de accesibilidad. */
.lon-native .stats-premium .elementor-counter-title {
  display: none;
}

/* --- 7. El cuerpo de las cifras de financiacion --------------------------
   Medida pedida por el CEO el 2026-08-07 para la banda de «What you'll pay on
   top of the price». Venia de `clamp(20px, 2vw, 26px)`, que al lado del resto
   de cifras del sitio se quedaba pequeña. */
.lon-native .econ-cell .v {
  font: 600 clamp(30px, 3.4vw, 50px)/1 var(--font-display);
}


/* ============================================================================
   20 · La casilla de consentimiento y el anclaje al formulario
   ----------------------------------------------------------------------------
   Añadido el 2026-08-07. Hasta ese día ningún formulario del sitio pedía
   consentimiento ni enlazaba a nada legal, así que esta piel no existía y el
   campo `acceptance` de Elementor salía con su aspecto de fábrica: casilla
   azul del navegador, texto al cuerpo del formulario y enlaces en el verde de
   Elementor.

   Las dos pieles del bloque 13 vuelven a aparecer aquí, por lo mismo: el texto
   va sobre crema en los formularios de tarjeta y sobre el panel de tinta en
   los cuatro de proyecto, y un solo color no vale para los dos.

   La casilla se tiñe con `accent-color`, que es una propiedad, no un truco: no
   hay que esconder el control nativo ni pintar uno falso, y el estado marcado
   lo sigue anunciando el navegador. El foco se deja al `:focus-visible` del
   sitio, con el mismo anillo que los campos de texto.
   ========================================================================== */

.lon-native .lon-nv-form .elementor-field-type-acceptance .elementor-field-subgroup {
  display: flex;
}
.lon-native .lon-nv-form .elementor-field-type-acceptance .elementor-field-option {
  display: flex; align-items: flex-start; gap: 10px;
}
.lon-native .lon-nv-form .elementor-acceptance-field {
  flex: 0 0 auto; width: 16px; height: 16px; margin-top: 2px;
  accent-color: var(--brand-fill);
}
.lon-native .lon-nv-form .elementor-acceptance-field:focus-visible {
  outline: 2px solid var(--focus-ring); outline-offset: 2px;
}
.lon-native .lon-nv-form .elementor-field-type-acceptance label {
  font: 400 13px/1.5 var(--font-body); color: var(--text-muted);
  margin: 0; letter-spacing: 0;
}
.lon-native .lon-nv-form .elementor-field-type-acceptance a {
  color: inherit; text-decoration: underline; text-underline-offset: 2px;
}
.lon-native .lon-nv-form .elementor-field-type-acceptance a:hover {
  color: var(--brand-fill);
}

/* Piel de tinta, la del bloque 13: sobre el panel oscuro el texto muted se
   queda en 2,1:1. El crema al 80% es el mismo valor que usan los rótulos. */
.lon-native .form-premium .lon-nv-form .elementor-field-type-acceptance label {
  color: color-mix(in srgb, var(--cream) 80%, transparent);
}
.lon-native .form-premium .lon-nv-form .elementor-field-type-acceptance a:hover {
  color: var(--cream);
}

/* El botón «Descargar el dossier» de las cuatro fichas de proyecto salta al
   formulario de la propia página con un anclaje. Sin este margen el formulario
   aterriza debajo de la barra de navegación, que es `position: sticky` a 14px
   del borde y mide 68px de alto: el rótulo del primer campo quedaba tapado. */
.lon-native #formulario {
  scroll-margin-top: 96px;
}

/* --- 8. Las cuatro tarjetas de tipología, estrujadas ---------------------
   La maqueta pone la fila con un estilo en linea:
   `grid-template-columns: repeat(auto-fit, minmax(320px, 1fr))`. Con CUATRO
   tarjetas eso reparte 4 columnas por encima de 1366 y 3 entre 1024 y 1366,
   asi que en ese tramo queda una tarjeta huerfana abajo con un hueco al lado.
   Tres columnas y cuatro tarjetas no cuadran nunca.

   El port hace algo peor: su contenedor es un flex que no reparte en menos
   columnas, asi que mantiene las cuatro en fila y las va estrujando. A 768 las
   deja en 173 puntos de ancho, y como la tarjeta lleva `aspect-ratio: 16/8.5`
   y el panel de cristal mide 148 de alto, de la foto no queda mas que un filo.

   Se corta en 4, 2 y 1. Nunca 3: con cuatro piezas, dos filas de dos siempre
   quedan cuadradas, y la tarjeta crece lo bastante para que la foto vuelva a
   verse. Esto MEJORA el comportamiento de la maqueta en el tramo medio, no lo
   copia: es una desviacion a proposito, pedida por el CEO el 2026-08-07 al ver
   el resultado.

   El selector va por el hijo porque el contenedor no tiene clase propia: en la
   maqueta es un `div` sin clase con estilo en linea, y en el port un contenedor
   de Elementor sin mas seña que las suyas. `:has()` es lo que permite
   agarrarlo por lo que lleva dentro. */
.lon-native :has(> .card-listing-v2) {
  display: grid;
  gap: 16px;
  grid-template-columns: repeat(2, minmax(0, 1fr));
}

@media (min-width: 1367px) {
  .lon-native :has(> .card-listing-v2) {
    grid-template-columns: repeat(4, minmax(0, 1fr));
  }
}

/* Por debajo de 640 una sola columna: a dos, la tarjeta baja de 300 puntos y
   el panel vuelve a comerse la foto. */
@media (max-width: 640px) {
  .lon-native :has(> .card-listing-v2) {
    grid-template-columns: minmax(0, 1fr);
  }
}


/* ============================================================================
   21 · La banda de llamada, legible sobre la fotografía
   ----------------------------------------------------------------------------
   Encargo del CEO del 2026-08-07: en la portada, el botón de WhatsApp «casi no
   se ve», los textos se pierden sobre la foto y hay que subir el velo.

   Medido ANTES de tocar nada, muestreando los píxeles de la captura que hay
   DETRÁS de cada texto. El color heredado de la caja no sirve para juzgar esto:
   detrás de la letra no está la caja, está la foto. Peor píxel de cada pieza,
   en 390, 820 y 1440, y en los dos idiomas:

     titular             1,49 a 2,02   pide 3     (64px, cuenta como texto grande)
     bajada              1,65 a 2,21   pide 4,5
     nota del pie        2,34 a 2,87   pide 4,5
     botón de WhatsApp   1,00 clavado  pide 3

   Ese 1,00 clavado no es redondeo. `.btn-outline` no tiene superficie: solo un
   filo de crema al 55% de un punto de grosor. Su superficie ES el fondo, así
   que la cuenta da uno por definición. Ahí está el motivo de que no se vea, y
   no es que se vea poco: es que no hay botón, hay un contorno.

   Tres cosas, y las tres hacen falta.

   1 · EL VELO. Se conserva la diagonal de tinta cálida que ordenó el CEO el
       2026-07-08 (`components.css`, bloque 37) y se le suma una capa centrada
       donde cae la copia. Se SUMA en vez de sustituirla porque la diagonal hace
       otro trabajo: da el peso de marca desde la esquina inferior izquierda. La
       capa nueva es la que se ocupa de que se lea.

       En escritorio esa capa se estrecha a propósito. Su radio horizontal es
       del 52%, que en 1440 son unos 649 puntos desde el centro, y `.inner` mide
       720 como mucho: el velo cubre la copia entera y se apaga antes de llegar
       a los márgenes. Eso es lo que deja que la foto siga estando. Medido sobre
       la banda con el contenido quitado de en medio, a 1440 el recorrido de luz
       baja de 0,392 a 0,229, y la media de 0,163 a 0,068. Baja, que era el
       encargo, pero no se va a cero: la calle, las palmeras y las nubes se
       siguen viendo.

       Por debajo de 900 la copia ocupa casi la banda entera y no queda margen
       lateral que salvar, así que ahí la capa se ensancha en vez de estrecharse.

   2 · LA NEGRITA. El titular de 600 a 700 y la bajada de 400 a 600, con la
       crema a opacidad entera (venía al 90%). Sobre foto, el trazo fino se come
       el borde de la letra aunque la cuenta de contraste salga bien.

   3 · EL FILO DEL SECUNDARIO, de un punto al 55% a punto y medio a opacidad
       entera. El botón sigue siendo fantasma, sin relleno: lo que se sube es lo
       único que dibuja su forma. El porqué de que no lleve relleno, y el rodeo
       que costó averiguarlo, está justo debajo, en el bloque de su regla.

   Medido DESPUÉS, mismo método, peor píxel, las seis combinaciones:

     titular                   6,29 a  7,78   pide 3
     bajada                    7,21 a  8,53   pide 4,5
     nota del pie              8,88 a  9,46   pide 4,5
     texto del secundario      8,52 a 10,60   pide 4,5
     filo del secundario       8,48 a  9,69   pide 3
     superficie del primario   8,25 a  9,46   pide 3

   De propina: la llamada principal también estaba por debajo de su mínimo
   (2,18 a 2,91 contra el 3 que pide una superficie) y ahora anda por el 9. Nadie
   lo había medido porque una pastilla de crema sobre una pared blanca se lee
   igual de mal y no lo parece.

   Lo que NO arregla esta hoja, porque no es suyo: los dos botones miden 43
   puntos de alto y la recomendación de zona de pulsación son 44. Salen de
   `components.css` línea 24, que le da a `.btn` una línea de 15 y 14 de relleno
   arriba y abajo. Es la medida del sistema de diseño y la llevan todos los
   botones del sitio, así que subirla es una decisión de diseño, no un remate de
   este arreglo.

   La medida se rehace con `website/_scripts/medir-banda-cta.py`.
   ========================================================================== */

.lon-native .cta-band--premium .scrim {
  background-image:
    radial-gradient(120% 94% at 50% 54%,
      rgba(26, 19, 13, .68) 0%,
      rgba(26, 19, 13, .60) 60%,
      rgba(26, 19, 13, .03) 100%),
    linear-gradient(to top right,
      rgba(28, 20, 16, .78) 0%,
      rgba(28, 20, 16, .42) 45%,
      rgba(28, 20, 16, .14) 78%);
}

/* Desde 900 aparecen los márgenes laterales de `.inner` y el velo se recoge
   para dejarlos respirar. El corte va en 900 y no en 1024 porque `.inner` mide
   720 más el relleno de la banda: por debajo de eso no hay margen que salvar. */
@media (min-width: 900px) {
  .lon-native .cta-band--premium .scrim {
    background-image:
      radial-gradient(52% 96% at 50% 52%,
        rgba(26, 19, 13, .68) 0%,
        rgba(26, 19, 13, .60) 62%,
        rgba(26, 19, 13, 0) 100%),
      linear-gradient(to top right,
        rgba(28, 20, 16, .78) 0%,
        rgba(28, 20, 16, .42) 45%,
        rgba(28, 20, 16, .14) 78%);
  }
}

.lon-native .cta-band--premium h2 { font-weight: 700; }
.lon-native .cta-band--premium .sub { font-weight: 600; color: var(--cream); }

/* El filo del secundario, al doble de grosor y a opacidad entera. Venía a un
   punto y al 55%, que sobre el velo de antes era casi nada.

   Aquí hubo un rodeo que merece quedar escrito, porque la trampa está en la
   métrica y no en el botón. El primer arreglo le puso relleno verde de WhatsApp
   partiendo de una medida que decía 1,00 clavado. El 1,00 era cierto, pero era
   la superficie del botón contra su entorno, y un botón fantasma NO TIENE
   superficie: su forma la dibuja el filo, así que ahí dentro lo que hay es el
   mismo fondo que fuera. Esa cuenta da uno siempre, esté el botón bien o mal
   montado, y por eso no sirve para juzgarlo. El CEO tumbó el relleno el mismo
   día («el botón no es verdad, dejarlo como estaba en ghost»): con superficie
   propia dejaba de leerse como secundario y le disputaba el sitio a la llamada
   principal.

   Lo que sí se mide en un fantasma son dos cosas distintas, y las dos van
   contra lo que tiene DETRÁS. Peor píxel de las seis combinaciones:

                        original   solo filo   desplegado   pide
     su texto          2,46-3,98   2,46-3,98   8,52-10,60    4,5
     su filo           1,69-1,84   2,43-2,79   8,48- 9,69    3

   La columna del medio es la que zanja la discusión: es este mismo filo de
   punto y medio a opacidad entera puesto sobre el velo VIEJO, y se queda en
   2,43 a 2,79, todavía por debajo de 3. O sea que engordar el filo por su
   cuenta no salvaba el botón. Lo que lo salva es el velo, y al filo solo le
   tocaba dejar de ser medio transparente.

   Las tres columnas están medidas contra el sitio en vivo, inyectando el estado
   que toca en cada caso. */
.lon-native .cta-band--premium .btn-outline {
  box-shadow: inset 0 0 0 1.5px var(--cream);
}

/* ============================================================
   Tope de 4,5 rem para los titulares de página (CEO, 2026-08-07)
   ============================================================

   Los cabeceros usaban `clamp(44px, 7.5vw, 108px)` y su variante de página
   `clamp(36px, 5.5vw, 82px)`. A 1440 eso daba 79,2 px, o sea 4,95 rem, y en
   pantallas más anchas subía hasta 108 px (6,75 rem). El CEO pidió que ninguno
   pase de 4,5 rem, que son 72 px.

   Solo cambia el techo: el mínimo y la pendiente se quedan igual, así que por
   debajo de 1309 px de ancho (donde 5.5vw ya vale 72) no se mueve nada.

   OJO CON EL SELECTOR. En el sitio estático la clase iba en el propio `h1`,
   pero al pasar por Elementor va en el DIV que lo envuelve, y el `h1` de dentro
   solo lleva `elementor-heading-title` y hereda el cuerpo de su padre. Apuntar
   a `h1.display-hero` no caza nada y el tope no se aplica: se comprobó midiendo,
   porque la regla estaba escrita y la página seguía dando 79,2 px. Se apunta a
   la clase donde de verdad está, y se deja también la variante sobre el `h1`
   para el montaje estático de `site/`. */

.lon-native .display-hero,
.lon-native h1.display-hero,
.elementor .lon-native .display-hero {
  font-size: clamp(44px, 7.5vw, 72px);
}

.lon-native .display-hero--page,
.lon-native h1.display-hero--page,
.elementor .lon-native .display-hero--page {
  font-size: clamp(36px, 5.5vw, 72px);
}

/* ============================================================
   Las cifras grandes necesitan una tarjeta que las aguante
   ============================================================

   La banda de cifras (`.econ-break`) repartía sus tarjetas con
   `minmax(180px, 1fr)`. Con el cuerpo original de la cifra (26 px como mucho)
   180 sobraba. Al subirla a `clamp(30px, 3.4vw, 50px)` por encargo del CEO,
   una cifra como `$179,256` pasó a medir 211 px a 1440 dentro de una tarjeta
   de 149 px de contenido: se salía 62 px, cortada por el borde.

   No se toca el cuerpo de la cifra, que es el que se pidió. Se le da a la
   tarjeta el ancho que ese cuerpo necesita: 211 de texto más 36 de relleno son
   247, así que con 250 de mínimo la rejilla pasa sola de seis columnas a
   cuatro en cuanto no caben, y en pantallas estrechas sigue plegando igual. */

.lon-native .econ-break {
  grid-template-columns: repeat(auto-fit, minmax(250px, 1fr));
}


/* ============================================================
   La banda oscura de cifras no cabe en dos columnas a 390
   ============================================================

   `.stats-premium` pliega a dos columnas por debajo de 860. A 390 esas dos
   columnas no caben: la rejilla ofrece 302 px de contenido y sus columnas
   piden 358 (162,8 la primera y 195,2 la segunda), asi que la segunda se sale
   12 px y la pagina arrastra en horizontal.

   Quien manda ahi no es ninguna cifra, son dos anchos minimos que no encogen:
   la palabra `Agrupada` a 40 px mide 195 px y no tiene por donde partirse, y
   `.lbl` reserva sus 22ch (unos 162 px). Con `min-width: auto`, la columna
   nace con ese ancho y la rejilla crece por encima de su hueco.

   Por debajo de 560 se pasa a una sola columna: cada tarjeta recibe los 302 px
   enteros, la palabra larga entra sobrada y el arrastre desaparece. La segunda
   tarjeta recupera su linea de arriba, que la regla de 860 le quitaba por ser
   parte de la primera fila cuando habia dos columnas.

   El desborde es ANTERIOR al cambio de comisiones del 2026-08-07: se midio
   devolviendo por consola la cifra y el rotulo viejos y arrastraba los mismos
   12 px. Se arregla aqui porque `casos reales` es una de las paginas tocadas y
   tenia que quedar limpia a los tres anchos. */

@media (max-width: 560px) {
  .lon-native.lon-native.lon-native .stats-premium {
    grid-template-columns: 1fr;
  }
  .lon-native.lon-native.lon-native .stats-premium .cell:nth-child(2) {
    border-top: 1px solid color-mix(in srgb, var(--cream) 18%, transparent);
    padding-top: 20px;
  }
}


/* ============================================================
   Una cifra que es un rango necesita menos cuerpo que un numero
   ============================================================

   `.kpi` esta pensada para cifras cortas (`Agrupada`, `Reporte`, `20 %`) y por
   eso sube hasta 76 px. La comision de `casos reales` dejo de ser un numero y
   paso a ser un rango, `25-30 %`, que a ese cuerpo no entra: a 1440 la tarjeta
   ofrece 212,5 px y el texto pide 240,7, asi que parte por el espacio y deja el
   simbolo `%` solo en la segunda linea. No se sale de la caja, pero un
   porcentaje separado de su numero se lee como un error.

   Bajarle el cuerpo a `.kpi` entera estropearia a sus hermanas, que estan bien.
   Se le da una clase propia (`kpi--rango`, puesta en la maquetacion) y aqui el
   cuerpo que cabe, medido con `medir-kpi-rango.py`: el techo real es 55,9 px a
   1440 y 47,3 px a 1100, de donde sale `3.8vw` con tope en 54. `nowrap` es el
   cinturon: si algun dia cambia la fuente, la cifra se sale antes de volver a
   partirse, y un desborde se ve, mientras que un `%` huerfano pasa inadvertido.

   En ingles (217) la misma cifra es `25-30%`, sin espacio antes del simbolo, y
   entra en una linea a cuerpo completo: esa pagina no lleva la clase.

   ACTUALIZADO 2026-08-10. `.kpi` bajo de 4,4vw a 3,1vw porque a ese cuerpo las
   cuatro columnas no cabian en la caja y la ultima tarjeta se cortaba. Esta
   clase se baja en la misma proporcion: si se dejara en 3,8vw, el rango
   quedaria MAS grande que sus hermanas y se invertiria lo que esta regla
   buscaba. Se conserva `nowrap`, que es lo que evita el `%` huerfano. */

.lon-native.lon-native.lon-native .stats-premium .kpi--rango {
  font-size: clamp(26px, 2.7vw, 40px);
  white-space: nowrap;
}


/* ============================================================
   La banda de casos: media tarjeta vacia encima de la cifra
   ============================================================

   En `.featured-grid` conviven tres celdas: la ficha del caso (foto, titulo,
   parrafo largo y boton) y dos tarjetas de cifra. La ficha es la que impone la
   altura, y las otras dos se estiran para igualarla con su contenido abajo. El
   resultado es medio cartel vacio encima de cada numero.

   Encoger las tarjetas no es opcion: romperia la rejilla y dejaria escalones.
   Asi que el hueco se llena con lo unico que la gente viene a leer ahi, que es
   la cifra. Sube de 64 px a 78 y el rotulo la acompana.

   El techo de 78 no es estetico, es lo que cabe: la cifra mas larga de esta
   banda es `$1,159.75`, nueve caracteres, y a 1440 la tarjeta ofrece unos
   340 px utiles. Por encima de 78 parte en dos lineas y el simbolo se queda
   huerfano, que es peor que el hueco que veniamos a arreglar. Si algun dia
   entra una cifra mas larga, hay que volver a medir. */

.elementor .featured-grid .stat-tile .num,
.featured-grid .stat-tile .num {
  font-size: clamp(44px, 5.6vw, 78px);
  line-height: 0.94;
}

.elementor .featured-grid .stat-tile .lbl,
.featured-grid .stat-tile .lbl {
  font-size: 15.5px;
  line-height: 1.45;
  max-width: 26ch;
}
