@su-record/vibe 2.9.1 → 2.9.2

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.
@@ -36,6 +36,18 @@ component-index.json에서 매칭되는 컴포넌트가 있으면:
36
36
  Q4. 동적 데이터인가? (가격, 수량, 기간) → HTML 텍스트
37
37
  모두 NO → 이미지 렌더링 가능
38
38
 
39
+ ⛔ 디자인 텍스트 판별 (Q1 예외 — 이미지로 처리해야 하는 텍스트):
40
+ 다음 조건 중 하나라도 충족 → 이미지 렌더링 (HTML 텍스트 금지):
41
+ D1. TEXT 노드의 fills가 2개 이상 (그래디언트 + 솔리드 중첩)
42
+ D2. TEXT 노드에 effects가 있음 (DROP_SHADOW, stroke 등)
43
+ D3. TEXT 노드의 fills에 GRADIENT 타입이 있음
44
+ D4. 부모 GROUP/FRAME 아래 VECTOR 3개 이상 (벡터 글자)
45
+ D5. TEXT 노드의 fontFamily가 프로젝트 웹폰트에 없음
46
+
47
+ → content/{section}-{name}.webp 로 노드 렌더링
48
+ → <img src="..." alt="텍스트 내용"> 으로 HTML 배치
49
+ → CSS text로 구현 시도 금지 (시각 품질 보장 불가)
50
+
39
51
  BG 프레임:
40
52
  ❌ <img> 태그 금지
41
53
  ✅ 부모 SCSS에 background-image만:
@@ -61,8 +73,11 @@ INSTANCE 반복 2+ → v-for / .map()
61
73
  ## 3. CSS 속성 직접 매핑
62
74
 
63
75
  ```
64
- tree.json css 객체를 SCSS로 직접 변환. 추정하지 않는다.
65
- CSS 매핑표는 vibe.figma.extract 참조.
76
+ ⛔ 불변 규칙: tree.json 없는 CSS 속성을 만들지 않는다.
77
+ 커스텀 함수/믹스인 생성 금지: wp-fluid(), wp-bg-layer 등 자체 추상화 금지.
78
+ ⛔ aspect-ratio, container query 등 tree.json에 없는 CSS 속성 사용 금지.
79
+ ✅ tree.json의 css 객체 → SCSS에 1:1 직접 매핑만 허용.
80
+ ✅ 유일한 변환: px → vw (공식대로 기계적으로).
66
81
 
67
82
  레이아웃 (layout/ 파일):
68
83
  display, flex-direction, justify-content, align-items, gap,
@@ -76,14 +91,26 @@ CSS 매핑표는 → vibe.figma.extract 참조.
76
91
  opacity, mix-blend-mode, filter, backdrop-filter
77
92
 
78
93
  값이 없으면 → 해당 속성 생략 (추정 금지)
94
+
95
+ ❌ 금지 패턴:
96
+ aspect-ratio: 720 / 1280; → ❌ (tree.json엔 width+height)
97
+ @function wp-fluid(...) { ... } → ❌ (자체 함수)
98
+ @include wp-bg-layer; → ❌ (자체 믹스인)
99
+ clamp(12px, 2.5vw, 18px); → ❌ (tree.json에 없는 값 추정)
100
+
101
+ ✅ 올바른 패턴:
102
+ width: 100vw; height: 177.78vw; → ✅ (720px/720×100, 1280px/720×100)
103
+ background-image: url('hero-bg.webp'); background-size: cover; → ✅
104
+ font-size: 5.56vw; → ✅ (40px/720×100)
79
105
  ```
80
106
 
81
107
  ### 반응형 단위 변환
82
108
 
83
109
  ```
84
- vw 변환:
110
+ vw 변환 (기계적 공식만 사용):
85
111
  width, height, padding, gap, border-radius, box-shadow, top, left, border-width
86
112
  vw값 = (Figma px / designWidth) × 100
113
+ ⛔ clamp, min(), max() 등은 font-size에만 허용
87
114
 
88
115
  폰트 → clamp(최소, vw, 최대):
89
116
  | 역할 | 최소 | 판단 기준 |
@@ -93,6 +120,7 @@ vw 변환:
93
120
  | 본문 | 12px | 긴 텍스트 |
94
121
  | 캡션 | 10px | 작은 fontSize |
95
122
  | 버튼 | 12px | name에 "btn" |
123
+ 최대값 = Figma 원본 px 그대로
96
124
 
97
125
  변환하지 않는 속성:
98
126
  color, opacity, font-weight, font-family, z-index, text-align,
@@ -182,7 +210,15 @@ diff 처리:
182
210
  ## 7. 자가 검증
183
211
 
184
212
  ```
