New Proje

This commit is contained in:
2026-03-17 00:46:49 +03:00
parent fc7dd7a4b2
commit ee9896315b
21 changed files with 1347 additions and 61 deletions
+165
View File
@@ -0,0 +1,165 @@
'use client'
import { useState } from 'react'
import Link from 'next/link'
import { usePathname } from 'next/navigation'
import {
HomeIcon,
UsersIcon,
CalendarDaysIcon,
BuildingOfficeIcon,
Cog6ToothIcon,
ArrowRightOnRectangleIcon,
Bars3Icon,
XMarkIcon,
} from '@heroicons/react/24/outline'
const navigation = [
{ name: 'Dashboard', href: '/', icon: HomeIcon },
{ name: 'Çalışanlar', href: '/employees', icon: UsersIcon },
{ name: 'İzinler', href: '/leave-requests', icon: CalendarDaysIcon },
{ name: 'Şirketler', href: '/companies', icon: BuildingOfficeIcon },
{ name: 'Ayarlar', href: '/settings', icon: Cog6ToothIcon },
]
export function Sidebar() {
const pathname = usePathname()
const [sidebarOpen, setSidebarOpen] = useState(false)
return (
<>
{/* Mobile sidebar trigger */}
<div className="lg:hidden fixed top-0 left-0 w-full h-16 bg-white dark:bg-zinc-900 border-b border-gray-200 dark:border-zinc-800 flex items-center px-4 z-40">
<button
className="p-2 text-gray-500 hover:text-gray-900 dark:hover:text-white focus:outline-none focus:ring-2 focus:ring-inset focus:ring-blue-500 rounded-md"
onClick={() => setSidebarOpen(true)}
>
<span className="sr-only">Menüyü </span>
<Bars3Icon className="h-6 w-6" aria-hidden="true" />
</button>
<div className="ml-4 font-bold text-xl dark:text-white text-gray-900 tracking-tight">
HRMS
</div>
</div>
{/* Mobile Sidebar Overlay */}
{sidebarOpen && (
<div className="relative z-50 lg:hidden" aria-modal="true">
<div className="fixed inset-0 bg-gray-900/80 transition-opacity" onClick={() => setSidebarOpen(false)} />
<div className="fixed inset-0 flex">
<div className="relative mr-16 flex w-full max-w-xs flex-1 transform transition duration-300 ease-in-out">
<div className="absolute left-full top-0 flex w-16 justify-center pt-5">
<button
type="button"
className="-m-2.5 p-2.5"
onClick={() => setSidebarOpen(false)}
>
<span className="sr-only">Menüyü Kapat</span>
<XMarkIcon className="h-6 w-6 text-white" aria-hidden="true" />
</button>
</div>
{/* Mobile Sidebar Content */}
<div className="flex grow flex-col gap-y-5 overflow-y-auto bg-white dark:bg-zinc-950 px-6 pb-4">
<div className="flex h-16 shrink-0 items-center">
<div className="font-bold text-2xl dark:text-white text-gray-900 tracking-tight flex items-center gap-2">
<BuildingOfficeIcon className="w-8 h-8 text-blue-600" />
HRMS
</div>
</div>
<nav className="flex flex-1 flex-col">
<ul role="list" className="flex flex-1 flex-col gap-y-7">
<li>
<ul role="list" className="-mx-2 space-y-1">
{navigation.map((item) => (
<li key={item.name}>
<Link
href={item.href}
onClick={() => setSidebarOpen(false)}
className={`
group flex gap-x-3 rounded-md p-2 text-sm leading-6 font-semibold
${pathname === item.href
? 'bg-gray-50 dark:bg-zinc-900 text-blue-600 dark:text-blue-400'
: 'text-gray-700 dark:text-gray-400 hover:text-blue-600 dark:hover:text-blue-400 hover:bg-gray-50 dark:hover:bg-zinc-900/50'
}
`}
>
<item.icon
className={`h-6 w-6 shrink-0 ${pathname === item.href ? 'text-blue-600 dark:text-blue-400' : 'text-gray-400 group-hover:text-blue-600 dark:group-hover:text-blue-400'}`}
aria-hidden="true"
/>
{item.name}
</Link>
</li>
))}
</ul>
</li>
</ul>
</nav>
</div>
</div>
</div>
</div>
)}
{/* Desktop Sidebar */}
<div className="hidden lg:fixed lg:inset-y-0 lg:z-50 lg:flex lg:w-72 lg:flex-col">
<div className="flex grow flex-col gap-y-5 overflow-y-auto border-r border-gray-200/50 dark:border-zinc-800/50 bg-white/80 dark:bg-zinc-950/80 backdrop-blur-xl px-6 pb-4">
<div className="flex h-16 shrink-0 items-center mt-4">
<div className="font-bold text-2xl dark:text-white text-gray-900 tracking-tight flex items-center gap-2 group cursor-pointer">
<div className="p-2 bg-gradient-to-br from-blue-500 to-indigo-600 rounded-lg shadow-lg shadow-blue-500/20 group-hover:scale-110 transition-transform duration-300">
<BuildingOfficeIcon className="w-6 h-6 text-white" />
</div>
<span className="bg-clip-text text-transparent bg-gradient-to-r from-gray-900 via-gray-700 to-gray-900 dark:from-white dark:via-gray-300 dark:to-white">HRMS</span>
</div>
</div>
<nav className="flex flex-1 flex-col">
<ul role="list" className="flex flex-1 flex-col gap-y-7">
<li>
<div className="text-[10px] font-bold tracking-widest leading-6 text-gray-400 dark:text-zinc-500 mb-4 uppercase">YÖNETİM PANELİ</div>
<ul role="list" className="-mx-2 space-y-2">
{navigation.map((item) => (
<li key={item.name}>
<Link
href={item.href}
className={`
group flex items-center gap-x-3 rounded-xl p-3 text-sm leading-6 font-semibold transition-all duration-300 relative overflow-hidden
${pathname === item.href
? 'bg-blue-600 shadow-md shadow-blue-600/20 text-white translate-x-1'
: 'text-gray-600 dark:text-gray-400 hover:text-blue-600 dark:hover:text-blue-400 hover:bg-blue-50 dark:hover:bg-blue-500/5'
}
`}
>
<item.icon
className={`h-5 w-5 shrink-0 transition-colors duration-300 ${pathname === item.href ? 'text-white' : 'text-gray-400 group-hover:text-blue-600 dark:group-hover:text-blue-400'}`}
aria-hidden="true"
/>
{item.name}
{pathname === item.href && (
<div className="absolute left-0 w-1 h-6 bg-white rounded-full opacity-50" />
)}
</Link>
</li>
))}
</ul>
</li>
<li className="mt-auto">
<form action="/auth/signout" method="post" className="-mx-2 pb-4">
<button
type="submit"
className="group flex w-full items-center gap-x-3 rounded-xl p-3 text-sm font-semibold leading-6 text-gray-500 hover:text-red-600 dark:text-zinc-400 dark:hover:text-red-400 hover:bg-red-50 dark:hover:bg-red-500/5 transition-all duration-300"
>
<ArrowRightOnRectangleIcon
className="h-5 w-5 shrink-0 text-gray-400 group-hover:text-red-500 transition-colors duration-300"
aria-hidden="true"
/>
Güvenli Çıkış
</button>
</form>
</li>
</ul>
</nav>
</div>
</div>
</>
)
}