"use client"; import { cn } from "@/lib/utils"; import type { MotionProps } from "motion/react"; import { motion } from "motion/react"; import type { CSSProperties, ElementType, JSX } from "react"; import { memo, useMemo } from "react"; type MotionHTMLProps = MotionProps & Record; // Cache motion components at module level to avoid creating during render const motionComponentCache = new Map< keyof JSX.IntrinsicElements, React.ComponentType >(); const getMotionComponent = (element: keyof JSX.IntrinsicElements) => { let component = motionComponentCache.get(element); if (!component) { component = motion.create(element); motionComponentCache.set(element, component); } return component; }; export interface TextShimmerProps { children: string; as?: ElementType; className?: string; duration?: number; spread?: number; } const ShimmerComponent = ({ children, as: Component = "p", className, duration = 2, spread = 2, }: TextShimmerProps) => { const MotionComponent = getMotionComponent( Component as keyof JSX.IntrinsicElements ); const dynamicSpread = useMemo( () => (children?.length ?? 0) * spread, [children, spread] ); return ( {children} ); }; export const Shimmer = memo(ShimmerComponent);