/* =============================================================================
   LIJ — HEADER (Fase 4)
   Tema hijo smb2b · Grupo SM
   -----------------------------------------------------------------------------
   Reviste el header real (plantilla Elementor 62) con el lenguaje visual nuevo,
   SIN sustituir ni una pieza de su funcionalidad:

     [menu_principal]  -> menú de WordPress con el walker Bootstrap y su
                          megamenú. Aquí solo se le da forma de píldora.
     [buscador_wc]     -> formulario de SearchWP con su campo oculto
                          post_type=product (búsqueda por ISBN/autor/código).
     off-canvas        -> el menú móvil de Elementor Pro.

   REFERENCIA DE MEDIDAS: `nueva-web-lij-main/src/components/Menu.css`. Hay una
   réplica navegable del header del prototipo, servida con su CSS real, en
   `wp-content/uploads/lij-referencia/menu.html`, para comparar lado a lado.
   Esa carpeta está fuera del control de versiones y no se despliega.

   Documentación: docs/redesign/FASE-4-HEADER.md
   Depende de: css/lij-design-system.css (tokens) y js/lij-header.js (colapso)

   -----------------------------------------------------------------------------
   SOBRE LOS !important DE ESTE ARCHIVO

   El header ya venía muy estilado desde estilos.css, y varias de esas reglas
   llevan !important. Contra un !important no hay especificidad que valga, así
   que hay que responder con otro. Cada uno de este archivo está anotado con la
   línea de estilos.css que lo obliga. Las reglas del tema NO se tocan, para no
   alterar ninguna otra pantalla del sitio.

   -----------------------------------------------------------------------------
   POR QUÉ ":is(header,div).elementor-location-header" Y NO SOLO "header...."

   Encontrado por Francisco: al abrir "Editar con Elementor" DIRECTO sobre la
   plantilla Header (post 62, Plantillas > Constructor de temas), se veía sin
   ningún estilo (píldoras subrayadas, carrito/hamburguesa visibles, sin onda)
   pese a que las clases `elementor-location-header`/`.lij-header-bar` SÍ
   estaban presentes — confirmado inspeccionando el DOM real del iframe del
   editor. La causa: en ese modo de edición, Elementor envuelve la plantilla en
   un `<div>` (clase `elementor-edit-area`), no en un `<header>` real — ese
   `<header>` solo aparece cuando la plantilla se imprime en su ubicación real
   dentro de una página (Home, ficha de producto, etc.). Como todo este archivo
   parte de `header.elementor-location-header` (selector de TIPO de etiqueta),
   nada podía coincidir con un `<div>`, por más que la clase estuviera bien.

   Fix: `:is(header,div).elementor-location-header` en los 126 selectores del
   archivo — misma especificidad exacta que antes (`:is()` toma la del
   argumento más específico, y `header`/`div` son ambos selectores de tipo), no
   se reordena nada frente a estilos.css. Así el CSS real se ve igual editando
   desde la plantilla Header directamente que en el sitio publicado.
   ============================================================================= */


/* =============================================================================
   1. ENVOLTORIO: sticky y onda
   ============================================================================= */

:is(header,div).elementor-location-header:has(.lij-header-bar) {
    position: sticky;
    top: 0;
    z-index: 100;
    background-color: var(--lij-red);
}

/* --- 1.1 Desbloqueo del sticky -------------------------------------------
   OBSTÁCULO REAL VERIFICADO: el tema fija `overflow-x: hidden` en html y en
   body, y lo hace en los dos rangos, así que aplica siempre:
     estilos.css:4342-4347  @media (min-width: 768px)
     estilos.css:3160-3166  @media (max-width: 767px), con !important

   `overflow-x: hidden` convierte al elemento en contenedor de scroll, y eso
   anula `position: sticky` en sus descendientes.

   La corrección es cambiar `hidden` por `clip`: recorta el desbordamiento
   horizontal igual, que es para lo que esas reglas están ahí, pero NO crea
   contenedor de scroll. Si un navegador no soporta `clip`, ignora la
   declaración y queda el `hidden` de antes: el header no se fija, nada rompe. */
html:has(.lij-header-bar),
body:has(.lij-header-bar) {
    overflow-x: clip !important;
}

/* La onda cuelga del envoltorio, no de una fila concreta. Altura y posición
   tomadas del prototipo: Menu.css `.menu__wave` (41.771px, bottom -41.77px). */
:is(header,div).elementor-location-header:has(.lij-header-bar)::after {
    content: '';
    position: absolute;
    left: 0;
    right: 0;
    bottom: calc(var(--lij-wave-h) * -1 + 1px);
    height: var(--lij-wave-h);
    background-image: url('/wp-content/uploads/2026/09/header/lij-header-header-wave.svg');
    background-size: 100% 100%;
    background-repeat: no-repeat;
    pointer-events: none;
    z-index: 1;
}

/* --- 1.3 "Tucked": el header se esconde al bajar, deja solo la onda -------
   Implementa Menu.tsx/.css de v2 (2026-09-23, ver js/lij-header.js para la
   lógica de scroll — mismo umbral de 8px, misma excepción "cerca del tope"
   y "algo abierto"). Mismo criterio de accesibilidad que v2: si hay foco de
   teclado dentro, no se esconde (`:has(:focus-visible)`).

   CORREGIDO 2026-09-23 (2 intentos, el primero insuficiente — ver historial
   en `docs/SESSION_LOG.md` esa fecha): el transform se aplica al ENVOLTORIO
   exterior (mismo elemento que ya es `position: sticky` y lleva la onda
   como `::after`, §1), NO a `.lij-header-bar` — replicando la arquitectura
   real de v2, donde fondo, contenido Y onda son el MISMO elemento (`.menu`)
   y por eso se van juntos al trasladarse.

   El primer intento trasladaba solo `.lij-header-bar` (la barra interior),
   dejando el envoltorio fijo "para que la onda no se moviera" — pero eso es
   exactamente lo que v2 NO hace: en v2 la onda se desplaza junto con el
   resto y término aterrizando arriba del todo porque cuelga por fuera de la
   caja (`bottom: -41.77px`) una distancia casi igual a la propia altura del
   header, así que el `translateY(-100%)` la deja justo a la vista mientras
   todo lo demás sale de cuadro. Con el envoltorio fijo, la onda de WordPress
   se quedaba ~84px más abajo de lo debido (pegada al borde inferior de una
   caja que seguía ahí, sticky, sin moverse), dejando un hueco arriba por el
   que se veía lo que hubiera detrás (en la home, el rojo de "Colecciones
   destacadas") en vez de la nada — parecía "una barra vacía" aunque su
   fondo ya se hubiera puesto transparente.

   Trasladar el envoltorio entero resuelve las dos cosas a la vez: la onda
   se mueve con él y termina en la posición correcta (arriba del todo), y ya
   no hace falta ningún ajuste de `background-color` aparte (el fondo se va
   con el resto, como en v2). */
:is(header,div).elementor-location-header:has(.lij-header-bar) {
    /* 300ms, igual que Menu.css `.menu` (`transition: transform 0.3s ease`) —
       estaba en 200ms, más rápido de lo debido. */
    transition: transform 300ms ease;
}

:is(header,div).elementor-location-header:has(.lij-header-bar.lij-header--tucked):not(:has(:focus-visible)) {
    transform: translateY(-100%);
}

@media (prefers-reduced-motion: reduce) {
    :is(header,div).elementor-location-header:has(.lij-header-bar) {
        transition: none;
    }
}

/* El megamenú y el foco tienen que poder salir del header. */
:is(header,div).elementor-location-header:has(.lij-header-bar),
:is(header,div).elementor-location-header .lij-header-bar,
:is(header,div).elementor-location-header .lij-header-bar > .e-con-inner {
    overflow: visible;
}


/* --- 1.2 Corrección de solape de la onda en páginas sin sección propia ----
   MISMO PROBLEMA ya documentado y corregido en Home, Ficha de producto
   (lij-product.css `.ficha-producto`), Colecciones (lij-collections.css) y
   Resultados de búsqueda/Novedades: la onda cuelga POR DEBAJO de la caja del
   header (ver arriba, §1) y se superpone a lo que venga justo despues. Si esa
   primera sección no reserva ese espacio con su propio `padding-top`, la onda
   roja tapa literalmente el título — verificado con Playwright: en Carrito
   y en Acceso/Registro el H1 quedaba a solo 0-8px del borde del header, con
   la onda (42px) cortándolo a la mitad.

   Estas 7 páginas reales (construidas enteramente en Elementor, sin Theme
   Builder de por medio) tenían ese mismo hueco sin corregir. Se aplica el
   mismo criterio que en todos los casos anteriores: `padding-top`, nunca
   `margin-top` (un margin dejaría un hueco gris del body en vez de pegar el
   fondo de la sección al header — ver lij-product.css y WAVES_SHAPES.md).
   Selector: la clase que Elementor ya genera para cada contenedor
   (`elementor-element-<data-id>`), sin tocar `_elementor_data` ni la BD. */
.page-id-85 .elementor-element-3c05d35d,     /* Crear cuenta de cliente */
.page-id-106 .elementor-element-4f4abae8,    /* Condiciones de uso */
.page-id-109 .elementor-element-9ffe3c5,     /* Política de cookies */
.page-id-112 .elementor-element-7f1c5ef0,    /* Condiciones de compra */
.page-id-115 .elementor-element-2a1fcf0e,    /* Acceso/Registro de clientes (también sirve de checkout sin sesión) */
.page-id-119 .elementor-element-5485dc7b,    /* Carrito de la compra */
.page-id-122 .elementor-element-f0f6638 {    /* Política de privacidad */
    padding-top: var(--lij-wave-h) !important;
}

@media (max-width: 767px) {
    /* Hasta el 2026-10-07 la onda bajaba a 24px en este rango y aquí se
       repetía ese valor. Ahora mide 42px en todos los anchos (v3); el valor
       se mantiene literal porque estos contenedores son hermanos del header,
       no descendientes, y no heredan su variable. */
    .page-id-85 .elementor-element-3c05d35d,
    .page-id-106 .elementor-element-4f4abae8,
    .page-id-109 .elementor-element-9ffe3c5,
    .page-id-112 .elementor-element-7f1c5ef0,
    .page-id-115 .elementor-element-2a1fcf0e,
    .page-id-119 .elementor-element-5485dc7b,
    .page-id-122 .elementor-element-f0f6638 {
        padding-top: 42px !important;            /* la onda mide 42 también aquí (v3) */
    }
}


/* =============================================================================
   2. LA FILA
   -----------------------------------------------------------------------------
   Geometría del prototipo (Menu.css):

     .menu            padding 24px 32px 4px
     .menu__logo      56px de alto, 16px de separación a su derecha
     .menu__sections  pildoras + lupa JUNTAS, gap 8, padding-right 32
     .menu__nav-items min-width 1px, overflow-x auto  <- se comprime
     .menu__search    383px, flex-shrink 0            <- no se comprime
     .menu__social    gap 8

   La clave del comportamiento: las píldoras y la lupa van pegadas (8px) y
   separadas de las redes por 32px. Cuando el buscador se despliega, es la fila
   de píldoras la que cede el ancho, porque tiene `min-width: 0` y desborda con
   scroll, mientras que el buscador no encoge. Ese es el efecto de "el menú se
   desplaza a la izquierda" al abrir la lupa: no es que el buscador se dibuje
   ENCIMA del menú (son hermanos en la misma fila flex, nunca se superponen),
   es que el menú literalmente pasa a medir menos.

   Equivalencia en el DOM de WordPress:
     .logotipo (contenedor) · widget del menú · .buscador · .opciones

   EL ANCHO DEL BUSCADOR SE FIJA EN EL CONTENEDOR (.buscador), NO EN EL
   FORMULARIO DE DENTRO. Esto es un cambio de arquitectura respecto a una
   versión anterior que ponía `min-width` en el `<form>`, cuatro capas más
   adentro (widget → .elementor-widget-container → .elementor-shortcode →
   .widget_product_search → form), confiando en que el ancho subiera por esa
   cadena. MEDIDO en el navegador: no siempre llegaba al valor pedido (383px
   solicitados, 261px reales), porque cada capa intermedia puede recortar antes
   de que el valor llegue arriba. Fijar `flex-basis` directamente en el
   contenedor no depende de esa cadena: es la propiedad que decide el ancho del
   ítem flex, medida y confirmada como la única palanca que responde de forma
   fiable contra el sistema de anchos por variable de Elementor (ver
   `wp-content/uploads/lij-referencia/prueba-ancho.html`, once estrategias
   probadas). El `<form>` de dentro simplemente se estira al 100% de lo que el
   contenedor le da (sección 6).
   ============================================================================= */

:is(header,div).elementor-location-header .lij-header-bar,
:is(header,div).elementor-location-header .lij-header-bar > .e-con-inner {
    position: relative;
    z-index: 2;
    display: flex;
    flex-direction: row;
    flex-wrap: nowrap;
    align-items: center;
    gap: var(--lij-space-xxs);
}

/* Elementor trae su propio `min-height` para este contenedor (64px en
   escritorio, pero 90px/60px en sus breakpoints de tablet/mobile_extra —
   VERIFICADO en `wp-content/uploads/elementor/css/post-62.css`, incluso
   recién regenerado desde Herramientas > Regenerar CSS: no es caché vieja,
   es un valor real del panel). Si la ventana cae en alguno de esos rangos
   intermedios, ese min-height gana porque nuestra fila no lo tocaba, y la
   altura deja de ser 84px. Se anula aquí, sin importar el breakpoint. */
:is(header,div).elementor-location-header .lij-header-bar {
    min-height: auto !important;
}

/* ALTO DE LA FILA: 84px (56 del logo + 24 arriba + 4 abajo), medido en el
   maestro visual (nodo Figma 105:185 "menu").

   HISTORIA: hasta la Fase 4f, el header vivía en modo "boxed" y Elementor
   envolvía sus hijos en un `.e-con-inner` real (no hipotético, verificado en
   el HTML servido) — el padding vertical iba SOLO ahí, porque declararlo
   también en `.lij-header-bar` lo duplicaba (24+4 arriba y otra vez 24+4
   adentro = 112px de alto en vez de 84px).

   Fase 4g (2026-09-08): el header pasó a `content_width: full` (ver
   `redesign/FASE-4-HEADER.md` §17) y Elementor deja de renderizar
   `.e-con-inner` por completo en ese modo — confirmado en el DOM. La regla
   de arriba dejó de aplicarse (padding volvía a 0, la fila subía a 120px).
   El padding vertical y el horizontal se configuraron en el propio panel de
   Elementor, control "Padding" del contenedor del header (24/32/4/32px,
   top/right/bottom/left) — nativamente, sin CSS.

   PARCIALMENTE EFECTIVO — el vertical sí, el horizontal no. Verificado con
   el navegador real: la variable que genera Elementor (`--padding-left:
   32px`, incluso `--padding-inline-start: 32px` ya resuelta) es correcta,
   pero el `padding-left`/`padding-inline-start` REALMENTE aplicado seguía
   midiendo 24px. El vertical (`padding-top`/`padding-bottom`) sí toma su
   variable sin problema. No se pudo aislar qué regla exacta gana esa pelea
   solo por horizontal — se probó listar las reglas CSS que matchean el
   contenedor vía `document.styleSheets` y ninguna candidata clara apareció
   con el valor 24px literal; probablemente un mecanismo interno de
   Elementor para contenedores full-width que no expone su fuente con
   claridad. Con el mismo criterio que el resto de este archivo (Elementor
   primero; CSS solo cuando el panel no alcanza), el horizontal se fuerza
   aquí. El vertical se deja fuera de este archivo a propósito: ya funciona
   nativamente, forzarlo también sería redundante. */
:is(header,div).elementor-location-header .lij-header-bar {
    padding-left: var(--lij-space-l) !important;
    padding-right: var(--lij-space-l) !important;
}

/* El logo no encoge y deja 16px a su derecha, como en el prototipo: 8 de
   relleno más los 8 de hueco de la barra (antes 16 + 8, y la tira de
   pestañas desbordada empezaba 8px más a la derecha que en v3). */
:is(header,div).elementor-location-header .lij-header-bar .logotipo {
    width: auto;
    max-width: none;
    flex: 0 0 auto;
    padding-right: var(--lij-space-xxs);
}

/* El widget del menú es el único que cede ancho de verdad. `flex-shrink: 1`
   más `min-width: 0` es lo que permite que baje por debajo del ancho de su
   contenido; sin `min-width: 0` un ítem flex nunca encoge más allá del ancho
   mínimo de su contenido (aquí, la anchura que ocuparía el texto más largo,
   "Licencias digitales", sin envolver), y el buscador no tendría sitio.
   `flex-grow: 1` es lo que hace que el menú absorba cualquier hueco sobrante
   cuando el buscador está colapsado (38px): ocupa toda la fila disponible,
   dejando las píldoras+lupa pegadas a las redes en vez de "flotando" en el
   centro.

   BUG REAL VERIFICADO (Fase 4g, 2026-09-08): esta regla apuntaba a
   `.e-con-inner > .elementor-widget-shortcode`. Al pasar el header a
   `content_width: full`, `.e-con-inner` deja de existir y la regla dejó de
   aplicarse — el widget del menú volvió a su `flex: 0 1 auto` por defecto
   de Elementor (no crece), y un `flex_justify_content: space-between` que
   ya traía el contenedor (antes inerte, porque el flex-grow del menú se
   comía todo el espacio libre y no le dejaba nada que repartir) quedó
   expuesto: repartía el hueco entre los 7 hijos del header en vez de
   concentrarlo a la izquierda del menú. Efecto visible: 226px de hueco
   entre la lupa y las redes en vez de los ~40px del maestro visual.
   Corregido apuntando al DOM actual (hijo directo de `.lij-header-bar`,
   sin `.e-con-inner` de por medio); se conserva también el selector viejo
   por si el header alguna vez vuelve a modo "boxed". */
