/* Text stays readable without JavaScript. Motion classes are applied after setup. */
.text-mask{display:block;overflow:hidden;padding-bottom:.12em;margin-bottom:-.12em}.text-line{display:block;max-width:100%}
.text-motion-ready .text-entrance .text-line{opacity:0;transform:translate3d(0,108%,0) rotate(1.6deg);transform-origin:left bottom;transition:transform 1s cubic-bezier(.2,.75,.2,1),opacity .7s ease;transition-delay:calc(var(--line-index,0)*140ms + var(--text-delay,0ms))}
.text-motion-ready .text-entrance.is-text-visible .text-line{opacity:1;transform:translate3d(0,0,0) rotate(0)}
.text-motion-ready .text-soft{opacity:0;transform:translateY(18px);transition:opacity .8s ease,transform .9s cubic-bezier(.2,.75,.2,1);transition-delay:var(--text-delay,0ms)}
.text-motion-ready .text-soft.is-text-visible{opacity:1;transform:translateY(0)}
.hero h1 .text-mask{display:block}.hero h1 .text-line{display:block}.hero h1.text-entrance{--text-delay:100ms}.hero .hero-lead.text-soft{--text-delay:480ms}
.scroll-story-ready .expanding-photo figcaption{opacity:1;transform:none}
.scroll-story-ready .expanding-photo h2>.text-mask:first-child .text-line{opacity:var(--expand-line1-opacity,0);transform:translateY(var(--expand-line1-y,55px));clip-path:inset(0 0 var(--expand-line1-clip,100%) 0)}
.scroll-story-ready .expanding-photo h2>.text-mask:nth-child(2) .text-line{opacity:var(--expand-line2-opacity,0);transform:translateY(var(--expand-line2-y,55px));clip-path:inset(0 0 var(--expand-line2-clip,100%) 0)}
.scroll-story-ready .expanding-photo figcaption>p{opacity:var(--expand-kicker-opacity,0);transform:translateY(var(--expand-kicker-y,15px))}
.scroll-story-ready .stack-in-view .stack-detail.is-current h3 .text-line{animation:story-line-arrive .75s cubic-bezier(.2,.75,.2,1) both;animation-delay:calc(var(--line-index,0)*120ms)}
.scroll-story-ready .stack-in-view .stack-detail.is-current>.stack-number{animation:story-soft-arrive .6s ease both}
.scroll-story-ready .stack-in-view .stack-detail.is-current>p:last-child{animation:story-soft-arrive .75s .16s ease both}
.scroll-story-ready .curtain-chapter .field-caption{opacity:var(--curtain-copy-opacity,1);transform:translateY(var(--curtain-copy-y,0px))}
@keyframes story-line-arrive{from{opacity:0;transform:translateY(105%) rotate(1.5deg)}to{opacity:1;transform:none}}
@keyframes story-soft-arrive{from{opacity:0;transform:translateY(18px)}to{opacity:1;transform:none}}
@media(prefers-reduced-motion:reduce){.text-motion-ready .text-entrance .text-line,.text-motion-ready .text-soft,.scroll-story-ready .expanding-photo h2 .text-line,.scroll-story-ready .expanding-photo figcaption>p,.scroll-story-ready .curtain-chapter .field-caption{opacity:1!important;transform:none!important;clip-path:none!important;animation:none!important;transition:none!important}}
