/*
 Theme Name:   Blocksy Child
 Theme URI:    https://aetheraima.com
 Description:  Tema hijo de Blocksy para AetherAI. Aloja CSS y PHP personalizados sin perderlos en actualizaciones del tema padre.
 Author:       AetherAI
 Template:     blocksy
 Version:      1.0.147
 Text Domain:  blocksy-child
*/

/* ==========================================================================
   AetherAI — CSS personalizado
   Paleta marca: verde #00D47E · navy #232643. Ver brand.md.
   ========================================================================== */

/* --------------------------------------------------------------------------
   1) Unificar acentos a la marca
   La plantilla usaba morado (#7456f1 / #5e3fde) como color de paleta 1 y 2,
   visible en el hover de las cards y bordes de botones. Se reasignan a verde.
   -------------------------------------------------------------------------- */
:root {
	--theme-palette-color-1: #00d47e !important; /* era morado #7456f1 */
	--theme-palette-color-2: #00a862 !important; /* era morado #5e3fde (hover) */
}

/* Hover de cards que se ponían moradas → verde marca */
.stk-c449828-container:hover,
.stk-f0a9bcb-container:hover,
.stk-67080b5-container:hover,
.stk-a0e5155-container:hover,
.stk-c449828-container:hover:before,
.stk-f0a9bcb-container:hover:before,
.stk-67080b5-container:hover:before,
.stk-a0e5155-container:hover:before {
	background-color: #00d47e !important;
	border-color: #00d47e !important;
}

/* Botones cuyo hover se volvía azul claro (#8ed1fc) → verde marca.
   Verde BRILLANTE #00D47E para igualar el hover de los íconos del navbar (§9). */
.stk-cb981ad .stk-button:hover,
.stk-30d92ec .stk-button:hover,
.stk-865571e .stk-button:hover {
	background: #00d47e !important;
}

/* --------------------------------------------------------------------------
   2) Logo del footer recortado
   El wrapper forzaba width:67% + height fija con "shape-stretch", recortando
   el wordmark. Se muestra completo con object-fit: contain.
   -------------------------------------------------------------------------- */
.stk-e294d05 .stk-img-wrapper {
	width: auto !important;
	height: auto !important;
	max-width: 240px !important;
	overflow: visible !important;
}
.stk-e294d05 .stk-img-wrapper img {
	width: 100% !important;
	height: auto !important;
	max-width: 100% !important;
	object-fit: contain !important;
}

/* --------------------------------------------------------------------------
   3) Copyright unificado
   La barra de copyright de Blocksy es la fuente única (texto y año fijados por
   JS en functions.php). Se oculta hasta que el JS lo prepara para evitar que
   parpadee el crédito por defecto del tema.
   -------------------------------------------------------------------------- */
.ct-footer-copyright {
	opacity: 0;
}
.ct-footer-copyright.aai-ready {
	opacity: 1;
	transition: opacity .25s ease;
}
/* Ocultar el copyright duplicado que venía incrustado en el contenido (Stackable). */
.stk-1df0ba1 {
	display: none !important;
}

/* --------------------------------------------------------------------------
   4) Formulario de contacto (WPForms): botón "Enviar" azul → verde marca
   -------------------------------------------------------------------------- */
#wpforms-5 button[type="submit"],
.wpforms-container .wpforms-submit,
.wpforms-container button[type="submit"] {
	background-color: #00d47e !important;
	border-color: #00d47e !important;
	color: #ffffff !important;
	font-style: normal !important;
	transition: background-color .2s ease !important;
}
#wpforms-5 button[type="submit"]:hover,
.wpforms-container .wpforms-submit:hover,
.wpforms-container button[type="submit"]:hover {
	background-color: #00a862 !important;
	border-color: #00a862 !important;
}

/* --------------------------------------------------------------------------
   5) Animación del hero (red de partículas)
   El canvas va al fondo del hero; el contenido queda por encima.
   -------------------------------------------------------------------------- */
.aai-hero-canvas {
	position: absolute;
	inset: 0;
	width: 100% !important;
	height: 100% !important;
	z-index: 0;
	pointer-events: none;
}
/* Contenido del hero por encima del canvas (excluyendo el propio canvas). */
.stk-242acad > *:not(.aai-hero-canvas) {
	position: relative;
	z-index: 1;
}

/* --------------------------------------------------------------------------
   6) Logo del hero: alinear arriba con la primera línea del titular,
   subirlo un poco y darle una sombra sutil (drop-shadow sigue la silueta).
   -------------------------------------------------------------------------- */
.stk-242acad > .stk-row {
	align-items: flex-start !important;
}
.stk-242acad .stk-df3537e {
	align-self: flex-start !important;
}
/* La flotación va en el CONTENEDOR (sin filtro): el navegador solo recompone una
   capa ya rasterizada al mover el transform → no re-rasteriza el drop-shadow cada
   frame, así el canvas de partículas mantiene la fluidez. */
.stk-242acad .stk-df3537e-container {
	transform: translateY(-48px);
	animation: aai-logo-float 4.5s ease-in-out infinite !important;
	will-change: transform;
}
/* El glow (filtro) va ESTÁTICO en la imagen: se rasteriza una sola vez. */
.stk-242acad .uag-image-3002 {
	max-width: 82% !important;
	height: auto !important;
	filter: drop-shadow(0 12px 22px rgba(35, 38, 67, 0.20))
		drop-shadow(0 0 18px rgba(0, 212, 126, 0.35));
}
@keyframes aai-logo-float {
	0%, 100% { transform: translateY(-48px); }
	50%      { transform: translateY(-60px); }
}
/* Fix: el navbar mobile/tablet mide 70px (una sola fila) vs 120px en desktop
   (fila de sociales + menú). El mismo pull hacia arriba (-24px margin + hasta
   -60px de flotación) que en desktop deja aire bajo el navbar, en mobile/tablet
   metía el logo DENTRO del navbar (verificado con Playwright: overlap real de
   ~52px a 375/425/768px). Se reduce el pull solo <1024px — desktop intacto.
   2026-07-06: breakpoint bajado de 1023 a 999 — medido que el navbar de
   Blocksy en realidad cambia de altura (70px→120px) en 1000px, no en 1024px
   como se asumía; con el desajuste, en 1000–1023px el navbar ya era de
   escritorio (120px) pero esta regla seguía en modo "mobile" (pull sutil),
   dejando ~90px de aire excesivo antes de saltar de golpe al pull de
   escritorio en 1024px. Alineado a 999 para que coincida exactamente con el
   breakpoint real del navbar — sin salto de layout entre 1000 y 1024px. */
@media (max-width: 999px) {
	.stk-242acad.stk-block-columns {
		margin-top: 6px !important;
	}
	.stk-242acad .stk-df3537e-container {
		transform: translateY(-8px);
		animation: aai-logo-float-mobile 4.5s ease-in-out infinite !important;
	}
}
@keyframes aai-logo-float-mobile {
	0%, 100% { transform: translateY(-8px); }
	50%      { transform: translateY(-16px); }
}
@media (prefers-reduced-motion: reduce) {
	.stk-242acad .stk-df3537e-container {
		animation: none !important;
	}
}

/* --------------------------------------------------------------------------
   7) Transición navbar → hero
   Suaviza el corte duro entre el navbar (blanco) y el fondo verde del hero
   con un degradado que arranca en blanco y se desvanece hacia el hero.
   Se reutiliza el overlay del hero (:before), que estaba invisible.
   -------------------------------------------------------------------------- */
/* Especificidad reforzada (2 clases + pseudo) para vencer el override inline de
   Stackable ".stk-242acad:before{opacity:0!important}" que carga después. */
.stk-242acad.stk-block-background::before {
	content: "" !important;
	position: absolute !important;
	top: 0 !important;
	left: 0 !important;
	right: 0 !important;
	bottom: auto !important;
	height: 340px !important;
	background: linear-gradient(
		to bottom,
		#ffffff 0%,
		#ffffff 18%,
		rgba(255, 255, 255, 0.55) 50%,
		rgba(255, 255, 255, 0) 100%
	) !important;
	opacity: 1 !important;
	z-index: 1 !important;
	pointer-events: none !important;
}

/* --------------------------------------------------------------------------
   8) Hover de los links del navbar → marca
   Línea delgada verde de marca que aparece SOLO en hover, creciendo de abajo
   hacia arriba (scaleY con origen bottom), detrás del texto (z-index:-1 +
   isolation:isolate en el link). Especificidad con .ct-header + !important
   para vencer las variables dinámicas de Blocksy.
   -------------------------------------------------------------------------- */
.ct-header .menu-item > .ct-menu-link {
	position: relative;
	isolation: isolate; /* la línea queda dentro del link, nunca tras el navbar */
	/* Texto del menú: era azul (sin identidad) → navy de marca. Se pisan las
	   variables de Blocksy para cubrir estado inicial y hover. */
	--theme-link-initial-color: #232643;
	--theme-link-hover-color: #232643;
	color: #232643 !important;
}
/* Línea delgada pegada al texto, oculta por defecto.
   El link mide toda la altura del navbar (texto centrado), así que la línea
   se ancla relativa al CENTRO (+0.85em ≈ justo bajo la última línea de texto),
   no al borde inferior del navbar. */
.ct-header .menu-item > .ct-menu-link::after {
	content: "" !important;
	position: absolute !important;
	left: 0 !important;
	right: 0 !important;
	top: calc(50% + 0.85em) !important;
	bottom: auto !important;
	width: auto !important;
	height: 3px !important;
	background-color: #00d47e !important;
	border-radius: 2px !important;
	opacity: 0;
	transform: scaleY(0);
	transform-origin: bottom center !important;
	transition: transform .4s cubic-bezier(.25, .46, .45, .94),
		opacity .3s ease !important;
	z-index: -1 !important;   /* detrás del texto: el texto se sobrepone */
	pointer-events: none !important;
}
/* Solo hover (y foco por teclado): la línea sube con fade suave. */
.ct-header .menu-item > .ct-menu-link:hover::after,
.ct-header .menu-item > .ct-menu-link:focus-visible::after {
	opacity: 1;
	transform: scaleY(1) !important;
}
/* Reduce-motion: sin animación de crecimiento; la línea aparece directa. */
@media (prefers-reduced-motion: reduce) {
	.ct-header .menu-item > .ct-menu-link::after {
		transition: none !important;
	}
}

/* --------------------------------------------------------------------------
   8b) Ruta activa en desktop ("estás aquí") — 2026-07-09
   WordPress/Blocksy ya marca el ítem del menú correspondiente a la ruta
   actual con `.current-menu-item` de forma nativa (sin JS). El panel MÓVIL
   ya tenía este lenguaje resuelto desde sesión 6 (texto verde de marca +
   marcador permanente, decisión explícita de no depender solo del color).
   Desktop hasta ahora solo tenía la línea de §8 en :hover — sin ningún
   indicador permanente de página activa. Se reutiliza el MISMO elemento
   `::after` de §8 (deja de ser exclusivo del hover) + texto verde (mismo
   verde que usa el móvil, consistencia 1:1) + `font-weight:600` como señal
   redundante no-cromática (mismo criterio de accesibilidad del punto verde
   móvil, aquí expresado tipográficamente en vez de con un dot). La línea se
   "dibuja" una sola vez al cargar (transform/opacity, compositor — misma
   curva ease-out-expo que ya usa el resto del sitio), no queda animando en
   loop. Debe ir DESPUÉS de §8 para ganar por orden de fuente ante el
   `scaleY(0)` sin !important de la línea en reposo.
   -------------------------------------------------------------------------- */
.ct-header .current-menu-item > .ct-menu-link {
	color: #00d47e !important;
	font-weight: 600 !important;
}
.ct-header .current-menu-item > .ct-menu-link::after {
	opacity: 1 !important;
	transform: scaleY(1);
	transform-origin: bottom center !important;
	animation: aai-nav-active-in .55s cubic-bezier(.16, 1, .3, 1) both;
}
@keyframes aai-nav-active-in {
	from { opacity: 0; transform: scaleY(0); }
	to   { opacity: 1; transform: scaleY(1); }
}
@media (prefers-reduced-motion: reduce) {
	.ct-header .current-menu-item > .ct-menu-link::after {
		animation: none !important;
		opacity: 1 !important;
		transform: scaleY(1) !important;
	}
}

/* --------------------------------------------------------------------------
   9) Íconos de redes sociales del navbar: efecto "levantarse" en hover
   El ícono sube unos px sobresaliendo un poco de su caja (overflow visible +
   z-index por encima de los vecinos), con sombra suave que refuerza la
   elevación y tinte verde de marca.
   -------------------------------------------------------------------------- */
.ct-header .ct-social-box a {
	overflow: visible !important; /* que el ícono pueda sobresalir al subir */
}
.ct-header .ct-social-box a .ct-icon-container {
	display: inline-flex;
	transition: transform .3s cubic-bezier(.34, 1.56, .64, 1), /* rebote sutil */
		filter .3s ease;
}
.ct-header .ct-social-box a:hover,
.ct-header .ct-social-box a:focus-visible {
	position: relative;
	z-index: 2; /* al levantarse queda por encima de los íconos vecinos */
}
.ct-header .ct-social-box a:hover .ct-icon-container,
.ct-header .ct-social-box a:focus-visible .ct-icon-container {
	transform: translateY(-5px) scale(1.12);
	filter: drop-shadow(0 6px 8px rgba(35, 38, 67, 0.28));
}
/* Tinte verde de marca al levantarse. */
.ct-header .ct-social-box a:hover svg,
.ct-header .ct-social-box a:focus-visible svg {
	fill: #00d47e !important;
}
@media (prefers-reduced-motion: reduce) {
	.ct-header .ct-social-box a .ct-icon-container {
		transition: none !important;
	}
	.ct-header .ct-social-box a:hover .ct-icon-container,
	.ct-header .ct-social-box a:focus-visible .ct-icon-container {
		transform: none;
	}
}

/* --------------------------------------------------------------------------
   10) Entrada del hero al cargar la página (solo home)
   Secuencia escalonada: título → texto → botones suben con fade (ease-out);
   el logo entra con fade + scale sutil. Solo transform/opacity (compositor,
   sin reflow ni CLS: los elementos conservan su espacio). La entrada del logo
   va en la COLUMNA .stk-df3537e — el container ya tiene la flotación infinita
   y pisarle el transform la rompería.
   -------------------------------------------------------------------------- */
@keyframes aai-hero-rise {
	from {
		opacity: 0;
		transform: translateY(22px);
	}
	to {
		opacity: 1;
		transform: translateY(0);
	}
}
@keyframes aai-hero-logo-in {
	from {
		opacity: 0;
		transform: scale(0.94);
	}
	to {
		opacity: 1;
		transform: scale(1);
	}
}
/* Gate anti-salto (ver functions.php):
   - html.aai-js → hay JS: se ocultan los elementos del hero desde el primer
     paint (sin JS no se oculta nada).
   - html.aai-anim-ready → fuentes cargadas y layout estable: corre la
     animación sobre posiciones finales, sin reacomodos a mitad de entrada. */
html.aai-js .stk-242acad .stk-7225c59,
html.aai-js .stk-242acad .stk-81505a5,
html.aai-js .stk-242acad .stk-137f217,
html.aai-js .stk-242acad .stk-df3537e {
	opacity: 0;
}
/* Curva ease-out-expo: arranca con impulso y se asienta muy suave. */
/* Título */
html.aai-anim-ready .stk-242acad .stk-7225c59 {
	animation: aai-hero-rise 1.5s cubic-bezier(.16, 1, .3, 1) .1s both;
}
/* Texto de apoyo */
html.aai-anim-ready .stk-242acad .stk-81505a5 {
	animation: aai-hero-rise 1.5s cubic-bezier(.16, 1, .3, 1) .45s both;
}
/* Botones (se anima el GRUPO, no el botón: su hover usa transform propio) */
html.aai-anim-ready .stk-242acad .stk-137f217 {
	animation: aai-hero-rise 1.5s cubic-bezier(.16, 1, .3, 1) .8s both;
}
/* Logo (columna) */
html.aai-anim-ready .stk-242acad .stk-df3537e {
	animation: aai-hero-logo-in 1.9s cubic-bezier(.16, 1, .3, 1) .3s both;
}
@media (prefers-reduced-motion: reduce) {
	html.aai-js .stk-242acad .stk-7225c59,
	html.aai-js .stk-242acad .stk-81505a5,
	html.aai-js .stk-242acad .stk-137f217,
	html.aai-js .stk-242acad .stk-df3537e {
		animation: none !important;
		opacity: 1 !important;
	}
}

/* --------------------------------------------------------------------------
   11) Scroll premium (todas las rutas)
   a) Reveal suave de secciones al entrar en viewport (clase .aai-reveal la
      pone aai-reveal.js SOLO en secciones bajo el fold — sin JS no se oculta
      nada). Misma curva expo del hero para un lenguaje de movimiento único.
   b) Scroll con anclas suave + margen para el header pegajoso.
   -------------------------------------------------------------------------- */
html {
	scroll-behavior: smooth;
	scroll-padding-top: 110px; /* que las anclas no queden bajo el navbar */
}
.aai-reveal {
	opacity: 0;
	transform: translateY(26px);
	transition:
		opacity 1s cubic-bezier(.16, 1, .3, 1),
		transform 1s cubic-bezier(.16, 1, .3, 1);
}
.aai-reveal.aai-in {
	opacity: 1;
	transform: none;
}
@media (prefers-reduced-motion: reduce) {
	html {
		scroll-behavior: auto;
	}
	.aai-reveal {
		opacity: 1 !important;
		transform: none !important;
		transition: none !important;
	}
}

/* --------------------------------------------------------------------------
   12) Formulario de contacto (WPForms #5, /contact) — rediseño premium
   Card elevada + labels arriba (sin itálica) + focus ring verde + estados.

   Contexto verificado contra el HTML servido (2026-07-03):
   - El form vive en la card Stackable `.stk-fd1d077-container`, que trae
     inline (en el <body>, después de este CSS): background #FAFBFC y
     box-shadow 0 0 30px #7bdcb5 !important → se vence con 2 clases de
     especificidad (.stk-fd1d077 .stk-fd1d077-container) + !important.
   - Las labels principales usan `wpforms-label-hide` (accesibles, solo
     lectores de pantalla). Las visibles eran las SUBLABELS colocadas DESPUÉS
     del input, en itálica por blocksy/static/bundle/wpforms.min.css
     (.wpforms-field-sublabel{font-style:italic}). Aquí se promueven a labels
     reales: arriba del campo (flex order), peso 600, sin itálica.
   - El textarea (field_2) mostraba placeholder + description con texto casi
     idéntico ("consulta de interés" duplicada). La description pasa a ser la
     label visible arriba (además su texto no tiene el typo "de gustaría" que
     sí tiene la label oculta); el placeholder queda como ayuda tenue.
   - La sección 4 (botón Enviar verde) queda cubierta y ampliada por 12g:
     mismos colores de marca, ahora con lift + sombra. Puede dejarse o
     retirarse; no entra en conflicto (12g tiene mayor especificidad).
   Solo se anima transform/opacity/color/sombra — nada de layout.
   -------------------------------------------------------------------------- */

/* --- 12a) Card contenedora: elevación real en vez del glow menta -------- */
.stk-fd1d077 .stk-fd1d077-container {
	/* Tira superior de acento verde pintada como background (se recorta sola
	   con el border-radius, sin pseudo-elementos que Stackable pueda pisar). */
	background:
		linear-gradient(90deg, #00d47e, #00a862) top / 100% 4px no-repeat,
		#ffffff !important;
	background-color: #ffffff !important;
	border: 1px solid rgba(35, 38, 67, 0.07) !important;
	border-radius: 20px !important;
	box-shadow:
		0 1px 2px rgba(35, 38, 67, 0.05),
		0 6px 16px rgba(35, 38, 67, 0.07),
		0 24px 48px -12px rgba(35, 38, 67, 0.14) !important;
	padding: clamp(1.5rem, 2.5vw + 0.75rem, 3rem) !important;
	max-width: 780px;
	margin-left: auto !important;
	margin-right: auto !important;
}
/* El ::before de Stackable (overlay de fondo, #FAFBFC inline) se alinea a la
   card: blanco y con el mismo radio para no tapar la tira verde ni las esquinas. */
.stk-fd1d077 .stk-fd1d077-container::before {
	background: transparent !important;
	background-color: transparent !important;
	border-radius: inherit !important;
}
@media (max-width: 689px) {
	.stk-fd1d077 .stk-fd1d077-container {
		/* El inline de Stackable deja 0.44rem; un poco más de aire en 375px. */
		margin-left: 1rem !important;
		margin-right: 1rem !important;
	}
}

/* --- 12b) Encabezado del form ------------------------------------------- */
#wpforms-5 .wpforms-head-container {
	padding: 0 0 1.75rem !important;
}
#wpforms-5 .wpforms-title {
	font-family: "Poppins", "Inter", system-ui, sans-serif !important;
	font-weight: 700 !important;
	font-style: normal !important;
	color: #232643 !important;
	font-size: clamp(1.1rem, 0.9rem + 1vw, 1.45rem) !important;
	line-height: 1.45 !important;
	letter-spacing: 0.01em;
	margin: 0 !important;
}

/* --- 12c) Labels visibles ARRIBA del campo, sin itálica ------------------ */
/* Las sublabels ("Nombre", "Apellidos", "Correo electrónico", "Confirmar el
   correo electrónico") suben sobre su input vía flex order. Las legends
   ocultas (sr-only) no se tocan: siguen disponibles para lectores de pantalla. */
#wpforms-5 .wpforms-field-row-block {
	display: flex;
	flex-direction: column;
}
#wpforms-5 .wpforms-field-sublabel {
	order: -1; /* antes del input, aunque el DOM la tenga después */
	font-family: "Inter", "Inter Tight", system-ui, sans-serif;
	font-style: normal !important; /* pisa la itálica del bundle de Blocksy */
	font-weight: 600 !important;
	font-size: 0.875rem !important;
	line-height: 1.4;
	color: #232643 !important;
	margin: 0 0 0.5rem !important;
}
/* Textarea: la description (texto correcto, sin typo) pasa a ser la label
   visible arriba; se elimina el efecto de "pregunta duplicada" debajo. */
#wpforms-5 .wpforms-field-textarea {
	display: flex;
	flex-direction: column;
}
#wpforms-5 .wpforms-field-textarea .wpforms-field-description {
	order: -1;
	font-family: "Inter", "Inter Tight", system-ui, sans-serif;
	font-style: normal !important;
	font-weight: 600 !important;
	font-size: 0.875rem !important;
	line-height: 1.5;
	color: #232643 !important;
	margin: 0 0 0.5rem !important;
}

/* --- 12d) Ritmo vertical entre campos ------------------------------------ */
#wpforms-5 .wpforms-field {
	padding: 0 !important;
	margin: 0 0 1.4rem !important;
}

/* --- 12e) Inputs y textarea: definición, altura táctil y focus verde ----- */
#wpforms-5 .wpforms-field input[type="text"],
#wpforms-5 .wpforms-field input[type="email"],
#wpforms-5 .wpforms-field textarea {
	width: 100% !important;
	min-height: 48px !important; /* target táctil ≥44px */
	padding: 12px 16px !important;
	font-family: "Inter", "Inter Tight", system-ui, sans-serif !important;
	font-size: 1rem !important;
	font-style: normal !important;
	line-height: 1.5 !important;
	color: #232643 !important;
	background-color: #f7f9fb !important; /* fondo sutilmente diferenciado */
	border: 1px solid rgba(35, 38, 67, 0.18) !important;
	border-radius: 10px !important;
	box-shadow: none !important;
	transition:
		border-color 0.25s ease,
		background-color 0.25s ease,
		box-shadow 0.25s ease !important;
}
#wpforms-5 .wpforms-field textarea {
	min-height: 150px !important;
	resize: vertical;
}
#wpforms-5 .wpforms-field input[type="text"]:hover,
#wpforms-5 .wpforms-field input[type="email"]:hover,
#wpforms-5 .wpforms-field textarea:hover {
	border-color: rgba(35, 38, 67, 0.34) !important;
}
/* Ring de foco verde marca, visible también navegando con teclado. */
#wpforms-5 .wpforms-field input[type="text"]:focus,
#wpforms-5 .wpforms-field input[type="email"]:focus,
#wpforms-5 .wpforms-field textarea:focus {
	outline: 2px solid transparent !important; /* traza en modo alto contraste */
	outline-offset: 2px;
	border-color: #00d47e !important;
	background-color: #ffffff !important;
	box-shadow: 0 0 0 3px rgba(0, 212, 126, 0.22) !important;
}
/* Placeholder más tenue que el texto, nunca itálica. */
#wpforms-5 .wpforms-field input::placeholder,
#wpforms-5 .wpforms-field textarea::placeholder {
	color: rgba(35, 38, 67, 0.42) !important;
	font-style: normal !important;
	opacity: 1;
}

/* Fallback de apilado en pantallas angostas (WPForms moderno ya apila las
   mitades Nombre/Apellidos vía container queries; esto cubre navegadores
   viejos sin soporte). */
