import Link from 'next/link'; import { ThemeToggle } from './theme-toggle'; import { NavMenu, NavLinkItem, IconKey } from './nav-menu'; import { siteConfig } from '@/lib/config'; import { allPages } from 'contentlayer/generated'; export function SiteHeader() { const pages = allPages .slice() .sort((a, b) => (a.title || '').localeCompare(b.title || '')); const navItems: NavLinkItem[] = [ { key: 'home', href: '/', label: '首頁', iconKey: 'home' }, { key: 'blog', href: '/blog', label: 'Blog', iconKey: 'blog' }, ...pages.map((page) => ({ key: page._id, href: page.url, label: page.title, iconKey: getIconForPage(page.title, page.slug) })) ]; return (
); } const titleOverrides = Object.fromEntries( Object.entries(siteConfig.navIconOverrides?.titles ?? {}).map(([key, value]) => [ key.trim().toLowerCase(), value as IconKey ]) ); const slugOverrides = Object.fromEntries( Object.entries(siteConfig.navIconOverrides?.slugs ?? {}).map(([key, value]) => [ key.trim().toLowerCase(), value as IconKey ]) ); function getIconForPage(title?: string, slug?: string): IconKey { const normalizedTitle = title?.trim().toLowerCase(); if (normalizedTitle && titleOverrides[normalizedTitle]) { return titleOverrides[normalizedTitle]; } const normalizedSlug = slug?.trim().toLowerCase(); if (normalizedSlug && slugOverrides[normalizedSlug]) { return slugOverrides[normalizedSlug]; } if (!title) return 'file'; const lower = title.toLowerCase(); if (lower.includes('關於本站')) return 'menu'; if (lower.includes('關於') || lower.includes('about')) return 'user'; if (lower.includes('聯絡') || lower.includes('contact')) return 'contact'; if (lower.includes('位置') || lower.includes('map')) return 'location'; if (lower.includes('作品') || lower.includes('portfolio')) return 'pen'; if (lower.includes('標籤') || lower.includes('tags')) return 'tags'; if (lower.includes('homelab')) return 'server'; if (lower.includes('server') || lower.includes('伺服') || lower.includes('infrastructure')) return 'server'; if (lower.includes('開發工作環境')) return 'device'; if (lower.includes('device') || lower.includes('設備') || lower.includes('硬體') || lower.includes('hardware')) return 'device'; return 'file'; }