/* MICHEMICAL DATA LAB — HOME V2 — PROPUESTA F
   Basada en mediciones EXACTAS de GenOS (C:\GENOS-AUDIT-EXACT\), no en estimaciones visuales.
   Archivo independiente: no reutiliza clases de preview-e.css a propósito (E fue descartado). */

@font-face {
  font-family: "TikTok Sans Preview";
  src: url("./assets/fonts/TikTokSans36pt-Bold.woff2") format("woff2");
  font-weight: 700; font-style: normal; font-display: swap;
}
@font-face {
  font-family: "Geist Mono Preview";
  src: url("./assets/fonts/GeistMono-Regular.woff2") format("woff2");
  font-weight: 400; font-style: normal; font-display: swap;
}
@font-face {
  font-family: "Geist Mono Preview";
  src: url("./assets/fonts/GeistMono-Medium.woff2") format("woff2");
  font-weight: 500; font-style: normal; font-display: swap;
}
@font-face {
  font-family: "Departure Mono Preview";
  src: url("./assets/fonts/DepartureMono-Regular.woff2") format("woff2");
  font-weight: 400; font-style: normal; font-display: swap;
}

:root {
  --ink: #0a0e14;
  --muted: rgba(10,14,20,.62);
  --accent: #2f80ed;
  --accent-2: #00a6d6;
  --yellow: #ffc857;
  --line: rgba(10,14,20,.10);

  --font-display: "TikTok Sans Preview", "Arial Black", sans-serif;
  --font-mono: "Geist Mono Preview", ui-monospace, monospace;
  --font-label: "Departure Mono Preview", ui-monospace, monospace;
}

* { box-sizing: border-box; }
html, body { margin: 0; padding: 0; }
body.pf {
  min-height: 100vh;
  font-family: var(--font-mono);
  color: var(--ink);
  overflow-x: hidden;
  background: linear-gradient(160deg, #cfe8f8 0%, #e5f4fc 55%, #f1f9ff 100%);
  background-attachment: fixed;
}

/* ============ GRID DE FONDO — patrón EXACTO medido de GenOS (4 verticales / 2 horizontales / cruces) ============ */
#pf-grid {
  position: fixed; inset: 0; z-index: 1;
  pointer-events: none;
  mix-blend-mode: difference;
}
#pf-grid path.pf-lines { stroke: rgba(255,255,255,.10); stroke-width: 1; fill: none; }
#pf-grid path.pf-cross { stroke: rgba(255,255,255,.25); stroke-width: 1; fill: none; }

/* ============ GLOW QUE SIGUE AL MOUSE — único efecto de mouse (sin parallax grupal) ============ */
#pf-glow {
  position: fixed; top: 0; left: 0; z-index: 2;
  width: 560px; height: 560px;
  margin-left: -280px; margin-top: -280px;
  border-radius: 50%;
  background: radial-gradient(circle, rgba(47,128,237,.14) 0%, rgba(0,166,214,.06) 45%, transparent 72%);
  pointer-events: none;
  will-change: transform;
}

/* ============ CANVAS DE STICKERS (Canvas2D, sin Three.js/WebGL) ============
   Auditoría C:\GENOS-AUDIT-EXACT\STICKERS-CLIP-SIZE-EXACT-AUDIT.md: en GenOS, #bg-canvas
   (las 16 instancias que caen) vive en z-index:1 — POR DEBAJO de #about-s (z:2). No hay
   fade ni límite físico: los objetos SIGUEN cayendo detrás de Story, simplemente el panel
   opaco de la sección (mayor z-index, bloque normal del documento) los tapa al pasar por
   encima — confirmado experimentalmente haciendo transparente about-s (los sprites
   reaparecieron) y revirtiendo. z-index:3 aquí era la causa raíz: mayor que Story (2) y que
   Featured (auto/0), así que NINGUNA de las dos podía taparlo nunca sin importar el scroll.
   Bajado a -1 (por debajo también de #pf-grid:1, replicando bg-canvas:1 < grid:20 de GenOS,
   donde el grid TAMBIÉN pinta por encima de los objetos que caen) para que los fondos
   opacos ya existentes de Story (::before) y Featured (::before) puedan ocluirlo, igual
   que about-s ocluye a bg-canvas. La física/velocidad/tamaño no cambian — solo el orden
   de pintura. */
#pf-stickers {
  position: fixed; inset: 0; z-index: -1;
  pointer-events: none;
  transition: opacity .3s ease;
}

/* ============ ESTELA DE FLUIDO DEL MOUSE (WebGL2, propio — ver home-v2-fluid.js) ============
   Auditoría C:\GENOS-AUDIT-EXACT\OUR-STORY-EXACT-AUDIT.md (sección 7-9): en GenOS el fluid
   vive en z-index:9997 — POR ENCIMA del header (50), del grid (20) y de TODO el contenido
   (secciones deliberadamente en z-index bajo, ~2). Confirmado visualmente: un splat se pinta
   ENCIMA del propio header. La versión anterior de este comentario decía lo opuesto ("va
   detrás de... para que nunca tape header/texto") — eso era la arquitectura INVERSA a GenOS,
   ya corregida aquí. pointer-events:none se conserva, así que el header sigue siendo
   clickeable aunque el fluid se pinte visualmente por encima. */
#pf-fluid {
  /* width/height:100% resolvía contra un contenedor afectado por el scrollbar vertical
     (1425px medidos en vez de 1440px) — comparación A/B confirmó ~1.04% de compresión
     horizontal del trazo. 100vw/100vh se define desde el initial containing block, no
     desde el ancho ya restado por el scrollbar. */
  position: fixed; inset: 0; z-index: 9997;
  width: 100vw; height: 100vh;
  pointer-events: none;
}

