A shadcn button that staggers per character or slides the whole label on hover. A React component.
Made by AxylInstallation
File Structure
Usage
Props
| Prop | Type | Default |
|---|---|---|
asChild? | boolean | false |
children? | string | ReactElement | - |
label? | string | - |
variant? | "default" | "accent" | "neutral" | "destructive" | "outline" | "secondary" | "ghost" | "link" | "default" |
size? | "sm" | "default" | "md" | "lg" | "icon" | "icon-sm" | "icon-xs" | "default" |
stagger? | "char" | "text" | "char" |
staggerDelay? | number | 0.01 |
className? | string | - |
bgClassName? | string | - |
textClassName? | string | - |
charsClassName? | string | - |
charClassName? | string | - |
When to Use
Use StaggerButton for one or two high-emphasis CTAs — a hero primary action, a pricing "Get started" button, or a key navigation link where the animation rewards attention. The per-character stagger signals premium quality and invites hovering.
Avoid it for buttons used repeatedly in lists, destructive actions (the playful animation clashes with the gravity of deleting), or small utility actions like "Close" or "Cancel".
Accessibility
The button renders as an <a> by default, or wraps any element via asChild. All animation is CSS opacity and transform — the visible text is always present in the DOM and readable by screen readers. The default staggerDelay of 10 ms per character means total animation time stays under 200 ms for most labels, within the threshold that avoids vestibular concerns. Unlike the Motion-driven primitives in this registry, this component has no JS animation to gate — the hover transition and character stagger are disabled via the Tailwind motion-reduce:transition-none/motion-reduce:group-hover:* utilities, which apply automatically under prefers-reduced-motion: reduce.
Built by Axyl. A motion-first component registry for React.
Last updated: 7/29/2026