/*
 * theme-fixes.css — ajustes propios del tema hijo Walking Planets.
 * NO es walking-planets.css (entregable del diseñador, se mantiene íntegro).
 * Aquí van solo parches puntuales para bugs de integración WordPress/Elementor
 * que el CSS del diseño no puede prever, bien comentados y con la causa raíz.
 */

/*
 * RETIRADO (2026-08-19, @devops): el fix temporal del footer (rejilla inline
 * `style="display:grid;grid-template-columns:1.4fr 1fr 1fr 1fr"` sin breakpoint
 * móvil) se quitó porque @build-spec sustituyó ese inline por una clase real
 * (`.wp-footer__grid`) con su propio colapso a 860px. Verificado antes de
 * retirar: `grep -c 'grid-template-columns' <html servido>` = 0, y revalidado
 * sin scroll horizontal en 390/768/1024/1440/2560 en las 5 páginas. Si
 * reapareciera scroll horizontal por este motivo, diagnosticar de nuevo con
 * `node diagnose-hscroll.js <url> "390,768,1024,1440,2560"` (en
 * private/tools/qa/) — no reponer esta regla a ciegas, puede ser otro
 * elemento u otro widget en plena reescritura de estilos inline → clases.
 */

/*
 * Red de seguridad global: overflow-x:clip en <body>.
 *
 * REGLA CRÍTICA DEL PROYECTO: overflow-x:CLIP, NUNCA hidden. `hidden` crea un
 * contenedor de scroll y rompe TODOS los position:sticky (columna de reserva del
 * tour, aside del blog, índice legal) — ya pasó una vez, ver CLAUDE.md del handoff §7.
 * Esta regla es DOCTRINA del proyecto, no depende de ningún widget: se queda
 * aunque ahora sea redundante (verificado 2026-08-19: la clase `wp-page` que
 * @team-lead añadió al <body> ya trae `overflow-x:clip` por su cuenta vía
 * walking-planets.css). Duplicar `clip` no hace daño; quitarlo si algún día
 * deja de ser redundante sí lo haría — se deja tal cual.
 */
body {
	overflow-x: clip;
}

/*
 * P0-1 (QA 2026-08-19): la cabecera sticky no se pegaba en NINGUNA de las 7 páginas
 * (>=860px) — verificado con scroll real: `top` decrecía 1:1 con el scroll, nunca
 * quedaba fijo. Causa: `position:sticky` vivía en `.wp-header` (walking-planets.css:91),
 * cuyo padre DOM es `.elementor-widget-container` — una caja que mide EXACTAMENTE lo
 * mismo que `.wp-header` (ambas ~85px, sin "recorrido" para que el sticky se desplace:
 * un elemento sticky solo puede moverse dentro de la altura de SU PADRE DOM inmediato).
 * `.elementor-location-header` (el <header> que envuelve TODO el template de Theme
 * Builder, hijo directo de <body>) sí tiene recorrido de sobra, porque su padre es
 * <body> (toda la página). Gotcha ya documentado en el knowledge del fleet
 * (hestiacp-aprendizajes.md §Elementor/Theme Builder, 2026-08-12): el sticky de una
 * cabecera de Theme Builder va en `.elementor-location-header`, nunca en un envoltorio
 * interior. `.wp-header` conserva su propio `position:sticky` (walking-planets.css, sin
 * tocar): al no tener recorrido dentro de su propio padre no hace nada por su cuenta,
 * solo viaja pegado dentro de `.elementor-location-header`, que es quien de verdad se
 * fija. Verificado con scroll real (Playwright, 3 páginas x 1440/768): `top` se queda
 * en 0 en vez de decrecer con el scroll.
 */
header.elementor-location-header {
	position: sticky;
	top: 0;
	z-index: 60;
}

