/* ═══════════════════════════════════════════════════════════════════════════
   c-acceso.css  ·  LA PUERTA DE CADA ÉPOCA
   Contrato: design-system/08-contrato-segunda-tirada.md §2 (marcado) + §3 (reglas)
   Doctrina de vida: 07-contrato-vida-y-armazon.md §0 (MATERIA)

   QUÉ ES
   La caja de entrar. Entrar en la academia no es rellenar dos casillas: es
   CRUZAR UN UMBRAL. Por eso el componente no es un panel con campos dentro —
   es una PUERTA, y cada época tiene la suya:

     1 · Cueva    la boca de la cueva, con la hoguera dentro
     2 · Piedra   el dintel: pórtico de jambas talladas y antorchas
     3 · Papel    la llave y la cerradura: la ficha de acceso del taller
     4 · Hierro   la compuerta: marco remachado de escotilla
     5 · Cabina   la esclusa de luz: el filo recorre el perímetro

   LA IDEA ÚNICA (doctrina §0.5: una idea por época, como máximo)
   `:focus-within` = ALGUIEN ESTÁ ENTRANDO. La puerta lo nota y te recibe. Es
   un solo fenómeno por época, y siempre el mismo verbo: la puerta se ABRE.
   `.is-error` = la puerta te RECHAZA.

   LO QUE ESTE FICHERO **NO** HACE
   No viste los campos. `.c-campo` ya sangra tinta, ya se aviva y ya se enciende
   (`vida/vida-campo.css`), y `.c-boton` ya tiene su chispa. Aquí se compone: se
   colocan, se les da un sitio y se les enciende el MARCO. Ni una regla cambia
   el aspecto de una pieza validada (contrato 08 §3).
   Única excepción declarada y necesaria: la época 3 (§4.0), donde la hoja crema
   es un CONTEXTO DE LUZ invertido y por tanto redeclara tokens `--e-*` en su
   propio ámbito. No se toca ni un selector ajeno: se les cambia la luz de la
   habitación, no la piel.

   AUTOCONTENIDO
   Estructura solo con `var(--e-*)`. Pieles y vida bajo `html[data-epoca="N"]`.
   Ornamentos SVG propios, en `data:`, con prefijo `--ac-`: este fichero no
   depende de ningún `--e1-*`…`--e5-*` ajeno (el Papel se está rehaciendo).
   Cero JS, cero recursos remotos, cero fuentes nuevas.

   MARCADO (contrato 08 §2, congelado)
   <form class="c-acceso">
     <h2 class="c-acceso__titulo">Entra</h2>
     <div class="c-campo">…email…</div>
     <div class="c-campo">…contraseña…</div>
     <button class="c-boton c-boton--brasa c-boton--bloque">Acceder</button>
     <p class="c-acceso__ayuda"><a href="#">¿Olvidaste la contraseña?</a></p>
   </form>
   ═══════════════════════════════════════════════════════════════════════════ */


/* El ángulo de la esclusa (época 5). Se registra para poder ANIMARLO: sin
   `@property` un `<angle>` en un `conic-gradient` no interpola y el trazo daría
   un salto. Si el motor no lo soporta, el valor inicial sigue siendo válido y
   el filo simplemente no viaja: la puerta se enciende igual. */
@property --ac-ang{
  syntax: "<angle>";
  inherits: false;
  initial-value: 0deg;
}


/* ═══════════════════════════════════════════════════════════════════════════
   1 · ESTRUCTURA — la geometría de la puerta. Ni un color a mano.
   ═══════════════════════════════════════════════════════════════════════════ */

.c-acceso{
  /* — el tiempo, ley §0.3: entra en `--e-vel`, sale en `--e-vel × 3.5` — */
  --ac-in:  var(--e-vel);
  --ac-out: calc(var(--e-vel) * 3.5);

  /* — la respiración interna de la puerta —
     NO se usa `--e-gap` en crudo: `--e-aire` recorre 12→40px y cuatro huecos
     en crudo abrían un 22% de diferencia de alto entre la Cueva y la Cabina,
     por encima del ±20% del contrato. Con este factor (·.12) la horquilla
     medida cae a +15,4%. Mismo truco que base.css §1.2. */
  --ac-gap: calc(9px + var(--e-aire) * .12);
  --ac-pad: var(--e-pad-caja);

  /* La puerta no es más ancha que un hombro: una columna de entrar. */
  --ac-ancho: 27rem;

  position: relative;
  isolation: isolate;              /* los ganchos ::before/::after de §1.1 */
  display: grid;
  grid-template-columns: minmax(0, 1fr);
  gap: var(--ac-gap);
  width: 100%;
  max-width: var(--ac-ancho);
  min-width: 0;
  margin-inline: auto;
  padding: var(--ac-pad);

  border: var(--e-grosor) solid var(--e-linea);
  border-radius: var(--e-radio);
  background: var(--e-sup);
  color: var(--e-tinta);
  font-family: var(--e-cuerpo);
}

/* 1.1 · Los dos ganchos de la puerta. `::before` = MATERIA (el umbral: roca,
   piedra, fibra, chapa, cristal) y `::after` = LUZ (lo que se enciende cuando
   entras). Misma gramática que base.css §11, pero declarada aquí porque
   `.c-acceso` no está en su lista de ganchos. Ninguno de los dos aporta caja:
   son capas absolutas, y por eso el ornamento NUNCA dispara la geometría. */
.c-acceso::before,
.c-acceso::after{
  content: "";
  position: absolute;
  inset: 0;
  border-radius: inherit;
  pointer-events: none;
}
.c-acceso::before{ z-index: -1; }   /* encima del fondo, debajo de los campos */
.c-acceso::after { z-index: -1; }   /* la luz del umbral baña, no tapa        */

.c-acceso__titulo{
  margin: 0;
  font-family: var(--e-display);
  font-weight: var(--e-peso-display);
  font-size: clamp(21px, .9rem + 1.4vw, 27px);
  line-height: 1.14;
  letter-spacing: var(--e-tracking);
  color: var(--e-tinta);
}

