임동욱 임동욱 09-14
feat: 화면 머리말에 설명 한 줄을 열고 가맹몰 네 화면에 시안 문구를 넣는다
FoxPageHeader에 description을 더한다 — 가맹몰 시안(FOX-PAY_2.0 2805:635)이 제목 아래
한 줄을 두는데 원 시안(page-tit-area)엔 그 자리가 없었다. 글자는 FoxHeadingGroup의
설명과 같은 토큰(body-md · font-neutral-subtle)이고 FoxListContainer가 그대로 넘긴다.

문구는 시안 그대로다 — 목록(BO-MAL-001) / 등록(BO-MAL-002) / 수정(BO-MAL-003) /
메뉴 등록·수정(BO-MAL-004).

Co-Authored-By: Claude Opus 5 
@a105464d289da8d73ca5410de54a30ad372a659f
@fox/core/components/fox-list-container/fox-list-container.tsx
--- @fox/core/components/fox-list-container/fox-list-container.tsx
+++ @fox/core/components/fox-list-container/fox-list-container.tsx
@@ -41,6 +41,8 @@
   // ── 머리말 ────────────────────────────────────────────────────────────────
   title?: ReactNode;
   breadcrumb?: FoxBreadcrumbItem[];
+  /** 제목 아래 한 줄 설명 — `FoxPageHeader`로 그대로 간다. */
+  description?: ReactNode;
   headerActions?: ReactNode;
   /**
    * 머리말과 목록 사이. 시안에서 이 자리에 오는 것은 `FoxTab`이다 — 목록 전체를 갈아 끼우는
@@ -110,6 +112,7 @@
 export function FoxListContainer<T>({
   title,
   breadcrumb,
+  description,
   headerActions,
   tabs,
   columns,
@@ -165,6 +168,7 @@
         <FoxPageHeader
           title={title}
           breadcrumb={breadcrumb}
+          description={description}
           actions={headerActions}
         />
       )}
@fox/core/components/fox-page-header/fox-page-header.tsx
--- @fox/core/components/fox-page-header/fox-page-header.tsx
+++ @fox/core/components/fox-page-header/fox-page-header.tsx
@@ -9,6 +9,8 @@
   title: ReactNode;
   /** 제목 위에 붙는 현재 위치. 넘기지 않으면 영역을 그리지 않는다. */
   breadcrumb?: FoxBreadcrumbItem[];
