letter-cascade
componentry/letter-cascadeFreeComponent
Component for letter-cascade
Live preview
live · rendered by the registry
Rendered by componentry on their own page — this is the component running, not a screenshot of it.Install it
npx shadcn@latest add https://componentry.dev/r/letter-cascade.jsonSource
1"use client";23import { cn } from "@workspace/ui/lib/utils";4import {5 type AnimationOptions,6 motion,7 stagger,8 useAnimate,9} from "framer-motion";10import { useCallback, useState } from "react";1112interface LetterCascadeProps {13 /** The text to animate */14 text: string;15 /** Additional CSS classes for the container */16 className?: string;17 /** CSS classes applied to each individual letter */18 letterClassName?: string;19 /** Stagger delay between each letter in seconds */20 staggerDuration?: number;21 /** Where the stagger wave originates */22 staggerFrom?: "first" | "last" | "center" | number;23 /** Spring stiffness — higher = snappier */24 stiffness?: number;25 /** Spring damping — lower = bouncier */26 damping?: number;27 /** Trigger the animation on click instead of hover */28 triggerOnClick?: boolean;29 /** Callback when the full animation cycle completes */30 onComplete?: () => void;31}3233export function LetterCascade({34 text,35 className,36 letterClassName,37 staggerDuration = 0.04,38 staggerFrom = "first",39 stiffness = 220,40 damping = 16,41 triggerOnClick = false,42 onComplete,43}: LetterCascadeProps) {44 const [scope, animate] = useAnimate();45 const [blocked, setBlocked] = useState(false);4647 const trigger = useCallback(() => {48 if (blocked) return;49 setBlocked(true);5051 const merge = (base: AnimationOptions): AnimationOptions => ({52 ...base,53 delay: stagger(staggerDuration, { from: staggerFrom }),54 });5556 const spring: AnimationOptions = {57 type: "spring",58 stiffness,59 damping,60 };6162 // ── Phase 1: front tilts back, echo flips in from below ──63 animate(64 ".cascade-front",65 {66 rotateX: 90,67 opacity: 0,68 y: -6,69 filter: "blur(4px)",70 },71 merge(spring)72 ).then(() => {73 // Instantly reset front74 animate(75 ".cascade-front",76 { rotateX: 0, opacity: 1, y: 0, filter: "blur(0px)" },77 { duration: 0 }78 ).then(() => {79 setBlocked(false);80 onComplete?.();81 });82 });8384 animate(85 ".cascade-echo",86 {87 rotateX: 0,88 opacity: 1,89 y: 0,90 scale: 1,91// … truncated
More from componentry
All 59 items| Component | Registry | Kind | Access | Installs | Command |
|---|---|---|---|---|---|
| Animated Gradientanimated-gradient | componentry | Components | Free | no deps | |
| ASCII Effectascii-effect | componentry | Components | Free | no deps | |
| Aurora Flowaurora-flow | componentry | Components | Free | no deps | |
| auth-modalauth-modal | componentry | Components | Free | no deps | |
| border-beamborder-beam | componentry | Components | Free | no deps | |
| circuit-boardcircuit-board | componentry | Components | Free | no deps | |
| closing-plasmaclosing-plasma | componentry | Components | Free | no deps | |
| collection-surfercollection-surfer | componentry | Components | Free | no deps |
