"use client"; import { motion, useAnimationControls, useReducedMotion } from "framer-motion"; import Image from "next/image"; import { useTheme } from "next-themes"; import { useEffect, useState } from "react"; import { cn } from "@/lib/utils"; type SiteLogoProps = { lightLogoUrl?: string | null; darkLogoUrl?: string | null; alt: string; priority?: boolean; className?: string; replayKey?: number; }; export function SiteLogo({ lightLogoUrl, darkLogoUrl, alt, priority = false, className, replayKey = 0, }: SiteLogoProps) { const { theme, resolvedTheme } = useTheme(); const [mounted, setMounted] = useState(false); const controls = useAnimationControls(); const reducedMotion = useReducedMotion(); useEffect(() => { setMounted(true); }, []); useEffect(() => { if (reducedMotion) { return; } controls.set({ opacity: 0, x: -42, scale: 0.88, rotate: -360, filter: "blur(8px)", }); void controls.start({ opacity: 1, x: 0, scale: 1, rotate: 0, filter: "blur(0px)", transition: { x: { duration: 0.78, ease: [0.22, 1, 0.36, 1] }, opacity: { duration: 0.46 }, rotate: { duration: 0.56, ease: "easeOut" }, scale: { duration: 0.72, ease: [0.22, 1, 0.36, 1] }, filter: { duration: 0.42, ease: [0.22, 1, 0.36, 1] }, }, }); }, [controls, reducedMotion, replayKey]); const activeTheme = theme === "system" ? resolvedTheme : theme; const isDark = mounted && activeTheme === "dark"; const fallbackSrc = isDark ? "/logos/dark-primary.svg" : "/logos/light-primary.svg"; const src = isDark ? darkLogoUrl || lightLogoUrl || fallbackSrc : lightLogoUrl || darkLogoUrl || fallbackSrc; return ( {alt} ); }