/* Approved sage fabric. One continuous material, a quiet local deformation. */
.fabric-scene{position:absolute;inset:0;overflow:hidden;pointer-events:none;background:#060606}
.fabric-plane{position:absolute;inset:14% -2% -14%;mask-image:linear-gradient(transparent,#000 15%,#000 80%,transparent 99%)}
.fabric-plane img,.fabric-plane canvas{position:absolute;width:100%;height:100%;inset:0;display:block;object-fit:cover;object-position:center}
/* The still is only a fallback (no WebGL, Save-Data, lost context): hidden by
   default so a reload never flashes it before the live fabric; the live canvas
   fades in when its first frame is drawn. Without JS a <noscript> rule in the
   markup shows the still. */
.fabric-plane img{opacity:1;transition:opacity .4s ease-out .6s}
.fabric-plane.is-ready img{opacity:0}
.fabric-plane canvas{opacity:0;transition:opacity .6s ease-out}
.fabric-plane.is-ready canvas{opacity:1}
.fabric-plane:not(.is-ready):has(canvas[data-motion="static"],canvas[data-motion="fallback"]) img{opacity:1;transition:opacity .6s ease-out}
.fabric-scene:after{content:'';position:absolute;inset:0;background:linear-gradient(#060606 0%,transparent 24%,transparent 73%,#060606 100%)}
@keyframes fabric-away{from{opacity:1;transform:translateY(0)}to{opacity:0;transform:translateY(30px)}}
@supports(animation-timeline:view()){@media(prefers-reduced-motion:no-preference){
 .fabric-scene{animation:fabric-away linear both;animation-timeline:--sky-descent;animation-range:exit 0% exit 50%}
}}
@media(max-width:540px){.fabric-plane{inset:24% -24% -8%}}
@media(prefers-reduced-motion:reduce){.fabric-scene{animation:none!important}}
