import { NavLink } from 'react-router-dom' import { useState } from 'react' interface NavItem { label: string; path?: string; icon: string; children?: NavItem[] } const NAV: NavItem[] = [ { label: 'λŒ€μ‹œλ³΄λ“œ', icon: 'πŸ“Š', path: '/' }, { label: '인프라 관리', icon: 'πŸ–₯️', children: [ { label: 'μ„œλ²„ λͺ©λ‘', icon: '', path: '/servers' }, { label: 'CMDB ν˜„ν™©', icon: '', path: '/cmdb' }, ]}, { label: '배포/CI-CD', icon: 'πŸš€', children: [ { label: '배포 이λ ₯', icon: '', path: '/deployments' }, { label: 'μ €μž₯μ†Œ λͺ©λ‘',icon: '', path: '/repos' }, ]}, { label: 'μ‚¬μš©μž/ν…Œλ„ŒνŠΈ',icon: 'πŸ‘₯', children: [ { label: 'μ‚¬μš©μž 관리',icon: '', path: '/users' }, { label: 'κΈ°κ΄€ 관리', icon: '', path: '/institutions' }, ]}, { label: 'λ³΄μ•ˆ', icon: 'πŸ”’', children: [ { label: 'API Key', icon: '', path: '/api-keys' }, { label: '감사 둜그', icon: '', path: '/audit' }, ]}, { label: 'AI / LLM', icon: 'πŸ€–', path: '/llm' }, { label: 'μ‹œμŠ€ν…œ μ„€μ •', icon: 'βš™οΈ', children: [ { label: 'ν™˜κ²½λ³€μˆ˜', icon: '', path: '/config/env' }, { label: 'Nginx 관리', icon: '', path: '/config/nginx' }, ]}, { label: 'μ•Œλ¦Ό/리포트', icon: 'πŸ””', path: '/notifications' }, { label: 'μŠ€ν¬λž©ν•‘ 봇', icon: 'πŸ•·οΈ', path: '/scraping' }, { label: 'λΌμ΄μ„ μŠ€ 관리',icon: 'πŸͺͺ', path: '/licenses' }, { label: '데이터 연동', icon: 'πŸ”„', path: '/export-import' }, { label: '운영 κ΄€μ œ', icon: 'πŸ›°οΈ', children: [ { label: 'DR μž¬ν•΄λ³΅κ΅¬', icon: '', path: '/dr' }, { label: 'λ„€νŠΈμ›Œν¬ μž₯λΉ„', icon: '', path: '/network' }, { label: 'CSAP 점검', icon: '', path: '/csap' }, ]}, // ── GUARDiA ν™•μž₯ v3 ── { label: '뢄석 Β· KPI', icon: 'πŸ“ˆ', children: [ { label: 'KPI λŒ€μ‹œλ³΄λ“œ', icon: '', path: '/kpi' }, { label: 'BI λŒ€μ‹œλ³΄λ“œ', icon: '', path: '/bi' }, ]}, { label: 'AI ν”Œλž«νΌ', icon: '🧠', path: '/ai-platform' }, { label: 'μ™ΈλΆ€ 연동', icon: 'πŸ”—', path: '/integrations' }, { label: 'ꡬ독 Β· 과금', icon: 'πŸ’°', path: '/billing' }, ] /* Variant μŠ€νƒ€μΌ 색상 μƒμˆ˜ */ const V = { navy: '#003366', blue: '#005A8C', cyan: '#00A0C8', cyanLt: 'rgba(0,160,200,.10)', cyanAct: 'rgba(0,160,200,.15)', muted: '#64748B', text: '#334155', border: '#E2E8F0', bg: '#F8FAFC', } function NavGroup({ item }: { item: NavItem }) { const [open, setOpen] = useState(true) if (!item.children) { return ( ({ display: 'flex', alignItems: 'center', gap: 8, padding: '8px 16px', fontSize: 13, color: isActive ? V.navy : V.muted, background: isActive ? V.cyanAct : 'transparent', borderLeft: isActive ? `3px solid ${V.cyan}` : '3px solid transparent', fontWeight: isActive ? 700 : 400, transition: 'all .15s', textDecoration: 'none', })}> {item.icon} {item.label} ) } return (
{open && item.children.map(c => ( ({ display: 'flex', alignItems: 'center', padding: '7px 16px 7px 42px', fontSize: 12.5, color: isActive ? V.navy : V.muted, background: isActive ? V.cyanAct : 'transparent', borderLeft: isActive ? `3px solid ${V.cyan}` : '3px solid transparent', fontWeight: isActive ? 600 : 400, transition: 'all .15s', textDecoration: 'none', })}> {c.label} ))}
) } export function Sidebar() { return ( ) }