@media (max-width: 480px) {
	#wpforms-5 .wpforms-field-row .wpforms-field-row-block.wpforms-one-half {
		width: 100% !important;
		padding: 0 !important;
	}
	#wpforms-5 .wpforms-field-row .wpforms-field-row-block.wpforms-one-half:not(:last-child) {
		margin-bottom: 1.4rem;
	}
}

/* --- 12f) Estados de error de WPForms a la marca ------------------------- */
#wpforms-5 em.wpforms-error,
#wpforms-5 label.wpforms-error {
	color: #d63637 !important;
	font-size: 0.8125rem !important;
	font-weight: 500 !important;
	font-style: normal !important;
	margin-top: 0.4rem;
}
#wpforms-5 .wpforms-field input.wpforms-error,
#wpforms-5 .wpforms-field input.user-invalid,
#wpforms-5 .wpforms-field textarea.wpforms-error,
#wpforms-5 .wpforms-field textarea.user-invalid {
	border-color: #d63637 !important;
	background-color: #fff8f8 !important;
	box-shadow: 0 0 0 3px rgba(214, 54, 55, 0.12) !important;
}
/* Resumen de error general (arriba del form / bajo el submit). */
#wpforms-5 .wpforms-error-container {
	background: rgba(214, 54, 55, 0.06);
	border: 1px solid rgba(214, 54, 55, 0.35);
	border-radius: 10px;
	padding: 0.85rem 1.1rem !important;
	font-weight: 500;
}

/* Confirmación de envío (AJAX) en verde marca. */
#wpforms-5 .wpforms-confirmation-container-full,
#wpforms-5 .wpforms-confirmation-container {
	background: rgba(0, 212, 126, 0.08) !important;
	border: 1px solid rgba(0, 212, 126, 0.4) !important;
	border-radius: 12px !important;
	padding: 1.25rem 1.5rem !important;
	color: #232643 !important;
	font-family: "Inter", "Inter Tight", system-ui, sans-serif;
	font-weight: 500;
}

/* --- 12g) Botón Enviar: presencia + lift sutil ---------------------------
   Amplía la sección 4 (mismos colores marca); mayor especificidad para
   redefinir la transition e incluir transform/box-shadow. */
#wpforms-5 .wpforms-submit-container {
	padding: 0.4rem 0 0 !important;
}
#wpforms-5 .wpforms-submit-container button.wpforms-submit {
	font-family: "Poppins", "Inter", system-ui, sans-serif !important;
	font-weight: 600 !important;
	font-size: 1rem !important;
	letter-spacing: 0.02em;
	color: #ffffff !important;
	background-color: #00d47e !important;
	border: none !important;
	border-radius: 10px !important;
	min-height: 50px;
	padding: 13px 38px !important;
	cursor: pointer;
	box-shadow: 0 4px 14px rgba(0, 212, 126, 0.35);
	transition:
		transform 0.35s cubic-bezier(0.16, 1, 0.3, 1),
		box-shadow 0.35s cubic-bezier(0.16, 1, 0.3, 1),
		background-color 0.2s ease !important;
}
#wpforms-5 .wpforms-submit-container button.wpforms-submit:hover {
	background-color: #00a862 !important;
	transform: translateY(-2px);
	box-shadow: 0 8px 22px rgba(0, 168, 98, 0.4);
}
#wpforms-5 .wpforms-submit-container button.wpforms-submit:active {
	transform: translateY(0);
	box-shadow: 0 3px 10px rgba(0, 168, 98, 0.35);
}
#wpforms-5 .wpforms-submit-container button.wpforms-submit:focus-visible {
	outline: 2px solid transparent;
	box-shadow:
		0 0 0 2px #ffffff,
		0 0 0 5px rgba(0, 212, 126, 0.55);
}
/* Durante el envío AJAX (botón deshabilitado + spinner): sin lift. */
#wpforms-5 .wpforms-submit-container button.wpforms-submit[disabled] {
	opacity: 0.7;
	transform: none;
	cursor: wait;
}
/* En móvil el botón ocupa todo el ancho: target táctil generoso. */
@media (max-width: 600px) {
	#wpforms-5 .wpforms-submit-container button.wpforms-submit {
		width: 100%;
	}
}

/* --- 12h) Reduce motion: sin transiciones ni lift ------------------------ */
@media (prefers-reduced-motion: reduce) {
	#wpforms-5 .wpforms-field input[type="text"],
	#wpforms-5 .wpforms-field input[type="email"],
	#wpforms-5 .wpforms-field textarea,
	#wpforms-5 .wpforms-submit-container button.wpforms-submit {
		transition: none !important;
	}
	#wpforms-5 .wpforms-submit-container button.wpforms-submit:hover,
	#wpforms-5 .wpforms-submit-container button.wpforms-submit:active {
		transform: none;
	}
}


/* ==========================================================================
   13) Chat n8n a marca + Página de Precios (Agente 3)
   ========================================================================== */
/* ==========================================================================
   AetherAI — Agente 3: Chat n8n a marca + Página de Precios premium
   Destino: wp-content/themes/blocksy-child/style.css (append + subir versión)
   Verificado contra el HTML/CSS servido el 2026-07-03.
   Paleta: verde #00D47E · verde oscuro #00A862 · navy #232643 · blanco.
   Curva de movimiento del sitio: cubic-bezier(.16,1,.3,1).
   ========================================================================== */

/* --------------------------------------------------------------------------
   A) CHAT AETHY (@n8n/chat) — tintado a marca
   ----------------------------------------------------------------------------
   POR QUÉ ESTABA ROSA: el CSS del CDN (cdn.jsdelivr.net/npm/@n8n/chat) define
   --chat--color--primary:#e74266 (rosa n8n) con DOBLE guión antes de "primary".
   El CSS que ya existe en el Customizer ("AETHY CHATBOT CUSTOM STYLES") usa los
   nombres VIEJOS con guión simple (--chat--color-primary) → no afecta al toggle
   ni a los botones. Además el <link> del CDN se imprime en el body (snippet
   WPCode "N8N CHAT AETHY"), DESPUÉS del CSS del tema, así que un :root del tema
   perdería por orden de cascada.
   ESTRATEGIA: declarar las variables en `body` — una custom property definida
   en body le gana por proximidad de herencia a la definida en :root por el CDN,
   sin importar el orden de carga. !important solo como cinturón de seguridad
   frente al bloque :root !important del Customizer.
   Nombres verificados contra el CSS real del CDN (ojo a la inconsistencia del
   propio n8n: `-shade-50` con guión simple pero `--shade-100` con doble).
   -------------------------------------------------------------------------- */
body {
	/* Primario (toggle flotante, acciones de mensaje, hover del botón cerrar) */
	--chat--color--primary: #00d47e !important;
	--chat--color--primary-shade-50: #00a862 !important;   /* hover del toggle */
	--chat--color--primary--shade-100: #00915a !important; /* toggle activo */

	/* Secundario (burbuja del usuario, botón "Iniciar conversación", send) */
	--chat--color--secondary: #232643 !important;
	--chat--color-secondary-shade-50: #1a1d33 !important;  /* hover */

	/* Neutros (estos nombres con guión simple SÍ son los actuales) */
	--chat--color-dark: #232643 !important;   /* header hereda de aquí */
	--chat--color-light: #f6f9f8 !important;  /* fondo del cuerpo del chat */
	--chat--color-typing: #232643 !important;

	/* Header — navy sólido, texto blanco */
	--chat--header--background: #232643 !important;
	--chat--header--color: #ffffff !important;
	--chat--heading--font-size: 1.375em !important; /* 2em desbordaba en 400px */

	/* Toggle flotante — verde marca; ícono navy (blanco sobre #00D47E no pasa
	   el contraste 3:1 de componentes UI; navy da ~7:1) */
	--chat--toggle--background: #00d47e !important;
	--chat--toggle--hover--background: #00a862 !important;
	--chat--toggle--active--background: #00915a !important;
	--chat--toggle--color: #232643 !important;

	/* Burbujas */
	--chat--message--user--background: #232643 !important;
	--chat--message--user--color: #ffffff !important;
	--chat--message--bot--background: #ffffff !important;
	--chat--message--bot--color: #232643 !important;

	/* Botón de bienvenida "Iniciar conversación" — verde con texto navy (AA) */
	--chat--button--background--primary: #00d47e !important;
	--chat--button--color--primary: #232643 !important;
	--chat--button--background--primary--hover: #00a862 !important;
	--chat--button--color--primary--hover: #232643 !important;

	/* Botón enviar del input */
	--chat--input--send--button--color: #00a862 !important;
	--chat--input--send--button--background-hover: rgba(0, 212, 126, 0.12) !important;
	--chat--input--send--button--color-hover: #00915a !important;

	/* Detalles de marca */
	--chat--close--button--color-hover: #00d47e !important;
	--chat--message--actions--color: #00a862 !important;

	/* Acabado premium: radios y borde de la ventana */
	--chat--window--border: 1px solid rgba(35, 38, 67, 0.10) !important;
	--chat--window--border-radius: 16px !important;
	--chat--message--border-radius: 12px !important;
	--chat--button--border-radius: 10px !important;

	/* Tipografía de marca (Inter ya carga en el sitio; fallback de sistema) */
	--chat--font-family: 'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI',
		Roboto, sans-serif !important;
}

/* Cinturón de seguridad para la pieza más visible (el toggle rosa): regla
   directa sobre la clase real .chat-window-toggle por si n8n vuelve a renombrar
   variables en una futura versión del CDN. */
body .chat-window-toggle {
	background: #00d47e !important;
	color: #232643 !important;
	box-shadow: 0 6px 20px rgba(0, 212, 126, 0.35),
		0 2px 6px rgba(35, 38, 67, 0.18) !important;
	transition: transform 0.35s cubic-bezier(0.16, 1, 0.3, 1),
		background 0.2s ease !important;
}
body .chat-window-toggle:hover {
	background: #00a862 !important;
	transform: translateY(-3px);
}
body .chat-window-toggle:active {
	background: #00915a !important;
}

/* --------------------------------------------------------------------------
   B) PÁGINA DE PRECIOS (/pricing) — card premium + ícono positivo
   ----------------------------------------------------------------------------
   La "card" central es un bloque stackable/notification (stk-c11e9a3) con
   clases stk--is-warning + stk--is-dismissible. Stackable imprime su CSS
   inline en el <body> con !important, así que cada override usa MÁS clases
   que el selector inline correspondiente (anotado en cada regla).
   -------------------------------------------------------------------------- */

/* --- B1. Card principal ---------------------------------------------------
   Inline a batir: .stk-c11e9a3{box-shadow:0 2px 30px 1px #8ed1fc !important}
   (1 clase → uso 2). Se reemplaza el glow azul por sombra en capas tintada
   navy + halo verde de marca, radio consistente y micro-lift en hover. */
.stk-block-notification.stk-c11e9a3 {
	position: relative !important;
	background: #ffffff !important;
	border: 1px solid rgba(35, 38, 67, 0.07) !important;
	border-radius: 20px !important;
	overflow: hidden !important;
	box-shadow:
		0 1px 2px rgba(35, 38, 67, 0.05),
		0 8px 24px rgba(35, 38, 67, 0.08),
		0 24px 48px -16px rgba(0, 212, 126, 0.22) !important;
	transition:
		transform 0.5s cubic-bezier(0.16, 1, 0.3, 1),
		box-shadow 0.5s cubic-bezier(0.16, 1, 0.3, 1) !important;
	/* La var del contenedor la fija .stk--is-warning en #ffdd57 (amarillo) y
	   la usa el borde :before del CTA → se re-declara a verde marca. */
	--stk-container-background-color: #00d47e;
}

/* Barra de acento superior — señal de "plan destacado" (::after para no
   chocar con los ::before que Stackable usa para fondos). */
