'use client'; import React from 'react'; import { motion } from 'framer-motion'; interface ProgressiveRevealProps { /** 要显示的内容 */ children: React.ReactNode; /** 容器类名 */ className?: string; /** 是否为视频内容 */ isVideo?: boolean; /** 动画延迟时间(秒) */ delay?: number; /** 渐进显示动画时长(秒) */ revealDuration?: number; /** 模糊过渡动画时长(秒) */ blurDuration?: number; /** 初始模糊度 */ initialBlur?: number; /** 自定义动画变体 */ customVariants?: { hidden: any; visible: any; }; /** 自定义过渡效果 */ customTransition?: any; /** 是否显示加载背景 */ showLoadingBg?: boolean; /** 加载背景配置 */ loadingBgConfig?: { /** 渐变色起始颜色 */ fromColor?: string; /** 渐变色中间颜色 */ viaColor?: string; /** 渐变色结束颜色 */ toColor?: string; /** 光效不透明度 */ glowOpacity?: number; /** 背景动画持续时间 */ duration?: number; }; } export const ProgressiveReveal: React.FC = ({ children, className = '', isVideo = false, delay = 0, revealDuration = 0.8, blurDuration = 0.5, initialBlur = 20, customVariants, customTransition, showLoadingBg = true, loadingBgConfig = { fromColor: 'from-cyan-300', viaColor: 'via-sky-400', toColor: 'to-blue-500', glowOpacity: 0.5, duration: 5, }, }) => { // 默认动画变体 const defaultVariants = { hidden: { opacity: 0 }, visible: { opacity: 1 } }; // 默认过渡效果 const defaultTransition = { duration: 0.3, delay }; return ( {/* 加载背景 */} {showLoadingBg && ( <> {/* 动态渐变背景 */} {/* 动态光效 */} )} {/* 内容显示动画 */} {children} ); }; // 预设配置 export const presets = { // 快速显示 fast: { revealDuration: 0.4, blurDuration: 0.3, initialBlur: 10, loadingBgConfig: { fromColor: 'from-cyan-300', viaColor: 'via-sky-400', toColor: 'to-blue-500', glowOpacity: 0.5, duration: 3, } }, // 标准显示 standard: { revealDuration: 0.8, blurDuration: 0.5, initialBlur: 20, loadingBgConfig: { fromColor: 'from-cyan-300', viaColor: 'via-sky-400', toColor: 'to-blue-500', glowOpacity: 0.5, duration: 5, } }, // 缓慢显示 slow: { revealDuration: 1.2, blurDuration: 0.7, initialBlur: 30, loadingBgConfig: { fromColor: 'from-cyan-300', viaColor: 'via-sky-400', toColor: 'to-blue-500', glowOpacity: 0.5, duration: 7, } }, // 缩略图 thumbnail: { revealDuration: 0.6, blurDuration: 0.4, initialBlur: 10, loadingBgConfig: { fromColor: 'from-cyan-300', viaColor: 'via-sky-400', toColor: 'to-blue-500', glowOpacity: 0.3, duration: 4, } }, // 主内容 main: { revealDuration: 0.8, blurDuration: 0.5, initialBlur: 20, loadingBgConfig: { fromColor: 'from-cyan-300', viaColor: 'via-sky-400', toColor: 'to-blue-500', glowOpacity: 0.5, duration: 5, } }, // 温暖色调 warm: { revealDuration: 0.8, blurDuration: 0.5, initialBlur: 20, loadingBgConfig: { fromColor: 'from-orange-300', viaColor: 'via-red-400', toColor: 'to-rose-500', glowOpacity: 0.5, duration: 5, } }, // 冷色调 cool: { revealDuration: 0.8, blurDuration: 0.5, initialBlur: 20, loadingBgConfig: { fromColor: 'from-emerald-300', viaColor: 'via-teal-400', toColor: 'to-cyan-500', glowOpacity: 0.5, duration: 5, } }, };