:is(header,div).elementor-location-header .lij-header-bar > .e-con-inner > .elementor-widget-shortcode,
:is(header,div).elementor-location-header .lij-header-bar > .elementor-widget-shortcode {
    flex: 1 1 0% !important;
    min-width: 0 !important;
}

/* BUG REAL VERIFICADO (Fase 4i, 2026-09-08): con el widget del menú ya
   creciendo correctamente (regla de arriba), Francisco reportó que las
   píldoras se veían pegadas a la IZQUIERDA en vez de a la derecha, junto al
   buscador — un defecto distinto al de la regla de arriba, no una
   regresión de ese fix.

   Causa: Elementor envuelve el shortcode en una capa intermedia,
   `.elementor-shortcode`, que trae `display: inline-block` por defecto —
   se ajusta al ancho de SU CONTENIDO (963px, lo que ocupan las píldoras) en
   vez de llenar los 1505px que su padre `.elementor-widget-container` (ese
   sí `display: block`, correctamente al 100%) le da. El `margin-left: auto`
   del primer <li> (sección 4) alinea las píldoras a la derecha DENTRO del
   `<ul>`, pero el `<ul>` mismo, siendo inline-block y ajustado a contenido,
   ya no se movía de la izquierda de esa caja ancha: no había hueco propio
   que repartir en ese nivel.

   Es la misma causa raíz que ya se corrigió para el buscador (sección 3,
   "las cuatro capas"), aplicada aquí al widget del menú por primera vez.
   Antes de la Fase 4g (header en modo "boxed") no se notaba porque el
   contenedor del menú casi nunca crecía más allá de lo que su contenido ya
   ocupaba — con el header a ancho completo, sí. */
:is(header,div).elementor-location-header .lij-header-bar > .elementor-widget-shortcode > .elementor-widget-container > .elementor-shortcode {
    display: block;
    width: 100%;
}

/* --- El buscador: el ancho vive aquí, en el CONTENEDOR ---------------------
   `!important` en el flex-basis: Elementor define `.e-con.e-flex{flex:var(
   --flex-grow) var(--flex-shrink) var(--flex-basis)}` con dos clases; nuestro
   selector (header + 3 clases) ya gana por especificidad, pero se deja
   `!important` como cinturón de seguridad porque este es el valor exacto del
   que depende que el menú no quede tapado ni el buscador aplastado, y ya se ha
   visto en esta misma fase que Elementor tiene más de un mecanismo de ancho
   compitiendo a la vez.

   Colapsado: 38px, el ancho exacto del botón de la lupa (sección 6.1) — el
   formulario entero es, en ese estado, solo el botón.
   Abierto: 383px, el ancho exacto del maestro visual (nodo Figma 154:519,
   "search active=yes"). Antes este valor fue 560px, tomado de otro
   breakpoint del propio tema; se vuelve al de Figma por decisión de
   Francisco al comparar contra el diseño real.

   Este contenedor también arrastra un `width:70%` real de Elementor (mismo
   origen que el 28% de `.opciones`, ver esa sección). El `width: auto` de
   aquí necesita su propio `!important` por la misma razón. */
:is(header,div).elementor-location-header .lij-header-bar .buscador {
    flex: 0 0 383px !important;
    width: auto !important;
    max-width: none;
    min-width: 0;
    /* BUG REAL encontrado 2026-09-23 en móvil (≤390px): este contenedor de
       Elementor trae su propio fondo `#F9F9F9` (gris claro por defecto,
       nunca pensado para verse — a escritorio/tablet queda siempre tapado
       por el fondo rojo/rojo-oscuro del propio formulario). En móvil, con
       `.lij-header-bar` en `flex-wrap: wrap` (sección 8), este contenedor
       se estira más alto que el botón de 38px y ese gris asoma alrededor,
       como un bloque blanco sobre el rojo del header. Se anula aquí, no en
       el formulario de dentro, porque el gris es del contenedor exterior. */
    background: transparent !important;
}

/* Las cuatro capas que Elementor y el shortcode intercalan entre el
   contenedor y el formulario (widget, .elementor-widget-container,
   .elementor-shortcode, .widget_product_search) solo tienen que llenar lo que
   el contenedor ya decidió: 100% de su ancho, sin ancho propio. */
:is(header,div).elementor-location-header .lij-header-bar .buscador > .elementor-widget-shortcode,
:is(header,div).elementor-location-header .lij-header-bar .buscador .elementor-widget-container,
:is(header,div).elementor-location-header .lij-header-bar .buscador .elementor-shortcode,
:is(header,div).elementor-location-header .lij-header-bar .buscador .widget_product_search {
    width: 100%;
    max-width: none;
    margin: 0;
}

/* `.widget_product_search` es el ancla de posición del panel de sugerencias
   (sección 6.3): es el `<div>` que en el shortcode envuelve tanto el
   `<form>` como el `.search-overlay`, el primer ancestro común de los dos. */
:is(header,div).elementor-location-header .lij-header-bar .buscador .widget_product_search {
    position: relative;
}

/* --- 2.1 BUG REAL VERIFICADO (2026-09-08, primera vez con render real vía
   Playwright en este entorno): el widget de Elementor que envuelve el
   shortcode (`elementor-element-133f47cb`) tiene, en el panel, la MISMA clase
   custom `buscador` que su contenedor padre (`elementor-element-7f11abbe`,
   sección 2). Las dos capas son descendientes de `.lij-header-bar`, así que
   la regla de arriba, `.lij-header-bar .buscador { flex: 0 0 383px
   !important; width: auto !important; }`, no distingue entre ellas y cae
   TAMBIÉN sobre el widget interno, con más fuerza que el `width: 100%` (sin
   !important) que le tocaba por el bloque de arriba.

   Consecuencia medida en el navegador: el widget interno queda fijo en
   383px SIEMPRE, porque el JS de colapso (sección 6.2) solo añade
   `.lij-search--collapsed` al contenedor exterior (es el primer `.buscador`
   en el DOM, es a él al que apunta `document.querySelector`), nunca a este
   widget. El contenedor exterior sí se encoge a 38px, pero su único hijo,
   congelado en 383px con `overflow: visible` en el contenedor, se sale de
   esa caja y queda centrado sobre el punto de 38px: el botón visible de la
   lupa terminaba renderizado ~172px a la derecha de donde debía, encima del
   icono de YouTube. Esto es la causa del defecto que Francisco reportó
   ("el buscador aparece a la derecha de las redes"), no reproducible antes
   solo leyendo DOM/CSS (ver FASE-4-HEADER.md §10.1 y NEXT_ACTIONS.md).

   Fix: el widget interno (identificable porque, a diferencia del
   contenedor, sí tiene la clase `elementor-widget-shortcode`) se fuerza
   siempre a llenar el 100% de lo que el contenedor le da, en vez de pedir
   su propio ancho. Así el colapso/apertura, que ya funciona en el
   contenedor, se refleja también en este nivel. No se toca el panel de
   Elementor (evita una escritura en BD): es un ajuste de CSS puro. */
:is(header,div).elementor-location-header .lij-header-bar .buscador.elementor-widget-shortcode {
    flex: 1 1 auto !important;
    width: 100% !important;
    max-width: none !important;
}

/* Las redes, separadas 40px del bloque de menú + lupa, igual al maestro
   visual (nodo Figma 105:185: "sections" con pr-32 + el gap-8 de "tabs"
   entre "sections" y "social" = 40). Aquí no hay ese anidado de "sections"
   dentro de "tabs": todo cuelga plano de la misma fila con `gap: 8px`
   (sección 2), así que el resto (32px) se suma aquí con `margin-left`.

   `!important`: este contenedor viene de una estructura de 3 columnas
   anterior (`structure:"30"` en el panel) y todavía carga un `width:28%`
   real desde Elementor (verificado en `post-62.css` recién regenerado, no
   es caché vieja). Sin `!important` aquí, ese 28% puede ganarle a nuestro
   `flex:0 0 auto` en algunos casos y encajonar las redes/el buscador de
   forma inesperada. */
:is(header,div).elementor-location-header .lij-header-bar .opciones {
    flex: 0 0 auto !important;
    width: auto !important;
    max-width: none;
    display: flex;
    align-items: center;
    gap: var(--lij-space-xxs);
    margin-left: var(--lij-space-l);
    padding: 0;
}


/* =============================================================================
   3. LOGO
   ============================================================================= */

/* RESUELTO 2026-09-23: el logo real del sitio (Personalizar > Identidad del
   sitio > Logo, `custom_logo`) ya apunta al adjunto correcto
   (`lij-header-logo-content.svg`, id 48550, subido en la Fase 4 y ya en la
   Biblioteca de Medios) — antes apuntaba a `grupo-sm-logo.svg` (marca
   corporativa genérica, no la "SM Libros" del maestro visual) y este archivo
   compensaba la diferencia con un hack de `content:` sobre el <img>. Causa
   real de que el logo correcto nunca se hubiera fijado en el Personalizador:
   el adjunto 48550 tenía `post_mime_type` vacío (en vez de `image/svg+xml`)
   y `_wp_attachment_metadata` incompleto — WordPress no podía resolverlo
   como imagen (`has_custom_logo()` devolvía `false`), así que el logo se
   parcheaba solo por CSS. Corregido `post_mime_type`/metadata del adjunto
   (mismo mecanismo que usa el plugin `svg-support` ya activo) y actualizado
   `custom_logo` al adjunto correcto — ver `docs/DECISIONS.md` 2026-09-23.
   Solo queda el tamaño real del logo dentro del header, ya no la sustitución
   de imagen: así un cambio futuro de logo desde el Personalizador/Elementor
   sí se refleja aquí, en vez de quedar oculto por este `content:`. */
:is(header,div).elementor-location-header .lij-header-bar .elementor-widget-theme-site-logo img {
    height: 56px;
    width: auto;
    max-width: none;
}

/* BUG REAL VERIFICADO (Fase 4i, 2026-09-08): el widget trae, desde antes del
   rediseño, un margen propio de `2em 1em 2em 0em` (`_margin` en el panel de
   Elementor — 32px arriba y abajo, pensado para un header mucho más alto que
   el actual). El `content:` de arriba cambia la imagen que se PINTA, pero no
   toca ese margen: 56px del logo + 32+32px de margen = 120px de alto para
   este widget. Con la fila a altura fija (84px, como estaba en modo "boxed")
   ese sobrante no se notaba, absorbido por el `overflow: visible` de la
   sección 1. Al pasar a `content_width: full` (Fase 4g) la fila dejó de
   tener una altura fija — pasa a medir lo que su hijo más alto pida — y esos
   120px del logo empujaron toda la fila a 148px. Se neutraliza el margen
   aquí, dentro del contexto del header, sin tocar el widget para el resto
   del sitio (si el logo se usa en otra plantilla). */
:is(header,div).elementor-location-header .lij-header-bar .elementor-widget-theme-site-logo .elementor-widget-container {
    margin: 0 !important;
}


/* =============================================================================
   4. NAVEGACIÓN — las píldoras
   ============================================================================= */

/* Marcado real de [menu_principal]:
     <ul id="bootscore-navbar" class="navbar-nav ms-auto megamenu">
       <li class="menu-item ... nav-item [dropdown]">
         <a class="nav-link [dropdown-toggle]">…</a>

   `flex-direction: row` es imprescindible: .navbar-nav de Bootstrap la fija en
   `column`, y sin declararla el menú sale en vertical.

   El desbordamiento con scroll está SIEMPRE activo, no solo en pantallas
   estrechas: es lo que deja sitio al buscador cuando se despliega. */
:is(header,div).elementor-location-header .lij-header-bar #bootscore-navbar {
    display: flex;
    flex-direction: row;
    flex-wrap: nowrap;
    align-items: center;
    gap: var(--lij-space-xxs);
    margin: 0;
    /* La píldora activa se dibuja algo más ancha que su pestaña, así que el
       área de scroll necesita holgura al principio o el borde izquierdo del
       blob se recorta al llegar al inicio. Es el `padding-left: 4px` del
       prototipo. */
    padding: 0 0 0 var(--lij-space-xxxs);
    list-style: none;
    min-width: 1px;
    overflow-x: auto;
    overflow-y: hidden;
    scrollbar-width: none;
    -webkit-overflow-scrolling: touch;
    text-align: left;
}

:is(header,div).elementor-location-header .lij-header-bar #bootscore-navbar::-webkit-scrollbar {
    display: none;
}

/* Alineado a la derecha mientras las píldoras caben. El margen automático
   colapsa cuando no caben, de modo que la fila ancla al inicio y se recorre
   con normalidad. `justify-content: flex-end` NO sirve aquí: empuja las
   primeras píldoras más allá del borde inicial, donde quedan recortadas y sin
   posibilidad de alcanzarlas con el scroll. Está documentado así en el propio
   prototipo (Menu.css, `.menu__nav-items > :first-child`). */
:is(header,div).elementor-location-header .lij-header-bar #bootscore-navbar > li.nav-item:first-child {
    margin-left: auto;
}

/* estilos.css:4530-4535 pone un separador gris y márgenes entre ítems, pensados
   para el menú sobre fondo claro. El diseño nuevo separa con las propias
   píldoras, así que se retiran. */
:is(header,div).elementor-location-header .lij-header-bar #bootscore-navbar > li.nav-item {
    position: relative;
    flex-shrink: 0;
    display: block;
    margin: 0;
    padding: 0;
    border-right: none;
    line-height: 1;
}

/* --- 4.1 La píldora orgánica ---------------------------------------------
   Mismo blob que .lij-pill del design system, aplicado al <a> del walker. No se
   usa la clase directamente porque el walker no permite añadir clases al enlace
   sin tocar PHP, y tocarlo por un motivo estético no está justificado.

   Medidas del prototipo: padding 8px, texto 20px peso 750.

   El color necesita !important porque estilos.css lo fija con !important dos
   veces, en las líneas 4503-4508 y 4514-4516:
       header .megamenu > li > a          { color: #000000 !important }
       header .megamenu > li > a.nav-link { color: #000000 !important }

   `opacity` necesita lo mismo por el mismo motivo, aunque sin !important en
   origen: estilos.css:4680 (dentro de `@media (min-width: 768px)`) trae
   `header .megamenu li > a:hover { opacity: .5; }`, pensado para el
   subrayado del menú original. Nada en este archivo tocaba `opacity` en el
   `<a>` (solo en su `::before`, sección 4.1 más abajo), así que esa regla
   vieja ganaba por ausencia de competencia, no por especificidad. BUG REAL
   VERIFICADO (2026-09-08, con render vía Playwright): la píldora entera
   —fondo del blob incluido— se atenuaba al 50% en hover, mezclándose con el
   rojo del header y leyéndose rosa/traslúcida en vez de blanca. No era el
   blob (confirmado probando también con `background-image` puro, igual que
   el prototipo: el mismo rosa aparecía) — era el propio `<a>`. */
:is(header,div).elementor-location-header .lij-header-bar #bootscore-navbar > li.nav-item > a.nav-link {
    position: relative;
    isolation: isolate;
    display: flex;
    align-items: center;
    justify-content: center;
    gap: var(--lij-space-xxxs);
    min-width: 0;
    padding: var(--lij-space-xxs);
    font-family: var(--lij-font-title);
    font-weight: var(--lij-weight-strong);
    font-size: 20px;
    line-height: 1.2;
    white-space: nowrap;
    text-decoration: none;
    background: none;
    /* estilos.css:4545-4551 pone un borde inferior de 2px como subrayado de
       estado. El diseño usa el blob para eso. */
    border: none;
    opacity: 1 !important;
    color: var(--lij-on-red) !important;
}

:is(header,div).elementor-location-header .lij-header-bar #bootscore-navbar > li.nav-item > a.nav-link::before {
    content: '';
    position: absolute;
    z-index: -1;
    /* Medidas exactas del maestro visual: el blob sobresale de la caja. */
    inset: 6.67% -0.31% 3.33% -2.59%;
    /* El blob se pinta como MASCARA con color de fondo solido, no como
       background-image. Asi el relleno es plano y opaco: usando la imagen
       directamente, los bordes suavizados del SVG dejaban ver el rojo del
       header y el blob se leia translucido. El color es el del maestro
       visual (#FFF9F5, el crema que hace de blanco en todo el diseno).

       La mascara es un DATA URI, no un archivo externo (../images/lij/...).
       Con un archivo externo, el navegador tiene que completar una peticion
       HTTP antes de poder pintar la mascara; hasta que esa peticion termina,
       el elemento se pinta como si no tuviera fondo (transparente). En una
       pildora tan pequena ese hueco es facil de percibir como "no tiene fondo
       blanco". El data URI no depende de ninguna peticion: esta disponible en
       el mismo instante en que el navegador procesa esta regla. */
    background-color: var(--lij-cream);
    /* BUG REAL VERIFICADO (2026-09-08, con render vía Playwright): a este SVG
       le faltaba `preserveAspectRatio='none'`. El archivo original
       (`nueva-web-lij-main/public/images/playful-blob-cream.svg`) SÍ lo
       declara; se perdió al copiar el `path` como data URI aquí. Sin ese
       atributo, un SVG con viewBox usa por defecto `xMidYMid meet`: en vez de
       estirarse de forma independiente en X e Y para llenar `mask-size: 100%
       100%`, se escala preservando su proporción (71.0219:27) y se CENTRA
       dentro de la caja. En una píldora ancha (p. ej. "El Barco de Vapor",
       ~218px) el resultado medido era una forma de ~95px, centrada, que
       tapaba el medio del texto y dejaba fuera el principio y el final —
       la píldora se leía además menos blanca porque, al cubrir tan poco, el
       rojo del header alrededor dominaba la lectura del conjunto. Con
       `preserveAspectRatio='none'` el SVG sí estira sin preservar
       proporción, igual que hace `background-size: 100% 100%` en el
       prototipo. Confirmado con captura antes/después. */
    mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' preserveAspectRatio='none' viewBox='0 0 71.0219 27'%3E%3Cpath d='M30.8484 1.84826C18.1898 0.532806 13.4023 -1.55306 6.14797 1.84826C-1.10637 5.24959 -4.32227 21.6493 10.1599 25.1695C17.628 26.9848 30.7075 27.1619 41.6251 26.9076C53.7896 26.6244 71.9616 23.6573 70.984 11.5288C69.942 -1.39954 48.329 2.99103 35.3819 2.2167C33.8988 2.12801 32.3813 2.00756 30.8484 1.84826Z' fill='%23fff'/%3E%3C/svg%3E");
    mask-size: 100% 100%;
    mask-repeat: no-repeat;
    mask-position: center;
    -webkit-mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' preserveAspectRatio='none' viewBox='0 0 71.0219 27'%3E%3Cpath d='M30.8484 1.84826C18.1898 0.532806 13.4023 -1.55306 6.14797 1.84826C-1.10637 5.24959 -4.32227 21.6493 10.1599 25.1695C17.628 26.9848 30.7075 27.1619 41.6251 26.9076C53.7896 26.6244 71.9616 23.6573 70.984 11.5288C69.942 -1.39954 48.329 2.99103 35.3819 2.2167C33.8988 2.12801 32.3813 2.00756 30.8484 1.84826Z' fill='%23fff'/%3E%3C/svg%3E");
    -webkit-mask-size: 100% 100%;
    -webkit-mask-repeat: no-repeat;
    -webkit-mask-position: center;
    /* `mask-mode` fuerza el modo alfa explícitamente. Sin esto, WebKit/Safari
       usa luminancia por defecto para `-webkit-mask-image` (Chrome usa alfa).
       El relleno del SVG es blanco puro a propósito: con luminancia máxima
       (blanco) el resultado es opaco en los dos modos por igual, así que esto
       es un cinturón de seguridad, no una corrección de un fallo confirmado. */
    mask-mode: alpha;
    opacity: 0;
    transition: opacity 120ms ease;
}

