+```
+
+### 사이즈
+
+| Size | max-width |
+|------|-----------|
+| `sm` | `max-w-sm` (384px) |
+| `md` | `max-w-md` (448px) |
+| `lg` | `max-w-lg` (512px) |
+| `xl` | `max-w-xl` (576px) |
+
+### 접근성
+
+- `role="dialog"`, `aria-modal="true"`, `aria-labelledby` 필수
+- 열릴 때 첫 번째 포커스 가능 요소로 포커스 이동
+- Escape 키로 닫기
+- Backdrop 클릭 시 닫기 (선택적)
+- 열린 동안 body 스크롤 잠금
+
+---
+
+## Toast
+
+### 위치
+
+`fixed bottom-4 right-4 z-[60]` (Modal보다 위)
+
+### 변형
+
+| Variant | 아이콘 | 색상 |
+|---------|--------|------|
+| `success` | CheckCircle | `--color-success` |
+| `warning` | AlertTriangle | `--color-warning` |
+| `error` | XCircle | `--color-danger` |
+| `info` | Info | `--color-info` |
+
+### 구조
+
+```html
+
+
+
+
+
+```
+
+### 동작
+
+- 기본 자동 닫힘: 4000ms
+- 진입: `translate-y-2 opacity-0` → `translate-y-0 opacity-100`
+- 퇴장: `translate-y-0 opacity-100` → `translate-y-2 opacity-0`
+- 트랜지션: `duration-200 ease-out`
diff --git a/docs/design/do-dont.md b/docs/design/do-dont.md
new file mode 100644
index 0000000..5a54466
--- /dev/null
+++ b/docs/design/do-dont.md
@@ -0,0 +1,212 @@
+# Do & Don't
+
+디자인 시스템 적용 시 자주 발생하는 실수와 올바른 방법.
+
+---
+
+## CSS 변수 토큰
+
+### 색상
+
+**DO** — CSS 변수 토큰 사용
+
+```tsx
+
+```
+
+**DON'T** — HEX 하드코딩
+
+```tsx
+// 다크 모드 전환 불가, 토큰 변경 시 전부 수정 필요
+
+```
+
+**DON'T** — Tailwind 기본 팔레트로 브랜드 컬러 표현
+
+```tsx
+// 브랜드 컬러(#6D94C5)와 blue-500(#3B82F6)은 다른 색상
+
+```
+
+---
+
+## 시멘틱 컬러
+
+**DO** — 의미에 맞는 시멘틱 컬러 사용
+
+```tsx
+// 성공 상태
+완료
+
+// 오류 메시지
+
{errorMessage}
+
+// 경고 알림
+
+```
+
+**DON'T** — 브랜드 컬러를 시멘틱 용도로 사용
+
+```tsx
+// Primary 컬러는 성공/오류를 표현하지 않음
+
저장에 실패했습니다
+```
+
+**DON'T** — 시멘틱 컬러를 장식 목적으로 사용
+
+```tsx
+// danger 컬러는 위험/오류 상황 전용
+인기
+```
+
+---
+
+## Spacing 스케일
+
+**DO** — 4px 단위 스케일 사용
+
+```tsx
+ // 16px / 8px / 24px
+ // 12px / 6px (sm 버튼)
+```
+
+**DON'T** — 임의의 px 값
+
+```tsx
+
+```
+
+**DON'T** — 인라인 스타일로 여백 지정
+
+```tsx
+
+```
+
+---
+
+## cn() 유틸리티
+
+**DO** — 조건부 클래스에 `cn()` 사용
+
+```tsx
+
+```
+
+**DON'T** — 템플릿 리터럴로 조건부 클래스 조합
+
+```tsx
+// Tailwind 클래스 충돌 가능, purge 미적용 위험
+
+```
+
+**DON'T** — 동적 클래스 문자열 조합
+
+```tsx
+// Tailwind는 전체 클래스 문자열을 스캔 — 동적 조합 시 purge에서 제거될 수 있음
+const color = 'primary';
+ // 위험
+```
+
+**DO** — 객체 맵 사용
+
+```tsx
+const colorMap = {
+ primary: 'text-[var(--color-primary)]',
+ danger: 'text-[var(--color-danger)]',
+} as const;
+
+
+```
+
+---
+
+## 컴포넌트 Props
+
+**DO** — className prop 허용 + cn() 병합
+
+```tsx
+const Card = ({ className, children }: CardProps) => (
+
+);
+```
+
+---
+
+## 다크 모드
+
+**DO** — CSS 변수 토큰 사용으로 자동 전환
+
+```tsx
+// --color-bg-surface는 Light: #FFF, Dark: #1E2023으로 자동 전환
+
+```
+
+**DON'T** — `dark:` 클래스로 각각 지정 (토큰이 있는 색상에)
+
+```tsx
+// 중복 관리 부담, 토큰과 불일치 가능
+
+```
+
+단, CSS 변수 토큰이 없는 케이스(투명도, 그라디언트 등)에는 `dark:` 사용 허용.
+
+---
+
+## 타이포그래피
+
+**DO** — 타입 스케일 클래스 사용
+
+```tsx
+
페이지 제목
+
설명 텍스트
+```
+
+**DON'T** — 임의 폰트 크기
+
+```tsx
+
페이지 제목
+```
+
+---
+
+## 아이콘
+
+**DO** — Lucide React + 색상 토큰
+
+```tsx
+import { ChevronRight } from 'lucide-react';
+
+
+```
+
+**DON'T** — 다른 라이브러리 혼용
+
+```tsx
+// Font Awesome, Material Icons 등 혼용 금지
+import { FaChevronRight } from 'react-icons/fa';
+```
+
+**DON'T** — 아이콘에 color prop으로 HEX 지정
+
+```tsx
+ // CSS 변수 토큰을 사용할 수 없음
+```
diff --git a/docs/design/icons.md b/docs/design/icons.md
new file mode 100644
index 0000000..e4af0a6
--- /dev/null
+++ b/docs/design/icons.md
@@ -0,0 +1,150 @@
+# 아이콘
+
+---
+
+## 라이브러리
+
+**Lucide React** 사용. 일관된 선 굵기(strokeWidth=1.5)와 스타일로 전체 UI의 시각적 통일성을 유지한다.
+
+```bash
+npm install lucide-react
+```
+
+```tsx
+import { ChevronRight, Search, Bell } from 'lucide-react';
+```
+
+---
+
+## 사이즈
+
+| 이름 | px | Tailwind 클래스 | 용도 |
+|------|----|----------------|------|
+| xs | 12px | `size-3` | 배지 내부, 인라인 보조 |
+| sm | 16px | `size-4` | 버튼 내부, 레이블 |
+| md | 20px | `size-5` | 기본 UI 아이콘 |
+| lg | 24px | `size-6` | 네비게이션, 강조 |
+| xl | 32px | `size-8` | 상태 표시, 빈 상태 일러스트 |
+
+기본값은 `md` (20px). 별도 지정이 없으면 `size-5` 사용.
+
+---
+
+## strokeWidth
+
+| 컨텍스트 | strokeWidth |
+|----------|-------------|
+| 기본 UI | 1.5 (Lucide 기본값) |
+| 굵은 강조 | 2 |
+| 가는 장식 | 1 |
+
+기본값 그대로 사용. 의도적인 경우에만 override.
+
+---
+
+## 색상 규칙
+
+아이콘에 직접 color HEX를 지정하지 않는다. 부모 텍스트 색상을 상속하거나 CSS 변수를 사용한다.
+
+| 상황 | 클래스 |
+|------|--------|
+| 본문과 함께 | `text-[var(--color-text-primary)]` 상속 |
+| 보조 아이콘 | `text-[var(--color-text-secondary)]` |
+| 비활성 | `text-[var(--color-text-tertiary)]` |
+| 강조 (Primary) | `text-[var(--color-primary)]` |
+| 성공 | `text-[var(--color-success)]` |
+| 경고 | `text-[var(--color-warning)]` |
+| 오류 | `text-[var(--color-danger)]` |
+| 정보 | `text-[var(--color-info)]` |
+
+---
+
+## 사용 패턴
+
+### 버튼 내 아이콘
+
+```tsx
+
+```
+
+### 텍스트와 인라인 정렬
+
+```tsx
+
+
+ 2시간 전
+
+```
+
+### 아이콘 전용 버튼
+
+```tsx
+
+```
+
+### 상태 아이콘
+
+```tsx
+
+
+
+
+```
+
+---
+
+## 접근성
+
+- 장식용 아이콘: `aria-hidden="true"` 필수
+- 의미 있는 아이콘: `aria-label` 또는 시각적으로 숨긴 텍스트 제공
+
+```tsx
+// 장식용
+
+
+// 의미 있는 아이콘 버튼
+
+```
+
+---
+
+## 자주 쓰는 아이콘 목록
+
+| 용도 | 아이콘 |
+|------|--------|
+| 검색 | `Search` |
+| 알림 | `Bell` |
+| 설정 | `Settings` |
+| 사용자 | `User`, `Users` |
+| 메뉴 | `Menu`, `MoreVertical`, `MoreHorizontal` |
+| 닫기 | `X` |
+| 확인 | `Check`, `CheckCircle` |
+| 오류 | `XCircle`, `AlertCircle` |
+| 경고 | `AlertTriangle` |
+| 정보 | `Info` |
+| 편집 | `Pencil`, `Edit2` |
+| 삭제 | `Trash2` |
+| 추가 | `Plus`, `PlusCircle` |
+| 이동 | `ChevronRight`, `ChevronDown`, `ArrowRight` |
+| 새로고침 | `RefreshCw` |
+| 다운로드 | `Download` |
+| 업로드 | `Upload` |
+| 링크 | `ExternalLink` |
+| 복사 | `Copy` |
+| 필터 | `Filter`, `SlidersHorizontal` |
+| 정렬 | `ArrowUpDown` |
+| 로그 | `FileText`, `ClipboardList` |
+| 차트 | `BarChart2`, `LineChart`, `PieChart` |
+| 서버 | `Server`, `Database` |
+| API | `Zap`, `Code2` |
+| 시간 | `Clock`, `Calendar` |
diff --git a/docs/design/motion.md b/docs/design/motion.md
new file mode 100644
index 0000000..a81180f
--- /dev/null
+++ b/docs/design/motion.md
@@ -0,0 +1,152 @@
+# 모션 & 애니메이션
+
+---
+
+## 원칙
+
+- 모션은 UI의 상태 변화를 명확히 전달하기 위한 수단이다.
+- 불필요한 애니메이션은 사용하지 않는다.
+- 모든 모션은 `prefers-reduced-motion` 미디어 쿼리를 존중한다.
+
+---
+
+## Duration (지속 시간)
+
+| 이름 | 값 | Tailwind | 용도 |
+|------|----|----------|------|
+| instant | 0ms | — | 즉각 반응 (포커스, 선택) |
+| fast | 100ms | `duration-100` | 버튼 hover, 색상 전환 |
+| normal | 200ms | `duration-200` | 패널 열기, 드롭다운 |
+| slow | 300ms | `duration-300` | 모달, 사이드바 슬라이드 |
+| slower | 500ms | `duration-500` | 페이지 전환, 스켈레톤 |
+
+기본값: `duration-200`. 특별한 이유 없이 300ms를 초과하지 않는다.
+
+---
+
+## Easing (가속도 곡선)
+
+| 이름 | 값 | Tailwind | 용도 |
+|------|----|----------|------|
+| ease-out | `cubic-bezier(0, 0, 0.2, 1)` | `ease-out` | 진입 애니메이션 (요소 나타남) |
+| ease-in | `cubic-bezier(0.4, 0, 1, 1)` | `ease-in` | 퇴장 애니메이션 (요소 사라짐) |
+| ease-in-out | `cubic-bezier(0.4, 0, 0.2, 1)` | `ease-in-out` | 상태 전환 (toggle, expand) |
+| spring | `cubic-bezier(0.34, 1.56, 0.64, 1)` | — | 강조 효과 (알림, 배지) |
+
+기본 조합: 진입 `ease-out`, 퇴장 `ease-in`.
+
+---
+
+## 패턴
+
+### Hover / Active
+
+버튼, 카드, 링크 등 상호작용 요소.
+
+```css
+transition-colors duration-100 ease-out
+```
+
+포인터 커서 피드백:
+```css
+active:scale-[0.98] transition-transform duration-75
+```
+
+### 진입 (Fade + Slide)
+
+모달, 드롭다운, Toast 등 요소가 나타날 때.
+
+```css
+/* 아래에서 위로 */
+translate-y-2 opacity-0 → translate-y-0 opacity-100
+transition-[transform,opacity] duration-200 ease-out
+
+/* 위에서 아래로 (드롭다운) */
+-translate-y-2 opacity-0 → translate-y-0 opacity-100
+transition-[transform,opacity] duration-200 ease-out
+```
+
+### 퇴장 (Fade + Slide)
+
+```css
+translate-y-0 opacity-100 → translate-y-2 opacity-0
+transition-[transform,opacity] duration-150 ease-in
+```
+
+### 사이드바 / 패널 슬라이드
+
+```css
+-translate-x-full → translate-x-0
+transition-transform duration-300 ease-out
+```
+
+### 모달 배경 (Backdrop)
+
+```css
+opacity-0 → opacity-100
+transition-opacity duration-200 ease-out
+```
+
+### 스켈레톤 로딩
+
+```css
+animate-pulse
+```
+
+### 회전 (로딩 스피너)
+
+```css
+animate-spin
+```
+
+### 토글 (Accordion, Expand)
+
+높이 애니메이션은 `max-height` 트릭을 사용한다.
+
+```css
+max-h-0 overflow-hidden → max-h-screen
+transition-[max-height] duration-300 ease-in-out
+```
+
+---
+
+## prefers-reduced-motion
+
+모든 모션은 사용자의 시스템 설정을 존중해야 한다.
+
+### Tailwind 설정
+
+```html
+
+
+```
+
+### CSS 전역 설정 (권장)
+
+```css
+@media (prefers-reduced-motion: reduce) {
+ *, *::before, *::after {
+ animation-duration: 0.01ms !important;
+ animation-iteration-count: 1 !important;
+ transition-duration: 0.01ms !important;
+ scroll-behavior: auto !important;
+ }
+}
+```
+
+### React Hook
+
+```tsx
+const prefersReducedMotion = window.matchMedia('(prefers-reduced-motion: reduce)').matches;
+
+const duration = prefersReducedMotion ? 0 : 200;
+```
+
+---
+
+## 금지 사항
+
+- 3초 이상의 루프 애니메이션 (사용자 주의 분산)
+- 화면 전체를 덮는 플래시/깜박임 효과
+- 스크롤에 연동된 복잡한 패럴랙스
+- `animation-duration: 0` 직접 설정 (prefers-reduced-motion 우회 금지)
diff --git a/docs/design/prompts/new-component.md b/docs/design/prompts/new-component.md
new file mode 100644
index 0000000..53f09c8
--- /dev/null
+++ b/docs/design/prompts/new-component.md
@@ -0,0 +1,115 @@
+# 새 컴포넌트 생성 프롬프트 템플릿
+
+아래 템플릿을 복사하여 Claude에게 컴포넌트 생성을 요청할 때 사용한다.
+
+---
+
+## 기본 템플릿
+
+```
+[파일] frontend/src/components/{경로}/{ComponentName}.tsx
+
+[계약]
+interface {ComponentName}Props {
+ // Props 정의
+ className?: string;
+}
+
+[제약]
+- docs/design/code-conventions.md 의 규칙 준수
+- CSS 변수 토큰 사용 (HEX 하드코딩 금지)
+- cn() 유틸리티 사용 (src/utils/cn.ts)
+- Lucide React 아이콘만 사용
+- any 타입 금지, strict 모드
+- forwardRef 적용 (DOM 접근 필요한 경우)
+- prefers-reduced-motion 고려
+```
+
+---
+
+## 실제 사용 예시
+
+### 버튼 컴포넌트
+
+```
+[파일] frontend/src/components/ui/Button.tsx
+
+[계약]
+interface ButtonProps extends React.ButtonHTMLAttributes {
+ variant?: 'primary' | 'secondary' | 'accent' | 'outline' | 'ghost' | 'danger';
+ size?: 'sm' | 'md' | 'lg';
+ loading?: boolean;
+ leftIcon?: React.ReactNode;
+ rightIcon?: React.ReactNode;
+ className?: string;
+}
+
+[참조] docs/design/components.md (Button 섹션)
+
+[제약]
+- CSS 변수 토큰 사용
+- cn() 사용
+- forwardRef 적용
+- disabled + loading 상태 처리
+- focus-visible ring 적용
+```
+
+### 데이터 테이블 컴포넌트
+
+```
+[파일] frontend/src/components/ui/DataTable.tsx
+
+[계약]
+interface Column {
+ key: keyof T;
+ header: string;
+ width?: string;
+ render?: (value: T[keyof T], row: T) => React.ReactNode;
+}
+
+interface DataTableProps {
+ columns: Column[];
+ data: T[];
+ loading?: boolean;
+ emptyMessage?: string;
+ className?: string;
+}
+
+[제약]
+- CSS 변수 토큰 사용
+- 로딩 시 스켈레톤 표시
+- 빈 상태 메시지 표시
+- 반응형 (모바일에서 가로 스크롤)
+```
+
+### 상태 Badge
+
+```
+[파일] frontend/src/components/ui/StatusBadge.tsx
+
+[계약]
+type StatusType = 'success' | 'warning' | 'danger' | 'info' | 'default';
+
+interface StatusBadgeProps {
+ status: StatusType;
+ label: string;
+ dot?: boolean;
+ className?: string;
+}
+
+[참조] docs/design/components.md (Badge 섹션)
+
+[제약]
+- 시멘틱 컬러 사용 (--color-success 등)
+- dot prop이 true이면 상태 점 표시
+```
+
+---
+
+## 체크리스트 (컴포넌트 생성 전)
+
+- [ ] 기존 컴포넌트로 해결 가능한지 확인 (`src/components/` 탐색)
+- [ ] Props 인터페이스 설계 완료
+- [ ] 담당 디자인 문서 섹션 참조 (`docs/design/components.md`)
+- [ ] 파일 경로 결정 (`ui/` vs 도메인 폴더)
+- [ ] 접근성 요구사항 파악 (aria, focus, keyboard)
diff --git a/docs/design/prompts/refactor-style.md b/docs/design/prompts/refactor-style.md
new file mode 100644
index 0000000..1d0543a
--- /dev/null
+++ b/docs/design/prompts/refactor-style.md
@@ -0,0 +1,124 @@
+# 스타일 리팩토링 프롬프트 템플릿
+
+기존 컴포넌트의 스타일을 디자인 시스템에 맞게 리팩토링할 때 사용한다.
+
+---
+
+## 기본 템플릿
+
+```
+[파일] frontend/src/components/{경로}/{ComponentName}.tsx (또는 pages/...)
+
+[계약]
+- 기존 Props 인터페이스 유지 (변경 금지)
+- 기존 비즈니스 로직 유지 (변경 금지)
+- className prop 추가 허용
+
+[참조]
+- docs/design/colors.md
+- docs/design/components.md
+- docs/design/code-conventions.md
+
+[제약]
+- 하드코딩 색상(HEX, Tailwind 기본 팔레트)을 CSS 변수 토큰으로 교체
+- 임의 px 여백을 4px 스케일 Tailwind 클래스로 교체
+- cn() 유틸리티 도입 (src/utils/cn.ts)
+- Lucide React 외 아이콘 라이브러리 제거
+- any 타입 금지
+- console.log 제거
+```
+
+---
+
+## 실제 사용 예시
+
+### 색상 토큰 교체
+
+```
+[파일] frontend/src/pages/apihub/ApiHubServicePage.tsx
+
+[계약]
+- 기존 Props 및 로직 유지
+- API 호출 로직 변경 금지
+
+[참조] docs/design/colors.md
+
+[제약]
+- bg-white → bg-[var(--color-bg-surface)]
+- bg-gray-50 → bg-[var(--color-bg-base)]
+- text-gray-900 → text-[var(--color-text-primary)]
+- text-gray-600 → text-[var(--color-text-secondary)]
+- text-gray-400 → text-[var(--color-text-tertiary)]
+- border-gray-200 → border-[var(--color-border)]
+- border-gray-400 → border-[var(--color-border-strong)]
+- bg-blue-600 → bg-[var(--color-primary)]
+- text-blue-600 → text-[var(--color-primary)]
+- text-green-* → text-[var(--color-success)]
+- text-red-* → text-[var(--color-danger)]
+- text-yellow-* → text-[var(--color-warning)]
+```
+
+### cn() 도입
+
+```
+[파일] frontend/src/components/SomeComponent.tsx
+
+[계약]
+- 기존 Props 유지
+
+[제약]
+- 조건부 className 처리를 cn() 유틸리티로 통일
+- className prop 노출 추가
+- 클래스 충돌 제거
+```
+
+### 컴포넌트 분리 없는 스타일 정리
+
+```
+[파일] frontend/src/layouts/ApiHubLayout.tsx
+
+[계약]
+- 레이아웃 구조 유지
+- 자식 컴포넌트 렌더링 방식 유지
+
+[참조]
+- docs/design/spacing.md
+- docs/design/typography.md
+
+[제약]
+- 임의 px 여백 제거
+- 타입 스케일 적용
+- CSS 변수 토큰 적용
+- 기존 기능/라우팅 변경 금지
+```
+
+---
+
+## 리팩토링 전 확인 사항
+
+- [ ] 기존 컴포넌트가 어떤 역할을 하는지 파악했다
+- [ ] 변경하면 안 되는 Props/로직 범위를 파악했다
+- [ ] 영향받는 다른 컴포넌트가 없는지 확인했다
+- [ ] 적용할 CSS 변수 토큰 매핑을 준비했다
+
+---
+
+## 색상 매핑 빠른 참조
+
+| 기존 Tailwind | 대체 토큰 |
+|---------------|-----------|
+| `bg-white` | `bg-[var(--color-bg-surface)]` |
+| `bg-gray-50` | `bg-[var(--color-bg-base)]` |
+| `bg-gray-100` | `bg-[var(--color-bg-elevated)]` |
+| `text-gray-900` | `text-[var(--color-text-primary)]` |
+| `text-gray-600` | `text-[var(--color-text-secondary)]` |
+| `text-gray-400` | `text-[var(--color-text-tertiary)]` |
+| `border-gray-200` | `border-[var(--color-border)]` |
+| `border-gray-400` | `border-[var(--color-border-strong)]` |
+| `bg-blue-500`, `bg-blue-600` | `bg-[var(--color-primary)]` |
+| `text-blue-600` | `text-[var(--color-primary)]` |
+| `hover:bg-blue-700` | `hover:bg-[var(--color-primary-hover)]` |
+| `bg-green-*` / `text-green-*` | `bg/text-[var(--color-success)]` |
+| `bg-red-*` / `text-red-*` | `bg/text-[var(--color-danger)]` |
+| `bg-yellow-*` / `text-yellow-*` | `bg/text-[var(--color-warning)]` |
+| `bg-sky-*` / `text-sky-*` | `bg/text-[var(--color-info)]` |
diff --git a/docs/design/prompts/review-checklist.md b/docs/design/prompts/review-checklist.md
new file mode 100644
index 0000000..3b72ee2
--- /dev/null
+++ b/docs/design/prompts/review-checklist.md
@@ -0,0 +1,97 @@
+# 디자인 리뷰 체크리스트
+
+컴포넌트 구현 완료 후, MR 생성 전에 아래 9개 카테고리를 점검한다.
+
+---
+
+## 1. 컬러 토큰
+
+- [ ] HEX 색상 코드가 직접 사용되지 않았다
+- [ ] Tailwind 기본 팔레트(gray-*, blue-* 등)를 브랜드 컬러 대용으로 사용하지 않았다
+- [ ] 모든 색상이 CSS 변수 토큰(`var(--color-*)`)을 통해 지정되었다
+- [ ] 시멘틱 컬러(success, warning, danger, info)가 의미에 맞게 사용되었다
+- [ ] 시멘틱 컬러를 장식 목적으로 사용하지 않았다
+
+## 2. 다크 모드
+
+- [ ] CSS 변수 토큰을 사용하므로 다크 모드가 자동으로 전환된다
+- [ ] 토큰이 없는 케이스(그라디언트, 특수 색상 등)에만 `dark:` 클래스를 사용했다
+- [ ] `dark:` 클래스가 CSS 변수 토큰과 충돌하지 않는다
+- [ ] 이미지, SVG 등 미디어가 다크 모드에서 적절히 표시된다
+
+## 3. 타이포그래피
+
+- [ ] 폰트 크기가 타입 스케일(`text-sm`, `text-base`, `text-lg` 등)을 사용한다
+- [ ] 임의의 px 폰트 크기(`text-[22px]` 등)를 사용하지 않았다
+- [ ] 텍스트 색상이 CSS 변수 토큰(`--color-text-primary` 등)을 사용한다
+- [ ] 한글 텍스트에 `word-break: keep-all`이 적용되었다 (본문, 설명)
+
+## 4. 스페이싱
+
+- [ ] 여백이 4px 단위 스케일(`p-2`, `p-4`, `gap-3` 등)을 사용한다
+- [ ] 임의의 px 여백(`p-[13px]`)을 사용하지 않았다
+- [ ] 인라인 스타일로 여백을 지정하지 않았다
+
+## 5. 컴포넌트 API
+
+- [ ] Props 인터페이스가 `interface {Name}Props`로 정의되었다
+- [ ] `className` prop이 허용되고 `cn()`으로 병합된다
+- [ ] `cn()` 유틸리티(`src/utils/cn.ts`)를 사용한다
+- [ ] DOM 접근이 필요한 경우 `forwardRef`가 적용되었다
+- [ ] `any` 타입이 사용되지 않았다
+
+## 6. 아이콘
+
+- [ ] Lucide React 아이콘만 사용했다 (다른 라이브러리 혼용 없음)
+- [ ] 아이콘 크기가 사이즈 스케일(`size-4`, `size-5`, `size-6` 등)을 사용한다
+- [ ] 아이콘 색상이 텍스트 색상 상속 또는 CSS 변수 토큰을 사용한다
+- [ ] 장식용 아이콘에 `aria-hidden="true"`가 적용되었다
+- [ ] 의미 있는 아이콘 버튼에 `aria-label`이 있다
+
+## 7. 접근성
+
+- [ ] 모든 인터랙티브 요소가 키보드로 접근 가능하다
+- [ ] `focus-visible` 스타일이 적용되었다
+- [ ] ARIA 속성이 올바르게 사용되었다 (`role`, `aria-label`, `aria-expanded` 등)
+- [ ] 색상만으로 정보를 전달하지 않는다 (아이콘, 텍스트 보조)
+- [ ] 이미지에 `alt` 텍스트가 있다
+
+## 8. 모션
+
+- [ ] 트랜지션 지속 시간이 200ms 이하이다 (특별한 경우 300ms)
+- [ ] 진입/퇴장 애니메이션에 올바른 easing이 적용되었다 (진입: `ease-out`, 퇴장: `ease-in`)
+- [ ] `motion-reduce:transition-none` 또는 `motion-reduce:duration-0`이 적용되었다
+- [ ] 불필요한 애니메이션이 없다
+
+## 9. 코드 품질
+
+- [ ] `console.log`가 없다
+- [ ] 사용하지 않는 import가 없다
+- [ ] 매직 넘버/문자열이 상수로 추출되었다
+- [ ] `tsc --noEmit` 통과
+- [ ] 컴포넌트에 `displayName`이 설정되었다 (forwardRef 사용 시)
+- [ ] Import 순서가 컨벤션을 따른다
+
+---
+
+## 리뷰 요청 템플릿
+
+MR 본문에 아래 내용을 포함한다.
+
+```markdown
+## 디자인 리뷰
+
+### 컬러 토큰
+- [ ] CSS 변수 토큰 사용
+- [ ] 다크 모드 자동 전환
+
+### 접근성
+- [ ] 키보드 접근성
+- [ ] ARIA 속성
+
+### 모션
+- [ ] prefers-reduced-motion 처리
+
+### 자체 검증
+- tsc --noEmit: 통과 / 실패
+```
diff --git a/docs/design/spacing.md b/docs/design/spacing.md
new file mode 100644
index 0000000..52905b6
--- /dev/null
+++ b/docs/design/spacing.md
@@ -0,0 +1,137 @@
+# 스페이싱 & 레이아웃
+
+---
+
+## 기본 스케일 (4px 기반)
+
+모든 여백과 크기는 4px 단위를 기준으로 한다.
+
+| Token | px | rem | Tailwind | 용도 |
+|-------|----|-----|----------|------|
+| space-0 | 0 | 0 | `p-0`, `m-0` | 초기화 |
+| space-1 | 4px | 0.25rem | `p-1`, `m-1` | 아이콘 내부 간격 |
+| space-2 | 8px | 0.5rem | `p-2`, `m-2` | 배지 내부 패딩 |
+| space-3 | 12px | 0.75rem | `p-3`, `m-3` | 버튼 수직 패딩 |
+| space-4 | 16px | 1rem | `p-4`, `m-4` | 카드 내부 패딩 (sm) |
+| space-5 | 20px | 1.25rem | `p-5`, `m-5` | 인풋 내부 패딩 |
+| space-6 | 24px | 1.5rem | `p-6`, `m-6` | 카드 내부 패딩 (md) |
+| space-8 | 32px | 2rem | `p-8`, `m-8` | 섹션 내부 패딩 |
+| space-10 | 40px | 2.5rem | `p-10`, `m-10` | 섹션 상하 여백 |
+| space-12 | 48px | 3rem | `p-12`, `m-12` | 페이지 상하 패딩 |
+| space-16 | 64px | 4rem | `p-16`, `m-16` | 섹션 간 여백 |
+| space-20 | 80px | 5rem | `p-20`, `m-20` | 페이지 섹션 간격 |
+| space-24 | 96px | 6rem | `p-24`, `m-24` | 히어로 여백 |
+
+---
+
+## 컴포넌트별 내부 여백
+
+### Button
+
+| 사이즈 | padding | font-size | height |
+|--------|---------|-----------|--------|
+| sm | `px-3 py-1.5` | `text-sm` | 32px |
+| md | `px-4 py-2` | `text-base` | 40px |
+| lg | `px-6 py-3` | `text-lg` | 48px |
+
+### Input
+
+| 사이즈 | padding | font-size | height |
+|--------|---------|-----------|--------|
+| sm | `px-3 py-1.5` | `text-sm` | 32px |
+| md | `px-3 py-2` | `text-base` | 40px |
+| lg | `px-4 py-3` | `text-lg` | 48px |
+
+### Card
+
+| 패딩 | 클래스 | 용도 |
+|------|--------|------|
+| compact | `p-4` | 데이터 테이블 행 |
+| default | `p-6` | 일반 카드 |
+| spacious | `p-8` | 주요 콘텐츠 카드 |
+
+### Badge
+
+패딩: `px-2 py-0.5` / 폰트: `text-xs font-medium`
+
+### Modal
+
+| 사이즈 | width | padding |
+|--------|-------|---------|
+| sm | `max-w-sm` | `p-6` |
+| md | `max-w-md` | `p-6` |
+| lg | `max-w-lg` | `p-8` |
+| xl | `max-w-xl` | `p-8` |
+
+---
+
+## 반응형 브레이크포인트
+
+Tailwind CSS 4 기본 브레이크포인트 사용.
+
+| 이름 | 최소 너비 | 용도 |
+|------|-----------|------|
+| xs | — | 기본 (모바일 우선) |
+| sm | 640px | 큰 모바일, 세로 태블릿 |
+| md | 768px | 태블릿 |
+| lg | 1024px | 데스크톱 |
+| xl | 1280px | 와이드 데스크톱 |
+| 2xl | 1536px | 울트라 와이드 |
+
+---
+
+## 12컬럼 그리드
+
+```html
+
+
+
+
+
+
+
+
+
+
+ ...
+
+
+
+```
+
+### 자주 쓰는 레이아웃 패턴
+
+| 패턴 | 클래스 |
+|------|--------|
+| 전체 너비 | `col-span-12` |
+| 절반 | `col-span-12 md:col-span-6` |
+| 1/3 | `col-span-12 md:col-span-4` |
+| 2/3 | `col-span-12 md:col-span-8` |
+| 사이드바 | `col-span-12 lg:col-span-3` |
+| 콘텐츠 | `col-span-12 lg:col-span-9` |
+
+---
+
+## Gap (간격)
+
+| 컨텍스트 | 클래스 |
+|----------|--------|
+| 인라인 아이템 (버튼 그룹) | `gap-2` |
+| 폼 필드 | `gap-4` |
+| 카드 그리드 | `gap-4 lg:gap-6` |
+| 섹션 간 | `gap-8 lg:gap-12` |
+
+---
+
+## 스택 레이아웃
+
+```html
+
+