@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,365 @@
1
+ import type { ReactNode } from 'react'
2
+
3
+ import { z } from 'zod'
4
+
5
+ import { VideoComponent, defineScenePluginMetadata } from '@vibecuting/component-project-helper'
6
+
7
+ import { defineSceneComponent } from '../../../../plugins/scene-component'
8
+ import { SceneMotionLayer, useRemotionSceneRuntime } from '../../../../base'
9
+ import type { DefaultSceneProps } from '../../../../scenes/default-scene-props'
10
+ import { SlideFrame, getSlideTypographyScale } from '../_shared'
11
+
12
+ export interface DefaultVideoShowcaseSlideProps extends DefaultSceneProps {
13
+ title: string
14
+ subtitle?: string
15
+ chapter?: string
16
+ runtimeLabel?: string
17
+ posterLabel?: string
18
+ posterCaption?: string
19
+ notes?: string[]
20
+ poster?: ReactNode
21
+ }
22
+
23
+ function VideoPoster({
24
+ poster,
25
+ posterLabel,
26
+ posterCaption,
27
+ runtimeLabel,
28
+ chapter,
29
+ isPortrait,
30
+ scale,
31
+ }: {
32
+ poster?: ReactNode
33
+ posterLabel?: string
34
+ posterCaption?: string
35
+ runtimeLabel?: string
36
+ chapter?: string
37
+ isPortrait: boolean
38
+ scale: ReturnType<typeof getSlideTypographyScale>
39
+ }) {
40
+ return (
41
+ <div
42
+ style={{
43
+ position: 'relative',
44
+ display: 'grid',
45
+ placeItems: 'center',
46
+ width: '100%',
47
+ minHeight: isPortrait ? 320 : 420,
48
+ aspectRatio: isPortrait ? '4 / 5' : '16 / 9',
49
+ overflow: 'hidden',
50
+ borderRadius: 0,
51
+ border: '1px solid rgba(148, 163, 184, 0.22)',
52
+ background: 'linear-gradient(135deg, rgba(15,23,42,0.96) 0%, rgba(30,41,59,0.94) 42%, rgba(37,99,235,0.7) 100%)',
53
+ boxShadow: '0 24px 60px rgba(15,23,42,0.22)',
54
+ }}
55
+ >
56
+ <div
57
+ style={{
58
+ position: 'absolute',
59
+ inset: 0,
60
+ background:
61
+ 'radial-gradient(circle at 28% 20%, rgba(96,165,250,0.32), transparent 28%), radial-gradient(circle at 82% 26%, rgba(56,189,248,0.18), transparent 26%), linear-gradient(180deg, rgba(2,6,23,0.12) 0%, rgba(2,6,23,0.7) 100%)',
62
+ }}
63
+ />
64
+ <div
65
+ style={{
66
+ position: 'absolute',
67
+ inset: 16,
68
+ border: '1px solid rgba(255,255,255,0.12)',
69
+ pointerEvents: 'none',
70
+ }}
71
+ />
72
+ <div style={{ position: 'relative', zIndex: 1, width: '100%', height: '100%', padding: isPortrait ? 18 : 22, display: 'grid', gridTemplateRows: 'auto 1fr auto', gap: 16 }}>
73
+ <div style={{ display: 'flex', alignItems: 'center', justifyContent: 'space-between', gap: 12 }}>
74
+ <div
75
+ style={{
76
+ display: 'inline-flex',
77
+ alignItems: 'center',
78
+ gap: 10,
79
+ padding: '8px 12px',
80
+ borderRadius: 0,
81
+ border: '1px solid rgba(255,255,255,0.16)',
82
+ background: 'rgba(15,23,42,0.46)',
83
+ color: '#f8fafc',
84
+ fontSize: scale.caption,
85
+ letterSpacing: '0.16em',
86
+ textTransform: 'uppercase',
87
+ }}
88
+ >
89
+ <span style={{ width: 8, height: 8, background: '#38bdf8', display: 'inline-block' }} />
90
+ {posterLabel ?? 'Poster'}
91
+ </div>
92
+ {runtimeLabel ? (
93
+ <div
94
+ style={{
95
+ display: 'inline-flex',
96
+ alignItems: 'center',
97
+ padding: '8px 12px',
98
+ borderRadius: 0,
99
+ border: '1px solid rgba(255,255,255,0.16)',
100
+ background: 'rgba(2,6,23,0.5)',
101
+ color: '#e2e8f0',
102
+ fontSize: scale.caption,
103
+ fontWeight: 600,
104
+ }}
105
+ >
106
+ {runtimeLabel}
107
+ </div>
108
+ ) : null}
109
+ </div>
110
+
111
+ <div style={{ display: 'grid', placeItems: 'center', minHeight: 0 }}>
112
+ {poster ?? (
113
+ <div style={{ display: 'grid', placeItems: 'center', gap: 14, textAlign: 'center', color: '#e2e8f0' }}>
114
+ <div
115
+ style={{
116
+ width: isPortrait ? 84 : 96,
117
+ height: isPortrait ? 84 : 96,
118
+ display: 'grid',
119
+ placeItems: 'center',
120
+ borderRadius: '999px',
121
+ background: 'rgba(15,23,42,0.64)',
122
+ border: '1px solid rgba(255,255,255,0.18)',
123
+ boxShadow: '0 12px 32px rgba(15,23,42,0.28)',
124
+ fontSize: isPortrait ? 28 : 30,
125
+ }}
126
+ >
127
+
128
+ </div>
129
+ <div>
130
+ <div style={{ fontSize: isPortrait ? scale.body * 0.98 : scale.body, fontWeight: 700, letterSpacing: '-0.02em' }}>{posterLabel ?? 'Video poster'}</div>
131
+ <div style={{ marginTop: 8, fontSize: scale.caption, letterSpacing: '0.14em', textTransform: 'uppercase', opacity: 0.68 }}>{posterCaption ?? 'Use a frame grab, teaser art, or cover still.'}</div>
132
+ </div>
133
+ </div>
134
+ )}
135
+ </div>
136
+
137
+ <div style={{ display: 'flex', alignItems: 'end', justifyContent: 'space-between', gap: 16, color: '#e2e8f0' }}>
138
+ <div style={{ maxWidth: '72%' }}>
139
+ <div style={{ fontSize: scale.caption, letterSpacing: '0.2em', textTransform: 'uppercase', opacity: 0.72 }}>{chapter ?? 'Video showcase'}</div>
140
+ <div style={{ marginTop: 8, fontSize: isPortrait ? scale.body * 0.92 : scale.body, lineHeight: 1.35, opacity: 0.86 }}>{posterCaption ?? 'Poster-led composition for clips, trailers, and edit reviews.'}</div>
141
+ </div>
142
+ <div style={{ fontSize: scale.caption, letterSpacing: '0.18em', textTransform: 'uppercase', opacity: 0.58 }}>Video</div>
143
+ </div>
144
+ </div>
145
+ </div>
146
+ )
147
+ }
148
+
149
+ function VideoNotes({
150
+ notes,
151
+ isPortrait,
152
+ scale,
153
+ }: {
154
+ notes?: string[]
155
+ isPortrait: boolean
156
+ scale: ReturnType<typeof getSlideTypographyScale>
157
+ }) {
158
+ const list = (notes ?? []).filter(Boolean).slice(0, 5)
159
+
160
+ return (
161
+ <div
162
+ style={{
163
+ display: 'grid',
164
+ gap: isPortrait ? 10 : 12,
165
+ gridTemplateColumns: isPortrait ? '1fr' : 'repeat(2, minmax(0, 1fr))',
166
+ }}
167
+ >
168
+ {list.length > 0 ? (
169
+ list.map((note, index) => (
170
+ <article
171
+ key={`${index}-${note}`}
172
+ style={{
173
+ padding: isPortrait ? '14px 14px 15px' : '15px 16px 16px',
174
+ borderRadius: 0,
175
+ border: '1px solid rgba(148,163,184,0.18)',
176
+ background: 'rgba(15,23,42,0.3)',
177
+ color: '#e2e8f0',
178
+ minHeight: isPortrait ? 0 : 96,
179
+ }}
180
+ >
181
+ <div style={{ fontSize: scale.caption, letterSpacing: '0.24em', textTransform: 'uppercase', opacity: 0.58 }}>
182
+ Note {String(index + 1).padStart(2, '0')}
183
+ </div>
184
+ <p style={{ margin: '10px 0 0', fontSize: isPortrait ? scale.body * 0.88 : scale.body * 0.92, lineHeight: 1.45, opacity: 0.94 }}>{note}</p>
185
+ </article>
186
+ ))
187
+ ) : (
188
+ <article
189
+ style={{
190
+ padding: isPortrait ? '14px 14px 15px' : '15px 16px 16px',
191
+ borderRadius: 0,
192
+ border: '1px dashed rgba(148,163,184,0.22)',
193
+ background: 'rgba(15,23,42,0.18)',
194
+ color: '#cbd5e1',
195
+ }}
196
+ >
197
+ <div style={{ fontSize: scale.caption, letterSpacing: '0.24em', textTransform: 'uppercase', opacity: 0.58 }}>Supporting notes</div>
198
+ <p style={{ margin: '10px 0 0', fontSize: isPortrait ? scale.body * 0.88 : scale.body * 0.92, lineHeight: 1.45, opacity: 0.86 }}>
199
+ Add edit notes, chapter cues, or production reminders.
200
+ </p>
201
+ </article>
202
+ )}
203
+ </div>
204
+ )
205
+ }
206
+
207
+ export const componentMetadata = defineScenePluginMetadata({
208
+ resourceKind: 'scene',
209
+ name: 'DefaultVideoShowcaseSlide',
210
+ description: 'Video showcase slide',
211
+ sourceFile: 'src/core/scene/slide/video-showcase/default-video-showcase-slide.tsx',
212
+ pluginKey: 'core.slide.video-showcase',
213
+ tags: ['scene', 'slide', 'video', 'showcase'],
214
+ aspectRatio: '16:9',
215
+ sceneType: 'scene',
216
+ sceneFamily: 'slide',
217
+ rootLayout: 'absolute-fill',
218
+ propsTypeName: 'DefaultVideoShowcaseSlideProps',
219
+ })
220
+
221
+ export const DefaultVideoShowcaseSlide = VideoComponent(componentMetadata)(
222
+ defineSceneComponent({
223
+ family: 'slide',
224
+ propsSchema: z.object({
225
+ sceneId: z.string().optional(),
226
+ sceneName: z.string().optional(),
227
+ title: z.string().min(1),
228
+ subtitle: z.string().optional(),
229
+ chapter: z.string().optional(),
230
+ runtimeLabel: z.string().optional(),
231
+ posterLabel: z.string().optional(),
232
+ posterCaption: z.string().optional(),
233
+ notes: z.array(z.string().min(1)).max(5).optional(),
234
+ poster: z.any().optional(),
235
+ }),
236
+ component: function DefaultVideoShowcaseSlide({
237
+ sceneId,
238
+ sceneName,
239
+ title,
240
+ subtitle,
241
+ chapter,
242
+ runtimeLabel,
243
+ posterLabel,
244
+ posterCaption,
245
+ notes,
246
+ poster,
247
+ }: DefaultVideoShowcaseSlideProps) {
248
+ const runtime = useRemotionSceneRuntime()
249
+ const isPortrait = runtime.height > runtime.width
250
+ const scale = getSlideTypographyScale(runtime.height)
251
+
252
+ return (
253
+ <SlideFrame
254
+ pluginKey={componentMetadata.pluginKey}
255
+ sceneId={sceneId}
256
+ sceneName={sceneName ?? title}
257
+ background="linear-gradient(135deg, #020617 0%, #0f172a 58%, #1d4ed8 100%)"
258
+ >
259
+ <section
260
+ style={{
261
+ width: '100%',
262
+ height: '100%',
263
+ display: 'grid',
264
+ gridTemplateColumns: isPortrait ? '1fr' : '1.08fr 0.92fr',
265
+ gap: isPortrait ? 20 : 28,
266
+ padding: isPortrait ? '40px 28px 42px' : '64px 76px',
267
+ color: '#e2e8f0',
268
+ alignItems: 'stretch',
269
+ }}
270
+ >
271
+ <SceneMotionLayer variant="panel">
272
+ <VideoPoster
273
+ poster={poster}
274
+ posterLabel={posterLabel}
275
+ posterCaption={posterCaption}
276
+ runtimeLabel={runtimeLabel}
277
+ chapter={chapter}
278
+ isPortrait={isPortrait}
279
+ scale={scale}
280
+ />
281
+ </SceneMotionLayer>
282
+
283
+ <div style={{ display: 'grid', alignContent: 'start', gap: isPortrait ? 16 : 18, minWidth: 0 }}>
284
+ <SceneMotionLayer variant="hero-copy">
285
+ <div
286
+ style={{
287
+ display: 'inline-flex',
288
+ alignItems: 'center',
289
+ gap: 10,
290
+ padding: '8px 12px',
291
+ borderRadius: 0,
292
+ border: '1px solid rgba(148,163,184,0.2)',
293
+ background: 'rgba(15,23,42,0.42)',
294
+ color: '#e2e8f0',
295
+ fontSize: scale.caption,
296
+ letterSpacing: '0.18em',
297
+ textTransform: 'uppercase',
298
+ width: 'fit-content',
299
+ }}
300
+ >
301
+ <span style={{ width: 8, height: 8, background: '#38bdf8', display: 'inline-block' }} />
302
+ {chapter ?? 'Video showcase'}
303
+ </div>
304
+ </SceneMotionLayer>
305
+
306
+ <SceneMotionLayer variant="hero-title" delayIndex={1}>
307
+ <h1
308
+ style={{
309
+ margin: 0,
310
+ maxWidth: isPortrait ? 620 : 700,
311
+ fontSize: isPortrait ? scale.title * 0.78 : scale.title,
312
+ lineHeight: 0.94,
313
+ letterSpacing: '-0.06em',
314
+ }}
315
+ >
316
+ {title}
317
+ </h1>
318
+ </SceneMotionLayer>
319
+
320
+ {subtitle ? (
321
+ <SceneMotionLayer variant="hero-copy" delayIndex={2}>
322
+ <p
323
+ style={{
324
+ margin: 0,
325
+ maxWidth: isPortrait ? 620 : 620,
326
+ fontSize: isPortrait ? scale.body * 0.92 : scale.body,
327
+ lineHeight: 1.52,
328
+ opacity: 0.82,
329
+ }}
330
+ >
331
+ {subtitle}
332
+ </p>
333
+ </SceneMotionLayer>
334
+ ) : null}
335
+
336
+ <SceneMotionLayer variant="panel" delayIndex={3}>
337
+ <div
338
+ style={{
339
+ display: 'grid',
340
+ gridTemplateColumns: 'repeat(2, minmax(0, 1fr))',
341
+ gap: 12,
342
+ maxWidth: isPortrait ? 620 : 540,
343
+ }}
344
+ >
345
+ <article style={{ padding: '14px 16px', borderRadius: 0, border: '1px solid rgba(148,163,184,0.18)', background: 'rgba(15,23,42,0.22)' }}>
346
+ <div style={{ fontSize: scale.caption, letterSpacing: '0.24em', textTransform: 'uppercase', opacity: 0.58 }}>Chapter</div>
347
+ <div style={{ marginTop: 8, fontSize: isPortrait ? scale.body * 0.9 : scale.body, lineHeight: 1.35, fontWeight: 700 }}>{chapter ?? 'Opening sequence'}</div>
348
+ </article>
349
+ <article style={{ padding: '14px 16px', borderRadius: 0, border: '1px solid rgba(148,163,184,0.18)', background: 'rgba(15,23,42,0.22)' }}>
350
+ <div style={{ fontSize: scale.caption, letterSpacing: '0.24em', textTransform: 'uppercase', opacity: 0.58 }}>Runtime</div>
351
+ <div style={{ marginTop: 8, fontSize: isPortrait ? scale.body * 0.9 : scale.body, lineHeight: 1.35, fontWeight: 700 }}>{runtimeLabel ?? '02:34'}</div>
352
+ </article>
353
+ </div>
354
+ </SceneMotionLayer>
355
+
356
+ <SceneMotionLayer variant="panel" delayIndex={4}>
357
+ <VideoNotes notes={notes} isPortrait={isPortrait} scale={scale} />
358
+ </SceneMotionLayer>
359
+ </div>
360
+ </section>
361
+ </SlideFrame>
362
+ )
363
+ },
364
+ }),
365
+ )
@@ -0,0 +1,5 @@
1
+ export { DefaultVideoShowcaseSlide } from './default-video-showcase-slide'
2
+ export { componentMetadata } from './default-video-showcase-slide'
3
+ export { DefaultVideoShowcaseSlideLandscape, componentMetadata as DefaultVideoShowcaseSlideLandscapeMetadata } from './default-video-showcase-slide-Landscape'
4
+ export { DefaultVideoShowcaseSlideHorizontal, componentMetadata as DefaultVideoShowcaseSlideHorizontalMetadata } from './default-video-showcase-slide-Horizontal'
5
+ export { DefaultVideoShowcaseMultiSlide, componentMetadata as DefaultVideoShowcaseMultiSlideMetadata } from './default-video-showcase-multi-slide'
@@ -0,0 +1,26 @@
1
+ import { DefaultVideoSceneHorizontal } from './default-video-scene-Horizontal'
2
+
3
+ const photoUrl = 'https://heyaai-statics-1342239856.cos.ap-guangzhou.myqcloud.com/tmp/premium_photo-1779404552087-0f905162376f-121.jpeg'
4
+ const frame = <img src={photoUrl} alt="Video preview" />
5
+
6
+ const meta = {
7
+ title: 'core/scene/video/DefaultVideoSceneHorizontal',
8
+ component: DefaultVideoSceneHorizontal,
9
+ args: {
10
+ title: 'Launch Cut',
11
+ subtitle: 'A portrait video preview with full-bleed media and editorial framing.',
12
+ badge: 'Video',
13
+ runtimeLabel: '03:18',
14
+ },
15
+ }
16
+
17
+ export default meta
18
+
19
+ export const Default = {
20
+ render: (storyArgs: (typeof meta)['args']) => <DefaultVideoSceneHorizontal {...storyArgs} video={frame} poster={frame} />,
21
+ parameters: { scenePreviewAspectRatio: '9:16' },
22
+ }
23
+ export const Animated = {
24
+ render: (storyArgs: (typeof meta)['args']) => <DefaultVideoSceneHorizontal {...storyArgs} video={frame} poster={frame} />,
25
+ parameters: { scenePreviewAspectRatio: '9:16', scenePreviewMode: 'animation' },
26
+ }
@@ -0,0 +1,20 @@
1
+ import type { ComponentProps } from 'react'
2
+
3
+ import { VideoComponent, type ScenePluginMetadata } from '@vibecuting/component-project-helper'
4
+
5
+ import { DefaultVideoScene, componentMetadata as baseComponentMetadata } from './default-video-scene'
6
+
7
+ export const componentMetadata: ScenePluginMetadata = {
8
+ ...baseComponentMetadata,
9
+ name: 'DefaultVideoSceneHorizontal',
10
+ description: 'Video preview scene (Portrait 9:16 variant)',
11
+ sourceFile: 'src/core/scene/video/default-video-scene-Horizontal.tsx',
12
+ aspectRatio: '9:16',
13
+ tags: Array.from(new Set([...(baseComponentMetadata.tags ?? []), 'horizontal'])),
14
+ }
15
+
16
+ export const DefaultVideoSceneHorizontal = VideoComponent(componentMetadata)(function DefaultVideoSceneHorizontal(
17
+ props: ComponentProps<typeof DefaultVideoScene>,
18
+ ) {
19
+ return <DefaultVideoScene {...props} />
20
+ })
@@ -0,0 +1,20 @@
1
+ import type { ComponentProps } from 'react'
2
+
3
+ import { VideoComponent, type ScenePluginMetadata } from '@vibecuting/component-project-helper'
4
+
5
+ import { DefaultVideoScene, componentMetadata as baseComponentMetadata } from './default-video-scene'
6
+
7
+ export const componentMetadata: ScenePluginMetadata = {
8
+ ...baseComponentMetadata,
9
+ name: 'DefaultVideoSceneLandscape',
10
+ description: 'Video preview scene (Landscape 16:9 variant)',
11
+ sourceFile: 'src/core/scene/video/default-video-scene-Landscape.tsx',
12
+ aspectRatio: '16:9',
13
+ tags: Array.from(new Set([...(baseComponentMetadata.tags ?? []), 'landscape'])),
14
+ }
15
+
16
+ export const DefaultVideoSceneLandscape = VideoComponent(componentMetadata)(function DefaultVideoSceneLandscape(
17
+ props: ComponentProps<typeof DefaultVideoScene>,
18
+ ) {
19
+ return <DefaultVideoScene {...props} />
20
+ })
@@ -0,0 +1,26 @@
1
+ import { DefaultVideoSceneLandscape } from './default-video-scene-Landscape'
2
+
3
+ const photoUrl = 'https://heyaai-statics-1342239856.cos.ap-guangzhou.myqcloud.com/tmp/premium_photo-1779404552087-0f905162376f-121.jpeg'
4
+ const frame = <img src={photoUrl} alt="Video preview" />
5
+
6
+ const meta = {
7
+ title: 'core/scene/video/DefaultVideoSceneLandscape',
8
+ component: DefaultVideoSceneLandscape,
9
+ args: {
10
+ title: 'Launch Cut',
11
+ subtitle: 'A single video preview with Apple-style framing and a soft editorial overlay.',
12
+ badge: 'Video',
13
+ runtimeLabel: '03:18',
14
+ },
15
+ }
16
+
17
+ export default meta
18
+
19
+ export const Default = {
20
+ render: (storyArgs: (typeof meta)['args']) => <DefaultVideoSceneLandscape {...storyArgs} video={frame} poster={frame} />,
21
+ parameters: { scenePreviewAspectRatio: '16:9' },
22
+ }
23
+ export const Animated = {
24
+ render: (storyArgs: (typeof meta)['args']) => <DefaultVideoSceneLandscape {...storyArgs} video={frame} poster={frame} />,
25
+ parameters: { scenePreviewAspectRatio: '16:9', scenePreviewMode: 'animation' },
26
+ }