.stk-block-notification.stk-c11e9a3::after {
	content: '';
	position: absolute;
	top: 0;
	left: 0;
	right: 0;
	height: 5px;
	background: linear-gradient(90deg, #00d47e 0%, #00a862 100%);
	pointer-events: none;
}

/* Lift sutil solo en dispositivos con puntero (no en táctil 3G) */
@media (hover: hover) {
	.stk-block-notification.stk-c11e9a3:hover {
		transform: translateY(-6px);
		box-shadow:
			0 2px 4px rgba(35, 38, 67, 0.05),
			0 16px 32px rgba(35, 38, 67, 0.10),
			0 32px 64px -16px rgba(0, 212, 126, 0.30) !important;
	}
}

/* Respiración interna: 32px va bien en móvil; más aire en desktop.
   Inline a batir: .stk-c11e9a3 .stk-block-notification__content (2 clases → 3) */
@media (min-width: 690px) {
	.stk-block-notification.stk-c11e9a3 .stk-block-notification__content {
		padding: 48px 56px !important;
	}
}

/* Ocultar el botón X del bloque notification: una card de precios no debe
   ser descartable (Stackable la oculta y persiste el cierre — el visitante
   perdería todo el contenido y el CTA de la página). */
.stk-block-notification.stk-c11e9a3 .stk-block-notification__close-button {
	display: none !important;
}

/* --- B2. Ícono: de alerta a positivo ---------------------------------------
   El símbolo se corrige con el filtro render_block de agent3-chat-pricing.php
   (exclamation-triangle → check-circle). Aquí: color de marca + chip circular
   verde suave, más contenido que un ícono gigante suelto de 100px.
   Inline a batir: .stk-8366c77 .stk--svg-wrapper .stk--inner-svg svg:last-child
   {height/width:100px; fill:navy} (3 clases → uso 4). */
.stk-c11e9a3 .stk-8366c77 .stk--svg-wrapper .stk--inner-svg {
	display: inline-flex !important;
	align-items: center !important;
	justify-content: center !important;
	width: 96px !important;
	height: 96px !important;
	padding: 0 !important;
	border-radius: 50% !important;
	background: rgba(0, 212, 126, 0.12) !important;
}
/* Vía SOLO-CSS (no se desplegó PHP render_block): se OCULTA el triángulo de
   advertencia y se pinta un check dentro del chip → el símbolo de "error"
   desaparece por completo, no solo cambia de color. */
.stk-c11e9a3 .stk-8366c77 .stk--svg-wrapper .stk--inner-svg svg:last-child {
	display: none !important;
}
.stk-c11e9a3 .stk-8366c77 .stk--svg-wrapper .stk--inner-svg::after {
	content: '';
	width: 48px;
	height: 48px;
	background: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 512 512'%3E%3Cpath fill='%2300A862' d='M504 256c0 136.967-111.033 248-248 248S8 392.967 8 256 119.033 8 256 8s248 111.033 248 248zM227.314 387.314l184-184c6.248-6.248 6.248-16.379 0-22.627l-22.627-22.628c-6.248-6.248-16.379-6.249-22.628 0L216 308.118l-70.059-70.059c-6.248-6.248-16.379-6.248-22.628 0l-22.627 22.628c-6.248 6.248-6.248 16.379 0 22.627l104 104c6.249 6.249 16.379 6.249 22.628 0z'/%3E%3C/svg%3E") center / contain no-repeat;
}

/* --- B3. CTA "Agenda tu cita ahora" -----------------------------------------
   Inline a batir: .stk-0ce6830 .stk-button{background:#00d084} y
   .stk-0ce6830 .stk-button:hover:after{background:#7bdcb5} (2 clases → 3).
   Verde marca exacto + texto navy bold (AA ~7:1; blanco sobre #00D47E no
   pasa 4.5:1) y hover a verde oscuro con el lift-scale que el botón ya trae. */
.stk-832e1d5 .stk-0ce6830 .stk-button {
	background: #00d47e !important;
	border-radius: 12px !important;
	box-shadow: 0 4px 14px rgba(0, 212, 126, 0.35) !important;
}
.stk-832e1d5 .stk-0ce6830 .stk-button .stk-button__inner-text {
	color: #232643 !important;
	font-weight: 700 !important;
}
.stk-832e1d5 .stk-0ce6830 .stk-button .stk--inner-svg svg,
.stk-832e1d5 .stk-0ce6830 .stk-button .stk--inner-svg svg :is(g, path) {
	fill: #232643 !important;
}
/* El "hover" de Stackable es un ::after que se superpone: era mint #7bdcb5 */
.stk-832e1d5 .stk-0ce6830 .stk-button:hover:after {
	background: #00c274 !important;
	opacity: 1 !important;
}
/* Borde interior :before heredaba el amarillo warning → ya resuelto con la
   var re-declarada en B1; refuerzo explícito por si el bloque se mueve. */
.stk-832e1d5 .stk-0ce6830 .stk-button:before {
	border-color: #00a862 !important;
}
/* Foco visible con teclado */
.stk-832e1d5 .stk-0ce6830 .stk-button:focus-visible {
	outline: 3px solid #00a862 !important;
	outline-offset: 3px !important;
}

/* --- B4. Refinamiento del encabezado de la página ---------------------------
   El h1 y el h4 llevan text-shadow 6px 6px 4px gris (inline, 2 clases → 3):
   sombra dura que abarata el conjunto. Tipografía limpia = premium. */
.stk-9d25175 .stk-cf02387 .stk-block-heading__text,
.stk-9d25175 .stk-c73ce97 .stk-block-heading__text {
	text-shadow: none !important;
}

/* --- B5. Movimiento reducido ------------------------------------------------ */
@media (prefers-reduced-motion: reduce) {
	.stk-block-notification.stk-c11e9a3,
	body .chat-window-toggle {
		transition: none !important;
	}
	.stk-block-notification.stk-c11e9a3:hover,
	body .chat-window-toggle:hover {
		transform: none !important;
	}
}


/* ==========================================================================
   14) Limpieza tipográfica (Agente 2 — rehecho directo)
   Quita las text-shadows pesadas del sitio. Especificidad 3 clases
   (.stk-block-heading.stk-XXX ...) para vencer el inline de Stackable (2).
   ========================================================================== */
/* Títulos de sección: navy sobre fondo claro → sin sombra (look premium).
   Estas clases se repiten en todas las rutas, así que una regla las limpia
   en home, /about, /pricing y /blog a la vez. */
.stk-block-heading.stk-cf02387 .stk-block-heading__text,
.stk-block-heading.stk-c73ce97 .stk-block-heading__text,
.stk-block-heading.stk-54b4a8d .stk-block-heading__text {
	text-shadow: none !important;
}
/* Hero: texto BLANCO sobre imagen de fondo → la sombra pesada (2/4/6px) se
   cambia por una sutil que mantiene el contraste sin abaratar. */
.stk-block-heading.stk-7225c59 .stk-block-heading__text {
	text-shadow: 0 2px 10px rgba(35, 38, 67, 0.30) !important;
}
.stk-block-text.stk-81505a5 .stk-block-text__text {
	text-shadow: 0 1px 6px rgba(35, 38, 67, 0.28) !important;
}

/* ==========================================================================
   15) Ajustes visuales (Agente 4 — parcial, wins seguros)
   NOTA: el rediseño completo de la metodología de 5 pasos (íconos por paso +
   grid) queda pendiente de un pase visual — ver handoff.
   ========================================================================== */
/* a) Testimonio/blockquote: sombra negra dura (#000000) → sombra navy limpia.
   Inline a batir: .stk-3f4f31b-container{box-shadow:0 0 25px 1px #000000}. */
.stk-3f4f31b.stk-block .stk-3f4f31b-container {
	box-shadow:
		0 1px 3px rgba(35, 38, 67, 0.06),
		0 12px 30px -10px rgba(35, 38, 67, 0.22) !important;
	border-radius: 16px !important;
}
/* b) Banda de robots (imagen IA stock, .stk-421c103): overlay duotono de marca
   navy→verde para integrarla con la paleta y quitarle el look de "stock IA".
   El bloque ya trae stk-block-background + overlay (::before); se re-tinta. */
.stk-421c103.stk-block-background::before {
	background: linear-gradient(
		120deg,
		rgba(35, 38, 67, 0.80) 0%,
		rgba(0, 168, 98, 0.42) 100%
	) !important;
	opacity: 1 !important;
}

/* ==========================================================================
   16) Subir el hero (menos aire entre navbar y hero)
   El hero (.stk-242acad) tenía padding-top 150px (70px en <1000px). Se reduce
   ~24px con margin-top negativo, sin tocar el padding interno (que sostiene la
   animación de entrada y el gradiente superior).
   Solo ≥1000px (alineado al breakpoint REAL del navbar de Blocksy, ver nota
   2026-07-06 en §6): en mobile/tablet el navbar mide 70px (una fila) en vez de
   120px (desktop, fila de sociales + menú) — este mismo pull-up metía el logo
   del hero DENTRO del navbar en esos anchos (ver fix en §6, media max-width:999px). */
@media (min-width: 1000px) {
	.stk-242acad.stk-block-columns {
		margin-top: -24px !important;
	}
}


/* ==========================================================================
   17) Íconos sociales del FOOTER: mismo efecto "levantarse" del navbar (§9)
   Botones-ícono Stackable (.stk-cb981ad / .stk-30d92ec / .stk-865571e).
   Al hover: suben con rebote sutil + sombra navy + fondo verde marca (el
   fondo verde ya lo pone la §1; aquí se añade el movimiento y la sombra).
   ========================================================================== */
.stk-block-icon-button.stk-cb981ad .stk-button,
.stk-block-icon-button.stk-30d92ec .stk-button,
.stk-block-icon-button.stk-865571e .stk-button {
	transition:
		transform .3s cubic-bezier(.34, 1.56, .64, 1), /* rebote sutil, como §9 */
		box-shadow .3s ease,
		background .2s ease !important;
}
.stk-block-icon-button.stk-cb981ad .stk-button:hover,
.stk-block-icon-button.stk-30d92ec .stk-button:hover,
.stk-block-icon-button.stk-865571e .stk-button:hover,
.stk-block-icon-button.stk-cb981ad .stk-button:focus-visible,
.stk-block-icon-button.stk-30d92ec .stk-button:focus-visible,
.stk-block-icon-button.stk-865571e .stk-button:focus-visible {
	transform: translateY(-5px) scale(1.12);
	box-shadow: 0 6px 8px rgba(35, 38, 67, 0.28);
	position: relative;
	z-index: 2; /* al levantarse queda por encima de los vecinos */
}
@media (prefers-reduced-motion: reduce) {
	.stk-block-icon-button.stk-cb981ad .stk-button,
	.stk-block-icon-button.stk-30d92ec .stk-button,
	.stk-block-icon-button.stk-865571e .stk-button {
		transition: none !important;
	}
	.stk-block-icon-button.stk-cb981ad .stk-button:hover,
	.stk-block-icon-button.stk-30d92ec .stk-button:hover,
	.stk-block-icon-button.stk-865571e .stk-button:hover {
		transform: none;
	}
}


/* ==========================================================================
   18) Micro-interacciones premium (Agente: Aria)
   Destino: append a wp-content/themes/blocksy-child/style.css + subir versión.
   Verificado contra el HTML/CSS servido el 2026-07-03 (home.html / about.html).
   Paleta: verde #00D47E · verde oscuro #00A862 · navy #232643 · blanco.
   Curva única del sitio: cubic-bezier(.16,1,.3,1).

   ALCANCE (respeta límites de otros agentes):
   - Home: 3 cards "¿Qué obstáculos enfrenta tu negocio hoy?" (feature-grid
     .stk-e9f8ae1 → containers .stk-0b4cad6 / .stk-1d33946 / .stk-53a10ca).
   - Home: card blockquote "Un poco más acerca de AetherAI" (.stk-3f4f31b).
   - /about: 3 cards de servicios (.stk-1644a3f / .stk-08679c8 / .stk-cc808f9).
   - Botones sueltos de esas secciones + banners CTA (Contáctanos / Agenda).
   NO toca: las 5 cards de metodología, navbar, footer, hero, formulario,
   tipografía. Solo anima transform/opacity/box-shadow (compositor). Los lifts
   van tras @media (hover:hover) para no disparar en táctil 3G. Respeta
   prefers-reduced-motion.

   ESPECIFICIDAD: Stackable imprime su CSS inline en el <body> DESPUÉS de este
   archivo, con !important y 1 clase. Cada override usa 2+ clases + !important.
   -------------------------------------------------------------------------- */

/* --- 18a) Home · cards "¿Qué obstáculos...?" ------------------------------
   Inline a batir (1 clase): .stk-0b4cad6-container:hover{box-shadow:0 0 30px 0
   #a2ffd7 !important} (glow menta plano, sin reposo). Se reemplaza por sombra
   en capas navy + lift real. En reposo ya leen como card (sombra suave). */
.stk-e9f8ae1 .stk-0b4cad6-container,
.stk-e9f8ae1 .stk-1d33946-container,
.stk-e9f8ae1 .stk-53a10ca-container {
	box-shadow:
		0 1px 2px rgba(35, 38, 67, 0.05),
		0 6px 16px rgba(35, 38, 67, 0.07) !important;
	transition:
		transform 0.5s cubic-bezier(0.16, 1, 0.3, 1),
		box-shadow 0.5s cubic-bezier(0.16, 1, 0.3, 1) !important;
}
@media (hover: hover) {
	.stk-e9f8ae1 .stk-0b4cad6-container:hover,
	.stk-e9f8ae1 .stk-1d33946-container:hover,
	.stk-e9f8ae1 .stk-53a10ca-container:hover {
		transform: translateY(-6px);
		box-shadow:
			0 2px 4px rgba(35, 38, 67, 0.05),
			0 16px 32px rgba(35, 38, 67, 0.10),
			0 28px 56px -16px rgba(0, 212, 126, 0.26) !important;
	}
}

/* Zoom sutil del ícono/imagen al hover de la card (la card es stk-hover-parent;
   el ícono sube en escala, no en posición → no desplaza el texto). */
.stk-e9f8ae1 .stk-block-image .stk-img {
	transition: transform 0.5s cubic-bezier(0.16, 1, 0.3, 1);
}
@media (hover: hover) {
	.stk-e9f8ae1 .stk-0b4cad6-container:hover .stk-img,
	.stk-e9f8ae1 .stk-1d33946-container:hover .stk-img,
	.stk-e9f8ae1 .stk-53a10ca-container:hover .stk-img {
		transform: scale(1.06);
	}
}

/* --- 18b) /about · cards de servicios --------------------------------------
   SUPERSEDIDO por §38 (rediseño completo a grid de 6 cards, 2026-07-07).
   El tratamiento de card/hover/ícono de las 3 originales ahora vive ahí junto
   con los 3 servicios nuevos, unificado. No queda nada que hacer aquí. */

/* --- 18c) Home · card blockquote "Un poco más acerca de AetherAI" ---------
   La §15a ya le dio sombra navy + radio 16px (.stk-3f4f31b.stk-block
   .stk-3f4f31b-container). Aquí solo se añade la transición y el lift al hover
   con la MISMA especificidad para extenderla sin romperla. */
.stk-3f4f31b.stk-block .stk-3f4f31b-container {
	transition:
		transform 0.5s cubic-bezier(0.16, 1, 0.3, 1),
		box-shadow 0.5s cubic-bezier(0.16, 1, 0.3, 1) !important;
}
@media (hover: hover) {
	.stk-3f4f31b.stk-block .stk-3f4f31b-container:hover {
		transform: translateY(-4px);
		box-shadow:
			0 2px 6px rgba(35, 38, 67, 0.06),
			0 18px 40px -12px rgba(35, 38, 67, 0.26) !important;
	}
}

/* --- 18d) Botones sueltos: profundidad de marca --------------------------
   Los botones de estas secciones YA traen el lift+scale nativo de Stackable
   (.stk--hover-effect-lift-scale, que usa transform + un ::after de oscurecido).
   Aquí SOLO se añade una sombra verde que se profundiza al hover — se transiciona
   ÚNICAMENTE box-shadow para no pisar el transform que controla Stackable.
   Cubre: obstáculos (.stk-e9f8ae1) y banners CTA (Contáctanos → grupo
   .stk-fc8f9a4 · Agenda tu cita → grupo .stk-29bed1e). Los botones de las
   cards de /about ahora tienen su propio tratamiento en §38. */
.stk-e9f8ae1 .stk-button,
.stk-fc8f9a4 .stk-button,
.stk-29bed1e .stk-button {
	box-shadow: 0 4px 14px rgba(0, 212, 126, 0.32) !important;
	transition: box-shadow 0.3s cubic-bezier(0.16, 1, 0.3, 1) !important;
}
@media (hover: hover) {
	.stk-e9f8ae1 .stk-button:hover,
	.stk-fc8f9a4 .stk-button:hover,
	.stk-29bed1e .stk-button:hover {
		box-shadow: 0 9px 24px rgba(0, 168, 98, 0.42) !important;
	}
}

/* --- 18e) Movimiento reducido -------------------------------------------- */
@media (prefers-reduced-motion: reduce) {
	.stk-e9f8ae1 .stk-0b4cad6-container,
	.stk-e9f8ae1 .stk-1d33946-container,
	.stk-e9f8ae1 .stk-53a10ca-container,
	.stk-e9f8ae1 .stk-block-image .stk-img,
	.stk-3f4f31b.stk-block .stk-3f4f31b-container,
	.stk-e9f8ae1 .stk-button,
	.stk-fc8f9a4 .stk-button,
	.stk-29bed1e .stk-button {
		transition: none !important;
	}
	.stk-e9f8ae1 .stk-0b4cad6-container:hover,
	.stk-e9f8ae1 .stk-1d33946-container:hover,
	.stk-e9f8ae1 .stk-53a10ca-container:hover,
	.stk-3f4f31b.stk-block .stk-3f4f31b-container:hover {
		transform: none !important;
	}
	.stk-e9f8ae1 .stk-0b4cad6-container:hover .stk-img,
	.stk-e9f8ae1 .stk-1d33946-container:hover .stk-img,
	.stk-e9f8ae1 .stk-53a10ca-container:hover .stk-img {
		transform: none !important;
	}
}

/* --- 18f) Fix tablet (768px): cards de obstáculos demasiado delgadas ------
   Son 3 columnas de Stackable a ancho igual (flex:1 1 0px nativo) — a 768px
   quedan ~230px cada una, con palabras partidas ("impleme/ntar", "marketi/ng.").
   Al ser solo 3 (no 5 como la metodología), se apilan a 1 columna en el tramo
   de tablet en vez de forzar un 2+1 — más simple y cómodo de leer. */
@media (min-width: 690px) and (max-width: 1023px) {
	.stk-e9f8ae1 .stk-row {
		flex-direction: column !important;
		gap: 28px !important;
	}
	.stk-e9f8ae1 .stk-0b4cad6,
	.stk-e9f8ae1 .stk-1d33946,
	.stk-e9f8ae1 .stk-53a10ca {
		max-width: 520px !important;
		width: 100% !important;
		margin: 0 auto !important;
	}
	/* El botón (anclado al fondo por margin-top:auto, fix de §22) desborda el
	   propio contenedor de la card en este tramo: el padding-bottom nativo de
	   Stackable sube a 32px aquí (vs 24px en mobile) pero no alcanza — medido
	   con Playwright: el botón sobresale ~13px por debajo del container, que
	   tiene overflow:hidden nativo de Stackable → se veía con la esquina
	   inferior recortada. Se sube el padding-bottom lo suficiente para que
	   quepa completo (overflow:hidden se mantiene, así el botón vuelve a
	   quedar contenido prolijamente dentro de la card blanca, igual que en
	   mobile/desktop, en vez de sobresalir por debajo del borde redondeado). */
	.stk-e9f8ae1 .stk-0b4cad6-container,
	.stk-e9f8ae1 .stk-1d33946-container,
	.stk-e9f8ae1 .stk-53a10ca-container {
		padding-bottom: 52px !important;
	}
}
/* --- 18g) Fix mobile (<690px): sin gap entre cards apiladas --------------
   Stackable apila las 3 columnas en 1 sola (flex-direction:column nativo de
   su propio breakpoint) pero sin espacio entre ellas — quedan pegadas borde
   con borde, y el botón (anclado al fondo por §22) queda visualmente
   "recortado" por el borde superior de la card siguiente. Mismo fix que 18f,
   sin tocar max-width/centrado (que ya vienen bien de fábrica en este rango). */
@media (max-width: 689px) {
	.stk-e9f8ae1 .stk-row {
		gap: 24px !important;
	}
}


/* ==========================================================================
   19) Efectos visuales premium — /pricing, /contact, /blog (Bruno)
   ----------------------------------------------------------------------------
   Micro-interacciones coherentes con la marca: hover, elevación, transiciones
   suaves y tratamiento de imágenes. Solo transform / opacity / box-shadow
   (compositor, sin reflow). Curva del sitio: cubic-bezier(.16,1,.3,1).
   Paleta: verde #00D47E · verde oscuro #00A862 · verde hover #00C274 · navy
   #232643. Verificado contra el HTML servido el 2026-07-03.

   LÍMITES respetados: NO toca el form #wpforms-5 (§12), NI la card principal de
   precios .stk-c11e9a3 / su CTA .stk-0ce6830 / su check (§13), NI navbar /
   footer / hero, NI tipografía (font-size/weight/line-height/align/shadow).
   Nota de reparto: en /contact todo lo interactivo restante ya está cubierto
   por §12 (form) y por el footer (fuera de alcance) — no quedan elementos
   propios que tratar ahí sin invadir a otros agentes.
   ========================================================================== */

/* --------------------------------------------------------------------------
   18a) Cards de introducción de /pricing y /blog — marco premium
   ----------------------------------------------------------------------------
   Ambas páginas reusan la MISMA columna-banner .stk-355d12c ("Soluciones
   diseñadas…" en /pricing y "Negocios que ya han escalado…" en /blog): una
   sola regla las unifica. El bloque trae fondo blanco inline
   (.stk-355d12c,.stk-355d12c:before{background:#fff}) pero sombra por defecto
   del tema, difusa y sin intención. Se le da un hairline navy + sombra en
   capas para que "flote" con propósito. NO es clicable → sin lift en hover.
   2 clases (.stk-355d12c .stk-355d12c-container) para pisar el estado base.
   -------------------------------------------------------------------------- */
.stk-355d12c .stk-355d12c-container {
	border: 1px solid rgba(35, 38, 67, 0.07) !important;
	border-radius: 20px !important;
	box-shadow:
		0 1px 2px rgba(35, 38, 67, 0.05),
		0 8px 24px rgba(35, 38, 67, 0.07),
		0 24px 48px -16px rgba(35, 38, 67, 0.12) !important;
}

/* --------------------------------------------------------------------------
   18b) /blog — Card destacada "Bruma1800" (imagen + reto)
   ----------------------------------------------------------------------------
   Estructura real: columna .stk-b8a4131 › card .stk-375f58e (contenedor
   .stk-375f58e-container.stk-hover-parent) › figure.stk-block-card__image con
   <img class="stk-img wp-image-3251">.

   PROBLEMA: la columna .stk-b8a4131 lleva inline
   `box-shadow:0 0 30px 1px #662f2f !important` → halo marrón-rojizo que no es
   de la marca y abarata la pieza. Se neutraliza en la columna (2 clases) y la
   elevación real se pinta sobre la CARD, que además redondea y recorta la
   imagen para el zoom. Es la pieza "estrella" de la página: aquí gastamos la
   audacia (lift + zoom), el resto queda tranquilo.
   -------------------------------------------------------------------------- */

/* Neutralizar el halo marrón de la columna (inline 1 clase → uso 2). */
.stk-block-column.stk-b8a4131 {
	box-shadow: none !important;
}

/* La card recibe la elevación de marca: sombra en capas (navy + halo verde),
   esquinas redondeadas y overflow oculto para que el zoom de la imagen no se
   salga. Transición con la curva del sitio. */
.stk-block-card.stk-375f58e .stk-375f58e-container {
	border: 1px solid rgba(35, 38, 67, 0.06) !important;
	border-radius: 20px !important;
	overflow: hidden !important;
	box-shadow:
		0 1px 2px rgba(35, 38, 67, 0.05),
		0 10px 28px rgba(35, 38, 67, 0.09),
		0 28px 56px -18px rgba(0, 212, 126, 0.22) !important;
	transition:
		transform 0.5s cubic-bezier(0.16, 1, 0.3, 1),
		box-shadow 0.5s cubic-bezier(0.16, 1, 0.3, 1) !important;
}

/* La imagen (poster de Bruma1800) vive en un figure a ancho completo: se
   prepara para el zoom suave anclado a su contenedor recortado. */
.stk-block-card.stk-375f58e .stk-block-card__image {
	overflow: hidden !important;
}
.stk-block-card.stk-375f58e .stk-block-card__image .stk-img {
	transition: transform 0.6s cubic-bezier(0.16, 1, 0.3, 1) !important;
}

/* Solo en dispositivos con puntero (no en táctil 3G): la card se eleva y la
   imagen hace un zoom contenido. En móvil queda estática y ligera. */
@media (hover: hover) {
	.stk-block-card.stk-375f58e .stk-375f58e-container:hover {
		transform: translateY(-6px);
		box-shadow:
			0 2px 4px rgba(35, 38, 67, 0.05),
			0 18px 40px rgba(35, 38, 67, 0.11),
			0 36px 72px -18px rgba(0, 212, 126, 0.30) !important;
	}
	.stk-block-card.stk-375f58e .stk-375f58e-container:hover .stk-block-card__image .stk-img {
		transform: scale(1.06);
	}
}

/* --------------------------------------------------------------------------
   18c) /blog — Testimonio (blockquote .stk-f0c9d3d)
   ----------------------------------------------------------------------------
   Inline a batir: `.stk-f0c9d3d-container{box-shadow:0 0 25px 1px #000000}`
   (halo negro duro, 1 clase → uso 3). Se cambia por sombra navy limpia en
   capas + esquinas redondeadas, en la misma línea que §15a hizo con el otro
   blockquote del sitio. Sin lift (cita, no elemento interactivo).
   -------------------------------------------------------------------------- */
.stk-block-blockquote.stk-f0c9d3d .stk-f0c9d3d-container {
	box-shadow:
		0 1px 3px rgba(35, 38, 67, 0.06),
		0 12px 30px -10px rgba(35, 38, 67, 0.22) !important;
	border-radius: 16px !important;
	border: 1px solid rgba(35, 38, 67, 0.06) !important;
}

/* --------------------------------------------------------------------------
   18d) /blog — Listas "Nuestra Solución" y "Resultados" (icon-list)
   ----------------------------------------------------------------------------
   Micro-interacción sutil: al pasar el cursor sobre un ítem, se desliza unos
   px a la derecha (solo transform → compositor). Da sensación de vida sin
   ruido; se mantiene discreta porque la estrella de la página es la card 18b.
   Ítems: .stk-block-icon-list-item (todos los <li> de ambas listas).
   Solo puntero + reduce-motion respetado.
   -------------------------------------------------------------------------- */
@media (hover: hover) {
	.stk-block-icon-list-item .stk-block-icon-list-item__content {
		transition: transform 0.35s cubic-bezier(0.16, 1, 0.3, 1);
	}
	.stk-block-icon-list-item:hover .stk-block-icon-list-item__content {
		transform: translateX(4px);
	}
}

/* --------------------------------------------------------------------------
   18e) /blog — Sección CTA final ("Agenda tu cita hoy…")
   ----------------------------------------------------------------------------
   Call-to-action .stk-f4f6941 (fondo con onda) › card .stk-f4f6941-container
   (radio 16px inline). Se le da profundidad con sombra de marca y un lift muy
   sutil en puntero. El botón .stk-41c4863 venía en verde Stackable #00d084 con
   hover menta #7bdcb5 → se lleva al verde de marca exacto, texto navy (AA) y
   glow verde, homogéneo con el resto de CTAs del sitio (§12g / §13-B3).
   NO se toca el transform: el botón ya usa .stk--hover-effect-lift-scale de
   Stackable; solo se añaden color y sombra para no pelear con esa animación.
   -------------------------------------------------------------------------- */

/* Card de la sección: sombra en capas (2 clases para reforzar sobre el radio
   inline) + transición. */
.stk-block-call-to-action.stk-f4f6941 .stk-f4f6941-container {
	box-shadow:
		0 2px 6px rgba(35, 38, 67, 0.06),
		0 18px 44px -14px rgba(35, 38, 67, 0.20) !important;
	transition: transform 0.5s cubic-bezier(0.16, 1, 0.3, 1),
		box-shadow 0.5s cubic-bezier(0.16, 1, 0.3, 1) !important;
}
@media (hover: hover) {
	.stk-block-call-to-action.stk-f4f6941 .stk-f4f6941-container:hover {
		transform: translateY(-4px);
		box-shadow:
			0 4px 10px rgba(35, 38, 67, 0.07),
			0 26px 60px -14px rgba(0, 212, 126, 0.26) !important;
	}
}

/* Botón CTA a marca (inline .stk-41c4863 .stk-button 1 clase → uso 2). */
.stk-block-button.stk-41c4863 .stk-button {
	background: #00d47e !important;
	border-radius: 12px !important;
	box-shadow: 0 4px 14px rgba(0, 212, 126, 0.35) !important;
}
/* Texto navy: blanco sobre #00D47E no pasa 4.5:1; navy da ~7:1 (elección de
   contraste, no de tipografía). */
.stk-block-button.stk-41c4863 .stk-button .stk-button__inner-text {
	color: #232643 !important;
}
.stk-block-button.stk-41c4863 .stk-button .stk--inner-svg svg,
.stk-block-button.stk-41c4863 .stk-button .stk--inner-svg svg :is(g, path) {
	fill: #232643 !important;
}
/* El "hover" de Stackable es un ::after superpuesto (era menta #7bdcb5). */
.stk-block-button.stk-41c4863 .stk-button:hover:after {
	background: #00c274 !important;
	opacity: 1 !important;
}
.stk-block-button.stk-41c4863 .stk-button:focus-visible {
	outline: 3px solid #00a862 !important;
	outline-offset: 3px !important;
}

/* --------------------------------------------------------------------------
   18f) Movimiento reducido — anula todo lift / zoom / deslizamiento
   -------------------------------------------------------------------------- */
@media (prefers-reduced-motion: reduce) {
	.stk-block-card.stk-375f58e .stk-375f58e-container,
	.stk-block-card.stk-375f58e .stk-block-card__image .stk-img,
	.stk-block-call-to-action.stk-f4f6941 .stk-f4f6941-container,
	.stk-block-icon-list-item .stk-block-icon-list-item__content {
		transition: none !important;
	}
	.stk-block-card.stk-375f58e .stk-375f58e-container:hover,
	.stk-block-call-to-action.stk-f4f6941 .stk-f4f6941-container:hover {
		transform: none !important;
	}
	.stk-block-card.stk-375f58e .stk-375f58e-container:hover .stk-block-card__image .stk-img,
	.stk-block-icon-list-item:hover .stk-block-icon-list-item__content {
		transform: none !important;
	}
}


/* ==========================================================================
   20) Metodología de 5 pasos (HOME) — rediseño premium  [Dante]
   --------------------------------------------------------------------------
   Objetivo: cards con ícono por paso + número de paso, grid equilibrado
   (3 arriba + 2 centradas abajo, sin el hueco a la derecha) y hover coherente
   con el lenguaje de marca (lift sutil + sombra navy en capas).

   Mapeo verificado contra el HTML servido (2026-07-03):
     Contratación → .stk-fc9c699   Análisis  → .stk-c449828
     Planeación   → .stk-f0a9bcb   Ejecución → .stk-67080b5
     Resultado    → .stk-a0e5155
   Row contenedor (flex que envuelve): .stk-e08b614 › .stk-e08b614-column (.stk-row)
   Cada card: .stk-XXX (columna flex) › .stk-XXX-container (caja visible,
   .stk-hover-parent) › .stk-XXX-inner-blocks (wrapper del contenido).

   Restricciones respetadas: Stackable imprime CSS inline en el <body> con
   !important → aquí se usan 2 clases de especificidad (.stk-XXX .stk-XXX-container)
   + !important. Solo se anima transform/opacity/box-shadow/color. Íconos vía
   ::after con data-URI (Lucide, MIT) → sin tocar la BD ni el contenido.
   Reemplaza el fragmento "15) Ajustes visuales" pendiente del handoff en lo
   relativo a la metodología; §1 (hover verde) se refina más abajo.
   ========================================================================== */

/* --- 20a) GRID EQUILIBRADO -------------------------------------------------
   Las 5 cards son ítems flex de .stk-e08b614-column. Se fija un ancho idéntico
   y se centra la fila → los sobrantes quedan al medio en vez de pegados a la
   izquierda. gap uniforme define columnas y filas.

   ⚠️ Fix tablet (768px): la regla original forzaba 3-por-fila desde 690px, y a
   768px el usuario reportó las cards "demasiado delgadas" (~230px, palabras
   partidas a la mitad: "Contrat/ación"). Se agrega un tramo intermedio
   690–1023px con SOLO 2 por fila (la 5ª card queda sola, centrada por el
   justify-content ya activo) — suficiente ancho para texto cómodo. 3-por-fila
   se reserva para ≥1024px, donde sí hay espacio real. */
@media (min-width: 690px) {
	.stk-e08b614 .stk-e08b614-column {
		justify-content: center !important; /* centra la fila incompleta */
		align-items: stretch !important;    /* cards de igual alto por fila */
		gap: 28px !important;               /* mismo aire horizontal y vertical */
	}
}
@media (min-width: 690px) and (max-width: 1023px) {
	.stk-e08b614 .stk-fc9c699,
	.stk-e08b614 .stk-c449828,
	.stk-e08b614 .stk-f0a9bcb,
	.stk-e08b614 .stk-67080b5,
	.stk-e08b614 .stk-a0e5155 {
		flex: 0 1 calc((100% - 28px) / 2) !important;
		max-width: calc((100% - 28px) / 2) !important;
		margin: 0 !important;
	}
}
@media (min-width: 1024px) {
	.stk-e08b614 .stk-fc9c699,
	.stk-e08b614 .stk-c449828,
	.stk-e08b614 .stk-f0a9bcb,
	.stk-e08b614 .stk-67080b5,
	.stk-e08b614 .stk-a0e5155 {
		/* (100% - 2*gap) / 3 → tres exactas por fila; f0a9bcb no traía regla
		   propia de flex y quedaba irregular: aquí se unifican las cinco. */
		flex: 0 1 calc((100% - 56px) / 3) !important;
		max-width: calc((100% - 56px) / 3) !important;
		margin: 0 !important; /* el gap del row maneja el espaciado */
	}
}

/* --- 20b) LA CAJA (container) ----------------------------------------------
   Espacio superior reservado para el badge (ícono + número) → sin CLS al
   revelar la sección. Padding, borde y radio propios para un look consistente
   en las 5 (la plantilla dejaba cajas planas de borde fino, sin ritmo). */
.stk-fc9c699 .stk-fc9c699-container,
.stk-c449828 .stk-c449828-container,
.stk-f0a9bcb .stk-f0a9bcb-container,
.stk-67080b5 .stk-67080b5-container,
.stk-a0e5155 .stk-a0e5155-container {
	position: relative !important;
	padding: 92px 30px 34px !important; /* 92px arriba = fila del badge */
	border: 1px solid rgba(35, 38, 67, 0.09) !important;
	border-radius: 18px !important;
	overflow: visible !important;
	box-shadow:
		0 1px 2px rgba(35, 38, 67, 0.04),
		0 10px 26px -14px rgba(35, 38, 67, 0.16) !important;
	transition:
		transform 0.5s cubic-bezier(0.16, 1, 0.3, 1),
		box-shadow 0.5s cubic-bezier(0.16, 1, 0.3, 1),
		border-color 0.4s cubic-bezier(0.16, 1, 0.3, 1) !important;
}
/* El ::before de Stackable pinta el fondo de la card (inset:0). Se fija blanco
   y con el mismo radio para que el borde y el badge respiren. */
.stk-fc9c699 .stk-fc9c699-container::before,
.stk-c449828 .stk-c449828-container::before,
.stk-f0a9bcb .stk-f0a9bcb-container::before,
.stk-67080b5 .stk-67080b5-container::before,
.stk-a0e5155 .stk-a0e5155-container::before {
	background-color: #ffffff !important;
	border-radius: 17px !important;
}

/* --- 20c) BADGE: chip de ícono (container::after) --------------------------
   Chip circular verde suave arriba-izquierda; el ícono va como background-image
   (Lucide, stroke navy). En hover el chip se llena de verde marca (§18e) y el
   ícono navy mantiene buen contraste (navy sobre #00D47E ≈ 6:1). */
.stk-fc9c699 .stk-fc9c699-container::after,
.stk-c449828 .stk-c449828-container::after,
.stk-f0a9bcb .stk-f0a9bcb-container::after,
.stk-67080b5 .stk-67080b5-container::after,
.stk-a0e5155 .stk-a0e5155-container::after {
	content: "";
	position: absolute;
	top: 28px;
	left: 30px;
	width: 52px;
	height: 52px;
	border-radius: 14px;
	background-color: rgba(0, 212, 126, 0.12);
	background-repeat: no-repeat;
	background-position: center;
	background-size: 27px 27px;
	transition:
		background-color 0.4s cubic-bezier(0.16, 1, 0.3, 1),
		transform 0.4s cubic-bezier(0.16, 1, 0.3, 1);
	pointer-events: none;
}
/* Ícono semántico por paso (Lucide 24×24, stroke #232643, 1.8px).
   Íconos intercambiados: el orden de contenido de estas 2 cards se invirtió
   (Brand Bible de Notion define 01=Análisis, 02=Contratación; el sitio tenía
   01=Contratación, 02=Análisis) — el ícono sigue al TEXTO, no a la posición. */
.stk-fc9c699 .stk-fc9c699-container::after { /* posición 1 → ahora Análisis → search */
	background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='%23232643' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'%3E%3Ccircle cx='11' cy='11' r='8'/%3E%3Cpath d='m21 21-4.3-4.3'/%3E%3C/svg%3E");
}
.stk-c449828 .stk-c449828-container::after { /* posición 2 → ahora Contratación → file-check */
	background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='%23232643' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M15 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V7z'/%3E%3Cpath d='M14 2v4a2 2 0 0 0 2 2h4'/%3E%3Cpath d='m9 15 2 2 4-4'/%3E%3C/svg%3E");
}
.stk-f0a9bcb .stk-f0a9bcb-container::after { /* Planeación → clipboard-list */
	background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='%23232643' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'%3E%3Crect width='8' height='4' x='8' y='2' rx='1' ry='1'/%3E%3Cpath d='M16 4h2a2 2 0 0 1 2 2v14a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V6a2 2 0 0 1 2-2h2'/%3E%3Cpath d='M12 11h4'/%3E%3Cpath d='M12 16h4'/%3E%3Cpath d='M8 11h.01'/%3E%3Cpath d='M8 16h.01'/%3E%3C/svg%3E");
}
.stk-67080b5 .stk-67080b5-container::after { /* Ejecución → rocket */
	background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='%23232643' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M4.5 16.5c-1.5 1.26-2 5-2 5s3.74-.5 5-2c.71-.84.7-2.13-.09-2.91a2.18 2.18 0 0 0-2.91-.09z'/%3E%3Cpath d='m12 15-3-3a22 22 0 0 1 2-3.95A12.88 12.88 0 0 1 22 2c0 2.72-.78 7.5-6 11a22.35 22.35 0 0 1-4 2z'/%3E%3Cpath d='M9 12H4s.55-3.03 2-4c1.62-1.08 5 0 5 0'/%3E%3Cpath d='M12 15v5s3.03-.55 4-2c1.08-1.62 0-5 0-5'/%3E%3C/svg%3E");
}
.stk-a0e5155 .stk-a0e5155-container::after { /* Resultado → trophy */
	background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='%23232643' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M6 9H4.5a2.5 2.5 0 0 1 0-5H6'/%3E%3Cpath d='M18 9h1.5a2.5 2.5 0 0 0 0-5H18'/%3E%3Cpath d='M4 22h16'/%3E%3Cpath d='M10 14.66V17c0 .55-.47.98-.97 1.21C7.85 18.75 7 20.24 7 22'/%3E%3Cpath d='M14 14.66V17c0 .55.47.98.97 1.21C16.15 18.75 17 20.24 17 22'/%3E%3Cpath d='M18 2H6v7a6 6 0 0 0 12 0V2Z'/%3E%3C/svg%3E");
}

/* --- 20d) BADGE: número de paso (inner-blocks::before) ---------------------
   El proceso ES una secuencia real (Contratación → Resultado), así que el
   número comunica orden, no decora. Numeral grande "fantasma" arriba-derecha,
   Poppins 800; en hover pasa a verde marca. */
.stk-fc9c699 .stk-fc9c699-inner-blocks::before,
.stk-c449828 .stk-c449828-inner-blocks::before,
.stk-f0a9bcb .stk-f0a9bcb-inner-blocks::before,
.stk-67080b5 .stk-67080b5-inner-blocks::before,
.stk-a0e5155 .stk-a0e5155-inner-blocks::before {
	position: absolute;
	top: 24px;
	right: 28px;
	font-family: "Poppins", "Inter", system-ui, sans-serif;
	font-weight: 800;
	font-size: 46px;
	line-height: 1;
	letter-spacing: -0.02em;
	color: rgba(35, 38, 67, 0.11);
	transition: color 0.4s cubic-bezier(0.16, 1, 0.3, 1);
	pointer-events: none;
}
.stk-fc9c699 .stk-fc9c699-inner-blocks::before { content: "01"; }
.stk-c449828 .stk-c449828-inner-blocks::before { content: "02"; }
.stk-f0a9bcb .stk-f0a9bcb-inner-blocks::before { content: "03"; }
.stk-67080b5 .stk-67080b5-inner-blocks::before { content: "04"; }
.stk-a0e5155 .stk-a0e5155-inner-blocks::before { content: "05"; }

/* --- 20e) HOVER COHERENTE (refina §1) --------------------------------------
   §1 inundaba la card entera de verde sólido en hover (y omitía Contratación),
   lo que castiga la lectura del párrafo. Aquí se unifican las 5 con el lenguaje
   de marca: card blanca que se eleva, sombra navy en capas, borde verde, chip
   de ícono lleno de verde y número verde. Carga después de §1 y con 2 clases →
   vence su flood sin tocar §1. */
@media (hover: hover) {
	.stk-fc9c699 .stk-fc9c699-container:hover,
	.stk-c449828 .stk-c449828-container:hover,
	.stk-f0a9bcb .stk-f0a9bcb-container:hover,
	.stk-67080b5 .stk-67080b5-container:hover,
	.stk-a0e5155 .stk-a0e5155-container:hover {
		/* FIX (verificado con Playwright): el ::before de abajo NO es la capa
		   real de fondo de esta card — el fondo visible vive en el propio
		   background-color del container. §1 lo pone verde sólido en hover
		   para 4 de las 5 (todas menos Contratación, que por eso se veía
		   "perfecta"/limpia). Se neutraliza aquí, en la MISMA propiedad que
		   pelea, con 3 clases de especificidad → gana sin depender del ::before. */
		background-color: #ffffff !important;
		transform: translateY(-8px) !important;
		border-color: rgba(0, 212, 126, 0.55) !important;
		box-shadow:
			0 2px 4px rgba(35, 38, 67, 0.05),
			0 16px 30px -10px rgba(35, 38, 67, 0.18),
			0 28px 52px -18px rgba(0, 168, 98, 0.30) !important;
	}
	/* Neutraliza el flood verde de §1: fondo (::before) sigue blanco en hover. */
	.stk-fc9c699 .stk-fc9c699-container:hover::before,
	.stk-c449828 .stk-c449828-container:hover::before,
	.stk-f0a9bcb .stk-f0a9bcb-container:hover::before,
	.stk-67080b5 .stk-67080b5-container:hover::before,
	.stk-a0e5155 .stk-a0e5155-container:hover::before {
		background-color: #ffffff !important;
		border-color: #ffffff !important;
	}
	/* Chip de ícono se llena de verde marca y da un micro-lift. */
	.stk-fc9c699 .stk-fc9c699-container:hover::after,
	.stk-c449828 .stk-c449828-container:hover::after,
	.stk-f0a9bcb .stk-f0a9bcb-container:hover::after,
	.stk-67080b5 .stk-67080b5-container:hover::after,
	.stk-a0e5155 .stk-a0e5155-container:hover::after {
		background-color: #00d47e !important;
		transform: translateY(-2px);
	}
	/* Número pasa de fantasma a verde de marca. */
	.stk-fc9c699 .stk-fc9c699-container:hover .stk-fc9c699-inner-blocks::before,
	.stk-c449828 .stk-c449828-container:hover .stk-c449828-inner-blocks::before,
	.stk-f0a9bcb .stk-f0a9bcb-container:hover .stk-f0a9bcb-inner-blocks::before,
	.stk-67080b5 .stk-67080b5-container:hover .stk-67080b5-inner-blocks::before,
	.stk-a0e5155 .stk-a0e5155-container:hover .stk-a0e5155-inner-blocks::before {
		color: rgba(0, 168, 98, 0.9) !important;
	}
}

/* --- 20f) Label del paso (título de la card) ------------------------------
   Peso y tamaño consistentes en las 5 (Poppins), sin tocar la tipografía
   global de Cora — se limita a los headings dentro de estas cards. */
.stk-fc9c699 .stk-fc9c699-inner-blocks .stk-block-heading__text,
.stk-c449828 .stk-c449828-inner-blocks .stk-block-heading__text,
.stk-f0a9bcb .stk-f0a9bcb-inner-blocks .stk-block-heading__text,
.stk-67080b5 .stk-67080b5-inner-blocks .stk-block-heading__text,
.stk-a0e5155 .stk-a0e5155-inner-blocks .stk-block-heading__text {
	font-weight: 700 !important;
	letter-spacing: -0.01em;
}

/* --- 20g) MÓVIL (<690px): cards apiladas ----------------------------------
   Stackable ya apila a 100% y centra en 410px. Se ajusta el badge para que
   respire en anchos pequeños (chip e índice algo menores). */
@media (max-width: 689px) {
	.stk-fc9c699 .stk-fc9c699-container,
	.stk-c449828 .stk-c449828-container,
	.stk-f0a9bcb .stk-f0a9bcb-container,
	.stk-67080b5 .stk-67080b5-container,
	.stk-a0e5155 .stk-a0e5155-container {
		padding: 84px 24px 30px !important;
	}
	.stk-fc9c699 .stk-fc9c699-container::after,
	.stk-c449828 .stk-c449828-container::after,
	.stk-f0a9bcb .stk-f0a9bcb-container::after,
	.stk-67080b5 .stk-67080b5-container::after,
	.stk-a0e5155 .stk-a0e5155-container::after {
		top: 24px;
		left: 24px;
		width: 48px;
		height: 48px;
		background-size: 25px 25px;
	}
	.stk-fc9c699 .stk-fc9c699-inner-blocks::before,
	.stk-c449828 .stk-c449828-inner-blocks::before,
	.stk-f0a9bcb .stk-f0a9bcb-inner-blocks::before,
	.stk-67080b5 .stk-67080b5-inner-blocks::before,
	.stk-a0e5155 .stk-a0e5155-inner-blocks::before {
		font-size: 40px;
		top: 22px;
		right: 24px;
	}
}

/* --- 20h) MOVIMIENTO REDUCIDO ---------------------------------------------- */
@media (prefers-reduced-motion: reduce) {
	.stk-fc9c699 .stk-fc9c699-container,
	.stk-c449828 .stk-c449828-container,
	.stk-f0a9bcb .stk-f0a9bcb-container,
	.stk-67080b5 .stk-67080b5-container,
	.stk-a0e5155 .stk-a0e5155-container,
	.stk-fc9c699 .stk-fc9c699-container::after,
	.stk-c449828 .stk-c449828-container::after,
	.stk-f0a9bcb .stk-f0a9bcb-container::after,
	.stk-67080b5 .stk-67080b5-container::after,
	.stk-a0e5155 .stk-a0e5155-container::after {
		transition: none !important;
	}
	.stk-fc9c699 .stk-fc9c699-container:hover,
	.stk-c449828 .stk-c449828-container:hover,
	.stk-f0a9bcb .stk-f0a9bcb-container:hover,
	.stk-67080b5 .stk-67080b5-container:hover,
	.stk-a0e5155 .stk-a0e5155-container:hover {
		transform: none !important;
	}
	.stk-fc9c699 .stk-fc9c699-container:hover::after,
	.stk-c449828 .stk-c449828-container:hover::after,
	.stk-f0a9bcb .stk-f0a9bcb-container:hover::after,
	.stk-67080b5 .stk-67080b5-container:hover::after,
	.stk-a0e5155 .stk-a0e5155-container:hover::after {
		transform: none !important;
	}
}


/* ==========================================================================
   21) FIX real: hover de íconos sociales del footer seguía azul claro
   ----------------------------------------------------------------------------
   §1 intentó ponerlo verde pero usaba la MISMA especificidad (2 clases) que el
   inline de Stackable `:is(.stk-cb981ad, .stk-30d92ec, .stk-865571e)
   .stk-button:hover{background:#8ed1fc}` — al empatar en especificidad, gana
   el que carga DESPUÉS en el documento (el inline, en el <body>). Verificado
   contra el HTML servido: el hover seguía siendo azul claro en producción.
   Esta regla usa 3 clases (stk-block-icon-button + stk-XXX + stk-button) para
   ganar sin ambigüedad, sin depender del orden de carga.
   ========================================================================== */
.stk-block-icon-button.stk-cb981ad .stk-button:hover,
.stk-block-icon-button.stk-30d92ec .stk-button:hover,
.stk-block-icon-button.stk-865571e .stk-button:hover {
	background: #00d47e !important;
	opacity: 1 !important;
}

/* ==========================================================================
   22) Home · "¿Qué obstáculos enfrenta tu negocio hoy?" — alinear botones
   ----------------------------------------------------------------------------
   Los 3 botones de acción quedaban a distinta altura porque el título/párrafo
   de cada card envuelve en un número de líneas distinto según el ancho de
   pantalla (el contenido no tiene layout de columna con el botón anclado
   abajo). Se convierte cada card en flex-column con el botón empujado al
   fondo (margin-top:auto) → los 3 quedan siempre a la misma altura sin
   importar cuánto texto tenga cada una.
   ========================================================================== */
.stk-e9f8ae1 .stk-0b4cad6-container,
.stk-e9f8ae1 .stk-1d33946-container,
.stk-e9f8ae1 .stk-53a10ca-container {
	height: 100% !important;
}
.stk-e9f8ae1 .stk-0b4cad6-inner-blocks,
.stk-e9f8ae1 .stk-1d33946-inner-blocks,
.stk-e9f8ae1 .stk-53a10ca-inner-blocks {
	display: flex !important;
	flex-direction: column !important;
	height: 100% !important;
}
.stk-e9f8ae1 .stk-5523eac,
.stk-e9f8ae1 .stk-45de5eb,
.stk-e9f8ae1 .stk-05f7517 {
	margin-top: auto !important;
	padding-top: 20px;
}

/* ==========================================================================
   23) Home · "Un poco más acerca de AetherAI" — texto denso reorganizado
   ----------------------------------------------------------------------------
   El bloque tenía 5 oraciones seguidas sin separación visual (solo <br>) más
   un párrafo de misión pegado justo debajo, todo con el mismo peso. Sin poder
   editar el contenido (vive en la BD), se reorganiza SOLO con CSS:
   - Los <br> pasan a comportarse como saltos de párrafo (más aire entre ideas).
   - La frase de cierre del primer bloque (única <strong> ahí) se resalta en
     verde oscuro como "conclusión".
   - El párrafo de misión (segundo <p>, hijo directo de .stk-6a29cf0-inner-blocks,
     el único <p> suelto — el otro texto va envuelto en un <div>) se convierte
     en un callout con acento verde a la izquierda: se lee como una pieza
     aparte ("nuestra misión"), no como continuación del primer párrafo.
   ========================================================================== */
.stk-eb3bf86 .stk-block-text__text {
	line-height: 1.75 !important;
}
.stk-eb3bf86 .stk-block-text__text br {
	content: "";
	display: block;
	margin-bottom: 0.9em;
}
.stk-eb3bf86 .stk-block-text__text strong {
	color: #00a862 !important;
}

.stk-6a29cf0-inner-blocks > p {
	margin-top: 28px !important;
	padding: 20px 24px !important;
	background: rgba(0, 212, 126, 0.06) !important;
	border-left: 3px solid #00d47e !important;
	border-radius: 4px 12px 12px 4px !important;
	line-height: 1.7 !important;
}
.stk-6a29cf0-inner-blocks > p br {
	content: "";
	display: block;
	margin-bottom: 0.75em;
}
.stk-6a29cf0-inner-blocks > p strong {
	color: #232643 !important;
}



/* ==========================================================================
   21) Jerarquía tipográfica — TODAS las rutas  [Cora]
   --------------------------------------------------------------------------
   Destino: append a wp-content/themes/blocksy-child/style.css (subir versión
   en el header del archivo para romper caché LiteSpeed tras el deploy).

   ALCANCE DE ESTE AGENTE: font-size, font-weight, line-height, letter-
   spacing, text-align, max-width de texto y márgenes verticales entre
   títulos/párrafos. NO toca hover/sombras/transiciones/box-shadow (Aria/
   Bruno, §18/§19), NI las 5 cards de metodología del home (Dante, §20:
   .stk-fc9c699 / .stk-c449828 / .stk-f0a9bcb / .stk-67080b5 / .stk-a0e5155
   y su tipografía interna), NI navbar/footer/hero, NI la sección "Un poco
   más acerca de AetherAI" (.stk-eb3bf86, .stk-225d63e, .stk-6a29cf0 — en
   reorganización por el orquestador en paralelo).

   ESCALA TIPOGRÁFICA DOCUMENTADA (mobile 375px → desktop, con clamp):
     H1 "intro" de sección (.stk-cf02387, se repite en / /about /pricing
        /blog): clamp(1.75rem, 1.35rem + 2vw, 3.125rem)  → 28px → 50px
        peso 800 · line-height 1.2 · letter-spacing -0.01em
     H4 "eyebrow/subtítulo" bajo el H1 (.stk-c73ce97, idéntico en las 4
        rutas): clamp(1.0625rem, 1rem + 0.3vw, 1.25rem)  → 17px → 20px
        peso 700 · line-height 1.35
     Body / párrafo de introducción (.stk-2383209, idéntico en las 4
        rutas; .stk-cca2a86 en /pricing): clamp(1rem, 0.95rem + 0.25vw,
        1.0625rem) → 16px → 17px · line-height 1.65 · medida ≤62ch
     H3 dentro de card de precios (.stk-6d4e87b): se conserva 30px
        (ya legible) — solo se ajusta line-height/ritmo.
     Body en cards sueltas (mobile, "obstáculos"): mínimo 16px con
        line-height 1.6 (evita el preset "small" 13px del tema en 375px).

   VERIFICADO contra el HTML/CSS servido el 2026-07-03. Stackable imprime su
   CSS de bloque nada más abrir el <body> (antes que este archivo, que carga
   por wp_head), así que cada override usa 3 selectores de clase encadenados
   + !important — mismo patrón ya probado en §14 (que hoy vence con éxito el
   text-shadow de estos mismos bloques).
   ========================================================================== */

/* --------------------------------------------------------------------------
   21a) Patrón "intro de sección" — se repite IDÉNTICO en Home, /about,
   /pricing y /blog (mismo patrón Stackable reutilizado, mismos IDs de
   bloque: cf02387 / c73ce97 / 2383209). Una sola regla arregla las 4 rutas.

   Problema real detectado en el HTML servido:
   - H1 (.stk-cf02387): 50px fijos en TODOS los tamaños de pantalla (sin
     reducir en móvil) → en 375px provoca un título de 2-3 líneas muy
     apretado contra el borde de la card.
   - H4 (.stk-c73ce97): 20px fijos, peso 700 — funciona como "eyebrow" bajo
     el H1 pero sin separación clara antes del párrafo (margin-bottom:13px).
   - Párrafo (.stk-2383209): font-size:13px !important en TODOS los tamaños
     (móvil Y desktop) — por debajo del mínimo legible, y sin max-width: la
     línea ocupa el ancho completo de la card (~1100px en desktop, muy por
     encima de los 60-75 caracteres recomendados).
   -------------------------------------------------------------------------- */
.stk-block-heading.stk-cf02387 .stk-block-heading__text {
	font-size: clamp(1.75rem, 1.35rem + 2vw, 3.125rem) !important; /* 28px → 50px */
	line-height: 1.2 !important;
	letter-spacing: -0.01em;
}
.stk-block-heading.stk-cf02387 {
	margin-bottom: 0.875rem !important; /* 14px — mantiene el título pegado a su eyebrow */
}

.stk-block-heading.stk-c73ce97 .stk-block-heading__text {
	font-size: clamp(1.0625rem, 1rem + 0.3vw, 1.25rem) !important; /* 17px → 20px */
	line-height: 1.35 !important;
}
.stk-block-heading.stk-c73ce97 {
	margin-bottom: 1.5rem !important; /* 24px — separa el bloque de titular del cuerpo de texto */
}

.stk-block-text.stk-2383209 .stk-block-text__text {
	font-size: clamp(1rem, 0.95rem + 0.25vw, 1.0625rem) !important; /* 16px → 17px, nunca <16px */
	line-height: 1.65 !important;
	max-width: 62ch; /* medida legible: la card mide ~1100px, sin esto la línea corre libre */
	margin-left: 0 !important;
	margin-right: auto !important;
}
/* §33 (más abajo) agrega text-align:left en desktop a este mismo párrafo —
   antes (sesión Cora) el párrafo se centraba a propósito como bloque
   (margin:auto ambos lados) porque toda la intro era centrada; ahora que la
   intro se ancla a la izquierda, margin-left pasa a 0 para no flotar al
   centro de la columna. En mobile ya era left-aligned de fábrica
   (has-text-align-left-mobile de Stackable), sin cambios ahí. */

/* --------------------------------------------------------------------------
   21b) /pricing — card "Queremos que pagues solo por lo que..."
   Mismo problema de párrafo a 13px que 21a, en un bloque distinto
   (.stk-cca2a86, dentro de la card stk-c11e9a3 que Bruno ya trabajó SOLO en
   sombra/icono/CTA — la tipografía seguía sin tocar). El H3 (.stk-6d4e87b,
   30px) ya es legible: solo se afina el ritmo vertical.
   -------------------------------------------------------------------------- */
.stk-block-heading.stk-6d4e87b .stk-block-heading__text {
	line-height: 1.3 !important;
}
.stk-block-heading.stk-6d4e87b {
	margin-bottom: 0.75rem !important;
}
.stk-block-text.stk-cca2a86 .stk-block-text__text {
	font-size: clamp(1rem, 0.95rem + 0.25vw, 1.0625rem) !important; /* 16px → 17px */
	line-height: 1.6 !important;
}

/* --------------------------------------------------------------------------
   21c) Home — cards "¿Qué obstáculos enfrenta tu negocio hoy?"
   Los párrafos (.stk-6d176d9 / .stk-1d5cae5 / .stk-b1b646f — NO son las
   cards de metodología de Dante, son la sección aparte de 3 obstáculos)
   caen al preset "small" (13px !important) SOLO dentro del media query
   de Stackable a 689px. En desktop no tienen override explícito y se ven
   bien; en 375px quedan por debajo del mínimo legible mobile-first.
   -------------------------------------------------------------------------- */
@media screen and (max-width: 689px) {
	.stk-block-text.stk-6d176d9 .stk-block-text__text,
	.stk-block-text.stk-1d5cae5 .stk-block-text__text,
	.stk-block-text.stk-b1b646f .stk-block-text__text {
		font-size: 1rem !important; /* 16px, mínimo mobile-first */
		line-height: 1.6 !important;
	}
}

/* --------------------------------------------------------------------------
   21d) /about (Servicios) — 3 cards de servicio: alineación en zigzag
   --------------------------------------------------------------------------
   Estructura verificada: 3 bloques imagen+texto alternados. Cards 1 y 3
   (.stk-25e1d91 / .stk-44b6054, encabezados) usan alineación izquierda
   (por defecto o "has-text-align-left" explícito). La card 2
   ("Automatización de Procesos Empresariales.") quedó con
   has-text-align-right en el heading (.stk-dd60508), el párrafo
   (.stk-1e9186f) Y el grupo de botón (.stk-0dbe147) — probablemente un
   resto del editor al mover la imagen al lado contrario. Resultado: el
   texto salta de izquierda → derecha → izquierda entre las 3 cards, rompe
   el ritmo de lectura vertical. Se unifica a izquierda en las 3.
   -------------------------------------------------------------------------- */
.stk-dd60508 .stk-block-heading__text {
	text-align: left !important;
}
.stk-1e9186f .stk-block-text__text {
	text-align: left !important;
}
.stk-0dbe147 .stk-button-group,
.stk-0dbe147 .stk-row {
	justify-content: flex-start !important;
	text-align: left !important;
}

/* --------------------------------------------------------------------------
   21e) Movimiento reducido — no aplica (esta sección no anima nada, solo
   tamaños/alineación/ritmo). Sección vacía a propósito, documentada por
   consistencia con el resto del archivo.
   -------------------------------------------------------------------------- */

/* --------------------------------------------------------------------------
   21f) Gap señalado por Cora (fuera de su alcance): los párrafos de las 5
   cards de metodología (Dante, §20) también caen al preset "small" 13px en
   el media query mobile de Stackable — mismo bug que 21c, selectores
   distintos. Se corrige aquí para no invadir la tipografía interna que Dante
   ya diseñó en desktop (número, ícono, peso del heading).
   -------------------------------------------------------------------------- */
@media screen and (max-width: 689px) {
	.stk-block-text.stk-d560ff0 .stk-block-text__text,
	.stk-block-text.stk-f8ab3aa .stk-block-text__text,
	.stk-block-text.stk-84872b5 .stk-block-text__text,
	.stk-block-text.stk-368f5ea .stk-block-text__text,
	.stk-block-text.stk-2f348aa .stk-block-text__text {
		font-size: 1rem !important;
		line-height: 1.6 !important;
	}
}


/* ==========================================================================
   22) Centrar el título de página (Blocksy "Page Title") en TODAS las rutas
   internas (Servicios, Precios, Contacto, Casos de Éxito) — Home no usa este
   elemento (tiene su propio hero de Stackable, verificado: 0 apariciones de
   .page-title en el HTML de la home), así que no hay riesgo de afectarlo.
   ========================================================================== */
.hero-section .entry-header {
	text-align: center !important;
	display: flex;
	justify-content: center;
}
.page-title {
	text-align: center !important;
	width: 100%;
}


/* ==========================================================================
   26) Home · "Un poco más acerca de AetherAI" — fondo degradado + globo 3D
   ----------------------------------------------------------------------------
   Historial: se probaron campo de puntos, aurora y retícula animada (todos
   descartados) → se dejó fondo blanco plano. Pedido actual del usuario: globo
   3D estilo Magic UI (@magicui/globe, ver aai-globe-bg.js) en una esquina +
   "degradado llamativo" en el resto. Las ondas top/bottom (separadores de
   forma de Stackable heredados de la plantilla) se mantienen ocultas.

   v2: el usuario notó que el degradado anterior (radios de 620/880px) se
   veía como "un recuadro" alrededor del globo — el radio era chico y su
   borde caía dentro de la sección, visible como límite duro. Se hizo
   FULL-BLEED con radios enormes para que el borde cayera fuera de la vista.

   v3: el globo se centró verticalmente y se pegó al borde derecho, pero
   quedaba mayormente TAPADO por los tiles opacos del bento en la franja
   media (la columna derecha del grid ocupa esa zona en casi toda la altura
   de la sección) — solo asomaba en los márgenes de arriba/abajo. El usuario
   confirmó que el globo debe seguir DETRÁS del contenido (z-index bajo), y
   pidió agrandarlo igual de forma significativa para que ocupe esa zona
   (el margen visible en las franjas libres crece con un círculo más grande,
   aunque la franja central siga tapada por los tiles — eso es aceptado).

   v4: degradado simplificado a UNO limpio ("más limpio" pidió el usuario):
   un solo linear-gradient IZQUIERDA→DERECHA (blanco limpio donde está el
   texto → verde hacia el globo a la derecha) + un único radial de apoyo
   anclado al globo para dar algo de brillo concentrado ahí. Se quitaron las
   3 capas radiales anteriores (quedaba con transiciones redundantes).
   ========================================================================== */
.stk-d51f943.stk-block-background {
	background-image:
		radial-gradient(1150px circle at 100% 50%, rgba(0, 212, 126, 0.34) 0%, rgba(0, 212, 126, 0.14) 42%, transparent 75%),
		linear-gradient(90deg, #ffffff 0%, #ffffff 38%, #eafcf3 62%, #cff2e1 85%, #b9ecd6 100%) !important;
	background-color: #ffffff !important;
	position: relative;
	/* Red de seguridad: el globo ahora sangra bastante fuera del borde derecho
	   (a propósito) — esto evitaría cualquier scroll horizontal de página si
	   el tema no lo clipeara ya globalmente. */
	overflow-x: hidden;
}
.stk-d51f943.stk-block-background::before {
	background-color: transparent !important;
	background-image: none !important;
}
/* Separadores de forma (ondas top/bottom) de Stackable: el usuario pidió
   restaurarlos (se habían ocultado en una iteración anterior de esta misma
   sección). Sin regla propia → vuelven a su comportamiento nativo. */

/* --- Globo 3D (esquina superior derecha) ------------------------------------
   ⚠️ Gotcha Stackable ya conocido: hijos directos de un bloque con overlay
   reciben position:relative;z-index:3 forzado → el wrapper necesita
   position:absolute !important (2 clases) + z-index explícito, o queda como
   ítem en flujo (mismo patrón que el carrusel §30). z-index bajo (1): debajo
   del bento (z-index:3 nativo de Stackable).

   ⚠️ Bug real corregido: aunque el wrapper tenía pointer-events:none, el
   CANVAS (hijo) no lo declaraba explícito — pointer-events SÍ es heredado en
   CSS, pero cualquier regla que matchee el canvas con un valor explícito
   (aunque sea de baja especificidad) gana sobre el heredado. Esto dejaba el
   canvas clickeable/arrastrable con el mouse, lo que además chocaba con nuestra
   auto-rotación (state.phi fijado cada frame) y se veía como un giro errático
   sin control. Fix: pointer-events:none !important también en el propio canvas
   (cobe no tiene drag propio — no hay ningún addEventListener de puntero en su
   código fuente — así que bloquear el canvas es 100% seguro). */
/* Pegado del todo al borde derecho, mostrando "un poco más de la mitad"
   (pedido explícito): right es MENOS negativo que -(width/2), así el centro
   del círculo queda ligeramente adentro del borde de la sección → se ve algo
   más del 50% del globo, no exactamente la mitad. Centrado verticalmente con
   top:50%+translateY(-50%) para que quede centrado sin importar la altura
   real de la sección (varía con el contenido).

   Tamaño AGRANDADO significativamente (1400px, antes 960px) a pedido del
   usuario: aunque la franja central del círculo queda detrás de los tiles
   opacos del bento (columna derecha del grid — se acepta, el globo debe
   seguir detrás del contenido), un círculo más grande hace que la porción
   visible en las franjas libres (arriba/abajo del grid + el borde real de
   la sección) sea notablemente más alta/prominente. */
.stk-d51f943 .aai-globe-wrap {
	position: absolute !important;
	top: 50%;
	right: -650px;
	width: 1400px;
	height: 1400px;
	transform: translateY(-50%) !important;
	z-index: 1 !important;
	pointer-events: none !important;
	overflow: hidden;
}
.aai-globe-canvas {
	width: 100%;
	height: 100%;
	opacity: 0;
	pointer-events: none !important;
	transition: opacity 1.1s ease;
}
/* Solo desktop (≥900px): ahí el layout centrado (bento max-width 1140px dentro
   de una sección alignfull) deja margen lateral libre real; en viewports más
   angostos el globo taparía el titular o el bento (ver aai-globe-bg.js, mismo
   breakpoint 900px para no inicializar el WebGL de más). */
@media (max-width: 1400px) {
	.stk-d51f943 .aai-globe-wrap { width: 900px; height: 900px; right: -400px; }
}
@media (max-width: 899px) {
	.stk-d51f943 .aai-globe-wrap { display: none; }
}
@media (prefers-reduced-motion: reduce) {
	.aai-globe-canvas { transition: none; }
}


/* ==========================================================================
   27) CTAs — efecto "Attract" (partículas navy que se magnetizan al centro)
   ----------------------------------------------------------------------------
   Reemplaza el shimmer anterior. Adaptado de KokonutUI "Attract Button" (MIT),
   que es React+framer-motion → recreado en JS/CSS vanilla (ver cta-attract.js).
   Partículas navy de marca (#232643) repartidas por la cara del botón; al
   hover/touch se magnetizan al centro con curva tipo resorte. Navy porque el
   verde sería invisible sobre el botón verde. Sin animación en reposo (solo
   transición CSS al hover) → ligero para 3G.

   Capas: las partículas van en z-index:-1 (el botón crea stacking context con
   isolation:isolate) → pintan SOBRE el fondo verde pero DEBAJO del texto. Se
   desactiva el overlay :after de hover de Stackable (que taparía las
   partículas) y se reemplaza el feedback de hover por un verde más oscuro +
   glow de marca.
   ========================================================================== */

/* --- CTAs de texto de Stackable ------------------------------------------- */
.stk-block-button a.stk-button {
	border-radius: 14px !important;
	position: relative;
	isolation: isolate;
	background-image: none !important;
	background-color: #00d084 !important;
	transition: background-color 0.3s ease, box-shadow 0.3s ease, transform 0.3s ease !important;
}
.stk-block-button a.stk-button:hover {
	background-color: #00b871 !important;
	box-shadow: 0 10px 26px rgba(0, 208, 132, 0.5) !important;
}
/* El overlay :after de hover de Stackable taparía las partículas → apagarlo
   (especificidad 0,3,2 > inline 0,3,1, gana sin depender del orden de carga). */
.stk-block-button a.stk-button:hover::after {
	opacity: 0 !important;
}

/* --- Submit del formulario de contacto ------------------------------------ */
#wpforms-5 .wpforms-submit-container button.wpforms-submit {
	background-image: none !important;
	position: relative;
	isolation: isolate;
}

/* --- Partículas (compartidas) --------------------------------------------- */
.aai-attract-btn {
	position: relative;
}
.aai-particle {
	position: absolute;
	top: 50%;
	left: 50%;
	width: 6px;
	height: 6px;
	margin: -3px 0 0 -3px;
	border-radius: 50%;
	background: #232643;
	pointer-events: none;
	opacity: 0;
	z-index: -1;
	transform: translate(var(--px, 0), var(--py, 0));
	transition: transform 0.8s cubic-bezier(0.34, 1.4, 0.5, 1), opacity 0.4s ease;
}
.aai-attract-btn:hover .aai-particle,
.aai-attract-btn.is-attracting .aai-particle {
	transform: translate(0, 0);
	opacity: 0.9;
}

@media (prefers-reduced-motion: reduce) {
	.aai-particle {
		transition: none;
	}
}


/* ==========================================================================
   28) Home · "¿Qué obstáculos enfrenta tu negocio hoy?" — efecto en cards
   ----------------------------------------------------------------------------
   Adaptado de KokonutUI "Spotlight/Feature cards" (MIT). Tilt 3D magnético
   (JS, ver obstaculos-cards.js), aurora/glow verde de marca tipo spotlight que
   sigue el cursor, línea de acento inferior que crece, y focus-dim de las
   hermanas. Se suma al hover existente (§18: lift −6px + glow + zoom ícono).

   Capas: la card ya es blanca con overflow:hidden + radius 16px. Se le da
   position:relative + isolation:isolate; la capa de aurora va en z-index:-1
   (sobre el blanco, debajo del contenido) y la línea inferior en z-index:2.
   ========================================================================== */

.stk-e9f8ae1 .stk-container.aai-tilt {
	position: relative;
	isolation: isolate;
	transform-style: preserve-3d;
}
/* Durante el tilt: la transición de transform es rápida para seguir el cursor;
   al salir (sin .is-tilting) vuelve con los 0.5s suaves de §18. */
.stk-e9f8ae1 .stk-container.aai-tilt.is-tilting {
	transition: transform 0.1s linear, box-shadow 0.5s cubic-bezier(0.16, 1, 0.3, 1) !important;
}

/* Aurora / glow verde que sigue el cursor (spotlight). */
.aai-card-fx {
	position: absolute;
	inset: 0;
	z-index: -1;
	border-radius: inherit;
	pointer-events: none;
	opacity: 0;
	transition: opacity 0.35s ease;
	background: radial-gradient(
		circle at var(--mx, 50%) var(--my, 25%),
		rgba(0, 212, 126, 0.22),
		transparent 60%
	);
}
.stk-e9f8ae1 .stk-container:hover .aai-card-fx {
	opacity: 1;
}

/* Línea de acento inferior que crece de 0 → 100% al hover.
   Se anima `transform:scaleX` (no `width`) para no disparar layout — cumple la
   guía "animate only transform/opacity" (auditoría web-design-guidelines). */
.aai-card-line {
	position: absolute;
	left: 0;
	bottom: 0;
	height: 3px;
	width: 100%;
	z-index: 2;
	border-radius: 0 3px 3px 0;
	pointer-events: none;
	background: linear-gradient(to right, #00d47e, rgba(0, 212, 126, 0));
	transform: scaleX(0);
	transform-origin: left center;
	transition: transform 0.55s cubic-bezier(0.16, 1, 0.3, 1);
}
.stk-e9f8ae1 .stk-container:hover .aai-card-line {
	transform: scaleX(1);
}

/* Focus-dim: al enfocar una card, las hermanas se atenúan y encogen. */
.stk-e9f8ae1.aai-has-focus .stk-block-column:not(.aai-focus) .stk-container {
	opacity: 0.5;
	transform: scale(0.97);
	transition: opacity 0.3s ease, transform 0.3s ease !important;
}

@media (prefers-reduced-motion: reduce) {
	.aai-card-fx,
	.aai-card-line {
		transition: none;
	}
	.stk-e9f8ae1.aai-has-focus .stk-block-column:not(.aai-focus) .stk-container {
		transform: none;
	}
}


/* ==========================================================================
   29) Loader de navegación entre rutas
   ----------------------------------------------------------------------------
   Overlay de marca que cubre la espera al navegar a otra ruta. Arranca oculto;
   route-loader.js lo muestra solo si la navegación tarda >180ms. Spinner verde
   de marca + wordmark "AetherAI" (Poppins) + "Cargando…" (Inter).
   ========================================================================== */
#aai-route-loader {
	position: fixed;
	inset: 0;
	z-index: 2147483000;
	display: flex;
	flex-direction: column;
	align-items: center;
	justify-content: center;
	gap: 20px;
	background: #ffffff;
	opacity: 0;
	visibility: hidden;
	transition: opacity 0.3s ease, visibility 0s linear 0.3s;
}
#aai-route-loader.is-visible {
	opacity: 1;
	visibility: visible;
	transition: opacity 0.25s ease;
}
#aai-route-loader .aai-rl-spinner {
	width: 52px;
	height: 52px;
	border-radius: 50%;
	border: 3px solid rgba(35, 38, 67, 0.12);
	border-top-color: #00d47e;
	animation: aai-rl-spin 0.8s linear infinite;
}
#aai-route-loader .aai-rl-word {
	font-family: "Poppins", "Inter", system-ui, sans-serif;
	font-weight: 600;
	font-size: 1.2rem;
	letter-spacing: 0.01em;
	color: #232643;
	line-height: 1;
}
#aai-route-loader .aai-rl-word b {
	color: #00d47e;
	font-weight: 600;
}
#aai-route-loader .aai-rl-sub {
	font-family: "Inter", system-ui, sans-serif;
	font-size: 0.78rem;
	color: #8a90a2;
	letter-spacing: 0.06em;
	margin-top: -8px;
}
@keyframes aai-rl-spin {
	to {
		transform: rotate(360deg);
	}
}
@media (prefers-reduced-motion: reduce) {
	#aai-route-loader .aai-rl-spinner {
		animation-duration: 1.6s;
	}
}


