mirror of
https://github.com/hwanny1128/HGZero.git
synced 2025-12-06 18:26:23 +00:00
- 프로토타입 파일 추가 (design/uiux/prototype/) - 스타일 가이드 백업 파일 추가 (design/uiux/style-guide_bk.md) - Claude 설정 파일 업데이트 (.claude/settings.local.json) 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
1768 lines
38 KiB
Markdown
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
|