Observe locally
A bounded IntersectionObserver watches this scroll pane, not the page.
Component / Layout
Reveal content inside the page or a bounded scroller without global scroll handlers. Server markup remains visible, dimensions stay stable, and observation is progressive.
Delivery contract
pnpm add easecraft@0.1.0The component imports stable APIs from easecraft.
Package usage
import { ScrollReveal } from "easecraft";
<ScrollReveal
preset="fade-rise"
threshold={0.2}
rootMargin="0px 0px -10% 0px"
>
<ProjectCard />
</ScrollReveal>Typed contract
| Prop | Type | Default | Purpose |
|---|---|---|---|
| children | ReactNode | required | Content available before enhancement |
| as | HTML tag | "div" | Polymorphic semantic host |
| observerRoot | Element | Document | null | viewport | Bounded observer root |
| threshold | number | readonly number[] | 0.15 | Visible ratio required |
| rootMargin | string | "0px 0px -10% 0px" | Observer boundary adjustment |
| once | boolean | true | Disconnect after first completed reveal |
| preset | "fade" | "rise" | "fade-rise" | "fade-rise" | Reveal treatment |
| duration | duration token | number | "normal" | Reveal duration |
| distance | distance token | number | "medium" | Reveal travel |
| delay | number | 0 | Delay before reveal |
| easing | easing token | string | "enter" | Reveal easing |
| onReveal | () => void | none | Completed reveal callback |
| onVisibilityChange | (visible) => void | none | Repeat-mode visibility callback |
Release requirement