/* ==========================================================================
   MIND MIAMI — BACKDROPS v1 · sistema de fondos generativos de marca
   Todo CSS + SVG. Cero imágenes raster, cero dependencias, cero CDN.
   Se carga DESPUÉS de system.css (usa sus tokens) y es independiente del
   motor: sin JS los siete fondos se pintan igual, quietos y visibles.

   ── QUÉ RESUELVE ──────────────────────────────────────────────────────────
   Las secciones del sistema son planas (navy o papel) y piden profundidad
   sin caer en el collage. Estos siete fondos dan esa profundidad con la
   misma gramática del manual: filete fino, retícula técnica, cian plano.

     .bd-grid     retícula técnica (la del hero, generalizada)
     .bd-dots     trama de puntos con degradado de densidad
     .bd-topo     curvas de nivel — territorio, mapa, terreno
     .bd-circuit  trazas de circuito con nodos — IA y sistemas
     .bd-waves    ondas finas peinadas — contenido y social
     .bd-glow     halo radial cian contenido — foco de atención
     .bd-noise    grano finísimo (feTurbulence) — quita el plano al navy

   ── CONTRATO DE MARCADO ───────────────────────────────────────────────────
     <section class="bd-scene bd-scene--navy">
       <div class="bd bd-topo bd-on-navy" aria-hidden="true">
         <i class="bd-i"><svg class="bd-svg" viewBox="0 0 1600 900"
              preserveAspectRatio="xMidYMid slice" aria-hidden="true"
              ><use href="/assets/art/patterns.svg#pat-topo-far"></use></svg></i>
         <i class="bd-i2"><svg class="bd-svg" viewBox="0 0 1600 900"
              preserveAspectRatio="xMidYMid slice" aria-hidden="true"
              ><use href="/assets/art/patterns.svg#pat-topo-near"></use></svg></i>
       </div>
       … contenido real …
     </section>

   · .bd-scene  el hospedador: position:relative + isolation + overflow:clip.
                Sin isolation el z-index:-1 de .bd se escaparía detrás del
                fondo de la sección (misma receta que .hero en system.css).
   · .bd        la capa: absoluta, sobredimensionada (--bd-bleed) y detrás
                del contenido. Aquí va la máscara de borde. NUNCA lleva
                transform: es el marco fijo.
   · .bd-i / .bd-i2 / .bd-i3   los PLANOS. Están vacíos de estilo propio a
                propósito: son el nodo que el motor mueve. Píntalos con su
                ::before (lo hace este archivo), nunca sobre el plano mismo.
   · .bd-svg    el <svg> anfitrión de los símbolos de /assets/art/patterns.svg.
                Toma color por currentColor y grosor por --pat-w.

   ── MOVIMIENTO (motor v1 y v2, sin tocar ninguno de los dos) ──────────────
   Los planos aceptan directamente los atributos del motor porque su única
   propiedad animable es transform y este archivo no la usa en ellos:

     <div data-parallax-scene>                       (v2)
       <div class="bd bd-topo bd-on-navy">
         <i class="bd-i"  data-layer="0.10"></i>
         <i class="bd-i2" data-layer="0.22"></i>

     <i class="bd-i" data-scrub="y:-40,40"></i>      (v1)

   Solo se escribe transform → cero repintado, cero layout, compositor puro.
   La ROTACIÓN del fondo (--bd-rot) vive en el ::before del plano y la ESCALA
   en el .bd-svg, precisamente para que el transform que escribe el motor en
   el plano no las pise. Por eso el fondo se pinta en el pseudo y no en el
   plano: son dos transforms independientes que no compiten.

   El desplazamiento máximo debe caber en el sobredimensionado: mantén
   data-layer-max ≤ --bd-bleed (110px por defecto) o se verá el borde del
   plano entrar en la sección.

   ── CONTRASTE (la regla dura) ─────────────────────────────────────────────
   Sobre navy cualquier marca CLARA sube la luminancia del fondo y se come el
   contraste del texto. El listón es el color de texto más débil del sistema,
   --muted-on-navy #9fb0c0, que ya parte de 8.16:1 contra navy limpio: si él
   aguanta AA, aguanta todo lo demás.

   Los techos de abajo NO son cálculo de servilleta: salen de medir el píxel
   real. Ojo con la trampa —el compositing ocurre en espacio gamma, así que
   estimar la mezcla en luz lineal exagera el daño casi 3×; en la primera
   vuelta ese error dejó los fondos de navy tan tímidos que no se veían.

     --bd-max-mark-navy  .11   marca clara (línea, punto, nodo) sobre navy
                               (medido: a .20 el texto muted cae justo a 4.5)
     --bd-max-wash-navy  .22   lavado ancho de cian sobre navy
                               (medido: a .25 el texto muted cae a 4.68)
     --bd-max-mark-paper .28   marca de tinta sobre papel. El papel perdona
                               muchísimo más: oscurecer un fondo claro apenas
                               mueve el contraste del texto oscuro.

   Son documentación ejecutable: si subes una alfa por encima de su techo,
   vuelve a medir antes de publicar. Los valores por defecto de más abajo ya
   están medidos sobre texto real (ver _lab-backdrops.html): con todos ellos
   los tres colores de texto del sistema pasan AA con margen incluso en el
   píxel individual más desfavorable de todo el panel.

   Y hay una salida de diseño mejor que bajar alfas: .bd-fade-copy vacía el
   centro del fondo justo donde cae la columna de texto.

   ── ACCESIBILIDAD ─────────────────────────────────────────────────────────
   · Los fondos son decorativos: la capa va con aria-hidden="true" en el
     marcado y pointer-events:none aquí. Nunca contienen información.
   · Este archivo no anima nada por su cuenta, así que no hay nada que apagar
     con prefers-reduced-motion; aun así se neutralizan transforms como red
     de seguridad, por si el motor se apagara a media sesión.
   · forced-colors (alto contraste de Windows) → los fondos desaparecen.
   · En impresión desaparecen: no gastan tinta.
   ========================================================================== */

