@su-record/vibe 2.8.11 → 2.8.12
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/commands/vibe.figma.md +183 -152
- package/package.json +1 -1
package/commands/vibe.figma.md
CHANGED
|
@@ -5,76 +5,84 @@ argument-hint: ""
|
|
|
5
5
|
|
|
6
6
|
# /vibe.figma
|
|
7
7
|
|
|
8
|
-
Figma 디자인 + 스토리보드 → 프로덕션 코드.
|
|
8
|
+
Figma 디자인 + 스토리보드 → 프로덕션 코드. **뷰포트별 점진적 빌드** 방식.
|
|
9
9
|
|
|
10
10
|
## Usage
|
|
11
11
|
|
|
12
12
|
```
|
|
13
|
-
/vibe.figma # 인터랙티브 모드 (URL 입력
|
|
13
|
+
/vibe.figma # 인터랙티브 모드 (단계별 URL 입력)
|
|
14
14
|
/vibe.figma --new # 새 피처 모드 (기존 디자인 시스템 무시)
|
|
15
15
|
/vibe.figma --refine # 보완 모드 (기존 코드 + Figma 재비교 → 수정)
|
|
16
16
|
```
|
|
17
17
|
|
|
18
|
-
|
|
18
|
+
## Incremental Build Flow (핵심 플로우)
|
|
19
19
|
|
|
20
|
-
|
|
21
|
-
1. 📋 스토리보드 URL이 있나요? (선택)
|
|
22
|
-
→ 브레이크포인트, 인터랙션, 애니메이션 스펙 추출
|
|
23
|
-
→ 없으면 Enter (디폴트 브레이크포인트 사용)
|
|
20
|
+
한번에 전체를 만들지 않고, **뷰포트별로 점진적으로 쌓아가는 방식**:
|
|
24
21
|
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
22
|
+
```
|
|
23
|
+
Step A: 스토리보드 URL 입력
|
|
24
|
+
→ 브레이크포인트, 인터랙션, 스펙 추출
|
|
25
|
+
→ base 레이아웃 & 컴포넌트 구조 설계 + 파일 생성
|
|
26
|
+
↓
|
|
27
|
+
Step B: 모바일 디자인 URL 입력
|
|
28
|
+
→ 모바일 스타일 반영, 이미지 추출
|
|
29
|
+
→ 컴포넌트 리팩토링 (모바일 기준)
|
|
30
|
+
→ 🔄 검증 루프 (Figma vs 코드 비교, P1=0까지)
|
|
31
|
+
↓
|
|
32
|
+
Step C: PC 디자인 URL 입력
|
|
33
|
+
→ PC 스타일 반영 (반응형 clamp/breakpoint 추가)
|
|
34
|
+
→ 이미지 추출 (PC용 에셋)
|
|
35
|
+
→ 컴포넌트 리팩토링 (PC 대응)
|
|
36
|
+
→ 🔄 검증 루프 (Figma vs 코드 비교, P1=0까지)
|
|
37
|
+
↓
|
|
38
|
+
Step D: 최종 공통화 리팩토링
|
|
39
|
+
→ 모바일/PC 스타일 공통 토큰 추출
|
|
40
|
+
→ 중복 코드 통합
|
|
41
|
+
→ 유사 컴포넌트 variant 통합 (80% rule)
|
|
42
|
+
→ 🔄 최종 검증 루프 (양쪽 뷰포트 동시 검증)
|
|
29
43
|
```
|
|
30
44
|
|
|
31
|
-
### 입력
|
|
45
|
+
### 단계별 URL 입력 (AskUserQuestion — options 사용 금지, 자유 텍스트만)
|
|
32
46
|
|
|
33
47
|
```
|
|
34
|
-
|
|
35
|
-
|
|
48
|
+
각 Step에서 AskUserQuestion으로 하나씩 입력:
|
|
49
|
+
⚠️ 절대 선택지(options)를 제공하지 않는다. 순수 텍스트 입력만.
|
|
50
|
+
⚠️ 각 질문의 응답을 받은 후에만 다음으로 진행.
|
|
51
|
+
|
|
52
|
+
Step A: "📋 스토리보드 Figma URL을 입력해주세요. (없으면 '없음')"
|
|
53
|
+
→ ⏸️ 응답 대기
|
|
54
|
+
→ URL 또는 "없음"
|
|
55
|
+
|
|
56
|
+
Step B: "📱 모바일 디자인 Figma URL을 입력해주세요."
|
|
57
|
+
→ ⏸️ 응답 대기
|
|
58
|
+
→ URL 저장 + 추출 + 스타일 반영 + 검증
|
|
36
59
|
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
60
|
+
Step C: "🖥️ PC 디자인 Figma URL을 입력해주세요. (없으면 '없음')"
|
|
61
|
+
→ ⏸️ 응답 대기
|
|
62
|
+
→ URL 또는 "없음" (없으면 single viewport mode)
|
|
63
|
+
|
|
64
|
+
디자인 URL이 1개만이면: 단일 뷰포트 (Step B만 실행, Step C 스킵)
|
|
65
|
+
디자인 URL이 2개이면: 반응형 (Step B + C + D)
|
|
40
66
|
```
|
|
41
67
|
|
|
42
|
-
###
|
|
68
|
+
### Mode
|
|
43
69
|
|
|
44
70
|
| Mode | 조건 | 동작 |
|
|
45
71
|
|------|------|------|
|
|
46
72
|
| **Project integration** | 기본값 | 기존 디자인 시스템/토큰 활용, 프로젝트 컨벤션 준수 |
|
|
47
73
|
| **--new** | 플래그 지정 시 | 자체 완결 토큰 + 컴포넌트, 기존 디자인 시스템 무관 |
|
|
48
|
-
| **--refine** | 플래그 지정 시 | 기존
|
|
49
|
-
| **Responsive** | 디자인 URL 2개 이상 | 자동 감지, fluid clamp() + @media 생성 |
|
|
74
|
+
| **--refine** | 플래그 지정 시 | 기존 코드를 Figma 재비교 → 부족한 부분만 수정 |
|
|
50
75
|
|
|
51
76
|
### 스토리보드에서 추출하는 정보
|
|
52
77
|
|
|
53
|
-
| 항목 | 활용
|
|
54
|
-
|
|
55
|
-
| 브레이크포인트 / 해상도 가이드 |
|
|
56
|
-
| 인터랙션 스펙 (호버, 클릭, 스크롤) |
|
|
57
|
-
| 애니메이션 스펙 (타이밍, 이징) |
|
|
58
|
-
| 상태별 UI (로딩, 에러,
|
|
59
|
-
| 반응형 동작 설명 |
|
|
60
|
-
| 컬러/타이포 가이드 |
|
|
61
|
-
| 컴포넌트 명세 | Phase 5 (마크업 구조) |
|
|
62
|
-
|
|
63
|
-
### File Reading Policy
|
|
64
|
-
|
|
65
|
-
**스토리보드 있을 때:**
|
|
66
|
-
1. 스토리보드 `get_metadata` → 전체 프레임 목록 파악
|
|
67
|
-
2. 관련 섹션별 `get_design_context` → 스펙 정보 추출
|
|
68
|
-
3. 디자인 URL별 `get_design_context` + `get_screenshot` → 비주얼 + 코드
|
|
69
|
-
|
|
70
|
-
**스토리보드 없을 때:**
|
|
71
|
-
1. 디자인 URL별 `get_design_context` + `get_screenshot` → 비주얼 + 코드
|
|
72
|
-
2. 디폴트 브레이크포인트 적용
|
|
73
|
-
|
|
74
|
-
**항상:**
|
|
75
|
-
- `.claude/vibe/config.json` → 프로젝트 스택
|
|
76
|
-
- `.claude/vibe/design-context.json` → 브랜드, 토큰, 테마
|
|
77
|
-
- 기존 코드 스캔 → 컴포넌트 패턴, 디자인 시스템
|
|
78
|
+
| 항목 | 활용 |
|
|
79
|
+
|------|------|
|
|
80
|
+
| 브레이크포인트 / 해상도 가이드 | base 레이아웃 설계 |
|
|
81
|
+
| 인터랙션 스펙 (호버, 클릭, 스크롤) | 이벤트 핸들러 + CSS states |
|
|
82
|
+
| 애니메이션 스펙 (타이밍, 이징) | transition/animation |
|
|
83
|
+
| 상태별 UI (로딩, 에러, 성공) | 조건부 렌더링 |
|
|
84
|
+
| 반응형 동작 설명 | responsive 코드 |
|
|
85
|
+
| 컬러/타이포 가이드 | 토큰 생성 |
|
|
78
86
|
|
|
79
87
|
## Context Reset
|
|
80
88
|
|
|
@@ -88,16 +96,17 @@ Figma 디자인 + 스토리보드 → 프로덕션 코드. 인터랙티브 방
|
|
|
88
96
|
|
|
89
97
|
## Model Routing
|
|
90
98
|
|
|
91
|
-
|
|
|
92
|
-
|
|
93
|
-
|
|
|
94
|
-
|
|
|
95
|
-
|
|
|
96
|
-
|
|
|
97
|
-
|
|
|
98
|
-
|
|
|
99
|
-
|
|
|
100
|
-
|
|
|
99
|
+
| Step | Claude | GPT (Codex) | 이유 |
|
|
100
|
+
|------|--------|-------------|------|
|
|
101
|
+
| Step A (스토리보드 + 구조) | **Haiku → Sonnet** | — | MCP 추출 → 구조 설계 |
|
|
102
|
+
| Step B (모바일 추출) | **Haiku** | — | MCP + 이미지 다운로드 |
|
|
103
|
+
| Step B (모바일 코드 생성) | **Sonnet** | **gpt-5.3-codex-spark** (병렬) | 섹션별 컴포넌트 생성 |
|
|
104
|
+
| Step B (모바일 검증) | **Sonnet** | — | 이미지 비교 + auto-fix |
|
|
105
|
+
| Step C (PC 추출) | **Haiku** | — | MCP + 이미지 다운로드 |
|
|
106
|
+
| Step C (PC 반응형 반영) | **Sonnet** | — | 기존 코드에 반응형 레이어 추가 |
|
|
107
|
+
| Step C (PC 검증) | **Sonnet** | — | 양쪽 뷰포트 비교 |
|
|
108
|
+
| Step D (공통화) | **Sonnet** | — | 리팩토링 + 최종 검증 |
|
|
109
|
+
| Post (코드 리뷰) | — | **gpt-5.3-codex** | 전체 코드 품질 검증 |
|
|
101
110
|
|
|
102
111
|
### GPT 모델 선택 기준
|
|
103
112
|
|
|
@@ -123,155 +132,177 @@ Post — 코드 리뷰:
|
|
|
123
132
|
Codex 미설치 시 자동 스킵 — Claude만으로 순차 생성.
|
|
124
133
|
```
|
|
125
134
|
|
|
126
|
-
##
|
|
127
|
-
|
|
128
|
-
### 0-0. 사용자 입력 수집
|
|
135
|
+
## Step A: 스토리보드 + Base 구조
|
|
129
136
|
|
|
130
|
-
|
|
131
|
-
**선택지(options)를 제공하지 않는다. 반드시 자유 입력(freeform text)만 받는다.**
|
|
132
|
-
각 질문 후 반드시 사용자 응답을 받은 다음에만 다음 Step으로 진행.
|
|
137
|
+
### A-1. 스토리보드 URL 입력
|
|
133
138
|
|
|
139
|
+
AskUserQuestion (options 사용 금지, 자유 텍스트만):
|
|
134
140
|
```
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
→ figma.com URL 포함: storyboardUrl 저장
|
|
140
|
-
→ "없음" 또는 URL 미포함: storyboardUrl = null
|
|
141
|
-
|
|
142
|
-
Step 2: 디자인 URL (필수)
|
|
143
|
-
→ AskUserQuestion 호출 (options 파라미터 사용 금지):
|
|
144
|
-
question: "🎨 디자인 Figma URL을 입력해주세요."
|
|
145
|
-
→ ⏸️ 사용자 응답 대기
|
|
146
|
-
→ URL 저장: designUrls = [url]
|
|
147
|
-
|
|
148
|
-
Step 3: 추가 디자인 URL (반응형)
|
|
149
|
-
→ AskUserQuestion 호출 (options 파라미터 사용 금지):
|
|
150
|
-
question: "🎨 추가 디자인 URL이 있으면 입력해주세요. (없으면 '없음')"
|
|
151
|
-
→ ⏸️ 사용자 응답 대기
|
|
152
|
-
→ figma.com URL 포함: designUrls에 추가 → responsive mode
|
|
153
|
-
→ "없음" 또는 URL 미포함: single mode
|
|
154
|
-
|
|
155
|
-
Step 4 (--new 미지정 시):
|
|
156
|
-
프로젝트에 기존 디자인 시스템이 있는지 자동 감지
|
|
157
|
-
→ 있으면: default mode (기존 토큰 활용)
|
|
158
|
-
→ 없으면: 자동으로 --new mode
|
|
159
|
-
|
|
160
|
-
⚠️ 절대 Step 1~3을 한 번에 호출하지 않는다.
|
|
161
|
-
⚠️ 절대 선택지(options/choices)를 제공하지 않는다. 순수 텍스트 입력만.
|
|
162
|
-
Step 1 응답 → Step 2 호출 → Step 2 응답 → Step 3 호출 순서 엄수.
|
|
141
|
+
question: "📋 스토리보드 Figma URL을 입력해주세요. (없으면 '없음')"
|
|
142
|
+
→ ⏸️ 응답 대기 (응답 받기 전 다음 진행 금지)
|
|
143
|
+
→ figma.com URL → storyboardUrl 저장
|
|
144
|
+
→ "없음" → storyboardUrl = null
|
|
163
145
|
```
|
|
164
146
|
|
|
165
|
-
###
|
|
166
|
-
|
|
167
|
-
스토리보드에서 **구현 스펙**을 먼저 추출. 이후 Phase에서 참조.
|
|
147
|
+
### A-2. 스토리보드 추출 (storyboardUrl이 있을 때)
|
|
168
148
|
|
|
169
149
|
```
|
|
170
150
|
URL에서 fileKey, nodeId 추출:
|
|
171
151
|
https://www.figma.com/design/:fileKey/:fileName?node-id=:nodeId
|
|
172
152
|
→ nodeId: 하이픈을 콜론으로 ("1-109" → "1:109")
|
|
173
153
|
|
|
174
|
-
1. get_metadata(fileKey, nodeId) → 전체 프레임 목록
|
|
154
|
+
1. get_metadata(fileKey, nodeId) → 전체 프레임 목록
|
|
175
155
|
2. 관련 섹션별 get_design_context:
|
|
176
156
|
- "해상도 대응" / "Media Query" → 브레이크포인트
|
|
177
157
|
- "인터랙션" / "Interaction" → 호버/클릭/스크롤 스펙
|
|
178
158
|
- "애니메이션" / "Animation" / "Motion" → 트랜지션 스펙
|
|
179
159
|
- "상태" / "State" → 로딩/에러/성공 UI
|
|
180
160
|
- "컬러" / "Color" / "타이포" / "Typography" → 디자인 가이드
|
|
161
|
+
```
|
|
181
162
|
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
163
|
+
### A-3. 프로젝트 스택 감지 + Base 구조 설계
|
|
164
|
+
|
|
165
|
+
```
|
|
166
|
+
1. 프로젝트 스택 감지 (Phase 3 참조)
|
|
167
|
+
2. 디자인 시스템 감지 (--new 미지정 시)
|
|
168
|
+
3. 브레이크포인트 로드 (Phase 3-3 참조, 스토리보드 우선)
|
|
169
|
+
4. 피처명 결정 (Figma 파일명에서 추출)
|
|
170
|
+
5. 파일 구조 생성:
|
|
171
|
+
- 루트 페이지 파일 (빈 shell)
|
|
172
|
+
- 컴포넌트 디렉토리 (빈 폴더)
|
|
173
|
+
- 토큰 파일 (스토리보드 기반 초기값)
|
|
191
174
|
```
|
|
192
175
|
|
|
193
|
-
|
|
176
|
+
---
|
|
177
|
+
|
|
178
|
+
## Step B: 모바일 디자인 반영
|
|
194
179
|
|
|
195
|
-
|
|
180
|
+
### B-1. 모바일 디자인 URL 입력
|
|
196
181
|
|
|
182
|
+
AskUserQuestion (options 사용 금지):
|
|
183
|
+
```
|
|
184
|
+
question: "📱 모바일 디자인 Figma URL을 입력해주세요."
|
|
185
|
+
→ ⏸️ 응답 대기
|
|
186
|
+
→ URL 저장: mobileUrl
|
|
197
187
|
```
|
|
198
|
-
URL에서 fileKey, nodeId 추출 (동일 방식)
|
|
199
188
|
|
|
200
|
-
|
|
201
|
-
1. get_design_context(fileKey, nodeId) → 코드 + 스크린샷 + 메타데이터 + 에셋 URL
|
|
202
|
-
2. get_metadata(fileKey, nodeId) → 레이어 구조 (XML)
|
|
203
|
-
3. get_screenshot(fileKey, nodeId) → 프레임 이미지
|
|
189
|
+
### B-2. 모바일 디자인 추출 (MCP)
|
|
204
190
|
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
191
|
+
```
|
|
192
|
+
1. get_design_context(fileKey, nodeId) → 코드 + 스크린샷 + 에셋 URL
|
|
193
|
+
→ 스크린샷으로 전체 디자인 분석 (레이아웃, 타이포, 색상, 컴포넌트 구조)
|
|
208
194
|
```
|
|
209
195
|
|
|
210
|
-
###
|
|
196
|
+
### B-3. 이미지 에셋 다운로드 (BLOCKING)
|
|
211
197
|
|
|
212
|
-
> **⛔
|
|
198
|
+
> **⛔ 이미지 다운로드 완료 전 코드 생성 진행 금지.**
|
|
213
199
|
|
|
214
|
-
|
|
215
|
-
|
|
200
|
+
```
|
|
201
|
+
1. get_design_context 응답에서 모든 이미지 URL 추출
|
|
202
|
+
(패턴: https://www.figma.com/api/mcp/asset/...)
|
|
203
|
+
2. WebFetch로 각 URL 다운로드
|
|
204
|
+
3. 프로젝트 에셋 디렉토리에 저장 (Nuxt: static/images/{feature}/)
|
|
205
|
+
4. 파일명: 레이어 이름 기반 kebab-case
|
|
206
|
+
5. URL→로컬경로 매핑 테이블 생성
|
|
207
|
+
6. SVG: 작은 아이콘 → 인라인, 큰 SVG → 파일
|
|
208
|
+
```
|
|
209
|
+
|
|
210
|
+
### B-4. 모바일 코드 생성
|
|
211
|
+
|
|
212
|
+
```
|
|
213
|
+
1. 모바일 기준으로 컴포넌트 코드 생성 (Phase 4~6 적용)
|
|
214
|
+
2. 이미지 에셋은 매핑 테이블의 로컬 경로 사용
|
|
215
|
+
3. 스토리보드 스펙 반영 (인터랙션, 애니메이션)
|
|
216
|
+
4. 모바일 전용 스타일 작성 (desktop 미고려)
|
|
217
|
+
```
|
|
218
|
+
|
|
219
|
+
### B-5. 모바일 검증 루프
|
|
220
|
+
|
|
221
|
+
```
|
|
222
|
+
🔄 Phase 9 검증 루프 실행:
|
|
223
|
+
- Figma 모바일 스크린샷 vs 생성된 코드 비교
|
|
224
|
+
- P1=0 될 때까지 수정 반복
|
|
225
|
+
- 이미지 에셋 전부 표시되는지 확인
|
|
226
|
+
```
|
|
227
|
+
|
|
228
|
+
---
|
|
216
229
|
|
|
217
|
-
|
|
230
|
+
## Step C: PC 디자인 반영 (반응형)
|
|
218
231
|
|
|
219
|
-
|
|
232
|
+
### C-1. PC 디자인 URL 입력
|
|
233
|
+
|
|
234
|
+
AskUserQuestion (options 사용 금지):
|
|
220
235
|
```
|
|
221
|
-
|
|
222
|
-
|
|
236
|
+
question: "🖥️ PC 디자인 Figma URL을 입력해주세요. (없으면 '없음')"
|
|
237
|
+
→ ⏸️ 응답 대기
|
|
238
|
+
→ URL → pcUrl 저장 (responsive mode)
|
|
239
|
+
→ "없음" → single viewport mode (Step D로 직행)
|
|
223
240
|
```
|
|
224
241
|
|
|
225
|
-
|
|
242
|
+
### C-2. PC 디자인 추출 (MCP)
|
|
226
243
|
|
|
227
244
|
```
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
2. 프로젝트 에셋 디렉토리에 저장:
|
|
231
|
-
- Nuxt: static/images/{feature}/ 또는 public/images/{feature}/
|
|
232
|
-
- Next.js: public/images/{feature}/
|
|
233
|
-
- React: public/images/{feature}/
|
|
234
|
-
3. 파일명은 레이어 이름 기반 (kebab-case):
|
|
235
|
-
- "Hero Background" → hero-background.webp
|
|
236
|
-
- "Product Photo 1" → product-photo-1.webp
|
|
245
|
+
1. get_design_context(fileKey, nodeId) → 코드 + 스크린샷 + 에셋 URL
|
|
246
|
+
→ 모바일 스크린샷과 side-by-side 비교 → viewport diff table 생성
|
|
237
247
|
```
|
|
238
248
|
|
|
239
|
-
|
|
249
|
+
### C-3. PC 이미지 에셋 다운로드 (BLOCKING)
|
|
240
250
|
|
|
241
251
|
```
|
|
242
|
-
|
|
252
|
+
모바일과 동일 프로세스.
|
|
253
|
+
PC 전용 이미지가 있으면 추가 다운로드.
|
|
254
|
+
동일 이미지는 스킵 (중복 방지).
|
|
255
|
+
```
|
|
243
256
|
|
|
244
|
-
|
|
245
|
-
|---------------|----------|-----------|
|
|
246
|
-
| https://figma.com/api/mcp/asset/abc... | /images/winter-pcbang/hero-bg.webp | Hero Background |
|
|
247
|
-
| https://figma.com/api/mcp/asset/def... | /images/winter-pcbang/hero-title.webp | Hero Title |
|
|
257
|
+
### C-4. PC 스타일 반영 + 반응형 리팩토링
|
|
248
258
|
|
|
249
|
-
|
|
259
|
+
```
|
|
260
|
+
기존 모바일 코드에 PC 대응 추가:
|
|
261
|
+
1. 공통 값 → clamp() fluid 토큰으로 변환
|
|
262
|
+
2. 레이아웃 구조 변경 → @media (min-width: {breakpoint}px) 추가
|
|
263
|
+
3. PC 전용 요소 → display toggle (.desktopOnly)
|
|
264
|
+
4. 모바일 전용 요소 → display toggle (.mobileOnly)
|
|
265
|
+
5. PC 전용 배경 이미지 → @media 분기
|
|
266
|
+
6. 기존 모바일 코드는 가능한 보존하고 반응형 레이어만 추가
|
|
250
267
|
```
|
|
251
268
|
|
|
252
|
-
|
|
269
|
+
### C-5. PC 검증 루프
|
|
253
270
|
|
|
254
271
|
```
|
|
255
|
-
|
|
256
|
-
-
|
|
257
|
-
-
|
|
272
|
+
🔄 Phase 9 검증 루프 실행:
|
|
273
|
+
- Figma PC 스크린샷 vs 생성된 코드 (PC viewport) 비교
|
|
274
|
+
- P1=0 될 때까지 수정 반복
|
|
275
|
+
- 모바일 검증도 재확인 (PC 수정으로 모바일이 깨지지 않았는지)
|
|
258
276
|
```
|
|
259
277
|
|
|
260
|
-
|
|
278
|
+
---
|
|
279
|
+
|
|
280
|
+
## Step D: 최종 공통화 리팩토링
|
|
281
|
+
|
|
282
|
+
### D-1. 스타일 공통화
|
|
261
283
|
|
|
262
|
-
|
|
284
|
+
```
|
|
285
|
+
1. 모바일/PC에서 동일한 값 → 공통 토큰으로 추출
|
|
286
|
+
2. 중복 CSS/SCSS 규칙 통합
|
|
287
|
+
3. 컴포넌트 내 중복 로직 제거
|
|
288
|
+
```
|
|
289
|
+
|
|
290
|
+
### D-2. 컴포넌트 통합
|
|
263
291
|
|
|
264
292
|
```
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
293
|
+
1. 유사 컴포넌트 (80% rule) → variant prop으로 통합
|
|
294
|
+
2. 중복 sub-component → 공유 컴포넌트로 추출
|
|
295
|
+
3. Fragment/template 활용하여 불필요한 래퍼 제거
|
|
296
|
+
```
|
|
297
|
+
|
|
298
|
+
### D-3. 최종 검증 루프
|
|
270
299
|
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
300
|
+
```
|
|
301
|
+
🔄 양쪽 뷰포트 동시 검증:
|
|
302
|
+
- 모바일 Figma vs 코드 (mobile viewport)
|
|
303
|
+
- PC Figma vs 코드 (desktop viewport)
|
|
304
|
+
- 양쪽 모두 P1=0, Match Score 95%+
|
|
305
|
+
- 이미지 에셋 전부 정상 표시
|
|
275
306
|
```
|
|
276
307
|
|
|
277
308
|
---
|