/* ==========================================================================
   DESIGN SYSTEM & CUSTOM PROPERTIES
   ========================================================================== */
:root {
  /* Schwarz — German black with warm undertone */
  --bg-darkest: hsl(0 0% 5%);
  --bg-darker: hsl(0 0% 8%);
  --bg-dark: hsl(0 0% 12%);
  --bg-card: hsl(0 0% 14% / 0.85);
  --bg-card-hover: hsl(0 0% 18% / 0.9);
  --bg-paper: hsl(45 28% 91%);
  --bg-paper-muted: hsl(44 20% 82%);
  
  /* Gold — German flag gold, refined for premium */
  --brand-color: hsl(46 100% 44%);
  --brand-light: hsl(47 100% 55%);
  --brand-dark: hsl(45 90% 34%);
  --brand-glow: hsl(46 100% 44% / 0.20);
  
  /* Rot — German flag red */
  --signal-red: hsl(0 100% 43%);
  --signal-red-soft: hsl(0 100% 43% / 0.16);
  
  --text-light: hsl(45 20% 94%);
  --text-muted: hsl(42 8% 70%);
  --text-dim: hsl(40 9% 70%);
  
  --border-color: hsl(0 0% 20%);
  --border-light: hsl(46 100% 44% / 0.28);
  --border-focus: hsl(47 100% 55% / 0.58);
  
  /* Surface System — Paper (light, warm ivory) */
  --bg-warm: hsl(46 100% 44% / 0.04);
  --text-on-paper: hsl(0 0% 10%);
  --text-on-paper-muted: hsl(0 0% 32%);
  --text-on-paper-dim: hsl(0 0% 38%);
  /* Dorado legible SOBRE PAPEL: --brand-dark (34%) da 3.15:1 contra --bg-paper,
     por debajo del 4.5:1 que necesita el texto normal. Este da 4.65:1. */
  --brand-on-paper: hsl(45 90% 27%);
  --border-paper: hsl(44 18% 78%);
  --border-paper-accent: hsl(46 100% 44% / 0.28);
  
  /* Sponsors Colors */
  --tier-1-color: hsl(46 100% 44%); /* Gold Main Sponsor */
  --tier-2-color: hsl(38 80% 30%); /* Section Sponsor: restrained gold-brown */
  
  /* Fonts */
  --font-title: 'Outfit', -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif;
  --font-body: 'Inter', -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif;
  --font-header: var(--font-title);
  
  /* Spacing */
  --spacing-xs: 0.5rem;
  --spacing-sm: 1rem;
  --spacing-md: 2rem;
  --spacing-lg: 4rem;
  --spacing-xl: 8rem;
  
  /* UI Attributes */
  --border-radius-sm: 6px;
  --border-radius-md: 8px;
  --border-radius-lg: 8px;
  --transition-fast: 0.2s cubic-bezier(0.4, 0, 0.2, 1);
  --transition-normal: 0.3s cubic-bezier(0.4, 0, 0.2, 1);
  --transition-slow: 0.6s cubic-bezier(0.4, 0, 0.2, 1);
  --shadow-sm: 0 4px 12px rgba(0, 0, 0, 0.3);
  --shadow-md: 0 12px 32px rgba(0, 0, 0, 0.5);
  --shadow-lg: 0 24px 64px rgba(0, 0, 0, 0.7);
  
  /* Container sizes */
  --container-width: 1280px;
}

/* ==========================================================================
   RESET & GLOBAL BASE STYLES
   ========================================================================== */
*, *::before, *::after {
  box-sizing: border-box;
  margin: 0;
  padding: 0;
}

/* Imágenes de contenido NUNCA más anchas que su contenedor (móvil): sin esto, una
   <img width="1024"> suelta (p.ej. el hero de una nota del blog) expandía el card a
   ~1088px y el texto de TODA la nota quedaba cortado fuera de la pantalla — el
   overflow-x:hidden del body ocultaba el síntoma recortando. height:auto conserva
   la proporción; los logos/banderas con height fijada por CSS no se ven afectados. */
img {
  max-width: 100%;
  height: auto;
}

/* Anti-zoom de iOS: Safari hace zoom automático al enfocar cualquier control con
   fuente <16px. Los inputs dentro de .form-group ya lo tenían; esto cubre el resto
   (newsletter del pie sitewide, variantes inline). Las reglas de componente pueden
   subirlo, nunca conviene bajarlo. */
input, select, textarea {
  font-size: 16px;
}

html {
  scroll-behavior: smooth;
  scroll-padding-top: 96px; /* Offset for sticky header */
  /* clip (no hidden: hidden crea contenedor de scroll y rompe position:sticky).
     Cierra el paneo horizontal fantasma de ~7px que quedaba a 320px aun con todo
     el contenido midiendo <= viewport (efecto 100vw). Medido en Chrome real 22/8/2026. */
  overflow-x: clip;
}

/* Quien pidió "reducir movimiento" en su sistema no debería tener que aguantar un
   desplazamiento animado de pantalla completa cada vez que toca un ancla. */
@media (prefers-reduced-motion: reduce) {
  html { scroll-behavior: auto; }
}

body {
  background-color: var(--bg-darkest);
  color: var(--text-light);
  font-family: var(--font-body);
  line-height: 1.6;
  -webkit-font-smoothing: antialiased;
  overflow-x: hidden;
}

/* Custom Scrollbar */
::-webkit-scrollbar {
  width: 10px;
}
::-webkit-scrollbar-track {
  background: var(--bg-darkest);
}
::-webkit-scrollbar-thumb {
  background: var(--bg-dark);
  border: 2px solid var(--bg-darkest);
  border-radius: var(--border-radius-sm);
}
::-webkit-scrollbar-thumb:hover {
  background: var(--brand-color);
}

/* Typography */
h1, h2, h3, h4 {
  font-family: var(--font-title);
  font-weight: 700;
  line-height: 1.25;
  color: var(--text-light);
}

h1 {
  font-size: clamp(2.5rem, 5.5vw, 4rem);
  font-weight: 800;
  letter-spacing: 0;
}

h2 {
  font-size: clamp(1.8rem, 3.5vw, 2.6rem);
  letter-spacing: 0;
  margin-block-end: 1rem;
}

h3 {
  font-size: clamp(1.3rem, 2.2vw, 1.7rem);
}

/* Sube el NIVEL de un encabezado sin cambiar cómo se ve. Quien navega con lector de
   pantalla salta de encabezado en encabezado: si una página va del h1 directo al h3, se
   percibe un nivel faltante y se pierde el mapa de la página. A veces la jerarquía visual
   correcta no coincide con la semántica, y esto permite arreglar la segunda sin tocar la
   primera: <h2 class="tamano-h3"> se lee como h2 y se ve como h3. */
.tamano-h3 { font-size: clamp(1.3rem, 2.2vw, 1.7rem); }
.tamano-h4 { font-size: 1.05rem; }

p {
  color: var(--text-muted);
  /* 15,2px en un telefono de 360px era el tamaño del texto corrido de TODO el sitio:
     por debajo del minimo comodo de lectura, y el 90% de las visitas son de celular.
     Ahora arranca en 17px y sube a 18,4px en escritorio. */
  font-size: clamp(1.0625rem, 1rem + 0.3vw, 1.15rem);
  margin-block-end: 1.5rem;
}

strong {
  color: var(--text-light);
  font-weight: 600;
}

a {
  color: var(--brand-light);
  text-decoration: none;
  transition: var(--transition-fast);
}

a:hover {
  color: var(--brand-light);
}

.sr-only {
  position: absolute;
  width: 1px;
  height: 1px;
  padding: 0;
  margin: -1px;
  overflow: hidden;
  clip: rect(0, 0, 0, 0);
  white-space: nowrap;
  border: 0;
}

/* Semantic Container Layouts */
.section-container {
  padding-block: var(--spacing-lg);
  padding-inline: var(--spacing-sm);
  max-inline-size: var(--container-width);
  margin-inline: auto;
}

@media (min-width: 768px) {
  .section-container {
    padding-inline: var(--spacing-md);
    padding-block: var(--spacing-lg);
  }
}

.alt-bg {
  background-color: var(--bg-darker);
  position: relative;
  box-shadow: inset 0 64px 64px -64px rgba(0,0,0,0.8),
              inset 0 -64px 64px -64px rgba(0,0,0,0.8);
}

/* ---------------------------------------------------------------------------
   SURFACE SYSTEM — Visual Grammar
   S1 = default (darkest)  — no class needed
   S2 = alt-bg (warm-dark) — .alt-bg
   S3 = paper (light)      — .surface-paper
   S4 = warm-accent        — .surface-warm
   --------------------------------------------------------------------------- */

/* S3: Paper — Light surface with warm ivory background */
.surface-paper {
  background: var(--bg-paper);
  position: relative;
}
.surface-paper h1,
.surface-paper h2,
.surface-paper h3,
.surface-paper h4 {
  color: var(--text-on-paper);
}
.surface-paper p,
.surface-paper li {
  color: var(--text-on-paper-muted);
}
.surface-paper strong {
  color: var(--text-on-paper);
}
.surface-paper .editorial-kicker {
  color: hsl(45 90% 26%);
}
.surface-paper .editorial-kicker::before {
  background: var(--signal-red);
}
.surface-paper .section-desc {
  color: var(--text-on-paper-muted);
}
.surface-paper a:not(.btn) {
  color: hsl(45 90% 26%);
}
/* Fix de contraste: enlaces dentro de tarjetas OSCURAS en secciones claras (surface-paper).
   La regla de arriba los pintaba dorado oscuro = ilegible sobre fondo oscuro. */