213
+ ⛔ 하나라도 실패 → 해당 섹션 코드 재작성 (다음 섹션 진행 금지)
214
+
185
215
  1. 클래스명: template 모든 class가 SCSS에 정의 → OK
186
216
  2. 이미지 경로: src가 실제 파일 존재 → OK
187
217
  3. 트리 매핑: Auto Layout 노드 → SCSS에 flex 있음 → OK
218
+ 4. ⛔ 추상화 금지: SCSS에 @function, @mixin 자체 정의가 없음 → OK
219
+ (프로젝트 기존 토큰 @use는 허용, 새 함수/믹스인 생성은 금지)
220
+ 5. ⛔ 속성 매핑: SCSS의 모든 속성이 tree.json css 객체에 근거 → OK
221
+ (aspect-ratio, container, custom property 등 tree.json에 없는 속성 → FAIL)
222
+ 6. ⛔ 이미지 파일명: kebab-case 네이밍 → OK
223
+ (해시 파일명 68ad470b.webp 등 → FAIL)
188
224
  ```
@@ -89,6 +89,12 @@ box-shadow, opacity, mix-blend-mode, filter, backdrop-filter
89
89
 
90
90
  스토리보드 CONFIG에서 designWidth, minWidth 확보.
91
91
 
92
+ ⛔ **커스텀 함수 생성 금지:**
93
+ ❌ @function wp-fluid(...) { ... }
94
+ ❌ @mixin wp-bg-layer { ... }
95
+ ❌ 자체 추상화 (aspect-ratio, clamp 남용)
96
+ ✅ vw 변환은 인라인 계산값을 직접 기입
97
+
92
98
  **UI 요소 → vw 비례:**
93
99
  vw값 = (Figma px / designWidth) × 100
94
100
  적용: width, height, padding, gap, margin, border-radius,
@@ -120,9 +126,15 @@ BEM 패턴: `.sectionName__childName`
120
126
 
121
127
  ## 자가 검증 (코드 작성 후)
122
128
 
129
+ ⛔ 하나라도 실패 → 코드 재작성 (다음 섹션 진행 금지)
130
+
123
131
  - [ ] ⛔ BG 프레임이 <img> 태그로 처리되지 않았는가? (CSS background-image만 허용)
124
132
  - [ ] ⛔ TEXT 자식이 있는 프레임이 통째 이미지로 처리되지 않았는가?
125
133
  - [ ] ⛔ INSTANCE 반복 패턴(카드/아이템)이 이미지 1장으로 처리되지 않았는가?
134
+ - [ ] ⛔ SCSS에 @function 또는 @mixin 자체 정의가 없는가? (기존 토큰 @use만 허용)
135
+ - [ ] ⛔ aspect-ratio 등 tree.json에 없는 CSS 속성이 없는가?
136
+ - [ ] ⛔ 이미지 파일명이 kebab-case인가? (해시 파일명 금지)
137
+ - [ ] ⛔ 디자인 텍스트(그래디언트/스트로크 효과)가 이미지로 처리되었는가?
126
138
  - [ ] template 클래스 ↔ SCSS 클래스 1:1 일치
127
139
  - [ ] 모든 img src가 static/에 실제 존재
128
140
  - [ ] Auto Layout 노드 → SCSS에 flex 속성 존재
@@ -22,7 +22,7 @@ Figma REST API(`src/infra/lib/figma/`)를 사용하여 **구조적 코드 생성
22
22
 
23
23
  ```
24
24
  Bash:
25
- node "[FIGMA_SCRIPT]" tree {fileKey} {nodeId} --depth=10
25
+ node "[FIGMA_SCRIPT]" tree {fileKey} {nodeId}
26
26
 
27
27
  반환 (FigmaNode JSON):
