feat: add multi-user admin panel and featured partners toggle on home page

This commit is contained in:
AyrisAI
2026-05-17 13:48:05 +03:00
parent 36e98a3883
commit 0504f12f5b
29 changed files with 1110 additions and 182 deletions

View File

@@ -1,84 +1,155 @@
"use client";
import { useState, useEffect } from "react";
import Link from "next/link";
import DynamicLogo from "./DynamicLogo";
import { motion } from "framer-motion";
import { motion, AnimatePresence } from "framer-motion";
import { Menu, X } from "lucide-react";
const NAV_LINKS = [
{ label: "Ana Sayfa", href: "/" },
{ label: "Çalışmalar", href: "/works" },
{ label: "Hizmetler", href: "/services" },
{ label: "Partnerler", href: "/partners" },
{ label: "Hakkımızda", href: "/about" },
{ label: "İletişim", href: "/contact" },
];
export default function Navbar() {
const [isOpen, setIsOpen] = useState(false);
// Body scroll lock
useEffect(() => {
if (isOpen) {
document.body.style.overflow = "hidden";
} else {
document.body.style.overflow = "unset";
}
return () => {
document.body.style.overflow = "unset";
};
}, [isOpen]);
return (
<motion.nav
initial={{ y: -100 }}
animate={{ y: 0 }}
transition={{ duration: 1, ease: [0.16, 1, 0.3, 1] }}
className="fixed top-0 left-0 w-full z-50 bg-[#f5f5f0]/90 backdrop-blur-md border-b border-black/10"
>
<div className="flex items-center justify-between px-6 md:px-12 py-5">
{/* Logo */}
<Link href="/" className="flex items-center gap-3 focus-visible:outline-2 focus-visible:outline-primary focus-visible:outline-offset-4 rounded-sm" aria-label="Muğla Dijital - Ana Sayfaya Dön">
<motion.div
initial={{ opacity: 0 }}
animate={{ opacity: 1 }}
transition={{ delay: 0.5 }}
className="relative w-36 h-10"
<>
<motion.nav
initial={{ y: -100 }}
animate={{ y: 0 }}
transition={{ duration: 1, ease: [0.16, 1, 0.3, 1] }}
className="fixed top-0 left-0 w-full z-50 bg-[#f5f5f0]/90 backdrop-blur-md border-b border-black/10"
>
<div className=" flex items-center justify-between py-2 md:py-5">
{/* Logo */}
<Link
href="/"
className="flex items-center gap-3 focus-visible:outline-2 focus-visible:outline-primary focus-visible:outline-offset-4 rounded-sm z-50"
aria-label="Muğla Dijital - Ana Sayfaya Dön"
onClick={() => setIsOpen(false)}
>
<DynamicLogo
src="/logo.png"
color="black"
width="100%"
height="100%"
size="contain"
/>
</motion.div>
</Link>
<motion.div
initial={{ opacity: 0 }}
animate={{ opacity: 1 }}
transition={{ delay: 0.5 }}
className="relative md:w-36 w-18 h-7 md:h-10"
>
<DynamicLogo
src="/logo.png"
color="black"
width="100%"
height="100%"
size="contain"
/>
</motion.div>
</Link>
{/* Center Nav */}
<div className="hidden lg:flex items-center">
{[
{ label: "Çalışmalar", href: "/works" },
{ label: "Hizmetler", href: "/services" },
{ label: "Partnerler", href: "/partners" },
{ label: "Hakkımızda", href: "/about" },
{ label: "İletişim", href: "/contact" },
].map((item, idx) => (
<div key={item.label} className="flex items-center">
{/* Diagonal separator */}
<motion.div
initial={{ opacity: 0, scaleY: 0 }}
animate={{ opacity: 1, scaleY: 1 }}
transition={{ delay: 0.2 + idx * 0.1 }}
className="w-16 h-10 relative mx-1"
>
<div className="absolute inset-0 flex items-center justify-center">
<div className="w-px h-14 bg-black/10 rotate-[-25deg]" />
</div>
</motion.div>
<motion.div
initial={{ opacity: 0, y: 10 }}
animate={{ opacity: 1, y: 0 }}
transition={{ delay: 0.3 + idx * 0.1 }}
>
<Link
href={item.href}
className="text-[11px] tracking-[0.15em] uppercase text-black/70 hover:text-black transition-colors nav-link-hover px-3 py-2 focus-visible:outline-2 focus-visible:outline-primary focus-visible:outline-offset-4 rounded-sm"
{/* Center Nav - Desktop */}
<div className="hidden lg:flex items-center">
{NAV_LINKS.map((item, idx) => (
<div key={item.label} className="flex items-center">
{/* Diagonal separator */}
<motion.div
initial={{ opacity: 0, scaleY: 0 }}
animate={{ opacity: 1, scaleY: 1 }}
transition={{ delay: 0.2 + idx * 0.1 }}
className="w-16 h-10 relative mx-1"
>
{item.label}
</Link>
</motion.div>
</div>
))}
</div>
<div className="absolute inset-0 flex items-center justify-center">
<div className="w-px h-14 bg-black/10 rotate-[-25deg]" />
</div>
</motion.div>
<motion.div
initial={{ opacity: 0, y: 10 }}
animate={{ opacity: 1, y: 0 }}
transition={{ delay: 0.3 + idx * 0.1 }}
>
<Link
href={item.href}
className="text-[11px] tracking-[0.15em] uppercase text-black/70 hover:text-black transition-colors nav-link-hover px-3 py-2 focus-visible:outline-2 focus-visible:outline-primary focus-visible:outline-offset-4 rounded-sm"
>
{item.label}
</Link>
</motion.div>
</div>
))}
</div>
{/* Right - Brand name */}
<motion.span
initial={{ opacity: 0 }}
animate={{ opacity: 1 }}
transition={{ delay: 1 }}
className="text-[13px] font-bold tracking-[0.1em] uppercase text-black"
aria-hidden="true"
>
Muğla Dijital
</motion.span>
</div>
</motion.nav>
{/* Right - Mobile Toggle & Brand */}
<div className="flex items-center gap-0 md:gap-6">
<motion.span
initial={{ opacity: 0 }}
animate={{ opacity: 1 }}
transition={{ delay: 1 }}
className="hidden md:block text-[13px] font-bold tracking-[0.1em] uppercase text-black"
aria-hidden="true"
>
Muğla Dijital
</motion.span>
<button
onClick={() => setIsOpen(!isOpen)}
className="lg:hidden p-2 flex items-center justify-center text-black/70 hover:text-black transition-colors z-50"
aria-label={isOpen ? "Menüyü Kapat" : "Menüyü Aç"}
>
{isOpen ? <X className="w-6 h-6" /> : <Menu className="w-6 h-6" />}
</button>
</div>
</div>
</motion.nav>
{/* Mobile Menu Overlay */}
<AnimatePresence>
{isOpen && (
<motion.div
initial={{ opacity: 0, x: "100%" }}
animate={{ opacity: 1, x: 0 }}
exit={{ opacity: 0, x: "100%" }}
transition={{ duration: 0.5, ease: [0.16, 1, 0.3, 1] }}
className="fixed inset-0 z-40 bg-[#f5f5f0] flex flex-col justify-center px-8 md:px-16"
>
<div className="flex flex-col gap-8">
{NAV_LINKS.map((item, idx) => (
<motion.div
key={item.label}
initial={{ opacity: 0, y: 20 }}
animate={{ opacity: 1, y: 0 }}
transition={{ delay: 0.1 + idx * 0.05 }}
>
<Link
href={item.href}
onClick={() => setIsOpen(false)}
className="text-4xl md:text-6xl font-bold tracking-tighter text-black/90 hover:text-black transition-all hover:pl-4"
style={{ fontFamily: "var(--font-martian)" }}
>
{item.label}
</Link>
</motion.div>
))}
</div>
</motion.div>
)}
</AnimatePresence>
</>
);
}