@vibecuting/video-project-core 0.1.26 → 0.1.27

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 (213) hide show
  1. package/package.json +4 -4
  2. package/src/core/intro/_shared/intro-layout.test.ts +18 -0
  3. package/src/core/intro/_shared/intro-layout.ts +50 -0
  4. package/src/core/intro/cyberpunk-intro-holo/default-cyberpunk-intro-bumper-Horizontal.tsx +25 -0
  5. package/src/core/intro/cyberpunk-intro-holo/default-cyberpunk-intro-bumper-Landscape.tsx +25 -0
  6. package/src/core/intro/cyberpunk-intro-holo/default-cyberpunk-intro-bumper.stories.tsx +31 -0
  7. package/src/core/intro/cyberpunk-intro-holo/default-cyberpunk-intro-bumper.tsx +118 -0
  8. package/src/core/intro/cyberpunk-intro-holo/index.ts +11 -0
  9. package/src/core/intro/cyberpunk-intro-neon/default-cyberpunk-intro-bumper-Horizontal.tsx +24 -0
  10. package/src/core/intro/cyberpunk-intro-neon/default-cyberpunk-intro-bumper-Landscape.tsx +24 -0
  11. package/src/core/intro/cyberpunk-intro-neon/default-cyberpunk-intro-bumper.stories.tsx +30 -0
  12. package/src/core/intro/cyberpunk-intro-neon/default-cyberpunk-intro-bumper.tsx +108 -0
  13. package/src/core/intro/cyberpunk-intro-neon/index.ts +10 -0
  14. package/src/core/intro/default-cinematic-intro-bumper/default-cinematic-intro-bumper-Horizontal.tsx +24 -0
  15. package/src/core/intro/default-cinematic-intro-bumper/default-cinematic-intro-bumper-Landscape.tsx +24 -0
  16. package/src/core/intro/default-cinematic-intro-bumper/default-cinematic-intro-bumper.stories.tsx +29 -0
  17. package/src/core/intro/default-cinematic-intro-bumper/default-cinematic-intro-bumper.tsx +234 -0
  18. package/src/core/intro/default-cinematic-intro-bumper/index.ts +11 -0
  19. package/src/core/intro/default-festival-intro-bumper/default-festival-intro-bumper-Horizontal.tsx +24 -0
  20. package/src/core/intro/default-festival-intro-bumper/default-festival-intro-bumper-Landscape.tsx +24 -0
  21. package/src/core/intro/default-festival-intro-bumper/default-festival-intro-bumper.stories.tsx +29 -0
  22. package/src/core/intro/default-festival-intro-bumper/default-festival-intro-bumper.tsx +187 -0
  23. package/src/core/intro/default-festival-intro-bumper/index.ts +11 -0
  24. package/src/core/intro/default-intro-bumper/default-intro-bumper-Horizontal.tsx +24 -0
  25. package/src/core/intro/default-intro-bumper/default-intro-bumper-Landscape.tsx +24 -0
  26. package/src/core/intro/default-intro-bumper/default-intro-bumper.stories.tsx +41 -0
  27. package/src/core/intro/default-intro-bumper/default-intro-bumper.tsx +256 -0
  28. package/src/core/intro/default-intro-bumper/index.ts +11 -0
  29. package/src/core/intro/default-noir-intro-bumper/default-noir-intro-bumper-Horizontal.tsx +24 -0
  30. package/src/core/intro/default-noir-intro-bumper/default-noir-intro-bumper-Landscape.tsx +24 -0
  31. package/src/core/intro/default-noir-intro-bumper/default-noir-intro-bumper.stories.tsx +29 -0
  32. package/src/core/intro/default-noir-intro-bumper/default-noir-intro-bumper.tsx +122 -0
  33. package/src/core/intro/default-noir-intro-bumper/index.ts +11 -0
  34. package/src/core/intro/default-trailer-intro-bumper/default-trailer-intro-bumper-Horizontal.tsx +24 -0
  35. package/src/core/intro/default-trailer-intro-bumper/default-trailer-intro-bumper-Landscape.tsx +24 -0
  36. package/src/core/intro/default-trailer-intro-bumper/default-trailer-intro-bumper.stories.tsx +29 -0
  37. package/src/core/intro/default-trailer-intro-bumper/default-trailer-intro-bumper.tsx +181 -0
  38. package/src/core/intro/default-trailer-intro-bumper/index.ts +11 -0
  39. package/src/core/intro/documentary-intro-observation/default-documentary-intro-bumper-Horizontal.tsx +18 -0
  40. package/src/core/intro/documentary-intro-observation/default-documentary-intro-bumper-Landscape.tsx +18 -0
  41. package/src/core/intro/documentary-intro-observation/default-documentary-intro-bumper.stories.tsx +31 -0
  42. package/src/core/intro/documentary-intro-observation/default-documentary-intro-bumper.tsx +158 -0
  43. package/src/core/intro/documentary-intro-observation/index.ts +10 -0
  44. package/src/core/intro/family-intro-reunion/default-family-intro-bumper-Horizontal.tsx +18 -0
  45. package/src/core/intro/family-intro-reunion/default-family-intro-bumper-Landscape.tsx +18 -0
  46. package/src/core/intro/family-intro-reunion/default-family-intro-bumper.stories.tsx +43 -0
  47. package/src/core/intro/family-intro-reunion/default-family-intro-bumper.tsx +165 -0
  48. package/src/core/intro/family-intro-reunion/index.ts +10 -0
  49. package/src/core/intro/festival-intro-spotlight/default-festival-intro-bumper-Horizontal.tsx +1 -0
  50. package/src/core/intro/festival-intro-spotlight/default-festival-intro-bumper-Landscape.tsx +1 -0
  51. package/src/core/intro/festival-intro-spotlight/default-festival-intro-bumper.stories.tsx +30 -0
  52. package/src/core/intro/festival-intro-spotlight/default-festival-intro-bumper.tsx +105 -0
  53. package/src/core/intro/festival-intro-spotlight/index.ts +10 -0
  54. package/src/core/intro/index.test.ts +45 -0
  55. package/src/core/intro/index.ts +17 -0
  56. package/src/core/intro/noir-intro-city/default-noir-intro-bumper-Horizontal.tsx +24 -0
  57. package/src/core/intro/noir-intro-city/default-noir-intro-bumper-Landscape.tsx +24 -0
  58. package/src/core/intro/noir-intro-city/default-noir-intro-bumper.stories.tsx +31 -0
  59. package/src/core/intro/noir-intro-city/default-noir-intro-bumper.tsx +96 -0
  60. package/src/core/intro/noir-intro-city/index.ts +10 -0
  61. package/src/core/intro/noir-intro-deluxe/default-noir-intro-bumper-Horizontal.tsx +1 -0
  62. package/src/core/intro/noir-intro-deluxe/default-noir-intro-bumper-Landscape.tsx +1 -0
  63. package/src/core/intro/noir-intro-deluxe/default-noir-intro-bumper.stories.tsx +31 -0
  64. package/src/core/intro/noir-intro-deluxe/default-noir-intro-bumper.tsx +117 -0
  65. package/src/core/intro/noir-intro-deluxe/index.ts +10 -0
  66. package/src/core/intro/sci-fi-intro/default-sci-fi-intro-bumper-Horizontal.tsx +1 -0
  67. package/src/core/intro/sci-fi-intro/default-sci-fi-intro-bumper-Landscape.tsx +1 -0
  68. package/src/core/intro/sci-fi-intro/default-sci-fi-intro-bumper.stories.tsx +48 -0
  69. package/src/core/intro/sci-fi-intro/default-sci-fi-intro-bumper.tsx +105 -0
  70. package/src/core/intro/sci-fi-intro/index.ts +10 -0
  71. package/src/core/intro/thriller-intro-suspense/default-thriller-intro-bumper-Horizontal.tsx +18 -0
  72. package/src/core/intro/thriller-intro-suspense/default-thriller-intro-bumper-Landscape.tsx +18 -0
  73. package/src/core/intro/thriller-intro-suspense/default-thriller-intro-bumper.stories.tsx +31 -0
  74. package/src/core/intro/thriller-intro-suspense/default-thriller-intro-bumper.tsx +155 -0
  75. package/src/core/intro/thriller-intro-suspense/index.ts +10 -0
  76. package/src/core/intro/trailer-intro-premiere/default-trailer-intro-bumper-Horizontal.tsx +1 -0
  77. package/src/core/intro/trailer-intro-premiere/default-trailer-intro-bumper-Landscape.tsx +1 -0
  78. package/src/core/intro/trailer-intro-premiere/default-trailer-intro-bumper.stories.tsx +30 -0
  79. package/src/core/intro/trailer-intro-premiere/default-trailer-intro-bumper.tsx +104 -0
  80. package/src/core/intro/trailer-intro-premiere/index.ts +10 -0
  81. package/src/core/intro/travel-intro-journey/default-travel-intro-bumper-Horizontal.tsx +18 -0
  82. package/src/core/intro/travel-intro-journey/default-travel-intro-bumper-Landscape.tsx +18 -0
  83. package/src/core/intro/travel-intro-journey/default-travel-intro-bumper.stories.tsx +43 -0
  84. package/src/core/intro/travel-intro-journey/default-travel-intro-bumper.tsx +158 -0
  85. package/src/core/intro/travel-intro-journey/index.ts +10 -0
  86. package/src/core/intro/western-intro/default-western-intro-bumper-Horizontal.tsx +24 -0
  87. package/src/core/intro/western-intro/default-western-intro-bumper-Landscape.tsx +24 -0
  88. package/src/core/intro/western-intro/default-western-intro-bumper.stories.tsx +29 -0
  89. package/src/core/intro/western-intro/default-western-intro-bumper.tsx +146 -0
  90. package/src/core/intro/western-intro/index.ts +4 -0
  91. package/src/core/intro/western-intro-gangster/default-western-intro-bumper-Horizontal.tsx +25 -0
  92. package/src/core/intro/western-intro-gangster/default-western-intro-bumper-Landscape.tsx +25 -0
  93. package/src/core/intro/western-intro-gangster/default-western-intro-bumper.stories.tsx +31 -0
  94. package/src/core/intro/western-intro-gangster/default-western-intro-bumper.tsx +105 -0
  95. package/src/core/intro/western-intro-gangster/index.ts +11 -0
  96. package/src/core/outro/_shared/outro-layout.test.ts +32 -0
  97. package/src/core/outro/_shared/outro-layout.ts +72 -0
  98. package/src/core/outro/award-outro-celebration/default-award-outro-bumper-Horizontal.tsx +18 -0
  99. package/src/core/outro/award-outro-celebration/default-award-outro-bumper-Landscape.tsx +18 -0
  100. package/src/core/outro/award-outro-celebration/default-award-outro-bumper.stories.tsx +42 -0
  101. package/src/core/outro/award-outro-celebration/default-award-outro-bumper.tsx +152 -0
  102. package/src/core/outro/award-outro-celebration/index.ts +10 -0
  103. package/src/core/outro/blackout-outro-finale/default-blackout-outro-bumper-Horizontal.tsx +1 -0
  104. package/src/core/outro/blackout-outro-finale/default-blackout-outro-bumper-Landscape.tsx +1 -0
  105. package/src/core/outro/blackout-outro-finale/default-blackout-outro-bumper.stories.tsx +28 -0
  106. package/src/core/outro/blackout-outro-finale/default-blackout-outro-bumper.tsx +71 -0
  107. package/src/core/outro/blackout-outro-finale/index.ts +10 -0
  108. package/src/core/outro/credits-roll-outro-epic/default-credits-roll-outro-Horizontal.tsx +24 -0
  109. package/src/core/outro/credits-roll-outro-epic/default-credits-roll-outro-Landscape.tsx +24 -0
  110. package/src/core/outro/credits-roll-outro-epic/default-credits-roll-outro.stories.tsx +31 -0
  111. package/src/core/outro/credits-roll-outro-epic/default-credits-roll-outro.tsx +106 -0
  112. package/src/core/outro/credits-roll-outro-epic/index.ts +10 -0
  113. package/src/core/outro/credits-roll-outro-premium/default-credits-roll-outro-Horizontal.tsx +1 -0
  114. package/src/core/outro/credits-roll-outro-premium/default-credits-roll-outro-Landscape.tsx +1 -0
  115. package/src/core/outro/credits-roll-outro-premium/default-credits-roll-outro.stories.tsx +30 -0
  116. package/src/core/outro/credits-roll-outro-premium/default-credits-roll-outro.tsx +88 -0
  117. package/src/core/outro/credits-roll-outro-premium/index.ts +10 -0
  118. package/src/core/outro/credits-roll-outro-royal/default-credits-roll-outro-Horizontal.tsx +25 -0
  119. package/src/core/outro/credits-roll-outro-royal/default-credits-roll-outro-Landscape.tsx +25 -0
  120. package/src/core/outro/credits-roll-outro-royal/default-credits-roll-outro.stories.tsx +32 -0
  121. package/src/core/outro/credits-roll-outro-royal/default-credits-roll-outro.tsx +110 -0
  122. package/src/core/outro/credits-roll-outro-royal/index.ts +11 -0
  123. package/src/core/outro/default-blackout-outro-bumper/default-blackout-outro-bumper-Horizontal.tsx +22 -0
  124. package/src/core/outro/default-blackout-outro-bumper/default-blackout-outro-bumper-Landscape.tsx +22 -0
  125. package/src/core/outro/default-blackout-outro-bumper/default-blackout-outro-bumper.stories.tsx +48 -0
  126. package/src/core/outro/default-blackout-outro-bumper/default-blackout-outro-bumper.tsx +124 -0
  127. package/src/core/outro/default-blackout-outro-bumper/index.ts +11 -0
  128. package/src/core/outro/default-credits-roll-outro/default-credits-roll-outro-Horizontal.tsx +22 -0
  129. package/src/core/outro/default-credits-roll-outro/default-credits-roll-outro-Landscape.tsx +22 -0
  130. package/src/core/outro/default-credits-roll-outro/default-credits-roll-outro.stories.tsx +48 -0
  131. package/src/core/outro/default-credits-roll-outro/default-credits-roll-outro.tsx +208 -0
  132. package/src/core/outro/default-credits-roll-outro/index.ts +11 -0
  133. package/src/core/outro/default-epilogue-outro/default-epilogue-outro-Horizontal.tsx +22 -0
  134. package/src/core/outro/default-epilogue-outro/default-epilogue-outro-Landscape.tsx +22 -0
  135. package/src/core/outro/default-epilogue-outro/default-epilogue-outro.stories.tsx +48 -0
  136. package/src/core/outro/default-epilogue-outro/default-epilogue-outro.tsx +115 -0
  137. package/src/core/outro/default-epilogue-outro/index.ts +11 -0
  138. package/src/core/outro/default-outro-bumper/default-outro-bumper-Horizontal.tsx +22 -0
  139. package/src/core/outro/default-outro-bumper/default-outro-bumper-Landscape.tsx +22 -0
  140. package/src/core/outro/default-outro-bumper/default-outro-bumper.stories.tsx +48 -0
  141. package/src/core/outro/default-outro-bumper/default-outro-bumper.tsx +159 -0
  142. package/src/core/outro/default-outro-bumper/index.ts +11 -0
  143. package/src/core/outro/default-sunset-outro-bumper/default-sunset-outro-bumper-Horizontal.tsx +22 -0
  144. package/src/core/outro/default-sunset-outro-bumper/default-sunset-outro-bumper-Landscape.tsx +22 -0
  145. package/src/core/outro/default-sunset-outro-bumper/default-sunset-outro-bumper.stories.tsx +48 -0
  146. package/src/core/outro/default-sunset-outro-bumper/default-sunset-outro-bumper.tsx +183 -0
  147. package/src/core/outro/default-sunset-outro-bumper/index.ts +11 -0
  148. package/src/core/outro/festival-outro-encore/default-festival-outro-bumper-Horizontal.tsx +18 -0
  149. package/src/core/outro/festival-outro-encore/default-festival-outro-bumper-Landscape.tsx +18 -0
  150. package/src/core/outro/festival-outro-encore/default-festival-outro-bumper.stories.tsx +31 -0
  151. package/src/core/outro/festival-outro-encore/default-festival-outro-bumper.tsx +130 -0
  152. package/src/core/outro/festival-outro-encore/index.ts +10 -0
  153. package/src/core/outro/heist-outro/default-heist-outro-bumper-Horizontal.tsx +24 -0
  154. package/src/core/outro/heist-outro/default-heist-outro-bumper-Landscape.tsx +24 -0
  155. package/src/core/outro/heist-outro/default-heist-outro-bumper.stories.tsx +29 -0
  156. package/src/core/outro/heist-outro/default-heist-outro-bumper.tsx +160 -0
  157. package/src/core/outro/heist-outro/index.ts +4 -0
  158. package/src/core/outro/index.test.ts +88 -0
  159. package/src/core/outro/index.ts +73 -0
  160. package/src/core/outro/memoir-outro-reflection/default-memoir-outro-bumper-Horizontal.tsx +18 -0
  161. package/src/core/outro/memoir-outro-reflection/default-memoir-outro-bumper-Landscape.tsx +18 -0
  162. package/src/core/outro/memoir-outro-reflection/default-memoir-outro-bumper.stories.tsx +42 -0
  163. package/src/core/outro/memoir-outro-reflection/default-memoir-outro-bumper.tsx +158 -0
  164. package/src/core/outro/memoir-outro-reflection/index.ts +10 -0
  165. package/src/core/outro/romance-outro/default-romance-outro-bumper-Horizontal.tsx +1 -0
  166. package/src/core/outro/romance-outro/default-romance-outro-bumper-Landscape.tsx +1 -0
  167. package/src/core/outro/romance-outro/default-romance-outro-bumper.stories.tsx +48 -0
  168. package/src/core/outro/romance-outro/default-romance-outro-bumper.tsx +123 -0
  169. package/src/core/outro/romance-outro/index.ts +10 -0
  170. package/src/core/outro/sunset-outro-coda/default-sunset-outro-bumper-Horizontal.tsx +1 -0
  171. package/src/core/outro/sunset-outro-coda/default-sunset-outro-bumper-Landscape.tsx +1 -0
  172. package/src/core/outro/sunset-outro-coda/default-sunset-outro-bumper.stories.tsx +30 -0
  173. package/src/core/outro/sunset-outro-coda/default-sunset-outro-bumper.tsx +75 -0
  174. package/src/core/outro/sunset-outro-coda/index.ts +10 -0
  175. package/src/core/scene/slide/_shared/index.ts +27 -0
  176. package/src/core/scene/slide/_shared/media-templates.test.ts +47 -0
  177. package/src/core/scene/slide/_shared/media-templates.tsx +324 -0
  178. package/src/core/scene/slide/index.test.ts +28 -0
  179. package/src/core/scene/slide/index.ts +14 -0
  180. package/src/core/scene/slide/person-intro/default-person-intro-duo-slide.tsx +19 -0
  181. package/src/core/scene/slide/person-intro/default-person-intro-group-slide.tsx +168 -0
  182. package/src/core/scene/slide/person-intro/default-person-intro-quad-slide.tsx +19 -0
  183. package/src/core/scene/slide/person-intro/default-person-intro-slide-Horizontal.animated.stories.tsx +47 -0
  184. package/src/core/scene/slide/person-intro/default-person-intro-slide-Horizontal.stories.tsx +46 -0
  185. package/src/core/scene/slide/person-intro/default-person-intro-slide-Horizontal.tsx +302 -0
  186. package/src/core/scene/slide/person-intro/default-person-intro-slide-Landscape.tsx +20 -0
  187. package/src/core/scene/slide/person-intro/default-person-intro-slide.animated.stories.tsx +126 -0
  188. package/src/core/scene/slide/person-intro/default-person-intro-slide.stories.tsx +119 -0
  189. package/src/core/scene/slide/person-intro/default-person-intro-slide.tsx +363 -0
  190. package/src/core/scene/slide/person-intro/default-person-intro-trio-slide.tsx +19 -0
  191. package/src/core/scene/slide/person-intro/index.ts +8 -0
  192. package/src/core/scene/slide/photo-album/default-photo-album-multi-slide.tsx +19 -0
  193. package/src/core/scene/slide/photo-album/default-photo-album-pair-slide.tsx +19 -0
  194. package/src/core/scene/slide/photo-album/default-photo-album-single-slide.tsx +19 -0
  195. package/src/core/scene/slide/photo-album/default-photo-album-slide-Horizontal.animated.stories.tsx +26 -0
  196. package/src/core/scene/slide/photo-album/default-photo-album-slide-Horizontal.stories.tsx +25 -0
  197. package/src/core/scene/slide/photo-album/default-photo-album-slide-Horizontal.tsx +20 -0
  198. package/src/core/scene/slide/photo-album/default-photo-album-slide-Landscape.tsx +20 -0
  199. package/src/core/scene/slide/photo-album/default-photo-album-slide.animated.stories.tsx +94 -0
  200. package/src/core/scene/slide/photo-album/default-photo-album-slide.stories.tsx +87 -0
  201. package/src/core/scene/slide/photo-album/default-photo-album-slide.tsx +414 -0
  202. package/src/core/scene/slide/photo-album/index.ts +7 -0
  203. package/src/core/scene/slide/video-showcase/default-video-showcase-multi-slide.tsx +195 -0
  204. package/src/core/scene/slide/video-showcase/default-video-showcase-slide-Horizontal.tsx +212 -0
  205. package/src/core/scene/slide/video-showcase/default-video-showcase-slide-Landscape.tsx +20 -0
  206. package/src/core/scene/slide/video-showcase/default-video-showcase-slide.animated.stories.tsx +78 -0
  207. package/src/core/scene/slide/video-showcase/default-video-showcase-slide.stories.tsx +74 -0
  208. package/src/core/scene/slide/video-showcase/default-video-showcase-slide.tsx +365 -0
  209. package/src/core/scene/slide/video-showcase/index.ts +5 -0
  210. package/src/core/intro/default-intro-bumper.stories.tsx +0 -19
  211. package/src/core/intro/default-intro-bumper.tsx +0 -218
  212. package/src/core/outro/default-outro-bumper.stories.tsx +0 -19
  213. package/src/core/outro/default-outro-bumper.tsx +0 -218
