/* Motion · site navigation with mega dropdowns. Sticky header. Two mega-dropdowns: · "Funkcje" — every feature grouped by module (4-column grid) · "Cennik" / "Wsparcie" — flat single-column dropdowns Plus standard nav links, primary CTA, and a mobile drawer. Highlights an item if its slug matches `activeFeature` prop. */ const { useState: useNavState, useEffect: useNavEffect, useRef: useNavRef } = React; /* Click-outside / Escape close helper. */ function useDismiss(ref, onClose) { useNavEffect(() => { const onDocClick = (e) => { if (ref.current && !ref.current.contains(e.target)) onClose(); }; const onKey = (e) => { if (e.key === "Escape") onClose(); }; document.addEventListener("mousedown", onDocClick); document.addEventListener("keydown", onKey); return () => { document.removeEventListener("mousedown", onDocClick); document.removeEventListener("keydown", onKey); }; }, [ref, onClose]); } /* Clamp a dropdown into the viewport horizontally: if the natural left:0 positioning makes it spill off the right edge, shift it left by the overflow. Re-runs on resize. */ function useViewportClamp(ref) { useNavEffect(() => { const el = ref.current; if (!el) return; const adjust = () => { el.style.left = "0"; const r = el.getBoundingClientRect(); const margin = 12; if (r.right > window.innerWidth - margin) { const shift = r.right - (window.innerWidth - margin); el.style.left = `-${Math.round(shift)}px`; } else if (r.left < margin) { el.style.left = `${Math.round(margin - r.left)}px`; } }; adjust(); window.addEventListener("resize", adjust); return () => window.removeEventListener("resize", adjust); }, [ref]); } function MegaTrigger({ label, isOpen, onClick }) { return ( ); } function FunkcjeMega({ activeFeature, onClose }) { const ref = useNavRef(null); useViewportClamp(ref); return (
{FEATURES_BY_MODULE.map((mod) => (

{mod.name}

{mod.features.map((f) => ( {f.name} {!f.built && wkrótce} {f.desc} ))}
))}

Nie wiesz, od czego zacząć? Pokażemy Ci tylko te funkcje, których naprawdę potrzebujesz.

Umów prezentację
); } function ModulyMega({ onClose }) { const ref = useNavRef(null); useViewportClamp(ref); return (
{MODULES.map((m) => ( {m.name} {m.desc} ))}
); } function MobilePanel({ open, onClose, activeFeature }) { if (!open) return null; return (
{FEATURES_BY_MODULE.map((mod) => (

{mod.name}

{mod.features.map((f) => ( {f.name}{!f.built ? " · wkrótce" : ""} ))}
))}
Cennik Wsparcie Kontakt
); } function Header({ activeFeature }) { const [openMenu, setOpenMenu] = useNavState(null); // 'moduly' | 'funkcje' | null const [scrolled, setScrolled] = useNavState(false); const [mobileOpen, setMobileOpen] = useNavState(false); const wrapRef = useNavRef(null); useNavEffect(() => { const onScroll = () => setScrolled(window.scrollY > 4); onScroll(); window.addEventListener("scroll", onScroll, { passive: true }); return () => window.removeEventListener("scroll", onScroll); }, []); useDismiss(wrapRef, () => setOpenMenu(null)); const toggle = (k) => setOpenMenu((cur) => (cur === k ? null : k)); const close = () => setOpenMenu(null); return (
setMobileOpen(false)} activeFeature={activeFeature} />
); } Object.assign(window, { Header });