@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,87 @@
1
+ import { DefaultPhotoAlbumSlideLandscape } from './default-photo-album-slide-Landscape'
2
+ import { DefaultPhotoAlbumMultiSlide } from './default-photo-album-multi-slide'
3
+ import { DefaultPhotoAlbumPairSlide } from './default-photo-album-pair-slide'
4
+ import { DefaultPhotoAlbumSingleSlide } from './default-photo-album-single-slide'
5
+
6
+ const meta = {
7
+ title: 'core/scene/slide/photo-album/DefaultPhotoAlbumSlideLandscape',
8
+ component: DefaultPhotoAlbumSlideLandscape,
9
+ args: {
10
+ title: 'Weekend in Kyoto',
11
+ subtitle: 'A quiet album layout for travel recaps, family memories, and event highlights.',
12
+ photos: [
13
+ { title: 'Arrival', caption: 'Old streets, early light', meta: 'Day 1' },
14
+ { title: 'Market stop', caption: 'Local snacks and handmade ceramics', meta: 'Nishiki' },
15
+ { title: 'Temple walk', caption: 'Soft weather, slower pace', meta: 'Afternoon' },
16
+ { title: 'Dinner table', caption: 'Shared plates and warm conversation', meta: 'Evening' },
17
+ { title: 'Night city', caption: 'Neon reflections after sunset', meta: 'Day 2' },
18
+ ],
19
+ },
20
+ }
21
+
22
+ export default meta
23
+
24
+ export const Default = {
25
+ parameters: {
26
+ scenePreviewAspectRatio: '16:9',
27
+ },
28
+ }
29
+
30
+ export const Single = {
31
+ render: (storyArgs: typeof meta.args) => <DefaultPhotoAlbumSingleSlide {...storyArgs} />,
32
+ args: {
33
+ title: 'One Frame, One Memory',
34
+ subtitle: 'Single-image hero composition for a highlight shot.',
35
+ photos: [{ title: 'Cover shot', caption: 'A single strong image', meta: 'Hero photo' }],
36
+ },
37
+ parameters: {
38
+ scenePreviewAspectRatio: '16:9',
39
+ },
40
+ }
41
+
42
+ export const Pair = {
43
+ render: (storyArgs: typeof meta.args) => <DefaultPhotoAlbumPairSlide {...storyArgs} />,
44
+ args: {
45
+ title: 'Before and After',
46
+ subtitle: 'Two-up image composition for side-by-side comparison.',
47
+ photos: [
48
+ { title: 'Before', caption: 'Original capture', meta: 'Shot 1' },
49
+ { title: 'After', caption: 'Edited result', meta: 'Shot 2' },
50
+ ],
51
+ },
52
+ parameters: {
53
+ scenePreviewAspectRatio: '16:9',
54
+ },
55
+ }
56
+
57
+ export const Multi = {
58
+ render: (storyArgs: typeof meta.args) => <DefaultPhotoAlbumMultiSlide {...storyArgs} />,
59
+ args: meta.args,
60
+ parameters: {
61
+ scenePreviewAspectRatio: '16:9',
62
+ },
63
+ }
64
+
65
+ export const SinglePortrait = {
66
+ render: (storyArgs: typeof meta.args) => <DefaultPhotoAlbumSingleSlide {...storyArgs} />,
67
+ args: Single.args,
68
+ parameters: {
69
+ scenePreviewAspectRatio: '9:16',
70
+ },
71
+ }
72
+
73
+ export const PairPortrait = {
74
+ render: (storyArgs: typeof meta.args) => <DefaultPhotoAlbumPairSlide {...storyArgs} />,
75
+ args: Pair.args,
76
+ parameters: {
77
+ scenePreviewAspectRatio: '9:16',
78
+ },
79
+ }
80
+
81
+ export const MultiPortrait = {
82
+ render: (storyArgs: typeof meta.args) => <DefaultPhotoAlbumMultiSlide {...storyArgs} />,
83
+ args: Multi.args,
84
+ parameters: {
85
+ scenePreviewAspectRatio: '9:16',
86
+ },
87
+ }
@@ -0,0 +1,414 @@
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 { SceneMotionLayer, useRemotionSceneRuntime } from '../../../../base'
8
+ import { defineSceneComponent } from '../../../../plugins/scene-component'
9
+ import type { DefaultSceneProps } from '../../../../scenes/default-scene-props'
10
+ import { SlideFrame, getSlideTypographyScale } from '../_shared'
11
+
12
+ export interface DefaultPhotoAlbumSlidePhoto {
13
+ title: string
14
+ caption?: string
15
+ meta?: string
16
+ accent?: string
17
+ image?: ReactNode
18
+ }
19
+
20
+ export interface DefaultPhotoAlbumSlideProps extends DefaultSceneProps {
21
+ title: string
22
+ subtitle?: string
23
+ photos: DefaultPhotoAlbumSlidePhoto[]
24
+ }
25
+
26
+ const photoPalette = [
27
+ ['rgba(96,165,250,0.42)', 'rgba(15,23,42,0.82)'],
28
+ ['rgba(244,114,182,0.42)', 'rgba(15,23,42,0.82)'],
29
+ ['rgba(52,211,153,0.40)', 'rgba(15,23,42,0.82)'],
30
+ ['rgba(251,191,36,0.38)', 'rgba(15,23,42,0.82)'],
31
+ ['rgba(167,139,250,0.40)', 'rgba(15,23,42,0.82)'],
32
+ ] as const
33
+
34
+ type PhotoPlacement = {
35
+ gridColumn: string
36
+ gridRow: string
37
+ }
38
+
39
+ function getPhotoAlbumPlacement(index: number, isPortrait: boolean, photoCount: number): PhotoPlacement {
40
+ if (photoCount <= 1) {
41
+ return { gridColumn: '1 / -1', gridRow: '1 / -1' }
42
+ }
43
+
44
+ if (isPortrait) {
45
+ if (photoCount === 2) {
46
+ return [
47
+ { gridColumn: '1 / span 2', gridRow: '1 / span 2' },
48
+ { gridColumn: '1 / span 2', gridRow: '3 / span 2' },
49
+ ][index] ?? { gridColumn: '1 / span 2', gridRow: '3 / span 2' }
50
+ }
51
+
52
+ if (photoCount === 3) {
53
+ return [
54
+ { gridColumn: '1 / span 2', gridRow: '1 / span 2' },
55
+ { gridColumn: '1 / span 1', gridRow: '3 / span 1' },
56
+ { gridColumn: '2 / span 1', gridRow: '3 / span 1' },
57
+ ][index] ?? { gridColumn: '2 / span 1', gridRow: '3 / span 1' }
58
+ }
59
+
60
+ return [
61
+ { gridColumn: '1 / span 2', gridRow: '1 / span 2' },
62
+ { gridColumn: '1 / span 1', gridRow: '3 / span 1' },
63
+ { gridColumn: '2 / span 1', gridRow: '3 / span 1' },
64
+ { gridColumn: '1 / span 1', gridRow: '4 / span 1' },
65
+ { gridColumn: '2 / span 1', gridRow: '4 / span 1' },
66
+ ][index] ?? { gridColumn: '2 / span 1', gridRow: '4 / span 1' }
67
+ }
68
+
69
+ if (photoCount === 2) {
70
+ return [
71
+ { gridColumn: '1 / span 2', gridRow: '1 / span 2' },
72
+ { gridColumn: '3 / span 2', gridRow: '1 / span 2' },
73
+ ][index] ?? { gridColumn: '3 / span 2', gridRow: '1 / span 2' }
74
+ }
75
+
76
+ if (photoCount === 3) {
77
+ return [
78
+ { gridColumn: '1 / span 2', gridRow: '1 / span 3' },
79
+ { gridColumn: '3 / span 2', gridRow: '1 / span 1' },
80
+ { gridColumn: '3 / span 2', gridRow: '2 / span 2' },
81
+ ][index] ?? { gridColumn: '3 / span 2', gridRow: '2 / span 2' }
82
+ }
83
+
84
+ return [
85
+ { gridColumn: '1 / span 2', gridRow: '1 / span 3' },
86
+ { gridColumn: '3 / span 1', gridRow: '1 / span 1' },
87
+ { gridColumn: '4 / span 1', gridRow: '1 / span 2' },
88
+ { gridColumn: '3 / span 2', gridRow: '2 / span 2' },
89
+ { gridColumn: '3 / span 1', gridRow: '3 / span 1' },
90
+ ][index] ?? { gridColumn: '3 / span 1', gridRow: '3 / span 1' }
91
+ }
92
+
93
+ function getTileGradient(accent?: string, index = 0) {
94
+ if (accent) {
95
+ return `linear-gradient(180deg, color-mix(in srgb, ${accent} 56%, transparent) 0%, rgba(15,23,42,0.92) 100%)`
96
+ }
97
+
98
+ const [top, bottom] = photoPalette[index % photoPalette.length]
99
+ return `linear-gradient(180deg, ${top} 0%, ${bottom} 100%)`
100
+ }
101
+
102
+ export const componentMetadata = defineScenePluginMetadata({
103
+ resourceKind: 'scene',
104
+ name: 'DefaultPhotoAlbumSlide',
105
+ description: 'Photo album and memory collage slide',
106
+ sourceFile: 'src/core/scene/slide/photo-album/default-photo-album-slide.tsx',
107
+ pluginKey: 'core.slide.photo-album',
108
+ tags: ['scene', 'slide', 'photo-album', 'album', 'photo'],
109
+ aspectRatio: '16:9',
110
+ sceneType: 'scene',
111
+ sceneFamily: 'slide',
112
+ rootLayout: 'absolute-fill',
113
+ propsTypeName: 'DefaultPhotoAlbumSlideProps',
114
+ })
115
+
116
+ export const DefaultPhotoAlbumSlide = VideoComponent(componentMetadata)(
117
+ defineSceneComponent({
118
+ family: 'slide',
119
+ propsSchema: z.object({
120
+ sceneId: z.string().optional(),
121
+ sceneName: z.string().optional(),
122
+ title: z.string().min(1),
123
+ subtitle: z.string().optional(),
124
+ photos: z
125
+ .array(
126
+ z.object({
127
+ title: z.string().min(1),
128
+ caption: z.string().optional(),
129
+ meta: z.string().optional(),
130
+ accent: z.string().optional(),
131
+ image: z.any().optional(),
132
+ }),
133
+ )
134
+ .min(1),
135
+ }),
136
+ component: function DefaultPhotoAlbumSlide({ sceneId, sceneName, title, subtitle, photos }: DefaultPhotoAlbumSlideProps) {
137
+ const runtime = useRemotionSceneRuntime()
138
+ const isPortrait = runtime.height > runtime.width
139
+ const scale = getSlideTypographyScale(runtime.height)
140
+ const visiblePhotos = photos.slice(0, 5)
141
+ const photoCountLabel = `${String(visiblePhotos.length).padStart(2, '0')} photos`
142
+ const gridRows = isPortrait ? (visiblePhotos.length === 2 ? 4 : visiblePhotos.length <= 3 ? 3 : 4) : visiblePhotos.length <= 2 ? 2 : 3
143
+
144
+ return (
145
+ <SlideFrame
146
+ pluginKey={componentMetadata.pluginKey}
147
+ sceneId={sceneId}
148
+ sceneName={sceneName ?? title}
149
+ background="linear-gradient(160deg, #020617 0%, #0f172a 55%, #1e293b 100%)"
150
+ >
151
+ <section
152
+ style={{
153
+ width: '100%',
154
+ height: '100%',
155
+ padding: isPortrait ? '36px 24px 28px' : '56px 64px',
156
+ color: '#e2e8f0',
157
+ display: 'grid',
158
+ gridTemplateRows: isPortrait ? 'auto minmax(0, 1fr)' : '1fr',
159
+ gap: isPortrait ? 18 : 28,
160
+ minWidth: 0,
161
+ minHeight: 0,
162
+ }}
163
+ >
164
+ <div
165
+ style={{
166
+ display: 'grid',
167
+ gridTemplateColumns: isPortrait ? '1fr' : 'minmax(220px, 0.9fr) minmax(0, 1.35fr)',
168
+ gap: isPortrait ? 16 : 28,
169
+ minWidth: 0,
170
+ minHeight: 0,
171
+ alignItems: 'stretch',
172
+ }}
173
+ >
174
+ <SceneMotionLayer variant="hero-title">
175
+ <header
176
+ style={{
177
+ display: 'flex',
178
+ flexDirection: 'column',
179
+ justifyContent: 'space-between',
180
+ minWidth: 0,
181
+ minHeight: 0,
182
+ padding: isPortrait ? '0 2px' : '8px 0',
183
+ }}
184
+ >
185
+ <div>
186
+ <p
187
+ style={{
188
+ margin: 0,
189
+ fontSize: scale.caption,
190
+ lineHeight: 1.2,
191
+ letterSpacing: '0.28em',
192
+ textTransform: 'uppercase',
193
+ opacity: 0.62,
194
+ }}
195
+ >
196
+ Photo Album
197
+ </p>
198
+ <h1
199
+ style={{
200
+ margin: '12px 0 0',
201
+ fontSize: isPortrait ? scale.title * 0.76 : scale.title,
202
+ lineHeight: 0.92,
203
+ letterSpacing: '-0.06em',
204
+ maxWidth: isPortrait ? Math.min(520, Math.round(runtime.width * 0.92)) : 620,
205
+ }}
206
+ >
207
+ {title}
208
+ </h1>
209
+ {subtitle ? (
210
+ <p
211
+ style={{
212
+ margin: '14px 0 0',
213
+ maxWidth: isPortrait ? Math.min(560, Math.round(runtime.width * 0.9)) : 520,
214
+ fontSize: isPortrait ? scale.body * 0.88 : scale.body,
215
+ lineHeight: 1.5,
216
+ opacity: 0.8,
217
+ display: '-webkit-box',
218
+ WebkitBoxOrient: 'vertical',
219
+ WebkitLineClamp: isPortrait ? 4 : 5,
220
+ overflow: 'hidden',
221
+ }}
222
+ >
223
+ {subtitle}
224
+ </p>
225
+ ) : null}
226
+ </div>
227
+
228
+ <div
229
+ style={{
230
+ display: 'flex',
231
+ flexWrap: 'wrap',
232
+ gap: 10,
233
+ marginTop: isPortrait ? 18 : 24,
234
+ }}
235
+ >
236
+ <span
237
+ style={{
238
+ display: 'inline-flex',
239
+ alignItems: 'center',
240
+ padding: '7px 12px',
241
+ border: '1px solid rgba(148,163,184,0.24)',
242
+ background: 'rgba(15,23,42,0.52)',
243
+ fontSize: scale.caption,
244
+ letterSpacing: '0.18em',
245
+ textTransform: 'uppercase',
246
+ }}
247
+ >
248
+ {photoCountLabel}
249
+ </span>
250
+ <span
251
+ style={{
252
+ display: 'inline-flex',
253
+ alignItems: 'center',
254
+ padding: '7px 12px',
255
+ border: '1px solid rgba(148,163,184,0.24)',
256
+ background: 'rgba(15,23,42,0.32)',
257
+ fontSize: scale.caption,
258
+ letterSpacing: '0.16em',
259
+ textTransform: 'uppercase',
260
+ }}
261
+ >
262
+ Memory Notes
263
+ </span>
264
+ </div>
265
+ </header>
266
+ </SceneMotionLayer>
267
+
268
+ <SceneMotionLayer variant="panel" delayIndex={1}>
269
+ <div
270
+ style={{
271
+ height: '100%',
272
+ minHeight: 0,
273
+ padding: isPortrait ? 0 : '8px 0 8px 8px',
274
+ }}
275
+ >
276
+ <div
277
+ style={{
278
+ width: '100%',
279
+ height: '100%',
280
+ minHeight: 0,
281
+ display: 'grid',
282
+ gridTemplateColumns: isPortrait ? 'repeat(2, minmax(0, 1fr))' : 'repeat(4, minmax(0, 1fr))',
283
+ gridTemplateRows: `repeat(${gridRows}, minmax(0, 1fr))`,
284
+ gap: isPortrait ? 12 : 14,
285
+ overflow: 'hidden',
286
+ }}
287
+ >
288
+ {visiblePhotos.map((photo, index) => {
289
+ const placement = getPhotoAlbumPlacement(index, isPortrait, visiblePhotos.length)
290
+ const overlayLines = [photo.title, photo.caption, photo.meta].filter(Boolean) as string[]
291
+ const gradient = getTileGradient(photo.accent, index)
292
+
293
+ return (
294
+ <SceneMotionLayer key={`${photo.title}-${index}`} variant="card" delayIndex={index + 1}>
295
+ <article
296
+ style={{
297
+ ...placement,
298
+ position: 'relative',
299
+ minWidth: 0,
300
+ minHeight: 0,
301
+ overflow: 'hidden',
302
+ border: '1px solid rgba(148,163,184,0.18)',
303
+ background: gradient,
304
+ }}
305
+ >
306
+ {photo.image ? (
307
+ <div
308
+ style={{
309
+ position: 'absolute',
310
+ inset: 0,
311
+ overflow: 'hidden',
312
+ }}
313
+ >
314
+ {photo.image}
315
+ </div>
316
+ ) : (
317
+ <div
318
+ style={{
319
+ position: 'absolute',
320
+ inset: 0,
321
+ background: gradient,
322
+ }}
323
+ />
324
+ )}
325
+ <div
326
+ style={{
327
+ position: 'absolute',
328
+ inset: 0,
329
+ background:
330
+ 'linear-gradient(180deg, rgba(2,6,23,0.12) 0%, rgba(2,6,23,0.18) 42%, rgba(2,6,23,0.76) 100%)',
331
+ }}
332
+ />
333
+ <div
334
+ style={{
335
+ position: 'relative',
336
+ zIndex: 1,
337
+ width: '100%',
338
+ height: '100%',
339
+ display: 'flex',
340
+ flexDirection: 'column',
341
+ justifyContent: 'space-between',
342
+ minWidth: 0,
343
+ minHeight: 0,
344
+ padding: isPortrait ? 14 : 16,
345
+ }}
346
+ >
347
+ <span
348
+ style={{
349
+ alignSelf: 'flex-start',
350
+ display: 'inline-flex',
351
+ alignItems: 'center',
352
+ gap: 8,
353
+ padding: '5px 10px',
354
+ border: '1px solid rgba(255,255,255,0.18)',
355
+ background: 'rgba(2,6,23,0.32)',
356
+ fontSize: scale.caption,
357
+ letterSpacing: '0.18em',
358
+ textTransform: 'uppercase',
359
+ whiteSpace: 'nowrap',
360
+ }}
361
+ >
362
+ {String(index + 1).padStart(2, '0')}
363
+ </span>
364
+
365
+ <div style={{ minWidth: 0 }}>
366
+ <p
367
+ style={{
368
+ margin: 0,
369
+ maxWidth: '100%',
370
+ fontSize: isPortrait ? scale.body * 0.9 : scale.body,
371
+ fontWeight: 700,
372
+ lineHeight: 1.12,
373
+ letterSpacing: '-0.02em',
374
+ display: '-webkit-box',
375
+ WebkitBoxOrient: 'vertical',
376
+ WebkitLineClamp: 2,
377
+ overflow: 'hidden',
378
+ }}
379
+ >
380
+ {photo.title}
381
+ </p>
382
+ {overlayLines.length > 1 ? (
383
+ <p
384
+ style={{
385
+ margin: '8px 0 0',
386
+ maxWidth: '100%',
387
+ fontSize: isPortrait ? scale.body * 0.76 : scale.body * 0.8,
388
+ lineHeight: 1.35,
389
+ opacity: 0.82,
390
+ display: '-webkit-box',
391
+ WebkitBoxOrient: 'vertical',
392
+ WebkitLineClamp: 2,
393
+ overflow: 'hidden',
394
+ }}
395
+ >
396
+ {overlayLines.slice(1).join(' · ')}
397
+ </p>
398
+ ) : null}
399
+ </div>
400
+ </div>
401
+ </article>
402
+ </SceneMotionLayer>
403
+ )
404
+ })}
405
+ </div>
406
+ </div>
407
+ </SceneMotionLayer>
408
+ </div>
409
+ </section>
410
+ </SlideFrame>
411
+ )
412
+ },
413
+ }),
414
+ )
@@ -0,0 +1,7 @@
1
+ export { DefaultPhotoAlbumSlide } from './default-photo-album-slide'
2
+ export { componentMetadata } from './default-photo-album-slide'
3
+ export { DefaultPhotoAlbumSlideLandscape, componentMetadata as DefaultPhotoAlbumSlideLandscapeMetadata } from './default-photo-album-slide-Landscape'
4
+ export { DefaultPhotoAlbumSlideHorizontal, componentMetadata as DefaultPhotoAlbumSlideHorizontalMetadata } from './default-photo-album-slide-Horizontal'
5
+ export { DefaultPhotoAlbumSingleSlide, componentMetadata as DefaultPhotoAlbumSingleSlideMetadata } from './default-photo-album-single-slide'
6
+ export { DefaultPhotoAlbumPairSlide, componentMetadata as DefaultPhotoAlbumPairSlideMetadata } from './default-photo-album-pair-slide'
7
+ export { DefaultPhotoAlbumMultiSlide, componentMetadata as DefaultPhotoAlbumMultiSlideMetadata } from './default-photo-album-multi-slide'