임동욱 임동욱 09-03
feat: 사이드바 검색·즐겨찾기와 상단바 검색·사용자 버튼을 뺀다
넷 다 연결할 기능이 없어 눌러도 아무 일이 없던 자리다. 사용자 아이콘은 바로 옆
프로필 pill과 역할도 겹쳤다.

즐겨찾기는 화면뿐 아니라 도메인·mock까지 걷어낸다 — 그리는 곳이 사이드바뿐이라
남겨 두면 죽은 데이터가 된다.

알림 버튼과 프로필 pill은 남긴다. pill은 지금 유일한 로그아웃 경로다.

Co-Authored-By: Claude Opus 5 
@cb257ff20ea6ed24e3d18ece9fa0de610c8e875c
app/(protected)/(basic)/_components/admin-header.tsx
--- app/(protected)/(basic)/_components/admin-header.tsx
+++ app/(protected)/(basic)/_components/admin-header.tsx
@@ -15,15 +15,18 @@
  * Basic 레이아웃 헤더 — 시안 header(7028:7614)를 그대로 옮겼다. 좌측 로고, 우측에 아이콘
  * 버튼 3개와 프로필 pill이 온다.
  *
- * 시안과 다른 점 셋(전부 사용자 확정):
+ * 시안과 다른 점 넷(전부 사용자 확정):
  *  - 로고: 시안(관리자페이지 QsFVFFUKGH68xAPVkF3SJ9 logo 5199:9639)의 정사각 심볼과
  *    "FOX PAY ADMIN" 2색 글자를 그대로 쓴다.
  *  - 사이드바 토글 버튼을 뺐다 — 시안에 없다.
  *  - 프로필 pill을 눌러 로그아웃한다. 시안에 로그아웃 자리가 없는데 다른 경로도 없어서,
  *    CaretDown이 이미 "열린다"고 알리고 있는 이 자리에 메뉴를 붙였다.
  *