/* ==========================================================================
   0 · PRIMITIVAS
   ========================================================================== */

.bd-scene {
  position: relative;
  isolation: isolate;   /* imprescindible: da contexto al z-index:-1 de .bd */
  overflow: clip;       /* recorta el sobredimensionado del fondo */
}

/* Superficies del sistema, por comodidad al montar secciones nuevas.
   Cada una deja ya puesto el tema del fondo que le corresponde. */
.bd-scene--navy    { background: var(--navy);   color: var(--text-on-navy); }
.bd-scene--navy-2  { background: var(--navy-2); color: var(--text-on-navy); }
.bd-scene--paper   { background: var(--paper);  color: var(--ink); }
.bd-scene--paper-2 { background: var(--paper-2); color: var(--ink); }
.bd-scene--navy, .bd-scene--navy-2     { --bd-rgb: 246 244 241; }
.bd-scene--paper, .bd-scene--paper-2   { --bd-rgb: 10 26 47; }

.bd {
  position: absolute;
  inset: calc(-1 * var(--bd-bleed));
  z-index: -1;
  pointer-events: none;
  overflow: clip;
  opacity: var(--bd-a, 1);

  /* --- tokens comunes --- */
  --bd-bleed: 110px;          /* sobredimensionado: margen para el parallax */
  --bd-rgb: 246 244 241;      /* color de las marcas (papel = sobre navy)   */
  --bd-accent-rgb: 6 214 221; /* cian de marca                              */
  --bd-rot: 0deg;             /* rotación estática del dibujo               */
  --bd-over: 0px;             /* holgura extra del dibujo al rotarlo        */
  --bd-scale: 1;              /* escala estática del arte SVG               */

  /* techos de contraste — ver cabecera, no subir sin volver a medir */
  --bd-max-mark-navy: .11;
  --bd-max-wash-navy: .22;
  --bd-max-mark-paper: .28;
}

/* Los PLANOS. Vacíos a propósito: aquí escribe el motor su transform. */
.bd-i, .bd-i2, .bd-i3 { position: absolute; inset: 0; display: block; }