/* ============ HEADER FLOTANTE — geometría EXACTA medida de GenOS ============ */
.pf-header { position: fixed; top: 0; left: 0; right: 0; z-index: 50; pointer-events: none; }
.pf-bar {
  pointer-events: auto;
  margin: 12px 56px;
  padding: 22px 40px;
  border-radius: 16px;
  border: 1px solid rgba(10,14,20,.08);
  background: rgba(241,249,255,.58);
  backdrop-filter: blur(20px) saturate(1.7);
  box-shadow: none;
  display: flex; align-items: center; justify-content: space-between; gap: 24px;
  transition: background .4s, border-color .4s;
}
.pf-brand { display: flex; align-items: center; gap: 10px; text-decoration: none; color: var(--ink); }
.pf-mark { font-family: var(--font-display); font-weight: 700; font-size: 19px; letter-spacing: -.02em; }
.pf-brandname { font-family: var(--font-label); font-size: 11px; letter-spacing: .07em; text-transform: uppercase; opacity: .78; }
.pf-nav { display: flex; align-items: center; gap: 8px; list-style: none; margin: 0; padding: 0; }
.pf-nav a {
  position: relative;
  font-family: var(--font-label); font-size: 15px; font-weight: 400; letter-spacing: 1.05px; text-transform: uppercase;
  color: var(--ink); text-decoration: none; opacity: .96;
  /* Departure Mono solo trae peso 400 en el .woff2 instalado: el synthetic-bold del
     navegador es débil en este glifo, así que reforzamos el trazo para que SÍ se lea marcado */
  -webkit-text-stroke: .6px currentColor;
  padding: 7px 14px; border-radius: 999px; transition: opacity .18s ease;
}
.pf-nav a:hover { opacity: 1; }
/* Recuadro de hover — geometría y timing medidos en GenOS (.nb::before / .nb:hover::before):
   pseudo-elemento fuera del padding box, no cambia el tamaño del link, solo el borde anima. */
.pf-nav a::before {
  content: "";
  position: absolute;
  inset: -0.15rem;
  border: 2px dotted transparent;
  border-radius: 2px;
  transition: border-color .2s;
  pointer-events: none;
}
.pf-nav a:hover::before { border-color: rgba(54,54,48,.32); }
.pf-actions { display: flex; align-items: center; gap: 12px; }
.pf-cart {
  font-family: var(--font-label); font-size: 13px; letter-spacing: .04em;
  border: 1px solid var(--line); border-radius: 999px; padding: 8px 14px;
  display: flex; align-items: center; gap: 6px; color: var(--ink); text-decoration: none; opacity: .9;
}
.pf-toggle { display: none; font-family: var(--font-label); font-size: 18px; background: none; border: none; color: var(--ink); cursor: pointer; }

/* ============ HERO — CSS Grid de 12 columnas, igual método que GenOS ============ */
.pf-hero {
  position: relative; z-index: 5;
  display: grid;
  grid-template-columns: repeat(12, 1fr);
  grid-template-rows: auto 1fr;
  /* padding-bottom: auditoría C:\GENOS-AUDIT-EXACT\FALL-LIMIT-SPACING-EXACT-AUDIT.md midió
     "último contenido del hero (.pf-scroll-hint) → bottom del hero" = 22.89px en GenOS vs
     90px en Michemical (+67.11px de exceso, el ÚNICO espacio realmente sobrante detectado en
     todo el hero/Story). La causa era literalmente este valor: .pf-scroll-hint es el último
     elemento del grid, así que el padding-bottom del propio .pf-hero ES ese espacio final.
     Corregido al valor medido exacto, sin redondear a 20/24/25/30. */
  padding: 152px 56px 22.89px;
}

/* fila superior: 3 bloques por grid-column span, SIN fondo, SIN borde, SIN sombra */
.pf-meta-left  { grid-column: 1 / 4;  grid-row: 1; }
.pf-meta-center{ grid-column: 4 / 8;  grid-row: 1; }
.pf-meta-right { grid-column: 8 / 13; grid-row: 1; }

.pf-meta-left {
  font-family: var(--font-display); font-weight: 500; color: var(--ink);
  font-size: clamp(19px, 2.4vw, 30px); line-height: 1.25; margin: 0;
}
.pf-meta-center {
  /* Auditoría GENOS-AUDIT-EXACT/TYPOGRAPHY-COLOR-COMPARISON.md: GenOS usa rgb(0,0,0) opaco en
     el bloque equivalente (span.h-tag) — el --muted (alfa .62) aplicado aquí era la causa
     CRÍTICA del aspecto "lavado". Se usa --ink (mismo tono ya opaco de SOFTWARE/nav). */
  font-family: var(--font-mono); font-weight: 500; color: var(--ink);
  font-size: clamp(14px, 1.4vw, 16.8px); line-height: 1.55; margin: 0;
}
.pf-meta-right {
  /* weight 500 (no 400): color ya era idéntico a .pf-meta-center (var(--ink) en ambos, sin
     opacity/blend de por medio) — la diferencia de tonalidad restante era el peso de fuente
     (Regular vs Medium, archivos reales vía @font-face, no synthetic-bold). Se iguala a 500
     para que ambos bloques usen el mismo archivo de fuente y el mismo grosor de trazo. */
  font-family: var(--font-mono); font-weight: 500; color: var(--ink);
  font-size: clamp(13px, 1.2vw, 15.2px); line-height: 1.7; margin: 0;
}

/* aire medido entre el bloque superior y el H1: ~240px a 1440px, proporcional en otros anchos */
.pf-h1-wrap {
  grid-column: 1 / 13; grid-row: 2;
  margin-top: clamp(80px, 8vw, 160px);
  align-self: start;
}
.pf-h1 {
  font-family: var(--font-display); font-weight: 700;
  font-size: clamp(2.5rem, 6vw, 5.5rem);
  line-height: .95; letter-spacing: -.025em; text-transform: uppercase;
  margin: 0; color: var(--ink);
  -webkit-text-stroke: .5px var(--ink);
}
.pf-h1 span { display: block; }

.pf-lede {
  grid-column: 1 / 8; grid-row: 3;
  /* Auditoría: color --muted (alfa .62) + font-weight 400 (sin declarar, caía al default del
     navegador) eran MÁS liviano que su comparable más cercano en ambas páginas (pf-meta-center/
     h-tag, weight 500) — efecto compuesto. Se corrige a --ink opaco + weight 500. */
  font-family: var(--font-mono); font-weight: 500; font-size: 16px; line-height: 1.5; color: var(--ink);
  max-width: 46ch; margin: 26px 0 0;
}
.pf-ctas { grid-column: 1 / 8; grid-row: 4; display: flex; gap: 14px; margin-top: 28px; flex-wrap: wrap; }
.pf-btn {
  font-family: var(--font-label); font-size: 13px; letter-spacing: .08em; text-transform: uppercase;
  padding: 14px 22px; border-radius: 999px; text-decoration: none; display: inline-flex; align-items: center; gap: 8px;
  border: 1px solid transparent; transition: transform .15s ease;
}
.pf-btn:hover { transform: translateY(-2px); }
/* Auditoría C:\GENOS-AUDIT-EXACT\BUTTONS-SOCIAL-EXACT-AUDIT.md: CTA verde de marca de GenOS
   (.bento-btn) aplicado aquí — background/hover/radius/color/transition EXACTOS medidos.
   NO se tocan width/height/padding/font-family/font-size/font-weight de este botón: son
   geometría/tipografía propia del componente Michemical (radius:999px→6px es un cambio de
   estilo visual, no de dimensión, así que sí se copia). font-weight NO se sube a 700 (el
   valor de GenOS) porque "Departure Mono Preview" solo tiene el archivo @font-face de peso
   400 cargado — forzar 700 aquí produciría negrita sintética débil, el mismo problema ya
   evitado deliberadamente en el nav en una etapa anterior. .pf-btn.secondary ("HABLEMOS")
   NO forma parte del grupo azul auditado — sigue exactamente igual. */