/*
 * P0-2 (QA 2026-08-19), Tour (columna de reserva) y Travel Guide (aside de venta):
 * el QA diagnosticó "doble .wp-sticky anidado" en Tour, pero la causa raíz es más
 * profunda y afecta también a Guide (que solo tiene UN .wp-sticky, y tampoco pegaba).
 * `.wp-tour-grid`/`.wp-article-grid` son grids reales de 2 columnas
 * (grid-template-columns con 2 valores, walking-planets.css:216 /
 * walking-planets-extras.css:60), pero Elementor envuelve SIEMPRE los hijos de un
 * Container en un único `.e-con-inner` — así que ese wrapper (UN solo hijo) ocupa
 * entera la primera columna del grid, y dentro de él, contenido + columna sticky
 * quedan apilados EN VERTICAL en vez de en las 2 columnas (verificado con
 * getBoundingClientRect: el ancho del `.e-con-inner` coincide exacto con el primer
 * valor de grid-template-columns, y la 2ª columna queda vacía). Con todo apilado en
 * una sola columna angosta, ninguno de los dos elementos sticky tiene recorrido real
 * — venga o no duplicada la clase `wp-sticky` en el contenedor de Elementor.
 * No se toca `_elementor_data` (fuera de alcance de este fix): se "desenvuelve" el
 * wrapper de Elementor con `display:contents` — técnica CSS estándar para que sus
 * hijos (contenido + sticky) pasen a ser los ítems DIRECTOS del grid. Con eso caen
 * cada uno en su columna. Verificado con scroll real (Playwright, muestreo fino cada
 * 200px: el plateau en Tour/Guide vive en una ventana estrecha del scroll total, un
 * muestreo grueso por porcentaje de página lo salta por completo y parece "no pega").
 *
 * SEGUNDA CAUSA en Tour, descubierta al verificar (no la vio el QA): una vez
 * desenvuelto el `.e-con-inner`, la columna sticky (`.elementor-element-868ca79`, que
 * en Tour ES DIRECTAMENTE el ítem del grid) seguía sin recorrido — porque el propio
 * `align-items:start` de `.wp-tour-grid` (walking-planets.css:216) NUNCA estaba
 * ganando: `.e-con-boxed.e-flex{align-items:normal}` (Elementor `frontend.min.css`,
 * 2 clases, especificidad 0,2,0) le gana (comprobado iterando `document.styleSheets`
 * en el navegador real). Con `align-items:normal` (=stretch en grid), la columna
 * ESTIRA su propia caja para igualar la altura de la fila -> vuelve a medir lo mismo
 * que su propio contenedor, cero recorrido otra vez. Se sube la especificidad
 * repitiendo las clases reales del elemento (3 clases, 0,3,0) SOLO para
 * `.wp-tour-grid` — NO para `.wp-article-grid` (ver nota siguiente, Guide necesita
 * justo lo contrario).
 *
 * OJO — Guide necesita `align-items:normal` (el que YA gana ahí, sin tocar nada):
 * en Guide el sticky (`.wp-article-aside`) NO es el ítem del grid — está 2 niveles
 * por debajo (item del grid -> `.elementor-widget-container` -> `<aside>`). Para que
 * el `<aside>` tenga recorrido, es su ANCESTRO (el ítem del grid) el que necesita
 * estar ESTIRADO (alto, para regalarle recorrido al `<aside>` que hay dentro) —
 * exactamente lo contrario que en Tour, donde el propio ítem del grid ES el sticky y
 * necesita estar SIN estirar. Comprobado invirtiéndolo por error: forzar
 * `align-items:start` también en `.wp-article-grid` ROMPE el aside (dos requisitos
 * opuestos según la profundidad del anidado). Por eso aquí NO se toca
 * `.wp-article-grid` — se deja ganar a Elementor tal cual.
 */
.wp-tour-grid > .e-con-inner,
.wp-article-grid > .e-con-inner {
	display: contents;
}
.wp-tour-grid.e-con-boxed.e-flex {
	align-items: start;
}

/*
 * P0-2 (QA 2026-08-19), índice lateral de Legal: aquí no hay wrapper de Elementor de
 * por medio (`nav.wp-sticky` es hijo DIRECTO de `.wp-legal-layout`) — la causa es
 * otra. `.wp-legal-layout{display:grid}` (walking-planets-extras.css) no fija
 * `align-items`, así que el valor inicial de grid ("stretch") ESTIRA el <nav> hasta
 * igualar la altura de TODA la fila (la columna de contenido, mucho más alta) — el
 * propio <nav> pasa a medir lo mismo que su "recorrido" disponible, así que el sticky
 * no tiene margen para moverse (mismo síntoma de fondo que Tour/Guide: sin room,
 * aunque la causa concreta sea otra). Con `align-items:start` el <nav> conserva su
 * altura de contenido real y viaja dentro de la fila, mucho más alta. Verificado con
 * scroll real: plateau en vez de decrecer 1:1. El breakpoint de 860px que ya trae el
 * CSS del diseño (`.wp-sticky{position:static}` en móvil) no se toca: coincide con el
 * de DESIGN-TOKENS.md ("<=860px: sticky desactivado") y ya cubre 768px como táctil-
 * móvil, sin necesidad de ningún ajuste adicional aquí.
 */
