"use client"; import { Icon } from "@iconify/react"; import dynamic from "next/dynamic"; import { Link, usePathname } from "@/i18n/routing"; import { useLocale, useTranslations } from "next-intl"; import { LanguageSwitcher } from "@/components/language-switcher"; import { Fragment, useState } from "react"; import { Button, ButtonIcon, ButtonLabel, Logo, Separator, } from "poyraz-ui/atoms"; import { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuLabel, DropdownMenuSeparator, DropdownMenuTrigger, Sheet, SheetClose, SheetContent, SheetTitle, SheetTrigger, Tabs, TabsList, TabsTrigger, Tooltip, TooltipContent, TooltipProvider, TooltipTrigger, } from "poyraz-ui/molecules"; import { NavbarTopBar, NavbarTopBarSection } from "poyraz-ui/organisms"; import { useKeyboardShortcutLabel } from "@/lib/use-keyboard-shortcut-label"; import { getResumeHref, NAV_DROPDOWN_GROUPS, NAV_LINKS, SOCIAL_LINKS, TOP_ICON_LINKS, } from "@/lib/links"; import type { ThemeMode } from "@/components/app-shell"; const SearchCommand = dynamic( () => import("@/components/search-command").then((mod) => mod.SearchCommand), { ssr: false }, ); const slowShineClassName = "[--poyraz-motion-duration-deliberate:1100ms]"; function getNavLinkClass(isActive: boolean) { return [ "inline-flex border-b-2 pb-1 text-sm transition-colors md:border-0 md:pb-0", isActive ? "border-red-600 text-foreground" : "border-transparent text-foreground/55 hover:text-foreground", ].join(" "); } type ThemeToggleProps = { theme: ThemeMode; onThemeChange: (theme: ThemeMode) => void; }; function ThemeToggle({ theme, onThemeChange }: ThemeToggleProps) { const nextTheme = theme === "dark" ? "light" : "dark"; const label = theme === "dark" ? "Light mode" : "Dark mode"; return ( onThemeChange(nextTheme)} > ); } type SiteNavbarProps = ThemeToggleProps; export function SiteNavbar({ theme, onThemeChange }: SiteNavbarProps) { const pathname = usePathname(); const [searchOpen, setSearchOpen] = useState(false); const [mobileMenuOpen, setMobileMenuOpen] = useState(false); const [mobileMenuGroupId, setMobileMenuGroupId] = useState(null); const shortcut = useKeyboardShortcutLabel(); const t = useTranslations("Nav"); const locale = useLocale(); const isActiveLink = (href: string) => { if (href === "/") return pathname === "/"; return pathname === href || pathname.startsWith(`${href}/`); }; const activeTab = NAV_LINKS.find((item) => isActiveLink(item.href))?.id; const activeMobileMenuGroup = NAV_DROPDOWN_GROUPS.find( (group) => group.id === mobileMenuGroupId, ); const handleMobileMenuOpenChange = (open: boolean) => { setMobileMenuOpen(open); if (!open) setMobileMenuGroupId(null); }; const languageLabel = locale === "tr" ? "Switch to English" : "Türkçe'ye geç"; return ( {TOP_ICON_LINKS.map((item) => { const href = item.id === "cv" ? getResumeHref(locale) : item.href; const label = t.has(item.id) ? t(item.id) : item.label; return ( {label} ); })} {languageLabel} {locale === "tr" ? "Tema değiştir" : "Toggle theme"} {NAV_LINKS.map((item, index) => ( {index > 0 && ( )} {t(item.id)} {NAV_DROPDOWN_GROUPS.filter( (group) => group.insertAfter === item.id, ).map((group) => ( !groupItem.external && isActiveLink(groupItem.href.split("?")[0]), ), )} h-9 cursor-pointer items-center gap-1 px-2.5`} > {t(group.id)} {group.items.map((groupItem) => ( {groupItem.external ? ( {t(groupItem.id)} ) : ( {t(groupItem.id)} )} ))} ))} ))} setSearchOpen(true)} className={`h-9 w-auto cursor-pointer px-3 text-sm ${slowShineClassName}`} aria-label={t("search")} > {t("search")} {shortcut} {t("social")} {t("socialLinks")} {SOCIAL_LINKS.map((item) => ( {item.label} ))} setSearchOpen(true)} > {t("menu")} {activeMobileMenuGroup ? ( setMobileMenuGroupId(null)} > {t(activeMobileMenuGroup.id)} {activeMobileMenuGroup.items.map((groupItem) => ( {groupItem.external ? ( {t(groupItem.id)} ) : ( {t(groupItem.id)} )} ))} ) : ( {t("mobileMenu")} setSearchOpen(true)} className={`w-full cursor-pointer justify-between ${slowShineClassName}`} aria-label={t("search")} > {t("search")} {shortcut} {NAV_LINKS.map((item) => ( {t(item.id)} {NAV_DROPDOWN_GROUPS.filter( (group) => group.insertAfter === item.id, ).map((group) => ( !groupItem.external && isActiveLink(groupItem.href.split("?")[0]), ), )} w-full cursor-pointer items-center justify-between gap-3 text-left`} onClick={() => setMobileMenuGroupId(group.id)} > {t(group.id)} ))} ))} {SOCIAL_LINKS.map((item) => ( {item.label} ))} )} ); }