Sidebar
어드민/대시보드용 좌측 사이드바. 접기/펼치기, 2depth 메뉴 트리, 활성 상태 자동 펼침을 지원합니다.
Sidebar는
fixed 포지션으로 동작합니다. 페이지 레이아웃은 호출하는 쪽에서 직접 구성하세요. 실제 동작 예시는 CMS Showcase에서 확인할 수 있습니다.사용법
'use client';
import { useState } from 'react';
import { useRouter, usePathname } from 'next/navigation';
import { Sidebar, type SidebarMenuItem } from '@hanui/react';
import { LayoutDashboard, FileText, Settings } from 'lucide-react';
const menuItems: SidebarMenuItem[] = [
{
label: '대시보드',
href: '/dashboard',
icon: <LayoutDashboard className="w-5 h-5" />,
},
{
label: '콘텐츠',
icon: <FileText className="w-5 h-5" />,
children: [
{ label: '게시물', href: '/posts' },
{ label: '페이지', href: '/pages' },
],
},
{
label: '설정',
href: '/settings',
icon: <Settings className="w-5 h-5" />,
},
];
export default function AdminLayout({ children }: { children: React.ReactNode }) {
const router = useRouter();
const pathname = usePathname();
const [collapsed, setCollapsed] = useState(false);
const items = menuItems.map((item) => ({
...item,
active: item.href === pathname,
children: item.children?.map((child) => ({
...child,
active: child.href === pathname,
})),
}));
return (
<div className="min-h-screen">
<Sidebar
menuItems={items}
siteTitle="My App"
onMenuClick={(href) => router.push(href)}
onCollapsedChange={setCollapsed}
/>
<main className={`transition-all duration-300 ${collapsed ? 'ml-16' : 'ml-64'}`}>
{children}
</main>
</div>
);
}API 레퍼런스
| Prop | Type | Default | 설명 |
|---|---|---|---|
menuItems | SidebarMenuItem[] | — | 사이드바에 표시할 메뉴 트리. 필수. |
onMenuClick | (href: string) => void | — | 메뉴 클릭 핸들러. Next.js라면 router.push에 연결. |
logo | ReactNode | — | 사이트 타이틀 좌측에 들어갈 로고. |
siteTitle | string | '관리자' | 사이드바 헤더에 표시할 타이틀. |
defaultCollapsed | boolean | false | 초기 접힘 상태. |
onCollapsedChange | (collapsed: boolean) => void | — | 접힘 상태 변경 콜백. 메인 영역 ml 동기화에 사용. |
footer | ReactNode | — | 사이드바 하단 슬롯. 사용자 정보·로그아웃 버튼 등. |
SidebarMenuItem
| Prop | Type | 설명 |
|---|---|---|
label | string | 메뉴 라벨. 필수. |
href | string | 링크 URL. children이 있으면 생략 가능. |
icon | ReactNode | 메뉴 아이콘. lucide-react 권장. |
active | boolean | 활성 상태. 자식 중 active가 있으면 부모도 자동으로 펼쳐집니다. |
children | SidebarMenuItem[] | 2depth 자식 메뉴. |