.pf-btn.primary {
  background: rgb(192, 254, 4); color: rgb(0, 0, 0); border-radius: 6px;
  transition: background .2s ease, transform .15s ease;
}
.pf-btn.primary:hover { background: rgb(170, 238, 0); transform: translateY(-1px); }
/* Auditoría BUTTONS-CATEGORIES-OFFER-AUDIT.md: única diferencia de FORMA real medida entre
   HABLEMOS y EXPLORAR CATÁLOGO era el border-radius (altura/padding/tipografía/flex ya eran
   idénticos) — se iguala a 6px. Color/fondo/borde de HABLEMOS quedan sin tocar a propósito
   (el pedido fue "misma forma", no "mismo color"). */
.pf-btn.secondary { background: transparent; color: var(--ink); border-color: var(--line); border-radius: 6px; }

.pf-scroll-hint {
  grid-column: 1/13; grid-row: 5;
  margin-top: 60px;
  font-family: var(--font-label); font-size: 11px; letter-spacing: .1em; text-transform: uppercase;
  color: var(--muted); text-align: center;
}

/* ============ SEGUNDA SECCIÓN — "NUESTRA HISTORIA" (post-hero) ============
   Auditoría C:\GENOS-AUDIT-EXACT\OUR-STORY-EXACT-AUDIT.md — valores medidos de #about-s de
   GenOS (no estimados): padding 72px 56px (sección) + 32px 8px (wrapper interno, el mismo
   doble padding real de GenOS: 4.5rem/1rem base + 2rem/0.5rem de .ab-content), sin
   height/min-height (altura por contenido, igual que GenOS: 657.39px en GenOS es un
   RESULTADO, no un valor fijado).

   STACKING (corregido — auditoría STICKERS-CLIP-SIZE-EXACT-AUDIT.md): la versión anterior
   ponía z-index:2 y el fondo #fbfaf4 en la SECCIÓN misma, como un solo bloque — eso crea su
   propio stacking context, y con #pf-grid fijo en z:1 (nunca se toca, ver #pf-grid), ese
   bloque único quedaba SIEMPRE por encima del grid dentro de Story, ocultándolo, sin
   importar el valor. Igual que se hizo con .pf-featured-section: la sección ya NO tiene
   z-index propio (position:relative sigue sirviendo como containing block del ::before,
   pero sin z-index no crea stacking context) — el fondo vive en ::before (z:0) y el
   contenido en .pf-story-inner (z:4), cada uno participando por separado en el stacking
   context raíz junto a #pf-grid(1) y #pf-stickers(-1, ver ese selector). Resultado:
   stickers(-1) < fondo Story(0) < grid(1) < contenido Story(4) — el fondo ocluye los
   stickers que caen detrás, PERO queda por debajo del grid, que sigue visible encima,
   exactamente como #about-s(2) oculta a #bg-canvas(1) en GenOS mientras su grid(20) sigue
   por encima de ambos. */
.pf-story {
  position: relative;
  padding: 72px 56px;
}
.pf-story::before {
  content: "";
  position: absolute; inset: 0; z-index: 0;
  background: #fbfaf4;
  pointer-events: none;
}
.pf-story-inner {
  position: relative; z-index: 4; /* por encima de #pf-grid(1)/#pf-stickers(-1); por debajo de #pf-fluid(9997) y el header(50) */
  display: flex; flex-direction: column; gap: 24px;
  padding: 32px 8px;
}
.pf-story-title {
  font-family: var(--font-display); font-size: 25.6px; font-weight: 800;
  line-height: normal; letter-spacing: -.64px; color: var(--ink); margin: 0;
}
.pf-story-title::after {
  content: "";
  display: block;
  width: 40px; height: 3px;
  background: rgb(192, 254, 4);
  margin-top: 6.4px; margin-bottom: 0;
}
.pf-story-body {
  font-family: var(--font-mono); font-size: 15px; font-weight: 500;
  line-height: 25.5px; letter-spacing: normal; color: var(--ink);
  max-width: 50%; margin: 0;
}
.pf-story-body strong { font-weight: 700; }

/* Auditoría BUTTONS-SOCIAL-EXACT-AUDIT.md: bloque social de "Our Story" (.ab-links > .ab-link
   > .social-ico en GenOS) — aquí colapsado a un solo nivel: el propio <a> ES la caja circular
   44×44 medida (.social-ico), sin replicar el wrapper rectangular exterior de GenOS (.ab-link,
   66×54px, borde/hover distinto) que el brief no pidió reproducir. gap:8px = el mismo valor
   medido para el bloque "about" de GenOS (el bloque "footer" usa 12px, no aplica aquí). */
.pf-social { display: flex; gap: 8px; }
.pf-social-ico {
  display: inline-flex; align-items: center; justify-content: center;
  width: 44px; height: 44px; border-radius: 50%;
  border: 1.5px solid rgba(192, 254, 4, .35);
  background: rgba(192, 254, 4, .03);
  box-shadow: rgba(192, 254, 4, .15) 0 0 6px 0;
  color: rgb(0, 0, 0);
  text-decoration: none;
  animation: iconFlash 2.4s ease-in-out infinite;
}
.pf-social-ico svg { width: 22px; height: 22px; display: block; }
.pf-social-ico:hover {
  border-color: rgb(192, 254, 4);
  transform: scale(1.18);
  background: rgba(192, 254, 4, .07);
}
@keyframes iconFlash {
  0%   { box-shadow: transparent 0 0 0 0; background: transparent; }
  40%  { box-shadow: rgba(192, 254, 4, .7) 0 0 14px 5px, rgba(91, 140, 255, .3) 0 0 28px 10px; background: rgba(192, 254, 4, .08); }
  70%  { box-shadow: rgba(160, 107, 255, .5) 0 0 10px 3px; }
  100% { box-shadow: transparent 0 0 0 0; background: transparent; }
}

