@vibecuting/video-project-core 0.1.26 → 0.1.28

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 (266) hide show
  1. package/package.json +4 -4
  2. package/src/base/BaseRemotionScene.tsx +4 -3
  3. package/src/core/index.test.ts +40 -0
  4. package/src/core/intro/_shared/intro-layout.test.ts +18 -0
  5. package/src/core/intro/_shared/intro-layout.ts +50 -0
  6. package/src/core/intro/cyberpunk-intro-holo/default-cyberpunk-intro-bumper-Horizontal.tsx +25 -0
  7. package/src/core/intro/cyberpunk-intro-holo/default-cyberpunk-intro-bumper-Landscape.tsx +25 -0
  8. package/src/core/intro/cyberpunk-intro-holo/default-cyberpunk-intro-bumper.stories.tsx +31 -0
  9. package/src/core/intro/cyberpunk-intro-holo/default-cyberpunk-intro-bumper.tsx +118 -0
  10. package/src/core/intro/cyberpunk-intro-holo/index.ts +11 -0
  11. package/src/core/intro/cyberpunk-intro-neon/default-cyberpunk-intro-bumper-Horizontal.tsx +24 -0
  12. package/src/core/intro/cyberpunk-intro-neon/default-cyberpunk-intro-bumper-Landscape.tsx +24 -0
  13. package/src/core/intro/cyberpunk-intro-neon/default-cyberpunk-intro-bumper.stories.tsx +30 -0
  14. package/src/core/intro/cyberpunk-intro-neon/default-cyberpunk-intro-bumper.tsx +108 -0
  15. package/src/core/intro/cyberpunk-intro-neon/index.ts +10 -0
  16. package/src/core/intro/default-cinematic-intro-bumper/default-cinematic-intro-bumper-Horizontal.tsx +24 -0
  17. package/src/core/intro/default-cinematic-intro-bumper/default-cinematic-intro-bumper-Landscape.tsx +24 -0
  18. package/src/core/intro/default-cinematic-intro-bumper/default-cinematic-intro-bumper.stories.tsx +29 -0
  19. package/src/core/intro/default-cinematic-intro-bumper/default-cinematic-intro-bumper.tsx +234 -0
  20. package/src/core/intro/default-cinematic-intro-bumper/index.ts +11 -0
  21. package/src/core/intro/default-festival-intro-bumper/default-festival-intro-bumper-Horizontal.tsx +24 -0
  22. package/src/core/intro/default-festival-intro-bumper/default-festival-intro-bumper-Landscape.tsx +24 -0
  23. package/src/core/intro/default-festival-intro-bumper/default-festival-intro-bumper.stories.tsx +29 -0
  24. package/src/core/intro/default-festival-intro-bumper/default-festival-intro-bumper.tsx +187 -0
  25. package/src/core/intro/default-festival-intro-bumper/index.ts +11 -0
  26. package/src/core/intro/default-intro-bumper/default-intro-bumper-Horizontal.tsx +24 -0
  27. package/src/core/intro/default-intro-bumper/default-intro-bumper-Landscape.tsx +24 -0
  28. package/src/core/intro/default-intro-bumper/default-intro-bumper.stories.tsx +41 -0
  29. package/src/core/intro/default-intro-bumper/default-intro-bumper.tsx +256 -0
  30. package/src/core/intro/default-intro-bumper/index.ts +11 -0
  31. package/src/core/intro/default-noir-intro-bumper/default-noir-intro-bumper-Horizontal.tsx +24 -0
  32. package/src/core/intro/default-noir-intro-bumper/default-noir-intro-bumper-Landscape.tsx +24 -0
  33. package/src/core/intro/default-noir-intro-bumper/default-noir-intro-bumper.stories.tsx +29 -0
  34. package/src/core/intro/default-noir-intro-bumper/default-noir-intro-bumper.tsx +122 -0
  35. package/src/core/intro/default-noir-intro-bumper/index.ts +11 -0
  36. package/src/core/intro/default-trailer-intro-bumper/default-trailer-intro-bumper-Horizontal.tsx +24 -0
  37. package/src/core/intro/default-trailer-intro-bumper/default-trailer-intro-bumper-Landscape.tsx +24 -0
  38. package/src/core/intro/default-trailer-intro-bumper/default-trailer-intro-bumper.stories.tsx +29 -0
  39. package/src/core/intro/default-trailer-intro-bumper/default-trailer-intro-bumper.tsx +181 -0
  40. package/src/core/intro/default-trailer-intro-bumper/index.ts +11 -0
  41. package/src/core/intro/documentary-intro-observation/default-documentary-intro-bumper-Horizontal.tsx +18 -0
  42. package/src/core/intro/documentary-intro-observation/default-documentary-intro-bumper-Landscape.tsx +18 -0
  43. package/src/core/intro/documentary-intro-observation/default-documentary-intro-bumper.stories.tsx +31 -0
  44. package/src/core/intro/documentary-intro-observation/default-documentary-intro-bumper.tsx +158 -0
  45. package/src/core/intro/documentary-intro-observation/index.ts +10 -0
  46. package/src/core/intro/family-intro-reunion/default-family-intro-bumper-Horizontal.tsx +18 -0
  47. package/src/core/intro/family-intro-reunion/default-family-intro-bumper-Landscape.tsx +18 -0
  48. package/src/core/intro/family-intro-reunion/default-family-intro-bumper.stories.tsx +43 -0
  49. package/src/core/intro/family-intro-reunion/default-family-intro-bumper.tsx +165 -0
  50. package/src/core/intro/family-intro-reunion/index.ts +10 -0
  51. package/src/core/intro/festival-intro-spotlight/default-festival-intro-bumper-Horizontal.tsx +1 -0
  52. package/src/core/intro/festival-intro-spotlight/default-festival-intro-bumper-Landscape.tsx +1 -0
  53. package/src/core/intro/festival-intro-spotlight/default-festival-intro-bumper.stories.tsx +30 -0
  54. package/src/core/intro/festival-intro-spotlight/default-festival-intro-bumper.tsx +105 -0
  55. package/src/core/intro/festival-intro-spotlight/index.ts +10 -0
  56. package/src/core/intro/index.test.ts +45 -0
  57. package/src/core/intro/index.ts +17 -0
  58. package/src/core/intro/noir-intro-city/default-noir-intro-bumper-Horizontal.tsx +24 -0
  59. package/src/core/intro/noir-intro-city/default-noir-intro-bumper-Landscape.tsx +24 -0
  60. package/src/core/intro/noir-intro-city/default-noir-intro-bumper.stories.tsx +31 -0
  61. package/src/core/intro/noir-intro-city/default-noir-intro-bumper.tsx +96 -0
  62. package/src/core/intro/noir-intro-city/index.ts +10 -0
  63. package/src/core/intro/noir-intro-deluxe/default-noir-intro-bumper-Horizontal.tsx +1 -0
  64. package/src/core/intro/noir-intro-deluxe/default-noir-intro-bumper-Landscape.tsx +1 -0
  65. package/src/core/intro/noir-intro-deluxe/default-noir-intro-bumper.stories.tsx +31 -0
  66. package/src/core/intro/noir-intro-deluxe/default-noir-intro-bumper.tsx +117 -0
  67. package/src/core/intro/noir-intro-deluxe/index.ts +10 -0
  68. package/src/core/intro/sci-fi-intro/default-sci-fi-intro-bumper-Horizontal.tsx +1 -0
  69. package/src/core/intro/sci-fi-intro/default-sci-fi-intro-bumper-Landscape.tsx +1 -0
  70. package/src/core/intro/sci-fi-intro/default-sci-fi-intro-bumper.stories.tsx +48 -0
  71. package/src/core/intro/sci-fi-intro/default-sci-fi-intro-bumper.tsx +105 -0
  72. package/src/core/intro/sci-fi-intro/index.ts +10 -0
  73. package/src/core/intro/thriller-intro-suspense/default-thriller-intro-bumper-Horizontal.tsx +18 -0
  74. package/src/core/intro/thriller-intro-suspense/default-thriller-intro-bumper-Landscape.tsx +18 -0
  75. package/src/core/intro/thriller-intro-suspense/default-thriller-intro-bumper.stories.tsx +31 -0
  76. package/src/core/intro/thriller-intro-suspense/default-thriller-intro-bumper.tsx +155 -0
  77. package/src/core/intro/thriller-intro-suspense/index.ts +10 -0
  78. package/src/core/intro/trailer-intro-premiere/default-trailer-intro-bumper-Horizontal.tsx +1 -0
  79. package/src/core/intro/trailer-intro-premiere/default-trailer-intro-bumper-Landscape.tsx +1 -0
  80. package/src/core/intro/trailer-intro-premiere/default-trailer-intro-bumper.stories.tsx +30 -0
  81. package/src/core/intro/trailer-intro-premiere/default-trailer-intro-bumper.tsx +104 -0
  82. package/src/core/intro/trailer-intro-premiere/index.ts +10 -0
  83. package/src/core/intro/travel-intro-journey/default-travel-intro-bumper-Horizontal.tsx +18 -0
  84. package/src/core/intro/travel-intro-journey/default-travel-intro-bumper-Landscape.tsx +18 -0
  85. package/src/core/intro/travel-intro-journey/default-travel-intro-bumper.stories.tsx +43 -0
  86. package/src/core/intro/travel-intro-journey/default-travel-intro-bumper.tsx +158 -0
  87. package/src/core/intro/travel-intro-journey/index.ts +10 -0
  88. package/src/core/intro/western-intro/default-western-intro-bumper-Horizontal.tsx +24 -0
  89. package/src/core/intro/western-intro/default-western-intro-bumper-Landscape.tsx +24 -0
  90. package/src/core/intro/western-intro/default-western-intro-bumper.stories.tsx +29 -0
  91. package/src/core/intro/western-intro/default-western-intro-bumper.tsx +146 -0
  92. package/src/core/intro/western-intro/index.ts +4 -0
  93. package/src/core/intro/western-intro-gangster/default-western-intro-bumper-Horizontal.tsx +25 -0
  94. package/src/core/intro/western-intro-gangster/default-western-intro-bumper-Landscape.tsx +25 -0
  95. package/src/core/intro/western-intro-gangster/default-western-intro-bumper.stories.tsx +31 -0
  96. package/src/core/intro/western-intro-gangster/default-western-intro-bumper.tsx +105 -0
  97. package/src/core/intro/western-intro-gangster/index.ts +11 -0
  98. package/src/core/outro/_shared/outro-layout.test.ts +32 -0
  99. package/src/core/outro/_shared/outro-layout.ts +72 -0
  100. package/src/core/outro/award-outro-celebration/default-award-outro-bumper-Horizontal.tsx +18 -0
  101. package/src/core/outro/award-outro-celebration/default-award-outro-bumper-Landscape.tsx +18 -0
  102. package/src/core/outro/award-outro-celebration/default-award-outro-bumper.stories.tsx +42 -0
  103. package/src/core/outro/award-outro-celebration/default-award-outro-bumper.tsx +152 -0
  104. package/src/core/outro/award-outro-celebration/index.ts +10 -0
  105. package/src/core/outro/blackout-outro-finale/default-blackout-outro-bumper-Horizontal.tsx +1 -0
  106. package/src/core/outro/blackout-outro-finale/default-blackout-outro-bumper-Landscape.tsx +1 -0
  107. package/src/core/outro/blackout-outro-finale/default-blackout-outro-bumper.stories.tsx +28 -0
  108. package/src/core/outro/blackout-outro-finale/default-blackout-outro-bumper.tsx +71 -0
  109. package/src/core/outro/blackout-outro-finale/index.ts +10 -0
  110. package/src/core/outro/credits-roll-outro-epic/default-credits-roll-outro-Horizontal.tsx +24 -0
  111. package/src/core/outro/credits-roll-outro-epic/default-credits-roll-outro-Landscape.tsx +24 -0
  112. package/src/core/outro/credits-roll-outro-epic/default-credits-roll-outro.stories.tsx +31 -0
  113. package/src/core/outro/credits-roll-outro-epic/default-credits-roll-outro.tsx +106 -0
  114. package/src/core/outro/credits-roll-outro-epic/index.ts +10 -0
  115. package/src/core/outro/credits-roll-outro-premium/default-credits-roll-outro-Horizontal.tsx +1 -0
  116. package/src/core/outro/credits-roll-outro-premium/default-credits-roll-outro-Landscape.tsx +1 -0
  117. package/src/core/outro/credits-roll-outro-premium/default-credits-roll-outro.stories.tsx +30 -0
  118. package/src/core/outro/credits-roll-outro-premium/default-credits-roll-outro.tsx +88 -0
  119. package/src/core/outro/credits-roll-outro-premium/index.ts +10 -0
  120. package/src/core/outro/credits-roll-outro-royal/default-credits-roll-outro-Horizontal.tsx +25 -0
  121. package/src/core/outro/credits-roll-outro-royal/default-credits-roll-outro-Landscape.tsx +25 -0
  122. package/src/core/outro/credits-roll-outro-royal/default-credits-roll-outro.stories.tsx +32 -0
  123. package/src/core/outro/credits-roll-outro-royal/default-credits-roll-outro.tsx +110 -0
  124. package/src/core/outro/credits-roll-outro-royal/index.ts +11 -0
  125. package/src/core/outro/default-blackout-outro-bumper/default-blackout-outro-bumper-Horizontal.tsx +22 -0
  126. package/src/core/outro/default-blackout-outro-bumper/default-blackout-outro-bumper-Landscape.tsx +22 -0
  127. package/src/core/outro/default-blackout-outro-bumper/default-blackout-outro-bumper.stories.tsx +48 -0
  128. package/src/core/outro/default-blackout-outro-bumper/default-blackout-outro-bumper.tsx +124 -0
  129. package/src/core/outro/default-blackout-outro-bumper/index.ts +11 -0
  130. package/src/core/outro/default-credits-roll-outro/default-credits-roll-outro-Horizontal.tsx +22 -0
  131. package/src/core/outro/default-credits-roll-outro/default-credits-roll-outro-Landscape.tsx +22 -0
  132. package/src/core/outro/default-credits-roll-outro/default-credits-roll-outro.stories.tsx +48 -0
  133. package/src/core/outro/default-credits-roll-outro/default-credits-roll-outro.tsx +208 -0
  134. package/src/core/outro/default-credits-roll-outro/index.ts +11 -0
  135. package/src/core/outro/default-epilogue-outro/default-epilogue-outro-Horizontal.tsx +22 -0
  136. package/src/core/outro/default-epilogue-outro/default-epilogue-outro-Landscape.tsx +22 -0
  137. package/src/core/outro/default-epilogue-outro/default-epilogue-outro.stories.tsx +48 -0
  138. package/src/core/outro/default-epilogue-outro/default-epilogue-outro.tsx +115 -0
  139. package/src/core/outro/default-epilogue-outro/index.ts +11 -0
  140. package/src/core/outro/default-outro-bumper/default-outro-bumper-Horizontal.tsx +22 -0
  141. package/src/core/outro/default-outro-bumper/default-outro-bumper-Landscape.tsx +22 -0
  142. package/src/core/outro/default-outro-bumper/default-outro-bumper.stories.tsx +48 -0
  143. package/src/core/outro/default-outro-bumper/default-outro-bumper.tsx +159 -0
  144. package/src/core/outro/default-outro-bumper/index.ts +11 -0
  145. package/src/core/outro/default-sunset-outro-bumper/default-sunset-outro-bumper-Horizontal.tsx +22 -0
  146. package/src/core/outro/default-sunset-outro-bumper/default-sunset-outro-bumper-Landscape.tsx +22 -0
  147. package/src/core/outro/default-sunset-outro-bumper/default-sunset-outro-bumper.stories.tsx +48 -0
  148. package/src/core/outro/default-sunset-outro-bumper/default-sunset-outro-bumper.tsx +183 -0
  149. package/src/core/outro/default-sunset-outro-bumper/index.ts +11 -0
  150. package/src/core/outro/festival-outro-encore/default-festival-outro-bumper-Horizontal.tsx +18 -0
  151. package/src/core/outro/festival-outro-encore/default-festival-outro-bumper-Landscape.tsx +18 -0
  152. package/src/core/outro/festival-outro-encore/default-festival-outro-bumper.stories.tsx +31 -0
  153. package/src/core/outro/festival-outro-encore/default-festival-outro-bumper.tsx +130 -0
  154. package/src/core/outro/festival-outro-encore/index.ts +10 -0
  155. package/src/core/outro/heist-outro/default-heist-outro-bumper-Horizontal.tsx +24 -0
  156. package/src/core/outro/heist-outro/default-heist-outro-bumper-Landscape.tsx +24 -0
  157. package/src/core/outro/heist-outro/default-heist-outro-bumper.stories.tsx +29 -0
  158. package/src/core/outro/heist-outro/default-heist-outro-bumper.tsx +160 -0
  159. package/src/core/outro/heist-outro/index.ts +4 -0
  160. package/src/core/outro/index.test.ts +88 -0
  161. package/src/core/outro/index.ts +73 -0
  162. package/src/core/outro/memoir-outro-reflection/default-memoir-outro-bumper-Horizontal.tsx +18 -0
  163. package/src/core/outro/memoir-outro-reflection/default-memoir-outro-bumper-Landscape.tsx +18 -0
  164. package/src/core/outro/memoir-outro-reflection/default-memoir-outro-bumper.stories.tsx +42 -0
  165. package/src/core/outro/memoir-outro-reflection/default-memoir-outro-bumper.tsx +158 -0
  166. package/src/core/outro/memoir-outro-reflection/index.ts +10 -0
  167. package/src/core/outro/romance-outro/default-romance-outro-bumper-Horizontal.tsx +1 -0
  168. package/src/core/outro/romance-outro/default-romance-outro-bumper-Landscape.tsx +1 -0
  169. package/src/core/outro/romance-outro/default-romance-outro-bumper.stories.tsx +48 -0
  170. package/src/core/outro/romance-outro/default-romance-outro-bumper.tsx +123 -0
  171. package/src/core/outro/romance-outro/index.ts +10 -0
  172. package/src/core/outro/sunset-outro-coda/default-sunset-outro-bumper-Horizontal.tsx +1 -0
  173. package/src/core/outro/sunset-outro-coda/default-sunset-outro-bumper-Landscape.tsx +1 -0
  174. package/src/core/outro/sunset-outro-coda/default-sunset-outro-bumper.stories.tsx +30 -0
  175. package/src/core/outro/sunset-outro-coda/default-sunset-outro-bumper.tsx +75 -0
  176. package/src/core/outro/sunset-outro-coda/index.ts +10 -0
  177. package/src/core/scene/2dscene/default-2d-scene-Horizontal.stories.tsx +1 -1
  178. package/src/core/scene/2dscene/default-2d-scene.stories.tsx +1 -1
  179. package/src/core/scene/3dscene/default-3d-scene-Horizontal.stories.tsx +1 -1
  180. package/src/core/scene/3dscene/default-3d-scene.stories.tsx +1 -1
  181. package/src/core/scene/index.ts +3 -0
  182. package/src/core/scene/photo/3dvr-photo/default-3dvr-photo-scene-Horizontal.stories.tsx +46 -0
  183. package/src/core/scene/photo/3dvr-photo/default-3dvr-photo-scene-Horizontal.tsx +20 -0
  184. package/src/core/scene/photo/3dvr-photo/default-3dvr-photo-scene-Landscape.tsx +20 -0
  185. package/src/core/scene/photo/3dvr-photo/default-3dvr-photo-scene.stories.tsx +46 -0
  186. package/src/core/scene/photo/3dvr-photo/default-3dvr-photo-scene.tsx +255 -0
  187. package/src/core/scene/photo/3dvr-photo/index.ts +3 -0
  188. package/src/core/scene/photo/default-live-photo-scene-Horizontal.stories.tsx +33 -0
  189. package/src/core/scene/photo/default-live-photo-scene-Horizontal.tsx +20 -0
  190. package/src/core/scene/photo/default-live-photo-scene-Landscape.tsx +20 -0
  191. package/src/core/scene/photo/default-live-photo-scene.stories.tsx +33 -0
  192. package/src/core/scene/photo/default-live-photo-scene.tsx +432 -0
  193. package/src/core/scene/photo/default-photo-strip-scene-Horizontal.tsx +20 -0
  194. package/src/core/scene/photo/default-photo-strip-scene-Landscape.tsx +20 -0
  195. package/src/core/scene/photo/default-photo-strip-scene.stories.tsx +38 -0
  196. package/src/core/scene/photo/default-photo-strip-scene.tsx +19 -0
  197. package/src/core/scene/photo/default-photo-wall-scene-Horizontal.tsx +20 -0
  198. package/src/core/scene/photo/default-photo-wall-scene-Landscape.tsx +20 -0
  199. package/src/core/scene/photo/default-photo-wall-scene.stories.tsx +38 -0
  200. package/src/core/scene/photo/default-photo-wall-scene.tsx +19 -0
  201. package/src/core/scene/photo/effects-photo/default-effects-photo-scene-Horizontal.stories.tsx +44 -0
  202. package/src/core/scene/photo/effects-photo/default-effects-photo-scene-Horizontal.tsx +20 -0
  203. package/src/core/scene/photo/effects-photo/default-effects-photo-scene-Landscape.tsx +20 -0
  204. package/src/core/scene/photo/effects-photo/default-effects-photo-scene.stories.tsx +44 -0
  205. package/src/core/scene/photo/effects-photo/default-effects-photo-scene.tsx +352 -0
  206. package/src/core/scene/photo/effects-photo/index.ts +3 -0
  207. package/src/core/scene/photo/index.ts +25 -0
  208. package/src/core/scene/photo/photo-storybook.test.tsx +112 -0
  209. package/src/core/scene/slide/_shared/index.ts +27 -0
  210. package/src/core/scene/slide/_shared/media-templates.test.ts +47 -0
  211. package/src/core/scene/slide/_shared/media-templates.tsx +324 -0
  212. package/src/core/scene/slide/default-slide-scene-Horizontal.animated.stories.tsx +1 -1
  213. package/src/core/scene/slide/default-slide-scene-Horizontal.stories.tsx +1 -1
  214. package/src/core/scene/slide/default-slide-scene.animated.stories.tsx +1 -1
  215. package/src/core/scene/slide/default-slide-scene.stories.tsx +1 -1
  216. package/src/core/scene/slide/index.test.ts +28 -0
  217. package/src/core/scene/slide/index.ts +14 -0
  218. package/src/core/scene/slide/person-intro/default-person-intro-duo-slide.tsx +19 -0
  219. package/src/core/scene/slide/person-intro/default-person-intro-group-slide.tsx +168 -0
  220. package/src/core/scene/slide/person-intro/default-person-intro-quad-slide.tsx +19 -0
  221. package/src/core/scene/slide/person-intro/default-person-intro-slide-Horizontal.animated.stories.tsx +47 -0
  222. package/src/core/scene/slide/person-intro/default-person-intro-slide-Horizontal.stories.tsx +46 -0
  223. package/src/core/scene/slide/person-intro/default-person-intro-slide-Horizontal.tsx +302 -0
  224. package/src/core/scene/slide/person-intro/default-person-intro-slide-Landscape.tsx +20 -0
  225. package/src/core/scene/slide/person-intro/default-person-intro-slide.animated.stories.tsx +126 -0
  226. package/src/core/scene/slide/person-intro/default-person-intro-slide.stories.tsx +119 -0
  227. package/src/core/scene/slide/person-intro/default-person-intro-slide.tsx +363 -0
  228. package/src/core/scene/slide/person-intro/default-person-intro-trio-slide.tsx +19 -0
  229. package/src/core/scene/slide/person-intro/index.ts +8 -0
  230. package/src/core/scene/slide/photo-album/default-photo-album-multi-slide.tsx +19 -0
  231. package/src/core/scene/slide/photo-album/default-photo-album-pair-slide.tsx +19 -0
  232. package/src/core/scene/slide/photo-album/default-photo-album-single-slide.tsx +19 -0
  233. package/src/core/scene/slide/photo-album/default-photo-album-slide-Horizontal.animated.stories.tsx +26 -0
  234. package/src/core/scene/slide/photo-album/default-photo-album-slide-Horizontal.stories.tsx +25 -0
  235. package/src/core/scene/slide/photo-album/default-photo-album-slide-Horizontal.tsx +20 -0
  236. package/src/core/scene/slide/photo-album/default-photo-album-slide-Landscape.tsx +20 -0
  237. package/src/core/scene/slide/photo-album/default-photo-album-slide.animated.stories.tsx +94 -0
  238. package/src/core/scene/slide/photo-album/default-photo-album-slide.stories.tsx +87 -0
  239. package/src/core/scene/slide/photo-album/default-photo-album-slide.tsx +414 -0
  240. package/src/core/scene/slide/photo-album/index.ts +7 -0
  241. package/src/core/scene/slide/video-showcase/default-video-showcase-multi-slide.tsx +195 -0
  242. package/src/core/scene/slide/video-showcase/default-video-showcase-slide-Horizontal.tsx +212 -0
  243. package/src/core/scene/slide/video-showcase/default-video-showcase-slide-Landscape.tsx +20 -0
  244. package/src/core/scene/slide/video-showcase/default-video-showcase-slide.animated.stories.tsx +78 -0
  245. package/src/core/scene/slide/video-showcase/default-video-showcase-slide.stories.tsx +74 -0
  246. package/src/core/scene/slide/video-showcase/default-video-showcase-slide.tsx +365 -0
  247. package/src/core/scene/slide/video-showcase/index.ts +5 -0
  248. package/src/core/scene/video/default-video-scene-Horizontal.stories.tsx +26 -0
  249. package/src/core/scene/video/default-video-scene-Horizontal.tsx +20 -0
  250. package/src/core/scene/video/default-video-scene-Landscape.tsx +20 -0
  251. package/src/core/scene/video/default-video-scene.stories.tsx +26 -0
  252. package/src/core/scene/video/default-video-scene.tsx +283 -0
  253. package/src/core/scene/video/default-video-split-scene-Horizontal.tsx +20 -0
  254. package/src/core/scene/video/default-video-split-scene-Landscape.tsx +20 -0
  255. package/src/core/scene/video/default-video-split-scene.stories.tsx +41 -0
  256. package/src/core/scene/video/default-video-split-scene.tsx +19 -0
  257. package/src/core/scene/video/default-video-wall-scene-Horizontal.tsx +20 -0
  258. package/src/core/scene/video/default-video-wall-scene-Landscape.tsx +20 -0
  259. package/src/core/scene/video/default-video-wall-scene.stories.tsx +40 -0
  260. package/src/core/scene/video/default-video-wall-scene.tsx +19 -0
  261. package/src/core/scene/video/index.ts +9 -0
  262. package/src/storybook/remotion-preview.tsx +112 -6
  263. package/src/core/intro/default-intro-bumper.stories.tsx +0 -19
  264. package/src/core/intro/default-intro-bumper.tsx +0 -218
  265. package/src/core/outro/default-outro-bumper.stories.tsx +0 -19
  266. package/src/core/outro/default-outro-bumper.tsx +0 -218
