@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,19 @@
1
+ import type { ComponentProps } from 'react'
2
+
3
+ import { VideoComponent, type ScenePluginMetadata } from '@vibecuting/component-project-helper'
4
+
5
+ import { DefaultPersonIntroGroupSlide, componentMetadata as baseComponentMetadata } from './default-person-intro-group-slide'
6
+
7
+ export const componentMetadata: ScenePluginMetadata = {
8
+ ...baseComponentMetadata,
9
+ name: 'DefaultPersonIntroQuadSlide',
10
+ description: 'Four person intro slide',
11
+ sourceFile: 'src/core/scene/slide/person-intro/default-person-intro-quad-slide.tsx',
12
+ tags: Array.from(new Set([...(baseComponentMetadata.tags ?? []), 'quad', 'four-person'])),
13
+ }
14
+
15
+ export const DefaultPersonIntroQuadSlide = VideoComponent(componentMetadata)(function DefaultPersonIntroQuadSlide(
16
+ props: ComponentProps<typeof DefaultPersonIntroGroupSlide>,
17
+ ) {
18
+ return <DefaultPersonIntroGroupSlide {...props} />
19
+ })
@@ -0,0 +1,47 @@
1
+ import { DefaultPersonIntroSlideHorizontal } from './default-person-intro-slide-Horizontal'
2
+
3
+ const meta = {
4
+ title: 'core/scene/slide/person-intro/DefaultPersonIntroSlideHorizontal/Animated',
5
+ component: DefaultPersonIntroSlideHorizontal,
6
+ args: {
7
+ name: 'Avery Chen',
8
+ role: 'Creative Director, Product Storytelling',
9
+ bio: 'Designs presentation systems that turn product updates, launches, and leadership narratives into concise visual stories.',
10
+ avatar: (
11
+ <div
12
+ style={{
13
+ width: '100%',
14
+ height: '100%',
15
+ display: 'grid',
16
+ placeItems: 'center',
17
+ background: 'linear-gradient(135deg, #38bdf8 0%, #2563eb 100%)',
18
+ color: '#f8fafc',
19
+ fontSize: 42,
20
+ fontWeight: 800,
21
+ letterSpacing: '-0.06em',
22
+ }}
23
+ >
24
+ AC
25
+ </div>
26
+ ),
27
+ links: [
28
+ { label: 'Website', href: 'https://example.com', meta: 'averychen.dev' },
29
+ { label: 'LinkedIn', href: 'https://www.linkedin.com', meta: 'Profile' },
30
+ { label: 'Email', href: 'mailto:avery@example.com', meta: 'Direct contact' },
31
+ ],
32
+ highlights: [
33
+ { label: 'Talks', value: '48', detail: 'Keynotes, workshops, and internal launch reviews.' },
34
+ { label: 'Audience', value: '120K', detail: 'Cross-platform following and community reach.' },
35
+ { label: 'Specialty', value: 'Narrative systems', detail: 'Messaging, visual rhythm, and reusable deck patterns.' },
36
+ ],
37
+ },
38
+ }
39
+
40
+ export default meta
41
+
42
+ export const Animated = {
43
+ parameters: {
44
+ scenePreviewMode: 'animation',
45
+ scenePreviewAspectRatio: '9:16',
46
+ },
47
+ }
@@ -0,0 +1,46 @@
1
+ import { DefaultPersonIntroSlideHorizontal } from './default-person-intro-slide-Horizontal'
2
+
3
+ const meta = {
4
+ title: 'core/scene/slide/person-intro/DefaultPersonIntroSlideHorizontal',
5
+ component: DefaultPersonIntroSlideHorizontal,
6
+ args: {
7
+ name: 'Avery Chen',
8
+ role: 'Creative Director, Product Storytelling',
9
+ bio: 'Designs presentation systems that turn product updates, launches, and leadership narratives into concise visual stories.',
10
+ avatar: (
11
+ <div
12
+ style={{
13
+ width: '100%',
14
+ height: '100%',
15
+ display: 'grid',
16
+ placeItems: 'center',
17
+ background: 'linear-gradient(135deg, #38bdf8 0%, #2563eb 100%)',
18
+ color: '#f8fafc',
19
+ fontSize: 42,
20
+ fontWeight: 800,
21
+ letterSpacing: '-0.06em',
22
+ }}
23
+ >
24
+ AC
25
+ </div>
26
+ ),
27
+ links: [
28
+ { label: 'Website', href: 'https://example.com', meta: 'averychen.dev' },
29
+ { label: 'LinkedIn', href: 'https://www.linkedin.com', meta: 'Profile' },
30
+ { label: 'Email', href: 'mailto:avery@example.com', meta: 'Direct contact' },
31
+ ],
32
+ highlights: [
33
+ { label: 'Talks', value: '48', detail: 'Keynotes, workshops, and internal launch reviews.' },
34
+ { label: 'Audience', value: '120K', detail: 'Cross-platform following and community reach.' },
35
+ { label: 'Specialty', value: 'Narrative systems', detail: 'Messaging, visual rhythm, and reusable deck patterns.' },
36
+ ],
37
+ },
38
+ }
39
+
40
+ export default meta
41
+
42
+ export const Default = {
43
+ parameters: {
44
+ scenePreviewAspectRatio: '9:16',
45
+ },
46
+ }
@@ -0,0 +1,302 @@
1
+ import { VideoComponent, defineScenePluginMetadata } from '@vibecuting/component-project-helper'
2
+
3
+ import { defineSceneComponent } from '../../../../plugins/scene-component'
4
+ import { SceneMotionLayer, useRemotionSceneRuntime } from '../../../../base'
5
+ import type { DefaultSceneProps } from '../../../../scenes/default-scene-props'
6
+ import { SlideFrame, getOverflowSafeSlideGridLayout, getSlideTypographyScale } from '../_shared'
7
+ import type { DefaultPersonIntroSlideProps, PersonIntroHighlight, PersonIntroLink } from './default-person-intro-slide'
8
+ import { personIntroPropsSchema } from './default-person-intro-slide'
9
+
10
+ export const componentMetadata = defineScenePluginMetadata({
11
+ resourceKind: 'scene',
12
+ name: 'DefaultPersonIntroSlideHorizontal',
13
+ description: 'Profile-first person introduction slide (Portrait 9:16 variant)',
14
+ sourceFile: 'src/core/scene/slide/person-intro/default-person-intro-slide-Horizontal.tsx',
15
+ pluginKey: 'core.slide.person-intro',
16
+ tags: ['scene', 'slide', 'person', 'profile', 'intro', 'horizontal'],
17
+ aspectRatio: '9:16',
18
+ sceneType: 'scene',
19
+ sceneFamily: 'slide',
20
+ rootLayout: 'absolute-fill',
21
+ propsTypeName: 'DefaultPersonIntroSlideProps',
22
+ })
23
+
24
+ function PersonIntroAvatarFallback({ name }: { name: string }) {
25
+ const initials = name
26
+ .split(/\s+/)
27
+ .filter(Boolean)
28
+ .slice(0, 2)
29
+ .map((part) => part[0] ?? '')
30
+ .join('')
31
+ .toUpperCase() || 'P'
32
+
33
+ return (
34
+ <div
35
+ style={{
36
+ width: '100%',
37
+ height: '100%',
38
+ display: 'grid',
39
+ placeItems: 'center',
40
+ background: 'linear-gradient(135deg, rgba(56,189,248,0.3), rgba(34,197,94,0.12))',
41
+ color: '#f8fafc',
42
+ fontSize: 'clamp(28px, 7vw, 48px)',
43
+ fontWeight: 800,
44
+ letterSpacing: '-0.06em',
45
+ }}
46
+ >
47
+ {initials}
48
+ </div>
49
+ )
50
+ }
51
+
52
+ function PersonIntroLinkChip({ link }: { link: PersonIntroLink }) {
53
+ const content = (
54
+ <div
55
+ style={{
56
+ width: '100%',
57
+ minWidth: 0,
58
+ padding: '12px 14px',
59
+ display: 'grid',
60
+ gap: 4,
61
+ border: '1px solid rgba(148,163,184,0.18)',
62
+ background: 'rgba(15,23,42,0.64)',
63
+ color: '#e2e8f0',
64
+ overflow: 'hidden',
65
+ }}
66
+ >
67
+ <div style={{ fontSize: 13, fontWeight: 700, lineHeight: 1.2, overflow: 'hidden', textOverflow: 'ellipsis', whiteSpace: 'nowrap' }}>{link.label}</div>
68
+ {link.meta ? (
69
+ <div style={{ fontSize: 11, lineHeight: 1.2, letterSpacing: '0.04em', textTransform: 'uppercase', color: 'rgba(148,163,184,0.92)', overflow: 'hidden', textOverflow: 'ellipsis', whiteSpace: 'nowrap' }}>
70
+ {link.meta}
71
+ </div>
72
+ ) : null}
73
+ </div>
74
+ )
75
+
76
+ if (!link.href) {
77
+ return content
78
+ }
79
+
80
+ return (
81
+ <a href={link.href} target="_blank" rel="noreferrer noopener" style={{ display: 'block', textDecoration: 'none', minWidth: 0 }}>
82
+ {content}
83
+ </a>
84
+ )
85
+ }
86
+
87
+ function PersonIntroHighlightCard({ highlight }: { highlight: PersonIntroHighlight }) {
88
+ return (
89
+ <article
90
+ style={{
91
+ minHeight: 0,
92
+ padding: '14px',
93
+ display: 'grid',
94
+ gap: 6,
95
+ background: 'rgba(15,23,42,0.64)',
96
+ border: '1px solid rgba(148,163,184,0.16)',
97
+ color: '#e2e8f0',
98
+ overflow: 'hidden',
99
+ }}
100
+ >
101
+ <div style={{ fontSize: 11, letterSpacing: '0.18em', textTransform: 'uppercase', color: 'rgba(148,163,184,0.9)' }}>{highlight.label}</div>
102
+ {highlight.value ? <div style={{ fontSize: 'clamp(18px, 4.8vw, 28px)', fontWeight: 800, lineHeight: 1.05, letterSpacing: '-0.05em' }}>{highlight.value}</div> : null}
103
+ {highlight.detail ? (
104
+ <div
105
+ style={{
106
+ fontSize: 13,
107
+ lineHeight: 1.45,
108
+ color: 'rgba(226,232,240,0.78)',
109
+ display: '-webkit-box',
110
+ WebkitBoxOrient: 'vertical',
111
+ WebkitLineClamp: 3,
112
+ overflow: 'hidden',
113
+ }}
114
+ >
115
+ {highlight.detail}
116
+ </div>
117
+ ) : null}
118
+ </article>
119
+ )
120
+ }
121
+
122
+ export const DefaultPersonIntroSlideHorizontal = VideoComponent(componentMetadata)(
123
+ defineSceneComponent({
124
+ family: 'slide',
125
+ propsSchema: personIntroPropsSchema,
126
+ component: function DefaultPersonIntroSlideHorizontal({
127
+ sceneId,
128
+ sceneName,
129
+ name,
130
+ role,
131
+ bio,
132
+ avatar,
133
+ links = [],
134
+ highlights = [],
135
+ }: DefaultPersonIntroSlideProps & DefaultSceneProps) {
136
+ const runtime = useRemotionSceneRuntime()
137
+ const scale = getSlideTypographyScale(runtime.height)
138
+ const linkGrid = getOverflowSafeSlideGridLayout(links.length || 1, 2, {
139
+ runtimeWidth: runtime.width,
140
+ reservedWidth: 48,
141
+ runtimeHeight: runtime.height,
142
+ reservedHeight: 440,
143
+ minCardWidth: 128,
144
+ minCardHeight: 48,
145
+ })
146
+ const highlightGrid = getOverflowSafeSlideGridLayout(highlights.length || 1, 2, {
147
+ runtimeWidth: runtime.width,
148
+ reservedWidth: 48,
149
+ runtimeHeight: runtime.height,
150
+ reservedHeight: 360,
151
+ minCardWidth: 140,
152
+ minCardHeight: 92,
153
+ })
154
+ const avatarSize = Math.max(104, Math.round(runtime.width * 0.34))
155
+
156
+ return (
157
+ <SlideFrame
158
+ pluginKey={componentMetadata.pluginKey}
159
+ sceneId={sceneId}
160
+ sceneName={sceneName ?? name}
161
+ background="linear-gradient(180deg, #020617 0%, #0f172a 48%, #111827 100%)"
162
+ >
163
+ <section
164
+ style={{
165
+ width: '100%',
166
+ height: '100%',
167
+ display: 'grid',
168
+ gridTemplateRows: 'auto auto auto auto',
169
+ gap: 14,
170
+ padding: '34px 20px',
171
+ color: '#e2e8f0',
172
+ alignContent: 'start',
173
+ }}
174
+ >
175
+ <SceneMotionLayer variant="panel">
176
+ <article
177
+ style={{
178
+ padding: 16,
179
+ display: 'grid',
180
+ gap: 14,
181
+ background: 'rgba(15,23,42,0.58)',
182
+ border: '1px solid rgba(148,163,184,0.18)',
183
+ overflow: 'hidden',
184
+ }}
185
+ >
186
+ <div style={{ display: 'grid', justifyItems: 'center', gap: 12, minWidth: 0 }}>
187
+ <div
188
+ style={{
189
+ width: avatarSize,
190
+ height: avatarSize,
191
+ overflow: 'hidden',
192
+ borderRadius: 0,
193
+ background: 'rgba(15,23,42,0.92)',
194
+ border: '1px solid rgba(148,163,184,0.24)',
195
+ }}
196
+ >
197
+ {avatar ?? <PersonIntroAvatarFallback name={name} />}
198
+ </div>
199
+
200
+ <div style={{ minWidth: 0, textAlign: 'center', display: 'grid', gap: 6 }}>
201
+ <div style={{ fontSize: scale.eyebrow, letterSpacing: '0.18em', textTransform: 'uppercase', color: 'rgba(148,163,184,0.9)' }}>Profile</div>
202
+ <h1 style={{ margin: 0, fontSize: Math.max(scale.title * 0.84, 34), lineHeight: 0.95, letterSpacing: '-0.06em' }}>{name}</h1>
203
+ {role ? (
204
+ <div
205
+ style={{
206
+ fontSize: scale.body * 0.92,
207
+ lineHeight: 1.35,
208
+ color: 'rgba(226,232,240,0.86)',
209
+ display: '-webkit-box',
210
+ WebkitBoxOrient: 'vertical',
211
+ WebkitLineClamp: 2,
212
+ overflow: 'hidden',
213
+ }}
214
+ >
215
+ {role}
216
+ </div>
217
+ ) : null}
218
+ </div>
219
+ </div>
220
+
221
+ {bio ? (
222
+ <div
223
+ style={{
224
+ fontSize: scale.body * 0.86,
225
+ lineHeight: 1.5,
226
+ color: 'rgba(226,232,240,0.78)',
227
+ display: '-webkit-box',
228
+ WebkitBoxOrient: 'vertical',
229
+ WebkitLineClamp: 4,
230
+ overflow: 'hidden',
231
+ }}
232
+ >
233
+ {bio}
234
+ </div>
235
+ ) : null}
236
+ </article>
237
+ </SceneMotionLayer>
238
+
239
+ {links.length ? (
240
+ <SceneMotionLayer variant="hero-copy" delayIndex={1}>
241
+ <article
242
+ style={{
243
+ padding: 14,
244
+ background: 'rgba(2,6,23,0.46)',
245
+ border: '1px solid rgba(148,163,184,0.16)',
246
+ display: 'grid',
247
+ gap: 12,
248
+ overflow: 'hidden',
249
+ }}
250
+ >
251
+ <div style={{ fontSize: scale.eyebrow, letterSpacing: '0.16em', textTransform: 'uppercase', color: 'rgba(148,163,184,0.84)' }}>Links</div>
252
+ <div
253
+ style={{
254
+ display: 'grid',
255
+ gridTemplateColumns: `repeat(${Math.max(1, linkGrid.columns)}, minmax(0, 1fr))`,
256
+ gap: 10,
257
+ }}
258
+ >
259
+ {links.slice(0, 5).map((link) => (
260
+ <PersonIntroLinkChip key={`${link.label}-${link.href ?? link.meta ?? ''}`} link={link} />
261
+ ))}
262
+ </div>
263
+ </article>
264
+ </SceneMotionLayer>
265
+ ) : null}
266
+
267
+ <SceneMotionLayer variant="card" delayIndex={2}>
268
+ <article
269
+ style={{
270
+ padding: 14,
271
+ background: 'rgba(2,6,23,0.46)',
272
+ border: '1px solid rgba(148,163,184,0.16)',
273
+ display: 'grid',
274
+ gap: 12,
275
+ overflow: 'hidden',
276
+ }}
277
+ >
278
+ <div style={{ display: 'flex', alignItems: 'baseline', justifyContent: 'space-between', gap: 12 }}>
279
+ <div style={{ fontSize: scale.eyebrow, letterSpacing: '0.16em', textTransform: 'uppercase', color: 'rgba(148,163,184,0.84)' }}>Highlights</div>
280
+ <div style={{ fontSize: scale.caption, color: 'rgba(148,163,184,0.72)' }}>{Math.min(highlights.length, 5)} items</div>
281
+ </div>
282
+ <div
283
+ style={{
284
+ display: 'grid',
285
+ gridTemplateColumns: `repeat(${Math.max(1, highlightGrid.columns)}, minmax(0, 1fr))`,
286
+ gap: highlightGrid.gap,
287
+ }}
288
+ >
289
+ {(highlights.length ? highlights : [{ label: 'Focus', value: 'Native portrait', detail: 'A vertical layout that gives the avatar, identity, and proof points room to breathe.' }]).slice(0, 5).map((highlight, index) => (
290
+ <SceneMotionLayer key={`${highlight.label}-${index}`} variant="card" delayIndex={index + 3}>
291
+ <PersonIntroHighlightCard highlight={highlight} />
292
+ </SceneMotionLayer>
293
+ ))}
294
+ </div>
295
+ </article>
296
+ </SceneMotionLayer>
297
+ </section>
298
+ </SlideFrame>
299
+ )
300
+ },
301
+ }),
302
+ )
@@ -0,0 +1,20 @@
1
+ import type { ComponentProps } from 'react'
2
+
3
+ import { VideoComponent, type ScenePluginMetadata } from '@vibecuting/component-project-helper'
4
+
5
+ import { DefaultPersonIntroSlide, componentMetadata as baseComponentMetadata } from './default-person-intro-slide'
6
+
7
+ export const componentMetadata: ScenePluginMetadata = {
8
+ ...baseComponentMetadata,
9
+ name: 'DefaultPersonIntroSlideLandscape',
10
+ description: 'Profile-first person introduction slide (16:9 landscape variant)',
11
+ sourceFile: 'src/core/scene/slide/person-intro/default-person-intro-slide-Landscape.tsx',
12
+ aspectRatio: '16:9',
13
+ tags: Array.from(new Set([...(baseComponentMetadata.tags ?? []), 'landscape'])),
14
+ }
15
+
16
+ export const DefaultPersonIntroSlideLandscape = VideoComponent(componentMetadata)(function DefaultPersonIntroSlideLandscape(
17
+ props: ComponentProps<typeof DefaultPersonIntroSlide>,
18
+ ) {
19
+ return <DefaultPersonIntroSlide {...props} />
20
+ })
@@ -0,0 +1,126 @@
1
+ import { DefaultPersonIntroSlide } from './default-person-intro-slide'
2
+ import { DefaultPersonIntroGroupSlide } from './default-person-intro-group-slide'
3
+
4
+ const meta = {
5
+ title: 'core/scene/slide/person-intro/DefaultPersonIntroSlide/Animated',
6
+ component: DefaultPersonIntroSlide,
7
+ args: {
8
+ name: 'Avery Chen',
9
+ role: 'Creative Director, Product Storytelling',
10
+ bio: 'Designs presentation systems that turn product updates, launches, and leadership narratives into concise visual stories.',
11
+ avatar: (
12
+ <div
13
+ style={{
14
+ width: '100%',
15
+ height: '100%',
16
+ display: 'grid',
17
+ placeItems: 'center',
18
+ background: 'linear-gradient(135deg, #38bdf8 0%, #2563eb 100%)',
19
+ color: '#f8fafc',
20
+ fontSize: 42,
21
+ fontWeight: 800,
22
+ letterSpacing: '-0.06em',
23
+ }}
24
+ >
25
+ AC
26
+ </div>
27
+ ),
28
+ links: [
29
+ { label: 'Website', href: 'https://example.com', meta: 'averychen.dev' },
30
+ { label: 'LinkedIn', href: 'https://www.linkedin.com', meta: 'Profile' },
31
+ { label: 'Email', href: 'mailto:avery@example.com', meta: 'Direct contact' },
32
+ ],
33
+ highlights: [
34
+ { label: 'Talks', value: '48', detail: 'Keynotes, workshops, and internal launch reviews.' },
35
+ { label: 'Audience', value: '120K', detail: 'Cross-platform following and community reach.' },
36
+ { label: 'Specialty', value: 'Narrative systems', detail: 'Messaging, visual rhythm, and reusable deck patterns.' },
37
+ ],
38
+ },
39
+ }
40
+
41
+ export default meta
42
+
43
+ export const Animated = {
44
+ parameters: {
45
+ scenePreviewMode: 'animation',
46
+ scenePreviewAspectRatio: '16:9',
47
+ },
48
+ }
49
+
50
+ export const Duo = {
51
+ render: () => (
52
+ <DefaultPersonIntroGroupSlide
53
+ title="Two voices, one team"
54
+ subtitle="Animated two-person intro."
55
+ people={[
56
+ { name: 'Avery Chen', role: 'Creative Director, Product Storytelling', bio: 'Shapes presentation systems and launch narratives.' },
57
+ { name: 'Jordan Lee', role: 'Design Systems Lead', bio: 'Builds reusable patterns and production-ready slide structures.' },
58
+ ]}
59
+ />
60
+ ),
61
+ parameters: {
62
+ scenePreviewMode: 'animation',
63
+ scenePreviewAspectRatio: '16:9',
64
+ },
65
+ }
66
+
67
+ export const Trio = {
68
+ render: () => (
69
+ <DefaultPersonIntroGroupSlide
70
+ title="Three people, one message"
71
+ subtitle="Animated three-person intro."
72
+ people={[
73
+ { name: 'Avery Chen', role: 'Creative Director', bio: 'Narrative systems and launch content.' },
74
+ { name: 'Jordan Lee', role: 'Design Systems Lead', bio: 'Design tokens and component patterns.' },
75
+ { name: 'Maya Patel', role: 'Motion Director', bio: 'Motion language and polished transitions.' },
76
+ ]}
77
+ />
78
+ ),
79
+ parameters: {
80
+ scenePreviewMode: 'animation',
81
+ scenePreviewAspectRatio: '16:9',
82
+ },
83
+ }
84
+
85
+ export const Quad = {
86
+ render: () => (
87
+ <DefaultPersonIntroGroupSlide
88
+ title="Four-person panel"
89
+ subtitle="Animated four-person intro."
90
+ people={[
91
+ { name: 'Avery Chen', role: 'Creative Director', bio: 'Narrative systems and launch content.' },
92
+ { name: 'Jordan Lee', role: 'Design Systems Lead', bio: 'Design tokens and component patterns.' },
93
+ { name: 'Maya Patel', role: 'Motion Director', bio: 'Motion language and polished transitions.' },
94
+ { name: 'Noah Kim', role: 'Product Manager', bio: 'Roadmaps, positioning, and stakeholder alignment.' },
95
+ ]}
96
+ />
97
+ ),
98
+ parameters: {
99
+ scenePreviewMode: 'animation',
100
+ scenePreviewAspectRatio: '16:9',
101
+ },
102
+ }
103
+
104
+ export const DuoPortrait = {
105
+ render: Duo.render,
106
+ parameters: {
107
+ scenePreviewMode: 'animation',
108
+ scenePreviewAspectRatio: '9:16',
109
+ },
110
+ }
111
+
112
+ export const TrioPortrait = {
113
+ render: Trio.render,
114
+ parameters: {
115
+ scenePreviewMode: 'animation',
116
+ scenePreviewAspectRatio: '9:16',
117
+ },
118
+ }
119
+
120
+ export const QuadPortrait = {
121
+ render: Quad.render,
122
+ parameters: {
123
+ scenePreviewMode: 'animation',
124
+ scenePreviewAspectRatio: '9:16',
125
+ },
126
+ }
@@ -0,0 +1,119 @@
1
+ import { DefaultPersonIntroSlide } from './default-person-intro-slide'
2
+ import { DefaultPersonIntroGroupSlide } from './default-person-intro-group-slide'
3
+
4
+ const meta = {
5
+ title: 'core/scene/slide/person-intro/DefaultPersonIntroSlide',
6
+ component: DefaultPersonIntroSlide,
7
+ args: {
8
+ name: 'Avery Chen',
9
+ role: 'Creative Director, Product Storytelling',
10
+ bio: 'Designs presentation systems that turn product updates, launches, and leadership narratives into concise visual stories.',
11
+ avatar: (
12
+ <div
13
+ style={{
14
+ width: '100%',
15
+ height: '100%',
16
+ display: 'grid',
17
+ placeItems: 'center',
18
+ background: 'linear-gradient(135deg, #38bdf8 0%, #2563eb 100%)',
19
+ color: '#f8fafc',
20
+ fontSize: 42,
21
+ fontWeight: 800,
22
+ letterSpacing: '-0.06em',
23
+ }}
24
+ >
25
+ AC
26
+ </div>
27
+ ),
28
+ links: [
29
+ { label: 'Website', href: 'https://example.com', meta: 'averychen.dev' },
30
+ { label: 'LinkedIn', href: 'https://www.linkedin.com', meta: 'Profile' },
31
+ { label: 'Email', href: 'mailto:avery@example.com', meta: 'Direct contact' },
32
+ ],
33
+ highlights: [
34
+ { label: 'Talks', value: '48', detail: 'Keynotes, workshops, and internal launch reviews.' },
35
+ { label: 'Audience', value: '120K', detail: 'Cross-platform following and community reach.' },
36
+ { label: 'Specialty', value: 'Narrative systems', detail: 'Messaging, visual rhythm, and reusable deck patterns.' },
37
+ ],
38
+ },
39
+ }
40
+
41
+ export default meta
42
+
43
+ export const Default = {
44
+ parameters: {
45
+ scenePreviewAspectRatio: '16:9',
46
+ },
47
+ }
48
+
49
+ export const Duo = {
50
+ render: () => (
51
+ <DefaultPersonIntroGroupSlide
52
+ title="Two voices, one team"
53
+ subtitle="Use this template for co-founders, hosts, collaborators, or paired introductions."
54
+ people={[
55
+ { name: 'Avery Chen', role: 'Creative Director, Product Storytelling', bio: 'Shapes presentation systems and launch narratives.' },
56
+ { name: 'Jordan Lee', role: 'Design Systems Lead', bio: 'Builds reusable patterns and production-ready slide structures.' },
57
+ ]}
58
+ />
59
+ ),
60
+ parameters: {
61
+ scenePreviewAspectRatio: '16:9',
62
+ },
63
+ }
64
+
65
+ export const Trio = {
66
+ render: () => (
67
+ <DefaultPersonIntroGroupSlide
68
+ title="Three people, one message"
69
+ subtitle="A three-person intro card for small teams or panelist highlights."
70
+ people={[
71
+ { name: 'Avery Chen', role: 'Creative Director', bio: 'Narrative systems and launch content.' },
72
+ { name: 'Jordan Lee', role: 'Design Systems Lead', bio: 'Design tokens and component patterns.' },
73
+ { name: 'Maya Patel', role: 'Motion Director', bio: 'Motion language and polished transitions.' },
74
+ ]}
75
+ />
76
+ ),
77
+ parameters: {
78
+ scenePreviewAspectRatio: '16:9',
79
+ },
80
+ }
81
+
82
+ export const Quad = {
83
+ render: () => (
84
+ <DefaultPersonIntroGroupSlide
85
+ title="Four-person panel"
86
+ subtitle="A larger roster layout for leadership teams or interview panels."
87
+ people={[
88
+ { name: 'Avery Chen', role: 'Creative Director', bio: 'Narrative systems and launch content.' },
89
+ { name: 'Jordan Lee', role: 'Design Systems Lead', bio: 'Design tokens and component patterns.' },
90
+ { name: 'Maya Patel', role: 'Motion Director', bio: 'Motion language and polished transitions.' },
91
+ { name: 'Noah Kim', role: 'Product Manager', bio: 'Roadmaps, positioning, and stakeholder alignment.' },
92
+ ]}
93
+ />
94
+ ),
95
+ parameters: {
96
+ scenePreviewAspectRatio: '16:9',
97
+ },
98
+ }
99
+
100
+ export const DuoPortrait = {
101
+ render: Duo.render,
102
+ parameters: {
103
+ scenePreviewAspectRatio: '9:16',
104
+ },
105
+ }
106
+
107
+ export const TrioPortrait = {
108
+ render: Trio.render,
109
+ parameters: {
110
+ scenePreviewAspectRatio: '9:16',
111
+ },
112
+ }
113
+
114
+ export const QuadPortrait = {
115
+ render: Quad.render,
116
+ parameters: {
117
+ scenePreviewAspectRatio: '9:16',
118
+ },
119
+ }