/* ==========================================================================
   Pensamientos de Colores · pensamientos.css
   Hoja de estilos de marca — se enlaza SIEMPRE después del CSS de la
   plantilla GrandPortfolio (settings.css, combined.css, style.css, etc.)
   para que estas reglas tengan prioridad.
   Basado en Manual de Identidad Visual v1.0 y Guía Maestra Web v1.0.
   ========================================================================== */

/* ── 1. TOKENS DE MARCA ─────────────────────────────────────────────────── */
:root {
  /* Colores — Manual de Identidad Visual v1.0 */
  --color-primario: #7AAFD4;        /* Azul Cerúleo — links, CTAs, iconos activos */
  --color-secundario: #C84878;      /* Magenta Rosa — destacados, "Nuevo", "Disponible" */
  --color-acento-calido: #E8C84A;   /* Amarillo Cadmio — hover, badges, categoría infantil */
  --color-acento-energia: #E8813A;  /* Naranja Sanguina — botón WhatsApp, CTA urgente */
  --color-azul-cielo: #B8D8EE;
  --color-azul-cobalto: #4A82B4;    /* Headings secundarios */
  --color-azul-prusiano: #2A4E78;   /* Fondos oscuros — nav, footer */
  --color-violeta: #8C4AA0;
  --color-fondo: #FAF8F4;           /* Crema Acuarela — fondo web */
  --color-fondo-rgb: 250,248,244;   /* mismo tono en componentes r,g,b — para el
                                        fondo semitransparente del menú al hacer scroll */
  --color-blanco: #FFFFFF;
  --color-texto: #2C2420;           /* Negro Tinta — nunca #000000 puro */
  --color-gris: #6B6560;            /* Gris Grafito — texto secundario, captions */

  /* Pasteles derivados del logo (mezcla ~78% blanco) — fondos, degradado hero */
  --pastel-amarillo: #FBF1D1;
  --pastel-naranja: #FAE4DB;
  --pastel-magenta: #F2DBE3;
  --pastel-violeta: #E5D7EA;
  --pastel-celeste: #E7F0F8;
  --pastel-azul-medio: #D8E6F1;
  --pastel-azul-oscuro: #CDDCE5;

  /* Pasteles medios del logo (mezcla ~55% blanco) — botones, hover, footer,
     elementos que necesitan algo más de contraste que el pastel suave */
  --pastel-m-amarillo: #F6E3A1;
  --pastel-m-naranja: #F5C9B6;
  --pastel-m-magenta: #E5B7C6;
  --pastel-m-violeta: #CBADD4;
  --pastel-m-celeste: #CEE1F1;
  --pastel-m-azul-medio: #B1CDE3;
  --pastel-m-azul-oscuro: #99B7CB;

  /* Tipografía — Manual de Identidad Visual v1.0 */
  --fuente-display: "Cormorant Garamond", Georgia, serif;
  --fuente-ui: "Raleway", system-ui, sans-serif;

  /* Velo de contraste sobre el hero (Sección 22): alto/opacidad de PARTIDA
     (scrollY = 0). El script de cabecera los lee de aquí en vez de llevarlos
     hardcodeados, así que se pueden afinar solo tocando estos dos valores.
     A 0 por defecto: desde que el header lleva su propio fondo "glass"
     permanente (Sección 18), el velo ya no hace falta para la legibilidad
     del menú — se deja a 0 en vez de borrar el mecanismo, por si algún día
     hiciera falta un toque de contraste extra sobre una foto muy clara,
     basta con subir estos dos valores otra vez. */
  --hero-fade-height: 0px;
  --hero-fade-opacity: 0;
}

/* Móvil: igual que en escritorio, sin velo por defecto (el header "glass"
   ya da contraste). Si hiciera falta reactivarlo en un breakpoint puntual,
   este es el sitio. */
@media (max-width: 480px) {
  :root {
    --hero-fade-height: 0px;
  }
}

/* ── 1B. FONDO GLOBAL DEL SITIO (Opción C + A) ──────────────────────────────
   Base crema de marca + viñeta suave + grano de papel muy sutil.
   Se aplica a <body> para propagarse a todas las páginas que enlacen este CSS. */
body {
  background-color: var(--color-fondo);
  background-image:
    url("data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%22200%22%20height%3D%22200%22%3E%3Cfilter%20id%3D%22n%22%3E%3CfeTurbulence%20type%3D%22fractalNoise%22%20baseFrequency%3D%220.85%22%20numOctaves%3D%222%22%20stitchTiles%3D%22stitch%22%20result%3D%22t%22%2F%3E%3CfeColorMatrix%20in%3D%22t%22%20type%3D%22matrix%22%20values%3D%220%200%200%200%201%20%200%200%200%200%201%20%200%200%200%200%201%20%200.35%200.35%200.35%200%200%22%2F%3E%3C%2Ffilter%3E%3Crect%20width%3D%22100%25%22%20height%3D%22100%25%22%20filter%3D%22url%28%23n%29%22%2F%3E%3C%2Fsvg%3E"),
    radial-gradient(ellipse at center, transparent 40%, rgba(44,36,32,.05) 100%);
  background-repeat: repeat, no-repeat;
  background-size: 200px 200px, cover;
  background-attachment: fixed, fixed;
  background-blend-mode: multiply, normal;
}

/* style.css fija #wrapper a #ffffff a secas (no a la variable de marca) —
   en claro es casi idéntico al crema y pasa desapercibido, pero en modo
   oscuro dejaría un bloque blanco encima del fondo oscuro. Lo atamos a la
   misma variable que el body para que ambos cambien juntos. */
#wrapper {
  background-color: var(--color-fondo) !important;
}

/* ── 2. BASE ─────────────────────────────────────────────────────────────── */
body {
  color: var(--color-texto) !important;
  font-family: var(--fuente-ui) !important;
  font-weight: 300;
}

h1, h2, h3, h4, h5, h6,
.ppb_title, .portfolio_title h5, .widgettitle,
.hero__title, .proceso_encargo h3, .testimonio blockquote {
  font-family: var(--fuente-display) !important;
  font-weight: 500;
  color: var(--color-texto);
}

h3, .proceso_encargo h3 { font-weight: 600; }

/* Títulos de sección (h2.ppb_title) más grandes y con más presencia,
   en toda la web — antes se sentían apagados */
.ppb_title {
  font-size: 2.2rem;
  font-weight: 600 !important;
}

/* ── 2B. UTILIDAD "TÍTULO CON BLOQUE" ────────────────────────────────────────
   Bloque de color atravesado tipo trazo de marcador, reutilizable en
   cualquier título o palabra suelta de la web. Aplicar junto a un color:
   .titulo-bloque--naranja / --celeste / --magenta / --amarillo / --azul */
.titulo-bloque {
  display: inline-block;
  position: relative;
  font-weight: 600;
  padding: 4px 26px;
  z-index: 1;
}
.titulo-bloque::before {
  content: '';
  position: absolute;
  left: -12px; right: -12px;
  top: 42%; bottom: 4%;
  transform: skewX(-8deg) rotate(-1deg);
  z-index: -1;
  border-radius: 3px;
}
.titulo-bloque--celeste::before  { background: var(--pastel-m-celeste); }
.titulo-bloque--naranja::before  { background: var(--pastel-m-naranja); }
.titulo-bloque--magenta::before  { background: var(--pastel-m-magenta); }
.titulo-bloque--amarillo::before { background: var(--pastel-m-amarillo); }
.titulo-bloque--azul::before     { background: var(--pastel-m-azul-medio); }

a { color: var(--color-primario); }
a:hover { color: var(--color-azul-cobalto); }

nav, label, .btn, .button, input, select, textarea,
.post_detail, .portfolio_title_desc, .footer_bar, #copyright {
  font-family: var(--fuente-ui) !important;
}

/* Regla de oro tipográfica: Cormorant para arte/emoción/autoría,
   Raleway para navegación, precios y CTAs. Nunca mezclar en la misma línea. */

/* ── 3. NAVEGACIÓN ───────────────────────────────────────────────────────── */
/* El menú es siempre oscuro, tanto transparente como al hacer scroll */
#footer_menu.footer_nav li a {
  font-family: var(--fuente-ui) !important;
  font-weight: 600;
  letter-spacing: .08em;
  text-transform: uppercase;
  font-size: 11px;
  color: var(--color-texto) !important;
}
/* Menú horizontal de escritorio: misma tipografía y estilo que el menú
   lateral (Cormorant Garamond, cursiva, sin mayúsculas forzadas), pero a un
   tamaño moderado — el 3.2rem del lateral es para un menú desplegado a
   pantalla completa, aquí sería desproporcionado en una barra fina. */
#main_menu.nav li a,
#menu_wrapper #nav_wrapper #menu_border_wrapper #main_menu.nav li a {
  font-family: var(--fuente-display) !important;
  font-weight: 500;
  font-style: italic;
  letter-spacing: 0;
  text-transform: none;
  font-size: 1.05rem;
  color: var(--color-texto) !important;
}

/* El azul cerúleo (--color-primario) quedaba soso como color de hover del
   menú — lo sustituimos por el morado de marca (--color-violeta), bastante
   más llamativo y con mejor contraste (5.5:1 en claro, 6:1 en oscuro, ya
   que la variable se redefine sola en :root[data-theme="dark"]). El menú de
   footer no se toca: tiene su propia regla más abajo (Sección 21,
   #footer_menu.footer_nav li a:hover con --color-secundario) que ya ganaba
   la cascada sobre esta, así que se quita de aquí para no confundir. */
#main_menu.nav li a:hover,
#main_menu.nav li.current-menu-item a,
#menu_wrapper #nav_wrapper #menu_border_wrapper #main_menu.nav li a:hover {
  color: var(--color-violeta) !important;
}

/* Barra bajo la página activa y al pasar el cursor: la del tema quedó
   pegada al texto al quitar el padding para centrar verticalmente — la
   sustituimos por una propia. Antes solo existía para la página activa; el
   tema ponía la de hover con su propio border-bottom (mismo color siempre,
   #menu_wrapper .nav ul li a:hover{border-color:#222}) — la sustituimos
   también para poder variar el color por enlace y acercarla al texto. */
#main_menu.nav li a {
  border-bottom: none !important;
  position: relative;
}
#main_menu.nav li.current-menu-item a::after,
#main_menu.nav li a:hover::after {
  content: '';
  position: absolute;
  /* Con inset en % (no 0/0 a ancho completo) para que dos palabras cortas
     seguidas no se toquen entre sí — se estrecha proporcionalmente al ancho
     de cada enlace en vez de un margen fijo en px. */
  left: 18%;
  right: 18%;
  /* A ras del borde inferior real de la barra, no pegada al texto — el
     hueco varía con el alto de la barra (grande arriba, pequeña al hacer
     scroll), así que se interpola por scroll igual que el resto (ver
     --pdc-menu-bar-gap en el <script> de cabecera). Con un pequeño margen
     de seguridad respecto al borde real para que "overflow:hidden" del
     header al hacer scroll (Sección 18) no la recorte. */
  bottom: calc(-1 * var(--pdc-menu-bar-gap, 20px));
  height: 4px;
  border-radius: 2px;
  background: var(--color-primario);
}
/* Un color de la paleta por enlace, en el mismo orden que el menú
   (Inicio/Portfolio/Encargos/Blog/Sobre mí/Contacto). */
#main_menu.nav li:nth-child(1) a::after { background: var(--color-primario); }
#main_menu.nav li:nth-child(2) a::after { background: var(--color-secundario); }
#main_menu.nav li:nth-child(3) a::after { background: var(--color-acento-energia); }
#main_menu.nav li:nth-child(4) a::after { background: var(--color-violeta); }
#main_menu.nav li:nth-child(5) a::after { background: var(--color-azul-cobalto); }
#main_menu.nav li:nth-child(6) a::after { background: var(--color-acento-calido); }
/* El icono hamburguesa NO se dibuja con span/before/after: son sus propios
   bordes (border-top sólido + border-bottom "double", un truco clásico para
   3 barras con un solo elemento). El tema pinta esos bordes en blanco fijo
   vía ".top_bar.hasbg #mobile_nav_icon{border-color:#fff}" — y como
   .top_bar SIEMPRE lleva la clase "hasbg" en el HTML, ese blanco se aplica
   siempre, blanco sobre el fondo claro de la cabecera. */
#mobile_nav_icon,
.top_bar.hasbg #mobile_nav_icon {
  border-color: var(--color-texto) !important;
}
#mobile_nav_icon span,
#mobile_nav_icon:before,
#mobile_nav_icon:after {
  background-color: var(--color-texto) !important;
}

/* El botón hamburguesa venía posicionado "position:absolute;top:50%" para
   centrarlo respecto a #logo_wrapper — pero al ser "top" un porcentaje
   sobre un contenedor de alto automático (no fijo), el spec de CSS lo trata
   como "auto" y el centrado no se aplicaba de verdad (se notaba sobre todo
   en móvil, donde el logo grande hace más evidente el desajuste). Se
   soluciona quitándolo del flujo absoluto: #nav_wrapper ya es flex con
   align-items:center, así que como hijo normal se centra solo, iguél que el
   menú de texto y el logo. */
