Skip to content

Text Appear

A heading whose words rise into place out of a blur, one after another.

From the Titen template — see it in context

Build the thing people remember

A studio for brands that would rather be useful than loud.

Press Replay to watch it again.

Installation

$ npx shadcn@latest add https://framebrick.co/r/text-appear.json

Usage

import { TextAppear } from "@/components/ui/text-appear";

<TextAppear as="h1" text="Build the thing people remember" className="text-4xl font-semibold" />
<TextAppear by="line" delay={0.4} text="A studio for brands that would rather be useful than loud." />

// Ciketo's version: no blur, a touch slower between words
<TextAppear text="Design that earns its keep" blur={0} stagger={0.075} trigger="view" />

Props

PropTypeDefaultDescription
textstring—The text. It is split on spaces, so the kerning inside a word is never touched.
asElementType"p"The element to render: a heading, a paragraph, anything.
by"word" | "line""word"Move each word in turn, or the whole text at once.
trigger"load" | "view""load"Play on mount, or the first time it scrolls into view. Either way, once.
delaynumber0Seconds before it starts.
staggernumber0.05Seconds between words.
blurnumber7Blur it starts from, in px; 0 turns the blur off.
distancenumber10 / 7How far it rises, in px (10 by word, 7 by line).
  • Screen readers get the sentence once, from a visually hidden copy; the animated words are aria-hidden.
  • With reduced motion the text is simply there: MotionConfig would skip the movement but keep animating opacity and blur, so the component checks for itself.
  • The words start at opacity 0 on the server, so the text appears when the page hydrates — keep `delay` short on anything above the fold.
  • Framer splits text into letters, which breaks the kerning. This animates whole words, and `by="line"` moves the lot.

AI prompt

Paste into v0, Lovable, Bolt or Claude to rebuild this component in your own project.

Create a React + Tailwind CSS + Motion (motion/react) component called TextAppear.
- Split the text on spaces into inline-block spans, keeping the spaces as text between them so it still wraps.
- Each word animates from opacity 0, y 10 and blur 7px to rest, with a spring of stiffness 320, damping 58, mass 1,
  each word 0.05s after the one before (delayChildren for the initial delay, staggerChildren for the rest).
- by="line" moves the whole text as one span instead, from y 7, spring 320 / 64 / 1.
- trigger="load" animates on mount; trigger="view" uses whileInView with { once: true, amount: 0.3 }.
- Put the orchestration on a span inside the element the caller asked for, so no component is created during render.
- A visually hidden copy of the text carries it for screen readers; the animated spans are aria-hidden.
- With useReducedMotion() true, render the plain text — MotionConfig would still animate opacity and blur.

Be the first to know

Get new templates and components first

One short email when we release a template or a free component. No spam — unsubscribe anytime.

We use your email only for Framebrick updates. Privacy policy