"use client" import Link from '../LocalizedLink' import Image from 'next/image' import { useState, useRef } from 'react' import type { MegaMenuPayload } from './menuTypes' import { getLocalizedMenuText } from './menuTypes' interface DesktopMegaMenuProps { items: MegaMenuPayload[] lang: string currentPath: string } // Render a 1:1 image using next/image for optimization (website uses CDN images) function MenuImage({ src, alt, placeholder, className = '', }: { src?: string | null alt: string placeholder?: string className?: string }) { const [loaded, setLoaded] = useState(false) if (!src) { if (!placeholder) return null return ( {placeholder} ) } return ( {alt} setLoaded(true)} loading="lazy" /> ) } export function DesktopMegaMenu({ items, lang, currentPath }: DesktopMegaMenuProps) { const [openId, setOpenId] = useState(null) const [hoveredLinkImage, setHoveredLinkImage] = useState(null) const closeTimer = useRef | null>(null) const handleOpen = (id: string) => { if (closeTimer.current) clearTimeout(closeTimer.current) if (openId !== id) setHoveredLinkImage(null) setOpenId(id) } const handleClose = () => { closeTimer.current = setTimeout(() => { setOpenId(null) setHoveredLinkImage(null) }, 150) } return (
{items.map((item, index) => { const uniqueId = item.nodeId || item.id || `menu-${item.url || index}` const isOpen = openId === uniqueId const hasColumns = !!item.columns?.length const isActive = item.url ? currentPath === item.url : false const hasAnyColumnIcon = item.columns?.some(col => !!col.iconUrl) const hasAnyLinkImage = item.columns?.some(col => col.links.some(l => !!l.imageUrl)) const showRightPanel = item.rootImageUrl || hasAnyLinkImage return (
handleOpen(uniqueId)} onMouseLeave={handleClose} > {getLocalizedMenuText(item.label, lang)} {hasColumns && ( )} {hasColumns && (
handleOpen(uniqueId)} onMouseLeave={handleClose} >
{/* LEFT: Root menu image (1:1) */} {item.rootImageUrl && (
)} {/* CENTER: Columns */}
{item.columns!.map((column, columnIndex) => (
{/* Column icon (1:1) */} {hasAnyColumnIcon && (
)} {/* Title and links */}

{getLocalizedMenuText(column.title, lang)}

    {column.links.map((link, linkIndex) => (
  • setHoveredLinkImage(link.imageUrl || null)} onMouseLeave={() => setHoveredLinkImage(null)} > {getLocalizedMenuText(link.label, lang)}
  • ))}
))}
{/* RIGHT: Link hover preview / Root fallback (1:1) */} {showRightPanel && (
)}
)}
) })}
) }