/* ============ WHATSAPP FLOTANTE — GLOBAL, independiente del bloque social ============
   Auditoría FINAL-ALIGNMENT-ANIMATION-WHATSAPP-AUDIT.md Parte E: .wa-float real de GenOS —
   fixed, 58×58px, right/bottom:24px, radius:50%, padding:0, background:rgb(37,211,102),
   sin borde, z-index:9999, ícono 28×28px, box-shadow base rgba(37,211,102,.5) 0 4px 20px 0
   + animación waPulse propia (NO iconFlash — es otra animación, con otro keyframe y otro
   propósito). Visible en las 7 secciones probadas por GenOS sin excepción (fixed a nivel
   BODY, nunca se mueve/oculta/cambia). Color del glyph SVG interior: NO auditado
   explícitamente en el informe (solo tamaño 28×28px) — se usa blanco (convención universal
   del badge de WhatsApp, incluida su propia identidad de marca oficial), necesidad técnica
   mínima reportada, no un valor medido. */
.pf-wa-float {
  position: fixed; right: 24px; bottom: 24px; z-index: 9999;
  width: 58px; height: 58px; padding: 0; border-radius: 50%;
  display: flex; align-items: center; justify-content: center;
  background: rgb(37, 211, 102); border: none; color: #fff;
  box-shadow: rgba(37, 211, 102, .5) 0 4px 20px 0;
  animation: waPulse 2.5s ease-in-out infinite;
  transition: transform .2s, box-shadow .2s;
}
.pf-wa-float svg { width: 28px; height: 28px; display: block; }
.pf-wa-float:hover {
  transform: scale(1.12);
  box-shadow: rgba(37, 211, 102, .5) 0 4px 20px, rgba(37, 211, 102, .075) 0 0 0 10.54px;
}
@keyframes waPulse {
  0%, 100% { box-shadow: rgba(37, 211, 102, .5) 0 4px 20px, rgba(37, 211, 102, .3) 0 0 0 0; }
  60%      { box-shadow: rgba(37, 211, 102, .5) 0 4px 20px, rgba(37, 211, 102, 0) 0 0 0 14px; }
}

/* ============ BARRA TÉCNICA GLOBAL (.pf-techbar) ============
   Auditoría FINAL-BOTTOM-DECOR-METADATA-AUDIT.md Parte E/10/11: .hb real de GenOS —
   fixed (mismo z-index:50 que su <header>, del que es hijo), rect completo 0,828.2,1440×71.8
   a 1440×900 → padding:22.4px 56px (56px = mismo padding horizontal que .ft-bot del footer),
   display:flex;justify-content:space-between;align-items:center (NO es centrado absoluto:
   el bloque central queda donde space-between lo deja según el ancho de los 3 textos,
   confirmado en la auditoría — no se fuerza ningún centrado adicional). Tipografía
   compartida por los 3 bloques: tronica-mono→var(--font-label) (mismo mapeo ya establecido
   en todo el proyecto), 13.6px, weight 400, letter-spacing 0.408px, uppercase,
   rgba(54,54,48,.6)→var(--muted) (mismo mapeo de "gris secundario" ya establecido, en vez
   de copiar el rgba literal de GenOS). z-index:50 igual al header (mismo nivel auditado,
   sin mover ni rediseñar el header principal — este es un componente aislado, separado del
   nav). pointer-events:none: es contenido informativo, no interactivo (igual criterio que
   el propio <header> de GenOS, que también es pointer-events:none en su wrapper). */
.pf-techbar {
  position: fixed; left: 0; right: 0; bottom: 0; z-index: 50;
  display: flex; align-items: center; justify-content: space-between;
  padding: 22.4px 56px;
  pointer-events: none;
}
.pf-techbar span {
  font-family: var(--font-label); font-size: 13.6px; font-weight: 400;
  letter-spacing: .408px; text-transform: uppercase; color: var(--muted);
}
@media (max-width: 480px) {
  /* Auditoría Parte I: GenOS oculta el bloque IZQUIERDO (.hcp, vía clase "dn") a 390px de
     ancho, dejando reloj+coordenadas visibles. Mismo comportamiento conceptual aquí —
     breakpoint reutilizado del ya establecido en este archivo (480px), ya que la auditoría
     no documentó el valor exacto del media query de GenOS, solo el resultado observado a
     390px. */
  .pf-techbar-left { display: none; }
}

/* ============ TERCERA SECCIÓN — "LO MÁS PEDIDO" (post-hero) ============
   Auditoría C:\GENOS-AUDIT-EXACT\AFTER-HERO-SECTION-AUDIT.md: GenOS corta ABRUPTO de
   transparente/celeste a crema sólido exactamente al terminar el hero — sin gradiente,
   sin fade, sin animación de entrada. #pf-grid y #pf-fluid ya son fixed/inset:0, así que
   siguen apareciendo por encima de esta sección automáticamente, sin ningún cambio aquí.
   #featuredGrid/.product-card/.card-body/etc. usan el MISMO nombre de clase que
   producción (public\app.js::productCard()) a propósito, para que este markup sea
   portable sin rehacerlo — solo se re-estiliza la superficie, ver app.js (renderFeatured/productCard, reutilizado sin cambios). */
