diff --git a/components/mobile-menu.tsx b/components/mobile-menu.tsx index 39228f1..35fc64e 100644 --- a/components/mobile-menu.tsx +++ b/components/mobile-menu.tsx @@ -1,6 +1,7 @@ "use client"; import { useEffect, useState } from "react"; +import { createPortal } from "react-dom"; import Link from "next/link"; import { usePathname } from "next/navigation"; import { Menu, X, ChevronDown, Phone, ArrowRight } from "lucide-react"; @@ -8,7 +9,6 @@ import { Menu, X, ChevronDown, Phone, ArrowRight } from "lucide-react"; type NavService = { slug: string; title: string }; const LINKS = [ - { href: "/", label: "Anasayfa" }, { href: "/cozumler", label: "Çözümler" }, { href: "/projeler", label: "Projeler" }, { href: "/blog", label: "Blog" }, @@ -25,10 +25,13 @@ export function MobileMenu({ phone: string; phoneRaw: string; }) { + const [mounted, setMounted] = useState(false); const [open, setOpen] = useState(false); const [servicesOpen, setServicesOpen] = useState(false); const pathname = usePathname(); + useEffect(() => setMounted(true), []); + // Rota değişince menüyü kapat useEffect(() => { setOpen(false); @@ -42,6 +45,120 @@ export function MobileMenu({ }; }, [open]); + // Drawer + overlay — header transform bağlamından kaçmak için body'ye portal + const overlay = ( +
+ {/* Koyu overlay */} +
setOpen(false)} + className={`absolute inset-0 bg-black/50 transition-opacity duration-300 ${ + open ? "opacity-100" : "opacity-0" + }`} + /> + + {/* Sağ drawer — beyaz panel */} +
+ {/* Üst bar */} +
+ + Menü + + +
+ + {/* Linkler */} + + + {/* Alt CTA */} +
+ + + {phone} + + + Ücretsiz Teklif + + +
+
+
+ ); + return (
- {/* Overlay + drawer */} -
- {/* Backdrop */} -
setOpen(false)} - className={`absolute inset-0 bg-black/40 backdrop-blur-sm transition-opacity duration-300 ${ - open ? "opacity-100" : "opacity-0" - }`} - /> - - {/* Panel */} -
- {/* Üst bar */} -
- - Menü - - -
- - {/* Linkler */} - - - {/* Alt CTA */} -
- - - {phone} - - - Ücretsiz Teklif - - -
-
-
+ {mounted && createPortal(overlay, document.body)}
); }