/* El pintor. Se separa del plano para que rotación y parallax no compitan. */
.bd-i::before, .bd-i2::before, .bd-i3::before,
.bd-i::after,  .bd-i2::after,  .bd-i3::after {
  content: "";
  position: absolute;
  inset: calc(-1 * var(--bd-over));
  transform: rotate(var(--bd-rot));
  transform-origin: 50% 50%;
}

/* Anfitrión de los símbolos de patterns.svg. El símbolo no trae color:
   lo pone currentColor, y el grosor --pat-w (custom property → hereda
   también dentro del árbol de sombra del <use> externo). */
.bd-svg {
  position: absolute; inset: 0;
  width: 100%; height: 100%;
  display: block;
  fill: none;
  stroke: currentColor;
  transform: rotate(var(--bd-rot)) scale(var(--bd-scale));
  transform-origin: 50% 50%;
}

/* ==========================================================================
   1 · .bd-grid — RETÍCULA TÉCNICA
   Generaliza la del hero (system.css .hero-grid): misma familia, ahora con
   celda, grosor, línea mayor y alfas parametrizados.
     --bd-grid-size   lado de la celda menor          (def. 84px)
     --bd-grid-major  cada cuántas celdas hay mayor   (def. 4)
     --bd-grid-w      grosor del filete               (def. 1px)
     --bd-grid-a      alfa de la línea menor
     --bd-grid-a2     alfa de la línea mayor
   ========================================================================== */
.bd-grid {
  --bd-grid-size: 84px;
  --bd-grid-major: 4;
  --bd-grid-w: 1px;
  --bd-grid-a: .045;
  --bd-grid-a2: .085;
}
.bd-grid > :is(.bd-i, .bd-i2, .bd-i3)::before {
  --_maj: calc(var(--bd-grid-size) * var(--bd-grid-major));
  background-image:
    linear-gradient(rgb(var(--bd-rgb) / var(--bd-grid-a2)) var(--bd-grid-w), transparent 0),
    linear-gradient(90deg, rgb(var(--bd-rgb) / var(--bd-grid-a2)) var(--bd-grid-w), transparent 0),
    linear-gradient(rgb(var(--bd-rgb) / var(--bd-grid-a)) var(--bd-grid-w), transparent 0),
    linear-gradient(90deg, rgb(var(--bd-rgb) / var(--bd-grid-a)) var(--bd-grid-w), transparent 0);
  background-size:
    100% var(--_maj), var(--_maj) 100%,
    100% var(--bd-grid-size), var(--bd-grid-size) 100%;
}

/* ==========================================================================
   2 · .bd-dots — TRAMA DE PUNTOS CON DEGRADADO DE DENSIDAD
   Densidad real, no opacidad fingida: un campo base uniforme y un segundo
   campo al doble de frecuencia, desfasado media celda y enmascarado hacia el
   foco. Cerca del foco hay el doble de puntos; lejos, solo el campo base.
     --bd-dots-size    paso de la trama base          (def. 24px)
     --bd-dots-r       radio del punto                (def. 1.15px)
     --bd-dots-a       alfa del punto
     --bd-dots-x/-y    foco de densidad               (def. 78% 14%)
     --bd-dots-spread  hasta dónde llega el campo denso (def. 70%)
   ========================================================================== */