.pf-featured-section {
  /* SIN z-index propio a propósito: con z-index:auto (el default), position:relative NO
     crea un stacking context aquí, así que ::before (fondo, z:0) y .pf-featured-inner
     (contenido, z:4) participan CADA UNO por separado en el stacking context raíz —igual
     que #pf-grid (z:1)— en vez de quedar atrapados como una sola capa monolítica por
     encima de él (ese era el bug: z-index:5 + fondo opaco en el MISMO elemento ocultaba
     grid/fluid en toda esta sección). Nota (auditoría OUR-STORY-EXACT-AUDIT.md): desde que
     #pf-fluid subió a z:9997 (ver #pf-fluid), z:4 aquí ya NO está por encima del fluid —
     coincide con el propio GenOS, donde el fluid puede pintarse sobre CUALQUIER contenido,
     header incluido. */
  position: relative;
  padding: 120px 56px 140px;
}
.pf-featured-section::before {
  content: "";
  position: absolute; inset: 0; z-index: 0;
  background: #fbfaf4;
  pointer-events: none;
}
.pf-featured-inner {
  position: relative; z-index: 4; /* por encima de #pf-grid(1)/#pf-stickers(-1); por debajo de #pf-fluid(9997) y del header(50) */
}
/* Auditoría C:\GENOS-AUDIT-EXACT\SERVICES-HEADER-EXACT-AUDIT.md: reemplaza la cabecera
   anterior (eyebrow+H2 gigante+descripción, 414.59px de alto medido) por el componente
   EXACTO de GenOS para "Services" (div.wh > span.wh-t) — aquí "Servicios", texto propio de
   Michemical, misma estructura/medidas. .pf-featured-wh es block-level normal (sin grid):
   con box-sizing:border-box ya global, llena el 100% del ancho de contenido de la sección
   (1328px a 1440px de viewport = 1440-56-56, ya provisto por el padding existente de
   .pf-featured-section, sin tocarlo) — el border-bottom hereda ese mismo ancho de forma
   natural, sin necesidad de calcularlo ni de un valor fijo en px. padding-left/right:8px
   reproduce el mismo patrón "56px sección + 8px wrapper = 64px" ya usado en "Nuestra
   historia" para alinear el título con la primera línea vertical del grid (x=63.5). Altura
   proyectada: 120 (padding-top de sección, sin cambios) + 8+36+20+2+40 (componente .wh) ≈
   226px, frente a los 414.59px anteriores — más compacto, como GenOS. */
.pf-featured-wh {
  padding: 8px 8px 20px;
  margin-bottom: 40px;
  border-bottom: 2px solid #000;
}
.pf-featured-wh-title {
  font-family: var(--font-display); font-size: 28px; font-weight: 800;
  line-height: normal; letter-spacing: -.84px; color: var(--ink); text-transform: none;
  margin: 0;
}

.pf-featured-grid { display: grid; grid-template-columns: repeat(3, 1fr); gap: 24px; }

/* Re-skin de las mismas clases que renderFeatured()/productCard() generan en producción —
   estructura intacta, solo cambia tipografía/superficie al lenguaje editorial del hero. */
.pf-featured-grid .product-card {
  display: flex; flex-direction: column;
  background: #fff; border: 1px solid var(--line); border-radius: 18px; overflow: hidden;
}
.pf-featured-grid .product-media {
  position: relative; aspect-ratio: 16/10; background: #f1f0e9;
  display: flex; align-items: center; justify-content: center;
}
.pf-featured-grid .product-media img { width: 100%; height: 100%; object-fit: cover; display: block; }
.pf-featured-grid .product-media .fallback-icon {
  display: none;
  font-family: var(--font-label); font-size: 22px; letter-spacing: .04em; color: var(--muted);
}
.pf-featured-grid .product-media.empty .fallback-icon,
.pf-featured-grid .product-media.broken .fallback-icon { display: block; }
.pf-featured-grid .product-media.empty img,
.pf-featured-grid .product-media.broken img { display: none; }

.pf-featured-grid .card-body { flex: 1; display: flex; flex-direction: column; gap: 16px; padding: 22px 22px 24px; }
/* Auditoría CARDS-TEXT-OFFER-EXACT-AUDIT.md: GenOS JAMÁS colorea el texto de sus etiquetas
   equivalentes (.wc-badge) en verde — el verde ahí es solo el FONDO de una píldora, el texto
   siempre es negro puro. Se corrige color de texto verde → var(--ink) (mismo mapeo ya usado
   en toda la card para el "negro" de GenOS), sin tocar fondo/tamaño/peso/tipografía. */
.pf-featured-grid .badge.single {
  display: inline-block;
  font-family: var(--font-label); font-size: 11px; letter-spacing: .08em; text-transform: uppercase;
  color: var(--ink); margin-bottom: 10px;
}
.pf-featured-grid h3 {
  /* Auditoría: única diferencia real de título vs GenOS era font-weight (700 vs 500) — color
     base ya era prácticamente idéntico (rgb(0,0,0) GenOS vs var(--ink) Michemical). */
  font-family: var(--font-display); font-weight: 700; font-size: 19px; line-height: 1.2;
  color: var(--ink); margin: 0 0 8px;
}
.pf-featured-grid .card-text {
  /* Auditoría: mismo font-weight (400) que GenOS; la diferencia real era el alfa .62 del
     propio rgba() de --muted, NO una opacity CSS separada. Se pasa a var(--ink) sólido. */
  font-family: var(--font-mono); font-size: 13.5px; line-height: 1.55; color: var(--ink); margin: 0;
}
.pf-featured-grid .feature-list {
  /* Auditoría: GenOS no tiene bullets (sin equivalente auditado) — el hallazgo aplicable es
     que Michemical los aclaraba artificialmente con opacity:.8 aparte (no alfa de color).
     Se sube a 1; texto/tamaño/tipografía/indentación/símbolos sin tocar. */
  list-style: none; margin: 0; padding: 0; display: flex; flex-direction: column; gap: 6px;
  font-family: var(--font-mono); font-size: 12.5px; color: var(--ink); opacity: 1;
}
.pf-featured-grid .feature-list li { padding-left: 14px; position: relative; }
.pf-featured-grid .feature-list li::before { content: "—"; position: absolute; left: 0; opacity: .5; }

.pf-featured-grid .price-row {
  display: flex; align-items: flex-end; justify-content: space-between; gap: 12px;
  margin-top: auto; padding-top: 14px; border-top: 1px solid var(--line);
}
/* Auditoría: .price ya coincide con GenOS (color var(--ink) sólido, weight 700, sin alfa) —
   NO se toca, confirmado explícitamente correcto. */
.pf-featured-grid .price { font-family: var(--font-display); font-weight: 700; font-size: 17px; color: var(--ink); }
/* Auditoría: mismo alfa .62 de --muted que .card-text — se pasa a var(--ink) sólido. */
.pf-featured-grid .monthly { display: block; font-family: var(--font-mono); font-size: 11px; color: var(--ink); margin-top: 2px; }
/* Auditoría BUTTONS-CATEGORIES-OFFER-AUDIT.md: causa raíz confirmada del wrap de "Ver oferta"
   en 4/6 cards a 1440px — .price-row (flex, space-between) no daba flex-shrink:0 a ningún
   hijo, así que cuando el texto de precio vecino era largo ("Cotización según proyecto"),
   .card-actions se encogía por debajo del mínimo de una línea del botón (~110.6px, medido
   en las 2 cards que ya renderizaban bien y confirmado con control a 1920px). No se fija un
   width — con flex-shrink:0 el botón alcanza naturalmente su ancho de una sola línea con su
   padding/font ya existentes. */
