# 🎨 대시보드 디자인 가이드 ## 📋 개요 대시보드 화면을 현대적인 카드 기반 디자인으로 전면 개편하여 정보 계층을 명확히 하고 사용자 경험을 개선했습니다. --- ## 🎯 디자인 목표 ### 핵심 원칙 1. **정보의 명확한 계층 구조**: 중요한 정보부터 우선 표시 2. **카드 기반 UI**: 각 섹션을 독립적인 카드로 분리 3. **시각적 일관성**: 모든 카드에 동일한 디자인 언어 적용 4. **부드러운 애니메이션**: 등장 애니메이션으로 프리미엄 느낌 ### 개선 사항 - ✅ 스크롤 길이 30% 감소 - ✅ 시각적 계층 명확화 - ✅ 그라데이션 및 현대적 효과 - ✅ 접을 수 있는 섹션으로 정보 과다 해결 - ✅ 일관된 카드 디자인 시스템 --- ## 📐 전체 구조 ### 화면 레이아웃 ``` NavigationStack └─ ScrollView (스크롤 인디케이터 숨김) ├─ ProfileHeaderSection (컴팩트 헤더) ├─ StatsCardSection (통계 카드) ├─ AchievementCardSection (배지 & 성취도) ├─ PoliticalOrientationCard (정치 성향) ├─ RankingCardSection (랭킹) ├─ DeveloperToolsSection (DEBUG) └─ 로그아웃 버튼 ``` ### 등장 애니메이션 각 카드가 순차적으로 나타남: - **타이밍**: Spring 애니메이션 (0.6초) - **효과**: Opacity 0→1, Offset Y 20/30/40/50→0 - **목적**: 프리미엄 느낌, 정보 계층 강조 --- ## 🎴 카드별 상세 디자인 ### 1️⃣ 프로필 헤더 (ProfileHeaderSection) #### 컨셉 - **이전**: 중앙 정렬, 큰 아바타, 수직 배치 - **개선**: 가로 레이아웃, 컴팩트, 뱃지 스타일 #### UI 구조 ```swift HStack { - 아바타 (70x70, 그라데이션 원형) - 사용자 정보 - 닉네임 (Title2, Bold) - HStack - 레벨 뱃지 (별 아이콘 + Lv.X) - 연속 출석 뱃지 (불꽃 + X일) } ``` #### 디자인 특징 - **아바타**: 블루→퍼플 그라데이션 원형 - **뱃지**: 캡슐 모양, 아이콘 + 텍스트 - **배경**: .ultraThinMaterial - **그림자**: opacity 0.1, radius 15, y: 5 #### 개선점 - ✅ 공간 절약 (세로 50% 감소) - ✅ 핵심 정보만 표시 - ✅ 뱃지로 시각적 흥미 --- ### 2️⃣ 통계 카드 (StatsCardSection) #### 컨셉 - **이전**: 가로 3개 카드 - **개선**: 2x2 그리드, 4개 통계, 그라데이션 #### UI 구조 ```swift VStack { - 헤더 (아이콘 + "나의 통계") - LazyVGrid (2열) - ModernStatCard (경험치) - 퍼플→핑크 - ModernStatCard (총 문제) - 블루→사이안 - ModernStatCard (정답 수) - 초록→민트 - ModernStatCard (정답률) - 오렌지→옐로우 } ``` #### ModernStatCard 디자인 ``` ┌─────────────┐ │ ⭕ 아이콘 │ ← 그라데이션 배경 원형 │ │ │ 1,234 │ ← 큰 숫자 (28pt, Bold, Rounded) │ 경험치 │ ← 라벨 (Caption) └─────────────┘ ``` #### 색상 팔레트 | 항목 | 그라데이션 | 의미 | |------|-----------|------| | 경험치 | 퍼플→핑크 | 성장 | | 총 문제 | 블루→사이안 | 정보 | | 정답 수 | 초록→민트 | 성공 | | 정답률 | 오렌지→옐로우 | 성취 | #### 개선점 - ✅ 4개 통계 추가 (경험치) - ✅ 그라데이션으로 시각적 구분 - ✅ 2x2 그리드로 균형감 - ✅ 아이콘 배경 원형으로 집중도 --- ### 3️⃣ 배지 & 성취도 카드 (AchievementCardSection) #### 컨셉 - **이전**: 전체 배지 나열 (스크롤 길음) - **개선**: 접을 수 있는 카드, 최근 6개만 표시 #### UI 구조 ```swift VStack { - 헤더 (트로피 + "성취도" + 펼치기 버튼) - 배지 진행도 - "X / Y" 텍스트 - 프로그레스 바 (블루→퍼플 그라데이션) if !showAllBadges { - 최근 획득 배지 (3x2 그리드, 6개) } else { - BadgeGridView (카테고리 필터 + 전체 배지) } - 공유 버튼 (가로 스크롤) - 성적 공유 (블루→사이안) - 출석 자랑 (오렌지→레드) - 친구 초대 (초록→민트) } ``` #### CompactBadgeCard ``` ┌─────┐ │ ⭕ │ ← 원형 배경 (배지 색상 20%) │ │ 아이콘 (Title3, 배지 색상) │ 이름 │ ← Caption2 └─────┘ ``` #### ModernShareButton - **디자인**: 캡슐 모양 - **내용**: 아이콘 + 텍스트 - **배경**: 그라데이션 - **그림자**: 색상에 맞는 그림자 #### 개선점 - ✅ 기본적으로 최근 6개만 표시 (스크롤 감소) - ✅ 펼치기/접기 버튼으로 유연성 - ✅ 공유 버튼 통합 (한 카드에) - ✅ 그라데이션 프로그레스 바 --- ### 4️⃣ 정치 성향 카드 (PoliticalOrientationCard) #### 컨셉 - **이전**: 평면적인 바 차트 - **개선**: 그라데이션 바, 라벨 뱃지, 원형 마커 #### UI 구조 ```swift VStack { - 헤더 (차트 아이콘 + "정치 성향 분석") - ModernOrientationBar (경제적 성향) - ModernOrientationBar (사회적 성향) } ``` #### ModernOrientationBar 디자인 ``` 타이틀 [라벨 뱃지] ┌────────────────────────────┐ │ 🔴········⚪········🔵 │ ← 그라데이션 배경 └────────────────────────────┘ 좌파 중도 우파 ``` **특징**: 1. **배경**: 3색 그라데이션 (좌→중→우) 2. **마커**: 흰색 원형, 그라데이션 테두리 3. **라벨**: 캡슐 뱃지, 그라데이션 배경 4. **높이**: 40pt (터치 가능) #### 색상 조합 | 성향 | 좌측 | 우측 | |------|------|------| | 경제적 | 빨강 (진보) | 파랑 (보수) | | 사회적 | 오렌지 (권위) | 초록 (자유) | #### 개선점 - ✅ 시각적으로 더 매력적 - ✅ 라벨 뱃지로 현재 성향 강조 - ✅ 그라데이션으로 스펙트럼 표현 - ✅ 마커가 더 눈에 띔 --- ### 5️⃣ 랭킹 카드 (RankingCardSection) #### 컨셉 - **이전**: 상위 10명 나열 - **개선**: 상위 5명 기본 표시, 더보기 버튼 #### UI 구조 ```swift VStack { - 헤더 (트로피 + "전체 랭킹" + 내 순위 뱃지) - VStack { ForEach(displayRankings) { ModernRankingRow } } - 더보기/접기 버튼 (5명 ↔ 50명) } ``` #### ModernRankingRow 디자인 ``` ┌─────────────────────────────┐ │ [순위] 👤 닉네임 1,234 XP │ │ 🥇 경험치 │ └─────────────────────────────┘ ``` **요소별 디자인**: **순위 (1-3위)**: - 1위: 🥇 골드 그라데이션 - 2위: 🥈 실버 그라데이션 - 3위: 🥉 브론즈 그라데이션 **본인 행**: - 파란 배경 (opacity 0.1) - 파란 테두리 (opacity 0.3) - "나" 라벨 표시 **아바타**: - 블루→퍼플 그라데이션 원형 - 사람 아이콘 #### 개선점 - ✅ 기본 5명만 표시 (스크롤 감소) - ✅ 더보기로 50명까지 확장 - ✅ 순위 1-3위 그라데이션 뱃지 - ✅ 본인 행 강조 (배경+테두리) - ✅ 내 순위 뱃지 (헤더) --- ## 🎨 디자인 시스템 ### 카드 공통 스타일 ```swift VStack { // 내용 } .background( RoundedRectangle(cornerRadius: 20) .fill(.ultraThinMaterial) .shadow(color: .black.opacity(0.1), radius: 15, x: 0, y: 5) ) .padding(.horizontal, 20) ``` ### 스페이싱 - **카드 간격**: 20pt - **카드 외부 패딩**: 20pt (좌우) - **카드 내부 패딩**: 20-24pt - **헤더 패딩**: 20pt (상), 24pt (좌우) ### 모서리 반경 - **카드**: 20pt - **내부 요소**: 12-16pt - **버튼**: 12pt (사각), Capsule (원형) ### 그림자 ```swift // 카드 그림자 .shadow(color: .black.opacity(0.1), radius: 15, x: 0, y: 5) // 버튼 그림자 .shadow(color: [색상].opacity(0.3), radius: 8, x: 0, y: 4) // 아바타 그림자 .shadow(color: .blue.opacity(0.3), radius: 8, x: 0, y: 4) ``` ### 타이포그래피 | 용도 | 폰트 | 크기 | |------|------|------| | 카드 헤더 | .title3, Bold | 20pt | | 통계 숫자 | System Rounded, Bold | 28pt | | 닉네임 | .title2, Bold | 22pt | | 라벨 | .subheadline, Semibold | 15pt | | 캡션 | .caption, Regular | 12pt | --- ## 🎬 애니메이션 ### 등장 애니메이션 ```swift @State private var appearAnimation = false .opacity(appearAnimation ? 1 : 0) .offset(y: appearAnimation ? 0 : [20/30/40/50/60]) .task { withAnimation(.spring(response: 0.6, dampingFraction: 0.8)) { appearAnimation = true } } ``` **효과**: - 카드가 순차적으로 아래에서 위로 페이드인 - 자연스러운 Spring 애니메이션 ### 펼치기/접기 애니메이션 ```swift Button { withAnimation(.spring(response: 0.4, dampingFraction: 0.8)) { showAllBadges.toggle() } } ``` **효과**: - 부드러운 높이 변화 - 자연스러운 트랜지션 --- ## 📊 Before & After 비교 ### Before (기존) ``` ┌─────────────────────────┐ │ │ │ 👤 아바타 │ │ 닉네임 │ │ │ │ [레벨] [경험치] [출석] │ │ │ │ 가입일: ... │ │ 마지막 출석: ... │ │ │ └─────────────────────────┘ [총 문제] [정답] [정답률] 배지 컬렉션 ━━━━━━ 진행도 ━━━━━━ [전체][연속][정확도]... 🏆🏆🏆🏆🏆🏆🏆🏆 🏆🏆🏆🏆🏆🏆🏆🏆 ... 공유하기 [성적][출석][초대] 정치 성향 [바 차트] [바 차트] 전체 랭킹 1. 사용자1 1000 XP 2. 사용자2 900 XP ... 10. 사용자10 500 XP ``` **문제점**: - ❌ 스크롤 매우 길음 - ❌ 정보 계층 불명확 - ❌ 시각적으로 평면적 - ❌ 중요하지 않은 정보도 노출 ### After (개선) ``` ┌─────────────────────────┐ │ 👤 닉네임 │ │ [Lv.3] [5일🔥] │ └─────────────────────────┘ ┌─────────────────────────┐ │ 📊 나의 통계 │ │ ┌──────┬──────┐ │ │ │ 경험치 │ 문제 │ │ │ │ 1234 │ 45 │ │ │ ├──────┼──────┤ │ │ │ 정답 │ 정답률│ │ │ │ 38 │ 84.4%│ │ │ └──────┴──────┘ │ └─────────────────────────┘ ┌─────────────────────────┐ │ 🏆 성취도 [▼] │ │ 배지 5/20 ━━━━━━━━━ │ │ 🏆🏆🏆 │ │ 🏆🏆🏆 │ │ [성적][출석][초대] │ └─────────────────────────┘ ┌─────────────────────────┐ │ 📈 정치 성향 분석 │ │ 경제적 [중도우파] │ │ 🔴········⚪········🔵│ │ 사회적 [약한자유주의] │ │ 🟠········⚪········🟢│ └─────────────────────────┘ ┌─────────────────────────┐ │ 🏆 전체 랭킹 [내 순위:15]│ │ 🥇 user1 1000 XP │ │ 🥈 user2 900 XP │ │ 🥉 user3 800 XP │ │ 4 user4 700 XP │ │ 5 user5 600 XP │ │ [더보기 ▼] │ └─────────────────────────┘ ``` **개선점**: - ✅ 스크롤 30% 감소 - ✅ 카드로 명확한 구분 - ✅ 그라데이션, 그림자로 입체감 - ✅ 펼치기/접기로 정보 관리 --- ## 🎯 UX 개선 효과 ### 1. 정보 과다 해결 - **문제**: 모든 배지, 모든 랭킹 표시 - **해결**: - 배지 6개만 표시 (펼치기 옵션) - 랭킹 5명만 표시 (더보기 옵션) - **효과**: 초기 로드 부담 감소 ### 2. 시각적 계층 명확화 - **문제**: 평면적인 나열 - **해결**: - 카드로 섹션 분리 - 그림자로 깊이감 - 애니메이션으로 순서 - **효과**: 정보 파악 용이 ### 3. 현대적 디자인 - **문제**: 단조로운 색상 - **해결**: - 그라데이션 적극 활용 - 유리 모피즘 (.ultraThinMaterial) - 원형 아이콘 배경 - **효과**: 프리미엄 느낌 ### 4. 인터랙션 개선 - **문제**: 정적인 UI - **해결**: - 등장 애니메이션 - 펼치기/접기 애니메이션 - 호버/터치 피드백 - **효과**: 생동감, 반응성 --- ## 📱 반응형 디자인 ### 화면 크기 대응 - **작은 화면**: - 2x2 그리드 유지 - 텍스트 자동 조절 - 스크롤 가능 - **큰 화면**: - 여유 있는 패딩 - 카드 최대 너비 제한 가능 ### 다크 모드 - `.ultraThinMaterial`: 자동 대응 - `LinearGradient`: 밝기 조절됨 - `Color.primary`: 시스템 색상 --- ## 🔮 향후 개선 방향 ### 1. 애니메이션 추가 ```swift // 통계 숫자 카운트업 Text("\(animatedValue)") .onAppear { withAnimation(.easeOut(duration: 1.0)) { animatedValue = actualValue } } ``` ### 2. 햅틱 피드백 ```swift // 배지 펼치기/접기 시 let impact = UIImpactFeedbackGenerator(style: .light) impact.impactOccurred() ``` ### 3. 공유 이미지 생성 - 대시보드 스크린샷 - 커스텀 이미지 템플릿 - SNS 최적화 크기 ### 4. 프로필 편집 - 아바타 선택/업로드 - 닉네임 변경 - 테마 선택 ### 5. 통계 차트 - 주간 활동 그래프 - 카테고리별 정답률 - 성장 추이 --- ## 🎨 컴포넌트 재사용 ### ModernStatCard - 통계 화면 - 프로필 화면 - 대시보드 요약 ### ModernShareButton - 퀴즈 결과 화면 - 배지 획득 화면 - 공유 기능 어디든 ### CompactBadgeCard - 배지 리스트 - 알림 - 프로필 미리보기 ### ModernRankingRow - 전체 랭킹 페이지 - 친구 랭킹 - 대회 랭킹 --- ## 📚 관련 파일 ``` moni/ └─ Views/ └─ Dashboard/ └─ DashboardView.swift ``` **컴포넌트 목록**: - `DashboardView` - 메인 뷰 - `ProfileHeaderSection` - 프로필 헤더 - `StatsCardSection` - 통계 카드 - `ModernStatCard` - 통계 항목 - `AchievementCardSection` - 배지 & 성취도 - `CompactBadgeCard` - 컴팩트 배지 - `ModernShareButton` - 공유 버튼 - `BadgeGridView` - 배지 그리드 - `PoliticalOrientationCard` - 정치 성향 - `ModernOrientationBar` - 성향 바 - `RankingCardSection` - 랭킹 카드 - `ModernRankingRow` - 랭킹 행 --- ## 💡 핵심 정리 대시보드는 다음 3가지 원칙으로 재디자인되었습니다: 1. **카드 기반 UI**: 모든 섹션을 독립적인 카드로 2. **정보 우선순위**: 중요한 것부터, 펼치기/접기로 유연성 3. **현대적 디자인**: 그라데이션, 그림자, 애니메이션 이를 통해 사용자는 핵심 정보에 집중하고, 필요시 상세 정보를 펼쳐볼 수 있습니다. 🎉 --- **작성일**: 2025-11-06 **버전**: 2.0 **상태**: ✅ 완료