#logo_right_button {
  position: static !important;
  height: auto !important;
  display: flex !important;
  align-items: center !important;
}

/* Wordmark de texto junto al icono del logo — siempre oscuro */
.logo_wrapper {
  display: inline-flex !important;
  align-items: center;
  align-self: center !important;
  gap: 12px;
  width: auto !important;
  max-width: none !important;
  overflow: visible !important;
  margin: 0 !important;
  top: auto !important;
}

/* El .standard_wrapper de la cabecera podía encogerse al ancho de su
   contenido (logo+menú) y, al estar centrado, arrastraba todo el bloque
   hacia la izquierda al encoger el logo. Lo forzamos al 100% del ancho de
   la barra — solo afecta al de la cabecera, no al resto de la web. */
.top_bar .standard_wrapper {
  width: 100% !important;
  max-width: 100% !important;
}

/* El tema posiciona #menu_wrapper de forma fija, pensado para un logo
   pequeño — con el logo grande se monta encima. Forzamos un layout propio
   con flexbox para que el menú siempre se adapte al alto real del logo.
   Usamos "flex-start" + margin-left:auto en el menú (en vez de
   space-between) porque con 3 elementos (logo/menú/hamburguesa) el
   space-between desplazaba el menú hacia la izquierda al encoger el logo. */
#logo_wrapper {
  display: flex !important;
  align-items: center !important;
  justify-content: flex-start !important;
  width: 100% !important;
  height: auto !important;
  position: relative !important;
}
/* En móvil (<=767px), el propio tema reactiva "display:block !important" en
   #logo_wrapper en cuanto la cabecera pasa a su estado ".scroll" — con más
   especificidad (.top_bar.scroll #logo_wrapper) que nuestra regla de arriba,
   así que gana pese al !important y el logo y la hamburguesa (hijos, que
   siguen siendo flex containers por su cuenta) pasan de fila a columna,
   dejando el botón de menú apilado debajo del logo en vez de al lado. */
.top_bar.scroll #logo_wrapper {
  display: flex !important;
}
/* El tema centra el logo con la técnica antigua display:table +
   vertical-align (clase .logo_container), con un height/min-height fijo
   pensado para el logo pequeño de siempre. Eso pisaba nuestro flexbox y
   descuadraba todo en cuanto el logo cambiaba de tamaño. Lo neutralizamos. */
#logo_wrapper .logo_container,
html[data-menu="leftalign_center"] #logo_wrapper .logo_container {
  display: flex !important;
  align-items: center !important;
  height: auto !important;
  min-height: 0 !important;
  padding: 0 !important;
}
/* La regla anterior (más específica que #logo_normal{display:none}) volvía
   a mostrar los dos logos a la vez. Ganamos la partida con más especificidad
   todavía, apuntando a los dos selectores (ID+ID+clase). */
#logo_wrapper #logo_normal.logo_container,
html[data-menu="leftalign_center"] #logo_wrapper #logo_normal.logo_container {
  display: none !important;
}
#logo_wrapper #logo_transparent.logo_container,
html[data-menu="leftalign_center"] #logo_wrapper #logo_transparent.logo_container {
  display: flex !important;
}

#logo_normal, #logo_transparent {
  position: static !important;
  display: flex !important;
  align-items: center !important;
  margin: auto 0 !important;
  top: auto !important;
}
.logo_align {
  display: flex !important;
  align-items: center !important;
  margin: auto 0 !important;
  position: relative; /* ancla las "chispas" del logo (Sección 25) al icono */
}
/* El botón de menú lateral (#logo_right_button) es "right:90px; width:35px"
   respecto a #logo_wrapper (fijo, no forma parte del flujo flex). Reservamos
   ese mismo hueco (90+35=125px) más un pequeño respiro para que el menú de
   texto nunca se le monte encima al quedar pegado a la derecha. */
#menu_wrapper {
  position: static !important;
  top: auto !important;
  margin-left: auto !important;
  margin-right: 145px !important;
  display: flex !important;
  align-items: center !important;
  /* El tema fija height:100% (leftalignmenu.css) sobre una cadena de
     ancestros que en móvil terminan sin alto explícito (#logo_wrapper es
     auto) — el porcentaje se resuelve a 0 y todo lo de dentro (incluida la
     hamburguesa) queda "centrado" respecto a una caja de 0px, no respecto
     al logo real. Rompemos la cadena de porcentajes con alto automático. */
  height: auto !important;
}
/* En móvil, el menú de texto (#main_menu) desaparece y #menu_wrapper solo
   contiene la hamburguesa — pero el ancho disponible en la fila del logo
   también se reduce mucho. Los 145px de margen reservados arriba (pensados
   para el hueco de escritorio) casi agotan por sí solos ese ancho, así que
   a "margin-left:auto" no le queda nada contra lo que empujar y la
   hamburguesa se queda pegada al lado del texto del logo en vez de en el
   borde derecho. La quitamos del todo: en móvil no hay nada más en la fila
   de lo que protegerse. */
@media (max-width: 767px) {
  #menu_wrapper {
    margin-right: 0 !important;
  }
}
#nav_wrapper {
  position: static !important;
  display: flex !important;
  align-items: center !important;
  height: auto !important;
}
.nav_wrapper_inner,
#menu_border_wrapper,
.menu-main-menu-container {
  display: flex !important;
  align-items: center !important;
  margin: 0 !important;
  padding: 0 !important;
}
#main_menu.nav {
  display: flex !important;
  align-items: center !important;
  margin: 0 !important;
  padding: 0 !important;
}
#main_menu.nav li {
  display: flex !important;
  align-items: center !important;
}
#main_menu.nav li a {
  display: flex !important;
  align-items: center !important;
  line-height: 1 !important;
  padding-top: 0 !important;
  padding-bottom: 0 !important;
  margin: 0 !important;
}

/* El tema oculta el menú de texto por debajo de 960px y deja solo la
   hamburguesa (el menú no cabe y se pasa al menú lateral). Nuestro flex
   forzado de arriba pisaba ese "display:none" del tema con !important y el
   menú de texto se desbordaba, invisible, fuera del viewport en móvil/tablet.
   Ojo: apuntamos a .nav_wrapper_inner (los enlaces) y no a #nav_wrapper,
   porque #logo_right_button (el botón hamburguesa) vive DENTRO de
   #nav_wrapper como hermano de .nav_wrapper_inner — si ocultásemos
   #nav_wrapper entero nos cargaríamos también el botón que abre el menú. */
@media only screen and (max-width: 960px) {
  .nav_wrapper_inner {
    display: none !important;
  }
}

.logo_text {
  font-family: var(--fuente-display);
  /* 1.55rem = tamaño "grande" (reposo, scrollY=0): coincide con el que el
     JS de cabecera usa como punto de partida (BIG.font, Sección 19) — así
     el primer render ya pinta el tamaño correcto sin depender de que el
     script llegue a ejecutarse. El script solo lo ENCOGE visualmente con
     transform:scale() al hacer scroll, nunca cambia este valor. */
  font-size: 1.55rem;
  font-weight: 500;
  letter-spacing: .01em;
  white-space: nowrap;
  line-height: 1;
  display: inline-flex;
  align-items: center;
}
#custom_logo .logo_text,
#custom_logo_transparent .logo_text {
  color: var(--color-texto) !important;
}

/* El halo de luz difuminada (text-shadow) que había aquí antes no garantizaba
   contraste suficiente sobre fotos de fondo oscuras — dependía de qué imagen
   hubiera detrás en cada momento, y en la práctica el ratio caía por debajo
   de WCAG AA (4.5:1). Solución más robusta: un scrim (degradado oscuro,
   Sección 22) fijo detrás del texto del menú y delante de la foto, que
   garantiza el contraste siempre, sea cual sea la imagen. Dejamos un
   text-shadow muy ligero solo como refuerzo adicional, no como base. */
.logo_text,
#main_menu.nav li a {
  text-shadow: 0 1px 3px rgba(0,0,0,.25);
}

/* Un único logo, siempre visible, con su color real — sin filtros ni
   intercambio entre versiones (eso era lo que causaba el salto/duplicado).
   El tamaño lo controla el JS del scroll (ver Sección 19). */
#logo_normal { display: none !important; }
#logo_transparent { display: block !important; }

/* Menú lateral móvil (hamburguesa): grande y artístico, con la tipografía
   de marca en vez del estilo pequeño/uppercase del menú de escritorio */
.mobile_main_nav li a {
  font-family: var(--fuente-display) !important;
  font-weight: 500;
  font-style: italic;
  letter-spacing: 0;
  text-transform: none;
  font-size: 3.2rem;
  line-height: 1;
  display: inline-block;
  /* El tema hereda aquí var(--color-primario) (regla general "a"), que da
     solo 2.36:1 sobre el fondo blanco real del menú lateral — muy por
     debajo de AA incluso para texto grande (mínimo 3:1). */
  color: var(--color-texto) !important;
}
.mobile_main_nav li {
  margin: 0;
  padding: 0;
  line-height: 1;
}
.mobile_main_nav li a:hover,
.mobile_main_nav li.current-menu-item a {
  /* Morado de marca, mismo criterio que el menú horizontal (más llamativo
     que el azul cerúleo). Valor fijo (no var(--color-violeta)) a propósito:
     el fondo de .mobile_menu_wrapper es SIEMPRE blanco, también en modo
     oscuro (ver Sección 24), así que no debe adoptar la variante más clara
     que --color-violeta toma en :root[data-theme="dark"] (pensada para un
     fondo oscuro) — esa variante solo da 2.95:1 sobre blanco, por debajo de
     AA. El tono claro (#8C4AA0) da 5.83:1 sobre blanco, de sobra. */
  color: #8C4AA0 !important;
  font-style: normal;
}

/* Bio + enlaces sociales del sidebar del menú lateral: el tema fija aquí
   un gris (#777) pensado para su versión oscura original del panel — lo
   atamos a nuestra variable para que se adapte solo en modo oscuro. */
.mobile_menu_wrapper .sidebar_wrapper,
.mobile_menu_wrapper .sidebar_wrapper a {
  color: var(--color-gris) !important;
}

/* ── 4. BOTONES / CTA ────────────────────────────────────────────────────── */
.btn {
  display: inline-flex;
  align-items: center;
  gap: .5rem;
  padding: 1rem 2.6rem;
  border-radius: 28px 8px 28px 8px;
  font-size: .85rem;
  font-weight: 700;
  letter-spacing: .08em;
  text-transform: uppercase;
  text-decoration: none;
  transition: all .25s ease;
  border: 1.5px solid transparent;
}
.btn:hover { transform: rotate(-1.5deg) scale(1.04); }

.btn--primary {
  background: var(--color-primario);
  color: #fff !important;
}
.btn--primary:hover { background: var(--color-azul-cobalto); }

.btn--whatsapp {
  background: var(--pastel-m-naranja);
  color: var(--color-texto) !important;
}
.btn--whatsapp:hover { background: var(--pastel-m-amarillo); }

.btn--outline {
  border-color: transparent;
  color: var(--color-azul-cobalto) !important;
  background: var(--pastel-m-azul-medio);
}
.btn--outline:hover { background: var(--color-primario); color: #fff !important; }

/* ── 5. HERO / SLIDER ────────────────────────────────────────────────────── */
/* El hero estático (Sección 28, más abajo) sustituye a Revolution Slider —
   la regla ".hero-gradient" (fondo pastel de respaldo detrás del slider)
   ya no tiene ningún uso en el sitio (verificado con grep, 0 páginas):
   eliminada, no queda ningún elemento sin cubrir por la nueva imagen de
   fondo real con object-fit:cover que necesite ese respaldo. */

/* El Revolution Slider usa estilos inline por capa (data-frames); aquí solo
   ajustamos tipografía para que respete la marca cuando sea posible. */
.tp-caption {
  font-family: var(--fuente-display) !important;
  text-shadow: 0 2px 18px rgba(0,0,0,.45), 0 1px 4px rgba(0,0,0,.3);
}
/* Cada capa de texto del hero trae un font-size FIJO por estilo inline
   (pensado para escritorio) y Revolution Slider no les aplica ningún tamaño
   responsivo propio (no hay data-fontsize por breakpoint, solo posición).
   En móvil, "ACUARELAS PERSONALIZADAS" a 40px se salía por los dos lados de
   la pantalla. Hace falta !important para ganarle al estilo inline.
   OJO: dejamos white-space:nowrap tal cual (NO forzar "normal") — cada capa
   se posiciona con un voffset independiente medido desde abajo (data-y" +
   "bottom", pensado para una sola línea); si el título pasa a 2 líneas su
   altura crece y se come el hueco reservado para el subtítulo/descripción
   de debajo. Por eso el tamaño se reduce lo justo para que quepa en una
   sola línea también en el móvil más estrecho (~340px de ancho útil),
   medido con el texto real de cada capa. Mismos IDs en ES y EN. */
@media (max-width: 480px) {
  #slide-2-layer-1, #slide-3-layer-1 {
    font-size: 22px !important;
  }
  #slide-2-layer-3, #slide-3-layer-3 {
    font-size: 15px !important;
  }
  #slide-2-layer-4, #slide-3-layer-4 {
    font-size: 11px !important;
  }
}