/* Respaldo para el navegador que no soporte `mask-image` en absoluto (ni con
   prefijo). Sin esto, ese navegador no vería NINGÚN fondo al pasar por encima
   o en el ítem activo: solo el texto cambiaría de color, sin la píldora
   detrás. Se sustituye la forma orgánica por una píldora simple de esquinas
   redondeadas, con el mismo color y las mismas reglas de aparición: sigue
   siendo un fondo sólido, nunca transparente, aunque pierda la forma exacta
   del blob. `@supports not` no se evalúa si el navegador no entiende ni
   siquiera la sintaxis de `@supports`, pero esos navegadores tampoco
   soportarían mask-image, así que el caso extremo ya está cubierto por el
   fallback natural de que la regla completa se ignore sin romper nada. */
@supports not ((mask-image: none) or (-webkit-mask-image: none)) {
    :is(header,div).elementor-location-header .lij-header-bar #bootscore-navbar > li.nav-item > a.nav-link::before {
        border-radius: var(--lij-radius-pill);
    }
}

/* Hover y activo son el mismo estado visual en el diseño. Se cubren las clases
   de estado de WordPress y la `active` que añade el walker Bootstrap. */
:is(header,div).elementor-location-header .lij-header-bar #bootscore-navbar > li.nav-item > a.nav-link:hover,
:is(header,div).elementor-location-header .lij-header-bar #bootscore-navbar > li.nav-item > a.nav-link:focus-visible,
:is(header,div).elementor-location-header .lij-header-bar #bootscore-navbar > li.nav-item.active > a.nav-link,
:is(header,div).elementor-location-header .lij-header-bar #bootscore-navbar > li.nav-item.show > a.nav-link,
:is(header,div).elementor-location-header .lij-header-bar #bootscore-navbar > li.nav-item.current-menu-item > a.nav-link,
:is(header,div).elementor-location-header .lij-header-bar #bootscore-navbar > li.nav-item.current-menu-ancestor > a.nav-link,
:is(header,div).elementor-location-header .lij-header-bar #bootscore-navbar > li.nav-item.current-menu-parent > a.nav-link,
:is(header,div).elementor-location-header .lij-header-bar #bootscore-navbar > li.nav-item.current_page_item > a.nav-link {
    color: var(--lij-on-cream) !important;
}

:is(header,div).elementor-location-header .lij-header-bar #bootscore-navbar > li.nav-item > a.nav-link:hover::before,
:is(header,div).elementor-location-header .lij-header-bar #bootscore-navbar > li.nav-item > a.nav-link:focus-visible::before,
:is(header,div).elementor-location-header .lij-header-bar #bootscore-navbar > li.nav-item.active > a.nav-link::before,
:is(header,div).elementor-location-header .lij-header-bar #bootscore-navbar > li.nav-item.show > a.nav-link::before,
:is(header,div).elementor-location-header .lij-header-bar #bootscore-navbar > li.nav-item.current-menu-item > a.nav-link::before,
:is(header,div).elementor-location-header .lij-header-bar #bootscore-navbar > li.nav-item.current-menu-ancestor > a.nav-link::before,
:is(header,div).elementor-location-header .lij-header-bar #bootscore-navbar > li.nav-item.current-menu-parent > a.nav-link::before,
:is(header,div).elementor-location-header .lij-header-bar #bootscore-navbar > li.nav-item.current_page_item > a.nav-link::before {
    opacity: 1;
}

/* La flecha de los ítems con hijos hereda el color del texto. */
:is(header,div).elementor-location-header .lij-header-bar #bootscore-navbar > li.nav-item > a.nav-link.dropdown-toggle::after {
    border-top-color: currentColor;
    margin-left: 2px;
}


/* =============================================================================
   5. MEGAMENÚ
   El prototipo no tiene desplegables: su navegación va directa a las páginas.
   El menú real sí los tiene, con varios niveles y disposición en columnas. Se
   le da el lenguaje del diseño conservando su estructura.
   ============================================================================= */

/* BUG REAL VERIFICADO (2026-09-09, con render vía Playwright): al abrir el
   megamenú, el panel se dibujaba encima de la propia fila del header (tapando
   logo, lupa y redes) y sangraba ~60px hacia el contenido de la página.

   Causa: `.dropdown-menu` es `position: absolute` (default de Bootstrap) y
   ningún CSS —ni aquí ni en estilos.css— le fija `top`. Sin `top` explícito,
   el navegador usa el algoritmo de "posición estática hipotética" (spec CSS),
   que aquí resuelve a mitad de la fila en vez de debajo: `.dropdown` (el
   `<li>`) trae `position: inherit !important` desde estilos.css:4560, así
   que no es su propio contexto de posicionamiento — el contexto real es
   `.lij-header-bar` (`position: relative`, sección 2), que mide exactamente
   84px de alto. El panel "caía" donde habría quedado en flujo normal justo
   tras la píldora (~40px, la altura de la propia píldora, centrada dentro de
   la fila), no tras el final de la fila.

   Fix: fijar `top` explícito a los 84px reales y verificados de la fila
   (Fase 4h/4i). No se toca `position` del `<li>` ni `left` del panel. Esta
   regla sigue vigente con el nuevo diseño de la sección 5.1 (la tarjeta
   roja también necesita el mismo `top` explícito — mismo bug, misma causa,
   sin importar el color/forma del panel).

   BUG REAL VERIFICADO Y CORREGIDO (2026-09-09, reportado por Francisco tras
   abrir "Juvenil"): la primera versión de este fix usaba `position: absolute
   !important`, que se cuela también en los `.dropdown-menu.sub-menu`
   anidados (el walker les pone la MISMA clase `dropdown-menu`, solo que con
   `sub-menu`/`depth_1` además — ver el selector `.depth_0 > li` más arriba,
   que ya asumía esa convención). La regla de abajo, más específica
   (`.dropdown-menu .sub-menu`, una clase más), pone `position: static` para
   esos anidados — pero SIN `!important`, porque nunca le había hecho falta.
   Un `!important` gana siempre sobre uno que no lo es, sin importar la
   especificidad: el sub-menú de "Juvenil y clásicos"/"Clásicos" quedaba
   forzado a `position: absolute; top: 84px; left: 0`, la MISMA esquina fija
   que el panel de nivel superior, en vez de colgar de su propio ítem — de
   ahí el elemento "Clásicos" flotando suelto y el resto de la página
   desplazada/atenuada debajo.

   Fix real: acotar el selector con `>` (hijo directo) para que solo alcance
   al `<ul>` de primer nivel — el anidado, varios niveles más abajo en el
   árbol, ya no puede matchear esta regla en absoluto, sin depender de que
   gane la pelea de especificidad. */
/* BUG REAL VERIFICADO (2026-09-09, sesión de revisión): esta regla y la de la
   sección 5.1 no llevaban `.show`, así que aplicaban a TODO `.dropdown-menu`
   del primer nivel sin importar si Bootstrap le había puesto la clase que
   activa la apertura — con `display: flex !important` de la 5.1 ganando
   siempre al `display: none` base de Bootstrap, las 6 tarjetas rojas del
   megamenú quedaban SIEMPRE en el DOM, superpuestas unas sobre otras justo
   debajo de la fila del header, sin que nadie hiciera clic en nada.
   Confirmado con Playwright: `hasShowClass: false` en las 6 y aun así
   `display: flex` con tamaño real. Fix: acotar con `.show`, la clase real
   que el walker de Bootstrap añade al `<ul>` al abrir ese ítem. */
/* BUG REAL VERIFICADO (2026-09-09, sesión de revisión — reportado por
   Francisco: "no respeta aparecer por debajo del título"): `estilos.css`
   trae, heredado del megamenú original, `header .megamenu > li >
   .dropdown-menu { transform: none !important; left: 0 !important; }`
   (tanto en escritorio como en móvil). Como aquí nunca se declaraba
   `transform`, esa regla ganaba sin competencia y anulaba el `transform:
   translate(...)` que Popper.js calcula para alinear el panel bajo CADA
   píldora — el panel quedaba siempre en el mismo punto fijo (~145px desde
   la izquierda, el borde del widget del menú), sin importar cuál píldora
   se abriera. No hay forma de neutralizar un `!important` ajeno sobre esa
   propiedad desde otra regla.

   Fix real (`js/lij-header.js`, `initMegaMenuStaticDisplay`): se apaga
   Popper con `data-bs-display="static"` en los enlaces del dropdown, así
   Bootstrap no calcula ningún `transform` y no hay nada que la regla vieja
   pueda anular.

   INTENTO DESCARTADO (misma sesión): la primera versión de este fix también
   devolvía `position: relative` al `<li>` (estilos.css:4560 se lo pone en
   `inherit !important`) para que el panel colgara directamente de su propia
   píldora. Funcionaba por `getComputedStyle`/`getBoundingClientRect` (rojo,
   592px, alineado bajo cada píldora, verificado uno por uno) pero las
   capturas de Playwright mostraban una franja gris (`rgb(249,249,249)`,
   el fondo real de `<body>`) tapando la fila de píldoras — sin que ninguna
   inspección de DOM/CSS explicara de dónde salía: ni transiciones (igual a
   los 100ms que a los 2100ms), ni Popper (igual con y sin él), ni ninguna
   propiedad exótica en el `<li>` (aislamiento, filtros, blend-mode, todo en
   su valor por defecto). Demasiado parecido a lo que Francisco reportó
   ("aparece de color blanco") para arriesgarse sin verlo en un navegador
   real primero — revertido. Queda documentado por si se retoma: el cambio
   exacto era `position: relative !important` en este `<li>` más
   `top/left` absolutos sobre él en vez de sobre `.lij-header-bar`.

   FIX ACTUAL: el panel se queda posicionado sobre `.lij-header-bar` (como
   ya estaba, sin tocar `position` del `<li>`, evitando el artefacto de
   arriba), y es `js/lij-header.js` (`initMegaMenuPosition`) quien mide en
   cada apertura dónde está la píldora real y escribe esa distancia en la
   variable `--lij-mm-left`. Un valor por JS en una custom property sí puede
   "colarse" bajo un `!important` externo (a diferencia de `transform` o de
   un `left` con valor fijo): la regla de abajo solo declara qué PROPIEDAD
   gana la cascada (`left: var(--lij-mm-left) ...`), el valor en sí lo pone
   el elemento mismo, así que no hay pelea de especificidad que perder.

   SEGUNDO INTENTO DESCARTADO (misma sesión): para que las píldoras cerca
   del borde derecho (p. ej. "Juvenil" a 1920px) no sacaran el panel de la
   ventana, la idea era anclarlo por la derecha con `right` (clase
   `.lij-mm--right`, mismo "shift" que hacía Popper). Posición correcta
   verificada, pero la MISMA franja gris sin explicación volvía a aparecer
   — ahora ni con `transition: none !important` ni esperando 3 segundos.
   Descartado también por seguridad. `js/lij-header.js` en su lugar ACOTA
   (clamp) el propio `left` para que nunca cruce el borde derecho, sin
   salir del mecanismo de `left` ya verificado sin artefactos. */
:is(header,div).elementor-location-header .lij-header-bar #bootscore-navbar > li.dropdown > .dropdown-menu.show {
    position: absolute;
    top: 84px !important;
    left: var(--lij-mm-left, 0px) !important;
}

/* =============================================================================
   5.1 DISEÑO REAL DE FIGMA (2026-09-09) — CSS sobre el shortcode existente
   -----------------------------------------------------------------------
   Decisión (ver `DECISIONS.md` 2026-09-09): se evaluó reemplazar
   `[menu_principal]` por el widget nativo **Mega Menu** de Elementor Pro
   (existe en esta instalación, `modules/mega-menu/`, v3.35.1) en vez de CSS.
   Se descartó — recomendación explícita, aprobada por Francisco — porque:
     1. Es una función **BETA** de Elementor (`release_status =>
        RELEASE_STATUS_BETA` en `mega-menu/module.php`), no un widget maduro.
     2. `[menu_principal]` se invoca DOS VECES (escritorio y off-canvas
        móvil) — reemplazarlo obliga a resolver también el comportamiento
        móvil, no es un cambio acotado.
     3. El widget no genera el panel solo del árbol de WordPress: cada una
        de las 7 píldoras habría que reconstruirla a mano con widgets
        reales de Elementor. Muchas horas, alto riesgo de error humano.
     4. Cambia el mecanismo de navegación de TODO el sitio — mayor radio de
        impacto que una capa de CSS sobre lo que ya funciona hoy.
   Queda documentado como alternativa posible a futuro en `NEXT_ACTIONS.md`
   si Francisco decide reconsiderarlo.

   PARA REVERTIR ESTE CAMBIO: borrar desde este comentario hasta el cierre
   de la sección 5.1 (antes de "6. BUSCADOR") y restaurar las 5 reglas
   genéricas de arriba (`.dropdown-menu` crema, `.dropdown-item` con
   `depth_0 > li` en negrita 18px, `.sub-menu .dropdown-item` cuerpo, hover
   rojo, `.sub-menu` estático) — quedan íntegras en el historial de git
   (`git show <commit-previo>:codigo/.../lij-header.css`) y en el respaldo
   de la Fase 4 original. El contenido de menú agregado en la BD (colecciones
   + categorías + divisor + "Ver todo" de "0-2 años", ver
   `docs/redesign/backups/db/2026-09-09/`) es independiente de este CSS y no
   hace falta revertirlo — sencillamente deja de mostrarse con este estilo.

   ESTRUCTURA REAL VERIFICADA (2026-09-09, vía consulta directa a la BD):
   de las 7 píldoras, 6 tienen hijos "planos" (un solo nivel, directo a un
   término de `colecciones`) — el mismo caso que "0-2 años". Una sola,
   "Juvenil" (post 22928), tiene un nivel adicional real: dos de sus hijos
   de primer nivel son GRUPOS con su propio `.sub-menu` en vez de enlaces
   directos — "Juvenil y clásicos" (post 22940, 5 hijos: Gran Angular,
   Memorias de Idhún, La caída de los reinos, Crónicas de la Torre, La
   Leyenda del Cíclope) y "Clásicos" (post 23011, 2 hijos: Clásicos,
   Clásicos en cómic) — ambos hermanos entre sí bajo "Juvenil", no uno
   anidado dentro del otro. El diseño de tarjeta circular de Figma asume
   ítems planos (una imagen + una etiqueta); un grupo con hijos no cabe ahí,
   así que se le da un tratamiento distinto: fila de texto ancha, sin
   círculo, y su `.sub-menu` se mantiene como lista simple (ya la tenía).
   Se distingue con `:has(> .sub-menu)` — sin tocar el walker de PHP ni el
   HTML, es una diferencia real y estable del propio marcado. */

/* El panel: tarjeta compacta de 592px, roja, esquinas de 32px — CSS
   exportado directamente desde el nodo del megamenú abierto en Figma
   (pasado por Francisco 2026-09-09). Sustituye el panel crema de ancho
   completo que tenía antes. El `<ul class="dropdown-menu">` hace de
   contenedor Y de fila con flex-wrap a la vez: en Figma son dos "Frame"
   (colecciones / categorías) dentro de una tarjeta exterior, pero el menú
   real de WordPress solo tiene un nivel de `<li>` (sin sub-menú, para las
   6 píldoras planas), así que se aplana en un único flex-wrap. */
/* IMPORTANTE — acotado con `> li.dropdown >` a propósito, igual que el fix
   de posición de arriba: el walker le pone la MISMA clase `dropdown-menu` a
   los `.sub-menu` anidados (solo que además con `sub-menu`/`depth_1`), así
   que un selector sin acotar aplicaría esta tarjeta roja de 592px también
   al panel anidado de "Juvenil y clásicos"/"Clásicos" — BUG REAL que
   Francisco reportó el 2026-09-09 (el sub-menú se veía como una tarjeta
   roja flotante independiente, desconectada de su propio ítem). */
