@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.
- package/package.json +4 -4
- package/src/core/intro/_shared/intro-layout.test.ts +18 -0
- package/src/core/intro/_shared/intro-layout.ts +50 -0
- package/src/core/intro/cyberpunk-intro-holo/default-cyberpunk-intro-bumper-Horizontal.tsx +25 -0
- package/src/core/intro/cyberpunk-intro-holo/default-cyberpunk-intro-bumper-Landscape.tsx +25 -0
- package/src/core/intro/cyberpunk-intro-holo/default-cyberpunk-intro-bumper.stories.tsx +31 -0
- package/src/core/intro/cyberpunk-intro-holo/default-cyberpunk-intro-bumper.tsx +118 -0
- package/src/core/intro/cyberpunk-intro-holo/index.ts +11 -0
- package/src/core/intro/cyberpunk-intro-neon/default-cyberpunk-intro-bumper-Horizontal.tsx +24 -0
- package/src/core/intro/cyberpunk-intro-neon/default-cyberpunk-intro-bumper-Landscape.tsx +24 -0
- package/src/core/intro/cyberpunk-intro-neon/default-cyberpunk-intro-bumper.stories.tsx +30 -0
- package/src/core/intro/cyberpunk-intro-neon/default-cyberpunk-intro-bumper.tsx +108 -0
- package/src/core/intro/cyberpunk-intro-neon/index.ts +10 -0
- package/src/core/intro/default-cinematic-intro-bumper/default-cinematic-intro-bumper-Horizontal.tsx +24 -0
- package/src/core/intro/default-cinematic-intro-bumper/default-cinematic-intro-bumper-Landscape.tsx +24 -0
- package/src/core/intro/default-cinematic-intro-bumper/default-cinematic-intro-bumper.stories.tsx +29 -0
- package/src/core/intro/default-cinematic-intro-bumper/default-cinematic-intro-bumper.tsx +234 -0
- package/src/core/intro/default-cinematic-intro-bumper/index.ts +11 -0
- package/src/core/intro/default-festival-intro-bumper/default-festival-intro-bumper-Horizontal.tsx +24 -0
- package/src/core/intro/default-festival-intro-bumper/default-festival-intro-bumper-Landscape.tsx +24 -0
- package/src/core/intro/default-festival-intro-bumper/default-festival-intro-bumper.stories.tsx +29 -0
- package/src/core/intro/default-festival-intro-bumper/default-festival-intro-bumper.tsx +187 -0
- package/src/core/intro/default-festival-intro-bumper/index.ts +11 -0
- package/src/core/intro/default-intro-bumper/default-intro-bumper-Horizontal.tsx +24 -0
- package/src/core/intro/default-intro-bumper/default-intro-bumper-Landscape.tsx +24 -0
- package/src/core/intro/default-intro-bumper/default-intro-bumper.stories.tsx +41 -0
- package/src/core/intro/default-intro-bumper/default-intro-bumper.tsx +256 -0
- package/src/core/intro/default-intro-bumper/index.ts +11 -0
- package/src/core/intro/default-noir-intro-bumper/default-noir-intro-bumper-Horizontal.tsx +24 -0
- package/src/core/intro/default-noir-intro-bumper/default-noir-intro-bumper-Landscape.tsx +24 -0
- package/src/core/intro/default-noir-intro-bumper/default-noir-intro-bumper.stories.tsx +29 -0
- package/src/core/intro/default-noir-intro-bumper/default-noir-intro-bumper.tsx +122 -0
- package/src/core/intro/default-noir-intro-bumper/index.ts +11 -0
- package/src/core/intro/default-trailer-intro-bumper/default-trailer-intro-bumper-Horizontal.tsx +24 -0
- package/src/core/intro/default-trailer-intro-bumper/default-trailer-intro-bumper-Landscape.tsx +24 -0
- package/src/core/intro/default-trailer-intro-bumper/default-trailer-intro-bumper.stories.tsx +29 -0
- package/src/core/intro/default-trailer-intro-bumper/default-trailer-intro-bumper.tsx +181 -0
- package/src/core/intro/default-trailer-intro-bumper/index.ts +11 -0
- package/src/core/intro/documentary-intro-observation/default-documentary-intro-bumper-Horizontal.tsx +18 -0
- package/src/core/intro/documentary-intro-observation/default-documentary-intro-bumper-Landscape.tsx +18 -0
- package/src/core/intro/documentary-intro-observation/default-documentary-intro-bumper.stories.tsx +31 -0
- package/src/core/intro/documentary-intro-observation/default-documentary-intro-bumper.tsx +158 -0
- package/src/core/intro/documentary-intro-observation/index.ts +10 -0
- package/src/core/intro/family-intro-reunion/default-family-intro-bumper-Horizontal.tsx +18 -0
- package/src/core/intro/family-intro-reunion/default-family-intro-bumper-Landscape.tsx +18 -0
- package/src/core/intro/family-intro-reunion/default-family-intro-bumper.stories.tsx +43 -0
- package/src/core/intro/family-intro-reunion/default-family-intro-bumper.tsx +165 -0
- package/src/core/intro/family-intro-reunion/index.ts +10 -0
- package/src/core/intro/festival-intro-spotlight/default-festival-intro-bumper-Horizontal.tsx +1 -0
- package/src/core/intro/festival-intro-spotlight/default-festival-intro-bumper-Landscape.tsx +1 -0
- package/src/core/intro/festival-intro-spotlight/default-festival-intro-bumper.stories.tsx +30 -0
- package/src/core/intro/festival-intro-spotlight/default-festival-intro-bumper.tsx +105 -0
- package/src/core/intro/festival-intro-spotlight/index.ts +10 -0
- package/src/core/intro/index.test.ts +45 -0
- package/src/core/intro/index.ts +17 -0
- package/src/core/intro/noir-intro-city/default-noir-intro-bumper-Horizontal.tsx +24 -0
- package/src/core/intro/noir-intro-city/default-noir-intro-bumper-Landscape.tsx +24 -0
- package/src/core/intro/noir-intro-city/default-noir-intro-bumper.stories.tsx +31 -0
- package/src/core/intro/noir-intro-city/default-noir-intro-bumper.tsx +96 -0
- package/src/core/intro/noir-intro-city/index.ts +10 -0
- package/src/core/intro/noir-intro-deluxe/default-noir-intro-bumper-Horizontal.tsx +1 -0
- package/src/core/intro/noir-intro-deluxe/default-noir-intro-bumper-Landscape.tsx +1 -0
- package/src/core/intro/noir-intro-deluxe/default-noir-intro-bumper.stories.tsx +31 -0
- package/src/core/intro/noir-intro-deluxe/default-noir-intro-bumper.tsx +117 -0
- package/src/core/intro/noir-intro-deluxe/index.ts +10 -0
- package/src/core/intro/sci-fi-intro/default-sci-fi-intro-bumper-Horizontal.tsx +1 -0
- package/src/core/intro/sci-fi-intro/default-sci-fi-intro-bumper-Landscape.tsx +1 -0
- package/src/core/intro/sci-fi-intro/default-sci-fi-intro-bumper.stories.tsx +48 -0
- package/src/core/intro/sci-fi-intro/default-sci-fi-intro-bumper.tsx +105 -0
- package/src/core/intro/sci-fi-intro/index.ts +10 -0
- package/src/core/intro/thriller-intro-suspense/default-thriller-intro-bumper-Horizontal.tsx +18 -0
- package/src/core/intro/thriller-intro-suspense/default-thriller-intro-bumper-Landscape.tsx +18 -0
- package/src/core/intro/thriller-intro-suspense/default-thriller-intro-bumper.stories.tsx +31 -0
- package/src/core/intro/thriller-intro-suspense/default-thriller-intro-bumper.tsx +155 -0
- package/src/core/intro/thriller-intro-suspense/index.ts +10 -0
- package/src/core/intro/trailer-intro-premiere/default-trailer-intro-bumper-Horizontal.tsx +1 -0
- package/src/core/intro/trailer-intro-premiere/default-trailer-intro-bumper-Landscape.tsx +1 -0
- package/src/core/intro/trailer-intro-premiere/default-trailer-intro-bumper.stories.tsx +30 -0
- package/src/core/intro/trailer-intro-premiere/default-trailer-intro-bumper.tsx +104 -0
- package/src/core/intro/trailer-intro-premiere/index.ts +10 -0
- package/src/core/intro/travel-intro-journey/default-travel-intro-bumper-Horizontal.tsx +18 -0
- package/src/core/intro/travel-intro-journey/default-travel-intro-bumper-Landscape.tsx +18 -0
- package/src/core/intro/travel-intro-journey/default-travel-intro-bumper.stories.tsx +43 -0
- package/src/core/intro/travel-intro-journey/default-travel-intro-bumper.tsx +158 -0
- package/src/core/intro/travel-intro-journey/index.ts +10 -0
- package/src/core/intro/western-intro/default-western-intro-bumper-Horizontal.tsx +24 -0
- package/src/core/intro/western-intro/default-western-intro-bumper-Landscape.tsx +24 -0
- package/src/core/intro/western-intro/default-western-intro-bumper.stories.tsx +29 -0
- package/src/core/intro/western-intro/default-western-intro-bumper.tsx +146 -0
- package/src/core/intro/western-intro/index.ts +4 -0
- package/src/core/intro/western-intro-gangster/default-western-intro-bumper-Horizontal.tsx +25 -0
- package/src/core/intro/western-intro-gangster/default-western-intro-bumper-Landscape.tsx +25 -0
- package/src/core/intro/western-intro-gangster/default-western-intro-bumper.stories.tsx +31 -0
- package/src/core/intro/western-intro-gangster/default-western-intro-bumper.tsx +105 -0
- package/src/core/intro/western-intro-gangster/index.ts +11 -0
- package/src/core/outro/_shared/outro-layout.test.ts +32 -0
- package/src/core/outro/_shared/outro-layout.ts +72 -0
- package/src/core/outro/award-outro-celebration/default-award-outro-bumper-Horizontal.tsx +18 -0
- package/src/core/outro/award-outro-celebration/default-award-outro-bumper-Landscape.tsx +18 -0
- package/src/core/outro/award-outro-celebration/default-award-outro-bumper.stories.tsx +42 -0
- package/src/core/outro/award-outro-celebration/default-award-outro-bumper.tsx +152 -0
- package/src/core/outro/award-outro-celebration/index.ts +10 -0
- package/src/core/outro/blackout-outro-finale/default-blackout-outro-bumper-Horizontal.tsx +1 -0
- package/src/core/outro/blackout-outro-finale/default-blackout-outro-bumper-Landscape.tsx +1 -0
- package/src/core/outro/blackout-outro-finale/default-blackout-outro-bumper.stories.tsx +28 -0
- package/src/core/outro/blackout-outro-finale/default-blackout-outro-bumper.tsx +71 -0
- package/src/core/outro/blackout-outro-finale/index.ts +10 -0
- package/src/core/outro/credits-roll-outro-epic/default-credits-roll-outro-Horizontal.tsx +24 -0
- package/src/core/outro/credits-roll-outro-epic/default-credits-roll-outro-Landscape.tsx +24 -0
- package/src/core/outro/credits-roll-outro-epic/default-credits-roll-outro.stories.tsx +31 -0
- package/src/core/outro/credits-roll-outro-epic/default-credits-roll-outro.tsx +106 -0
- package/src/core/outro/credits-roll-outro-epic/index.ts +10 -0
- package/src/core/outro/credits-roll-outro-premium/default-credits-roll-outro-Horizontal.tsx +1 -0
- package/src/core/outro/credits-roll-outro-premium/default-credits-roll-outro-Landscape.tsx +1 -0
- package/src/core/outro/credits-roll-outro-premium/default-credits-roll-outro.stories.tsx +30 -0
- package/src/core/outro/credits-roll-outro-premium/default-credits-roll-outro.tsx +88 -0
- package/src/core/outro/credits-roll-outro-premium/index.ts +10 -0
- package/src/core/outro/credits-roll-outro-royal/default-credits-roll-outro-Horizontal.tsx +25 -0
- package/src/core/outro/credits-roll-outro-royal/default-credits-roll-outro-Landscape.tsx +25 -0
- package/src/core/outro/credits-roll-outro-royal/default-credits-roll-outro.stories.tsx +32 -0
- package/src/core/outro/credits-roll-outro-royal/default-credits-roll-outro.tsx +110 -0
- package/src/core/outro/credits-roll-outro-royal/index.ts +11 -0
- package/src/core/outro/default-blackout-outro-bumper/default-blackout-outro-bumper-Horizontal.tsx +22 -0
- package/src/core/outro/default-blackout-outro-bumper/default-blackout-outro-bumper-Landscape.tsx +22 -0
- package/src/core/outro/default-blackout-outro-bumper/default-blackout-outro-bumper.stories.tsx +48 -0
- package/src/core/outro/default-blackout-outro-bumper/default-blackout-outro-bumper.tsx +124 -0
- package/src/core/outro/default-blackout-outro-bumper/index.ts +11 -0
- package/src/core/outro/default-credits-roll-outro/default-credits-roll-outro-Horizontal.tsx +22 -0
- package/src/core/outro/default-credits-roll-outro/default-credits-roll-outro-Landscape.tsx +22 -0
- package/src/core/outro/default-credits-roll-outro/default-credits-roll-outro.stories.tsx +48 -0
- package/src/core/outro/default-credits-roll-outro/default-credits-roll-outro.tsx +208 -0
- package/src/core/outro/default-credits-roll-outro/index.ts +11 -0
- package/src/core/outro/default-epilogue-outro/default-epilogue-outro-Horizontal.tsx +22 -0
- package/src/core/outro/default-epilogue-outro/default-epilogue-outro-Landscape.tsx +22 -0
- package/src/core/outro/default-epilogue-outro/default-epilogue-outro.stories.tsx +48 -0
- package/src/core/outro/default-epilogue-outro/default-epilogue-outro.tsx +115 -0
- package/src/core/outro/default-epilogue-outro/index.ts +11 -0
- package/src/core/outro/default-outro-bumper/default-outro-bumper-Horizontal.tsx +22 -0
- package/src/core/outro/default-outro-bumper/default-outro-bumper-Landscape.tsx +22 -0
- package/src/core/outro/default-outro-bumper/default-outro-bumper.stories.tsx +48 -0
- package/src/core/outro/default-outro-bumper/default-outro-bumper.tsx +159 -0
- package/src/core/outro/default-outro-bumper/index.ts +11 -0
- package/src/core/outro/default-sunset-outro-bumper/default-sunset-outro-bumper-Horizontal.tsx +22 -0
- package/src/core/outro/default-sunset-outro-bumper/default-sunset-outro-bumper-Landscape.tsx +22 -0
- package/src/core/outro/default-sunset-outro-bumper/default-sunset-outro-bumper.stories.tsx +48 -0
- package/src/core/outro/default-sunset-outro-bumper/default-sunset-outro-bumper.tsx +183 -0
- package/src/core/outro/default-sunset-outro-bumper/index.ts +11 -0
- package/src/core/outro/festival-outro-encore/default-festival-outro-bumper-Horizontal.tsx +18 -0
- package/src/core/outro/festival-outro-encore/default-festival-outro-bumper-Landscape.tsx +18 -0
- package/src/core/outro/festival-outro-encore/default-festival-outro-bumper.stories.tsx +31 -0
- package/src/core/outro/festival-outro-encore/default-festival-outro-bumper.tsx +130 -0
- package/src/core/outro/festival-outro-encore/index.ts +10 -0
- package/src/core/outro/heist-outro/default-heist-outro-bumper-Horizontal.tsx +24 -0
- package/src/core/outro/heist-outro/default-heist-outro-bumper-Landscape.tsx +24 -0
- package/src/core/outro/heist-outro/default-heist-outro-bumper.stories.tsx +29 -0
- package/src/core/outro/heist-outro/default-heist-outro-bumper.tsx +160 -0
- package/src/core/outro/heist-outro/index.ts +4 -0
- package/src/core/outro/index.test.ts +88 -0
- package/src/core/outro/index.ts +73 -0
- package/src/core/outro/memoir-outro-reflection/default-memoir-outro-bumper-Horizontal.tsx +18 -0
- package/src/core/outro/memoir-outro-reflection/default-memoir-outro-bumper-Landscape.tsx +18 -0
- package/src/core/outro/memoir-outro-reflection/default-memoir-outro-bumper.stories.tsx +42 -0
- package/src/core/outro/memoir-outro-reflection/default-memoir-outro-bumper.tsx +158 -0
- package/src/core/outro/memoir-outro-reflection/index.ts +10 -0
- package/src/core/outro/romance-outro/default-romance-outro-bumper-Horizontal.tsx +1 -0
- package/src/core/outro/romance-outro/default-romance-outro-bumper-Landscape.tsx +1 -0
- package/src/core/outro/romance-outro/default-romance-outro-bumper.stories.tsx +48 -0
- package/src/core/outro/romance-outro/default-romance-outro-bumper.tsx +123 -0
- package/src/core/outro/romance-outro/index.ts +10 -0
- package/src/core/outro/sunset-outro-coda/default-sunset-outro-bumper-Horizontal.tsx +1 -0
- package/src/core/outro/sunset-outro-coda/default-sunset-outro-bumper-Landscape.tsx +1 -0
- package/src/core/outro/sunset-outro-coda/default-sunset-outro-bumper.stories.tsx +30 -0
- package/src/core/outro/sunset-outro-coda/default-sunset-outro-bumper.tsx +75 -0
- package/src/core/outro/sunset-outro-coda/index.ts +10 -0
- package/src/core/scene/slide/_shared/index.ts +27 -0
- package/src/core/scene/slide/_shared/media-templates.test.ts +47 -0
- package/src/core/scene/slide/_shared/media-templates.tsx +324 -0
- package/src/core/scene/slide/index.test.ts +28 -0
- package/src/core/scene/slide/index.ts +14 -0
- package/src/core/scene/slide/person-intro/default-person-intro-duo-slide.tsx +19 -0
- package/src/core/scene/slide/person-intro/default-person-intro-group-slide.tsx +168 -0
- package/src/core/scene/slide/person-intro/default-person-intro-quad-slide.tsx +19 -0
- package/src/core/scene/slide/person-intro/default-person-intro-slide-Horizontal.animated.stories.tsx +47 -0
- package/src/core/scene/slide/person-intro/default-person-intro-slide-Horizontal.stories.tsx +46 -0
- package/src/core/scene/slide/person-intro/default-person-intro-slide-Horizontal.tsx +302 -0
- package/src/core/scene/slide/person-intro/default-person-intro-slide-Landscape.tsx +20 -0
- package/src/core/scene/slide/person-intro/default-person-intro-slide.animated.stories.tsx +126 -0
- package/src/core/scene/slide/person-intro/default-person-intro-slide.stories.tsx +119 -0
- package/src/core/scene/slide/person-intro/default-person-intro-slide.tsx +363 -0
- package/src/core/scene/slide/person-intro/default-person-intro-trio-slide.tsx +19 -0
- package/src/core/scene/slide/person-intro/index.ts +8 -0
- package/src/core/scene/slide/photo-album/default-photo-album-multi-slide.tsx +19 -0
- package/src/core/scene/slide/photo-album/default-photo-album-pair-slide.tsx +19 -0
- package/src/core/scene/slide/photo-album/default-photo-album-single-slide.tsx +19 -0
- package/src/core/scene/slide/photo-album/default-photo-album-slide-Horizontal.animated.stories.tsx +26 -0
- package/src/core/scene/slide/photo-album/default-photo-album-slide-Horizontal.stories.tsx +25 -0
- package/src/core/scene/slide/photo-album/default-photo-album-slide-Horizontal.tsx +20 -0
- package/src/core/scene/slide/photo-album/default-photo-album-slide-Landscape.tsx +20 -0
- package/src/core/scene/slide/photo-album/default-photo-album-slide.animated.stories.tsx +94 -0
- package/src/core/scene/slide/photo-album/default-photo-album-slide.stories.tsx +87 -0
- package/src/core/scene/slide/photo-album/default-photo-album-slide.tsx +414 -0
- package/src/core/scene/slide/photo-album/index.ts +7 -0
- package/src/core/scene/slide/video-showcase/default-video-showcase-multi-slide.tsx +195 -0
- package/src/core/scene/slide/video-showcase/default-video-showcase-slide-Horizontal.tsx +212 -0
- package/src/core/scene/slide/video-showcase/default-video-showcase-slide-Landscape.tsx +20 -0
- package/src/core/scene/slide/video-showcase/default-video-showcase-slide.animated.stories.tsx +78 -0
- package/src/core/scene/slide/video-showcase/default-video-showcase-slide.stories.tsx +74 -0
- package/src/core/scene/slide/video-showcase/default-video-showcase-slide.tsx +365 -0
- package/src/core/scene/slide/video-showcase/index.ts +5 -0
- package/src/core/intro/default-intro-bumper.stories.tsx +0 -19
- package/src/core/intro/default-intro-bumper.tsx +0 -218
- package/src/core/outro/default-outro-bumper.stories.tsx +0 -19
- 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.
|
|
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.
|
|
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'
|
package/src/core/intro/default-cinematic-intro-bumper/default-cinematic-intro-bumper-Horizontal.tsx
ADDED
|
@@ -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
|
+
})
|
package/src/core/intro/default-cinematic-intro-bumper/default-cinematic-intro-bumper-Landscape.tsx
ADDED
|
@@ -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
|
+
})
|
package/src/core/intro/default-cinematic-intro-bumper/default-cinematic-intro-bumper.stories.tsx
ADDED
|
@@ -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
|
+
}
|