/* ── 6. MINI-PORTFOLIO (home) ────────────────────────────────────────────── */
.portfolio_title_wrapper .ppb_title { letter-spacing: .01em; }
.portfolio_title_desc {
  font-family: var(--fuente-ui) !important;
  font-weight: 300;
  color: var(--color-gris);
  font-size: 14px;
}

.gallery3 .portfolio_title h5 {
  font-size: 1.2rem;
  font-weight: 400;
}
.gallery3 .post_detail {
  font-size: 11px;
  letter-spacing: .04em;
  text-transform: uppercase;
  color: var(--color-primario);
  font-weight: 600;
}

/* ── 7. "CÓMO FUNCIONA UN ENCARGO" (3 pasos) ─────────────────────────────── */

/* Este título ahora usa la utilidad genérica .titulo-bloque (ver Sección 2B)
   con clase de color .titulo-bloque--celeste añadida en el HTML. Solo
   ajustamos aquí el tamaño, algo mayor que el resto de títulos de sección. */
.proceso-titulo { font-size: 2.8rem !important; }

.proceso_encargo {
  display: flex;
  flex-wrap: wrap;
  gap: 40px;
  justify-content: center;
  text-align: center;
}
.proceso_encargo .paso { flex: 1 1 260px; max-width: 320px; position: relative; }

/* Números grandes y en negrita sobre manchas pastel rotadas, como sellos */
.proceso_encargo .paso_numero {
  display: inline-block;
  position: relative;
  font-family: var(--fuente-display);
  font-size: 4.6rem;
  font-weight: 600;
  line-height: 1;
  margin-bottom: 6px;
  z-index: 2;
  padding: 6px 20px;
}
.proceso_encargo .paso_numero::before {
  content: '';
  position: absolute;
  z-index: -1;
  inset: -6px 4px;
  border-radius: 42% 58% 65% 35% / 45% 45% 55% 55%;
}
.proceso_encargo .paso:nth-child(1) .paso_numero { color: var(--color-azul-cobalto); }
.proceso_encargo .paso:nth-child(1) .paso_numero::before { background: var(--pastel-m-naranja); transform: rotate(-6deg); }
.proceso_encargo .paso:nth-child(2) .paso_numero { color: var(--color-secundario); }
.proceso_encargo .paso:nth-child(2) .paso_numero::before { background: var(--pastel-m-azul-medio); transform: rotate(5deg); }
.proceso_encargo .paso:nth-child(3) .paso_numero { color: var(--color-azul-cobalto); }
.proceso_encargo .paso:nth-child(3) .paso_numero::before { background: var(--pastel-m-magenta); transform: rotate(-4deg); }
.proceso_encargo .paso:nth-child(4) .paso_numero { color: var(--color-secundario); }
.proceso_encargo .paso:nth-child(4) .paso_numero::before { background: var(--pastel-m-amarillo); transform: rotate(6deg); }

/* Modificador: forzar que los 4 pasos quepan siempre en una sola línea */
.proceso_encargo--4 {
  flex-wrap: nowrap !important;
  gap: 20px;
}
.proceso_encargo--4 .paso { flex: 1 1 0; max-width: none; min-width: 0; }
.proceso_encargo--4 .paso_numero { font-size: 3.4rem; }
.proceso_encargo--4 h3 { font-size: 1.25rem; }
.proceso_encargo--4 p { font-size: 13px; }

.proceso_encargo h3 {
  font-size: 1.7rem;
  font-weight: 600;
  margin: 10px 0 12px;
}
.proceso_encargo p {
  font-size: 15px;
  color: var(--color-gris);
  line-height: 1.7;
}

/* ── 8. TESTIMONIO ───────────────────────────────────────────────────────── */
.testimonio { position: relative; }
.testimonio blockquote {
  position: relative;
  z-index: 2;
  font-size: 1.4rem;
  font-style: italic;
  font-weight: 500;
  max-width: 720px;
  margin: 0 auto 20px;
  line-height: 1.3;
}
.testimonio blockquote::before {
  content: '\201C';
  position: absolute;
  top: -64px; left: 50%;
  transform: translateX(-50%);
  font-family: var(--fuente-display);
  font-size: 9rem;
  font-weight: 600;
  color: var(--pastel-m-magenta);
  opacity: .65;
  z-index: -1;
  line-height: 1;
}
.testimonio cite {
  display: inline-block;
  font-style: normal;
  font-family: var(--fuente-ui);
  font-size: 11px;
  font-weight: 600;
  letter-spacing: .08em;
  text-transform: uppercase;
  color: var(--color-azul-cobalto);
  background: var(--pastel-celeste);
  padding: 6px 16px;
  border-radius: 20px;
}

/* ── 9. GALERÍA DE PROCESO (flexslider reutilizado) ─────────────────────── */
/* Antes en Raleway 12px mayúsculas — quedaba como una etiqueta discreta.
   Mismo lenguaje visual que el menú lateral (Cormorant Garamond cursiva),
   pero a un tamaño propio de un pie de foto, no del menú a pantalla completa. */
.gallery_image_caption {
  font-family: var(--fuente-display);
  font-style: italic;
  font-weight: 500;
  font-size: 1.5rem;
  letter-spacing: 0;
  text-transform: none;
  color: var(--color-texto);
}
/* El bloque ocupaba casi 750px de alto y todo el ancho de página: el tema
   fuerza "width:100%; height:auto" en las imágenes del flexslider, así que
   a ancho completo de página la altura salía directamente de la proporción
   real 1200x750 del archivo. Fijamos la altura EN LA IMAGEN directamente
   (no en % sino en px), dejando que el <li> y el contenedor sigan creciendo
   con su contenido real (imagen + pie de foto) — así el pie de foto tiene
   sitio debajo en vez de quedar recortado por el overflow:hidden que el
   propio flexslider aplica a ".slides". Ahora el bloque vive en la columna
   izquierda de un layout a dos columnas (.one_half, ver más abajo), así
   que ocupa el 100% de esa columna en vez de tener un max-width propio. */
.flexslider.tg_gallery {
  max-width: 100%;
}
.flexslider.tg_gallery .slides > li img {
  width: 100% !important;
  height: 380px !important;
  object-fit: cover;
  object-position: center;
}
@media (max-width: 767px) {
  .flexslider.tg_gallery .slides > li img {
    height: 260px !important;
  }
}
/* Flechas de navegación de ESTE slider (flexslider, no el hero) — mismo
   lenguaje "blob" que #toTop/WhatsApp/flechas del hero (Secciones 11-12 y
   28): el tema las dibuja como cuadrados oscuros semitransparentes
   (.flex-direction-nav a), aquí solo con los colores/forma/hover propios,
   igual que se hizo con el hero. Solo en .pdc-process-gallery-col: este
   fork de flexslider inserta el <ul class="flex-direction-nav"> como
   HERMANO de .flexslider (dentro de .slider_wrapper), no como descendiente
   suyo — ".tg_gallery .flex-direction-nav" nunca habría coincidido con
   nada; hay que apuntar al wrapper propio que envuelve a los dos.
   El icono de la flecha (">"/"<") venía de combined.css:
   ".flex-direction-nav a:before { font-family:'FontAwesome'; content:'\f104'/'\f105'; }"
   — ese codepoint (chevron) nunca formó parte del subconjunto de 8 iconos
   de font-awesome-subset.css (la sustitución del webfont completo es de
   una sesión anterior a este audit), así que la flecha llevaba tiempo sin
   glifo real, no es una regresión de esta sesión. En vez de ampliar el
   subset de iconos (una fuente más que cargar), se dibuja aquí un chevron
   con solo bordes CSS — cero dependencia de fuente de iconos. */
.pdc-process-gallery-col .flex-direction-nav a {
  background: var(--pastel-m-magenta) !important;
  border-radius: 42% 58% 65% 35% / 45% 45% 55% 55% !important;
  width: 46px !important;
  height: 46px !important;
  top: 50% !important;
  margin-top: -23px !important;
  /* El texto "Anterior"/"Siguiente" (prevText/nextText, ver <script> de
     inicialización) es el nombre accesible del enlace -- ya lo expone
     aria-label explícitamente, así que aquí se oculta visualmente sin
     quitarlo del DOM (font-size:0 en vez de display:none/aria-hidden,
     para no romper el nombre accesible). El chevron de abajo (::before)
     es solo decorativo. */
  font-size: 0 !important;
  color: transparent !important;
  box-shadow: 0 4px 14px rgba(216,170,190,.6);
  transition: transform .25s ease, box-shadow .25s ease, border-radius .25s ease, background .25s ease;
}
.pdc-process-gallery-col .flex-direction-nav a:before {
  content: '' !important;
  position: absolute;
  top: 50%;
  left: 50%;
  width: 10px;
  height: 10px;
  margin: -7px 0 0 -8px;
  border-style: solid !important;
  border-color: var(--color-secundario) !important;
  border-width: 0 2.5px 2.5px 0 !important;
  transform: rotate(-45deg);
  transition: border-color .25s ease;
}
.pdc-process-gallery-col .flex-direction-nav a.flex-prev:before {
  transform: rotate(135deg);
  margin: -7px 0 0 -6px;
}
.pdc-process-gallery-col .flex-direction-nav a:hover {
  background: var(--pastel-m-violeta) !important;
  border-radius: 58% 42% 35% 65% / 55% 55% 45% 45% !important;
  transform: scale(1.1) rotate(4deg);
  box-shadow: 0 6px 20px rgba(203,173,212,.75);
}
.pdc-process-gallery-col .flex-direction-nav a:hover:before {
  border-color: var(--color-violeta) !important;
}
.pdc-process-gallery-col .flex-prev { left: 12px !important; }
.pdc-process-gallery-col .flex-next { right: 12px !important; }

/* Layout a dos columnas: galería a la izquierda, título+texto SEO a la
   derecha (antes ocupaba todo el ancho). En móvil, .one_half del tema ya
   pasa a 100% apilado (columna de imagen primero, texto debajo). */
.pdc-process-text {
  display: flex;
  flex-direction: column;
  justify-content: center;
}
.pdc-process-subtitle {
  font-family: var(--fuente-display);
  font-style: italic;
  font-size: 1.2rem;
  color: var(--color-gris);
  margin: 4px 0 16px;
}

/* ── 10. CTA DOBLE ───────────────────────────────────────────────────────── */
.cta_doble {
  text-align: center;
  max-width: 640px;
  margin: 0 auto;
}
.cta_doble h2 { margin-bottom: 10px; }
.cta_doble p {
  color: var(--color-gris);
  font-size: 15px;
  margin-bottom: 28px;
}
.cta_doble .cta_botones {
  display: flex;
  gap: 16px;
  justify-content: center;
  flex-wrap: wrap;
}

/* ── 11. FOOTER ──────────────────────────────────────────────────────────── */
/* Antes las 4 columnas y la barra de menú de abajo compartían un único
   pastel plano (--pastel-azul-medio) de pared a pared — monótono. Un solo
   degradado horizontal en el contenedor exterior (.footer_bar, que envuelve
   tanto #footer -las columnas- como .footer_bar_wrapper -menú+copyright-)
   recorre las cuatro columnas con un matiz distinto cada una y sigue fluyendo
   por debajo del menú, sin costuras entre secciones. Quitamos el fondo propio
   de .footer_bar_wrapper para que dependa del degradado del padre en vez de
   taparlo con un color plano. */
.footer_bar {
  background: linear-gradient(to right,
    var(--pastel-celeste) 0%,
    var(--pastel-violeta) 33%,
    var(--pastel-azul-medio) 66%,
    var(--pastel-magenta) 100%
  ) !important;
  color: var(--color-texto);
}
.footer_bar_wrapper {
  background: transparent !important;
  color: var(--color-texto);
}
/* Los títulos de columna en --color-azul-cobalto se leían apagados sobre el
   pastel del footer (poco contraste). --color-azul-prusiano es la variable
   pensada precisamente para texto sobre fondos de footer (ver Sección 1) y
   además invierte su luminosidad en modo oscuro, así que sigue leyéndose
   bien ahí también sin reglas adicionales. Más peso para reforzar. */
.footer_bar .widgettitle span,
.footer_bar .widgettitle {
  color: var(--color-azul-prusiano) !important;
  font-size: 1.1rem;
  font-weight: 700;
}
.footer_bar .textwidget, .footer_bar .textwidget p,
.footer_bar .textwidget a {
  /* !important necesario: "#footer a{color:#000}" del tema tiene un ID y
     gana por especificidad a esta regla de dos clases pese a ir después en
     la cascada. En claro pasaba desapercibido (negro sobre el pastel claro
     del footer no está mal), pero es la misma coincidencia que en el resto
     de casos de esta sección: en oscuro, negro sobre el pastel ya oscuro
     del footer es invisible. */
  color: var(--color-texto) !important;
}
.footer_bar .textwidget a:hover { color: var(--color-secundario) !important; }
#footer_menu.footer_nav li a { color: var(--color-azul-cobalto) !important; }
#footer_menu.footer_nav li a:hover { color: var(--color-secundario) !important; }
#copyright { color: var(--color-gris); opacity: .85; font-size: 11px; }
/* style.css fija "#copyright a{color:#222}" (ID+elemento, más específico
   que nuestro "a" general) — mismo patrón que el resto de enlaces del tema
   con color fijo: invisible en oscuro por la misma coincidencia de siempre. */