/* ==========================================================================
   30) Home · "¿Tienes alguna pregunta?" — carrusel de imágenes marquee
   ----------------------------------------------------------------------------
   Reemplaza la foto de fondo del bloque .stk-6c65edf por dos filas de imágenes
   (Pexels, locales en /uploads/aai-carousel) que se desplazan en direcciones
   opuestas (ver qa-carousel.js). Un velo navy de marca las atenúa para que el
   titular y el CTA sigan legibles.

   ⚠️ Stackable fuerza `position:relative; z-index:3` en los hijos directos de
   un bloque con `stk--has-background-overlay`. Por eso el carrusel y el velo
   necesitan `position:absolute !important` (con 2 clases de especificidad) y su
   z-index explícito; así el carrusel queda de fondo (z0), el velo encima (z1) y
   el contenido de Stackable sigue en z3.
   ========================================================================== */
.stk-6c65edf.stk-block-background {
	background-image: none !important;
	background-color: #16211c !important;
	min-height: 340px;
}

/* --- Carrusel (fondo full-bleed) ------------------------------------------ */
.stk-6c65edf .aai-qa-carousel {
	position: absolute !important;
	top: 0 !important;
	left: 0 !important;
	right: 0 !important;
	bottom: 0 !important;
	z-index: 0 !important;
	overflow: hidden;
	border-radius: inherit;
	display: flex;
	flex-direction: column;
	gap: 14px;
	padding: 14px 0;
}
.aai-qa-row {
	flex: 1 1 0;
	min-height: 0;
	overflow: hidden;
	display: flex;
	align-items: center;
}
.aai-qa-track {
	display: flex;
	gap: 14px;
	height: 100%;
	width: max-content;
	will-change: transform;
}
.aai-qa-row-a .aai-qa-track {
	animation: aai-qa-left 40s linear infinite;
}
.aai-qa-row-b .aai-qa-track {
	animation: aai-qa-right 48s linear infinite;
}
.aai-qa-carousel.aai-qa-paused .aai-qa-track {
	animation-play-state: paused;
}
.aai-qa-img {
	flex: 0 0 auto;
	height: 100%;
	width: auto;
	aspect-ratio: 540 / 350;
	object-fit: cover;
	border-radius: 12px;
	box-shadow: 0 6px 18px rgba(0, 0, 0, 0.28);
}
@keyframes aai-qa-left {
	from { transform: translateX(0); }
	to { transform: translateX(-50%); }
}
@keyframes aai-qa-right {
	from { transform: translateX(-50%); }
	to { transform: translateX(0); }
}

