@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,432 @@
1
+ import type { ReactNode } from 'react'
2
+ import { cloneElement, isValidElement } from 'react'
3
+
4
+ import { z } from 'zod'
5
+
6
+ import { VideoComponent, defineScenePluginMetadata } from '@vibecuting/component-project-helper'
7
+ import { spring, useCurrentFrame, useVideoConfig } from 'remotion'
8
+
9
+ import { BaseRemotionScene, SceneMotionLayer, type BaseRemotionSceneProps, useRemotionSceneRuntime, useSceneConfig } from '../../../base'
10
+ import { defineSceneComponent } from '../../../plugins/scene-component'
11
+
12
+ export interface DefaultLivePhotoSceneProps extends BaseRemotionSceneProps {
13
+ sceneId?: string
14
+ sceneName?: string
15
+ title?: string
16
+ subtitle?: string
17
+ badge?: string
18
+ image: ReactNode
19
+ images?: ReactNode[]
20
+ variant?: 'live' | 'wall' | 'strip'
21
+ accent?: string
22
+ secondaryAccent?: string
23
+ textColor?: string
24
+ }
25
+
26
+ export const componentMetadata = defineScenePluginMetadata({
27
+ resourceKind: 'scene',
28
+ name: 'DefaultLivePhotoScene',
29
+ description: 'Apple-style live photo scene with a subtle push-in and luminous overlay',
30
+ sourceFile: 'src/core/scene/photo/default-live-photo-scene.tsx',
31
+ pluginKey: 'core.photo.live-photo',
32
+ tags: ['scene', 'photo', 'live-photo', 'image', 'apple'],
33
+ aspectRatio: '16:9',
34
+ sceneType: 'scene',
35
+ sceneFamily: 'custom',
36
+ rootLayout: 'absolute-fill',
37
+ propsTypeName: 'DefaultLivePhotoSceneProps',
38
+ })
39
+
40
+ function LivePhotoBadge({ label }: { label: string }) {
41
+ return (
42
+ <div
43
+ style={{
44
+ display: 'inline-flex',
45
+ alignItems: 'center',
46
+ gap: 8,
47
+ border: '1px solid rgba(255,255,255,0.18)',
48
+ background: 'rgba(2,6,23,0.6)',
49
+ color: '#f8fafc',
50
+ padding: '8px 12px',
51
+ letterSpacing: '0.22em',
52
+ textTransform: 'uppercase',
53
+ fontSize: 11,
54
+ lineHeight: 1,
55
+ }}
56
+ >
57
+ <span
58
+ aria-hidden="true"
59
+ style={{
60
+ width: 8,
61
+ height: 8,
62
+ borderRadius: 9999,
63
+ background: 'rgba(239,68,68,0.95)',
64
+ boxShadow: '0 0 0 4px rgba(239,68,68,0.14)',
65
+ }}
66
+ />
67
+ {label}
68
+ </div>
69
+ )
70
+ }
71
+
72
+ function renderCoverMedia(node: ReactNode) {
73
+ if (isValidElement(node)) {
74
+ const existingStyle = (node.props as { style?: Record<string, unknown> }).style ?? {}
75
+ return cloneElement(node, {
76
+ ...(node.props as Record<string, unknown>),
77
+ style: {
78
+ ...existingStyle,
79
+ width: '100%',
80
+ height: '100%',
81
+ objectFit: 'cover',
82
+ display: 'block',
83
+ minWidth: 0,
84
+ minHeight: 0,
85
+ },
86
+ })
87
+ }
88
+
89
+ return <div style={{ width: '100%', height: '100%', minWidth: 0, minHeight: 0 }}>{node}</div>
90
+ }
91
+
92
+ export const DefaultLivePhotoScene = VideoComponent(componentMetadata)(
93
+ defineSceneComponent({
94
+ family: 'custom',
95
+ propsSchema: z.object({
96
+ sceneId: z.string().optional(),
97
+ sceneName: z.string().optional(),
98
+ title: z.string().optional(),
99
+ subtitle: z.string().optional(),
100
+ badge: z.string().optional(),
101
+ image: z.any(),
102
+ images: z.array(z.any()).optional(),
103
+ variant: z.enum(['live', 'wall', 'strip']).optional(),
104
+ accent: z.string().optional(),
105
+ secondaryAccent: z.string().optional(),
106
+ textColor: z.string().optional(),
107
+ }),
108
+ component: function DefaultLivePhotoScene({
109
+ id,
110
+ name,
111
+ sceneId,
112
+ sceneName,
113
+ title,
114
+ subtitle,
115
+ badge,
116
+ image,
117
+ images,
118
+ variant = 'live',
119
+ accent,
120
+ secondaryAccent,
121
+ textColor,
122
+ }: DefaultLivePhotoSceneProps) {
123
+ const runtime = useRemotionSceneRuntime()
124
+ const sceneConfig = useSceneConfig()
125
+ const frame = useCurrentFrame()
126
+ const { fps } = useVideoConfig()
127
+ const portrait = runtime.height > runtime.width
128
+ const animationProgress =
129
+ sceneConfig.sceneType === 'animation'
130
+ ? spring({
131
+ frame,
132
+ fps,
133
+ config: {
134
+ damping: 18,
135
+ mass: 0.8,
136
+ stiffness: 110,
137
+ },
138
+ })
139
+ : 1
140
+ const titleSize = Math.round(runtime.height * (portrait ? 0.034 : 0.04))
141
+ const subtitleSize = Math.round(runtime.height * 0.017)
142
+ const padding = Math.round(runtime.height * (portrait ? 0.012 : 0.014))
143
+ const liveMediaHeight = Math.max(240, Math.floor(runtime.height * (portrait ? 0.84 : 0.86)))
144
+ const revealFrame = 12
145
+ const liveBreath = sceneConfig.sceneType === 'animation' ? Math.sin((frame / fps) * Math.PI * 0.85) * 0.012 : 0
146
+ const liveFocus = sceneConfig.sceneType === 'animation' ? 1 - animationProgress : 0
147
+ const revealEase = sceneConfig.sceneType === 'animation' ? spring({ frame: Math.max(0, frame - revealFrame), fps, config: { damping: 22, mass: 0.7, stiffness: 170 } }) : 1
148
+ const imageScale = sceneConfig.sceneType === 'animation' ? 1.06 + revealEase * 0.24 + liveBreath : 1
149
+ const imageShiftY = sceneConfig.sceneType === 'animation' ? revealEase * 32 + liveBreath * 72 : 0
150
+ const imageShiftX = sceneConfig.sceneType === 'animation' ? (portrait ? -10 : -18) * revealEase + liveBreath * (portrait ? 18 : 28) : 0
151
+ const backgroundScale = sceneConfig.sceneType === 'animation' ? 1.28 + revealEase * 0.12 : 1.16
152
+ const spotlightOpacity = sceneConfig.sceneType === 'animation' ? 0.16 + revealEase * 0.12 : 0.08
153
+ const vignetteOpacity = sceneConfig.sceneType === 'animation' ? 0.42 + revealEase * 0.18 : 0.28
154
+ const imageSet = (images?.length ? images : [image]).slice(0, 4)
155
+
156
+ return (
157
+ <BaseRemotionScene
158
+ id={id ?? sceneId}
159
+ name={name ?? sceneName ?? title}
160
+ style={{
161
+ background:
162
+ portrait
163
+ ? `linear-gradient(180deg, ${accent ?? '#050505'} 0%, #020617 45%, #000000 100%)`
164
+ : `radial-gradient(circle at 50% 28%, ${secondaryAccent ?? 'rgba(255,255,255,0.08)'} 0%, ${accent ?? '#020617'} 48%, #000000 100%)`,
165
+ color: textColor ?? '#f8fafc',
166
+ padding,
167
+ }}
168
+ >
169
+ <section
170
+ style={{
171
+ width: '100%',
172
+ height: '100%',
173
+ display: 'flex',
174
+ flexDirection: 'column',
175
+ gap: portrait ? 14 : 18,
176
+ minWidth: 0,
177
+ minHeight: 0,
178
+ }}
179
+ >
180
+ {variant === 'wall' ? (
181
+ <div
182
+ style={{
183
+ position: 'relative',
184
+ width: '100%',
185
+ height: '100%',
186
+ aspectRatio: portrait ? '9 / 16' : '16 / 9',
187
+ minWidth: 0,
188
+ minHeight: 0,
189
+ overflow: 'hidden',
190
+ border: '1px solid rgba(255,255,255,0.1)',
191
+ background: 'rgba(2,6,23,0.84)',
192
+ display: 'grid',
193
+ gridTemplateColumns: portrait ? '1fr 1fr' : '1.2fr 0.8fr',
194
+ gridTemplateRows: portrait ? '1fr 1fr' : '1fr 1fr',
195
+ gap: 6,
196
+ padding,
197
+ }}
198
+ >
199
+ {imageSet.map((item, index) => (
200
+ <SceneMotionLayer key={`wall-${index}`} variant="media" delayIndex={index}>
201
+ <div
202
+ style={{
203
+ width: '100%',
204
+ height: '100%',
205
+ minHeight: 0,
206
+ overflow: 'hidden',
207
+ border: '1px solid rgba(255,255,255,0.06)',
208
+ background: 'rgba(15,23,42,0.88)',
209
+ transform: `scale(${1 + (1 - animationProgress) * 0.018})`,
210
+ }}
211
+ >
212
+ {renderCoverMedia(item)}
213
+ </div>
214
+ </SceneMotionLayer>
215
+ ))}
216
+ <div style={{ position: 'absolute', inset: padding, display: 'flex', justifyContent: 'space-between', alignItems: 'start', pointerEvents: 'none' }}>
217
+ <LivePhotoBadge label={badge ?? 'Photo Wall'} />
218
+ <div style={{ fontSize: Math.round(runtime.height * 0.013), letterSpacing: '0.24em', textTransform: 'uppercase', opacity: 0.58 }}>
219
+ {imageSet.length} frames
220
+ </div>
221
+ </div>
222
+ </div>
223
+ ) : variant === 'strip' ? (
224
+ <div
225
+ style={{
226
+ position: 'relative',
227
+ minWidth: 0,
228
+ minHeight: 0,
229
+ overflow: 'hidden',
230
+ border: '1px solid rgba(255,255,255,0.14)',
231
+ background: 'rgba(2,6,23,0.84)',
232
+ display: 'grid',
233
+ gridTemplateRows: 'auto 1fr auto',
234
+ gap: 12,
235
+ padding,
236
+ flex: 1,
237
+ }}
238
+ >
239
+ <div style={{ display: 'flex', justifyContent: 'space-between', alignItems: 'center', gap: 12 }}>
240
+ <LivePhotoBadge label={badge ?? 'Photo Strip'} />
241
+ <div style={{ fontSize: Math.round(runtime.height * 0.013), letterSpacing: '0.2em', textTransform: 'uppercase', opacity: 0.56 }}>
242
+ Live sequence
243
+ </div>
244
+ </div>
245
+ <div
246
+ style={{
247
+ display: 'grid',
248
+ gridTemplateColumns: 'repeat(3, minmax(0, 1fr))',
249
+ gap: 6,
250
+ minWidth: 0,
251
+ minHeight: 0,
252
+ }}
253
+ >
254
+ {imageSet.map((item, index) => (
255
+ <SceneMotionLayer key={`strip-${index}`} variant="media" delayIndex={index}>
256
+ <div
257
+ style={{
258
+ width: '100%',
259
+ height: '100%',
260
+ minHeight: 0,
261
+ overflow: 'hidden',
262
+ border: '1px solid rgba(255,255,255,0.06)',
263
+ background: 'rgba(15,23,42,0.88)',
264
+ transform: `translate3d(0, ${(1 - animationProgress) * 8}px, 0) scale(${1 + (1 - animationProgress) * 0.02})`,
265
+ }}
266
+ >
267
+ {renderCoverMedia(item)}
268
+ </div>
269
+ </SceneMotionLayer>
270
+ ))}
271
+ </div>
272
+ <div style={{ display: 'grid', gap: 8 }}>
273
+ {title ? (
274
+ <SceneMotionLayer variant="hero-title">
275
+ <div style={{ fontSize: titleSize * 0.82, fontWeight: 800, letterSpacing: '-0.06em', lineHeight: 0.95 }}>{title}</div>
276
+ </SceneMotionLayer>
277
+ ) : null}
278
+ {subtitle ? <div style={{ fontSize: subtitleSize, lineHeight: 1.45, opacity: 0.84 }}>{subtitle}</div> : null}
279
+ </div>
280
+ </div>
281
+ ) : (
282
+ <div
283
+ style={{
284
+ position: 'relative',
285
+ width: '100%',
286
+ height: liveMediaHeight,
287
+ minHeight: liveMediaHeight,
288
+ minWidth: 0,
289
+ overflow: 'hidden',
290
+ border: '1px solid rgba(255,255,255,0.1)',
291
+ background: 'rgba(2,6,23,0.84)',
292
+ flex: 1,
293
+ }}
294
+ >
295
+ <SceneMotionLayer
296
+ variant="media"
297
+ style={{
298
+ position: 'absolute',
299
+ inset: '-10%',
300
+ opacity: sceneConfig.sceneType === 'animation' ? 0.48 : 0.2,
301
+ filter: 'blur(32px) saturate(1.16) brightness(0.92)',
302
+ transform: `translate3d(${imageShiftX * 0.28}px, ${imageShiftY * 0.18}px, 0) scale(${backgroundScale})`,
303
+ }}
304
+ >
305
+ <div
306
+ style={{
307
+ width: '100%',
308
+ height: '100%',
309
+ transform: `translate3d(${imageShiftX * 0.4}px, ${imageShiftY * 0.32}px, 0) scale(${imageScale + 0.14})`,
310
+ transformOrigin: 'center center',
311
+ }}
312
+ >
313
+ {renderCoverMedia(image)}
314
+ </div>
315
+ </SceneMotionLayer>
316
+
317
+ <SceneMotionLayer
318
+ variant="media"
319
+ style={{
320
+ position: 'absolute',
321
+ inset: 0,
322
+ transform: `translate3d(${imageShiftX}px, ${imageShiftY}px, 0) scale(${imageScale})`,
323
+ }}
324
+ >
325
+ {renderCoverMedia(image)}
326
+ </SceneMotionLayer>
327
+
328
+ <div
329
+ aria-hidden="true"
330
+ style={{
331
+ position: 'absolute',
332
+ inset: 0,
333
+ background:
334
+ sceneConfig.sceneType === 'animation'
335
+ ? `radial-gradient(circle at 50% 20%, rgba(255,255,255,${spotlightOpacity}) 0%, rgba(255,255,255,0.04) 18%, rgba(2,6,23,0.05) 34%, rgba(2,6,23,${vignetteOpacity}) 100%)`
336
+ : 'linear-gradient(180deg, rgba(2,6,23,0.08) 0%, rgba(2,6,23,0.14) 38%, rgba(2,6,23,0.62) 100%)',
337
+ pointerEvents: 'none',
338
+ }}
339
+ />
340
+
341
+ <div
342
+ aria-hidden="true"
343
+ style={{
344
+ position: 'absolute',
345
+ inset: 0,
346
+ border: '1px solid rgba(255,255,255,0.08)',
347
+ pointerEvents: 'none',
348
+ }}
349
+ />
350
+
351
+ <div
352
+ style={{
353
+ position: 'absolute',
354
+ top: padding,
355
+ left: padding,
356
+ display: 'grid',
357
+ gap: 8,
358
+ zIndex: 2,
359
+ }}
360
+ >
361
+ <LivePhotoBadge label={badge ?? (sceneConfig.sceneType === 'animation' ? 'Live Photo' : 'Photo')} />
362
+ </div>
363
+
364
+ <div
365
+ style={{
366
+ position: 'absolute',
367
+ left: padding,
368
+ right: padding,
369
+ bottom: padding,
370
+ display: 'grid',
371
+ gap: 8,
372
+ zIndex: 2,
373
+ }}
374
+ >
375
+ {title ? (
376
+ <SceneMotionLayer variant="hero-title">
377
+ <div style={{ fontSize: titleSize, fontWeight: 800, letterSpacing: '-0.06em', lineHeight: 0.95 }}>
378
+ {title}
379
+ </div>
380
+ </SceneMotionLayer>
381
+ ) : null}
382
+ {subtitle ? (
383
+ <SceneMotionLayer variant="hero-copy" delayIndex={1}>
384
+ <div style={{ fontSize: subtitleSize, lineHeight: 1.45, opacity: 0.84, maxWidth: portrait ? '88%' : '56%' }}>
385
+ {subtitle}
386
+ </div>
387
+ </SceneMotionLayer>
388
+ ) : null}
389
+ </div>
390
+ </div>
391
+ )}
392
+
393
+ {variant === 'live' ? null : (
394
+ <div
395
+ style={{
396
+ display: 'flex',
397
+ justifyContent: 'space-between',
398
+ alignItems: 'center',
399
+ gap: 16,
400
+ minWidth: 0,
401
+ }}
402
+ >
403
+ <div
404
+ style={{
405
+ fontSize: Math.round(runtime.height * 0.014),
406
+ letterSpacing: '0.24em',
407
+ textTransform: 'uppercase',
408
+ opacity: 0.6,
409
+ minWidth: 0,
410
+ }}
411
+ >
412
+ {sceneConfig.sceneType === 'animation' ? 'Animation preview' : 'Static preview'}
413
+ </div>
414
+ <div
415
+ style={{
416
+ fontSize: Math.round(runtime.height * 0.014),
417
+ letterSpacing: '0.18em',
418
+ textTransform: 'uppercase',
419
+ opacity: 0.46,
420
+ minWidth: 0,
421
+ }}
422
+ >
423
+ {sceneConfig.sceneInFrames} frames
424
+ </div>
425
+ </div>
426
+ )}
427
+ </section>
428
+ </BaseRemotionScene>
429
+ )
430
+ },
431
+ }),
432
+ )
@@ -0,0 +1,20 @@
1
+ import type { ComponentProps } from 'react'
2
+
3
+ import { VideoComponent, type ScenePluginMetadata } from '@vibecuting/component-project-helper'
4
+
5
+ import { DefaultPhotoStripScene, componentMetadata as baseComponentMetadata } from './default-photo-strip-scene'
6
+
7
+ export const componentMetadata: ScenePluginMetadata = {
8
+ ...baseComponentMetadata,
9
+ name: 'DefaultPhotoStripSceneHorizontal',
10
+ description: 'Apple-style photo strip scene (Portrait 9:16 variant)',
11
+ sourceFile: 'src/core/scene/photo/default-photo-strip-scene-Horizontal.tsx',
12
+ aspectRatio: '9:16',
13
+ tags: Array.from(new Set([...(baseComponentMetadata.tags ?? []), 'horizontal'])),
14
+ }
15
+
16
+ export const DefaultPhotoStripSceneHorizontal = VideoComponent(componentMetadata)(function DefaultPhotoStripSceneHorizontal(
17
+ props: ComponentProps<typeof DefaultPhotoStripScene>,
18
+ ) {
19
+ return <DefaultPhotoStripScene {...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 { DefaultPhotoStripScene, componentMetadata as baseComponentMetadata } from './default-photo-strip-scene'
6
+
7
+ export const componentMetadata: ScenePluginMetadata = {
8
+ ...baseComponentMetadata,
9
+ name: 'DefaultPhotoStripSceneLandscape',
10
+ description: 'Apple-style photo strip scene (Landscape 16:9 variant)',
11
+ sourceFile: 'src/core/scene/photo/default-photo-strip-scene-Landscape.tsx',
12
+ aspectRatio: '16:9',
13
+ tags: Array.from(new Set([...(baseComponentMetadata.tags ?? []), 'landscape'])),
14
+ }
15
+
16
+ export const DefaultPhotoStripSceneLandscape = VideoComponent(componentMetadata)(function DefaultPhotoStripSceneLandscape(
17
+ props: ComponentProps<typeof DefaultPhotoStripScene>,
18
+ ) {
19
+ return <DefaultPhotoStripScene {...props} />
20
+ })
@@ -0,0 +1,38 @@
1
+ import { DefaultPhotoStripSceneHorizontal } from './default-photo-strip-scene-Horizontal'
2
+ import { DefaultPhotoStripSceneLandscape } from './default-photo-strip-scene-Landscape'
3
+
4
+ const photoUrl = 'https://heyaai-statics-1342239856.cos.ap-guangzhou.myqcloud.com/tmp/premium_photo-1779404552087-0f905162376f-121.jpeg'
5
+ const image = <img src={photoUrl} alt="Photo strip" />
6
+
7
+ const args = {
8
+ title: 'Three Beats',
9
+ subtitle: 'A tight strip of stills for storytelling, chapter markers, or memory sequencing.',
10
+ badge: 'Strip',
11
+ image,
12
+ images: [image, image, image],
13
+ }
14
+
15
+ const meta = {
16
+ title: 'core/scene/photo/DefaultPhotoStripSceneLandscape',
17
+ component: DefaultPhotoStripSceneLandscape,
18
+ args,
19
+ }
20
+
21
+ export default meta
22
+
23
+ export const Default = {
24
+ render: (storyArgs: typeof args) => <DefaultPhotoStripSceneLandscape {...storyArgs} />,
25
+ parameters: { scenePreviewAspectRatio: '16:9' },
26
+ }
27
+ export const Animated = {
28
+ render: (storyArgs: typeof args) => <DefaultPhotoStripSceneLandscape {...storyArgs} />,
29
+ parameters: { scenePreviewAspectRatio: '16:9', scenePreviewMode: 'animation' },
30
+ }
31
+ export const Horizontal = {
32
+ render: (storyArgs: typeof args) => <DefaultPhotoStripSceneHorizontal {...storyArgs} />,
33
+ parameters: { scenePreviewAspectRatio: '9:16' },
34
+ }
35
+ export const HorizontalAnimated = {
36
+ render: (storyArgs: typeof args) => <DefaultPhotoStripSceneHorizontal {...storyArgs} />,
37
+ parameters: { scenePreviewAspectRatio: '9:16', scenePreviewMode: 'animation' },
38
+ }
@@ -0,0 +1,19 @@
1
+ import type { ComponentProps } from 'react'
2
+
3
+ import { VideoComponent, type ScenePluginMetadata } from '@vibecuting/component-project-helper'
4
+
5
+ import { DefaultLivePhotoScene, componentMetadata as baseComponentMetadata } from './default-live-photo-scene'
6
+
7
+ export const componentMetadata: ScenePluginMetadata = {
8
+ ...baseComponentMetadata,
9
+ name: 'DefaultPhotoStripScene',
10
+ description: 'Apple-style photo strip scene',
11
+ sourceFile: 'src/core/scene/photo/default-photo-strip-scene.tsx',
12
+ tags: Array.from(new Set([...(baseComponentMetadata.tags ?? []), 'strip', 'sequence'])),
13
+ }
14
+
15
+ export const DefaultPhotoStripScene = VideoComponent(componentMetadata)(function DefaultPhotoStripScene(
16
+ props: ComponentProps<typeof DefaultLivePhotoScene>,
17
+ ) {
18
+ return <DefaultLivePhotoScene {...props} variant="strip" />
19
+ })
@@ -0,0 +1,20 @@
1
+ import type { ComponentProps } from 'react'
2
+
3
+ import { VideoComponent, type ScenePluginMetadata } from '@vibecuting/component-project-helper'
4
+
5
+ import { DefaultPhotoWallScene, componentMetadata as baseComponentMetadata } from './default-photo-wall-scene'
6
+
7
+ export const componentMetadata: ScenePluginMetadata = {
8
+ ...baseComponentMetadata,
9
+ name: 'DefaultPhotoWallSceneHorizontal',
10
+ description: 'Apple-style photo wall scene (Portrait 9:16 variant)',
11
+ sourceFile: 'src/core/scene/photo/default-photo-wall-scene-Horizontal.tsx',
12
+ aspectRatio: '9:16',
13
+ tags: Array.from(new Set([...(baseComponentMetadata.tags ?? []), 'horizontal'])),
14
+ }
15
+
16
+ export const DefaultPhotoWallSceneHorizontal = VideoComponent(componentMetadata)(function DefaultPhotoWallSceneHorizontal(
17
+ props: ComponentProps<typeof DefaultPhotoWallScene>,
18
+ ) {
19
+ return <DefaultPhotoWallScene {...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 { DefaultPhotoWallScene, componentMetadata as baseComponentMetadata } from './default-photo-wall-scene'
6
+
7
+ export const componentMetadata: ScenePluginMetadata = {
8
+ ...baseComponentMetadata,
9
+ name: 'DefaultPhotoWallSceneLandscape',
10
+ description: 'Apple-style photo wall scene (Landscape 16:9 variant)',
11
+ sourceFile: 'src/core/scene/photo/default-photo-wall-scene-Landscape.tsx',
12
+ aspectRatio: '16:9',
13
+ tags: Array.from(new Set([...(baseComponentMetadata.tags ?? []), 'landscape'])),
14
+ }
15
+
16
+ export const DefaultPhotoWallSceneLandscape = VideoComponent(componentMetadata)(function DefaultPhotoWallSceneLandscape(
17
+ props: ComponentProps<typeof DefaultPhotoWallScene>,
18
+ ) {
19
+ return <DefaultPhotoWallScene {...props} />
20
+ })
@@ -0,0 +1,38 @@
1
+ import { DefaultPhotoWallSceneHorizontal } from './default-photo-wall-scene-Horizontal'
2
+ import { DefaultPhotoWallSceneLandscape } from './default-photo-wall-scene-Landscape'
3
+
4
+ const photoUrl = 'https://heyaai-statics-1342239856.cos.ap-guangzhou.myqcloud.com/tmp/premium_photo-1779404552087-0f905162376f-121.jpeg'
5
+ const image = <img src={photoUrl} alt="Photo wall" />
6
+
7
+ const args = {
8
+ title: 'Four Moments',
9
+ subtitle: 'A photo wall that can duplicate or mix multiple stills with a soft cinematic drift.',
10
+ badge: 'Wall',
11
+ image,
12
+ images: [image, image, image, image],
13
+ }
14
+
15
+ const meta = {
16
+ title: 'core/scene/photo/DefaultPhotoWallSceneLandscape',
17
+ component: DefaultPhotoWallSceneLandscape,
18
+ args,
19
+ }
20
+
21
+ export default meta
22
+
23
+ export const Default = {
24
+ render: (storyArgs: typeof args) => <DefaultPhotoWallSceneLandscape {...storyArgs} />,
25
+ parameters: { scenePreviewAspectRatio: '16:9' },
26
+ }
27
+ export const Animated = {
28
+ render: (storyArgs: typeof args) => <DefaultPhotoWallSceneLandscape {...storyArgs} />,
29
+ parameters: { scenePreviewAspectRatio: '16:9', scenePreviewMode: 'animation' },
30
+ }
31
+ export const Horizontal = {
32
+ render: (storyArgs: typeof args) => <DefaultPhotoWallSceneHorizontal {...storyArgs} />,
33
+ parameters: { scenePreviewAspectRatio: '9:16' },
34
+ }
35
+ export const HorizontalAnimated = {
36
+ render: (storyArgs: typeof args) => <DefaultPhotoWallSceneHorizontal {...storyArgs} />,
37
+ parameters: { scenePreviewAspectRatio: '9:16', scenePreviewMode: 'animation' },
38
+ }
@@ -0,0 +1,19 @@
1
+ import type { ComponentProps } from 'react'
2
+
3
+ import { VideoComponent, type ScenePluginMetadata } from '@vibecuting/component-project-helper'
4
+
5
+ import { DefaultLivePhotoScene, componentMetadata as baseComponentMetadata } from './default-live-photo-scene'
6
+
7
+ export const componentMetadata: ScenePluginMetadata = {
8
+ ...baseComponentMetadata,
9
+ name: 'DefaultPhotoWallScene',
10
+ description: 'Apple-style photo wall scene',
11
+ sourceFile: 'src/core/scene/photo/default-photo-wall-scene.tsx',
12
+ tags: Array.from(new Set([...(baseComponentMetadata.tags ?? []), 'wall', 'collage'])),
13
+ }
14
+
15
+ export const DefaultPhotoWallScene = VideoComponent(componentMetadata)(function DefaultPhotoWallScene(
16
+ props: ComponentProps<typeof DefaultLivePhotoScene>,
17
+ ) {
18
+ return <DefaultLivePhotoScene {...props} variant="wall" />
19
+ })
@@ -0,0 +1,44 @@
1
+ import { DefaultEffectsPhotoSceneHorizontal } from './default-effects-photo-scene-Horizontal'
2
+
3
+ const photoUrl = 'https://heyaai-statics-1342239856.cos.ap-guangzhou.myqcloud.com/tmp/premium_photo-1779404552087-0f905162376f-121.jpeg'
4
+
5
+ const meta = {
6
+ title: 'core/scene/photo/effects-photo/DefaultEffectsPhotoSceneHorizontal',
7
+ component: DefaultEffectsPhotoSceneHorizontal,
8
+ args: {
9
+ title: 'Golden Echo',
10
+ subtitle: 'Layered photo grading with glow, grain, warmth and a cinematic vignette.',
11
+ badge: 'Effects Photo',
12
+ imageSrc: photoUrl,
13
+ effects: [
14
+ { type: 'glow', intensity: 0.55 },
15
+ { type: 'vignette', intensity: 0.65 },
16
+ { type: 'grain', intensity: 0.12 },
17
+ { type: 'warmth', intensity: 0.18, hue: '#f59e0b' },
18
+ ],
19
+ accent: '#020617',
20
+ secondaryAccent: '#7c3aed',
21
+ },
22
+ }
23
+
24
+ export default meta
25
+
26
+ export const Default = {
27
+ parameters: {
28
+ scenePreviewAspectRatio: '9:16',
29
+ },
30
+ }
31
+
32
+ export const Animated = {
33
+ parameters: {
34
+ scenePreviewAspectRatio: '9:16',
35
+ scenePreviewMode: 'animation',
36
+ },
37
+ }
38
+
39
+ export const Both = {
40
+ parameters: {
41
+ scenePreviewAspectRatio: '9:16',
42
+ scenePreviewMode: 'both',
43
+ },
44
+ }