.bd-dots {
  --bd-dots-size: 24px;
  --bd-dots-r: 1.15px;
  --bd-dots-a: .09;
  --bd-dots-x: 78%;
  --bd-dots-y: 14%;
  --bd-dots-spread: 70%;
}
.bd-dots > :is(.bd-i, .bd-i2, .bd-i3)::before {
  background-image: radial-gradient(circle at 50% 50%,
    rgb(var(--bd-rgb) / var(--bd-dots-a)) var(--bd-dots-r),
    transparent calc(var(--bd-dots-r) + .7px));
  background-size: var(--bd-dots-size) var(--bd-dots-size);
}
.bd-dots > :is(.bd-i, .bd-i2, .bd-i3)::after {
  --_half: calc(var(--bd-dots-size) / 2);
  background-image: radial-gradient(circle at 50% 50%,
    rgb(var(--bd-rgb) / var(--bd-dots-a)) var(--bd-dots-r),
    transparent calc(var(--bd-dots-r) + .7px));
  background-size: var(--_half) var(--_half);
  background-position: calc(var(--_half) / 2) calc(var(--_half) / 2);
  -webkit-mask-image: radial-gradient(circle at var(--bd-dots-x) var(--bd-dots-y),
    #000 0%, rgb(0 0 0 / .45) 45%, transparent var(--bd-dots-spread));
  mask-image: radial-gradient(circle at var(--bd-dots-x) var(--bd-dots-y),
    #000 0%, rgb(0 0 0 / .45) 45%, transparent var(--bd-dots-spread));
}

/* ==========================================================================
   3 · .bd-topo — CURVAS DE NIVEL
   Marching squares sobre un campo de ruido de valor sembrado (ver
   patterns.svg): contornos anidados de verdad, no ondas apiladas.
   Dos planos: lejano (filete más fino) y cercano.
     --bd-topo-a / -a2   alfa de cada plano
     --bd-topo-w / -w2   grosor del filete (px constantes, no escalan)
   ========================================================================== */
.bd-topo {
  --bd-topo-a: .07;
  --bd-topo-a2: .10;
  --bd-topo-w: .9;
  --bd-topo-w2: 1.3;
}
.bd-topo > .bd-i  { color: rgb(var(--bd-rgb) / var(--bd-topo-a));  --pat-w: var(--bd-topo-w); }
.bd-topo > .bd-i2 { color: rgb(var(--bd-rgb) / var(--bd-topo-a2)); --pat-w: var(--bd-topo-w2); }

/* ==========================================================================
   4 · .bd-circuit — TRAZAS DE CIRCUITO CON NODOS
   Ruteado ortogonal con chaflán a 45°, vías cuadradas y nodos. Los acentos
   cian son ANILLOS, no discos: un pad relleno de 12px de cian bajo un
   párrafo destroza el contraste; un anillo de 1px es una marca, no un fondo.
     --bd-circuit-a         alfa de las trazas
     --bd-circuit-node-a    alfa de nodos y vías
     --bd-circuit-accent-a  alfa del anillo cian
     --bd-circuit-w         grosor
   ========================================================================== */
.bd-circuit {
  --bd-circuit-a: .07;
  --bd-circuit-node-a: .10;
  --bd-circuit-accent-a: .38;
  --bd-circuit-w: 1;
}
.bd-circuit > .bd-i  { color: rgb(var(--bd-rgb) / var(--bd-circuit-a)); --pat-w: var(--bd-circuit-w); }
.bd-circuit > .bd-i2 {
  color: rgb(var(--bd-rgb) / var(--bd-circuit-node-a));
  --pat-w: var(--bd-circuit-w);
  --pat-accent: rgb(var(--bd-accent-rgb) / var(--bd-circuit-accent-a));
}

/* ==========================================================================
   5 · .bd-waves — ONDAS FINAS
   Campo de flujo peinado: todas las líneas comparten portadora, así que no
   se cruzan nunca y el conjunto lee como una superficie, no como ruido.
     --bd-waves-a / -a2   alfa de cada plano
     --bd-waves-w / -w2   grosor
   ========================================================================== */
.bd-waves {
  --bd-waves-a: .065;
  --bd-waves-a2: .095;
  --bd-waves-w: .9;
  --bd-waves-w2: 1.3;
}
.bd-waves > .bd-i  { color: rgb(var(--bd-rgb) / var(--bd-waves-a));  --pat-w: var(--bd-waves-w); }
.bd-waves > .bd-i2 { color: rgb(var(--bd-rgb) / var(--bd-waves-a2)); --pat-w: var(--bd-waves-w2); }

/* ==========================================================================
   6 · .bd-glow — HALO RADIAL CIAN CONTENIDO
   Radio en longitud (no en %) para que sea un halo circular de verdad a
   cualquier proporción de sección. Dos paradas: núcleo y caída larga.
     --bd-glow-x / -y   centro del halo        (def. 82% 4%)
     --bd-glow-size     radio                  (def. clamp(240px,34vw,560px))
     --bd-glow-a        alfa del núcleo
     --bd-glow-rgb      color (def. el cian de marca)
   ========================================================================== */
.bd-glow {
  --bd-glow-x: 82%;
  --bd-glow-y: 4%;
  --bd-glow-size: clamp(240px, 34vw, 560px);
  --bd-glow-a: .16;
  --bd-glow-rgb: var(--bd-accent-rgb);
}
.bd-glow > :is(.bd-i, .bd-i2, .bd-i3)::before {
  background-image: radial-gradient(circle var(--bd-glow-size)
    at var(--bd-glow-x) var(--bd-glow-y),
    rgb(var(--bd-glow-rgb) / var(--bd-glow-a)) 0%,
    rgb(var(--bd-glow-rgb) / calc(var(--bd-glow-a) * .45)) 38%,
    rgb(var(--bd-glow-rgb) / calc(var(--bd-glow-a) * .14)) 66%,
    transparent 100%);
  background-repeat: no-repeat;
}

/* ==========================================================================
   7 · .bd-noise — GRANO FINÍSIMO
   feTurbulence fractalNoise cuyo canal rojo se convierte en ALFA sobre un
   color plano (feColorMatrix). Así el grano no es un velo gris que levanta
   el navy: es una nube de puntos del color de la superficie contraria, y su
   media apenas mueve la luminancia. Va en data URI para no pedir otro
   archivo; su gemelo vive también en patterns.svg (#pat-noise) por si lo
   prefieres en el DOM.
     --bd-noise-a     opacidad de la capa (techo del contrato: .03)
     --bd-noise-size  lado del mosaico    (def. 220px)
   ========================================================================== */
.bd-noise {
  --bd-noise-a: .028;
  --bd-noise-size: 220px;
}
.bd-noise > :is(.bd-i, .bd-i2, .bd-i3)::before {
  opacity: var(--bd-noise-a);
  background-size: var(--bd-noise-size) var(--bd-noise-size);
  /* grano CLARO — para superficies navy */
  background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='220' height='220'%3E%3Cfilter id='g' color-interpolation-filters='sRGB'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.9' numOctaves='3' stitchTiles='stitch' seed='7'/%3E%3CfeColorMatrix type='matrix' values='0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 1 0 0 0 0'/%3E%3C/filter%3E%3Crect width='220' height='220' filter='url(%23g)'/%3E%3C/svg%3E");
}

/* ==========================================================================
   TEMAS · sobre navy y sobre papel
   Sobre papel las marcas son TINTA y admiten mucha más alfa: oscurecer un
   fondo claro apenas mueve el contraste del texto oscuro que va encima.
   Sobre navy manda el techo (--bd-max-mark-navy): cualquier marca clara
   levanta la luminancia y se come el margen del texto muted.
   ========================================================================== */

/* — sobre NAVY: marcas de papel — (es el estado por defecto de .bd) */
.bd-on-navy { --bd-rgb: 246 244 241; }

/* — sobre PAPEL: marcas de tinta — */
.bd-on-paper {
  --bd-rgb: 10 26 47;

  --bd-grid-a: .05;
  --bd-grid-a2: .095;

  --bd-dots-a: .105;

  --bd-topo-a: .08;
  --bd-topo-a2: .125;

  --bd-circuit-a: .085;
  --bd-circuit-node-a: .105;
  --bd-circuit-accent-a: .45;

  --bd-waves-a: .08;
  --bd-waves-a2: .125;

  /* el cian OSCURECE el papel: no hay riesgo para el texto de tinta, pero
     un lavado fuerte apaga el blanco cálido del manual y lo vuelve gris
     verdoso. Sobre papel el halo es una insinuación, no una luz. */
  --bd-glow-a: .07;

  --bd-noise-a: .05;
}
/* grano OSCURO (tinta) para superficies de papel */
.bd-noise.bd-on-paper > :is(.bd-i, .bd-i2, .bd-i3)::before,
.bd-scene--paper .bd-noise > :is(.bd-i, .bd-i2, .bd-i3)::before,
.bd-scene--paper-2 .bd-noise > :is(.bd-i, .bd-i2, .bd-i3)::before {
  background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='220' height='220'%3E%3Cfilter id='g' color-interpolation-filters='sRGB'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.9' numOctaves='3' stitchTiles='stitch' seed='7'/%3E%3CfeColorMatrix type='matrix' values='0 0 0 0 0.039 0 0 0 0 0.102 0 0 0 0 0.184 1 0 0 0 0'/%3E%3C/filter%3E%3Crect width='220' height='220' filter='url(%23g)'/%3E%3C/svg%3E");
}

/* ==========================================================================
   MODIFICADORES
   ========================================================================== */

/* --- intensidad --- */
.bd-calm   { --bd-a: .6; }
.bd-strong { --bd-a: 1.35; }   /* solo sobre papel: navy ya va al techo */

/* --- inclinación --- (el dibujo gira; la máscara de .bd no) */
.bd-tilt-l { --bd-rot: -4deg; --bd-over: 14%; }
.bd-tilt-r { --bd-rot: 4deg;  --bd-over: 14%; }

/* --- máscaras de borde: un fondo que se corta a hueso lee barato --- */
.bd-fade-y {
  --bd-fade: 16%;
  -webkit-mask-image: linear-gradient(to bottom, transparent 0, #000 var(--bd-fade), #000 calc(100% - var(--bd-fade)), transparent 100%);
  mask-image: linear-gradient(to bottom, transparent 0, #000 var(--bd-fade), #000 calc(100% - var(--bd-fade)), transparent 100%);
}
.bd-fade-x {
  --bd-fade: 12%;
  -webkit-mask-image: linear-gradient(to right, transparent 0, #000 var(--bd-fade), #000 calc(100% - var(--bd-fade)), transparent 100%);
  mask-image: linear-gradient(to right, transparent 0, #000 var(--bd-fade), #000 calc(100% - var(--bd-fade)), transparent 100%);
}
.bd-fade-focus {
  --bd-focus-x: 50%; --bd-focus-y: 50%;
  -webkit-mask-image: radial-gradient(120% 110% at var(--bd-focus-x) var(--bd-focus-y), #000 18%, rgb(0 0 0 / .35) 62%, transparent 92%);
  mask-image: radial-gradient(120% 110% at var(--bd-focus-x) var(--bd-focus-y), #000 18%, rgb(0 0 0 / .35) 62%, transparent 92%);
}
/* El salvavidas de contraste: vacía el fondo justo donde cae la columna de
   texto y lo deja intacto en los márgenes. Antes de bajar una alfa, prueba
   esto: conserva el dibujo y devuelve el contraste entero al centro. */
.bd-fade-copy {
  --bd-copy-w: 58%; --bd-copy-h: 72%;
  -webkit-mask-image: radial-gradient(ellipse var(--bd-copy-w) var(--bd-copy-h) at 50% 50%, transparent 0%, rgb(0 0 0 / .18) 46%, #000 88%);
  mask-image: radial-gradient(ellipse var(--bd-copy-w) var(--bd-copy-h) at 50% 50%, transparent 0%, rgb(0 0 0 / .18) 46%, #000 88%);
}

/* ==========================================================================
   REDES DE SEGURIDAD
   ========================================================================== */

/* Alto contraste de sistema: fuera el fondo, manda la legibilidad. */
@media (forced-colors: active) {
  .bd { display: none !important; }
}

/* Impresión: no se gasta tinta en decoración. */
@media print {
  .bd { display: none !important; }
}

/* Este archivo no anima nada; esto es por si el motor se apaga a mitad de
   sesión y deja un transform escrito en un plano. */
@media (prefers-reduced-motion: reduce) {
  .bd-i, .bd-i2, .bd-i3 { transform: none !important; will-change: auto !important; }
}