.wp-legal-layout {
	align-items: start;
}

/*
 * P0-5 (QA 2026-08-19): "People who booked this also walked"
 * (wp-tour/13-related-tours.php) reutiliza `.wp-card` (sw_render_tour_card(), la
 * misma tarjeta compartida con la rejilla filtrable de Home) dentro de una sección
 * `.wp-section--light`. `.wp-card` está pensada solo para fondo OSCURO
 * (walking-planets.css:185, color:var(--wp-white)) y no existe ninguna variante clara
 * en el catálogo del proyecto (CSS-CLASSES.md no documenta `.wp-card--light`; el único
 * modificador real, `.wp-card--article`, solo cambia ratio/tamaño — no color — y
 * además se usa en wp-guides/04-articles-grid.php también sobre fondo oscuro).
 * El título (`.wp-card__title`, sin color propio) ya queda resuelto por el fix
 * general de P1-2 (`.wp-section--light a:not(.wp-btn)`, walking-planets-extras.css):
 * `.wp-card` es un <a>, y el <h3> hereda su color. Quedan sin cubrir los dos nodos con
 * color EXPLÍCITO propio (no heredan de la regla de enlaces):
 *  - `.wp-card__text` (rgba(255,255,255,.65)) -> ratio ~1:1 sobre blanco, invisible.
 *  - `.wp-card__price` (var(--wp-cyan)) -> 2.51:1, no pasa ni el mínimo 3:1.
 * Mismo patrón "acento legible sobre blanco" que ya usa el resto del proyecto (ver
 * --wp-cyan-ink, walking-planets.css:17): texto secundario a --wp-ink-soft (el mismo
 * tono que .wp-article-body>p), precio/acento a --wp-cyan-ink. Contraste verificado
 * sobre blanco con la fórmula WCAG real: ink-soft ~8.6:1, cyan-ink ~5.49:1 — ambos
 * pasan AA con margen (mínimo 4.5:1 texto normal).
 */
.wp-section--light .wp-card__text {
	color: var(--wp-ink-soft);
}
.wp-section--light .wp-card__price {
	color: var(--wp-cyan-ink);
}

/*
 * URGENTE (2026-08-19, reportado por el cliente vía WhatsApp — captura
 * private/Captura de pantalla 2026-08-19 130405.png): tres elementos en ROSA
 * ("hay varios de estos así … hay que ponerle que resalte en el amarillo") —
 * chips del filtro de tours (Home #experiences), chips de motivo del
 * formulario de Contacto y la fila abierta del acordeón FAQ de Tour.
 *
 * CAUSA RAÍZ ÚNICA, ya documentada en este mismo proyecto para el botón CLOSE
 * del menú móvil (walking-planets-extras.css §30e) y en el knowledge del
 * fleet (hestiacp-aprendizajes-web.md §Elementor): el reset.css de Hello
 * Elementor (tema padre) trae
 * `[type=button]:focus,[type=button]:hover,[type=submit]:focus,
 * [type=submit]:hover,button:focus,button:hover{background-color:#c36;
 * color:#fff}` — especificidad (0 id, 1 clase-tier [la pseudo-clase], 1
 * elemento) = 0,1,1. `.wp-chip` (walking-planets.css:202, sin `.is-active`)
 * y `.wp-faq__q` (walking-planets.css:221) son de una sola clase = 0,1,0:
 * pierden. `.wp-chip.is-active` (0,2,0) SÍ gana — por eso el chip activo
 * (ya en cian) no se veía afectado, y solo lo reportaba el cliente en los
 * chips NO activos y en la fila del FAQ recién abierta (que en Chrome se
 * queda con :focus tras el clic real, no solo con :hover).
 *
 * Verificado con Playwright real (no a ojo): `.wp-chip` no-activo en HOVER
 * daba `background-color: rgb(220, 116, 151)` (mezcla transición hacia
 * #CC3366) y en :focus persistente `rgb(204, 51, 102)` exacto; `.wp-faq__q`
 * igual, con el añadido de que el `:focus` posterior al clic real NO
 * desaparece al mover el ratón fuera (botón nativo, mantiene el foco).
 *
 * Diseño consultado en su ESTADO RENDERIZADO (Playwright vía file://,
 * `private/design/design-reference/*.dc.html`), no en la descripción:
 *  - `chip(k){ return this.state.intent===k ? '#00B2D8' : '#FFFFFF' }`
 *    (Walking Planets Home.dc.html): el diseño NO define ningún hover propio
 *    para los chips — solo activo (cian) / inactivo (blanco), texto siempre
 *    #071C33 (navy). El resaltado en amarillo del hover es petición EXPLÍCITA
 *    del cliente en esta misma ronda, y coincide con el patrón YA establecido
 *    en el resto del proyecto para elementos cian (`.wp-btn--primary:hover`,
 *    walking-planets.css:83 → `background:var(--wp-yellow)`): se replica el
 *    mismo lenguaje visual, no se inventa uno nuevo.
 *  - `.wp-faq__q` (Tour Sagrada Familia.dc.html): el `<button>` de cada
 *    pregunta es SIEMPRE `background:none`, sin excepción por estado
 *    (abierta/cerrada/hover) — 5 preguntas, 0 con fondo. La corrección aquí
 *    es NEUTRALIZAR al valor real del diseño (transparente), no inventar un
 *    resaltado que el diseño no pide.
 *
 * Mismo patrón que 30e de walking-planets-extras.css (clase+pseudo-clase =
 * 0,2,0, gana a la regla del tema padre sin !important). Purga de caché de
 * Elementor no aplica (CSS de tema, no de Elementor).
 */