+  /** 제목 아래 한 줄 — 이 화면이 무엇을 하는 곳인지. 넘기지 않으면 영역을 그리지 않는다. */
+  description?: ReactNode;
   /**
    * 제목 오른쪽 자리. 시안에는 들어간 것이 없지만 배치가 자리를 비워 두고 있어
    * (제목이 남는 폭을 먹고 24px 간격이 있다) 화면이 버튼 같은 것을 얹을 수 있게 연다.
@@ -21,9 +23,11 @@
 }
 
 /**
- * @fox 화면 머리말. 현재 위치와 제목을 얹고 본문과의 간격까지 갖는다.
+ * @fox 화면 머리말. 현재 위치와 제목, 그 아래 설명 한 줄을 얹고 본문과의 간격까지 갖는다.
  *
  * 현재 위치는 `FoxBreadcrumb`를 그대로 쓴다 — 시안에서도 breadcrumb 인스턴스다.
+ * 설명은 가맹몰 시안(FOX-PAY_2.0 2805:635)이 제목 아래 두는 한 줄이다 — 원 시안(page-tit-area)엔
+ * 없지만 같은 세로 쌓임이라 제목 다음 자리로 연다.
  *
  * ⚠️ 스타일은 이 파일이 import하지 않는다 — 호스트 앱이 `@use "@fox/styles/components"`
  * (또는 개별 파티셜)로 한 번 불러와야 한다.
@@ -31,6 +35,7 @@
 export function FoxPageHeader({
   title,
   breadcrumb,
+  description,
   actions,
   hidden = false,
   className,
@@ -44,6 +49,7 @@
       <div className="fox-page-header__main">
         {breadcrumb && breadcrumb.length > 0 && <FoxBreadcrumb items={breadcrumb} />}
         <h1 className="fox-page-header__title">{title}</h1>
+        {description && <p className="fox-page-header__description">{description}</p>}
       </div>
       {actions && <div className="fox-page-header__actions">{actions}</div>}
     </div>
@fox/dev-test/component-registry.tsx
--- @fox/dev-test/component-registry.tsx
+++ @fox/dev-test/component-registry.tsx
@@ -3627,6 +3627,16 @@
         node: <FoxPageHeader title="리스트 페이지" />,
       },
       {
+        label: "제목 아래 설명 — 가맹몰 시안(2805:635)의 한 줄. 이 화면이 무엇을 하는 곳인지 적습니다",
+        node: (
+          <FoxPageHeader
+            breadcrumb={BREADCRUMB_ITEMS}
+            title="업체 등록"
+            description="지역상생몰에 노출할 업체를 등록한다"
+          />
+        ),
+      },
+      {
         label: "오른쪽 자리 (actions) — 시안엔 없지만 배치가 자리를 비워 둡니다",
         node: (
           <FoxPageHeader
@fox/styles/_fox-page-header.scss
--- @fox/styles/_fox-page-header.scss
+++ @fox/styles/_fox-page-header.scss
@@ -5,6 +5,7 @@
 //     <div class="fox-page-header__main">
 //       …fox-breadcrumb…                          <!-- 선택 -->
 //       <h1 class="fox-page-header__title">제목</h1>
+//       <p class="fox-page-header__description">설명</p>   <!-- 선택 -->
 //     </div>
 //     <div class="fox-page-header__actions">…</div>  <!-- 선택 -->
 //   </div>
@@ -15,10 +16,13 @@
 // 본문과의 간격(아래 여백)을 머리말이 갖는다 — 시안이 그렇게 묶어 놓았다. 화면마다 따로
 // 띄우지 않아도 된다.
 //
+// 설명 한 줄은 가맹몰 시안(FOX-PAY_2.0 2805:635 머리말)에서 왔다 — 제목과 같은 세로 쌓임에
+// 서고 글자는 FoxHeadingGroup의 설명과 같은 토큰이다.
+//
 // 토큰이 아닌 값:
 //   - line-height / letter-spacing: 시안 텍스트 스타일의 값이나 Figma가 변수로
 //     export하지 않는다.
-//   - `<h1>`의 브라우저 기본 여백 0: UA 기본값 지우기.
+//   - `<h1>`·`<p>`의 브라우저 기본 여백 0: UA 기본값 지우기.
 
 @use "abstracts" as fox;
 
@@ -51,6 +55,18 @@
     word-break: break-word;
   }
 
+  &__description {
+    inline-size: 100%;
+    margin: 0;
+    color: fox.color(font-neutral-subtle);
+    font-family: fox.font-family(body);
+    font-size: fox.font-size(body-md);
+    font-weight: fox.font-weight(regular);
+    line-height: 1.5;
+    letter-spacing: -0.025em;
+    word-break: break-word;
+  }
+
   // 제목 옆에 서고 줄어들지 않는다. 오른쪽 끝에 붙는 것을 선언으로 못박는다 — 제목 칸이
   // 남는 폭을 먹어 밀려나는 것에 기대면, 제목 칸이 없거나 좁아질 때 자리가 흔들린다.
   &__actions {
app/(protected)/(basic)/system/merchant-details/[frcsNo]/_components/merchant-detail-form.tsx
--- app/(protected)/(basic)/system/merchant-details/[frcsNo]/_components/merchant-detail-form.tsx
+++ app/(protected)/(basic)/system/merchant-details/[frcsNo]/_components/merchant-detail-form.tsx
@@ -114,6 +114,11 @@
     <>
       <FoxPageHeader
         title={`가맹몰 상세 ${isEdit ? '수정' : '등록'}`}
+        description={
+          isEdit
+            ? '등록된 업체 정보를 수정한다. 저장 즉시 앱에 반영된다'
+            : '지역상생몰에 노출할 업체를 등록한다'
+        }
         breadcrumb={[
           { label: '홈', href: '/' },
           { label: '관리자관리' },
app/(protected)/(basic)/system/merchant-details/[frcsNo]/products/_components/merchant-product-form.tsx
--- app/(protected)/(basic)/system/merchant-details/[frcsNo]/products/_components/merchant-product-form.tsx
+++ app/(protected)/(basic)/system/merchant-details/[frcsNo]/products/_components/merchant-product-form.tsx
@@ -98,6 +98,7 @@
     <>
       <FoxPageHeader
         title={`메뉴 ${isEdit ? '수정' : '등록'}`}
+        description="업체 상세 화면의 메뉴 목록과 메뉴 상세 팝업에 노출된다"
         breadcrumb={[
           { label: '홈', href: '/' },
           { label: '관리자관리' },
app/(protected)/(basic)/system/merchant-details/_components/merchant-detail-list.tsx
--- app/(protected)/(basic)/system/merchant-details/_components/merchant-detail-list.tsx
+++ app/(protected)/(basic)/system/merchant-details/_components/merchant-detail-list.tsx
@@ -262,6 +262,7 @@
   return (
     <FoxListContainer<MerchantDetailSummary>
       title="가맹몰 상세 관리"
+      description="지역상생몰(바우처 사용처)에 노출되는 업체를 등록·관리한다"
       breadcrumb={[
         { label: '홈', href: '/' },
         { label: '관리자관리' },
Add a comment
List