.surface-paper .sponsor-contact a,
.surface-paper .criadero-contactos a,
.surface-paper .doctrine-card a:not(.btn),
.surface-paper .archive-card a:not(.btn),
.surface-paper .servicio-card a:not(.btn),
.surface-paper .comunidad-card a:not(.btn),
.surface-paper .axiom-card a:not(.btn),
.surface-paper .magazine-panel a:not(.btn),
.surface-paper .post-card a:not(.btn) {
  color: var(--brand-light, #e6c66a);
}
/* Los tres últimos de la lista de arriba faltaban, y son de la misma familia: medidos con
   Chrome el 20/8/2026 daban 3,30:1 sobre el fondo oscuro de su tarjeta, por debajo del
   4,5:1 que necesita el texto normal. Con --brand-light quedan en 12,8:1. Dónde se veían:
   revista.html (los tres títulos de .axiom-card), index.html ("Claudio Zubrisky" en el
   panel de la revista), criaderos.html (el enlace "tarifario") y blog.html (el título de
   cada nota y su "Leer más", que son el enlace principal de la portada del blog). */

/* La tarjeta de país del selector del directorio ES un <a>: la regla de los enlaces sobre
   papel le pintaba el nombre del país con el dorado oscuro y quedaba en 2,80:1 sobre su
   propio fondo oscuro — menos legible que el "4 criaderos" de al lado, que da 8,06:1.
   Acá no va dorado claro sino el color que la tarjeta ya declara para sí misma
   (--text-light): el dorado de este componente es el borde, no el texto. Queda en 13,4:1.
   Va como `a.pais-tarjeta` y no `.pais-tarjeta` a propósito: con el nombre de clase suelto
   la regla EMPATA en especificidad con `.surface-paper a:not(.btn)` (el :not() cuenta) y
   pierde contra la regla propia de criaderos.html. Comprobado: así seguía en 2,80:1. */
.surface-paper a.pais-tarjeta {
  color: var(--text-light, #f5f5f5);
}
.surface-paper .btn-secondary {
  color: var(--text-on-paper);
  border-color: var(--border-paper);
}
.surface-paper .btn-secondary:hover {
  background: hsl(24 11% 8% / 0.06);
  border-color: var(--brand-color);
}
/* Las tarjetas de criadero son OSCURAS aunque vivan en una seccion surface-paper:
   el boton "Ver perfil completo" debe llevar texto CLARO, no el oscuro de surface-paper.
   Mismo caso para TODAS las tarjetas invertidas (fondo oscuro) sobre paper: doctrine,
   archive, axiom, manifesto, taxonomy-panel y commercial-rule — p.ej. el boton
   "Ver fechas en el cronograma" de eventos.html quedaba con tinta oscura sobre tarjeta oscura. */
.surface-paper .criadero-card-grande .btn-secondary,
.surface-paper .criadero-card-chico .btn-secondary,
.surface-paper .doctrine-card .btn-secondary,
.surface-paper .archive-card .btn-secondary,
.surface-paper .axiom-card .btn-secondary,
.surface-paper .manifesto-card .btn-secondary,
.surface-paper .taxonomy-panel .btn-secondary,
.surface-paper .commercial-rule .btn-secondary {
  color: var(--text-light);
  border-color: var(--brand-color);
}
.surface-paper .criadero-card-grande .btn-secondary:hover,
.surface-paper .criadero-card-chico .btn-secondary:hover,
.surface-paper .doctrine-card .btn-secondary:hover,
.surface-paper .archive-card .btn-secondary:hover,
.surface-paper .axiom-card .btn-secondary:hover,
.surface-paper .manifesto-card .btn-secondary:hover,
.surface-paper .taxonomy-panel .btn-secondary:hover,
.surface-paper .commercial-rule .btn-secondary:hover {
  background: var(--bg-dark);
  border-color: var(--brand-color);
}
/* Y el mismo caso para <strong>: .surface-paper strong pinta tinta oscura, que dentro
   de una tarjeta invertida (fondo bg-darkest) queda invisible (ratio 1.1:1) — p.ej. las
   fechas y el mail del aviso ACRR en eventos.html. Solo tarjetas con fondo oscuro
   CONFIRMADO (tool-card es transparente: excluida a propósito). */
.surface-paper .criadero-card-grande strong,
.surface-paper .criadero-card-chico strong,
.surface-paper .doctrine-card strong,
.surface-paper .archive-card strong,
.surface-paper .axiom-card strong,
.surface-paper .manifesto-card strong,
.surface-paper .taxonomy-panel strong,
.surface-paper .commercial-rule strong,
.surface-paper .magazine-panel strong,
.surface-paper .post-card strong,
.surface-paper .sidebar-widget strong {
  color: var(--text-light);
}
.surface-paper .post-card-category {
  background: var(--brand-on-paper);   /* con --brand-dark el blanco quedaba en 3.76:1 */
  color: white;
}

.surface-paper .blog-filters {
  border-bottom-color: var(--border-paper);
}

.surface-paper .filter-btn {
  color: var(--text-on-paper-muted);
  border-color: var(--border-paper);
}

.surface-paper .filter-btn:hover,
.surface-paper .filter-btn.active {
  /* Sobre el dorado de fondo, el marfil daba 1.85:1 — el único botón que dice en qué
     categoría estás era el que no se podía leer. En negro da 10:1. */
  color: hsl(0 0% 8%);
  border-color: var(--brand-color);
}

.surface-paper .post-card,
.surface-paper .sidebar-widget {
  background: var(--bg-darkest);
  border-color: hsl(32 10% 22%);
}

.surface-paper .post-card h3,
.surface-paper .sidebar-widget h3 {
  color: var(--text-light);
}

.surface-paper .post-card p,
.surface-paper .post-card-footer,
.surface-paper .sidebar-widget,
.surface-paper .sidebar-widget li {
  color: var(--text-muted);
}

.surface-paper .post-card-footer {
  border-top-color: var(--border-color);
}

/* S3: Cards on paper — dark inverted cards */
.surface-paper .doctrine-card,
.surface-paper .archive-card,
.surface-paper .axiom-card,
.surface-paper .manifesto-card {
  background: var(--bg-darkest);
  border-color: hsl(32 10% 22%);
  color: var(--text-light);
}
.surface-paper .doctrine-card h3,
.surface-paper .archive-card h3,
.surface-paper .axiom-card h3,
.surface-paper .manifesto-card h3 {
  color: var(--text-light);
}
.surface-paper .doctrine-card p,
.surface-paper .archive-card p,
.surface-paper .axiom-card p,
.surface-paper .manifesto-card p {
  color: var(--text-muted);
}
.surface-paper .doctrine-card .number {
  color: var(--brand-light);
  border-color: var(--border-light);
}
.surface-paper .archive-card a {
  color: var(--brand-light);
}
/* Kicker inside inverted dark cards on a paper section: keep light-gold for contrast */
.surface-paper .doctrine-card .editorial-kicker,
.surface-paper .tool-card .editorial-kicker,
.surface-paper .taxonomy-panel .editorial-kicker,
.surface-paper .commercial-rule .editorial-kicker {
  color: var(--brand-light);
}
.surface-paper .taxonomy-panel {
  background: var(--bg-darkest);
  border-color: hsl(32 10% 22%);
}
.surface-paper .taxonomy-panel h2,
.surface-paper .taxonomy-panel h3 {
  color: var(--text-light);
}
.surface-paper .taxonomy-panel p {
  color: var(--text-muted);
}
.surface-paper .taxonomy-list li {
  color: var(--text-muted);
  border-top-color: var(--border-color);
}
.surface-paper .taxonomy-list strong {
  color: var(--text-light);
}
.surface-paper .commercial-rule {
  background: var(--bg-darkest);
  border-color: var(--border-light);
}
.surface-paper .commercial-rule h2,
.surface-paper .commercial-rule h3 {
  color: var(--text-light);
}
.surface-paper .commercial-rule p,
.surface-paper .commercial-rule li {
  color: var(--text-muted);
}
.surface-paper .value-list li {
  /* Sobre papel, --text-muted da 1.72:1: el texto desaparecía. Y como los <strong> sí se
     repintaban a tinta oscura, quedaba una lista de rótulos negros con la explicación en
     blanco invisible (estandar, salud, cria-responsable, razas-invitadas). */
  color: var(--text-on-paper-muted);
}
.surface-paper .value-list li::before {
  background: var(--signal-red);
}

/* S4: Warm accent — subtle copper-tinted surface */
/* S4: Accent band — distinct dark with a visible gold hairline (the 3rd tone).
   Used so two dark sections never read as identical. */
.surface-warm {
  background:
    radial-gradient(140% 120% at 50% 0%, hsl(46 100% 44% / 0.07), transparent 55%),
    linear-gradient(180deg, hsl(0 0% 7%), hsl(0 0% 9.5%));
  position: relative;
  border-top: 1px solid hsl(46 100% 44% / 0.38);
  border-bottom: 1px solid hsl(46 100% 44% / 0.38);
}

/* S4: Cards on warm — glass effect */
.surface-warm .doctrine-card,
.surface-warm .archive-card,
.surface-warm .axiom-card {
  background: hsl(24 8% 15% / 0.55);
  -webkit-backdrop-filter: blur(12px);
  backdrop-filter: blur(12px);
  border-color: hsl(46 100% 44% / 0.18);
}
.surface-warm .doctrine-card:hover,
.surface-warm .archive-card:hover {
  border-color: var(--brand-color);
  background: hsl(24 8% 15% / 0.72);
}

/* Card glow variant — copper glow border */
.card-glow {
  border-color: hsl(46 100% 44% / 0.28) !important;
  box-shadow: 0 0 20px hsl(46 100% 44% / 0.06), var(--shadow-sm);
}
.card-glow:hover {
  border-color: var(--brand-color) !important;
  box-shadow: 0 0 30px hsl(46 100% 44% / 0.12), var(--shadow-md);
}

/* Magazine panel on paper surface */
.surface-paper .magazine-panel {
  background: var(--bg-darkest);
  border-color: hsl(46 100% 44% / 0.22);
}
.surface-paper .magazine-panel h2,
.surface-paper .magazine-panel h3 {
  color: var(--text-light);
}
.surface-paper .magazine-panel p,
.surface-paper .magazine-panel li {
  color: var(--text-muted);
}
.surface-paper .magazine-panel .editorial-kicker {
  color: var(--brand-light);
}

/* Sponsor contact inside paper */
.surface-paper .sponsor-contact a {
  color: var(--text-on-paper-muted);
}
.surface-paper .sponsor-contact a:hover {
  color: var(--brand-dark);
}
.surface-paper .sponsor-contact a[href^="https://wa.me"],
.surface-paper .sponsor-contact a[href^="https://www."] {
  color: var(--brand-dark);
}

/* Home rhythm: section, subsection, card and button each has a clear role. */
.section-focus-magazine {
  padding-block: clamp(3rem, 7vw, 6rem);
  border-block: 1px solid var(--border-paper);
}

.section-doctrine {
  background:
    radial-gradient(circle at 12% 20%, hsl(46 100% 44% / 0.1), transparent 34%),
    linear-gradient(180deg, var(--bg-darkest), var(--bg-darker));
  border-block: 1px solid hsl(46 100% 44% / 0.12);
}

.section-doctrine .section-header {
  margin-inline: 0;
}

.section-doctrine .doctrine-card {
  background: var(--bg-paper);
  border-color: var(--border-paper);
  box-shadow: none;
}

.section-doctrine .doctrine-card:nth-child(even) {
  background: hsl(44 21% 84%);
  border-color: var(--border-paper-accent);
}

.section-doctrine .doctrine-card h3 {
  color: var(--text-on-paper);
}

.section-doctrine .doctrine-card p {
  color: var(--text-on-paper-muted);
}

.section-doctrine .doctrine-card .number {
  color: var(--brand-dark);
  border-color: var(--brand-dark);
}

.section-tools {
  padding-block: clamp(3rem, 7vw, 5.5rem);
}

.tool-card {
  display: flex;
  flex-direction: column;
  min-height: 250px;
}

.tool-card .editorial-kicker {
  font-size: 0.7rem;
  margin-bottom: 0.5rem;
  border: none;
  padding: 0;
}

.tool-card p {
  margin-bottom: 1.5rem;
}

.tool-card .btn {
  margin-top: auto;
  align-self: flex-start;
  font-size: 0.85rem;
  padding: 0.6rem 1.2rem;
}

/* On the light Tools section all cards invert to dark; the middle one is the
   gold-accent "featured" card (variety + draws the eye to a tool = action). */
.section-tools .tool-card:nth-child(2) {
  border-color: var(--border-light);
  box-shadow: 0 0 26px hsl(46 100% 44% / 0.08);
}

/* Archive lives on the accent band (surface-warm) — it supplies its own gold
   hairline, so no extra border here. Cards render as glass on the band. */
.section-archive .archive-card {
  box-shadow: none;
}

/* Taxonomy section is now light (paper) with two inverted dark panels:
   - taxonomy-panel: neutral solid dark (the editorial ontology)
   - commercial-rule: gold-accent dark (the commercial / sponsors block) */
.section-taxonomy .taxonomy-panel {
  background: var(--bg-darkest);
}

.section-taxonomy .commercial-rule {
  background:
    linear-gradient(135deg, hsl(46 100% 44% / 0.10), transparent 62%),
    var(--bg-darkest);
  border-color: var(--border-light);
  box-shadow: 0 0 28px hsl(46 100% 44% / 0.07);
}

.section-taxonomy .commercial-rule .btn-secondary {
  color: var(--text-light);
  border-color: var(--border-color);
}

.sponsors-strip-section {
  padding-block: var(--spacing-md);
  border-top: 1px solid var(--border-color);
}

.full-bleed-band {
  max-inline-size: none;
  width: 100%;
  padding-inline: max(var(--spacing-sm), calc((100vw - var(--container-width)) / 2));
}

.editorial-kicker {
  display: inline-flex;
  align-items: center;
  gap: 0.55rem;
  font-family: var(--font-title);
  font-size: 0.78rem;
  font-weight: 800;
  letter-spacing: 0.16em;
  text-transform: uppercase;
  color: var(--brand-light);
}

.editorial-kicker::before {
  content: "";
  width: 2.2rem;
  height: 2px;
  background: var(--signal-red);
}

.editorial-lede {
  font-size: clamp(1.08rem, 1.7vw, 1.28rem);
  color: var(--text-light);
  line-height: 1.72;
}

.rule-note {
  border-left: 3px solid var(--signal-red);
  padding: 1rem 1.1rem;
  background: hsl(0 100% 43% / 0.08);
  color: var(--text-light);
  font-family: var(--font-title);
  font-weight: 700;
}

.editorial-hero {
  min-height: calc(100svh - 124px);
  display: grid;
  align-items: end;
  position: relative;
  overflow: hidden;
  background:
    linear-gradient(90deg, hsl(24 11% 5% / 0.94) 0%, hsl(24 11% 5% / 0.68) 32%, hsl(24 11% 5% / 0.12) 64%, hsl(24 11% 5% / 0) 100%),
    linear-gradient(0deg, hsl(24 11% 5% / 0.55) 0%, hsl(24 11% 5% / 0) 38%),
    var(--hero-image, url("images/hero_rottweiler.webp")) center 38% / cover no-repeat;
}

/* EN CELULAR EL VELO VA DE ARRIBA HACIA ABAJO, NO DE IZQUIERDA A DERECHA.
   El degradado de arriba está pensado para escritorio, donde el texto ocupa una columna
   a la izquierda y la mitad derecha de la foto queda libre: ahí el 90deg es correcto y se
   mide bien (a 1440px el titular no baja de 6,56:1 y el kicker no baja de 9,46:1).
   En pantalla angosta el texto ocupa todo el ancho y cada renglón termina sobre el cielo
   del atardecer, que es casi blanco (luminancia 0,93). Medido con Chrome el 20/8/2026 en
   la portada, a 360, 390 y 430px: el 41-44% de los píxeles del titular quedaba por debajo
   de 4,5:1 y el peor punto daba 1,16:1; el renglón dorado "AMIGOS DEL ROTTWEILER" era el
   más castigado, con 57-69% de sus píxeles flojos y un peor punto de 1,00:1 — invisible.
   El velo se calculó, no se tanteó: para que el dorado del kicker llegue a 4,5:1 el fondo
   no puede pasar de 0,1056 de luminancia, y sobre el cielo eso pide alfa 0,66. Arriba va
   0,76 (donde está el cielo y donde caen kicker y titular) y abajo afloja a 0,52, que es
   donde la foto tiene al perro y al bosque, ya oscuros de por sí: así la foto sigue siendo
   el elemento principal en vez de quedar apagada pareja. */
@media (max-width: 820px) {
  .editorial-hero {
    background:
      linear-gradient(180deg,
        hsl(24 11% 5% / 0.76) 0%,
        hsl(24 11% 5% / 0.74) 30%,
        hsl(24 11% 5% / 0.64) 62%,
        hsl(24 11% 5% / 0.52) 100%),
      var(--hero-image, url("images/hero_rottweiler.webp")) center 38% / cover no-repeat;
  }
}

.editorial-hero::after {
  content: "";
  position: absolute;
  inset: auto 0 0;
  height: 36%;
  background: linear-gradient(transparent, var(--bg-darkest));
  pointer-events: none;
}

.editorial-hero-inner {
  position: relative;
  z-index: 1;
  max-width: 780px;
  padding-block: clamp(3rem, 10vh, 7rem);
}

.editorial-hero h1 {
  margin-block: 0.9rem 1.1rem;
  max-width: 760px;
}

.editorial-hero p {
  max-width: 660px;
}

.hero-proof-strip {
  display: flex;
  flex-wrap: wrap;
  gap: 0.7rem;
  margin-block: 1.6rem;
}

.proof-pill {
  display: inline-flex;
  align-items: center;
  min-height: 2.5rem;
  padding: 0.58rem 0.78rem;
  border: 1px solid hsl(37 24% 94% / 0.16);
  background: hsl(24 11% 5% / 0.54);
  color: var(--text-light);
  font-family: var(--font-title);
  font-size: 0.86rem;
  font-weight: 700;
  -webkit-backdrop-filter: blur(10px);
  backdrop-filter: blur(10px);
}

/* ── Captura de camadas DENTRO del hero ──────────────────────────────────────
   Quien entra a la portada no viene por una revista: viene por un cachorro (20 s de
   permanencia media, 83% desde celular). El email se pide donde está esa intención.
   Reglas de este bloque: que ENTRE en la primera pantalla junto al h1, así que va
   compacto —una línea de texto y una fila de campos— y se apila entero en celular. */
.hero-camada {
  margin-block-start: 1.4rem;
  max-width: 38rem; /* la línea de arriba entra en un renglón; el formulario, en una fila */
}

.hero-camada-linea {
  /* Más separación entre la frase y los campos: la promesa se lee primero, y recién
     después aparece lo que hay que completar. */
  margin-block-end: 0.9rem;
  font-family: var(--font-title);
  font-size: 0.95rem;
  font-weight: 600;
  line-height: 1.45;
  color: var(--text-light);
}

.hero-camada-linea strong {
  color: var(--brand-light);
  font-weight: 700;
}

.hero-camada-form {
  display: flex;
  flex-wrap: wrap;
  gap: 0.5rem;
}

.hero-camada-form input[type="email"],
.hero-camada-form select {
  flex: 1 1 10rem;
  min-width: 0;
  min-height: 44px; /* objetivo táctil mínimo */
  padding: 0.6rem 0.8rem;
  border: 1px solid hsl(37 24% 94% / 0.22);
  border-radius: var(--border-radius-sm);
  background: hsl(24 11% 5% / 0.72);
  -webkit-backdrop-filter: blur(10px);
  backdrop-filter: blur(10px);
  color: var(--text-light);
  font-family: var(--font-body);
  font-size: 16px; /* menos de 16px hace que iPhone haga zoom al tocar el campo */
}

/* El select no necesita tanto ancho como el email: la fila entra en una sola línea. */
.hero-camada-form select { flex: 0 1 9.5rem; }

.hero-camada-form option,
.hero-camada-form optgroup {
  background: var(--bg-darkest);
  color: var(--text-light);
}

.hero-camada-form input[type="email"]::placeholder { color: var(--text-dim); }

.hero-camada-form input[type="email"]:focus-visible,
.hero-camada-form select:focus-visible {
  outline: 2px solid var(--brand-color);
  outline-offset: 1px;
  border-color: var(--brand-color);
}

.hero-camada-form .hero-camada-btn {
  flex: 0 0 auto;
  min-height: 44px;
  padding-inline: 1.2rem;
}

.hero-camada-nota {
  margin-block-start: 0.55rem;
  max-width: 34rem;
  font-size: 0.75rem;
  line-height: 1.45;
  color: var(--text-muted);
}

.hero-camada-msg {
  display: none;
  margin-block-start: 0.55rem;
  font-size: 0.88rem;
  line-height: 1.45;
}

.hero-camada-msg.is-visible { display: block; }
.hero-camada-msg.is-ok { color: var(--brand-light); }
.hero-camada-msg.is-error { color: hsl(0 62% 78%); }

/* Escritorio: el hero ancla su contenido ABAJO (align-items: end) y, con la captura sumada,
   el formulario terminaba justo en el borde inferior de una pantalla de 900 px. Se recorta
   el aire de arriba y el de las pruebas, SOLO en el hero que lleva la captura —la portada—:
   los otros trece heros del sitio usan la misma clase y no tienen por qué achicarse. Si el
   navegador no entiende :has(), no pasa nada: queda el hero de siempre. */
@media (min-width: 561px) {
  .editorial-hero-inner:has(.hero-camada) { padding-block: clamp(2.25rem, 6vh, 4.5rem); }
  .editorial-hero-inner:has(.hero-camada) .hero-proof-strip { margin-block: 1.15rem; }
  .editorial-hero-inner:has(.hero-camada) .home-hero-actions { margin-block-start: 0.2rem; }
}

/* Portátiles bajos (un MacBook Air da 800 px de alto útiles): el título a 64 px ocupa tres
   renglones y solo, sin ayuda de nadie, empuja la captura abajo del pliegue. Con el mismo
   texto en dos renglones entra todo, y a ~52 px el título sigue siendo lo que domina el
   hero. Las pantallas altas (1080) no se tocan. */
@media (min-width: 561px) and (max-height: 900px) {
  .editorial-hero-inner:has(.hero-camada) { padding-block: clamp(1.75rem, 4vh, 3rem); }
  .editorial-hero-inner:has(.hero-camada) > h1 { font-size: clamp(2.25rem, 3.6vw, 3.1rem); }
}

/* Celular — el 83% del tráfico. Medido en un iPhone (390x844): con el título a 40px, el
   texto de entrada, las tres pruebas y los dos botones, la captura arrancaba en y=896, o
   sea FUERA de la primera pantalla. Pedir el email donde está la intención y dejarlo abajo
   del pliegue es no pedirlo. Dos cosas, entonces, y solo en pantallas chicas:
     1) se comprime la tipografía del hero (título y entrada), que a ese tamaño ocupaba
        cinco y seis renglones;
     2) la captura SUBE hasta debajo del texto de entrada, con order. El HTML no cambia
        —el bloque sigue después de los botones, que es su lugar en escritorio—: lo que
        cambia es en qué orden se pintan las cajas del hero en un teléfono. */
@media (max-width: 560px) {
  /* ACOTADO al hero que tiene el formulario de camadas, igual que las reglas de
     escritorio. Sin el :has() esto se aplicaba a los 14 heros del sitio, y en
     ranking.html —el unico con un hijo directo sin clase— ese parrafo quedaba en
     order:0 y se pintaba ANTES del kicker y del titulo, en celular. */
  .editorial-hero-inner:has(.hero-camada) {
    display: flex;
    flex-direction: column;
    /* Más aire arriba y abajo (pedido del dueño, 20/8): con la barra de publicidad
       vacía fuera de la pantalla sobran unos 50 px al pie, y el bloque estaba
       apretado contra los bordes. */
    padding-block: 2.75rem;
  }
  .editorial-hero-inner:has(.hero-camada) > .editorial-kicker { order: 1; }
  .editorial-hero-inner:has(.hero-camada) > h1 {
    order: 2;
    /* Un punto menos de tamaño y algo más de interlínea: el titular tiene seis
       palabras y en un teléfono angosto entraba pegado, línea contra línea. */
    font-size: clamp(1.6rem, 6.9vw, 2.05rem);
    line-height: 1.18;
    margin-block: 0.9rem 1rem;
  }
  .editorial-hero-inner:has(.hero-camada) > .editorial-lede {
    order: 3;
    font-size: 1rem;
    line-height: 1.6;
  }
  /* LOS BOTONES ANTES DEL FORMULARIO. Medido en un iPhone (390x844) con el orden anterior:
     el botón "Buscar un criador" —la acción principal de la portada— arrancaba en y=838,
     con la pantalla midiendo 844. Quedaba literalmente en el borde: había que scrollear
     para verlo, porque el formulario de email lo empujaba hacia abajo.
     Quien llega busca un cachorro: primero se le ofrece ir a buscarlo, y recién después
     el "dejá tu email si todavía no hay". En escritorio el orden no cambia: ahí los dos
     bloques entran juntos y el formulario sigue debajo de los botones igual. */
  /* Separaciones un poco más generosas entre bloques: cada cosa se lee como una cosa,
     en vez de una lista pegada. Los botones también respiran entre sí. */
  .editorial-hero-inner:has(.hero-camada) > .home-hero-actions { order: 4; margin-block-start: 1.35rem; gap: 0.7rem; }
  /* Separación grande entre los botones y el bloque del email: son DOS OFERTAS
     distintas ("andá a buscar un criador" y "dejanos tu email para avisarte"), y
     pegadas se leían como un mismo párrafo corrido. El dueño pidió más aire justo
     entre "Leer la revista gratis" y la línea del email. */
  .editorial-hero-inner:has(.hero-camada) > .hero-camada {
    order: 5;
    /* La separación respecto de los botones se mantiene grande (son dos ofertas
       distintas), pero el bloque en sí se aprieta: ocupaba 231 px de una pantalla
       de 844 —más de un cuarto— para lo que es una captura secundaria. */
    margin-block-start: 2.4rem;
    padding-block-start: 1.1rem;
    border-top: 1px solid hsl(37 24% 94% / 0.14);
  }
  /* Frase y campos más juntos, y la letra de la promesa un punto menos. */
  .editorial-hero-inner:has(.hero-camada) .hero-camada-linea {
    font-size: 0.9rem;
    line-height: 1.35;
    margin-block-end: 0.6rem;
  }
  .editorial-hero-inner:has(.hero-camada) .hero-camada-form { gap: 0.4rem; }
  /* EL PAÍS APARECE CUANDO HACE FALTA. En el arranque el formulario es una sola fila
     —email y botón—, que es lo mínimo para pedir un email y lo que menos ocupa. El
     selector de país se despliega apenas la persona empieza a escribir (lo hace app.js
     agregando .hero-camada--pais), así el dato no se pierde: sigue haciendo falta para
     avisar por país, solo que no se muestra antes de que haya interés.
     El bloque entero medía 231 px de una pantalla de 844 para lo que es una captura
     secundaria; el dueño lo marcó como "muy grande". */
  .editorial-hero-inner:has(.hero-camada) .hero-camada-pais {
    display: none;
  }
  .editorial-hero-inner:has(.hero-camada--pais) .hero-camada-pais {
    display: block;
    flex: 1 1 100%;
  }
  .editorial-hero-inner:has(.hero-camada) .hero-camada-email { flex: 1 1 58%; }
  .editorial-hero-inner:has(.hero-camada) .hero-camada-btn { flex: 1 1 34%; }
  .editorial-hero-inner:has(.hero-camada) .hero-camada-nota {
    margin-block-start: 0.4rem;
    font-size: 0.72rem;
  }
  .editorial-hero-inner:has(.hero-camada) > .hero-proof-strip { order: 6; margin-block: 1.6rem 0; gap: 0.5rem; }
  .proof-pill { min-height: 2.1rem; padding: 0.42rem 0.6rem; font-size: 0.78rem; }
  /* DOS FILAS, NO TRES. El email va solo y a todo el ancho —es lo que hay que
     escribir, y necesita lugar—; el país y el botón comparten la segunda.
     Apilados de a uno, el formulario medía 150 px de alto y terminaba en y=890,
     con la pantalla en 844: el botón "Avisame" quedaba fuera de la primera vista.
     Así entra todo sin sacarle el aire que pidió el dueño entre los bloques. */
  .hero-camada-form input[type="email"] {
    flex: 1 1 100%;
    width: 100%;
  }
  .hero-camada-form select { flex: 1 1 52%; min-width: 0; }
  .hero-camada-form .hero-camada-btn { flex: 1 1 40%; min-width: 0; }
}

.doctrine-grid,
.axiom-grid,
.archive-grid,
.sponsor-tier-grid,
.manifesto-grid {
  display: grid;
  gap: 1rem;
}

@media (min-width: 768px) {
  .doctrine-grid,
  .axiom-grid,
  .archive-grid,
  .sponsor-tier-grid {
    grid-template-columns: repeat(2, minmax(0, 1fr));
  }
}

@media (min-width: 1100px) {
  .doctrine-grid,
  .archive-grid {
    grid-template-columns: repeat(3, minmax(0, 1fr));
  }
}

.doctrine-card,
.axiom-card,
.archive-card,
.sponsor-tier-card,
.manifesto-card,
.taxonomy-panel {
  background: var(--bg-card);
  border: 1px solid var(--border-color);
  border-radius: var(--border-radius-md);
  padding: 1.25rem;
  box-shadow: var(--shadow-sm);
}

.doctrine-card {
  min-height: 170px;
}

.doctrine-card .number {
  display: inline-grid;
  place-items: center;
  width: 2.2rem;
  height: 2.2rem;
  border: 1px solid var(--border-light);
  color: var(--brand-light);
  font-family: var(--font-title);
  font-weight: 800;
  margin-block-end: 1rem;
}

.doctrine-card h3,
.archive-card h3,
.axiom-card h3,
.manifesto-card h3 {
  font-size: 1.15rem;
  margin-block-end: 0.65rem;
}

.doctrine-card p,
.archive-card p,
.axiom-card p,
.manifesto-card p,
.taxonomy-panel p {
  font-size: 0.94rem;
  margin-block-end: 0;
}

.axiom-card {
  border-left: 3px solid var(--brand-color);
}

.axiom-card.critical {
  border-left-color: var(--signal-red);
}

.taxonomy-panel {
  background:
    linear-gradient(135deg, hsl(24 8% 15% / 0.92), hsl(0 100% 43% / 0.08)),
    var(--bg-card);
}

.taxonomy-list {
  list-style: none;
  display: grid;
  gap: 0.7rem;
  margin-block-start: 1rem;
}

.taxonomy-list li {
  display: grid;
  grid-template-columns: 9rem 1fr;
  gap: 0.75rem;
  padding-block: 0.7rem;
  border-top: 1px solid var(--border-color);
  color: var(--text-muted);
}

.taxonomy-list strong {
  color: var(--text-light);
  font-family: var(--font-title);
}

@media (max-width: 640px) {
  .taxonomy-list li {
    grid-template-columns: 1fr;
    gap: 0.2rem;
  }
}

.magazine-panel {
  display: grid;
  /* minmax(0, 1fr): sin esto la columna toma el ancho MINIMO DE CONTENIDO de lo que
     lleva adentro. La tabla de planes declara min-width:640px, asi que la columna
     medía 640px dentro de una pantalla de 360 y las columnas de USD 290 y USD 390/890
     quedaban fuera, sin forma de llegar: el body tiene overflow-x:hidden y el div
     contenedor tambien medía 640, o sea que tampoco desplazaba. Con esta linea la
     tabla recupera su propio desplazamiento horizontal. La regla de 900px de abajo
     sigue mandando en escritorio. */
  grid-template-columns: minmax(0, 1fr);
  gap: var(--spacing-md);
  align-items: center;
  background:
    linear-gradient(135deg, hsl(24 9% 12% / 0.88), hsl(46 100% 44% / 0.08)),
    var(--bg-card);
  border: 1px solid var(--border-light);
  border-radius: var(--border-radius-lg);
  padding: clamp(1rem, 3vw, 2rem);
  box-shadow: var(--shadow-lg);
}

@media (min-width: 900px) {
  .magazine-panel {
    grid-template-columns: minmax(240px, 0.74fr) 1.26fr;
  }
}

.magazine-cover {
  position: relative;
  overflow: hidden;
  aspect-ratio: 3 / 4;
  border-radius: var(--border-radius-sm);
  border: 1px solid hsl(37 24% 94% / 0.16);
  background: var(--bg-dark);
  box-shadow: 0 28px 60px rgba(0,0,0,0.45);
}

.magazine-cover img {
  width: 100%;
  height: 100%;
  object-fit: cover;
  display: block;
}

.magazine-cover-label {
  position: absolute;
  left: 0.8rem;
  right: 0.8rem;
  bottom: 0.8rem;
  padding: 0.75rem;
  background: hsl(24 11% 5% / 0.84);
  border: 1px solid hsl(37 24% 94% / 0.16);
  color: var(--text-light);
  font-family: var(--font-title);
  font-weight: 800;
  -webkit-backdrop-filter: blur(10px);
  backdrop-filter: blur(10px);
}

.blog-magazine-cta {
  margin-block: 1.5rem var(--spacing-md);
}

@media (min-width: 900px) {
  .blog-magazine-cta {
    grid-template-columns: minmax(180px, 0.34fr) 1fr;
  }
}

.value-list {
  list-style: none;
  display: grid;
  gap: 0.72rem;
  margin-block: 1.25rem;
}

.value-list li {
  display: flex;
  gap: 0.65rem;
  align-items: flex-start;
  color: var(--text-muted);
}

.value-list li::before {
  content: "";
  width: 0.48rem;
  height: 0.48rem;
  margin-top: 0.55rem;
  background: var(--signal-red);
  flex: 0 0 auto;
}

.archive-card {
  display: flex;
  flex-direction: column;
  min-height: 210px;
}

.archive-card .post-card-category {
  position: static;
  width: fit-content;
  margin-block-end: 0.9rem;
}

.archive-card a {
  margin-top: auto;
  font-family: var(--font-title);
  font-weight: 800;
}

.sponsor-card-image {
  display: grid;
  place-items: center;
  aspect-ratio: 4 / 5;
  margin-block-end: 1rem;
  overflow: hidden;
  border: 1px solid hsl(37 24% 94% / 0.14);
  border-radius: var(--border-radius-sm);
  background: var(--bg-darkest);
}

.sponsor-card-image-wide {
  aspect-ratio: 16 / 10;
}

.sponsor-card-image img {
  width: 100%;
  height: 100%;
  display: block;
  object-fit: contain;
}

.manifesto-quote {
  font-family: var(--font-title);
  font-size: clamp(1.7rem, 4vw, 3.4rem);
  line-height: 1.08;
  color: var(--text-light);
  max-width: 900px;
}

.manifesto-quote em {
  color: var(--brand-light);
  font-style: normal;
}

.commercial-rule {
  border: 1px solid var(--border-light);
  background:
    linear-gradient(135deg, hsl(46 100% 44% / 0.12), hsl(0 100% 43% / 0.08)),
    var(--bg-card);
  padding: 1.4rem;
  border-radius: var(--border-radius-md);
}

/* ==========================================================================
   BUTTONS & COMMON COMPONENTS
   ========================================================================== */
.btn {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  padding: 0.8rem 1.8rem;
  border-radius: var(--border-radius-sm);
  font-family: var(--font-title);
  font-weight: 600;
  font-size: 1rem;
  cursor: pointer;
  transition: all var(--transition-normal);
  border: none;
  outline: none;
}

.btn-primary {
  background-color: var(--brand-color);
  color: hsl(0 0% 8%);
  box-shadow: 0 4px 14px var(--brand-glow);
}

.btn-primary:hover {
  background-color: var(--brand-light);
  transform: translateY(-2px);
  box-shadow: 0 6px 20px var(--brand-glow);
}

.btn:disabled {
  cursor: not-allowed;
  opacity: 0.6;
  box-shadow: none;
  transform: none;
}
.btn-primary:disabled:hover { background-color: var(--brand-color); transform: none; }

.btn-secondary {
  background-color: transparent;
  color: var(--text-light);
  /* border-light (dorado tenue) en vez de border-color: sobre fondos oscuros el gris 20%
     daba 1.5:1 y el boton casi no tenia contorno. En secciones paper lo pisa su override. */
  border: 1px solid var(--border-light);
}

/* EL SECUNDARIO DEL HERO NECESITA CUERPO. En el resto del sitio el botón secundario es
   transparente con un borde tenue y funciona, porque vive sobre un fondo plano. En el hero
   de la portada vive sobre una FOTO: el fondo transparente lo deja competir contra el
   pelaje del perro y el borde dorado se pierde en la parte clara del atardecer. El dueño lo
   miró en el celular y dijo que "Leer la revista está como escondido".
   Con un velo oscuro detrás y el borde de marca se despega de la imagen, y sigue siendo
   claramente el secundario frente al amarillo sólido de "Buscar un criador". */
.editorial-hero-inner .btn-secondary {
  background-color: hsl(24 11% 5% / 0.62);
  -webkit-backdrop-filter: blur(6px);
  backdrop-filter: blur(6px);
  border-color: var(--brand-color);
}
.editorial-hero-inner .btn-secondary:hover {
  background-color: hsl(24 11% 5% / 0.85);
}

.btn-secondary:hover {
  background-color: var(--bg-dark);
  border-color: var(--brand-color);
  transform: translateY(-2px);
}

/* Foco visible para navegación por teclado (accesibilidad WCAG 2.4.7) */
.btn:focus-visible,
a:focus-visible,
button:focus-visible,
[tabindex]:focus-visible,
summary:focus-visible {
  outline: 2px solid var(--brand-light);
  outline-offset: 3px;
  border-radius: var(--border-radius-sm);
}

/* Acordeones <details>/<summary> (FAQ de revista, paneles, asociaciones...):
   sin esto se renderizaban con el default del navegador — summaries de ~26px
   pegados entre sí, por debajo del objetivo táctil en móvil. */
details {
  border: 1px solid var(--border-color);
  border-radius: var(--border-radius-sm);
  background: var(--bg-card);
  padding: 0 0.9rem;
  margin-bottom: 0.6rem;
}
details > summary {
  cursor: pointer;
  padding: 0.7rem 0;
  min-height: 44px;
  display: flex;
  align-items: center;
  gap: 0.5rem;
  font-weight: 600;
}
details[open] > summary {
  border-bottom: 1px solid var(--border-color);
  margin-bottom: 0.6rem;
}
details > *:not(summary) {
  margin-bottom: 0.7rem;
}

/* Enlaces de listas del pie: alto táctil decente en móvil (antes ~23px con 10px de aire) */
@media (max-width: 820px) {
  footer li a {
    display: inline-block;
    padding-block: 0.3rem;
  }
}

/* Bloque de Preguntas frecuentes (GEO/AEO — respuestas extraíbles por IA) */
.faq-llm .faq-item {
  padding-block: 1rem;
  border-top: 1px solid var(--border-color);
}
.faq-llm .faq-item h3 {
  font-size: 1.12rem;
  margin-block-end: 0.4rem;
}
.surface-paper .faq-llm .faq-item {
  border-top-color: var(--border-paper);
}

/* Ranking: forzar tarjetas de país a superficie CLARA para que las tablas
   (texto oscuro) sean legibles; el id gana especificidad al invert de paper. */
#con-ranking .doctrine-card,
#sin-ranking .doctrine-card {
  background: var(--bg-paper);
  border-color: var(--border-paper);
  color: var(--text-on-paper);
  box-shadow: var(--shadow-sm);
}
#con-ranking .doctrine-card h3,
#sin-ranking .doctrine-card h3 {
  color: var(--text-on-paper);
}
#con-ranking .doctrine-card p,
#sin-ranking .doctrine-card p {
  color: var(--text-on-paper-muted);
}
#con-ranking .doctrine-card .editorial-kicker,
#sin-ranking .doctrine-card .editorial-kicker {
  color: var(--brand-dark);
}

