2.2 · Animation

Scroll-triggered
animations.

Elements fade up as they enter the viewport. The most common modern web animation — done with IntersectionObserver and CSS transitions.

What it is

Elements are hidden (invisible and/or off-position) when the page loads. As the user scrolls down and a section enters the visible area of the screen, that element animates into place. The classic version is "fade up" — element starts invisible and slightly below its final position, then fades in and slides up.

How it works

The IntersectionObserver JavaScript API watches when elements enter or leave the viewport. When an element enters, a CSS class is added to it (like .visible). That class triggers a CSS transition. The element starts with opacity:0 and transform:translateY(40px), then transitions to opacity:1 and translateY(0).

IntersectionObserverA JS API that fires a callback when an element enters/leaves the viewport
opacity 0 → 1Element goes from invisible to fully visible — foundation of fade animations
translateY(40px) → 0Element moves upward as it reveals — the 'rise' in fade-up
StaggerDelaying each element slightly more than the previous — cascading effect

Live demo

Scroll inside the box. Each row staggers in as it crosses the threshold.

Live · scroll inside
↓ scroll to trigger reveals

Built for flow.

Focus mode

Hide everything but the cursor and the prose.

Block library

Drop-in widgets — tables, embeds, snippets.

Cmd palette

Every action one keystroke away. Always.

For teams that care.

Realtime

Multiplayer cursors with sub-60ms sync.

Comments

Threaded discussions that scroll with the doc.

Permissions

Per-block access — sensitive data stays hidden.

Quiet by default.

No telemetry

Anonymous metrics. Opt in, not out.

Local-first

Works offline. Syncs when you're back.

Open format

Markdown export, every page, every time.

Copy this prompt

Prompt · 2.2 Scroll-triggered
Build a features page where every card and section animates into view on scroll. Use IntersectionObserver to detect when each element is 20% visible. Apply these default start states: opacity:0 and transform:translateY(30px). On intersection, add class .visible which transitions to opacity:1, transform:translateY(0) with transition duration 0.6s and ease: cubic-bezier(0.4, 0, 0.2, 1). For 3-column feature grids, stagger each card by 0.1s extra delay (first card 0s, second 0.1s, third 0.2s).

Example sites to study