hgzero/design/uiux/style-guide.bk.md
yabo0812 4f2fdadf50 UI/UX 설계 및 프로토타입 가이드 추가
- 프로토타입 작성 가이드 문서 추가 (claude/uiux-prototype.md)
- 스타일 가이드 업데이트 및 백업 파일 추가
- UI/UX 설계서 수정
- 참조용 샘플 이미지 추가 (대시보드, 회의록, Todo 목록)

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-10-21 16:59:10 +09:00

1768 lines
38 KiB
Markdown

# 회의록 작성 및 공유 개선 서비스 - 스타일 가이드
## 문서 정보
- **작성일**: 2025-10-21
- **작성자**: 이미준 (서비스 기획자)
- **버전**: 1.0
- **기반**: Mobile First Design Philosophy
---
## 목차
1. [브랜드 아이덴티티](#브랜드-아이덴티티)
2. [디자인 원칙](#디자인-원칙)
3. [컬러 시스템](#컬러-시스템)
4. [타이포그래피](#타이포그래피)
5. [간격 시스템](#간격-시스템)
6. [컴포넌트 스타일](#컴포넌트-스타일)
7. [반응형 브레이크포인트](#반응형-브레이크포인트)
8. [서비스 특화 컴포넌트](#서비스-특화-컴포넌트)
9. [인터랙션 패턴](#인터랙션-패턴)
10. [아이콘 시스템](#아이콘-시스템)
11. [애니메이션 가이드](#애니메이션-가이드)
12. [상태 표시](#상태-표시)
13. [접근성 표준](#접근성-표준)
14. [변경 이력](#변경-이력)
---
## 1. 브랜드 아이덴티티
### 디자인 컨셉
**"정확하고 지능적인 협업"**
업무 지식이 없어도 AI의 도움으로 정확한 회의록을 작성하고, 실시간으로 협업하며, 효율적으로 공유할 수 있는 전문적이면서도 접근하기 쉬운 서비스.
### 핵심 가치
- **정확성 (Accuracy)**: AI 기반 자동 작성과 맥락 기반 용어 설명으로 정확한 회의록 보장
- **협업 (Collaboration)**: 실시간 동기화와 섹션별 검증으로 참석자 간 원활한 협업
- **지능 (Intelligence)**: AI 자동 요약, Todo 추출, 관련 회의록 연결 등 스마트한 기능
- **효율성 (Efficiency)**: Mobile First 설계로 언제 어디서나 빠르고 편리한 접근
### 브랜드 성격
- **전문적 (Professional)**: 비즈니스 환경에 적합한 신뢰감
- **접근 가능 (Accessible)**: 누구나 쉽게 사용할 수 있는 직관성
- **스마트 (Smart)**: AI 기술의 지능적 활용
- **협력적 (Collaborative)**: 팀워크를 촉진하는 협업 중심
### 디자인 키워드
- Clean & Modern
- Intuitive & User-friendly
- Professional & Trustworthy
- Collaborative & Connected
- AI-powered & Smart
---
## 2. 디자인 원칙
### 2.1 Mobile First
**작은 화면에서 시작하여 큰 화면으로 확장**
- **우선순위 중심**: 제한된 공간에서 가장 중요한 기능과 정보에 집중
- **점진적 향상**: 모바일 기본 경험을 먼저 완성하고, 화면이 커질수록 기능 추가
- **성능 최적화**: 모바일 환경의 제약(네트워크, 처리 능력)을 우선 고려
- **터치 우선**: 터치 인터랙션을 기본으로 설계, 마우스는 추가 기능
### 2.2 사용자 중심 설계
**사용자가 목표를 쉽게 달성할 수 있도록 지원**
- **단순함 (Simplicity)**: 복잡한 기능을 간단하게 표현
- **일관성 (Consistency)**: 동일한 패턴과 용어를 전체 서비스에서 일관되게 사용
- **피드백 (Feedback)**: 모든 사용자 액션에 즉각적이고 명확한 반응 제공
- **오류 방지 (Error Prevention)**: 실수를 사전에 차단하고, 발생 시 명확한 해결 방법 제공
### 2.3 접근성 우선
**모든 사용자가 동등하게 사용할 수 있도록 설계**
- **WCAG 2.1 Level AA 준수**: 국제 웹 접근성 표준 충족
- **키보드 네비게이션**: 모든 기능을 키보드만으로 조작 가능
- **스크린 리더 지원**: 시각장애인을 위한 적절한 ARIA 속성 제공
- **색상 대비**: 최소 4.5:1 대비율로 가독성 보장
### 2.4 실시간 협업 지원
**여러 사용자가 동시에 작업할 수 있도록 최적화**
- **즉각적 동기화**: 변경 사항을 실시간으로 모든 참석자에게 전달
- **충돌 방지**: 동시 편집 충돌을 사전 감지 및 해결
- **명확한 상태 표시**: 누가 무엇을 하고 있는지 실시간으로 표시
### 2.5 AI 투명성
**AI 기능을 이해하기 쉽고 신뢰할 수 있게 표현**
- **진행 상황 표시**: AI 처리 중임을 명확히 알림
- **신뢰도 표시**: AI 결과의 신뢰도를 시각적으로 전달
- **수정 가능성**: AI 결과를 언제든 수동으로 수정 가능
---
## 3. 컬러 시스템
### 3.1 Primary Colors (주요 색상)
#### Blue (메인 브랜드 색상)
전문성, 신뢰, 기술을 나타내는 주요 색상
- **Primary 50**: `#E3F2FD` - 배경, 하이라이트
- **Primary 100**: `#BBDEFB` - 호버 배경
- **Primary 200**: `#90CAF9` - 비활성 상태
- **Primary 300**: `#64B5F6` - 보조 요소
- **Primary 400**: `#42A5F5` - 인터랙티브 요소
- **Primary 500**: `#2196F3`**기본** - 주요 버튼, 링크
- **Primary 600**: `#1E88E5` - 호버 상태
- **Primary 700**: `#1976D2` - Active 상태
- **Primary 800**: `#1565C0` - 강조
- **Primary 900**: `#0D47A1` - 최고 강조
**사용 예시:**
- 주요 액션 버튼 (회의 시작, 저장, 공유)
- 링크 텍스트
- 선택된 탭/메뉴
- 진행 바
- 포커스 인디케이터
### 3.2 Secondary Colors (보조 색상)
#### Green (성공, 완료)
완료 상태, 긍정적 액션을 나타냄
- **Secondary 50**: `#E8F5E9`
- **Secondary 100**: `#C8E6C9`
- **Secondary 500**: `#4CAF50`**기본**
- **Secondary 700**: `#388E3C`
- **Secondary 900**: `#1B5E20`
**사용 예시:**
- 검증 완료 배지
- Todo 완료 체크
- 성공 메시지
- 진행률 표시
#### Purple (AI 기능)
AI 관련 기능을 시각적으로 구분
- **Accent 50**: `#F3E5F5`
- **Accent 100**: `#E1BEE7`
- **Accent 500**: `#9C27B0`**기본**
- **Accent 700**: `#7B1FA2`
**사용 예시:**
- AI 자동 작성 인디케이터
- 전문용어 하이라이트
- AI 제안 배지
- 맥락 기반 설명 툴팁
### 3.3 Semantic Colors (의미 색상)
#### Success (성공)
- **Color**: `#4CAF50` (Green 500)
- **Background**: `#E8F5E9` (Green 50)
- **사용**: 성공 메시지, 완료 상태
#### Warning (경고)
- **Color**: `#FF9800` (Orange 500)
- **Background**: `#FFF3E0` (Orange 50)
- **사용**: 경고 메시지, 주의 필요
#### Error (오류)
- **Color**: `#F44336` (Red 500)
- **Background**: `#FFEBEE` (Red 50)
- **사용**: 오류 메시지, 필수 항목 누락
#### Info (정보)
- **Color**: `#2196F3` (Blue 500)
- **Background**: `#E3F2FD` (Blue 50)
- **사용**: 정보 메시지, 안내
### 3.4 Neutral Colors (중립 색상)
#### Gray Scale
텍스트, 배경, 테두리에 사용
- **Gray 50**: `#FAFAFA` - 페이지 배경
- **Gray 100**: `#F5F5F5` - 카드 배경
- **Gray 200**: `#EEEEEE` - 비활성 배경
- **Gray 300**: `#E0E0E0` - 테두리
- **Gray 400**: `#BDBDBD` - 비활성 텍스트
- **Gray 500**: `#9E9E9E` - 보조 텍스트
- **Gray 600**: `#757575` - 아이콘
- **Gray 700**: `#616161` - 부제목
- **Gray 800**: `#424242` - 본문 텍스트
- **Gray 900**: `#212121` - 제목 텍스트
#### White & Black
- **White**: `#FFFFFF` - 카드, 모달 배경
- **Black**: `#000000` - 텍스트 (투명도 87%)
### 3.5 색상 접근성 가이드
#### 텍스트 대비율 (WCAG 2.1 Level AA)
- **일반 텍스트**: 최소 4.5:1
- **대형 텍스트** (18px 이상 또는 14px Bold): 최소 3:1
- **UI 컴포넌트**: 최소 3:1
#### 색상 조합 예시 (통과)
- Primary 500 (`#2196F3`) on White - **대비율 3.1:1** ✅ (Large Text)
- Gray 900 (`#212121`) on White - **대비율 16.1:1**
- Gray 700 (`#616161`) on White - **대비율 5.7:1**
- White on Primary 700 (`#1976D2`) - **대비율 5.3:1**
#### 색상만으로 정보 전달 금지
- ❌ 빨간색 텍스트만으로 오류 표시
- ✅ 빨간색 + 아이콘 + "오류" 텍스트
---
## 4. 타이포그래피
### 4.1 폰트 패밀리
#### Primary Font (한글)
```css
font-family: 'Pretendard', -apple-system, BlinkMacSystemFont, system-ui, 'Noto Sans KR', sans-serif;
```
**Pretendard 특징:**
- 한글 가독성 우수
- 다양한 굵기 지원 (Thin~Black)
- 웹폰트 최적화 (가변 폰트 지원)
- 무료 라이선스 (OFL)
**대체 폰트:**
- macOS/iOS: -apple-system (San Francisco)
- Windows: 맑은 고딕 (시스템 기본)
- 기타: Noto Sans KR
#### Secondary Font (영문, 숫자)
```css
font-family: 'Inter', 'Roboto', Arial, sans-serif;
```
**Inter 특징:**
- 숫자 가독성 우수 (Tabular Numbers)
- UI 최적화
- 웹폰트 최적화
### 4.2 타입 스케일
#### Heading (제목)
| 용도 | 크기 | 굵기 | 행간 | CSS Class | 사용 예시 |
|------|------|------|------|-----------|----------|
| **H1** | 32px | Bold (700) | 1.2 (38px) | `.text-h1` | 페이지 제목 |
| **H2** | 24px | Bold (700) | 1.3 (31px) | `.text-h2` | 섹션 제목 |
| **H3** | 20px | SemiBold (600) | 1.4 (28px) | `.text-h3` | 카드 제목 |
| **H4** | 18px | SemiBold (600) | 1.4 (25px) | `.text-h4` | 서브섹션 제목 |
| **H5** | 16px | Medium (500) | 1.5 (24px) | `.text-h5` | 그룹 제목 |
| **H6** | 14px | Medium (500) | 1.5 (21px) | `.text-h6` | 라벨 제목 |
#### Body (본문)
| 용도 | 크기 | 굵기 | 행간 | CSS Class | 사용 예시 |
|------|------|------|------|-----------|----------|
| **Body Large** | 16px | Regular (400) | 1.5 (24px) | `.text-body-lg` | 주요 본문 |
| **Body** | 14px | Regular (400) | 1.5 (21px) | `.text-body` | 기본 본문 |
| **Body Small** | 13px | Regular (400) | 1.5 (19px) | `.text-body-sm` | 보조 텍스트 |
| **Caption** | 12px | Regular (400) | 1.4 (17px) | `.text-caption` | 캡션, 메타 정보 |
#### Special (특수)
| 용도 | 크기 | 굵기 | 행간 | CSS Class | 사용 예시 |
|------|------|------|------|-----------|----------|
| **Button Large** | 16px | SemiBold (600) | 1.0 | `.text-btn-lg` | 주요 버튼 |
| **Button** | 14px | Medium (500) | 1.0 | `.text-btn` | 기본 버튼 |
| **Button Small** | 13px | Medium (500) | 1.0 | `.text-btn-sm` | 작은 버튼 |
| **Label** | 12px | Medium (500) | 1.0 | `.text-label` | 입력 레이블 |
| **Code** | 14px | Regular (400) | 1.5 | `.text-code` | 코드, 기술 정보 |
### 4.3 타이포그래피 원칙
#### 가독성 우선
- **최소 본문 크기**: 14px (모바일), 16px (데스크톱 권장)
- **적절한 행간**: 본문은 1.5 이상
- **적절한 줄 길이**: 50-75자 (한글 기준 25-40자)
#### 계층 구조
- **제목과 본문의 명확한 구분**: 크기, 굵기, 색상 차이
- **일관된 스케일**: 1.25배 비율 (Modular Scale)
#### 색상 사용
- **제목**: Gray 900 (`#212121`)
- **본문**: Gray 800 (`#424242`)
- **보조 텍스트**: Gray 600 (`#757575`)
- **비활성 텍스트**: Gray 400 (`#BDBDBD`)
### 4.4 반응형 타이포그래피
#### Mobile (320px~767px)
```css
/* H1 축소 */
.text-h1 { font-size: 28px; }
.text-h2 { font-size: 22px; }
/* Body 기본 유지 */
.text-body { font-size: 14px; }
```
#### Tablet (768px~1023px)
```css
/* 기본 스케일 유지 */
.text-h1 { font-size: 32px; }
.text-body { font-size: 14px; }
```
#### Desktop (1024px+)
```css
/* Body 확대 */
.text-body-lg { font-size: 18px; }
.text-body { font-size: 16px; }
```
---
## 5. 간격 시스템
### 5.1 기본 단위
**Base Unit: 4px**
모든 간격은 4px의 배수를 사용하여 일관성 유지
### 5.2 간격 스케일
| Token | 값 | Rem | 사용 예시 |
|-------|-----|-----|----------|
| `spacing-0` | 0px | 0 | 간격 없음 |
| `spacing-1` | 4px | 0.25rem | 아이콘-텍스트 간격 |
| `spacing-2` | 8px | 0.5rem | 버튼 내부 패딩 (세로) |
| `spacing-3` | 12px | 0.75rem | 작은 요소 간격 |
| `spacing-4` | 16px | 1rem | 기본 요소 간격 |
| `spacing-5` | 20px | 1.25rem | 중간 요소 간격 |
| `spacing-6` | 24px | 1.5rem | 카드 내부 패딩 |
| `spacing-8` | 32px | 2rem | 섹션 간격 |
| `spacing-10` | 40px | 2.5rem | 큰 섹션 간격 |
| `spacing-12` | 48px | 3rem | 페이지 상하 여백 |
| `spacing-16` | 64px | 4rem | 특별한 강조 간격 |
### 5.3 컴포넌트별 간격
#### 버튼
```css
/* Primary Button */
padding: 12px 24px; /* spacing-3 spacing-6 */
gap: 8px; /* 아이콘-텍스트 간격 */
/* Small Button */
padding: 8px 16px; /* spacing-2 spacing-4 */
```
#### 카드
```css
padding: 24px; /* spacing-6 */
gap: 16px; /* 내부 요소 간격 */
```
#### 폼
```css
/* Input Field */
padding: 12px 16px; /* spacing-3 spacing-4 */
margin-bottom: 16px; /* 필드 간격 */
/* Label */
margin-bottom: 8px; /* spacing-2 */
```
#### 리스트
```css
/* List Item */
padding: 16px; /* spacing-4 */
gap: 12px; /* 내부 요소 간격 */
/* List */
gap: 8px; /* 항목 간격 */
```
### 5.4 레이아웃 간격
#### 페이지 여백
```css
/* Mobile */
padding: 16px; /* spacing-4 */
/* Tablet */
padding: 24px; /* spacing-6 */
/* Desktop */
padding: 32px; /* spacing-8 */
```
#### 섹션 간격
```css
/* 같은 그룹 내 섹션 */
margin-bottom: 24px; /* spacing-6 */
/* 다른 그룹 간 섹션 */
margin-bottom: 48px; /* spacing-12 */
```
---
## 6. 컴포넌트 스타일
### 6.1 버튼 (Buttons)
#### Primary Button
**주요 액션 (회의 시작, 저장, 공유 등)**
```css
background: Primary 500 (#2196F3);
color: White;
padding: 12px 24px;
border-radius: 8px;
font-weight: 600;
font-size: 16px;
box-shadow: 0 2px 4px rgba(0,0,0,0.1);
/* Hover */
background: Primary 600 (#1E88E5);
box-shadow: 0 4px 8px rgba(0,0,0,0.15);
/* Active */
background: Primary 700 (#1976D2);
transform: scale(0.98);
/* Disabled */
background: Gray 200 (#EEEEEE);
color: Gray 400 (#BDBDBD);
cursor: not-allowed;
```
#### Secondary Button
**보조 액션 (취소, 건너뛰기 등)**
```css
background: White;
color: Primary 500;
border: 1px solid Primary 500;
padding: 12px 24px;
border-radius: 8px;
/* Hover */
background: Primary 50 (#E3F2FD);
border-color: Primary 600;
```
#### Text Button
**경량 액션 (더보기, 닫기 등)**
```css
background: transparent;
color: Primary 500;
padding: 8px 16px;
/* Hover */
background: Primary 50;
```
#### Icon Button
**아이콘만 있는 버튼**
```css
width: 44px;
height: 44px; /* 터치 영역 확보 */
border-radius: 50%;
display: flex;
align-items: center;
justify-content: center;
/* Hover */
background: Gray 100;
```
#### Floating Action Button (FAB)
**화면 고정 액션 버튼**
```css
position: fixed;
bottom: 24px;
right: 24px;
width: 56px;
height: 56px;
border-radius: 50%;
background: Primary 500;
box-shadow: 0 4px 12px rgba(33, 150, 243, 0.4);
z-index: 100;
/* Hover */
transform: scale(1.1);
box-shadow: 0 6px 16px rgba(33, 150, 243, 0.5);
```
### 6.2 입력 필드 (Input Fields)
#### Text Input
```css
border: 1px solid Gray 300;
border-radius: 8px;
padding: 12px 16px;
font-size: 16px; /* iOS 확대 방지 */
background: White;
transition: border-color 0.2s;
/* Focus */
border-color: Primary 500;
outline: 2px solid Primary 100;
/* Error */
border-color: Error (#F44336);
outline: 2px solid rgba(244, 67, 54, 0.1);
/* Disabled */
background: Gray 100;
color: Gray 400;
cursor: not-allowed;
```
#### Textarea
```css
/* Text Input 속성 + */
min-height: 100px;
resize: vertical;
```
#### Select / Dropdown
```css
/* Text Input 속성 + */
appearance: none;
background-image: url('chevron-down-icon.svg');
background-repeat: no-repeat;
background-position: right 12px center;
padding-right: 40px;
```
#### Checkbox
```css
width: 20px;
height: 20px;
border: 2px solid Gray 400;
border-radius: 4px;
cursor: pointer;
/* Checked */
background: Primary 500;
border-color: Primary 500;
/* Checkmark icon */
```
#### Radio Button
```css
width: 20px;
height: 20px;
border: 2px solid Gray 400;
border-radius: 50%;
/* Selected */
border-color: Primary 500;
/* Inner dot */
background: radial-gradient(Primary 500 40%, transparent 40%);
```
#### Toggle Switch
```css
width: 48px;
height: 24px;
border-radius: 12px;
background: Gray 300;
position: relative;
/* Circle */
width: 20px;
height: 20px;
border-radius: 50%;
background: White;
position: absolute;
left: 2px;
transition: left 0.2s;
/* On State */
background: Primary 500;
/* Circle moves right */
left: 26px;
```
### 6.3 카드 (Cards)
#### Standard Card
```css
background: White;
border-radius: 12px;
padding: 24px;
box-shadow: 0 1px 3px rgba(0,0,0,0.1);
transition: box-shadow 0.2s;
/* Hover (클릭 가능한 경우) */
box-shadow: 0 4px 12px rgba(0,0,0,0.15);
cursor: pointer;
```
#### Todo Card
```css
/* Standard Card + */
border-left: 4px solid transparent;
/* 완료 */
border-left-color: Success (#4CAF50);
opacity: 0.7;
/* 마감 임박 */
border-left-color: Warning (#FF9800);
/* 지연 */
border-left-color: Error (#F44336);
```
#### Meeting Card
```css
/* Standard Card + */
gap: 12px;
display: flex;
flex-direction: column;
```
### 6.4 배지 (Badges)
#### Status Badge
```css
padding: 4px 12px;
border-radius: 12px;
font-size: 12px;
font-weight: 500;
display: inline-flex;
align-items: center;
gap: 4px;
/* 작성중 */
background: Warning 50;
color: Warning 700;
/* 확정완료 */
background: Success 50;
color: Success 700;
/* 검증완료 */
background: Primary 50;
color: Primary 700;
```
#### Count Badge
```css
min-width: 20px;
height: 20px;
padding: 0 6px;
background: Error (#F44336);
color: White;
border-radius: 10px;
font-size: 11px;
font-weight: 600;
display: flex;
align-items: center;
justify-content: center;
```
### 6.5 모달 (Modals)
#### Modal Overlay
```css
position: fixed;
top: 0;
left: 0;
right: 0;
bottom: 0;
background: rgba(0, 0, 0, 0.5);
z-index: 1000;
display: flex;
align-items: center;
justify-content: center;
```
#### Modal Container
```css
background: White;
border-radius: 16px;
max-width: 500px;
width: calc(100% - 32px);
max-height: 90vh;
overflow-y: auto;
box-shadow: 0 20px 60px rgba(0,0,0,0.3);
/* Mobile: Full Screen */
@media (max-width: 767px) {
width: 100%;
height: 100%;
max-height: 100vh;
border-radius: 0;
}
```
### 6.6 알림 (Toast / Snackbar)
```css
position: fixed;
bottom: 24px;
left: 50%;
transform: translateX(-50%);
background: Gray 800;
color: White;
padding: 12px 24px;
border-radius: 8px;
box-shadow: 0 4px 12px rgba(0,0,0,0.3);
z-index: 2000;
animation: slideUp 0.3s ease-out;
/* Success */
background: Success (#4CAF50);
/* Error */
background: Error (#F44336);
/* Warning */
background: Warning (#FF9800);
```
---
## 7. 반응형 브레이크포인트
### 7.1 브레이크포인트 정의
```css
/* Mobile Small */
@media (min-width: 320px) { /* ... */ }
/* Mobile */
@media (min-width: 375px) { /* ... */ }
/* Mobile Large */
@media (min-width: 425px) { /* ... */ }
/* Tablet */
@media (min-width: 768px) { /* ... */ }
/* Desktop */
@media (min-width: 1024px) { /* ... */ }
/* Desktop Large */
@media (min-width: 1440px) { /* ... */ }
```
### 7.2 디바이스별 최적화
#### Mobile (320px~767px)
- **레이아웃**: 단일 컬럼
- **네비게이션**: 하단 탭 바
- **터치 영역**: 최소 44x44px
- **폰트**: 기본 스케일
- **간격**: 16px 페이지 여백
#### Tablet (768px~1023px)
- **레이아웃**: 2컬럼 (일부 화면)
- **네비게이션**: 좌측 사이드바 (선택)
- **폰트**: 기본 스케일
- **간격**: 24px 페이지 여백
#### Desktop (1024px+)
- **레이아웃**: 2-3컬럼
- **네비게이션**: 좌측 고정 사이드바
- **폰트**: 확대 스케일
- **간격**: 32px 페이지 여백
- **추가 기능**: 단축키, 고급 필터
---
## 8. 서비스 특화 컴포넌트
### 8.1 실시간 발언 표시기
**회의 진행 중 현재 발언자와 텍스트 표시**
```css
.live-speech {
background: Accent 50 (#F3E5F5);
border-left: 4px solid Accent 500 (#9C27B0);
padding: 16px;
border-radius: 8px;
position: sticky;
top: 0;
z-index: 10;
}
.speaker-name {
font-weight: 600;
color: Accent 700;
display: flex;
align-items: center;
gap: 8px;
}
.speaking-indicator {
width: 8px;
height: 8px;
background: Error (#F44336);
border-radius: 50%;
animation: pulse 1.5s infinite;
}
@keyframes pulse {
0%, 100% { opacity: 1; }
50% { opacity: 0.5; }
}
.speech-text {
color: Gray 800;
font-size: 14px;
line-height: 1.5;
margin-top: 8px;
}
```
### 8.2 전문용어 하이라이트
**AI가 감지한 전문용어 표시**
```css
.term-highlight {
background: linear-gradient(180deg, transparent 60%, Accent 200 60%);
cursor: pointer;
position: relative;
border-bottom: 1px dotted Accent 500;
transition: background 0.2s;
}
.term-highlight:hover {
background: Accent 100;
}
/* 툴팁 */
.term-tooltip {
position: absolute;
bottom: 100%;
left: 50%;
transform: translateX(-50%);
background: Gray 900;
color: White;
padding: 12px 16px;
border-radius: 8px;
font-size: 13px;
width: 250px;
box-shadow: 0 4px 12px rgba(0,0,0,0.3);
z-index: 100;
}
```
### 8.3 검증 완료 섹션
**섹션별 검증 상태 표시**
```css
.section-verified {
border: 2px solid Success (#4CAF50);
border-radius: 8px;
padding: 24px;
position: relative;
}
.verified-badge {
position: absolute;
top: -12px;
right: 16px;
background: Success;
color: White;
padding: 4px 12px;
border-radius: 12px;
font-size: 12px;
font-weight: 600;
display: flex;
align-items: center;
gap: 4px;
}
/* 검증자 아바타 */
.verifier-avatars {
display: flex;
margin-top: 12px;
}
.verifier-avatar {
width: 28px;
height: 28px;
border-radius: 50%;
border: 2px solid White;
margin-left: -8px;
}
.verifier-avatar:first-child {
margin-left: 0;
}
```
### 8.4 실시간 동기화 인디케이터
**다른 사용자의 수정 사항 표시**
```css
.sync-indicator {
position: fixed;
top: 80px;
right: 16px;
display: flex;
align-items: center;
gap: 8px;
padding: 8px 16px;
background: White;
border-radius: 20px;
box-shadow: 0 2px 8px rgba(0,0,0,0.1);
z-index: 50;
}
.sync-dot {
width: 8px;
height: 8px;
background: Success;
border-radius: 50%;
}
/* 동기화 중 */
.sync-dot.syncing {
animation: blink 1s infinite;
}
@keyframes blink {
0%, 100% { opacity: 1; }
50% { opacity: 0.3; }
}
/* 다른 사용자 편집 중 */
.editing-highlight {
background: rgba(255, 152, 0, 0.1);
border-left: 3px solid Warning (#FF9800);
animation: fadeHighlight 3s ease-out;
}
@keyframes fadeHighlight {
0% { opacity: 1; }
100% { opacity: 0; }
}
```
### 8.5 AI 처리 인디케이터
**AI가 처리 중임을 표시**
```css
.ai-processing {
display: flex;
align-items: center;
gap: 8px;
padding: 12px 16px;
background: Accent 50;
border-radius: 8px;
border-left: 4px solid Accent 500;
}
.ai-icon {
width: 20px;
height: 20px;
animation: rotate 2s linear infinite;
}
@keyframes rotate {
from { transform: rotate(0deg); }
to { transform: rotate(360deg); }
}
.ai-text {
color: Accent 700;
font-size: 13px;
font-weight: 500;
}
/* 신뢰도 표시 */
.confidence-indicator {
display: flex;
gap: 4px;
margin-top: 4px;
}
.confidence-bar {
height: 4px;
width: 40px;
background: Gray 200;
border-radius: 2px;
overflow: hidden;
}
.confidence-fill {
height: 100%;
background: Success;
transition: width 0.3s;
}
/* 높음: 80%+ = Success */
/* 보통: 60-80% = Warning */
/* 낮음: <60% = Error */
```
### 8.6 Todo 진행 상태 카드
**Todo 완료 상태 시각화**
```css
.todo-progress-card {
background: White;
border-radius: 12px;
padding: 20px;
box-shadow: 0 1px 3px rgba(0,0,0,0.1);
}
/* 원형 진행 바 */
.circular-progress {
width: 100px;
height: 100px;
border-radius: 50%;
background: conic-gradient(
Primary 500 var(--progress-percent),
Gray 200 var(--progress-percent)
);
display: flex;
align-items: center;
justify-content: center;
position: relative;
}
.progress-inner {
width: 80px;
height: 80px;
background: White;
border-radius: 50%;
display: flex;
align-items: center;
justify-content: center;
flex-direction: column;
}
.progress-percent {
font-size: 24px;
font-weight: 700;
color: Primary 500;
}
.progress-label {
font-size: 12px;
color: Gray 600;
}
```
---
## 9. 인터랙션 패턴
### 9.1 터치 인터랙션 (Mobile)
#### 기본 터치 영역
```css
/* 최소 터치 영역: 44x44px */
min-width: 44px;
min-height: 44px;
```
#### 스와이프 액션
**리스트 항목 스와이프로 빠른 액션**
- **좌→우 스와이프**: 완료 처리 (Todo)
- **우→좌 스와이프**: 삭제/편집 메뉴 표시
```css
.swipe-action {
position: absolute;
right: 0;
top: 0;
bottom: 0;
display: flex;
transform: translateX(100%);
transition: transform 0.3s;
}
.swiped .swipe-action {
transform: translateX(0);
}
.swipe-button {
width: 80px;
display: flex;
align-items: center;
justify-content: center;
}
.swipe-button.delete {
background: Error (#F44336);
}
.swipe-button.edit {
background: Primary 500;
}
```
#### Pull to Refresh
**화면 당겨서 새로고침**
```css
.pull-refresh-indicator {
position: absolute;
top: -60px;
left: 50%;
transform: translateX(-50%);
display: flex;
align-items: center;
gap: 8px;
transition: top 0.3s;
}
.pulling .pull-refresh-indicator {
top: 20px;
}
.refresh-icon {
animation: rotate 1s linear infinite;
}
```
### 9.2 키보드 인터랙션 (Desktop)
#### 포커스 표시
```css
*:focus {
outline: 2px solid Primary 500;
outline-offset: 2px;
}
/* 마우스 클릭 시 포커스 숨김 */
*:focus:not(:focus-visible) {
outline: none;
}
```
#### 단축키 안내
```css
.keyboard-hint {
position: fixed;
bottom: 16px;
right: 16px;
background: Gray 800;
color: White;
padding: 8px 12px;
border-radius: 6px;
font-size: 12px;
opacity: 0.8;
}
.kbd {
background: Gray 700;
padding: 2px 6px;
border-radius: 4px;
font-family: monospace;
font-size: 11px;
border: 1px solid Gray 600;
}
```
**주요 단축키:**
- `Ctrl/Cmd + S`: 저장
- `Ctrl/Cmd + K`: 검색
- `Esc`: 모달 닫기
- `Tab`: 다음 요소
- `Shift + Tab`: 이전 요소
- `Enter`: 확인/실행
### 9.3 로딩 상태
#### Spinner
```css
.spinner {
width: 40px;
height: 40px;
border: 4px solid Gray 200;
border-top-color: Primary 500;
border-radius: 50%;
animation: spin 1s linear infinite;
}
@keyframes spin {
to { transform: rotate(360deg); }
}
```
#### Skeleton UI
```css
.skeleton {
background: linear-gradient(
90deg,
Gray 200 0%,
Gray 100 50%,
Gray 200 100%
);
background-size: 200% 100%;
animation: loading 1.5s infinite;
border-radius: 4px;
}
@keyframes loading {
0% { background-position: 200% 0; }
100% { background-position: -200% 0; }
}
.skeleton-text {
height: 16px;
margin-bottom: 8px;
}
.skeleton-title {
height: 24px;
width: 60%;
margin-bottom: 12px;
}
.skeleton-avatar {
width: 40px;
height: 40px;
border-radius: 50%;
}
```
#### Progress Bar
```css
.progress-bar {
width: 100%;
height: 4px;
background: Gray 200;
border-radius: 2px;
overflow: hidden;
}
.progress-fill {
height: 100%;
background: Primary 500;
transition: width 0.3s;
}
/* Indeterminate (불명확한 진행) */
.progress-fill.indeterminate {
width: 30%;
animation: indeterminate 1.5s infinite;
}
@keyframes indeterminate {
0% { transform: translateX(-100%); }
100% { transform: translateX(400%); }
}
```
### 9.4 실시간 협업 피드백
#### 사용자 커서 표시
```css
.user-cursor {
position: absolute;
pointer-events: none;
z-index: 999;
}
.cursor-flag {
background: var(--user-color);
color: White;
padding: 2px 6px;
border-radius: 4px;
font-size: 11px;
white-space: nowrap;
transform: translate(-50%, -100%);
margin-top: -4px;
}
.cursor-pointer {
width: 0;
height: 0;
border-left: 6px solid transparent;
border-right: 6px solid transparent;
border-top: 8px solid var(--user-color);
}
```
#### 편집 중 표시
```css
.editing-user {
background: rgba(var(--user-color-rgb), 0.1);
border-left: 3px solid var(--user-color);
padding-left: 12px;
}
.editing-badge {
display: inline-flex;
align-items: center;
gap: 4px;
background: var(--user-color);
color: White;
padding: 2px 8px;
border-radius: 10px;
font-size: 11px;
font-weight: 500;
}
```
---
## 10. 아이콘 시스템
### 10.1 아이콘 스타일
**아이콘 세트**: Material Icons (Outlined)
**스타일 가이드:**
- **스타일**: Outlined (선 스타일)
- **일관성**: 동일한 두께(2px), 동일한 라운딩
- **크기**: 20px (Small), 24px (Default), 32px (Large)
### 10.2 주요 아이콘 매핑
| 기능 | 아이콘 이름 | 사용 위치 |
|------|------------|----------|
| 회의 시작 | `play_circle` | 회의 시작 버튼 |
| 회의 종료 | `stop_circle` | 회의 종료 버튼 |
| 녹음 | `mic` | 녹음 상태 표시 |
| 일시정지 | `pause_circle` | 녹음 일시정지 |
| 저장 | `save` | 저장 버튼 |
| 공유 | `share` | 공유 버튼 |
| 편집 | `edit` | 수정 버튼 |
| 삭제 | `delete` | 삭제 버튼 |
| 검색 | `search` | 검색 입력 |
| 필터 | `filter_list` | 필터 메뉴 |
| 설정 | `settings` | 설정 메뉴 |
| 알림 | `notifications` | 알림 아이콘 |
| 프로필 | `account_circle` | 사용자 프로필 |
| 캘린더 | `calendar_today` | 날짜 선택 |
| 시간 | `schedule` | 시간 선택 |
| 첨부파일 | `attach_file` | 파일 첨부 |
| 다운로드 | `download` | 파일 다운로드 |
| 체크 | `check_circle` | 완료, 검증 |
| 경고 | `warning` | 경고 메시지 |
| 오류 | `error` | 오류 메시지 |
| 정보 | `info` | 정보 메시지 |
| AI | `auto_awesome` | AI 기능 |
| Todo | `check_box` | Todo 항목 |
| 참석자 | `group` | 참석자 목록 |
| 더보기 | `more_vert` | 메뉴 |
| 뒤로가기 | `arrow_back` | 이전 화면 |
| 닫기 | `close` | 모달 닫기 |
| 펼치기 | `expand_more` | 아코디언 열기 |
| 접기 | `expand_less` | 아코디언 닫기 |
### 10.3 아이콘 색상
```css
/* Default */
color: Gray 600 (#757575);
/* Active/Selected */
color: Primary 500 (#2196F3);
/* Disabled */
color: Gray 400 (#BDBDBD);
/* On Color Background */
color: White;
/* Semantic */
.icon-success { color: Success (#4CAF50); }
.icon-warning { color: Warning (#FF9800); }
.icon-error { color: Error (#F44336); }
.icon-ai { color: Accent 500 (#9C27B0); }
```
---
## 11. 애니메이션 가이드
### 11.1 애니메이션 원칙
- **목적성**: 모든 애니메이션은 명확한 목적이 있어야 함
- **자연스러움**: 현실 세계의 물리 법칙을 따름
- **적절한 속도**: 너무 빠르거나 느리지 않게
- **성능**: CSS 애니메이션 우선, GPU 가속 활용
### 11.2 이징 (Easing)
```css
/* 표준 Easing */
--ease-in-out: cubic-bezier(0.4, 0, 0.2, 1); /* Material Design */
--ease-out: cubic-bezier(0.0, 0, 0.2, 1);
--ease-in: cubic-bezier(0.4, 0, 1, 1);
/* 탄성 (Elastic) */
--ease-elastic: cubic-bezier(0.68, -0.55, 0.265, 1.55);
```
### 11.3 지속 시간 (Duration)
| 용도 | 지속 시간 | 예시 |
|------|----------|------|
| **Instant** | 0ms | 즉시 변경 |
| **Quick** | 100ms | 호버 효과, 색상 변경 |
| **Normal** | 200-300ms | 모달 열기, 탭 전환 |
| **Slow** | 400-500ms | 페이지 전환, 복잡한 애니메이션 |
### 11.4 애니메이션 라이브러리
#### 페이드 인
```css
@keyframes fadeIn {
from {
opacity: 0;
}
to {
opacity: 1;
}
}
.fade-in {
animation: fadeIn 0.3s var(--ease-out);
}
```
#### 슬라이드 업
```css
@keyframes slideUp {
from {
transform: translateY(20px);
opacity: 0;
}
to {
transform: translateY(0);
opacity: 1;
}
}
.slide-up {
animation: slideUp 0.3s var(--ease-out);
}
```
#### 스케일
```css
@keyframes scaleIn {
from {
transform: scale(0.9);
opacity: 0;
}
to {
transform: scale(1);
opacity: 1;
}
}
.scale-in {
animation: scaleIn 0.2s var(--ease-out);
}
```
#### 쉐이크 (오류 시)
```css
@keyframes shake {
0%, 100% { transform: translateX(0); }
10%, 30%, 50%, 70%, 90% { transform: translateX(-5px); }
20%, 40%, 60%, 80% { transform: translateX(5px); }
}
.shake {
animation: shake 0.5s var(--ease-in-out);
}
```
### 11.5 성능 최적화
**GPU 가속 속성만 사용:**
-`transform` (translate, scale, rotate)
-`opacity`
-`left`, `top` (리플로우 발생)
-`width`, `height` (리플로우 발생)
**will-change 활용:**
```css
.will-animate {
will-change: transform, opacity;
}
/* 애니메이션 완료 후 제거 */
.animated {
will-change: auto;
}
```
---
## 12. 상태 표시
### 12.1 회의록 상태
| 상태 | 색상 | 배지 텍스트 | 설명 |
|------|------|-----------|------|
| **작성중** | Warning | `작성중` | 회의 진행 중 또는 수정 중 |
| **확정완료** | Success | `확정완료` | 최종 확정된 회의록 |
| **공유됨** | Primary | `공유됨` | 참석자에게 공유됨 |
### 12.2 Todo 상태
| 상태 | 색상 | 표시 | 설명 |
|------|------|------|------|
| **진행중** | Gray | `○` | 할당되었으나 미완료 |
| **완료** | Success | `✓` | 완료 처리됨 |
| **마감 임박** | Warning | `⚠` | 3일 이내 마감 |
| **지연** | Error | `!` | 마감일 경과 |
### 12.3 검증 상태
| 상태 | 표시 | 설명 |
|------|------|------|
| **미검증** | 빈 원 | 아직 검증되지 않음 |
| **검증 중** | 부분 체크 | 일부 참석자 검증 |
| **검증 완료** | 체크 아이콘 + 배지 | 모든 참석자 검증 |
| **잠김** | 자물쇠 아이콘 | 수정 불가 |
### 12.4 동기화 상태
| 상태 | 표시 | 설명 |
|------|------|------|
| **동기화됨** | 녹색 점 | 최신 상태 |
| **동기화 중** | 깜빡이는 점 | 서버와 동기화 중 |
| **오프라인** | 회색 점 | 네트워크 끊김 (로컬 저장) |
| **충돌** | 빨간색 느낌표 | 동시 수정 충돌 |
### 12.5 AI 처리 상태
| 상태 | 표시 | 설명 |
|------|------|------|
| **처리 중** | 회전 아이콘 | AI 분석 중 |
| **완료** | 체크 아이콘 | 처리 완료 |
| **오류** | 오류 아이콘 | 처리 실패 |
| **신뢰도 높음** | 3개 바 녹색 | 80% 이상 |
| **신뢰도 보통** | 2개 바 노란색 | 60-80% |
| **신뢰도 낮음** | 1개 바 빨간색 | 60% 미만 |
---
## 13. 접근성 표준
### 13.1 WCAG 2.1 Level AA 준수
#### Perceivable (인식 가능)
- ✅ 모든 이미지에 대체 텍스트 제공
- ✅ 색상 대비 4.5:1 이상 (일반 텍스트)
- ✅ 색상 대비 3:1 이상 (대형 텍스트, UI 컴포넌트)
- ✅ 텍스트 200% 확대 시 레이아웃 유지
- ✅ 색상만으로 정보 전달 금지
#### Operable (조작 가능)
- ✅ 모든 기능 키보드로 접근 가능
- ✅ 포커스 순서 논리적
- ✅ 포커스 표시 명확 (2px 파란색 테두리)
- ✅ 터치 영역 최소 44x44px
- ✅ 시간 제한 없음 (자동 저장)
#### Understandable (이해 가능)
- ✅ 명확한 레이블 및 안내
- ✅ 오류 메시지 구체적
- ✅ 일관된 네비게이션
- ✅ 예측 가능한 동작
#### Robust (견고함)
- ✅ 시맨틱 HTML 사용
- ✅ ARIA 속성 적절히 사용
- ✅ 최신 브라우저 및 보조 기술 지원
### 13.2 ARIA 속성 가이드
#### 랜드마크
```html
<header role="banner"></header>
<nav role="navigation" aria-label="주요 메뉴"></nav>
<main role="main"></main>
<aside role="complementary"></aside>
<footer role="contentinfo"></footer>
```
#### 버튼 및 링크
```html
<!-- 아이콘 버튼 -->
<button aria-label="검색">
<icon>search</icon>
</button>
<!-- 외부 링크 -->
<a href="..." target="_blank" aria-label="새 창에서 열기">
링크 텍스트
<icon aria-hidden="true">open_in_new</icon>
</a>
```
#### 폼
```html
<label for="meeting-title">회의 제목 (필수)</label>
<input
id="meeting-title"
type="text"
required
aria-required="true"
aria-invalid="false"
aria-describedby="title-error"
/>
<span id="title-error" role="alert" aria-live="assertive">
<!-- 오류 메시지 -->
</span>
```
#### 모달
```html
<div
role="dialog"
aria-modal="true"
aria-labelledby="modal-title"
aria-describedby="modal-description"
>
<h2 id="modal-title">모달 제목</h2>
<p id="modal-description">모달 설명</p>
</div>
```
#### 실시간 업데이트
```html
<!-- 중요한 업데이트 (즉시 알림) -->
<div role="alert" aria-live="assertive">
회의록이 저장되었습니다.
</div>
<!-- 일반 업데이트 (현재 작업 완료 후 알림) -->
<div role="status" aria-live="polite">
3명이 편집 중입니다.
</div>
<!-- 화면만 업데이트 (알림 X) -->
<div aria-live="off">
<!-- 내용 -->
</div>
```
### 13.3 스크린 리더 테스트
**주요 테스트 도구:**
- **NVDA** (Windows, 무료)
- **JAWS** (Windows, 유료)
- **VoiceOver** (macOS/iOS, 내장)
- **TalkBack** (Android, 내장)
**테스트 체크리스트:**
- [ ] 모든 이미지에 적절한 alt 텍스트
- [ ] 모든 폼 필드에 레이블 연결
- [ ] 버튼 및 링크 용도 명확
- [ ] 모달 열림/닫힘 알림
- [ ] 오류 메시지 즉시 알림
- [ ] 실시간 업데이트 알림
- [ ] 키보드만으로 전체 기능 사용 가능
---
## 14. 변경 이력
| 버전 | 날짜 | 작성자 | 변경 내용 |
|------|------|--------|----------|
| 1.0 | 2025-10-21 | 이미준 | 최초 작성 - 14개 섹션 완료 |
---
## 부록
### A. 개발 참고 자료
#### CSS 변수 정의
```css
:root {
/* Primary Colors */
--primary-50: #E3F2FD;
--primary-500: #2196F3;
--primary-700: #1976D2;
/* Secondary Colors */
--secondary-500: #4CAF50;
--accent-500: #9C27B0;
/* Semantic Colors */
--success: #4CAF50;
--warning: #FF9800;
--error: #F44336;
--info: #2196F3;
/* Neutral Colors */
--gray-50: #FAFAFA;
--gray-800: #424242;
--gray-900: #212121;
/* Spacing */
--spacing-2: 8px;
--spacing-4: 16px;
--spacing-6: 24px;
/* Typography */
--font-primary: 'Pretendard', sans-serif;
--font-secondary: 'Inter', sans-serif;
/* Border Radius */
--radius-sm: 4px;
--radius-md: 8px;
--radius-lg: 12px;
--radius-full: 9999px;
/* Shadows */
--shadow-sm: 0 1px 3px rgba(0,0,0,0.1);
--shadow-md: 0 4px 12px rgba(0,0,0,0.15);
--shadow-lg: 0 20px 60px rgba(0,0,0,0.3);
/* Transitions */
--transition-fast: 0.1s;
--transition-normal: 0.2s;
--transition-slow: 0.3s;
}
```
### B. 디자인 도구
**권장 도구:**
- **Figma**: UI 디자인 및 프로토타입
- **Material Icons**: 아이콘 세트
- **Coolors**: 색상 팔레트 생성
- **WebAIM Contrast Checker**: 색상 대비 검사
### C. 품질 검사 도구
**접근성:**
- Lighthouse (Chrome DevTools)
- axe DevTools
- WAVE Browser Extension
**성능:**
- WebPageTest
- Chrome DevTools Performance
- React DevTools Profiler
### D. 참고 문헌
- Material Design 3 Guidelines
- Apple Human Interface Guidelines
- WCAG 2.1 Level AA
- Mobile First Design - Luke Wroblewski
- Inclusive Components - Heydon Pickering