/* Section Header styling */
.text-center {
  text-align: center;
}

.section-header {
  max-inline-size: 700px;
  margin-inline: auto;
  margin-block-end: var(--spacing-md);
}

.section-desc {
  font-size: 1.1rem;
}

/* Badges */
.section-badge, .hero-badge {
  display: inline-block;
  font-family: var(--font-title);
  font-weight: 700;
  font-size: 0.8rem;
  text-transform: uppercase;
  letter-spacing: 0.12em;
  color: var(--brand-light);
  margin-block-end: 0.75rem;
  background: hsl(46 100% 44% / 0.12);
  padding: 0.25rem 0.75rem;
  border-radius: 4px;
  border: 1px solid hsl(46 100% 44% / 0.2);
}

.accent-text {
  color: var(--brand-color);
}

/* Media Containers */
.media-container {
  position: relative;
  border-radius: var(--border-radius-md);
  overflow: hidden;
  box-shadow: var(--shadow-md);
  border: 1px solid var(--border-color);
  background: var(--bg-dark);
}

.media-container img {
  display: block;
  width: 100%;
  height: auto;
  object-fit: cover;
  transition: transform var(--transition-slow);
}

.media-container:hover img {
  transform: scale(1.02);
}

.media-container figcaption {
  position: absolute;
  bottom: 0;
  left: 0;
  right: 0;
  padding: 0.85rem;
  background: linear-gradient(transparent, rgba(0, 0, 0, 0.95));
  font-size: 0.8rem;
  color: var(--text-muted);
  -webkit-backdrop-filter: blur(2px);
  backdrop-filter: blur(2px);
  border-top: 1px solid var(--border-color);
}

