Introducing Motion-Primitives Pro - Advanced components and templates to help you build a website that stands out.

Text Shimmer

Shimmer effect on text. Easily adjust the duration and the spread of the shimmer effect.

Examples

Text Shimmer Basic

Generating code...

Text Shimmer Color

You can use the [--base-color] and [--base-gradient-color] CSS variables to customize the color of the shimmer effect.

Hi, how are you?

Code

'use client';
import React, { useMemo, type JSX } from 'react';
import { motion } from 'framer-motion';
import { cn } from '@/lib/utils';

interface TextShimmerProps {
  children: string;
  as?: React.ElementType;
  className?: string;
  duration?: number;
  spread?: number;
}

export function TextShimmer({
  children,
  as: Component = 'p',
  className,
  duration = 2,
  spread = 2,
}: TextShimmerProps) {
  const MotionComponent = motion.create(
    Component as keyof JSX.IntrinsicElements
  );

  const dynamicSpread = useMemo(() => {
    return children.length * spread;
  }, [children, spread]);

  return (
    <MotionComponent
      className={cn(
        'relative inline-block bg-[length:250%_100%,auto] bg-clip-text',
        'text-transparent [--base-color:#a1a1aa] [--base-gradient-color:#000]',
        '[--bg:linear-gradient(90deg,#0000_calc(50%-var(--spread)),var(--base-gradient-color),#0000_calc(50%+var(--spread)))] [background-repeat:no-repeat,padding-box]',
        'dark:[--base-color:#71717a] dark:[--base-gradient-color:#ffffff] dark:[--bg:linear-gradient(90deg,#0000_calc(50%-var(--spread)),var(--base-gradient-color),#0000_calc(50%+var(--spread)))]',
        className
      )}
      initial={{ backgroundPosition: '100% center' }}
      animate={{ backgroundPosition: '0% center' }}
      transition={{
        repeat: Infinity,
        duration,
        ease: 'linear',
      }}
      style={
        {
          '--spread': `${dynamicSpread}px`,
          backgroundImage: `var(--bg), linear-gradient(var(--base-color), var(--base-color))`,
        } as React.CSSProperties
      }
    >
      {children}
    </MotionComponent>
  );
}

Please add:

Component API

TextShimmer

PropTypeDefaultDescription
childrenstringThe text content.
askeyof JSX.IntrinsicElements'p'The HTML tag to render, defaults to paragraph.
classNamestringundefinedOptional CSS class for styling the component.
durationnumber2The duration of the shimmer effect.
spreadnumber2The spread of the shimmer effect.

Credits

Inspired by JohnPhamous for the idea of the shimmer effect that scales with the content length.