# 디자인 시스템 표준화 가이드 ## 목적 SAM MES 시스템의 모든 페이지가 일관된 디자인을 유지하도록 표준화합니다. --- ## 1. 필수 컴포넌트 사용 ### 1.1 PageLayout **모든 페이지는 반드시 PageLayout으로 감싸야 합니다.** ```tsx import { PageLayout } from "./organisms/PageLayout"; export function YourPage() { return ( {/* 페이지 내용 */} ); } ``` **maxWidth 옵션:** - `full`: 대시보드, 목록 페이지 (기본값) - `2xl`: 넓은 폼 페이지 - `xl`: 일반 폼 페이지 - `lg`: 좁은 폼 페이지 ### 1.2 PageHeader **모든 페이지는 반드시 PageHeader를 사용해야 합니다.** ```tsx import { PageHeader } from "./organisms/PageHeader"; import { Package } from "lucide-react"; import { Button } from "./ui/button"; } /> ``` **금지 사항:** ```tsx // ❌ 직접 헤더 작성 금지

제목

// ✅ PageHeader 사용 등록} /> ``` --- ## 2. 표준 페이지 구조 ### 2.1 기본 목록 페이지 구조 ```tsx import { PageLayout } from "./organisms/PageLayout"; import { PageHeader } from "./organisms/PageHeader"; import { StatCards } from "./organisms/StatCards"; import { SearchFilter } from "./organisms/SearchFilter"; import { DataTable } from "./organisms/DataTable"; export function ListPage() { return ( {/* 1. 헤더 (제목 + 서브제목 + 아이콘 + 액션 버튼) */} 등록} /> {/* 2. 통계 카드 (4개) */} {/* 3. 검색/필터 */} {/* 4. 콘텐츠 (테이블) */} ); } ``` ### 2.2 대시보드 페이지 구조 ```tsx export function DashboardPage() { return ( {/* 차트 및 위젯 */}
); } ``` ### 2.3 폼 페이지 구조 ```tsx export function FormPage() { return ( } /> {/* 폼 필드들 */} {/* 폼 필드들 */} ); } ``` --- ## 3. 스타일 가이드 ### 3.1 금지된 패턴 ```tsx // ❌ 직접 패딩/여백 정의 금지
// ❌ 배경 그라데이션 금지 (특별한 경우 제외)
// ❌ 불필요한 min-h-screen 금지
// ❌ 인라인 헤더 스타일 금지

// ❌ 커스텀 카드 스타일 금지
``` ### 3.2 권장 패턴 ```tsx // ✅ PageLayout 사용 // ✅ PageHeader 사용 // ✅ Card 컴포넌트 사용 import { Card, CardHeader, CardTitle, CardContent } from "./ui/card"; 제목 {/* 내용 */} // ✅ 그리드 레이아웃
``` --- ## 4. 타이포그래피 표준 ### 4.1 절대 사용하지 말 것 **globals.css에 타이포그래피가 정의되어 있으므로 Tailwind 클래스를 사용하지 마세요.** ```tsx // ❌ 절대 금지! className="text-2xl" className="text-xl" className="text-lg" className="font-bold" className="font-semibold" className="leading-tight" ``` ### 4.2 올바른 사용법 ```tsx // ✅ HTML 태그 사용 (자동 스타일 적용)

대제목

중제목

소제목

본문

