# WACE PLM — Modal Design System
> 이 파일은 Claude Code(`CLAUDE.md`)와 Cursor(`.cursor/rules/modal-design.mdc`)에서 자동 참조됩니다.
> **모달 패턴만** 정의합니다. Designer 페이지 레이아웃은 변경하지 않습니다.
---
## 1. 모달 Shell 구조
```tsx
```
### 사이즈 변형
| 용도 | className |
|------|-----------|
| 기본 (512px) | `max-w-lg` |
| 중간 (672px) | `max-w-2xl` |
| 넓음 (800px) | `max-w-[800px]` |
| 최대 (1024px) | `max-w-5xl` |
---
## 2. 탭 패턴 (모달 내부)
```tsx
{tabs.map(tab => (
))}
```
- shadcn `` 컴포넌트 **사용 금지** — 위 커스텀 버튼 패턴 사용
- 활성 탭: `bg-blue-50 text-blue-700 shadow-sm`
- 비활성 탭: `bg-transparent text-foreground`
---
## 3. 섹션 패턴
### 정보 섹션 (강조, Teal)
```tsx
{/* 데이터 소스, 정보 입력 등 주요 섹션 */}
```
### 일반 섹션 (흰색)
```tsx
{/* 설정, 목록 등 */}
```
---
## 4. 폼 필드 패턴
```tsx
{/* Label + Input */}
{/* Label + Select */}
{/* 읽기 전용 Input */}
```
- 필드 간격: `space-y-3`
- Label: `text-xs font-medium`
- Input/Select 높이: `h-9`
---
## 5. 버튼 규칙 (모달 내)
| 위치 | variant | 용도 |
|------|---------|------|
| Footer 취소 | `outline` | 닫기, 취소 |
| Footer 저장 | `className="bg-blue-600 hover:bg-blue-700"` | 저장, 확인 |
| Footer 삭제 | `variant="destructive"` | 삭제 확인 |
| 콘텐츠 내 추가 | `variant="outline" size="sm" className="w-full gap-2"` | 행/항목 추가 |
| 콘텐츠 내 아이콘 | `variant="ghost" size="sm"` | 인라인 액션 |
| 삭제 아이콘 | `variant="ghost" size="sm" className="text-destructive hover:text-destructive hover:bg-destructive/10"` | 인라인 삭제 |
---
## 6. 오버레이 & 애니메이션
- 오버레이: `rgba(0, 0, 0, 0.6)` — globals.css에 이미 전역 설정됨
- 모달 열기: `fade-in 200ms + zoom-in-95` (shadcn 기본)
- 모달 닫기: `fade-out 150ms + zoom-out-95` (shadcn 기본)
- 탭 전환: 애니메이션 없음 (즉시)
---
## 7. 아이콘 규칙 (모달 내)
| 위치 | 크기 | 색상 |
|------|------|------|
| 헤더 타이틀 아이콘 | `w-4 h-4` (16px) | `text-blue-600` |
| 탭 내부 아이콘 | `w-3.5 h-3.5` (14px) | 탭 상태에 따라 자동 |
| 닫기 버튼 X | `w-4 h-4` (16px) | 기본 foreground |
| 콘텐츠 내 액션 아이콘 | `w-3 h-3` (12px) | `text-muted-foreground` |
| 행 추가 버튼 아이콘 | `w-3.5 h-3.5` (14px) | 기본 |
---
## 8. 접근성 필수 사항
```tsx
{/* DialogContent 내부 반드시 포함 */}
{모달 목적 설명}
{상세 설명}
```
- Escape 키로 닫기: shadcn Dialog 기본 제공
- 포커스 트랩: shadcn Dialog 기본 제공
- 닫기 버튼에 `aria-label` 불필요 (shadcn 처리)