.wp-chip:hover,.wp-chip:focus{background:var(--wp-yellow);color:var(--wp-navy)}
.wp-chip.is-active:hover,.wp-chip.is-active:focus{background:var(--wp-cyan);color:var(--wp-navy)}
.wp-faq__q:hover,.wp-faq__q:focus{background:none;color:var(--wp-white)}

/*
 * URGENTE (2026-08-19), Tour: "WHAT MAKES IT OURS" (wp-tour/05-highlights.php,
 * lista `.wp-list--numbered--highlights`) casi ilegible sobre el fondo navy
 * — reportado por el cliente en la misma captura.
 *
 * Causa: `.wp-list--numbered li>span:last-child{color:var(--wp-ink)}`
 * (walking-planets-extras.css:210, base COMPARTIDA con el índice de Legal,
 * pensada para "texto largo sobre BLANCO" — var(--wp-ink)=#2E4457) es la
 * única regla que alcanza el texto de cada punto; la sección 21.x de ese
 * mismo fichero ya corrige el <strong> a blanco
 * (`.wp-list--numbered--highlights strong{color:var(--wp-white)}`) pero deja
 * el span normal sin cubrir. Contraste real medido: #2E4457 sobre #071C33 =
 * **1.70:1** (falla AA de sobra).
 *
 * Valor correcto verificado en el diseño RENDERIZADO (Playwright vía
 * file://, Tour Sagrada Familia.dc.html): el <span> de cada punto no lleva
 * `color` propio → hereda el blanco por defecto del documento
 * (`getComputedStyle(body).color` = `rgb(255,255,255)`), igual que el
 * <strong> ya corregido — no es un tono atenuado tipo rgba(255,255,255,.7)
 * como el resto de párrafos de esa sección (esos SÍ llevan su rgba propio en
 * el diseño; este span no lleva ninguno). Ratio tras el fix: **17.17:1**
 * (12,75:1 desde la paleta clara del 2026-08-26 — sigue muy por encima de AA).
 *
 * Especificidad: la base pierde por empate con la regla nueva si esta
 * cargara ANTES (mismo 0,2,2: 2 clases/pseudo + 2 elementos) — se repite la
 * clase `--highlights` para subir a 0,3,2 y ganar sin depender del orden de
 * encolado ni de !important (misma técnica que P0-3 del fix de contraste,
 * `.wp-form.wp-form...`).
 */
.wp-list--numbered--highlights.wp-list--numbered--highlights li>span:last-child{color:var(--wp-white)}

/*
 * Legal.dc.html no anima NADA en esa página (auditado: no registra ningún `reveal` de
 * scroll, a diferencia de Home/About/Contact/Tour/Guide/Travel Guides, que sí lo hacen).
 * El widget compartido global/cta-banner.php (Home #10 "Manifiesto celeste", Guide, Legal)
 * marca su H2 con `wp-reveal` incondicionalmente en su modo PHP (fuera de mi propiedad).
 * `.wp-h2--cta-legal` solo se aplica cuando `heading_scale=legal` — exclusivo de esta
 * instancia del widget en la página Legal — así que neutralizar aquí NO afecta a la
 * animación del mismo widget en Home ni en Guide/Artículo.
 * Auditoría 2026-08-19: private/.dev/frontend/2026-08-19_fix-animaciones.md.
 */
.wp-h2--cta-legal.wp-reveal {
	opacity: 1;
	transform: none;
}
