From a321ac5c9b32900475d3199858022535504c7b63 Mon Sep 17 00:00:00 2001 From: egecankomur Date: Tue, 2 Jun 2026 18:39:34 +0300 Subject: [PATCH] =?UTF-8?q?fix:=20mobil=20men=C3=BC=20drawer'=C4=B1=20body?= =?UTF-8?q?'ye=20portal=20et=20=E2=80=94=20header=20transform'u=20fixed=20?= =?UTF-8?q?konumu=20bozuyordu?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Header scroll efekti #floating-header-wrap'e transform uyguladığı için içindeki position:fixed overlay viewport yerine header'a göre konumlanıyordu. Drawer + overlay artık createPortal ile document.body'ye render ediliyor: sağ drawer, beyaz panel, tam ekran koyu overlay (z-100). --- components/mobile-menu.tsx | 229 +++++++++++++++++++------------------ 1 file changed, 119 insertions(+), 110 deletions(-) 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)}
); }