#copyright a { color: var(--color-primario) !important; }
#copyright a:hover { color: var(--color-secundario) !important; }

/* El tema deja #footer con padding-top/bottom:50px propios, y
   .footer_bar_wrapper suma su propio padding-top encima — entre eso y que la
   columna más corta se queda con mucho aire debajo de su contenido, quedaba
   un hueco enorme antes del menú de abajo. Lo compactamos. */
#footer {
  padding-top: 30px !important;
  padding-bottom: 20px !important;
}
.footer_bar_wrapper {
  padding-top: 18px !important;
  padding-bottom: 18px !important;
}

/* Logotipo del footer — mismo icono+wordmark que la cabecera, en fila propia
   centrada antes de las 4 columnas, a un tamaño más discreto que el del
   header. Mismo color que los títulos de columna para que lean como un
   mismo bloque de marca (y con el mismo apaño de modo oscuro gratis, al
   depender de la misma variable). */
.pdc-footer-logo {
  text-align: center;
  margin-bottom: 34px;
}
.pdc-footer-logo a {
  display: inline-flex;
  align-items: center;
  gap: 10px;
  text-decoration: none;
}
.pdc-footer-logo img {
  width: 40px;
  height: 40px;
  display: block;
}
.pdc-footer-logo span {
  font-family: var(--fuente-display);
  font-size: 1.3rem;
  font-weight: 500;
  letter-spacing: .01em;
  color: var(--color-azul-prusiano);
}

.mc4wp-form input[type="email"] {
  border: 1px solid rgba(74,130,180,.3);
  background: rgba(255,255,255,.6);
  color: var(--color-texto);
}
/* El naranja medio (--pastel-m-naranja) es, técnicamente, un pastel — pero
   rodeado del degradado frío celeste/violeta/azul/magenta del resto del
   footer (Sección 11 más arriba) es el único tono cálido saturado del
   bloque, y se come el protagonismo de todo lo demás por contraste
   simultáneo. Bajamos un escalón al pastel suave (--pastel-naranja, el
   mismo nivel que usan los fondos del resto del sitio) y dejamos el tono
   medio actual como estado hover — dar información visual al pasar el
   ratón sin gritar en reposo. */
.mc4wp-form input[type="submit"] {
  background: var(--pastel-naranja);
  border: none;
  color: var(--color-texto);
  font-family: var(--fuente-ui);
  font-weight: 600;
  text-transform: uppercase;
  letter-spacing: .06em;
}
.mc4wp-form input[type="submit"]:hover { background: var(--pastel-m-naranja); }
/* Checkbox de consentimiento RGPD del newsletter — texto pequeño para que no
   compita con el resto del widget del footer (ya es de por sí un bloque muy
   compacto), checkbox alineado con la primera línea del texto en vez de
   centrado verticalmente respecto al párrafo entero. El required nativo del
   input ya impide el envío sin marcar, sin JS adicional.
   El tema trae un selector "label{...}" genérico (combined.css) con
   uppercase, negrita y 13px pensado para las etiquetas de los campos de
   formulario — al ser una propiedad puesta directamente en el elemento
   (no heredada), gana pese a que nuestro selector es más específico:
   solo pisa lo que fijamos explícitamente, así que hay que neutralizar
   también lo que no tocábamos (text-transform, font-weight, margin).
   El texto (con el enlace incluido) va envuelto en un <span> propio en vez
   de suelto como texto+<a> directamente dentro del <label>: en flex, cada
   hijo en flujo se convierte en su propia columna, incluida cualquier
   tanda de texto suelto — sin el <span>, "He leído y acepto la",
   "Política de Privacidad" (el <a>) y "y consiento..." se partían en tres
   columnas en vez de fluir como una frase. Con el <span> solo hay dos
   flex items: el checkbox y el bloque de texto completo. */
.pdc-newsletter-consent {
  font-size: 11px;
  line-height: 1.4;
  color: var(--color-gris);
  margin: 10px 0 !important;
}
.pdc-newsletter-consent label {
  display: flex;
  align-items: flex-start;
  gap: 6px;
  cursor: pointer;
  text-transform: none;
  font-weight: 400;
  font-size: 11px;
  width: auto;
  margin: 0;
}
.pdc-newsletter-consent label span {
  flex: 1 1 auto;
}
.pdc-newsletter-consent input[type="checkbox"] {
  flex: 0 0 auto;
  margin-top: 2px;
}
/* Este <p> no vive dentro de un .textwidget (es un campo del propio
   formulario), así que la regla que da color a los enlaces del footer
   (.footer_bar .textwidget a) no lo alcanza y el enlace se queda con el
   "#222" fijo del tema — invisible sobre el fondo oscuro del footer en modo
   oscuro. --color-primario ya está pensado para contrastar sobre claro y
   oscuro por igual sin reglas adicionales. */
.pdc-newsletter-consent a {
  color: var(--color-primario) !important;
  text-decoration: underline;
}

/* Honeypot anti-spam de los formularios de contacto y newsletter — patrón
   recomendado por Netlify: un <input type="text"> NORMAL (no type="hidden",
   que los bots más elaborados ya reconocen y evitan sin más) dentro de un
   contenedor oculto por CSS con display:none, tal cual el snippet oficial
   de Netlify (que además marca el contenedor con el atributo HTML "hidden"
   como refuerzo, ver el <p class="pdc-hp" hidden> en el HTML). */
.pdc-hp {
  display: none;
}

/* El tema pintaba esto como icono blanco (#toTop i{color:#fff}, más
   específico que nuestro #toTop{color:...} de antes) sobre un fondo gris
   semitransparente — contraste casi nulo. Lo rediseñamos con la misma
   familia visual que el flotante de WhatsApp (blob orgánico, pastel de
   marca, icono oscuro) y lo apilamos justo encima para que no se solapen. */
#toTop {
  width: 46px !important;
  height: 46px !important;
  background: var(--pastel-m-magenta) !important;
  border-radius: 42% 58% 65% 35% / 45% 45% 55% 55% !important;
  display: flex !important;
  align-items: center !important;
  justify-content: center !important;
  padding: 0 !important;
  bottom: calc(2rem + 62px + 14px) !important;
  right: 2rem !important;
  box-shadow: 0 4px 14px rgba(216,170,190,.6);
  transition: transform .25s ease, box-shadow .25s ease, border-radius .25s ease, background .25s ease !important;
}
#toTop i {
  color: var(--color-secundario) !important;
  font-size: 20px !important;
  line-height: 1 !important;
}
#toTop:hover {
  background: var(--pastel-m-violeta) !important;
  opacity: 1 !important;
  transform: scale(1.1) rotate(4deg);
  box-shadow: 0 6px 20px rgba(203,173,212,.75);
  border-radius: 58% 42% 35% 65% / 55% 55% 45% 45% !important;
}
#toTop:hover i { color: var(--color-violeta) !important; }

/* ── 12. BOTÓN FLOTANTE DE WHATSAPP (global, todas las páginas) ─────────── */
.whatsapp-float {
  position: fixed;
  bottom: 2rem;
  right: 2rem;
  z-index: 1000;
  width: 62px;
  height: 62px;
  border-radius: 42% 58% 65% 35% / 45% 45% 55% 55%;
  background: var(--pastel-m-naranja);
  display: flex;
  align-items: center;
  justify-content: center;
  box-shadow: 0 4px 16px rgba(245,201,182,.65);
  transition: transform .25s ease, box-shadow .25s ease, background .25s ease, border-radius .25s ease;
}
.whatsapp-float i {
  color: var(--color-texto);
  font-size: 28px;
}
.whatsapp-float:hover {
  background: var(--pastel-m-amarillo);
  transform: scale(1.1) rotate(-4deg);
  border-radius: 58% 42% 35% 65% / 55% 55% 45% 45%;
  box-shadow: 0 6px 24px rgba(246,227,161,.75);
}

/* ── 13. RESPONSIVE ──────────────────────────────────────────────────────── */
@media (max-width: 768px) {
  .proceso_encargo { gap: 30px; }
  .proceso_encargo--4 { flex-wrap: wrap !important; }
  .proceso_encargo--4 .paso { flex: 1 1 240px; }
  .cta_doble .cta_botones { flex-direction: column; align-items: center; }
  .whatsapp-float { bottom: 1.25rem; right: 1.25rem; width: 50px; height: 50px; }
  #toTop { bottom: calc(1.25rem + 50px + 10px) !important; right: 1.25rem !important; width: 40px !important; height: 40px !important; }
  #toTop i { font-size: 17px !important; }
  .mobile_main_nav li a { font-size: 2.3rem; }
}

@media (max-width: 420px) {
  .mobile_main_nav li a { font-size: 1.9rem; }
}

/* El JS de la cabecera (ver Sección 19) arranca siempre en el tamaño "grande"
   pensado para el ancho de escritorio — en móvil eso no cabe y se monta
   sobre la imagen de cabecera. Fijamos aquí un tamaño propio para móvil,
   FIJO (sin animación de scroll): width/height/font-size con !important
   ganan siempre a los valores base (aplican ya en el primer render, vía
   CSS, sin depender de JS). El JS ahora anima con transform (Sección 19),
   así que además anulamos cualquier transform que pudiera llegar a
   aplicar — en este breakpoint el logo no cambia de tamaño al hacer scroll,
   ni por width/height ni por transform. */
@media (max-width: 480px) {
  #logo_transparent img {
    width: 32px !important;
    height: 32px !important;
    transform: none !important;
  }
  #logo_transparent .logo_text {
    font-size: 1.05rem !important;
    transform: none !important;
  }
}

/* El tema fuerza "min-height:60px" en .top_bar por debajo de 960px
   (responsive.css) — pensado para su logo pequeño de siempre, que ya
   llenaba ese alto de sobra. Con el nuestro, tras el scroll la cabecera
   encoge a un contenido real de ~48px (8px de padding arriba y abajo +
   32px del logo), pero el suelo de 60px la mantiene más alta de lo que
   debería, y como .top_bar es un bloque normal (no centra su contenido
   verticalmente), esos ~12px de sobra quedan todos pegados abajo en vez
   de repartirse: el logo y la hamburguesa quedan pegados arriba, no
   centrados en la barra. Quitamos el suelo y centramos el contenido por
   si en algún punto de la transición de scroll sí llega a sobrar alto. */
@media (max-width: 960px) {
  .top_bar {
    min-height: 0 !important;
  }
}

/* ── 14. PÁGINAS INTERIORES ─────────────────────────────────────────────── */

/* Filtros del portfolio — todos en una línea */
.portfolio_wall_filters {
  display: flex !important;
  flex-wrap: nowrap;
  justify-content: center;
  align-items: center;
  overflow-x: auto;
  -webkit-overflow-scrolling: touch;
  white-space: nowrap;
  float: none !important;
  width: 100%;
  padding-bottom: 4px;
}
.portfolio_wall_filters li {
  float: none !important;
  display: inline-flex;
  align-items: center;
  flex-shrink: 0;
}
.portfolio_wall_filters li a {
  font-family: var(--fuente-ui);
  font-weight: 600;
  letter-spacing: .02em;
  text-transform: uppercase;
  font-size: 11px;
  color: var(--color-gris);
  white-space: nowrap;
}
.portfolio_wall_filters li a.active,
.portfolio_wall_filters li a:hover { color: var(--color-primario); }
.portfolio_wall_filters .separator { margin: 0 10px; color: rgba(44,36,32,.25); }

/* Tarifas por serie */
.pricing-grid {
  display: flex;
  flex-wrap: wrap;
  gap: 24px;
  justify-content: center;
}
.pricing-card {
  flex: 1 1 260px;
  max-width: 300px;
  border-radius: 28px 8px 28px 8px;
  padding: 28px 24px;
  text-align: center;
  transition: transform .25s ease, box-shadow .25s ease;
}
.pricing-card:hover {
  transform: translateY(-4px) rotate(-0.5deg);
  box-shadow: 0 10px 24px rgba(44,36,32,.12);
}
.pricing-card h3 { font-size: 1.3rem; font-weight: 600; margin: 6px 0 4px; }
.pricing-icon { font-size: 2rem; margin-bottom: 4px; }
/* Iconos SVG series — encargos */
.pricing-icon {
  display: flex;
  justify-content: center;
  align-items: center;
}
.pricing-icon svg {
  display: block;
  width: 56px;
  height: 56px;
}
/* Blog masonry */
/* #blog_grid_wrapper trae un ancho fijo de 1195px heredado de combined.css
   (pensado para el layout más ancho de la plantilla original) — en nuestra
   columna de blog (71% de .inner_wrapper, con sidebar a la derecha) eso
   desbordaba el grid por debajo del sidebar. Lo anulamos aquí. */
#blog_grid_wrapper.full_width {
  width: 100%;
}
/* Dos precios por categoría (A4 / Mediano) en vez de uno solo — sustituye
   a la antigua .pricing-price de una sola línea. */
