tween
ComponentsTemplatesShowcaseContact

Command Palette

Search for a command to run...

Getting Started
  • Introduction
  • Installation
  • StoryNew
Guides
  • Motion Principles
  • Scroll and Smooth Scroll
  • Performance and Accessibility
Scroll Animations
  • Sticky Cards Scroll
  • Rise Fan Cards Scroll
  • Rotate Stack Scroll
  • Doodle Lens ScrollNew
  • Slit Open Hero ScrollNew
  • Logo Mask Zoom ScrollNew
  • ASCII Dissolve ScrollNew
  • Lottie Flight ScrollNew
  • Inline Icon Text ScrollNew
  • Starfield ScrollNew
  • Name Swap ScrollNew
  • Spotlight Gallery HeroNew
  • Slit Rotate Hero ScrollNew
  • Stroke Cover ScrollNew
  • Stroke Rows ScrollNew
Text Animations
  • Text Skew Reveal
  • Block Text Reveal
Hover & Cursor
  • Image Trail Cursor
  • Cursor Depth Logo
  • Physics Tag Drop
  • Elastic Card ListNew
  • Magnetic Cards SpringNew
Sliders & Carousels
  • Wheel Fullscreen Carousel
  • Ripple Displacement Slider
  • Three.js Blend Slider
  • Stacked Deck Slider
  • Orbit Cylinder SliderNew
  • Fan Stack SliderNew
  • Exponential Strip SliderNew
  • Dual Column SliderNew
Galleries & Grids
  • Scroll Wave Gallery
Menus & Navigation
  • Shrink Page MenuNew
Preloaders & Intros
  • Floating Items RevealNew
  • Word Cycle RevealNew
  • Tile Grid LoaderNew
Page Transitions
  • Panel Assembly TransitionNew
3D & WebGL
  • Fractal Glass Hero
  • Fluid Cursor Canvas
  • Fluid Portrait Hero
  • Fluid Gradient Canvas
  • Inversion Lens HoverNew
UI Elements
  • Circular Widgets
  • Vinyl Cover
  • Image Explosion Footer
  • Accordion Image FramesNew

(Tween) — Motion registry

Animated components & full sites, one command away.

Product

  • Components
  • Templates
  • Installation
  • Guides
  • Blog
  • Contact

Categories

  • Scroll Animations
  • Text Animations
  • Hover & Cursor
  • Sliders & Carousels
  • Galleries & Grids
  • Menus & Navigation
  • Preloaders & Intros
  • Page Transitions
  • 3D & WebGL
  • UI Elements
TWEEN
ease: power2.inOut0.00s
© 2026 TweenBack to topBuilt by mohammad
  1. Docs/
  2. Components/
  3. Text Skew Reveal

Text Skew Reveal

PreviousNext

A per-character text reveal that slides and unskews each glyph into place, with optional on-scroll and scrubbed modes.

Open in
text-skew-reveal-demo

Run the city before it wakes

Every block leans into the wind once you find your pace

Hold the line and you own the split

components/ui/text-skew-reveal-demo.tsx
import { Barlow_Condensed } from "next/font/google"

import { TextSkewReveal } from "@/registry/tween/text-skew-reveal"

const barlow = Barlow_Condensed({
  subsets: ["latin"],
  weight: ["900"],
  style: ["normal"],
})

const sectionClass =
  "@container/skew relative flex w-full items-center justify-center overflow-hidden px-6 text-center"
const sectionStyle = { height: "var(--preview-h, 100vh)" }
const headingClass =
  "w-[min(90%,80ch)] text-balance uppercase font-black leading-[0.78] [letter-spacing:-0.02em] text-[clamp(2.25rem,9cqi,8.5rem)]"

export function TextSkewRevealDemo() {
  return (
    <div className={`${barlow.className} w-full`}>
      <section
        className={sectionClass}
        style={{
          ...sectionStyle,
          backgroundColor: "#23002b",
          color: "#e894ff",
        }}
      >
        <TextSkewReveal>
          <h1 className={headingClass}>Run the city before it wakes</h1>
        </TextSkewReveal>
      </section>

      <section
        className={sectionClass}
        style={{
          ...sectionStyle,
          backgroundColor: "#002529",
          color: "#94ffe4",
        }}
      >
        <TextSkewReveal animateOnScroll>
          <h1 className={headingClass}>
            Every block leans into the wind once you find your pace
          </h1>
        </TextSkewReveal>
      </section>

      <section
        className={sectionClass}
        style={{
          ...sectionStyle,
          backgroundColor: "#291900",
          color: "#ffab46",
        }}
      >
        <TextSkewReveal scrub>
          <h1 className={headingClass}>Hold the line and you own the split</h1>
        </TextSkewReveal>
      </section>
    </div>
  )
}

Installation

pnpm dlx shadcn@latest add https://tweenui.dev/r/text-skew-reveal.json

Usage

import { TextSkewReveal } from "@/components/ui/text-skew-reveal"
<TextSkewReveal>
  <h1>Lace up before the lights go out</h1>
</TextSkewReveal>
 
<TextSkewReveal animateOnScroll>
  <h1>Four bridges, one steady pace</h1>
</TextSkewReveal>
 
<TextSkewReveal scrub>
  <h1>The last mile belongs to you</h1>
</TextSkewReveal>

Each character starts offset by xFrom, skewed by skewX = skewFrom, and at opacity: 0, then tweens into place with a per-glyph stagger that resets at the start of every line. Use animateOnScroll to replay it on entry, or scrub to tie progress directly to scroll position.

Props

PropTypeDefaultDescription
childrenReactNode—Single text element to animate. The component clones it and attaches its ref.
animateOnScrollbooleanfalseReplay the animation each time the element enters the viewport.
scrubbooleanfalseScrub the animation against scroll position between start and end. Mutually exclusive with animateOnScroll.
delaynumber0Delay (seconds) before the timeline starts. Ignored in scrub mode.
staggernumber0.05Per-character delay (seconds), reset at the start of every line.
durationnumber0.65Per-character tween duration (seconds).
easestring"power3.out"Easing for the character tween.
startstring"top 90%"ScrollTrigger start value (used in animateOnScroll and scrub).
endstring"top 45%"ScrollTrigger end value (used in scrub).
xFromnumber100Initial X offset (px) for each character.
skewFromnumber20Initial skewX (deg) for each character.
scrollerHTMLElement | string | null—Optional ScrollTrigger scroller; defaults to the ambient preview scroller.
classNamestring—Merged onto the cloned child element.
Stroke Rows ScrollBlock Text Reveal

On This Page

InstallationUsageProps

Contribute

  • Report an issue
  • Request a feature
  • Edit this page