/* /lms film grain + reveal. Content is visible unless script has added .fx-ready. */
.fx-grain{position:fixed;inset:0;z-index:0;pointer-events:none;overflow:hidden;contain:strict}
.fx-grain::before{content:"";position:absolute;inset:-256px;opacity:.17;
background:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='256' height='256'%3E%3Cfilter id='n' x='0' y='0' width='100%25' height='100%25'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='.85' numOctaves='2' stitchTiles='stitch'/%3E%3CfeColorMatrix values='2.2 0 0 0 -.6 2.2 0 0 0 -.6 2.2 0 0 0 -.6 0 0 0 0 1'/%3E%3C/filter%3E%3Crect width='256' height='256' filter='url(%23n)'/%3E%3C/svg%3E") 0 0/256px 256px;
mix-blend-mode:soft-light;animation:fx-grain .9s steps(1) infinite}
@keyframes fx-grain{0%{transform:translate(0,0)}11%{transform:translate(-83px,41px)}22%{transform:translate(57px,-97px)}33%{transform:translate(-142px,-31px)}44%{transform:translate(101px,119px)}55%{transform:translate(-37px,163px)}66%{transform:translate(149px,-58px)}77%{transform:translate(-111px,88px)}88%{transform:translate(23px,-139px)}}
.fx-ready [data-reveal]:not(.is-in){opacity:0;transform:translateY(20px);filter:blur(6px)}
@media (prefers-reduced-motion:reduce){
.fx-grain::before{animation:none}
.fx-ready [data-reveal]:not(.is-in){opacity:1;transform:none;filter:none}
}
@media print{
.fx-grain{display:none}
.fx-ready [data-reveal]:not(.is-in){opacity:1!important;transform:none!important;filter:none!important}
}