.pricing-sizes {
  margin-bottom: 10px;
  text-align: left;
}
.pricing-size {
  display: flex;
  justify-content: space-between;
  align-items: baseline;
  gap: 10px;
  font-family: var(--fuente-ui);
  font-size: .82rem;
  padding: 5px 0;
}
.pricing-size + .pricing-size {
  border-top: 1px solid rgba(44,36,32,.1);
}
.pricing-size-label {
  color: var(--color-gris);
}
.pricing-size-price {
  font-weight: 700;
  color: var(--color-azul-cobalto);
  white-space: nowrap;
}
.pricing-card p { font-size: 13px; color: var(--color-gris); line-height: 1.5; margin: 0; }
/* Tarjetas series — encargos: mismo criterio que las tarjetas equivalentes
   de la home (.pdc-serie-card) — fondo pastel sólido por serie, una por
   tarjeta, en vez del degradado hacia blanco de la versión anterior. */
.pricing-card--rosa     { background: var(--pastel-m-magenta); }
.pricing-card--amarillo { background: var(--pastel-amarillo); }
.pricing-card--violeta  { background: var(--pastel-violeta); }
.pricing-card--celeste  { background: var(--pastel-celeste); }
.pricing-card--magenta  { background: var(--pastel-magenta); }
.pricing-card--azul     { background: var(--pastel-azul-medio); }

.pricing-card { position: relative; overflow: hidden; }
.pricing-ribbon {
  position: absolute;
  top: 18px;
  right: -28px;
  width: 120px;
  background: var(--color-secundario);
  color: #fff;
  font-family: var(--fuente-ui);
  font-size: 10px;
  font-weight: 700;
  letter-spacing: .08em;
  text-transform: uppercase;
  text-align: center;
  padding: 6px 0;
  transform: rotate(45deg);
  transform-origin: center;
  z-index: 2;
  pointer-events: none;
}

/* FAQ */
.faq-wrapper {
  display: flex;
  gap: 40px;
  align-items: flex-start;
}
/* Ya no son marcadores de posición grises: foto real, encajada con
   object-fit para llenar el mismo hueco de antes. Antes usaba
   height:100%/min-height:100% con align-items:stretch en el padre — sin
   ningún tope, la imagen se estiraba para igualar el alto real de
   .faq-list (que crece con el número/longitud de preguntas), pudiendo
   quedar mucho más alta que un tamaño razonable de foto. Alto fijo en su
   lugar: nunca depende del contenido del FAQ. El tema pisa "height" aquí
   con más especificidad (".page_content_wrapper img{height:auto}", un
   elemento extra en el selector) — sin el !important, ese "auto" volvía a
   activar el estirado por flexbox (align-items ya no es stretch, pero
   "auto" como cross-size en un flex item con flex-start no se comporta
   como el auto normal de bloque). */
.faq-image-placeholder {
  flex: 0 0 300px;
  width: 300px !important;
  height: 500px !important;
  object-fit: cover;
  border-radius: 8px;
}
.image-placeholder {
  width: 100%;
  height: 380px;
  margin: 20px 0;
  object-fit: cover;
  border-radius: 8px;
}
.faq-list { flex: 1; min-width: 0; }
.faq-item {
  padding: 10px 0;
  border-bottom: 1px solid rgba(44,36,32,.08);
}
.faq-item h3 { font-size: 1.1rem; font-weight: 600; margin: 0 0 4px; }
.faq-item p { font-size: 14px; color: var(--color-gris); line-height: 1.5; margin: 0; }

@media (max-width: 700px) {
  .faq-wrapper { flex-direction: column; }
  /* En columna, el eje principal pasa a ser el vertical: "flex:0 0 300px"
     (pensado para controlar el ANCHO en fila) pasa a controlar el ALTO y
     gana sobre "height", aunque lleve !important — el algoritmo de flexbox
     consulta flex-basis antes que la propiedad height cuando flex-basis
     tiene un valor definido. Hay que igualar también el flex-basis aquí. */
  .faq-image-placeholder { flex: 0 0 220px !important; width: 100% !important; height: 220px !important; }
}

/* ── 16. BARRA LATERAL DEL BLOG ──────────────────────────────────────────── */
.sidebar .widgettitle { font-size: 1.05rem; margin-bottom: 16px; }
/* El tema tiene reglas para ".posts.blog li" con más especificidad (algunas
   con ID) que ganaban a nuestro display:flex y dejaban la miniatura con
   float:left "a pelo": el título y la fecha (elementos flex sin hueco real)
   quedaban aplastados envolviendo la miniatura, partidos en columnas
   estrechísimas. Ninguna regla del tema usa !important aquí, así que en vez
   de perseguir su especificidad, volvemos al patrón "miniatura flotante +
   bloque de texto" de forma explícita y con !important donde hace falta. */
.posts.blog.withthumb li {
  display: block !important;
  overflow: hidden;
  margin-bottom: 14px;
}
.posts.blog.withthumb .post_circle_thumb {
  float: left !important;
  width: 56px;
  margin-right: 12px !important;
}
.posts.blog.withthumb .post_circle_thumb img {
  float: none !important;
  width: 56px !important;
  height: 56px !important;
  border-radius: 50%;
  object-fit: cover;
}
.posts.blog.withthumb a {
  display: block;
  font-family: var(--fuente-display);
  font-size: 15px;
  color: var(--color-texto);
}
.posts.blog.withthumb a:hover { color: var(--color-primario); }
.posts.blog.withthumb .post_attribute {
  font-size: 11px; color: var(--color-gris); margin-top: 2px;
}
.sidebar .social_wrapper ul { display: flex; gap: 10px; flex-wrap: wrap; padding: 0; }
.sidebar .social_wrapper li { list-style: none; }
/* Mismo blob orgánico que #toTop/WhatsApp (Secciones 11-12), sin tocar el
   tamaño: solo la forma (border-radius asimétrico) y el giro+escala en
   :hover, con los tonos celeste que ya tenía este componente. A 34px el
   spread de #toTop (42/58/65/35) apenas se distingue de un círculo — aquí
   usamos un spread mayor (30/70) para que la forma orgánica se note también
   a este tamaño más pequeño. */
.sidebar .social_wrapper a {
  width: 34px; height: 34px; display: flex; align-items: center; justify-content: center;
  background: var(--pastel-celeste);
  border-radius: 30% 70% 70% 30% / 30% 30% 70% 70%;
  color: var(--color-azul-cobalto);
  transition: transform .25s ease, border-radius .25s ease, background .25s ease;
}
.sidebar .social_wrapper a:hover {
  background: var(--pastel-m-celeste);
  border-radius: 70% 30% 30% 70% / 70% 70% 30% 30%;
  transform: scale(1.1) rotate(4deg);
}
/* Etsy sin productos publicados todavía: icono deshabilitado visualmente
   (sin href, apagado, sin el hover/blob del resto) + etiqueta "Próximamente"
   al lado. El fondo de este panel es siempre blanco (Sección 24), así que
   los tonos van fijos, no por variable de tema. */
.pdc-icon-disabled {
  width: 34px; height: 34px; display: flex; align-items: center; justify-content: center;
  background: rgba(44,36,32,.06);
  border-radius: 30% 70% 70% 30% / 30% 30% 70% 70%;
  color: rgba(44,36,32,.35);
  cursor: default;
}
.pdc-etsy-soon-label {
  list-style: none;
  font-size: 11px;
  color: rgba(44,36,32,.5);
  display: flex;
  align-items: center;
  white-space: nowrap;
  font-style: italic;
}
/* Misma idea que .pdc-icon-disabled pero para el enlace de texto "Etsy" del
   listado de redes de contacto.html — aquí sí es contenido de página normal
   (no el panel siempre-blanco del menú lateral), así que usa la variable de
   marca en vez de un color fijo, para adaptarse solo en modo oscuro. */
.pdc-text-disabled {
  color: var(--color-gris);
  cursor: default;
}
.pdc-text-disabled em { font-style: italic; }

/* ── 17. LIGHTBOX DEL PORTFOLIO ──────────────────────────────────────────── */
.pdc-lightbox {
  display: none;
  position: fixed;
  inset: 0;
  z-index: 9999;
  background: rgba(44,36,32,.92);
  align-items: center;
  justify-content: center;
  flex-direction: column;
  padding: 40px;
}
.pdc-lightbox.active { display: flex; }
.pdc-lightbox-img {
  max-width: 90vw;
  max-height: 82vh;
  border-radius: 4px;
  box-shadow: 0 10px 40px rgba(0,0,0,.4);
}
.pdc-lightbox-caption {
  color: #fff;
  font-family: var(--fuente-display);
  font-size: 1.1rem;
  margin-top: 18px;
  text-align: center;
}
.pdc-lightbox-close {
  position: absolute;
  top: 24px;
  right: 32px;
  color: #fff;
  font-size: 2.4rem;
  line-height: 1;
  cursor: pointer;
  font-family: var(--fuente-ui);
  font-weight: 300;
}
.pdc-lightbox-close:hover { color: var(--pastel-m-naranja); }
.gallery3 a { cursor: zoom-in; }
/* Mismo lenguaje "blob" que las flechas del hero (Sección 28) y de la
   galería de proceso (Sección 9): insignia orgánica en pastel-magenta que
   gira a violeta en :hover, en vez de los círculos blancos translúcidos
   genéricos que traía el lightbox por defecto. */
.pdc-lightbox-nav {
  position: absolute;
  top: 50%;
  margin-top: -28px;
  width: 56px;
  height: 56px;
  line-height: 56px;
  font-size: 22px;
  cursor: pointer;
  border-radius: 42% 58% 65% 35% / 45% 45% 55% 55%;
  background: var(--pastel-m-magenta);
  color: var(--color-secundario);
  box-shadow: 0 4px 14px rgba(216,170,190,.6);
  display: flex;
  align-items: center;
  justify-content: center;
  transition: transform .25s ease, box-shadow .25s ease, border-radius .25s ease, background .25s ease, color .25s ease;
}
.pdc-lightbox-nav:hover {
  background: var(--pastel-m-violeta);
  color: var(--color-violeta);
  transform: scale(1.1) rotate(4deg);
  border-radius: 58% 42% 35% 65% / 55% 55% 45% 45%;
  box-shadow: 0 6px 20px rgba(203,173,212,.75);
}
.pdc-lightbox-prev { left: 20px; }
.pdc-lightbox-next { right: 20px; }
@media (max-width: 700px) {
  .pdc-lightbox-nav { width: 40px; height: 40px; margin-top: -20px; line-height: 40px; font-size: 17px; }
  .pdc-lightbox-prev { left: 8px; }
  .pdc-lightbox-next { right: 8px; }
}

/* Oculta visualmente pero mantiene el contenido accesible para buscadores
   y lectores de pantalla — usado para el H1 semántico del hero */
.visually-hidden {
  position: absolute !important;
  width: 1px; height: 1px;
  padding: 0; margin: -1px;
  overflow: hidden;
  clip: rect(0,0,0,0);
  white-space: nowrap;
  border: 0;
}


/* ── 18. CABECERA — BARRA "GLASS" PERMANENTE, IGUAL EN TODA LA WEB ───────────
   Antes el header nacía completamente transparente y dependía por entero
   del velo sobre la foto (Sección 22) para que el menú se leyera bien — la
   legibilidad vivía en el velo, no en el header. Ahora el propio header
   lleva SIEMPRE un fondo traslúcido con blur (no solo tras hacer scroll),
   así que el texto se lee igual de bien sea cual sea la foto de detrás. El
   script de cabecera (sin listener nuevo) sigue subiendo un poco más la
   opacidad del tinte al hacer scroll, para reforzar el contraste cuando el
   header se compacta — pero ya no depende de ese momento para ser legible.
   Con esto, el velo de la Sección 22 queda por defecto a 0 (--hero-fade-*
   en la Sección 1): ya no hace falta, la legibilidad vive aquí. */
.top_bar {
  position: relative;
  overflow: hidden;
  box-shadow: 0 1px 12px rgba(44,36,32,.08);
  backdrop-filter: blur(10px);
  -webkit-backdrop-filter: blur(10px);
  transition: box-shadow .3s ease;
}
@supports not ((backdrop-filter: blur(1px)) or (-webkit-backdrop-filter: blur(1px))) {
  .top_bar {
    background: rgba(var(--color-fondo-rgb), .92) !important;
  }
}
/* Wash cálido, esquina superior izquierda */
.top_bar::before {
  content: '';
  position: absolute;
  width: 260px;
  height: 260px;
  top: -150px;
  left: -70px;
  border-radius: 50%;
  background: radial-gradient(circle, var(--pastel-m-amarillo) 0%, var(--pastel-naranja) 45%, transparent 75%);
  filter: blur(22px);
  opacity: .6;
  pointer-events: none;
  z-index: 0;
}
/* Wash frío, esquina inferior derecha */
.top_bar::after {
  content: '';
  position: absolute;
  width: 260px;
  height: 260px;
  bottom: -170px;
  right: -70px;
  border-radius: 50%;
  background: radial-gradient(circle, var(--pastel-m-azul-medio) 0%, var(--pastel-celeste) 45%, transparent 75%);
  filter: blur(22px);
  opacity: .6;
  pointer-events: none;
  z-index: 0;
}
.top_bar > .standard_wrapper {
  position: relative;
  z-index: 1;
}