/* --- Velo de marca (legibilidad) + oscurecido en bordes (efecto infinito) -- */
.stk-6c65edf .aai-qa-veil {
	position: absolute !important;
	top: 0 !important;
	left: 0 !important;
	right: 0 !important;
	bottom: 0 !important;
	z-index: 1 !important;
	pointer-events: none;
	border-radius: inherit;
	background:
		linear-gradient(90deg,
			rgba(22, 33, 28, 0.92) 0%,
			rgba(22, 33, 28, 0.5) 22%,
			rgba(22, 33, 28, 0.46) 78%,
			rgba(22, 33, 28, 0.92) 100%),
		linear-gradient(0deg, rgba(0, 212, 126, 0.16), rgba(22, 33, 28, 0.12));
}

/* --- Titular: card más opaca y esmerilada para máxima legibilidad --------- */
.stk-df5dd24.stk-block-background {
	background-color: rgba(255, 255, 255, 0.92) !important;
	-webkit-backdrop-filter: blur(3px);
	backdrop-filter: blur(3px);
}
.stk-df5dd24.stk-block-background::before {
	background-color: rgba(255, 255, 255, 0.92) !important;
}

/* --- Móvil: sección algo más compacta ------------------------------------- */
@media screen and (max-width: 767px) {
	.stk-6c65edf.stk-block-background {
		min-height: 300px;
	}
}

/* --- Fix tablet (690–1199px): titular y botón "Contáctanos ahora" se
   superponían ------------------------------------------------------------
   La fila `.stk-6c65edf-column` reparte titular (flex-basis 70%) + botón
   lado a lado. El botón vive en una columna de solo ~159px en ese rango —
   más angosta que su propio ancho (~187px) — así que desborda hacia la
   izquierda y queda encima del texto (overlap medido con Playwright: 49px
   a 690px, 19px a 800px, recién 0px desde ~900px). Se apilan en 1 columna
   en el mismo tramo que ya usan las demás secciones de esta página.
   2026-07-06: techo subido de 1023 a 1199 — el rango lado-a-lado que
   arrancaba en 1024px volvía a quedar apretado: a 1024px el botón
   "Contáctanos ahora" se partía en 2 líneas y quedaba pegado al titular
   (gap medido de solo 24px, columnas con column-gap:0). Verificado que a
   partir de 1200px el lado-a-lado ya tiene espacio holgado (gap 67px+) —
   se apila hasta justo antes de ese punto. Sin cambios en ≥1200px ni en
   <690px (regla movil aparte). */
@media (min-width: 690px) and (max-width: 1199px) {
	.stk-6c65edf-column {
		flex-direction: column !important;
		align-items: flex-start !important;
	}
	.stk-6c65edf-column .stk-fc8f9a4 {
		margin-top: 20px;
	}
}

/* --- Movimiento reducido: carrusel estático (sigue mostrando las imágenes) - */
@media (prefers-reduced-motion: reduce) {
	.aai-qa-track {
		animation: none !important;
	}
}


/* ==========================================================================
   31) Home · "Un poco más acerca de AetherAI" — REDISEÑO Bento Grid
   ----------------------------------------------------------------------------
   Dirección de ui-ux-pro-max: estilo "Bento Box Grid" (modular, Apple-style,
   cards de tamaños variados, esquinas 22px, sombras suaves, hover lift) +
   patrón "Trust & Authority" (stats/proof, acento solo en 1 tile) + motion
   scroll-reveal con stagger. Fondo limpio (§26). Lectura ligera por bloques.
   El bento lo arma about-bento.js moviendo el contenido real a los tiles.
   ========================================================================== */

/* Eyebrow sobre el titular */
.aai-about-eyebrow {
	display: flex; align-items: center; justify-content: center; gap: 9px;
	font-family: "Inter", system-ui, sans-serif; font-weight: 600; font-size: 12px;
	letter-spacing: 0.22em; text-transform: uppercase; color: #00a862; margin: 0 0 12px;
}
.aai-about-eyebrow .aai-ey-dot {
	width: 7px; height: 7px; border-radius: 50%; background: #00d47e;
	box-shadow: 0 0 0 4px rgba(0, 212, 126, 0.16);
}
.stk-54b4a8d .stk-block-heading__text, .stk-54b4a8d { letter-spacing: -0.02em !important; }

/* Eyebrow + titular corridos a la izquierda (solo desktop, donde vive el
   globo): el usuario reportó que el navy del globo chocaba visualmente con
   el titular al agrandarlo. No es un recorte — es texto navy sobre fondo
   navy, ilegible donde se solapan (confirmado con captura de cerca).
   ⚠️ Ojo #1: .stk-024cfe0-inner-blocks (el padre compartido de ambos)
   TAMBIÉN envuelve todo el bento entero (about-bento.js inserta el grid
   como hermano ahí mismo) — moverlo a él corría TODA la sección, no solo
   el título. Se apunta cada elemento por separado en su lugar.
   ⚠️ Ojo #2: -48px no alcanzaba — con el globo en 1400px (right:-650px), el
   borde visible izquierdo del círculo cae ~816px desde el borde derecho de
   viewports anchos, mucho más adentro de lo que -48px lograba despejar.
   Calculado para que el texto quede claro del círculo en cada nivel de
   tamaño del globo (ver §26: 1400px ≥1400px viewport, 900px en el tramo
   900–1400px). */
@media (min-width: 1401px) {
	.aai-about-eyebrow, .stk-54b4a8d { transform: translateX(-220px); }
}
@media (min-width: 900px) and (max-width: 1400px) {
	.aai-about-eyebrow, .stk-54b4a8d { transform: translateX(-160px); }
}

/* --- Grid bento ----------------------------------------------------------- */
.aai-bento {
	display: grid;
	grid-template-columns: repeat(4, 1fr);
	grid-auto-rows: auto;
	gap: 16px;
	max-width: 1140px;
	margin: 6px auto 0;
	grid-template-areas:
		"story story stat1 stat2"
		"story story image image"
		"quote quote quote stat3"
		"svc   svc   svc   svc";
}

/* --- Tile base ------------------------------------------------------------ */
.aai-bt {
	position: relative;
	overflow: hidden;
	background: #ffffff;
	border: 1px solid rgba(35, 38, 67, 0.06);
	border-radius: 22px;
	padding: 26px 28px;
	box-shadow: 0 12px 30px -20px rgba(35, 38, 67, 0.22);
	transition: transform 0.32s cubic-bezier(0.16, 1, 0.3, 1), box-shadow 0.32s ease;
}
/* Hover lift: sombra en VERDE de marca (antes navy plano que leía gris) +
   una capa navy tenue como base de profundidad realista, y borde verde sutil.
   ⚠️ La regla de reveal `.aai-bento.in .aai-bt` (0,3,0) es más específica que un
   `.aai-bt:hover` (0,2,0) y fijaba transform:translateY(0) → el lift NO ocurría.
   Se sube la especificidad del hover a `.aai-bento.in .aai-bt:hover` (0,4,0)
   para que el translateY(-4px) gane; se deja `.aai-bt:hover` como fallback. */
.aai-bento.in .aai-bt:hover,
.aai-bt:hover {
	transform: translateY(-4px);
	border-color: rgba(0, 212, 126, 0.38);
	box-shadow:
		0 22px 42px -22px rgba(0, 212, 126, 0.55),
		0 8px 20px -16px rgba(35, 38, 67, 0.22);
}
/* Reveal con stagger */
.aai-bento .aai-bt { opacity: 0; transform: translateY(18px); }
.aai-bento.in .aai-bt {
	opacity: 1; transform: translateY(0);
	transition: opacity 0.5s ease, transform 0.55s cubic-bezier(0.16, 1, 0.3, 1);
}
.aai-bento.in .aai-bt:nth-child(1) { transition-delay: 0.02s; }
.aai-bento.in .aai-bt:nth-child(2) { transition-delay: 0.08s; }
.aai-bento.in .aai-bt:nth-child(3) { transition-delay: 0.14s; }
.aai-bento.in .aai-bt:nth-child(4) { transition-delay: 0.20s; }
.aai-bento.in .aai-bt:nth-child(5) { transition-delay: 0.26s; }
.aai-bento.in .aai-bt:nth-child(6) { transition-delay: 0.32s; }
.aai-bento.in .aai-bt:nth-child(7) { transition-delay: 0.38s; }

/* --- Story (2x2) ---------------------------------------------------------- */
.aai-bt-story { grid-area: story; display: flex; flex-direction: column; padding: 30px 32px; }
.aai-bt-kicker {
	font-family: "Inter", system-ui, sans-serif; font-size: 12px; font-weight: 600;
	letter-spacing: 0.12em; text-transform: uppercase; color: #00a862; margin-bottom: 14px;
}
.aai-bt-story .stk-eb3bf86 .stk-block-text__text,
.aai-bt-story .stk-block-text__text {
	font-size: 15px !important; line-height: 1.66 !important; color: #2b2f47 !important;
}
/* Misión: acento fino en vez de caja */
.aai-bt-story .aai-story-body > p {
	background: transparent !important; border: 0 !important;
	border-left: 3px solid #00d47e !important; border-radius: 0 !important;
	box-shadow: none !important; padding: 2px 0 2px 15px !important;
	margin: 18px 0 0 !important; font-size: 14px !important;
}
.aai-bt-story .aai-colombia {
	margin-top: auto !important; padding-top: 18px !important;
	font-size: 13px !important; color: #5a5f78 !important; text-align: left !important;
}

