232 lines
10 KiB
TypeScript
232 lines
10 KiB
TypeScript
import { motion } from "framer-motion";
|
||
|
||
export const DashboardVector = () => {
|
||
return (
|
||
<div className="relative w-full h-96 flex items-center justify-center">
|
||
{/* Main Mobile Device */}
|
||
<motion.div
|
||
initial={{ opacity: 0, y: 30 }}
|
||
animate={{ opacity: 1, y: 0 }}
|
||
transition={{ duration: 0.8, delay: 0.2 }}
|
||
className="relative z-10"
|
||
>
|
||
{/* Phone Frame */}
|
||
<div className="w-40 h-80 bg-gradient-to-br from-gray-800 to-gray-900 rounded-3xl p-2 shadow-2xl">
|
||
{/* Screen */}
|
||
<div className="w-full h-full bg-gradient-to-br from-gray-100 to-gray-200 rounded-2xl relative overflow-hidden">
|
||
{/* Top Status Bar */}
|
||
<div className="absolute top-0 left-0 right-0 h-8 bg-gradient-to-r from-gray-800 to-gray-700 flex items-center justify-between px-4">
|
||
<div className="flex items-center gap-1">
|
||
<div className="w-1 h-1 bg-green-400 rounded-full"></div>
|
||
<div className="w-1 h-1 bg-yellow-400 rounded-full"></div>
|
||
<div className="w-1 h-1 bg-red-400 rounded-full"></div>
|
||
</div>
|
||
<div className="text-white text-xs font-manrope">9:41</div>
|
||
<div className="flex items-center gap-1">
|
||
<div className="w-3 h-2 bg-white/60 rounded-sm"></div>
|
||
<div className="w-4 h-2 bg-white/80 rounded-sm"></div>
|
||
</div>
|
||
</div>
|
||
|
||
{/* Main Dashboard Content */}
|
||
<div className="absolute inset-4 top-12 space-y-3">
|
||
{/* Header */}
|
||
<div className="flex justify-between items-center">
|
||
<div>
|
||
<div className="text-gray-800 text-sm font-bold font-manrope">Hey Balazs!</div>
|
||
<div className="text-gray-600 text-xs font-manrope">Good morning</div>
|
||
</div>
|
||
<motion.div
|
||
animate={{ rotate: 360 }}
|
||
transition={{ duration: 8, repeat: Infinity, ease: "linear" }}
|
||
className="w-6 h-6 bg-gradient-to-br from-[#E5195E] to-[#FF6B9D] rounded-full flex items-center justify-center"
|
||
>
|
||
<div className="w-3 h-3 bg-white rounded-full"></div>
|
||
</motion.div>
|
||
</div>
|
||
|
||
{/* Weather Card */}
|
||
<div className="bg-gradient-to-r from-blue-400 to-blue-500 rounded-2xl p-3 text-white">
|
||
<div className="flex justify-between items-center">
|
||
<div>
|
||
<div className="text-lg font-bold font-manrope">17°</div>
|
||
<div className="text-xs opacity-80 font-manrope">New York</div>
|
||
</div>
|
||
<div className="text-2xl">☀️</div>
|
||
</div>
|
||
</div>
|
||
|
||
{/* Stats Row */}
|
||
<div className="grid grid-cols-2 gap-2">
|
||
<div className="bg-white rounded-xl p-2 shadow-sm">
|
||
<div className="text-gray-500 text-xs font-manrope">Revenue</div>
|
||
<div className="text-gray-800 text-sm font-bold font-manrope">$67k</div>
|
||
<motion.div
|
||
initial={{ width: 0 }}
|
||
animate={{ width: "70%" }}
|
||
transition={{ duration: 2, delay: 1 }}
|
||
className="h-1 bg-gradient-to-r from-[#E5195E] to-[#FF6B9D] rounded-full mt-1"
|
||
></motion.div>
|
||
</div>
|
||
<div className="bg-white rounded-xl p-2 shadow-sm">
|
||
<div className="text-gray-500 text-xs font-manrope">Orders</div>
|
||
<div className="text-gray-800 text-sm font-bold font-manrope">1,284</div>
|
||
<motion.div
|
||
initial={{ width: 0 }}
|
||
animate={{ width: "85%" }}
|
||
transition={{ duration: 2, delay: 1.2 }}
|
||
className="h-1 bg-gradient-to-r from-green-400 to-green-500 rounded-full mt-1"
|
||
></motion.div>
|
||
</div>
|
||
</div>
|
||
|
||
{/* Chart Area */}
|
||
<div className="bg-white rounded-xl p-3 shadow-sm">
|
||
<div className="text-gray-500 text-xs mb-2 font-manrope">Analytics</div>
|
||
<div className="flex items-end justify-between h-16">
|
||
{[40, 65, 45, 80, 55, 90, 70].map((height, index) => (
|
||
<motion.div
|
||
key={index}
|
||
initial={{ height: 0 }}
|
||
animate={{ height: `${height}%` }}
|
||
transition={{ duration: 1, delay: 1.5 + index * 0.1 }}
|
||
className="w-2 bg-gradient-to-t from-[#E5195E] to-[#FF6B9D] rounded-full"
|
||
></motion.div>
|
||
))}
|
||
</div>
|
||
</div>
|
||
|
||
{/* Activity Indicator */}
|
||
<div className="bg-white rounded-xl p-3 shadow-sm">
|
||
<div className="flex items-center justify-between">
|
||
<div className="text-gray-500 text-xs font-manrope">Activity</div>
|
||
<motion.div
|
||
animate={{ scale: [1, 1.2, 1] }}
|
||
transition={{ duration: 2, repeat: Infinity }}
|
||
className="w-2 h-2 bg-green-400 rounded-full"
|
||
></motion.div>
|
||
</div>
|
||
<div className="mt-2">
|
||
<svg className="w-full h-6" viewBox="0 0 100 20">
|
||
<motion.path
|
||
d="M0,15 Q25,5 50,10 T100,8"
|
||
stroke="url(#activityGradient)"
|
||
strokeWidth="2"
|
||
fill="none"
|
||
initial={{ pathLength: 0 }}
|
||
animate={{ pathLength: 1 }}
|
||
transition={{ duration: 2, delay: 2 }}
|
||
/>
|
||
<defs>
|
||
<linearGradient id="activityGradient" x1="0%" y1="0%" x2="100%" y2="0%">
|
||
<stop offset="0%" stopColor="#E5195E" />
|
||
<stop offset="100%" stopColor="#FF6B9D" />
|
||
</linearGradient>
|
||
</defs>
|
||
</svg>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
|
||
{/* Bottom Navigation */}
|
||
<div className="absolute bottom-0 left-0 right-0 h-12 bg-white border-t border-gray-200 flex items-center justify-around">
|
||
{['🏠', '📊', '💬', '⚙️'].map((icon, index) => (
|
||
<motion.div
|
||
key={index}
|
||
whileHover={{ scale: 1.2 }}
|
||
className={`text-lg ${index === 1 ? 'text-[#E5195E]' : 'text-gray-400'}`}
|
||
>
|
||
{icon}
|
||
</motion.div>
|
||
))}
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</motion.div>
|
||
|
||
{/* Floating Data Points */}
|
||
<motion.div
|
||
animate={{ y: [0, -10, 0] }}
|
||
transition={{ duration: 3, repeat: Infinity }}
|
||
className="absolute top-20 left-16 w-12 h-12 bg-gradient-to-br from-blue-500 to-blue-600 rounded-xl flex items-center justify-center shadow-lg"
|
||
>
|
||
<span className="text-white text-sm font-bold font-manrope">98%</span>
|
||
</motion.div>
|
||
|
||
<motion.div
|
||
animate={{ y: [0, -15, 0] }}
|
||
transition={{ duration: 4, repeat: Infinity, delay: 0.5 }}
|
||
className="absolute top-24 right-20 w-10 h-10 bg-gradient-to-br from-green-500 to-green-600 rounded-lg flex items-center justify-center shadow-lg"
|
||
>
|
||
<span className="text-white text-xs font-bold font-manrope">+24</span>
|
||
</motion.div>
|
||
|
||
<motion.div
|
||
animate={{ y: [0, -12, 0] }}
|
||
transition={{ duration: 3.5, repeat: Infinity, delay: 1 }}
|
||
className="absolute bottom-24 left-20 w-11 h-11 bg-gradient-to-br from-purple-500 to-purple-600 rounded-lg flex items-center justify-center shadow-lg"
|
||
>
|
||
<span className="text-white text-xs font-bold font-manrope">📈</span>
|
||
</motion.div>
|
||
|
||
<motion.div
|
||
animate={{ y: [0, -8, 0] }}
|
||
transition={{ duration: 2.5, repeat: Infinity, delay: 1.5 }}
|
||
className="absolute bottom-20 right-16 w-9 h-9 bg-gradient-to-br from-orange-500 to-orange-600 rounded-lg flex items-center justify-center shadow-lg"
|
||
>
|
||
<span className="text-white text-xs font-bold font-manrope">⚡</span>
|
||
</motion.div>
|
||
|
||
{/* Connection Lines */}
|
||
<svg className="absolute inset-0 w-full h-full pointer-events-none opacity-30">
|
||
<defs>
|
||
<linearGradient id="dashboardGradient" x1="0%" y1="0%" x2="100%" y2="100%">
|
||
<stop offset="0%" stopColor="#E5195E" stopOpacity="0.6" />
|
||
<stop offset="50%" stopColor="#3B82F6" stopOpacity="0.4" />
|
||
<stop offset="100%" stopColor="#8B5CF6" stopOpacity="0.6" />
|
||
</linearGradient>
|
||
</defs>
|
||
|
||
<motion.path
|
||
d="M 25% 35% Q 50% 15% 75% 40%"
|
||
stroke="url(#dashboardGradient)"
|
||
strokeWidth="2"
|
||
fill="none"
|
||
strokeDasharray="4,4"
|
||
initial={{ pathLength: 0 }}
|
||
animate={{ pathLength: 1 }}
|
||
transition={{ duration: 2, repeat: Infinity, repeatType: "reverse" }}
|
||
/>
|
||
|
||
<motion.path
|
||
d="M 20% 65% Q 50% 85% 80% 60%"
|
||
stroke="url(#dashboardGradient)"
|
||
strokeWidth="2"
|
||
fill="none"
|
||
strokeDasharray="4,4"
|
||
initial={{ pathLength: 0 }}
|
||
animate={{ pathLength: 1 }}
|
||
transition={{ duration: 2.5, repeat: Infinity, repeatType: "reverse", delay: 0.5 }}
|
||
/>
|
||
</svg>
|
||
|
||
{/* Technology Labels */}
|
||
<motion.div
|
||
initial={{ opacity: 0 }}
|
||
animate={{ opacity: 1 }}
|
||
transition={{ duration: 1, delay: 2.5 }}
|
||
className="absolute bottom-8 left-1/2 transform -translate-x-1/2 flex space-x-4"
|
||
>
|
||
<div className="px-3 py-1 bg-blue-500/20 text-blue-300 border border-blue-500/30 rounded-full text-sm font-manrope">
|
||
React Native
|
||
</div>
|
||
<div className="px-3 py-1 bg-green-500/20 text-green-300 border border-green-500/30 rounded-full text-sm font-manrope">
|
||
Dashboard
|
||
</div>
|
||
<div className="px-3 py-1 bg-purple-500/20 text-purple-300 border border-purple-500/30 rounded-full text-sm font-manrope">
|
||
Analytics
|
||
</div>
|
||
</motion.div>
|
||
</div>
|
||
);
|
||
}; |