/* ── 19. TAMAÑO DEL LOGO — CONTROLADO POR JS AL HACER SCROLL ─────────────────
   El icono, el texto y el padding de la barra pasan de "grande" a "normal"
   de forma continua según la posición real del scroll (ver el script al
   final del documento) — no por un salto CSS a un punto fijo, así queda
   perfectamente suave y sincronizado en vez de dar un salto brusco.
   El tamaño "grande" (38px / 1.55rem) es el que llevan el HTML (width/
   height del <img>) y esta hoja (font-size de .logo_text) desde el primer
   render — el script NUNCA cambia esas propiedades, solo aplica
   transform:scale() encima para encoger visualmente hacia el tamaño
   "normal" al hacer scroll. Antes el script fijaba width/height/font-size
   directamente por JS, con el HTML apuntando al tamaño PEQUEÑO (24px) como
   valor base — el salto de 24 a 38px nada más cargar (antes de cualquier
   scroll) generaba un cambio de layout real (reflow), no solo visual, y
   era la causa de un CLS medido de 0.56 en escritorio. transform no
   participa en el layout (es una propiedad de composición), así que ni la
   carga inicial ni el propio scroll mueven ya nada a su alrededor. */

/* ── 20. FRANJA DE COLOR EN CABECERAS SIN IMAGEN ─────────────────────────────
   Portfolio, encargos, blog y contacto no tienen una foto grande arriba
   (como sí tienen inicio, sobre-mí y single), así que el título de la
   página lleva un degradado pastel suave que le da al header transparente
   algo de contraste antes de hacer scroll. */
.page-header-wash {
  background: linear-gradient(115deg,
    var(--pastel-naranja) 0%,
    var(--pastel-amarillo) 22%,
    var(--color-fondo) 50%,
    var(--pastel-celeste) 78%,
    var(--pastel-azul-medio) 100%
  );
}

/* El padding-top:170px inline de estos bloques no es solo estética: es el
   hueco que necesita el h1 para no quedar tapado por la cabecera, que es
   "position:fixed" y flota por encima (unos 118px de alto). El tema tiene
   una regla genérica que reduce el padding de ".withsmallpadding" a 20-30px
   en móvil/tablet — pensada para el resto de secciones con padding normal,
   pero rompe la función real de este padding y el título queda debajo del
   logo. Restauramos un padding-top propio, suficiente para despejar la
   cabecera fija en cualquier ancho. Misma especificidad que la regla del
   tema (4 clases) para poder ganarle por orden de aparición. */
@media (max-width: 960px) {
  .one.withsmallpadding.ppb_header.page-header-wash {
    padding-top: 140px !important;
  }
}


/* Blog — listado y entrada */
.post-teaser {
  padding: 30px 0;
  border-bottom: 1px solid rgba(44,36,32,.08);
}
.post-teaser .post_info_cat {
  font-family: var(--fuente-ui);
  font-size: 11px;
  letter-spacing: .06em;
  text-transform: uppercase;
  color: var(--color-primario);
  margin-bottom: 6px;
}
.post-teaser h5 { margin: 0 0 10px; font-size: 1.5rem; }
.post-teaser .post_img img { width: 100%; height: auto; border-radius: 4px; margin-bottom: 14px; }
.post-teaser p { color: var(--color-gris); line-height: 1.7; }
.readmore {
  display: inline-block;
  margin-top: 10px;
  font-family: var(--fuente-ui);
  font-weight: 700;
  font-size: 12px;
  letter-spacing: .06em;
  text-transform: uppercase;
  color: var(--color-azul-cobalto);
}
.readmore:hover { color: var(--color-secundario); }

/* Formulario de contacto */
.contact_form_wrapper label {
  display: block;
  font-family: var(--fuente-ui);
  font-weight: 600;
  font-size: 12px;
  letter-spacing: .04em;
  text-transform: uppercase;
  color: var(--color-gris);
  margin: 16px 0 6px;
}
.contact_form_wrapper input[type="text"],
.contact_form_wrapper textarea {
  width: 100%;
  border: 1px solid rgba(44,36,32,.15);
  background: rgba(255,255,255,.6);
  border-radius: 4px;
  padding: 10px 14px;
  font-family: var(--fuente-ui);
  font-size: 14px;
  color: var(--color-texto);
}
.contact_form_wrapper input[type="submit"].solidbg {
  background: var(--pastel-m-naranja);
  border: none;
  border-radius: 28px 8px 28px 8px;
  padding: 1rem 2.6rem;
  font-family: var(--fuente-ui);
  font-weight: 700;
  letter-spacing: .08em;
  text-transform: uppercase;
  font-size: .85rem;
  color: var(--color-texto);
  cursor: pointer;
}
.contact_form_wrapper input[type="submit"].solidbg:hover { background: var(--pastel-m-amarillo); }

/* ── 15. CABECERA SÓLIDA EN PÁGINAS SIN IMAGEN DE FONDO ──────────────────────
   El header transparente con logo/menú en blanco solo funciona sobre una
   imagen (home, sobre-mi). En el resto de páginas forzamos la versión
   sólida (oscura) desde el principio para que se vea sobre el fondo claro. */
/* Nota: la lógica de recoloreado para páginas interiores ahora vive unificada
   en la sección 18, bajo la misma clase "pdc-scrolled" que usa inicio. */

/* ── 21. BUSCADOR DEL MENÚ LATERAL ────────────────────────────────────────
   Buscador simple en JS (js/pdc-search.js) que indexa el texto de las 9
   páginas en build-time (js/search-index.json) — sin backend. Reutiliza el
   #searchform/#autocomplete que ya traía la plantilla en el menú lateral,
   pero con nuestro propio marcado de resultados y !important para ganar a
   las reglas del tema (pensadas para su buscador AJAX de WordPress).

   OJO: el fondo real de .mobile_menu_wrapper es BLANCO — el CSS del tema
   (combined.css) lo diseñó oscuro (#111111, texto #999/#fff) pero otra capa
   del propio tema (style.css) lo pasó a blanco sin actualizar los colores de
   texto del buscador a juego, y una versión anterior de estas reglas heredó
   ese mismo malentendido (fondo translúcido blanco sobre blanco = invisible).
   Aquí usamos tinta oscura sobre claro, con variables para que se adapte
   solo en modo oscuro (Sección 23). */
.mobile_menu_wrapper #searchform input[type="text"] {
  background: rgba(44,36,32,.05) !important;
  border: 1px solid rgba(44,36,32,.18) !important;
  border-radius: 20px !important;
  padding: 10px 18px !important;
  font-family: var(--fuente-ui);
  color: var(--color-texto) !important;
}
.mobile_menu_wrapper #searchform button {
  display: block !important;
  position: absolute;
  right: 14px;
  top: 50%;
  transform: translateY(-50%);
}
.mobile_menu_wrapper #searchform button i {
  color: var(--color-gris) !important;
}
.mobile_menu_wrapper #searchform > div { position: relative; }

#autocomplete {
  display: none !important;
  position: static !important;
  width: 100% !important;
  right: auto !important;
  margin: 12px 0 0 0 !important;
  background: transparent !important;
  border: 0 !important;
  max-height: 60vh;
  overflow-y: auto;
}
#autocomplete.pdc-search-open {
  display: block !important;
}
.pdc-search-result {
  display: block;
  padding: 12px 14px;
  margin-bottom: 8px;
  border-radius: 8px;
  background: rgba(44,36,32,.04);
  text-decoration: none;
  transition: background .2s ease;
}
.pdc-search-result:hover { background: rgba(44,36,32,.08); }
.pdc-search-result-cat {
  display: block;
  font-family: var(--fuente-ui);
  font-size: 10px;
  font-weight: 700;
  letter-spacing: .06em;
  text-transform: uppercase;
  color: var(--color-gris);
  margin-bottom: 4px;
}
.pdc-search-result-title {
  display: block;
  font-family: var(--fuente-display);
  font-size: 1rem;
  font-weight: 600;
  color: var(--color-texto);
  margin-bottom: 4px;
}
.pdc-search-result-excerpt {
  display: block;
  font-family: var(--fuente-ui);
  font-size: 12px;
  line-height: 1.5;
  color: var(--color-gris);
}
.pdc-search-result mark {
  background: var(--pastel-m-amarillo);
  color: var(--color-texto);
  border-radius: 2px;
  padding: 0 2px;
}
.pdc-search-empty {
  font-family: var(--fuente-ui);
  font-size: 13px;
  color: var(--color-gris);
  padding: 10px 14px;
}

/* ── 22. SCRIM DE CONTRASTE EN LA CABECERA TRANSPARENTE ──────────────────────
   El texto del menú es siempre oscuro (Sección 3, por diseño de marca), así
   que un scrim OSCURO detrás empeoraría el contraste, no lo arreglaría — el
   problema real es "texto oscuro sobre foto que a veces es oscura", y la
   solución es garantizar que detrás del texto SIEMPRE haya una base clara,
   pase lo que pase en la foto. Franja corta (--hero-fade-height, Sección 1)
   con el crema de marca (--color-fondo) que cubre solo la zona donde vive
   el logo/menú y se difumina rápido hacia transparente — no debe tapar el
   hero, solo dar contraste al texto que va encima.
   Altura y opacidad de PARTIDA viven en --hero-fade-height/--hero-fade-opacity
   (Sección 1, editables ahí sin tocar el resto). A partir de esos valores,
   se interpolan por scroll (ver <script> de cabecera, que las lee al cargar
   y las escribe en --pdc-scrim-height/--pdc-scrim-opacity) hasta desaparecer
   del todo al cruzar el umbral de "pdc-scrolled" — el fondo sólido de la
   barra (mismo script) sube de opacidad al mismo ritmo que este scrim baja,
   así que el contraste combinado nunca cae por debajo del caso verificado
   en los extremos. Reemplaza al antiguo text-shadow como mecanismo principal
   de contraste. */
body::before {
  content: '';
  position: fixed;
  top: 0;
  left: 0;
  width: 100%;
  height: var(--pdc-scrim-height, var(--hero-fade-height, 140px));
  background: linear-gradient(
    rgba(250, 248, 244, var(--hero-fade-opacity, .75)) 0%,
    rgba(250, 248, 244, calc(var(--hero-fade-opacity, .75) * .47)) 60%,
    rgba(250, 248, 244, 0) 100%
  );
  opacity: var(--pdc-scrim-opacity, 1);
  z-index: 8;
  pointer-events: none;
}

/* ── 23. MODO OSCURO ──────────────────────────────────────────────────────
   Activado añadiendo data-theme="dark" a <html> (ver js/pdc-theme.js, que
   también persiste la preferencia en localStorage). Como casi todo el
   sistema visual ya se apoya en las variables de la Sección 1, redefinirlas
   aquí basta para adaptar la mayoría de componentes automáticamente — los
   pasteles NO son un simple invert(), son versiones oscuras/saturadas de
   cada tono (mismo hue, luminosidad mucho más baja) para que seporten bien
   sobre fondo oscuro en vez de quedar lavados o quemados.
   El fondo del lightbox no cambia (ya era oscuro de por sí, independiente
   del tema); sus flechas "blob" sí, al apoyarse en estas mismas variables.
   El menú lateral (mobile_menu_wrapper) SÍ cambia — ver el bloque dedicado
   más abajo, junto al resto de ajustes de esta sección. */
:root[data-theme="dark"] {
  --color-fondo: #1C1815;
  --color-fondo-rgb: 28,24,21;
  --color-blanco: #2A2521;          /* ahora es la "superficie" elevada, no blanco puro */
  --color-texto: #EDE8E2;
  --color-gris: #B3ABA1;

  --color-primario: #7AAFD4;        /* ya contrasta bien tal cual (7.5:1 sobre el fondo oscuro) */
  --color-secundario: #D0628B;
  --color-azul-cobalto: #5287B8;
  --color-azul-prusiano: #B8D8EE;
  --color-violeta: #B883C8;
  --color-azul-cielo: #4E7793;
  --color-acento-calido: #E8C84A;
  --color-acento-energia: #E8813A;

  --pastel-amarillo: #523E00;
  --pastel-naranja: #511801;
  --pastel-magenta: #421021;
  --pastel-violeta: #311839;
  --pastel-celeste: #0C2B46;
  --pastel-azul-medio: #102C42;
  --pastel-azul-oscuro: #182D3A;

  --pastel-m-amarillo: #705701;     /* algo más claro que el resto de "-m-": el amarillo pierde
                                        contraste enseguida si se oscurece al mismo ritmo */
  --pastel-m-naranja: #8B2D04;
  --pastel-m-magenta: #711E39;
  --pastel-m-violeta: #562C63;
  --pastel-m-celeste: #164C79;
  --pastel-m-azul-medio: #1D4C71;
  --pastel-m-azul-oscuro: #2A4D64;
}