/* Grid system */
.grid-layout {
  display: grid;
  gap: var(--spacing-md);
}

@media (min-width: 992px) {
  .grid-layout.col-2 {
    grid-template-columns: 1fr 1fr;
    align-items: center;
    gap: var(--spacing-lg);
  }
  .grid-layout.col-3 {
    grid-template-columns: repeat(3, 1fr);
    gap: var(--spacing-md);
  }
}

/* ==========================================================================
   HEADER & NAVIGATION
   ========================================================================== */
header {
  position: sticky;
  top: 0;
  z-index: 1000;
  background: rgb(9, 6, 7); /* igual al fondo del banner: la imagen se funde, no se ve "pegada" */
  border-bottom: 1px solid var(--border-color);
  min-height: 60px;
  display: flex;
  align-items: center;
  transition: box-shadow var(--transition-normal);
}

header.shrunk {
  box-shadow: 0 4px 30px rgba(0, 0, 0, 0.5);
}

/* Al hacer scroll, el banner se achica para no comer pantalla */
header.shrunk .logo img {
  height: 46px;
}
#main-header.shrunk {
  padding-block: 0.25rem;
}

.header-container {
  display: flex;
  justify-content: space-between;
  align-items: center;
  width: 100%;
  max-width: var(--container-width);
  margin-inline: auto;
  padding-inline: var(--spacing-sm);
}

@media (min-width: 768px) {
  .header-container {
    padding-inline: var(--spacing-md);
  }
}

.logo {
  display: flex;
  align-items: center;
  padding: 0;
}

.logo img {
  height: 52px;
  width: auto;
  max-width: 80vw;
  display: block;
  transition: height var(--transition-normal);
}

/* Una sola fila: banner a la izquierda, menu a la derecha (usa el costado vacio).
   En pantallas anchas el banner crece; el menu queda alineado a la derecha. */
@media (min-width: 1100px) {
  .logo img {
    height: 80px;
  }
}

@media (min-width: 1400px) {
  .logo img {
    height: 96px;
  }
  nav ul {
    gap: 1.5rem;
  }
}

/* Legacy icon (por si alguna pagina vieja lo usa) */
.logo-icon {
  display: inline-grid;
  place-items: center;
  width: 2.1rem;
  height: 2.1rem;
  border: 1px solid var(--border-light);
  color: var(--brand-light);
  font-size: 0.72rem;
  letter-spacing: 0.08em;
  line-height: 1;
}

nav ul {
  display: flex;
  list-style: none;
  gap: 1.25rem;
}

nav a {
  color: var(--text-muted);
  font-family: var(--font-title);
  font-weight: 600;
  font-size: 0.95rem;
  padding: 0.4rem;
  position: relative;
}

nav a:hover, nav a.active {
  color: var(--brand-light);
}

nav a::after {
  content: '';
  position: absolute;
  left: 0.4rem;
  right: 0.4rem;
  bottom: 0;
  height: 2px;
  background-color: var(--brand-color);
  transform: scaleX(0);
  transform-origin: right;
  transition: transform var(--transition-normal);
}

nav a:hover::after, nav a.active::after {
  transform: scaleX(1);
  transform-origin: left;
}

/* ==========================================================================
   NAV EN SILOS: pilares con dropdown (Raza / Directorio / Comunidad) + CTA
   ========================================================================== */
.nav-group { position: relative; }

.nav-pilar {
  appearance: none;
  background: transparent;
  border: none;
  cursor: pointer;
  color: var(--text-muted);
  font-family: var(--font-title);
  font-weight: 600;
  font-size: 0.95rem;
  padding: 0.4rem;
  display: inline-flex;
  align-items: center;
  gap: 0.35rem;
  line-height: 1;
}
.nav-pilar:hover,
.nav-pilar.active,
.nav-group:hover .nav-pilar,
.nav-group:focus-within .nav-pilar { color: var(--brand-light); }

.nav-pilar::after {
  content: '';
  width: 0.4em;
  height: 0.4em;
  border-right: 2px solid currentColor;
  border-bottom: 2px solid currentColor;
  transform: translateY(-0.15em) rotate(45deg);
  transition: transform var(--transition-normal);
  opacity: 0.75;
}
.nav-pilar[aria-expanded="true"]::after { transform: translateY(0.05em) rotate(-135deg); }

.nav-sub {
  list-style: none;
  position: absolute;
  top: 100%;
  left: 0;
  min-width: 210px;
  margin: 0;
  padding: 0.4rem;
  display: none;
  flex-direction: column;
  gap: 0.1rem;
  background: var(--bg-darker);
  border: 1px solid var(--border-color);
  border-radius: 8px;
  box-shadow: var(--shadow-lg);
  z-index: 1002;
}
.nav-group:hover > .nav-sub,
.nav-group:focus-within > .nav-sub,
.nav-pilar[aria-expanded="true"] + .nav-sub { display: flex; }

.nav-sub li { width: 100%; }
.nav-sub a {
  display: block;
  padding: 0.55rem 0.7rem;
  white-space: nowrap;
  font-size: 0.9rem;
  border-radius: 5px;
}
/* En el drawer móvil (280px) los labels largos deben poder envolver:
   con nowrap, "Ejemplares históricos" entraba con ~5px de aire y cualquier
   label nuevo apenas más largo se cortaba. */
@media (max-width: 820px) {
  .nav-sub a { white-space: normal; }
}
.nav-sub a:hover,
.nav-sub a:focus-visible { background: var(--bg-dark); color: var(--brand-light); }
.nav-sub a::after { display: none; }

/* CTA "Anunciar": dorado con texto oscuro (contraste ~10:1, texto blanco fallaría) */
.nav-cta-item { display: flex; align-items: center; }
.nav-cta {
  display: inline-block;
  background: var(--brand-color);
  color: var(--bg-darkest);
  padding: 0.5rem 1.05rem;
  border-radius: 999px;
  font-family: var(--font-title);
  font-weight: 700;
  font-size: 0.9rem;
  line-height: 1;
  transition: background var(--transition-normal);
}
.nav-cta:hover,
.nav-cta:focus-visible { background: var(--brand-light); color: var(--bg-darkest); }
.nav-cta::after { display: none; }

/* Dropdown en mobile (dentro del panel off-canvas): acordeón, no hover */
@media (max-width: 820px) {
  nav#nav-menu { overflow-y: auto; }
  .nav-group { width: 100%; }
  .nav-pilar {
    width: 100%;
    justify-content: space-between;
    font-size: 1.2rem;
    padding: 0.55rem 0;
    min-height: 44px;
  }
  .nav-sub {
    position: static;
    display: none;
    min-width: 0;
    margin: 0;
    padding: 0.2rem 0 0.4rem 0.9rem;
    background: transparent;
    border: none;
    border-radius: 0;
    box-shadow: none;
    gap: 0.2rem;
  }
  .nav-group:hover > .nav-sub,
  .nav-group:focus-within > .nav-sub { display: none; }
  .nav-pilar[aria-expanded="true"] + .nav-sub { display: flex; }
  .nav-sub a { font-size: 1.05rem; padding: 0.5rem 0.4rem; min-height: 40px; }
  .nav-cta-item { margin-top: 0.6rem; }
  .nav-cta { font-size: 1.05rem; padding: 0.6rem 1.2rem; }
}

