임동욱 임동욱 09-22
feat: 표의 코드·ID·아이디·이름·작성자 열도 왼쪽 정렬로 맞춘다
디자인팀 규칙 보완(사용자 요청). 가맹점코드·코드ID·상세코드ID·아이템ID·메뉴번호, 이름·아이디·
보호자이름·아이템명·작성자·질문자명에 align=start. 번호·날짜·상태·구분 같은 짧은 값은 가운데 그대로.

Co-Authored-By: Claude Opus 5 
@8b6539e13aecc767db331b18fec76a5361dc3cf4
@fox/dev-test/component-registry.tsx
--- @fox/dev-test/component-registry.tsx
+++ @fox/dev-test/component-registry.tsx
@@ -3069,7 +3069,7 @@
     id: "fox-table",
     name: "FoxTable",
     description:
-      "Figma 시안 9종(tbl-basic · tbl-list · tbl-form과 각각의 행·칸)을 FoxTable / FoxTableRow / FoxTableCell 셋으로 옮겼습니다. 진짜 <table>이라 스크린리더가 행·열을 읽어 주고 colSpan·rowSpan이 그대로 동작합니다. 머리행은 head만 주면 <thead>로 알아서 갈립니다. 창을 768px 아래로 좁히면 list는 카드로 접히고 form은 레이블이 입력 위로 올라갑니다. 열 정렬은 디자인팀 규칙대로 가운데가 기본이고, 제목 열과 긴 글 열(주소·설명·내용·전화번호)만 align=\"start\"로 왼쪽입니다. 머리칸은 본문 열과 같은 정렬입니다.",
+      "Figma 시안 9종(tbl-basic · tbl-list · tbl-form과 각각의 행·칸)을 FoxTable / FoxTableRow / FoxTableCell 셋으로 옮겼습니다. 진짜 <table>이라 스크린리더가 행·열을 읽어 주고 colSpan·rowSpan이 그대로 동작합니다. 머리행은 head만 주면 <thead>로 알아서 갈립니다. 창을 768px 아래로 좁히면 list는 카드로 접히고 form은 레이블이 입력 위로 올라갑니다. 열 정렬은 디자인팀 규칙대로 가운데가 기본이고, 제목·코드·ID·이름 열과 긴 글 열(주소·설명·내용·전화번호)은 align=\"start\"로 왼쪽입니다. 머리칸은 본문 열과 같은 정렬입니다.",
     variants: [
       {
         label: "list 표 예시 — 시안 699:6304 그대로. 체크·정렬·버튼·고른 줄",
@fox/styles/_fox-table.scss
--- @fox/styles/_fox-table.scss
+++ @fox/styles/_fox-table.scss
@@ -28,7 +28,8 @@
 // 열 이름을 글자로 보여 준다.
 //
 // 열 정렬 규약(디자인팀 확정, 2026-09-22) — 목록·기본 표는 **가운데가 기본**이고, **제목 열
-// (emphasis)과 긴 글 열(주소·설명·내용·키워드·이메일·전화번호)만 `align="start"`** 로 왼쪽에 둔다.
+// (emphasis)·글자 식별 열(코드·ID·아이디·이름·작성자)·긴 글 열(주소·설명·내용·키워드·이메일·
+// 전화번호)은 `align="start"`** 로 왼쪽에 둔다. 번호·날짜·상태·구분 같은 짧은 값은 가운데.
 // 머리칸은 본문 열과 같은 정렬이다(FoxListContainer가 같은 align을 머리칸에도 준다).
 //
 // 토큰이 아닌 값:
app/(protected)/(basic)/admins/_components/admin-member-list.tsx
--- app/(protected)/(basic)/admins/_components/admin-member-list.tsx
+++ app/(protected)/(basic)/admins/_components/admin-member-list.tsx
@@ -71,8 +71,8 @@
       width: 80,
       render: (_row, index) => totalCount - offset - index,
     },
-    { key: 'name', header: '이름', width: FILL_COLUMN_WIDTH },
-    { key: 'loginId', header: '아이디', width: FILL_COLUMN_WIDTH },
+    { key: 'name', header: '이름', align: 'start', width: FILL_COLUMN_WIDTH },
+    { key: 'loginId', header: '아이디', align: 'start', width: FILL_COLUMN_WIDTH },
     {
       key: 'phoneNumber',
       header: '휴대전화번호',
app/(protected)/(basic)/admins/menus/_components/admin-menu-list.tsx
--- app/(protected)/(basic)/admins/menus/_components/admin-menu-list.tsx
+++ app/(protected)/(basic)/admins/menus/_components/admin-menu-list.tsx
@@ -101,7 +101,7 @@
   }
 
   const columns: FoxListColumn<AdminMenuNode>[] = [
-    { key: 'id', header: '메뉴번호', width: 120 },
+    { key: 'id', header: '메뉴번호', align: 'start', width: 120 },
     {
       key: 'isActive',
       header: '활성여부',
app/(protected)/(basic)/boards/_components/board-post-columns.tsx
--- app/(protected)/(basic)/boards/_components/board-post-columns.tsx
+++ app/(protected)/(basic)/boards/_components/board-post-columns.tsx
@@ -100,6 +100,7 @@
     {
       key: 'authorName',
       header: '작성자',
+      align: 'start',
       width: 160,
       render: (row) => formatOptionalValue(row.authorName),
     },
@@ -138,6 +139,7 @@
     {
       key: 'authorName',
       header: '작성자',
+      align: 'start',
       width: 160,
       render: (row) => formatOptionalValue(row.authorName),
     },
@@ -206,6 +208,7 @@
     {
       key: 'authorName',
       header: '질문자명',
+      align: 'start',
       width: 140,
       render: (row) => formatOptionalValue(row.authorName),
     },
app/(protected)/(basic)/decoration-items/_components/decoration-item-list.tsx
--- app/(protected)/(basic)/decoration-items/_components/decoration-item-list.tsx
+++ app/(protected)/(basic)/decoration-items/_components/decoration-item-list.tsx
@@ -88,7 +88,7 @@
       // "가장 작은 정렬순서가 1번"이 되도록 앞에서부터 센다.
       render: (_row, index) => (currentPage - 1) * query.pageSize + index + 1,
     },
-    { key: 'itemSn', header: '아이템ID', width: 236 },
+    { key: 'itemSn', header: '아이템ID', align: 'start', width: 236 },
     {
       key: 'thumbnail',
       header: '썸네일',
@@ -107,7 +107,7 @@
           EMPTY_FIELD_PLACEHOLDER
         ),
     },
-    { key: 'name', header: '아이템명', width: 236 },
+    { key: 'name', header: '아이템명', align: 'start', width: 236 },
     {
       key: 'category',
       header: '카테고리',
app/(protected)/(basic)/points/accumulated/_components/point-account-list.tsx
--- app/(protected)/(basic)/points/accumulated/_components/point-account-list.tsx
+++ app/(protected)/(basic)/points/accumulated/_components/point-account-list.tsx
@@ -80,7 +80,7 @@
       width: 80,
       render: (_row, index) => (currentPage - 1) * query.pageSize + index + 1,
     },
-    { key: 'loginId', header: '아이디', width: 140 },
+    { key: 'loginId', header: '아이디', align: 'start', width: 140 },
     { key: 'studentName', header: '학생명', align: 'start', width: 120, emphasis: true },
     { key: 'schoolName', header: '학교명', width: 160 },
     { key: 'grade', header: '학년', width: 80, align: 'center' },
app/(protected)/(basic)/students/_components/student-list.tsx
--- app/(protected)/(basic)/students/_components/student-list.tsx
+++ app/(protected)/(basic)/students/_components/student-list.tsx
@@ -87,8 +87,8 @@
       // 저장된 값이 아니라 현재 페이지 기준 표시 순번이다(종전 표와 같은 규칙).
       render: (_row, index) => (currentPage - 1) * query.pageSize + index + 1,
     },