/* BUG REAL VERIFICADO (2026-09-09, sesión de revisión): sin `.show` esta
   regla forzaba `display: flex !important` (le gana al `display: none` base
   de Bootstrap) en las 6 tarjetas SIEMPRE, no solo en la que el usuario abre
   — las 6 quedaban visibles y apiladas en el mismo `top:84px;left:0`,
   pisándose entre sí, sin que nadie interactuara con el menú. Ver el mismo
   fix en la regla de posición, más arriba. */
:is(header,div).elementor-location-header .lij-header-bar #bootscore-navbar > li.dropdown > .dropdown-menu.show {
    display: flex !important;
    flex-direction: row;
    flex-wrap: wrap;
    align-items: flex-start;
    align-content: flex-start;
    width: 592px !important;
    max-width: calc(100vw - var(--lij-space-l) * 2);
    border: none;
    border-radius: 32px !important;
    padding: var(--lij-space-s) !important;
    gap: var(--lij-space-xxs);
    background-color: var(--lij-red) !important;
    box-shadow: var(--lij-shadow-panel);
    /* estilos.css:4557 fija margin-top con !important. */
    margin-top: 0 !important;
}

/* "item list rounded" del diseño: 124×124, círculo crema de 64px con la
   imagen/ícono de 56px centrado (pintado con `::before`, ver más abajo),
   etiqueta debajo. Es el caso por defecto — items sin hijos propios.
   Acotado a los hijos DIRECTOS del panel de primer nivel (mismo motivo que
   arriba): un item dentro de un `.sub-menu` anidado no debe volverse una
   tarjeta circular, sigue siendo texto de lista simple (ver más abajo). */
/* BUG REAL VERIFICADO (2026-09-09, reportado por Francisco al abrir
   "Juvenil"): el walker le pone a cada `<li>` de este nivel una clase de
   columna heredada del megamenú viejo (`megamenu-col-5`, entre otras
   variantes según cuántos hijos tenga el grupo — confirmado con el HTML
   real generado por PHP: `class="... dropdown-menu dropdown-menu-end
   dropdown megamenu-col-5"` en el propio `<li>`, no en el `<a>`).
   `estilos.css:2772` fija esa clase con `flex: 0 0 20% !important; max-
   width: 20% !important`, así que cada `<li>` quedaba forzado a 20% del
   ancho del panel sin importar lo que dijera aquí — de ahí el panel
   viéndose en columnas de 2-3 ítems en vez de tarjetas de 124px en fila. Se
   neutraliza para TODO `<li>` de este nivel (el ancho real lo decide el
   `.dropdown-item` de dentro, 124px, o el 100% de la excepción de abajo).

   SEGUNDO BUG, mismo hallazgo: `estilos.css:4620` también le pone
   `background-color: #F9F9F9` (opaco, sin !important) a todo `<li>` hijo
   directo del panel — pensado para el fondo crema del diseño viejo. Con el
   panel ahora rojo, ese gris opaco tapaba el rojo detrás de cada `<li>`
   (más notorio en las filas anchas de "Colecciones"/"Clásicos", que ocupan
   el 100% del ancho: casi todo el texto quedaba blanco sobre gris casi
   blanco, ilegible — el "panel en blanco" que reportó Francisco). Se anula
   junto con lo anterior.

   TERCER BUG, encontrado en la sesión de revisión (2026-09-09): el `<ul>`
   real trae, además de `dropdown-menu`, las clases de grid de Bootstrap
   `row g-4` (confirmado en el HTML servido). `.row > *` de `bootstrap.css`
   fija `width: 100%` a TODO hijo directo, sin `.col-*` de por medio y sin
   `!important` — no competía con nada hasta ahora porque nunca se había
   tocado el `width` del `<li>` aquí, solo `flex`/`max-width`. Con
   `flex-basis: auto`, el motor toma ese `width: 100%` como base: cada
   `<li>` ocupaba el ancho completo del panel (560px, el interior de los
   592px menos el padding) y las tarjetas de 124px quedaban apiladas en una
   sola columna en vez de en fila — de ahí el panel de "0-2 años" midiendo
   ~2000px de alto en vez de los ~500px esperados. */
:is(header,div).elementor-location-header .lij-header-bar #bootscore-navbar > li.dropdown > .dropdown-menu > li {
    flex: 0 0 auto !important;
    max-width: none !important;
    width: auto !important;
    background-color: transparent !important;
}

:is(header,div).elementor-location-header .lij-header-bar #bootscore-navbar > li.dropdown > .dropdown-menu > li > .dropdown-item {
    display: flex;
    flex-direction: column;
    align-items: center;
    justify-content: flex-start;
    width: 124px;
    min-height: 124px;
    padding: var(--lij-space-xxxs);
    gap: var(--lij-space-xxs);
    border-radius: var(--lij-radius-s);
    font-family: var(--lij-font-title);
    font-weight: var(--lij-weight-body);
    font-size: 16px;
    line-height: 1.4;
    text-align: center;
    color: var(--lij-on-red);
    white-space: normal;
    background: none;
}

:is(header,div).elementor-location-header .lij-header-bar #bootscore-navbar > li.dropdown > .dropdown-menu > li > .dropdown-item::before {
    content: '';
    width: 64px;
    height: 64px;
    flex: none;
    border-radius: var(--lij-radius-pill);
    background-color: var(--lij-cream);
    background-repeat: no-repeat;
    background-position: center;
    background-size: 56px 56px;
}

/* Excepción: ítems de primer nivel que SÍ tienen hijos propios (grupo, no
   hoja) — hoy solo "Juvenil y clásicos" y "Clásicos" dentro de la píldora
   "Juvenil". No caben en la tarjeta circular (llevan una lista debajo), así
   que vuelven al tratamiento de fila ancha que tenía el diseño anterior,
   adaptado a fondo rojo (antes asumía fondo crema). */
:is(header,div).elementor-location-header .lij-header-bar #bootscore-navbar > li.dropdown > .dropdown-menu > li:has(> .sub-menu) > .dropdown-item {
    display: block;
    width: 100%;
    min-height: 0;
    font-weight: var(--lij-weight-strong);
    font-size: 18px;
}
:is(header,div).elementor-location-header .lij-header-bar #bootscore-navbar > li.dropdown > .dropdown-menu > li:has(> .sub-menu) > .dropdown-item::before {
    content: none;
}
:is(header,div).elementor-location-header .lij-header-bar #bootscore-navbar > li.dropdown > .dropdown-menu > li:has(> .sub-menu) {
    /* !important necesario: la neutralización de `.megamenu-col-5` de
       arriba ya usa `flex: ... !important` (para ganarle a estilos.css), y
       un !important le gana a cualquier otro por más específico que sea. */
    flex: 1 1 100% !important;
    max-width: 100% !important;
    width: 100%;
}

/* Ítems DENTRO de un `.sub-menu` anidado (p. ej. "Gran Angular", "Clásicos
   en cómic"): se anula por completo el tratamiento de tarjeta circular de
   arriba —si no, heredarían el círculo vacío y el tamaño fijo de 124px
   solo por compartir la clase `.dropdown-item`— y vuelven a ser texto de
   lista simple, como ya eran antes de este cambio. */
:is(header,div).elementor-location-header .lij-header-bar #bootscore-navbar .sub-menu .dropdown-item {
    display: block;
    width: 100%;
    min-height: 0;
    padding: var(--lij-space-xxs);
    font-weight: var(--lij-weight-body);
    font-size: 16px;
    color: var(--lij-on-red);
}
:is(header,div).elementor-location-header .lij-header-bar #bootscore-navbar .sub-menu .dropdown-item::before {
    content: none;
}

:is(header,div).elementor-location-header .lij-header-bar #bootscore-navbar .dropdown-item:hover,
:is(header,div).elementor-location-header .lij-header-bar #bootscore-navbar .dropdown-item:focus {
    background-color: rgba(255, 249, 245, 0.15);
    color: var(--lij-on-red);
}

:is(header,div).elementor-location-header .lij-header-bar #bootscore-navbar .dropdown-menu .sub-menu {
    position: static;
    display: block;
    float: none;
    border: none;
    box-shadow: none;
    background: none;
    padding: 0 0 0 var(--lij-space-xxs);
    margin: 0;
    flex-basis: 100%;
    width: 100%;
}

/* Avatares de colección (fotos reales, ya en Medios desde la Fase 6 — mismas
   que el carrusel "Nuestras colecciones destacadas" de la home, reutilizadas
   sin volver a subir) e íconos de categoría (SVG reales de la Fase 3, nunca
   usados hasta ahora en `themes/smb2b/images/lij/cat-*.svg` — quedan
   referenciados desde el tema en vez de Medios porque aún faltan 3 de los 7
   términos/íconos por confirmar; se migran todos juntos cuando el set esté
   completo). Uno por ítem conocido — clase `mm-col-*`/`mm-cat-*` puesta en
   el ítem de menú al agregarlo en la BD (Fase 4, 2026-09-09), para no tocar
   el walker de PHP. Hoy solo existen para "0-2 años"; las otras 6 píldoras
   muestran el círculo crema vacío hasta que se les agregue su propio
   contenido con el mismo mecanismo. */
:is(header,div).elementor-location-header .lij-header-bar #bootscore-navbar li.mm-col-anton > .dropdown-item::before {
    background-image: url('/wp-content/uploads/2026/09/col-anton.png');
}
:is(header,div).elementor-location-header .lij-header-bar #bootscore-navbar li.mm-col-pollo > .dropdown-item::before {
    background-image: url('/wp-content/uploads/2026/09/col-pollo-pepe.png');
}
:is(header,div).elementor-location-header .lij-header-bar #bootscore-navbar li.mm-col-pepo > .dropdown-item::before {
    background-image: url('/wp-content/uploads/2026/09/col-pepo.png');
}
:is(header,div).elementor-location-header .lij-header-bar #bootscore-navbar li.mm-col-letras > .dropdown-item::before {
    background-image: url('/wp-content/uploads/2026/09/col-pais-letras.png');
}
:is(header,div).elementor-location-header .lij-header-bar #bootscore-navbar li.mm-col-raton > .dropdown-item::before {
    background-image: url('/wp-content/uploads/2026/09/col-raton-fisgon.png');
}
:is(header,div).elementor-location-header .lij-header-bar #bootscore-navbar li.mm-col-lulu > .dropdown-item::before {
    background-image: url('/wp-content/uploads/2026/09/col-lulu.png');
}
/* mm-col-mila (Pepe y Mila): PENDIENTE — el diseño la pide, pero no existe
   ningún archivo de esta portada en el proyecto (ni en Medios ni en
   nueva-web-lij-main/public/images). Círculo crema vacío hasta que exista
   el asset; no se inventa una imagen. */
:is(header,div).elementor-location-header .lij-header-bar #bootscore-navbar li.mm-cat-habitos > .dropdown-item::before {
    background-image: url('../images/lij/cat-primeros-habitos.svg');
}
:is(header,div).elementor-location-header .lij-header-bar #bootscore-navbar li.mm-cat-aprende > .dropdown-item::before {
    background-image: url('../images/lij/cat-primeros-aprendizajes.svg');
}
:is(header,div).elementor-location-header .lij-header-bar #bootscore-navbar li.mm-cat-bano > .dropdown-item::before {
    background-image: url('../images/lij/cat-libros-bano.svg');
}
:is(header,div).elementor-location-header .lij-header-bar #bootscore-navbar li.mm-cat-tela > .dropdown-item::before {
    background-image: url('../images/lij/cat-libros-tela.svg');
}

/* Divisor entre colecciones y categorías: "Rectangle 2" del diseño (1px,
   crema, ancho completo). No hay forma limpia de dibujar una línea de ancho
   completo con CSS puro dentro de un flex-wrap de tarjetas de 124px —un
   `::before` no es un hermano flex real, así que no puede forzar el salto
   de fila—, así que es un ítem de menú dedicado (`mm-divider`, tipo
   "custom", href "#" neutralizado con `pointer-events:none`), igual que el
   propio Figma lo modela como un elemento más de la fila. Hoy solo existe
   para "0-2 años"; no aparece en las demás píldoras hasta que tengan su
   propio contenido de dos filas. */
:is(header,div).elementor-location-header .lij-header-bar #bootscore-navbar li.mm-divider {
    /* !important: el walker también le pone `megamenu-col-5` a este <li>
       (confirmado con el HTML real generado), que trae `flex: 0 0 20%
       !important` desde estilos.css — sin esto se vería como una columna
       más en vez de partir la fila. */
    flex: 1 1 100% !important;
    max-width: 100% !important;
    width: 100%;
    height: 1px;
    padding: 0;
    pointer-events: none;
}
:is(header,div).elementor-location-header .lij-header-bar #bootscore-navbar li.mm-divider > .dropdown-item {
    display: block;
    width: 100%;
    height: 1px;
    min-height: 0;
    padding: 0;
    background-color: var(--lij-cream);
}
:is(header,div).elementor-location-header .lij-header-bar #bootscore-navbar li.mm-divider > .dropdown-item::before {
    content: none;
}

/* "Ver todo →": mismo ítem de menú que ya visita la propia píldora (el
   término de su categoría), reutilizado al final del panel con tratamiento
   de botón en vez de tarjeta circular. Hoy solo existe para "0-2 años". */
:is(header,div).elementor-location-header .lij-header-bar #bootscore-navbar li.ver-todo {
    /* !important: mismo motivo que `.mm-divider` arriba — el walker también
       le pone `megamenu-col-5` a este <li>. */
    flex: 1 1 100% !important;
    max-width: 100% !important;
    width: 100%;
}
:is(header,div).elementor-location-header .lij-header-bar #bootscore-navbar li.ver-todo > .dropdown-item {
    display: inline-flex;
    flex-direction: row;
    width: auto;
    min-height: 0;
    padding: var(--lij-space-xxs);
    gap: var(--lij-space-xxxs);
    font-weight: var(--lij-weight-strong);
}
:is(header,div).elementor-location-header .lij-header-bar #bootscore-navbar li.ver-todo > .dropdown-item::before {
    content: '→';
    width: auto;
    height: auto;
    background: none;
    border-radius: 0;
    order: 2;
}
/* Fin de la sección 5.1 — ver nota de reversión arriba. */


/* =============================================================================
   6. BUSCADOR
   -----------------------------------------------------------------------------
   Marcado real: form.woocommerce-product-search > input.search-field +
   button[type=submit] + input[type=hidden][name=post_type][value=product].
   La lupa es el botón de envío, así que está al final del formulario: a la
   DERECHA. Por eso, al desplegarse, el campo crece hacia la izquierda desde la
   lupa, que se queda quieta. Es el comportamiento del maestro visual.

   EL ANCHO YA NO VIVE AQUÍ: vive en el CONTENEDOR `.buscador` (sección 2,
   vía `flex-basis`). Este formulario solo tiene que llenar el 100% de lo que
   el contenedor le da; no declara su propio ancho fijo. Antes se intentó al
   revés —`min-width` en este `<form>`, cuatro capas más abajo del contenedor—
   y MEDIDO en el navegador no llegaba al valor pedido (383px solicitados,
   261px reales): cada capa intermedia (widget, .elementor-widget-container,
   .elementor-shortcode, .widget_product_search) puede recortar el valor antes
   de que suba hasta el contenedor. Fijar el ancho arriba, en el contenedor, y
   dejar que este formulario solo se estire a `100%` es más corto y no depende
   de esa cadena. Pruebas de las once estrategias consideradas en
   `wp-content/uploads/lij-referencia/prueba-ancho.html`.

   Medidas: 38px de botón con icono de 24, igual al maestro visual (nodo
   Figma 105:185 / 154:519). Hubo una versión con la lupa a 44/28 por pedido
   puntual de Francisco; se volvió a las medidas de Figma al comparar contra
   el diseño real.

   REGLAS DEL TEMA QUE HAY QUE GANAR (verificadas en estilos.css):
     464-475   padding: 0 1rem !important; min-width: fit-content !important;
               height: 44px; border-radius: 7px    <- deformaba el botón
     831-843   button:before con search.png de 18px, float left  <- otra lupa
     849       margin-left: -1rem; min-width: fit-content
     3200      font-size: .9rem !important  (móvil)  <- reaparecía "Buscar"
     3203-3211 max-width: fit-content; width: 32%; position: absolute (móvil)
     4700      width: 360px; fondo #f3f6fa; borde #dde4ec  <- campo en claro
     4706      margin-left: -1rem !important
     5564/5853 width: 480px / 560px
   ============================================================================= */

:is(header,div).elementor-location-header .lij-header-bar .buscador form.woocommerce-product-search {
    display: flex;
    align-items: center;
    gap: 0;
    width: 100%;
    min-width: 0;
    max-width: none;
    height: 40px;
    margin: 0;
    padding: 1px 1px 1px var(--lij-space-s);     /* v3 .menu__search: 16px hasta el texto */
    border: none;
    /* RESUELTO 2026-09-23: era var(--lij-radius-s) (8px, esquinas apenas
       redondeadas) — el maestro visual (.menu__search en Menu.css) usa
       radio completo (1000px, píldora perfecta) en los dos estados. */
    border-radius: var(--lij-radius-pill);
    background-color: var(--lij-red-hover);
    /* La animación va en el contenedor (flex-basis, sección 2). Aquí solo se
       suaviza el fondo, para que el rojo no aparezca de golpe al abrir. */
    transition: background-color 160ms ease;
}

/* El campo. Se declara con y sin `.woocommerce` porque el tema usa las dos
   formas y hay que ganarles las dos (estilos.css:4700, 5564, 5853). */
:is(header,div).elementor-location-header .lij-header-bar .buscador .woocommerce form.woocommerce-product-search input.search-field,
:is(header,div).elementor-location-header .lij-header-bar .buscador form.woocommerce-product-search input.search-field {
    flex: 1 1 auto;
    min-width: 1px;
    width: auto;
    height: 38px;
    margin: 0;
    padding: var(--lij-space-xxs) var(--lij-space-xxxs);
    border: none;
    border-radius: 0;
    background: transparent;
    background-color: transparent;
    outline: none;
    box-shadow: none;
    font-family: var(--lij-font-title);
    font-weight: var(--lij-weight-body);
    font-size: 16px;
    line-height: 1.4;
    color: var(--lij-on-red);
    transition: opacity 140ms ease;
}

