@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
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@vibecuting/video-project-core",
3
- "version": "0.1.26",
3
+ "version": "0.1.27",
4
4
  "type": "module",
5
5
  "license": "SEE LICENSE IN LICENSE",
6
6
  "main": "src/index.ts",
@@ -16,13 +16,13 @@
16
16
  "dev": "storybook dev -p 6010 --host 0.0.0.0",
17
17
  "preview": "storybook dev -p 6010 --host 0.0.0.0",
18
18
  "build:storybook": "storybook build",
19
- "lint": "node ../../../scripts/run-eslint.mjs .",
20
- "lint:fix": "node ../../../scripts/run-eslint.mjs . --fix",
19
+ "lint": "node ../../../scripts/run-eslint.mjs src .storybook",
20
+ "lint:fix": "node ../../../scripts/run-eslint.mjs src .storybook --fix",
21
21
  "typecheck": "pnpm exec tsc -p tsconfig.json --noEmit",
22
22
  "test": "pnpm exec vitest run"
23
23
  },
24
24
  "dependencies": {
25
- "@vibecuting/component-project-helper": "0.1.26",
25
+ "@vibecuting/component-project-helper": "0.1.27",
26
26
  "@remotion/transitions": "4.0.473",
27
27
  "mermaid": "^11.12.2",
28
28
  "react": "^19.0.0",
@@ -0,0 +1,18 @@
1
+ import { describe, expect, it } from 'vitest'
2
+
3
+ import { getIntroBodyMaxWidth, getIntroLineClamp, getIntroPanelMinHeight, getIntroPanelPadding } from './intro-layout'
4
+
5
+ describe('intro layout helpers', () => {
6
+ it('keeps portrait constraints tighter than landscape ones', () => {
7
+ expect(getIntroBodyMaxWidth(1080, false, 0.9, 0.42, { min: 240, max: 760 })).toBeGreaterThan(
8
+ getIntroBodyMaxWidth(1080, true, 0.9, 0.42, { min: 240, max: 760 }),
9
+ )
10
+
11
+ expect(getIntroPanelMinHeight(1920, true, 0.32, 0.22, { min: 160, max: 360 })).toBeLessThanOrEqual(360)
12
+ expect(getIntroPanelPadding(1920, true, 0.02, 0.014, { min: 12, max: 24 })).toBeGreaterThanOrEqual(12)
13
+ expect(getIntroLineClamp(3)).toMatchObject({
14
+ display: '-webkit-box',
15
+ WebkitLineClamp: 3,
16
+ })
17
+ })
18
+ })
@@ -0,0 +1,50 @@
1
+ export function getIntroBodyMaxWidth(
2
+ width: number,
3
+ portrait: boolean,
4
+ landscapeRatio: number,
5
+ portraitRatio: number,
6
+ options?: { min?: number; max?: number },
7
+ ) {
8
+ const ratio = portrait ? portraitRatio : landscapeRatio
9
+ const minimum = options?.min ?? 240
10
+ const maximum = options?.max ?? 760
11
+
12
+ return Math.min(Math.max(Math.round(width * ratio), minimum), maximum)
13
+ }
14
+
15
+ export function getIntroPanelMinHeight(
16
+ height: number,
17
+ portrait: boolean,
18
+ landscapeRatio: number,
19
+ portraitRatio: number,
20
+ options?: { min?: number; max?: number },
21
+ ) {
22
+ const ratio = portrait ? portraitRatio : landscapeRatio
23
+ const minimum = options?.min ?? 120
24
+ const maximum = options?.max ?? 380
25
+
26
+ return Math.min(Math.max(Math.round(height * ratio), minimum), maximum)
27
+ }
28
+
29
+ export function getIntroPanelPadding(
30
+ height: number,
31
+ portrait: boolean,
32
+ landscapeRatio: number,
33
+ portraitRatio: number,
34
+ options?: { min?: number; max?: number },
35
+ ) {
36
+ const ratio = portrait ? portraitRatio : landscapeRatio
37
+ const minimum = options?.min ?? 12
38
+ const maximum = options?.max ?? 24
39
+
40
+ return Math.min(Math.max(Math.round(height * ratio), minimum), maximum)
41
+ }
42
+
43
+ export function getIntroLineClamp(lines: number) {
44
+ return {
45
+ display: '-webkit-box',
46
+ WebkitLineClamp: lines,
47
+ WebkitBoxOrient: 'vertical' as const,
48
+ overflow: 'hidden',
49
+ }
50
+ }
@@ -0,0 +1,25 @@
1
+ import type { ComponentProps } from 'react'
2
+
3
+ import { VideoComponent, type ScenePluginMetadata } from '@vibecuting/component-project-helper'
4
+
5
+ import { DefaultCyberpunkIntroBumperHolo, componentMetadata as baseComponentMetadata } from './default-cyberpunk-intro-bumper'
6
+
7
+ export const componentMetadata: ScenePluginMetadata = {
8
+ ...baseComponentMetadata,
9
+ resourceKind: 'scene',
10
+ pluginKey: 'core.intro.cyberpunk-holo',
11
+ sceneFamily: 'custom',
12
+ rootLayout: 'absolute-fill',
13
+ name: 'DefaultCyberpunkIntroBumperHoloHorizontal',
14
+ description: 'Cyberpunk hologram intro bumper (Portrait 9:16 variant)',
15
+ sourceFile: 'src/core/intro/cyberpunk-intro-holo/default-cyberpunk-intro-bumper-Horizontal.tsx',
16
+ aspectRatio: '9:16',
17
+ tags: Array.from(new Set([...(baseComponentMetadata.tags ?? []), 'horizontal'])),
18
+ }
19
+
20
+ export const DefaultCyberpunkIntroBumperHoloHorizontal = VideoComponent(componentMetadata)(function DefaultCyberpunkIntroBumperHoloHorizontal(
21
+ props: ComponentProps<typeof DefaultCyberpunkIntroBumperHolo>,
22
+ ) {
23
+ return <DefaultCyberpunkIntroBumperHolo {...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 { DefaultCyberpunkIntroBumperHolo, componentMetadata as baseComponentMetadata } from './default-cyberpunk-intro-bumper'
6
+
7
+ export const componentMetadata: ScenePluginMetadata = {
8
+ ...baseComponentMetadata,
9
+ resourceKind: 'scene',
10
+ pluginKey: 'core.intro.cyberpunk-holo',
11
+ sceneFamily: 'custom',
12
+ rootLayout: 'absolute-fill',
13
+ name: 'DefaultCyberpunkIntroBumperHoloLandscape',
14
+ description: 'Cyberpunk hologram intro bumper (Landscape 16:9 variant)',
15
+ sourceFile: 'src/core/intro/cyberpunk-intro-holo/default-cyberpunk-intro-bumper-Landscape.tsx',
16
+ aspectRatio: '16:9',
17
+ tags: Array.from(new Set([...(baseComponentMetadata.tags ?? []), 'landscape'])),
18
+ }
19
+
20
+ export const DefaultCyberpunkIntroBumperHoloLandscape = VideoComponent(componentMetadata)(function DefaultCyberpunkIntroBumperHoloLandscape(
21
+ props: ComponentProps<typeof DefaultCyberpunkIntroBumperHolo>,
22
+ ) {
23
+ return <DefaultCyberpunkIntroBumperHolo {...props} />
24
+ })
25
+
@@ -0,0 +1,31 @@
1
+ import { DefaultCyberpunkIntroBumperHoloHorizontal } from './default-cyberpunk-intro-bumper-Horizontal'
2
+ import { DefaultCyberpunkIntroBumperHoloLandscape } from './default-cyberpunk-intro-bumper-Landscape'
3
+
4
+ const args = {
5
+ kicker: 'Holo Signal',
6
+ title: 'Neon Ghost',
7
+ subtitle: 'A hologram opener with telemetry rails, scan rings, and a denser signal stack.',
8
+ creditLine: 'A Vibecuting Original',
9
+ footer: 'Opening Sequence',
10
+ accent: '#030712',
11
+ secondaryAccent: '#67e8f9',
12
+ }
13
+
14
+ const meta = {
15
+ title: 'core/intro/cyberpunk-intro-holo/DefaultCyberpunkIntroBumperHoloLandscape',
16
+ component: DefaultCyberpunkIntroBumperHoloLandscape,
17
+ args,
18
+ }
19
+
20
+ export default meta
21
+
22
+ export const Default = {}
23
+ export const Animated = { parameters: { scenePreviewMode: 'animation' } }
24
+ export const Horizontal = {
25
+ render: (storyArgs: typeof args) => <DefaultCyberpunkIntroBumperHoloHorizontal {...storyArgs} />,
26
+ parameters: { scenePreviewAspectRatio: '9:16' },
27
+ }
28
+ export const HorizontalAnimated = {
29
+ render: (storyArgs: typeof args) => <DefaultCyberpunkIntroBumperHoloHorizontal {...storyArgs} />,
30
+ parameters: { scenePreviewMode: 'animation', scenePreviewAspectRatio: '9:16' },
31
+ }
@@ -0,0 +1,118 @@
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, getIntroPanelMinHeight, getIntroPanelPadding } from '../_shared/intro-layout'
8
+
9
+ export interface DefaultCyberpunkIntroBumperHoloProps 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: 'DefaultCyberpunkIntroBumperHolo',
23
+ description: 'Cyberpunk hologram intro with scan ring and telemetry stack, optimized for landscape and portrait previews',
24
+ sourceFile: 'src/core/intro/cyberpunk-intro-holo/default-cyberpunk-intro-bumper.tsx',
25
+ aspectRatio: '16:9',
26
+ sceneType: 'intro',
27
+ tags: ['intro', 'bumper', 'cyberpunk', 'hologram', 'future'],
28
+ propsTypeName: 'DefaultCyberpunkIntroBumperHoloProps',
29
+ })
30
+
31
+ export function DefaultCyberpunkIntroBumperHolo({
32
+ id,
33
+ name,
34
+ title,
35
+ subtitle,
36
+ kicker,
37
+ creditLine,
38
+ footer,
39
+ accent,
40
+ secondaryAccent,
41
+ textColor,
42
+ children,
43
+ }: DefaultCyberpunkIntroBumperHoloProps) {
44
+ const runtime = useRemotionSceneRuntime()
45
+ const motion = useSceneMotion()
46
+ const portrait = runtime.height > runtime.width
47
+
48
+ return (
49
+ <BaseRemotionScene
50
+ id={id}
51
+ name={name}
52
+ style={{
53
+ background: portrait
54
+ ? `linear-gradient(180deg, ${accent ?? '#020617'} 0%, #030712 42%, #000000 100%)`
55
+ : `radial-gradient(circle at 18% 20%, ${secondaryAccent ?? '#67e8f9'} 0%, ${accent ?? '#030712'} 40%, #000000 100%)`,
56
+ color: textColor ?? '#ecfeff',
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.84fr) minmax(300px, 1.16fr)', gap: portrait ? 18 : 24, alignItems: 'stretch', minWidth: 0, minHeight: 0, overflow: 'hidden' }}>
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.68 }}>
65
+ {kicker ?? 'Holographic Signal'}
66
+ </p>
67
+ <h1 style={{ margin: 0, fontSize: portrait ? Math.round(runtime.height * 0.078) : Math.round(runtime.height * 0.072), lineHeight: 0.9, letterSpacing: '-0.08em', textTransform: 'uppercase', textShadow: '0 0 24px rgba(103,232,249,0.28)', transform: motion.isAnimation ? `translate3d(0, ${(1 - motion.progress) * 8}px, 0)` : 'none' }}>
68
+ {title}
69
+ </h1>
70
+ {subtitle ? <p style={{ margin: 0, maxWidth: getIntroBodyMaxWidth(runtime.width, portrait, 0.42, 1, { min: 240, max: 680 }), fontSize: Math.round(runtime.height * 0.023), lineHeight: 1.56, opacity: 0.82, ...getIntroLineClamp(portrait ? 4 : 3) }}>{subtitle}</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', gap: 12, alignContent: 'center', minWidth: 0 }}>
78
+ <div style={{ width: '100%', minWidth: 0, border: '1px solid rgba(236,254,255,0.14)', background: 'linear-gradient(160deg, rgba(103,232,249,0.14) 0%, rgba(168,85,247,0.16) 34%, rgba(2,6,23,0.96) 100%)', padding: getIntroPanelPadding(runtime.height, portrait, 0.008, 0.007, { min: 12, max: 18 }), display: 'grid', gap: 12, overflow: 'hidden', minHeight: getIntroPanelMinHeight(runtime.height, portrait, 0.3, 0.24, { min: 220, max: 340 }) }}>
79
+ <div style={{ display: 'grid', gridTemplateColumns: portrait ? '1fr' : 'minmax(0, 0.88fr) minmax(0, 1.12fr)', gap: 12, minWidth: 0 }}>
80
+ <div style={{ border: '1px solid rgba(236,254,255,0.08)', background: 'rgba(0,0,0,0.16)', padding: 14, display: 'grid', placeItems: 'center', minHeight: portrait ? 120 : 220 }}>
81
+ <div style={{ display: 'grid', gap: 8, textAlign: 'center' }}>
82
+ <div style={{ fontSize: Math.round(runtime.height * 0.017), letterSpacing: '0.24em', textTransform: 'uppercase', opacity: 0.58 }}>Neon Grid</div>
83
+ <div style={{ fontSize: Math.round(runtime.height * 0.029), fontWeight: 800, letterSpacing: '-0.06em' }}>Boot sequence online</div>
84
+ </div>
85
+ </div>
86
+ <div style={{ display: 'grid', gap: 10, alignContent: 'center', minWidth: 0 }}>
87
+ {['Scan', 'Link', 'Pulse', 'Node'].map((label, index) => (
88
+ <div
89
+ key={label}
90
+ style={{
91
+ border: '1px solid rgba(236,254,255,0.1)',
92
+ background: index === 2 ? 'rgba(103,232,249,0.12)' : 'rgba(0,0,0,0.16)',
93
+ padding: '12px 14px',
94
+ display: 'flex',
95
+ justifyContent: 'space-between',
96
+ gap: 12,
97
+ textTransform: 'uppercase',
98
+ letterSpacing: '0.2em',
99
+ fontSize: Math.round(runtime.height * 0.014),
100
+ opacity: 0.8,
101
+ minWidth: 0,
102
+ }}
103
+ >
104
+ <span style={{ minWidth: 0 }}>{label}</span>
105
+ <span style={{ minWidth: 0 }}>{index === 0 ? 'active' : index === 1 ? 'sync' : index === 2 ? 'hot' : 'ready'}</span>
106
+ </div>
107
+ ))}
108
+ </div>
109
+ </div>
110
+ </div>
111
+ </div>
112
+ </section>
113
+ {children ? <div style={{ position: 'absolute', inset: 'auto 0 8%', display: 'grid', placeItems: 'center' }}>{children}</div> : null}
114
+ </BaseRemotionScene>
115
+ )
116
+ }
117
+
118
+ VideoComponent(componentMetadata)(DefaultCyberpunkIntroBumperHolo)
@@ -0,0 +1,11 @@
1
+ export { DefaultCyberpunkIntroBumperHolo } from './default-cyberpunk-intro-bumper'
2
+ export { componentMetadata } from './default-cyberpunk-intro-bumper'
3
+ export {
4
+ DefaultCyberpunkIntroBumperHoloLandscape,
5
+ componentMetadata as DefaultCyberpunkIntroBumperHoloLandscapeMetadata,
6
+ } from './default-cyberpunk-intro-bumper-Landscape'
7
+ export {
8
+ DefaultCyberpunkIntroBumperHoloHorizontal,
9
+ componentMetadata as DefaultCyberpunkIntroBumperHoloHorizontalMetadata,
10
+ } from './default-cyberpunk-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 { DefaultCyberpunkIntroBumperNeon, componentMetadata as baseComponentMetadata } from './default-cyberpunk-intro-bumper'
6
+
7
+ export const componentMetadata: ScenePluginMetadata = {
8
+ ...baseComponentMetadata,
9
+ resourceKind: 'scene',
10
+ pluginKey: 'core.intro.cyberpunk-neon',
11
+ sceneFamily: 'custom',
12
+ rootLayout: 'absolute-fill',
13
+ name: 'DefaultCyberpunkIntroBumperNeonHorizontal',
14
+ description: 'Cyberpunk neon intro bumper (Portrait 9:16 variant)',
15
+ sourceFile: 'src/core/intro/cyberpunk-intro-neon/default-cyberpunk-intro-bumper-Horizontal.tsx',
16
+ aspectRatio: '9:16',
17
+ tags: Array.from(new Set([...(baseComponentMetadata.tags ?? []), 'horizontal'])),
18
+ }
19
+
20
+ export const DefaultCyberpunkIntroBumperNeonHorizontal = VideoComponent(componentMetadata)(function DefaultCyberpunkIntroBumperNeonHorizontal(
21
+ props: ComponentProps<typeof DefaultCyberpunkIntroBumperNeon>,
22
+ ) {
23
+ return <DefaultCyberpunkIntroBumperNeon {...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 { DefaultCyberpunkIntroBumperNeon, componentMetadata as baseComponentMetadata } from './default-cyberpunk-intro-bumper'
6
+
7
+ export const componentMetadata: ScenePluginMetadata = {
8
+ ...baseComponentMetadata,
9
+ resourceKind: 'scene',
10
+ pluginKey: 'core.intro.cyberpunk-neon',
11
+ sceneFamily: 'custom',
12
+ rootLayout: 'absolute-fill',
13
+ name: 'DefaultCyberpunkIntroBumperNeonLandscape',
14
+ description: 'Cyberpunk neon intro bumper (Landscape 16:9 variant)',
15
+ sourceFile: 'src/core/intro/cyberpunk-intro-neon/default-cyberpunk-intro-bumper-Landscape.tsx',
16
+ aspectRatio: '16:9',
17
+ tags: Array.from(new Set([...(baseComponentMetadata.tags ?? []), 'landscape'])),
18
+ }
19
+
20
+ export const DefaultCyberpunkIntroBumperNeonLandscape = VideoComponent(componentMetadata)(function DefaultCyberpunkIntroBumperNeonLandscape(
21
+ props: ComponentProps<typeof DefaultCyberpunkIntroBumperNeon>,
22
+ ) {
23
+ return <DefaultCyberpunkIntroBumperNeon {...props} />
24
+ })
@@ -0,0 +1,30 @@
1
+ import { DefaultCyberpunkIntroBumperNeonHorizontal } from './default-cyberpunk-intro-bumper-Horizontal'
2
+ import { DefaultCyberpunkIntroBumperNeonLandscape } from './default-cyberpunk-intro-bumper-Landscape'
3
+
4
+ const args = {
5
+ kicker: 'Cyberpunk Neon',
6
+ title: 'Night Circuit',
7
+ subtitle: 'A neon signal wall with status rails, node cards, and future-noir console energy.',
8
+ creditLine: 'A Vibecuting Original',
9
+ footer: 'Opening Sequence',
10
+ accent: '#030712',
11
+ secondaryAccent: '#22d3ee',
12
+ }
13
+
14
+ const meta = {
15
+ title: 'core/intro/cyberpunk-intro-neon/DefaultCyberpunkIntroBumperNeon',
16
+ component: DefaultCyberpunkIntroBumperNeonLandscape,
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) => <DefaultCyberpunkIntroBumperNeonHorizontal {...storyArgs} />,
25
+ parameters: { scenePreviewAspectRatio: '9:16' },
26
+ }
27
+ export const HorizontalAnimated = {
28
+ render: (storyArgs: typeof args) => <DefaultCyberpunkIntroBumperNeonHorizontal {...storyArgs} />,
29
+ parameters: { scenePreviewAspectRatio: '9:16', scenePreviewMode: 'animation' },
30
+ }
@@ -0,0 +1,108 @@
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, getIntroPanelMinHeight } from '../_shared/intro-layout'
8
+
9
+ export interface DefaultCyberpunkIntroBumperNeonProps 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: 'DefaultCyberpunkIntroBumperNeon',
23
+ description: 'Cyberpunk neon intro with a signal wall and status rails',
24
+ sourceFile: 'src/core/intro/cyberpunk-intro-neon/default-cyberpunk-intro-bumper.tsx',
25
+ aspectRatio: '16:9',
26
+ sceneType: 'intro',
27
+ tags: ['intro', 'bumper', 'cyberpunk', 'neon', 'future'],
28
+ propsTypeName: 'DefaultCyberpunkIntroBumperNeonProps',
29
+ })
30
+
31
+ export function DefaultCyberpunkIntroBumperNeon({
32
+ id,
33
+ name,
34
+ title,
35
+ subtitle,
36
+ kicker,
37
+ creditLine,
38
+ footer,
39
+ accent,
40
+ secondaryAccent,
41
+ textColor,
42
+ children,
43
+ }: DefaultCyberpunkIntroBumperNeonProps) {
44
+ const runtime = useRemotionSceneRuntime()
45
+ const motion = useSceneMotion()
46
+ const portrait = runtime.height > runtime.width
47
+
48
+ return (
49
+ <BaseRemotionScene
50
+ id={id}
51
+ name={name}
52
+ style={{
53
+ background: portrait
54
+ ? `linear-gradient(180deg, ${accent ?? '#0f172a'} 0%, #030712 42%, #000000 100%)`
55
+ : `radial-gradient(circle at 20% 20%, ${secondaryAccent ?? '#22d3ee'} 0%, ${accent ?? '#030712'} 40%, #000000 100%)`,
56
+ color: textColor ?? '#ecfeff',
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.92fr) minmax(300px, 1.08fr)', 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.68 }}>
65
+ {kicker ?? 'Neon Night'}
66
+ </p>
67
+ <h1 style={{ margin: 0, fontSize: portrait ? Math.round(runtime.height * 0.078) : Math.round(runtime.height * 0.072), lineHeight: 0.9, letterSpacing: '-0.08em', textTransform: 'uppercase', textShadow: '0 0 24px rgba(34,211,238,0.26)', transform: motion.isAnimation ? `translate3d(0, ${(1 - motion.progress) * 8}px, 0)` : 'none' }}>
68
+ {title}
69
+ </h1>
70
+ {subtitle ? <p style={{ margin: 0, maxWidth: getIntroBodyMaxWidth(runtime.width, portrait, 0.42, 1, { min: 240, max: 680 }), fontSize: Math.round(runtime.height * 0.023), lineHeight: 1.56, opacity: 0.82, ...getIntroLineClamp(portrait ? 4 : 3) }}>{subtitle}</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', gap: 12, alignContent: 'center', minWidth: 0 }}>
78
+ <div style={{ width: '100%', minWidth: 0, border: '1px solid rgba(236,254,255,0.14)', background: 'linear-gradient(160deg, rgba(34,211,238,0.14) 0%, rgba(168,85,247,0.18) 34%, rgba(2,6,23,0.96) 100%)', padding: 16, display: 'grid', gap: 12, overflow: 'hidden', minHeight: getIntroPanelMinHeight(runtime.height, portrait, 0.3, 0.24, { min: 220, max: 340 }) }}>
79
+ <div style={{ display: 'grid', gridTemplateColumns: portrait ? '1fr' : 'minmax(0, 1.1fr) minmax(0, 0.9fr)', gap: 12, minWidth: 0 }}>
80
+ <div style={{ display: 'grid', gap: 10 }}>
81
+ <div style={{ fontSize: Math.round(runtime.height * 0.017), letterSpacing: '0.24em', textTransform: 'uppercase', opacity: 0.58 }}>Signal Spikes</div>
82
+ <div style={{ fontSize: Math.round(runtime.height * 0.029), fontWeight: 800, letterSpacing: '-0.06em' }}>Hack the skyline</div>
83
+ <div style={{ border: '1px solid rgba(236,254,255,0.1)', padding: '12px 14px', background: 'rgba(0,0,0,0.18)', display: 'grid', gap: 8 }}>
84
+ {['Ping', 'Firewall', 'Cipher'].map((label, index) => (
85
+ <div key={label} style={{ display: 'flex', justifyContent: 'space-between', gap: 12, fontSize: Math.round(runtime.height * 0.017), opacity: 0.82 }}>
86
+ <span style={{ letterSpacing: '0.2em', textTransform: 'uppercase', opacity: 0.56 }}>{label}</span>
87
+ <span>{index === 0 ? 'Live' : index === 1 ? 'Active' : 'Locked'}</span>
88
+ </div>
89
+ ))}
90
+ </div>
91
+ </div>
92
+ <div style={{ display: 'grid', gap: 10, minWidth: 0 }}>
93
+ {['Node A', 'Node B', 'Node C'].map((label, index) => (
94
+ <div key={label} style={{ minHeight: portrait ? 56 : 70, border: '1px solid rgba(236,254,255,0.1)', background: index === 1 ? 'rgba(34,211,238,0.12)' : 'rgba(0,0,0,0.16)', display: 'grid', placeItems: 'center', textTransform: 'uppercase', letterSpacing: '0.22em', fontSize: Math.round(runtime.height * 0.015), opacity: 0.76 }}>
95
+ {label}
96
+ </div>
97
+ ))}
98
+ </div>
99
+ </div>
100
+ </div>
101
+ </div>
102
+ </section>
103
+ {children ? <div style={{ position: 'absolute', inset: 'auto 0 8%', display: 'grid', placeItems: 'center' }}>{children}</div> : null}
104
+ </BaseRemotionScene>
105
+ )
106
+ }
107
+
108
+ VideoComponent(componentMetadata)(DefaultCyberpunkIntroBumperNeon)
@@ -0,0 +1,10 @@
1
+ export { DefaultCyberpunkIntroBumperNeon } from './default-cyberpunk-intro-bumper'
2
+ export { componentMetadata } from './default-cyberpunk-intro-bumper'
3
+ export {
4
+ DefaultCyberpunkIntroBumperNeonLandscape,
5
+ componentMetadata as DefaultCyberpunkIntroBumperNeonLandscapeMetadata,
6
+ } from './default-cyberpunk-intro-bumper-Landscape'
7
+ export {
8
+ DefaultCyberpunkIntroBumperNeonHorizontal,
9
+ componentMetadata as DefaultCyberpunkIntroBumperNeonHorizontalMetadata,
10
+ } from './default-cyberpunk-intro-bumper-Horizontal'
@@ -0,0 +1,24 @@
1
+ import type { ComponentProps } from 'react'
2
+
3
+ import { VideoComponent, type ScenePluginMetadata } from '@vibecuting/component-project-helper'
4
+
5
+ import { DefaultCinematicIntroBumper, componentMetadata as baseComponentMetadata } from './default-cinematic-intro-bumper'
6
+
7
+ export const componentMetadata: ScenePluginMetadata = {
8
+ ...baseComponentMetadata,
9
+ resourceKind: 'scene',
10
+ pluginKey: 'core.intro.cinematic',
11
+ sceneFamily: 'custom',
12
+ rootLayout: 'absolute-fill',
13
+ name: 'DefaultCinematicIntroBumperHorizontal',
14
+ description: 'Cinematic intro bumper (Portrait 9:16 variant)',
15
+ sourceFile: 'src/core/intro/default-cinematic-intro-bumper/default-cinematic-intro-bumper-Horizontal.tsx',
16
+ aspectRatio: '9:16',
17
+ tags: Array.from(new Set([...(baseComponentMetadata.tags ?? []), 'horizontal'])),
18
+ }
19
+
20
+ export const DefaultCinematicIntroBumperHorizontal = VideoComponent(componentMetadata)(function DefaultCinematicIntroBumperHorizontal(
21
+ props: ComponentProps<typeof DefaultCinematicIntroBumper>,
22
+ ) {
23
+ return <DefaultCinematicIntroBumper {...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 { DefaultCinematicIntroBumper, componentMetadata as baseComponentMetadata } from './default-cinematic-intro-bumper'
6
+
7
+ export const componentMetadata: ScenePluginMetadata = {
8
+ ...baseComponentMetadata,
9
+ resourceKind: 'scene',
10
+ pluginKey: 'core.intro.cinematic',
11
+ sceneFamily: 'custom',
12
+ rootLayout: 'absolute-fill',
13
+ name: 'DefaultCinematicIntroBumperLandscape',
14
+ description: 'Cinematic intro bumper (Landscape 16:9 variant)',
15
+ sourceFile: 'src/core/intro/default-cinematic-intro-bumper/default-cinematic-intro-bumper-Landscape.tsx',
16
+ aspectRatio: '16:9',
17
+ tags: Array.from(new Set([...(baseComponentMetadata.tags ?? []), 'landscape'])),
18
+ }
19
+
20
+ export const DefaultCinematicIntroBumperLandscape = VideoComponent(componentMetadata)(function DefaultCinematicIntroBumperLandscape(
21
+ props: ComponentProps<typeof DefaultCinematicIntroBumper>,
22
+ ) {
23
+ return <DefaultCinematicIntroBumper {...props} />
24
+ })
@@ -0,0 +1,29 @@
1
+ import { DefaultCinematicIntroBumperHorizontal } from './default-cinematic-intro-bumper-Horizontal'
2
+ import { DefaultCinematicIntroBumperLandscape } from './default-cinematic-intro-bumper-Landscape'
3
+
4
+ const meta = {
5
+ title: 'core/intro/default-cinematic-intro-bumper/DefaultCinematicIntroBumperLandscape',
6
+ component: DefaultCinematicIntroBumperLandscape,
7
+ args: {
8
+ kicker: 'Studio Original',
9
+ title: 'The Last Light',
10
+ subtitle: 'A film-poster opener with a framed feature panel and a more theatrical split layout.',
11
+ creditLine: 'Directed by Vibecuting Studio',
12
+ footer: 'Opening Sequence',
13
+ accent: '#020617',
14
+ secondaryAccent: '#1d4ed8',
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) => <DefaultCinematicIntroBumperHorizontal {...storyArgs} />,
24
+ parameters: { scenePreviewAspectRatio: '9:16' },
25
+ }
26
+ export const HorizontalAnimated = {
27
+ render: (storyArgs: typeof meta.args) => <DefaultCinematicIntroBumperHorizontal {...storyArgs} />,
28
+ parameters: { scenePreviewMode: 'animation', scenePreviewAspectRatio: '9:16' },
29
+ }