/* Tarjetas de criadero/servicio que llevan a una ficha: clickeables */
.criadero-card-chico:has(a[href*="perfil.php"]),
.criadero-card-grande:has(a[href*="perfil.php"]) { cursor: pointer; }

/* Banderita de país (imagen real flagcdn, no emoji) */
.pais-flag {
  width: 24px;
  height: 18px;
  border-radius: 2px;
  vertical-align: middle;
  margin-right: 0.45rem;
  border: 1px solid var(--border-color);
  object-fit: cover;
  display: inline-block;
}

/* Botón flotante de WhatsApp (en todo el sitio) */
.wa-float {
  position: fixed;
  right: 1rem;
  bottom: 1rem;
  z-index: 90;
  width: 56px;
  height: 56px;
  border-radius: 50%;
  background: #25d366;
  color: #fff;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  box-shadow: 0 4px 16px rgba(0, 0, 0, 0.45);
  transition: transform var(--transition-normal);
}
.wa-float:hover,
.wa-float:focus-visible { transform: scale(1.08); color: #fff; }
@media (max-width: 820px) {
  /* Elevarlo SOLO cuando la barra de anuncio inferior existe de verdad (:has):
     antes quedaba flotando a 4.3rem siempre, incluso sin barra (p.ej. 768-820px,
     donde la barra nunca se inyecta). */
  body:has(#mobile-ad-anchor:not([hidden])) .wa-float { bottom: 4.3rem; }
}

/* Mobile Toggle menu button */
/* LA PALABRA "MENÚ" DEBAJO DEL ÍCONO.
   El dueño lo dijo así: "se ven solo las 3 rayas pero la gente no sabe qué está ahí".
   Y ahí adentro está TODO: Criaderos —el producto que se cobra—, el blog, salud,
   estándar. Tres rayas sin texto son un ícono que hay que saber interpretar; la palabra
   no se interpreta, se lee. Es el arreglo más barato para que la navegación exista
   para quien no la conoce. */
.mobile-toggle-texto {
  font-family: var(--font-title);
  font-size: 0.6rem;
  font-weight: 700;
  letter-spacing: 0.06em;
  text-transform: uppercase;
  color: var(--text-light);
  line-height: 1;
  margin-block-start: 2px;
}
/* En escritorio no se ve: ahí el menú está desplegado y el botón no existe. */
@media (min-width: 992px) {
  .mobile-toggle-texto { display: none; }
}

.mobile-toggle {
  display: none;
  background: transparent;
  border: none;
  cursor: pointer;
  flex-direction: column;
  gap: 6px;
  z-index: 1001;
  padding: 0.25rem;
  /* Objetivo táctil mínimo 44x44 (antes ~32x26): es EL control de navegación en móvil.
     Las barras quedan centradas; sin cambio visual. */
  min-width: 44px;
  min-height: 44px;
  align-items: center;
  justify-content: center;
}

.mobile-toggle .bar {
  width: 24px;
  height: 2px;
  background-color: var(--text-light);
  transition: var(--transition-normal);
}

@media (max-width: 820px) {
  .mobile-toggle {
    display: flex;
  }

  /* El cajón lateral es SOLO el menú del encabezado.
     Este selector decía `nav` a secas y en móvil se llevaba puesto cualquier <nav>
     de la página: los chips de país de cachorros, el índice de ayuda-criadero, las
     migas de pan del perfil, las pestañas del panel y los saltos del tarifario
     quedaban en position:fixed con right:-100%, es decir, fuera de la pantalla.
     El visitante de celular —que es la mayoría— sencillamente no los veía. */
  nav#nav-menu {
    position: fixed;
    top: 0;
    right: -100%;
    width: 280px;
    height: 100dvh;
    background: var(--bg-darker);
    border-left: 1px solid var(--border-color);
    padding: var(--spacing-lg) var(--spacing-md);
    transition: right var(--transition-normal);
    box-shadow: var(--shadow-lg);
  }
  
  nav#nav-menu.open {
    right: 0;
    z-index: 1000;
  }

  .nav-backdrop {
    position: fixed;
    inset: 0;
    background: rgba(0, 0, 0, 0.55);
    z-index: 999;
    opacity: 0;
    pointer-events: none;
    transition: opacity var(--transition-normal);
  }
  .nav-backdrop.show {
    opacity: 1;
    pointer-events: auto;
  }

  /* Misma razón: en columna y a 1.2rem va el menú del encabezado, no las pestañas
     ni los chips de filtro, que tienen su propio diseño horizontal. */
  nav#nav-menu ul {
    flex-direction: column;
    gap: 1.5rem;
  }

  nav#nav-menu a {
    font-size: 1.2rem;
    display: block;
  }

  .mobile-toggle[aria-expanded="true"] .bar:nth-child(1) {
    transform: translateY(8px) rotate(45deg);
  }
  .mobile-toggle[aria-expanded="true"] .bar:nth-child(2) {
    opacity: 0;
  }
  .mobile-toggle[aria-expanded="true"] .bar:nth-child(3) {
    transform: translateY(-8px) rotate(-45deg);
  }
}

/* Scroll Animation for Header */
@media (prefers-reduced-motion: no-preference) {
  @supports ((animation-timeline: scroll()) and (animation-range: 0% 100%)) {
    @keyframes header-shrink {
      to {
        box-shadow: 0 4px 30px rgba(0, 0, 0, 0.5);
      }
    }
    #main-header {
      animation: header-shrink auto linear both;
      animation-timeline: scroll(block root);
      animation-range: 0px 100px;
    }
  }
}

/* Con header sticky el espacio ya queda reservado en el flujo: sin padding-hack */
main {
  padding-top: 0;
}

/* ==========================================================================
   HOMEPAGE SPECIFICS
   ========================================================================== */
.home-hero {
  position: relative;
  padding-block: var(--spacing-lg);
  display: flex;
  align-items: center;
  background-image: linear-gradient(135deg, var(--bg-darkest) 40%, var(--bg-darker) 100%);
}

.home-hero-content {
  max-width: 650px;
}

.home-hero h1 {
  margin-block-end: var(--spacing-sm);
  line-height: 1.15;
}

.home-hero p {
  font-size: 1.15rem;
  margin-block-end: var(--spacing-md);
}

.home-hero-actions {
  display: flex;
  gap: var(--spacing-sm);
  flex-wrap: wrap;
}

/* Latest Blog Posts section */
.blog-preview-grid {
  display: grid;
  gap: 1.5rem;
  grid-template-columns: repeat(auto-fill, minmax(320px, 1fr));
}

.post-card {
  background: var(--bg-card);
  border: 1px solid var(--border-color);
  border-radius: var(--border-radius-md);
  overflow: hidden;
  display: flex;
  flex-direction: column;
  transition: all var(--transition-normal);
}

.post-card:hover {
  transform: translateY(-5px);
  border-color: var(--border-light);
  box-shadow: var(--shadow-md);
}

.post-card-img-wrapper {
  position: relative;
  aspect-ratio: 16 / 10;
  overflow: hidden;
}

.post-card-img-wrapper img {
  width: 100%;
  height: 100%;
  object-fit: cover;
  transition: transform var(--transition-slow);
}

.post-card:hover .post-card-img-wrapper img {
  transform: scale(1.03);
}

.post-card-category {
  position: absolute;
  top: 12px;
  left: 12px;
  background: var(--brand-color);
  /* 12 px sobre dorado: con --text-light daba 1.85:1 y no califica como texto grande. */
  color: hsl(0 0% 8%);
  font-size: 0.75rem;
  font-family: var(--font-title);
  font-weight: 700;
  text-transform: uppercase;
  padding: 0.25rem 0.6rem;
  border-radius: 4px;
}

.post-card-content {
  padding: 1.25rem;
  display: flex;
  flex-direction: column;
  flex-grow: 1;
}

.post-card h3 {
  font-size: 1.2rem;
  margin-block-end: 0.75rem;
  line-height: 1.3;
}

.post-card p {
  font-size: 0.9rem;
  color: var(--text-muted);
  margin-block-end: 1.25rem;
  flex-grow: 1;
}

.post-card-footer {
  display: flex;
  justify-content: space-between;
  align-items: center;
  font-size: 0.8rem;
  color: var(--text-dim);
  border-top: 1px solid var(--border-color);
  padding-top: 0.75rem;
}

/* ==========================================================================
   LANDING /REVISTA (GATED PORTADA)
   ========================================================================== */
.revista-landing-grid {
  display: grid;
  /* Mismo motivo que .magazine-panel: la opcion mas larga del <select> de formatos
     ("Leaderboard Home / Sponsor de Seccion - banner 728x90 arriba") fijaba el ancho
     minimo en 616px y arrastraba toda la columna a 682px. En un telefono de 360px el
     formulario donde una marca deja sus datos para pagar se salia 336px: el boton de
     WhatsApp aparecia cortado y "Pedir propuesta" quedaba ilegible. */
  grid-template-columns: minmax(0, 1fr);
  gap: var(--spacing-lg);
  align-items: flex-start;
}

/* Ningun control de formulario puede arrastrar el ancho de su columna. Un <select>
   con opciones largas es el sospechoso habitual. */
.modern-form select,
.modern-form input,
.modern-form textarea { max-width: 100%; }

@media (min-width: 992px) {
  .revista-landing-grid {
    grid-template-columns: 1fr 1.1fr;
  }
}

/* EN EL TELÉFONO, EL FORMULARIO VA PRIMERO. 83% de las visitas entran desde el celular,
   donde esta grilla se apila en una sola columna: título, descripción, la tapa (600x800,
   media pantalla en un teléfono), "por qué vale dejar tus datos", tres viñetas... y recién
   ahí el formulario, a dos o tres pantallas de scroll. Con 20 segundos de permanencia
   media, la mayoría nunca lo veía. Quien llega acá ya venía de tocar "Leer la revista":
   no hay que convencerlo de nuevo, hay que mostrarle dónde anotarse. La tapa y los
   beneficios quedan abajo, que es donde sirven — como refuerzo, no como peaje.
   En escritorio no cambia nada: ahí las dos columnas se ven juntas. */
@media (max-width: 767px) {
  .revista-landing-grid > .gated-form-card { order: -1; }
}

.revista-teaser {
  position: relative;
  border-radius: var(--border-radius-md);
  border: 1px solid var(--border-color);
  background: var(--bg-card);
  padding: var(--spacing-sm);
  box-shadow: var(--shadow-lg);
}

.revista-portada-wrapper {
  position: relative;
  aspect-ratio: 1 / 1.35;
  border-radius: var(--border-radius-sm);
  overflow: hidden;
  box-shadow: 0 8px 30px rgba(0,0,0,0.6);
}

.revista-portada-wrapper img {
  width: 100%;
  height: 100%;
  object-fit: cover;
}

.gated-overlay {
  position: absolute;
  inset: 0;
  background: linear-gradient(to top, var(--bg-darkest) 30%, transparent 100%);
  display: flex;
  flex-direction: column;
  justify-content: flex-end;
  align-items: center;
  padding: var(--spacing-md);
  z-index: 2;
}

.gated-badge {
  background: var(--brand-color);
  color: var(--text-light);
  font-family: var(--font-title);
  font-weight: 700;
  font-size: 0.8rem;
  text-transform: uppercase;
  padding: 0.4rem 0.8rem;
  border-radius: 4px;
  margin-block-end: 0.5rem;
  box-shadow: 0 4px 10px rgba(0,0,0,0.4);
}

/* Gated preview details */
.revista-preview-features {
  margin-top: 1.5rem;
  display: flex;
  flex-direction: column;
  gap: 0.75rem;
}

.feature-line {
  display: flex;
  align-items: center;
  gap: 0.5rem;
  font-size: 0.95rem;
  color: var(--text-muted);
}

.feature-line span.check {
  color: var(--brand-light);
  font-weight: bold;
}

/* ==========================================================================
   FORMS & REGISTRATION
   ========================================================================== */
/* LA TARJETA DONDE UNO SE ANOTA TIENE QUE GRITAR QUE ES LA TARJETA DONDE UNO SE ANOTA.
   Reporte del dueño (18/8): "la gente no entiende cómo inscribirse". Tenía exactamente el
   mismo fondo, borde y sombra que la tarjeta de al lado (la tapa + los beneficios): dos
   cajas grises iguales, ninguna decía cuál era la acción. Ahora lleva el borde dorado de
   la marca, el mismo tratamiento que ya usa la lista de espera de camadas en la portada
   — no es un estilo nuevo, es el que el sitio ya reserva para "acá se deja un dato". */
.gated-form-card {
  background: var(--bg-darkest);
  border: 2px solid var(--brand-color);
  border-radius: var(--border-radius-lg);
  padding: var(--spacing-md);
  box-shadow: 0 0 0 1px var(--brand-glow), var(--shadow-lg);
  -webkit-backdrop-filter: blur(10px);
  backdrop-filter: blur(10px);
}

/* VARIANTE PAPEL — solo para el registro de la revista (pedido del dueño, 18/8: "quizá
   ponerlo en fondo blanco con letras negras"). En un sitio entero oscuro, un bloque claro
   es lo que más salta: el ojo va directo ahí y queda claro dónde se actúa. No se usa blanco
   puro sino el marfil de la marca (--bg-paper), el mismo que ya usan las secciones
   .surface-paper del sitio — así el bloque destaca sin parecer pegado de otra web.
   Va como MODIFICADOR y no como cambio de .gated-form-card, porque esa clase la comparten
   nueve páginas (alta, tarifario, contacto, marketplace...) y no corresponde invertirles
   el color a todas por un pedido sobre la revista. */
