@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,24 @@
1
+ import type { ComponentProps } from 'react'
2
+
3
+ import { VideoComponent, type ScenePluginMetadata } from '@vibecuting/component-project-helper'
4
+
5
+ import { DefaultCreditsRollOutroEpic, componentMetadata as baseComponentMetadata } from './default-credits-roll-outro'
6
+
7
+ export const componentMetadata: ScenePluginMetadata = {
8
+ ...baseComponentMetadata,
9
+ resourceKind: 'scene',
10
+ pluginKey: 'core.outro.credits-roll-epic',
11
+ sceneFamily: 'custom',
12
+ rootLayout: 'absolute-fill',
13
+ name: 'DefaultCreditsRollOutroEpicLandscape',
14
+ description: 'Epic credits-roll outro bumper (Landscape 16:9 variant)',
15
+ sourceFile: 'src/core/outro/credits-roll-outro-epic/default-credits-roll-outro-Landscape.tsx',
16
+ aspectRatio: '16:9',
17
+ tags: Array.from(new Set([...(baseComponentMetadata.tags ?? []), 'landscape'])),
18
+ }
19
+
20
+ export const DefaultCreditsRollOutroEpicLandscape = VideoComponent(componentMetadata)(function DefaultCreditsRollOutroEpicLandscape(
21
+ props: ComponentProps<typeof DefaultCreditsRollOutroEpic>,
22
+ ) {
23
+ return <DefaultCreditsRollOutroEpic {...props} />
24
+ })
@@ -0,0 +1,31 @@
1
+ import { DefaultCreditsRollOutroEpicHorizontal } from './default-credits-roll-outro-Horizontal'
2
+ import { DefaultCreditsRollOutroEpicLandscape } from './default-credits-roll-outro-Landscape'
3
+
4
+ const args = {
5
+ kicker: 'Grand Finale',
6
+ title: 'A Bigger End',
7
+ note: 'A more cinematic credits roll for prestige films and large-scale endings.',
8
+ creditLine: 'A Vibecuting Original',
9
+ footer: 'End Credits',
10
+ accent: '#1f2937',
11
+ secondaryAccent: '#475569',
12
+ }
13
+
14
+ const meta = {
15
+ title: 'core/outro/credits-roll-outro-epic/DefaultCreditsRollOutroEpic',
16
+ component: DefaultCreditsRollOutroEpicLandscape,
17
+ args,
18
+ }
19
+
20
+ export default meta
21
+
22
+ export const Landscape = { parameters: { scenePreviewAspectRatio: '16:9' } }
23
+ export const LandscapeAnimated = { parameters: { scenePreviewAspectRatio: '16:9', scenePreviewMode: 'animation' } }
24
+ export const Horizontal = {
25
+ render: (storyArgs: typeof args) => <DefaultCreditsRollOutroEpicHorizontal {...storyArgs} />,
26
+ parameters: { scenePreviewAspectRatio: '9:16' },
27
+ }
28
+ export const HorizontalAnimated = {
29
+ render: (storyArgs: typeof args) => <DefaultCreditsRollOutroEpicHorizontal {...storyArgs} />,
30
+ parameters: { scenePreviewAspectRatio: '9:16', scenePreviewMode: 'animation' },
31
+ }
@@ -0,0 +1,106 @@
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 { getOutroBodyMaxWidth, getOutroLineClamp, resolveOutroLayout } from '../_shared/outro-layout'
8
+
9
+ export interface DefaultCreditsRollOutroEpicProps extends BaseRemotionSceneProps {
10
+ title: string
11
+ note?: 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: 'DefaultCreditsRollOutroEpic',
23
+ description: 'Epic credits outro with a split score board and tiered roll card',
24
+ sourceFile: 'src/core/outro/credits-roll-outro-epic/default-credits-roll-outro.tsx',
25
+ aspectRatio: '16:9',
26
+ sceneType: 'outro',
27
+ tags: ['outro', 'credits', 'epic', 'orchestral', 'roll'],
28
+ propsTypeName: 'DefaultCreditsRollOutroEpicProps',
29
+ })
30
+
31
+ export function DefaultCreditsRollOutroEpic({
32
+ id,
33
+ name,
34
+ title,
35
+ note,
36
+ kicker,
37
+ creditLine,
38
+ footer,
39
+ accent,
40
+ secondaryAccent,
41
+ textColor,
42
+ }: DefaultCreditsRollOutroEpicProps) {
43
+ const runtime = useRemotionSceneRuntime()
44
+ const motion = useSceneMotion()
45
+ const resolvedLayout = resolveOutroLayout(undefined, runtime.width, runtime.height)
46
+ const portrait = resolvedLayout === 'horizontal'
47
+
48
+ return (
49
+ <BaseRemotionScene
50
+ id={id}
51
+ name={name}
52
+ style={{
53
+ background: portrait
54
+ ? 'linear-gradient(180deg, #020617 0%, #111827 40%, #000000 100%)'
55
+ : `radial-gradient(circle at 50% 24%, ${accent ?? '#1f2937'} 0%, ${secondaryAccent ?? '#475569'} 38%, #020617 100%)`,
56
+ color: textColor ?? '#f8fafc',
57
+ display: 'grid',
58
+ placeItems: 'center',
59
+ padding: Math.round(runtime.height * 0.07),
60
+ }}
61
+ >
62
+ <section style={{ position: 'relative', zIndex: 1, width: '100%', height: '100%', display: 'grid', gridTemplateColumns: portrait ? '1fr' : 'minmax(0, 0.82fr) minmax(300px, 1.18fr)', gap: portrait ? 18 : 24, alignItems: 'stretch', minWidth: 0, minHeight: 0 }}>
63
+ <div style={{ display: 'grid', gap: 12, textAlign: portrait ? 'center' : 'left', minWidth: 0, alignContent: 'center' }}>
64
+ <p style={{ margin: 0, fontSize: Math.round(runtime.height * 0.017), letterSpacing: '0.34em', textTransform: 'uppercase', opacity: 0.64 }}>
65
+ {kicker ?? 'Epic Credits'}
66
+ </p>
67
+ <h1 style={{ margin: 0, fontSize: portrait ? Math.round(runtime.height * 0.078) : Math.round(runtime.height * 0.072), lineHeight: 0.92, letterSpacing: '-0.08em', textTransform: 'uppercase', transform: motion.isAnimation ? `translate3d(0, ${(1 - motion.progress) * 10}px, 0)` : 'none' }}>
68
+ {title}
69
+ </h1>
70
+ {note ? <p style={{ margin: 0, maxWidth: getOutroBodyMaxWidth(runtime.width, resolvedLayout, 0.58, 0.42, { min: 240, max: 680 }), fontSize: Math.round(runtime.height * 0.023), lineHeight: 1.56, opacity: 0.82, ...getOutroLineClamp(portrait ? 4 : 3) }}>{note}</p> : null}
71
+ <div style={{ display: 'flex', flexWrap: 'wrap', justifyContent: portrait ? 'center' : 'flex-start', gap: 10 }}>
72
+ {creditLine ? <span style={{ fontSize: Math.round(runtime.height * 0.015), letterSpacing: '0.2em', textTransform: 'uppercase', opacity: 0.72 }}>{creditLine}</span> : null}
73
+ {footer ? <span style={{ fontSize: Math.round(runtime.height * 0.015), letterSpacing: '0.2em', textTransform: 'uppercase', opacity: 0.52 }}>{footer}</span> : null}
74
+ </div>
75
+ </div>
76
+
77
+ <div style={{ display: 'grid', alignContent: 'center', minWidth: 0 }}>
78
+ <div style={{ border: '1px solid rgba(248,250,252,0.1)', background: 'linear-gradient(180deg, rgba(255,255,255,0.04), rgba(15,23,42,0.18))', padding: 18, display: 'grid', gap: 12, minHeight: portrait ? 260 : 320, overflow: 'hidden' }}>
79
+ <div style={{ fontSize: Math.round(runtime.height * 0.016), letterSpacing: '0.3em', textTransform: 'uppercase', opacity: 0.56 }}>Roll Credits</div>
80
+ <div style={{ display: 'grid', gridTemplateColumns: portrait ? '1fr' : 'minmax(0, 0.76fr) minmax(0, 1.24fr)', gap: 12, minWidth: 0 }}>
81
+ <div style={{ border: '1px solid rgba(248,250,252,0.1)', background: 'rgba(0,0,0,0.16)', padding: 14, display: 'grid', gap: 8 }}>
82
+ <span style={{ fontSize: Math.round(runtime.height * 0.014), letterSpacing: '0.2em', textTransform: 'uppercase', opacity: 0.56 }}>Score</span>
83
+ <span style={{ fontSize: Math.round(runtime.height * 0.024), fontWeight: 800, letterSpacing: '-0.05em' }}>Orchestral Suite</span>
84
+ <span style={{ fontSize: Math.round(runtime.height * 0.018), lineHeight: 1.5, opacity: 0.8 }}>A larger, tiered ending for prestige films and orchestral finales.</span>
85
+ </div>
86
+ <div style={{ display: 'grid', gap: 8 }}>
87
+ {[
88
+ ['Theme', 'Grand Finale'],
89
+ ['Studio', 'Vibecuting'],
90
+ ['Format', 'Screened credits'],
91
+ ].map(([label, value]) => (
92
+ <div key={label} style={{ display: 'flex', justifyContent: 'space-between', gap: 12, fontSize: Math.round(runtime.height * (portrait ? 0.018 : 0.02)), border: '1px solid rgba(248,250,252,0.08)', padding: '10px 12px', background: 'rgba(0,0,0,0.12)', minWidth: 0 }}>
93
+ <span style={{ opacity: 0.56, textTransform: 'uppercase', letterSpacing: '0.18em' }}>{label}</span>
94
+ <span style={getOutroLineClamp(1)}>{value}</span>
95
+ </div>
96
+ ))}
97
+ </div>
98
+ </div>
99
+ </div>
100
+ </div>
101
+ </section>
102
+ </BaseRemotionScene>
103
+ )
104
+ }
105
+
106
+ VideoComponent(componentMetadata)(DefaultCreditsRollOutroEpic)
@@ -0,0 +1,10 @@
1
+ export { DefaultCreditsRollOutroEpic } from './default-credits-roll-outro'
2
+ export { componentMetadata } from './default-credits-roll-outro'
3
+ export {
4
+ DefaultCreditsRollOutroEpicLandscape,
5
+ componentMetadata as DefaultCreditsRollOutroEpicLandscapeMetadata,
6
+ } from './default-credits-roll-outro-Landscape'
7
+ export {
8
+ DefaultCreditsRollOutroEpicHorizontal,
9
+ componentMetadata as DefaultCreditsRollOutroEpicHorizontalMetadata,
10
+ } from './default-credits-roll-outro-Horizontal'
@@ -0,0 +1 @@
1
+ export { DefaultCreditsRollOutroPremium as DefaultCreditsRollOutroPremiumHorizontal, componentMetadata } from './default-credits-roll-outro'
@@ -0,0 +1 @@
1
+ export { DefaultCreditsRollOutroPremium as DefaultCreditsRollOutroPremiumLandscape, componentMetadata } from './default-credits-roll-outro'
@@ -0,0 +1,30 @@
1
+ import { DefaultCreditsRollOutroPremiumHorizontal } from './default-credits-roll-outro-Horizontal'
2
+ import { DefaultCreditsRollOutroPremiumLandscape } from './default-credits-roll-outro-Landscape'
3
+
4
+ const args = {
5
+ kicker: 'Credits Roll',
6
+ title: 'A Film Worth Crediting',
7
+ note: 'A premium closing card with a stronger end-credit feel.',
8
+ creditLine: 'A Vibecuting Original',
9
+ footer: 'End Credits',
10
+ accent: '#111827',
11
+ secondaryAccent: '#475569',
12
+ }
13
+
14
+ const meta = {
15
+ title: 'core/outro/credits-roll-outro-premium/DefaultCreditsRollOutroPremium',
16
+ component: DefaultCreditsRollOutroPremiumLandscape,
17
+ args,
18
+ }
19
+
20
+ export default meta
21
+ export const Landscape = { parameters: { scenePreviewAspectRatio: '16:9' } }
22
+ export const LandscapeAnimated = { parameters: { scenePreviewAspectRatio: '16:9', scenePreviewMode: 'animation' } }
23
+ export const Horizontal = {
24
+ render: (storyArgs: typeof args) => <DefaultCreditsRollOutroPremiumHorizontal {...storyArgs} />,
25
+ parameters: { scenePreviewAspectRatio: '9:16' },
26
+ }
27
+ export const HorizontalAnimated = {
28
+ render: (storyArgs: typeof args) => <DefaultCreditsRollOutroPremiumHorizontal {...storyArgs} />,
29
+ parameters: { scenePreviewAspectRatio: '9:16', scenePreviewMode: 'animation' },
30
+ }
@@ -0,0 +1,88 @@
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 { getOutroBodyMaxWidth, getOutroLineClamp, resolveOutroLayout } from '../_shared/outro-layout'
8
+
9
+ export interface DefaultCreditsRollOutroPremiumProps extends BaseRemotionSceneProps {
10
+ title: string
11
+ note?: 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: 'DefaultCreditsRollOutroPremium',
23
+ description: 'Premium credits roll outro bumper',
24
+ sourceFile: 'src/core/outro/credits-roll-outro-premium/default-credits-roll-outro.tsx',
25
+ aspectRatio: '16:9',
26
+ sceneType: 'outro',
27
+ tags: ['outro', 'credits', 'premium', 'credits-roll', 'film'],
28
+ propsTypeName: 'DefaultCreditsRollOutroPremiumProps',
29
+ })
30
+
31
+ export function DefaultCreditsRollOutroPremium({
32
+ id,
33
+ name,
34
+ title,
35
+ note,
36
+ kicker,
37
+ creditLine,
38
+ footer,
39
+ accent,
40
+ secondaryAccent,
41
+ textColor,
42
+ }: DefaultCreditsRollOutroPremiumProps) {
43
+ const runtime = useRemotionSceneRuntime()
44
+ const motion = useSceneMotion()
45
+ const resolvedLayout = resolveOutroLayout(undefined, runtime.width, runtime.height)
46
+ const portrait = resolvedLayout === 'horizontal'
47
+
48
+ return (
49
+ <BaseRemotionScene
50
+ id={id}
51
+ name={name}
52
+ style={{
53
+ background: portrait
54
+ ? 'linear-gradient(180deg, #0f172a 0%, #020617 44%, #000000 100%)'
55
+ : `radial-gradient(circle at 50% 24%, ${accent ?? '#111827'} 0%, ${secondaryAccent ?? '#475569'} 38%, #020617 100%)`,
56
+ color: textColor ?? '#f8fafc',
57
+ display: 'grid',
58
+ placeItems: 'center',
59
+ padding: Math.round(runtime.height * 0.07),
60
+ }}
61
+ >
62
+ <section style={{ width: '100%', height: '100%', display: 'grid', gridTemplateColumns: portrait ? '1fr' : '1fr minmax(260px, 0.8fr)', gap: portrait ? 18 : 24, alignItems: 'center', minWidth: 0, minHeight: 0 }}>
63
+ <div style={{ display: 'grid', gap: 12, textAlign: portrait ? 'center' : 'left', minWidth: 0 }}>
64
+ <p style={{ margin: 0, fontSize: Math.round(runtime.height * 0.017), letterSpacing: '0.34em', textTransform: 'uppercase', opacity: 0.64 }}>{kicker ?? 'Final Credits'}</p>
65
+ <h1 style={{ margin: 0, fontSize: portrait ? Math.round(runtime.height * 0.076) : Math.round(runtime.height * 0.07), lineHeight: 0.9, letterSpacing: '-0.08em', textTransform: 'uppercase', transform: motion.isAnimation ? `translate3d(0, ${(1 - motion.progress) * 10}px, 0)` : 'none' }}>
66
+ {title}
67
+ </h1>
68
+ {note ? <p style={{ margin: 0, maxWidth: getOutroBodyMaxWidth(runtime.width, resolvedLayout, 0.58, 0.42, { min: 240, max: 680 }), fontSize: Math.round(runtime.height * 0.023), lineHeight: 1.56, opacity: 0.82, ...getOutroLineClamp(portrait ? 4 : 3) }}>{note}</p> : null}
69
+ <div style={{ display: 'flex', flexWrap: 'wrap', justifyContent: portrait ? 'center' : 'flex-start', gap: 10 }}>
70
+ {creditLine ? <span style={{ fontSize: Math.round(runtime.height * 0.015), letterSpacing: '0.2em', textTransform: 'uppercase', opacity: 0.72 }}>{creditLine}</span> : null}
71
+ {footer ? <span style={{ fontSize: Math.round(runtime.height * 0.015), letterSpacing: '0.2em', textTransform: 'uppercase', opacity: 0.52 }}>{footer}</span> : null}
72
+ </div>
73
+ </div>
74
+
75
+ <div style={{ display: 'grid', alignContent: 'center', minWidth: 0 }}>
76
+ <div style={{ border: '1px solid rgba(248,250,252,0.1)', background: 'rgba(15,23,42,0.24)', padding: 18, display: 'grid', gap: 10, position: 'relative', overflow: 'hidden' }}>
77
+ <div style={{ position: 'absolute', inset: 0, background: 'linear-gradient(180deg, rgba(255,255,255,0.04) 0%, transparent 32%, rgba(0,0,0,0.18) 100%)', pointerEvents: 'none' }} />
78
+ <div style={{ fontSize: Math.round(runtime.height * 0.016), letterSpacing: '0.24em', textTransform: 'uppercase', opacity: 0.56 }}>Cast and Crew</div>
79
+ <div style={{ fontSize: Math.round(runtime.height * 0.03), fontWeight: 800, letterSpacing: '-0.06em' }}>Rolling the names in style</div>
80
+ <div style={{ fontSize: Math.round(runtime.height * 0.022), lineHeight: 1.5, opacity: 0.8 }}>A cleaner, premium end-credit block for prestige films and large-scale productions.</div>
81
+ </div>
82
+ </div>
83
+ </section>
84
+ </BaseRemotionScene>
85
+ )
86
+ }
87
+
88
+ VideoComponent(componentMetadata)(DefaultCreditsRollOutroPremium)
@@ -0,0 +1,10 @@
1
+ export { DefaultCreditsRollOutroPremium } from './default-credits-roll-outro'
2
+ export { componentMetadata } from './default-credits-roll-outro'
3
+ export {
4
+ DefaultCreditsRollOutroPremiumLandscape,
5
+ componentMetadata as DefaultCreditsRollOutroPremiumLandscapeMetadata,
6
+ } from './default-credits-roll-outro-Landscape'
7
+ export {
8
+ DefaultCreditsRollOutroPremiumHorizontal,
9
+ componentMetadata as DefaultCreditsRollOutroPremiumHorizontalMetadata,
10
+ } from './default-credits-roll-outro-Horizontal'
@@ -0,0 +1,25 @@
1
+ import type { ComponentProps } from 'react'
2
+
3
+ import { VideoComponent, type ScenePluginMetadata } from '@vibecuting/component-project-helper'
4
+
5
+ import { DefaultCreditsRollOutroRoyal, componentMetadata as baseComponentMetadata } from './default-credits-roll-outro'
6
+
7
+ export const componentMetadata: ScenePluginMetadata = {
8
+ ...baseComponentMetadata,
9
+ resourceKind: 'scene',
10
+ pluginKey: 'core.outro.credits-roll-royal',
11
+ sceneFamily: 'custom',
12
+ rootLayout: 'absolute-fill',
13
+ name: 'DefaultCreditsRollOutroRoyalHorizontal',
14
+ description: 'Royal credits-roll outro bumper (Portrait 9:16 variant)',
15
+ sourceFile: 'src/core/outro/credits-roll-outro-royal/default-credits-roll-outro-Horizontal.tsx',
16
+ aspectRatio: '9:16',
17
+ tags: Array.from(new Set([...(baseComponentMetadata.tags ?? []), 'horizontal'])),
18
+ }
19
+
20
+ export const DefaultCreditsRollOutroRoyalHorizontal = VideoComponent(componentMetadata)(function DefaultCreditsRollOutroRoyalHorizontal(
21
+ props: ComponentProps<typeof DefaultCreditsRollOutroRoyal>,
22
+ ) {
23
+ return <DefaultCreditsRollOutroRoyal {...props} />
24
+ })
25
+
@@ -0,0 +1,25 @@
1
+ import type { ComponentProps } from 'react'
2
+
3
+ import { VideoComponent, type ScenePluginMetadata } from '@vibecuting/component-project-helper'
4
+
5
+ import { DefaultCreditsRollOutroRoyal, componentMetadata as baseComponentMetadata } from './default-credits-roll-outro'
6
+
7
+ export const componentMetadata: ScenePluginMetadata = {
8
+ ...baseComponentMetadata,
9
+ resourceKind: 'scene',
10
+ pluginKey: 'core.outro.credits-roll-royal',
11
+ sceneFamily: 'custom',
12
+ rootLayout: 'absolute-fill',
13
+ name: 'DefaultCreditsRollOutroRoyalLandscape',
14
+ description: 'Royal credits-roll outro bumper (Landscape 16:9 variant)',
15
+ sourceFile: 'src/core/outro/credits-roll-outro-royal/default-credits-roll-outro-Landscape.tsx',
16
+ aspectRatio: '16:9',
17
+ tags: Array.from(new Set([...(baseComponentMetadata.tags ?? []), 'landscape'])),
18
+ }
19
+
20
+ export const DefaultCreditsRollOutroRoyalLandscape = VideoComponent(componentMetadata)(function DefaultCreditsRollOutroRoyalLandscape(
21
+ props: ComponentProps<typeof DefaultCreditsRollOutroRoyal>,
22
+ ) {
23
+ return <DefaultCreditsRollOutroRoyal {...props} />
24
+ })
25
+
@@ -0,0 +1,32 @@
1
+ import { DefaultCreditsRollOutroRoyalHorizontal } from './default-credits-roll-outro-Horizontal'
2
+ import { DefaultCreditsRollOutroRoyalLandscape } from './default-credits-roll-outro-Landscape'
3
+
4
+ const args = {
5
+ kicker: 'Royal Credits',
6
+ title: 'A Noble Ending',
7
+ note: 'A richer gold-and-ink closing card for prestige and awards-season finales.',
8
+ creditLine: 'A Vibecuting Original',
9
+ footer: 'End Credits',
10
+ accent: '#111827',
11
+ secondaryAccent: '#b45309',
12
+ }
13
+
14
+ const meta = {
15
+ title: 'core/outro/credits-roll-outro-royal/DefaultCreditsRollOutroRoyalLandscape',
16
+ component: DefaultCreditsRollOutroRoyalLandscape,
17
+ args,
18
+ }
19
+
20
+ export default meta
21
+
22
+ export const Default = { parameters: { scenePreviewAspectRatio: '16:9' } }
23
+ export const Animated = { parameters: { scenePreviewAspectRatio: '16:9', scenePreviewMode: 'animation' } }
24
+ export const Horizontal = {
25
+ render: (storyArgs: typeof args) => <DefaultCreditsRollOutroRoyalHorizontal {...storyArgs} />,
26
+ parameters: { scenePreviewAspectRatio: '9:16' },
27
+ }
28
+ export const HorizontalAnimated = {
29
+ render: (storyArgs: typeof args) => <DefaultCreditsRollOutroRoyalHorizontal {...storyArgs} />,
30
+ parameters: { scenePreviewAspectRatio: '9:16', scenePreviewMode: 'animation' },
31
+ }
32
+
@@ -0,0 +1,110 @@
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 type { OutroLayout } from '../_shared/outro-layout'
8
+ import { getOutroBodyMaxWidth, getOutroLineClamp, getOutroTypographyScale, resolveOutroLayout } from '../_shared/outro-layout'
9
+
10
+ export interface DefaultCreditsRollOutroRoyalProps extends BaseRemotionSceneProps {
11
+ title: string
12
+ note?: string
13
+ kicker?: string
14
+ creditLine?: string
15
+ footer?: string
16
+ accent?: string
17
+ secondaryAccent?: string
18
+ textColor?: string
19
+ layout?: OutroLayout
20
+ children?: ReactNode
21
+ }
22
+
23
+ export const componentMetadata = defineComponentProjectComponentMetadata({
24
+ name: 'DefaultCreditsRollOutroRoyal',
25
+ description: 'Royal credits outro with serif framing and a gilded end-title block',
26
+ sourceFile: 'src/core/outro/credits-roll-outro-royal/default-credits-roll-outro.tsx',
27
+ aspectRatio: '16:9',
28
+ sceneType: 'outro',
29
+ tags: ['outro', 'credits', 'royal', 'gold', 'roll'],
30
+ propsTypeName: 'DefaultCreditsRollOutroRoyalProps',
31
+ })
32
+
33
+ export function DefaultCreditsRollOutroRoyal({
34
+ id,
35
+ name,
36
+ title,
37
+ note,
38
+ kicker,
39
+ creditLine,
40
+ footer,
41
+ accent,
42
+ secondaryAccent,
43
+ textColor,
44
+ layout,
45
+ }: DefaultCreditsRollOutroRoyalProps) {
46
+ const runtime = useRemotionSceneRuntime()
47
+ const motion = useSceneMotion()
48
+ const resolvedLayout = resolveOutroLayout(layout, runtime.width, runtime.height)
49
+ const isHorizontal = resolvedLayout === 'horizontal'
50
+ const { titleFontSize, noteFontSize, kickerFontSize, footerFontSize } = getOutroTypographyScale(
51
+ runtime.height,
52
+ resolvedLayout,
53
+ )
54
+
55
+ return (
56
+ <BaseRemotionScene
57
+ id={id}
58
+ name={name}
59
+ style={{
60
+ background: isHorizontal
61
+ ? `radial-gradient(circle at 50% 24%, ${secondaryAccent ?? '#b45309'} 0%, ${accent ?? '#111827'} 42%, #020617 100%)`
62
+ : 'linear-gradient(180deg, #020617 0%, #111827 44%, #000000 100%)',
63
+ color: textColor ?? '#fef3c7',
64
+ display: 'grid',
65
+ placeItems: 'center',
66
+ padding: Math.round(runtime.height * (isHorizontal ? 0.055 : 0.07)),
67
+ fontFamily: `Georgia, 'Times New Roman', serif`,
68
+ }}
69
+ >
70
+ <section style={{ width: '100%', height: '100%', display: 'grid', gridTemplateColumns: isHorizontal ? '1fr' : 'minmax(0, 0.82fr) minmax(300px, 1.18fr)', gap: isHorizontal ? 16 : 24, alignItems: 'stretch', minWidth: 0, minHeight: 0 }}>
71
+ <div style={{ display: 'grid', gap: 12, textAlign: isHorizontal ? 'center' : 'left', minWidth: 0, alignContent: 'center' }}>
72
+ <p style={{ margin: 0, fontSize: kickerFontSize, letterSpacing: '0.36em', textTransform: 'uppercase', opacity: 0.66 }}>{kicker ?? 'Royal Credits'}</p>
73
+ <h1 style={{ margin: 0, fontSize: titleFontSize, lineHeight: 0.92, letterSpacing: '-0.08em', textTransform: 'uppercase', transform: motion.isAnimation ? `translate3d(0, ${(1 - motion.progress) * 10}px, 0)` : 'none' }}>{title}</h1>
74
+ {note ? <p style={{ margin: 0, maxWidth: getOutroBodyMaxWidth(runtime.width, resolvedLayout, 0.56, 0.42, { min: 240, max: 720 }), fontSize: noteFontSize, lineHeight: 1.55, opacity: 0.84, ...getOutroLineClamp(isHorizontal ? 3 : 4) }}>{note}</p> : null}
75
+ <div style={{ display: 'flex', flexWrap: 'wrap', justifyContent: isHorizontal ? 'center' : 'flex-start', gap: 10 }}>
76
+ {creditLine ? <span style={{ fontSize: footerFontSize, letterSpacing: '0.2em', textTransform: 'uppercase', opacity: 0.72 }}>{creditLine}</span> : null}
77
+ {footer ? <span style={{ fontSize: footerFontSize, letterSpacing: '0.18em', textTransform: 'uppercase', opacity: 0.52 }}>{footer}</span> : null}
78
+ </div>
79
+ </div>
80
+
81
+ <div style={{ display: 'grid', alignContent: 'center', minWidth: 0 }}>
82
+ <div style={{ border: '1px solid rgba(254,243,199,0.18)', background: 'linear-gradient(180deg, rgba(245,158,11,0.1) 0%, rgba(17,24,39,0.22) 40%, rgba(2,6,23,0.94) 100%)', padding: 18, display: 'grid', gap: 12, minHeight: isHorizontal ? 220 : 280, position: 'relative', overflow: 'hidden' }}>
83
+ <div style={{ position: 'absolute', inset: 0, borderTop: '2px solid rgba(245,158,11,0.9)' }} />
84
+ <div style={{ display: 'grid', gridTemplateColumns: isHorizontal ? '1fr' : 'minmax(0, 0.72fr) minmax(0, 1.28fr)', gap: 12, minWidth: 0 }}>
85
+ <div style={{ border: '1px solid rgba(254,243,199,0.14)', padding: 14, background: 'rgba(0,0,0,0.16)', display: 'grid', gap: 8 }}>
86
+ <span style={{ fontSize: Math.round(runtime.height * 0.016), letterSpacing: '0.28em', textTransform: 'uppercase', opacity: 0.56 }}>End Titles</span>
87
+ <span style={{ fontSize: Math.round(runtime.height * 0.028), fontWeight: 800, letterSpacing: '-0.05em' }}>A noble ending</span>
88
+ <span style={{ fontSize: Math.round(runtime.height * 0.018), lineHeight: 1.55, opacity: 0.8, ...getOutroLineClamp(3) }}>Framed like a heritage plaque, not a generic credits panel.</span>
89
+ </div>
90
+ <div style={{ display: 'grid', gap: 8 }}>
91
+ {[
92
+ ['Produced', 'Vibecuting Royal'],
93
+ ['Presented', 'Prestige Edition'],
94
+ ['Crafted', 'Final Cut Guild'],
95
+ ].map(([label, value]) => (
96
+ <div key={label} style={{ display: 'flex', justifyContent: 'space-between', gap: 12, fontSize: Math.round(runtime.height * (isHorizontal ? 0.02 : 0.018)), border: '1px solid rgba(254,243,199,0.1)', padding: '10px 12px', background: 'rgba(0,0,0,0.14)', minWidth: 0 }}>
97
+ <span style={{ opacity: 0.56, textTransform: 'uppercase', letterSpacing: '0.18em' }}>{label}</span>
98
+ <span style={getOutroLineClamp(1)}>{value}</span>
99
+ </div>
100
+ ))}
101
+ </div>
102
+ </div>
103
+ </div>
104
+ </div>
105
+ </section>
106
+ </BaseRemotionScene>
107
+ )
108
+ }
109
+
110
+ VideoComponent(componentMetadata)(DefaultCreditsRollOutroRoyal)
@@ -0,0 +1,11 @@
1
+ export { DefaultCreditsRollOutroRoyal } from './default-credits-roll-outro'
2
+ export { componentMetadata } from './default-credits-roll-outro'
3
+ export {
4
+ DefaultCreditsRollOutroRoyalLandscape,
5
+ componentMetadata as DefaultCreditsRollOutroRoyalLandscapeMetadata,
6
+ } from './default-credits-roll-outro-Landscape'
7
+ export {
8
+ DefaultCreditsRollOutroRoyalHorizontal,
9
+ componentMetadata as DefaultCreditsRollOutroRoyalHorizontalMetadata,
10
+ } from './default-credits-roll-outro-Horizontal'
11
+
@@ -0,0 +1,22 @@
1
+ import {
2
+ VideoComponent,
3
+ defineComponentProjectComponentMetadata,
4
+ } from '@vibecuting/component-project-helper'
5
+
6
+ import { DefaultBlackoutOutroBumper, type DefaultBlackoutOutroBumperProps } from './default-blackout-outro-bumper'
7
+
8
+ export const componentMetadata = defineComponentProjectComponentMetadata({
9
+ name: 'DefaultBlackoutOutroBumperHorizontal',
10
+ description: 'Blackout outro bumper in a native 9:16 layout',
11
+ sourceFile: 'src/core/outro/default-blackout-outro-bumper/default-blackout-outro-bumper-Horizontal.tsx',
12
+ aspectRatio: '9:16',
13
+ sceneType: 'outro',
14
+ tags: ['outro', 'bumper', 'blackout', 'portrait'],
15
+ propsTypeName: 'DefaultBlackoutOutroBumperProps',
16
+ })
17
+
18
+ export const DefaultBlackoutOutroBumperHorizontal = VideoComponent(componentMetadata)(
19
+ function DefaultBlackoutOutroBumperHorizontal(props: DefaultBlackoutOutroBumperProps) {
20
+ return <DefaultBlackoutOutroBumper {...props} layout="horizontal" />
21
+ },
22
+ )
@@ -0,0 +1,22 @@
1
+ import {
2
+ VideoComponent,
3
+ defineComponentProjectComponentMetadata,
4
+ } from '@vibecuting/component-project-helper'
5
+
6
+ import { DefaultBlackoutOutroBumper, type DefaultBlackoutOutroBumperProps } from './default-blackout-outro-bumper'
7
+
8
+ export const componentMetadata = defineComponentProjectComponentMetadata({
9
+ name: 'DefaultBlackoutOutroBumperLandscape',
10
+ description: 'Blackout outro bumper in a widescreen 16:9 layout',
11
+ sourceFile: 'src/core/outro/default-blackout-outro-bumper/default-blackout-outro-bumper-Landscape.tsx',
12
+ aspectRatio: '16:9',
13
+ sceneType: 'outro',
14
+ tags: ['outro', 'bumper', 'blackout', 'landscape'],
15
+ propsTypeName: 'DefaultBlackoutOutroBumperProps',
16
+ })
17
+
18
+ export const DefaultBlackoutOutroBumperLandscape = VideoComponent(componentMetadata)(
19
+ function DefaultBlackoutOutroBumperLandscape(props: DefaultBlackoutOutroBumperProps) {
20
+ return <DefaultBlackoutOutroBumper {...props} layout="landscape" />
21
+ },
22
+ )
@@ -0,0 +1,48 @@
1
+ import { DefaultBlackoutOutroBumperHorizontal } from './default-blackout-outro-bumper-Horizontal'
2
+ import { DefaultBlackoutOutroBumperLandscape } from './default-blackout-outro-bumper-Landscape'
3
+
4
+ const args = {
5
+ kicker: 'Fade Out',
6
+ title: 'The End',
7
+ note: 'A near-empty blackout ending with a single line and faint signal.',
8
+ creditLine: 'Closing Sequence',
9
+ footer: 'End Credits',
10
+ accent: '#020617',
11
+ secondaryAccent: '#374151',
12
+ }
13
+
14
+ const meta = {
15
+ title: 'core/outro/default-blackout-outro-bumper/DefaultBlackoutOutroBumperLandscape',
16
+ component: DefaultBlackoutOutroBumperLandscape,
17
+ args,
18
+ }
19
+
20
+ export default meta
21
+
22
+ export const Landscape = {
23
+ parameters: {
24
+ scenePreviewAspectRatio: '16:9',
25
+ },
26
+ }
27
+
28
+ export const LandscapeAnimated = {
29
+ parameters: {
30
+ scenePreviewAspectRatio: '16:9',
31
+ scenePreviewMode: 'animation',
32
+ },
33
+ }
34
+
35
+ export const Horizontal = {
36
+ render: (storyArgs: typeof args) => <DefaultBlackoutOutroBumperHorizontal {...storyArgs} />,
37
+ parameters: {
38
+ scenePreviewAspectRatio: '9:16',
39
+ },
40
+ }
41
+
42
+ export const HorizontalAnimated = {
43
+ render: (storyArgs: typeof args) => <DefaultBlackoutOutroBumperHorizontal {...storyArgs} />,
44
+ parameters: {
45
+ scenePreviewAspectRatio: '9:16',
46
+ scenePreviewMode: 'animation',
47
+ },
48
+ }