- * 검색·알림·사용자 버튼은 시안에 있으나 연결할 기능이 아직 없어 `onAction` 없이 둔다.
- * 시안의 모양을 유지하려고 비활성으로 만들지는 않았다 — 기능이 정해지면 핸들러만 붙인다.
+ *  - 검색·사용자 아이콘 버튼을 뺐다 — 연결할 기능이 없어 눌러도 아무 일이 없었고, 사용자
+ *    자리는 옆 프로필 pill과 겹쳤다.
+ *
+ * 남은 알림 버튼도 연결할 기능이 아직 없어 `onAction` 없이 둔다 — 시안의 모양을 유지하려고
+ * 비활성으로 만들지는 않았다.
  */
 export function AdminHeader({ adminName }: AdminHeaderProps) {
   const [isMenuOpen, setIsMenuOpen] = useState(false);
@@ -75,9 +78,7 @@
 
       <div className={styles.fnc}>
         <div className={styles.btnGroup}>
-          <HeaderIconButton icon={<i className="fox-ico fox-ico-MagnifyingGlass" aria-hidden="true" />} label="검색" />
           <HeaderIconButton icon={<i className="fox-ico fox-ico-BellSimple" aria-hidden="true" />} label="알림" hasBadge />
-          <HeaderIconButton icon={<i className="fox-ico fox-ico-User" aria-hidden="true" />} label="사용자" />
         </div>
 
         <div className={styles.profile} ref={profileRef}>
app/(protected)/(basic)/_components/admin-sidebar.module.scss
--- app/(protected)/(basic)/_components/admin-sidebar.module.scss
+++ app/(protected)/(basic)/_components/admin-sidebar.module.scss
@@ -32,21 +32,12 @@
 .top {
   display: flex;
   align-items: center;
+  justify-content: flex-end;
   gap: fox.gap(2);
   padding-block-end: fox.spacing(bottom-md);
 }
 
-.search {
-  flex: 1 0 0;
-  min-inline-size: 0;
-}
 
-// FoxInput의 기본 테두리는 input-border(진한 회색)인데 시안 검색창은 border-neutral-subtler다.
-// 크기·radius·안쪽 여백은 md가 이미 시안과 같아 색만 덮는다. 명시도가 같아 로드 순서에
-// 좌우되지 않도록 `:global()`을 겹쳐 이기게 한다.
-.search :global(.fox-input__box) {
-  border-color: fox.color(border-neutral-subtler);
-}
 
 // ── 섹션 ────────────────────────────────────────────────────────────────────
 .section {
@@ -57,10 +48,6 @@
 }
 
 // 즐겨찾기만 아래 구분선이 있고 위 여백이 없다.
-.sectionFavorites {
-  padding-block-end: fox.spacing(bottom-sm);
-  border-block-end: fox.border(1) solid fox.color(border-neutral-subtle);
-}
 
 .sectionNav {
   padding-block-start: fox.spacing(top-sm);
@@ -88,22 +75,6 @@
   list-style: none;
 }
 
-// ── 즐겨찾기 항목 ───────────────────────────────────────────────────────────
-.favorite {
-  display: flex;
-  inline-size: 100%;
-  align-items: center;
-  gap: fox.gap(2);
-  padding-block: fox.padding(1);
-  padding-inline: fox.padding(2);
-  color: fox.color(font-neutral-subtle);
-  font-family: fox.font-family(body);
-  // 시안 13px. heading/2xsm과 값이 같지만 이쪽은 본문 계열이라 리터럴로 둔다.
-  font-size: 1.3rem;
-  line-height: 1.5;
-  letter-spacing: -0.025em;
-  text-decoration: none;
-}
 
 // ── 1depth ──────────────────────────────────────────────────────────────────
 .item {
app/(protected)/(basic)/_components/admin-sidebar.tsx
--- app/(protected)/(basic)/_components/admin-sidebar.tsx
+++ app/(protected)/(basic)/_components/admin-sidebar.tsx
@@ -2,7 +2,6 @@
 
 import Link from 'next/link';
 import { FoxIconButton } from '@fox/core/components/fox-icon-button';
-import { FoxInput } from '@fox/core/components/fox-input';
 import type {
   SidebarMenu,
   SidebarMenuChild,
@@ -18,15 +17,13 @@
 }
 
 /**
- * Basic 레이아웃 사이드바 — 시안 snb-area(3041:11860)를 옮겼다. 검색·즐겨찾기·섹션별 GNB로
- * 이루어지고, GNB는 1depth > 2depth > 3depth 중첩이다.
+ * Basic 레이아웃 사이드바 — 시안 snb-area(3041:11860)를 옮겼다. 섹션별 GNB로 이루어지고,
+ * GNB는 1depth > 2depth > 3depth 중첩이다.
  *
  * **메뉴 데이터를 소유하지 않는다.** 권한마다 항목이 달라 매 요청 서버가 조회해 넘겨주며
  * (`fetchSidebarMenu`), 여기서는 받은 트리를 그리고 펼침·활성 상태만 판정한다. 그래서 새 화면이
  * 생겨도 이 파일은 손대지 않는다.
  *
- * 시안에 없어 넣지 않은 것: 검색 입력의 실제 동작(제출 대상이 정해지지 않음)과 즐겨찾기
- * 추가/해제. 별 아이콘은 시안대로 표시만 한다.
  */
 export function AdminSidebar({ menu }: AdminSidebarProps) {
   const nav = useSidebarNav(menu);
@@ -34,14 +31,6 @@
   return (
     <nav className={styles.sidebar} aria-label="주요 메뉴">
       <div className={styles.top}>
-        <div className={styles.search}>
-          <FoxInput
-            size="md"
-            placeholder="검색어를 입력하세요."
-            icon={<i className="fox-ico fox-ico-MagnifyingGlass" aria-hidden="true" />}
-            aria-label="메뉴 검색"
-          />
-        </div>
         <FoxIconButton
           size="xsm"
           type="ghost"
@@ -49,24 +38,6 @@
           label="사이드바 접기"
         />
       </div>
-
-      {menu.favorites.length > 0 && (
-        <section className={`${styles.section} ${styles.sectionFavorites}`}>
-          <h2 className={styles.sectionTitle}>즐겨찾기</h2>
-          <ul className={styles.list}>
-            {menu.favorites.map((favorite) => (
-              <li key={favorite.id} className={styles.item}>
-                <Link href={favorite.href} className={styles.favorite}>
-                  <span className={styles.childMark}>
-                    <i className="fox-ico fox-ico--fill fox-ico-Star" aria-hidden="true" />
-                  </span>
-                  {favorite.label}
-                </Link>
-              </li>
-            ))}
-          </ul>
-        </section>
-      )}
 
       {menu.sections.map((section) => (
         <section
app/(protected)/(basic)/layout.tsx
--- app/(protected)/(basic)/layout.tsx
+++ app/(protected)/(basic)/layout.tsx
@@ -3,7 +3,7 @@
 import type { SidebarMenu } from '@/lib/domain/sidebar-menu';
 import { AdminShell } from './_components/admin-shell';
 
-const EMPTY_MENU: SidebarMenu = { favorites: [], sections: [] };
+const EMPTY_MENU: SidebarMenu = { sections: [] };
 
 // Basic 레이아웃 — 헤더·사이드바·풋터가 있는 일반 관리자 화면 진입점. 보안 강제는 상위
 // `(protected)/layout.tsx`가 담당하므로 여기서는 크롬 조립(AdminShell)만 책임진다. page
lib/data/repositories/sidebar-menu-repository.ts
--- lib/data/repositories/sidebar-menu-repository.ts
+++ lib/data/repositories/sidebar-menu-repository.ts
@@ -29,11 +29,6 @@
  * 아이콘은 시안 1depth가 쓰는 Phosphor 세트에서 골랐다.
  */
 const MOCK_MENU: SidebarMenu = {
-  favorites: [
-    { id: 'fav-students', label: '학생 회원', href: '/students' },
-    { id: 'fav-admins', label: '관리자 회원', href: '/admins' },
-    { id: 'fav-notices', label: '공지사항', href: '/boards/notices' },
-  ],
   sections: [
     {
       id: 'operation',
lib/domain/sidebar-menu.ts
--- lib/domain/sidebar-menu.ts
+++ lib/domain/sidebar-menu.ts
@@ -43,14 +43,6 @@
   items: SidebarMenuItem[];
 };
 
-/** 즐겨찾기 항목 — 별 아이콘 + 라벨 한 줄이다. */
-export type SidebarMenuFavorite = {
-  id: string;
-  label: string;
-  href: string;
-};
-
 export type SidebarMenu = {
-  favorites: SidebarMenuFavorite[];
   sections: SidebarMenuSection[];
 };
Add a comment
List