.gated-form-card--papel {
  background: var(--bg-paper);
  /* SE REMAPEAN LOS TOKENS, no se pisa regla por regla.
     Primer intento: una lista de selectores con el color correcto. No alcanzó — una
     revisión midió cuatro textos de esta tarjeta en 1,72:1 de contraste (el mínimo
     legible es 4,5:1), o sea gris claro sobre papel claro: ilegibles. Dos motivos:
     .gated-form-card p.form-subtitle tiene más especificidad que el selector del
     modificador y le ganaba, y varios textos traen el color en un style= inline, que
     le gana a cualquier hoja de estilos.
     Redefinir las variables acá adentro resuelve las dos cosas de una: var() se
     resuelve heredando, así que todo lo que dice var(--text-muted) dentro de esta
     tarjeta —venga de donde venga, incluso de un atributo inline o de app.js— toma el
     tono oscuro. Fuera de la tarjeta no cambia nada. */
  --text-muted: var(--text-on-paper-muted);
  --text-dim: var(--text-on-paper-dim);
  --brand-light: var(--brand-on-paper);
  --signal-red: hsl(0 70% 36%);
}
/* app.js pinta este error con un color pensado para fondo oscuro (3,21:1 sobre papel). */
.gated-form-card--papel .field-error { color: hsl(0 70% 36%); }
.gated-form-card--papel h2,
.gated-form-card--papel .registro-pasos li,
.gated-form-card--papel strong {
  color: var(--text-on-paper);
}
.gated-form-card--papel .form-subtitle,
.gated-form-card--papel .form-group label,
.gated-form-card--papel .checkbox-group label,
.gated-form-card--papel p {
  color: var(--text-on-paper-muted);
}
.gated-form-card--papel .form-group input,
.gated-form-card--papel .form-group select,
.gated-form-card--papel .form-group textarea {
  /* background-color, NO el atajo background: el atajo resetea background-repeat a
     "repeat" y background-position a 0 0, y el <select> del país —que dibuja su flecha
     con un background-image— quedaba empapelado de flechitas repetidas en mosaico. */
  background-color: hsl(0 0% 100%);
  border-color: var(--bg-paper-muted);
  color: var(--text-on-paper);
}
.gated-form-card--papel .form-group input::placeholder {
  color: var(--text-on-paper-dim);
}
/* La flecha del select venía dibujada en naranja para fondo oscuro: sobre papel se perdía. */
.gated-form-card--papel .form-group select {
  background-image: url("data:image/svg+xml;utf8,<svg fill='%23444' height='24' viewBox='0 0 24 24' width='24' xmlns='http://www.w3.org/2000/svg'><path d='M7 10l5 5 5-5z'/></svg>");
}
.gated-form-card--papel a { color: var(--brand-on-paper); }

.registro-badge {
  display: inline-block;
  background: var(--brand-color);
  color: hsl(0 0% 5%);
  font-family: var(--font-title);
  font-size: 0.72rem;
  font-weight: 800;
  letter-spacing: 0.06em;
  text-transform: uppercase;
  padding: 0.3rem 0.7rem;
  border-radius: 2rem;
  margin-block-end: 0.7rem;
}

/* Los tres pasos, ANTES de los campos: quien llega tiene que ver el recorrido completo
   antes de decidir si empieza a escribir, no descubrirlo después de apretar el botón. */
.registro-pasos {
  list-style: none;
  margin: 0 0 1rem;
  padding: 0;
  display: flex;
  flex-direction: column;
  gap: 0.5rem;
}

.registro-pasos li {
  display: flex;
  align-items: center;
  gap: 0.6rem;
  font-size: 0.92rem;
  color: var(--text-light);
}

.registro-paso-num {
  flex: none;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 1.6rem;
  height: 1.6rem;
  border-radius: 50%;
  background: var(--brand-color);
  color: hsl(0 0% 5%);
  font-family: var(--font-title);
  font-weight: 800;
  font-size: 0.85rem;
}

@media (min-width: 768px) {
  .gated-form-card {
    padding: var(--spacing-md) 2.5rem;
  }
}

.gated-form-card h2 {
  margin-block-end: 0.5rem;
}

.gated-form-card p.form-subtitle {
  font-size: 0.95rem;
  color: var(--text-muted);
  margin-block-end: 1.5rem;
}

.modern-form {
  display: flex;
  flex-direction: column;
  gap: 1.25rem;
}

.form-group {
  display: flex;
  flex-direction: column;
  gap: 0.4rem;
}

.form-group label {
  font-family: var(--font-title);
  font-weight: 600;
  font-size: 0.9rem;
  color: var(--text-muted);
}

.form-group input, .form-group select, .form-group textarea {
  background: var(--bg-dark);
  border: 1px solid var(--border-color);
  padding: 0.8rem 1rem;
  border-radius: var(--border-radius-sm);
  color: var(--text-light);
  font-family: var(--font-body);
  font-size: 16px; /* 16px evita el zoom automatico de iOS al enfocar el input */
  transition: all var(--transition-fast);
}

.form-group input:focus, .form-group select:focus, .form-group textarea:focus {
  border-color: var(--brand-color);
  box-shadow: 0 0 0 3px var(--brand-glow);
  outline: none;
}

.form-group select {
  appearance: none;
  background-image: url("data:image/svg+xml;utf8,<svg fill='orange' height='24' viewBox='0 0 24 24' width='24' xmlns='http://www.w3.org/2000/svg'><path d='M7 10l5 5 5-5z'/></svg>");
  background-repeat: no-repeat;
  background-position: right 10px center;
  padding-right: 35px;
}

/* Placeholder legible sobre inputs oscuros: el gris default del navegador (~#757575)
   quedaba en ~4.2:1 sobre bg-darkest, justo debajo del minimo WCAG (4.5:1). */
input::placeholder,
textarea::placeholder {
  color: var(--text-dim);
  opacity: 1; /* Firefox aplica opacidad propia al placeholder */
}

/* User inputs validation via CSS.
   Antes la única señal era el color del borde (rojo/verde): un daltónico protán o
   deután no distingue esos dos bordes, y el borde inválido contra el borde normal
   apenas llegaba a 2.63:1 de contraste. Se agrega una FORMA (una X o un check, como
   fondo del propio input) que no depende de percibir el color, y el mensaje de texto
   lo agrega app.js (ver initFormValidationMessages). */
.form-group input:invalid:not(:placeholder-shown),
.form-group select:invalid:not(:placeholder-shown) {
  border-color: hsl(0 75% 50%);
  box-shadow: 0 0 0 3px hsl(0 75% 50% / 0.15);
  background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='none' stroke='%23dd3333' stroke-width='2' stroke-linecap='round'%3E%3Cpath d='M4 4l8 8M12 4l-8 8'/%3E%3C/svg%3E");
  background-repeat: no-repeat;
  background-position: right 0.75rem center;
  background-size: 1rem;
  padding-right: 2.25rem;
}

.form-group input:user-valid:not(:placeholder-shown) {
  border-color: hsl(140 75% 40%);
  background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='none' stroke='%2333aa55' stroke-width='2' stroke-linecap='round'%3E%3Cpath d='M3 8l4 4 6-8'/%3E%3C/svg%3E");
  background-repeat: no-repeat;
  background-position: right 0.75rem center;
  background-size: 1rem;
  padding-right: 2.25rem;
}

/* Mensaje de error accesible que agrega initFormValidationMessages (app.js). */
.field-error {
  display: block;
  margin-top: 0.3rem;
  font-size: 0.82rem;
  color: hsl(0 75% 60%);
}
.field-error::before {
  content: "⚠ ";
}

/* Consent checkboxes */
.checkbox-group {
  display: flex;
  gap: 0.75rem;
  align-items: flex-start;
}

.checkbox-group input[type="checkbox"] {
  /* 24 px es el mínimo de WCAG 2.5.8; con 18 la casilla del consentimiento
     legal era el blanco más chico del formulario. */
  width: 24px;
  height: 24px;
  accent-color: var(--brand-color);
  margin-top: 3px;
  cursor: pointer;
}

.checkbox-group label {
  font-size: 0.8rem;
  color: var(--text-muted);
  line-height: 1.4;
  cursor: pointer;
}

/* ==========================================================================
   PÁGINA /REVISTA/ACCESO (THE FLIPBOOK CONTAINER)
   ========================================================================== */
.magazine-container {
  display: flex;
  flex-direction: column;
  gap: var(--spacing-md);
  margin-block-end: var(--spacing-lg);
}

.magazine-viewer {
  position: relative;
  background: #111;
  border-radius: var(--border-radius-md);
  border: 1px solid var(--border-color);
  aspect-ratio: 16 / 10;
  box-shadow: var(--shadow-lg);
  overflow: hidden;
  display: flex;
  align-items: center;
  justify-content: center;
}

@media (max-width: 768px) {
  .magazine-viewer {
    aspect-ratio: 1 / 1.2;
  }
}

.magazine-mock-flipbook {
  position: relative;
  width: 80%;
  height: 80%;
  display: grid;
  grid-template-columns: 1fr 1fr;
  perspective: 1500px;
  box-shadow: 0 20px 50px rgba(0,0,0,0.8);
}

@media (max-width: 768px) {
  .magazine-mock-flipbook {
    grid-template-columns: 1fr;
    width: 90%;
    height: 90%;
  }
}

.flipbook-page-left, .flipbook-page-right {
  background-size: cover;
  background-position: center;
  position: relative;
  border: 1px solid rgba(255,255,255,0.05);
}

.flipbook-page-left {
  background-image: url('images/hero_rottweiler.webp');
  border-radius: 4px 0 0 4px;
}

.flipbook-page-right {
  background-image: url('images/history_rottweiler.webp');
  border-radius: 0 4px 4px 0;
  box-shadow: inset 10px 0 20px rgba(0,0,0,0.3);
}

@media (max-width: 768px) {
  .flipbook-page-left {
    display: none;
  }
  .flipbook-page-right {
    border-radius: 4px;
  }
}

.flipbook-overlay-controls {
  position: absolute;
  bottom: 0;
  left: 0;
  right: 0;
  background: linear-gradient(transparent, rgba(0,0,0,0.9));
  padding: 1rem;
  display: flex;
  justify-content: space-between;
  align-items: center;
  z-index: 10;
}

.flipbook-btn {
  background: rgba(255,255,255,0.1);
  color: white;
  border: 1px solid rgba(255,255,255,0.2);
  width: 36px;
  height: 36px;
  border-radius: 50%;
  cursor: pointer;
  display: grid;
  place-content: center;
  transition: all var(--transition-fast);
}

.flipbook-btn:hover {
  background: var(--brand-color);
  border-color: var(--brand-color);
}

.flipbook-page-num {
  font-family: var(--font-title);
  font-size: 0.9rem;
  color: var(--text-muted);
}

.magazine-actions-bar {
  display: flex;
  flex-wrap: wrap;
  gap: var(--spacing-sm);
  justify-content: center;
  border-bottom: 1px solid var(--border-color);
  padding-block-end: var(--spacing-sm);
}

/* ==========================================================================
   BLOG INDEX & FILTER SYSTEM
   ========================================================================== */
.blog-filters {
  display: flex;
  flex-wrap: wrap;
  gap: 0.5rem;
  margin-block-end: var(--spacing-md);
  border-bottom: 1px solid var(--border-color);
  padding-block-end: 1rem;
}

.filter-btn {
  background: transparent;
  border: 1px solid var(--border-color);
  color: var(--text-muted);
  padding: 0.5rem 1rem;
  border-radius: 30px;
  font-family: var(--font-title);
  font-weight: 600;
  font-size: 0.9rem;
  cursor: pointer;
  transition: all var(--transition-fast);
}

.filter-btn:hover, .filter-btn.active {
  background: var(--brand-color);
  color: var(--text-light);
  border-color: var(--brand-color);
}

/* ==========================================================================
   BLOG POST DETAIL (READING LAYOUT)
   ========================================================================== */
.blog-post-wrapper {
  display: grid;
  gap: var(--spacing-lg);
  align-items: flex-start;
}

@media (min-width: 992px) {
  .blog-post-wrapper {
    grid-template-columns: 2.3fr 1fr;
  }
}

.blog-post-content {
  background: var(--bg-card);
  border: 1px solid var(--border-color);
  border-radius: var(--border-radius-lg);
  padding: var(--spacing-md);
  box-shadow: var(--shadow-sm);
  /* min-width: 0 — SIN esto, el ancho mínimo de una <table> estira la grilla entera
     (.blog-post-wrapper es grid y los items nacen con min-width:auto) y en celular
     la nota entera queda empujada fuera de pantalla. Medido en vivo el 22/8/2026:
     scrollWidth 670px en viewport de 390. Con esto la tabla scrollea en su caja. */
  min-width: 0;
}

@media (min-width: 768px) {
  .blog-post-content {
    padding: var(--spacing-lg);
  }
}

.post-header {
  margin-block-end: var(--spacing-md);
  /* El selector de elemento `header` (arriba) alcanza tambien al <header> del titulo
     de cada nota, y le mete display:flex + position:sticky. Consecuencia medida en
     un navegador real a 360px: el titulo y la firma quedaban uno al lado del otro en
     dos columnas, el ancho minimo de la nota subia a 372px y 38 de las 68 notas se
     cortaban, sin poder deslizar. Ademas el bloque del titulo quedaba pegajoso, con
     fondo negro y z-index 1000: al bajar tapaba el texto del articulo.
     Se resetea aca y no se toca la regla general, que si la necesita el encabezado
     del sitio; panel.php tambien usa <header> con otras clases. */
  display: block;
  position: static;
  min-height: 0;
  background: none;
  border-bottom: 0;
  z-index: auto;
  align-items: initial;
}

.post-meta {
  display: flex;
  gap: 1rem;
  font-size: 0.85rem;
  color: var(--text-dim);
  margin-block-end: 0.75rem;
  flex-wrap: wrap;
}

.post-body {
  font-size: 1.05rem;
  line-height: 1.75;
  color: hsl(220 10% 85%);
}

.post-body p {
  margin-block-end: 1.5rem;
}

.post-body h2 {
  font-size: 1.6rem;
  margin-block-start: 2rem;
  margin-block-end: 1rem;
  border-left: 4px solid var(--brand-color);
  padding-left: 0.75rem;
}

.post-body h3 {
  font-size: 1.25rem;
  margin-block-start: 1.5rem;
  margin-block-end: 0.75rem;
  color: var(--brand-light);
}

.post-body blockquote {
  background: var(--bg-darker);
  border-left: 4px solid var(--brand-light);
  padding: 1rem 1.5rem;
  border-radius: 0 var(--border-radius-sm) var(--border-radius-sm) 0;
  margin-block: 2rem;
  font-style: italic;
  color: var(--text-light);
}

.post-body ul, .post-body ol {
  margin-block-end: 1.5rem;
  padding-left: 1.5rem;
  display: flex;
  flex-direction: column;
  gap: 0.5rem;
}

.post-body li {
  color: var(--text-muted);
}

/* Sidebar Widgets */
.sidebar-widgets {
  display: flex;
  flex-direction: column;
  gap: var(--spacing-md);
}

.sidebar-widget {
  background: var(--bg-card);
  border: 1px solid var(--border-color);
  border-radius: var(--border-radius-md);
  padding: 1.5rem;
  box-shadow: var(--shadow-sm);
}

.sidebar-widget h3 {
  font-size: 1.15rem;
  margin-block-end: 1rem;
  border-bottom: 2px solid var(--border-color);
  padding-block-end: 0.5rem;
}