/* Textura de grano de papel + viñeta: pensada para el crema claro, en
   oscuro se ve sucia — la desactivamos y dejamos el fondo oscuro liso. */
:root[data-theme="dark"] body {
  background-image: none;
}

/* Casos concretos donde una variable ahora más clara (pensada para texto
   sobre fondo oscuro) chocaría con un uso como fondo de botón con texto
   blanco encima — mantenemos ahí el tono original, que ya se probó legible
   con blanco, en vez de heredar el valor nuevo de la variable. */
:root[data-theme="dark"] .btn--primary:hover { background: #4A82B4; }
:root[data-theme="dark"] .pricing-ribbon { background: #C84878; }

/* Superficies traslúcidas pensadas para fondo claro (rgba(255,255,255,.x))
   pasan a una superficie oscura elevada; los bordes/separadores tenues en
   tinta oscura (rgba(44,36,32,.x)) pasan a tenues en claro, si no,
   desaparecen sobre el fondo oscuro. */
:root[data-theme="dark"] .pricing-card,
:root[data-theme="dark"] .mc4wp-form input[type="email"],
:root[data-theme="dark"] .contact_form_wrapper input[type="text"],
:root[data-theme="dark"] .contact_form_wrapper textarea {
  background: rgba(255,255,255,.06);
}
/* Las seis tarjetas de tarifas mantienen su pastel sólido también en modo
   oscuro (mismo criterio que .pdc-serie-card en la home, sin variante
   propia por tema) — ya no hace falta redeclarar cada modificador aquí. */
:root[data-theme="dark"] .contact_form_wrapper input[type="text"],
:root[data-theme="dark"] .contact_form_wrapper textarea {
  border-color: rgba(255,255,255,.18);
}
:root[data-theme="dark"] .mc4wp-form input[type="email"] {
  border-color: rgba(122,175,212,.4);
}
:root[data-theme="dark"] .portfolio_wall_filters .separator { color: rgba(255,255,255,.25); }
:root[data-theme="dark"] .post-teaser { border-bottom-color: rgba(255,255,255,.1); }
:root[data-theme="dark"] .top_bar { box-shadow: 0 1px 12px rgba(0,0,0,.35); }
@supports not ((backdrop-filter: blur(1px)) or (-webkit-backdrop-filter: blur(1px))) {
  :root[data-theme="dark"] .top_bar { background: rgba(var(--color-fondo-rgb), .92) !important; }
}

/* Secciones "testimonio" y otras franjas alternas llevan un fondo blanco
   fijo por inline style (rgba(255,255,255,x) / #fff) para separarse
   visualmente del crema del body — en oscuro sería un bloque claro
   incongruente encima del fondo oscuro. .pdc-surface-alt es la clase que
   añadimos a mano a esas franjas para poder overridearlas aquí. */
:root[data-theme="dark"] .testimonio,
:root[data-theme="dark"] .pdc-surface-alt {
  background-color: var(--color-blanco) !important;
}

/* .post_header h5/h3 a y h2/h5.widgettitle vienen del tema con color:#222
   fijo — en claro pasa desapercibido (#222 sobre crema tiene contraste de
   sobra), pero es justo esa coincidencia la que oculta el problema: son
   más específicos que nuestra regla general "h1,h2,h3,h4,h5,h6" (sección 3)
   y en oscuro quedan casi negro sobre casi negro. Título de entrada del
   blog y títulos de widget (sidebar del blog, "Sígueme"/"Categorías"...). */
:root[data-theme="dark"] .post_header h3 a,
:root[data-theme="dark"] .post_header h5 a,
:root[data-theme="dark"] h2.widgettitle,
:root[data-theme="dark"] h5.widgettitle {
  color: var(--color-texto) !important;
}

/* Mismo problema, otra regla del tema: todos los enlaces dentro de un
   sidebar (categorías, entradas populares del blog...) llevan color:#222
   fijo desde style.css/combined.css, con más especificidad que nuestra
   regla general "a". Invisible en claro, negro-sobre-negro en oscuro. */
:root[data-theme="dark"] #page_content_wrapper .inner .sidebar_wrapper a,
:root[data-theme="dark"] .page_content_wrapper .inner .sidebar_wrapper a {
  color: var(--color-texto) !important;
}

/* El h1 de entrada de blog (single.html) va envuelto en .post_caption, que
   en style.css tiene ".post_caption h1{color:#222}" — más específico que
   nuestro ".ppb_title" genérico, así que en las demás páginas (que no usan
   ese wrapper) el título ya salía bien pero aquí no. */
:root[data-theme="dark"] .post_caption h1 {
  color: var(--color-texto) !important;
}

/* La barra superior "hasbg" (scrolleada) usa --color-fondo, que ya es
   oscuro en este tema — el texto del menú (Sección 3) sigue igual de
   oscuro por diseño, así que sobre el nuevo --color-fondo oscuro perdería
   contraste. En modo oscuro el menú pasa a texto claro. */
:root[data-theme="dark"] #main_menu.nav li a,
:root[data-theme="dark"] #footer_menu.footer_nav li a,
:root[data-theme="dark"] #menu_wrapper #nav_wrapper #menu_border_wrapper #main_menu.nav li a,
:root[data-theme="dark"] .logo_text,
:root[data-theme="dark"] #custom_logo .logo_text,
:root[data-theme="dark"] #custom_logo_transparent .logo_text {
  color: var(--color-texto) !important;
}
/* La regla anterior, por ser más específica que "#main_menu.nav li a:hover"
   (Sección 3), ganaba también en :hover — el menú nunca llegó a cambiar de
   color al pasar el cursor en modo oscuro, ni siquiera antes de este cambio
   de morado. Repetimos aquí el hover con :root[data-theme="dark"] delante
   para igualar la especificidad y que sí gane. */
:root[data-theme="dark"] #main_menu.nav li a:hover,
:root[data-theme="dark"] #main_menu.nav li.current-menu-item a,
:root[data-theme="dark"] #menu_wrapper #nav_wrapper #menu_border_wrapper #main_menu.nav li a:hover {
  color: var(--color-violeta) !important;
}
:root[data-theme="dark"] #mobile_nav_icon {
  border-color: var(--color-texto) !important;
}
:root[data-theme="dark"] #mobile_nav_icon span,
:root[data-theme="dark"] #mobile_nav_icon:before,
:root[data-theme="dark"] #mobile_nav_icon:after {
  background-color: var(--color-texto) !important;
}
/* El scrim de la Sección 22 es una base CLARA a propósito (el texto del
   menú es oscuro sobre foto). En modo oscuro el texto del menú pasa a
   claro, así que el scrim debe pasar a oscuro para seguir cumpliendo su
   función — mismo mecanismo, polaridad invertida. */
:root[data-theme="dark"] body::before {
  background: linear-gradient(
    rgba(20, 17, 15, var(--hero-fade-opacity, .75)) 0%,
    rgba(20, 17, 15, calc(var(--hero-fade-opacity, .75) * .47)) 60%,
    rgba(20, 17, 15, 0) 100%
  );
}

/* Menú lateral móvil (mobile_menu_wrapper): fondo blanco fijo por CSS del
   tema (background-color:#ffffff en style.css), independiente de nuestras
   variables — sin este bloque se quedaría blanco encima de una web oscura,
   que es justo lo que se veía antes de este ajuste. Los textos de dentro ya
   usan var(--color-texto)/var(--color-gris) (Secciones 3 y 21), así que al
   cambiar solo el fondo se adaptan solos. */
:root[data-theme="dark"] .mobile_menu_wrapper {
  background-color: var(--color-blanco) !important;
}
:root[data-theme="dark"] .mobile_menu_wrapper #searchform input[type="text"] {
  background: rgba(255,255,255,.06) !important;
  border-color: rgba(255,255,255,.18) !important;
}
:root[data-theme="dark"] .pdc-search-result {
  background: rgba(255,255,255,.05);
}
:root[data-theme="dark"] .pdc-search-result:hover {
  background: rgba(255,255,255,.1);
}

/* ── 24. TOGGLE DE MODO OSCURO Y SELECTOR DE IDIOMA (menú lateral) ────────
   Los iconos van en tinta/pastel de marca, mismo lenguaje visual que #toTop;
   su círculo de fondo propio los mantiene legibles tanto si el panel de
   detrás es blanco (claro) como si pasa a superficie oscura (Sección 23). */
.pdc-menu-toolbar {
  display: flex;
  align-items: center;
  gap: 10px;
  margin: 14px 0 4px;
}
.pdc-icon-btn {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 34px;
  height: 34px;
  border-radius: 50%;
  background: var(--pastel-celeste);
  border: 0;
  cursor: pointer;
  transition: background .2s ease, transform .2s ease, color .2s ease;
  color: var(--color-azul-cobalto);
  font-size: 15px;
  text-decoration: none;
  line-height: 1;
}
.pdc-icon-btn:hover {
  background: var(--pastel-m-celeste);
  transform: scale(1.08);
  color: var(--color-primario);
}
.pdc-lang-btn {
  font-size: 16px;
  background: var(--pastel-celeste);
}
.pdc-lang-btn.pdc-lang-current {
  background: var(--pastel-m-celeste);
  box-shadow: 0 0 0 2px var(--color-primario) inset;
}

/* ── 25. CHISPAS DE COLORES EN EL LOGO (transición grande→pequeño) ────────
   Al completar la transición de scroll (js/pdc-logo-sparkle.js observa la
   clase "pdc-scrolled" que ya pone el script de la cabecera) se inyectan
   unos puntos de color de marca que estallan desde el icono del logo y se
   disuelven. Puramente decorativo — pointer-events:none para no robar clics.
   position:fixed porque el JS las coloca con coordenadas de viewport
   (getBoundingClientRect del icono), no relativas a un contenedor. */
.pdc-logo-spark {
  position: fixed;
  width: 11px;
  height: 11px;
  display: block;
  pointer-events: none;
  transform: translate(-50%, -50%);
  animation: pdc-spark-burst .75s cubic-bezier(.2,.7,.3,1) forwards;
  z-index: 10000;
  filter: drop-shadow(0 0 3px currentColor);
}
/* El <svg> es "inline" por defecto: dentro de un span se alinea a la línea
   base y deja el hueco típico bajo imágenes inline, desplazando el corazón
   hacia abajo respecto al centro real del span (y por tanto del logo).
   display:block lo elimina y centra el corazón con precisión. */
.pdc-logo-spark svg {
  display: block;
  width: 100%;
  height: 100%;
}
@keyframes pdc-spark-burst {
  0% {
    transform: translate(-50%, -50%) scale(.4);
    opacity: 1;
  }
  30% {
    transform: translate(-50%, -50%) scale(1.4);
    opacity: 1;
  }
  100% {
    transform: translate(calc(-50% + var(--spark-x)), calc(-50% + var(--spark-y))) scale(0);
    opacity: 0;
  }
}

/* ── 26. FRANJA CON FOTO Y EFECTO PARALLAX (contacto.html) ────────────────
   Contacto era la única página sin ninguna imagen — una franja no muy alta
   entre la cabecera y "¿Por qué escribir ahora?", con una foto de fondo que
   se desplaza sutilmente al hacer scroll (js/pdc-parallax.js ajusta
   background-position; no usamos background-attachment:fixed porque no
   funciona bien en Safari/iOS). */
.pdc-parallax {
  position: relative;
  height: 240px;
  background-size: cover;
  background-position: center 50%;
  background-repeat: no-repeat;
}
@media (max-width: 700px) {
  .pdc-parallax { height: 170px; }
}

/* ── 27. BIO DE AUTOR EN ENTRADAS DE BLOG ─────────────────────────────────
   El tema centra la foto y el texto uno debajo del otro
   (#about_the_author .gravatar{margin:auto} + .author_detail{text-align:
   center;width:75%;margin:auto}) — se ve descuadrado en una columna ancha.
   Foto a la izquierda, nombre/bio a la derecha, en línea. */
#about_the_author {
  display: flex;
  align-items: center;
  gap: 20px;
}
#about_the_author .gravatar {
  float: none !important;
  margin: 0 !important;
  flex: 0 0 auto;
}
#about_the_author .author_detail {
  text-align: left !important;
  width: auto !important;
  margin: 0 !important;
}

/* ── 28. HERO ESTÁTICO (sustituye a Revolution Slider) ────────────────────
   Antes: carrusel de 2 diapositivas con motor jQuery propio (~292 KB de JS
   + ~40 KB de CSS de skin, ver informe de rendimiento) para mostrar
   siempre el mismo mensaje. Ahora: una <section class="hero"> con una
   imagen de fondo real (con srcset/sizes, precargada en el <head> con
   fetchpriority="high") y tres líneas de texto real superpuestas — antes
   eran capas del slider que nacían con opacity:0 y las revelaba el motor
   JS tras cargar; ahora son HTML normal, se pintan con el primer render,
   sin esperar a que arranque ningún script. Los tamaños/pesos/familias
   replican exactamente las tres capas originales (Cormorant 600 40px /
   Cormorant 500 itálica 26px / Raleway 16px) — cambio de motor, no de
   diseño. En vez del sistema de "voffset" por breakpoint del slider, la
   escala en pantallas estrechas se resuelve con clamp() (fluida, sin
   medias query por tramos) para que el titular no desborde en móvil. */