/* 1.2 · EL MECANISMO. Las épocas que tienen cierre visible (la cerradura del
   Papel, el volante del Hierro) lo cuelgan de los pseudos del título, pero
   ANCLADO AL CANTO DE LA PUERTA — `.c-acceso` es el ancestro posicionado más
   cercano, así que `position:absolute` resuelve contra la puerta, no contra el
   renglón. Consecuencia buscada: el ornamento vive en el margen y no empuja ni
   un píxel de la caja (regla del ±20% medida contra un form desnudo). */
.c-acceso__titulo::before,
.c-acceso__titulo::after{
  content: none;                   /* solo existe donde la época lo enciende */
  position: absolute;
  pointer-events: none;
  background-repeat: no-repeat;
  background-position: center;
  background-size: contain;
  z-index: 2;
}

/* 1.3 · Las piezas prestadas. Solo COLOCACIÓN: ni un color, ni un borde, ni una
   sombra suya se toca aquí. El botón ocupa el ancho porque una puerta tiene una
   hoja, no un pomo en una esquina. (`c-boton--bloque` es del contrato 08 §2 y
   lo declarará su dueño; esta regla es local a la puerta y no lo suplanta.) */
.c-acceso .c-boton{
  width: 100%;
  margin-top: calc(var(--ac-gap) * .3);
}

.c-acceso__ayuda{
  margin: 0;
  font-family: var(--e-cuerpo);
  font-size: 13px;
  line-height: 1.45;
  text-align: center;
  color: var(--e-tinta-2);
}
.c-acceso__ayuda a{
  color: inherit;
  text-decoration-line: underline;
  text-decoration-thickness: from-font;
  text-underline-offset: .22em;
  transition: color var(--ac-out) var(--e-curva);
}
.c-acceso__ayuda a:hover{
  color: var(--e-tinta);
  transition-duration: var(--ac-in);
}
.c-acceso__ayuda a:focus-visible{ outline-color: var(--e-acento); }

/* 1.4 · LA PUERTA RECHAZA — `.is-error`
   ─────────────────────────────────────────────────────────────────────────
   Contrato de la clase: la pone el servidor en el `<form>` cuando las
   credenciales no valen. Es INDEPENDIENTE de `.c-campo--error` (que marca QUÉ
   casilla falla): aquí no falla un campo, falla el paso.

   El gesto es una SACUDIDA HORIZONTAL de dos oscilaciones y para. Es lo que
   hace una puerta cerrada cuando la empujas: se mueve en su marco y vuelve. No
   se repite, no rebota una tercera vez y no cambia el alto (solo `translate`).

   La duración NO sale de `--e-vel` en crudo: un rechazo es abrupto en las cinco
   épocas, y 720ms de sacudida en la Cueva sería un bostezo. Término fijo +
   factor pequeño: 338ms en la Cueva, 209ms en la Cabina.

   Época 5 no sacude: en la sala de mando lo que pasa es que el filo se pone
   rojo (§6.4). Se cancela allí. */
.c-acceso.is-error{
  animation: ac-rechazo calc(180ms + var(--e-vel) * .22) var(--e-curva) 1 both;
}
@keyframes ac-rechazo{
  0%  { transform: translate3d(0, 0, 0); }
  22% { transform: translate3d(-6px, 0, 0); }
  46% { transform: translate3d(5px, 0, 0); }
  72% { transform: translate3d(-2.5px, 0, 0); }
  100%{ transform: translate3d(0, 0, 0); }
}

/* 1.5 · A 390px la puerta ocupa lo que hay, sin desbordar nunca: `max-width`
   la limita arriba y `width:100%` + `min-width:0` la dejan encoger. Lo único
   que se aprieta es el aire lateral, para que el pórtico de la época 2 no se
   coma la columna de escribir. */
@media (max-width: 430px){
  .c-acceso{ --ac-pad: calc(var(--e-pad-caja) * .82); }
}


/* ═══════════════════════════════════════════════════════════════════════════
   2 · ÉPOCA 1 · CUEVA — LA BOCA DE LA CUEVA
   La puerta no está construida: está EXCAVADA. El hueco es más negro que la
   pared, el contorno lo pintó una mano con pigmento y dentro hay una hoguera.
   Idea única: LA HOGUERA SE AVIVA. Al entrar alguien, el fuego levanta y el
   umbral se calienta: la luz sale del hueco y lame la roca de alrededor.
   ═══════════════════════════════════════════════════════════════════════════ */

html[data-epoca="1"] .c-acceso{
  --ac-boca:        #0A0604;                  /* el fondo del hueco          */
  --ac-boca-2:      #150C07;                  /* la roca del canto           */
  --ac-borde:       rgba(201, 122, 61, .58);  /* pigmento cargado            */
  --ac-borde-vivo:  rgba(255, 178, 116, .78);
  --ac-alarma:      #EE7C52;                  /* tierra quemada aclarada     */

  /* Moteado de ocre con la alfa ACOTADA en el propio SVG (nunca `overlay`
     sobre un fondo casi negro: eso levanta los oscuros y se lleva el
     contraste por delante). Peor píxel = interpolación conocida. */
  --ac-moteado: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='180' height='180'%3E%3Cfilter id='a' color-interpolation-filters='sRGB'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.82' numOctaves='4' seed='13' stitchTiles='stitch'/%3E%3CfeColorMatrix type='matrix' values='0 0 0 0 .788 0 0 0 0 .478 0 0 0 0 .239 .13 0 0 0 0'/%3E%3C/filter%3E%3Crect width='180' height='180' filter='url(%23a)'/%3E%3C/svg%3E");

  border-width: var(--e-grosor);
  border-color: var(--ac-borde);
  background:
    var(--ac-moteado),
    radial-gradient(120% 86% at 50% 106%, var(--ac-boca-2) 0%, var(--ac-boca) 62%),
    var(--ac-boca);
  box-shadow:
    inset 0 3px 10px -4px rgba(0, 0, 0, .9),
    0 0 0 0 rgba(255, 106, 31, 0);
  transition:
    border-color var(--ac-out) var(--e-curva),
    box-shadow   var(--ac-out) var(--e-curva);
}

/* ::before — LA HOGUERA. Vive en el suelo del hueco y sube. En reposo está
   ENCENDIDA pero baja (es un rescoldo, no un apagón): la cueva nunca está
   fría. Al entrar alguien, levanta.
   El corte de la falda (`74%`) es deliberado: por encima de esa línea vive el
   texto de ayuda, y ahí la brasa ya no llega con alfa que valga. */