.related-posts-list {
  list-style: none;
  display: flex;
  flex-direction: column;
  gap: 1rem;
}

.related-post-item a {
  display: flex;
  gap: 0.75rem;
  align-items: center;
}

.related-post-img {
  width: 60px;
  height: 60px;
  border-radius: var(--border-radius-sm);
  object-fit: cover;
  flex-shrink: 0;
  border: 1px solid var(--border-color);
}

.related-post-info h4 {
  font-size: 0.9rem;
  color: var(--text-light);
  line-height: 1.3;
  margin-block-end: 0.25rem;
  font-weight: 600;
}

.related-post-info span {
  font-size: 0.75rem;
  color: var(--text-dim);
}

.related-post-item:hover h4 {
  color: var(--brand-light);
}

/* ==========================================================================
   PUBLICIDAD & SPONSORS RENDERING (JERARQUÍA PUBLICITARIA)
   ========================================================================== */

/* Nivel 1: Sponsor Principal (Main Sponsor) */
.main-sponsor-strip {
  /* Oculto hasta tener un sponsor principal real: un "Espacio disponible" vacío
     en cada página se lee como sitio sin tracción. Reactivar al vender el slot. */
  display: none;
  background: linear-gradient(90deg, hsl(220 20% 7%), var(--bg-dark), hsl(220 20% 7%));
  border-block: 1px dashed var(--border-color);
  padding-block: 0.75rem;
  text-align: center;
  font-size: 0.8rem;
  color: var(--text-dim);
}

.main-sponsor-logo-box {
  display: inline-flex;
  align-items: center;
  gap: 0.5rem;
  margin-left: 0.5rem;
  font-family: var(--font-title);
  font-weight: 800;
  color: var(--tier-1-color);
  border: 1px solid var(--tier-1-color);
  padding: 0.15rem 0.6rem;
  border-radius: 4px;
  font-size: 0.85rem;
}

/* Nivel 2: Sponsor de Sección (Category Sponsor) */
.section-sponsor-tag {
  display: inline-flex;
  align-items: center;
  gap: 0.5rem;
  font-size: 0.8rem;
  color: var(--text-muted);
  background: hsl(46 100% 44% / 0.08);
  border: 1px solid hsl(46 100% 44% / 0.22);
  padding: 0.3rem 0.75rem;
  border-radius: 4px;
  margin-block-end: 1rem;
}

.section-sponsor-brand {
  font-weight: 700;
  color: var(--brand-light);
}

/* Nivel 3: Banner Premium (Top of /revista/acceso) */
.sponsor-banner-premium {
  background: radial-gradient(circle at 10% 50%, hsl(28 80% 20%), var(--bg-darker) 70%);
  border: 1px solid var(--border-light);
  border-radius: var(--border-radius-md);
  padding: 1.5rem;
  display: flex;
  justify-content: space-between;
  align-items: center;
  gap: 1.5rem;
  box-shadow: var(--shadow-sm);
  position: relative;
  overflow: hidden;
}

.sponsor-banner-premium::after {
  content: 'ANUNCIO';
  position: absolute;
  top: 10px;
  right: 12px;
  font-size: 0.65rem;
  color: var(--text-dim);
  letter-spacing: 0.1em;
}

.sponsor-banner-info h4 {
  font-size: 1.25rem;
  margin-block-end: 0.25rem;
  color: var(--tier-1-color);
}

.sponsor-banner-info p {
  font-size: 0.9rem;
  color: var(--text-muted);
  margin-block-end: 0;
}

/* Nivel 4: Banner Estándar (Sidebar/Between Blocks) */
.sponsor-banner-standard {
  background: var(--bg-dark);
  border: 1px solid var(--border-color);
  border-radius: var(--border-radius-sm);
  padding: 1.2rem;
  display: flex;
  flex-direction: column;
  gap: 0.5rem;
  position: relative;
}

.sponsor-banner-standard::after {
  content: 'SPONSOR';
  position: absolute;
  top: 10px;
  right: 10px;
  font-size: 0.6rem;
  color: var(--text-dim);
  letter-spacing: 0.05em;
}

.sponsor-banner-standard h4 {
  font-size: 1rem;
}

.sponsor-banner-standard p {
  font-size: 0.85rem;
  color: var(--text-muted);
  margin-block-end: 0.5rem;
}

.sponsor-banner-standard .btn-ad {
  font-size: 0.8rem;
  padding: 0.4rem 1rem;
  align-self: flex-start;
  background: var(--brand-color);
  color: var(--text-light);
  border-radius: 4px;
}

/* Nivel 5: Grid de Logos Sponsors (Footer/Final Section) */
.sponsors-logos-title {
  text-align: center;
  font-size: 0.8rem;
  color: var(--text-dim);
  text-transform: uppercase;
  letter-spacing: 0.15em;
  margin-block-end: 1rem;
}

.sponsors-logos-grid {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(130px, 1fr));
  gap: 1.5rem;
  align-items: center;
}

.sponsor-logo-card {
  height: 50px;
  background: var(--bg-card);
  border: 1px solid var(--border-color);
  border-radius: var(--border-radius-sm);
  display: flex;
  align-items: center;
  justify-content: center;
  font-family: var(--font-title);
  font-weight: 800;
  color: var(--text-dim);
  font-size: 0.95rem;
  transition: all var(--transition-fast);
}

.sponsor-logo-card:hover {
  border-color: var(--brand-color);
  color: var(--brand-light);
  box-shadow: 0 4px 10px rgba(0,0,0,0.3);
}

/* Inline CTA Widget inside Blog notes */
.inline-blog-cta {
  background: linear-gradient(135deg, var(--bg-dark), hsl(46 100% 44% / 0.1));
  border: 1px solid var(--border-light);
  border-radius: var(--border-radius-md);
  padding: 1.5rem;
  margin-block: 2rem;
  text-align: center;
}

.inline-blog-cta h3 {
  margin-block-end: 0.5rem;
}

.inline-blog-cta p {
  font-size: 0.95rem;
  margin-block-end: 1rem;
}

/* ==========================================================================
   FOOTER STYLING
   ========================================================================== */
footer {
  background-color: var(--bg-darkest);
  border-top: 1px solid var(--border-color);
  padding-block-start: var(--spacing-lg);
  padding-block-end: var(--spacing-md);
  padding-inline: var(--spacing-sm);
  color: var(--text-muted);
}

.footer-container {
  max-width: var(--container-width);
  margin-inline: auto;
  display: grid;
  gap: var(--spacing-md);
}

@media (min-width: 768px) {
  .footer-container {
    grid-template-columns: 2fr 1fr 1fr;
    gap: var(--spacing-lg);
  }
}

.footer-brand .footer-logo {
  font-family: var(--font-title);
  font-weight: 800;
  font-size: 1.35rem;
  color: var(--text-light);
  display: block;
  margin-block-end: 1rem;
}

.footer-brand p {
  font-size: 0.95rem;
  max-width: 400px;
}

.footer-links h3, .footer-social h3,
.footer-links h2, .footer-social h2 {
  font-size: 1rem;
  text-transform: uppercase;
  letter-spacing: 0.1em;
  color: var(--text-light);
  margin-block-end: 1.25rem;
}

.footer-links ul {
  list-style: none;
  display: flex;
  flex-direction: column;
  gap: 0.75rem;
}

.footer-links a {
  color: var(--text-muted);
  font-size: 0.95rem;
  /* Área táctil de 44px sin mover el diseño: el padding agranda el blanco del dedo
     y el margen negativo devuelve el espacio. El texto solo mide ~24px de alto
     (revisión 22/8/2026). */
  display: inline-block;
  padding-block: 10px;
  margin-block: -10px;
}

.footer-links a:hover {
  color: var(--brand-light);
  padding-left: 4px;
}

.social-icons {
  display: flex;
  gap: 1rem;
}

.social-icons a {
  display: flex;
  align-items: center;
  justify-content: center;
  width: 44px;
  height: 44px;
  border-radius: 50%;
  background: var(--bg-darker);
  border: 1px solid var(--border-color);
  color: var(--text-muted);
  transition: all var(--transition-fast);
}

.social-icons a:hover {
  border-color: var(--brand-color);
  color: var(--brand-light);
  transform: translateY(-3px);
  box-shadow: 0 4px 10px var(--brand-glow);
}

.social-svg {
  fill: currentColor;
}

.footer-bottom {
  max-width: var(--container-width);
  margin-inline: auto;
  margin-block-start: var(--spacing-lg);
  padding-block-start: var(--spacing-sm);
  border-top: 1px solid var(--border-color);
  font-size: 0.85rem;
  text-align: center;
}

/* ==========================================================================
   PROGRESSIVE ENHANCEMENT: SCROLL ENTRANCE EFFECTS
   ========================================================================== */
/* ENTRADA ANIMADA: ELIMINADA (22/8/2026, orden del dueño: "se desvanece").
   La secuencia ocultar-y-revelar hacía esto en el mundo real: la página pintaba el
   contenido, app.js llegaba (tarde en redes lentas), html.js activaba opacity:0 con
   transición — EL CONTENIDO SE DESVANECÍA A LA VISTA DEL LECTOR — y el reveal quedaba
   en manos de un IntersectionObserver o de animation-timeline que en los navegadores
   integrados de Facebook/Instagram no siempre corren. Dos parches no alcanzaron.
   Decisión final: el contenido NUNCA se oculta. Las clases .card-entrance/.visible
   quedan inertes para no tocar 125 páginas ni el JS que las agrega. */
.card-entrance { opacity: 1; transform: none; }
/* Restaurada 22/8/2026: el commit que eliminó la animación (b7bdc17) borró de paso
   esta regla base y los links de contacto de sponsors quedaron en display:block. */
.sponsor-contact {
  display: flex;
  flex-wrap: wrap;
  gap: 0.4rem 1rem;
  align-items: center;
  font-size: 0.88rem;
  line-height: 1.8;
}
.sponsor-contact a {
  color: var(--text-muted);
  text-decoration: none;
  transition: color var(--transition-fast);
  white-space: nowrap;
}
.sponsor-contact a:hover {
  color: var(--brand-light);
}
.sponsor-contact a[href^="https://wa.me"] {
  color: var(--brand-light);
  font-weight: 600;
}
.sponsor-contact a[href^="https://wa.me"]:hover {
  color: var(--brand-color);
}
.sponsor-contact a[href^="https://www."] {
  color: var(--brand-light);
  font-weight: 500;
}
.sponsor-contact br {
  flex-basis: 100%;
  height: 0;
}

/* ==========================================================================
   RANKING TABLE RESPONSIVE
   ========================================================================== */
.ranking-table {
  border-radius: var(--border-radius-md);
  overflow: hidden;
}
.ranking-table tbody tr {
  transition: background var(--transition-fast);
}
.ranking-table tbody tr:hover {
  background: hsl(46 100% 44% / 0.06) !important;
}

@media (max-width: 600px) {
  .ranking-table {
    font-size: 0.85rem !important;
  }
  .ranking-table th,
  .ranking-table td {
    padding: 0.45rem 0.3rem !important;
  }
  /* OJO: NO ocultar columnas acá. Las tablas del ranking tienen 3 columnas
     (# / Ejemplar / Puntos) y la regla vieja que escondía la 3ª y la 4ª hacía
     DESAPARECER los puntos en el celular — el dato central de un ranking.
     Las 3 columnas entran bien en 360px (50px + flexible + 90px). */
  .blog-filters {
    flex-wrap: wrap;
  }
  .blog-filters .filter-btn {
    font-size: 0.8rem;
    padding: 0.55rem 0.8rem;
    min-height: 44px; /* objetivo táctil: control principal del blog en móvil */
  }
  .sponsor-contact {
    font-size: 0.82rem;
  }
  .sponsor-contact a {
    padding: 0.25rem 0;
    min-height: 44px;
    display: inline-flex;
    align-items: center;
  }
}

/* ==========================================================================
   MANIFESTO & ABOUT PAGE COMPONENTS
   ========================================================================== */
.manifesto-quote {
  font-size: 1.35rem;
  font-weight: 400;
  line-height: 1.6;
  color: var(--text-muted);
  max-width: 860px;
  margin-top: 1rem;
  font-style: italic;
  border-left: 3px solid var(--brand-color);
  padding-left: 1.25rem;
}

.editorial-lede {
  font-size: 1.1rem;
  line-height: 1.7;
  color: var(--text-light);
  font-weight: 400;
}

.rule-note {
  margin-top: 1.5rem;
  padding: 1rem 1.25rem;
  background: hsl(0 100% 43% / 0.06);
  border-left: 3px solid var(--signal-red);
  border-radius: 0 var(--border-radius-sm) var(--border-radius-sm) 0;
  font-size: 0.82rem;
  color: var(--text-dim);
  line-height: 1.6;
}

/* Taxonomy Panel */
.taxonomy-panel {
  background: var(--bg-card);
  border: 1px solid var(--border-color);
  border-radius: var(--border-radius-md);
  padding: 2rem;
}
.taxonomy-panel h2,
.taxonomy-panel h3 {
  color: var(--brand-light);
  margin-bottom: 1.25rem;
}
.taxonomy-list {
  list-style: none;
  padding: 0;
  margin: 0;
  display: flex;
  flex-direction: column;
  gap: 1rem;
}
.taxonomy-list li {
  display: flex;
  flex-direction: column;
  gap: 0.15rem;
  padding-bottom: 0.75rem;
  border-bottom: 1px solid var(--border-color);
}
.taxonomy-list li:last-child {
  border-bottom: none;
  padding-bottom: 0;
}
.taxonomy-list li strong {
  color: var(--text-light);
  font-size: 0.95rem;
}
.taxonomy-list li span {
  color: var(--text-muted);
  font-size: 0.85rem;
}

/* Axiom Grid */
.axiom-grid {
  display: grid;
  grid-template-columns: repeat(auto-fill, minmax(280px, 1fr));
  gap: 1.5rem;
  margin-top: 2rem;
}
.axiom-card {
  background: var(--bg-card);
  border: 1px solid var(--border-color);
  border-radius: var(--border-radius-md);
  padding: 1.5rem;
  transition: border-color var(--transition-fast), transform var(--transition-fast);
}
.axiom-card:hover {
  border-color: var(--border-light);
  transform: translateY(-2px);
}
.axiom-card h3 {
  color: var(--text-light);
  font-size: 1rem;
  margin-bottom: 0.5rem;
}
.axiom-card p {
  color: var(--text-muted);
  font-size: 0.88rem;
  margin: 0;
}
.axiom-card.critical {
  border-color: hsl(0 100% 43% / 0.3);
  background: hsl(0 100% 43% / 0.04);
}
.axiom-card.critical h3 {
  color: hsl(0 90% 66%);
}

