Spaces:
Running
Running
File size: 3,829 Bytes
4255d2e f747c64 3bc7b1f 4255d2e d01b9eb 4255d2e | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 | /* Cielo — fondo permanente. No desaparece al entrar en la carta:
queda detrás. Las estrellas las genera js/cielo.js y las escribe
en --estrellas-lejanas / --estrellas-cercanas. */
.cielo {
position: fixed;
inset: 0;
overflow: hidden;
z-index: 0;
background:
var(--fondo-velo-bajo),
var(--fondo-velo-alto),
var(--fondo-velo-rosa),
var(--fondo-umbral);
}
/* Las cintas de js/aurora.js: entre el degradado del fondo (que pone .cielo)
y las estrellas, que van después en el DOM y por eso quedan encima. Se
dibujan con blending aditivo en su propio lienzo, así que acá no hace
falta ningún `mix-blend-mode`: ya salen sumadas al fondo. */
.cielo__aurora {
position: absolute;
inset: 0;
width: 100%;
height: 100%;
pointer-events: none;
}
.cielo__capa {
position: absolute;
top: 0; left: 0;
border-radius: var(--r-circulo);
transition: filter var(--t-lento) var(--curva-calma);
}
.cielo__capa--lejana {
width: var(--cielo-estrella-lejana);
height: var(--cielo-estrella-lejana);
box-shadow: var(--estrellas-lejanas, none);
animation: gira-fondo var(--cielo-deriva) linear infinite alternate;
}
.cielo__capa--cercana {
width: var(--cielo-estrella-cercana);
height: var(--cielo-estrella-cercana);
box-shadow: var(--estrellas-cercanas, none);
animation: parpadeo var(--t-parpadeo) var(--curva-calma) infinite,
gira-cerca var(--cielo-deriva-cercanas) linear infinite alternate;
}
@keyframes parpadeo {
0%, 100% { opacity: 0.55; }
50% { opacity: 1; }
}
/* Destellos: capa aparte porque cada estrella necesita su propio ritmo de
brillo (duración y retraso propios) — algo que un solo box-shadow, al ser
una sola propiedad compartida, no puede darle a estrellas individuales. */
.cielo__capa--destellos {
width: 100%;
height: 100%;
animation: gira-cerca var(--cielo-deriva-cercanas) linear infinite alternate;
}
.destello {
position: absolute;
width: var(--cielo-estrella-destello);
height: var(--cielo-estrella-destello);
border-radius: var(--r-circulo);
background: rgb(var(--c-estrella));
/* El resplandor queda fijo (no se anima): así el destello solo mueve
opacity/transform, que van por GPU sin repintar nada en cada fotograma. */
box-shadow: 0 0 var(--cielo-destello-resplandor) rgb(var(--c-estrella) / 0.9);
opacity: 0;
transform: scale(1);
will-change: opacity, transform;
}
/* Se agrega y se saca esta clase desde el JS, una vez por destello (no es
un loop): así cada uno es un evento propio, no un ciclo que se repite. */
.destello--activo {
animation: destello var(--cielo-destello-duracion) cubic-bezier(0.16, 1, 0.3, 1);
}
@keyframes destello {
0% { opacity: 0; transform: scale(0.6); }
18% { opacity: 0.85; transform: scale(1.5); }
55% { opacity: 0.6; transform: scale(1.1); }
100% { opacity: 0; transform: scale(1); }
}
/* El giro de la bóveda. El eje está fuera de la pantalla, por debajo, así que
lo que se ve es un arco lento y no un desplazamiento recto. Va en `alternate`
(ida y vuelta) para que no haya salto al reiniciar el ciclo. */
.cielo__capa { transform-origin: var(--cielo-eje-x) var(--cielo-eje-y); }
@keyframes gira-fondo {
from { transform: rotate(calc(var(--cielo-giro) * -1)); }
to { transform: rotate(var(--cielo-giro)); }
}
@keyframes gira-cerca {
from { transform: rotate(var(--cielo-giro-cercanas)); }
to { transform: rotate(calc(var(--cielo-giro-cercanas) * -1)); }
}
.cielo__horizonte {
position: absolute;
left: 0; right: 0; bottom: 0;
height: var(--cielo-horizonte-alto);
background: var(--cielo-horizonte);
}
/* Durante el aplicar el cielo se aviva un poco. Sutil, no espectacular. */
.app[data-fase="aplicando"] .cielo__capa {
filter: brightness(var(--aplicando-cielo-intensidad));
}
|