Files
Wdipl-react/components/vectors/MobileAppVector.tsx

232 lines
9.9 KiB
TypeScript
Raw Normal View History

2025-08-07 19:49:37 +05:30
import { motion } from "framer-motion";
export const MobileAppVector = () => {
return (
<div className="relative w-full h-96 flex items-center justify-center overflow-hidden">
{/* Subtle Background */}
<div className="absolute inset-0 opacity-10">
<svg className="w-full h-full" viewBox="0 0 400 400" fill="none">
<defs>
<radialGradient id="bgGradient" cx="50%" cy="50%" r="40%">
<stop offset="0%" stopColor="#E5195E" stopOpacity="0.08" />
<stop offset="100%" stopColor="#3B82F6" stopOpacity="0.04" />
</radialGradient>
</defs>
<circle cx="200" cy="200" r="120" fill="url(#bgGradient)" />
</svg>
</div>
{/* Main iPhone Device */}
<motion.div
initial={{ opacity: 0, y: 30 }}
animate={{ opacity: 1, y: 0 }}
transition={{ duration: 0.8, delay: 0.2 }}
className="relative z-20"
>
<div className="relative">
{/* iPhone Frame */}
<div className="w-40 h-72 bg-gradient-to-br from-gray-800 to-gray-900 rounded-[2rem] p-1.5 shadow-2xl">
{/* Screen */}
<div className="w-full h-full bg-black rounded-[1.5rem] relative overflow-hidden">
{/* Dynamic Island */}
<div className="absolute top-2 left-1/2 transform -translate-x-1/2 w-20 h-5 bg-black rounded-full z-30"></div>
{/* App Interface */}
<div className="absolute inset-0 bg-gradient-to-br from-blue-600 to-purple-700 rounded-[1.5rem]">
{/* Status Bar */}
<div className="flex justify-between items-center px-4 pt-8 pb-3">
<div className="text-white text-xs font-manrope">9:41</div>
<div className="flex space-x-1">
<div className="w-3 h-1.5 bg-white/80 rounded-sm"></div>
<div className="w-3 h-1.5 bg-white/60 rounded-sm"></div>
</div>
</div>
{/* App Content */}
<div className="px-4 space-y-3">
{/* Header */}
<div className="text-center">
<div className="h-3 bg-white/90 rounded w-24 mx-auto mb-2"></div>
<div className="h-2 bg-white/70 rounded w-32 mx-auto"></div>
</div>
{/* Feature Cards */}
<div className="space-y-2.5">
{Array.from({ length: 3 }).map((_, i) => (
<motion.div
key={i}
initial={{ x: -15, opacity: 0 }}
animate={{ x: 0, opacity: 1 }}
transition={{ duration: 0.4, delay: 0.6 + i * 0.1 }}
className="bg-white/15 backdrop-blur-sm rounded-lg p-2.5 border border-white/20"
>
<div className="flex items-center space-x-2">
<div className="w-6 h-6 bg-white/30 rounded-md"></div>
<div className="flex-1">
<div className={`h-1.5 bg-white/70 rounded mb-1 ${i === 0 ? 'w-20' : i === 1 ? 'w-16' : 'w-18'}`}></div>
<div className={`h-1 bg-white/50 rounded ${i === 0 ? 'w-12' : i === 1 ? 'w-14' : 'w-10'}`}></div>
</div>
<motion.div
animate={{ scale: [1, 1.1, 1] }}
transition={{ duration: 2, repeat: Infinity, delay: i * 0.7 }}
className="w-4 h-4 bg-white/40 rounded-full"
></motion.div>
</div>
</motion.div>
))}
</div>
{/* Bottom Navigation */}
<div className="absolute bottom-6 left-4 right-4">
<div className="bg-white/10 backdrop-blur-sm rounded-xl p-2 border border-white/20">
<div className="flex justify-around">
{Array.from({ length: 4 }).map((_, i) => (
<motion.div
key={i}
animate={{
backgroundColor: i === 1 ? "rgba(255,255,255,0.6)" : "rgba(255,255,255,0.2)",
}}
transition={{ duration: 0.3 }}
className="w-6 h-6 rounded-lg flex items-center justify-center"
>
<div className="w-3 h-3 bg-white/70 rounded"></div>
</motion.div>
))}
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</motion.div>
{/* React Native Icon */}
<motion.div
initial={{ opacity: 0, scale: 0 }}
animate={{ opacity: 1, scale: 1 }}
transition={{ duration: 0.5, delay: 1 }}
className="absolute top-16 left-24 z-25"
>
<motion.div
animate={{ y: [0, -6, 0] }}
transition={{ duration: 2.5, repeat: Infinity }}
className="w-12 h-12 bg-gradient-to-br from-blue-500 to-cyan-500 rounded-xl flex items-center justify-center shadow-lg border border-white/20"
>
<span className="text-white text-sm font-manrope"></span>
</motion.div>
</motion.div>
{/* Code Window */}
<motion.div
initial={{ opacity: 0, x: 20 }}
animate={{ opacity: 1, x: 0 }}
transition={{ duration: 0.6, delay: 1.2 }}
className="absolute top-20 right-16 z-25"
>
<div className="bg-gray-900/80 backdrop-blur-sm rounded-lg p-2 border border-gray-700 shadow-lg w-24">
<div className="flex items-center space-x-1 mb-1">
<div className="w-1.5 h-1.5 bg-red-500 rounded-full"></div>
<div className="w-1.5 h-1.5 bg-yellow-500 rounded-full"></div>
<div className="w-1.5 h-1.5 bg-green-500 rounded-full"></div>
</div>
<div className="space-y-1">
<motion.div
initial={{ width: 0 }}
animate={{ width: "70%" }}
transition={{ duration: 0.8, delay: 1.5 }}
className="h-0.5 bg-blue-400 rounded"
></motion.div>
<motion.div
initial={{ width: 0 }}
animate={{ width: "50%" }}
transition={{ duration: 0.8, delay: 1.7 }}
className="h-0.5 bg-green-400 rounded"
></motion.div>
<motion.div
initial={{ width: 0 }}
animate={{ width: "80%" }}
transition={{ duration: 0.8, delay: 1.9 }}
className="h-0.5 bg-purple-400 rounded"
></motion.div>
</div>
</div>
</motion.div>
{/* App Store & Google Play */}
<motion.div
initial={{ opacity: 0, y: 15 }}
animate={{ opacity: 1, y: 0 }}
transition={{ duration: 0.6, delay: 1.4 }}
className="absolute bottom-12 left-20 z-25"
>
<div className="flex space-x-2">
<motion.div
whileHover={{ scale: 1.05 }}
animate={{ rotate: [0, 2, -2, 0] }}
transition={{ duration: 4, repeat: Infinity }}
className="w-10 h-10 bg-gradient-to-br from-blue-600 to-blue-700 rounded-lg flex items-center justify-center shadow-lg"
>
<span className="text-white text-sm font-manrope">📱</span>
</motion.div>
<motion.div
whileHover={{ scale: 1.05 }}
animate={{ rotate: [0, -2, 2, 0] }}
transition={{ duration: 4, repeat: Infinity, delay: 2 }}
className="w-10 h-10 bg-gradient-to-br from-green-600 to-green-700 rounded-lg flex items-center justify-center shadow-lg"
>
<span className="text-white text-sm font-manrope">🤖</span>
</motion.div>
</div>
</motion.div>
{/* Technology Labels */}
<motion.div
initial={{ opacity: 0 }}
animate={{ opacity: 1 }}
transition={{ duration: 0.8, delay: 2 }}
className="absolute bottom-4 left-1/2 transform -translate-x-1/2 flex space-x-2 z-30"
>
{[
{ name: "iOS", color: "from-blue-500 to-blue-600" },
{ name: "Android", color: "from-green-500 to-green-600" },
{ name: "React Native", color: "from-cyan-500 to-cyan-600" }
].map((tech, index) => (
<motion.div
key={tech.name}
initial={{ scale: 0 }}
animate={{ scale: 1 }}
transition={{ duration: 0.3, delay: 2.2 + index * 0.1 }}
whileHover={{ scale: 1.05 }}
className={`px-2 py-1 bg-gradient-to-r ${tech.color} bg-opacity-20 text-white border border-white/20 rounded-full text-xs font-manrope backdrop-blur-sm`}
>
{tech.name}
</motion.div>
))}
</motion.div>
{/* Subtle Connecting Line */}
<svg className="absolute inset-0 w-full h-full pointer-events-none opacity-20 z-5">
<defs>
<linearGradient id="connectionGradient" x1="0%" y1="0%" x2="100%" y2="100%">
<stop offset="0%" stopColor="#E5195E" stopOpacity="0.4" />
<stop offset="100%" stopColor="#3B82F6" stopOpacity="0.4" />
</linearGradient>
</defs>
<motion.path
d="M 30% 40% Q 50% 30% 70% 50%"
stroke="url(#connectionGradient)"
strokeWidth="1"
fill="none"
strokeDasharray="3,3"
initial={{ pathLength: 0 }}
animate={{ pathLength: 1 }}
transition={{ duration: 2, repeat: Infinity, repeatType: "reverse", delay: 2.5 }}
/>
</svg>
</div>
);
};