:is(header,div).elementor-location-header .lij-header-bar .buscador form.woocommerce-product-search input.search-field::placeholder {
    color: var(--lij-on-red);
    opacity: 1;
}

:is(header,div).elementor-location-header .lij-header-bar .buscador form.woocommerce-product-search input.search-field:focus::placeholder {
    opacity: 0.65;
}

/* --- 6.1 El botón de la lupa --------------------------------------------
   38 × 38 con el icono a 24, igual al maestro visual. Los !important
   responden uno a uno a estilos.css:464-475 y :3200: sin ellos el botón sale
   con 1rem de padding, ancho por contenido y, en móvil, con el texto
   "Buscar" visible.

   El texto no se elimina: se reduce a cero y se desplaza, así sigue estando
   para un lector de pantalla. */
:is(header,div).elementor-location-header .lij-header-bar .buscador form.woocommerce-product-search .search-field + button,
:is(header,div).elementor-location-header .lij-header-bar .buscador form.woocommerce-product-search button[type='submit'],
:is(header,div).elementor-location-header .lij-header-bar .buscador form.woocommerce-product-search button {
    position: relative;
    flex: 0 0 auto;
    display: block;
    width: 38px;
    height: 38px;
    min-width: 38px !important;
    max-width: 38px;
    margin: 0 !important;
    padding: 0 !important;
    border: none;
    /* RESUELTO 2026-09-23: era var(--lij-radius-s) (8px) — el maestro visual
       (.menu__search-toggle / .menu__search-submit en Menu.css) dibuja este
       botón como círculo perfecto (1000px), igual en colapsado y expandido. */
    border-radius: var(--lij-radius-pill);
    background-color: var(--lij-red);
    color: transparent;
    font-size: 0 !important;
    line-height: 0;
    text-indent: -9999px;
    overflow: hidden;
    cursor: pointer;
    transition: none;
}

/* El tema ya pinta su propia lupa en `button:before` con un PNG de 18px
   (estilos.css:831-843). Se anula, y la del diseño se dibuja en `::after`,
   que el tema no usa: así las dos no compiten por el mismo pseudo-elemento. */
:is(header,div).elementor-location-header .lij-header-bar .buscador form.woocommerce-product-search button::before {
    content: none;
    display: none;
}

:is(header,div).elementor-location-header .lij-header-bar .buscador form.woocommerce-product-search button::after {
    content: '';
    position: absolute;
    top: 50%;
    left: 50%;
    transform: translate(-50%, -50%);
    width: 24px;
    height: 24px;
    background-color: var(--lij-on-red);
    mask-image: url('/wp-content/uploads/2026/09/header/lij-header-icon-search.svg');
    mask-size: contain;
    mask-repeat: no-repeat;
    mask-position: center;
    -webkit-mask-image: url('/wp-content/uploads/2026/09/header/lij-header-icon-search.svg');
    -webkit-mask-size: contain;
    -webkit-mask-repeat: no-repeat;
    -webkit-mask-position: center;
    transition: none;
}

/* BUG REAL corregido 2026-09-23 (reportado por Francisco con captura): el
   rollover era crema con la lupa en rojo — no coincidía con v2. Verificado
   contra la fuente real (`Menu.css` `.menu__search-toggle:hover{background:
   var(--surface-interactive-primary-hover)}`, `tokens.css`
   `--surface-interactive-primary-hover:#bd0f20`, y el propio SVG del ícono,
   `icon-search.svg`, con `fill="white"` fijo en el archivo): en v2 el
   ícono SIEMPRE es blanco (nunca cambia de color) y lo único que reacciona
   al hover es el fondo del botón, que oscurece de rojo a `#BD0F20` — el
   mismo valor que ya existe en este tema como `--lij-red-hover` (Design
   System, usado en otros 5 rollovers del header).

   Historia — por qué estaba en crema: fue una decisión explícita de
   Francisco (Fase 4k, 2026-09-08, dejada documentada más abajo con el
   detalle técnico del bug de "salto" que se corrigió en el camino),
   apartándose a propósito de v2 ("el crema lo pidió Francisco"). Hoy pide
   lo contrario — este cambio revierte esa decisión anterior para volver a
   coincidir con v2.

   Acotado a `.lij-search--collapsed` (2026-09-23, mismo día, pedido
   aparte de Francisco): el botón se reutiliza tal cual cuando el buscador
   está abierto (mismo `<button>`, ahora como "enviar" al final del campo
   ancho, sección 6.2 más abajo) — en v2 eso es un componente aparte
   (`.menu__search-submit`, `MenuSearch.tsx`) sin ningún `:hover` propio.
   Sin acotar aquí, el rollover se colaba también en el botón de enviar del
   buscador ya desplegado, que no debe tenerlo. `.lij-search--collapsed` la
   pone el propio PHP en el HTML inicial (sección 6.2) y la alterna
   `lij-header.js` — mismo criterio que ya usa el resto de este archivo
   para distinguir los dos estados. */
:is(header,div).elementor-location-header .lij-header-bar .buscador.lij-search--collapsed form.woocommerce-product-search button:hover,
:is(header,div).elementor-location-header .lij-header-bar .buscador.lij-search--collapsed form.woocommerce-product-search button:focus-visible {
    background-color: var(--lij-red-hover);
}

/* BUG REAL VERIFICADO (Fase 4k, 2026-09-08): este rollover llevaba
   `transition: background-color 140ms ease` en el botón y en el ícono (dos
   reglas más arriba). Francisco reportó "un salto/movimiento" en el ícono
   al hacer clic. Aislado con Playwright probando cada transición por
   separado: quitar la del ancho del contenedor (`flex-basis`) no cambiaba
   nada; quitar SOLO la del color eliminó el salto. El ícono nunca se mueve
   de posición (confirmado en píxeles, siempre quieto) — lo que pasaba
   antes es que, mientras el botón transicionaba de rojo a crema y el
   ícono de blanco a rojo AL MISMO TIEMPO, había un instante de bajo
   contraste entre ambos colores que el ojo leía como un salto. Con el
   fix de arriba (ícono siempre blanco, ya no cambia de color) esa causa
   concreta ya no puede repetirse, pero el `transition: none` explícito de
   la sección anterior (botón/ícono) se deja igual, por las dudas: hay una
   `transition: all .3s` genérica que existe en todo el sitio (se confirmó
   midiendo elementos sin relación ninguna, hasta `<body>` la trae) que
   ganaría por especificidad si se quitara. */

/* --- 6.2 Estado colapsado y abierto (lo activa el JS) --------------------
   El ancho de los dos estados se fija en el CONTENEDOR (`.buscador`, sección
   2), con `flex-basis`, no aquí en el formulario. Aquí solo se ajusta lo que
   pasa DENTRO del formulario en cada estado: el fondo y el campo de texto.

   Colapsado el formulario se reduce al botón: solo se ve la lupa sobre el rojo
   del header, porque el fondo del formulario desaparece. El campo no se oculta
   con display:none para que el formulario siga siendo enviable y para que la
   animación de ancho (en el contenedor) tenga algo que recorrer visualmente.

   Estado por defecto (sin JavaScript): campo visible, con el ancho amplio de
   la sección 2 (383px). El script es lo único que añade el colapso, así que
   si no carga, el buscador queda ancho y usable, nunca oculto. */
:is(header,div).elementor-location-header .lij-header-bar .buscador.lij-search--collapsed {
    flex-basis: 38px !important;
    transition: flex-basis 220ms ease;
}

:is(header,div).elementor-location-header .lij-header-bar .buscador.lij-search--open {
    flex-basis: 383px !important;
    transition: flex-basis 220ms ease;
}

:is(header,div).elementor-location-header .lij-header-bar .buscador.lij-search--collapsed form.woocommerce-product-search {
    padding: 1px;
    background-color: transparent;
}

:is(header,div).elementor-location-header .lij-header-bar .buscador.lij-search--collapsed form.woocommerce-product-search input.search-field {
    width: 0;
    min-width: 0;
    flex: 0 0 0;
    padding: 0;
    opacity: 0;
    pointer-events: none;
}

/* --- 6.3 Panel de sugerencias (búsquedas recientes + autocompletado) ------
   Fase 4m (2026-09-12). Marcado nuevo en `smb2b_buscador_wc()`
   (functions-shortcode.php), lo muestra/rellena `js/lij-header.js`. Nace
   con `hidden` — si el script no carga, el buscador clásico de siempre
   sigue funcionando exactamente igual, solo sin este panel.

   Clases y medidas calcadas de la referencia (`wp-content/uploads/
   lij-referencia/css/overlay.css`, nodo Figma del "search-overlay"): mismo
   ancho (383px), mismo radio (16px, ya reservado como `--lij-radius-m`
   desde la Fase 3), misma sombra (`--lij-shadow-panel`, también reservada
   desde la Fase 3 — este panel ya estaba previsto). Los tokens de color de
   la referencia (`--surface-interactive-primary-enabled`, etc.) mapean 1:1
   a los ya definidos aquí (ver `lij-design-system.css` §2): son el mismo
   rojo/rojo-hover/crema/blanco de siempre, no colores nuevos.

   Posicionado sobre `.widget_product_search` (ancla declarada arriba, en
   la sección 2) en vez de sobre `.buscador`: es el primer ancestro común
   real del `<form>` y este panel en el HTML que genera el shortcode. */
:is(header,div).elementor-location-header .lij-header-bar .buscador .search-overlay {
    position: absolute;
    top: 43px;
    left: 50%;
    transform: translateX(-50%);
    width: 383px;
    max-height: 300px;
    display: flex;
    flex-direction: column;
    align-items: flex-start;
    padding-bottom: var(--lij-space-s);
    border-radius: var(--lij-radius-m);
    background: var(--lij-red);
    box-shadow: var(--lij-shadow-panel);
    overflow: hidden;
    z-index: 20;
}

:is(header,div).elementor-location-header .lij-header-bar .buscador .search-overlay[hidden] {
    display: none;
}

:is(:is(header,div).elementor-location-header .lij-header-bar .buscador, .lij-mobile-menu-search) .search-overlay__header {
    width: 100%;
    padding: var(--lij-space-s);
    border-bottom: 0.5px solid var(--lij-cream);
    font-family: var(--lij-font-title);
    font-weight: var(--lij-weight-strong);
    font-size: 16px;
    line-height: 1.4;
    color: var(--lij-on-red);
    text-align: left;
}

:is(:is(header,div).elementor-location-header .lij-header-bar .buscador, .lij-mobile-menu-search) .search-overlay__header:empty {
    display: none;
}

:is(:is(header,div).elementor-location-header .lij-header-bar .buscador, .lij-mobile-menu-search) .search-overlay__list {
    display: flex;
    flex-direction: column;
    width: 100%;
    overflow-x: hidden;
    overflow-y: auto;
    scrollbar-width: thin;
    scrollbar-color: var(--lij-cream) transparent;
}

/* Con 6 resultados reales esta lista sí desborda su `max-height` de 300px
   (heredado de `.search-overlay`) — el scroll vertical aquí es correcto y
   esperado (no un bug, a diferencia del horizontal de arriba, que sí lo
   era). Se le da un estilo fino a tono con el panel en vez de dejar la
   barra ancha gris nativa del navegador, que desentonaba (reportado por
   Francisco). Solo WebKit/Blink necesita las reglas `::-webkit-scrollbar-*`;
   Firefox ya queda cubierto por `scrollbar-width`/`scrollbar-color` arriba. */
:is(:is(header,div).elementor-location-header .lij-header-bar .buscador, .lij-mobile-menu-search) .search-overlay__list::-webkit-scrollbar {
    width: 6px;
}

:is(:is(header,div).elementor-location-header .lij-header-bar .buscador, .lij-mobile-menu-search) .search-overlay__list::-webkit-scrollbar-track {
    background: transparent;
}

:is(:is(header,div).elementor-location-header .lij-header-bar .buscador, .lij-mobile-menu-search) .search-overlay__list::-webkit-scrollbar-thumb {
    background-color: var(--lij-cream);
    border-radius: var(--lij-radius-pill);
}

:is(:is(header,div).elementor-location-header .lij-header-bar .buscador, .lij-mobile-menu-search) .search-overlay__empty {
    padding: var(--lij-space-s);
    font-family: var(--lij-font-title);
    font-weight: var(--lij-weight-body);
    font-size: 16px;
    line-height: 1.4;
    color: var(--lij-on-red);
}

/* Padding vertical más generoso que el valor original calcado del prototipo
   (8px): Francisco pidió más aire entre filas comparando contra la fuente de
   la verdad, así que se sube un paso en la escala de espaciado ya existente
   (`--lij-space-xs`, 12px) en vez de un valor suelto nuevo.

   `!important` en el padding y la altura: `.search-item` también es un
   `<button>` dentro de `.widget_product_search`, así que hereda la misma
   regla vieja de `estilos.css:464-475` que ya obligó a usar `!important` en
   el botón de envío (línea 1216 de este archivo) — `height: 44px;
   border-radius: 7px; padding: 0 1rem !important;` puesta sobre CUALQUIER
   botón ahí dentro. Sin ganarle el padding, el vertical se quedaba en 0 (el
   horizontal "acertaba" con 16px de pura casualidad, porque el 1rem de esa
   regla vieja también son 16px); sin ganarle la altura, los 44px fijos
   recortaban el padding nuevo en vez de dejar crecer la fila.

   `min-width: 0`: esa misma regla vieja trae además `min-width: fit-content
   !important` — pensado para que el botón de envío ("Buscar") nunca se
   apriete más que su propio texto. Sobre `.search-item` tiene el efecto
   contrario al querido: obliga a la fila a ensancharse hasta caber el
   título SIN recortar, así que un título largo ("El pollo Pepe juega al
   escondite con sus amigos...") empuja `.search-overlay__list` más allá de
   sus 383px y aparecen las barras de scroll horizontal Y vertical nativas
   (reportado por Francisco). Ganarle a `min-width` es lo que deja que
   `.search-item__text` (que ya trae `overflow:hidden`/`text-overflow:
   ellipsis`/`white-space:nowrap`, sección más abajo) recorte de verdad. */
:is(:is(header,div).elementor-location-header .lij-header-bar .buscador, .lij-mobile-menu-search) .search-item {
    display: flex;
    align-items: center;
    gap: var(--lij-space-xxs);                   /* v3 .search-item: 8px */
    width: 100%;
    min-width: 0 !important;
    height: auto !important;
    padding: var(--lij-space-xxs) var(--lij-space-s) !important;   /* v3: 8px 16px (antes 16, a pedido en sept.; v3 manda) */
    background: var(--lij-red);
    border: none;
    border-bottom: 0.5px solid var(--lij-cream);
    border-radius: 0 !important;
    text-align: left;
    cursor: pointer;
}

/* Anula la lupa heredada de `estilos.css:825`
   (`header .widget_product_search button:before`, regla vieja del starter
   Bootscore pensada para el botón de envío) — `.search-item` también es un
   `<button>` dentro de `.widget_product_search`, así que sin esto cada fila
   del panel salía con una lupa de más delante de la miniatura. Solo miniatura
   + título, como pidió Francisco. */
:is(:is(header,div).elementor-location-header .lij-header-bar .buscador, .lij-mobile-menu-search) .search-item::before {
    content: none;
}

:is(:is(header,div).elementor-location-header .lij-header-bar .buscador, .lij-mobile-menu-search) .search-item:hover,
:is(:is(header,div).elementor-location-header .lij-header-bar .buscador, .lij-mobile-menu-search) .search-item:focus-visible {
    background: var(--lij-red-hover);
}

:is(:is(header,div).elementor-location-header .lij-header-bar .buscador, .lij-mobile-menu-search) .search-item__thumb {
    width: 40px;
    height: 40px;
    object-fit: cover;
    flex-shrink: 0;
    border-radius: 0;                            /* v3 .search-item__thumb: sin radio ni fondo */
    background: none;
}

:is(:is(header,div).elementor-location-header .lij-header-bar .buscador, .lij-mobile-menu-search) .search-item__text {
    flex: 1 0 0;
    min-width: 1px;
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
    font-family: var(--lij-font-title);
    font-weight: var(--lij-weight-body);
    font-size: 16px;
    line-height: 1.4;
    color: var(--lij-on-red);
}

/* =============================================================================
   7. MI CUENTA, CARRITO Y REDES
   -----------------------------------------------------------------------------
   NOTA (Fase 4c): Mi cuenta y el carrito están OCULTOS en la barra del header,
   porque el maestro visual no los tiene: su fila es logo, píldoras, lupa y
   redes. Los widgets siguen en la plantilla 62 con todos sus ajustes, solo con
   los flags de visibilidad puestos, así que recuperarlos es quitarlos.

   Sus reglas se conservan aquí a propósito: si vuelven, vuelven ya estilados.
   El acceso a la cuenta desde móvil sigue vivo en el off-canvas
   ([mi_cuenta_xs]).
   ============================================================================= */

:is(header,div).elementor-location-header .lij-header-bar .mi-cuenta {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    gap: var(--lij-space-xxs);
    min-width: 40px;
    min-height: 40px;
    padding: var(--lij-space-xxxs);
    border-radius: var(--lij-radius-pill);
    font-family: var(--lij-font-title);
    font-weight: var(--lij-weight-strong);
    font-size: 16px;
    line-height: 1.4;
    color: var(--lij-on-red);
    text-decoration: none;
}

:is(header,div).elementor-location-header .lij-header-bar .mi-cuenta:hover {
    background-color: var(--lij-red-hover);
}

:is(header,div).elementor-location-header .lij-header-bar .mi-cuenta svg {
    width: 22px;
    height: auto;
}

/* El SVG de Mi cuenta trae el trazo fijado a negro por un <style> dentro del
   propio SVG. Ese <style> va después en el documento, así que a igual
   especificidad ganaría él: se resuelve subiendo especificidad. */
