A character-by-character reveal where each glyph ripples through randomized pill, accent, and outline states before settling into plain text. A React component.
Made by AxylA stacked headline that cascades in line by line — scroll into view or refresh to replay.
Installation
File Structure
Usage
Cascade a stacked block, one line per string:
Trigger declaratively with trigger="in", "out", or "inout":
Scramble on hover:
Narrow the pool of visual states each character rolls through:
Recolor the fills, accent, and borders through props or CSS variables:
Render as a different element and control it imperatively:
Props
| Prop | Type | Default |
|---|---|---|
text? | string | string[] | - |
children? | string | - |
trigger? | "in" | "out" | "inout" | - |
triggerOnHover? | boolean | false |
triggerOnMount? | boolean | true |
startOnView? | boolean | true |
initVisible? | boolean | false |
variations? | TyperVariation[] | all six variations |
cycles? | number | 3 |
cycleLength? | number | 0.5 |
fps? | number | 20 |
delay? | number | 0 |
stagger? | number | 0.15 |
spaceWidth? | string | "0.5em" |
fg? | string | theme --foreground |
bg? | string | theme --background |
accent? | string | theme --accent |
accentInk? | string | theme --foreground |
border? | string | theme --foreground |
radius? | string | "5px" |
onComplete? | () => void | - |
as? | React.ElementType | "div" |
ref? | Ref<TyperHandle> | - |
className? | string | - |
Accessibility
When prefers-reduced-motion: reduce is set, the reveal loop is skipped entirely: each line mounts fully visible as plain text with no state ripple, matching the CSS reduced-motion fallback. Imperative handle methods (play(), replay(), in(), out(), reset()) still resolve safely without driving animations.
Built by Axyl. A motion-first component registry for React.
Last updated: 9/14/2026