html[data-epoca="1"] .c-acceso::before{
  mix-blend-mode: screen;                     /* es luz: solo puede aclarar */
  background:
    radial-gradient(78% 44% at 50% 104%,
      rgba(255, 106, 31, .58)  0%,
      rgba(255, 106, 31, .26) 34%,
      rgba(201,  60,  10, .10) 56%,
      transparent 74%);
  opacity: .42;
  transform: scaleY(.86);
  transform-origin: 50% 100%;
  filter: blur(6px);
  transition:
    opacity   var(--ac-out) var(--e-curva),
    transform var(--ac-out) var(--e-curva),
    filter    var(--ac-out) var(--e-curva);
}
html[data-epoca="1"] .c-acceso:focus-within::before{
  opacity: 1;
  transform: scaleY(1);
  filter: blur(4.5px);
  transition-duration: var(--ac-in);
}

/* ::after — EL UMBRAL QUE TE RECIBE. El labio de roca que rodea la boca: la
   luz de dentro le pega de refilón y lo dibuja. Es lo que convierte el
   degradado en un AGUJERO con canto. Apagado en reposo; al entrar, el canto
   se enciende entero (arriba menos: la luz viene de abajo). */
html[data-epoca="1"] .c-acceso::after{
  box-shadow:
    inset 0 -14px 26px -12px rgba(255, 106, 31, .55),
    inset 0  22px 34px -26px rgba(255, 160,  90, .30);
  opacity: 0;
  transition: opacity var(--ac-out) var(--e-curva);
}
html[data-epoca="1"] .c-acceso:focus-within::after{
  opacity: 1;
  transition-duration: var(--ac-in);
}

/* La luz es una FUENTE (doctrina §0.2): si la hoguera sube, tiene que salirse
   por la boca y lamer la pared. Sin esto, la puerta se enciende «por dentro»
   y no ha pasado nada en el mundo. */
html[data-epoca="1"] .c-acceso:focus-within{
  border-color: var(--ac-borde-vivo);
  box-shadow:
    inset 0 3px 10px -4px rgba(0, 0, 0, .9),
    0 18px 54px -20px rgba(255, 106, 31, .42);
  transition-duration: var(--ac-in);
}

/* Junto al fuego se escribe con cal, no con ocre lavado: el texto de ayuda cae
   justo sobre la falda de la hoguera y con `--e-tinta-2` perdería contraste
   cuando el fuego sube. Medido: 6,9:1 con la hoguera al máximo. */
