Help guide

Phase Shift node

Updated June 21, 2026

Product media placeholder

Replace this area with a screenshot or short walkthrough video during the media sweep.

Per-clone phase shift of a shared 0..1 progress signal. Computes `(progress + index/count) % 1`, wrapping the result into [0, 1) so it can drive any node that consumes a normalized progress (staggerWrite, multiKeyframe, propertyAnimation). Replaces the inline `((node('progress') + (node('index') / node('count'))) % 1)` expression that recurs in any forEach-instanced template that needs each clone to ride a different phase of one shared clock.

Type phaseShiftCategory mathContext sharedDynamic ports noCompound no

Inputs

PortTypeDescription
progressfloatShared 0..1 driver. Wire from a `timeline.progress`, `scrollTrigger.progress`, or any normalized signal that all clones should ride.
indexfloatThis clone's slot. In a forEach-instanced template, set `params.index: { "fromScope": "index" }` — the F374 expander resolves it to 0..count-1 per clone.
countfloatTotal number of slots. Wire from a sibling `domQuerySize` so the divisor tracks the live DOM (changing the HTML element count auto-rescales every clone's phase).

Outputs

PortTypeDescription
valuefloatPhase-shifted progress, wrapped into [0, 1). Same shape and units as the input progress — wire into the same downstream consumer types you would the raw shared timeline.

Parameters

ParameterTypeDefaultDescription
indexfloat0Unwired baseline for the index input. Templates typically pass `{ "fromScope": "index" }` here so each clone gets a different value; standalone authoring can set a literal slot.
countfloat1Unwired baseline for the count input. Wire from a sibling `domQuerySize.count` for DOM-driven scaling.

Use cases

  • Rolling text tubes — N stacked text lines splitting one shared timeline into N evenly-distributed phases (see `tube-text` demo).
  • Carousels / marquees — one global cycle drives N phase-locked items; index of each item determines its slot.
  • Parallax / layered animation — same scroll progress fans out into N depth-shifted clones with custom 1/N spacing.

Envelope

Use phaseShift as the node type inside a graph node envelope. Add id, optional params, optional connections, and optional activeWhen based on the guide context.

Generated source

Registry faster-motion-docs/node-registry.jsonCategory page /help/faster-motion/faster-motion-node-category-math/

Was this guide helpful?

Sunny Arora

Written by

Sunny Arora

Get technical deep dives delivered to your inbox

Join creators and developers who get exclusive insights, tutorials, and behind-the-scenes content every week.

No spam. Unsubscribe anytime.

Continue Exploring

You might also enjoy