28
28
  {
@@ -134,6 +134,14 @@ BG 프레임 판별 기준:
134
134
  - 아이콘 (VECTOR/GROUP 크기 ≤ 64px)
135
135
  - 아이템/보상 썸네일 (name에 "item", "reward", "token", "coin")
136
136
  - 벡터 글자 GROUP (부모 아래 VECTOR 3개 이상, 각 <60px)
137
+ - ⛔ 디자인 텍스트 (다음 중 하나):
138
+ · TEXT 노드 fills 2개 이상 (그래디언트+솔리드 중첩)
139
+ · TEXT 노드에 effects 있음 (DROP_SHADOW, stroke)
140
+ · TEXT 노드 fills에 GRADIENT 타입 포함
141
+ · 프로젝트 웹폰트에 없는 fontFamily
142
+ → 반드시 렌더링 대상에 포함
143
+ - 장식 패널 (목재 간판, 금속 플레이트 등 텍스처 배경)
144
+ → BG 프레임과 동일하게 렌더링
137
145
 
138
146
  렌더링:
139
147
  node "[FIGMA_SCRIPT]" screenshot {fileKey} {node.nodeId} --out=/tmp/{feature}/content/{name}.webp
@@ -173,7 +181,27 @@ BG 프레임 판별 기준:
173
181
  | 분류 | 처리 |
174
182
  |------|------|
175
183
  | BG 프레임 | 프레임 렌더링 → bg/ |
184
+ | 디자인 텍스트 | 노드 렌더링 → content/ |
176
185
  | 벡터 글자 | GROUP 렌더링 → content/ |
177
186
  | 콘텐츠 | 노드 렌더링 → content/ |
187
+ | 장식 패널 | 프레임 렌더링 → content/ |
178
188
  | 장식 | BG 렌더링에 포함 |
179
189
  ```
190
+
191
+ ---
192
+
193
+ ## 5. 추출 완료 검증 (Phase 3 진입 전 필수)
194
+
195
+ ```
196
+ ⛔ 하나라도 누락 → 재추출 (Phase 3 진행 금지)
197
+
198
+ 1. tree.json 존재 + 루트 노드 children > 0
199
+ 2. 각 섹션별 BG → bg/ 에 파일 존재
200
+ 3. 디자인 텍스트 체크:
201
+ tree.json 순회 → fills 2개 이상 또는 effects 있는 TEXT 노드 목록 생성
202
+ → 해당 노드 전부 content/ 에 렌더링 파일 존재
203
+ 4. 벡터 글자 체크:
204
+ GROUP 아래 VECTOR 3개 이상 → content/ 에 렌더링 파일 존재
205
+ 5. 섹션별 검증용 스크린샷 → sections/ 에 파일 존재
206
+ 6. 파일명 규칙: 모두 kebab-case (해시 파일명 없음)
207
+ ```
@@ -82,17 +82,29 @@ BG 프레임 = 다음 중 하나:
82
82
  - 웹폰트 없는 장식 타이틀 ("MISSION 01" 등)
83
83
  - VECTOR 타입으로 분해된 글자 → GROUP 렌더링
84
84
 
85
- 2. 합성 배경 (BG 프레임):
85
+ 2. 디자인 텍스트 (NEW — 그래디언트/스트로크/다중 효과 텍스트):
86
+ - TEXT 노드의 fills 2개 이상 (그래디언트+솔리드 중첩)
87
+ - TEXT 노드에 effects 있음 (DROP_SHADOW, stroke)
88
+ - TEXT 노드의 fills에 GRADIENT 타입 포함
89
+ - → 해당 TEXT 노드(또는 감싸는 GROUP)를 통째 렌더링
90
+ - → content/{section}-title.webp 등으로 저장
91
+ - ❌ CSS text-shadow/gradient로 근사치 구현 금지
92
+
93
+ 3. 합성 배경 (BG 프레임):
86
94
  - 눈, 나무, 파티클 등 장식 레이어 합성물
87
95
  - 텍스트 미포함 확인 필수
88
96
 
89
- 3. 래스터 이미지 에셋:
97
+ 4. 래스터 이미지 에셋:
90
98
  - 게임 아이템 썸네일, 코인 아이콘 등
91
99
  - imageRef가 있는 개별 RECTANGLE/노드
92
100
 
93
- 4. 복잡한 벡터 그래픽:
101
+ 5. 복잡한 벡터 그래픽:
94
102
  - CSS로 재현 불가능한 일러스트/아이콘
95
103
  - VECTOR/GROUP 조합의 복잡한 그래픽
104
+
105
+ 6. 장식 패널 배경 (목재 간판, 금속 플레이트 등):
106
+ - CSS로 재현 불가능한 텍스처/질감 배경
107
+ - → BG 프레임과 동일하게 렌더링 → background-image로 적용
96
108
  ```
97
109
 
98
110
  ## Format