:is(header,div).elementor-location-header .lij-header-bar .mi-cuenta svg .cls-1,
:is(header,div).elementor-location-header .lij-header-bar .mi-cuenta svg path,
:is(header,div).elementor-location-header .lij-header-bar .mi-cuenta svg circle {
    stroke: var(--lij-on-red);
}

:is(header,div).elementor-location-header .lij-header-bar .icono-carrito .elementor-menu-cart__toggle .elementor-button {
    color: var(--lij-on-red);
    background-color: transparent;
    border: none;
}

:is(header,div).elementor-location-header .lij-header-bar .icono-carrito .elementor-menu-cart__toggle .elementor-button:hover {
    background-color: var(--lij-red-hover);
    border-radius: var(--lij-radius-pill);
}

:is(header,div).elementor-location-header .lij-header-bar .icono-carrito svg,
:is(header,div).elementor-location-header .lij-header-bar .icono-carrito i {
    color: var(--lij-on-red);
    fill: var(--lij-on-red);
}

:is(header,div).elementor-location-header .lij-header-bar .icono-carrito .elementor-button-icon-qty[data-counter] {
    background-color: var(--lij-cream);
    color: var(--lij-on-cream);
    font-family: var(--lij-font-title);
    font-weight: var(--lij-weight-strong);
}

/* Redes: widgets `icon` nativos de Elementor con iconos de marca de Font
   Awesome, no imágenes, para que no dependan de una URL de archivo que
   cambiaría entre este entorno y producción. Las URL son las reales de SM,
   tomadas del propio tema. Círculo crema de 40px con icono de 24, como el
   `.social-btn` del prototipo. */
:is(header,div).elementor-location-header .lij-header-bar .lij-social .elementor-icon-wrapper {
    display: flex;
    align-items: center;
}

:is(header,div).elementor-location-header .lij-header-bar .lij-social .elementor-icon {
    display: flex;
    align-items: center;
    justify-content: center;
    width: 40px;
    height: 40px;
    padding: var(--lij-space-xxxs);
    border-radius: var(--lij-radius-pill);
    background-color: var(--lij-cream);
    color: var(--lij-on-cream);
}

:is(header,div).elementor-location-header .lij-header-bar .lij-social .elementor-icon:hover {
    background-color: #FFFFFF;
}

:is(header,div).elementor-location-header .lij-header-bar .lij-social .elementor-icon svg,
:is(header,div).elementor-location-header .lij-header-bar .lij-social .elementor-icon i {
    width: 24px;
    height: 24px;
    font-size: 24px;
    fill: currentColor;
}

/* Disparador del off-canvas (móvil). */
:is(header,div).elementor-location-header .lij-header-bar .elementor-widget-button .elementor-button {
    color: var(--lij-on-red);
    background-color: transparent;
}


/* =============================================================================
   8. RESPONSIVE
   El maestro visual no tiene ni una media query, así que estas reglas son
   decisiones propias y no especificación de diseño. Criterio: no perder nada
   de lo que hoy funciona en móvil y no provocar scroll horizontal.
   ============================================================================= */

/* Las etiquetas del menú real son mucho más largas que las del prototipo
   ("Licencias digitales" frente a "0-2 años"): las 6 actuales suman 1042px a 20px
   y el hueco disponible a 1440 es de 980, así que por debajo de 1600 el
   tamaño baja un punto. El scroll ya está activo siempre, no hace falta
   activarlo aquí. */
@media (max-width: 1600px) {
    :is(header,div).elementor-location-header .lij-header-bar #bootscore-navbar > li.nav-item > a.nav-link {
        font-size: 18px;
    }
}

@media (max-width: 799px) {
    /* El ancho abierto es el flex-basis del CONTENEDOR (sección 2), no un
       min-width del formulario: se sobrescribe aquí con el mismo criterio,
       un valor más modesto para dejarle más sitio al menú en pantallas
       medias. El colapsado (38px, el botón) no cambia por breakpoint. */
    :is(header,div).elementor-location-header .lij-header-bar .buscador.lij-search--open {
        flex-basis: 320px !important;
    }

    :is(header,div).elementor-location-header .lij-header-bar .elementor-widget-theme-site-logo img {
        height: 44px;
    }


    :is(header,div).elementor-location-header .lij-header-bar .opciones {
        margin-left: var(--lij-space-s);
    }
}

/* En móvil la navegación va por el off-canvas, que ya existía y no se toca.
   Hay que anular aquí el `position: absolute; width: 32%` que estilos.css:3205
   pone al botón del buscador en este rango: con la lupa colapsada dejaría el
   botón flotando fuera de su sitio. */
@media (max-width: 767px) {
    /* La onda se quedaba en 24px en teléfono; v3 la mantiene a 41.77px en
       todos los anchos (Menu.css .menu__wave), así que ya no se redefine. */

    :is(header,div).elementor-location-header .lij-header-bar,
    :is(header,div).elementor-location-header .lij-header-bar > .e-con-inner {
        flex-wrap: wrap;
    }

    /* El padding-top va solo en el envoltorio real (ver sección 2): aplicarlo
       también en `.lij-header-bar` lo duplicaría, igual que pasaba en
       escritorio antes de corregirlo. */
    :is(header,div).elementor-location-header .lij-header-bar > .e-con-inner {
        padding-top: var(--lij-space-xxs);
    }

    :is(header,div).elementor-location-header .lij-header-bar .buscador.lij-search--open {
        flex-basis: 240px !important;
    }

    :is(header,div).elementor-location-header .lij-header-bar .buscador form.woocommerce-product-search button {
        position: relative;
        width: 38px;
        max-width: 38px;
        right: auto;
        top: auto;
    }


    :is(header,div).elementor-location-header .lij-header-bar .opciones {
        margin-left: var(--lij-space-xxs);
    }
}

/* El menú dentro del off-canvas: el lenguaje del megamenú pero en vertical y
   sin píldoras, que a ese ancho no aportan. */
.elementor-off-canvas #bootscore-navbar {
    display: flex;
    flex-direction: column;
    align-items: stretch;
    gap: var(--lij-space-xxxs);
    overflow-x: visible;
}

.elementor-off-canvas #bootscore-navbar > li.nav-item:first-child {
    margin-left: 0;
}

.elementor-off-canvas #bootscore-navbar .nav-link,
.elementor-off-canvas #bootscore-navbar .dropdown-item {
    padding: var(--lij-space-xxs);
    border-radius: var(--lij-radius-s);
    font-family: var(--lij-font-title);
    font-size: 16px;
    line-height: 1.4;
    text-decoration: none;
}

.elementor-off-canvas #bootscore-navbar > li.nav-item > .nav-link {
    font-weight: var(--lij-weight-strong);
    font-size: 20px;
}

.elementor-off-canvas #bootscore-navbar .dropdown-menu {
    position: static;
    display: block;
    float: none;
    border: none;
    box-shadow: none;
    background: none;
    padding: 0 0 0 var(--lij-space-xs);
}


/* =============================================================================
   9. ACCESIBILIDAD
   ============================================================================= */

:is(header,div).elementor-location-header .lij-header-bar a:focus-visible,
:is(header,div).elementor-location-header .lij-header-bar button:focus-visible,
:is(header,div).elementor-location-header .lij-header-bar input:focus-visible {
    outline: 2px solid var(--lij-cream);
    outline-offset: 2px;
}

@media (prefers-reduced-motion: reduce) {
    :is(header,div).elementor-location-header .lij-header-bar #bootscore-navbar > li.nav-item > a.nav-link::before,
    :is(header,div).elementor-location-header .lij-header-bar .buscador form.woocommerce-product-search {
        transition: none;
    }
}


/* =============================================================================
   10. MENÚ MÓVIL (v2) — 2026-09-23
   Implementa MobileMenu.tsx/.css de la fuente de la verdad v2
   (nueva-web-lij-main-v2): por debajo de 1024px, en vez de mantener el
   buscador y las redes visibles en la barra, TODO se pliega detrás de un
   botón de menú — igual que "folded" en Menu.tsx (FOLDED_QUERY, ≤1023px).

   Implementado como un Popup real de Elementor Pro (Theme Builder > Popups,
   post 48600, "Menú móvil (v2)"), no como código ajeno a Elementor — a
   pedido explícito de Francisco ("debes replicar el diseño del menú en
   Elementor Pro"). El botón hamburguesa nuevo (widget icon, plantilla 62)
   lo abre con el mismo mecanismo nativo que usa el Dynamic Tag "Popup" del
   editor (Plugin::elementor()->frontend->create_action_hash). El buscador
   ([buscador_wc], mismo shortcode y misma lógica que la cabecera/home/
   resultados — SearchWP, autocompletado, búsquedas recientes, todo intacto)
   y los 3 iconos sociales reales se REUTILIZAN dentro del popup, no se
   duplica ninguna funcionalidad nueva.

   El buscador, las redes ("opciones") y el propio widget Mega Menu de la
   barra se OCULTAN en tablet/móvil vía Responsive Visibility nativa de
   Elementor (hide_tablet/hide_mobile/hide_mobile_extra) — no se borra
   nada, la lógica de cada uno sigue intacta, solo dejan de verse en la
   barra a esos anchos porque ahora viven dentro del popup.

   BUG REAL encontrado 2026-09-23 (reportado por Francisco con capturas):
   en tablet (768-1024px) las redes ("opciones") seguían viéndose,
   centradas, en la barra. Confirmado por render real (CLI, con el mismo
   método de siempre) que el marcado SÍ trae la clase nativa correcta
   (`elementor-hidden-tablet`) y que la regla que la oculta existe en el
   CSS real del sitio (`custom-frontend.min.css`,
   `@media (min-width:768px) and (max-width:1024px){.elementor
   .elementor-hidden-tablet{display:none}}`) — pero SIN `!important` y con
   especificidad (0,2,0). Nuestra propia regla de abajo (§2,
   `.opciones{display:flex;...}`), sin condición de breakpoint y con
   especificidad (0,3,1) por los 3 selectores de clase que arrastra
   (`.elementor-location-header .lij-header-bar .opciones`), le ganaba sin
   competencia — el mismo patrón exacto ya diagnosticado más abajo para el
   botón hamburguesa (ver comentario siguiente). Mobile/mobile_extra no se
   vieron afectados por la misma causa (verificado con el mismo método:
   sus reglas nativas SÍ ganan ahí, aunque tengan la misma especificidad
   "débil" — no se investigó la asimetría exacta, no hacía falta para el
   fix). Se corrige igual que el botón hamburguesa: mismo breakpoint
   (≤1024px, "no escritorio" en este sitio) y `!important` explícito, en
   vez de depender solo del mecanismo nativo de Elementor. */
@media (max-width: 799px) {
    :is(header,div).elementor-location-header .lij-header-bar .opciones {
        display: none !important;
    }
}

/* BUG REAL encontrado 2026-09-23 (reportado por Francisco con capturas):
   en mobile/mobile_extra (≤767px) el logo y el botón hamburguesa aparecían
   centrados juntos en vez de logo a la izquierda / hamburguesa a la
   derecha, como en v2. Causa: `flex_justify_content_mobile_extra: center`
   en el panel de Elementor del contenedor raíz (post 62, ajuste heredado
   de antes de este rediseño) — se aplica vía la variable CSS
   `--justify-content`, así que una declaración directa con `!important`
   le gana sin depender de la especificidad. En tablet ya funciona bien
   (no hay ningún override ahí, hereda `space-between` de escritorio),
   por eso el breakpoint de abajo no lo toca. */
@media (max-width: 767px) {
    :is(header,div).elementor-location-header .lij-header-bar {
        justify-content: space-between !important;
    }
}

/* --- Botón hamburguesa en la barra (solo tablet/móvil) -------------------
   BUG REAL encontrado 2026-09-23: el `display:flex` sin condición de aquí
   tenía más especificidad que la regla nativa de Elementor que lo oculta en
   escritorio (`.elementor .elementor-hidden-desktop{display:none}`, sin
   `!important`, en frontend.min.css) — así que ganaba y el botón se veía
   también en escritorio pese al `hide_desktop` del widget. Se envuelve en
   el mismo breakpoint que usa Elementor para "no escritorio" en este sitio
   (Kit: active_breakpoints = mobile/mobile_extra/tablet, `viewport_lg`=
   1025px → desktop empieza en 1025px, "no escritorio" es ≤1024px) para no
   competir nunca con esa regla. Además el widget `icon` de Elementor pinta
   el ícono como `<svg>` (o `<i>` si la librería es de fuente), nunca ambos
   a la vez — se apunta a los dos, igual que ya hace `.lij-social` más abajo
   en este archivo, para cubrir cualquiera de los dos casos. */
@media (max-width: 799px) {
    :is(header,div).elementor-location-header .lij-header-bar .lij-mobile-menu-toggle .elementor-icon-wrapper {
        display: flex;
        align-items: center;
    }

    :is(header,div).elementor-location-header .lij-header-bar .lij-mobile-menu-toggle .elementor-icon {
        display: flex;
        align-items: center;
        justify-content: center;
        width: 40px;
        height: 40px;
        padding: var(--lij-space-xxxs);
        border-radius: var(--lij-radius-pill);
        background-color: var(--lij-cream);
        color: var(--lij-on-cream);
    }
}

:is(header,div).elementor-location-header .lij-header-bar .lij-mobile-menu-toggle .elementor-icon svg,
:is(header,div).elementor-location-header .lij-header-bar .lij-mobile-menu-toggle .elementor-icon i {
    width: 20px;
    height: 20px;
    font-size: 20px;
    fill: currentColor;
}

/* El icono de v3 (.menu__burger-icon): las tres líneas finas de Material
   Symbols a 24px (icon-menu.svg), no las barras gruesas de Font Awesome del
   widget. Mismo recurso que la X del botón de cerrar (sección 10): el icono
   del widget se oculta y se pinta el SVG como máscara. */
:is(header,div).elementor-location-header .lij-header-bar .lij-mobile-menu-toggle .elementor-icon > svg,
:is(header,div).elementor-location-header .lij-header-bar .lij-mobile-menu-toggle .elementor-icon > i {
    display: none;
}

