How it behaves
Exactly what the prompt builds — every timing and easing is specified, so the result matches the demo.
- On first load, two full-screen sheets cover the page: a black one (#0A0A0A) in front and a red one (#D71212) directly behind it.
- A giant white counter (Archivo 800, expanded width) sits bottom-left on the dark sheet and eases from 0 to 100 over 1.4s (ease-out cubic). It is isolated in its own component, so the page never re-renders 60 times a second.
- At 100 both sheets slide up (translateY(0 → -100%), 0.8s, cubic-bezier(.76,0,.24,1)). The red one starts 0.1s later, so a red edge flashes under the dark sheet as it leaves.
- useCurtainReady() returns false until the sheets start lifting, then true, so page elements can play their entrance at the right moment. A <CurtainReveal> fade-up helper is included.
- Reduced motion: no curtain at all, and useCurtainReady() is true immediately.
- Once lifted, the sheets ignore clicks (pointer-events: none) and never block the page.