/* --- Stat tiles ----------------------------------------------------------- */
.aai-bt-stat { display: flex; flex-direction: column; justify-content: center; min-height: 150px; }
.aai-bt-stat .num {
	font-family: "Poppins", "Inter", sans-serif; font-weight: 700;
	font-size: clamp(2.4rem, 3.4vw, 3.1rem); line-height: 1; letter-spacing: -0.02em;
	color: #232643; font-variant-numeric: tabular-nums;
}
.aai-bt-stat .num b { font-weight: 700; color: #00a862; }
.aai-bt-stat .lbl {
	margin-top: 12px; font-family: "Inter", system-ui, sans-serif; font-size: 13px;
	line-height: 1.45; color: #4a4f68; max-width: 24ch;
}
.aai-bt-stat::after {
	content: ""; position: absolute; left: 0; top: 22px; bottom: 22px; width: 3px;
	background: linear-gradient(180deg, #00d47e, rgba(0, 212, 126, 0.12));
}

/* --- Image tile ----------------------------------------------------------- */
.aai-bt-image { grid-area: image; padding: 0; margin: 0; min-height: 180px; }
.aai-bt-image img { width: 100%; height: 100%; object-fit: cover; display: block; }
.aai-bt-image::after {
	content: ""; position: absolute; inset: 0;
	background: linear-gradient(180deg, transparent 45%, rgba(35, 38, 67, 0.55) 100%);
}
.aai-bt-image .aai-img-tag {
	position: absolute; left: 16px; bottom: 14px; z-index: 1;
	display: inline-flex; align-items: center; gap: 7px;
	padding: 7px 13px; border-radius: 999px;
	background: rgba(255, 255, 255, 0.16); -webkit-backdrop-filter: blur(8px); backdrop-filter: blur(8px);
	border: 1px solid rgba(255, 255, 255, 0.3);
	font-family: "Inter", system-ui, sans-serif; font-size: 12.5px; font-weight: 600; color: #fff;
}
.aai-bt-image .aai-img-tag::before {
	content: ""; width: 7px; height: 7px; border-radius: 50%; background: #00d47e;
}

/* --- Quote tile (acento navy) --------------------------------------------- */
.aai-bt-quote { grid-area: quote; background: #232643; border-color: transparent; }
.aai-bt-quote::before {
	content: ""; position: absolute; right: -40px; top: -40px; width: 200px; height: 200px;
	border-radius: 50%; background: radial-gradient(circle, rgba(0, 212, 126, 0.22), transparent 70%);
}
/* La card interna del blockquote se vuelve transparente → el navy del tile se
   ve y TODO el texto va blanco (evita blanco-sobre-blanco en las negritas). */
.aai-bt-quote .stk-block-blockquote,
.aai-bt-quote .stk-3f4f31b-container,
.aai-bt-quote .stk-block-text__text {
	background: transparent !important;
	background-color: transparent !important;
	box-shadow: none !important;
	border: 0 !important;
}
.aai-bt-quote .stk-3f4f31b-container { padding: 4px 2px !important; }
/* 3 clases para vencer el <style> inline de Stackable (.stk-3f4f31b .stk-block-text__text, 0,2,0). */
.aai-bt-quote .stk-3f4f31b .stk-block-text__text,
.aai-bt-quote .stk-3f4f31b .stk-block-text__text *,
.aai-bt-quote .stk-3f4f31b p,
.aai-bt-quote .stk-3f4f31b strong { color: #ffffff !important; }
.aai-bt-quote .stk-3f4f31b .stk-block-text__text { font-size: 14.5px !important; line-height: 1.62 !important; }
.aai-bt-quote .stk-blockquote-quote, .aai-bt-quote svg { fill: #00d47e !important; opacity: 0.95; }

/* --- Services tile -------------------------------------------------------- */
.aai-bt-services { grid-area: svc; display: flex; align-items: center; gap: 12px; flex-wrap: wrap; }
.aai-bt-services .svc-label {
	font-family: "Inter", system-ui, sans-serif; font-size: 12px; font-weight: 600;
	letter-spacing: 0.1em; text-transform: uppercase; color: #8a90a2; margin-right: 4px;
}
.aai-chip {
	display: inline-flex; align-items: center; gap: 8px; padding: 9px 16px; border-radius: 999px;
	background: #f4f6f8; border: 1px solid rgba(35, 38, 67, 0.08);
	font-family: "Inter", system-ui, sans-serif; font-size: 13.5px; font-weight: 600; color: #232643;
	transition: transform 0.28s cubic-bezier(0.34, 1.4, 0.5, 1), box-shadow 0.28s ease, border-color 0.28s ease;
	cursor: default;
}
.aai-chip:hover { transform: translateY(-3px); box-shadow: 0 12px 20px -8px rgba(0, 212, 126, 0.4); border-color: rgba(0, 212, 126, 0.5); }
.aai-chip .aai-chip-dot { width: 6px; height: 6px; border-radius: 50%; background: #00d47e; flex: 0 0 auto; }

/* --- Responsive ----------------------------------------------------------- */
@media screen and (max-width: 1024px) {
	.aai-bento {
		grid-template-columns: repeat(2, 1fr);
		grid-template-areas:
			"story story"
			"stat1 stat2"
			"image image"
			"quote quote"
			"stat3 stat3"
			"svc   svc";
	}
}
@media screen and (max-width: 767px) {
	.aai-bento {
		grid-template-columns: 1fr;
		grid-template-areas: "story" "stat1" "stat2" "image" "quote" "stat3" "svc";
		gap: 12px;
	}
	.aai-bt { padding: 22px 22px; }
	.aai-bt-image { min-height: 200px; }
	.aai-bt-services { justify-content: flex-start; }
}

/* --- Movimiento reducido -------------------------------------------------- */
@media (prefers-reduced-motion: reduce) {
	.aai-bento .aai-bt { opacity: 1 !important; transform: none !important; }
	.aai-bt, .aai-chip { transition: none; }
}

/* ==========================================================================
   33) Home · "¿Qué es lo que hacemos en AetherAI?" — intro sin centrar
   ----------------------------------------------------------------------------
   El usuario reportó que el bloque de intro (título + subtítulo + párrafo,
   todo centrado) "se veía un poco feo" — el párrafo centrado en 3 líneas de
   ancho irregular es un anti-patrón clásico (difícil de escanear, se ve
   descuidado). Criterio aplicado (taste-skill-v1, "anti-center bias"):
   alinear a la izquierda + acotar el ancho de línea del párrafo/subtítulo
   (~640px, ≈65 caracteres) en vez de dejarlo correr los 1242px de la
   columna. El H2 ya no "grita" centrado — ancla el bloque a la izquierda,
   con aire real a la derecha (asimetría intencional, no relleno).
   Nota: en mobile el subtítulo/párrafo YA estaban a la izquierda de fábrica
   (clase `has-text-align-left-mobile` de Stackable) — este fix solo faltaba
   en desktop. Solo el bloque de intro; el grid de 5 pasos abajo no se toca.
   El párrafo (.stk-2383209) tiene su propio ajuste de margin/max-width más
   arriba en el archivo (regla de la sesión "Cora") — aquí solo se agrega
   text-align, que esa regla no tocaba. */
@media (min-width: 768px) {
	.stk-cf02387 .stk-block-heading__text,
	.stk-c73ce97 .stk-block-heading__text,
	.stk-2383209 .stk-block-text__text {
		text-align: left !important;
	}
	.stk-c73ce97 .stk-block-heading__text {
		max-width: 640px;
	}
}
/* El usuario pidió acercar el texto al ícono (quedaba mucho hueco entre
   ambos) — se corre el bloque de intro un poco a la derecha en vez de mover
   el ícono, para no perder el aire contra el borde izquierdo de la card.
   Solo tiene sentido cuando el ícono está visible (≥1200px, ver más abajo);
   en 1024-1199px no hay ícono del que acercarse. */
@media (min-width: 1200px) {
	.stk-355d12c-inner-blocks {
		padding-left: 56px;
	}
}
/* 2026-07-07 — el ícono (más abajo) choca con el texto en 1024-1199px
   (confirmado con Playwright: un nodo del ícono cae literalmente sobre
   palabras del párrafo — "herramientas [de] inteligencia" en /about,
   "codo, [entendiendo]" en /blog — en las 3 rutas que comparten esta card).
   Sin el ícono en ese tramo no hay nada que balancear con la asimetría
   izquierda de §33 → se centra el bloque completo (heading/subtítulo/
   párrafo) solo en este rango específico. */
@media (min-width: 1024px) and (max-width: 1199px) {
	.stk-cf02387 .stk-block-heading__text,
	.stk-c73ce97 .stk-block-heading__text,
	.stk-2383209 .stk-block-text__text {
		text-align: center !important;
	}
	/* El H1 (.stk-cf02387) no tiene max-width → ya queda centrado solo con
	   text-align (su caja ya ocupa el ancho disponible). El SUBTÍTULO y el
	   PÁRRAFO sí tienen max-width (640px / 62ch) → hace falta mover la CAJA
	   con margin:auto, no solo el texto adentro. Acá es donde se rompía:
	   - Subtítulo: Stackable trae su propia regla interna con !important
	     (frontend_blocks.css: `.stk-block-heading--v2 .stk-block-heading__text
	     :not(...){margin:0!important}`, 3 clases de especificidad) que le
	     ganaba a un override de solo 2 clases.
	   - Párrafo: la regla de la sesión "Cora" (`.stk-block-text.stk-2383209
	     .stk-block-text__text{margin-left:0!important;margin-right:auto
	     !important}`, también 3 clases) igual le ganaba a un override de 2.
	   Fix: subir a 4 clases (repitiendo `.stk-c73ce97`/`.stk-2383209`, truco
	   válido de especificidad) para ganar el empate sin depender del orden
	   de las hojas de estilo. */
	.stk-9d25175 .stk-c73ce97.stk-c73ce97 .stk-block-heading__text {
		margin-left: auto !important;
		margin-right: auto !important;
	}
	.stk-9d25175 .stk-2383209.stk-2383209 .stk-block-text__text {
		margin-left: auto !important;
		margin-right: auto !important;
	}
}

/* ==========================================================================
   34) Home · Hero móvil/tablet — logo ANTES del botón (no después)
   ----------------------------------------------------------------------------
   El hero tiene 2 columnas: col.1 = texto+botón (--stk-col-order-1:1), col.2 =
   logo (--stk-col-order-2:2). En desktop van lado a lado (flex-direction:row,
   sin wrap) y el order es irrelevante visualmente; en mobile/tablet el row
   NO entra y hace wrap → los hijos se apilan en el orden de `order`, que hoy
   pone texto+botón arriba y el logo al final. El usuario pidió lo contrario:
   logo primero, botón (dentro del bloque de texto) después. Se intercambian
   los valores de las custom properties que Stackable ya consume en su propia
   regla `order:var(--stk-col-order-N,initial)` — no hace falta pelear
   especificidad contra `order` directamente.
   ========================================================================== */
@media (max-width: 1023px) {
	.stk-242acad-column {
		--stk-col-order-1: 2;
		--stk-col-order-2: 1;
	}
}

/* Con el texto acotado a 640px y anclado a la izquierda (arriba), quedaba un
   hueco vacío grande a la derecha de la card (1290px de ancho). En vez de
   volver a estirar el texto (perdería la mejora de legibilidad), se llena
   con un ícono de marca propio: una ruta ascendente de nodos conectados
   (line-art navy + nodo final verde) — conecta con "red de nodos" del
   lenguaje visual de marca y con que este bloque introduce una metodología
   de pasos. Puramente decorativo (aria-hidden vía el propio ::after, sin
   texto alternativo que perder) — oculto <1200px (ver nota arriba: entre
   1024 y 1199px choca con el texto en las 3 rutas; se sube el umbral desde
   1024px en vez de intentar acomodar texto e ícono en ese tramo angosto). */
.stk-9d25175 {
	position: relative;
}
@media (min-width: 1200px) {
	.stk-9d25175::after {
		/* Stackable tiene `.stk-block:after{content:none!important}` global —
		   anula cualquier content sin !important, sin importar especificidad
		   (mismo gotcha del anillo orbital, ver CLAUDE.md). */
		content: "" !important;
		position: absolute;
		top: 50%;
		right: 64px;
		width: 260px;
		height: 180px;
		transform: translateY(-50%);
		background-image: url("data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%220%200%20320%20220%22%20fill%3D%22none%22%3E%20%3Cpath%20d%3D%22M20%20185%20C%2070%20185%2C%2070%20130%2C%20110%20130%20S%20150%2090%2C%20190%2090%20S%20230%2055%2C%20270%2055%22%20stroke%3D%22%23232643%22%20stroke-width%3D%223%22%20stroke-linecap%3D%22round%22%20stroke-dasharray%3D%221%2014%22%2F%3E%20%3Ccircle%20cx%3D%2220%22%20cy%3D%22185%22%20r%3D%227%22%20fill%3D%22none%22%20stroke%3D%22%23232643%22%20stroke-width%3D%223%22%2F%3E%20%3Ccircle%20cx%3D%22110%22%20cy%3D%22130%22%20r%3D%227%22%20fill%3D%22none%22%20stroke%3D%22%23232643%22%20stroke-width%3D%223%22%2F%3E%20%3Ccircle%20cx%3D%22190%22%20cy%3D%2290%22%20r%3D%227%22%20fill%3D%22none%22%20stroke%3D%22%23232643%22%20stroke-width%3D%223%22%2F%3E%20%3Ccircle%20cx%3D%22270%22%20cy%3D%2255%22%20r%3D%2210%22%20fill%3D%22%2300D47E%22%2F%3E%20%3C%2Fsvg%3E");
		background-repeat: no-repeat;
		background-size: contain;
		opacity: 0.85;
		pointer-events: none;
		z-index: 1;
	}
}

/* ==========================================================================
   35) Menú móvil/tablet — rediseño completo de marca (todas las rutas)
   ----------------------------------------------------------------------------
   El panel nativo de Blocksy (`.ct-panel.ct-header`) venía sin identidad:
   fondo transparente, texto navy sobre lo que se veía como un gris apagado
   (Inter Tight, tipografía por defecto de Blocksy — NO la de marca), solo
   fade de opacidad (sin slide), sin jerarquía ni CTA. Contenido de marca
   (wordmark + CTA) inyectado por `mobile-menu-brand.js`; aquí solo estilo.

   Dirección: panel navy sólido (superficie oscura de marca, ya probada en el
   quote tile y el carrusel) que entra en slide desde la derecha (el botón
   hamburguesa vive arriba-derecha → continuidad espacial), scrim propio
   detrás para el sliver de página que queda sin cubrir, nav en Poppins Bold
   grande con stagger de entrada y acento verde en hover/página activa, CTA
   verde al final. Solo transform/opacity animados (compositor). Respeta
   prefers-reduced-motion (sin slide ni stagger, solo fade instantáneo).
   ========================================================================== */

/* --- Panel: fondo navy + slide-in + scrim propio --------------------------- */
.ct-panel.ct-header {
	width: min(86vw, 400px) !important;
	max-width: 400px !important;
	background: linear-gradient(165deg, #232643 0%, #1a1c33 100%) !important;
	box-shadow: -24px 0 60px rgba(15, 17, 30, 0.35) !important;
	/* 2026-07-06: Blocksy fija left:0 por defecto en este panel — pese a que
	   el markup ya trae data-behaviour="right-side" y el transform de abajo
	   está pensado para entrar desde la derecha, el panel aterrizaba pegado
	   a la IZQUIERDA (confirmado: rect.left=0 en 320–768px). Se neutraliza
	   el left:0 y se ancla a la derecha explícitamente. */
	left: auto !important;
	right: 0 !important;
	transform: translateX(100%);
	transition: transform 0.45s cubic-bezier(0.16, 1, 0.3, 1), opacity 0.45s ease !important;
	overflow-y: auto;
}
.ct-panel.ct-header.active {
	transform: translateX(0);
}
/* Scrim propio: cubre el sliver de página que el panel (86vw, tope 400px) no
   tapa — en tablet/desktop puede ser bastante. Vive en el ::before del panel
   (fixed, inset:0 se calcula contra el viewport, no contra el ancho del
   panel) para no depender de un elemento extra en el HTML. */
.ct-panel.ct-header::before {
	content: "" !important;
	position: fixed;
	inset: 0;
	background: rgba(12, 14, 26, 0.5);
	opacity: 0;
	transition: opacity 0.4s ease;
	z-index: -1;
	pointer-events: none;
}
.ct-panel.ct-header.active::before {
	opacity: 1;
}

/* --- Botón cerrar: círculo verde al hover ----------------------------------- */
.ct-panel.ct-header .ct-panel-actions {
	padding: 22px 22px 0 !important;
}
.ct-panel.ct-header .ct-toggle-close {
	width: 44px !important;
	height: 44px !important;
	border-radius: 50% !important;
	display: flex !important;
	align-items: center;
	justify-content: center;
	transition: background-color 0.25s ease, transform 0.25s cubic-bezier(0.16, 1, 0.3, 1) !important;
}
.ct-panel.ct-header .ct-toggle-close svg {
	stroke: #ffffff !important;
	color: #ffffff !important;
	width: 20px !important;
	height: 20px !important;
}
@media (hover: hover) {
	.ct-panel.ct-header .ct-toggle-close:hover {
		background-color: #00d47e !important;
		transform: rotate(90deg);
	}
	.ct-panel.ct-header .ct-toggle-close:hover svg {
		stroke: #232643 !important;
		color: #232643 !important;
	}
}

/* --- Wordmark + tagline (inyectados por mobile-menu-brand.js) -------------- */
.aai-menu-head {
	padding: 8px 30px 26px;
	border-bottom: 1px solid rgba(255, 255, 255, 0.1);
	margin: 0 30px 22px;
	padding-left: 0;
	padding-right: 0;
}
/* Blocksy reparte el alto disponible 50/50 entre los 2 .ct-panel-content
   (flex:1 1 0%) sin importar cuánto contenido tenga cada uno — el wordmark
   (chico) quedaba con la mitad del panel para sí, dejando un hueco vacío
   antes del nav. Se ajusta a "según contenido" + el nav toma el resto. */
.ct-panel.ct-header .ct-panel-content:has(.aai-menu-head) {
	flex: 0 0 auto !important;
}
.ct-panel.ct-header .ct-panel-content:has(nav.mobile-menu) {
	flex: 1 1 auto !important;
}
.aai-menu-word {
	display: block;
	font-family: "Poppins", sans-serif;
	font-weight: 700;
	font-size: 22px;
	color: #ffffff;
	letter-spacing: -0.01em;
}
.aai-menu-word b {
	color: #00d47e;
	font-weight: 700;
}
.aai-menu-tag {
	display: block;
	font-family: "Inter", sans-serif;
	font-size: 12px;
	color: rgba(255, 255, 255, 0.55);
	margin-top: 4px;
}

/* --- Nav: Poppins Bold, grande, stagger de entrada, acento verde ----------- */
.ct-panel.ct-header nav.mobile-menu {
	padding: 0 30px !important;
}
.ct-panel.ct-header .mobile-menu > ul {
	display: flex;
	flex-direction: column;
	gap: 4px;
}
.ct-panel.ct-header .ct-menu-link {
	font-family: "Poppins", sans-serif !important;
	font-weight: 700 !important;
	/* 2026-07-06: antes 24px fijo en TODO el rango móvil→tablet (320–1023px) —
	   desproporcionado en pantallas chicas. Curva fluida: ~20px en 320px,
	   sube con el viewport, techa en 25px desde ~600px. Verificado sin
	   overflow ni corte de palabras en el ítem más largo ("PLANES Y
	   PRECIOS") a 320/375/414/600/768px. */
	font-size: clamp(19px, 4.4vw + 6px, 25px) !important;
	line-height: 1.35 !important;
	color: #ffffff !important;
	letter-spacing: -0.01em;
	padding: 12px 0 !important;
	display: inline-flex !important;
	align-items: center;
	gap: 10px;
	min-height: 44px;
	opacity: 0;
	transform: translateY(16px);
	transition:
		color 0.25s ease,
		transform 0.35s cubic-bezier(0.16, 1, 0.3, 1),
		opacity 0.35s ease !important;
}
.ct-panel.ct-header.active .ct-menu-link {
	opacity: 1;
	transform: translateY(0);
}
.ct-panel.ct-header .menu-item:nth-child(1) .ct-menu-link { transition-delay: 0.1s; }
.ct-panel.ct-header .menu-item:nth-child(2) .ct-menu-link { transition-delay: 0.15s; }
.ct-panel.ct-header .menu-item:nth-child(3) .ct-menu-link { transition-delay: 0.2s; }
.ct-panel.ct-header .menu-item:nth-child(4) .ct-menu-link { transition-delay: 0.25s; }
.ct-panel.ct-header .menu-item:nth-child(5) .ct-menu-link { transition-delay: 0.3s; }
/* Página actual: punto verde permanente (no depende solo de color, ver
   `color-not-only` — un usuario con daltonismo igual distingue el marcador). */
.ct-panel.ct-header .current-menu-item .ct-menu-link {
	color: #00d47e !important;
}
.ct-panel.ct-header .current-menu-item .ct-menu-link::after {
	content: "";
	width: 7px;
	height: 7px;
	border-radius: 50%;
	background: #00d47e;
	flex-shrink: 0;
}
@media (hover: hover) {
	.ct-panel.ct-header .ct-menu-link:hover,
	.ct-panel.ct-header .ct-menu-link:focus-visible {
		color: #00d47e !important;
		transform: translateX(8px);
	}
}

/* --- CTA final (inyectado por mobile-menu-brand.js) ------------------------ */
.aai-menu-cta {
	display: flex !important;
	align-items: center;
	justify-content: center;
	gap: 8px;
	margin: 30px 30px 34px;
	padding: 15px 22px;
	background: #00d47e;
	color: #232643 !important;
	font-family: "Inter", sans-serif;
	font-weight: 700;
	font-size: 15px;
	border-radius: 12px;
	text-decoration: none !important;
	min-height: 48px;
	transition: transform 0.25s cubic-bezier(0.16, 1, 0.3, 1), box-shadow 0.25s ease;
}
@media (hover: hover) {
	.aai-menu-cta:hover {
		transform: translateY(-2px);
		box-shadow: 0 10px 24px rgba(0, 212, 126, 0.35);
	}
}

/* --- Movimiento reducido: solo fade, sin slide ni stagger ------------------ */
@media (prefers-reduced-motion: reduce) {
	.ct-panel.ct-header,
	.ct-panel.ct-header .ct-menu-link,
	.ct-panel.ct-header .ct-toggle-close,
	.aai-menu-cta {
		transition: opacity 0.25s ease !important;
		transform: none !important;
	}
	.ct-panel.ct-header .ct-menu-link {
		opacity: 1;
		transition-delay: 0s !important;
	}
}

/* ===========================================================================
   §36 · Barra de scroll de marca (ergonómica) — 2026-07-06
   Reemplaza la scrollbar gris del sistema por una delgada y flotante en navy
   de marca que vira a verde al agarrarla. Solo en punteros finos (desktop);
   en móvil se conserva la scrollbar nativa de overlay (no molesta ni ocupa
   ancho). Aplica global (documento + paneles internos como el menú).
   =========================================================================== */
@media (pointer: fine) {
	html {
		scrollbar-width: thin;
		scrollbar-color: #2c2f52 transparent; /* thumb / track (Firefox) */
	}
	::-webkit-scrollbar {
		width: 12px;
		height: 12px;
	}
	::-webkit-scrollbar-track {
		background: transparent;
	}
	::-webkit-scrollbar-thumb {
		background-color: #2c2f52; /* navy de marca, apenas aclarado para verse */
		border-radius: 999px;
		border: 3px solid transparent; /* aire → pulgar delgado y flotante */
		background-clip: padding-box;
		transition: background-color 0.25s ease;
	}
	::-webkit-scrollbar-thumb:hover {
		background-color: #00d47e; /* verde de marca */
		background-clip: padding-box;
	}
	::-webkit-scrollbar-thumb:active {
		background-color: #00b46b;
		background-clip: padding-box;
	}
	::-webkit-scrollbar-corner {
		background: transparent;
	}
}

/* ===========================================================================
   §37 · Navbar: separación extra logo↔links en ~1000-1300px (2026-07-06,
   subido 2026-07-07 a pedido del usuario: "ya puedes dar más espaciado").
   Complementa a aai-navbar-safety.js (red de seguridad dinámica que corrige
   la condición de carrera del "priority nav" de Blocksy) con un empujón fijo
   simple: separa el bloque completo del menú del logo en el rango donde el
   navbar ya es de escritorio pero el espacio es más ajustado.
   =========================================================================== */
@media (min-width: 1000px) and (max-width: 1300px) {
	header.ct-header .header-menu-1 {
		margin-left: 124px !important; /* subido de 52px 2026-07-08: con el 5to link (RECURSOS) el push fijo quedaba insuficiente por el efecto de justify-content:center del contenedor padre (un margin asimétrico solo desplaza la MITAD de su valor al centrar) */
	}
}

/* ===========================================================================
   §38 · /about — Rediseño "Servicios": de 6 filas apiladas a grid de cards
   (2026-07-07). Dirección: ui-ux-pro-max (Feature-Rich Showcase / Bento Box
   Grid) + design-taste-frontend (anti-slop: sin 3-cards-iguales repetido x2,
   un solo acento de marca, tratamiento de ícono consistente, motion con
   propósito). Reordenado además: Página Web ahora va antes de Email
   Marketing (pedido del usuario) — ver bitácora, swap hecho en el contenido.

   MECÁNICA: `services-grid.js` mueve los 6 bloques `.stk-block-feature`
   (hijos directos de `.entry-content`) a un wrapper `.aai-services-grid`
   nuevo (display:grid), sin tocar el contenido de la BD. La card intro
   (.stk-9d25175) y el bloque final (.stk-6df3a26) NO se tocan — quedan fuera
   del wrapper, a ancho completo como ya estaban.

   Dentro de cada card, el layout interno de Stackable (columna 80% texto /
   20% ícono, lado a lado) se pasa a columna vertical (ícono arriba en un
   tile cuadrado unificado, texto y CTA abajo) — funciona para los 3 servicios
   originales (ilustración PNG bespoke) y los 3 nuevos (línea navy propia)
   por igual, sin importar el estilo de la imagen fuente.

   ESPECIFICIDAD: 3 clases donde se pisa un inline de Stackable (convención
   del proyecto — su CSS se imprime en el <body>, después de este archivo).
   =========================================================================== */

.aai-services-grid {
	display: grid;
	grid-template-columns: repeat(3, 1fr);
	gap: 32px;
	margin-bottom: 48px;
}

/* --- Card: contenedor, marco, elevación -------------------------------------
   Flota CONSTANTEMENTE (no solo en hover — el usuario lo pidió explícito,
   mismo lenguaje que aai-logo-float del hero: siempre activa, no atada a
   interacción) con una sombra verde de marca acompañando el movimiento en
   todo momento. `animation-delay` negativo + `--aai-i` (ya seteado por
   services-grid.js para el stagger del reveal) desfasa las 6 cards entre sí
   para que no floten todas en el mismo instante — se ve más orgánico. */
.aai-services-grid > .stk-block-feature {
	margin: 0 !important;
	border-radius: 20px !important;
	border: 1px solid rgba(35, 38, 67, 0.08) !important;
	background: #ffffff;
	box-shadow:
		0 2px 4px rgba(35, 38, 67, 0.05),
		0 18px 36px rgba(35, 38, 67, 0.10),
		0 30px 60px -18px rgba(0, 212, 126, 0.35) !important;
	transition:
		box-shadow 0.5s cubic-bezier(0.16, 1, 0.3, 1),
		border-color 0.35s ease !important;
	animation: aai-card-float 3.2s ease-in-out infinite;
	animation-delay: calc(var(--aai-i, 0) * -0.5s);
	display: flex !important;
	position: relative;
	--mx: 50%;
	--my: 50%;
}
@keyframes aai-card-float {
	0%, 100% { transform: translateY(0); }
	50%      { transform: translateY(-8px); }
}
/* Se probó pausar el flotado fuera de viewport (IntersectionObserver, mismo
   patrón que el globo/partículas del hero) y empeoró todo — el propio
   transform hace que el observer dispare sin parar. Ver nota completa en
   services-grid.js. Revertido: las 6 cards flotan siempre, sin excepción. */
/* Stackable imprime column-gap vía var(); la vaciamos y armamos el espaciado
   nosotros — el contenedor pasa a ser el área con padding de la card. Altura
   100% en toda la cadena para que el botón se pueda anclar abajo más adelante
   (flexbox necesita una altura real que repartir, no solo "el contenido"). */
.aai-services-grid .stk-content-align.stk-container {
	width: 100%;
	height: 100%;
}
/* Hijo DIRECTO nada más — el botón (más abajo) usa OTRO div con la misma
   clase .stk-row anidado adentro (button-group); sin el ">" esta regla le
   pisaba flex-direction:column + padding también a esa fila del botón,
   descuadrando el centrado. */
.aai-services-grid .stk-content-align.stk-container > .stk-row {
	flex-direction: column !important;
	align-items: stretch !important;
	gap: 0 !important;
	width: 100%;
	height: 100%;
	padding: 36px 32px 32px !important;
	box-sizing: border-box !important;
}

/* --- Columnas: de 80/20 lado-a-lado a apiladas -----------------------------
   OJO: la card "Automatización de Procesos" (2ª del set original) tiene el
   layout ESPEJADO en el markup fuente (ícono PRIMERO, texto DESPUÉS — al
   revés que las otras 5). Por eso no se puede asumir "el ícono es
   :last-child": se selecciona por CONTENIDO (:has(.stk-block-image)), que
   funciona sin importar el orden real en el DOM de cada card. */
.aai-services-grid .stk-block-column {
	max-width: 100% !important;
	width: 100% !important;
}
/* Cada columna trae un margin-left/right de ~24px inline (var columnSpacing,
   pensado para separar las 2 columnas cuando iban lado a lado). Al apilarlas
   en columna esto queda huérfano: desplaza el wrapper hacia la derecha sin
   reducir su ancho, y todo lo de adentro (botón incluido) se ve descuadrado
   ~24px del centro real de la card. Se neutraliza. */
.aai-services-grid .stk-column-wrapper {
	margin-left: 0 !important;
	margin-right: 0 !important;
}
.aai-services-grid .stk-row > .stk-block-column:has(.stk-block-image) {
	flex: 0 0 auto !important;
	order: -1;
	margin-bottom: 22px;
}
/* La columna de texto crece para ocupar el resto de la card — necesario para
   que margin-top:auto del botón (más abajo) tenga espacio real que empujar. */
.aai-services-grid .stk-row > .stk-block-column:not(:has(.stk-block-image)) {
	flex: 1 1 auto !important;
	display: flex !important;
	flex-direction: column !important;
}
.aai-services-grid .stk-row > .stk-block-column:not(:has(.stk-block-image)) > .stk-column-wrapper,
.aai-services-grid .stk-row > .stk-block-column:not(:has(.stk-block-image)) .stk-inner-blocks {
	display: flex !important;
	flex-direction: column !important;
	flex: 1 1 auto !important;
}

/* --- Tile de ícono unificado (misma caja para PNG bespoke y línea propia),
   centrado horizontalmente en la card. ------------------------------------- */
.aai-services-grid .stk-row > .stk-block-column:has(.stk-block-image) {
	display: flex !important;
	justify-content: center !important;
}
.aai-services-grid .stk-block-image {
	width: 72px !important;
	height: 72px !important;
	padding: 16px !important;
	box-sizing: border-box !important;
	background: rgba(0, 212, 126, 0.10) !important;
	border-radius: 16px !important;
	display: flex !important;
	align-items: center !important;
	justify-content: center !important;
	margin: 0 auto !important;
}
.aai-services-grid .stk-img {
	object-fit: contain !important;
}

/* --- Tipografía y CTA: el heading gana algo de aire, el botón se ancla
   abajo (mt-auto, ahora sí funcional gracias a la cadena flex de arriba) para
   que las 6 cards terminen con el CTA a la misma altura pese a párrafos de
   distinto largo. ------------------------------------------------------------ */
.aai-services-grid .stk-block-heading {
	margin-bottom: 10px !important;
}
/* Los 6 headings/párrafos traen tamaños pensados para la columna ANCHA
   original (80% de una fila full-width, ~35px/50px-mobile de heading). En
   una card de ~300-380px esos tamaños partían palabras largas a la mitad
   ("Implementació" + "n") y disparaban la altura de la card a ~900px. Se
   bajan a una escala de card sin tocar el copy. */
.aai-services-grid .stk-block-heading__text {
	font-size: 21px !important;
	line-height: 1.3 !important;
}
.aai-services-grid .stk-block-text {
	margin-bottom: 22px !important;
}
.aai-services-grid .stk-block-text__text {
	font-size: 14.5px !important;
	line-height: 1.6 !important;
}
.aai-services-grid .stk-block-button-group {
	margin-top: auto !important;
}
/* El botón venía con contentAlign:"left" (alineado al borde izquierdo,
   heredado del layout ancho original) — se centra para que quede a juego
   con el ícono, ya centrado arriba. La fila interna del button-group
   también es .stk-row (por eso el fix del ">" arriba es necesario: sin él,
   la regla del row exterior le ganaba a esta por orden de cascada). */
.aai-services-grid .stk-block-button-group .stk-row {
	justify-content: center !important;
}
/* CTA en 1 sola línea: el copy se acortó en el contenido (ver bitácora) para
   que quepa; esto es red de seguridad si algún texto igual roza el límite. */
.aai-services-grid .stk-button {
	white-space: nowrap !important;
}
.aai-services-grid .stk-button__inner-text {
	font-size: 14px !important;
}

/* --- Reveal con stagger (motion motivado: jerarquía de entrada, no decor) -- */
.aai-services-grid > .stk-block-feature.aai-sg-reveal {
	opacity: 0;
	transform: translateY(22px);
	transition:
		opacity 0.6s cubic-bezier(0.16, 1, 0.3, 1),
		transform 0.6s cubic-bezier(0.16, 1, 0.3, 1),
		box-shadow 0.5s cubic-bezier(0.16, 1, 0.3, 1) !important;
	transition-delay: calc(var(--aai-i, 0) * 55ms);
}
.aai-services-grid > .stk-block-feature.aai-sg-in {
	opacity: 1;
	transform: none;
}

/* El flotado y la sombra verde ya son permanentes (ver regla base más arriba)
   — no hace falta un bloque `:hover` para eso. El hover solo activa el
   MagicCard (spotlight + borde con gradiente, más abajo), que sí depende de
   la posición del cursor. */

/* ---------------------------------------------------------------------------
   "MagicCard" (Magic UI, MIT) recreado en JS/CSS vanilla — el sitio es
   WordPress+Stackable, no React, así que no se puede instalar el componente
   shadcn tal cual; se toma solo el COMPORTAMIENTO (mismo criterio que el resto
   de efectos "de Magic UI/KokonutUI" de este proyecto, ver CLAUDE.md). Dos
   capas: (1) spotlight de fondo que sigue el cursor, (2) borde con gradiente
   radial que también sigue el cursor. `services-grid.js` escribe --mx/--my
   por card en cada mousemove y togglea .is-magic-hover en enter/leave.
   -------------------------------------------------------------------------- */
.aai-magic-spot {
	position: absolute;
	inset: 0;
	border-radius: inherit;
	pointer-events: none;
	opacity: 0;
	transition: opacity 0.35s ease;
	background: radial-gradient(260px circle at var(--mx) var(--my), rgba(0, 212, 126, 0.14), transparent 70%);
	z-index: 0;
}
.aai-services-grid > .stk-block-feature.is-magic-hover .aai-magic-spot {
	opacity: 1;
}
/* Borde con gradiente radial: técnica de doble background-image
   (relleno blanco en padding-box + gradiente en border-box) — solo se activa
   en hover; en reposo el borde sigue siendo el gris sutil de siempre. */
@media (hover: hover) {
	.aai-services-grid > .stk-block-feature.is-magic-hover {
		border-color: transparent !important;
		background-image:
			linear-gradient(#ffffff, #ffffff),
			radial-gradient(240px circle at var(--mx) var(--my), rgba(0, 212, 126, 0.85), rgba(35, 38, 67, 0.08) 55%);
		background-origin: border-box;
		background-clip: padding-box, border-box;
	}
}
/* El contenido de la card (texto/ícono) va por encima de la capa de spotlight
   — el spotlight es puramente decorativo, z0, sin interferir con el click.
   :not(.aai-magic-spot) es obligatorio: sin él, este selector (2 clases,
   más específico que la regla propia de .aai-magic-spot de una sola clase)
   le pisaba position:absolute → el spot pasaba a ocupar espacio en el flex
   y desplazaba el layout real de la card en cada hover. */
.aai-services-grid > .stk-block-feature > *:not(.aai-magic-spot) {
	position: relative;
	z-index: 1;
}

/* --- Responsive: 2 columnas en tablet, 1 en móvil -------------------------- */
@media (min-width: 690px) and (max-width: 1023px) {
	.aai-services-grid {
		grid-template-columns: repeat(2, 1fr);
		gap: 24px;
	}
}
@media (max-width: 689px) {
	.aai-services-grid {
		grid-template-columns: 1fr;
		gap: 20px;
	}
	.aai-services-grid .stk-content-align.stk-container > .stk-row {
		padding: 28px 24px 26px !important;
	}
}

/* --- Movimiento reducido --------------------------------------------------- */
@media (prefers-reduced-motion: reduce) {
	.aai-services-grid > .stk-block-feature {
		animation: none !important;
		transform: none !important;
		transition: none !important;
	}
	.aai-services-grid > .stk-block-feature.aai-sg-reveal {
		opacity: 1;
		transform: none;
		transition: none !important;
	}
	.aai-magic-spot {
		transition: none !important;
	}
}

/* --------------------------------------------------------------------------
   §39 · /about — Franja "¿Por qué elegirnos?" (2026-07-08)
   5 valores de la Brand Bible reescritos como beneficio, entre la intro y el
   grid de servicios (§38). Deliberadamente SIN cards (el grid de abajo ya usa
   ese lenguaje): solo ícono Lucide verde + frase, separados por espacio.
   Reveal con stagger reutilizando aai-reveal.js (selector extendido).
   -------------------------------------------------------------------------- */
.aai-why {
	max-width: 1160px;
	margin: 0.5rem auto 3.5rem;
	padding: 2.75rem 1.5rem 0;
	border-top: 1px solid rgba(35, 38, 67, 0.08);
}

.aai-why-title {
	text-align: center;
	color: #232643;
	font-size: clamp(1.35rem, 2.4vw, 1.8rem);
	font-weight: 700;
	margin: 0 0 2.25rem;
}

.aai-why-list {
	list-style: none;
	margin: 0;
	padding: 0;
	display: flex;
	flex-wrap: wrap;
	justify-content: center;
	gap: 2rem 1.25rem;
}

.aai-why-item {
	flex: 0 1 190px;
	display: flex;
	flex-direction: column;
	align-items: center;
	text-align: center;
	gap: 0.7rem;
}

.aai-why-icon {
	display: grid;
	place-items: center;
	width: 48px;
	height: 48px;
	color: #00d47e;
	transition: color 0.25s ease, transform 0.25s ease;
}

.aai-why-item:hover .aai-why-icon {
	color: #00ef8e;
	transform: translateY(-3px);
}

.aai-why-text {
	margin: 0;
	color: #232643;
	font-size: 0.95rem;
	font-weight: 600;
	line-height: 1.45;
	max-width: 21ch;
}

/* Tablet: 3+2 centrado (el flex-wrap + justify-content lo resuelve solo). */
@media screen and (max-width: 1023px) {
	.aai-why-item {
		flex-basis: 200px;
	}
}

/* Móvil: apiladas a ancho completo, siempre centradas. */
@media screen and (max-width: 639px) {
	.aai-why {
		margin-bottom: 2.5rem;
		padding-top: 2.25rem;
	}
	.aai-why-list {
		flex-direction: column;
		align-items: center;
		gap: 1.6rem;
	}
	.aai-why-item {
		flex-basis: auto;
		width: 100%;
		max-width: 320px;
	}
}

/* Reveal con stagger por ítem — las clases .aai-reveal/.aai-in las gestiona
   aai-reveal.js (solo si la sección está bajo el fold; respeta
   prefers-reduced-motion porque el script ni siquiera corre en ese caso). */
.aai-why.aai-reveal .aai-why-title,
.aai-why.aai-reveal .aai-why-item {
	opacity: 0;
	transform: translateY(14px);
	transition: opacity 0.45s ease, transform 0.45s ease;
}

.aai-why.aai-reveal.aai-in .aai-why-title,
.aai-why.aai-reveal.aai-in .aai-why-item {
	opacity: 1;
	transform: none;
}

.aai-why.aai-reveal.aai-in .aai-why-item:nth-child(1) { transition-delay: 0.08s; }
.aai-why.aai-reveal.aai-in .aai-why-item:nth-child(2) { transition-delay: 0.15s; }
.aai-why.aai-reveal.aai-in .aai-why-item:nth-child(3) { transition-delay: 0.22s; }
.aai-why.aai-reveal.aai-in .aai-why-item:nth-child(4) { transition-delay: 0.29s; }
.aai-why.aai-reveal.aai-in .aai-why-item:nth-child(5) { transition-delay: 0.36s; }

/* --------------------------------------------------------------------------
   §40 · Íconos de card-intro por ruta (2026-07-08)
   El ::after de .stk-9d25175 (§34, ruta de nodos) es la base compartida por
   las 3 rutas; aquí solo se cambia el background-image por página vía body
   class (mayor especificidad = gana sin !important). Home conserva la ruta
   de nodos. Mismo lenguaje visual: trazo navy 3px, puntitos 1/14, un único
   foco verde. Conceptos del set de iconografía de la Brand Bible:
   /about  = chip con circuitos hacia nodos ("Chip — tecnología e IA")
   /blog   = target con check ("Target con check — objetivos y precisión")
   Aprobado por el usuario sobre preview antes de desplegar.
   -------------------------------------------------------------------------- */
@media (min-width: 1200px) {
	body.page-id-766 .stk-9d25175::after {
		background-image: url("data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%220%200%20320%20220%22%20fill%3D%22none%22%3E%3Crect%20x%3D%22122%22%20y%3D%2272%22%20width%3D%2276%22%20height%3D%2276%22%20rx%3D%2212%22%20stroke%3D%22%23232643%22%20stroke-width%3D%223%22%2F%3E%3Crect%20x%3D%22143%22%20y%3D%2293%22%20width%3D%2234%22%20height%3D%2234%22%20rx%3D%225%22%20stroke%3D%22%23232643%22%20stroke-width%3D%223%22%2F%3E%3Cpath%20d%3D%22M198%2090%20H262%20V62%22%20stroke%3D%22%23232643%22%20stroke-width%3D%223%22%20stroke-linecap%3D%22round%22%20stroke-dasharray%3D%221%2014%22%2F%3E%3Cpath%20d%3D%22M122%20110%20H56%22%20stroke%3D%22%23232643%22%20stroke-width%3D%223%22%20stroke-linecap%3D%22round%22%20stroke-dasharray%3D%221%2014%22%2F%3E%3Cpath%20d%3D%22M198%20132%20H248%20V170%22%20stroke%3D%22%23232643%22%20stroke-width%3D%223%22%20stroke-linecap%3D%22round%22%20stroke-dasharray%3D%221%2014%22%2F%3E%3Cpath%20d%3D%22M160%2072%20V36%22%20stroke%3D%22%23232643%22%20stroke-width%3D%223%22%20stroke-linecap%3D%22round%22%20stroke-dasharray%3D%221%2014%22%2F%3E%3Ccircle%20cx%3D%22262%22%20cy%3D%2248%22%20r%3D%2210%22%20fill%3D%22%2300D47E%22%2F%3E%3Ccircle%20cx%3D%2244%22%20cy%3D%22110%22%20r%3D%227%22%20stroke%3D%22%23232643%22%20stroke-width%3D%223%22%2F%3E%3Ccircle%20cx%3D%22248%22%20cy%3D%22183%22%20r%3D%227%22%20stroke%3D%22%23232643%22%20stroke-width%3D%223%22%2F%3E%3Ccircle%20cx%3D%22160%22%20cy%3D%2225%22%20r%3D%227%22%20stroke%3D%22%23232643%22%20stroke-width%3D%223%22%2F%3E%3C%2Fsvg%3E");
	}
	body.page-id-283 .stk-9d25175::after {
		background-image: url("data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%220%200%20320%20220%22%20fill%3D%22none%22%3E%3Ccircle%20cx%3D%22150%22%20cy%3D%22112%22%20r%3D%2275%22%20stroke%3D%22%23232643%22%20stroke-width%3D%223%22%2F%3E%3Ccircle%20cx%3D%22150%22%20cy%3D%22112%22%20r%3D%2248%22%20stroke%3D%22%23232643%22%20stroke-width%3D%223%22%2F%3E%3Ccircle%20cx%3D%22150%22%20cy%3D%22112%22%20r%3D%2222%22%20fill%3D%22%2300D47E%22%2F%3E%3Cpath%20d%3D%22M140%20112%20l7%208%20l15%20-16%22%20stroke%3D%22%23232643%22%20stroke-width%3D%225%22%20stroke-linecap%3D%22round%22%20stroke-linejoin%3D%22round%22%2F%3E%3Cpath%20d%3D%22M290%2024%20L216%2073%22%20stroke%3D%22%23232643%22%20stroke-width%3D%223%22%20stroke-linecap%3D%22round%22%20stroke-dasharray%3D%221%2014%22%2F%3E%3C%2Fsvg%3E");
	}
}

/* --------------------------------------------------------------------------
   §41 · Entrada de la card-intro en /about y /blog (2026-07-08)
   La card-intro (.stk-9d25175) es el primer bloque de estas 2 rutas → queda
   sobre el fold, así que aai-reveal.js la salta (solo revela lo que está bajo
   el fold al cargar) y se veía plana, sin la armonía de entrada del resto de
   la página. Se le da una entrada de CARGA (no de scroll) reutilizando el
   mismo gate anti-flash del hero de Home (html.aai-js oculta desde el primer
   paint; html.aai-anim-ready dispara tras document.fonts.ready, ver
   functions.php) y la MISMA curva ease-out-expo. Sube + fade + un scale muy
   sutil que la asienta en su sitio. Solo transform/opacity (compositor, sin
   reflow/CLS ni repaint de sombra — regla de perf del proyecto). Home no se
   toca (su hero usa .stk-242acad, otro selector).
   -------------------------------------------------------------------------- */
@keyframes aai-intro-enter {
	from {
		opacity: 0;
		transform: translateY(28px) scale(0.985);
	}
	to {
		opacity: 1;
		transform: translateY(0) scale(1);
	}
}
/* Oculta desde el primer paint SOLO si hay JS (sin JS nada se oculta). */
html.aai-js body.page-id-766 .stk-9d25175,
html.aai-js body.page-id-283 .stk-9d25175 {
	opacity: 0;
}
/* Corre sobre layout ya estable (fuentes cargadas). */
html.aai-anim-ready body.page-id-766 .stk-9d25175,
html.aai-anim-ready body.page-id-283 .stk-9d25175 {
	animation: aai-intro-enter 1.4s cubic-bezier(0.16, 1, 0.3, 1) 0.15s both;
}
@media (prefers-reduced-motion: reduce) {
	html.aai-js body.page-id-766 .stk-9d25175,
	html.aai-js body.page-id-283 .stk-9d25175 {
		opacity: 1;
	}
	html.aai-anim-ready body.page-id-766 .stk-9d25175,
	html.aai-anim-ready body.page-id-283 .stk-9d25175 {
		animation: none !important;
	}
}

/* --------------------------------------------------------------------------
   §42 · Footer "Síguenos en nuestras redes sociales" — quitar mayúsculas (2026-07-08)
   El bloque subtitle del footer (stk-58cbb09, mismo uniqueId en las 4 páginas)
   traía text-transform:uppercase. Una etiqueta de UNA palabra en caps
   ("CONTÁCTANOS") se ve bien, pero una frase completa en caps grita y se ve mal
   (y así aparecía también en el snippet de Google). El texto en la BD ya se pasó
   a caso oración ("Síguenos en nuestras redes sociales"); aquí solo se anula el
   uppercase de ese bloque para que renderice tal cual. 3 clases de especificidad
   para ganarle al CSS inline de Stackable.
   -------------------------------------------------------------------------- */
.stk-58cbb09 .stk-block-subtitle__text.stk-subtitle {
	text-transform: none !important;
}

/* --------------------------------------------------------------------------
   §43 · Footer "contáctanos" — quitar mayúsculas (2026-07-08)
   Mismo patrón que §42: subtitle stk-2e33395 (mismo uid en las 4 páginas)
   traía text-transform:uppercase. Pedido del usuario: solo este bloque.
   -------------------------------------------------------------------------- */
.stk-2e33395 .stk-block-subtitle__text.stk-subtitle {
	text-transform: none !important;
}

/* --------------------------------------------------------------------------
   §44 · Header de artículo de blog (single post) — arregla espaciado (2026-07-08)
   La regla de §22 (`.hero-section .entry-header {display:flex;justify-content:
   center}`) se escribió cuando el blog tenía 0 posts, pensada solo para centrar
   un <h1> suelto (Servicios/Contacto/Casos de Éxito). Con el primer post real
   aparecieron 3 hijos (.page-title + .page-description + .entry-meta) en esa
   misma fila flex, comprimidos en 3 columnas angostas dentro del mismo ancho
   máximo — el título se partía en 5-6 líneas y la descripción/fecha quedaban
   pegadas sin aire (además con `align-items` por defecto = stretch, esas cajas
   se estiraban a la altura del título, dejando hueco vacío debajo del texto
   corto). Se convierte a columna vertical SOLO en single-post (scope por body
   class, no afecta Pages) con orden de lectura natural de blog: título → meta
   (fecha/categoría) → descripción, con separación clara entre cada uno.
   -------------------------------------------------------------------------- */
body.single-post .hero-section .entry-header {
	flex-direction: column !important;
	align-items: center !important;
	text-align: center;
}
body.single-post .hero-section .entry-header .page-title {
	order: 1;
	width: 100%;
	max-width: 900px;
	margin: 0 0 1rem !important;
}
body.single-post .hero-section .entry-header .entry-meta {
	order: 2;
	height: auto !important;
	width: auto !important;
	margin: 0 0 1.25rem !important;
	display: flex;
	align-items: center;
	justify-content: center;
	gap: 0.4rem;
	font-size: 0.85rem;
	letter-spacing: 0.02em;
	opacity: 0.65;
}
body.single-post .hero-section .entry-header .page-description {
	order: 3;
	height: auto !important;
	width: 100%;
	max-width: 640px;
	margin: 0 auto !important;
}

/* --------------------------------------------------------------------------
   §45 · Rating por estrellas en /recursos (2026-07-08)
   Reemplaza la caja nativa de comentarios (ver comments.php del tema hijo).
   Estrellas SVG (sin librería de íconos — 1 sola forma reutilizada), verde de
   marca al rellenar, navy en reposo. Solo transform/opacity en la interacción.
   -------------------------------------------------------------------------- */
.aai-rating-box {
	max-width: 480px;
	margin: 3rem auto 0;
	padding: 2rem 1.5rem;
	text-align: center;
	border-top: 1px solid rgba(35, 38, 67, 0.1);
}

.aai-rating-label {
	margin: 0 0 1rem;
	color: #232643;
	font-weight: 600;
	font-size: 1rem;
}

.aai-rating-stars {
	display: inline-flex;
	gap: 0.35rem;
}

.aai-star {
	background: none;
	border: none;
	padding: 4px;
	cursor: pointer;
	line-height: 0;
	color: rgba(35, 38, 67, 0.28);
	transition: color 0.15s ease, transform 0.15s ease;
}

.aai-star svg {
	width: 30px;
	height: 30px;
	fill: currentColor;
}

.aai-star.is-filled {
	color: #00d47e;
	transform: scale(1.08);
}

.aai-rating-box.is-voted .aai-star {
	cursor: default;
}

.aai-rating-summary {
	margin: 1rem 0 0;
	color: #232643;
	opacity: 0.7;
	font-size: 0.9rem;
}

.aai-rating-avg {
	font-weight: 700;
	opacity: 1;
}

.aai-rating-thanks {
	margin: 0.5rem 0 0;
	color: #00a868;
	font-size: 0.85rem;
	font-weight: 600;
}

@media (prefers-reduced-motion: reduce) {
	.aai-star {
		transition: none;
	}
	.aai-star.is-filled {
		transform: none;
	}
}

/* --------------------------------------------------------------------------
   §46 · Auditoría ui-ux-pro-max en /recursos (2026-07-09)
   Dos hallazgos verificados con Playwright antes de tocar nada:
   (1) /recursos no tenía NINGÚN <h1> (la plantilla "página de entradas" de
       WP no renderiza el contenido propio, solo el loop) → título+descripción
       inyectados vía loop_start (ver functions.php), estilados aquí.
   (2) El cuerpo de los artículos medía ~90 caracteres por línea (recomendado
       65-75ch para lectura larga — la web usa un ancho pensado para párrafos
       cortos de landing, no para artículos). Se acota el ancho SOLO en single
       post, sin tocar el resto del sitio.
   -------------------------------------------------------------------------- */
/* `.entries` es un CSS Grid de 3 columnas (410px 410px 410px) — el header se
   inyecta vía loop_start DENTRO de ese contenedor (mismo nivel que las
   .entry-card), así que sin esto quedaba encajado como una celda más del
   grid, sin jerarquía. grid-column:1/-1 lo saca del squeeze de columnas y le
   da todo el ancho de la fila; ahí adentro se centra normal. */
.aai-recursos-header {
	grid-column: 1 / -1;
	max-width: 900px;
	margin: 0 auto 3rem;
	padding: 0 1.5rem 2rem;
	text-align: center;
	border-bottom: 1px solid rgba(35, 38, 67, 0.08);
}

.aai-recursos-title {
	margin: 0 0 0.75rem;
	color: #232643;
	font-size: clamp(2.2rem, 5vw, 3.2rem);
	font-weight: 700;
}

.aai-recursos-desc {
	margin: 0;
	color: #232643;
	opacity: 0.7;
	font-size: 1.1rem;
}

/* Ancho de lectura del cuerpo del artículo (single post), acotado a ~75ch a
   16px (ajustado de 680px tras medir en vivo: 680px daba ~82 caracteres/línea,
   por encima del rango recomendado). El header (título/meta/descripción, §44)
   se queda en max-width:900px/640px — un cuerpo de texto más angosto que el
   titular es un patrón editorial normal, no una inconsistencia. */
body.single-post .entry-content {
	max-width: 620px;
	margin-left: auto !important;
	margin-right: auto !important;
}

/* --------------------------------------------------------------------------
   §47 · /recursos — entrada escalonada de las cards (2026-07-09)
   Pedido del usuario: comportamiento tipo "Animated List" de Magic UI. Este
   sitio es WordPress, no React/shadcn, así que no se instala el paquete — se
   recrea SOLO el comportamiento (mismo criterio que el resto de efectos "de
   Magic UI/KokonutUI" del proyecto, ver CLAUDE.md). Reutiliza el gate
   anti-flash existente (html.aai-js / html.aai-anim-ready, ver functions.php)
   en vez de un IntersectionObserver nuevo: las cards están sobre el fold al
   entrar a la ruta, así que es entrada de CARGA, no de scroll. Stagger de
   50ms por card vía nth-child (sin JS nuevo). Solo transform/opacity.
   -------------------------------------------------------------------------- */
html.aai-js .entries .entry-card {
	opacity: 0;
}
html.aai-anim-ready .entries .entry-card {
	animation: aai-list-item-in 0.6s cubic-bezier(0.16, 1, 0.3, 1) both;
}
@keyframes aai-list-item-in {
	from {
		opacity: 0;
		transform: translateY(22px);
	}
	to {
		opacity: 1;
		transform: translateY(0);
	}
}
html.aai-anim-ready .entries .entry-card:nth-child(1) { animation-delay: 0.05s; }
html.aai-anim-ready .entries .entry-card:nth-child(2) { animation-delay: 0.1s; }
html.aai-anim-ready .entries .entry-card:nth-child(3) { animation-delay: 0.15s; }
html.aai-anim-ready .entries .entry-card:nth-child(4) { animation-delay: 0.2s; }
html.aai-anim-ready .entries .entry-card:nth-child(5) { animation-delay: 0.25s; }
html.aai-anim-ready .entries .entry-card:nth-child(6) { animation-delay: 0.3s; }
@media (prefers-reduced-motion: reduce) {
	html.aai-js .entries .entry-card {
		opacity: 1;
	}
	html.aai-anim-ready .entries .entry-card {
		animation: none !important;
	}
}

/* --------------------------------------------------------------------------
   §48 · Footer de sitio UNIFICADO — inyectado vía `blocksy:content:bottom`
   (functions.php) a nivel `<main>`, en flujo normal, en TODAS las rutas
   (Home/Servicios/Contacto/Casos de Éxito/recursos/artículos) (2026-07-09c).

   Historial (no repetir): sesiones 15-16 intentaron igualar el footer de
   /recursos —entonces inyectado DENTRO de `.entries`, un CSS Grid— contra el
   de Home con CSS de compensación (anular el `gap` del grid, forzar breakout,
   anular el `margin-bottom` atrapado porque los márgenes de un item de grid
   nunca colapsan). Cada ronda acercó el resultado pero nunca cerró del todo
   — dos contextos de layout estructuralmente distintos no llegan a ser
   IDÉNTICOS solo con CSS calculado. Pedido explícito del usuario: en vez de
   seguir compensando, se removió el bloque nativo de Gutenberg de las 4
   páginas estáticas (ver `remove-native-footer.php`) y ahora las 6+ rutas
   comparten el MISMO mecanismo de inyección y el MISMO contexto de DOM
   (confirmado con un probe real: fuera de `.entry-content` y de `.entries`
   en las 5 rutas no-artículo). Un solo contexto ⇒ ya no hace falta
   grid-column, anti-gap, ni margin atrapado — la causa estructural
   desaparece en vez de seguir compensándose.

   ANCHO: sin ancestro `.is-layout-constrained`/`.entry-content` a este nivel,
   las clases `alignfull`/`alignwide` de Gutenberg/Stackable no tienen su
   contenedor de referencia — no se depende de ellas. Se ancla a mano con la
   técnica estándar de breakout (100vw + fila interna con `min()`, no un %
   de un contexto local ni un px fijo de un solo viewport) para que el
   resultado sea idéntico en cualquier ruta y cualquier ancho de pantalla,
   sin importar si el `<main>` ambiente es angosto (single, ~1010px) o
   full-bleed (Home) — el breakout no depende del ancho del padre.

   ESPACIADO: valores explícitos y deliberados en el wrapper (no colapsos
   accidentales que dependan del contexto) — mismo resultado en las 6+ rutas
   por construcción, no por coincidencia medida.
   -------------------------------------------------------------------------- */
.aai-site-footer-block {
	position: relative;
	left: 50%;
	right: 50%;
	width: 100vw;
	margin-left: -50vw;
	margin-right: -50vw;
	margin-top: var(--theme-content-spacing);
	margin-bottom: 0;
}
/* Blocksy (tema padre) fuerza un `max-width` (no solo `width`) en esta fila
   con !important — confirmado en vivo (`getComputedStyle().maxWidth` medía
   1152px incluso con `width` ya ganado por especificidad; hubo que aislar
   `max-width` con un test de inline-style para encontrarlo, un `width`
   !important solo no basta cuando otra regla fija `max-width` más chico).
   Se fija TAMBIÉN `max-width` con la misma especificidad alta (5 clases). */
.aai-site-footer-block.aai-site-footer-block .stk-6df3a26-column.stk-6df3a26-column.stk-6df3a26-column {
	width: min(90vw, 1296px) !important;
	max-width: min(90vw, 1296px) !important;
	margin-left: auto !important;
	margin-right: auto !important;
}
.aai-site-footer-block .stk-6df3a26.stk-6df3a26 {
	margin-bottom: 0 !important;
}
/* La línea divisoria (columna stk-9b328a8, border-top solamente) renderizaba
   3px en vez de 1px: Stackable no emite su hoja de estilos por-página para
   HTML inyectado (arma su CSS escaneando el post_content REAL, que aquí no
   contiene el bloque) → sin ancho explícito, el navegador usa el default CSS
   "medium" (~3px). Se fuerza el valor exacto — 2 clases de especificidad
   para ganarle a su inline `!important`. Valor de diseño real, no medido.

   ESPACIADO DE LA LÍNEA (2026-07-09d): medido en vivo, la línea quedaba
   pegada al contenido de arriba (0px de separación con la fila logo/
   contacto/redes) pero con ~46px antes del fondo gris de la barra de
   copyright del sitio — asimétrico, pedido del usuario: la línea debe verse
   CENTRADA entre ambos bloques, con más aire que antes. Se reemplazan los
   paddings de Stackable (`var(--stk--preset--spacing--30)`, pensados para
   antes del texto de copyright que está oculto) por valores explícitos.

   Nota: `padding-bottom:48px` no produce 48px reales de espacio hacia el
   fondo gris del footer — mide 73px en vivo (Playwright), 25px de más que
   no vienen de ningún padding/margin propio de esta columna (contenedores
   internos de Stackable, `stk--no-padding`, miden height:0 — el origen
   exacto de esos 25px no se aisló). Se dejó ese lado (línea→copyright) en
   73px, aprobado por el usuario ("la línea se ve bien, déjala ahí").

   AJUSTE 2026-07-09e: con ambos lados en 73px (simétrico) el usuario reportó
   que el bloque de contenido (logo/contacto/redes) quedaba "muy lejos" de la
   línea — pidió bajarlo un poco, dejando la línea donde está (73px hacia el
   copyright, sin tocar). Se redujo SOLO el lado de arriba a 36px (la mitad,
   valor moderado — ni pegado como el original 0px, ni tan lejos como el
   73px simétrico), verificado visualmente con Playwright antes de cerrar. */
.aai-site-footer-block .stk-9b328a8.stk-9b328a8 {
	border-top-width: 1px !important;
	margin-top: 36px !important;
	padding-top: 0 !important;
	padding-bottom: 48px !important;
}

/* ==========================================================================
   §49 · Artículo de blog — H1 más chico que sus propios H2 (2026-07-10)
   ==========================================================================
   Detectado en sesión 15 (a 375px, dejado pendiente a pedido del usuario) y
   confirmado ahora con Playwright que ocurre a CUALQUIER ancho, no solo
   móvil: Blocksy define el tamaño del título de "Single Blog Post" (selector
   propio `[data-prefix="single_blog_post"] .entry-header .page-title`, en
   wp-content/uploads/blocksy/css/global.css, generado por el Customizer) fijo
   en 30px, mientras que los H2 del cuerpo (bloques wp:heading dentro de
   .entry-content) usan el tamaño general de H2 del tema, fijo en 35px — sin
   variación responsive en ninguno de los dos. Resultado: el título se ve
   más chico que sus propios subtítulos internos, a 375/768/1440px por igual
   (verificado con getComputedStyle en los tres anchos antes del fix: H1
   30px / H2 35px en todos). No se toca el panel de Blocksy Customizer (fuente
   de esos valores) — se sobreescribe en el mismo scope que ya usa §44
   (body.single-post .hero-section .entry-header .page-title), que solo
   afecta artículos del blog — Servicios/Contacto/Casos de Éxito usan su
   propio .page-title sin el selector de blog, intacto.

   Tamaño elegido — clamp(2.25rem, 6vw, 2.75rem): en 375px, 6vw=22.5px por
   debajo del mínimo → clampa a 36px; desde ~733px en adelante, 6vw supera el
   máximo → clampa a 44px. Siempre por encima de los 35px fijos del H2, en
   cualquier ancho. Verificado con Playwright (inyección de CSS en vivo antes
   de desplegar + capturas): 375px→H1 36px/H2 35px, 768px→44px/35px,
   1440px→44px/35px. Jerarquía visual correcta confirmada en captura.
   -------------------------------------------------------------------------- */
body.single-post .hero-section .entry-header .page-title {
	font-size: clamp(2.25rem, 6vw, 2.75rem) !important;
	line-height: 1.25 !important;
}

/* ==========================================================================
   §50 · Artículos de /recursos — H2/H3 del cuerpo muy grandes en móvil (2026-07-10)
   ==========================================================================
   El usuario reportó, tras el fix de §49, que en móvil los títulos de cada
   punto de un checklist (H2 del cuerpo, ej. "1. ¿Personaliza cada proyecto o
   vende paquetes genéricos?") se seguían viendo "muy grandes" — a 375px cada
   H2 (35px fijo, sin responsive) ocupaba 3 líneas y dominaba la pantalla.
   Pedido explícito: bajar el tamaño "para todos los recursos" (todos los
   artículos comparten el mismo H2 genérico de Blocksy, no solo el checklist).

   Se reduce SOLO en el breakpoint móvil (max-width:689px, mismo umbral que
   usa el resto del archivo, ej. §21f) — en tablet/desktop (768/1440px) el H2
   a 35px ya se veía proporcionado (sin queja del usuario ahí).

   Se baja también el H3 (existe en el artículo "Cómo implementar IA...",
   fijo en 30px) EN LA MISMA PASADA: si solo se bajaba el H2 a menos de 30px
   quedaría más chico que su propio H3 hijo — la misma clase de bug de
   jerarquía invertida que §49 acababa de corregir para H1/H2, solo que un
   nivel más abajo. Escala mantenida: H1 móvil (36px, §49) > H2 (27.2px) >
   H3 (22.4px).

   Verificado con Playwright (inyección en vivo antes de desplegar + captura
   full-page del artículo checklist): cada punto pasa de 3 líneas a 2,
   jerarquía H1>H2>H3 intacta a 375px.
   -------------------------------------------------------------------------- */
@media screen and (max-width: 689px) {
	body.single-post .entry-content h2 {
		font-size: 1.7rem !important;
		line-height: 1.3 !important;
	}
	body.single-post .entry-content h3 {
		font-size: 1.4rem !important;
		line-height: 1.3 !important;
	}
}

/* ==========================================================================
   §51 · /about — Sección "Preguntas frecuentes" (AEO) (2026-07-10)
   ==========================================================================
   Pendiente cerrado: FAQ corto en /about (Servicios), condensado de lo ya
   validado en los 4 artículos de /recursos (costos, agente virtual, cómo
   elegir agencia, tiempos de implementación), con link a cada artículo
   completo — no se redactó nada desde cero. Va después del grid de servicios
   (§38) y antes del footer (inyectado aparte vía PHP). Acompaña al schema
   FAQPage añadido en functions.php (misma copy, visible = lo que declara el
   schema, requisito de Google para que cuente como rich result).

   Acordeón nativo <details>/<summary>: accesible por teclado y lector de
   pantalla (funciona instantáneo sin JS como base). Ícono +/− con 2
   pseudo-elementos que rotan (solo transform).

   ACTUALIZACIÓN 2026-07-10b — efecto "pop" al abrir/cerrar (pedido
   explícito del usuario, dirección de ui-ux-pro-max/design-taste-frontend):
   `aai-faq-pop.js` (nuevo, solo /about) sustituye el toggle instantáneo por
   una animación bidireccional vía Web Animations API — entra con leve
   rebote (easing "back"), sale más rápido y sin rebote. `box-sizing:
   border-box` + `overflow:hidden` en `.aai-faq-answer` son requisito de esa
   animación (permiten que `height` anime al valor exacto de `scrollHeight`
   sin desbordar contenido durante la transición). Respeta
   prefers-reduced-motion (el script ni se activa, queda el toggle nativo).
   -------------------------------------------------------------------------- */
.aai-faq {
	max-width: 820px;
	margin: 1rem auto 4.5rem;
	padding: 3rem 1.5rem 0;
	border-top: 1px solid rgba(35, 38, 67, 0.08);
}

.aai-faq-title {
	text-align: center;
	color: #232643;
	font-size: clamp(1.6rem, 3vw, 2.2rem);
	font-weight: 700;
	margin: 0 0 2rem;
}

.aai-faq-list {
	display: flex;
	flex-direction: column;
	gap: 0.75rem;
}

.aai-faq-item {
	border: 1px solid rgba(35, 38, 67, 0.12);
	border-radius: 12px;
	padding: 0 1.25rem;
	background: #fff;
	transition: border-color 0.25s ease;
}

.aai-faq-item[open] {
	border-color: rgba(0, 212, 126, 0.4);
}

.aai-faq-question {
	cursor: pointer;
	list-style: none;
	display: flex;
	align-items: center;
	justify-content: space-between;
	gap: 1rem;
	padding: 1.15rem 0;
	font-weight: 600;
	color: #232643;
	font-size: 1.05rem;
	line-height: 1.4;
}

.aai-faq-question::-webkit-details-marker {
	display: none;
}

.aai-faq-icon {
	position: relative;
	flex: 0 0 20px;
	width: 20px;
	height: 20px;
}

.aai-faq-icon::before,
.aai-faq-icon::after {
	content: "";
	position: absolute;
	background: #00d47e;
	border-radius: 2px;
	transition: transform 0.25s ease;
}

.aai-faq-icon::before {
	top: 9px;
	left: 2px;
	width: 16px;
	height: 2px;
}

.aai-faq-icon::after {
	top: 2px;
	left: 9px;
	width: 2px;
	height: 16px;
}

.aai-faq-item[open] .aai-faq-icon::after {
	transform: rotate(90deg);
}

.aai-faq-answer {
	padding: 0 0 1.35rem;
	color: #232643;
	opacity: 0.8;
	font-size: 0.95rem;
	line-height: 1.65;
	box-sizing: border-box;
	overflow: hidden;
}

.aai-faq-answer p {
	margin: 0 0 0.85rem;
}

.aai-faq-link {
	color: #00a868;
	font-weight: 600;
	font-size: 0.9rem;
	text-decoration: none;
	white-space: nowrap;
}

.aai-faq-link:hover {
	text-decoration: underline;
}

@media screen and (max-width: 639px) {
	.aai-faq {
		margin-bottom: 3rem;
		padding-top: 2.25rem;
	}
	.aai-faq-question {
		font-size: 0.98rem;
	}
}

/* Reveal (una sola entrada, sin stagger — es texto, no íconos) reutilizando
   aai-reveal.js (selector extendido). */
.aai-faq.aai-reveal {
	opacity: 0;
	transform: translateY(14px);
	transition: opacity 0.45s ease, transform 0.45s ease;
}

.aai-faq.aai-reveal.aai-in {
	opacity: 1;
	transform: translateY(0);
}

@media (prefers-reduced-motion: reduce) {
	.aai-faq-icon::before,
	.aai-faq-icon::after,
	.aai-faq-item {
		transition: none;
	}
}

/* --------------------------------------------------------------------------
   §55 · /recursos — thumbnails de las cards del hub (2026-07-10)
   Pedido del usuario: imagen SOLO como preview en la card (ya no dentro del
   artículo — hook §52 eliminado), más pequeña, con esquinas redondeadas, y
   ALINEADA horizontalmente entre las cards de una misma fila.

   Para alinear: la card pasa a flex-column y la imagen se sube al tope con
   `order:-1`. Así todas las imágenes arrancan en la misma Y sin importar que
   los títulos midan 2 o 3 líneas (antes la imagen iba DESPUÉS del título en
   el DOM, por eso quedaban a distinta altura). El orden del DOM no cambia
   (h2 antes de la imagen) → lectura/SEO intactos, solo se reordena visual.

   "Más pequeña": aspect-ratio 16/9 (antes 4/3 a lo alto de la card) recorta
   altura. object-fit:cover mantiene todas idénticas en proporción.
-------------------------------------------------------------------------- */
.entries .entry-card {
	display: flex;
	flex-direction: column;
}
.entries .entry-card .ct-media-container {
	order: -1;
	width: 100%;
	margin: 0 0 1.1rem !important;
	aspect-ratio: 16 / 9;
	border-radius: 14px;
	overflow: hidden;
}
.entries .entry-card .ct-media-container img {
	display: block;
	width: 100%;
	height: 100%;
	object-fit: cover;
	border-radius: 14px;
}
@media screen and (max-width: 767px) {
	.entries .entry-card .ct-media-container,
	.entries .entry-card .ct-media-container img {
		border-radius: 12px;
	}
}

/* --------------------------------------------------------------------------
   §56 · /about — carrusel de partners tecnológicos (2026-07-10)
   Pedido del usuario: marquee infinito de logos (n8n, Make, Zapier, ChatGPT,
   Claude, Higgsfield, HubSpot, Hostinger, EasyPanel, GitHub, Google Gemini)
   entre el grid de servicios (§38) y el FAQ (§51).

   Dirección de diseño (ui-ux-pro-max + taste-skill, consultadas antes de
   implementar): logos en gris/desaturado en reposo (criterio "sponsor logos
   neutral" — evita el efecto "sopa de colores" de 11 marcas distintas
   compitiendo entre sí) y a color real solo al pasar el mouse por encima
   (feedback puntual). Máscara de desvanecido en los bordes del viewport en
   vez de un corte duro. Solo un marquee en toda la página (regla
   "marquee max uno por página").

   100% CSS, sin JS: el track duplica la lista de logos una vez (el HTML ya
   trae 11 reales + 11 con aria-hidden) y el keyframe mueve translateX(-50%)
   — como ambas mitades son idénticas en ancho, el loop es perfectamente
   continuo sin cálculo en JS. Pausa al hover vía animation-play-state
   (también CSS puro). Solo transform, respeta prefers-reduced-motion.
-------------------------------------------------------------------------- */
.aai-partners {
	max-width: min(90vw, 1296px);
	margin: 0 auto;
	padding: 4.5rem 0 6rem;
}
.aai-partners-title {
	text-align: center;
	font-size: 1.5rem;
	font-weight: 700;
	color: #232643;
	margin: 0 0 2.75rem;
}
.aai-partners-viewport {
	overflow: hidden;
	width: 100%;
	-webkit-mask-image: linear-gradient(90deg, transparent, #000 8%, #000 92%, transparent);
	mask-image: linear-gradient(90deg, transparent, #000 8%, #000 92%, transparent);
}
.aai-partners-track {
	display: flex;
	align-items: center;
	gap: 4rem;
	width: max-content;
	animation: aai-partners-scroll 42s linear infinite;
}
.aai-partners-track:hover {
	animation-play-state: paused;
}
.aai-partners-logo {
	height: 34px;
	width: auto;
	flex-shrink: 0;
	filter: grayscale(1);
	opacity: 0.5;
	transition: filter 0.25s ease, opacity 0.25s ease, transform 0.25s ease;
}
.aai-partners-logo:hover {
	filter: grayscale(0);
	opacity: 1;
	transform: scale(1.06);
}
@keyframes aai-partners-scroll {
	from {
		transform: translateX(0);
	}
	to {
		transform: translateX(-50%);
	}
}
@media screen and (max-width: 767px) {
	.aai-partners {
		padding: 3rem 0 4rem;
	}
	.aai-partners-title {
		font-size: 1.25rem;
		margin-bottom: 2rem;
	}
	.aai-partners-track {
		gap: 2.5rem;
	}
	.aai-partners-logo {
		height: 26px;
	}
}
@media (prefers-reduced-motion: reduce) {
	.aai-partners-track {
		animation: none;
	}
}
