Sidebar

어드민/대시보드용 좌측 사이드바. 접기/펼치기, 2depth 메뉴 트리, 활성 상태 자동 펼침을 지원합니다.

사용법

'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 레퍼런스

PropTypeDefault설명
menuItemsSidebarMenuItem[]사이드바에 표시할 메뉴 트리. 필수.
onMenuClick(href: string) => void메뉴 클릭 핸들러. Next.js라면 router.push에 연결.
logoReactNode사이트 타이틀 좌측에 들어갈 로고.
siteTitlestring'관리자'사이드바 헤더에 표시할 타이틀.
defaultCollapsedbooleanfalse초기 접힘 상태.
onCollapsedChange(collapsed: boolean) => void접힘 상태 변경 콜백. 메인 영역 ml 동기화에 사용.
footerReactNode사이드바 하단 슬롯. 사용자 정보·로그아웃 버튼 등.

SidebarMenuItem

PropType설명
labelstring메뉴 라벨. 필수.
hrefstring링크 URL. children이 있으면 생략 가능.
iconReactNode메뉴 아이콘. lucide-react 권장.
activeboolean활성 상태. 자식 중 active가 있으면 부모도 자동으로 펼쳐집니다.
childrenSidebarMenuItem[]2depth 자식 메뉴.

설치