--- description: 목업 생성 - HTML 기반 라이브 프로토타입 UI 생성 --- ## User Input ```text $ARGUMENTS ``` **이 명령어는 인자를 받지 않습니다.** 사용자가 `/appkit.visualize`를 실행하면 자동으로: - `index.html` (통합 뷰어) - 모든 화면 목업 (`.html` 파일들) - 공통 스타일/스크립트 파일 모두 생성합니다. ## Overview **논리적 사고 5단계 워크플로우**: ``` 1. /appkit.new → 아이디어 스케치 (어떤 서비스인지?) 2. /appkit.mvp → MVP 범위 정하기 + 랜딩페이지 3. /appkit.ui → 화면설계서 (라우터, 화면, 컴포넌트) 4. /appkit.policy → 정책설계서 (비즈니스 규칙) 5. /appkit.visualize → 목업 생성 (HTML 프로토타입) ← YOU ARE HERE ``` **출력 디렉토리**: `docs/mockup` ## Purpose UI 설계서(`docs/ui/*.md`)와 정책 설계서(`docs/policies/*.md`)를 기반으로: 1. 실제 동작하는 HTML 목업을 생성합니다 2. **통합 뷰어(index.html)**: UI 설계서, 정책 설계서, 목업을 한 곳에서 볼 수 있는 인터랙티브 문서 생성 브라우저에서 바로 확인할 수 있는 라이브 프로토타입입니다. --- ## Pre-requisite - `/appkit.ui`로 화면설계가 되어 있어야 함 - `docs/ui/router.md` 파일이 존재해야 함 - `docs/ui/main.md` 파일이 존재해야 함 - `docs/ui/[screen].md` 화면별 상세 문서가 존재해야 함 --- ## Usage ```bash /appkit.visualize # 통합 뷰어(index.html) + 모든 화면 목업 생성 ``` **자동 생성 항목:** 1. `docs/mockup/index.html` - 통합 뷰어 (UI 설계서 + 정책 설계서 + 목업 링크) 2. `docs/mockup/[screen].html` - 모든 화면 목업 3. `docs/mockup/styles.css` - 공통 스타일 4. `docs/mockup/scripts.js` - 공통 스크립트 --- ## Execution Flow ### 1. 기존 기획 읽기 Read files from `docs/`: - `ui/router.md` - 라우터 및 화면 목록 - `ui/main.md` - 메인 구조 - `ui/*.md` - 각 화면별 상세 문서 - `policies/*.md` - 정책 문서 ### 2. 통합 뷰어 (index.html) 생성 **최우선 작업**: `docs/mockup/index.html` 생성/업데이트 통합 뷰어는 다음을 포함: 1. **UI 설계서 뷰어**: `docs/ui/*.md` 파일들을 읽어서 화면별 탭으로 표시 2. **정책 설계서 뷰어**: `docs/policies/*.md` 파일들을 읽어서 정책별 탭으로 표시 3. **목업 링크**: 생성된 HTML 목업으로 바로 이동할 수 있는 네비게이션 **index.html 구조**: ```html [서비스명] - 통합 문서 뷰어
``` **구현 방식**: - Markdown 파일을 JavaScript로 읽어서 HTML로 변환 - 또는 빌드 시점에 모든 MD를 HTML로 변환하여 포함 --- ### 3. 자동 화면 목업 생성 **자동으로 수행:** 1. `docs/ui/` 디렉토리에서 모든 `.md` 파일 스캔 2. `router.md`, `main.md`를 제외한 모든 화면 문서 감지 3. 각 화면별 HTML 목업 자동 생성 ```markdown ## 목업 생성 시작 docs/ui/에서 확인된 화면 문서: | 화면 | 파일 | 목업 | |-----|------|-----| | 친구 | `friends.md` | `friends.html` | | 채팅 목록 | `chat-list.md` | `chat-list.html` | | 채팅방 | `chat.md` | `chat.html` | | 진행 | `progress.md` | `progress.html` | | 쇼핑 | `shop.md` | `shop.html` | 모든 화면 목업을 생성합니다... ``` ### 4. 화면별 HTML 목업 파일 생성 #### 4-1. 기본 구조 **File**: `docs/mockup/[screen].html` **템플릿**: `.specify/templates/mockup-base.html` 참조 ```html [화면명] - [서비스명]
``` #### 4-2. 공통 스타일시트 (styles.css) ```css /* Reset & Base */ * { margin: 0; padding: 0; box-sizing: border-box; } :root { /* Colors */ --bg-primary: #0D0D1A; --bg-secondary: #1A1A2E; --bg-card: #252538; --text-primary: #FFFFFF; --text-secondary: #9999AA; --accent-primary: #6C5CE7; --accent-secondary: #45B7D1; --accent-pink: #FF6B9D; --accent-gold: #FFD93D; --danger: #FF6B6B; --success: #4ECB71; /* Sizing */ --header-height: 56px; --tab-height: 64px; --safe-area-bottom: env(safe-area-inset-bottom, 0px); } body { font-family: 'Noto Sans KR', sans-serif; background: var(--bg-primary); color: var(--text-primary); min-height: 100vh; overflow-x: hidden; } /* App Container */ .app { max-width: 430px; margin: 0 auto; min-height: 100vh; position: relative; background: var(--bg-primary); } /* Header */ .header { position: fixed; top: 0; left: 50%; transform: translateX(-50%); width: 100%; max-width: 430px; background: var(--bg-primary); padding: 12px 16px; z-index: 100; } /* Tab Bar */ .tab-bar { position: fixed; bottom: 0; left: 50%; transform: translateX(-50%); width: 100%; max-width: 430px; background: var(--bg-primary); display: flex; justify-content: space-around; padding: 8px 0; padding-bottom: calc(8px + var(--safe-area-bottom)); border-top: 1px solid #2D2D3A; z-index: 100; } .tab-item { display: flex; flex-direction: column; align-items: center; padding: 8px 16px; color: var(--text-secondary); text-decoration: none; position: relative; } .tab-item.active { color: var(--text-primary); } .tab-icon { font-size: 20px; margin-bottom: 4px; } .tab-label { font-size: 10px; } .tab-badge { position: absolute; top: 0; right: 8px; background: var(--danger); color: white; font-size: 10px; padding: 2px 6px; border-radius: 10px; min-width: 16px; text-align: center; } /* Content Area */ .content { padding-top: var(--header-height); padding-bottom: calc(var(--tab-height) + var(--safe-area-bottom)); min-height: 100vh; } /* Cards */ .card { background: var(--bg-card); border-radius: 16px; padding: 16px; margin: 12px 16px; } /* Buttons */ .btn { display: inline-flex; align-items: center; justify-content: center; padding: 12px 24px; border-radius: 12px; font-weight: 600; cursor: pointer; transition: all 0.2s; border: none; } .btn-primary { background: var(--accent-primary); color: white; } .btn-secondary { background: var(--bg-card); color: var(--text-primary); } /* Modal */ .modal { position: fixed; top: 50%; left: 50%; transform: translate(-50%, -50%) scale(0.9); background: var(--bg-secondary); border-radius: 20px; padding: 24px; text-align: center; z-index: 1001; opacity: 0; visibility: hidden; transition: all 0.3s; max-width: 320px; width: 90%; } .modal.active { opacity: 1; visibility: visible; transform: translate(-50%, -50%) scale(1); } /* Overlay */ .overlay { position: fixed; top: 0; left: 0; right: 0; bottom: 0; background: rgba(0,0,0,0.7); z-index: 1000; opacity: 0; visibility: hidden; transition: all 0.3s; } .overlay.active { opacity: 1; visibility: visible; } /* Toast */ .toast { position: fixed; bottom: calc(var(--tab-height) + 20px + var(--safe-area-bottom)); left: 50%; transform: translateX(-50%) translateY(100px); background: var(--bg-card); padding: 12px 24px; border-radius: 12px; opacity: 0; transition: all 0.3s; z-index: 1002; } .toast.active { opacity: 1; transform: translateX(-50%) translateY(0); } ``` #### 4-3. 공통 스크립트 (scripts.js) ```javascript // Modal Functions function showModal(id) { document.getElementById('overlay').classList.add('active'); document.getElementById(id).classList.add('active'); } function closeAll() { document.getElementById('overlay').classList.remove('active'); document.querySelectorAll('.modal, .bottom-sheet').forEach(el => { el.classList.remove('active'); }); } // Toast Function function showToast(message, duration = 2000) { const toast = document.getElementById('toast'); if (toast) { toast.textContent = message; toast.classList.add('active'); setTimeout(() => { toast.classList.remove('active'); }, duration); } } // Tab Badge Update function updateBadge(tabId, count) { const badge = document.querySelector(`#${tabId} .tab-badge`); if (badge) { badge.textContent = count; badge.style.display = count > 0 ? 'block' : 'none'; } } ``` --- ### 5. 화면별 목업 생성 규칙 각 화면에 대해 `docs/ui/[screen].md`의 컴포넌트 정보를 기반으로 HTML 생성: 1. **헤더 영역**: `[screen]-header` 컴포넌트들 2. **메인 콘텐츠**: `[screen]-content` 내 컴포넌트들 3. **탭바**: 전역 탭바 (현재 탭 active 표시) 4. **팝업/모달**: `popup-*`, `bs-*` 컴포넌트들 ### 6. 완료 리포트 ``` ✅ 목업 생성 완료! 📁 생성된 파일: - mockup/index.html (통합 뷰어 - UI 설계서 + 정책 + 목업 링크) ⭐ - mockup/friends.html - mockup/chat-list.html - mockup/chat.html - mockup/progress.html - mockup/shop.html - ... (총 N개 화면) - mockup/styles.css - mockup/scripts.js 🌐 브라우저에서 확인: **📚 통합 뷰어 (여기서 시작하세요!)** file:///Users/.../docs/mockup/index.html 📊 생성 요약: - 통합 뷰어: 1개 (index.html) - 화면 목업: N개 - UI 설계서: N개 문서 포함 - 정책 설계서: N개 문서 포함 - 전체 컴포넌트: N개 📝 참고: - **index.html**에서 모든 설계 문서와 목업을 한 곳에서 확인할 수 있습니다 - 각 화면 목업은 상호 링크되어 네비게이션 테스트가 가능합니다 - 정책 문서와 연결된 UI 요소에는 정책 ID 주석이 포함되어 있습니다 📍 현재 위치: Step 5/5 완료! 🎉 이제 프로젝트 전체 문서를 index.html에서 확인하세요! ``` --- ## 목업 생성 원칙 ### Do's - ✅ **docs/ui/router.md 기반**: 모든 컴포넌트 ID와 구조 준수 - ✅ **정책 연결**: UI에 적용되는 정책 ID 주석 추가 - ✅ **상호 링크**: 화면 간 네비게이션 동작 - ✅ **상태 표시**: Empty, Loading, Error 상태 시뮬레이션 - ✅ **반응형**: 모바일 퍼스트 (max-width: 430px) ### Don'ts - ❌ **과도한 디자인**: 와이어프레임 수준 유지 - ❌ **하드코딩**: 데이터는 의미있는 샘플로 - ❌ **누락**: docs/ui/router.md에 정의된 컴포넌트 누락 금지 --- ## 정책 연결 주석 예시 ```html
💬 127
``` --- ## Example ``` $ /appkit.visualize 🎨 통합 뷰어 + 전체 목업 생성 📚 UI 설계서 읽기: - docs/ui/router.md - docs/ui/main.md - docs/ui/friends.md - docs/ui/chat-list.md - docs/ui/chat.md - docs/ui/progress.md - docs/ui/shop.md 📋 정책 설계서 읽기: - docs/policies/01-monetization.md - docs/policies/02-gameplay.md - docs/policies/03-dating.md 🌐 통합 뷰어 생성: ✅ mockup/index.html 생성 - UI 설계서 뷰어 (7개 문서) - 정책 설계서 뷰어 (3개 문서) - 목업 네비게이션 📱 화면 목업 생성: ✅ mockup/friends.html ✅ mockup/chat-list.html ✅ mockup/chat.html ✅ mockup/progress.html ✅ mockup/shop.html ✅ mockup/styles.css ✅ mockup/scripts.js 🌐 브라우저에서 확인: 📚 file:///Users/.../docs/mockup/index.html 💡 Tip: - index.html을 열면 모든 UI 설계서, 정책, 목업을 한 곳에서 볼 수 있습니다 - 각 화면 목업은 상호 링크되어 있어 네비게이션 테스트가 가능합니다 ```