{ "name": "text-effect", "type": "registry:ui", "registryDependencies": [], "dependencies": [ "motion" ], "devDependencies": [], "tailwind": {}, "cssVars": { "light": {}, "dark": {} }, "files": [ { "path": "text-effect.tsx", "content": "'use client';\nimport { cn } from '@/lib/utils';\nimport {\n AnimatePresence,\n motion\n} from 'motion/react';\nimport type {\n TargetAndTransition,\n Transition,\n Variant,\n Variants,\n} from 'motion/react'\nimport React from 'react';\n\nexport type PresetType = 'blur' | 'fade-in-blur' | 'scale' | 'fade' | 'slide';\n\nexport type PerType = 'word' | 'char' | 'line';\n\nexport type TextEffectProps = {\n children: string;\n per?: PerType;\n as?: keyof React.JSX.IntrinsicElements;\n variants?: {\n container?: Variants;\n item?: Variants;\n };\n className?: string;\n preset?: PresetType;\n delay?: number;\n speedReveal?: number;\n speedSegment?: number;\n trigger?: boolean;\n onAnimationComplete?: () => void;\n onAnimationStart?: () => void;\n segmentWrapperClassName?: string;\n containerTransition?: Transition;\n segmentTransition?: Transition;\n style?: React.CSSProperties;\n};\n\nconst defaultStaggerTimes: Record = {\n char: 0.03,\n word: 0.05,\n line: 0.1,\n};\n\nconst defaultContainerVariants: Variants = {\n hidden: { opacity: 0 },\n visible: {\n opacity: 1,\n transition: {\n staggerChildren: 0.05,\n },\n },\n exit: {\n transition: { staggerChildren: 0.05, staggerDirection: -1 },\n },\n};\n\nconst defaultItemVariants: Variants = {\n hidden: { opacity: 0 },\n visible: {\n opacity: 1,\n },\n exit: { opacity: 0 },\n};\n\nconst presetVariants: Record<\n PresetType,\n { container: Variants; item: Variants }\n> = {\n blur: {\n container: defaultContainerVariants,\n item: {\n hidden: { opacity: 0, filter: 'blur(12px)' },\n visible: { opacity: 1, filter: 'blur(0px)' },\n exit: { opacity: 0, filter: 'blur(12px)' },\n },\n },\n 'fade-in-blur': {\n container: defaultContainerVariants,\n item: {\n hidden: { opacity: 0, y: 20, filter: 'blur(12px)' },\n visible: { opacity: 1, y: 0, filter: 'blur(0px)' },\n exit: { opacity: 0, y: 20, filter: 'blur(12px)' },\n },\n },\n scale: {\n container: defaultContainerVariants,\n item: {\n hidden: { opacity: 0, scale: 0 },\n visible: { opacity: 1, scale: 1 },\n exit: { opacity: 0, scale: 0 },\n },\n },\n fade: {\n container: defaultContainerVariants,\n item: {\n hidden: { opacity: 0 },\n visible: { opacity: 1 },\n exit: { opacity: 0 },\n },\n },\n slide: {\n container: defaultContainerVariants,\n item: {\n hidden: { opacity: 0, y: 20 },\n visible: { opacity: 1, y: 0 },\n exit: { opacity: 0, y: 20 },\n },\n },\n};\n\nconst AnimationComponent: React.FC<{\n segment: string;\n variants: Variants;\n per: 'line' | 'word' | 'char';\n segmentWrapperClassName?: string;\n}> = React.memo(({ segment, variants, per, segmentWrapperClassName }) => {\n const content =\n per === 'line' ? (\n \n {segment}\n \n ) : per === 'word' ? (\n