feat(nav): 외주·소프트웨어 2축 네비게이션 + 푸터 리뉴얼

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-06-11 01:42:37 +09:00
parent b13ddd3841
commit 6d6d6f353a
2 changed files with 303 additions and 235 deletions

View File

@@ -7,9 +7,8 @@ import { createClient } from '@/lib/supabase/client';
import type { User } from '@supabase/supabase-js';
const LINKS = [
{ href: '/packages', label: 'SaaS 제품' },
{ href: '/music', label: 'AI 음악' },
{ href: '/work', label: '커스텀 외주' },
{ href: '/outsourcing', label: '외주 개발' },
{ href: '/products', label: '소프트웨어' },
];
export default function TopNav() {
@@ -67,187 +66,220 @@ export default function TopNav() {
return (
<>
<header
className={[
'fixed left-1/2 -translate-x-1/2 z-50 w-full border-b border-transparent',
'md:rounded-full md:border transition-all duration-300 ease-out',
scrolled
? 'top-4 max-w-3xl md:shadow-[0_10px_40px_rgba(0,0,0,0.35)] md:border-white/10'
: 'top-0 max-w-none',
].join(' ')}
className="fixed top-0 left-0 right-0 z-50 w-full transition-all duration-300"
style={{
background: scrolled ? 'rgba(10,10,12,0.6)' : 'transparent',
backdropFilter: scrolled ? 'blur(18px) saturate(160%)' : 'none',
WebkitBackdropFilter: scrolled ? 'blur(18px) saturate(160%)' : 'none',
background: scrolled ? 'var(--jsm-surface)' : 'transparent',
borderBottom: scrolled ? '1px solid var(--jsm-line)' : '1px solid transparent',
boxShadow: scrolled ? '0 1px 8px rgba(15,23,42,0.06)' : 'none',
}}
>
<nav
className={[
'flex w-full items-center justify-between transition-all duration-300 ease-out',
scrolled ? 'h-14 px-4 md:px-3' : 'h-20 px-6 lg:px-12',
].join(' ')}
>
<Link
href="/"
className="kx-display text-2xl font-black tracking-tight kx-gradient-text"
style={{ textDecoration: 'none', letterSpacing: '0.02em' }}
>
JSM
</Link>
<div className="hidden md:flex items-center gap-8">
{LINKS.map((l) => (
<Link
key={l.href}
href={l.href}
className="text-sm font-medium transition-colors"
style={{
color: isActive(l.href) ? '#fff' : 'var(--kx-on-variant)',
borderBottom: isActive(l.href) ? '2px solid var(--kx-primary)' : '2px solid transparent',
paddingBottom: 4,
textDecoration: 'none',
}}
>
{l.label}
</Link>
))}
</div>
<div className="flex items-center gap-3">
{user ? (
<>
<Link
href="/mypage"
className="hidden sm:inline-block text-sm font-medium px-4 py-2 transition-colors"
style={{ color: 'var(--kx-on-variant)', textDecoration: 'none' }}
>
</Link>
<Link
href="/music"
className="kx-btn-primary hidden sm:inline-flex items-center px-5 py-2 rounded-full text-sm"
style={{ textDecoration: 'none' }}
>
Try now
</Link>
<button
onClick={handleLogout}
className="hidden sm:inline-flex items-center px-3 py-2 text-sm font-medium transition-colors"
style={{ color: 'var(--kx-on-variant)', background: 'transparent' }}
>
</button>
</>
) : (
<>
<Link
href="/login"
className="hidden sm:inline-block text-sm font-medium px-4 py-2 transition-colors"
style={{ color: 'var(--kx-on-variant)', textDecoration: 'none' }}
>
</Link>
<Link
href="/music"
className="kx-btn-primary hidden sm:inline-flex items-center px-5 py-2 rounded-full text-sm"
style={{ textDecoration: 'none' }}
>
Try now
</Link>
</>
)}
<button
onClick={() => setOpen(true)}
aria-label="메뉴 열기"
className="md:hidden p-2 rounded-lg"
style={{ color: 'var(--kx-on-surface)' }}
<nav className="max-w-7xl mx-auto flex w-full items-center justify-between h-16 px-6 lg:px-8">
{/* 로고 */}
<Link
href="/"
className="flex items-baseline gap-2"
style={{ textDecoration: 'none' }}
>
<svg className="w-6 h-6" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M4 6h16M4 12h16M4 18h16" />
</svg>
</button>
</div>
</nav>
</header>
{/* 모바일 오버레이 */}
{open && (
<div
className="fixed inset-0 z-[60] md:hidden flex flex-col"
style={{ background: 'rgba(6,14,32,0.98)', backdropFilter: 'blur(16px)' }}
>
<div className="flex items-center justify-between px-6 h-20">
<span className="kx-display text-2xl font-black kx-gradient-text" style={{ letterSpacing: '0.02em' }}>JSM</span>
<button
onClick={() => setOpen(false)}
aria-label="메뉴 닫기"
className="p-2"
style={{ color: 'var(--kx-on-surface)' }}
<span
className="text-xl font-black tracking-tight"
style={{ color: 'var(--jsm-ink)', letterSpacing: '-0.02em' }}
>
<svg className="w-6 h-6" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M6 18L18 6M6 6l12 12" />
</svg>
</button>
</div>
<div className="flex-1 flex flex-col gap-2 px-6 pt-6">
JSM
</span>
<span
className="hidden sm:inline text-sm font-medium"
style={{ color: 'var(--jsm-ink-soft)', letterSpacing: '-0.01em' }}
>
</span>
</Link>
{/* 데스크탑 링크 */}
<div className="hidden md:flex items-center gap-1">
{LINKS.map((l) => (
<Link
key={l.href}
href={l.href}
className="kx-display text-2xl font-bold py-3"
className="text-sm font-medium px-4 py-2 rounded-md transition-colors duration-150"
style={{
color: isActive(l.href) ? 'var(--kx-primary)' : 'var(--kx-on-surface)',
color: isActive(l.href) ? 'var(--jsm-accent)' : 'var(--jsm-ink-soft)',
background: isActive(l.href) ? 'var(--jsm-accent-soft)' : 'transparent',
textDecoration: 'none',
letterSpacing: '-0.01em',
}}
>
{l.label}
</Link>
))}
<div className="mt-6 flex flex-col gap-2">
</div>
{/* 데스크탑 CTA + auth */}
<div className="flex items-center gap-2">
{user ? (
<>
<Link
href="/mypage"
className="hidden sm:inline-block text-sm font-medium px-3 py-2 rounded-md transition-colors duration-150"
style={{ color: 'var(--jsm-ink-soft)', textDecoration: 'none', letterSpacing: '-0.01em' }}
>
</Link>
<button
onClick={handleLogout}
className="hidden sm:inline-flex items-center px-3 py-2 text-sm font-medium rounded-md transition-colors duration-150"
style={{ color: 'var(--jsm-ink-soft)', background: 'transparent', letterSpacing: '-0.01em' }}
>
</button>
</>
) : (
<Link
href="/login"
className="hidden sm:inline-block text-sm font-medium px-3 py-2 rounded-md transition-colors duration-150"
style={{ color: 'var(--jsm-ink-soft)', textDecoration: 'none', letterSpacing: '-0.01em' }}
>
</Link>
)}
<Link
href="/outsourcing#contact"
className="hidden sm:inline-flex items-center px-4 py-2 rounded-lg text-sm font-semibold transition-colors duration-150"
style={{
background: 'var(--jsm-accent)',
color: '#ffffff',
textDecoration: 'none',
letterSpacing: '-0.01em',
}}
onMouseEnter={(e) => { (e.currentTarget as HTMLElement).style.background = 'var(--jsm-accent-hover)'; }}
onMouseLeave={(e) => { (e.currentTarget as HTMLElement).style.background = 'var(--jsm-accent)'; }}
>
</Link>
{/* 모바일 햄버거 */}
<button
onClick={() => setOpen(true)}
aria-label="메뉴 열기"
className="md:hidden p-2 rounded-lg transition-colors duration-150"
style={{ color: 'var(--jsm-ink)' }}
>
<svg className="w-5 h-5" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M4 6h16M4 12h16M4 18h16" />
</svg>
</button>
</div>
</nav>
</header>
{/* 모바일 드로어 */}
{open && (
<div
className="fixed inset-0 z-[60] md:hidden"
style={{ background: 'rgba(15,23,42,0.4)' }}
onClick={() => setOpen(false)}
>
<div
className="absolute top-0 right-0 h-full w-72 flex flex-col shadow-xl"
style={{ background: 'var(--jsm-surface)' }}
onClick={(e) => e.stopPropagation()}
>
{/* 드로어 헤더 */}
<div
className="flex items-center justify-between px-6 h-16 border-b"
style={{ borderColor: 'var(--jsm-line)' }}
>
<div className="flex items-baseline gap-2">
<span
className="text-lg font-black tracking-tight"
style={{ color: 'var(--jsm-ink)', letterSpacing: '-0.02em' }}
>
JSM
</span>
<span
className="text-xs font-medium"
style={{ color: 'var(--jsm-ink-soft)' }}
>
</span>
</div>
<button
onClick={() => setOpen(false)}
aria-label="메뉴 닫기"
className="p-2 rounded-lg transition-colors duration-150"
style={{ color: 'var(--jsm-ink-soft)' }}
>
<svg className="w-5 h-5" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M6 18L18 6M6 6l12 12" />
</svg>
</button>
</div>
{/* 드로어 링크 */}
<div className="flex-1 flex flex-col px-4 pt-4 gap-1">
{LINKS.map((l) => (
<Link
key={l.href}
href={l.href}
className="text-base font-semibold px-3 py-3 rounded-lg transition-colors duration-150"
style={{
color: isActive(l.href) ? 'var(--jsm-accent)' : 'var(--jsm-ink)',
background: isActive(l.href) ? 'var(--jsm-accent-soft)' : 'transparent',
textDecoration: 'none',
letterSpacing: '-0.01em',
}}
>
{l.label}
</Link>
))}
<div
className="my-4 border-t"
style={{ borderColor: 'var(--jsm-line)' }}
/>
{user ? (
<>
<div className="flex gap-3">
<Link
href="/mypage"
className="flex-1 py-3 text-center rounded-full text-sm font-bold"
style={{ border: '1px solid rgba(255,255,255,0.15)', color: 'var(--kx-on-surface)', textDecoration: 'none' }}
>
</Link>
<Link
href="/music"
className="kx-btn-primary flex-1 py-3 text-center rounded-full text-sm"
style={{ textDecoration: 'none' }}
>
Try now
</Link>
</div>
<Link
href="/mypage"
className="text-sm font-medium px-3 py-3 rounded-lg transition-colors duration-150"
style={{ color: 'var(--jsm-ink-soft)', textDecoration: 'none', letterSpacing: '-0.01em' }}
>
</Link>
<button
onClick={handleLogout}
className="w-full py-3 text-center text-sm font-medium transition-colors"
style={{ color: 'var(--kx-on-variant)', background: 'transparent' }}
className="text-left text-sm font-medium px-3 py-3 rounded-lg transition-colors duration-150"
style={{ color: 'var(--jsm-ink-soft)', background: 'transparent', letterSpacing: '-0.01em' }}
>
</button>
</>
) : (
<div className="flex gap-3">
<Link
href="/login"
className="flex-1 py-3 text-center rounded-full text-sm font-bold"
style={{ border: '1px solid rgba(255,255,255,0.15)', color: 'var(--kx-on-surface)', textDecoration: 'none' }}
>
</Link>
<Link
href="/music"
className="kx-btn-primary flex-1 py-3 text-center rounded-full text-sm"
style={{ textDecoration: 'none' }}
>
Try now
</Link>
</div>
<Link
href="/login"
className="text-sm font-medium px-3 py-3 rounded-lg transition-colors duration-150"
style={{ color: 'var(--jsm-ink-soft)', textDecoration: 'none', letterSpacing: '-0.01em' }}
>
</Link>
)}
</div>
{/* 드로어 하단 CTA */}
<div className="px-4 pb-6">
<Link
href="/outsourcing#contact"
className="flex items-center justify-center w-full py-3 rounded-lg text-sm font-semibold transition-colors duration-150"
style={{
background: 'var(--jsm-accent)',
color: '#ffffff',
textDecoration: 'none',
letterSpacing: '-0.01em',
}}
>
</Link>
</div>
</div>
</div>
)}