.pf-featured-grid .card-actions { display: flex; gap: 8px; flex-shrink: 0; }

.pf-featured-grid .btn {
  font-family: var(--font-label); font-size: 11px; letter-spacing: .06em; text-transform: uppercase;
  padding: 10px 16px; border-radius: 999px; text-decoration: none; border: 1px solid transparent;
  display: inline-flex; align-items: center; cursor: pointer; transition: transform .15s ease; background: none;
}
.pf-featured-grid .btn:hover { transform: translateY(-1px); }
/* Auditoría CARDS-TEXT-OFFER-EXACT-AUDIT.md (Parte H): igualado a AGREGAR — auditoría
   confirmó que height/padding/tipografía/white-space/display/hover-transform YA coincidían;
   las únicas 5 propiedades realmente distintas eran background/radius/border-color/color/
   hover-background, ahora igualadas 1:1 a los valores reales de .btn:not(.secondary) (ver
   abajo). Se mantiene el fix de flex-shrink:0 de .card-actions (una sola línea). */
.pf-featured-grid .btn.secondary {
  background: rgb(192, 254, 4); color: rgb(0, 0, 0); border-radius: 6px; border-color: transparent;
}
.pf-featured-grid .btn.secondary:hover { background: rgb(170, 238, 0); }
/* Auditoría BUTTONS-SOCIAL-EXACT-AUDIT.md: mismo CTA verde de .pf-btn.primary aplicado a los
   6 botones "Agregar" — hover transform ya coincidía con GenOS (-1px, regla compartida
   arriba), solo faltaban background/color/radius/transition. */
.pf-featured-grid .btn:not(.secondary) {
  background: rgb(192, 254, 4); color: rgb(0, 0, 0); border-radius: 6px;
  transition: background .2s ease, transform .15s ease;
}
.pf-featured-grid .btn:not(.secondary):hover { background: rgb(170, 238, 0); }

.pf-featured-empty, .pf-featured-error {
  grid-column: 1 / 13;
  font-family: var(--font-mono); font-size: 14px; color: var(--muted); text-align: center; padding: 40px 0;
}

/* ============ WARP — escena final negra, INDEPENDIENTE del footer (400vh scroll-pin) ============
   Auditoría C:\GENOS-AUDIT-EXACT\WARP-TO-FOOTER-EXACT-AUDIT.md: GenOS tiene #warp-s (negro,
   400vh) y <footer id="foot-s"> (celeste, 100dvh) como DOS ELEMENTOS HERMANOS separados,
   footer.top === warpS.bottom, sin gap. La etapa anterior los había fusionado dentro de
   #pfFooter por error — esta etapa los separa: #pfWarp (nuevo, este bloque) queda como
   hermano ANTES de #pfFooter (ver HTML), que recupera su CSS celeste original sin cambios
   de fondo/altura. #warp-s real de GenOS: { background:rgb(0,0,0); position:relative;
   z-index:2; min-height:400vh; }. z-index:2 de GenOS NO se copia literal (su grid está en
   z:20, muy por encima; el de Michemical está fijo en z:1 y la auditoría confirmó que en
   GenOS el grid SÍ pinta por encima de la escena/texto/líneas, z:20>2>0) — .pf-warp se deja
   SIN z-index propio para que #pf-grid (z:1) pinte automáticamente por encima de todo su
   contenido, igual que GenOS. */
.pf-warp {
  position: relative; /* sin z-index — ver nota arriba */
  background: rgb(0, 0, 0); /* negro exacto auditado, capa 1 de 2 (GenOS lo declara doble) */
  min-height: 400vh;
}
/* .ws real de GenOS: { position:sticky; top:0; width:100%; height:100dvh; overflow:hidden;
   background:rgb(0,0,0); display:flex; flex-direction:column; align-items:center;
   justify-content:center; } — wrapper INTERIOR pinneado. display:grid + place-items:center
   aquí en vez de flex: necesario (no auditado explícitamente) para poder superponer el
   canvas del warp y el CTA en la MISMA celda vía grid-area:1/1 — con flex simple ambos
   quedarían apilados en vez de superpuestos. Sin z-index propio, mismo motivo que .pf-warp. */
.pf-warp-scene {
  position: sticky; top: 0; width: 100%; height: 100dvh; overflow: hidden;
  background: rgb(0, 0, 0);
  display: grid; place-items: center;
}
/* Canvas del warp: ocupa toda la celda; sin position/z-index propio, el orden de pintura lo
   decide el DOM (este elemento va primero, el CTA después → CTA visualmente encima, sin
   necesitar z-index). Tamaño/posicionamiento no vienen documentados explícitamente en la
   auditoría (GenOS no da la regla CSS del propio <canvas>) — es la única propiedad de esta
   sección que se completa por necesidad técnica, no por medición, tal como permite la regla
   principal ("usar una propiedad heredada... si es imprescindible, y reportarlo"). */
.pf-warp-canvas { grid-area: 1 / 1; width: 100%; height: 100%; display: block; }

/* CTA grande del warp — texto propio de Michemical ("Construir con / Innovación / Y diseño"),
   estructura/tipografía EXACTA medida de GenOS (.ft-a/.ft-b/.ft-c/.ft-d del warp, Parte I/R
   de FINAL-SCENE-EXACT-AUDIT.md): fórmula fluida clamp(2.5rem,6.8svw,6.8svw) — DISTINTA de la
   fórmula 2.2rem/7.2svw del footer normal — confirmado exacto en las 4 auditorías responsive
   (97.92px@1440, 69.632px@1024, 52.224px@768, floor 2.5rem=40px@390, sin gap). weight 700,
   line-height 0.95, letter-spacing -0.025em, uppercase, color BLANCO auditado rgb(255,255,255)
   (fondo negro de esta escena, a diferencia del footer celeste). font-variation-settings
   "wdth" 120 incluido tal cual auditado — no se pudo verificar si el archivo de fuente de
   Michemical soporta ese eje variable; si no, el navegador lo ignora sin romper nada. Opacity:
   GenOS hace fade 0↔1 del CTA según wP>0.12 vía JS (ver home-v2-warp.js) — no es un valor
   CSS estático, se aplica en runtime. */