.hero {
  position: relative;
  overflow: hidden;
  height: 80vh;
  min-height: 420px;
  max-height: 820px;
}
.hero-bg {
  position: absolute;
  inset: 0;
  width: 100%;
  height: 100%;
  object-fit: cover;
  object-position: center;
  z-index: 0;
}
.hero-scrim {
  position: absolute;
  bottom: 0; left: 0; right: 0;
  z-index: 2;
  background: linear-gradient(to bottom, rgba(0,0,0,0) 0%, rgba(0,0,0,0.55) 40%, rgba(0,0,0,0.75) 100%);
  padding: 48px 32px 40px;
  display: flex;
  flex-direction: column;
  align-items: center;
  justify-content: flex-end;
  text-align: center;
  color: #fff;
}
@media (max-width: 767px) {
  .hero-scrim { padding: 32px 20px 28px; }
}
.hero-eyebrow {
  font-family: var(--fuente-display);
  font-weight: 600;
  font-size: clamp(26px, 6.2vw, 40px);
  line-height: 1.25;
  margin: 0 0 6px;
  text-transform: uppercase;
  color: #fff;
}
.hero-subtitle {
  font-family: var(--fuente-display);
  font-weight: 500;
  font-style: italic;
  font-size: clamp(17px, 4vw, 26px);
  line-height: 1.25;
  margin: 0 0 10px;
}
.hero-tagline {
  font-family: var(--fuente-ui);
  font-weight: 400;
  font-size: clamp(13px, 2.8vw, 16px);
  line-height: 1.4;
  margin: 0;
  text-shadow: 0 1px 4px rgba(0,0,0,0.2);
}

/* ── 29. TIRA DE COLOR DECORATIVA AL FINAL DEL FOOTER ─────────────────────
   Cierre visual puramente decorativo, tipo carta de color de imprenta, con
   los mismos tonos pastel/pastel-m de la Sección 1 — al ser variables, se
   adapta solo en modo oscuro igual que el resto del sitio, sin reglas
   adicionales. */
.pdc-color-strip {
  /* #footer_menu y #copyright son float:left al 100% de ancho en móvil
     (responsive.css del tema); sin este clear, la tira -no flotada- intenta
     colocarse junto a ellos en vez de debajo, se queda comprimida a 0px de
     ancho (por eso "desaparecían" los iconos) y el flex-wrap resultante
     apila cada punto en su propia fila, generando un hueco vertical enorme. */
  clear: both;
  display: flex;
  justify-content: center;
  align-items: center;
  flex-wrap: wrap;
  gap: 8px;
  margin: 24px 0 4px;
}
.pdc-color-strip span {
  width: 20px;
  height: 20px;
  /* Mismo blob orgánico que el resto de botones de marca, en vez de círculo
     perfecto (Secciones 11-12 y 16). */
  border-radius: 30% 70% 70% 30% / 30% 30% 70% 70%;
  display: inline-block;
}
.pdc-color-strip span:nth-child(even) {
  border-radius: 70% 30% 30% 70% / 70% 70% 30% 30%;
}
@media (max-width: 700px) {
  .pdc-color-strip span { width: 16px; height: 16px; }
}

/* ── 30. BANNER DE CONSENTIMIENTO DE COOKIES (Google Analytics) ───────────
   Blob orgánico, mismo lenguaje que los botones flotantes de marca
   (Secciones 11-12) pero a escala de tarjeta en vez de icono — esquina
   opuesta al WhatsApp/volver arriba para no solaparse. Lo inyecta
   js/pdc-cookie-consent.js solo si no hay una decisión guardada; al
   aceptar activa Google Analytics (ver <script> en <head> de cada
   página), al rechazar no se carga nunca. */
.pdc-cookie-banner {
  position: fixed;
  left: 1.25rem;
  bottom: 1.25rem;
  z-index: 10000;
  max-width: 320px;
  background: var(--pastel-celeste);
  border-radius: 30px 60px 30px 60px / 60px 30px 60px 30px;
  padding: 20px 24px;
  box-shadow: 0 6px 20px rgba(0,0,0,.15);
  font-family: var(--fuente-ui);
}
.pdc-cookie-banner p {
  margin: 0 0 14px;
  font-size: 13px;
  line-height: 1.5;
  color: var(--color-texto);
}
.pdc-cookie-banner p a {
  color: var(--color-azul-cobalto);
  text-decoration: underline;
}
.pdc-cookie-buttons {
  display: flex;
  gap: 10px;
}
.pdc-cookie-btn {
  border: none;
  cursor: pointer;
  font-family: var(--fuente-ui);
  font-weight: 600;
  font-size: 12px;
  letter-spacing: .04em;
  text-transform: uppercase;
  padding: 8px 16px;
  border-radius: 20px 8px 20px 8px;
  transition: transform .2s ease, background .2s ease, box-shadow .2s ease, color .2s ease;
}
.pdc-cookie-btn:hover { transform: scale(1.05); }
.pdc-cookie-btn--accept {
  background: var(--color-primario);
  color: #fff;
}
.pdc-cookie-btn--accept:hover { background: var(--color-azul-cobalto); }
.pdc-cookie-btn--reject {
  background: transparent;
  color: var(--color-gris);
  box-shadow: 0 0 0 1px var(--color-gris) inset;
}
.pdc-cookie-btn--reject:hover {
  color: var(--color-texto);
  box-shadow: 0 0 0 1px var(--color-texto) inset;
}
@media (max-width: 600px) {
  .pdc-cookie-banner { left: .75rem; right: .75rem; bottom: .75rem; max-width: none; }
}

/* ── 31. RESERVA DE ESPACIO PARA LAS REJILLAS DE PORTFOLIO (CLS) ─────────────
   La plantilla monta las rejillas de portfolio (portada Y /portfolio) con un
   script tipo isotope: cada item pasa a position:absolute y el contenedor
   ".portfolio_filter_wrapper" nace con height:0 (combined.css) hasta que el
   script termina de medir las imágenes y le fija un alto real por inline
   style. Si esas imágenes van con loading="lazy" (ver A5/R2 del informe de
   rendimiento), el script puede quedarse esperando indefinidamente a que
   carguen las que están fuera de pantalla — el motivo real por el que las
   rejillas de portfolio NO llevan lazy (a diferencia del resto del sitio):
   con position:absolute no hay "primera fila visible, resto lazy" posible,
   el motor necesita medir TODAS las imágenes para calcular la rejilla
   completa de una vez. No se toca el HTML/JS de la plantilla — solo se
   reserva el hueco desde aquí con min-height (compatible con el height
   inline que pone el script: nunca reduce el resultado final, solo evita
   que el hueco empiece en 0). Valores medidos con el layout real en varios
   anchos de viewport, con fórmula continua en vw en móvil (una sola
   columna, ajuste lineal, error de 1-2px) para no reservar de más en los
   anchos estrechos — igual que se hizo la primera vez para portada. En
   escritorio (≥768px) el contenedor tiene max-width, así que el alto deja
   de crecer de forma lineal por encima de ~1366px: se usa un valor fijo
   que cubre el máximo medido a 1920px, con un resto de shift pequeño y
   aceptable por encima de eso. */
body.home .portfolio_filter_wrapper {
  min-height: 1250px; /* 7 items: cubre hasta 1920px con margen */
}
@media (max-width: 767px) {
  body.home .portfolio_filter_wrapper { min-height: calc(777vw - 450px); }
}

/* /portfolio (12 elementos, más alto que la portada) — antes sin proteger,
   ver R2 del informe de rendimiento. */
body.page-portfolio .portfolio_filter_wrapper {
  min-height: 2350px;
}
@media (max-width: 767px) {
  body.page-portfolio .portfolio_filter_wrapper { min-height: calc(1595vw - 935px); }
}

/* Último post — home */
.pdc-ultimo-post {
  margin-bottom: 16px;
}
.pdc-ultimo-post__label {
  font-family: var(--fuente-ui);
  font-size: 11px;
  font-weight: 700;
  letter-spacing: .08em;
  text-transform: uppercase;
  color: var(--color-primario);
  margin-bottom: 12px;
}
.pdc-ultimo-post__inner {
  display: flex;
  gap: 24px;
  align-items: flex-start;
  text-decoration: none;
  color: var(--color-texto);
  background: var(--pastel-celeste);
  border-radius: 12px;
  padding: 20px;
  transition: background .2s ease;
}
.pdc-ultimo-post__inner:hover {
  background: var(--pastel-azul-medio);
}
.pdc-ultimo-post__inner img {
  width: 120px;
  height: 120px;
  object-fit: cover;
  border-radius: 8px;
  flex-shrink: 0;
}
.pdc-ultimo-post__texto { flex: 1; }
.pdc-ultimo-post__titulo {
  font-family: var(--fuente-display) !important;
  font-size: 1.4rem !important;
  font-weight: 600 !important;
  margin: 0 0 8px !important;
  color: var(--color-texto) !important;
}
.pdc-ultimo-post__texto p {
  font-size: 14px;
  color: var(--color-gris);
  margin: 0 0 10px;
  line-height: 1.6;
}
@media (max-width: 600px) {
  .pdc-ultimo-post__inner { flex-direction: column; }
  .pdc-ultimo-post__inner img { width: 100%; height: 180px; }
}

/* Series de encargos — home */
.pdc-series-grid {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(280px, 1fr));
  gap: 24px;
  text-align: left;
  margin-top: 10px;
}
.pdc-serie-card {
  display: block;
  padding: 28px 24px;
  border-radius: 28px 8px 28px 8px;
  text-decoration: none;
  color: var(--color-texto);
  transition: transform .25s ease, box-shadow .25s ease;
}
.pdc-serie-card:hover {
  transform: translateY(-4px) rotate(-0.5deg);
  box-shadow: 0 10px 24px rgba(44,36,32,.12);
}
.pdc-series-grid a.pdc-serie-card:nth-child(6n+1) { background: var(--pastel-celeste); }
.pdc-series-grid a.pdc-serie-card:nth-child(6n+2) { background: var(--pastel-naranja); }
.pdc-series-grid a.pdc-serie-card:nth-child(6n+3) { background: var(--pastel-magenta); }
.pdc-series-grid a.pdc-serie-card:nth-child(6n+4) { background: var(--pastel-amarillo); }
.pdc-series-grid a.pdc-serie-card:nth-child(6n+5) { background: var(--pastel-violeta); }
.pdc-series-grid a.pdc-serie-card:nth-child(6n+6) { background: var(--pastel-azul-medio); }
.pdc-serie-card h3 {
  font-family: var(--fuente-display);
  font-size: 1.5rem;
  margin: 0 0 10px;
}
.pdc-serie-card p {
  font-size: 14px;
  color: var(--color-gris);
  line-height: 1.6;
  margin: 0 0 14px;
}
.pdc-serie-precio {
  display: inline-block;
  font-family: var(--fuente-ui);
  font-weight: 700;
  text-transform: uppercase;
  font-size: 12px;
  letter-spacing: .04em;
  color: var(--color-azul-cobalto);
}
.pdc-series-nota {
  margin-top: 32px;
  color: var(--color-gris);
  font-size: 14px;
}
@media (max-width: 600px) {
  .pdc-series-grid { grid-template-columns: 1fr; }
}

/* Título de obra en el grid de portfolio de la home — antes era <h5>
   (heading huérfano de jerarquía), ahora <div class="pdc-obra-titulo">.
   Replica exactamente los estilos que combined.css/responsive.css aplicaban
   a ".portfolio_title h5" en el contexto three_cols/one_third.gallery3 que
   usa esta rejilla, para que el aspecto no cambie. */
.pdc-obra-titulo {
  font-family: var(--fuente-display);
  font-weight: 500;
  font-size: 20px;
  color: #fff;
  margin: 0;
}
@media only screen and (min-width: 768px) and (max-width: 960px) {
  .pdc-obra-titulo { font-size: 16px; }
}
@media only screen and (max-width: 767px) {
  .pdc-obra-titulo { font-size: 22px !important; }
}

/* Footer: h2.widgettitle → h3.widgettitle (jerarquía de encabezados, Sprint
   SEO home). Color/tamaño/peso ya los fija ".footer_bar .widgettitle" por
   clase (no depende de la etiqueta); esto replica lo que combined.css
   aplicaba solo a la etiqueta h2 para que el aspecto no cambie. */
#footer .sidebar_widget li h3.widgettitle {
  display: block;
  text-align: left;
  letter-spacing: 2px;
  text-transform: uppercase;
  border: 0;
  padding: 0;
  margin-bottom: 20px;
}

/* Aviso de fallo de envío — formularios de contacto/newsletter (js/pdc-form-guard.js) */
.pdc-form-error {
  margin-top: 14px;
  padding: 12px 16px;
  border-radius: 8px 20px 8px 20px;
  background: var(--pastel-m-naranja);
  color: var(--color-texto);
  font-size: 13px;
  line-height: 1.6;
}
.pdc-form-error a {
  color: var(--color-azul-prusiano);
  font-weight: 700;
  text-decoration: underline;
}
