import { useRef, useState, useCallback, CSSProperties } from "react"; import { motion } from "framer-motion"; export interface RealmData { id: string; label: string; color: string; route: string; icon: string; description: string; features: string[]; } interface IsometricRealmCardProps { realm: RealmData; index: number; onClick: (realm: RealmData) => void; isSelected: boolean; } export default function IsometricRealmCard({ realm, index, onClick, isSelected, }: IsometricRealmCardProps) { const cardRef = useRef(null); const [tilt, setTilt] = useState({ x: 0, y: 0 }); const [isHovered, setIsHovered] = useState(false); const handleMouseMove = useCallback( (e: React.MouseEvent) => { if (!cardRef.current) return; const rect = cardRef.current.getBoundingClientRect(); const x = (e.clientX - rect.left) / rect.width - 0.5; const y = (e.clientY - rect.top) / rect.height - 0.5; setTilt({ x: y * -20, y: x * 20 }); }, [] ); const handleMouseLeave = useCallback(() => { setTilt({ x: 0, y: 0 }); setIsHovered(false); }, []); const handleMouseEnter = useCallback(() => { setIsHovered(true); }, []); const cardStyle: CSSProperties = { perspective: "1000px", transformStyle: "preserve-3d", }; const innerStyle: CSSProperties = { transform: `rotateX(${tilt.x}deg) rotateY(${tilt.y}deg) ${isHovered ? "translateZ(20px)" : "translateZ(0)"}`, transformStyle: "preserve-3d", transition: isHovered ? "transform 0.1s ease-out" : "transform 0.4s ease-out", }; return (
onClick(realm)} style={innerStyle} className={`realm-card ${isSelected ? "selected" : ""}`} > {/* Background glow layer */}
{/* Main card surface */}
{/* Floating icon layer */}
{realm.icon}
{/* Text layer */}

{realm.label}

{realm.description}

{/* Features layer */}
{realm.features.slice(0, 3).map((feature, i) => (
{feature}
))}
{/* CTA layer */}
{/* Reflection layer */}
); }