/* Auditoría FINAL-ALIGNMENT-ANIMATION-WHATSAPP-AUDIT.md Parte A: causa exacta medida del
   desplazamiento (296-452px a la izquierda, distinto por línea) — width:100% anula el
   place-items:center del padre (un elemento que ya mide 100% no puede "centrarse" más), y
   sin text-align:center el texto cae en el default del navegador (start). Cambio mínimo
   auditado: agregar SOLO text-align:center aquí — width/font-size/line-height/letter-
   spacing/warp/cámara/líneas sin tocar. */
.pf-warp-cta { grid-area: 1 / 1; width: 100%; text-align: center; }
.pf-warp-row { margin: 0; }
.pf-warp-word {
  display: block;
  font-family: var(--font-display); font-size: clamp(2.5rem, 6.8svw, 6.8svw); font-weight: 700;
  line-height: .95; letter-spacing: -.025em; text-transform: uppercase; color: rgb(255, 255, 255);
  font-variation-settings: "wdth" 120;
}

/* ============ FOOTER — cierre de página, celeste, INDEPENDIENTE del warp ============
   Auditoría C:\GENOS-AUDIT-EXACT\FOOTER-EXACT-AUDIT.md + WARP-TO-FOOTER-EXACT-AUDIT.md:
   #foot-s real de GenOS: position:relative;z-index:2;background:transparent;
   min-height:100dvh;display:flex;flex-direction:column;justify-content:center;
   padding:3rem 1rem;overflow:hidden; con padding:4rem a partir de min-width:1024px — SIN
   scroll-pin, SIN fondo negro (eso es exclusivo de .pf-warp, arriba).
   z-index:2 de GenOS NO se copia aquí a propósito (etapa actual): con fondo transparente
   solo, z:2 era inofensivo (nada opaco que tapar), pero esta etapa agrega .pf-footer-decor
   (canvas de stickers propios, ver FINAL-ALIGNMENT-ANIMATION-WHATSAPP-AUDIT.md Parte B) DENTRO
   del footer — si .pf-footer tuviera z-index propio crearía su propio stacking context y
   atraparía ese canvas por ENCIMA de #pf-grid (z:1), igual que el bug ya corregido en Story/
   Featured/Warp. Sin z-index aquí, #pf-grid vuelve a pintar automáticamente por encima de
   TODO el contenido del footer (CTA incluido) — coincide con el propio GenOS, donde su grid
   (z:20) también cruza sobre su footer completo (z:2), confirmado en WARP-TO-FOOTER Parte 10. */
.pf-footer {
  position: relative;
  background: transparent;
  min-height: 100dvh;
  display: flex; flex-direction: column; justify-content: center;
  padding: 3rem 1rem;
  overflow: hidden;
}
@media (min-width: 1024px) {
  .pf-footer { padding: 4rem; }
}
/* Auditoría Parte B: capa decorativa propia del footer (stickers Michemical, NO el canvas
   global del hero — #pf-stickers sigue intocado, con su oclusión ya aprobada sin cambios).
   position:absolute + sin z-index propio: queda "positioned, z:auto" — por debajo de
   #pf-grid (z:1, explícito) automáticamente, igual que los stickers del hero; por encima del
   fondo transparente del footer por orden de DOM. Ver home-v2-footer-decor.js. */
.pf-footer-decor { position: absolute; inset: 0; width: 100%; height: 100%; display: block; pointer-events: none; }

/* CTA grande — misma estructura de GenOS (.ft-a/.ft-b/.ft-c/.ft-d del footer normal, DISTINTO
   del CTA del warp): tiktok/sans-serif→var(--font-display), size fluido
   clamp(2.2rem,7.2svw,7.2svw) [fuente literal auditada; reproduce exacto 103.68px@1440 /
   73.728px@1024 / 55.296px@768 — a 390px da ~28px por la fórmula pura, MENOS que los 42.9px
   medidos en GenOS a ese ancho: la auditoría no documentó qué regla/breakpoint distinto usa
   GenOS por debajo de cierto ancho, así que NO se inventa aquí — queda reportado, no
   corregido], weight 700, line-height 0.95 (=70.0416/73.728, proporción exacta medida),
   letter-spacing -0.025em (=-1.8432px/73.728px, exacto), uppercase, color var(--ink) (GenOS
   usa rgb(0,0,0), diferencia de 10/255 ya documentada como imperceptible en auditorías
   previas de esta misma sesión) — texto OSCURO sobre fondo CELESTE, correcto para esta
   sección (el CTA blanco quedó exclusivamente en .pf-warp-word, arriba). position:relative
   (sin z-index) agregado esta etapa: hace que el CTA sea "positioned, z:auto" igual que
   .pf-footer-decor — con ambos en ese mismo nivel, el orden de PINTURA lo decide el DOM
   (decor primero, CTA después), así el texto queda legible por encima de los stickers
   decorativos sin necesitar z-index adicional ni tapar al grid (que sigue por encima de
   ambos, ver nota de .pf-footer arriba). */
.pf-footer-cta { position: relative; width: 100%; }
.pf-footer-row { margin: 0; }
.pf-footer-word {
  display: block;
  font-family: var(--font-display); font-size: clamp(2.2rem, 7.2svw, 7.2svw); font-weight: 700;
  line-height: .95; letter-spacing: -.025em; text-transform: uppercase; color: var(--ink);
}

/* Auditoría INITIAL-SPAWN-CTA-MOBILE-AUDIT.md Parte B (9/10/11): búsqueda binaria real sobre
   el DOM en 6 anchos (390/375/370/365/360/320px) + regresión lineal (R²=0.9975) para derivar
   un font-size fluido que mantiene "VAMOS A CONSTRUIR" en una sola línea sin overflow por
   debajo de 390px (a 390px ya cabe con el clamp() actual, sin cambio). Toca ÚNICAMENTE el
   font-size de .pf-footer-word — sin tocar text-align/grid/position/line-height/weight/
   font-family/letter-spacing, tal como exige el brief. */
@media (max-width: 389px) {
  .pf-footer-word {
    font-size: clamp(28.55px, 9.6557vw - 2.26px, 35.2px);
  }
}

/* Barra inferior — .ft-bot real: position:absolute;bottom:0;left:0;right:0 dentro del
   footer (que ya es position:relative), flex-direction:column (fila legal ARRIBA, fila
   social DEBAJO — GenOS las apila, no las pone lado a lado), padding 32px 56px 40px medido
   a ≥1024px. Por debajo de 1024px la auditoría no documentó el sub-padding específico de
   .ft-bot (solo el padding del propio #foot-s) — no se inventa, se deja sin padding propio
   ahí y el padding del footer (3rem 1rem) ya da espacio razonable al borde. Ahora que el
   footer volvió a su fondo celeste original, el contraste de la línea (var(--line)) y del
   icono social (color:rgb(0,0,0)) vuelve a ser el correcto — las notas de "casi invisible
   sobre negro" de la etapa anterior ya no aplican. */
