feat: dark luxury redesign with black heart branding
Complete visual overhaul: dark-only mode, rose/crimson accent system, glassmorphism header, animated hero with floating hearts and glow orbs, photo-backed cards, infinite team carousel with drag support, redesigned modals with hero images, black heart logo with rose glow silhouette. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
50
src/components/ui/FloatingHearts.tsx
Normal file
50
src/components/ui/FloatingHearts.tsx
Normal file
@@ -0,0 +1,50 @@
|
||||
"use client";
|
||||
|
||||
import { useEffect, useState } from "react";
|
||||
|
||||
interface Heart {
|
||||
id: number;
|
||||
left: number;
|
||||
size: number;
|
||||
delay: number;
|
||||
duration: number;
|
||||
opacity: number;
|
||||
}
|
||||
|
||||
export function FloatingHearts() {
|
||||
const [hearts, setHearts] = useState<Heart[]>([]);
|
||||
|
||||
useEffect(() => {
|
||||
const generated: Heart[] = Array.from({ length: 12 }, (_, i) => ({
|
||||
id: i,
|
||||
left: Math.random() * 100,
|
||||
size: 8 + Math.random() * 16,
|
||||
delay: Math.random() * 10,
|
||||
duration: 10 + Math.random() * 15,
|
||||
opacity: 0.03 + Math.random() * 0.08,
|
||||
}));
|
||||
setHearts(generated);
|
||||
}, []);
|
||||
|
||||
if (hearts.length === 0) return null;
|
||||
|
||||
return (
|
||||
<div className="pointer-events-none absolute inset-0 overflow-hidden">
|
||||
{hearts.map((heart) => (
|
||||
<div
|
||||
key={heart.id}
|
||||
className="absolute text-rose-500"
|
||||
style={{
|
||||
left: `${heart.left}%`,
|
||||
bottom: "-20px",
|
||||
fontSize: `${heart.size}px`,
|
||||
opacity: heart.opacity,
|
||||
animation: `heart-float ${heart.duration}s ease-in ${heart.delay}s infinite`,
|
||||
}}
|
||||
>
|
||||
♥
|
||||
</div>
|
||||
))}
|
||||
</div>
|
||||
);
|
||||
}
|
||||
Reference in New Issue
Block a user