'use client' import { detectBrowser, isBrowser } from 'common' import { motion } from 'framer-motion' import React, { PropsWithChildren, useEffect, useRef } from 'react' import { cn } from 'ui' interface Props { outerClassName?: string innerClassName?: string hasActiveOnHover?: boolean activeColor?: 'default' | 'brand' hasShimmer?: boolean hasInnerShimmer?: boolean shimmerFromColor?: string shimmerToColor?: string style?: React.CSSProperties innerStyle?: React.CSSProperties hasMotion?: boolean } const Panel = ({ outerClassName, innerClassName, hasActiveOnHover = false, activeColor = 'default', hasShimmer = false, hasInnerShimmer = false, shimmerFromColor, shimmerToColor, hasMotion = false, children, style, innerStyle, }: PropsWithChildren) => { const outerRef = useRef(null) const innerRef = useRef(null) const Component = hasMotion ? motion.div : 'div' const isSafari = isBrowser && detectBrowser() === 'Safari' const trackCursor = hasShimmer || hasInnerShimmer const handleGlow = (event: any) => { if (!outerRef.current || !innerRef.current) return const outerElement = outerRef.current as HTMLDivElement const innerElement = innerRef.current as HTMLDivElement const { x: elX, y: elY, width, height } = outerElement.getBoundingClientRect() const x = event.clientX - elX const y = event.clientY - elY const isActive = x > -0 && x < width + 0 && y > -0 && y < height + 0 if (hasShimmer) { const activeGlow = hasActiveOnHover && isActive ? `radial-gradient(65rem circle at ${x}px ${y}px, ${ activeColor === 'brand' ? 'var(--color-brand-900)' : 'var(--border-stronger)' }, transparent), ` : '' outerElement.style.backgroundImage = ` ${activeGlow}radial-gradient(30rem circle at ${x}px ${y}px, ${ shimmerFromColor ?? 'var(--border-strong)' }, ${shimmerToColor ?? 'var(--background-surface-300)'})` } if (hasInnerShimmer) { innerElement.style.backgroundImage = isActive ? `radial-gradient(7rem circle at ${x}px ${y}px, var(--background-surface-300), transparent), radial-gradient(20rem circle at ${x}px ${y}px, var(--background-surface-200), transparent)` : '' } } useEffect(() => { if (!isBrowser || trackCursor || isSafari) return window.addEventListener('mousemove', handleGlow) return () => { window.removeEventListener('mousemove', handleGlow) } }, []) return (
{children}
) } export default Panel