Splitting Text Demo

PreviousNext

Demo showing an animated splitting text.

Docs
animate-uiui

Preview

Loading preview…
registry/demo/primitives/texts/splitting/index.tsx
import {
  SplittingText,
  type SplittingTextProps,
} from '@/components/animate-ui/primitives/texts/splitting';
import { cn } from '@/lib/utils';

const ANIMATIONS: Record<
  string,
  {
    initial: SplittingTextProps['initial'];
    animate: SplittingTextProps['animate'];
    transition: SplittingTextProps['transition'];
  } | null
> = {
  default: null,
  vibe: {
    initial: { y: 50, scale: 0.5, opacity: 0, x: 50, rotate: 90 },
    animate: { y: 0, scale: 1, opacity: 1, x: 0, rotate: 0 },
    transition: { duration: 0.5, ease: 'easeOut' },
  },
  writing: {
    initial: { y: 10, opacity: 0 },
    animate: { y: 0, opacity: 1 },
    transition: { type: 'spring', bounce: 0, duration: 2 },
  },
};

interface SplittingTextDemoProps {
  type: SplittingTextProps['type'];
  delay: number;
  animation: keyof typeof ANIMATIONS;
}

export const SplittingTextDemo = ({
  type,
  delay,
  animation,
}: SplittingTextDemoProps) => {
  return (
    // @ts-expect-error
    <SplittingText
      key={`${type}-${delay}-${animation}`}
      className={cn('text-4xl font-semibold', type === 'lines' && 'text-xl')}
      type={type}
      delay={delay}
      initial={ANIMATIONS[animation]?.initial}
      animate={ANIMATIONS[animation]?.animate}
      transition={ANIMATIONS[animation]?.transition}
      text={
        type === 'lines'
          ? [
              'Introducing Splitting Text component',
              'Made with Motion. Highly customizable and easy to use.',
            ]
          : 'Splitting Text'
      }
    />
  );
};

Installation

npx shadcn@latest add @animate-ui/demo-primitives-texts-splitting

Usage

import { DemoPrimitivesTextsSplitting } from "@/components/ui/demo-primitives-texts-splitting"
<DemoPrimitivesTextsSplitting />