@@ -0,0 +1,104 @@
1
+ import type { ReactNode } from 'react'
2
+
3
+ import { VideoComponent, defineComponentProjectComponentMetadata } from '@vibecuting/component-project-helper'
4
+
5
+ import { BaseRemotionScene, type BaseRemotionSceneProps, useRemotionSceneRuntime } from '../../../base'
6
+ import { useSceneMotion } from '../../../base'
7
+ import { getIntroBodyMaxWidth, getIntroLineClamp, getIntroPanelMinHeight } from '../_shared/intro-layout'
8
+
9
+ export interface DefaultTrailerIntroBumperPremiereProps extends BaseRemotionSceneProps {
10
+ title: string
11
+ subtitle?: string
12
+ kicker?: string
13
+ creditLine?: string
14
+ footer?: string
15
+ accent?: string
16
+ secondaryAccent?: string
17
+ textColor?: string
18
+ children?: ReactNode
19
+ }
20
+
21
+ export const componentMetadata = defineComponentProjectComponentMetadata({
22
+ name: 'DefaultTrailerIntroBumperPremiere',
23
+ description: 'Trailer-style intro bumper',
24
+ sourceFile: 'src/core/intro/trailer-intro-premiere/default-trailer-intro-bumper.tsx',
25
+ aspectRatio: '16:9',
26
+ sceneType: 'intro',
27
+ tags: ['intro', 'bumper', 'trailer', 'premiere', 'action'],
28
+ propsTypeName: 'DefaultTrailerIntroBumperPremiereProps',
29
+ })
30
+
31
+ export function DefaultTrailerIntroBumperPremiere({
32
+ id,
33
+ name,
34
+ title,
35
+ subtitle,
36
+ kicker,
37
+ creditLine,
38
+ footer,
39
+ accent,
40
+ secondaryAccent,
41
+ textColor,
42
+ children,
43
+ }: DefaultTrailerIntroBumperPremiereProps) {
44
+ const runtime = useRemotionSceneRuntime()
45
+ const motion = useSceneMotion()
46
+ const portrait = runtime.height > runtime.width
47
+
48
+ return (
49
+ <BaseRemotionScene
50
+ id={id}
51
+ name={name}
52
+ style={{
53
+ background: portrait
54
+ ? 'linear-gradient(180deg, #111827 0%, #020617 48%, #000000 100%)'
55
+ : `radial-gradient(circle at 18% 24%, ${accent ?? '#ef4444'} 0%, ${secondaryAccent ?? '#7f1d1d'} 36%, #020617 100%)`,
56
+ color: textColor ?? '#f8fafc',
57
+ display: 'grid',
58
+ placeItems: 'center',
59
+ padding: Math.round(runtime.height * 0.07),
60
+ }}
61
+ >
62
+ <section
63
+ style={{
64
+ width: '100%',
65
+ height: '100%',
66
+ display: 'grid',
67
+ gridTemplateColumns: portrait ? '1fr' : '0.96fr 1.04fr',
68
+ gap: portrait ? 18 : 24,
69
+ alignItems: 'center',
70
+ minWidth: 0,
71
+ minHeight: 0,
72
+ }}
73
+ >
74
+ <div style={{ display: 'grid', gap: 12, textAlign: portrait ? 'center' : 'left', minWidth: 0 }}>
75
+ <p style={{ margin: 0, fontSize: Math.round(runtime.height * 0.017), letterSpacing: '0.34em', textTransform: 'uppercase', opacity: 0.64 }}>
76
+ {kicker ?? 'Trailer Premiere'}
77
+ </p>
78
+ <h1 style={{ margin: 0, fontSize: portrait ? Math.round(runtime.height * 0.08) : Math.round(runtime.height * 0.072), lineHeight: 0.88, letterSpacing: '-0.09em', textTransform: 'uppercase', transform: motion.isAnimation ? `translate3d(0, ${(1 - motion.progress) * 10}px, 0)` : 'none' }}>
79
+ {title}
80
+ </h1>
81
+ {subtitle ? <p style={{ margin: 0, maxWidth: getIntroBodyMaxWidth(runtime.width, portrait, 0.42, 1, { min: 240, max: 680 }), fontSize: Math.round(runtime.height * 0.024), lineHeight: 1.56, opacity: 0.82, ...getIntroLineClamp(portrait ? 4 : 3) }}>{subtitle}</p> : null}
82
+ <div style={{ display: 'flex', flexWrap: 'wrap', justifyContent: portrait ? 'center' : 'flex-start', gap: 10 }}>
83
+ {creditLine ? <span style={{ fontSize: Math.round(runtime.height * 0.015), letterSpacing: '0.2em', textTransform: 'uppercase', opacity: 0.7 }}>{creditLine}</span> : null}
84
+ {footer ? <span style={{ fontSize: Math.round(runtime.height * 0.015), letterSpacing: '0.2em', textTransform: 'uppercase', opacity: 0.5 }}>{footer}</span> : null}
85
+ </div>
86
+ </div>
87
+
88
+ <div style={{ display: 'grid', alignContent: 'center', justifyItems: portrait ? 'center' : 'end', minWidth: 0 }}>
89
+ <div style={{ width: portrait ? '76%' : '100%', minWidth: 0, aspectRatio: '4 / 5', border: '1px solid rgba(248,250,252,0.12)', background: 'linear-gradient(180deg, rgba(239,68,68,0.22) 0%, rgba(15,23,42,0.2) 38%, rgba(2,6,23,0.96) 100%)', position: 'relative', overflow: 'hidden', minHeight: getIntroPanelMinHeight(runtime.height, portrait, 0.36, 0.22, { min: 160, max: 260 }) }}>
90
+ <div style={{ position: 'absolute', inset: 16, border: '1px solid rgba(248,250,252,0.08)' }} />
91
+ <div style={{ position: 'absolute', left: 18, right: 18, top: 18, height: 2, background: 'linear-gradient(90deg, transparent 0%, rgba(248,250,252,0.88) 50%, transparent 100%)' }} />
92
+ <div style={{ position: 'absolute', left: 18, right: 18, bottom: 18, display: 'grid', gap: 8 }}>
93
+ <div style={{ fontSize: Math.round(runtime.height * 0.017), letterSpacing: '0.24em', textTransform: 'uppercase', opacity: 0.58 }}>Big Screen Energy</div>
94
+ <div style={{ fontSize: Math.round(runtime.height * 0.029), fontWeight: 800, letterSpacing: '-0.06em' }}>The next cut starts now</div>
95
+ </div>
96
+ </div>
97
+ </div>
98
+ </section>
99
+ {children ? <div style={{ position: 'absolute', inset: 'auto 0 8%', display: 'grid', placeItems: 'center' }}>{children}</div> : null}
100
+ </BaseRemotionScene>
101
+ )
102
+ }
103
+
104
+ VideoComponent(componentMetadata)(DefaultTrailerIntroBumperPremiere)
@@ -0,0 +1,10 @@
1
+ export { DefaultTrailerIntroBumperPremiere } from './default-trailer-intro-bumper'
2
+ export { componentMetadata } from './default-trailer-intro-bumper'
3
+ export {
4
+ DefaultTrailerIntroBumperPremiereLandscape,
5
+ componentMetadata as DefaultTrailerIntroBumperPremiereLandscapeMetadata,
6
+ } from './default-trailer-intro-bumper-Landscape'
7
+ export {
8
+ DefaultTrailerIntroBumperPremiereHorizontal,
9
+ componentMetadata as DefaultTrailerIntroBumperPremiereHorizontalMetadata,
10
+ } from './default-trailer-intro-bumper-Horizontal'
@@ -0,0 +1,18 @@
1
+ import type { ComponentProps } from 'react'
2
+
3
+ import { VideoComponent, defineComponentProjectComponentMetadata } from '@vibecuting/component-project-helper'
4
+
5
+ import { DefaultTravelIntroBumper, componentMetadata as baseComponentMetadata } from './default-travel-intro-bumper'
6
+
7
+ export const componentMetadata = defineComponentProjectComponentMetadata({
8
+ ...baseComponentMetadata,
9
+ name: 'DefaultTravelIntroBumperHorizontal',
10
+ aspectRatio: '9:16',
11
+ sourceFile: 'src/core/intro/travel-intro-journey/default-travel-intro-bumper-Horizontal.tsx',
12
+ })
13
+
14
+ export const DefaultTravelIntroBumperHorizontal = VideoComponent(componentMetadata)(
15
+ function DefaultTravelIntroBumperHorizontal(props: ComponentProps<typeof DefaultTravelIntroBumper>) {
16
+ return <DefaultTravelIntroBumper {...props} />
17
+ },
18
+ )
@@ -0,0 +1,18 @@
1
+ import type { ComponentProps } from 'react'
2
+
3
+ import { VideoComponent, defineComponentProjectComponentMetadata } from '@vibecuting/component-project-helper'
4
+
5
+ import { DefaultTravelIntroBumper, componentMetadata as baseComponentMetadata } from './default-travel-intro-bumper'
6
+
7
+ export const componentMetadata = defineComponentProjectComponentMetadata({
8
+ ...baseComponentMetadata,
9
+ name: 'DefaultTravelIntroBumperLandscape',
10
+ aspectRatio: '16:9',
11
+ sourceFile: 'src/core/intro/travel-intro-journey/default-travel-intro-bumper-Landscape.tsx',
12
+ })
13
+
14
+ export const DefaultTravelIntroBumperLandscape = VideoComponent(componentMetadata)(
15
+ function DefaultTravelIntroBumperLandscape(props: ComponentProps<typeof DefaultTravelIntroBumper>) {
16
+ return <DefaultTravelIntroBumper {...props} />
17
+ },
18
+ )
@@ -0,0 +1,43 @@
1
+ import { DefaultTravelIntroBumperHorizontal } from './default-travel-intro-bumper-Horizontal'
2
+ import { DefaultTravelIntroBumperLandscape } from './default-travel-intro-bumper-Landscape'
3
+
4
+ const posterImageSrc = `data:image/svg+xml;utf8,${encodeURIComponent(`
5
+ <svg xmlns="http://www.w3.org/2000/svg" width="1200" height="900" viewBox="0 0 1200 900">
6
+ <rect width="1200" height="900" fill="#0f172a"/>
7
+ <path d="M0 690 C240 620, 360 760, 600 690 S960 620, 1200 700 L1200 900 L0 900 Z" fill="#38bdf8" fill-opacity="0.24"/>
8
+ <rect x="120" y="180" width="420" height="340" rx="24" fill="#111827" fill-opacity="0.64"/>
9
+ <text x="160" y="250" fill="#e0f2fe" font-size="80" font-family="Arial, sans-serif" letter-spacing="10">JOURNEY</text>
10
+ <text x="160" y="335" fill="#e0f2fe" font-size="38" font-family="Arial, sans-serif" opacity="0.82">road map / city stop / coastline</text>
11
+ </svg>
12
+ `)}`;
13
+
14
+ const args = {
15
+ kicker: 'Travel Journal',
16
+ title: 'Miles to Go',
17
+ subtitle: 'A route-map opener with journey markers, stop cards, and road-trip momentum.',
18
+ creditLine: 'A Vibecuting Original',
19
+ footer: 'Opening Sequence',
20
+ accent: '#0f172a',
21
+ secondaryAccent: '#38bdf8',
22
+ posterImageSrc,
23
+ posterImageAlt: 'Travel journey image',
24
+ }
25
+
26
+ const meta = {
27
+ title: 'core/intro/travel-intro-journey/DefaultTravelIntroBumperLandscape',
28
+ component: DefaultTravelIntroBumperLandscape,
29
+ args,
30
+ }
31
+
32
+ export default meta
33
+
34
+ export const Default = {}
35
+ export const Animated = { parameters: { scenePreviewMode: 'animation' } }
36
+ export const Horizontal = {
37
+ render: (storyArgs: typeof args) => <DefaultTravelIntroBumperHorizontal {...storyArgs} />,
38
+ parameters: { scenePreviewAspectRatio: '9:16' },
39
+ }
40
+ export const HorizontalAnimated = {
41
+ render: (storyArgs: typeof args) => <DefaultTravelIntroBumperHorizontal {...storyArgs} />,
42
+ parameters: { scenePreviewMode: 'animation', scenePreviewAspectRatio: '9:16' },
43
+ }
@@ -0,0 +1,158 @@
1
+ import type { ReactNode } from 'react'
2
+
3
+ import { VideoComponent, defineComponentProjectComponentMetadata } from '@vibecuting/component-project-helper'
4
+
5
+ import { BaseRemotionScene, type BaseRemotionSceneProps, useRemotionSceneRuntime } from '../../../base'
6
+ import { useSceneMotion } from '../../../base'
7
+ import { getIntroBodyMaxWidth, getIntroLineClamp, getIntroPanelMinHeight } from '../_shared/intro-layout'
8
+
9
+ export interface DefaultTravelIntroBumperProps extends BaseRemotionSceneProps {
10
+ title: string
11
+ subtitle?: string
12
+ kicker?: string
13
+ creditLine?: string
14
+ footer?: string
15
+ accent?: string
16
+ secondaryAccent?: string
17
+ textColor?: string
18
+ posterImageSrc?: string
19
+ posterImageAlt?: string
20
+ children?: ReactNode
21
+ }
22
+
23
+ export const componentMetadata = defineComponentProjectComponentMetadata({
24
+ name: 'DefaultTravelIntroBumper',
25
+ description: 'Travel intro with a route-map layout, stops, and journey markers',
26
+ sourceFile: 'src/core/intro/travel-intro-journey/default-travel-intro-bumper.tsx',
27
+ aspectRatio: '16:9',
28
+ sceneType: 'intro',
29
+ tags: ['intro', 'bumper', 'travel', 'journey'],
30
+ propsTypeName: 'DefaultTravelIntroBumperProps',
31
+ })
32
+
33
+ export function DefaultTravelIntroBumper({
34
+ id,
35
+ name,
36
+ title,
37
+ subtitle,
38
+ kicker,
39
+ creditLine,
40
+ footer,
41
+ accent,
42
+ secondaryAccent,
43
+ textColor,
44
+ posterImageSrc,
45
+ posterImageAlt,
46
+ children,
47
+ }: DefaultTravelIntroBumperProps) {
48
+ const runtime = useRemotionSceneRuntime()
49
+ const motion = useSceneMotion()
50
+ const portrait = runtime.height > runtime.width
51
+
52
+ const text = textColor ?? '#f8fafc'
53
+ const bg = accent ?? '#0f172a'
54
+ const path = secondaryAccent ?? '#38bdf8'
55
+
56
+ return (
57
+ <BaseRemotionScene
58
+ id={id}
59
+ name={name}
60
+ style={{
61
+ background: portrait
62
+ ? `linear-gradient(180deg, #020617 0%, ${bg} 34%, #1e293b 100%)`
63
+ : `radial-gradient(circle at 82% 18%, rgba(56,189,248,0.24) 0%, ${bg} 42%, #020617 100%)`,
64
+ color: text,
65
+ display: 'grid',
66
+ placeItems: 'center',
67
+ padding: portrait ? Math.round(runtime.height * 0.06) : Math.round(runtime.height * 0.066),
68
+ }}
69
+ >
70
+ <section
71
+ style={{
72
+ position: 'relative',
73
+ zIndex: 1,
74
+ width: '100%',
75
+ height: '100%',
76
+ display: 'grid',
77
+ gridTemplateColumns: portrait ? '1fr' : 'minmax(0, 0.86fr) minmax(300px, 1.14fr)',
78
+ gap: portrait ? 18 : 24,
79
+ alignItems: 'stretch',
80
+ minWidth: 0,
81
+ minHeight: 0,
82
+ }}
83
+ >
84
+ <div style={{ display: 'grid', gap: portrait ? 14 : 16, minWidth: 0, textAlign: portrait ? 'center' : 'left', alignContent: 'center' }}>
85
+ <p style={{ margin: 0, fontSize: Math.round(runtime.height * 0.017), letterSpacing: '0.38em', textTransform: 'uppercase', opacity: 0.7 }}>
86
+ {kicker ?? 'Road Trip'}
87
+ </p>
88
+ <h1
89
+ style={{
90
+ margin: 0,
91
+ fontSize: portrait ? Math.round(runtime.height * 0.08) : Math.round(runtime.height * 0.072),
92
+ lineHeight: 0.92,
93
+ letterSpacing: '-0.08em',
94
+ textTransform: 'uppercase',
95
+ transform: motion.isAnimation ? `translate3d(0, ${(1 - motion.progress) * 10}px, 0)` : 'none',
96
+ }}
97
+ >
98
+ {title}
99
+ </h1>
100
+ {subtitle ? (
101
+ <p style={{ margin: 0, maxWidth: getIntroBodyMaxWidth(runtime.width, portrait, 0.43, 1, { min: 240, max: 680 }), fontSize: Math.round(runtime.height * 0.023), lineHeight: 1.58, opacity: 0.82, ...getIntroLineClamp(portrait ? 4 : 3) }}>
102
+ {subtitle}
103
+ </p>
104
+ ) : null}
105
+ <div style={{ display: 'flex', flexWrap: 'wrap', justifyContent: portrait ? 'center' : 'flex-start', gap: 10 }}>
106
+ {creditLine ? <span style={{ fontSize: Math.round(runtime.height * 0.015), letterSpacing: '0.22em', textTransform: 'uppercase', opacity: 0.8 }}>{creditLine}</span> : null}
107
+ {footer ? <span style={{ fontSize: Math.round(runtime.height * 0.015), letterSpacing: '0.2em', textTransform: 'uppercase', opacity: 0.54 }}>{footer}</span> : null}
108
+ </div>
109
+ </div>
110
+
111
+ <div style={{ display: 'grid', gap: 12, minWidth: 0, alignContent: 'center' }}>
112
+ <div style={{ border: '1px solid rgba(248,250,252,0.14)', background: 'linear-gradient(180deg, rgba(255,255,255,0.05), rgba(15,23,42,0.24))', padding: portrait ? 18 : 22, display: 'grid', gap: 12, overflow: 'hidden', minHeight: getIntroPanelMinHeight(runtime.height, portrait, 0.28, 0.22, { min: 180, max: 300 }) }}>
113
+ <div style={{ display: 'grid', gridTemplateColumns: portrait ? '1fr' : 'minmax(0, 1.02fr) minmax(220px, 0.78fr)', gap: 10 }}>
114
+ <div style={{ display: 'grid', gap: 10 }}>
115
+ <div style={{ minHeight: portrait ? 140 : 220, border: '1px solid rgba(248,250,252,0.14)', background: 'linear-gradient(135deg, rgba(56,189,248,0.22), rgba(15,23,42,0.12))', padding: 12, display: 'grid', alignContent: 'end', overflow: 'hidden' }}>
116
+ <div style={{ fontSize: Math.round(runtime.height * 0.016), letterSpacing: '0.24em', textTransform: 'uppercase', opacity: 0.72 }}>
117
+ Route Map
118
+ </div>
119
+ <div style={{ marginTop: 6, fontSize: Math.round(runtime.height * 0.02) }}>From coast to coast</div>
120
+ <div style={{ marginTop: 12, height: 2, width: '100%', background: `linear-gradient(90deg, transparent, ${path}, transparent)` }} />
121
+ </div>
122
+ <div style={{ display: 'grid', gridTemplateColumns: 'repeat(3, minmax(0, 1fr))', gap: 10 }}>
123
+ {['City Stop', 'Open Road', 'Hidden Trail'].map((label, index) => (
124
+ <div key={label} style={{ minHeight: portrait ? 60 : 72, border: '1px solid rgba(248,250,252,0.12)', background: index === 1 ? 'rgba(56,189,248,0.14)' : 'rgba(2,6,23,0.22)', display: 'grid', placeItems: 'center', fontSize: Math.round(runtime.height * 0.016), letterSpacing: '0.24em', textTransform: 'uppercase', opacity: 0.72 }}>
125
+ {label}
126
+ </div>
127
+ ))}
128
+ </div>
129
+ </div>
130
+ {posterImageSrc ? (
131
+ <div style={{ minHeight: portrait ? 140 : 260, border: '1px solid rgba(248,250,252,0.14)', background: 'rgba(2,6,23,0.2)', overflow: 'hidden' }}>
132
+ <img
133
+ src={posterImageSrc}
134
+ alt={posterImageAlt ?? title}
135
+ style={{ width: '100%', height: '100%', objectFit: 'cover', display: 'block' }}
136
+ />
137
+ </div>
138
+ ) : null}
139
+ </div>
140
+ <div style={{ display: 'grid', gap: 8, fontSize: Math.round(runtime.height * 0.02) }}>
141
+ <div style={{ display: 'flex', justifyContent: 'space-between', gap: 12 }}>
142
+ <span>Season</span>
143
+ <span>Summer trail</span>
144
+ </div>
145
+ <div style={{ display: 'flex', justifyContent: 'space-between', gap: 12 }}>
146
+ <span>Mode</span>
147
+ <span>Wide open</span>
148
+ </div>
149
+ </div>
150
+ </div>
151
+ {children ? <div>{children}</div> : null}
152
+ </div>
153
+ </section>
154
+ </BaseRemotionScene>
155
+ )
156
+ }
157
+
158
+ VideoComponent(componentMetadata)(DefaultTravelIntroBumper)
@@ -0,0 +1,10 @@
1
+ export { DefaultTravelIntroBumper } from './default-travel-intro-bumper'
2
+ export { componentMetadata } from './default-travel-intro-bumper'
3
+ export {
4
+ DefaultTravelIntroBumperLandscape,
5
+ componentMetadata as DefaultTravelIntroBumperLandscapeMetadata,
6
+ } from './default-travel-intro-bumper-Landscape'
7
+ export {
8
+ DefaultTravelIntroBumperHorizontal,
9
+ componentMetadata as DefaultTravelIntroBumperHorizontalMetadata,
10
+ } from './default-travel-intro-bumper-Horizontal'
@@ -0,0 +1,24 @@
1
+ import type { ComponentProps } from 'react'
2
+
3
+ import { VideoComponent, type ScenePluginMetadata } from '@vibecuting/component-project-helper'
4
+
5
+ import { DefaultWesternIntroBumper, componentMetadata as baseComponentMetadata } from './default-western-intro-bumper'
6
+
7
+ export const componentMetadata: ScenePluginMetadata = {
8
+ ...baseComponentMetadata,
9
+ resourceKind: 'scene',
10
+ pluginKey: 'core.intro.western',
11
+ sceneFamily: 'custom',
12
+ rootLayout: 'absolute-fill',
13
+ name: 'DefaultWesternIntroBumperHorizontal',
14
+ description: 'Western film-style intro bumper (Portrait 9:16 variant)',
15
+ sourceFile: 'src/core/intro/western-intro/default-western-intro-bumper-Horizontal.tsx',
16
+ aspectRatio: '9:16',
17
+ tags: Array.from(new Set([...(baseComponentMetadata.tags ?? []), 'horizontal'])),
18
+ }
19
+
20
+ export const DefaultWesternIntroBumperHorizontal = VideoComponent(componentMetadata)(function DefaultWesternIntroBumperHorizontal(
21
+ props: ComponentProps<typeof DefaultWesternIntroBumper>,
22
+ ) {
23
+ return <DefaultWesternIntroBumper {...props} />
24
+ })
@@ -0,0 +1,24 @@
1
+ import type { ComponentProps } from 'react'
2
+
3
+ import { VideoComponent, type ScenePluginMetadata } from '@vibecuting/component-project-helper'
4
+
5
+ import { DefaultWesternIntroBumper, componentMetadata as baseComponentMetadata } from './default-western-intro-bumper'
6
+
7
+ export const componentMetadata: ScenePluginMetadata = {
8
+ ...baseComponentMetadata,
9
+ resourceKind: 'scene',
10
+ pluginKey: 'core.intro.western',
11
+ sceneFamily: 'custom',
12
+ rootLayout: 'absolute-fill',
13
+ name: 'DefaultWesternIntroBumperLandscape',
14
+ description: 'Western film-style intro bumper (Landscape 16:9 variant)',
15
+ sourceFile: 'src/core/intro/western-intro/default-western-intro-bumper-Landscape.tsx',
16
+ aspectRatio: '16:9',
17
+ tags: Array.from(new Set([...(baseComponentMetadata.tags ?? []), 'landscape'])),
18
+ }
19
+
20
+ export const DefaultWesternIntroBumperLandscape = VideoComponent(componentMetadata)(function DefaultWesternIntroBumperLandscape(
21
+ props: ComponentProps<typeof DefaultWesternIntroBumper>,
22
+ ) {
23
+ return <DefaultWesternIntroBumper {...props} />
24
+ })
@@ -0,0 +1,29 @@
1
+ import { DefaultWesternIntroBumperHorizontal } from './default-western-intro-bumper-Horizontal'
2
+ import { DefaultWesternIntroBumperLandscape } from './default-western-intro-bumper-Landscape'
3
+
4
+ const meta = {
5
+ title: 'core/intro/western-intro/DefaultWesternIntroBumperLandscape',
6
+ component: DefaultWesternIntroBumperLandscape,
7
+ args: {
8
+ kicker: 'Western Opening',
9
+ title: 'The Long Ride',
10
+ subtitle: 'A split wanted-board opener with a saloon placard and frontier dossier energy.',
11
+ creditLine: 'A Vibecuting Western',
12
+ footer: 'Opening Sequence',
13
+ accent: '#d97706',
14
+ secondaryAccent: '#451a03',
15
+ },
16
+ }
17
+
18
+ export default meta
19
+
20
+ export const Default = {}
21
+ export const Animated = { parameters: { scenePreviewMode: 'animation' } }
22
+ export const Horizontal = {
23
+ render: (storyArgs: typeof meta.args) => <DefaultWesternIntroBumperHorizontal {...storyArgs} />,
24
+ parameters: { scenePreviewAspectRatio: '9:16' },
25
+ }
26
+ export const HorizontalAnimated = {
27
+ render: (storyArgs: typeof meta.args) => <DefaultWesternIntroBumperHorizontal {...storyArgs} />,
28
+ parameters: { scenePreviewMode: 'animation', scenePreviewAspectRatio: '9:16' },
29
+ }
@@ -0,0 +1,146 @@
1
+ import type { ReactNode } from 'react'
2
+
3
+ import { VideoComponent, defineComponentProjectComponentMetadata } from '@vibecuting/component-project-helper'
4
+
5
+ import { BaseRemotionScene, type BaseRemotionSceneProps, useRemotionSceneRuntime } from '../../../base'
6
+ import { useSceneMotion } from '../../../base'
7
+ import { getIntroBodyMaxWidth, getIntroLineClamp } from '../_shared/intro-layout'
8
+
9
+ export interface DefaultWesternIntroBumperProps extends BaseRemotionSceneProps {
10
+ title: string
11
+ subtitle?: string
12
+ kicker?: string
13
+ creditLine?: string
14
+ footer?: string
15
+ accent?: string
16
+ secondaryAccent?: string
17
+ textColor?: string
18
+ children?: ReactNode
19
+ }
20
+
21
+ export const componentMetadata = defineComponentProjectComponentMetadata({
22
+ name: 'DefaultWesternIntroBumper',
23
+ description: 'Western intro with a split wanted-board and saloon placard layout',
24
+ sourceFile: 'src/core/intro/western-intro/default-western-intro-bumper.tsx',
25
+ aspectRatio: '16:9',
26
+ sceneType: 'intro',
27
+ tags: ['intro', 'bumper', 'western', 'dust', 'old-west'],
28
+ propsTypeName: 'DefaultWesternIntroBumperProps',
29
+ })
30
+
31
+ export function DefaultWesternIntroBumper({
32
+ id,
33
+ name,
34
+ title,
35
+ subtitle,
36
+ kicker,
37
+ creditLine,
38
+ footer,
39
+ accent,
40
+ secondaryAccent,
41
+ textColor,
42
+ }: DefaultWesternIntroBumperProps) {
43
+ const runtime = useRemotionSceneRuntime()
44
+ const motion = useSceneMotion()
45
+ const portrait = runtime.height > runtime.width
46
+ const titleSize = portrait ? Math.round(runtime.height * 0.074) : Math.round(runtime.height * 0.068)
47
+
48
+ return (
49
+ <BaseRemotionScene
50
+ id={id}
51
+ name={name}
52
+ style={{
53
+ background: portrait
54
+ ? 'linear-gradient(180deg, #3f2a1d 0%, #1f130d 42%, #020617 100%)'
55
+ : `radial-gradient(circle at 50% 25%, ${accent ?? '#d97706'} 0%, ${secondaryAccent ?? '#451a03'} 40%, #020617 100%)`,
56
+ color: textColor ?? '#fff7ed',
57
+ display: 'grid',
58
+ placeItems: 'center',
59
+ padding: Math.round(runtime.height * 0.07),
60
+ }}
61
+ >
62
+ <section
63
+ style={{
64
+ width: '100%',
65
+ height: '100%',
66
+ display: 'grid',
67
+ gridTemplateColumns: portrait ? '1fr' : 'minmax(0, 0.86fr) minmax(300px, 1.14fr)',
68
+ gap: portrait ? 18 : 26,
69
+ alignItems: 'stretch',
70
+ minWidth: 0,
71
+ minHeight: 0,
72
+ }}
73
+ >
74
+ <div style={{ display: 'grid', gap: 12, alignContent: 'center', textAlign: portrait ? 'center' : 'left', minWidth: 0 }}>
75
+ <p style={{ margin: 0, fontSize: Math.round(runtime.height * 0.017), letterSpacing: '0.3em', textTransform: 'uppercase', opacity: 0.66 }}>
76
+ {kicker ?? 'Western Opening'}
77
+ </p>
78
+ <h1 style={{ margin: 0, fontSize: titleSize, lineHeight: 0.9, letterSpacing: '-0.08em', textTransform: 'uppercase', transform: motion.isAnimation ? `translate3d(0, ${(1 - motion.progress) * 9}px, 0)` : 'none' }}>
79
+ {title}
80
+ </h1>
81
+ {subtitle ? <p style={{ margin: 0, maxWidth: getIntroBodyMaxWidth(runtime.width, portrait, 0.38, 1, { min: 240, max: 680 }), fontSize: Math.round(runtime.height * 0.023), lineHeight: 1.55, opacity: 0.82, ...getIntroLineClamp(portrait ? 4 : 3) }}>{subtitle}</p> : null}
82
+ <div style={{ display: 'grid', gridTemplateColumns: portrait ? '1fr' : 'repeat(2, minmax(0, 1fr))', gap: 10, marginTop: 6 }}>
83
+ <div style={{ border: '1px solid rgba(255,247,237,0.12)', padding: '12px 14px', background: 'rgba(0,0,0,0.14)', textTransform: 'uppercase', letterSpacing: '0.18em', fontSize: Math.round(runtime.height * 0.014), opacity: 0.74 }}>
84
+ {creditLine ?? 'Marshal Office'}
85
+ </div>
86
+ <div style={{ border: '1px solid rgba(255,247,237,0.12)', padding: '12px 14px', background: 'rgba(0,0,0,0.14)', textTransform: 'uppercase', letterSpacing: '0.18em', fontSize: Math.round(runtime.height * 0.014), opacity: 0.54 }}>
87
+ {footer ?? 'Opening Sequence'}
88
+ </div>
89
+ </div>
90
+ </div>
91
+
92
+ <div
93
+ style={{
94
+ border: '1px solid rgba(255,247,237,0.14)',
95
+ background: 'linear-gradient(180deg, rgba(255,247,237,0.05), rgba(15,23,42,0.22))',
96
+ display: 'grid',
97
+ gridTemplateColumns: portrait ? '1fr' : 'minmax(0, 1fr) minmax(170px, 0.56fr)',
98
+ gap: 12,
99
+ padding: 16,
100
+ minWidth: 0,
101
+ minHeight: 0,
102
+ overflow: 'hidden',
103
+ }}
104
+ >
105
+ <div style={{ display: 'grid', alignContent: 'center', gap: 10, position: 'relative', overflow: 'hidden' }}>
106
+ <div style={{ position: 'absolute', inset: 0, opacity: 0.45, background: 'repeating-linear-gradient(180deg, rgba(255,247,237,0.05) 0, rgba(255,247,237,0.05) 1px, transparent 1px, transparent 18px)' }} />
107
+ <div style={{ position: 'relative', zIndex: 1, display: 'grid', gap: 10 }}>
108
+ <div style={{ fontSize: Math.round(runtime.height * 0.017), letterSpacing: '0.24em', textTransform: 'uppercase', opacity: 0.56 }}>Dust Trail</div>
109
+ <div style={{ fontSize: Math.round(runtime.height * 0.03), fontWeight: 800, letterSpacing: '-0.06em' }}>Ride into frame</div>
110
+ <div style={{ display: 'grid', gap: 8, gridTemplateColumns: portrait ? '1fr' : '1fr' }}>
111
+ {['Wanted', 'Outlaw', 'High Noon'].map((label, index) => (
112
+ <div
113
+ key={label}
114
+ style={{
115
+ border: '1px solid rgba(255,247,237,0.1)',
116
+ padding: '10px 12px',
117
+ background: index === 1 ? 'rgba(217,119,6,0.14)' : 'rgba(0,0,0,0.16)',
118
+ textTransform: 'uppercase',
119
+ letterSpacing: '0.2em',
120
+ fontSize: Math.round(runtime.height * 0.014),
121
+ opacity: 0.82,
122
+ transform: motion.isAnimation ? `translate3d(0, ${(1 - motion.progress) * (index + 1) * 3}px, 0)` : 'none',
123
+ }}
124
+ >
125
+ {label}
126
+ </div>
127
+ ))}
128
+ </div>
129
+ </div>
130
+ </div>
131
+ <div style={{ display: 'grid', gap: 10, alignContent: 'center', minWidth: 0 }}>
132
+ <div style={{ border: '1px solid rgba(255,247,237,0.12)', background: 'rgba(0,0,0,0.18)', padding: 14, textTransform: 'uppercase', letterSpacing: '0.18em', fontSize: Math.round(runtime.height * 0.014), opacity: 0.72 }}>
133
+ Saloon Placard
134
+ </div>
135
+ <div style={{ border: '1px solid rgba(255,247,237,0.12)', background: 'rgba(0,0,0,0.18)', padding: 14, display: 'grid', gap: 8 }}>
136
+ <span style={{ fontSize: Math.round(runtime.height * 0.014), letterSpacing: '0.22em', textTransform: 'uppercase', opacity: 0.56 }}>Trail Marker</span>
137
+ <span style={{ fontSize: Math.round(runtime.height * 0.022), fontWeight: 700 }}>Ride into the sunset</span>
138
+ </div>
139
+ </div>
140
+ </div>
141
+ </section>
142
+ </BaseRemotionScene>
143
+ )
144
+ }
145
+
146
+ VideoComponent(componentMetadata)(DefaultWesternIntroBumper)
@@ -0,0 +1,4 @@
1
+ export { DefaultWesternIntroBumper } from './default-western-intro-bumper'
2
+ export { componentMetadata } from './default-western-intro-bumper'
3
+ export { DefaultWesternIntroBumperLandscape, componentMetadata as DefaultWesternIntroBumperLandscapeMetadata } from './default-western-intro-bumper-Landscape'
4
+ export { DefaultWesternIntroBumperHorizontal, componentMetadata as DefaultWesternIntroBumperHorizontalMetadata } from './default-western-intro-bumper-Horizontal'
@@ -0,0 +1,25 @@
1
+ import type { ComponentProps } from 'react'
2
+
3
+ import { VideoComponent, type ScenePluginMetadata } from '@vibecuting/component-project-helper'
4
+
5
+ import { DefaultWesternIntroBumperGangster, componentMetadata as baseComponentMetadata } from './default-western-intro-bumper'
6
+
7
+ export const componentMetadata: ScenePluginMetadata = {
8
+ ...baseComponentMetadata,
9
+ resourceKind: 'scene',
10
+ pluginKey: 'core.intro.western-gangster',
11
+ sceneFamily: 'custom',
12
+ rootLayout: 'absolute-fill',
13
+ name: 'DefaultWesternIntroBumperGangsterHorizontal',
14
+ description: 'Western gangster intro bumper (Portrait 9:16 variant)',
15
+ sourceFile: 'src/core/intro/western-intro-gangster/default-western-intro-bumper-Horizontal.tsx',
16
+ aspectRatio: '9:16',
17
+ tags: Array.from(new Set([...(baseComponentMetadata.tags ?? []), 'horizontal'])),
18
+ }
19
+
20
+ export const DefaultWesternIntroBumperGangsterHorizontal = VideoComponent(componentMetadata)(function DefaultWesternIntroBumperGangsterHorizontal(
21
+ props: ComponentProps<typeof DefaultWesternIntroBumperGangster>,
22
+ ) {
23
+ return <DefaultWesternIntroBumperGangster {...props} />
24
+ })
25
+
@@ -0,0 +1,25 @@
1
+ import type { ComponentProps } from 'react'
2
+
3
+ import { VideoComponent, type ScenePluginMetadata } from '@vibecuting/component-project-helper'
4
+
5
+ import { DefaultWesternIntroBumperGangster, componentMetadata as baseComponentMetadata } from './default-western-intro-bumper'
6
+
7
+ export const componentMetadata: ScenePluginMetadata = {
8
+ ...baseComponentMetadata,
9
+ resourceKind: 'scene',
10
+ pluginKey: 'core.intro.western-gangster',
11
+ sceneFamily: 'custom',
12
+ rootLayout: 'absolute-fill',
13
+ name: 'DefaultWesternIntroBumperGangsterLandscape',
14
+ description: 'Western gangster intro bumper (Landscape 16:9 variant)',
15
+ sourceFile: 'src/core/intro/western-intro-gangster/default-western-intro-bumper-Landscape.tsx',
16
+ aspectRatio: '16:9',
17
+ tags: Array.from(new Set([...(baseComponentMetadata.tags ?? []), 'landscape'])),
18
+ }
19
+
20
+ export const DefaultWesternIntroBumperGangsterLandscape = VideoComponent(componentMetadata)(function DefaultWesternIntroBumperGangsterLandscape(
21
+ props: ComponentProps<typeof DefaultWesternIntroBumperGangster>,
22
+ ) {
23
+ return <DefaultWesternIntroBumperGangster {...props} />
24
+ })
25
+