``` **예외:** 사용자 요청이 있을 때만 타이포그래피 클래스 사용 --- ## 5. 색상 시스템 ### 5.1 디자인 토큰 사용 ```tsx // ✅ CSS 변수 사용 className="bg-primary text-primary-foreground" className="bg-secondary text-secondary-foreground" className="bg-muted text-muted-foreground" className="bg-destructive text-destructive-foreground" className="border-border" className="bg-background text-foreground" className="bg-card text-card-foreground" ``` ### 5.2 아이콘 배경 색상 ```tsx // ✅ 표준 아이콘 배경
// ✅ 다른 색상 옵션 bg-blue-100 text-blue-600 bg-green-100 text-green-600 bg-yellow-100 text-yellow-600 bg-purple-100 text-purple-600 bg-orange-100 text-orange-600 bg-red-100 text-red-600 ``` --- ## 6. 반응형 디자인 ### 6.1 브레이크포인트 ```tsx // 모바일 우선 className="grid-cols-1" // < 768px className="md:grid-cols-2" // 768px ~ 1023px (태블릿) className="lg:grid-cols-4" // 1024px+ (데스크톱) ``` ### 6.2 통계 카드 레이아웃 ```tsx // ✅ 표준 반응형 그리드
``` ### 6.3 폼 레이아웃 ```tsx // ✅ 반응형 폼
``` --- ## 7. 컴포넌트 사용 우선순위 ### 7.1 Organisms (가장 높은 우선순위) 1. **PageLayout** - 모든 페이지 필수 2. **PageHeader** - 모든 페이지 필수 3. **StatCards** - 통계 카드가 있는 페이지 4. **SearchFilter** - 검색/필터가 있는 페이지 5. **DataTable** - 테이블이 있는 페이지 6. **FormSection** - 폼이 있는 페이지 7. **EmptyState** - 데이터가 없을 때 ### 7.2 Molecules 1. **StatCard** - 개별 통계 카드 2. **FormField** - 개별 폼 필드 3. **SearchBar** - 검색 입력 4. **StatusBadge** - 상태 표시 5. **TableActions** - 테이블 액션 버튼 ### 7.3 ShadCN UI Components 1. **Card** - 카드 레이아웃 2. **Button** - 버튼 3. **Input** - 입력 필드 4. **Select** - 드롭다운 5. **Dialog** - 다이얼로그 6. **Table** - 테이블 (DataTable 내부에서 사용) --- ## 8. 페이지별 체크리스트 ### ✅ 목록 페이지 체크리스트 - [ ] PageLayout으로 감싸져 있는가? - [ ] PageHeader를 사용하고 있는가? - [ ] 아이콘이 PageHeader에 전달되었는가? - [ ] 통계 카드가 4개인가? - [ ] StatCards 컴포넌트를 사용하는가? - [ ] SearchFilter 컴포넌트를 사용하는가? - [ ] DataTable 컴포넌트를 사용하는가? - [ ] 데이터가 없을 때 EmptyState를 보여주는가? - [ ] 반응형 레이아웃인가? (grid-cols-1 md:grid-cols-2 lg:grid-cols-4) ### ✅ 대시보드 페이지 체크리스트 - [ ] PageLayout으로 감싸져 있는가? - [ ] PageHeader를 사용하고 있는가? - [ ] StatCards를 사용하는가? - [ ] 위젯이 반응형 그리드로 배치되어 있는가? - [ ] 타이포그래피 클래스를 사용하지 않았는가? ### ✅ 폼 페이지 체크리스트 - [ ] PageLayout (maxWidth="xl")으로 감싸져 있는가? - [ ] PageHeader를 사용하고 있는가? - [ ] 액션 버튼이 PageHeader에 전달되었는가? - [ ] FormSection으로 섹션을 구분했는가? - [ ] FormField를 사용하는가? - [ ] 반응형 폼 레이아웃인가? --- ## 9. 마이그레이션 예시 ### Before (❌) ```tsx export function OldPage() { return (

페이지 제목

설명

통계 1

100

{/* ... */}
{/* ... */}
); } ``` ### After (✅) ```tsx import { PageLayout } from "./organisms/PageLayout"; import { PageHeader } from "./organisms/PageHeader"; import { StatCards } from "./organisms/StatCards"; import { SearchFilter } from "./organisms/SearchFilter"; import { DataTable } from "./organisms/DataTable"; import { Package } from "lucide-react"; export function NewPage() { return ( 등록} /> ); } ``` --- ## 10. 자주 발생하는 실수 ### ❌ 실수 1: 직접 헤더 작성 ```tsx

제목

``` ### ✅ 해결 ```tsx 등록} /> ``` --- ### ❌ 실수 2: 커스텀 카드 스타일 ```tsx

제목

내용

``` ### ✅ 해결 ```tsx 제목

내용

``` --- ### ❌ 실수 3: 타이포그래피 클래스 사용 ```tsx

제목

``` ### ✅ 해결 ```tsx

제목

{/* globals.css에 정의된 스타일 자동 적용 */} ``` --- ## 11. 개발 워크플로우 ### 새 페이지 생성 시 1. ✅ PageLayout으로 시작 2. ✅ PageHeader 추가 3. ✅ 필요한 Organisms 컴포넌트 추가 (StatCards, SearchFilter, DataTable 등) 4. ✅ ShadCN UI 컴포넌트로 나머지 구현 5. ✅ 타이포그래피 클래스 사용하지 않기 6. ✅ 반응형 확인 (모바일, 태블릿, 데스크톱) 7. ✅ 다크모드 확인 ### 기존 페이지 수정 시 1. ✅ 현재 PageLayout 사용 여부 확인 2. ✅ PageHeader 사용 여부 확인 3. ✅ 커스텀 스타일 제거 4. ✅ Organisms 컴포넌트로 교체 5. ✅ 타이포그래피 클래스 제거 --- ## 12. 참고 자료 - **디자인 토큰**: `/styles/globals.css` - **공통 컴포넌트**: `/components/organisms/`, `/components/molecules/` - **ShadCN UI**: `/components/ui/` - **디자인 시스템 관리**: "기준정보 > 디자인시스템" 메뉴 --- ## 요약 ### 핵심 원칙 3가지 1. **PageLayout + PageHeader는 필수** 2. **타이포그래피 클래스 사용 금지** 3. **Organisms 컴포넌트 최대한 활용** 이 가이드를 따르면 모든 페이지가 일관된 디자인을 유지할 수 있습니다.