@@ -0,0 +1,365 @@
1
+ import type { ReactNode } from 'react'
2
+
3
+ import { z } from 'zod'
4
+
5
+ import { VideoComponent, defineScenePluginMetadata } from '@vibecuting/component-project-helper'
6
+
7
+ import { defineSceneComponent } from '../../../../plugins/scene-component'
8
+ import { SceneMotionLayer, useRemotionSceneRuntime } from '../../../../base'
9
+ import type { DefaultSceneProps } from '../../../../scenes/default-scene-props'
10
+ import { SlideFrame, getSlideTypographyScale } from '../_shared'
11
+
12
+ export interface DefaultVideoShowcaseSlideProps extends DefaultSceneProps {
13
+ title: string
14
+ subtitle?: string
15
+ chapter?: string
16
+ runtimeLabel?: string
17
+ posterLabel?: string
18
+ posterCaption?: string
19
+ notes?: string[]
20
+ poster?: ReactNode
21
+ }
22
+
23
+ function VideoPoster({
24
+ poster,
25
+ posterLabel,
26
+ posterCaption,
27
+ runtimeLabel,
28
+ chapter,
29
+ isPortrait,
30
+ scale,
31
+ }: {
32
+ poster?: ReactNode
33
+ posterLabel?: string
34
+ posterCaption?: string
35
+ runtimeLabel?: string
36
+ chapter?: string
37
+ isPortrait: boolean
38
+ scale: ReturnType<typeof getSlideTypographyScale>
39
+ }) {
40
+ return (
41
+ <div
42
+ style={{
43
+ position: 'relative',
44
+ display: 'grid',
45
+ placeItems: 'center',
46
+ width: '100%',
47
+ minHeight: isPortrait ? 320 : 420,
48
+ aspectRatio: isPortrait ? '4 / 5' : '16 / 9',
49
+ overflow: 'hidden',
50
+ borderRadius: 0,
51
+ border: '1px solid rgba(148, 163, 184, 0.22)',
52
+ background: 'linear-gradient(135deg, rgba(15,23,42,0.96) 0%, rgba(30,41,59,0.94) 42%, rgba(37,99,235,0.7) 100%)',
53
+ boxShadow: '0 24px 60px rgba(15,23,42,0.22)',
54
+ }}
55
+ >
56
+ <div
57
+ style={{
58
+ position: 'absolute',
59
+ inset: 0,
60
+ background:
61
+ 'radial-gradient(circle at 28% 20%, rgba(96,165,250,0.32), transparent 28%), radial-gradient(circle at 82% 26%, rgba(56,189,248,0.18), transparent 26%), linear-gradient(180deg, rgba(2,6,23,0.12) 0%, rgba(2,6,23,0.7) 100%)',
62
+ }}
63
+ />
64
+ <div
65
+ style={{
66
+ position: 'absolute',
67
+ inset: 16,
68
+ border: '1px solid rgba(255,255,255,0.12)',
69
+ pointerEvents: 'none',
70
+ }}
71
+ />
72
+ <div style={{ position: 'relative', zIndex: 1, width: '100%', height: '100%', padding: isPortrait ? 18 : 22, display: 'grid', gridTemplateRows: 'auto 1fr auto', gap: 16 }}>
73
+ <div style={{ display: 'flex', alignItems: 'center', justifyContent: 'space-between', gap: 12 }}>
74
+ <div
75
+ style={{
76
+ display: 'inline-flex',
77
+ alignItems: 'center',
78
+ gap: 10,
79
+ padding: '8px 12px',
80
+ borderRadius: 0,
81
+ border: '1px solid rgba(255,255,255,0.16)',
82
+ background: 'rgba(15,23,42,0.46)',
83
+ color: '#f8fafc',
84
+ fontSize: scale.caption,
85
+ letterSpacing: '0.16em',
86
+ textTransform: 'uppercase',
87
+ }}
88
+ >
89
+ <span style={{ width: 8, height: 8, background: '#38bdf8', display: 'inline-block' }} />
90
+ {posterLabel ?? 'Poster'}
91
+ </div>
92
+ {runtimeLabel ? (
93
+ <div
94
+ style={{
95
+ display: 'inline-flex',
96
+ alignItems: 'center',
97
+ padding: '8px 12px',
98
+ borderRadius: 0,
99
+ border: '1px solid rgba(255,255,255,0.16)',
100
+ background: 'rgba(2,6,23,0.5)',
101
+ color: '#e2e8f0',
102
+ fontSize: scale.caption,
103
+ fontWeight: 600,
104
+ }}
105
+ >
106
+ {runtimeLabel}
107
+ </div>
108
+ ) : null}
109
+ </div>
110
+
111
+ <div style={{ display: 'grid', placeItems: 'center', minHeight: 0 }}>
112
+ {poster ?? (
113
+ <div style={{ display: 'grid', placeItems: 'center', gap: 14, textAlign: 'center', color: '#e2e8f0' }}>
114
+ <div
115
+ style={{
116
+ width: isPortrait ? 84 : 96,
117
+ height: isPortrait ? 84 : 96,
118
+ display: 'grid',
119
+ placeItems: 'center',
120
+ borderRadius: '999px',
121
+ background: 'rgba(15,23,42,0.64)',
122
+ border: '1px solid rgba(255,255,255,0.18)',
123
+ boxShadow: '0 12px 32px rgba(15,23,42,0.28)',
124
+ fontSize: isPortrait ? 28 : 30,
125
+ }}
126
+ >
127
+
128
+ </div>
129
+ <div>
130
+ <div style={{ fontSize: isPortrait ? scale.body * 0.98 : scale.body, fontWeight: 700, letterSpacing: '-0.02em' }}>{posterLabel ?? 'Video poster'}</div>
131
+ <div style={{ marginTop: 8, fontSize: scale.caption, letterSpacing: '0.14em', textTransform: 'uppercase', opacity: 0.68 }}>{posterCaption ?? 'Use a frame grab, teaser art, or cover still.'}</div>
132
+ </div>
133
+ </div>
134
+ )}
135
+ </div>
136
+
137
+ <div style={{ display: 'flex', alignItems: 'end', justifyContent: 'space-between', gap: 16, color: '#e2e8f0' }}>
138
+ <div style={{ maxWidth: '72%' }}>
139
+ <div style={{ fontSize: scale.caption, letterSpacing: '0.2em', textTransform: 'uppercase', opacity: 0.72 }}>{chapter ?? 'Video showcase'}</div>
140
+ <div style={{ marginTop: 8, fontSize: isPortrait ? scale.body * 0.92 : scale.body, lineHeight: 1.35, opacity: 0.86 }}>{posterCaption ?? 'Poster-led composition for clips, trailers, and edit reviews.'}</div>
141
+ </div>
142
+ <div style={{ fontSize: scale.caption, letterSpacing: '0.18em', textTransform: 'uppercase', opacity: 0.58 }}>Video</div>
143
+ </div>
144
+ </div>
145
+ </div>
146
+ )
147
+ }
148
+
149
+ function VideoNotes({
150
+ notes,
151
+ isPortrait,
152
+ scale,
153
+ }: {
154
+ notes?: string[]
155
+ isPortrait: boolean
156
+ scale: ReturnType<typeof getSlideTypographyScale>
157
+ }) {
158
+ const list = (notes ?? []).filter(Boolean).slice(0, 5)
159
+
160
+ return (
161
+ <div
162
+ style={{
163
+ display: 'grid',
164
+ gap: isPortrait ? 10 : 12,
165
+ gridTemplateColumns: isPortrait ? '1fr' : 'repeat(2, minmax(0, 1fr))',
166
+ }}
167
+ >
168
+ {list.length > 0 ? (
169
+ list.map((note, index) => (
170
+ <article
171
+ key={`${index}-${note}`}
172
+ style={{
173
+ padding: isPortrait ? '14px 14px 15px' : '15px 16px 16px',
174
+ borderRadius: 0,
175
+ border: '1px solid rgba(148,163,184,0.18)',
176
+ background: 'rgba(15,23,42,0.3)',
177
+ color: '#e2e8f0',
178
+ minHeight: isPortrait ? 0 : 96,
179
+ }}
180
+ >
181
+ <div style={{ fontSize: scale.caption, letterSpacing: '0.24em', textTransform: 'uppercase', opacity: 0.58 }}>
182
+ Note {String(index + 1).padStart(2, '0')}
183
+ </div>
184
+ <p style={{ margin: '10px 0 0', fontSize: isPortrait ? scale.body * 0.88 : scale.body * 0.92, lineHeight: 1.45, opacity: 0.94 }}>{note}</p>
185
+ </article>
186
+ ))
187
+ ) : (
188
+ <article
189
+ style={{
190
+ padding: isPortrait ? '14px 14px 15px' : '15px 16px 16px',
191
+ borderRadius: 0,
192
+ border: '1px dashed rgba(148,163,184,0.22)',
193
+ background: 'rgba(15,23,42,0.18)',
194
+ color: '#cbd5e1',
195
+ }}
196
+ >
197
+ <div style={{ fontSize: scale.caption, letterSpacing: '0.24em', textTransform: 'uppercase', opacity: 0.58 }}>Supporting notes</div>
198
+ <p style={{ margin: '10px 0 0', fontSize: isPortrait ? scale.body * 0.88 : scale.body * 0.92, lineHeight: 1.45, opacity: 0.86 }}>
199
+ Add edit notes, chapter cues, or production reminders.
200
+ </p>
201
+ </article>
202
+ )}
203
+ </div>
204
+ )
205
+ }
206
+
207
+ export const componentMetadata = defineScenePluginMetadata({
208
+ resourceKind: 'scene',
209
+ name: 'DefaultVideoShowcaseSlide',
210
+ description: 'Video showcase slide',
211
+ sourceFile: 'src/core/scene/slide/video-showcase/default-video-showcase-slide.tsx',
212
+ pluginKey: 'core.slide.video-showcase',
213
+ tags: ['scene', 'slide', 'video', 'showcase'],
214
+ aspectRatio: '16:9',
215
+ sceneType: 'scene',
216
+ sceneFamily: 'slide',
217
+ rootLayout: 'absolute-fill',
218
+ propsTypeName: 'DefaultVideoShowcaseSlideProps',
219
+ })
220
+
221
+ export const DefaultVideoShowcaseSlide = VideoComponent(componentMetadata)(
222
+ defineSceneComponent({
223
+ family: 'slide',
224
+ propsSchema: z.object({
225
+ sceneId: z.string().optional(),
226
+ sceneName: z.string().optional(),
227
+ title: z.string().min(1),
228
+ subtitle: z.string().optional(),
229
+ chapter: z.string().optional(),
230
+ runtimeLabel: z.string().optional(),
231
+ posterLabel: z.string().optional(),
232
+ posterCaption: z.string().optional(),
233
+ notes: z.array(z.string().min(1)).max(5).optional(),
234
+ poster: z.any().optional(),
235
+ }),
236
+ component: function DefaultVideoShowcaseSlide({
237
+ sceneId,
238
+ sceneName,
239
+ title,
240
+ subtitle,
241
+ chapter,
242
+ runtimeLabel,
243
+ posterLabel,
244
+ posterCaption,
245
+ notes,
246
+ poster,
247
+ }: DefaultVideoShowcaseSlideProps) {
248
+ const runtime = useRemotionSceneRuntime()
249
+ const isPortrait = runtime.height > runtime.width
250
+ const scale = getSlideTypographyScale(runtime.height)
251
+
252
+ return (
253
+ <SlideFrame
254
+ pluginKey={componentMetadata.pluginKey}
255
+ sceneId={sceneId}
256
+ sceneName={sceneName ?? title}
257
+ background="linear-gradient(135deg, #020617 0%, #0f172a 58%, #1d4ed8 100%)"
258
+ >
259
+ <section
260
+ style={{
261
+ width: '100%',
262
+ height: '100%',
263
+ display: 'grid',
264
+ gridTemplateColumns: isPortrait ? '1fr' : '1.08fr 0.92fr',
265
+ gap: isPortrait ? 20 : 28,
266
+ padding: isPortrait ? '40px 28px 42px' : '64px 76px',
267
+ color: '#e2e8f0',
268
+ alignItems: 'stretch',
269
+ }}
270
+ >
271
+ <SceneMotionLayer variant="panel">
272
+ <VideoPoster
273
+ poster={poster}
274
+ posterLabel={posterLabel}
275
+ posterCaption={posterCaption}
276
+ runtimeLabel={runtimeLabel}
277
+ chapter={chapter}
278
+ isPortrait={isPortrait}
279
+ scale={scale}
280
+ />
281
+ </SceneMotionLayer>
282
+
283
+ <div style={{ display: 'grid', alignContent: 'start', gap: isPortrait ? 16 : 18, minWidth: 0 }}>
284
+ <SceneMotionLayer variant="hero-copy">
285
+ <div
286
+ style={{
287
+ display: 'inline-flex',
288
+ alignItems: 'center',
289
+ gap: 10,
290
+ padding: '8px 12px',
291
+ borderRadius: 0,
292
+ border: '1px solid rgba(148,163,184,0.2)',
293
+ background: 'rgba(15,23,42,0.42)',
294
+ color: '#e2e8f0',
295
+ fontSize: scale.caption,
296
+ letterSpacing: '0.18em',
297
+ textTransform: 'uppercase',
298
+ width: 'fit-content',
299
+ }}
300
+ >
301
+ <span style={{ width: 8, height: 8, background: '#38bdf8', display: 'inline-block' }} />
302
+ {chapter ?? 'Video showcase'}
303
+ </div>
304
+ </SceneMotionLayer>
305
+
306
+ <SceneMotionLayer variant="hero-title" delayIndex={1}>
307
+ <h1
308
+ style={{
309
+ margin: 0,
310
+ maxWidth: isPortrait ? 620 : 700,
311
+ fontSize: isPortrait ? scale.title * 0.78 : scale.title,
312
+ lineHeight: 0.94,
313
+ letterSpacing: '-0.06em',
314
+ }}
315
+ >
316
+ {title}
317
+ </h1>
318
+ </SceneMotionLayer>
319
+
320
+ {subtitle ? (
321
+ <SceneMotionLayer variant="hero-copy" delayIndex={2}>
322
+ <p
323
+ style={{
324
+ margin: 0,
325
+ maxWidth: isPortrait ? 620 : 620,
326
+ fontSize: isPortrait ? scale.body * 0.92 : scale.body,
327
+ lineHeight: 1.52,
328
+ opacity: 0.82,
329
+ }}
330
+ >
331
+ {subtitle}
332
+ </p>
333
+ </SceneMotionLayer>
334
+ ) : null}
335
+
336
+ <SceneMotionLayer variant="panel" delayIndex={3}>
337
+ <div
338
+ style={{
339
+ display: 'grid',
340
+ gridTemplateColumns: 'repeat(2, minmax(0, 1fr))',
341
+ gap: 12,
342
+ maxWidth: isPortrait ? 620 : 540,
343
+ }}
344
+ >
345
+ <article style={{ padding: '14px 16px', borderRadius: 0, border: '1px solid rgba(148,163,184,0.18)', background: 'rgba(15,23,42,0.22)' }}>
346
+ <div style={{ fontSize: scale.caption, letterSpacing: '0.24em', textTransform: 'uppercase', opacity: 0.58 }}>Chapter</div>
347
+ <div style={{ marginTop: 8, fontSize: isPortrait ? scale.body * 0.9 : scale.body, lineHeight: 1.35, fontWeight: 700 }}>{chapter ?? 'Opening sequence'}</div>
348
+ </article>
349
+ <article style={{ padding: '14px 16px', borderRadius: 0, border: '1px solid rgba(148,163,184,0.18)', background: 'rgba(15,23,42,0.22)' }}>
350
+ <div style={{ fontSize: scale.caption, letterSpacing: '0.24em', textTransform: 'uppercase', opacity: 0.58 }}>Runtime</div>
351
+ <div style={{ marginTop: 8, fontSize: isPortrait ? scale.body * 0.9 : scale.body, lineHeight: 1.35, fontWeight: 700 }}>{runtimeLabel ?? '02:34'}</div>
352
+ </article>
353
+ </div>
354
+ </SceneMotionLayer>
355
+
356
+ <SceneMotionLayer variant="panel" delayIndex={4}>
357
+ <VideoNotes notes={notes} isPortrait={isPortrait} scale={scale} />
358
+ </SceneMotionLayer>
359
+ </div>
360
+ </section>
361
+ </SlideFrame>
362
+ )
363
+ },
364
+ }),
365
+ )
@@ -0,0 +1,5 @@
1
+ export { DefaultVideoShowcaseSlide } from './default-video-showcase-slide'
2
+ export { componentMetadata } from './default-video-showcase-slide'
3
+ export { DefaultVideoShowcaseSlideLandscape, componentMetadata as DefaultVideoShowcaseSlideLandscapeMetadata } from './default-video-showcase-slide-Landscape'
4
+ export { DefaultVideoShowcaseSlideHorizontal, componentMetadata as DefaultVideoShowcaseSlideHorizontalMetadata } from './default-video-showcase-slide-Horizontal'
5
+ export { DefaultVideoShowcaseMultiSlide, componentMetadata as DefaultVideoShowcaseMultiSlideMetadata } from './default-video-showcase-multi-slide'
@@ -1,19 +0,0 @@
1
- import { DefaultIntroBumper } from './default-intro-bumper'
2
-
3
- const meta = {
4
- title: 'core/intro/DefaultIntroBumper',
5
- component: DefaultIntroBumper,
6
- args: {
7
- kicker: 'A Vibecuting Original',
8
- title: 'Video Project Core',
9
- subtitle: 'A cinematic opening bumper with centered title treatment and room for production credits.',
10
- creditLine: 'Directed by Vibecuting Studio',
11
- footer: 'Opening Sequence',
12
- accent: '#020617',
13
- secondaryAccent: '#1d4ed8',
14
- },
15
- }
16
-
17
- export default meta
18
-
19
- export const Default = {}
@@ -1,218 +0,0 @@
1
- import type { ReactNode } from 'react'
2
-
3
- import {
4
- BaseRemotionScene,
5
- type BaseRemotionSceneProps,
6
- useRemotionSceneRuntime,
7
- } from '../../base'
8
- import { useSceneMotion } from '../../base'
9
- import {
10
- VideoComponent,
11
- defineComponentProjectComponentMetadata,
12
- } from '@vibecuting/component-project-helper'
13
-
14
- export interface DefaultIntroBumperProps extends BaseRemotionSceneProps {
15
- title: string
16
- subtitle?: string
17
- kicker?: string
18
- creditLine?: string
19
- footer?: string
20
- accent?: string
21
- secondaryAccent?: string
22
- textColor?: string
23
- children?: ReactNode
24
- }
25
-
26
- export const componentMetadata = defineComponentProjectComponentMetadata({
27
- name: 'DefaultIntroBumper',
28
- description: 'Default remotion intro bumper',
29
- sourceFile: 'src/core/intro/default-intro-bumper.tsx',
30
- aspectRatio: '16:9',
31
- sceneType: 'intro',
32
- tags: ['intro', 'bumper'],
33
- propsTypeName: 'DefaultIntroBumperProps',
34
- })
35
-
36
- export function DefaultIntroBumper({
37
- id,
38
- name,
39
- title,
40
- subtitle,
41
- kicker,
42
- creditLine,
43
- footer,
44
- accent,
45
- secondaryAccent,
46
- textColor,
47
- children,
48
- }: DefaultIntroBumperProps) {
49
- const runtime = useRemotionSceneRuntime()
50
- const motion = useSceneMotion()
51
- const titleFontSize = Math.round(runtime.height * 0.068)
52
- const subtitleFontSize = Math.round(runtime.height * 0.024)
53
- const kickerFontSize = Math.round(runtime.height * 0.018)
54
- const footerFontSize = Math.round(runtime.height * 0.016)
55
- const mainColor = textColor ?? '#f8fafc'
56
- const primaryBackground = accent ?? '#050816'
57
- const highlightBackground = secondaryAccent ?? '#1f2937'
58
-
59
- return (
60
- <BaseRemotionScene
61
- id={id}
62
- name={name}
63
- style={{
64
- background: `radial-gradient(circle at top, ${highlightBackground} 0%, ${primaryBackground} 42%, #020617 100%)`,
65
- color: mainColor,
66
- display: 'flex',
67
- alignItems: 'center',
68
- justifyContent: 'center',
69
- padding: Math.round(runtime.height * 0.07),
70
- }}
71
- >
72
- <div
73
- aria-hidden="true"
74
- style={{
75
- position: 'absolute',
76
- inset: 0,
77
- background:
78
- 'radial-gradient(circle at center, rgba(255,255,255,0.02) 0%, rgba(2,6,23,0.12) 48%, rgba(2,6,23,0.38) 100%)',
79
- pointerEvents: 'none',
80
- }}
81
- />
82
- <div
83
- aria-hidden="true"
84
- style={{
85
- position: 'absolute',
86
- top: 0,
87
- left: 0,
88
- right: 0,
89
- height: Math.round(runtime.height * 0.085),
90
- background: 'linear-gradient(180deg, rgba(2,6,23,0.96) 0%, rgba(2,6,23,0.22) 100%)',
91
- pointerEvents: 'none',
92
- }}
93
- />
94
- <div
95
- aria-hidden="true"
96
- style={{
97
- position: 'absolute',
98
- left: 0,
99
- right: 0,
100
- bottom: 0,
101
- height: Math.round(runtime.height * 0.085),
102
- background: 'linear-gradient(0deg, rgba(2,6,23,0.96) 0%, rgba(2,6,23,0.22) 100%)',
103
- pointerEvents: 'none',
104
- }}
105
- />
106
- <section
107
- style={{
108
- position: 'relative',
109
- zIndex: 1,
110
- width: '100%',
111
- maxWidth: Math.round(runtime.width * 0.78),
112
- textAlign: 'center',
113
- display: 'flex',
114
- flexDirection: 'column',
115
- alignItems: 'center',
116
- gap: Math.round(runtime.height * 0.02),
117
- }}
118
- >
119
- <p
120
- style={{
121
- margin: 0,
122
- padding: `${Math.round(runtime.height * 0.008)}px ${Math.round(runtime.width * 0.02)}px`,
123
- border: '1px solid rgba(248,250,252,0.16)',
124
- borderRadius: 999,
125
- fontSize: kickerFontSize,
126
- letterSpacing: '0.28em',
127
- textTransform: 'uppercase',
128
- opacity: 0.68,
129
- backdropFilter: 'blur(8px)',
130
- background: 'rgba(15, 23, 42, 0.12)',
131
- transform: motion.isAnimation ? `translate3d(0, ${(1 - motion.progress) * 8}px, 0)` : 'none',
132
- }}
133
- >
134
- Intro Sequence
135
- </p>
136
- {kicker ? (
137
- <p
138
- style={{
139
- margin: 0,
140
- fontSize: kickerFontSize,
141
- letterSpacing: '0.32em',
142
- textTransform: 'uppercase',
143
- opacity: 0.74,
144
- }}
145
- >
146
- {kicker}
147
- </p>
148
- ) : null}
149
- <div
150
- style={{
151
- width: Math.round(runtime.width * 0.18),
152
- height: 1,
153
- background:
154
- 'linear-gradient(90deg, transparent 0%, rgba(248,250,252,0.9) 50%, transparent 100%)',
155
- }}
156
- />
157
- <h1
158
- style={{
159
- margin: 0,
160
- fontSize: titleFontSize,
161
- lineHeight: 0.96,
162
- letterSpacing: '-0.05em',
163
- textTransform: 'uppercase',
164
- textShadow: '0 18px 48px rgba(15, 23, 42, 0.55)',
165
- transform: motion.isAnimation ? `translate3d(0, ${(1 - motion.progress) * 10}px, 0)` : 'none',
166
- }}
167
- >
168
- {title}
169
- </h1>
170
- {subtitle ? (
171
- <p
172
- style={{
173
- margin: 0,
174
- maxWidth: Math.round(runtime.width * 0.56),
175
- fontSize: subtitleFontSize,
176
- lineHeight: 1.6,
177
- opacity: 0.84,
178
- transform: motion.isAnimation ? `translate3d(0, ${(1 - motion.progress) * 6}px, 0)` : 'none',
179
- }}
180
- >
181
- {subtitle}
182
- </p>
183
- ) : null}
184
- {creditLine ? (
185
- <p
186
- style={{
187
- margin: 0,
188
- fontSize: footerFontSize,
189
- letterSpacing: '0.22em',
190
- textTransform: 'uppercase',
191
- opacity: 0.72,
192
- transform: motion.isAnimation ? `translate3d(0, ${(1 - motion.progress) * 4}px, 0)` : 'none',
193
- }}
194
- >
195
- {creditLine}
196
- </p>
197
- ) : null}
198
- {footer ? (
199
- <p
200
- style={{
201
- margin: 0,
202
- fontSize: footerFontSize,
203
- letterSpacing: '0.2em',
204
- textTransform: 'uppercase',
205
- opacity: 0.54,
206
- transform: motion.isAnimation ? `translate3d(0, ${(1 - motion.progress) * 4}px, 0)` : 'none',
207
- }}
208
- >
209
- {footer}
210
- </p>
211
- ) : null}
212
- {children ? <div style={{ marginTop: Math.round(runtime.height * 0.01) }}>{children}</div> : null}
213
- </section>
214
- </BaseRemotionScene>
215
- )
216
- }
217
-
218
- VideoComponent(componentMetadata)(DefaultIntroBumper)
@@ -1,19 +0,0 @@
1
- import { DefaultOutroBumper } from './default-outro-bumper'
2
-
3
- const meta = {
4
- title: 'core/outro/DefaultOutroBumper',
5
- component: DefaultOutroBumper,
6
- args: {
7
- kicker: 'The End',
8
- title: 'Thanks for Watching',
9
- note: 'A centered closing card that feels like a real film end slate instead of a plain footer.',
10
- creditLine: 'Written and produced for Vibecuting',
11
- footer: 'End Credits',
12
- accent: '#0f172a',
13
- secondaryAccent: '#475569',
14
- },
15
- }
16
-
17
- export default meta
18
-
19
- export const Default = {}