/* Manifesto Cards */
.manifesto-card {
  background: var(--bg-card);
  border: 1px solid var(--border-color);
  border-radius: var(--border-radius-md);
  padding: 2rem;
}
.manifesto-card h2 {
  margin-top: 0.5rem;
  margin-bottom: 1rem;
}

.value-list {
  list-style: none;
  padding: 0;
  margin: 1rem 0 0;
}
.value-list li {
  padding: 0.5rem 0;
  padding-left: 1.25rem;
  position: relative;
  color: var(--text-muted);
  font-size: 0.92rem;
}
.value-list li::before {
  content: '→';
  position: absolute;
  left: 0;
  color: var(--brand-color);
}

/* Related Posts in Sidebar */
.related-posts-list {
  list-style: none;
  padding: 0;
  margin: 0;
}
.related-posts-list li {
  padding: 0.6rem 0;
  border-bottom: 1px solid var(--border-color);
  font-size: 0.85rem;
  color: var(--text-muted);
}
.related-posts-list li:last-child {
  border-bottom: none;
}

@media (max-width: 600px) {
  .manifesto-quote {
    font-size: 1.05rem;
  }
  .axiom-grid {
    grid-template-columns: 1fr;
    gap: 1rem;
  }
  .taxonomy-panel {
    padding: 1.25rem;
  }
  .manifesto-card {
    padding: 1.25rem;
  }
}

/* ============================================================
   Inventario de publicidad — pauta identificada, subordinada
   a la línea editorial. Espacios disponibles para anunciar.
   ============================================================ */
.ad-inventory-grid {
  display: grid;
  grid-template-columns: 1fr;
  gap: 1.5rem;
  align-items: start;
}

.ad-slot {
  display: flex;
  flex-direction: column;
  align-items: center;
  justify-content: center;
  gap: 0.5rem;
  text-align: center;
  text-decoration: none;
  padding: 1.75rem 1.5rem;
  border: 1.5px dashed var(--border-light);
  border-radius: var(--border-radius-md);
  background: hsl(46 100% 44% / 0.04);
  font-family: var(--font-title);
  transition: border-color 0.25s ease, background 0.25s ease, transform 0.25s ease;
}

.ad-slot:hover,
.ad-slot:focus-visible {
  border-color: var(--brand-color);
  background: hsl(46 100% 44% / 0.07);
  transform: translateY(-2px);
}

.ad-slot .ad-label {
  font-size: 0.7rem;
  text-transform: uppercase;
  letter-spacing: 0.12em;
  color: var(--text-dim);
}

.ad-slot strong {
  color: var(--text-light);
  font-size: 1.05rem;
  font-weight: 600;
}

.ad-slot .ad-cta {
  color: var(--brand-light);
  font-weight: 700;
  font-size: 0.85rem;
}

.ad-slot--horizontal {
  width: 100%;
  min-height: 220px;
}

.ad-slot--vertical {
  width: 100%;
  max-width: 300px;
  min-height: 480px;
  margin-inline: auto;
}

@media (min-width: 900px) {
  .ad-inventory-grid {
    grid-template-columns: 1fr 300px;
  }
  .ad-slot--horizontal {
    min-height: 480px;
  }
}


/* === Inventario de publicidad: leaderboard superior + rieles verticales === */
.ad-leaderboard {
  max-inline-size: var(--container-width);
  margin: 1.25rem auto 0;
  padding-inline: var(--spacing-sm);
}
.ad-leaderboard .ad-slot { min-height: 110px; }
.ad-rail { display: none; }
@media (min-width: 1680px) {
  .ad-rail {
    display: block; position: fixed; top: 50%;
    transform: translateY(-50%); z-index: 40; width: 160px;
  }
  .ad-rail--left { left: 1.5rem; }
  .ad-rail--right { right: 1.5rem; }
  .ad-rail .ad-slot { width: 160px; min-height: 600px; }
}
@media (min-width: 2040px) {
  .ad-rail, .ad-rail .ad-slot { width: 300px; }
}

/* ============================================================
   MOBILE — fixes de auditoría + banner pegajoso inferior
   ============================================================ */
/* Anchor publicitario inferior (solo mobile, equivalente al skyscraper) */
#mobile-ad-anchor {
  position: fixed; left: 0; right: 0; bottom: 0; z-index: 60;
  display: flex; align-items: center; justify-content: center; gap: 0.4rem;
  min-height: 50px; padding: 6px 52px 6px 12px; /* 52px: que el link del anuncio no quede debajo del hitbox 44px del cerrar */
  background: var(--bg-darker); border-top: 1px solid var(--border-light);
  font-family: var(--font-title); font-size: 0.78rem; color: var(--text-dim);
  box-shadow: 0 -6px 18px rgba(0,0,0,0.45);
}
#mobile-ad-anchor a { color: var(--brand-light); font-weight: 800; text-decoration: none; }
#mobile-ad-anchor .maa-label { color: var(--text-dim); font-size: 0.6rem; text-transform: uppercase; letter-spacing: 0.12em; margin-right: 0.3rem; }
#mobile-ad-anchor .maa-close { position: absolute; right: 4px; top: 50%; transform: translateY(-50%); background: none; border: none; color: var(--text-muted); font-size: 1.4rem; line-height: 1; cursor: pointer; min-width: 44px; min-height: 44px; display: grid; place-items: center; } /* 44x44: antes ~34px pegado al link del anuncio = cierres que abrían el anuncio */
/* EL ATRIBUTO hidden TIENE QUE GANARLE AL display DE ARRIBA.
   #mobile-ad-anchor es un selector de ID (0-1-0) y le gana a la regla [hidden]{display:none}
   que trae el navegador: al marcar la barra como oculta desde el JS, seguía dibujándose.
   Como además está vacía y es position:fixed, quedaba una franja INVISIBLE de 50 px pegada
   al pie que se comía los toques — el botón "Avisame" del formulario de email de la portada
   y el de "Ver criaderos destacados" dejaron de responder, sin ningún mensaje de error.
   Es el mismo error que ya estaba documentado en perfil.php con el modal de consulta: un
   estilo más específico le gana al hidden, y el elemento sigue ahí aunque no se vea. */
#mobile-ad-anchor[hidden] { display: none !important; }
@media (min-width: 768px) { #mobile-ad-anchor { display: none !important; } }

@media (max-width: 768px) {
  body:has(#mobile-ad-anchor:not([hidden])) { padding-bottom: 56px; } /* lugar para el anchor, solo si hay anuncio */
  .modern-form { flex-direction: column; gap: 0.75rem; }
  .modern-form input[type="email"], .modern-form input[type="text"] { width: 100%; }
  .modern-form > button { width: 100%; }
}
@media (max-width: 480px) {
  /* Achicar la letra a 11,5px para que la tabla entrara no la hacia legible: la
     hacia ilegible. Ahora conserva su tamaño y se desliza dentro de su caja. */
  .ranking-table { width: 100%; min-width: 340px; }
  .ranking-table td:nth-child(2), .ranking-table th:nth-child(2) { word-break: break-word; }
  .sponsor-card-image, .sponsor-card-image-wide { aspect-ratio: 1 / 1.05; max-height: 230px; }
  .editorial-hero-inner { max-width: 100%; }
  .ad-leaderboard .ad-slot { min-height: 80px !important; }
}
@media (max-width: 520px) { .taxonomy-list li { grid-template-columns: 1fr; gap: 0.2rem; } }
@media (max-width: 380px) { .section-container { padding-inline: 0.85rem; } }
@media (max-width: 820px) { #nav-menu a { padding-block: 0.55rem; min-height: 44px; display: flex; align-items: center; } }

/* Barra del header un poco mas alta (banner grande) */
#main-header { padding-block: 0.4rem; }

/* Skip-link de accesibilidad (WCAG 2.4.1) */
.skip-link{position:absolute;left:0.5rem;top:-3rem;z-index:2000;background:var(--brand-color);color:#000;padding:0.6rem 1rem;border-radius:0 0 6px 6px;font-family:var(--font-title);font-weight:700;text-decoration:none;transition:top 0.15s ease;}
.skip-link:focus{top:0;}
#main:focus{outline:none;}

/* Newsletter compacto en el footer (sitewide) */
.footer-newsletter{max-width:520px;margin:0 auto;padding:1.5rem 1rem 0.5rem;text-align:center;border-top:1px solid var(--border-color);}
.footer-newsletter h3, .footer-newsletter h2{margin:0 0 0.3rem;font-size:1rem;font-family:var(--font-title,'Outfit',sans-serif);}
.footer-newsletter p{margin:0 0 0.85rem;font-size:0.85rem;color:var(--text-muted);}
.footer-newsletter-form{display:flex;gap:0.5rem;flex-wrap:wrap;justify-content:center;}
.footer-newsletter-form input[type=email]{flex:1;min-width:200px;padding:0.6rem 0.9rem;border-radius:var(--border-radius-sm);border:1px solid var(--border-color);background:var(--bg-darkest);color:var(--text-light);}

/* Contraste: cajas OSCURAS dentro de secciones surface-paper (claras) */
.surface-paper .rate-fx-note,
.surface-paper .rate-fx-pick { color: var(--text-muted); }
.surface-paper .criadero-card-invitacion { color: var(--text-muted); }
.surface-paper .criadero-card-invitacion strong { color: var(--text-light); }

/* ==========================================================================
   COMPARTIR
   El hueco lo encontró el dueño: 286.000 personas en el grupo y ninguna forma
   de pasar una nota. Las etiquetas Open Graph ya estaban completas en las 69
   notas (título, descripción e imagen), así que la tarjeta de Facebook y de
   WhatsApp ya se veía bien: lo único que faltaba era el botón.
   Móvil primero: el 85% de los clics de Google llegan del celular.
   ========================================================================== */
.compartir { padding: 0 1rem 2.5rem; }
.compartir-caja {
  max-width: 720px; margin: 0 auto; padding: 1.4rem 1.2rem;
  border: 1px solid var(--border-color); border-radius: var(--border-radius-sm);
  background: var(--bg-darker); text-align: center;
}
.compartir-titulo { font-size: 1.05rem; margin: 0 0 0.3rem; color: var(--text-light); }
.compartir-bajada { font-size: 0.9rem; margin: 0 0 1rem; color: var(--text-muted); }
.compartir-botones { display: flex; flex-wrap: wrap; gap: 0.6rem; justify-content: center; }

/* Un ID no hace falta acá, pero el atributo hidden SÍ tiene que ganarle al
   display:flex: una barra invisible que igual recibe toques ya rompió la
   captura de emails en producción una vez. No repetir. */
.compartir-btn[hidden] { display: none !important; }

.compartir-btn {
  display: inline-flex; align-items: center; justify-content: center; gap: 0.45rem;
  /* 48px de alto: objetivo táctil cómodo, por encima del mínimo de 44 */
  min-height: 48px; padding: 0 1.1rem;
  border-radius: var(--border-radius-sm); border: 1px solid var(--border-color);
  background: var(--bg-darkest); color: var(--text-light);
  font-size: 0.92rem; font-weight: 600; text-decoration: none; cursor: pointer;
  transition: border-color 0.15s ease, background 0.15s ease;
}
.compartir-btn:hover, .compartir-btn:focus-visible { border-color: var(--brand-color); background: var(--bg-darker); }
.compartir-btn svg { width: 18px; height: 18px; fill: currentColor; flex: none; }
.compartir-btn--nativo { background: var(--brand-color); border-color: var(--brand-color); color: #fff; flex: 1 1 100%; }
.compartir-btn--nativo:hover, .compartir-btn--nativo:focus-visible { background: var(--brand-dark); border-color: var(--brand-dark); color: #fff; }
.compartir-btn--wa svg { color: hsl(142 70% 45%); fill: hsl(142 70% 45%); }
.compartir-btn--fb svg { color: hsl(214 89% 62%); fill: hsl(214 89% 62%); }

/* Aviso de "copiado", en el mismo botón: sin ventanas ni alertas. */
.compartir-btn--link.copiado { border-color: hsl(142 70% 45%); color: hsl(142 70% 45%); }

@media (max-width: 560px) {
  .compartir { padding: 0 0.9rem 2rem; }
  .compartir-caja { padding: 1.1rem 0.9rem; }
  /* En el celular los tres entran en una fila y quedan angostos. Dos arriba,
     uno abajo: se tocan sin apuntar. */
  .compartir-botones .compartir-btn:not(.compartir-btn--nativo) { flex: 1 1 calc(50% - 0.3rem); padding: 0 0.6rem; }
}

/* Fondo claro (la revista y las fichas usan papel): que no quede una caja
   negra en medio de una página clara. */
.bg-paper .compartir-caja, .papel .compartir-caja {
  background: var(--bg-paper-muted); border-color: rgba(0, 0, 0, 0.14);
}

/* ==========================================================================
   ME GUSTÓ (notas del blog)
   Una huella de perro, anónima: un toque por visita, cero datos de la persona.
   Vive dentro de la caja de compartir — "¿Te sirvió esta nota?" ya hace la
   pregunta; la huella es la respuesta de un toque.
   ========================================================================== */
.like-nota {
  display: inline-flex; align-items: center; gap: 0.5rem;
  min-height: 48px; padding: 0 1.1rem; margin-bottom: 0.9rem;
  border-radius: var(--border-radius-sm); border: 1px solid var(--border-color);
  background: var(--bg-darkest); color: var(--text-light);
  font-size: 0.92rem; font-weight: 600; cursor: pointer;
  transition: border-color 0.15s ease, transform 0.1s ease;
}
.like-nota:hover, .like-nota:focus-visible { border-color: var(--brand-color); }
.like-nota:active { transform: scale(0.97); }
.like-nota svg { width: 20px; height: 20px; fill: currentColor; flex: none; }
.like-nota.votado { border-color: var(--brand-color); color: var(--brand-color); cursor: default; }
.like-nota .like-n { font-variant-numeric: tabular-nums; }

/* ==========================================================================
   OBJETIVOS TÁCTILES (revisión total 22/8/2026)
   Regla de la casa: 44px de blanco para el dedo. Donde agrandar el elemento
   rompería el diseño, el truco es padding que agranda el área y margen negativo
   que devuelve el espacio: se ve igual, se toca mejor.
   ========================================================================== */
.footer-contact a {           /* WhatsApp / Llamar / Email del pie: medían 17px */
  display: inline-block;
  padding-block: 14px;
  margin-block: -14px;
}
.archive-card a {             /* "Leer nota" de la portada: medía 26px */
  padding-block: 11px;
  margin-bottom: -11px;
}
.criadero-contactos a {       /* "Ver perfil" y contactos de las fichas: medían 40px */
  display: inline-flex;
  align-items: center;
  min-height: 44px;
}
