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.
Files changed (138) hide show
  1. package/dist/index.js +30 -20
  2. package/package.json +1 -1
  3. package/skills/web-design/claude-code/SKILL.md +270 -0
  4. package/skills/web-design/claude-code/analyze/analyze-benchmark-rules.md +229 -0
  5. package/skills/web-design/claude-code/analyze/analyze-benchmark.md +302 -0
  6. package/skills/web-design/claude-code/analyze/analyze-mockup.md +572 -0
  7. package/skills/web-design/claude-code/collect/collect-app.md +258 -0
  8. package/skills/web-design/claude-code/collect/collect-desktop.md +231 -0
  9. package/skills/web-design/claude-code/collect/collect-hybrid.md +222 -0
  10. package/skills/web-design/claude-code/collect/collect-style.md +155 -0
  11. package/skills/web-design/claude-code/collect/collect-type.md +42 -0
  12. package/skills/web-design/claude-code/collect/collect-video.md +239 -0
  13. package/skills/web-design/claude-code/collect/collect-web.md +279 -0
  14. package/skills/web-design/claude-code/defs/ai-recommend/01-style-design-recommend.md +64 -0
  15. package/skills/web-design/claude-code/defs/ai-recommend.md +58 -0
  16. package/skills/web-design/claude-code/defs/app-layouts/02-utility.md +54 -0
  17. package/skills/web-design/claude-code/defs/app-layouts/03-social.md +71 -0
  18. package/skills/web-design/claude-code/defs/app-layouts/04-game.md +54 -0
  19. package/skills/web-design/claude-code/defs/app-layouts/05-fintech.md +62 -0
  20. package/skills/web-design/claude-code/defs/app-layouts/06-healthcare.md +66 -0
  21. package/skills/web-design/claude-code/defs/app-layouts/07-ecommerce.md +63 -0
  22. package/skills/web-design/claude-code/defs/app-layouts/08-education.md +88 -0
  23. package/skills/web-design/claude-code/defs/app-layouts/09-creative.md +86 -0
  24. package/skills/web-design/claude-code/defs/app-layouts.md +59 -0
  25. package/skills/web-design/claude-code/defs/app-motions/01-utility.md +51 -0
  26. package/skills/web-design/claude-code/defs/app-motions/02-social.md +55 -0
  27. package/skills/web-design/claude-code/defs/app-motions/03-game.md +52 -0
  28. package/skills/web-design/claude-code/defs/app-motions/04-fintech.md +52 -0
  29. package/skills/web-design/claude-code/defs/app-motions/05-healthcare.md +52 -0
  30. package/skills/web-design/claude-code/defs/app-motions/06-ecommerce.md +55 -0
  31. package/skills/web-design/claude-code/defs/app-motions/07-education.md +54 -0
  32. package/skills/web-design/claude-code/defs/app-motions/08-creative.md +53 -0
  33. package/skills/web-design/claude-code/defs/app-motions/10-intensity-preset-motion.md +12 -0
  34. package/skills/web-design/claude-code/defs/app-motions.md +64 -0
  35. package/skills/web-design/claude-code/defs/component-specs/01-set-component.md +24 -0
  36. package/skills/web-design/claude-code/defs/component-specs/02-features-flow.md +51 -0
  37. package/skills/web-design/claude-code/defs/component-specs/03-system-visual.md +193 -0
  38. package/skills/web-design/claude-code/defs/component-specs/04-interaction-pattern-visual.md +61 -0
  39. package/skills/web-design/claude-code/defs/component-specs/domains/admin.md +55 -0
  40. package/skills/web-design/claude-code/defs/component-specs/domains/dashboard.md +60 -0
  41. package/skills/web-design/claude-code/defs/component-specs/domains/erp.md +68 -0
  42. package/skills/web-design/claude-code/defs/component-specs/domains/saas.md +65 -0
  43. package/skills/web-design/claude-code/defs/component-specs.md +24 -0
  44. package/skills/web-design/claude-code/defs/design-guide-sections.md +37 -0
  45. package/skills/web-design/claude-code/defs/desktop-layouts/01-utility.md +69 -0
  46. package/skills/web-design/claude-code/defs/desktop-layouts/02-data.md +71 -0
  47. package/skills/web-design/claude-code/defs/desktop-layouts/03-creative.md +73 -0
  48. package/skills/web-design/claude-code/defs/desktop-layouts/04-communication.md +71 -0
  49. package/skills/web-design/claude-code/defs/desktop-layouts/05-game.md +73 -0
  50. package/skills/web-design/claude-code/defs/desktop-layouts/06-business.md +74 -0
  51. package/skills/web-design/claude-code/defs/desktop-layouts.md +49 -0
  52. package/skills/web-design/claude-code/defs/desktop-motions/01-utility.md +56 -0
  53. package/skills/web-design/claude-code/defs/desktop-motions/02-data.md +60 -0
  54. package/skills/web-design/claude-code/defs/desktop-motions/03-creative.md +60 -0
  55. package/skills/web-design/claude-code/defs/desktop-motions/04-communication.md +57 -0
  56. package/skills/web-design/claude-code/defs/desktop-motions/05-game.md +55 -0
  57. package/skills/web-design/claude-code/defs/desktop-motions/06-business.md +52 -0
  58. package/skills/web-design/claude-code/defs/desktop-motions.md +75 -0
  59. package/skills/web-design/claude-code/defs/hybrid-layouts/01-web_mobile.md +81 -0
  60. package/skills/web-design/claude-code/defs/hybrid-layouts/02-web_desktop.md +78 -0
  61. package/skills/web-design/claude-code/defs/hybrid-layouts/03-mobile_desktop.md +79 -0
  62. package/skills/web-design/claude-code/defs/hybrid-layouts/04-all.md +81 -0
  63. package/skills/web-design/claude-code/defs/hybrid-layouts.md +49 -0
  64. package/skills/web-design/claude-code/defs/hybrid-motions/01-web_mobile.md +69 -0
  65. package/skills/web-design/claude-code/defs/hybrid-motions/02-web_desktop.md +69 -0
  66. package/skills/web-design/claude-code/defs/hybrid-motions/03-mobile_desktop.md +74 -0
  67. package/skills/web-design/claude-code/defs/hybrid-motions/04-all.md +96 -0
  68. package/skills/web-design/claude-code/defs/hybrid-motions/07-intensity-preset-motion.md +16 -0
  69. package/skills/web-design/claude-code/defs/hybrid-motions.md +65 -0
  70. package/skills/web-design/claude-code/defs/ia-patterns/01-management-dashboard.md +37 -0
  71. package/skills/web-design/claude-code/defs/ia-patterns/05-video.md +33 -0
  72. package/skills/web-design/claude-code/defs/ia-patterns/06-video_saas-saas.md +37 -0
  73. package/skills/web-design/claude-code/defs/ia-patterns.md +85 -0
  74. package/skills/web-design/claude-code/defs/icon-mappings/04-mapping-design-system.md +25 -0
  75. package/skills/web-design/claude-code/defs/icon-mappings.md +49 -0
  76. package/skills/web-design/claude-code/defs/icon-usage.md +56 -0
  77. package/skills/web-design/claude-code/defs/illustration-guide.md +44 -0
  78. package/skills/web-design/claude-code/defs/image-strategies/01-landing.md +76 -0
  79. package/skills/web-design/claude-code/defs/image-strategies/02-dashboard.md +51 -0
  80. package/skills/web-design/claude-code/defs/image-strategies/03-ecommerce.md +47 -0
  81. package/skills/web-design/claude-code/defs/image-strategies/04-blog.md +58 -0
  82. package/skills/web-design/claude-code/defs/image-strategies/05-saas.md +56 -0
  83. package/skills/web-design/claude-code/defs/image-strategies/06-portfolio.md +62 -0
  84. package/skills/web-design/claude-code/defs/image-strategies/08-strategy-common-image.md +57 -0
  85. package/skills/web-design/claude-code/defs/image-strategies.md +58 -0
  86. package/skills/web-design/claude-code/defs/seo-guide.md +79 -0
  87. package/skills/web-design/claude-code/defs/styles/02-style-list.md +421 -0
  88. package/skills/web-design/claude-code/defs/styles/03-custom-animation-keyframes.md +39 -0
  89. package/skills/web-design/claude-code/defs/styles.md +50 -0
  90. package/skills/web-design/claude-code/defs/tokens/01-token-format.md +75 -0
  91. package/skills/web-design/claude-code/defs/tokens/02-token-scope.md +251 -0
  92. package/skills/web-design/claude-code/defs/tokens.md +24 -0
  93. package/skills/web-design/claude-code/defs/video-compositions/01-composition-single.md +66 -0
  94. package/skills/web-design/claude-code/defs/video-compositions/02-composition-multi.md +66 -0
  95. package/skills/web-design/claude-code/defs/video-compositions/03-composition-parametric.md +81 -0
  96. package/skills/web-design/claude-code/defs/video-compositions.md +37 -0
  97. package/skills/web-design/claude-code/defs/video-motions/01-animation-basic.md +49 -0
  98. package/skills/web-design/claude-code/defs/video-motions/02-animation.md +52 -0
  99. package/skills/web-design/claude-code/defs/video-motions/03-reference.md +17 -0
  100. package/skills/web-design/claude-code/defs/video-motions/05-pattern-composition.md +61 -0
  101. package/skills/web-design/claude-code/defs/video-motions/06-transition-effects.md +49 -0
  102. package/skills/web-design/claude-code/defs/video-motions/07-audio-sync.md +29 -0
  103. package/skills/web-design/claude-code/defs/video-motions.md +55 -0
  104. package/skills/web-design/claude-code/defs/web-layouts/01-landing.md +101 -0
  105. package/skills/web-design/claude-code/defs/web-layouts/02-dashboard.md +85 -0
  106. package/skills/web-design/claude-code/defs/web-layouts/03-ecommerce.md +73 -0
  107. package/skills/web-design/claude-code/defs/web-layouts/04-blog.md +69 -0
  108. package/skills/web-design/claude-code/defs/web-layouts/05-saas.md +83 -0
  109. package/skills/web-design/claude-code/defs/web-layouts/06-portfolio.md +62 -0
  110. package/skills/web-design/claude-code/defs/web-layouts.md +38 -0
  111. package/skills/web-design/claude-code/defs/web-motions/01-landing.md +91 -0
  112. package/skills/web-design/claude-code/defs/web-motions/02-dashboard.md +55 -0
  113. package/skills/web-design/claude-code/defs/web-motions/03-ecommerce.md +52 -0
  114. package/skills/web-design/claude-code/defs/web-motions/04-blog.md +57 -0
  115. package/skills/web-design/claude-code/defs/web-motions/05-saas.md +49 -0
  116. package/skills/web-design/claude-code/defs/web-motions/06-portfolio.md +73 -0
  117. package/skills/web-design/claude-code/defs/web-motions/08-intensity-preset-motion.md +14 -0
  118. package/skills/web-design/claude-code/defs/web-motions.md +55 -0
  119. package/skills/web-design/claude-code/gen/gen-design-guide/01-project-overview.md +304 -0
  120. package/skills/web-design/claude-code/gen/gen-design-guide-interaction/01-interaction-motion.md +129 -0
  121. package/skills/web-design/claude-code/gen/gen-design-guide-interaction/04-project-video.md +69 -0
  122. package/skills/web-design/claude-code/gen/gen-design-guide-interaction.md +45 -0
  123. package/skills/web-design/claude-code/gen/gen-design-guide.md +43 -0
  124. package/skills/web-design/claude-code/gen/gen-tokens/01-generate-process.md +318 -0
  125. package/skills/web-design/claude-code/gen/gen-tokens/02-structure-output-file.md +31 -0
  126. package/skills/web-design/claude-code/gen/gen-tokens/03-connect-frontend.md +150 -0
  127. package/skills/web-design/claude-code/gen/gen-tokens.md +54 -0
  128. package/skills/web-design/claude-code/gen/gen-video.md +73 -0
  129. package/skills/web-design/claude-code/verify/verify-components.md +52 -0
  130. package/skills/web-design/claude-code/verify/verify-motions.md +74 -0
  131. package/skills/web-design/claude-code/verify/verify-pipeline.md +69 -0
  132. package/skills/web-design/claude-code/verify/verify-report.md +75 -0
  133. package/skills/web-design/claude-code/verify/verify-responsive.md +49 -0
  134. package/skills/web-design/claude-code/verify/verify-tokens.md +84 -0
  135. package/skills/test-skill/claude-code/SKILL.md +0 -7
  136. package/skills/test-skill/cursor/test-skill.md +0 -7
  137. package/skills/test-skill/openclaw/SKILL.md +0 -13
  138. 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
+