.pf-footer-bot {
  position: absolute; bottom: 0; left: 0; right: 0;
  display: flex; flex-direction: column; gap: 12px;
}
@media (min-width: 1024px) {
  .pf-footer-bot { padding: 32px 56px 40px; }
}
/* Zona legal: geometría auditada (.ft-legal) lista para cuando exista texto real — border-top
   1px solid var(--line) [equivalente a var(--l3)/rgba(54,54,48,.1) de GenOS], padding 8px 0,
   margin-top 8px, alineación space-between. Vacía a propósito — ver comentario en el HTML. */
.pf-footer-legal {
  display: flex; align-items: center; justify-content: space-between; flex-wrap: wrap;
  padding: 8px 0; margin-top: 8px;
  border-top: 1px solid var(--line);
  min-height: 1px;
}

/* ============ PANEL DE DEBUG — oculto salvo ?debug=1 ============ */
.pf-debug {
  display: none;
  position: fixed; bottom: 12px; left: 12px; z-index: 60;
  flex-direction: column; gap: 6px;
  background: rgba(241,249,255,.85); backdrop-filter: blur(10px);
  border: 1px solid var(--line); border-radius: 12px; padding: 8px;
  font-family: var(--font-label); font-size: 10px;
}
body.pf-debug-on .pf-debug { display: flex; }
.pf-debug button {
  font-family: var(--font-label); font-size: 10px; letter-spacing: .04em; text-transform: uppercase;
  background: transparent; color: var(--ink); border: 1px solid var(--line);
  border-radius: 8px; padding: 6px 9px; cursor: pointer;
}
.pf-debug button.active { border-color: var(--accent); color: var(--accent); }

/* ============ TOAST — necesario porque este home NO carga styles.css global ============
   app.js (producción, reutilizado sin cambios) crea #toast/.toast y alterna .show desde
   toast()/addToCart() en TODAS las páginas. Reglas idénticas a las de public/styles.css
   (líneas 391-392), copiadas aquí en vez de cargar esa hoja completa de 218KB en el home,
   para evitar cualquier colisión con el reset propio de este CSS aislado (Fase 10: "hacer
   selectors scoped al HOME cuando sea posible" sin tocar/depender de styles.css global). */
.toast { position:fixed; right:18px; bottom:18px; background:#fff; color:#222; border:1px solid rgba(47,128,237,.24); border-radius:18px; padding:14px 16px; box-shadow:0 22px 60px rgba(32,32,32,.10); z-index:100; transform:translateY(20px); opacity:0; pointer-events:none; transition:.2s ease; max-width:min(420px, calc(100vw - 36px)); }
.toast.show { transform:translateY(0); opacity:1; }

/* ============ RESPONSIVE ============ */
@media (max-width: 1023px) {
  .pf-bar { margin: 10px 20px; padding: 14px 20px; position: relative; }
  /* FIX MOBILE — el nav abierto conservaba el layout de escritorio (flex row, display:flex
     puesto por JS via inline style) dentro de un viewport de 375px: ancho medido del nav
     abierto 663.64px vs 375px de viewport, solo "Inicio" quedaba visible, el resto cortado
     por overflow-x:hidden de body.pf (que solo ESCONDE el síntoma, no lo resuelve). Aquí se
     define el panel/dropdown real que el JS de cada página (home-v2.js/gratis-v2.js/
     carrito-v2.js/apis-v2.js/catalogo-v2.js — mismo bloque duplicado en las 5, mismo fix en
     las 5) activa vía la clase real `.is-open` en vez de nav.style.display. Mismo
     breakpoint existente (1023px), sin inventar otro. Valores reutilizados tal cual de
     .pf-bar (background/backdrop-filter/border/border-radius) — el mismo lenguaje V2 de la
     propia barra, no una estética nueva; sombra reutilizada de .toast (línea ~728,
     `0 22px 60px rgba(32,32,32,.10)`, el único patrón real de "panel flotando sobre
     contenido" que ya existe en este archivo). `.pf-bar{position:relative}` (arriba) es lo
     que ancla este dropdown exactamente debajo de la barra (top:100%), no del header
     fijo/viewport completo — así nunca excede el ancho de la propia barra ni el viewport. */
  .pf-nav {
    display: none;
    position: absolute;
    top: 100%;
    left: 0;
    right: 0;
    margin-top: 10px;
    flex-direction: column;
    align-items: stretch;
    gap: 4px;
    padding: 14px 20px;
    box-sizing: border-box;
    background: rgba(241,249,255,.58);
    backdrop-filter: blur(20px) saturate(1.7);
    border: 1px solid rgba(10,14,20,.08);
    border-radius: 16px;
    box-shadow: 0 22px 60px rgba(32,32,32,.10);
    z-index: 2;
  }
  .pf-nav.is-open { display: flex; }
  .pf-nav a { width: 100%; box-sizing: border-box; text-align: left; }
  .pf-toggle { display: inline-flex; }
  .pf-hero { padding: 120px 24px 64px; grid-template-columns: 1fr; }
  .pf-meta-left, .pf-meta-center, .pf-meta-right { display: none; }
  .pf-h1-wrap { grid-column: 1; margin-top: 0; }
  .pf-h1 { font-size: clamp(2.2rem, 9vw, 3.75rem); -webkit-text-stroke: .4px var(--ink); }
  .pf-lede, .pf-ctas { grid-column: 1; max-width: none; }
  .pf-scroll-hint { grid-column: 1; }
}

@media (max-width: 1023px) {
  .pf-story { padding: 56px 24px; }
  .pf-story-inner { padding: 24px 4px; }
  .pf-story-body { max-width: none; }
  .pf-featured-section { padding: 90px 24px 100px; }
  .pf-featured-grid { grid-template-columns: repeat(2, 1fr); }
}

@media (max-width: 640px) {
  .pf-featured-grid { grid-template-columns: 1fr; }
}

@media (max-width: 480px) {
  .pf-hero { padding: 108px 18px 56px; }
  .pf-ctas .pf-btn { flex: 1 1 auto; justify-content: center; }
}
