Skip to main content
Version: Next 🚧

Storytelling and composites

Stepwise stories​

const story = Stepwise((s) => {
const ask = s.step("Ask");
const retrieve = s.step("Retrieve");
const answer = s.step("Answer");
s.connect(ask, retrieve).route("right");
s.connect(retrieve, answer).route("right");
s.sequence([ask, retrieve, answer]);
}).gap(1.2).signalColor("#5cd0b3");

Animate its reveal and signal state to separate construction from replay.

Openings​

Opening(title, tagline) creates real extruded 3D letters, deterministic landing/bounce/shake choreography, particles, and a tagline. Configure geometry and colors with .style(), timing with .timing(), and whiteMarble, blackMarble, or plain texture.

NewspaperOpening(newspapers, options) builds a fully opaque, imperfectly aligned stack from fluent Newspaper objects. Generated pages support lead, columns, and tabloid layouts; real scans can replace generated pages. Browse the Opening sequences collection or go directly to the Newspaper opening guide.

Page-turn transitions​

PageTurn(outgoingScene, incomingScene) creates a Kindle-style page turn: both scenes remain fixed in place while the outgoing surface wraps away behind a soft moving fold, exposing the incoming scene underneath. The effect is deterministic in previews and exports.

const turn = PageTurn(new CoverScene(), new StoryScene())
.direction("left")
.style({ curlWidth: 0.6, shadowOpacity: 0.3 })
.timing({ duration: 1.3 })
.addTo(this);

const timeline = new Timeline();
turn.animate(timeline, { at: 1 });
this.play(timeline);

Use direction("right") for the reverse hinge. Both nested scenes otherwise retain normal SceneView playback behavior and remain available as turn.outgoing and turn.incoming for clock configuration.

Fireworks​

Fireworks() is deterministic and responsive across landscape, portrait, and square frames:

Fireworks({ layout: "portrait" })
.burstCount(7)
.particlesPerBurst(48)
.glow(0.8)
.seed(42);

Wave mesh​

WaveMesh() is a Three.js wire terrain for lower thirds and backgrounds. It supports authored size, samples, amplitude, palette, far-edge opacity fade, nodes, sparkles, glow variation, and a custom periodic profile.

YouTube subscribe CTA​

YouTubeSubscribe has wide and compact layouts, with a ready-made YouTubeSubscribeSequence for entrance, subscribe action, and bell ring.

const mark = this.add(VeenaLogoMark({ width: 6.6 }));
this.play(VeenaLogoSequence(mark, { duration: 6.4 }));

The sequence loops from one oval through the three-oval mark and back. VeenaLogoSwell(mark) instead keeps that settled mark and plays one baseline-pinned phrase: a low swell, a mid nudge, and a short high transient, each springing back past rest. See examples/veena-logo-image.ts for transparent and opaque PNG export. Its opaque variant defaults to VEENA_LOGO_BACKGROUND, the navy-to-teal documentation hero gradient, while --background accepts a custom CSS color or gradient. See examples/veena-logo-animation.ts for the swell.

What the ovals and the swell mean is described in The logo.