html[data-epoca="1"] .c-acceso__ayuda{ color: #E9D3BC; }
html[data-epoca="1"] .c-acceso__ayuda a:hover{ color: var(--e-tinta); }

/* Rechazo: el fuego no te recibe, te ESCUECE. El contorno pasa a tierra
   quemada y la hoguera se queda abajo (arde para otro). */
html[data-epoca="1"] .c-acceso.is-error{
  border-color: var(--ac-alarma);
  box-shadow:
    inset 0 3px 10px -4px rgba(0, 0, 0, .9),
    0 14px 40px -22px rgba(238, 124, 82, .40);
}
html[data-epoca="1"] .c-acceso.is-error::before{ opacity: .16; }   /* el fuego se retira */
html[data-epoca="1"] .c-acceso.is-error::after{
  opacity: 1;
  box-shadow:
    inset 0 0  0 2px rgba(238, 124, 82, .42),
    inset 0 -12px 26px -14px rgba(238, 124, 82, .40);
}


/* ═══════════════════════════════════════════════════════════════════════════
   3 · ÉPOCA 2 · PIEDRA — EL DINTEL
   Un vano no es un agujero: es dos JAMBAS que sostienen un DINTEL. El pórtico
   se talla alrededor del formulario, con su relieve de doble sombra (luz
   arriba, corte duro debajo) y sus dos antorchas encajadas en las jambas.
   Idea única: LAS ANTORCHAS SUBEN. La piedra no se mueve — nunca — ; lo que
   cambia es quién lleva la luz.
   ═══════════════════════════════════════════════════════════════════════════ */

html[data-epoca="2"] .c-acceso{
  --ac-jamba:        13px;                     /* el canto del sillar        */
  --ac-dintel:       19px;
  --ac-piedra:       #2F2921;
  --ac-piedra-alta:  #443B2E;                  /* la cara que da a la llama  */
  --ac-piedra-honda: #16120D;
  --ac-vano:         #16130F;                  /* el paso, más hondo que el muro */
  --ac-corte:        rgba(0, 0, 0, .78);
  --ac-brillo:       rgba(232, 226, 213, .26);
  --ac-alarma:       #E0764B;                  /* la fisura                  */

  /* El pórtico se come su propio sitio: el aire interior crece justo lo que
     ocupan jambas y dintel, así el texto nunca queda debajo de la piedra. */
  padding-inline: calc(var(--ac-pad) + var(--ac-jamba));
  padding-top:    calc(var(--ac-pad) + var(--ac-dintel) * .34);

  border-color: rgba(207, 199, 184, .18);
  background:
    linear-gradient(180deg, #191510 0%, var(--ac-vano) 46%, #12100C 100%);
  box-shadow: inset 0 2px 0 0 rgba(0, 0, 0, .5);
  transition: box-shadow var(--ac-out) var(--e-curva);
}

/* ::before — EL PÓRTICO. Tres bandas de sillar (dos jambas + dintel) con su
   relieve: filo claro arriba/afuera, corte negro abajo/adentro. Se pinta hasta
   el borde (`inset` negativo del grosor) porque la piedra ES el marco. */
html[data-epoca="2"] .c-acceso::before{
  inset: calc(var(--e-grosor) * -1);
  background:
    /* dintel: el sillar que cruza y descansa sobre las dos jambas */
    linear-gradient(180deg,
      var(--ac-piedra-alta) 0%,
      var(--ac-piedra)      54%,
      var(--ac-piedra-honda) 100%)
      top    / 100% var(--ac-dintel) no-repeat,
    /* jamba izquierda: sillar con UN canal tallado. La luz le pega por dentro
       (viene de la antorcha), así que la cara interior es la que brilla. */
    linear-gradient(90deg,
      var(--ac-piedra-honda) 0%,
      var(--ac-piedra)       22%,
      var(--ac-piedra-honda) 38%,          /* el canal */
      var(--ac-piedra)       50%,
      var(--ac-piedra-alta)  84%,
      var(--ac-piedra-honda) 100%)
      left   / var(--ac-jamba) 100% no-repeat,
    /* jamba derecha: espejo */
    linear-gradient(270deg,
      var(--ac-piedra-honda) 0%,
      var(--ac-piedra)       22%,
      var(--ac-piedra-honda) 38%,
      var(--ac-piedra)       50%,
      var(--ac-piedra-alta)  84%,
      var(--ac-piedra-honda) 100%)
      right  / var(--ac-jamba) 100% no-repeat;
  box-shadow:
    inset 0 calc(var(--ac-dintel) * 1)  0 -1px var(--ac-corte),
    inset 0 1px 0 0 var(--ac-brillo);
}

/* ::after — LAS DOS ANTORCHAS, encajadas en el alto de cada jamba, más el
   lametón rasante que sueltan sobre el dintel. En reposo arden bajas (una
   antorcha no se apaga porque no haya nadie); al entrar, suben.
   La luz no se desplaza: CRECE desde el punto donde está la tea. Eso es lo que
   la distingue de un fundido. */
html[data-epoca="2"] .c-acceso::after{
  inset: calc(var(--e-grosor) * -1);
  mix-blend-mode: screen;
  background:
    radial-gradient(22px 46px at calc(var(--ac-jamba) * .5) 22%,
      rgba(255, 176, 108, .78) 0%, rgba(255, 138, 61, .34) 32%, transparent 76%),
    radial-gradient(22px 46px at calc(100% - var(--ac-jamba) * .5) 22%,
      rgba(255, 176, 108, .78) 0%, rgba(255, 138, 61, .34) 32%, transparent 76%),
    linear-gradient(180deg,
      rgba(255, 138, 61, .22) 0%,
      rgba(255, 138, 61, .05) calc(var(--ac-dintel) * 1.4),
      transparent calc(var(--ac-dintel) * 2.4));
  opacity: .24;
  transform: scale(.955);
  transform-origin: 50% 16%;                   /* donde están las teas */
  filter: blur(2px);
  transition:
    opacity   var(--ac-out) var(--e-curva),
    transform var(--ac-out) var(--e-curva);
}
html[data-epoca="2"] .c-acceso:focus-within::after{
  opacity: 1;
  transform: scale(1);
  transition-duration: var(--ac-in);
}

/* La luz sale del vano y baña la sala. Igual que en la Cueva: si nada cambia
   fuera, no se ha encendido nada. */
html[data-epoca="2"] .c-acceso:focus-within{
  box-shadow:
    inset 0 2px 0 0 rgba(0, 0, 0, .5),
    0 16px 46px -22px rgba(255, 138, 61, .34);
  transition-duration: var(--ac-in);
}

/* Rechazo: la fisura. La piedra se sacude en su sitio y aparece la grieta que
   ya estaba antes de que llegaras. */
html[data-epoca="2"] .c-acceso.is-error::before{
  box-shadow:
    inset 0 calc(var(--ac-dintel) * 1) 0 -1px var(--ac-corte),
    inset 0 1px 0 0 var(--ac-brillo),
    inset 0 0 0 2px rgba(224, 118, 75, .34);
}


/* ═══════════════════════════════════════════════════════════════════════════
   4 · ÉPOCA 3 · PAPEL (TALLER DE NOCHE) — LA LLAVE Y LA CERRADURA
   El mundo es el taller a oscuras. La puerta no es una puerta de madera: es la
   FICHA DE ACCESO del taller — una hoja crema sobre el banco, con la placa de
   la cerradura grabada en el canto y una llave metida.
   Idea única: LA LLAVE GIRA. Una pasada, y de paso la hoja se acerca a la
   lámpara de la época (el derrame se aviva y el poso crece, como haría
   cualquier hoja del taller al levantarse hacia la luz).

   4.0 · LA PUERTA ES UNA SUPERFICIE DE PAPEL: SE UNE AL CONTEXTO, NO LO PISA
   ─────────────────────────────────────────────────────────────────────────
   El rework de la época 3 (contrato 08 §1) deja el mundo OSCURO y el papel en
   las superficies, y resuelve las dos direcciones de contraste con un mecanismo
   publicado en su propia cabecera: unos tokens de CONTEXTO (`--e3-texto`,
   `--e3-texto-2`, `--e3-filete`, `--e3-rojo`, `--e3-rojo-hondo`, `--e3-verde`,
   `--e3-regla`, `--e3-papel-local`, `--e3-foco`) que valen lo del TALLER en la
   raíz y que **cada superficie de papel redeclara a los valores de la hoja**.
   Todo lo que cae dentro se vuelve tinta solo, por herencia.

   `.c-acceso` es una superficie de papel más — la ficha del taller — y por eso
   hace exactamente lo mismo que `.c-panel`: redeclara el contexto. Eso NO es
   redefinir piezas validadas (contrato 08 §3): no se toca ni una regla ajena,
   se les cambia la luz de la habitación. Es la única manera de que el sello del
   botón se estampe en RÚBRICA (seca, sobre papel) en vez de en MINIO (fresca,
   bajo el quinqué), y de que la etiqueta del campo no salga crema sobre crema.
   Redeclara `--e3-foco` porque, como el panel, CONTIENE piezas.

   Los valores van LITERALES y no como `var(--e3-tinta-hoja)`: así este fichero
   sigue siendo autocontenido (no lee ni un token ajeno; solo alimenta los que
   las pieles de la época ya leen). Los `--e-*` de abajo son el mismo papel por
   la otra vía — la que usan las reglas de base.css que no pasan por `--e3-*` —
   y por eso apuntan al mismo sitio: si un día la época deja de existir, la
   puerta sigue siendo legible.

   4.0 bis · LA LÁMPARA REALINEADA (pasada de cohesión, 2026-08-12)
   ─────────────────────────────────────────────────────────────────────────
   Diagnóstico de Bernat paseando el espejo: esta ficha llevaba un QUINQUÉ
   PROPIO — un derrame cálido con su propio color (`--ac-quinque`) nacido en la
   esquina superior IZQUIERDA (`radial-gradient(… at 6% -8% …)`), y encima
   posaba con una sombra recta hacia abajo que no apuntaba a ningún lado. Dos
   pegotes: una segunda lámpara que la época no tiene, y un poso sin lado.

   `epoca-3.css` ya resolvió esto para toda la época — LA LEY DE LA LÁMPARA: hay
   una sola, arriba a la derecha, y toda hoja coge luz por su canto de arriba y
   de la derecha y posa sombra corta+larga hacia abajo-izquierda
   (`--e3-luz-hoja-corta`, `--e3-poso`, `--e3-poso-alto`). `.c-portada-curso` y
   `.c-precio` ya la adoptaron (ver sus cabeceras); esta ficha es la última en
   unirse:

     · fuera `--ac-quinque` y el radial propio del `::before`: la estructura de
       la hoja (verjurado + luz) pasa al `background-image` de la caja, igual
       que en `.c-panel` — la misma lámpara, no una privada.
     · el `::before` (materia) vuelve a ser SOLO fibra, con `--e3-fibra`
       compartida en vez de la receta `--ac-fibra` propia.
     · el poso deja de ser una receta a mano: `box-shadow: var(--e3-poso)`
       en reposo y `var(--e3-poso-alto)` en `:focus-within` — el mismo lado,
       más recorrido, que es justo lo que pide «la hoja se acerca a la luz».
     · el `::after` (antes «el canto de la hoja», redundante con el poso, que
       ya lleva el filo claro/hundido en sus `inset`) pasa a ser el derrame
       que SE AVIVA al entrar — `--e3-luz-hoja-corta` de nuevo, ahora anclado
       arriba-a-la-derecha, 0.55 en reposo → 1 al enfocar. «Acercarse a la
       lámpara» sigue queriendo decir hacia arriba-derecha, nunca hacia la
       izquierda: ahora lo dice el mismo token que usan sus hermanas.
     · el escudo y la llave NO se tocan — ya vivían en el canto alto derecho,
       que resulta ser exactamente donde está la lámpara. La metáfora sale
       reforzada, no rehecha.
   ═══════════════════════════════════════════════════════════════════════════ */

html[data-epoca="3"] .c-acceso{
  /* — CONTEXTO DE HOJA (mecanismo publicado por la época; valores de la hoja) — */
  --e3-texto:         #1A1714;                 /* negro de humo   · 14,9:1      */
  --e3-texto-2:       #4A423A;                 /* segunda pasada  ·  7,4:1      */
  --e3-filete:        rgba(26, 23, 20, .20);
  --e3-rojo:          #A8321E;                 /* rúbrica seca    ·  5,6:1      */
  --e3-rojo-hondo:    #8E2A18;                 /* cuando la prensa aprieta      */
  --e3-verde:         #1B5334;
  --e3-regla:         #1A1714;
  --e3-papel-local:   #F2EAD9;                 /* lo que hay DEBAJO del sello   */
  --e3-foco:          #1A1714;

  /* — el mismo papel por la vía de base.css — */
  --e-fondo:          #F2EAD9;
  --e-fondo-2:        #E9DFC9;
  --e-tinta:          #1A1714;
  --e-tinta-2:        #4A423A;
  --e-linea:          rgba(26, 23, 20, .20);
  --e-acento:         #A8321E;                 /* en papel manda la rúbrica     */
  --e-acento-nucleo:  #C4551A;                 /* ornamento, jamás texto        */
  --e-halo:           rgba(168, 50, 30, .18);  /* en papel no hay halo: cerco   */
  --e-ok:             #1B5334;

  /* — adornos propios — */
  --ac-papel:      #F2EAD9;
  --ac-alarma:     #A8321E;

  /* LA PLACA DE LA CERRADURA: escudo grabado + ojo. Tinta sobre papel. */
  --ac-escudo: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='44' height='44' viewBox='0 0 44 44'%3E%3Cg fill='none' stroke='%23241C15'%3E%3Ccircle cx='22' cy='22' r='19' stroke-width='1.4'/%3E%3Ccircle cx='22' cy='22' r='15.6' stroke-width='.7' opacity='.5'/%3E%3C/g%3E%3Cpath d='M22 11.4a5 5 0 0 0-2.9 9.1l-2 9.1a1.3 1.3 0 0 0 1.3 1.6h7.2a1.3 1.3 0 0 0 1.3-1.6l-2-9.1a5 5 0 0 0-2.9-9.1z' fill='%23241C15'/%3E%3C/svg%3E");

  /* LA LLAVE: rúbrica con dobladillo de papel debajo, para que se despegue del
     ojo (que es tinta plena). El eje de giro es el centro exacto del ojo. */
  --ac-llave: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='44' height='44' viewBox='0 0 44 44'%3E%3Cg fill='none' stroke='%23F2EAD9' stroke-width='4.6' stroke-linecap='round'%3E%3Ccircle cx='22' cy='14.4' r='4.1'/%3E%3Cpath d='M22 18.5v13.1M22 29.4h3.6M22 26.1h2.8'/%3E%3C/g%3E%3Cg fill='none' stroke='%23A8321E' stroke-width='2.1' stroke-linecap='round'%3E%3Ccircle cx='22' cy='14.4' r='4.1'/%3E%3Cpath d='M22 18.5v13.1M22 29.4h3.6M22 26.1h2.8'/%3E%3C/g%3E%3C/svg%3E");

  border-color: rgba(36, 28, 21, .30);
  background-color: var(--ac-papel);
  /* LA ESTRUCTURA Y LA LUZ DE LA HOJA — ya no una receta propia (el degradado
     168deg + el quinqué del ::before de antes): el verjurado (corondeles +
     puntizones) y el derrame de LA lámpara de la época, compartidos con
     `.c-panel`/`.c-portada-curso`/`.c-precio`. Misma dirección que sus hojas:
     arriba a la derecha. */
  background-image: var(--e3-verjurado), var(--e3-luz-hoja-corta);
  /* LA HOJA, POSADA — el poso común de la época (LA LEY DE LA LÁMPARA en
     epoca-3.css): canto claro arriba y a la derecha, sombra corta y densa
     hacia abajo-izquierda, más la larga detrás. Antes era una sombra recta
     hacia abajo, sin lado: no apuntaba a la lámpara de nadie. */
  box-shadow: var(--e3-poso);
  transition: box-shadow var(--ac-out) var(--e-curva);
}

/* El título se aparta de la placa: la caja no cambia, el renglón sí. Y los dos
   textos PROPIOS de la puerta entran también en el contexto de hoja: son míos,
   así que los pinto yo con la tinta de la hoja, no con la del taller. */
html[data-epoca="3"] .c-acceso__titulo{
  padding-right: 3.4rem;
  color: var(--e3-texto);
}
html[data-epoca="3"] .c-acceso__ayuda{ color: var(--e3-texto-2); }
html[data-epoca="3"] .c-acceso__ayuda a:hover{ color: var(--e3-texto); }

/* ::before — MATERIA: SOLO la fibra de trapo, y ya no un quinqué propio. El
   canto/la estructura de la hoja se los da el poso y el `background-image` de
   la caja (ver arriba); aquí solo queda la textura, en `multiply` y con la
   fibra COMPARTIDA de la época — la misma que `.c-panel`/`.c-portada-curso`,
   nunca una receta local. Estática: ninguna hermana anima su fibra al entrar. */
html[data-epoca="3"] .c-acceso::before{
  background-image: var(--e3-fibra);
  background-size: 260px 260px;
  mix-blend-mode: multiply;
  opacity: .08;
}

/* ::after — EL DERRAME QUE SE AVIVA. Antes «el canto de la hoja» (un filete +
   sombra redundante con el poso, que ya lleva ese mismo relieve en sus
   `inset`); ahora es LUZ de verdad: la misma `--e3-luz-hoja-corta` que ilumina
   la hoja en reposo, puesta OTRA VEZ aquí para poder DOSIFICARLA — 0.55 en
   reposo (la lámpara está lejos) → 1 al entrar (la hoja se acerca). Ancla
   arriba-a-la-derecha, la misma lámpara de siempre: «acercarse» sigue siendo
   hacia ese lado, nunca hacia la izquierda. */
html[data-epoca="3"] .c-acceso::after{
  background-image: var(--e3-luz-hoja-corta);
  opacity: .55;
  transition: opacity var(--ac-out) var(--e-curva);
}
html[data-epoca="3"] .c-acceso:focus-within::after{
  opacity: 1;
  transition-duration: var(--ac-in);
}

/* — EL MECANISMO: placa + llave, en el canto alto derecho de la ficha — */
html[data-epoca="3"] .c-acceso__titulo::before,
html[data-epoca="3"] .c-acceso__titulo::after{
  content: "";
  top: calc(var(--ac-pad) - 4px);
  right: calc(var(--ac-pad) - 4px);
  width: 44px;
  height: 44px;
}
html[data-epoca="3"] .c-acceso__titulo::before{
  background-image: var(--ac-escudo);
  opacity: .82;
}
/* LA LLAVE GIRA. Una pasada, 400ms al entrar; al salir vuelve despacio
   (1400ms) — la puerta se cierra sola, pero sin dar un portazo. */
html[data-epoca="3"] .c-acceso__titulo::after{
  background-image: var(--ac-llave);
  transform: rotate(0deg);
  transform-origin: 50% 50%;
  transition: transform var(--ac-out) cubic-bezier(.34, .04, .26, 1);
}
html[data-epoca="3"] .c-acceso:focus-within .c-acceso__titulo::after{
  transform: rotate(86deg);
  transition-duration: var(--ac-in);
}

/* La hoja SE ACERCA A LA LÁMPARA: mismo lado, misma dirección, más recorrido
   — el poso «alto» común de la época (ver `.c-panel:hover`), no una sombra
   propia recogida hacia dentro. Sin escala: la caja no se mueve. */
html[data-epoca="3"] .c-acceso:focus-within{
  box-shadow: var(--e3-poso-alto);
  transition-duration: var(--ac-in);
}

/* Rechazo: la llave no entra. El poso se queda en reposo (la hoja no se
   acerca a nada) y se marca un cerco de rúbrica — la corrección del cajista —
   directamente en el poso de la caja, ya que el `::after` dejó de llevar
   box-shadow propio (ahora es la luz que se aviva, y una puerta que rechaza
   no se ilumina más: se apaga). */
html[data-epoca="3"] .c-acceso.is-error .c-acceso__titulo::after{
  transform: rotate(0deg);
}
html[data-epoca="3"] .c-acceso.is-error{
  box-shadow:
    inset 0 0 0 2px var(--ac-alarma),
    var(--e3-poso);
}
html[data-epoca="3"] .c-acceso.is-error::after{
  opacity: 0;
}


/* ═══════════════════════════════════════════════════════════════════════════
   5 · ÉPOCA 4 · HIERRO — LA COMPUERTA
   Escotilla de sala de máquinas: chapa, marco remachado y un volante de cierre.
   Idea única: SE ABRE LA COMPUERTA. El volante gira un cuarto y el filamento
   del marco se enciende por dentro — el mismo gesto en dos piezas, que es
   exactamente lo que hace un mecanismo.
   ═══════════════════════════════════════════════════════════════════════════ */

html[data-epoca="4"] .c-acceso{
  --ac-marco:        11px;                      /* la pletina remachada       */
  --ac-hierro:       #35322E;
  --ac-hierro-alto:  #4E4842;
  --ac-hierro-hondo: #201D1A;
  --ac-chapa:        #17140F;                   /* la hoja de la compuerta    */
  --ac-laton:        #C6A470;
  --ac-laton-bajo:   #6B532F;
  --ac-alarma:       #E88A6A;                   /* óxido, no led rojo         */

  --ac-volante: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='44' height='44' viewBox='0 0 44 44'%3E%3Cg fill='none' stroke='%23C6A470' stroke-width='2' stroke-linecap='round'%3E%3Ccircle cx='22' cy='22' r='15.4'/%3E%3Ccircle cx='22' cy='22' r='4.2'/%3E%3Cpath d='M22 17.8V7.2M26.2 20.6l10-3.3M24.6 25.5l6.2 8.5M19.4 25.5l-6.2 8.5M17.8 20.6l-10-3.3'/%3E%3C/g%3E%3Cg fill='%23C6A470'%3E%3Ccircle cx='22' cy='6.6' r='2.1'/%3E%3Ccircle cx='36.6' cy='17' r='2.1'/%3E%3Ccircle cx='31' cy='34.2' r='2.1'/%3E%3Ccircle cx='13' cy='34.2' r='2.1'/%3E%3Ccircle cx='7.4' cy='17' r='2.1'/%3E%3C/g%3E%3C/svg%3E");

  padding: calc(var(--ac-pad) + var(--ac-marco) * .28);
  border-color: rgba(198, 164, 112, .26);
  background:
    linear-gradient(180deg, #1A1712 0%, var(--ac-chapa) 44%, #131009 100%);
  box-shadow:
    inset 0 1px 0 0 rgba(255, 226, 190, .07),
    inset 0 -1px 0 0 rgba(0, 0, 0, .6);
  transition: box-shadow var(--ac-out) linear;
}

html[data-epoca="4"] .c-acceso__titulo{ padding-right: 3.4rem; }

/* ::before — EL MARCO REMACHADO. Cuatro pletinas de hierro y una hilera de
   remaches de latón por cada lado. Los remaches se dibujan con un radial
   repetido, no con un PNG: pesan cero y escalan con la puerta. */
html[data-epoca="4"] .c-acceso::before{
  inset: calc(var(--e-grosor) * -1);
  background:
    /* remaches: arriba, abajo, izquierda, derecha */
    radial-gradient(circle at 50% 50%,
      rgba(226, 198, 150, .95) 0 1.5px, var(--ac-laton-bajo) 2.1px, transparent 2.7px)
      calc(var(--ac-marco) * .5) calc(var(--ac-marco) * .5) / 30px 30px repeat-x,
    radial-gradient(circle at 50% 50%,
      rgba(226, 198, 150, .95) 0 1.5px, var(--ac-laton-bajo) 2.1px, transparent 2.7px)
      calc(var(--ac-marco) * .5) calc(100% - var(--ac-marco) * .5) / 30px 30px repeat-x,
    radial-gradient(circle at 50% 50%,
      rgba(226, 198, 150, .95) 0 1.5px, var(--ac-laton-bajo) 2.1px, transparent 2.7px)
      calc(var(--ac-marco) * .5) calc(var(--ac-marco) * .5 + 30px) / 30px 30px repeat-y,
    radial-gradient(circle at 50% 50%,
      rgba(226, 198, 150, .95) 0 1.5px, var(--ac-laton-bajo) 2.1px, transparent 2.7px)
      calc(100% - var(--ac-marco) * .5) calc(var(--ac-marco) * .5 + 30px) / 30px 30px repeat-y,
    /* pletinas */
    linear-gradient(180deg, var(--ac-hierro-alto) 0%, var(--ac-hierro) 52%, var(--ac-hierro-hondo) 100%)
      top    / 100% var(--ac-marco) no-repeat,
    linear-gradient(0deg,   var(--ac-hierro-alto) 0%, var(--ac-hierro) 52%, var(--ac-hierro-hondo) 100%)
      bottom / 100% var(--ac-marco) no-repeat,
    linear-gradient(90deg,  var(--ac-hierro-alto) 0%, var(--ac-hierro) 52%, var(--ac-hierro-hondo) 100%)
      left   / var(--ac-marco) 100% no-repeat,
    linear-gradient(270deg, var(--ac-hierro-alto) 0%, var(--ac-hierro) 52%, var(--ac-hierro-hondo) 100%)
      right  / var(--ac-marco) 100% no-repeat;
}

/* ::after — EL FILAMENTO DEL MARCO. Un hilo de latón por dentro de la pletina,
   que en reposo está frío (apenas se ve el metal) y al abrir SE ENCIENDE: sube
   a naranja de bombilla y suelta su resplandor hacia dentro y hacia fuera.
   240ms para encender, 840ms para enfriar: es un filamento, no un led. */
html[data-epoca="4"] .c-acceso::after{
  inset: var(--ac-marco);
  border: 1px solid var(--ac-laton-bajo);
  border-radius: 1px;
  box-shadow: 0 0 0 0 rgba(255, 176, 112, 0);
  opacity: .6;
  transition:
    border-color var(--ac-out) linear,
    box-shadow   var(--ac-out) linear,
    opacity      var(--ac-out) linear;
}
html[data-epoca="4"] .c-acceso:focus-within::after{
  border-color: #FFDCB4;
  box-shadow:
    0 0 20px 1px rgba(255, 176, 112, .52),
    0 0 4px 0   rgba(255, 224, 190, .60),
    inset 0 0 26px 2px rgba(255, 176, 112, .20);
  opacity: 1;
  transition-duration: var(--ac-in);
}

/* — EL VOLANTE: gira un cuarto exacto. Cinco radios, no cuatro: con simetría
   de 90° el cuarto de vuelta sería invisible y el mecanismo no se leería. */
html[data-epoca="4"] .c-acceso__titulo::before{
  content: "";
  top: calc(var(--ac-pad) + var(--ac-marco) * .28 - 3px);
  right: calc(var(--ac-pad) + var(--ac-marco) * .28 - 3px);
  width: 42px;
  height: 42px;
  background-image: var(--ac-volante);
  opacity: .62;
  transform: rotate(0deg);
  transform-origin: 50% 50%;
  transition:
    transform var(--ac-out) cubic-bezier(.3, .02, .24, 1),
    opacity   var(--ac-out) linear;
}
html[data-epoca="4"] .c-acceso:focus-within .c-acceso__titulo::before{
  transform: rotate(90deg);
  opacity: 1;
  transition-duration: var(--ac-in);
}

/* Y el mundo lo nota: la compuerta encendida tiñe la chapa de alrededor. */
html[data-epoca="4"] .c-acceso:focus-within{
  box-shadow:
    inset 0 1px 0 0 rgba(255, 226, 190, .07),
    inset 0 -1px 0 0 rgba(0, 0, 0, .6),
    0 16px 44px -24px rgba(255, 176, 112, .34);
  transition-duration: var(--ac-in);
}

/* Rechazo: la compuerta no cede. Sacudida en el marco, el volante vuelve a su
   sitio y el filamento se pone de óxido (esta época no tiene rojo de alarma:
   tiene metal que se ha estropeado). */
html[data-epoca="4"] .c-acceso.is-error .c-acceso__titulo::before{
  transform: rotate(0deg);
}
html[data-epoca="4"] .c-acceso.is-error::after{
  opacity: 1;
  border-color: var(--ac-alarma);
  box-shadow: 0 0 10px 0 rgba(232, 138, 106, .28);
}


/* ═══════════════════════════════════════════════════════════════════════════
   6 · ÉPOCA 5 · CABINA — LA ESCLUSA DE LUZ
   Panel de cristal. No hay materia que abrir: hay una autorización que se
   comprueba. Idea única: EL FILO RECORRE EL PERÍMETRO. Un trazo de luz da UNA
   vuelta al cristal, seca (≈600ms, lineal, sin rebote), y se apaga. No se
   repite mientras sigas dentro: la esclusa ya te leyó.
   ═══════════════════════════════════════════════════════════════════════════ */

html[data-epoca="5"] .c-acceso{
  --ac-filo:      rgba(238, 241, 246, .14);
  --ac-filo-alto: rgba(238, 241, 246, .26);
  --ac-alarma:    #FF5A3C;                     /* la misma luz, corrida al rojo */

  border-color: var(--ac-filo);
  background:
    linear-gradient(180deg,
      rgba(255, 255, 255, .052) 0%,
      rgba(255, 255, 255, .014) 46%,
      rgba(255, 255, 255, .024) 100%),
    color-mix(in oklab, var(--e-sup) 76%, transparent);
  box-shadow:
    inset 0 1px 0 0 rgba(255, 255, 255, .07),
    0 24px 60px -34px rgba(0, 0, 0, .9);
  transition:
    border-color var(--ac-out) var(--e-curva),
    box-shadow   var(--ac-out) var(--e-curva);
}
html[data-epoca="5"] .c-acceso:focus-within{
  border-color: var(--ac-filo-alto);
  box-shadow:
    inset 0 1px 0 0 rgba(255, 255, 255, .10),
    0 24px 60px -34px rgba(0, 0, 0, .9),
    0 0 44px -18px rgba(255, 106, 31, .30);
  transition-duration: var(--ac-in);
}

/* ::before — EL VIDRIO. Un realce interior de 1px y nada más: en la cabina la
   materia no se nota, se intuye. */
html[data-epoca="5"] .c-acceso::before{
  box-shadow: inset 0 0 0 1px rgba(255, 255, 255, .035);
}

/* ::after — EL TRAZO QUE RODEA.
   ─────────────────────────────────────────────────────────────────────────
   Técnica: un `conic-gradient` con UN solo arco encendido, recortado a un
   ANILLO del ancho del filo con dos máscaras compuestas en `exclude` (todo el
   rectángulo menos su caja de contenido = el marco). El arco viaja porque el
   ángulo de origen del cónico está registrado con `@property` y se anima de 0
   a 360°: sin registro, un `<angle>` en un gradiente no interpola y el trazo
   pegaría un salto en vez de dar la vuelta.
   Por qué así y no con cuatro barras con retardo: cuatro barras no pueden
   doblar una esquina redondeada. El anillo enmascarado sigue el `border-radius`
   real, así que la luz gira por el filo, que es justo lo que se pide. */
html[data-epoca="5"] .c-acceso::after{
  z-index: 2;                                  /* la luz va por delante del cristal */
  padding: 1.5px;                              /* = el ancho del trazo */
  background:
    conic-gradient(from var(--ac-ang) at 50% 50%,
      transparent 0 58%,
      rgba(255, 106, 31, .35) 72%,
      var(--e-acento) 84%,
      var(--e-acento-nucleo) 90%,
      rgba(255, 192, 138, .55) 93%,
      transparent 97% 100%);
  -webkit-mask:
    linear-gradient(#000 0 0) content-box,
    linear-gradient(#000 0 0);
  -webkit-mask-composite: xor;
          mask:
    linear-gradient(#000 0 0) content-box,
    linear-gradient(#000 0 0);
          mask-composite: exclude;
  opacity: 0;
}
/* UNA pasada por cada entrada. Se re-dispara al volver a enfocar la puerta, no
   al saltar de una casilla a la otra: `:focus-within` no se apaga por dentro. */
html[data-epoca="5"] .c-acceso:focus-within::after{
  animation: ac-esclusa calc(var(--e-vel) * 4.6) linear 1 both;
}
@keyframes ac-esclusa{
  0%  { --ac-ang:   0deg; opacity: 0; }
  8%  {               opacity: 1; }
  84% {               opacity: 1; }
  100%{ --ac-ang: 360deg; opacity: 0; }
}

/* Rechazo: el filo entero en rojo, quieto y encendido. En la sala de mando no
   se golpea la puerta — se enciende el aviso y punto (por eso aquí se cancela
   la sacudida de §1.4). */
html[data-epoca="5"] .c-acceso.is-error{
  animation: none;
  border-color: rgba(255, 90, 60, .30);
}
html[data-epoca="5"] .c-acceso.is-error::after{
  animation: none;
  opacity: 1;
  background: linear-gradient(var(--ac-alarma) 0 0);
}


/* ═══════════════════════════════════════════════════════════════════════════
   7 · MOVIMIENTO REDUCIDO — la puerta se abre igual, sin moverse
   base.css §12 ya corta las duraciones; aquí se remata: se quitan las
   transiciones de las capas, se cancelan las dos animaciones (la sacudida del
   rechazo y la vuelta de la esclusa) y se deja cada estado PINTADO ENTERO.
   No se pierde ni un dato: enfocado sigue siendo visiblemente distinto de
   reposo, y rechazado sigue siendo visiblemente distinto de los dos.
   ═══════════════════════════════════════════════════════════════════════════ */
@media (prefers-reduced-motion: reduce){

  .c-acceso,
  .c-acceso::before,
  .c-acceso::after,
  .c-acceso__titulo::before,
  .c-acceso__titulo::after,
  .c-acceso__ayuda a{
    transition: none !important;
    transition-delay: 0ms !important;
  }

  /* La sacudida desaparece; el rechazo se lee por color y filo, que es como
     tiene que leerse de todas formas (nadie debe depender del movimiento). */
  .c-acceso.is-error{ animation: none !important; transform: none !important; }

  /* La esclusa no da la vuelta: se queda el filo encendido, entero y quieto. */
  html[data-epoca="5"] .c-acceso:focus-within::after{
    animation: none !important;
    opacity: 1;
    background: linear-gradient(var(--e-acento) 0 0);
  }
}
