diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..6f7a6bd --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +.playwright-mcp/ diff --git a/design/uiux/style-guide.md b/design/uiux/style-guide.md new file mode 100644 index 0000000..4bb958f --- /dev/null +++ b/design/uiux/style-guide.md @@ -0,0 +1,1184 @@ +# 회의록 작성 및 공유 개선 서비스 - 스타일 가이드 + +**버전**: 1.0 +**작성일**: 2025-10-15 +**작성자**: 유진 (Frontend Developer) +**레퍼런스**: 클로바노트 (Naver) + +--- + +## 목차 + +1. [브랜드 아이덴티티](#1-브랜드-아이덴티티) +2. [디자인 원칙](#2-디자인-원칙) +3. [컬러 시스템](#3-컬러-시스템) +4. [타이포그래피](#4-타이포그래피) +5. [간격 시스템](#5-간격-시스템) +6. [컴포넌트 스타일](#6-컴포넌트-스타일) +7. [반응형 브레이크포인트](#7-반응형-브레이크포인트) +8. [회의록 서비스 특화 컴포넌트](#8-회의록-서비스-특화-컴포넌트) +9. [인터랙션 패턴](#9-인터랙션-패턴) +10. [변경 이력](#10-변경-이력) + +--- + +## 1. 브랜드 아이덴티티 + +### 1.1 디자인 컨셉 + +**"Smart Collaboration"** - 스마트한 협업 도구 + +회의록 작성 및 공유 서비스는 AI 기반의 자동화와 실시간 협업을 통해 업무 효율을 극대화하는 스마트한 협업 플랫폼입니다. + +### 1.2 핵심 가치 + +| 가치 | 설명 | 디자인 반영 | +|------|------|------------| +| **정확성** | 누락 없이 정확하게 기록 | 명확한 시각적 위계, 검증 상태 표시 | +| **효율성** | AI 자동화로 작성 부담 감소 | AI 제안 영역, 자동 완성 패턴 | +| **협업** | 실시간 동기화 및 공유 | 협업 인디케이터, 커서 표시 | +| **접근성** | 업무 지식 없이도 사용 가능 | 전문용어 설명, 친근한 일러스트레이션 | + +### 1.3 브랜드 성격 + +- **전문적이면서도 친근한**: 업무용 도구이지만 사용하기 쉬운 +- **신뢰감 + 혁신성**: AI 기능의 정확성과 미래지향적 이미지 +- **협업 중심**: 개인이 아닌 팀의 성공을 지원 + +### 1.4 비주얼 무드 + +- **색상**: 밝고 활기찬 청록색 (혁신, 성장, 활력) +- **형태**: 둥근 모서리, 부드러운 곡선 (친근함, 접근성) +- **일러스트레이션**: 캐릭터 기반, 간결하고 현대적 (클로바노트 스타일 참조) + +--- + +## 2. 디자인 원칙 + +### 2.1 명확성 (Clarity) + +**사용자가 무엇을 해야 하는지 즉시 이해 가능해야 합니다.** + +- 명확한 시각적 위계 유지 +- 혼란스러운 요소 최소화 +- 액션 버튼의 목적을 분명히 표현 +- 에러 메시지는 문제와 해결 방법을 함께 제시 + +**예시**: +- ✅ "회의록을 저장하지 못했습니다. 네트워크 연결을 확인하고 다시 시도해주세요." +- ❌ "오류가 발생했습니다." + +### 2.2 효율성 (Efficiency) + +**최소한의 클릭으로 목표를 달성할 수 있어야 합니다.** + +- 자주 사용하는 기능은 빠른 접근 제공 (FAB, 단축키) +- 불필요한 단계 제거 +- 자동 완성 및 제안 기능 활용 +- 키보드 단축키 지원 + +**예시**: +- Ctrl+N: 새 회의 예약 +- Ctrl+S: 회의록 저장 +- Ctrl+F: 검색 + +### 2.3 일관성 (Consistency) + +**동일한 패턴과 예측 가능한 동작을 유지해야 합니다.** + +- 동일한 기능은 동일한 아이콘과 레이블 사용 +- 색상, 타이포그래피, 간격의 일관된 적용 +- 네비게이션 구조 일관성 유지 +- 브랜드 아이덴티티 유지 + +### 2.4 피드백 (Feedback) + +**모든 액션에 즉각적이고 명확한 피드백을 제공해야 합니다.** + +- 버튼 클릭 시 시각적 피드백 (호버, 액티브 상태) +- 로딩 상태 명확히 표시 (스켈레톤 UI, 스피너) +- 성공/실패 토스트 알림 +- 실시간 저장 상태 표시 ("저장됨", "저장 중...") + +### 2.5 접근성 (Accessibility) + +**모든 사용자가 서비스를 쉽게 이용할 수 있어야 합니다.** + +- WCAG 2.1 Level AA 준수 +- 키보드 네비게이션 지원 +- 스크린 리더 호환 +- 충분한 색상 대비 (4.5:1 이상) +- 터치 영역 최소 44x44px + +### 2.6 협업 중심 (Collaboration-First) + +**실시간 협업이 핵심 경험이 되어야 합니다.** + +- 다른 사용자의 활동을 명확히 표시 (커서, 아바타) +- 실시간 변경 사항 즉시 반영 +- 충돌 방지 및 해결 메커니즘 +- 버전 관리 및 변경 이력 추적 + +--- + +## 3. 컬러 시스템 + +### 3.1 Primary Color (주요 액션, 브랜드) + +**Teal/Emerald** - 혁신, 성장, 활력을 상징 + +| 이름 | HEX | RGB | 사용처 | +|------|-----|-----|--------| +| Primary-Light | `#4DFFDB` | rgb(77, 255, 219) | 호버, 비활성화 상태 | +| **Primary-Main** | **`#00D9B1`** | **rgb(0, 217, 177)** | **주요 버튼, 링크, 강조** | +| Primary-Dark | `#00A88A` | rgb(0, 168, 138) | 눌림 상태, 강조 | + +**사용 예시**: +- Primary 버튼 배경 +- 링크 텍스트 +- 체크박스, 라디오 버튼 선택 상태 +- 진행률 바 +- FAB (Floating Action Button) + +### 3.2 Secondary Color (보조, 협업 강조) + +**Indigo** - 협업, 신뢰, 전문성을 상징 + +| 이름 | HEX | RGB | 사용처 | +|------|-----|-----|--------| +| Secondary-Light | `#A5B4FC` | rgb(165, 180, 252) | 배경, 비활성화 | +| **Secondary-Main** | **`#6366F1`** | **rgb(99, 102, 241)** | **보조 버튼, 협업 요소** | +| Secondary-Dark | `#4F46E5` | rgb(79, 70, 229) | 강조 | + +**사용 예시**: +- 협업 인디케이터 (다른 사용자 커서) +- 보조 버튼 +- 배지 (검증 중 상태) +- 알림 아이콘 + +### 3.3 Semantic Colors (상태 표현) + +#### Success (성공, 완료) + +| 이름 | HEX | RGB | 사용처 | +|------|-----|-----|--------| +| Success-Light | `#6EE7B7` | rgb(110, 231, 183) | 배경 | +| **Success-Main** | **`#10B981`** | **rgb(16, 185, 129)** | **완료, 검증 완료** | +| Success-Dark | `#059669` | rgb(5, 150, 105) | 강조 | + +#### Warning (경고, 주의) + +| 이름 | HEX | RGB | 사용처 | +|------|-----|-----|--------| +| Warning-Light | `#FCD34D` | rgb(252, 211, 77) | 배경 | +| **Warning-Main** | **`#F59E0B`** | **rgb(245, 158, 11)** | **경고, 작성 중** | +| Warning-Dark | `#D97706` | rgb(217, 119, 6) | 강조 | + +#### Error (오류, 실패) + +| 이름 | HEX | RGB | 사용처 | +|------|-----|-----|--------| +| Error-Light | `#FCA5A5` | rgb(252, 165, 165) | 배경 | +| **Error-Main** | **`#EF4444`** | **rgb(239, 68, 68)** | **오류, 긴급** | +| Error-Dark | `#DC2626` | rgb(220, 38, 38) | 강조 | + +#### Info (정보, 알림) + +| 이름 | HEX | RGB | 사용처 | +|------|-----|-----|--------| +| Info-Light | `#93C5FD` | rgb(147, 197, 253) | 배경 | +| **Info-Main** | **`#3B82F6`** | **rgb(59, 130, 246)** | **정보, 알림** | +| Info-Dark | `#2563EB` | rgb(37, 99, 235) | 강조 | + +### 3.4 Neutral Colors (배경, 텍스트, 테두리) + +| 이름 | HEX | RGB | 사용처 | +|------|-----|-----|--------| +| Gray-50 | `#F9FAFB` | rgb(249, 250, 251) | 페이지 배경 | +| Gray-100 | `#F3F4F6` | rgb(243, 244, 246) | 카드 배경, 호버 | +| Gray-200 | `#E5E7EB` | rgb(229, 231, 235) | 테두리 | +| Gray-300 | `#D1D5DB` | rgb(209, 213, 219) | 비활성화 테두리 | +| Gray-400 | `#9CA3AF` | rgb(156, 163, 175) | 플레이스홀더 | +| Gray-500 | `#6B7280` | rgb(107, 114, 128) | 보조 텍스트 | +| Gray-600 | `#4B5563` | rgb(75, 85, 99) | 본문 텍스트 | +| Gray-700 | `#374151` | rgb(55, 65, 81) | 제목 | +| Gray-800 | `#1F2937` | rgb(31, 41, 55) | 강조 제목 | +| Gray-900 | `#111827` | rgb(17, 24, 39) | 최고 강조 | +| White | `#FFFFFF` | rgb(255, 255, 255) | 카드, 모달 배경 | +| Black | `#000000` | rgb(0, 0, 0) | 절대 검정 (거의 사용 안 함) | + +### 3.5 다크모드 (선택적) + +다크모드를 지원하는 경우 다음 색상을 사용합니다. + +| 요소 | 라이트모드 | 다크모드 | +|------|-----------|---------| +| 페이지 배경 | Gray-50 | Gray-900 | +| 카드 배경 | White | Gray-800 | +| 본문 텍스트 | Gray-600 | Gray-100 | +| 제목 | Gray-900 | Gray-50 | +| 테두리 | Gray-200 | Gray-700 | +| Primary | #00D9B1 | #22D3B0 (밝기 조정) | + +### 3.6 색상 사용 가이드 + +#### 텍스트 색상 + +- **제목**: Gray-900 (라이트), Gray-50 (다크) +- **본문**: Gray-600 (라이트), Gray-100 (다크) +- **보조 텍스트**: Gray-500 +- **플레이스홀더**: Gray-400 +- **링크**: Primary-Main (호버 시 Primary-Dark) +- **에러 텍스트**: Error-Main + +#### 배경 색상 + +- **페이지**: Gray-50 (라이트), Gray-900 (다크) +- **카드**: White (라이트), Gray-800 (다크) +- **호버**: Gray-100 +- **선택**: Primary-Light (투명도 20%) + +#### 테두리 색상 + +- **기본**: Gray-200 +- **호버**: Gray-300 +- **포커스**: Primary-Main (2px) +- **에러**: Error-Main + +--- + +## 4. 타이포그래피 + +### 4.1 폰트 패밀리 + +#### Primary Font (본문 및 UI) + +**한글**: Pretendard +- 깔끔한 고딕 계열 +- 뛰어난 가독성 +- 다양한 굵기 지원 (100~900) +- 시스템 폰트와 유사한 렌더링 + +**영문/숫자**: Inter +- 웹 환경 최적화 +- 명확한 문자 구분 (l, I, 1 등) +- Pretendard와 조화로운 조합 + +**폰트 스택**: +```css +font-family: 'Pretendard', 'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Apple SD Gothic Neo', sans-serif; +``` + +#### Monospace Font (코드, 데이터) + +**Fira Code, Consolas** +- 코드 스니펫 +- API 응답 +- 로그, 에러 메시지 + +**폰트 스택**: +```css +font-family: 'Fira Code', 'Consolas', 'Monaco', 'Courier New', monospace; +``` + +### 4.2 폰트 크기 스케일 + +**1.25 배율 기반** + +| 레벨 | 이름 | 크기 (px / rem) | 사용처 | +|------|------|----------------|--------| +| 1 | Display | 48px / 3rem | 랜딩 페이지 메인 제목 | +| 2 | H1 | 36px / 2.25rem | 페이지 제목 | +| 3 | H2 | 30px / 1.875rem | 주요 섹션 제목 | +| 4 | H3 | 24px / 1.5rem | 서브 섹션 제목 | +| 5 | H4 | 20px / 1.25rem | 카드 제목, 작은 섹션 | +| 6 | Body-Large | 18px / 1.125rem | 강조 본문, 리드 텍스트 | +| 7 | **Body** | **16px / 1rem** | **기본 본문 (기준점)** | +| 8 | Body-Small | 14px / 0.875rem | 보조 정보, 캡션 | +| 9 | Caption | 12px / 0.75rem | 작은 라벨, 타임스탬프 | + +### 4.3 폰트 굵기 (Font Weight) + +| 레벨 | 값 | 사용처 | +|------|---|--------| +| Light | 300 | 보조 정보, 긴 본문 (선택적) | +| **Regular** | **400** | **기본 본문** | +| Medium | 500 | 강조 본문, 버튼 텍스트 | +| SemiBold | 600 | 제목 (H3, H4), 중요 정보 | +| Bold | 700 | 큰 제목 (H1, H2), 최고 강조 | + +### 4.4 행간 (Line Height) + +| 이름 | 값 | 사용처 | +|------|---|--------| +| Tight | 1.25 | 큰 제목 (Display, H1, H2) | +| **Normal** | **1.5** | **본문 텍스트 (기본)** | +| Relaxed | 1.75 | 긴 본문, 읽기 편안함 필요 시 | + +### 4.5 자간 (Letter Spacing) + +| 이름 | 값 | 사용처 | +|------|---|--------| +| Tight | -0.02em | 큰 제목 (Display, H1) | +| **Normal** | **0** | **본문 (기본)** | +| Wide | 0.02em | 작은 캡션, 레이블 (대문자) | + +### 4.6 텍스트 스타일 예시 + +#### Display +```css +font-size: 48px; +font-weight: 700; +line-height: 1.25; +letter-spacing: -0.02em; +``` + +#### H1 +```css +font-size: 36px; +font-weight: 700; +line-height: 1.25; +letter-spacing: -0.02em; +``` + +#### H2 +```css +font-size: 30px; +font-weight: 600; +line-height: 1.25; +letter-spacing: 0; +``` + +#### H3 +```css +font-size: 24px; +font-weight: 600; +line-height: 1.5; +letter-spacing: 0; +``` + +#### Body (기본) +```css +font-size: 16px; +font-weight: 400; +line-height: 1.5; +letter-spacing: 0; +``` + +#### Caption +```css +font-size: 12px; +font-weight: 400; +line-height: 1.5; +letter-spacing: 0.02em; +``` + +--- + +## 5. 간격 시스템 + +### 5.1 기본 단위 + +**8px 기반 시스템** + +모든 간격은 8의 배수를 사용하여 일관성과 시각적 리듬을 유지합니다. + +### 5.2 스케일 + +| 레벨 | 값 (px / rem) | 사용처 | +|------|--------------|--------| +| 0 | 0px / 0 | 간격 없음 | +| 1 | 4px / 0.25rem | 최소 간격 (아이콘-텍스트) | +| 2 | 8px / 0.5rem | 작은 간격 (인라인 요소) | +| 3 | 12px / 0.75rem | 밀접한 요소 (버튼 내부) | +| **4** | **16px / 1rem** | **기본 간격** | +| 5 | 20px / 1.25rem | 적당한 간격 | +| 6 | 24px / 1.5rem | 컴포넌트 간 | +| 8 | 32px / 2rem | 섹션 내부 | +| 10 | 40px / 2.5rem | 섹션 간 | +| 12 | 48px / 3rem | 큰 섹션 간 | +| 16 | 64px / 4rem | 페이지 여백 | +| 20 | 80px / 5rem | 대형 섹션 | + +### 5.3 컴포넌트별 간격 + +#### 버튼 +- **패딩**: 12px (상하) × 24px (좌우) - 중형 +- **패딩 (소형)**: 8px (상하) × 16px (좌우) +- **패딩 (대형)**: 16px (상하) × 32px (좌우) +- **아이콘-텍스트 간격**: 8px + +#### 입력 필드 +- **패딩**: 12px (상하) × 16px (좌우) +- **레이블-필드 간격**: 8px + +#### 카드 +- **패딩**: 24px +- **카드 간 간격**: 16px (그리드), 24px (리스트) + +#### 모달 +- **패딩**: 32px +- **헤더-본문 간격**: 24px +- **본문-푸터 간격**: 32px + +#### 페이지 여백 +- **데스크탑**: 64px (좌우) +- **태블릿**: 32px (좌우) +- **모바일**: 24px (좌우) + +### 5.4 컨테이너 최대 너비 + +| 크기 | 최대 너비 | 사용처 | +|------|---------|--------| +| Small | 640px | 폼, 로그인 화면 | +| Medium | 768px | 템플릿 선택 | +| Large | 1024px | 회의 예약 | +| XLarge | 1280px | 대시보드 | +| 2XLarge | 1536px | 회의 진행 (에디터) | +| Full | 100% | 풀 레이아웃 | + +--- + +## 6. 컴포넌트 스타일 + +### 6.1 버튼 (Button) + +#### Primary Button (주요 액션) + +**스타일**: +- 배경: Primary-Main (#00D9B1) +- 텍스트: White +- 패딩: 12px (상하) × 24px (좌우) +- 테두리 반경: 8px +- 폰트: Medium (500), 16px +- 그림자: 없음 (기본), 0 2px 4px rgba(0, 0, 0, 0.1) (호버) + +**상태**: +- **Hover**: 배경 Primary-Light + transform: translateY(-1px) + 그림자 증가 +- **Active**: 배경 Primary-Dark + transform: scale(0.98) +- **Disabled**: 배경 Gray-300 + 텍스트 Gray-500 + 커서 not-allowed + +**코드 예시**: +```css +.btn-primary { + background-color: #00D9B1; + color: white; + padding: 12px 24px; + border-radius: 8px; + font-weight: 500; + font-size: 16px; + transition: all 150ms ease-out; +} + +.btn-primary:hover { + background-color: #4DFFDB; + transform: translateY(-1px); + box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1); +} + +.btn-primary:active { + background-color: #00A88A; + transform: scale(0.98); +} + +.btn-primary:disabled { + background-color: #D1D5DB; + color: #6B7280; + cursor: not-allowed; +} +``` + +#### Secondary Button (보조 액션) + +**스타일**: +- 배경: Transparent +- 텍스트: Primary-Main +- 테두리: 1px solid Primary-Main +- 패딩: 12px × 24px +- 테두리 반경: 8px + +**상태**: +- **Hover**: 배경 Primary-Main (투명도 10%) +- **Active**: 배경 Primary-Main (투명도 20%) +- **Disabled**: 테두리 Gray-300 + 텍스트 Gray-400 + +#### Text Button (덜 중요한 액션) + +**스타일**: +- 배경: Transparent +- 텍스트: Gray-700 +- 패딩: 8px × 16px +- 테두리 반경: 8px + +**상태**: +- **Hover**: 배경 Gray-100 +- **Active**: 배경 Gray-200 + +#### Icon Button + +**스타일**: +- 크기: 40×40px (중형), 32×32px (소형), 48×48px (대형) +- 테두리 반경: 50% (원형) 또는 8px (사각형) +- 아이콘 크기: 20px (중형), 16px (소형), 24px (대형) +- 배경: Transparent + +**상태**: +- **Hover**: 배경 Gray-100 +- **Active**: 배경 Gray-200 + +#### Floating Action Button (FAB) + +**스타일**: +- 크기: 56×56px +- 테두리 반경: 50% (완전 원형) +- 배경: Primary-Main +- 아이콘: White, 24px +- 그림자: 0 4px 12px rgba(0, 0, 0, 0.15) +- 위치: 우측 하단 고정 (16px 여백) + +**상태**: +- **Hover**: 그림자 0 6px 16px rgba(0, 0, 0, 0.2) + transform: translateY(-2px) +- **Active**: transform: scale(0.95) + +### 6.2 입력 필드 (Input Field) + +#### Text Input + +**스타일**: +- 높이: 48px +- 패딩: 12px (상하) × 16px (좌우) +- 테두리: 1px solid Gray-300 +- 테두리 반경: 8px +- 배경: White +- 폰트: Regular, 16px +- 플레이스홀더: Gray-400 + +**상태**: +- **Focus**: 테두리 Primary-Main 2px + outline 4px Primary-Main (투명도 20%) +- **Error**: 테두리 Error-Main + 하단 에러 메시지 (Error-Main, 14px) +- **Disabled**: 배경 Gray-100 + 텍스트 Gray-400 + 커서 not-allowed +- **Success**: 테두리 Success-Main (선택적) + +**코드 예시**: +```css +.input { + height: 48px; + padding: 12px 16px; + border: 1px solid #D1D5DB; + border-radius: 8px; + font-size: 16px; + transition: all 150ms ease-out; +} + +.input:focus { + border-color: #00D9B1; + border-width: 2px; + outline: 4px solid rgba(0, 217, 177, 0.2); +} + +.input.error { + border-color: #EF4444; +} + +.input:disabled { + background-color: #F3F4F6; + color: #9CA3AF; + cursor: not-allowed; +} +``` + +#### Textarea + +**스타일**: +- 최소 높이: 120px +- 패딩: 12px × 16px +- 나머지는 Text Input과 동일 +- resize: vertical (세로 크기 조절 가능) + +#### Select / Dropdown + +**스타일**: +- Input과 동일 +- 우측 아이콘: Chevron Down, 16px, Gray-500 + +### 6.3 카드 (Card) + +**스타일**: +- 배경: White +- 테두리: 1px solid Gray-200 (선택적, 없을 수도 있음) +- 테두리 반경: 12px +- 패딩: 24px +- 그림자: 0 1px 3px rgba(0, 0, 0, 0.1) (기본) + +**상태 (인터랙티브 카드)**: +- **Hover**: 그림자 0 4px 12px rgba(0, 0, 0, 0.15) + transform: translateY(-2px) +- **Active**: 그림자 0 1px 2px rgba(0, 0, 0, 0.1) + transform: scale(0.99) + +**코드 예시**: +```css +.card { + background-color: white; + border: 1px solid #E5E7EB; + border-radius: 12px; + padding: 24px; + box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1); + transition: all 200ms ease-out; +} + +.card.interactive:hover { + box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15); + transform: translateY(-2px); +} +``` + +### 6.4 모달 (Modal) + +**스타일**: +- 배경: White +- 테두리 반경: 16px +- 패딩: 32px +- 최대 너비: 600px (중형), 800px (대형), 480px (소형) +- 그림자: 0 20px 25px rgba(0, 0, 0, 0.15) + +**백드롭 (Backdrop)**: +- 배경: rgba(0, 0, 0, 0.5) +- 클릭 시 모달 닫기 (선택적) + +**애니메이션**: +- 등장: Fade In (200ms) + Scale (0.95 → 1.0) +- 사라짐: Fade Out (150ms) + Scale (1.0 → 0.95) + +### 6.5 토스트 알림 (Toast) + +**스타일**: +- 배경: White +- 테두리 반경: 8px +- 패딩: 16px × 20px +- 최대 너비: 400px +- 그림자: 0 4px 12px rgba(0, 0, 0, 0.15) +- 위치: 우측 상단 (16px 여백) + +**타입별 색상**: +- **Success**: 좌측 테두리 4px Success-Main + Success 아이콘 +- **Error**: 좌측 테두리 4px Error-Main + Error 아이콘 +- **Warning**: 좌측 테두리 4px Warning-Main + Warning 아이콘 +- **Info**: 좌측 테두리 4px Info-Main + Info 아이콘 + +**동작**: +- 자동 사라짐: 4초 후 +- 닫기 버튼: 우측 상단 X 아이콘 +- 애니메이션: 우측에서 슬라이드 인 + +### 6.6 배지 (Badge) + +**스타일**: +- 패딩: 4px (상하) × 12px (좌우) +- 테두리 반경: 12px (완전 둥근 형태) +- 폰트: Medium, 12px + +**타입별 색상**: +- **Primary**: 배경 Primary-Light, 텍스트 Primary-Dark +- **Success**: 배경 Success-Light, 텍스트 Success-Dark +- **Warning**: 배경 Warning-Light, 텍스트 Warning-Dark +- **Error**: 배경 Error-Light, 텍스트 Error-Dark +- **Neutral**: 배경 Gray-200, 텍스트 Gray-700 + +**사용 예시**: +- 상태 표시: "작성 중", "검증 중", "확정됨" +- 카운트: "3개의 알림", "5명 참석" + +--- + +## 7. 반응형 브레이크포인트 + +### 7.1 브레이크포인트 정의 + +| 디바이스 | 범위 | 레이아웃 | 주요 조정 | +|---------|------|---------|----------| +| **Mobile** | 320px ~ 767px | 단일 컬럼 | 햄버거 메뉴, 하단 탭, 스택 레이아웃 | +| **Tablet** | 768px ~ 1023px | 2단 레이아웃 | 토글 사이드바, 터치 최적화 | +| **Desktop** | 1024px ~ 1439px | 3단 레이아웃 | 고정 사이드바, 키보드 단축키 | +| **Large Desktop** | 1440px 이상 | 확장 레이아웃 | 더 넓은 중앙 패널, 4단 가능 | + +### 7.2 디바이스별 UI 조정 + +#### Mobile (320px ~ 767px) + +**네비게이션**: +- 햄버거 메뉴로 사이드바 숨김 +- 하단 탭 네비게이션 (대시보드, 회의, Todo, 더보기) +- 상단 헤더 고정 + +**레이아웃**: +- 1단 스택 레이아웃 +- 카드/위젯을 세로로 배치 +- 패딩 감소 (24px → 16px) + +**인터랙션**: +- 최소 터치 영역: 44×44px +- 버튼 크기 증가 +- 스와이프 제스처 지원 + +**05-회의진행 화면**: +- 탭으로 패널 전환 (회의록 / 참석자 / AI 제안 / 용어 설명) +- 툴바를 하단 고정 (터치 용이성) + +**09-Todo관리 화면**: +- 칸반 보드 대신 리스트 뷰 권장 +- 상태 변경은 드롭다운으로 + +#### Tablet (768px ~ 1023px) + +**네비게이션**: +- 사이드바 토글 가능 (기본 숨김) +- 상단 헤더에 메뉴 아이콘 + +**레이아웃**: +- 2단 그리드 레이아웃 (2×2 또는 2×3) +- 적절한 여백 유지 + +**05-회의진행 화면**: +- 2단 레이아웃 (에디터 + AI 제안 패널) +- 참석자 목록은 드로어로 표시 + +**터치 최적화**: +- 버튼 크기: 최소 44×44px +- 간격: 최소 8px + +#### Desktop (1024px 이상) + +**네비게이션**: +- 전체 사이드바 항상 표시 +- 호버 효과 및 툴팁 + +**레이아웃**: +- 3단 그리드 레이아웃 (3×2) +- 더 많은 위젯 동시 표시 + +**05-회의진행 화면**: +- 3단 레이아웃 (참석자 + 에디터 + AI 제안) +- 모든 패널 동시 표시 + +**키보드 단축키**: +- Ctrl+N: 새 회의 +- Ctrl+S: 저장 +- Ctrl+F: 검색 +- Ctrl+/: 단축키 가이드 + +### 7.3 미디어 쿼리 예시 + +```css +/* Mobile First 접근 */ +.container { + padding: 16px; +} + +/* Tablet */ +@media (min-width: 768px) { + .container { + padding: 32px; + } +} + +/* Desktop */ +@media (min-width: 1024px) { + .container { + padding: 64px; + } +} + +/* Large Desktop */ +@media (min-width: 1440px) { + .container { + max-width: 1536px; + margin: 0 auto; + } +} +``` + +--- + +## 8. 회의록 서비스 특화 컴포넌트 + +### 8.1 실시간 협업 인디케이터 + +#### 사용자 커서 + +**스타일**: +- 사용자별 색상 코드: + - User 1: Primary-Main (#00D9B1) + - User 2: Secondary-Main (#6366F1) + - User 3: Warning-Main (#F59E0B) + - User 4: Info-Main (#3B82F6) + - User 5: Error-Main (#EF4444) +- 커서 크기: 2px (너비) × 20px (높이) +- 커서 상단에 아바타 + 이름 레이블 +- 레이블 배경: 사용자 색상, 텍스트: White +- 레이블 패딩: 4px × 8px, 테두리 반경: 4px + +#### 편집 중 하이라이트 + +**스타일**: +- 배경: 사용자 색상 (투명도 20%) +- 지속 시간: 사용자가 편집하는 동안 유지 +- 애니메이션: 부드러운 페이드인 + +#### 변경 하이라이트 + +**스타일**: +- 배경: Warning-Light (노란색) +- 지속 시간: 3초 +- 애니메이션: 3초 동안 페이드아웃 + +### 8.2 상태 배지 + +#### 작성 중 + +**스타일**: +- 배경: Warning-Light (#FCD34D) +- 텍스트: Warning-Dark (#D97706) +- 아이콘: Edit 아이콘 (선택적) + +#### 검증 중 + +**스타일**: +- 배경: Info-Light (#93C5FD) +- 텍스트: Info-Dark (#2563EB) +- 아이콘: Clock 아이콘 (선택적) + +#### 확정됨 + +**스타일**: +- 배경: Success-Light (#6EE7B7) +- 텍스트: Success-Dark (#059669) +- 아이콘: Check 아이콘 (선택적) + +### 8.3 전문용어 하이라이트 + +**스타일**: +- 밑줄: 2px dotted Primary-Main +- 커서: pointer + +**호버 상태**: +- 툴팁 표시 + - 배경: Gray-800 + - 텍스트: White + - 패딩: 8px × 12px + - 테두리 반경: 6px + - 최대 너비: 300px + - 화살표 표시 + +**클릭 상태**: +- 우측 패널의 "용어 설명" 탭으로 전환 +- 해당 용어 상세 설명 표시 + +### 8.4 AI 제안 영역 + +**스타일**: +- 배경: Gray-50 +- 테두리: 1px dashed Primary-Main +- 테두리 반경: 8px +- 패딩: 16px +- 아이콘: AI Sparkle 아이콘 (Primary-Main) + +**액션 버튼**: +- 적용: Primary 버튼 (소형, 패딩 8px × 16px) +- 무시: Text 버튼 + +**애니메이션**: +- 등장: 페이드인 + 약간의 상승 (translateY) +- 업데이트: 부드러운 전환 (200ms) + +### 8.5 Todo 카드 + +**레이아웃**: +- 카드 형태 +- 패딩: 16px +- 테두리 반경: 8px +- 그림자: 0 1px 3px rgba(0, 0, 0, 0.1) + +**우선순위 표시**: +- 높음: 좌측 테두리 4px Error-Main + Error 점 (8px 원) +- 보통: 테두리 없음, Gray 점 +- 낮음: 표시 없음 + +**진행률 바**: +- 높이: 4px +- 배경: Gray-200 +- 채워진 부분: Primary-Main +- 테두리 반경: 2px +- 위치: 하단 + +**마감일 표시**: +- D-day 형식: "D-3", "오늘", "D+2 (지남)" +- 색상: + - 지남: Error-Main + - 오늘: Warning-Main + - 여유: Gray-500 + +**드래그 핸들**: +- 아이콘: 점 6개 (2×3) +- 색상: Gray-400 +- 위치: 좌측 상단 + +**호버 상태**: +- 그림자 증가 +- 드래그 핸들 색상 변경 (Gray-600) + +### 8.6 타임라인 + +**스타일**: +- 세로 라인: 2px solid Gray-300 +- 위치: 좌측 고정 + +**이벤트 점**: +- 크기: 12px 원 +- 배경: Primary-Main +- 테두리: 2px solid White +- 위치: 라인 중앙 + +**타임스탬프**: +- 폰트: Caption (12px), Gray-500 +- 위치: 이벤트 점 우측 + +**이벤트 내용**: +- 폰트: Body-Small (14px), Gray-700 +- 위치: 타임스탬프 하단 + +--- + +## 9. 인터랙션 패턴 + +### 9.1 버튼 인터랙션 + +**Hover**: +```css +transition: all 150ms ease-out; +transform: translateY(-1px); +box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1); +``` + +**Active (클릭)**: +```css +transform: scale(0.98); +``` + +**Disabled**: +```css +cursor: not-allowed; +opacity: 0.6; +``` + +### 9.2 카드 인터랙션 (인터랙티브 카드) + +**Hover**: +```css +transition: all 200ms ease-out; +transform: translateY(-2px); +box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15); +``` + +**클릭**: +```css +transform: scale(0.99); +``` + +### 9.3 모달 애니메이션 + +**등장**: +```css +/* Backdrop */ +opacity: 0 → 1; +transition: opacity 200ms ease-out; + +/* Modal */ +opacity: 0 → 1; +transform: scale(0.95) → scale(1.0); +transition: all 200ms ease-out; +``` + +**사라짐**: +```css +opacity: 1 → 0; +transform: scale(1.0) → scale(0.95); +transition: all 150ms ease-in; +``` + +### 9.4 토스트 알림 애니메이션 + +**등장**: +```css +transform: translateX(400px) → translateX(0); +opacity: 0 → 1; +transition: all 200ms ease-out; +``` + +**사라짐**: +```css +transform: translateX(0) → translateX(400px); +opacity: 1 → 0; +transition: all 150ms ease-in; +``` + +**자동 사라짐**: 4초 후 + +### 9.5 로딩 상태 + +#### 스켈레톤 UI + +**스타일**: +- 배경: Gray-200 +- 테두리 반경: 4px +- 애니메이션: 펄스 (밝기 변화) + +```css +@keyframes pulse { + 0%, 100% { opacity: 1; } + 50% { opacity: 0.5; } +} + +.skeleton { + animation: pulse 2s cubic-bezier(0.4, 0, 0.6, 1) infinite; +} +``` + +#### 스피너 + +**스타일**: +- 색상: Primary-Main +- 크기: 24px (소형), 40px (중형), 56px (대형) +- 애니메이션: 회전 + +```css +@keyframes spin { + to { transform: rotate(360deg); } +} + +.spinner { + animation: spin 1s linear infinite; +} +``` + +### 9.6 드래그 앤 드롭 + +**드래그 시작**: +```css +opacity: 0.5; +cursor: grabbing; +``` + +**드롭 영역 (유효)**: +```css +border: 2px dashed #00D9B1; +background-color: rgba(0, 217, 177, 0.05); +``` + +**드롭 영역 (무효)**: +```css +border: 2px dashed #EF4444; +background-color: rgba(239, 68, 68, 0.05); +``` + +**드롭 완료**: +```css +transition: all 300ms ease-out; +transform: translate(newX, newY); +``` + +### 9.7 포커스 스타일 + +**인풋/버튼 포커스**: +```css +outline: 4px solid rgba(0, 217, 177, 0.2); +outline-offset: 0; +border-color: #00D9B1; +``` + +**키보드 네비게이션 포커스**: +```css +/* 마우스 클릭 시에는 outline 숨김 */ +.js-focus-visible :focus:not(.focus-visible) { + outline: none; +} + +/* 키보드 탐색 시에만 outline 표시 */ +.focus-visible { + outline: 2px solid #00D9B1; + outline-offset: 2px; +} +``` + +### 9.8 페이지 전환 애니메이션 + +**페이드 전환**: +```css +/* 나가는 페이지 */ +opacity: 1 → 0; +transition: opacity 150ms ease-out; + +/* 들어오는 페이지 */ +opacity: 0 → 1; +transition: opacity 200ms ease-in; +``` + +--- + +## 10. 변경 이력 + +| 버전 | 날짜 | 작성자 | 변경 내용 | +|------|------|--------|----------| +| 1.0 | 2025-10-15 | 유진 | 초안 작성 - 레퍼런스 클로바노트 기반 스타일 가이드 설계 완료 | + +--- + +## 부록 + +### A. 색상 접근성 체크리스트 + +- [ ] Primary-Main (#00D9B1) + White: 대비율 3.5:1 (AA Large) ✅ +- [ ] Gray-600 (#4B5563) + White: 대비율 8.6:1 (AAA) ✅ +- [ ] Primary-Main + Gray-900: 대비율 4.8:1 (AA) ✅ +- [ ] 모든 상태 색상 (Success, Warning, Error, Info) + White: AA 이상 ✅ + +### B. 디자인 도구 및 에셋 + +**권장 디자인 도구**: +- Figma (프로토타입 및 디자인 시스템) +- Adobe XD (대안) + +**아이콘 라이브러리**: +- Heroicons (추천) +- Feather Icons +- Lucide Icons + +**일러스트레이션**: +- unDraw (무료, 색상 커스터마이징 가능) +- Storyset (Freepik) +- 자체 제작 (브랜드 일관성) + +### C. 프론트엔드 구현 권장사항 + +**CSS 프레임워크**: +- Tailwind CSS (유틸리티 우선, 빠른 개발) +- Emotion / styled-components (CSS-in-JS) + +**컴포넌트 라이브러리**: +- Headless UI (접근성 우수) +- Radix UI (무스타일 프리미티브) +- 자체 제작 (완전한 커스터마이징) + +**애니메이션**: +- Framer Motion (React) +- GSAP (고급 애니메이션) +- CSS Transitions (단순 애니메이션) + +### D. 참고 자료 + +- **WCAG 2.1 가이드라인**: https://www.w3.org/WAI/WCAG21/quickref/ +- **클로바노트**: https://clovanote.naver.com/ +- **Pretendard 폰트**: https://cactus.tistory.com/306 +- **Tailwind CSS 컬러 팔레트**: https://tailwindcss.com/docs/customizing-colors + +--- + +**문서 끝**