"use client"; import React, { useMemo } from "react"; import { motion, Transition } from "framer-motion"; import { Sun, Cloud, MessageSquare, Briefcase, Zap } from "lucide-react"; // --- Types --- type OrbitConfig = { id: number; radiusFactor: number; speed: number; // seconds per rotation icon: React.ReactNode; iconSize: number; orbitColor?: string; orbitThickness?: number; }; type BeamCircleProps = { size?: number; orbits?: OrbitConfig[]; centerIcon?: React.ReactNode; }; // --- Default Orbits --- const defaultOrbits: OrbitConfig[] = [ { id: 1, radiusFactor: 0.15, speed: 7, icon: , iconSize: 20, orbitColor: "rgba(255, 193, 7, 0.4)", orbitThickness: 1.5, }, { id: 2, radiusFactor: 0.35, speed: 12, icon: , iconSize: 24, orbitThickness: 1.5, }, { id: 3, radiusFactor: 0.55, speed: 9, icon: , iconSize: 28, orbitColor: "rgba(76, 175, 80, 0.4)", orbitThickness: 2, }, { id: 4, radiusFactor: 0.75, speed: 15, icon: , iconSize: 32, orbitThickness: 1, }, ]; // --- Component --- const BeamCircle: React.FC = ({ size = 300, orbits: customOrbits, centerIcon, }) => { const orbitsData = useMemo(() => customOrbits || defaultOrbits, [customOrbits]); const halfSize = size / 2; // --- Define linear easing manually --- const linearEase = (t: number) => t; const rotationTransition = (duration: number): Transition => ({ repeat: Infinity, duration, ease: linearEase, // ✅ Works properly now }); // --- Center Icon --- const CenterIcon = useMemo( () => ( {centerIcon ? ( centerIcon ) : ( )} ), [halfSize, centerIcon] ); return (
{orbitsData.map((orbit) => { const orbitDiameter = size * orbit.radiusFactor; const orbitRadius = orbitDiameter / 2; const containerSize = size; return ( {/* Orbit Line */}
{/* Rotating Container */} {/* Traveling Icon */}
{React.cloneElement(orbit.icon as React.ReactElement, { size: orbit.iconSize * 0.6, })}
); })} {/* Central Icon */}
{CenterIcon}
); }; export default BeamCircle;