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,251 @@
|
|
|
1
|
+
# 토큰 범위 (Token Scope)
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
### 1. Colors (`colors`)
|
|
5
|
+
```yaml
|
|
6
|
+
color:
|
|
7
|
+
primary: { 50, 100, 200, 300, 400, 500, 600, 700, 800, 900 }
|
|
8
|
+
secondary: { ... }
|
|
9
|
+
accent: { ... }
|
|
10
|
+
background: { DEFAULT, card, elevated }
|
|
11
|
+
surface: { DEFAULT, hover, active }
|
|
12
|
+
text: { primary, secondary, disabled, inverse }
|
|
13
|
+
border: { DEFAULT, strong, subtle }
|
|
14
|
+
status: { success, warning, error, info }
|
|
15
|
+
```
|
|
16
|
+
|
|
17
|
+
### 2. Typography (`typography`)
|
|
18
|
+
```yaml
|
|
19
|
+
typography:
|
|
20
|
+
fontFamily: { sans, serif, mono }
|
|
21
|
+
fontSize: { xs, sm, base, lg, xl, 2xl, 3xl, 4xl, 5xl }
|
|
22
|
+
fontWeight: { light, normal, medium, semibold, bold }
|
|
23
|
+
lineHeight: { tight, normal, relaxed }
|
|
24
|
+
letterSpacing: { tight, normal, wide }
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
### 3. Spacing (`spacing`)
|
|
28
|
+
```yaml
|
|
29
|
+
spacing:
|
|
30
|
+
scale: { 0, 0.5, 1, 1.5, 2, 2.5, 3, 4, 5, 6, 8, 10, 12, 16, 20, 24, 32, 40, 48, 64 }
|
|
31
|
+
# 기본 단위: 4px (1 = 4px, 4 = 16px)
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
### 4. Border Radius (`radius`)
|
|
35
|
+
```yaml
|
|
36
|
+
borderRadius:
|
|
37
|
+
none: 0
|
|
38
|
+
sm: 4px
|
|
39
|
+
DEFAULT: 8px
|
|
40
|
+
md: 12px
|
|
41
|
+
lg: 16px
|
|
42
|
+
xl: 24px
|
|
43
|
+
2xl: 32px
|
|
44
|
+
full: 9999px
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
### 5. Shadows (`shadows`)
|
|
48
|
+
```yaml
|
|
49
|
+
boxShadow:
|
|
50
|
+
sm: "0 1px 2px rgba(0,0,0,0.05)"
|
|
51
|
+
DEFAULT: "0 1px 3px rgba(0,0,0,0.1), 0 1px 2px rgba(0,0,0,0.06)"
|
|
52
|
+
md: "0 4px 6px rgba(0,0,0,0.1)"
|
|
53
|
+
lg: "0 10px 15px rgba(0,0,0,0.1)"
|
|
54
|
+
xl: "0 20px 25px rgba(0,0,0,0.1)"
|
|
55
|
+
2xl: "0 25px 50px rgba(0,0,0,0.25)"
|
|
56
|
+
inner: "inset 0 2px 4px rgba(0,0,0,0.06)"
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
### 6. Animations (`animations`)
|
|
60
|
+
|
|
61
|
+
> 참조: `defs/styles.md`의 **Animation** 필드 + 커스텀 애니메이션 키프레임 레퍼런스
|
|
62
|
+
|
|
63
|
+
```yaml
|
|
64
|
+
animation:
|
|
65
|
+
duration: { fast: 150ms, normal: 300ms, slow: 500ms, slower: 800ms }
|
|
66
|
+
easing:
|
|
67
|
+
default: ease
|
|
68
|
+
in: ease-in
|
|
69
|
+
out: ease-out
|
|
70
|
+
in-out: ease-in-out
|
|
71
|
+
spring: "cubic-bezier(0.34, 1.56, 0.64, 1)" # 탄력 (F, L, N)
|
|
72
|
+
transition: { all, colors, opacity, transform, shadow }
|
|
73
|
+
# 스타일별 커스텀 키프레임은 defs/styles.md 하단 레퍼런스 참조
|
|
74
|
+
keyframes:
|
|
75
|
+
# 공통
|
|
76
|
+
fade-up: "opacity 0→1 + translateY 20px→0"
|
|
77
|
+
fade-in: "opacity 0→1"
|
|
78
|
+
scale-in: "opacity 0→1 + scale 0.95→1"
|
|
79
|
+
# 스타일별 (config.style에 따라 선택적 포함)
|
|
80
|
+
# A,R,V,Z: neon-flicker, neon-blink, twinkle, glitch
|
|
81
|
+
# E,G,S,W: float, float-gentle, sway, breathe
|
|
82
|
+
# B,H,O: gradient-flow, shimmer
|
|
83
|
+
# F,L,N: bounce-in, wiggle, shake
|
|
84
|
+
# T: flame-flicker
|
|
85
|
+
# X: gold-sweep
|
|
86
|
+
```
|
|
87
|
+
|
|
88
|
+
### 6b. Interactions (`interactions`)
|
|
89
|
+
|
|
90
|
+
> 참조: `defs/styles.md`의 **Hover / Shadow / Border / Decoration / Gradient** 필드
|
|
91
|
+
|
|
92
|
+
```yaml
|
|
93
|
+
interaction:
|
|
94
|
+
hover:
|
|
95
|
+
card: "{style.Hover의 카드 호버 패턴}" # 스타일별 다름
|
|
96
|
+
button: "{style.Hover의 버튼 호버 패턴}" # 스타일별 다름
|
|
97
|
+
link: "{style.Hover의 링크 호버 패턴}" # 스타일별 다름
|
|
98
|
+
row: "{style.Hover의 행 호버 패턴}" # 스타일별 다름
|
|
99
|
+
shadow:
|
|
100
|
+
card: "{style.Shadow의 카드 섀도우}"
|
|
101
|
+
hover: "{style.Shadow의 호버 섀도우}"
|
|
102
|
+
dropdown: "shadow-lg" # 공통
|
|
103
|
+
modal: "shadow-xl" # 공통
|
|
104
|
+
border:
|
|
105
|
+
default: "{style.Border의 기본 보더}"
|
|
106
|
+
hover: "{style.Border의 호버 보더}"
|
|
107
|
+
focus: "ring-2 ring-{primary}-500 ring-offset-2" # 공통
|
|
108
|
+
gradient:
|
|
109
|
+
hero: "{style.Gradient의 히어로 그라데이션}"
|
|
110
|
+
cta: "{style.Gradient의 CTA 그라데이션}"
|
|
111
|
+
text: "{style.Gradient의 텍스트 그라데이션}"
|
|
112
|
+
bgPattern: "{style.BG_Pattern}" # 섹션 배경 장식
|
|
113
|
+
decoration: "{style.Decoration}" # 코너, 뱃지, 디바이더
|
|
114
|
+
```
|
|
115
|
+
|
|
116
|
+
### 7. Breakpoints (`breakpoints`)
|
|
117
|
+
```yaml
|
|
118
|
+
breakpoints:
|
|
119
|
+
sm: 640px
|
|
120
|
+
md: 768px
|
|
121
|
+
lg: 1024px
|
|
122
|
+
xl: 1280px
|
|
123
|
+
2xl: 1536px
|
|
124
|
+
```
|
|
125
|
+
|
|
126
|
+
### 8. Background Images (`backgrounds`)
|
|
127
|
+
|
|
128
|
+
> 참조: `defs/styles.md`의 **BG_Pattern** 필드, `defs/component-specs.md` 비주얼 variant
|
|
129
|
+
|
|
130
|
+
```yaml
|
|
131
|
+
background:
|
|
132
|
+
hero:
|
|
133
|
+
gradient: "{style.Gradient 히어로}"
|
|
134
|
+
overlay: "linear-gradient(rgba(bg,0.6), rgba(bg,0.8))"
|
|
135
|
+
blend-mode: "overlay | multiply | soft-light"
|
|
136
|
+
card:
|
|
137
|
+
image-fit: "cover"
|
|
138
|
+
image-position: "center"
|
|
139
|
+
overlay-opacity: { default: 0.7, hover: 0.5 }
|
|
140
|
+
section:
|
|
141
|
+
pattern: "{style.BG_Pattern}"
|
|
142
|
+
pattern-opacity: { default: 0.05, accent: 0.1 }
|
|
143
|
+
cta:
|
|
144
|
+
gradient: "{style.Gradient CTA}"
|
|
145
|
+
```
|
|
146
|
+
|
|
147
|
+
### 9. Icon Tokens (`icons`)
|
|
148
|
+
|
|
149
|
+
> 참조: `defs/icon-usage.md`, `defs/icon-mappings.md`
|
|
150
|
+
|
|
151
|
+
```yaml
|
|
152
|
+
icon:
|
|
153
|
+
size:
|
|
154
|
+
xs: 14px
|
|
155
|
+
sm: 16px
|
|
156
|
+
md: 20px
|
|
157
|
+
lg: 24px
|
|
158
|
+
xl: 32px
|
|
159
|
+
2xl: 48px
|
|
160
|
+
3xl: 64px
|
|
161
|
+
gap:
|
|
162
|
+
sm: 4px
|
|
163
|
+
md: 8px
|
|
164
|
+
lg: 12px
|
|
165
|
+
xl: 16px
|
|
166
|
+
color:
|
|
167
|
+
default: "currentColor"
|
|
168
|
+
standalone: "--text-secondary"
|
|
169
|
+
standalone-hover: "--text-primary"
|
|
170
|
+
active: "--color-primary"
|
|
171
|
+
disabled: "--text-disabled"
|
|
172
|
+
semantic:
|
|
173
|
+
success: "--color-success"
|
|
174
|
+
warning: "--color-warning"
|
|
175
|
+
error: "--color-error"
|
|
176
|
+
info: "--color-info"
|
|
177
|
+
stroke-width: 2
|
|
178
|
+
library: "lucide"
|
|
179
|
+
```
|
|
180
|
+
|
|
181
|
+
### 10. Visual Interactions (`visual_interactions`)
|
|
182
|
+
|
|
183
|
+
> 참조: `defs/styles.md`의 **Image Interaction** 필드, `defs/component-specs.md` 인터랙션 패턴
|
|
184
|
+
|
|
185
|
+
```yaml
|
|
186
|
+
visual_interaction:
|
|
187
|
+
image:
|
|
188
|
+
zoom: { scale: 1.05, duration: 0.4s, easing: ease-out }
|
|
189
|
+
reveal: { opacity: "0.3→1", duration: 0.5s }
|
|
190
|
+
parallax: { speed: 0.5, direction: vertical }
|
|
191
|
+
overlay-fade: { opacity: "0.7→0.4", duration: 0.3s }
|
|
192
|
+
ken-burns: { scale: "1→1.1", duration: 15s }
|
|
193
|
+
blur-to-clear: { blur: "8px→0", duration: 0.6s }
|
|
194
|
+
element:
|
|
195
|
+
tilt-3d: { max-deg: 8, perspective: 1000px }
|
|
196
|
+
float: { distance: 10px, duration: 3s }
|
|
197
|
+
morph: { scale: 1.05, rotate: 5deg, duration: 0.3s }
|
|
198
|
+
text:
|
|
199
|
+
gradient-text: "background-clip: text"
|
|
200
|
+
typewriter: { speed: 50ms, cursor: true }
|
|
201
|
+
count-up: { duration: 2s, easing: ease-out }
|
|
202
|
+
scroll:
|
|
203
|
+
fade-up: { distance: 30px, duration: 0.6s }
|
|
204
|
+
stagger: { delay: 0.1s, direction: top-to-bottom }
|
|
205
|
+
reveal: { threshold: 0.2 }
|
|
206
|
+
```
|
|
207
|
+
|
|
208
|
+
### 11. Section Dividers (`dividers`)
|
|
209
|
+
|
|
210
|
+
> 참조: `defs/styles.md`의 **Section Divider** 필드
|
|
211
|
+
|
|
212
|
+
```yaml
|
|
213
|
+
divider:
|
|
214
|
+
style:
|
|
215
|
+
line: { height: 1px, color: "--border-default" }
|
|
216
|
+
gradient-line: { height: 2px, gradient: "{style.Gradient}" }
|
|
217
|
+
wave-svg: { height: 40~80px, fill: "--bg-secondary" }
|
|
218
|
+
angle: { deg: 3~5, fill: "--bg-secondary" }
|
|
219
|
+
dots: { size: 4px, gap: 16px, color: "--border-default", opacity: 0.3 }
|
|
220
|
+
spacing:
|
|
221
|
+
before: "--space-12"
|
|
222
|
+
after: "--space-12"
|
|
223
|
+
```
|
|
224
|
+
|
|
225
|
+
### 12. Illustration Tokens (`illustrations`)
|
|
226
|
+
|
|
227
|
+
> 참조: `defs/illustration-guide.md`
|
|
228
|
+
|
|
229
|
+
```yaml
|
|
230
|
+
illustration:
|
|
231
|
+
color-sync:
|
|
232
|
+
primary: "--color-primary"
|
|
233
|
+
accent: "--color-accent"
|
|
234
|
+
bg: "--color-surface-alt"
|
|
235
|
+
muted: "--text-disabled"
|
|
236
|
+
size:
|
|
237
|
+
inline: 80~120px
|
|
238
|
+
card: 100~150px
|
|
239
|
+
page: 200~300px
|
|
240
|
+
hero: 300~500px
|
|
241
|
+
onboarding: 250~350px
|
|
242
|
+
responsive-scale:
|
|
243
|
+
desktop: 1.0
|
|
244
|
+
tablet: 0.8
|
|
245
|
+
mobile: 0.6
|
|
246
|
+
dark-mode:
|
|
247
|
+
filter: "brightness(0.9) saturate(0.9)"
|
|
248
|
+
```
|
|
249
|
+
|
|
250
|
+
---
|
|
251
|
+
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
# 3DS 토큰 정의
|
|
2
|
+
|
|
3
|
+
> 참조: `stages/stage2-*.md` (토큰 형식), `stages/stage3-design.md` Q3-3 (토큰 범위)
|
|
4
|
+
> Dependencies: 없음 (독립 참조 데이터)
|
|
5
|
+
|
|
6
|
+
## 토큰 형식 (Token Format)
|
|
7
|
+
|
|
8
|
+
> 상세: `defs/tokens/01-token-format.md` 참조
|
|
9
|
+
|
|
10
|
+
- **용도**: 웹 프로젝트 (Tailwind CSS 사용 시)
|
|
11
|
+
## 토큰 범위 (Token Scope)
|
|
12
|
+
|
|
13
|
+
> 상세: `defs/tokens/02-token-scope.md` 참조
|
|
14
|
+
|
|
15
|
+
color:
|
|
16
|
+
## 플랫폼별 권장 형식
|
|
17
|
+
|
|
18
|
+
| 프로젝트 유형 | 권장 형식 | 이유 |
|
|
19
|
+
|-------------|----------|------|
|
|
20
|
+
| 웹 (Tailwind) | `tailwind` | 즉시 적용 |
|
|
21
|
+
| 웹 (일반) | `css_variables` | 런타임 테마 전환 |
|
|
22
|
+
| PC앱 (Electron/Tauri) | `css_variables` | 웹 기술 기반 |
|
|
23
|
+
| 모바일 앱 | `style_dictionary` | 멀티 플랫폼 변환 |
|
|
24
|
+
| 혼합 | `style_dictionary` | 단일 소스 멀티 타겟 |
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
# 1. 단일 컴포지션 (Single)
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
하나의 메인 컴포지션으로 구성. 숏폼/광고/프레젠테이션에 적합.
|
|
5
|
+
|
|
6
|
+
```tsx
|
|
7
|
+
// src/Root.tsx
|
|
8
|
+
export const RemotionRoot: React.FC = () => {
|
|
9
|
+
return (
|
|
10
|
+
<>
|
|
11
|
+
<Composition
|
|
12
|
+
id="Main"
|
|
13
|
+
component={Main}
|
|
14
|
+
durationInFrames={30 * 30} // 30초 @ 30fps
|
|
15
|
+
fps={30}
|
|
16
|
+
width={1920}
|
|
17
|
+
height={1080}
|
|
18
|
+
/>
|
|
19
|
+
</>
|
|
20
|
+
);
|
|
21
|
+
};
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
### 구조
|
|
25
|
+
|
|
26
|
+
```
|
|
27
|
+
src/
|
|
28
|
+
├── Root.tsx # 단일 Composition 등록
|
|
29
|
+
├── compositions/
|
|
30
|
+
│ └── Main/
|
|
31
|
+
│ ├── index.tsx # re-export
|
|
32
|
+
│ ├── Main.tsx # 메인 컴포지션 (Sequence 구성)
|
|
33
|
+
│ └── schema.ts # z.object() InputProps 스키마
|
|
34
|
+
├── components/ # 재사용 컴포넌트
|
|
35
|
+
│ ├── AnimatedText.tsx
|
|
36
|
+
│ ├── FadeIn.tsx
|
|
37
|
+
│ └── SlideIn.tsx
|
|
38
|
+
└── lib/ # 유틸리티
|
|
39
|
+
├── animations.ts # interpolate/spring 헬퍼
|
|
40
|
+
├── colors.ts # 디자인 토큰 색상
|
|
41
|
+
└── fonts.ts # 폰트 로딩
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
### Sequence 패턴
|
|
45
|
+
|
|
46
|
+
```tsx
|
|
47
|
+
// compositions/Main/Main.tsx
|
|
48
|
+
export const Main: React.FC = () => {
|
|
49
|
+
return (
|
|
50
|
+
<AbsoluteFill style={{ backgroundColor: colors.background }}>
|
|
51
|
+
<Sequence from={0} durationInFrames={90} name="Intro">
|
|
52
|
+
<Intro />
|
|
53
|
+
</Sequence>
|
|
54
|
+
<Sequence from={90} durationInFrames={150} name="Content">
|
|
55
|
+
<Content />
|
|
56
|
+
</Sequence>
|
|
57
|
+
<Sequence from={240} durationInFrames={60} name="Outro">
|
|
58
|
+
<Outro />
|
|
59
|
+
</Sequence>
|
|
60
|
+
</AbsoluteFill>
|
|
61
|
+
);
|
|
62
|
+
};
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
---
|
|
66
|
+
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
# 2. 다중 컴포지션 (Multi)
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
여러 독립 컴포지션을 병렬 등록. 시리즈/에피소드/다중 출력에 적합.
|
|
5
|
+
|
|
6
|
+
```tsx
|
|
7
|
+
// src/Root.tsx
|
|
8
|
+
export const RemotionRoot: React.FC = () => {
|
|
9
|
+
return (
|
|
10
|
+
<>
|
|
11
|
+
<Composition id="Intro" component={Intro} ... />
|
|
12
|
+
<Composition id="Episode1" component={Episode1} ... />
|
|
13
|
+
<Composition id="Episode2" component={Episode2} ... />
|
|
14
|
+
<Composition id="Outro" component={Outro} ... />
|
|
15
|
+
<Composition id="Thumbnail" component={Thumbnail}
|
|
16
|
+
width={1280} height={720} durationInFrames={1} fps={1} />
|
|
17
|
+
</>
|
|
18
|
+
);
|
|
19
|
+
};
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
### 구조
|
|
23
|
+
|
|
24
|
+
```
|
|
25
|
+
src/
|
|
26
|
+
├── Root.tsx # 여러 Composition 등록
|
|
27
|
+
├── compositions/
|
|
28
|
+
│ ├── Intro/
|
|
29
|
+
│ │ ├── index.tsx
|
|
30
|
+
│ │ ├── Intro.tsx
|
|
31
|
+
│ │ └── schema.ts
|
|
32
|
+
│ ├── Episode1/
|
|
33
|
+
│ │ ├── index.tsx
|
|
34
|
+
│ │ ├── Episode1.tsx
|
|
35
|
+
│ │ └── schema.ts
|
|
36
|
+
│ ├── Episode2/
|
|
37
|
+
│ │ ├── index.tsx
|
|
38
|
+
│ │ ├── Episode2.tsx
|
|
39
|
+
│ │ └── schema.ts
|
|
40
|
+
│ ├── Outro/
|
|
41
|
+
│ │ ├── index.tsx
|
|
42
|
+
│ │ ├── Outro.tsx
|
|
43
|
+
│ │ └── schema.ts
|
|
44
|
+
│ └── Thumbnail/
|
|
45
|
+
│ ├── index.tsx
|
|
46
|
+
│ └── Thumbnail.tsx
|
|
47
|
+
├── components/ # 공유 컴포넌트
|
|
48
|
+
└── lib/ # 공유 유틸리티
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
### Folder 그룹핑
|
|
52
|
+
|
|
53
|
+
```tsx
|
|
54
|
+
// 폴더로 컴포지션 그룹핑
|
|
55
|
+
<Folder name="Episodes">
|
|
56
|
+
<Composition id="Episode1" ... />
|
|
57
|
+
<Composition id="Episode2" ... />
|
|
58
|
+
</Folder>
|
|
59
|
+
<Folder name="Assets">
|
|
60
|
+
<Composition id="Thumbnail" ... />
|
|
61
|
+
<Composition id="EndCard" ... />
|
|
62
|
+
</Folder>
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
---
|
|
66
|
+
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
# 3. 파라메트릭 컴포지션 (Parametric)
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
InputProps + calculateMetadata로 동적 비디오 생성. 템플릿/데이터 드리븐에 적합.
|
|
5
|
+
|
|
6
|
+
```tsx
|
|
7
|
+
// src/Root.tsx
|
|
8
|
+
export const RemotionRoot: React.FC = () => {
|
|
9
|
+
return (
|
|
10
|
+
<>
|
|
11
|
+
<Composition
|
|
12
|
+
id="DynamicVideo"
|
|
13
|
+
component={DynamicVideo}
|
|
14
|
+
durationInFrames={30 * 30}
|
|
15
|
+
fps={30}
|
|
16
|
+
width={1920}
|
|
17
|
+
height={1080}
|
|
18
|
+
schema={dynamicVideoSchema}
|
|
19
|
+
defaultProps={{
|
|
20
|
+
title: "Sample Title",
|
|
21
|
+
subtitle: "Sample Subtitle",
|
|
22
|
+
bgColor: "#000000",
|
|
23
|
+
items: [],
|
|
24
|
+
}}
|
|
25
|
+
calculateMetadata={calculateDynamicMetadata}
|
|
26
|
+
/>
|
|
27
|
+
</>
|
|
28
|
+
);
|
|
29
|
+
};
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
### 구조
|
|
33
|
+
|
|
34
|
+
```
|
|
35
|
+
src/
|
|
36
|
+
├── Root.tsx # calculateMetadata 사용
|
|
37
|
+
├── compositions/
|
|
38
|
+
│ └── DynamicVideo/
|
|
39
|
+
│ ├── index.tsx
|
|
40
|
+
│ ├── DynamicVideo.tsx # props 기반 렌더링
|
|
41
|
+
│ ├── schema.ts # z.object() 상세 스키마
|
|
42
|
+
│ └── metadata.ts # calculateMetadata 함수
|
|
43
|
+
├── components/ # 파라미터별 렌더 컴포넌트
|
|
44
|
+
│ ├── DynamicTitle.tsx
|
|
45
|
+
│ ├── DynamicBackground.tsx
|
|
46
|
+
│ └── DataDrivenChart.tsx
|
|
47
|
+
├── lib/
|
|
48
|
+
│ ├── animations.ts
|
|
49
|
+
│ ├── colors.ts
|
|
50
|
+
│ └── data-fetcher.ts # 외부 데이터 페칭
|
|
51
|
+
└── types/
|
|
52
|
+
└── props.ts # InputProps 타입 정의
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
### calculateMetadata 패턴
|
|
56
|
+
|
|
57
|
+
```tsx
|
|
58
|
+
// compositions/DynamicVideo/metadata.ts
|
|
59
|
+
import type { CalculateMetadataFunction } from "remotion";
|
|
60
|
+
import type { DynamicVideoProps } from "./schema";
|
|
61
|
+
|
|
62
|
+
export const calculateDynamicMetadata: CalculateMetadataFunction<
|
|
63
|
+
DynamicVideoProps
|
|
64
|
+
> = async ({ props }) => {
|
|
65
|
+
// 외부 데이터에 따라 duration 동적 계산
|
|
66
|
+
const items = await fetchItems(props.dataSource);
|
|
67
|
+
const durationPerItem = 90; // 3초 @ 30fps
|
|
68
|
+
const totalDuration = items.length * durationPerItem + 120; // +인트로/아웃트로
|
|
69
|
+
|
|
70
|
+
return {
|
|
71
|
+
durationInFrames: totalDuration,
|
|
72
|
+
props: {
|
|
73
|
+
...props,
|
|
74
|
+
items,
|
|
75
|
+
},
|
|
76
|
+
};
|
|
77
|
+
};
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
---
|
|
81
|
+
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
# 비디오 컴포지션 구조 패턴
|
|
2
|
+
|
|
3
|
+
> 참조: `stages/stage2-video.md` Q2-5에서 사용
|
|
4
|
+
> Dependencies: `defs/conventions/remotion.md`
|
|
5
|
+
|
|
6
|
+
## 개요
|
|
7
|
+
|
|
8
|
+
Remotion 프로젝트의 컴포지션 구조 패턴을 정의합니다.
|
|
9
|
+
웹 프로젝트의 `web-layouts.md`에 대응하는 비디오 버전입니다.
|
|
10
|
+
|
|
11
|
+
---
|
|
12
|
+
|
|
13
|
+
## 1. 단일 컴포지션 (Single)
|
|
14
|
+
|
|
15
|
+
> 상세: `defs/video-compositions/01-composition-single.md` 참조
|
|
16
|
+
|
|
17
|
+
하나의 메인 컴포지션으로 구성. 숏폼/광고/프레젠테이션에 적합.
|
|
18
|
+
## 2. 다중 컴포지션 (Multi)
|
|
19
|
+
|
|
20
|
+
> 상세: `defs/video-compositions/02-composition-multi.md` 참조
|
|
21
|
+
|
|
22
|
+
여러 독립 컴포지션을 병렬 등록. 시리즈/에피소드/다중 출력에 적합.
|
|
23
|
+
## 3. 파라메트릭 컴포지션 (Parametric)
|
|
24
|
+
|
|
25
|
+
> 상세: `defs/video-compositions/03-composition-parametric.md` 참조
|
|
26
|
+
|
|
27
|
+
InputProps + calculateMetadata로 동적 비디오 생성. 템플릿/데이터 드리븐에 적합.
|
|
28
|
+
## video_type별 추천 구조
|
|
29
|
+
|
|
30
|
+
| video_type | 추천 구조 | 이유 |
|
|
31
|
+
|------------|----------|------|
|
|
32
|
+
| short_form | single | 60초 미만, 단일 흐름 |
|
|
33
|
+
| long_form | multi | 섹션별 독립 편집 |
|
|
34
|
+
| data_viz | parametric | 데이터 기반 동적 생성 |
|
|
35
|
+
| template | parametric | InputProps 커스터마이징 |
|
|
36
|
+
| video_saas | multi + parametric | 다양한 출력 + 사용자 파라미터 |
|
|
37
|
+
| interactive | single / parametric | Player 실시간 파라미터 |
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
# 1. 기본 애니메이션 (interpolate)
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
### Fade In
|
|
5
|
+
|
|
6
|
+
```tsx
|
|
7
|
+
const frame = useCurrentFrame();
|
|
8
|
+
const opacity = interpolate(frame, [0, 30], [0, 1], {
|
|
9
|
+
extrapolateRight: "clamp",
|
|
10
|
+
});
|
|
11
|
+
return <div style={{ opacity }}>{children}</div>;
|
|
12
|
+
```
|
|
13
|
+
|
|
14
|
+
### Slide In (Left → Right)
|
|
15
|
+
|
|
16
|
+
```tsx
|
|
17
|
+
const frame = useCurrentFrame();
|
|
18
|
+
const translateX = interpolate(frame, [0, 30], [-100, 0], {
|
|
19
|
+
extrapolateRight: "clamp",
|
|
20
|
+
easing: Easing.out(Easing.cubic),
|
|
21
|
+
});
|
|
22
|
+
return <div style={{ transform: `translateX(${translateX}%)` }}>{children}</div>;
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
### Scale In
|
|
26
|
+
|
|
27
|
+
```tsx
|
|
28
|
+
const frame = useCurrentFrame();
|
|
29
|
+
const scale = interpolate(frame, [0, 20], [0.8, 1], {
|
|
30
|
+
extrapolateRight: "clamp",
|
|
31
|
+
easing: Easing.out(Easing.back(1.5)),
|
|
32
|
+
});
|
|
33
|
+
return <div style={{ transform: `scale(${scale})` }}>{children}</div>;
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
### Typewriter
|
|
37
|
+
|
|
38
|
+
```tsx
|
|
39
|
+
const frame = useCurrentFrame();
|
|
40
|
+
const charCount = Math.floor(
|
|
41
|
+
interpolate(frame, [0, text.length * 3], [0, text.length], {
|
|
42
|
+
extrapolateRight: "clamp",
|
|
43
|
+
})
|
|
44
|
+
);
|
|
45
|
+
return <span>{text.slice(0, charCount)}</span>;
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
---
|
|
49
|
+
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
# 2. 스프링 애니메이션 (spring)
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
### Bounce In
|
|
5
|
+
|
|
6
|
+
```tsx
|
|
7
|
+
const frame = useCurrentFrame();
|
|
8
|
+
const { fps } = useVideoConfig();
|
|
9
|
+
const scale = spring({
|
|
10
|
+
frame,
|
|
11
|
+
fps,
|
|
12
|
+
config: { damping: 10, stiffness: 100, mass: 0.5 },
|
|
13
|
+
});
|
|
14
|
+
return <div style={{ transform: `scale(${scale})` }}>{children}</div>;
|
|
15
|
+
```
|
|
16
|
+
|
|
17
|
+
### Elastic Slide
|
|
18
|
+
|
|
19
|
+
```tsx
|
|
20
|
+
const frame = useCurrentFrame();
|
|
21
|
+
const { fps } = useVideoConfig();
|
|
22
|
+
const translateY = spring({
|
|
23
|
+
frame,
|
|
24
|
+
fps,
|
|
25
|
+
config: { damping: 12, stiffness: 80, mass: 1 },
|
|
26
|
+
from: 50,
|
|
27
|
+
to: 0,
|
|
28
|
+
});
|
|
29
|
+
return <div style={{ transform: `translateY(${translateY}px)` }}>{children}</div>;
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
### Pop In (아이콘/뱃지)
|
|
33
|
+
|
|
34
|
+
```tsx
|
|
35
|
+
const frame = useCurrentFrame();
|
|
36
|
+
const { fps } = useVideoConfig();
|
|
37
|
+
const progress = spring({
|
|
38
|
+
frame,
|
|
39
|
+
fps,
|
|
40
|
+
config: { damping: 8, stiffness: 200, mass: 0.3 },
|
|
41
|
+
});
|
|
42
|
+
const scale = interpolate(progress, [0, 1], [0, 1]);
|
|
43
|
+
const rotate = interpolate(progress, [0, 1], [-180, 0]);
|
|
44
|
+
return (
|
|
45
|
+
<div style={{ transform: `scale(${scale}) rotate(${rotate}deg)` }}>
|
|
46
|
+
{children}
|
|
47
|
+
</div>
|
|
48
|
+
);
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
---
|
|
52
|
+
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
# 3. Easing 함수 레퍼런스
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
| 이름 | 함수 | 용도 |
|
|
5
|
+
|------|------|------|
|
|
6
|
+
| Linear | `Easing.linear` | 균일한 움직임 |
|
|
7
|
+
| Ease In | `Easing.in(Easing.cubic)` | 시작 느리게 |
|
|
8
|
+
| Ease Out | `Easing.out(Easing.cubic)` | 끝 느리게 (가장 자연스러움) |
|
|
9
|
+
| Ease In-Out | `Easing.inOut(Easing.cubic)` | 시작/끝 느리게 |
|
|
10
|
+
| Back | `Easing.out(Easing.back(1.5))` | 살짝 넘어갔다 돌아옴 |
|
|
11
|
+
| Elastic | `Easing.out(Easing.elastic(1))` | 탄성 효과 |
|
|
12
|
+
| Bounce | `Easing.out(Easing.bounce)` | 바운스 |
|
|
13
|
+
| Circle | `Easing.out(Easing.circle)` | 원형 가감속 |
|
|
14
|
+
| Bezier | `Easing.bezier(0.25, 0.1, 0.25, 1)` | 커스텀 곡선 |
|
|
15
|
+
|
|
16
|
+
---
|
|
17
|
+
|