-    { key: 'name', header: '이름', width: 120 },
-    { key: 'loginId', header: '아이디', width: 160 },
+    { key: 'name', header: '이름', align: 'start', width: 120 },
+    { key: 'loginId', header: '아이디', align: 'start', width: 160 },
     {
       key: 'phoneNumber',
       header: '휴대전화번호',
@@ -117,6 +117,7 @@
     {
       key: 'guardianName',
       header: '보호자이름',
+      align: 'start',
       width: 120,
       render: (row) => lines(row.guardians.map((guardian) => guardian.name)),
     },
app/(protected)/(basic)/system/codes/_components/code-management.tsx
--- app/(protected)/(basic)/system/codes/_components/code-management.tsx
+++ app/(protected)/(basic)/system/codes/_components/code-management.tsx
@@ -145,7 +145,7 @@
       width: 80,
       render: (_row, index) => (groupPage - 1) * COMMON_CODE_PAGE_SIZE + index + 1,
     },
-    { key: 'comCd', header: '코드ID', width: 120 },
+    { key: 'comCd', header: '코드ID', align: 'start', width: 120 },
     { key: 'name', header: '코드명', align: 'start', width: 160, emphasis: true },
     {
       key: 'description',
@@ -189,7 +189,7 @@
       // 기획의 상세코드 목록은 이 자리에 정렬번호를 보여준다(FSC01→1, FSC10→10).
       render: (row) => row.sortSeq,
     },
-    { key: 'comDtlCd', header: '상세코드ID', width: 120 },
+    { key: 'comDtlCd', header: '상세코드ID', align: 'start', width: 120 },
     { key: 'name', header: '상세코드명', align: 'start', width: 120, emphasis: true },
     {
       key: 'description',
app/(protected)/(basic)/system/merchants/_components/merchant-list.tsx
--- app/(protected)/(basic)/system/merchants/_components/merchant-list.tsx
+++ app/(protected)/(basic)/system/merchants/_components/merchant-list.tsx
@@ -67,7 +67,7 @@
       width: 80,
       render: (_row, index) => (currentPage - 1) * query.pageSize + index + 1,
     },
-    { key: 'code', header: '가맹점코드', width: 140 },
+    { key: 'code', header: '가맹점코드', align: 'start', width: 140 },
     { key: 'name', header: '가맹점명', align: 'start', width: 240, emphasis: true },
     {
       key: 'categoryCode',
Add a comment
List