timelabs 0.1.0 → 0.1.1
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/dist/index.js +30 -20
- package/package.json +1 -1
- package/skills/web-design/claude-code/SKILL.md +270 -0
- package/skills/web-design/claude-code/analyze/analyze-benchmark-rules.md +229 -0
- package/skills/web-design/claude-code/analyze/analyze-benchmark.md +302 -0
- package/skills/web-design/claude-code/analyze/analyze-mockup.md +572 -0
- package/skills/web-design/claude-code/collect/collect-app.md +258 -0
- package/skills/web-design/claude-code/collect/collect-desktop.md +231 -0
- package/skills/web-design/claude-code/collect/collect-hybrid.md +222 -0
- package/skills/web-design/claude-code/collect/collect-style.md +155 -0
- package/skills/web-design/claude-code/collect/collect-type.md +42 -0
- package/skills/web-design/claude-code/collect/collect-video.md +239 -0
- package/skills/web-design/claude-code/collect/collect-web.md +279 -0
- package/skills/web-design/claude-code/defs/ai-recommend/01-style-design-recommend.md +64 -0
- package/skills/web-design/claude-code/defs/ai-recommend.md +58 -0
- package/skills/web-design/claude-code/defs/app-layouts/02-utility.md +54 -0
- package/skills/web-design/claude-code/defs/app-layouts/03-social.md +71 -0
- package/skills/web-design/claude-code/defs/app-layouts/04-game.md +54 -0
- package/skills/web-design/claude-code/defs/app-layouts/05-fintech.md +62 -0
- package/skills/web-design/claude-code/defs/app-layouts/06-healthcare.md +66 -0
- package/skills/web-design/claude-code/defs/app-layouts/07-ecommerce.md +63 -0
- package/skills/web-design/claude-code/defs/app-layouts/08-education.md +88 -0
- package/skills/web-design/claude-code/defs/app-layouts/09-creative.md +86 -0
- package/skills/web-design/claude-code/defs/app-layouts.md +59 -0
- package/skills/web-design/claude-code/defs/app-motions/01-utility.md +51 -0
- package/skills/web-design/claude-code/defs/app-motions/02-social.md +55 -0
- package/skills/web-design/claude-code/defs/app-motions/03-game.md +52 -0
- package/skills/web-design/claude-code/defs/app-motions/04-fintech.md +52 -0
- package/skills/web-design/claude-code/defs/app-motions/05-healthcare.md +52 -0
- package/skills/web-design/claude-code/defs/app-motions/06-ecommerce.md +55 -0
- package/skills/web-design/claude-code/defs/app-motions/07-education.md +54 -0
- package/skills/web-design/claude-code/defs/app-motions/08-creative.md +53 -0
- package/skills/web-design/claude-code/defs/app-motions/10-intensity-preset-motion.md +12 -0
- package/skills/web-design/claude-code/defs/app-motions.md +64 -0
- package/skills/web-design/claude-code/defs/component-specs/01-set-component.md +24 -0
- package/skills/web-design/claude-code/defs/component-specs/02-features-flow.md +51 -0
- package/skills/web-design/claude-code/defs/component-specs/03-system-visual.md +193 -0
- package/skills/web-design/claude-code/defs/component-specs/04-interaction-pattern-visual.md +61 -0
- package/skills/web-design/claude-code/defs/component-specs/domains/admin.md +55 -0
- package/skills/web-design/claude-code/defs/component-specs/domains/dashboard.md +60 -0
- package/skills/web-design/claude-code/defs/component-specs/domains/erp.md +68 -0
- package/skills/web-design/claude-code/defs/component-specs/domains/saas.md +65 -0
- package/skills/web-design/claude-code/defs/component-specs.md +24 -0
- package/skills/web-design/claude-code/defs/design-guide-sections.md +37 -0
- package/skills/web-design/claude-code/defs/desktop-layouts/01-utility.md +69 -0
- package/skills/web-design/claude-code/defs/desktop-layouts/02-data.md +71 -0
- package/skills/web-design/claude-code/defs/desktop-layouts/03-creative.md +73 -0
- package/skills/web-design/claude-code/defs/desktop-layouts/04-communication.md +71 -0
- package/skills/web-design/claude-code/defs/desktop-layouts/05-game.md +73 -0
- package/skills/web-design/claude-code/defs/desktop-layouts/06-business.md +74 -0
- package/skills/web-design/claude-code/defs/desktop-layouts.md +49 -0
- package/skills/web-design/claude-code/defs/desktop-motions/01-utility.md +56 -0
- package/skills/web-design/claude-code/defs/desktop-motions/02-data.md +60 -0
- package/skills/web-design/claude-code/defs/desktop-motions/03-creative.md +60 -0
- package/skills/web-design/claude-code/defs/desktop-motions/04-communication.md +57 -0
- package/skills/web-design/claude-code/defs/desktop-motions/05-game.md +55 -0
- package/skills/web-design/claude-code/defs/desktop-motions/06-business.md +52 -0
- package/skills/web-design/claude-code/defs/desktop-motions.md +75 -0
- package/skills/web-design/claude-code/defs/hybrid-layouts/01-web_mobile.md +81 -0
- package/skills/web-design/claude-code/defs/hybrid-layouts/02-web_desktop.md +78 -0
- package/skills/web-design/claude-code/defs/hybrid-layouts/03-mobile_desktop.md +79 -0
- package/skills/web-design/claude-code/defs/hybrid-layouts/04-all.md +81 -0
- package/skills/web-design/claude-code/defs/hybrid-layouts.md +49 -0
- package/skills/web-design/claude-code/defs/hybrid-motions/01-web_mobile.md +69 -0
- package/skills/web-design/claude-code/defs/hybrid-motions/02-web_desktop.md +69 -0
- package/skills/web-design/claude-code/defs/hybrid-motions/03-mobile_desktop.md +74 -0
- package/skills/web-design/claude-code/defs/hybrid-motions/04-all.md +96 -0
- package/skills/web-design/claude-code/defs/hybrid-motions/07-intensity-preset-motion.md +16 -0
- package/skills/web-design/claude-code/defs/hybrid-motions.md +65 -0
- package/skills/web-design/claude-code/defs/ia-patterns/01-management-dashboard.md +37 -0
- package/skills/web-design/claude-code/defs/ia-patterns/05-video.md +33 -0
- package/skills/web-design/claude-code/defs/ia-patterns/06-video_saas-saas.md +37 -0
- package/skills/web-design/claude-code/defs/ia-patterns.md +85 -0
- package/skills/web-design/claude-code/defs/icon-mappings/04-mapping-design-system.md +25 -0
- package/skills/web-design/claude-code/defs/icon-mappings.md +49 -0
- package/skills/web-design/claude-code/defs/icon-usage.md +56 -0
- package/skills/web-design/claude-code/defs/illustration-guide.md +44 -0
- package/skills/web-design/claude-code/defs/image-strategies/01-landing.md +76 -0
- package/skills/web-design/claude-code/defs/image-strategies/02-dashboard.md +51 -0
- package/skills/web-design/claude-code/defs/image-strategies/03-ecommerce.md +47 -0
- package/skills/web-design/claude-code/defs/image-strategies/04-blog.md +58 -0
- package/skills/web-design/claude-code/defs/image-strategies/05-saas.md +56 -0
- package/skills/web-design/claude-code/defs/image-strategies/06-portfolio.md +62 -0
- package/skills/web-design/claude-code/defs/image-strategies/08-strategy-common-image.md +57 -0
- package/skills/web-design/claude-code/defs/image-strategies.md +58 -0
- package/skills/web-design/claude-code/defs/seo-guide.md +79 -0
- package/skills/web-design/claude-code/defs/styles/02-style-list.md +421 -0
- package/skills/web-design/claude-code/defs/styles/03-custom-animation-keyframes.md +39 -0
- package/skills/web-design/claude-code/defs/styles.md +50 -0
- package/skills/web-design/claude-code/defs/tokens/01-token-format.md +75 -0
- package/skills/web-design/claude-code/defs/tokens/02-token-scope.md +251 -0
- package/skills/web-design/claude-code/defs/tokens.md +24 -0
- package/skills/web-design/claude-code/defs/video-compositions/01-composition-single.md +66 -0
- package/skills/web-design/claude-code/defs/video-compositions/02-composition-multi.md +66 -0
- package/skills/web-design/claude-code/defs/video-compositions/03-composition-parametric.md +81 -0
- package/skills/web-design/claude-code/defs/video-compositions.md +37 -0
- package/skills/web-design/claude-code/defs/video-motions/01-animation-basic.md +49 -0
- package/skills/web-design/claude-code/defs/video-motions/02-animation.md +52 -0
- package/skills/web-design/claude-code/defs/video-motions/03-reference.md +17 -0
- package/skills/web-design/claude-code/defs/video-motions/05-pattern-composition.md +61 -0
- package/skills/web-design/claude-code/defs/video-motions/06-transition-effects.md +49 -0
- package/skills/web-design/claude-code/defs/video-motions/07-audio-sync.md +29 -0
- package/skills/web-design/claude-code/defs/video-motions.md +55 -0
- package/skills/web-design/claude-code/defs/web-layouts/01-landing.md +101 -0
- package/skills/web-design/claude-code/defs/web-layouts/02-dashboard.md +85 -0
- package/skills/web-design/claude-code/defs/web-layouts/03-ecommerce.md +73 -0
- package/skills/web-design/claude-code/defs/web-layouts/04-blog.md +69 -0
- package/skills/web-design/claude-code/defs/web-layouts/05-saas.md +83 -0
- package/skills/web-design/claude-code/defs/web-layouts/06-portfolio.md +62 -0
- package/skills/web-design/claude-code/defs/web-layouts.md +38 -0
- package/skills/web-design/claude-code/defs/web-motions/01-landing.md +91 -0
- package/skills/web-design/claude-code/defs/web-motions/02-dashboard.md +55 -0
- package/skills/web-design/claude-code/defs/web-motions/03-ecommerce.md +52 -0
- package/skills/web-design/claude-code/defs/web-motions/04-blog.md +57 -0
- package/skills/web-design/claude-code/defs/web-motions/05-saas.md +49 -0
- package/skills/web-design/claude-code/defs/web-motions/06-portfolio.md +73 -0
- package/skills/web-design/claude-code/defs/web-motions/08-intensity-preset-motion.md +14 -0
- package/skills/web-design/claude-code/defs/web-motions.md +55 -0
- package/skills/web-design/claude-code/gen/gen-design-guide/01-project-overview.md +304 -0
- package/skills/web-design/claude-code/gen/gen-design-guide-interaction/01-interaction-motion.md +129 -0
- package/skills/web-design/claude-code/gen/gen-design-guide-interaction/04-project-video.md +69 -0
- package/skills/web-design/claude-code/gen/gen-design-guide-interaction.md +45 -0
- package/skills/web-design/claude-code/gen/gen-design-guide.md +43 -0
- package/skills/web-design/claude-code/gen/gen-tokens/01-generate-process.md +318 -0
- package/skills/web-design/claude-code/gen/gen-tokens/02-structure-output-file.md +31 -0
- package/skills/web-design/claude-code/gen/gen-tokens/03-connect-frontend.md +150 -0
- package/skills/web-design/claude-code/gen/gen-tokens.md +54 -0
- package/skills/web-design/claude-code/gen/gen-video.md +73 -0
- package/skills/web-design/claude-code/verify/verify-components.md +52 -0
- package/skills/web-design/claude-code/verify/verify-motions.md +74 -0
- package/skills/web-design/claude-code/verify/verify-pipeline.md +69 -0
- package/skills/web-design/claude-code/verify/verify-report.md +75 -0
- package/skills/web-design/claude-code/verify/verify-responsive.md +49 -0
- package/skills/web-design/claude-code/verify/verify-tokens.md +84 -0
- package/skills/test-skill/claude-code/SKILL.md +0 -7
- package/skills/test-skill/cursor/test-skill.md +0 -7
- package/skills/test-skill/openclaw/SKILL.md +0 -13
- package/skills/test-skill/skill.json +0 -6
|
@@ -0,0 +1,318 @@
|
|
|
1
|
+
# 생성 프로세스
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
### 1. 스타일 해석
|
|
5
|
+
|
|
6
|
+
`config.style`로 `defs/styles.md`에서 해당 스타일의 색상 정의를 가져옵니다.
|
|
7
|
+
|
|
8
|
+
```
|
|
9
|
+
style = styles[config.style]
|
|
10
|
+
primary = style.primary
|
|
11
|
+
background = style.background
|
|
12
|
+
accent = style.accent
|
|
13
|
+
```
|
|
14
|
+
|
|
15
|
+
#### 경쟁사 색상 차별화 체크 (리서치 데이터 있을 때)
|
|
16
|
+
|
|
17
|
+
```
|
|
18
|
+
if config.research.enabled && config.research.ux.color_palettes exists:
|
|
19
|
+
competitor_primaries = research.ux.color_palettes.map(p => p.colors[0])
|
|
20
|
+
|
|
21
|
+
if style.primary와 competitor_primaries 중 유사한 색상 존재:
|
|
22
|
+
→ "⚠️ 경쟁사 색상 겹침 경고: {competitor_name}의 primary color({color})와 유사합니다."
|
|
23
|
+
→ "💡 차별화 제안: accent 색상을 강화하거나, primary를 {shifted_color}로 조정 고려"
|
|
24
|
+
|
|
25
|
+
# 토큰 생성 시 참고 정보로 주석 포함
|
|
26
|
+
→ base.json 또는 variables.css에 주석 추가:
|
|
27
|
+
"/* 경쟁사 참고: {competitor_name}: {color} - 차별화 확인 완료 */"
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
> **리서치 미실행 시**: 차별화 체크를 건너뛰고 기존 방식으로 토큰을 생성합니다.
|
|
31
|
+
|
|
32
|
+
### 2. 토큰 범위별 데이터 생성
|
|
33
|
+
|
|
34
|
+
`config.token_scope[]`에 포함된 항목만 생성합니다.
|
|
35
|
+
|
|
36
|
+
#### Colors (`colors` in scope)
|
|
37
|
+
|
|
38
|
+
> 값 정의: defs/tokens.md § 1 참조
|
|
39
|
+
|
|
40
|
+
**gen 고유 로직 — tint/shade 생성 함수:**
|
|
41
|
+
|
|
42
|
+
```
|
|
43
|
+
primary 스케일 생성:
|
|
44
|
+
50~400: tint(primary, 95%/90%/75%/50%/25%)
|
|
45
|
+
500: {primary} 원본
|
|
46
|
+
600~900: shade(primary, 10%/25%/40%/60%)
|
|
47
|
+
|
|
48
|
+
secondary, accent도 동일 패턴 적용
|
|
49
|
+
|
|
50
|
+
background 파생:
|
|
51
|
+
card: lighten(background, 5%)
|
|
52
|
+
elevated: lighten(background, 10%)
|
|
53
|
+
|
|
54
|
+
text 파생:
|
|
55
|
+
primary: contrast(background)
|
|
56
|
+
secondary: opacity(contrast(background), 0.7)
|
|
57
|
+
disabled: opacity(contrast(background), 0.4)
|
|
58
|
+
|
|
59
|
+
border 파생:
|
|
60
|
+
DEFAULT: opacity(contrast(background), 0.15)
|
|
61
|
+
strong: opacity(contrast(background), 0.3)
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
#### Typography (`typography` in scope)
|
|
65
|
+
|
|
66
|
+
> 값 정의: defs/tokens.md § 2 참조
|
|
67
|
+
|
|
68
|
+
#### Semantic Colors (`colors` in scope — 항상 함께 생성)
|
|
69
|
+
|
|
70
|
+
primitive 토큰 위에 **시맨틱 레이어**를 추가합니다. UI 컴포넌트는 primitive 대신 semantic 토큰을 참조합니다.
|
|
71
|
+
|
|
72
|
+
```json
|
|
73
|
+
{
|
|
74
|
+
"semantic": {
|
|
75
|
+
"bg": {
|
|
76
|
+
"primary": "{color.background.DEFAULT}",
|
|
77
|
+
"secondary": "{color.background.card}",
|
|
78
|
+
"tertiary": "{color.background.elevated}"
|
|
79
|
+
},
|
|
80
|
+
"text": {
|
|
81
|
+
"primary": "{color.text.primary}",
|
|
82
|
+
"secondary": "{color.text.secondary}",
|
|
83
|
+
"disabled": "{color.text.disabled}"
|
|
84
|
+
},
|
|
85
|
+
"border": {
|
|
86
|
+
"default": "{color.border.DEFAULT}",
|
|
87
|
+
"focus": "{color.primary.500}"
|
|
88
|
+
},
|
|
89
|
+
"interactive": {
|
|
90
|
+
"primary": "{color.primary.500}",
|
|
91
|
+
"primary-hover": "{color.primary.600}",
|
|
92
|
+
"primary-active": "{color.primary.700}",
|
|
93
|
+
"secondary": "{color.accent 또는 #6C757D}",
|
|
94
|
+
"danger": "{color.status.error}",
|
|
95
|
+
"danger-hover": "{darken(color.status.error, 15%)}"
|
|
96
|
+
},
|
|
97
|
+
"feedback": {
|
|
98
|
+
"success": "{color.status.success}",
|
|
99
|
+
"warning": "{color.status.warning}",
|
|
100
|
+
"error": "{color.status.error}",
|
|
101
|
+
"info": "{color.status.info}"
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
```
|
|
106
|
+
|
|
107
|
+
> **다크/라이트 분기**: `config.theme == "system"` 시 semantic 값이 테마별로 다르게 매핑됩니다. CSS Variables 출력 시 `:root` (light)와 `[data-theme="dark"]` 각각 생성합니다.
|
|
108
|
+
|
|
109
|
+
#### Animations (`animations` in scope)
|
|
110
|
+
|
|
111
|
+
> 값 정의: defs/tokens.md § 6 참조
|
|
112
|
+
> 참조: `defs/styles.md`의 **Animation** 필드 + 커스텀 애니메이션 키프레임 레퍼런스
|
|
113
|
+
|
|
114
|
+
`config.style`에 해당하는 스타일의 커스텀 키프레임을 생성합니다.
|
|
115
|
+
|
|
116
|
+
**스타일별 키프레임 매핑:**
|
|
117
|
+
|
|
118
|
+
| 스타일 계열 | 포함 키프레임 |
|
|
119
|
+
|------------|-------------|
|
|
120
|
+
| A, R, V, Z (다크/글로우) | `neon-flicker`, `neon-blink`, `twinkle`, `glitch` |
|
|
121
|
+
| E, G, S, W (부유/자연) | `float`, `float-gentle`, `sway`, `breathe` |
|
|
122
|
+
| B, H, O (그라데이션) | `gradient-flow`, `shimmer` |
|
|
123
|
+
| F, L, N (인터랙티브) | `bounce-in`, `wiggle`, `shake` |
|
|
124
|
+
| T (파이어) | `flame-flicker` |
|
|
125
|
+
| X (아트데코) | `gold-sweep` |
|
|
126
|
+
| D, I, J, K, M, Q, U (미니멀/기능) | 공통 키프레임만 |
|
|
127
|
+
|
|
128
|
+
#### Interactions (`interactions` in scope)
|
|
129
|
+
|
|
130
|
+
> 값 정의: defs/tokens.md § 6b 참조
|
|
131
|
+
> 참조: `defs/styles.md`의 **Hover / Shadow / Border / BG Pattern / Decoration / Gradient** 필드
|
|
132
|
+
|
|
133
|
+
#### Backgrounds (`backgrounds` in scope)
|
|
134
|
+
|
|
135
|
+
> 값 정의: defs/tokens.md § 8 참조
|
|
136
|
+
> 참조: `defs/styles.md`의 **BG_Pattern / Gradient / Image_Interaction** 필드
|
|
137
|
+
|
|
138
|
+
#### Icons (`icons` in scope)
|
|
139
|
+
|
|
140
|
+
> 값 정의: defs/tokens.md § 9 참조
|
|
141
|
+
> 참조: `defs/icon-usage.md`
|
|
142
|
+
|
|
143
|
+
#### Visual Interactions (`visual_interactions` in scope)
|
|
144
|
+
|
|
145
|
+
> 값 정의: defs/tokens.md § 10 참조
|
|
146
|
+
> 참조: `defs/styles.md`의 **Image_Interaction** 필드
|
|
147
|
+
|
|
148
|
+
#### Dividers (`dividers` in scope)
|
|
149
|
+
|
|
150
|
+
> 값 정의: defs/tokens.md § 11 참조
|
|
151
|
+
> 참조: `defs/styles.md`의 **Section_Divider** 필드
|
|
152
|
+
|
|
153
|
+
#### Illustrations (`illustrations` in scope)
|
|
154
|
+
|
|
155
|
+
> 값 정의: defs/tokens.md § 12 참조
|
|
156
|
+
> 참조: `defs/illustration-guide.md`
|
|
157
|
+
|
|
158
|
+
#### 나머지 범위
|
|
159
|
+
|
|
160
|
+
`defs/tokens.md`의 정의에 따라 생성합니다.
|
|
161
|
+
|
|
162
|
+
### 3. 테마 적용
|
|
163
|
+
|
|
164
|
+
#### `config.theme == "dark"`
|
|
165
|
+
- background → 어두운 톤 사용
|
|
166
|
+
- text.primary → 밝은 색상
|
|
167
|
+
|
|
168
|
+
#### `config.theme == "light"`
|
|
169
|
+
- background → 밝은 톤 사용
|
|
170
|
+
- text.primary → 어두운 색상
|
|
171
|
+
|
|
172
|
+
#### `config.theme == "system"`
|
|
173
|
+
- light/dark 두 세트 모두 생성
|
|
174
|
+
- CSS Variables 사용 시 `[data-theme]` 분기
|
|
175
|
+
|
|
176
|
+
### 4. 형식별 출력
|
|
177
|
+
|
|
178
|
+
> 기본 형식 예시: defs/tokens.md § 토큰 형식 참조
|
|
179
|
+
|
|
180
|
+
#### Tailwind Config (`tailwind`)
|
|
181
|
+
|
|
182
|
+
생성 위치: `design/tokens/tailwind.config.js`
|
|
183
|
+
→ 생성된 토큰 데이터를 `theme.extend` 하위에 매핑
|
|
184
|
+
|
|
185
|
+
#### JSON + CSS Variables (`css_variables`)
|
|
186
|
+
|
|
187
|
+
생성 위치: `design/tokens/base.json` + `design/tokens/variables.css`
|
|
188
|
+
→ `config.theme == "system"` 시 `:root` (light) + `[data-theme="dark"]` 분기 생성
|
|
189
|
+
|
|
190
|
+
#### Style Dictionary + W3C DTCG (`style_dictionary`)
|
|
191
|
+
|
|
192
|
+
**W3C DTCG 표준 포맷** (2025.10 안정 버전)을 사용합니다. `$value`, `$type`, `$description` 프리픽스, 파일 확장자 `.tokens.json`.
|
|
193
|
+
|
|
194
|
+
> 기본 DTCG 구조: defs/tokens.md § 4 (Style Dictionary) 참조
|
|
195
|
+
|
|
196
|
+
**gen 고유 로직 — DTCG 변환:**
|
|
197
|
+
- 각 토큰을 `{ "$value": ..., "$type": ..., "$description": ... }` 구조로 래핑
|
|
198
|
+
- primitive 토큰과 semantic 토큰을 별도 `.tokens.json` 파일로 분리
|
|
199
|
+
- `sd.config.mjs`: Style Dictionary 4.0 ESM 설정 자동 생성 (source + platforms)
|
|
200
|
+
|
|
201
|
+
> **⚠️ 모바일 앱 프로젝트 (config.project_type == "app"):**
|
|
202
|
+
> `config.frontend`가 `react_native`인 경우 `reactNative` 플랫폼을 추가합니다.
|
|
203
|
+
> `config.frontend`가 `flutter`인 경우 `flutter` 플랫폼을 추가합니다.
|
|
204
|
+
|
|
205
|
+
```json
|
|
206
|
+
// config.frontend == "react_native" 시 추가되는 플랫폼:
|
|
207
|
+
{
|
|
208
|
+
"platforms": {
|
|
209
|
+
"css": { "transformGroup": "css", "buildPath": "build/css/" },
|
|
210
|
+
"ios": { "transformGroup": "ios-swift", "buildPath": "build/ios/" },
|
|
211
|
+
"android": { "transformGroup": "android", "buildPath": "build/android/" },
|
|
212
|
+
"reactNative": {
|
|
213
|
+
"transformGroup": "react-native",
|
|
214
|
+
"buildPath": "build/rn/",
|
|
215
|
+
"files": [
|
|
216
|
+
{
|
|
217
|
+
"destination": "tokens.ts",
|
|
218
|
+
"format": "javascript/es6"
|
|
219
|
+
}
|
|
220
|
+
]
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
```
|
|
225
|
+
|
|
226
|
+
```json
|
|
227
|
+
// config.frontend == "flutter" 시 추가되는 플랫폼:
|
|
228
|
+
{
|
|
229
|
+
"platforms": {
|
|
230
|
+
"css": { "transformGroup": "css", "buildPath": "build/css/" },
|
|
231
|
+
"ios": { "transformGroup": "ios-swift", "buildPath": "build/ios/" },
|
|
232
|
+
"android": { "transformGroup": "android", "buildPath": "build/android/" },
|
|
233
|
+
"flutter": {
|
|
234
|
+
"transformGroup": "flutter",
|
|
235
|
+
"buildPath": "build/flutter/",
|
|
236
|
+
"files": [
|
|
237
|
+
{
|
|
238
|
+
"destination": "tokens.dart",
|
|
239
|
+
"format": "flutter/class.dart"
|
|
240
|
+
}
|
|
241
|
+
]
|
|
242
|
+
}
|
|
243
|
+
}
|
|
244
|
+
}
|
|
245
|
+
```
|
|
246
|
+
|
|
247
|
+
#### JSON Only (`json`)
|
|
248
|
+
|
|
249
|
+
생성 위치: `design/tokens/base.json`
|
|
250
|
+
→ 전체 토큰을 단일 JSON으로 출력
|
|
251
|
+
|
|
252
|
+
#### 비디오용 JS 토큰 내보내기 (project_type == "video")
|
|
253
|
+
|
|
254
|
+
> 조건: `config.project_type == "video"`
|
|
255
|
+
|
|
256
|
+
비디오 프로젝트는 CSS가 아닌 JS/TS에서 직접 토큰을 참조합니다.
|
|
257
|
+
`design/tokens/base.json` 외에 `src/lib/colors.ts`로 JS 토큰을 내보냅니다.
|
|
258
|
+
|
|
259
|
+
```typescript
|
|
260
|
+
// src/lib/colors.ts (자동 생성)
|
|
261
|
+
// 디자인 토큰 - 비디오 프로젝트용 JS 내보내기
|
|
262
|
+
// design/tokens/base.json 기반 자동 생성
|
|
263
|
+
|
|
264
|
+
export const colors = {
|
|
265
|
+
primary: "{style.primary}",
|
|
266
|
+
primaryHover: "{darken(primary, 15%)}",
|
|
267
|
+
secondary: "{style.accent}",
|
|
268
|
+
background: "{style.background}",
|
|
269
|
+
text: {
|
|
270
|
+
primary: "{contrast(background)}",
|
|
271
|
+
secondary: "{opacity(contrast(background), 0.7)}",
|
|
272
|
+
disabled: "{opacity(contrast(background), 0.4)}",
|
|
273
|
+
},
|
|
274
|
+
status: {
|
|
275
|
+
success: "#10b981",
|
|
276
|
+
warning: "#f59e0b",
|
|
277
|
+
error: "#ef4444",
|
|
278
|
+
info: "#3b82f6",
|
|
279
|
+
},
|
|
280
|
+
} as const;
|
|
281
|
+
|
|
282
|
+
export const typography = {
|
|
283
|
+
fontFamily: {
|
|
284
|
+
sans: "Inter, system-ui, sans-serif",
|
|
285
|
+
mono: "JetBrains Mono, monospace",
|
|
286
|
+
},
|
|
287
|
+
fontSize: {
|
|
288
|
+
display: 64,
|
|
289
|
+
h1: 48,
|
|
290
|
+
h2: 36,
|
|
291
|
+
h3: 28,
|
|
292
|
+
body: 20,
|
|
293
|
+
caption: 16,
|
|
294
|
+
},
|
|
295
|
+
fontWeight: {
|
|
296
|
+
regular: "400",
|
|
297
|
+
medium: "500",
|
|
298
|
+
semibold: "600",
|
|
299
|
+
bold: "700",
|
|
300
|
+
},
|
|
301
|
+
} as const;
|
|
302
|
+
|
|
303
|
+
export const animations = {
|
|
304
|
+
duration: {
|
|
305
|
+
fast: 10, // 프레임 단위
|
|
306
|
+
normal: 20,
|
|
307
|
+
slow: 30,
|
|
308
|
+
slower: 45,
|
|
309
|
+
},
|
|
310
|
+
} as const;
|
|
311
|
+
```
|
|
312
|
+
|
|
313
|
+
**생성 규칙:**
|
|
314
|
+
- `config.style`에서 색상값 추출 → `colors` 객체 생성
|
|
315
|
+
- 비디오에서는 `rem` 대신 `px` 사용 (고정 캔버스)
|
|
316
|
+
- 애니메이션 duration은 프레임 단위 (초가 아님)
|
|
317
|
+
- `as const`로 타입 안전성 확보
|
|
318
|
+
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
# 출력 파일 구조
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
```
|
|
5
|
+
design/tokens/
|
|
6
|
+
├── base.json # 항상 생성 (primitive + semantic 토큰)
|
|
7
|
+
│
|
|
8
|
+
│ [tailwind]
|
|
9
|
+
├── tailwind.config.js # Tailwind 설정 (semantic 토큰 포함)
|
|
10
|
+
│
|
|
11
|
+
│ [css_variables]
|
|
12
|
+
├── variables.css # CSS 커스텀 속성 (semantic 변수 포함)
|
|
13
|
+
├── visual.css # 비주얼 토큰 (backgrounds, icons, interactions, dividers)
|
|
14
|
+
│
|
|
15
|
+
│ [style_dictionary]
|
|
16
|
+
└── style-dictionary/
|
|
17
|
+
├── color.tokens.json # DTCG 포맷 ($value, $type)
|
|
18
|
+
├── typography.tokens.json
|
|
19
|
+
├── spacing.tokens.json
|
|
20
|
+
├── semantic.tokens.json # 시맨틱 토큰 (별도 파일)
|
|
21
|
+
├── visual.tokens.json # 비주얼 토큰 (backgrounds, icons, interactions, dividers, illustrations)
|
|
22
|
+
├── sd.config.mjs # Style Dictionary 4.0 ESM 설정
|
|
23
|
+
└── build/
|
|
24
|
+
├── css/variables.css
|
|
25
|
+
├── ios/StyleDictionary.swift
|
|
26
|
+
├── android/colors.xml
|
|
27
|
+
├── rn/tokens.ts # [react_native 시]
|
|
28
|
+
└── flutter/tokens.dart # [flutter 시]
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
> **DTCG 호환성**: `.tokens.json` 확장자는 W3C DTCG 표준 (2025.10)을 따릅니다. Style Dictionary 4.0, Tokens Studio, Figma Variables 등과 즉시 호환됩니다.
|
|
@@ -0,0 +1,150 @@
|
|
|
1
|
+
# 프론트엔드 토큰 연결 (Token Wiring)
|
|
2
|
+
|
|
3
|
+
> 입력: `config.frontend`, `config.token_format`, `config.architecture`, `config.project_name`
|
|
4
|
+
> 참조: `gen/gen-tokens/01-generate-process.md`, `gen/gen-tokens/02-structure-output-file.md`
|
|
5
|
+
> 실행 시점: **gen-tokens 완료 직후** (design/tokens/ 파일이 모두 생성된 후)
|
|
6
|
+
> 출력: 프론트엔드의 globals.css, tailwind.config 수정
|
|
7
|
+
|
|
8
|
+
## 목적
|
|
9
|
+
|
|
10
|
+
`design/tokens/` 파일 생성만으로는 프론트엔드에 반영되지 않는다.
|
|
11
|
+
이 모듈은 생성된 토큰을 **프론트엔드 빌드 파이프라인에 실제로 연결**한다.
|
|
12
|
+
|
|
13
|
+
## 실행 조건
|
|
14
|
+
|
|
15
|
+
```
|
|
16
|
+
if config.token_format includes "tailwind" OR "css_variables":
|
|
17
|
+
→ 프론트엔드 연결 실행
|
|
18
|
+
else:
|
|
19
|
+
→ 건너뜀 (json-only, style_dictionary는 빌드 도구가 별도 처리)
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
## 연결 프로세스
|
|
23
|
+
|
|
24
|
+
### Step 1: globals.css에 토큰 CSS import 삽입
|
|
25
|
+
|
|
26
|
+
**대상 파일 탐색 (우선순위):**
|
|
27
|
+
|
|
28
|
+
```
|
|
29
|
+
1. {frontend_dir}/src/app/globals.css (Next.js App Router)
|
|
30
|
+
2. {frontend_dir}/src/styles/globals.css (Next.js Pages)
|
|
31
|
+
3. {frontend_dir}/src/index.css (React/Vite)
|
|
32
|
+
4. {frontend_dir}/src/assets/main.css (Vue)
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
**삽입 위치:** `@tailwind base;` 직전 또는 파일 최상단
|
|
36
|
+
|
|
37
|
+
```css
|
|
38
|
+
/* === 3DS Design Tokens === */
|
|
39
|
+
@import '../../design/tokens/variables.css';
|
|
40
|
+
@import '../../design/tokens/visual.css';
|
|
41
|
+
/* === End 3DS Design Tokens === */
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
> import 경로는 globals.css 위치 기준 상대 경로로 계산한다.
|
|
45
|
+
> 이미 `3DS Design Tokens` 주석 블록이 존재하면 덮어쓰기한다.
|
|
46
|
+
|
|
47
|
+
**shadcn/ui 충돌 해소:**
|
|
48
|
+
|
|
49
|
+
globals.css에 shadcn의 `@layer base { :root { ... } }` 블록이 있으면:
|
|
50
|
+
1. shadcn HSL 변수는 유지 (shadcn 컴포넌트가 참조)
|
|
51
|
+
2. 3DS variables.css의 시맨틱 변수는 **추가** (충돌 없음 — 네이밍이 다름)
|
|
52
|
+
3. shadcn `--background` 값을 3DS `--bg-primary` 값으로 동기화
|
|
53
|
+
|
|
54
|
+
```css
|
|
55
|
+
/* shadcn 기본 → 3DS 토큰으로 오버라이드 */
|
|
56
|
+
:root {
|
|
57
|
+
--background: {3ds_bg_primary를 HSL로 변환};
|
|
58
|
+
--primary: {3ds_primary_500을 HSL로 변환};
|
|
59
|
+
--accent: {3ds_accent_500을 HSL로 변환};
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
.dark {
|
|
63
|
+
--background: {3ds_dark_bg_primary를 HSL로 변환};
|
|
64
|
+
--primary: {3ds_dark_primary를 HSL로 변환};
|
|
65
|
+
}
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
### Step 2: tailwind.config에 디자인 토큰 머지
|
|
69
|
+
|
|
70
|
+
**대상 파일 탐색 (우선순위):**
|
|
71
|
+
|
|
72
|
+
```
|
|
73
|
+
1. {frontend_dir}/tailwind.config.ts
|
|
74
|
+
2. {frontend_dir}/tailwind.config.js
|
|
75
|
+
3. {frontend_dir}/tailwind.config.mjs
|
|
76
|
+
```
|
|
77
|
+
|
|
78
|
+
**머지 항목 (design/tokens/tailwind.config.js → frontend/tailwind.config.ts):**
|
|
79
|
+
|
|
80
|
+
| 항목 | 동작 |
|
|
81
|
+
|------|------|
|
|
82
|
+
| `colors.primary` | 기존 유지 또는 덮어쓰기 (3DS 값 우선) |
|
|
83
|
+
| `colors.secondary` | 3DS 값으로 설정 |
|
|
84
|
+
| `colors.accent` | 3DS 값으로 설정 |
|
|
85
|
+
| `boxShadow` | 3DS warm/warm-lg/card/card-hover/toast 추가 |
|
|
86
|
+
| `backgroundImage` | 3DS hero-warm/warm-sky 등 추가 |
|
|
87
|
+
| `animation` | 3DS 전용 키프레임 추가 (기존 유지) |
|
|
88
|
+
| `keyframes` | 3DS 전용 키프레임 추가 (기존 유지) |
|
|
89
|
+
| `borderRadius` | xl/2xl 누락 시 추가 |
|
|
90
|
+
| `zIndex` | 3DS 스케일로 통일 |
|
|
91
|
+
|
|
92
|
+
**머지 규칙:**
|
|
93
|
+
- `theme.extend` 하위에만 추가 (기존 값 덮어쓰지 않음)
|
|
94
|
+
- shadcn이 추가한 `borderRadius`의 CSS 변수 참조(`var(--radius)`)는 유지
|
|
95
|
+
- 이미 동일 키가 있으면 3DS 값으로 교체 (3DS가 source of truth)
|
|
96
|
+
|
|
97
|
+
### Step 3: reduced-motion 미디어쿼리 추가
|
|
98
|
+
|
|
99
|
+
globals.css 하단에 추가 (없으면):
|
|
100
|
+
|
|
101
|
+
```css
|
|
102
|
+
/* === Accessibility: Reduced Motion === */
|
|
103
|
+
@media (prefers-reduced-motion: reduce) {
|
|
104
|
+
*,
|
|
105
|
+
*::before,
|
|
106
|
+
*::after {
|
|
107
|
+
animation-duration: 0.01ms !important;
|
|
108
|
+
animation-iteration-count: 1 !important;
|
|
109
|
+
transition-duration: 0.01ms !important;
|
|
110
|
+
scroll-behavior: auto !important;
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
```
|
|
114
|
+
|
|
115
|
+
### Step 4: Pretendard 폰트 로드 확인 (Next.js 전용)
|
|
116
|
+
|
|
117
|
+
```
|
|
118
|
+
if config.frontend == "nextjs":
|
|
119
|
+
layout.tsx에서 fontFamily 설정 확인:
|
|
120
|
+
- `next/font/local` 또는 `next/font/google` 사용 시 → OK
|
|
121
|
+
- inline style만 있으면 → 경고 로그:
|
|
122
|
+
"⚠️ Pretendard 폰트가 inline style로만 설정됨. next/font/local 사용 권장."
|
|
123
|
+
```
|
|
124
|
+
|
|
125
|
+
> 자동 수정은 하지 않는다 (폰트 파일 유무에 따라 방법이 달라지므로 경고만).
|
|
126
|
+
|
|
127
|
+
## 검증 체크리스트
|
|
128
|
+
|
|
129
|
+
연결 완료 후 아래를 확인:
|
|
130
|
+
|
|
131
|
+
```
|
|
132
|
+
✅ globals.css에 variables.css import 존재
|
|
133
|
+
✅ globals.css에 visual.css import 존재
|
|
134
|
+
✅ tailwind.config의 boxShadow에 warm/card 토큰 존재
|
|
135
|
+
✅ tailwind.config의 animation에 3DS 키프레임 존재
|
|
136
|
+
✅ tailwind.config의 colors.secondary가 amber 계열 (red 아님)
|
|
137
|
+
✅ globals.css에 reduced-motion 미디어쿼리 존재
|
|
138
|
+
✅ shadcn --background 값이 3DS bg-primary와 동기화됨
|
|
139
|
+
```
|
|
140
|
+
|
|
141
|
+
## 로그 출력
|
|
142
|
+
|
|
143
|
+
```
|
|
144
|
+
🔗 디자인 토큰 프론트엔드 연결:
|
|
145
|
+
├── globals.css ← variables.css + visual.css import 추가
|
|
146
|
+
├── tailwind.config ← boxShadow, animation, backgroundImage 머지
|
|
147
|
+
├── shadcn 토큰 동기화 (--background, --primary)
|
|
148
|
+
├── reduced-motion 미디어쿼리 추가
|
|
149
|
+
└── ✅ 연결 완료 (7/7 체크 통과)
|
|
150
|
+
```
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
# 디자인 토큰 생성
|
|
2
|
+
|
|
3
|
+
> 입력: `config.style`, `config.theme`, `config.token_format`, `config.token_scope`
|
|
4
|
+
> 참조: `defs/styles.md`, `defs/tokens.md`
|
|
5
|
+
> 출력: `design/tokens/` 디렉토리 + **프론트엔드 연결**
|
|
6
|
+
> Dependencies: `defs/styles.md`, `defs/tokens.md`, `defs/icon-usage.md`, `defs/illustration-guide.md`
|
|
7
|
+
>
|
|
8
|
+
> **v3.1**: 시맨틱 토큰 레이어 + W3C DTCG 포맷 지원 추가
|
|
9
|
+
> **v3.8.2**: 프론트엔드 토큰 연결(Token Wiring) 단계 추가
|
|
10
|
+
|
|
11
|
+
## 사전 확인 (web-design 독립 실행 시)
|
|
12
|
+
|
|
13
|
+
```
|
|
14
|
+
if config.frontend is undefined:
|
|
15
|
+
AskUserQuestion:
|
|
16
|
+
"프론트엔드 프레임워크를 선택해주세요:
|
|
17
|
+
[1] Next.js (App Router)
|
|
18
|
+
[2] Next.js (Pages Router)
|
|
19
|
+
[3] React + Vite
|
|
20
|
+
[4] Vue (Nuxt)
|
|
21
|
+
[5] Svelte (SvelteKit)
|
|
22
|
+
[6] 기타 (직접 입력)"
|
|
23
|
+
→ config.frontend = 선택값
|
|
24
|
+
|
|
25
|
+
AskUserQuestion:
|
|
26
|
+
"프론트엔드 루트 디렉토리 경로를 입력해주세요:
|
|
27
|
+
(기본: . 현재 디렉토리)"
|
|
28
|
+
→ config.frontend_dir = 입력값 또는 "."
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
## 생성 프로세스
|
|
32
|
+
|
|
33
|
+
> 상세: `gen/gen-tokens/01-generate-process.md` 참조
|
|
34
|
+
|
|
35
|
+
`config.style`로 `defs/styles.md`에서 해당 스타일의 색상 정의를 가져옵니다.
|
|
36
|
+
## 출력 파일 구조
|
|
37
|
+
|
|
38
|
+
> 상세: `gen/gen-tokens/02-structure-output-file.md` 참조
|
|
39
|
+
|
|
40
|
+
design/tokens/
|
|
41
|
+
|
|
42
|
+
## 프론트엔드 연결 (Token Wiring) — 필수!
|
|
43
|
+
|
|
44
|
+
> 상세: `gen/gen-tokens/03-connect-frontend.md` 참조
|
|
45
|
+
|
|
46
|
+
**토큰 파일 생성 직후 반드시 실행한다.** 생성만 하고 연결하지 않으면 프론트엔드에서 토큰이 동작하지 않는다.
|
|
47
|
+
|
|
48
|
+
```
|
|
49
|
+
1. globals.css에 variables.css + visual.css import 삽입
|
|
50
|
+
2. tailwind.config에 boxShadow/animation/backgroundImage 머지
|
|
51
|
+
3. shadcn 토큰(--background, --primary)과 3DS 토큰 동기화
|
|
52
|
+
4. reduced-motion 미디어쿼리 추가
|
|
53
|
+
5. 검증 체크리스트 실행 (7항목)
|
|
54
|
+
```
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
# Remotion 비디오 프로젝트 스캐폴딩 생성
|
|
2
|
+
|
|
3
|
+
> 입력: `config.project_name`, `config.type_detail.video_type`, `config.type_detail.video_resolution`, `config.type_detail.video_fps`, `config.type_detail.video_features[]`, `config.type_detail.render_target`, `config.type_detail.composition_structure`
|
|
4
|
+
> 참조: `defs/video-compositions.md`, `defs/video-motions.md`
|
|
5
|
+
> 출력: Remotion 프로젝트 디렉토리 구조 + 설정 파일
|
|
6
|
+
> Dependencies: `defs/video-compositions.md`
|
|
7
|
+
>
|
|
8
|
+
> **참고**: Remotion 컨벤션 파일(`defs/conventions/remotion.md`)은 web-design 스킬에 포함되지 않음.
|
|
9
|
+
> 필요 시 `~/.claude/skills/3ds/defs/conventions/remotion.md`를 참조하세요.
|
|
10
|
+
|
|
11
|
+
## 실행 조건
|
|
12
|
+
|
|
13
|
+
`config.confirmed == true` && `config.project_type == "video"` 시 자동 실행
|
|
14
|
+
|
|
15
|
+
## 생성 프로세스
|
|
16
|
+
|
|
17
|
+
> 상세: `gen/gen-video/02-generate-process.md` 참조
|
|
18
|
+
|
|
19
|
+
{project_name}/
|
|
20
|
+
## Tech Stack
|
|
21
|
+
|
|
22
|
+
- **Framework**: Remotion {version}
|
|
23
|
+
- **Resolution**: {width}x{height} @ {fps}fps
|
|
24
|
+
- **Features**: {features 목록}
|
|
25
|
+
|
|
26
|
+
## Getting Started
|
|
27
|
+
|
|
28
|
+
### Installation
|
|
29
|
+
npm install
|
|
30
|
+
|
|
31
|
+
### Development (Studio)
|
|
32
|
+
npm run dev
|
|
33
|
+
|
|
34
|
+
### Render
|
|
35
|
+
npm run build
|
|
36
|
+
|
|
37
|
+
### Render Still Image
|
|
38
|
+
npm run build:still
|
|
39
|
+
|
|
40
|
+
## Project Structure
|
|
41
|
+
|
|
42
|
+
{실제 생성된 구조 트리}
|
|
43
|
+
|
|
44
|
+
## License
|
|
45
|
+
MIT
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
## CLAUDE.md 명령어 매핑 (Remotion)
|
|
49
|
+
|
|
50
|
+
gen-video.md에서 생성된 프로젝트의 CLAUDE.md에 포함할 명령어:
|
|
51
|
+
|
|
52
|
+
| 카테고리 | 명령어 |
|
|
53
|
+
|---------|--------|
|
|
54
|
+
| 개발 | `npm run dev` (Remotion Studio) |
|
|
55
|
+
| 빌드 | `npm run build` (MP4 렌더링) |
|
|
56
|
+
| 스틸 | `npm run build:still` (썸네일) |
|
|
57
|
+
| 업그레이드 | `npm run upgrade` (Remotion 버전) |
|
|
58
|
+
|
|
59
|
+
## 완료 메시지
|
|
60
|
+
|
|
61
|
+
```
|
|
62
|
+
✅ Remotion 프로젝트 생성 완료!
|
|
63
|
+
|
|
64
|
+
📁 위치: ~/{config.project_name}
|
|
65
|
+
🎬 해상도: {width}×{height} @ {fps}fps
|
|
66
|
+
🎞️ 컴포지션: {composition_structure}
|
|
67
|
+
🔧 기능: {features 목록}
|
|
68
|
+
|
|
69
|
+
🎯 시작하기:
|
|
70
|
+
cd {config.project_name}
|
|
71
|
+
npm install
|
|
72
|
+
npm run dev # Remotion Studio 실행
|
|
73
|
+
```
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
# 컴포넌트 스펙 적용 검증
|
|
2
|
+
|
|
3
|
+
> 트리거: /wd verify (자동) 또는 /wd verify components
|
|
4
|
+
> 입력: docs/design/web-design-guide.md Section 3 (컴포넌트 디자인 스펙)
|
|
5
|
+
> 방법: 코드베이스 자동 스캔
|
|
6
|
+
|
|
7
|
+
## 검증 프로세스
|
|
8
|
+
|
|
9
|
+
### 1단계: 컴포넌트 목록 추출
|
|
10
|
+
|
|
11
|
+
디자인 가이드 Section 3에서 정의된 컴포넌트 목록을 파싱합니다.
|
|
12
|
+
|
|
13
|
+
추출:
|
|
14
|
+
- 컴포넌트 이름 (Button, Card, Input, Modal 등)
|
|
15
|
+
- 필수 변형 (Primary, Secondary, Outline 등)
|
|
16
|
+
- 상태별 스타일 (hover, disabled, error, loading)
|
|
17
|
+
|
|
18
|
+
### 2단계: 코드베이스 스캔
|
|
19
|
+
|
|
20
|
+
#### 컴포넌트 존재 확인
|
|
21
|
+
- Glob: src/components/**/*.{tsx,jsx,vue,svelte}
|
|
22
|
+
- 각 정의된 컴포넌트와 파일명/export 매칭
|
|
23
|
+
|
|
24
|
+
#### 디자인 토큰 참조 확인
|
|
25
|
+
- 각 컴포넌트 파일 내에서 Grep:
|
|
26
|
+
- CSS 변수 사용: var(--color-*, --spacing-*, --radius-*)
|
|
27
|
+
- Tailwind 토큰 클래스: bg-primary, text-heading 등
|
|
28
|
+
- 하드코딩된 값 감지 (#fff, 16px 등)
|
|
29
|
+
|
|
30
|
+
#### 상태별 스타일 확인
|
|
31
|
+
- 각 컴포넌트에서 Grep:
|
|
32
|
+
- hover, focus, active, disabled, loading, error 상태
|
|
33
|
+
- aria-disabled, aria-invalid 등 접근성 속성
|
|
34
|
+
|
|
35
|
+
### 3단계: 판정
|
|
36
|
+
|
|
37
|
+
| 상태 | 판정 |
|
|
38
|
+
|------|------|
|
|
39
|
+
| 컴포넌트 존재 + 토큰 사용 + 상태 처리 | ✅ 완전 적용 |
|
|
40
|
+
| 컴포넌트 존재 + 부분 토큰/상태 | ⚠️ 부분 적용 |
|
|
41
|
+
| 컴포넌트 미존재 | ❌ 미적용 |
|
|
42
|
+
|
|
43
|
+
## 출력 형식
|
|
44
|
+
|
|
45
|
+
```
|
|
46
|
+
■ 컴포넌트 적용 현황: 12/15 (80.0%)
|
|
47
|
+
✅ Button — 토큰 참조 ✓, 상태(hover/disabled/loading) ✓
|
|
48
|
+
✅ Card — 토큰 참조 ✓, 상태(hover) ✓
|
|
49
|
+
⚠️ Input — 존재하지만 error 상태 미구현
|
|
50
|
+
❌ Modal — 컴포넌트 미구현
|
|
51
|
+
...
|
|
52
|
+
```
|