/** * 사이드바 메뉴 도메인 — 시안(snb-area 3041:11860)의 `section > 1depth > 2depth > 3depth` * 중첩을 그대로 옮긴 모양이다. * * **메뉴는 화면이 소유하지 않는다.** 계정 권한마다 보이는 항목이 달라서 매 요청 백엔드가 * 구성해 주는 값이며, 컴포넌트는 받은 트리를 그리기만 한다. 그래서 라우트 목록을 컴포넌트 * 안에 상수로 두지 않는다. * * 아이콘은 컴포넌트가 아니라 **이름 문자열**로 받는다 — 백엔드가 넘길 수 있는 형태가 문자열 * 뿐이고, 이름 → 컴포넌트 변환은 화면 쪽 레지스트리가 맡는다(sidebar-menu-icon.tsx). */ /** 3depth 항목 — 더 내려가지 않는 잎이다. */ export type SidebarMenuLeaf = { id: string; label: string; href: string; }; /** 2depth 항목 — 자식이 있으면 펼침 대상이 되고, 없으면 그 자체가 링크다. */ export type SidebarMenuChild = { id: string; label: string; /** 자식이 있는 항목은 스스로 이동하지 않을 수 있다. */ href?: string; children?: SidebarMenuLeaf[]; }; /** 1depth 항목 — 아이콘을 갖는 최상위 메뉴다. */ export type SidebarMenuItem = { id: string; label: string; /** Phosphor 아이콘 이름(kebab-case). 예: `users-three`. */ icon: string; href?: string; children?: SidebarMenuChild[]; }; /** 시안의 "플랫폼 운영"·"서비스"·"플러그인"처럼 제목을 가진 묶음. */ export type SidebarMenuSection = { id: string; label: string; items: SidebarMenuItem[]; }; export type SidebarMenu = { sections: SidebarMenuSection[]; };