:is(header,div).elementor-location-header .lij-header-bar .lij-mobile-menu-toggle .elementor-icon::before {
    content: "";
    display: block;
    width: 24px;
    height: 24px;
    background-color: var(--lij-red, #ED1B2F);
    -webkit-mask: url('../images/lij/icon-menu.svg') center / 100% 100% no-repeat;
    mask: url('../images/lij/icon-menu.svg') center / 100% 100% no-repeat;
}

/* --- El popup en sí: pantalla completa, sin el chrome por defecto de
   Elementor (el diálogo nativo trae su propio ancho/alto "auto" salvo que
   se gane con !important a su propio wrapper). */
.elementor-popup-modal:has(.lij-mobile-menu) .dialog-widget-content {
    padding: 0 !important;
    width: 100vw !important;
    height: 100vh !important;
    max-width: 100vw !important;
    max-height: 100vh !important;
    overflow-y: auto;
}

.lij-mobile-menu {
    min-height: 100vh;
}

.lij-mobile-menu-bar {
    position: sticky;
    top: 0;
    z-index: 2;
    background: var(--lij-red);
}

.lij-mobile-menu-logo img {
    height: 56px;
    width: auto;
}

.lij-mobile-menu-close .elementor-icon-wrapper {
    display: flex;
    align-items: center;
}

.lij-mobile-menu-close .elementor-icon {
    display: flex;
    align-items: center;
    justify-content: center;
    width: 40px;
    height: 40px;
    padding: var(--lij-space-xxxs);
    border-radius: var(--lij-radius-pill);
    background-color: var(--lij-cream);
    color: var(--lij-on-cream);
    cursor: pointer;
}

.lij-mobile-menu-close .elementor-icon svg,
.lij-mobile-menu-close .elementor-icon i {
    width: 20px;
    height: 20px;
    font-size: 20px;
    fill: currentColor;
}

/* --- Buscador dentro del popup: mismo lenguaje visual que la cabecera,
   pero SIEMPRE expandido (sin botón de colapso — el JS de colapso
   (lij-header.js) solo busca `.lij-header-bar .buscador`, así que este,
   fuera de esa barra, nace y se queda expandido, igual que Menu.tsx pide
   para el buscador dentro del panel móvil). */
.lij-mobile-menu-search .buscador,
.lij-mobile-menu-search .widget_product_search {
    width: 100%;
}

.lij-mobile-menu-search form.woocommerce-product-search {
    display: flex;
    align-items: center;
    width: 100%;
    height: 48px;
    padding: 1px 1px 1px var(--lij-space-s);
    border: none;
    border-radius: var(--lij-radius-pill);
    background-color: var(--lij-red-hover);
}

.lij-mobile-menu-search form.woocommerce-product-search input.search-field {
    flex: 1 1 auto;
    min-width: 1px;
    height: 100%;
    margin: 0;
    padding: var(--lij-space-xxs) var(--lij-space-xxxs);
    border: none;
    background: transparent;
    outline: none;
    box-shadow: none;
    font-family: var(--lij-font-title);
    font-weight: var(--lij-weight-body);
    font-size: 16px;
    color: var(--lij-on-red);
}

.lij-mobile-menu-search form.woocommerce-product-search input.search-field::placeholder {
    color: var(--lij-on-red);
    opacity: 1;
}

.lij-mobile-menu-search form.woocommerce-product-search button {
    position: relative;
    flex: 0 0 auto;
    display: block;
    width: 46px;
    height: 46px;
    min-width: 46px !important;
    max-width: 46px;
    margin: 0 !important;
    padding: 0 !important;
    border: none;
    border-radius: var(--lij-radius-pill);
    background-color: var(--lij-red);
    color: transparent;
    font-size: 0 !important;
    line-height: 0;
    text-indent: -9999px;
    overflow: hidden;
    cursor: pointer;
}

.lij-mobile-menu-search form.woocommerce-product-search button::before {
    content: none;
    display: none;
}

.lij-mobile-menu-search form.woocommerce-product-search button::after {
    content: '';
    position: absolute;
    top: 50%;
    left: 50%;
    transform: translate(-50%, -50%);
    width: 24px;
    height: 24px;
    background-color: var(--lij-on-red);
    mask-image: url('/wp-content/uploads/2026/09/header/lij-header-icon-search.svg');
    mask-size: contain;
    mask-repeat: no-repeat;
    mask-position: center;
    -webkit-mask-image: url('/wp-content/uploads/2026/09/header/lij-header-icon-search.svg');
    -webkit-mask-size: contain;
    -webkit-mask-repeat: no-repeat;
    -webkit-mask-position: center;
}

.lij-mobile-menu-search .search-overlay {
    position: absolute;
    top: calc(100% + 4px);
    left: 0;
    width: 100%;
    max-height: 300px;
    display: flex;
    flex-direction: column;
    border-radius: var(--lij-radius-m);
    background: var(--lij-red);
    box-shadow: var(--lij-shadow-panel);
    overflow: hidden;
    z-index: 5;
}

.lij-mobile-menu-search .search-overlay[hidden] {
    display: none;
}

/* --- Navegación: las 7 secciones apiladas, mismo lenguaje que las
   píldoras de escritorio (Avenir Black, blanco) pero en lista vertical —
   en touch no hay hover, así que el blob de las píldoras (pensado para
   :hover) no hace falta aquí, igual que en v2 (que solo lo activa bajo
   `@media (hover: hover)`).

   BUG REAL corregido 2026-09-23 (reportado por Francisco con capturas):
   esta lista de 7 secciones traía líneas divisorias (arriba de todas y
   entre cada una) que `MobileMenu.tsx`/`.css` de v2 no tiene —
   `.mobile-menu__sections ul`/`.mobile-menu__section` no declaran ningún
   `border`, es una lista limpia, solo separada por espaciado. Se quitan
   aquí (antes vivían en `.lij-mobile-menu-nav`/`.lij-mobile-menu-link`,
   ver historial). La línea que SÍ debía existir era la de cada fila
   DENTRO de un panel desplegado (colecciones/categorías) — ver
   `.menu-list__row` más abajo, que le faltaba y v2 sí trae. */

/* BUG REAL encontrado 2026-09-23: sin texto visible en el navegador
   (Francisco: "el texto no tiene color"). El HTML es correcto
   (`<h3 class="elementor-heading-title"><a href="...">0-2 años</a></h3>`)
   y este selector coincide, pero el `<a>` hereda de alguna regla vieja con
   `!important` (mismo patrón ya visto en este archivo con Bootstrap/
   estilos.css — botón de búsqueda, blob de las píldoras, etc.) que gana
   sin importar la especificidad. Se gana con `!important` aquí también. */
.lij-mobile-menu-link .elementor-heading-title,
.lij-mobile-menu-link .elementor-heading-title a {
    display: block !important;
    padding: var(--lij-space-xs) 0 !important;
    font-family: var(--lij-font-title) !important;
    font-weight: var(--lij-weight-strong) !important;
    font-size: 20px !important;
    line-height: 1.2 !important;
    color: var(--lij-on-red) !important;
    text-decoration: none !important;
}

.lij-mobile-menu-link .elementor-heading-title a:hover,
.lij-mobile-menu-link .elementor-heading-title a:focus-visible {
    color: var(--lij-on-cream) !important;
}

/* --- Acordeón de navegación (2026-09-23) ---------------------------------
   Implementa MobileMenu.tsx/.css de v2: cada sección con contenido real
   (0-2/3-5/6-9/10-12 años, Barco de Vapor, Juvenil) se despliega en el
   propio menú móvil con flecha nativa (chevron abajo/arriba) — mismo
   widget `nested-accordion` que ya usa la plantilla 67 (Elementor Pro),
   mismo patrón de icono (`accordion_item_title_icon`/`_active`) que ese
   acordeón real. El contenido de cada panel (colecciones/categorías) se
   REUTILIZÓ tal cual del megamenú de escritorio (post 62, widget
   a60c11f) — mismas imágenes, mismos títulos, nada inventado. "Premios SM"
   se queda como enlace directo (`.lij-mobile-menu-link`, arriba), igual
   que en v2 y en el propio escritorio (no tiene panel desplegable).

   Sin línea divisora entre secciones (ver nota arriba, mismo fix
   2026-09-23).

   Padding vertical bajado de `--lij-space-xs` (12px) a `--lij-space-xxxs`
   (4px) al agregar el blob de abajo: el span del título ahora aporta sus
   propios 8px arriba/abajo (`.lij-pill`, mismo valor que el escritorio),
   así que 4+8=12px por lado — la altura total de la fila no cambia frente
   a como estaba, la única diferencia real es que ahora sí se ve la
   píldora al desplegar. */
.lij-mobile-menu-accordion .e-n-accordion-item-title {
    padding: var(--lij-space-xxxs) 0 !important;
    background: transparent !important;
}

/* BUG REAL corregido 2026-09-23 (reportado por Francisco con capturas): la
   sección abierta solo cambiaba de color (rojo sobre rojo, casi invisible)
   en vez de mostrar la misma píldora blob blanca que usan las píldoras de
   escritorio en hover/activo (`.lij-pill`/`.lij-pill::before`, design
   system §5.1) — v2 reutiliza el mismo `.playful-btn`/`.playful-btn__blob`
   del escritorio también en el menú móvil (`MobileMenu.tsx` envuelve cada
   etiqueta en un `<span className="playful-btn">`). Se replica aquí el
   mismo patrón (mismo SVG, mismos insets) sobre el span del título, no
   sobre toda la fila — el blob abraza el texto, no ocupa todo el ancho.

   BUG REAL corregido 2026-09-23, 2 intentos (reportado por Francisco con
   capturas — el primer intento, más abajo, no bastó): al hacer clic, la
   píldora se veía recortada por la izquierda durante toda la animación de
   apertura, y recién se completaba cuando terminaba de desplegarse el
   panel. Causa real, confirmada renderizando el HTML real del popup por
   CLI y cruzándolo con el propio JS de Elementor (ninguno de los dos es
   archivo de este tema):

   1. El acordeón nativo de Elementor (`nested-accordion`) es un
      `<details class="e-n-accordion-item">` real — confirmado en el HTML
      servido. Su `<summary class="e-n-accordion-item-title">` no tiene
      padding horizontal (lo forzamos a `0` arriba, sección anterior).
   2. `elementor/assets/js/nested-accordion...bundle.js`,
      `prepareOpenAnimation()`, le pone `overflow:hidden` INLINE a todo el
      `<details>` (título + panel juntos) mientras dura la animación de
      altura — necesario para esa animación, no un bug de Elementor — y lo
      quita recién en `onAnimationFinish()`.
   3. Este span (`.e-n-accordion-item-title-text`) tenía
      `margin-left: calc(var(--lij-space-xxs) * -1)` (-8px) para alinear
      el texto con el borde de la fila, calcado del
      `.mobile-menu__section .playful-btn{margin-left:calc(-1*var(--space-xxs))}`
      de v2 — pero como el `<summary>` que lo contiene ya no tiene padding
      horizontal, ese margen negativo empuja la CAJA ENTERA del texto
      (fondo del blob incluido, no solo su sobresaliente del punto
      anterior) 8px hacia la izquierda del propio `<details>` — la parte
      real que se recortaba durante la animación, mucho más ancha que el
      sobresaliente del blob que se corrigió primero (insuficiente por sí
      solo, de ahí que persistiera).
   Fix real: se quita el margen negativo. En v2 es seguro porque nunca vive
   dentro de un contenedor con `overflow:hidden` animado; aquí no lo es.
   El texto queda ~8px más adentro que un alineado perfecto a filo — un
   detalle menor frente a una píldora visiblemente cortada. */
.lij-mobile-menu-accordion .e-n-accordion-item-title-text {
    position: relative;
    isolation: isolate;
    display: inline-flex;
    align-items: center;
    padding: var(--lij-space-xxs);
    font-family: var(--lij-font-title) !important;
    font-weight: var(--lij-weight-strong) !important;
    font-size: 20px !important;
    line-height: 1.2 !important;
    color: var(--lij-on-red) !important;
}

/* El blob en sí ya se ajustó para no salirse de esta caja (insets sin
   negativos, `0%` en vez de `-0.31%`/`-2.59%`) — parte del primer intento
   de arreglo de arriba, que por sí solo no bastó pero sigue siendo
   correcto: nunca hay nada que recortar, sin importar el `overflow` del
   ancestro. */
.lij-mobile-menu-accordion .e-n-accordion-item-title-text::before {
    content: '';
    position: absolute;
    z-index: -1;
    inset: 6.67% 0% 3.33% 0%;
    background-image: url('/wp-content/uploads/2026/09/header/lij-header-playful-blob-cream.svg');
    background-size: 100% 100%;
    background-repeat: no-repeat;
    opacity: 0;
    transition: opacity 120ms ease;
}

.lij-mobile-menu-accordion .e-n-accordion-item-title[aria-expanded='true'] .e-n-accordion-item-title-text {
    color: var(--lij-on-cream) !important;
}

.lij-mobile-menu-accordion .e-n-accordion-item-title[aria-expanded='true'] .e-n-accordion-item-title-text::before {
    opacity: 1;
}

/* BUG REAL encontrado 2026-09-23: flecha en negro, debía ser blanca. El
   color real del ícono lo pone `fill` (regla nativa de Elementor:
   `.e-n-accordion-item-title-icon span>svg{fill:var(--n-accordion-icon-
   normal-color)}`), no `color` — y sin `!important` en `fill` perdía
   contra esa variable nativa (mismo patrón ya visto 3 veces en esta
   sesión). Se gana con `!important` directo sobre `fill`, sin depender de
   `currentColor`. */
.lij-mobile-menu-accordion .e-n-accordion-item-title-icon,
.lij-mobile-menu-accordion .e-n-accordion-item-title-icon svg {
    width: 20px;
    height: 20px;
    color: var(--lij-on-red) !important;
    fill: var(--lij-on-red) !important;
}

.lij-mobile-menu-accordion .e-n-accordion-item-title[aria-expanded='true'] .e-n-accordion-item-title-icon,
.lij-mobile-menu-accordion .e-n-accordion-item-title[aria-expanded='true'] .e-n-accordion-item-title-icon svg {
    color: var(--lij-on-cream) !important;
    fill: var(--lij-on-cream) !important;
}

/* Filas del panel: círculo crema de 40px + texto, calcado de
   `.menu-list`/`.search-item` (Fase 4m, mismo lenguaje que el panel de
   sugerencias del buscador).

   BUG REAL corregido 2026-09-23 (reportado por Francisco con capturas):
   1) sin línea divisora entre filas — a la inversa del bug de arriba,
      aquí SÍ hace falta una (v2: `.search-item{border-bottom:0.5px solid
      ...}`, la misma línea de cada fila, no un divisor aparte). Se agrega
      aquí en vez de depender del único widget `.menu-list__divider` que
      ya existía en el popup (post 48600), pensado solo para separar el
      grupo de colecciones del de categorías, no fila por fila.
   2) corrección de una corrección: el `gap` se había bajado por error a
      `--lij-space-xxs` (8px) en la primera pasada de este mismo día,
      leyendo el `.search-item` genérico del panel de sugerencias
      (`overlay.css`, 8px) en vez del que realmente aplica aquí,
      `MobileMenu.css` `.menu-list .search-item{gap:var(--space-xs)}` — que
      SÍ es 12px (`tokens.css`), el mismo valor que ya tenía WordPress
      antes de tocarlo. Devuelto a `--lij-space-xs` (12px).
   3) el `!important` del punto anterior tampoco lo arregló — confirmado
      por Francisco con una tercera captura. Diagnóstico equivocado: el
      problema nunca fue de especificidad. Renderizando el popup real por
      CLI (`Plugin::$instance->frontend->get_builder_content_for_display`,
      sin depender de HTTP) se ve el HTML real de la fila:
      `<div class="... menu-list__row e-flex e-con-boxed e-con e-child">
        <div class="e-con-inner">
          <img.../><h3 class="menu-list__text">...
        </div>
      </div>`
      — el modo "boxed" de este contenedor (`e-con-boxed`, a diferencia
      del header en `content_width:full`) hace que Elementor meta un
      `.e-con-inner` real entre `.menu-list__row` y sus dos widgets. El
      flex y el `gap` de verdad viven en `.e-con-inner`, no en
      `.menu-list__row` — por eso ningún valor ahí, con o sin
      `!important`, podía moverle un solo píxel al espacio entre ícono y
      título. Mismo patrón exacto que ya obligó a duplicar selectores con
      `> .e-con-inner` en el resto de este archivo (sección 1, la barra
      del header) — aquí no se había hecho. */
.menu-list__row,
.menu-list__row > .e-con-inner {
    gap: var(--lij-space-xs) !important;
}

.menu-list__row {
    padding: var(--lij-space-xxs) 0;
    border-bottom: 0.5px solid rgba(255, 249, 245, 0.3);
}

.menu-list__thumb-img {
    flex-shrink: 0;
}

/* `!important`: el círculo se veía cuadrado pese a que la regla ya pedía
   `border-radius`/`background`/`padding` — no se aisló la causa exacta
   (no se encontró ninguna otra regla de este tema que gane por
   especificidad), pero se gana igual con `!important`, mismo patrón ya
   usado varias veces en este archivo contra estilos de Elementor. */
.menu-list__thumb-img img {
    display: block !important;
    width: 40px !important;
    height: 40px !important;
    padding: 3px !important;
    border-radius: var(--lij-radius-pill) !important;
    background: var(--lij-cream) !important;
    object-fit: contain !important;
}

.menu-list__text .elementor-heading-title {
    font-family: var(--lij-font-title) !important;
    font-weight: var(--lij-weight-body) !important;
    font-size: 16px !important;
    line-height: 1.4 !important;
    color: var(--lij-on-red) !important;
}

.menu-list__divider {
    height: 0.5px;
    margin: var(--lij-space-xxs) 0;
    background: rgba(255, 249, 245, 0.3);
}

.menu-list__vertodo {
    padding: var(--lij-space-xs) 0 var(--lij-space-s);
    cursor: pointer;
}

.menu-list__vertodo .elementor-heading-title {
    font-family: var(--lij-font-title) !important;
    font-weight: var(--lij-weight-strong) !important;
    font-size: 16px !important;
    color: var(--lij-on-cream) !important;
    text-decoration: underline !important;
    text-underline-offset: 2px;
}

/* --- Redes sociales: mismo círculo crema/ícono rojo del header. --------- */
.lij-mobile-menu-social-row {
    padding-top: var(--lij-space-xs);
}

.lij-mobile-menu-social .elementor-icon-wrapper {
    display: flex;
    align-items: center;
}

.lij-mobile-menu-social .elementor-icon {
    display: flex;
    align-items: center;
    justify-content: center;
    width: 40px;
    height: 40px;
    padding: var(--lij-space-xxxs);
    border-radius: var(--lij-radius-pill);
    background-color: var(--lij-cream);
    color: var(--lij-on-cream);
}

.lij-mobile-menu-social .elementor-icon svg,
.lij-mobile-menu-social .elementor-icon i {
    width: 20px;
    height: 20px;
    font-size: 20px;
    fill: currentColor;
}

.lij-mobile-menu-social .elementor-icon:hover {
    background-color: #FFFFFF;
}


/* =============================================================================
   12. MENÚ DE NAVEGACIÓN v3 — 2026-10-06
   Fuente de la verdad: nueva-web-lij-main-v3 (Menu.tsx/Menu.css). JS en
   lij-header.js, bloque "Menú de navegación v3".

   12.1 Pliegue a hamburguesa solo por debajo de 800px (antes 1024px). Los
   breakpoints del Kit (tablet = 1024) no se tocan porque gobiernan todo el
   sitio: en 800-1024 se anulan aquí, acotado al header, las dos reglas
   nativas que pliegan el Mega Menu en su modo "tablet"
   (custom-pro-widget-mega-menu.min.css) y la visibilidad responsive
   (hide_tablet) del menú, el buscador y las redes. El botón hamburguesa
   (hide_desktop) se oculta en ese mismo rango. Las reglas de §8/§10 que
   ocultaban las redes y estilaban la hamburguesa pasan de 1024 a 799.
   ============================================================================= */
@media (min-width: 800px) and (max-width: 1024px) {
    :is(header,div).elementor-location-header .lij-header-bar .elementor-widget-n-menu.elementor-hidden-tablet {
        display: block !important;
        --n-menu-wrapper-display: flex !important;
    }

    :is(header,div).elementor-location-header .lij-header-bar .elementor-widget-n-menu .e-n-menu-toggle {
        display: none !important;
    }

    :is(header,div).elementor-location-header .lij-header-bar .buscador.elementor-hidden-tablet,
    :is(header,div).elementor-location-header .lij-header-bar .opciones.elementor-hidden-tablet {
        display: flex !important;
    }

    :is(header,div).elementor-location-header .lij-header-bar .lij-mobile-menu-toggle {
        display: none !important;
    }
}

/* 12.2 La tira de pestañas: se desplaza cuando no cabe (`horizontal_scroll`
   nativo); la pastilla de hover/activa sobresale un poco por la izquierda
   de su pestaña, así que la zona de scroll lleva 4px de aire al inicio,
   como `.menu__nav-items` de v3. */
:is(header,div).elementor-location-header .lij-header-bar .elementor-widget-n-menu .e-n-menu-heading {
    padding-left: 4px;
}

/* Para que la tira llegue a desplazarse, cada capa entre el widget (que ya
   encoge, `flex-shrink:1; min-width:0` en su CSS personalizado) y la tira
   tiene que poder quedar más estrecha que su contenido: por defecto un ítem
   flex no baja de su ancho mínimo de contenido y la tira se dibujaba
   entera, encima del buscador y las redes. */
:is(header,div).elementor-location-header .lij-header-bar .elementor-widget-n-menu > .elementor-widget-container,
:is(header,div).elementor-location-header .lij-header-bar .elementor-widget-n-menu .e-n-menu,
:is(header,div).elementor-location-header .lij-header-bar .elementor-widget-n-menu .e-n-menu-wrapper {
    min-width: 0;
    max-width: 100%;
}

/* 12.3 Flechas sobre los extremos de la tira que esconden pestañas: degradado
   desde el rojo del header para que el corte se lea como "hay más" y no
   como una palabra recortada (`.menu__nav-more` de v3). Solo para ratón:
   con teclado, el foco ya desplaza la tira. */
:is(header,div).elementor-location-header .lij-header-bar .lij-nav-more {
    position: absolute;
    top: 0;
    bottom: 0;
    z-index: 3;
    display: flex;
    align-items: center;
    width: 48px;
    margin: 0;
    padding: 0;
    border: 0;
    border-radius: 0;
    cursor: pointer;
}

:is(header,div).elementor-location-header .lij-header-bar .lij-nav-more[hidden] {
    display: none;
}

:is(header,div).elementor-location-header .lij-header-bar .lij-nav-more--start {
    left: 0;
    justify-content: flex-start;
    background: linear-gradient(to right, var(--lij-red) 45%, transparent);
}

:is(header,div).elementor-location-header .lij-header-bar .lij-nav-more--end {
    right: 0;
    justify-content: flex-end;
    background: linear-gradient(to left, var(--lij-red) 45%, transparent);
}

:is(header,div).elementor-location-header .lij-header-bar .lij-nav-chevron {
    display: block;
    width: 24px;
    height: 24px;
    background-color: var(--lij-on-red);
    -webkit-mask: url('../images/lij/chevron-right.svg') center / 100% 100% no-repeat;
    mask: url('../images/lij/chevron-right.svg') center / 100% 100% no-repeat;
}

:is(header,div).elementor-location-header .lij-header-bar .lij-nav-more--start .lij-nav-chevron {
    -webkit-mask-image: url('../images/lij/chevron-left.svg');
    mask-image: url('../images/lij/chevron-left.svg');
}

@media (hover: hover) {
    :is(header,div).elementor-location-header .lij-header-bar .lij-nav-more:hover {
        background-color: transparent;
    }

    :is(header,div).elementor-location-header .lij-header-bar .lij-nav-more:hover .lij-nav-chevron {
        opacity: 0.75;
    }
}

/* 12.4 La pestaña que mantiene su panel abierto se lee como seleccionada
   (`.playful-btn[aria-expanded='true']` de v3): misma pastilla crema que el
   hover, también mientras el ratón está ya dentro del panel. Y la de la
   sección en la que se está (`e-current`, que Elementor pone cuando el
   enlace de la pestaña es la página actual). */
:is(header,div).elementor-location-header .lij-header-bar .e-n-menu-title:has(.e-n-menu-dropdown-icon[aria-expanded="true"])::before,
:is(header,div).elementor-location-header .lij-header-bar .e-n-menu-title.e-current::before {
    opacity: 1 !important;
}

:is(header,div).elementor-location-header .lij-header-bar .e-n-menu-title:has(.e-n-menu-dropdown-icon[aria-expanded="true"]),
:is(header,div).elementor-location-header .lij-header-bar .e-n-menu-title:has(.e-n-menu-dropdown-icon[aria-expanded="true"]) .e-n-menu-title-container,
:is(header,div).elementor-location-header .lij-header-bar .e-n-menu-title:has(.e-n-menu-dropdown-icon[aria-expanded="true"]) span,
:is(header,div).elementor-location-header .lij-header-bar .e-n-menu-title.e-current,
:is(header,div).elementor-location-header .lij-header-bar .e-n-menu-title.e-current .e-n-menu-title-container,
:is(header,div).elementor-location-header .lij-header-bar .e-n-menu-title.e-current span {
    color: var(--lij-on-cream) !important;
}


/* =============================================================================
   13. MENÚ MÓVIL v3 — 2026-10-06
   Fuente: MobileMenu.tsx/.css, Menu.css (.menu__burger, .menu__logo) y
   MenuDropdown (layout "list") de nueva-web-lij-main-v3, medidos a 390px.
   Ajusta los valores de la sección 10 sin rehacerla; el contenido de cada
   sección vive en el popup de Elementor (post 48600).
   ============================================================================= */

/* Logo de la barra (cabecera plegada y menú abierto): 56px de alto, como
   .menu__logo en todos los anchos de v3. */
@media (max-width: 799px) {
    :is(header,div).elementor-location-header .lij-header-bar .elementor-widget-theme-site-logo img {
        height: 56px !important;
        width: auto !important;
        max-width: none !important;
    }
}

.lij-mobile-menu-logo img {
    height: 56px !important;
    width: auto !important;
    max-width: none !important;
}

/* Botón de cerrar: el mismo botón redondo crema de la hamburguesa
   (.menu__burger) con la X fina de Material Symbols (icon-close.svg) en
   rojo; un tono más oscuro al pasar el ratón o con foco. */
.lij-mobile-menu-close .elementor-icon {
    width: 40px !important;
    height: 40px !important;
    padding: 8px !important;
    border-radius: 1000px !important;
    background-color: #FFF9F5 !important;
}

.lij-mobile-menu-close .elementor-icon:hover,
.lij-mobile-menu-close .elementor-icon:focus-visible {
    background-color: #FFE8D6 !important;
}

.lij-mobile-menu-close .elementor-icon > svg,
.lij-mobile-menu-close .elementor-icon > i {
    display: none !important;
}

.lij-mobile-menu-close .elementor-icon::before {
    content: "";
    display: block;
    width: 24px;
    height: 24px;
    background-color: var(--lij-red, #ED1B2F);
    -webkit-mask: url('../images/lij/icon-close.svg') center / 100% 100% no-repeat;
    mask: url('../images/lij/icon-close.svg') center / 100% 100% no-repeat;
}

/* Secciones: el texto alineado con el buscador y las redes (16px), y la
   píldora sobresaliendo 8px a la izquierda, como v3 (.playful-btn con
   margin-left:-8px). El desplazamiento se aplica al <details> entero, no
   al texto: Elementor recorta el <details> con overflow:hidden mientras
   anima la apertura, y así la píldora nunca queda fuera de él (ver la
   nota de la sección 10). */
.lij-mobile-menu-accordion .e-n-accordion-item {
    margin-left: -8px !important;
    width: calc(100% + 8px) !important;
}

/* Flecha: el chevron de 24px de v3 (chevron-right girado), blanco, que
   apunta abajo cerrado y arriba abierto. */
.lij-mobile-menu-accordion .e-n-accordion-item-title-icon {
    display: block !important;
    flex: none;
    width: 24px !important;
    height: 24px !important;
    background-color: #FFFFFF;
    -webkit-mask: url('../images/lij/chevron-right.svg') center / 100% 100% no-repeat;
    mask: url('../images/lij/chevron-right.svg') center / 100% 100% no-repeat;
    transform: rotate(90deg);
    transition: transform 0.2s ease;
}

.lij-mobile-menu-accordion .e-n-accordion-item-title-icon > span {
    display: none !important;
}

.lij-mobile-menu-accordion .e-n-accordion-item-title[aria-expanded='true'] .e-n-accordion-item-title-icon {
    transform: rotate(-90deg);
}

@media (prefers-reduced-motion: reduce) {
    .lij-mobile-menu-accordion .e-n-accordion-item-title-icon { transition: none; }
}

/* Lista de una sección abierta (v3 .menu-list / .search-item): cada fila de
   borde a borde de la pantalla, 8px 16px de relleno, con su línea crema
   debajo; cada grupo (colecciones, categorías) con línea también arriba y
   24px entre ambos; "Ver todo" debajo, en blanco. El <details> va 8px
   corrido a la izquierda (arriba), por eso los márgenes laterales son
   distintos. */
.lij-mobile-menu-accordion .menu-list__row {
    margin: 0 -16px 0 -8px !important;
    padding: 8px 16px !important;
    border-bottom: 0.5px solid #FFF9F5 !important;
}

.lij-mobile-menu-accordion .menu-list__row:first-child,
.lij-mobile-menu-accordion .menu-list__divider + .menu-list__row {
    border-top: 0.5px solid #FFF9F5 !important;
}

.lij-mobile-menu-accordion .menu-list__divider {
    height: 24px !important;
    margin: 0 !important;
    background: none !important;
}

.lij-mobile-menu-accordion .menu-list__vertodo {
    margin-top: 24px !important;
    padding: 8px !important;
    border-radius: 8px;
}

.lij-mobile-menu-accordion .menu-list__vertodo .elementor-heading-title {
    color: var(--lij-on-red, #FFFFFF) !important;
    font-weight: 900 !important;
    font-size: 16px !important;
    line-height: 1.4 !important;
    text-decoration: none !important;
}

.lij-mobile-menu-accordion .menu-list__vertodo:hover .elementor-heading-title {
    text-decoration: underline !important;
}

/* Filas de borde a borde: Elementor les fija un 100% de ancho, así que el
   margen negativo solo las movía; se alarga el ancho para cubrir ambos
   márgenes (8px del <details> corrido + 16px del margen de página). */
.lij-mobile-menu-accordion .menu-list__row {
    width: calc(100% + 24px) !important;
    max-width: none !important;
}

/* Contenido de una sección abierta: 8px bajo el título y 16px al final
   (v3 .mobile-menu__content). */
.lij-mobile-menu-accordion .e-n-accordion-item > [role="region"] {
    padding-top: 8px !important;
    padding-bottom: 16px !important;
}

/* Cabecera plegada (<800px): logo y hamburguesa en el margen de página de
   16px, como v3 (.menu en plegado: padding 16px 16px 4px). */
@media (max-width: 799px) {
    /* Plegada: 16/4 en vertical, 76px de alto (v3 .menu bajo 800px). Por
       debajo de 768 ya lo dan los breakpoints mobile/mobile_extra del panel
       (plantilla 62); el tramo 768-799 cae en "tablet" de Elementor, que no
       tiene corte en 800, y solo se alcanza desde aquí. */
    :is(header,div).elementor-location-header .lij-header-bar {
        padding-top: 16px !important;
        padding-bottom: 4px !important;
        padding-left: 16px !important;
        padding-right: 16px !important;
        /* estilos.css:2985 (`header > header.elementor-element`, heredado)
           le resta 4px: la página empezaba en 72 bajo una cabecera de 76 y
           todo el contenido quedaba 4px más arriba que en v3. */
        margin-bottom: 0 !important;
    }

    :is(header,div).elementor-location-header .lij-header-bar .logotipo {
        padding-left: 0 !important;
    }
}

/* "Premios SM": 48px de alto como el resto de secciones (v3); la regla de la
   sección 10 sumaba 12px de relleno en el título y otros 12 en su enlace. */
.lij-mobile-menu-link .elementor-heading-title {
    padding: 0 !important;
}

/* El giro de la flecha necesita !important (Elementor pone su propio
   transform al icono del acordeón). Elementor lo coloca en absoluto con
   top:50% y lo centra con translateY(-50%); al sustituir su transform por
   el giro se perdía ese centrado y la flecha quedaba 12px por debajo del
   texto. Se conservan las dos cosas. */
.lij-mobile-menu-accordion .e-n-accordion-item-title .e-n-accordion-item-title-icon {
    top: 50% !important;
    transform: translateY(-50%) rotate(90deg) !important;
}
.lij-mobile-menu-accordion .e-n-accordion-item-title[aria-expanded="true"] .e-n-accordion-item-title-icon {
    transform: translateY(-50%) rotate(-90deg) !important;
}

/* El texto de ayuda del buscador termina en "…" en vez de cortarse a media
   palabra (v3 .search-large input / .menu__search input). */
.lij-mobile-menu-search form.woocommerce-product-search input.search-field {
    text-overflow: ellipsis;
}

/* Panel del Mega Menu 8px por debajo de su pestaña (v3 .menu-dropdown:
   top: calc(100% + 8px)); el hueco lo cubre el triángulo de seguridad de
   lij-header.js, como en v3. La posición horizontal la pone encajar(). */
:is(header,div).elementor-location-header .lij-header-bar .e-n-menu-content > .e-con {
    margin-top: 8px !important;
}

/* El envoltorio del panel (.e-n-menu-content) ocupa TODO el ancho de la
   ventana y la altura del panel, aunque solo se vea la tarjeta .e-con. Ese
   rectángulo invisible contaba como "hover": al cruzar una pestaña en
   vertical (o en diagonal) y quedar al lado de la tarjeta, Elementor
   (onMouseLeave → isMenuContentHovered, que mira .e-n-menu-content:hover)
   rechazaba el cierre que pide lij-header.js y el panel no se cerraba nunca.
   Además tapaba los clics en la página a los lados del panel. Solo la
   tarjeta recibe el ratón. */
:is(header,div).elementor-location-header .lij-header-bar .e-n-menu-content {
    pointer-events: none;
}
:is(header,div).elementor-location-header .lij-header-bar .e-n-menu-content > .e-con {
    pointer-events: auto;
}


/* La cabecera del panel de sugerencias es un <p>: el margen inferior de 16px
   del tema separaba la primera fila (v3 .search-overlay__header: sin margen). */
:is(header,div).elementor-location-header .lij-header-bar .buscador .search-overlay__header,
.lij-hero-search__field .search-overlay__header,
.buscador-resultados .search-overlay__header,
.lij-mobile-menu-search .search-overlay__header {
    margin: 0 !important;
}

/* Redes (cabecera y menú móvil) con los iconos de v3 (.social-btn img:
   icon-instagram/tiktok/youtube.svg a 24px, dibujo holgado dentro de su
   caja de 32), en lugar de los glifos de Font Awesome del widget, que
   llenaban la caja y se veían más grandes. Se elige por la red del icono
   (clase e-fab-*), así sirve a los dos sitios. Sin cambio de fondo al pasar
   el ratón, como v3. */
.lij-social .elementor-icon > svg,
.lij-social .elementor-icon > i,
.lij-mobile-menu-social .elementor-icon > svg,
.lij-mobile-menu-social .elementor-icon > i {
    display: none !important;
}

.lij-social .elementor-icon::before,
.lij-mobile-menu-social .elementor-icon::before {
    content: "";
    display: block;
    width: 24px;
    height: 24px;
    background-color: var(--lij-red, #ED1B2F);
    -webkit-mask: var(--lij-red-social) center / 100% 100% no-repeat;
    mask: var(--lij-red-social) center / 100% 100% no-repeat;
}

:is(.lij-social, .lij-mobile-menu-social):has(.e-fab-instagram, .fa-instagram) { --lij-red-social: url('../images/lij/icon-instagram.svg'); }
:is(.lij-social, .lij-mobile-menu-social):has(.e-fab-tiktok, .fa-tiktok) { --lij-red-social: url('../images/lij/icon-tiktok.svg'); }
:is(.lij-social, .lij-mobile-menu-social):has(.e-fab-youtube, .fa-youtube) { --lij-red-social: url('../images/lij/icon-youtube.svg'); }

:is(header,div).elementor-location-header .lij-header-bar .lij-social .elementor-icon:hover,
.lij-mobile-menu-social .elementor-icon:hover {
    background-color: var(--lij-cream, #FFF9F5);
}

/* Sección de la página actual en el menú móvil (lij-header.js la marca con
   .lij-seccion-actual): la misma mancha crema y texto rojo que la sección
   abierta, como v3 .playful-btn--active. */
.lij-mobile-menu-accordion .e-n-accordion-item.lij-seccion-actual > .e-n-accordion-item-title .e-n-accordion-item-title-text {
    color: var(--lij-on-cream) !important;
}

.lij-mobile-menu-accordion .e-n-accordion-item.lij-seccion-actual > .e-n-accordion-item-title .e-n-accordion-item-title-text::before {
    opacity: 1;
}

/* Mancha de las pestañas: en v3 la pestaña mide 35px (8 + 19.2 + 8) y la
   mancha, con insets de 6.67%/3.33%, queda en unos 32px. Aquí la pestaña mide
   40, así que los mismos porcentajes la hacían de 36. Mismos 32px y misma
   posición respecto al texto, en píxeles: 2.5 de diferencia de caja + 2.33
   arriba y 2.5 + 1.17 abajo. */
:is(header,div).elementor-location-header .lij-header-bar .e-n-menu-title::before {
    top: 4.83px !important;
    bottom: 3.67px !important;
}

/* "Ver todo" del Mega Menu como v3 (.menu-dropdown__all): el enlace mide lo
   que su contenido, 8px de relleno y radio 8, texto Black 16 blanco y la
   flecha fina de 16px (icon-arrow-right.svg) 4px detrás. Al pasar el ratón
   se subraya solo el texto. */
.lij-header-bar .lij-ver-todo,
.e-n-menu-content .lij-ver-todo {
    width: auto !important;
    max-width: max-content !important;
    flex: 0 0 auto !important;
    align-self: flex-start !important;
    flex-direction: row !important;
    align-items: center !important;
    gap: 4px !important;
    padding: 8px !important;
    border-radius: 8px;
    /* En su propia línea bajo la rejilla, como v3: el margen ocupa el resto
       de la fila, así no cabe junto a la última tarjeta y baja solo. */
    margin-right: calc(100% - 120px) !important;
}

.lij-ver-todo .elementor-heading-title {
    white-space: nowrap;
}

.lij-ver-todo::after {
    content: "";
    flex: none;
    width: 16px;
    height: 16px;
    background-color: currentColor;
    color: var(--lij-on-red, #FFFFFF);
    -webkit-mask: url('../images/lij/icon-arrow-right.svg') center / 100% 100% no-repeat;
    mask: url('../images/lij/icon-arrow-right.svg') center / 100% 100% no-repeat;
}

@media (hover: hover) {
    .lij-ver-todo:hover .elementor-heading-title {
        text-decoration: underline;
    }
}