@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,256 @@
1
+ import type { ReactNode } from 'react'
2
+
3
+ import { VideoComponent, defineComponentProjectComponentMetadata } from '@vibecuting/component-project-helper'
4
+
5
+ import { BaseRemotionScene, type BaseRemotionSceneProps, useRemotionSceneRuntime } from '../../../base'
6
+ import { useSceneMotion } from '../../../base'
7
+ import { getIntroBodyMaxWidth, getIntroLineClamp } from '../_shared/intro-layout'
8
+
9
+ export interface DefaultIntroBumperProps extends BaseRemotionSceneProps {
10
+ title: string
11
+ subtitle?: string
12
+ kicker?: string
13
+ creditLine?: string
14
+ footer?: string
15
+ accent?: string
16
+ secondaryAccent?: string
17
+ textColor?: string
18
+ children?: ReactNode
19
+ }
20
+
21
+ export const componentMetadata = defineComponentProjectComponentMetadata({
22
+ name: 'DefaultIntroBumper',
23
+ description: 'Editorial opening slate with a production rail and centered title block',
24
+ sourceFile: 'src/core/intro/default-intro-bumper/default-intro-bumper.tsx',
25
+ aspectRatio: '16:9',
26
+ sceneType: 'intro',
27
+ tags: ['intro', 'bumper', 'editorial'],
28
+ propsTypeName: 'DefaultIntroBumperProps',
29
+ })
30
+
31
+ export function DefaultIntroBumper({
32
+ id,
33
+ name,
34
+ title,
35
+ subtitle,
36
+ kicker,
37
+ creditLine,
38
+ footer,
39
+ accent,
40
+ secondaryAccent,
41
+ textColor,
42
+ children,
43
+ }: DefaultIntroBumperProps) {
44
+ const runtime = useRemotionSceneRuntime()
45
+ const motion = useSceneMotion()
46
+ const portrait = runtime.height > runtime.width
47
+ const titleFontSize = Math.round(runtime.height * (portrait ? 0.074 : 0.068))
48
+ const subtitleFontSize = Math.round(runtime.height * 0.023)
49
+ const kickerFontSize = Math.round(runtime.height * 0.017)
50
+ const footerFontSize = Math.round(runtime.height * 0.015)
51
+
52
+ return (
53
+ <BaseRemotionScene
54
+ id={id}
55
+ name={name}
56
+ style={{
57
+ background: `radial-gradient(circle at top, ${secondaryAccent ?? '#1f2937'} 0%, ${accent ?? '#050816'} 42%, #020617 100%)`,
58
+ color: textColor ?? '#f8fafc',
59
+ display: 'grid',
60
+ placeItems: 'center',
61
+ padding: Math.round(runtime.height * (portrait ? 0.065 : 0.07)),
62
+ overflow: 'hidden',
63
+ }}
64
+ >
65
+ <div
66
+ aria-hidden="true"
67
+ style={{
68
+ position: 'absolute',
69
+ inset: 0,
70
+ background:
71
+ 'radial-gradient(circle at center, rgba(255,255,255,0.03) 0%, rgba(2,6,23,0.14) 48%, rgba(2,6,23,0.42) 100%)',
72
+ pointerEvents: 'none',
73
+ }}
74
+ />
75
+ <div
76
+ aria-hidden="true"
77
+ style={{
78
+ position: 'absolute',
79
+ inset: '12% 7%',
80
+ border: '1px solid rgba(248,250,252,0.08)',
81
+ pointerEvents: 'none',
82
+ }}
83
+ />
84
+ <section
85
+ style={{
86
+ position: 'relative',
87
+ zIndex: 1,
88
+ width: '100%',
89
+ height: '100%',
90
+ display: 'grid',
91
+ gridTemplateColumns: portrait ? '1fr' : 'minmax(170px, 0.56fr) minmax(0, 1.42fr) minmax(220px, 0.72fr)',
92
+ gap: portrait ? 18 : 22,
93
+ alignItems: 'stretch',
94
+ minWidth: 0,
95
+ minHeight: 0,
96
+ }}
97
+ >
98
+ <aside
99
+ style={{
100
+ display: 'grid',
101
+ alignContent: 'space-between',
102
+ gap: 16,
103
+ minWidth: 0,
104
+ border: '1px solid rgba(248,250,252,0.1)',
105
+ background: 'linear-gradient(180deg, rgba(255,255,255,0.04), rgba(2,6,23,0.26))',
106
+ padding: Math.round(runtime.height * 0.028),
107
+ textAlign: portrait ? 'center' : 'left',
108
+ }}
109
+ >
110
+ <div style={{ display: 'grid', gap: 12 }}>
111
+ <p
112
+ style={{
113
+ margin: 0,
114
+ fontSize: kickerFontSize,
115
+ letterSpacing: '0.34em',
116
+ textTransform: 'uppercase',
117
+ opacity: 0.64,
118
+ }}
119
+ >
120
+ Opening File
121
+ </p>
122
+ {kicker ? (
123
+ <p
124
+ style={{
125
+ margin: 0,
126
+ fontSize: kickerFontSize,
127
+ letterSpacing: '0.3em',
128
+ textTransform: 'uppercase',
129
+ opacity: 0.82,
130
+ }}
131
+ >
132
+ {kicker}
133
+ </p>
134
+ ) : null}
135
+ </div>
136
+ <div
137
+ style={{
138
+ display: 'grid',
139
+ gap: 8,
140
+ fontSize: footerFontSize,
141
+ letterSpacing: '0.2em',
142
+ textTransform: 'uppercase',
143
+ opacity: 0.72,
144
+ }}
145
+ >
146
+ {creditLine ? <span>{creditLine}</span> : null}
147
+ {footer ? <span style={{ opacity: 0.56 }}>{footer}</span> : null}
148
+ </div>
149
+ </aside>
150
+
151
+ <main
152
+ style={{
153
+ display: 'grid',
154
+ alignContent: 'center',
155
+ gap: portrait ? 14 : 18,
156
+ minWidth: 0,
157
+ textAlign: portrait ? 'center' : 'left',
158
+ }}
159
+ >
160
+ <p
161
+ style={{
162
+ margin: 0,
163
+ fontSize: kickerFontSize,
164
+ letterSpacing: '0.42em',
165
+ textTransform: 'uppercase',
166
+ opacity: 0.72,
167
+ }}
168
+ >
169
+ Intro Sequence
170
+ </p>
171
+ <h1
172
+ style={{
173
+ margin: 0,
174
+ fontSize: titleFontSize,
175
+ lineHeight: 0.92,
176
+ letterSpacing: '-0.08em',
177
+ textTransform: 'uppercase',
178
+ textShadow: '0 18px 48px rgba(15, 23, 42, 0.55)',
179
+ transform: motion.isAnimation ? `translate3d(0, ${(1 - motion.progress) * 10}px, 0)` : 'none',
180
+ }}
181
+ >
182
+ {title}
183
+ </h1>
184
+ {subtitle ? (
185
+ <p
186
+ style={{
187
+ margin: 0,
188
+ maxWidth: getIntroBodyMaxWidth(runtime.width, portrait, 0.58, 0.9, { min: 240, max: 760 }),
189
+ fontSize: subtitleFontSize,
190
+ lineHeight: 1.6,
191
+ opacity: 0.84,
192
+ transform: motion.isAnimation ? `translate3d(0, ${(1 - motion.progress) * 6}px, 0)` : 'none',
193
+ ...getIntroLineClamp(portrait ? 4 : 3),
194
+ }}
195
+ >
196
+ {subtitle}
197
+ </p>
198
+ ) : null}
199
+ <div
200
+ style={{
201
+ display: 'grid',
202
+ gridTemplateColumns: portrait ? '1fr' : 'repeat(3, minmax(0, 1fr))',
203
+ gap: 10,
204
+ }}
205
+ >
206
+ {[
207
+ ['Scene', 'Editorial opener'],
208
+ ['Tone', 'Clean and formal'],
209
+ ['Format', 'Title rail'],
210
+ ].map(([label, value], index) => (
211
+ <div
212
+ key={label}
213
+ style={{
214
+ border: '1px solid rgba(248,250,252,0.1)',
215
+ background: 'rgba(15,23,42,0.16)',
216
+ padding: '12px 14px',
217
+ display: 'grid',
218
+ gap: 6,
219
+ transform: motion.isAnimation ? `translate3d(0, ${(1 - motion.progress) * (index + 1) * 4}px, 0)` : 'none',
220
+ }}
221
+ >
222
+ <span style={{ fontSize: Math.round(runtime.height * 0.014), letterSpacing: '0.24em', textTransform: 'uppercase', opacity: 0.56 }}>
223
+ {label}
224
+ </span>
225
+ <span style={{ fontSize: Math.round(runtime.height * 0.018), letterSpacing: '-0.02em' }}>{value}</span>
226
+ </div>
227
+ ))}
228
+ </div>
229
+ {children ? <div style={{ marginTop: Math.round(runtime.height * 0.012) }}>{children}</div> : null}
230
+ </main>
231
+
232
+ <aside
233
+ style={{
234
+ display: 'grid',
235
+ alignContent: 'center',
236
+ gap: 12,
237
+ minWidth: 0,
238
+ border: '1px solid rgba(248,250,252,0.1)',
239
+ background: 'linear-gradient(180deg, rgba(2,6,23,0.16), rgba(255,255,255,0.03))',
240
+ padding: Math.round(runtime.height * 0.028),
241
+ }}
242
+ >
243
+ <div style={{ fontSize: kickerFontSize, letterSpacing: '0.3em', textTransform: 'uppercase', opacity: 0.58 }}>
244
+ Production Notes
245
+ </div>
246
+ <div style={{ display: 'grid', gap: 10, fontSize: footerFontSize, lineHeight: 1.55, opacity: 0.82 }}>
247
+ <div>Use this when the opening should feel like a chapter card.</div>
248
+ <div>Designed to keep metadata visible without flattening the layout.</div>
249
+ </div>
250
+ </aside>
251
+ </section>
252
+ </BaseRemotionScene>
253
+ )
254
+ }
255
+
256
+ VideoComponent(componentMetadata)(DefaultIntroBumper)
@@ -0,0 +1,11 @@
1
+ export { DefaultIntroBumper } from './default-intro-bumper'
2
+ export { componentMetadata } from './default-intro-bumper'
3
+ export {
4
+ DefaultIntroBumperLandscape,
5
+ componentMetadata as DefaultIntroBumperLandscapeMetadata,
6
+ } from './default-intro-bumper-Landscape'
7
+ export {
8
+ DefaultIntroBumperHorizontal,
9
+ componentMetadata as DefaultIntroBumperHorizontalMetadata,
10
+ } from './default-intro-bumper-Horizontal'
11
+
@@ -0,0 +1,24 @@
1
+ import type { ComponentProps } from 'react'
2
+
3
+ import { VideoComponent, type ScenePluginMetadata } from '@vibecuting/component-project-helper'
4
+
5
+ import { DefaultNoirIntroBumper, componentMetadata as baseComponentMetadata } from './default-noir-intro-bumper'
6
+
7
+ export const componentMetadata: ScenePluginMetadata = {
8
+ ...baseComponentMetadata,
9
+ resourceKind: 'scene',
10
+ pluginKey: 'core.intro.noir',
11
+ sceneFamily: 'custom',
12
+ rootLayout: 'absolute-fill',
13
+ name: 'DefaultNoirIntroBumperHorizontal',
14
+ description: 'Noir intro bumper (Portrait 9:16 variant)',
15
+ sourceFile: 'src/core/intro/default-noir-intro-bumper/default-noir-intro-bumper-Horizontal.tsx',
16
+ aspectRatio: '9:16',
17
+ tags: Array.from(new Set([...(baseComponentMetadata.tags ?? []), 'horizontal'])),
18
+ }
19
+
20
+ export const DefaultNoirIntroBumperHorizontal = VideoComponent(componentMetadata)(function DefaultNoirIntroBumperHorizontal(
21
+ props: ComponentProps<typeof DefaultNoirIntroBumper>,
22
+ ) {
23
+ return <DefaultNoirIntroBumper {...props} />
24
+ })
@@ -0,0 +1,24 @@
1
+ import type { ComponentProps } from 'react'
2
+
3
+ import { VideoComponent, type ScenePluginMetadata } from '@vibecuting/component-project-helper'
4
+
5
+ import { DefaultNoirIntroBumper, componentMetadata as baseComponentMetadata } from './default-noir-intro-bumper'
6
+
7
+ export const componentMetadata: ScenePluginMetadata = {
8
+ ...baseComponentMetadata,
9
+ resourceKind: 'scene',
10
+ pluginKey: 'core.intro.noir',
11
+ sceneFamily: 'custom',
12
+ rootLayout: 'absolute-fill',
13
+ name: 'DefaultNoirIntroBumperLandscape',
14
+ description: 'Noir intro bumper (Landscape 16:9 variant)',
15
+ sourceFile: 'src/core/intro/default-noir-intro-bumper/default-noir-intro-bumper-Landscape.tsx',
16
+ aspectRatio: '16:9',
17
+ tags: Array.from(new Set([...(baseComponentMetadata.tags ?? []), 'landscape'])),
18
+ }
19
+
20
+ export const DefaultNoirIntroBumperLandscape = VideoComponent(componentMetadata)(function DefaultNoirIntroBumperLandscape(
21
+ props: ComponentProps<typeof DefaultNoirIntroBumper>,
22
+ ) {
23
+ return <DefaultNoirIntroBumper {...props} />
24
+ })
@@ -0,0 +1,29 @@
1
+ import { DefaultNoirIntroBumperHorizontal } from './default-noir-intro-bumper-Horizontal'
2
+ import { DefaultNoirIntroBumperLandscape } from './default-noir-intro-bumper-Landscape'
3
+
4
+ const meta = {
5
+ title: 'core/intro/default-noir-intro-bumper/DefaultNoirIntroBumperLandscape',
6
+ component: DefaultNoirIntroBumperLandscape,
7
+ args: {
8
+ kicker: 'Classic Noir',
9
+ title: 'Midnight Signal',
10
+ subtitle: 'A shadow-heavy title card with serif typography and strong contrast.',
11
+ creditLine: 'A Vibecuting Picture',
12
+ footer: 'Opening Sequence',
13
+ accent: '#050505',
14
+ secondaryAccent: '#1f2937',
15
+ },
16
+ }
17
+
18
+ export default meta
19
+
20
+ export const Default = {}
21
+ export const Animated = { parameters: { scenePreviewMode: 'animation' } }
22
+ export const Horizontal = {
23
+ render: (storyArgs: typeof meta.args) => <DefaultNoirIntroBumperHorizontal {...storyArgs} />,
24
+ parameters: { scenePreviewAspectRatio: '9:16' },
25
+ }
26
+ export const HorizontalAnimated = {
27
+ render: (storyArgs: typeof meta.args) => <DefaultNoirIntroBumperHorizontal {...storyArgs} />,
28
+ parameters: { scenePreviewMode: 'animation', scenePreviewAspectRatio: '9:16' },
29
+ }
@@ -0,0 +1,122 @@
1
+ import type { ReactNode } from 'react'
2
+
3
+ import { VideoComponent, defineComponentProjectComponentMetadata } from '@vibecuting/component-project-helper'
4
+
5
+ import { BaseRemotionScene, type BaseRemotionSceneProps, useRemotionSceneRuntime } from '../../../base'
6
+ import { useSceneMotion } from '../../../base'
7
+
8
+ export interface DefaultNoirIntroBumperProps extends BaseRemotionSceneProps {
9
+ title: string
10
+ subtitle?: string
11
+ kicker?: string
12
+ creditLine?: string
13
+ footer?: string
14
+ accent?: string
15
+ secondaryAccent?: string
16
+ textColor?: string
17
+ children?: ReactNode
18
+ }
19
+
20
+ export const componentMetadata = defineComponentProjectComponentMetadata({
21
+ name: 'DefaultNoirIntroBumper',
22
+ description: 'Noir-style intro bumper',
23
+ sourceFile: 'src/core/intro/default-noir-intro-bumper/default-noir-intro-bumper.tsx',
24
+ aspectRatio: '16:9',
25
+ sceneType: 'intro',
26
+ tags: ['intro', 'bumper', 'noir', 'classic'],
27
+ propsTypeName: 'DefaultNoirIntroBumperProps',
28
+ })
29
+
30
+ export function DefaultNoirIntroBumper({
31
+ id,
32
+ name,
33
+ title,
34
+ subtitle,
35
+ kicker,
36
+ creditLine,
37
+ footer,
38
+ accent,
39
+ secondaryAccent,
40
+ textColor,
41
+ }: DefaultNoirIntroBumperProps) {
42
+ const runtime = useRemotionSceneRuntime()
43
+ const motion = useSceneMotion()
44
+ const portrait = runtime.height > runtime.width
45
+
46
+ return (
47
+ <BaseRemotionScene
48
+ id={id}
49
+ name={name}
50
+ style={{
51
+ background: portrait
52
+ ? 'linear-gradient(180deg, #050505 0%, #111111 44%, #000000 100%)'
53
+ : `radial-gradient(circle at 50% 22%, ${secondaryAccent ?? 'rgba(255,255,255,0.12)'} 0%, ${accent ?? '#050505'} 42%, #000 100%)`,
54
+ color: textColor ?? '#f5f5f5',
55
+ display: 'grid',
56
+ placeItems: 'center',
57
+ padding: Math.round(runtime.height * 0.07),
58
+ fontFamily: `Georgia, 'Times New Roman', serif`,
59
+ }}
60
+ >
61
+ <div
62
+ aria-hidden="true"
63
+ style={{
64
+ position: 'absolute',
65
+ inset: 0,
66
+ background:
67
+ 'linear-gradient(180deg, rgba(255,255,255,0.04) 0%, rgba(0,0,0,0.1) 18%, rgba(0,0,0,0.72) 100%)',
68
+ pointerEvents: 'none',
69
+ }}
70
+ />
71
+ <section
72
+ style={{
73
+ position: 'relative',
74
+ zIndex: 1,
75
+ width: '100%',
76
+ height: '100%',
77
+ display: 'grid',
78
+ alignContent: 'center',
79
+ justifyItems: 'center',
80
+ gap: portrait ? 12 : 14,
81
+ textAlign: 'center',
82
+ minWidth: 0,
83
+ minHeight: 0,
84
+ }}
85
+ >
86
+ <p style={{ margin: 0, fontSize: Math.round(runtime.height * 0.017), letterSpacing: '0.4em', textTransform: 'uppercase', opacity: 0.6 }}>
87
+ {kicker ?? 'Noir Opening'}
88
+ </p>
89
+ <h1
90
+ style={{
91
+ margin: 0,
92
+ fontSize: portrait ? Math.round(runtime.height * 0.078) : Math.round(runtime.height * 0.07),
93
+ lineHeight: 0.9,
94
+ letterSpacing: '-0.08em',
95
+ textTransform: 'uppercase',
96
+ transform: motion.isAnimation ? `translate3d(0, ${(1 - motion.progress) * 8}px, 0)` : 'none',
97
+ }}
98
+ >
99
+ {title}
100
+ </h1>
101
+ {subtitle ? (
102
+ <p
103
+ style={{
104
+ margin: 0,
105
+ maxWidth: Math.round(runtime.width * 0.54),
106
+ fontSize: Math.round(runtime.height * 0.024),
107
+ lineHeight: 1.6,
108
+ opacity: 0.8,
109
+ transform: motion.isAnimation ? `translate3d(0, ${(1 - motion.progress) * 6}px, 0)` : 'none',
110
+ }}
111
+ >
112
+ {subtitle}
113
+ </p>
114
+ ) : null}
115
+ {creditLine ? <p style={{ margin: 0, fontSize: Math.round(runtime.height * 0.015), letterSpacing: '0.22em', textTransform: 'uppercase', opacity: 0.72 }}>{creditLine}</p> : null}
116
+ {footer ? <p style={{ margin: 0, fontSize: Math.round(runtime.height * 0.015), letterSpacing: '0.2em', textTransform: 'uppercase', opacity: 0.52 }}>{footer}</p> : null}
117
+ </section>
118
+ </BaseRemotionScene>
119
+ )
120
+ }
121
+
122
+ VideoComponent(componentMetadata)(DefaultNoirIntroBumper)
@@ -0,0 +1,11 @@
1
+ export { DefaultNoirIntroBumper } from './default-noir-intro-bumper'
2
+ export { componentMetadata } from './default-noir-intro-bumper'
3
+ export {
4
+ DefaultNoirIntroBumperLandscape,
5
+ componentMetadata as DefaultNoirIntroBumperLandscapeMetadata,
6
+ } from './default-noir-intro-bumper-Landscape'
7
+ export {
8
+ DefaultNoirIntroBumperHorizontal,
9
+ componentMetadata as DefaultNoirIntroBumperHorizontalMetadata,
10
+ } from './default-noir-intro-bumper-Horizontal'
11
+
@@ -0,0 +1,24 @@
1
+ import type { ComponentProps } from 'react'
2
+
3
+ import { VideoComponent, type ScenePluginMetadata } from '@vibecuting/component-project-helper'
4
+
5
+ import { DefaultTrailerIntroBumper, componentMetadata as baseComponentMetadata } from './default-trailer-intro-bumper'
6
+
7
+ export const componentMetadata: ScenePluginMetadata = {
8
+ ...baseComponentMetadata,
9
+ resourceKind: 'scene',
10
+ pluginKey: 'core.intro.trailer',
11
+ sceneFamily: 'custom',
12
+ rootLayout: 'absolute-fill',
13
+ name: 'DefaultTrailerIntroBumperHorizontal',
14
+ description: 'Trailer intro bumper (Portrait 9:16 variant)',
15
+ sourceFile: 'src/core/intro/default-trailer-intro-bumper/default-trailer-intro-bumper-Horizontal.tsx',
16
+ aspectRatio: '9:16',
17
+ tags: Array.from(new Set([...(baseComponentMetadata.tags ?? []), 'horizontal'])),
18
+ }
19
+
20
+ export const DefaultTrailerIntroBumperHorizontal = VideoComponent(componentMetadata)(function DefaultTrailerIntroBumperHorizontal(
21
+ props: ComponentProps<typeof DefaultTrailerIntroBumper>,
22
+ ) {
23
+ return <DefaultTrailerIntroBumper {...props} />
24
+ })
@@ -0,0 +1,24 @@
1
+ import type { ComponentProps } from 'react'
2
+
3
+ import { VideoComponent, type ScenePluginMetadata } from '@vibecuting/component-project-helper'
4
+
5
+ import { DefaultTrailerIntroBumper, componentMetadata as baseComponentMetadata } from './default-trailer-intro-bumper'
6
+
7
+ export const componentMetadata: ScenePluginMetadata = {
8
+ ...baseComponentMetadata,
9
+ resourceKind: 'scene',
10
+ pluginKey: 'core.intro.trailer',
11
+ sceneFamily: 'custom',
12
+ rootLayout: 'absolute-fill',
13
+ name: 'DefaultTrailerIntroBumperLandscape',
14
+ description: 'Trailer intro bumper (Landscape 16:9 variant)',
15
+ sourceFile: 'src/core/intro/default-trailer-intro-bumper/default-trailer-intro-bumper-Landscape.tsx',
16
+ aspectRatio: '16:9',
17
+ tags: Array.from(new Set([...(baseComponentMetadata.tags ?? []), 'landscape'])),
18
+ }
19
+
20
+ export const DefaultTrailerIntroBumperLandscape = VideoComponent(componentMetadata)(function DefaultTrailerIntroBumperLandscape(
21
+ props: ComponentProps<typeof DefaultTrailerIntroBumper>,
22
+ ) {
23
+ return <DefaultTrailerIntroBumper {...props} />
24
+ })
@@ -0,0 +1,29 @@
1
+ import { DefaultTrailerIntroBumperHorizontal } from './default-trailer-intro-bumper-Horizontal'
2
+ import { DefaultTrailerIntroBumperLandscape } from './default-trailer-intro-bumper-Landscape'
3
+
4
+ const meta = {
5
+ title: 'core/intro/default-trailer-intro-bumper/DefaultTrailerIntroBumperLandscape',
6
+ component: DefaultTrailerIntroBumperLandscape,
7
+ args: {
8
+ kicker: 'Summer Trailer',
9
+ title: 'Into the Fire',
10
+ subtitle: 'A trailer-style opener with storyboard strips and a stacked preview wall.',
11
+ creditLine: 'In Theaters 2026',
12
+ footer: 'Opening Sequence',
13
+ accent: '#1e293b',
14
+ secondaryAccent: '#7c2d12',
15
+ },
16
+ }
17
+
18
+ export default meta
19
+
20
+ export const Default = {}
21
+ export const Animated = { parameters: { scenePreviewMode: 'animation' } }
22
+ export const Horizontal = {
23
+ render: (storyArgs: typeof meta.args) => <DefaultTrailerIntroBumperHorizontal {...storyArgs} />,
24
+ parameters: { scenePreviewAspectRatio: '9:16' },
25
+ }
26
+ export const HorizontalAnimated = {
27
+ render: (storyArgs: typeof meta.args) => <DefaultTrailerIntroBumperHorizontal {...storyArgs} />,
28
+ parameters: { scenePreviewMode: 'animation', scenePreviewAspectRatio: '9:16' },
29
+ }