vibebusiness 1.2.77 → 1.2.80
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/.next/standalone/.next/BUILD_ID +1 -1
- package/.next/standalone/.next/app-build-manifest.json +24 -24
- package/.next/standalone/.next/app-path-routes-manifest.json +1 -1
- package/.next/standalone/.next/build-manifest.json +2 -2
- package/.next/standalone/.next/prerender-manifest.json +1 -1
- package/.next/standalone/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/_not-found.html +1 -1
- package/.next/standalone/.next/server/app/_not-found.rsc +1 -1
- package/.next/standalone/.next/server/app/api/analyze/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/config/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/epics/[id]/ideas/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/epics/[id]/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/epics/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/goals/[id]/kpis/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/goals/[id]/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/goals/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/hypotheses/[id]/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/hypotheses/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/ideas/[id]/card/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/ideas/[id]/comments/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/ideas/[id]/implement/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/ideas/[id]/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/ideas/[id]/transition/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/ideas/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/implementations/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/kpis/refresh/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/social/[id]/publish/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/social/[id]/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/social/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/goals/[id]/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/goals/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/goals/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/hypotheses/[id]/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/hypotheses/page.js +1 -1
- package/.next/standalone/.next/server/app/hypotheses/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/hypotheses/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/ideas/[id]/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/ideas/[id]/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/page.js +1 -1
- package/.next/standalone/.next/server/app/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/roadmap/[id]/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/roadmap/investors/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/roadmap/investors/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/roadmap/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/roadmap/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/roadmap/public/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/roadmap/public/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/sessions/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/sessions/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/settings/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/settings.html +1 -1
- package/.next/standalone/.next/server/app/settings.rsc +1 -1
- package/.next/standalone/.next/server/app/social/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/social.html +1 -1
- package/.next/standalone/.next/server/app/social.rsc +1 -1
- package/.next/standalone/.next/server/app/updates/[id]/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/updates/[id]/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/updates/new/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/updates/new.html +1 -1
- package/.next/standalone/.next/server/app/updates/new.rsc +1 -1
- package/.next/standalone/.next/server/app/updates/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/updates/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app-paths-manifest.json +20 -20
- package/.next/standalone/.next/server/pages/404.html +1 -1
- package/.next/standalone/.next/server/pages/500.html +1 -1
- package/.next/standalone/.next/server/server-reference-manifest.json +1 -1
- package/.next/standalone/data/business-context.json +1 -1
- package/.next/standalone/data/ideas.json +306 -26
- package/.next/standalone/data/implementations.json +147 -0
- package/.next/standalone/data/marketing-plans/plan-1771885743819-2d9m2nt.json +115 -0
- package/.next/standalone/data/marketing-plans/plan-1771886455031-mwdob3k.json +115 -0
- package/.next/standalone/data/reports/visuals/idea-first-tweet-card.png +0 -0
- package/.next/standalone/data/reports/visuals/idea-lp-hero-specificity-card.png +0 -0
- package/.next/standalone/data/reports/visuals/idea-lp-social-proof-card.png +0 -0
- package/.next/standalone/data/videos/ad-solo-founder-burnout.mp4 +0 -0
- package/.next/standalone/data/videos/staging/ad-solo-founder-burnout.json +54 -0
- package/.next/standalone/node_modules/.cache/webpack/remotion-production-4.0.428/48519e014fdef8bfe40a0d447e90c96c/0.pack +0 -0
- package/.next/standalone/node_modules/.cache/webpack/remotion-production-4.0.428/48519e014fdef8bfe40a0d447e90c96c/index.pack +0 -0
- package/.next/standalone/package.json +1 -1
- package/dist/scripts/heartbeat.js +648 -462
- package/package.json +1 -1
- package/scripts/lib/video/compositions/AdVideo.tsx +7 -3
- package/scripts/lib/video/compositions/BackgroundMusic.tsx +41 -0
- package/scripts/lib/video/compositions/Root.tsx +17 -6
- package/scripts/lib/video/compositions/ShipVideo.tsx +6 -2
- /package/.next/static/{_6NFRXGMGhuMnoqW7NVno → 9C8sbF668J83TlKDjSvQm}/_buildManifest.js +0 -0
- /package/.next/static/{_6NFRXGMGhuMnoqW7NVno → 9C8sbF668J83TlKDjSvQm}/_ssgManifest.js +0 -0
package/package.json
CHANGED
|
@@ -1,26 +1,29 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* AdVideo —
|
|
2
|
+
* AdVideo — ad composition with optional background music.
|
|
3
3
|
*
|
|
4
4
|
* Formats:
|
|
5
5
|
* AdFeed — 1080×1080 (Instagram/LinkedIn square)
|
|
6
6
|
* AdReels — 1080×1920 (Reels/Shorts/Stories vertical)
|
|
7
7
|
*
|
|
8
|
-
* 5 slides
|
|
8
|
+
* Slide count is dynamic (5-7 slides from Claude). Duration = slides.length × 90 frames.
|
|
9
9
|
*/
|
|
10
10
|
|
|
11
11
|
import React from 'react';
|
|
12
12
|
import { AbsoluteFill, Sequence } from 'remotion';
|
|
13
13
|
import { Slide } from './Slide';
|
|
14
14
|
import type { SlideData } from './Slide';
|
|
15
|
+
import { BackgroundMusic } from './BackgroundMusic';
|
|
16
|
+
import type { AudioConfig } from '../renderer';
|
|
15
17
|
|
|
16
18
|
export interface AdVideoProps {
|
|
17
19
|
slides: SlideData[];
|
|
18
20
|
format: 'feed' | 'reels';
|
|
21
|
+
audio?: AudioConfig;
|
|
19
22
|
}
|
|
20
23
|
|
|
21
24
|
const FRAMES_PER_SLIDE = 90; // 3 seconds at 30fps
|
|
22
25
|
|
|
23
|
-
export const AdVideo: React.FC<AdVideoProps> = ({ slides }) => {
|
|
26
|
+
export const AdVideo: React.FC<AdVideoProps> = ({ slides, audio }) => {
|
|
24
27
|
return (
|
|
25
28
|
<AbsoluteFill
|
|
26
29
|
style={{
|
|
@@ -32,6 +35,7 @@ export const AdVideo: React.FC<AdVideoProps> = ({ slides }) => {
|
|
|
32
35
|
<Slide slide={slide} />
|
|
33
36
|
</Sequence>
|
|
34
37
|
))}
|
|
38
|
+
{audio && <BackgroundMusic audio={audio} />}
|
|
35
39
|
</AbsoluteFill>
|
|
36
40
|
);
|
|
37
41
|
};
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import React, { useCallback } from 'react';
|
|
2
|
+
import { Audio, interpolate, useCurrentFrame, useVideoConfig, staticFile } from 'remotion';
|
|
3
|
+
import type { AudioConfig } from '../renderer';
|
|
4
|
+
|
|
5
|
+
const DEFAULTS = {
|
|
6
|
+
volume: 0.3,
|
|
7
|
+
fadeInSeconds: 0.5,
|
|
8
|
+
fadeOutSeconds: 1.0,
|
|
9
|
+
} as const;
|
|
10
|
+
|
|
11
|
+
export const BackgroundMusic: React.FC<{ audio: AudioConfig }> = ({ audio }) => {
|
|
12
|
+
const frame = useCurrentFrame();
|
|
13
|
+
const { fps, durationInFrames } = useVideoConfig();
|
|
14
|
+
|
|
15
|
+
const baseVolume = audio.volume ?? DEFAULTS.volume;
|
|
16
|
+
const fadeInFrames = Math.round((audio.fadeInSeconds ?? DEFAULTS.fadeInSeconds) * fps);
|
|
17
|
+
const fadeOutFrames = Math.round((audio.fadeOutSeconds ?? DEFAULTS.fadeOutSeconds) * fps);
|
|
18
|
+
const fadeOutStart = durationInFrames - fadeOutFrames;
|
|
19
|
+
|
|
20
|
+
const volumeFunction = useCallback(() => {
|
|
21
|
+
if (frame < fadeInFrames) {
|
|
22
|
+
return interpolate(frame, [0, fadeInFrames], [0, baseVolume], {
|
|
23
|
+
extrapolateLeft: 'clamp',
|
|
24
|
+
extrapolateRight: 'clamp',
|
|
25
|
+
});
|
|
26
|
+
}
|
|
27
|
+
if (frame >= fadeOutStart) {
|
|
28
|
+
return interpolate(frame, [fadeOutStart, durationInFrames], [baseVolume, 0], {
|
|
29
|
+
extrapolateLeft: 'clamp',
|
|
30
|
+
extrapolateRight: 'clamp',
|
|
31
|
+
});
|
|
32
|
+
}
|
|
33
|
+
return baseVolume;
|
|
34
|
+
}, [frame, fadeInFrames, fadeOutStart, durationInFrames, baseVolume]);
|
|
35
|
+
|
|
36
|
+
const src = audio.src.includes('/')
|
|
37
|
+
? staticFile(audio.src)
|
|
38
|
+
: staticFile(`audio/${audio.src}`);
|
|
39
|
+
|
|
40
|
+
return <Audio src={src} volume={volumeFunction()} />;
|
|
41
|
+
};
|
|
@@ -4,8 +4,11 @@
|
|
|
4
4
|
* Registers 4 compositions:
|
|
5
5
|
* ShipFeed — 7-slide ship announcement, 1080×1080
|
|
6
6
|
* ShipReels — 7-slide ship announcement, 1080×1920
|
|
7
|
-
* AdFeed — 5-slide ad video, 1080×1080
|
|
8
|
-
* AdReels — 5-slide ad video, 1080×1920
|
|
7
|
+
* AdFeed — 5-7 slide ad video, 1080×1080
|
|
8
|
+
* AdReels — 5-7 slide ad video, 1080×1920
|
|
9
|
+
*
|
|
10
|
+
* Ad compositions use calculateMetadata for dynamic duration — Claude may
|
|
11
|
+
* generate 5-7 slides, so duration is computed from props at render time.
|
|
9
12
|
*
|
|
10
13
|
* This file is bundled at runtime by @remotion/bundler (webpack).
|
|
11
14
|
* It must call registerRoot() as a side effect.
|
|
@@ -29,7 +32,7 @@ const AdComp = AdVideo as unknown as AnyComp;
|
|
|
29
32
|
|
|
30
33
|
const FRAMES_PER_SLIDE = 90; // 3s at 30fps
|
|
31
34
|
const SHIP_SLIDE_COUNT = 7;
|
|
32
|
-
const
|
|
35
|
+
const AD_SLIDE_COUNT_DEFAULT = 5;
|
|
33
36
|
|
|
34
37
|
// ─── Default props (used in Remotion Studio preview) ─────────────────────────
|
|
35
38
|
|
|
@@ -40,7 +43,7 @@ const placeholderSlide: SlideData = {
|
|
|
40
43
|
};
|
|
41
44
|
|
|
42
45
|
const defaultShipSlides: SlideData[] = Array(SHIP_SLIDE_COUNT).fill(placeholderSlide);
|
|
43
|
-
const defaultAdSlides: SlideData[] = Array(
|
|
46
|
+
const defaultAdSlides: SlideData[] = Array(AD_SLIDE_COUNT_DEFAULT).fill(placeholderSlide);
|
|
44
47
|
|
|
45
48
|
// ─── Root component ──────────────────────────────────────────────────────────
|
|
46
49
|
|
|
@@ -68,20 +71,28 @@ export const RemotionRoot: React.FC = () => {
|
|
|
68
71
|
<Composition
|
|
69
72
|
id="AdFeed"
|
|
70
73
|
component={AdComp}
|
|
71
|
-
durationInFrames={
|
|
74
|
+
durationInFrames={AD_SLIDE_COUNT_DEFAULT * FRAMES_PER_SLIDE}
|
|
72
75
|
fps={30}
|
|
73
76
|
width={1080}
|
|
74
77
|
height={1080}
|
|
75
78
|
defaultProps={{ slides: defaultAdSlides, format: 'feed' } as AdVideoProps}
|
|
79
|
+
calculateMetadata={({ props }) => ({
|
|
80
|
+
durationInFrames: (props as unknown as AdVideoProps).slides.length * FRAMES_PER_SLIDE,
|
|
81
|
+
props,
|
|
82
|
+
})}
|
|
76
83
|
/>
|
|
77
84
|
<Composition
|
|
78
85
|
id="AdReels"
|
|
79
86
|
component={AdComp}
|
|
80
|
-
durationInFrames={
|
|
87
|
+
durationInFrames={AD_SLIDE_COUNT_DEFAULT * FRAMES_PER_SLIDE}
|
|
81
88
|
fps={30}
|
|
82
89
|
width={1080}
|
|
83
90
|
height={1920}
|
|
84
91
|
defaultProps={{ slides: defaultAdSlides, format: 'reels' } as AdVideoProps}
|
|
92
|
+
calculateMetadata={({ props }) => ({
|
|
93
|
+
durationInFrames: (props as unknown as AdVideoProps).slides.length * FRAMES_PER_SLIDE,
|
|
94
|
+
props,
|
|
95
|
+
})}
|
|
85
96
|
/>
|
|
86
97
|
</>
|
|
87
98
|
);
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* ShipVideo —
|
|
2
|
+
* ShipVideo — ship announcement composition with optional background music.
|
|
3
3
|
*
|
|
4
4
|
* Formats:
|
|
5
5
|
* ShipFeed — 1080×1080 (Instagram/LinkedIn square)
|
|
@@ -12,15 +12,18 @@ import React from 'react';
|
|
|
12
12
|
import { AbsoluteFill, Sequence } from 'remotion';
|
|
13
13
|
import { Slide } from './Slide';
|
|
14
14
|
import type { SlideData } from './Slide';
|
|
15
|
+
import { BackgroundMusic } from './BackgroundMusic';
|
|
16
|
+
import type { AudioConfig } from '../renderer';
|
|
15
17
|
|
|
16
18
|
export interface ShipVideoProps {
|
|
17
19
|
slides: SlideData[];
|
|
18
20
|
format: 'feed' | 'reels';
|
|
21
|
+
audio?: AudioConfig;
|
|
19
22
|
}
|
|
20
23
|
|
|
21
24
|
const FRAMES_PER_SLIDE = 90; // 3 seconds at 30fps
|
|
22
25
|
|
|
23
|
-
export const ShipVideo: React.FC<ShipVideoProps> = ({ slides }) => {
|
|
26
|
+
export const ShipVideo: React.FC<ShipVideoProps> = ({ slides, audio }) => {
|
|
24
27
|
return (
|
|
25
28
|
<AbsoluteFill
|
|
26
29
|
style={{
|
|
@@ -32,6 +35,7 @@ export const ShipVideo: React.FC<ShipVideoProps> = ({ slides }) => {
|
|
|
32
35
|
<Slide slide={slide} />
|
|
33
36
|
</Sequence>
|
|
34
37
|
))}
|
|
38
|
+
{audio && <BackgroundMusic audio={audio} />}
|
|
35
39
|
</AbsoluteFill>
|
|
36
40
|
);
|
|
37
41
|
};
|
|
File without changes
|
|
File without changes
|