@codellyson/framely 0.1.0
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/dist/AbsoluteFill.d.ts +18 -0
- package/dist/AbsoluteFill.d.ts.map +1 -0
- package/dist/AbsoluteFill.js +25 -0
- package/dist/AbsoluteFill.js.map +1 -0
- package/dist/Audio.d.ts +80 -0
- package/dist/Audio.d.ts.map +1 -0
- package/dist/Audio.js +221 -0
- package/dist/Audio.js.map +1 -0
- package/dist/Composition.d.ts +208 -0
- package/dist/Composition.d.ts.map +1 -0
- package/dist/Composition.js +210 -0
- package/dist/Composition.js.map +1 -0
- package/dist/Easing.d.ts +88 -0
- package/dist/Easing.d.ts.map +1 -0
- package/dist/Easing.js +266 -0
- package/dist/Easing.js.map +1 -0
- package/dist/ErrorBoundary.d.ts +35 -0
- package/dist/ErrorBoundary.d.ts.map +1 -0
- package/dist/ErrorBoundary.js +74 -0
- package/dist/ErrorBoundary.js.map +1 -0
- package/dist/Folder.d.ts +46 -0
- package/dist/Folder.d.ts.map +1 -0
- package/dist/Folder.js +44 -0
- package/dist/Folder.js.map +1 -0
- package/dist/Freeze.d.ts +35 -0
- package/dist/Freeze.d.ts.map +1 -0
- package/dist/Freeze.js +40 -0
- package/dist/Freeze.js.map +1 -0
- package/dist/IFrame.d.ts +28 -0
- package/dist/IFrame.d.ts.map +1 -0
- package/dist/IFrame.js +57 -0
- package/dist/IFrame.js.map +1 -0
- package/dist/Img.d.ts +36 -0
- package/dist/Img.d.ts.map +1 -0
- package/dist/Img.js +91 -0
- package/dist/Img.js.map +1 -0
- package/dist/Loop.d.ts +66 -0
- package/dist/Loop.d.ts.map +1 -0
- package/dist/Loop.js +79 -0
- package/dist/Loop.js.map +1 -0
- package/dist/Player.d.ts +118 -0
- package/dist/Player.d.ts.map +1 -0
- package/dist/Player.js +311 -0
- package/dist/Player.js.map +1 -0
- package/dist/Sequence.d.ts +25 -0
- package/dist/Sequence.d.ts.map +1 -0
- package/dist/Sequence.js +37 -0
- package/dist/Sequence.js.map +1 -0
- package/dist/Series.d.ts +52 -0
- package/dist/Series.d.ts.map +1 -0
- package/dist/Series.js +86 -0
- package/dist/Series.js.map +1 -0
- package/dist/Text.d.ts +129 -0
- package/dist/Text.d.ts.map +1 -0
- package/dist/Text.js +211 -0
- package/dist/Text.js.map +1 -0
- package/dist/Video.d.ts +75 -0
- package/dist/Video.d.ts.map +1 -0
- package/dist/Video.js +136 -0
- package/dist/Video.js.map +1 -0
- package/dist/config.d.ts +128 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +243 -0
- package/dist/config.js.map +1 -0
- package/dist/context.d.ts +84 -0
- package/dist/context.d.ts.map +1 -0
- package/dist/context.js +131 -0
- package/dist/context.js.map +1 -0
- package/dist/delayRender.d.ts +130 -0
- package/dist/delayRender.d.ts.map +1 -0
- package/dist/delayRender.js +197 -0
- package/dist/delayRender.js.map +1 -0
- package/dist/getInputProps.d.ts +118 -0
- package/dist/getInputProps.d.ts.map +1 -0
- package/dist/getInputProps.js +181 -0
- package/dist/getInputProps.js.map +1 -0
- package/dist/hooks/useDelayRender.d.ts +52 -0
- package/dist/hooks/useDelayRender.d.ts.map +1 -0
- package/dist/hooks/useDelayRender.js +92 -0
- package/dist/hooks/useDelayRender.js.map +1 -0
- package/dist/hooks.d.ts +19 -0
- package/dist/hooks.d.ts.map +1 -0
- package/dist/hooks.js +17 -0
- package/dist/hooks.js.map +1 -0
- package/dist/index.d.ts +71 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +65 -0
- package/dist/index.js.map +1 -0
- package/dist/interpolate.d.ts +80 -0
- package/dist/interpolate.d.ts.map +1 -0
- package/dist/interpolate.js +108 -0
- package/dist/interpolate.js.map +1 -0
- package/dist/interpolateColors.d.ts +50 -0
- package/dist/interpolateColors.d.ts.map +1 -0
- package/dist/interpolateColors.js +300 -0
- package/dist/interpolateColors.js.map +1 -0
- package/dist/makeTransform.d.ts +98 -0
- package/dist/makeTransform.d.ts.map +1 -0
- package/dist/makeTransform.js +287 -0
- package/dist/makeTransform.js.map +1 -0
- package/dist/measureSpring.d.ts +75 -0
- package/dist/measureSpring.d.ts.map +1 -0
- package/dist/measureSpring.js +108 -0
- package/dist/measureSpring.js.map +1 -0
- package/dist/noise.d.ts +110 -0
- package/dist/noise.d.ts.map +1 -0
- package/dist/noise.js +228 -0
- package/dist/noise.js.map +1 -0
- package/dist/preload.d.ts +145 -0
- package/dist/preload.d.ts.map +1 -0
- package/dist/preload.js +225 -0
- package/dist/preload.js.map +1 -0
- package/dist/registerRoot.d.ts +140 -0
- package/dist/registerRoot.d.ts.map +1 -0
- package/dist/registerRoot.js +238 -0
- package/dist/registerRoot.js.map +1 -0
- package/dist/shapes/Circle.d.ts +15 -0
- package/dist/shapes/Circle.d.ts.map +1 -0
- package/dist/shapes/Circle.js +11 -0
- package/dist/shapes/Circle.js.map +1 -0
- package/dist/shapes/Ellipse.d.ts +16 -0
- package/dist/shapes/Ellipse.d.ts.map +1 -0
- package/dist/shapes/Ellipse.js +11 -0
- package/dist/shapes/Ellipse.js.map +1 -0
- package/dist/shapes/Line.d.ts +15 -0
- package/dist/shapes/Line.d.ts.map +1 -0
- package/dist/shapes/Line.js +11 -0
- package/dist/shapes/Line.js.map +1 -0
- package/dist/shapes/Path.d.ts +20 -0
- package/dist/shapes/Path.d.ts.map +1 -0
- package/dist/shapes/Path.js +14 -0
- package/dist/shapes/Path.js.map +1 -0
- package/dist/shapes/Polygon.d.ts +15 -0
- package/dist/shapes/Polygon.d.ts.map +1 -0
- package/dist/shapes/Polygon.js +16 -0
- package/dist/shapes/Polygon.js.map +1 -0
- package/dist/shapes/Rect.d.ts +18 -0
- package/dist/shapes/Rect.d.ts.map +1 -0
- package/dist/shapes/Rect.js +11 -0
- package/dist/shapes/Rect.js.map +1 -0
- package/dist/shapes/Svg.d.ts +16 -0
- package/dist/shapes/Svg.d.ts.map +1 -0
- package/dist/shapes/Svg.js +15 -0
- package/dist/shapes/Svg.js.map +1 -0
- package/dist/shapes/index.d.ts +16 -0
- package/dist/shapes/index.d.ts.map +1 -0
- package/dist/shapes/index.js +9 -0
- package/dist/shapes/index.js.map +1 -0
- package/dist/shapes/usePathLength.d.ts +24 -0
- package/dist/shapes/usePathLength.d.ts.map +1 -0
- package/dist/shapes/usePathLength.js +32 -0
- package/dist/shapes/usePathLength.js.map +1 -0
- package/dist/staticFile.d.ts +47 -0
- package/dist/staticFile.d.ts.map +1 -0
- package/dist/staticFile.js +105 -0
- package/dist/staticFile.js.map +1 -0
- package/dist/templates/api.d.ts +26 -0
- package/dist/templates/api.d.ts.map +1 -0
- package/dist/templates/api.js +142 -0
- package/dist/templates/api.js.map +1 -0
- package/dist/templates/index.d.ts +7 -0
- package/dist/templates/index.d.ts.map +1 -0
- package/dist/templates/index.js +7 -0
- package/dist/templates/index.js.map +1 -0
- package/dist/templates/mockData.d.ts +7 -0
- package/dist/templates/mockData.d.ts.map +1 -0
- package/dist/templates/mockData.js +262 -0
- package/dist/templates/mockData.js.map +1 -0
- package/dist/templates/types.d.ts +104 -0
- package/dist/templates/types.d.ts.map +1 -0
- package/dist/templates/types.js +16 -0
- package/dist/templates/types.js.map +1 -0
- package/dist/transitions/TransitionSeries.d.ts +127 -0
- package/dist/transitions/TransitionSeries.d.ts.map +1 -0
- package/dist/transitions/TransitionSeries.js +190 -0
- package/dist/transitions/TransitionSeries.js.map +1 -0
- package/dist/transitions/index.d.ts +52 -0
- package/dist/transitions/index.d.ts.map +1 -0
- package/dist/transitions/index.js +31 -0
- package/dist/transitions/index.js.map +1 -0
- package/dist/transitions/presets/fade.d.ts +45 -0
- package/dist/transitions/presets/fade.d.ts.map +1 -0
- package/dist/transitions/presets/fade.js +56 -0
- package/dist/transitions/presets/fade.js.map +1 -0
- package/dist/transitions/presets/flip.d.ts +99 -0
- package/dist/transitions/presets/flip.d.ts.map +1 -0
- package/dist/transitions/presets/flip.js +153 -0
- package/dist/transitions/presets/flip.js.map +1 -0
- package/dist/transitions/presets/slide.d.ts +61 -0
- package/dist/transitions/presets/slide.d.ts.map +1 -0
- package/dist/transitions/presets/slide.js +116 -0
- package/dist/transitions/presets/slide.js.map +1 -0
- package/dist/transitions/presets/wipe.d.ts +69 -0
- package/dist/transitions/presets/wipe.d.ts.map +1 -0
- package/dist/transitions/presets/wipe.js +136 -0
- package/dist/transitions/presets/wipe.js.map +1 -0
- package/dist/transitions/presets/zoom.d.ts +76 -0
- package/dist/transitions/presets/zoom.d.ts.map +1 -0
- package/dist/transitions/presets/zoom.js +110 -0
- package/dist/transitions/presets/zoom.js.map +1 -0
- package/dist/useAudioData.d.ts +112 -0
- package/dist/useAudioData.d.ts.map +1 -0
- package/dist/useAudioData.js +183 -0
- package/dist/useAudioData.js.map +1 -0
- package/dist/useSpring.d.ts +79 -0
- package/dist/useSpring.d.ts.map +1 -0
- package/dist/useSpring.js +140 -0
- package/dist/useSpring.js.map +1 -0
- package/package.json +51 -0
package/dist/config.d.ts
ADDED
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Framely Configuration System
|
|
3
|
+
*
|
|
4
|
+
* Manages configuration for rendering, encoding, and studio behavior.
|
|
5
|
+
* Configuration can be set via:
|
|
6
|
+
* - framely.config.js file
|
|
7
|
+
* - Environment variables
|
|
8
|
+
* - CLI flags (highest priority)
|
|
9
|
+
*/
|
|
10
|
+
/** Supported video codecs. */
|
|
11
|
+
export type Codec = 'h264' | 'h265' | 'vp8' | 'vp9' | 'prores' | 'gif';
|
|
12
|
+
/** Supported log levels. */
|
|
13
|
+
export type LogLevel = 'error' | 'warn' | 'info' | 'verbose';
|
|
14
|
+
/** Supported image output formats. */
|
|
15
|
+
export type ImageFormat = 'png' | 'jpeg';
|
|
16
|
+
/** Supported pixel formats. */
|
|
17
|
+
export type PixelFormat = 'yuv420p' | 'yuva444p10le' | 'rgb8';
|
|
18
|
+
/** Hardware acceleration mode. */
|
|
19
|
+
export type HardwareAcceleration = 'auto' | 'on' | 'off';
|
|
20
|
+
/** Audio codec identifier. */
|
|
21
|
+
export type AudioCodec = 'aac' | string;
|
|
22
|
+
/** The full Framely configuration shape. */
|
|
23
|
+
export interface FramelyConfig {
|
|
24
|
+
concurrency: number;
|
|
25
|
+
codec: Codec;
|
|
26
|
+
pixelFormat: PixelFormat;
|
|
27
|
+
crf: number | null;
|
|
28
|
+
videoBitrate: string | null;
|
|
29
|
+
audioBitrate: string;
|
|
30
|
+
audioCodec: AudioCodec;
|
|
31
|
+
scale: number;
|
|
32
|
+
outputLocation: string;
|
|
33
|
+
imageFormat: ImageFormat;
|
|
34
|
+
jpegQuality: number;
|
|
35
|
+
browserExecutable: string | null;
|
|
36
|
+
chromiumDisableWebSecurity: boolean;
|
|
37
|
+
headless: boolean;
|
|
38
|
+
delayRenderTimeout: number;
|
|
39
|
+
puppeteerTimeout: number;
|
|
40
|
+
studioPort: number;
|
|
41
|
+
rendererPort: number;
|
|
42
|
+
openBrowser: boolean;
|
|
43
|
+
keyboardShortcutsEnabled: boolean;
|
|
44
|
+
maxTimelineTracks: number;
|
|
45
|
+
logLevel: LogLevel;
|
|
46
|
+
enableMultiprocessOnLinux: boolean;
|
|
47
|
+
hardwareAcceleration: HardwareAcceleration;
|
|
48
|
+
}
|
|
49
|
+
/** Validation result returned by {@link validateConfig}. */
|
|
50
|
+
export interface ValidationResult {
|
|
51
|
+
valid: boolean;
|
|
52
|
+
errors: string[];
|
|
53
|
+
}
|
|
54
|
+
/** Remotion-compatible configuration setter API. */
|
|
55
|
+
export interface ConfigSetter {
|
|
56
|
+
setConcurrency: (n: number) => void;
|
|
57
|
+
setCodec: (codec: Codec) => void;
|
|
58
|
+
setPixelFormat: (format: PixelFormat) => void;
|
|
59
|
+
setCrf: (crf: number | null) => void;
|
|
60
|
+
setVideoBitrate: (bitrate: string | null) => void;
|
|
61
|
+
setAudioBitrate: (bitrate: string) => void;
|
|
62
|
+
setAudioCodec: (codec: AudioCodec) => void;
|
|
63
|
+
setScale: (scale: number) => void;
|
|
64
|
+
setOutputLocation: (path: string) => void;
|
|
65
|
+
setImageFormat: (format: ImageFormat) => void;
|
|
66
|
+
setJpegQuality: (quality: number) => void;
|
|
67
|
+
setBrowserExecutable: (path: string | null) => void;
|
|
68
|
+
setChromiumDisableWebSecurity: (disable: boolean) => void;
|
|
69
|
+
setChromiumHeadlessMode: (headless: boolean) => void;
|
|
70
|
+
setDelayRenderTimeoutInMilliseconds: (ms: number) => void;
|
|
71
|
+
setPuppeteerTimeout: (ms: number) => void;
|
|
72
|
+
setStudioPort: (port: number) => void;
|
|
73
|
+
setRendererPort: (port: number) => void;
|
|
74
|
+
setShouldOpenBrowser: (open: boolean) => void;
|
|
75
|
+
setKeyboardShortcutsEnabled: (enabled: boolean) => void;
|
|
76
|
+
setMaxTimelineTracks: (max: number) => void;
|
|
77
|
+
setLevel: (level: LogLevel) => void;
|
|
78
|
+
setEnableMultiprocessOnLinux: (enable: boolean) => void;
|
|
79
|
+
setHardwareAcceleration: (mode: HardwareAcceleration) => void;
|
|
80
|
+
setAll: (config: Partial<FramelyConfig>) => void;
|
|
81
|
+
}
|
|
82
|
+
declare global {
|
|
83
|
+
interface Window {
|
|
84
|
+
__FRAMELY_CONFIG: FramelyConfig;
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
/**
|
|
88
|
+
* Configuration setters (Remotion-compatible API)
|
|
89
|
+
*/
|
|
90
|
+
export declare const Config: ConfigSetter;
|
|
91
|
+
/**
|
|
92
|
+
* Get the current configuration.
|
|
93
|
+
* @returns {object} Current configuration object
|
|
94
|
+
*/
|
|
95
|
+
export declare function getConfig(): FramelyConfig;
|
|
96
|
+
/**
|
|
97
|
+
* Get a specific configuration value.
|
|
98
|
+
* @param {string} key - Configuration key
|
|
99
|
+
* @returns {*} Configuration value
|
|
100
|
+
*/
|
|
101
|
+
export declare function getConfigValue<K extends keyof FramelyConfig>(key: K): FramelyConfig[K];
|
|
102
|
+
/**
|
|
103
|
+
* Reset configuration to defaults.
|
|
104
|
+
*/
|
|
105
|
+
export declare function resetConfig(): void;
|
|
106
|
+
/**
|
|
107
|
+
* Load configuration from an object (used by config file loader).
|
|
108
|
+
* @param {object} config - Configuration object
|
|
109
|
+
*/
|
|
110
|
+
export declare function loadConfig(config: Partial<FramelyConfig>): void;
|
|
111
|
+
/**
|
|
112
|
+
* Get FFmpeg arguments based on current config.
|
|
113
|
+
* @param {object} [overrides] - Override specific settings
|
|
114
|
+
* @returns {string[]} FFmpeg arguments array
|
|
115
|
+
*/
|
|
116
|
+
export declare function getFfmpegArgs(overrides?: Partial<FramelyConfig>): string[];
|
|
117
|
+
/**
|
|
118
|
+
* Get the file extension for the current codec.
|
|
119
|
+
* @returns {string} File extension (e.g., 'mp4', 'webm')
|
|
120
|
+
*/
|
|
121
|
+
export declare function getOutputExtension(): string;
|
|
122
|
+
/**
|
|
123
|
+
* Validate configuration values.
|
|
124
|
+
* @returns {{ valid: boolean, errors: string[] }}
|
|
125
|
+
*/
|
|
126
|
+
export declare function validateConfig(): ValidationResult;
|
|
127
|
+
export default Config;
|
|
128
|
+
//# sourceMappingURL=config.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
|
package/dist/config.js
ADDED
|
@@ -0,0 +1,243 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Framely Configuration System
|
|
3
|
+
*
|
|
4
|
+
* Manages configuration for rendering, encoding, and studio behavior.
|
|
5
|
+
* Configuration can be set via:
|
|
6
|
+
* - framely.config.js file
|
|
7
|
+
* - Environment variables
|
|
8
|
+
* - CLI flags (highest priority)
|
|
9
|
+
*/
|
|
10
|
+
// Default configuration values
|
|
11
|
+
const defaultConfig = {
|
|
12
|
+
// Rendering
|
|
13
|
+
concurrency: Math.max(1, Math.floor((navigator?.hardwareConcurrency || 4) / 2)),
|
|
14
|
+
codec: 'h264',
|
|
15
|
+
pixelFormat: 'yuv420p',
|
|
16
|
+
crf: 18,
|
|
17
|
+
videoBitrate: null,
|
|
18
|
+
audioBitrate: '320k',
|
|
19
|
+
audioCodec: 'aac',
|
|
20
|
+
scale: 1,
|
|
21
|
+
// Output
|
|
22
|
+
outputLocation: './outputs',
|
|
23
|
+
imageFormat: 'png',
|
|
24
|
+
jpegQuality: 80,
|
|
25
|
+
// Browser
|
|
26
|
+
browserExecutable: null,
|
|
27
|
+
chromiumDisableWebSecurity: false,
|
|
28
|
+
headless: true,
|
|
29
|
+
// Timeouts
|
|
30
|
+
delayRenderTimeout: 30000,
|
|
31
|
+
puppeteerTimeout: 30000,
|
|
32
|
+
// Studio
|
|
33
|
+
studioPort: 3000,
|
|
34
|
+
rendererPort: 4000,
|
|
35
|
+
openBrowser: true,
|
|
36
|
+
keyboardShortcutsEnabled: true,
|
|
37
|
+
maxTimelineTracks: 15,
|
|
38
|
+
// Logging
|
|
39
|
+
logLevel: 'info', // 'error' | 'warn' | 'info' | 'verbose'
|
|
40
|
+
// Advanced
|
|
41
|
+
enableMultiprocessOnLinux: true,
|
|
42
|
+
hardwareAcceleration: 'auto', // 'auto' | 'on' | 'off'
|
|
43
|
+
};
|
|
44
|
+
// Current configuration (merged defaults + user config)
|
|
45
|
+
let currentConfig = { ...defaultConfig };
|
|
46
|
+
/**
|
|
47
|
+
* Set a configuration value.
|
|
48
|
+
* @param {string} key - Configuration key
|
|
49
|
+
* @param {*} value - Configuration value
|
|
50
|
+
*/
|
|
51
|
+
function setConfig(key, value) {
|
|
52
|
+
if (key in defaultConfig) {
|
|
53
|
+
currentConfig[key] = value;
|
|
54
|
+
}
|
|
55
|
+
else {
|
|
56
|
+
console.warn(`Unknown config key: ${key}`);
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Configuration setters (Remotion-compatible API)
|
|
61
|
+
*/
|
|
62
|
+
export const Config = {
|
|
63
|
+
// Rendering
|
|
64
|
+
setConcurrency: (n) => setConfig('concurrency', n),
|
|
65
|
+
setCodec: (codec) => setConfig('codec', codec),
|
|
66
|
+
setPixelFormat: (format) => setConfig('pixelFormat', format),
|
|
67
|
+
setCrf: (crf) => setConfig('crf', crf),
|
|
68
|
+
setVideoBitrate: (bitrate) => setConfig('videoBitrate', bitrate),
|
|
69
|
+
setAudioBitrate: (bitrate) => setConfig('audioBitrate', bitrate),
|
|
70
|
+
setAudioCodec: (codec) => setConfig('audioCodec', codec),
|
|
71
|
+
setScale: (scale) => setConfig('scale', scale),
|
|
72
|
+
// Output
|
|
73
|
+
setOutputLocation: (path) => setConfig('outputLocation', path),
|
|
74
|
+
setImageFormat: (format) => setConfig('imageFormat', format),
|
|
75
|
+
setJpegQuality: (quality) => setConfig('jpegQuality', quality),
|
|
76
|
+
// Browser
|
|
77
|
+
setBrowserExecutable: (path) => setConfig('browserExecutable', path),
|
|
78
|
+
setChromiumDisableWebSecurity: (disable) => setConfig('chromiumDisableWebSecurity', disable),
|
|
79
|
+
setChromiumHeadlessMode: (headless) => setConfig('headless', headless),
|
|
80
|
+
// Timeouts
|
|
81
|
+
setDelayRenderTimeoutInMilliseconds: (ms) => setConfig('delayRenderTimeout', ms),
|
|
82
|
+
setPuppeteerTimeout: (ms) => setConfig('puppeteerTimeout', ms),
|
|
83
|
+
// Studio
|
|
84
|
+
setStudioPort: (port) => setConfig('studioPort', port),
|
|
85
|
+
setRendererPort: (port) => setConfig('rendererPort', port),
|
|
86
|
+
setShouldOpenBrowser: (open) => setConfig('openBrowser', open),
|
|
87
|
+
setKeyboardShortcutsEnabled: (enabled) => setConfig('keyboardShortcutsEnabled', enabled),
|
|
88
|
+
setMaxTimelineTracks: (max) => setConfig('maxTimelineTracks', max),
|
|
89
|
+
// Logging
|
|
90
|
+
setLevel: (level) => setConfig('logLevel', level),
|
|
91
|
+
// Advanced
|
|
92
|
+
setEnableMultiprocessOnLinux: (enable) => setConfig('enableMultiprocessOnLinux', enable),
|
|
93
|
+
setHardwareAcceleration: (mode) => setConfig('hardwareAcceleration', mode),
|
|
94
|
+
// Bulk configuration
|
|
95
|
+
setAll: (config) => {
|
|
96
|
+
Object.entries(config).forEach(([key, value]) => {
|
|
97
|
+
setConfig(key, value);
|
|
98
|
+
});
|
|
99
|
+
},
|
|
100
|
+
};
|
|
101
|
+
/**
|
|
102
|
+
* Get the current configuration.
|
|
103
|
+
* @returns {object} Current configuration object
|
|
104
|
+
*/
|
|
105
|
+
export function getConfig() {
|
|
106
|
+
return { ...currentConfig };
|
|
107
|
+
}
|
|
108
|
+
/**
|
|
109
|
+
* Get a specific configuration value.
|
|
110
|
+
* @param {string} key - Configuration key
|
|
111
|
+
* @returns {*} Configuration value
|
|
112
|
+
*/
|
|
113
|
+
export function getConfigValue(key) {
|
|
114
|
+
return currentConfig[key];
|
|
115
|
+
}
|
|
116
|
+
/**
|
|
117
|
+
* Reset configuration to defaults.
|
|
118
|
+
*/
|
|
119
|
+
export function resetConfig() {
|
|
120
|
+
currentConfig = { ...defaultConfig };
|
|
121
|
+
}
|
|
122
|
+
/**
|
|
123
|
+
* Load configuration from an object (used by config file loader).
|
|
124
|
+
* @param {object} config - Configuration object
|
|
125
|
+
*/
|
|
126
|
+
export function loadConfig(config) {
|
|
127
|
+
currentConfig = { ...defaultConfig, ...config };
|
|
128
|
+
}
|
|
129
|
+
/**
|
|
130
|
+
* Get FFmpeg arguments based on current config.
|
|
131
|
+
* @param {object} [overrides] - Override specific settings
|
|
132
|
+
* @returns {string[]} FFmpeg arguments array
|
|
133
|
+
*/
|
|
134
|
+
export function getFfmpegArgs(overrides = {}) {
|
|
135
|
+
const config = { ...currentConfig, ...overrides };
|
|
136
|
+
const args = [];
|
|
137
|
+
// Codec-specific settings
|
|
138
|
+
const codecSettings = {
|
|
139
|
+
h264: {
|
|
140
|
+
codec: 'libx264',
|
|
141
|
+
ext: 'mp4',
|
|
142
|
+
pixelFormat: config.pixelFormat || 'yuv420p',
|
|
143
|
+
},
|
|
144
|
+
h265: {
|
|
145
|
+
codec: 'libx265',
|
|
146
|
+
ext: 'mp4',
|
|
147
|
+
pixelFormat: config.pixelFormat || 'yuv420p',
|
|
148
|
+
},
|
|
149
|
+
vp8: {
|
|
150
|
+
codec: 'libvpx',
|
|
151
|
+
ext: 'webm',
|
|
152
|
+
pixelFormat: config.pixelFormat || 'yuv420p',
|
|
153
|
+
},
|
|
154
|
+
vp9: {
|
|
155
|
+
codec: 'libvpx-vp9',
|
|
156
|
+
ext: 'webm',
|
|
157
|
+
pixelFormat: config.pixelFormat || 'yuv420p',
|
|
158
|
+
},
|
|
159
|
+
prores: {
|
|
160
|
+
codec: 'prores_ks',
|
|
161
|
+
ext: 'mov',
|
|
162
|
+
pixelFormat: 'yuva444p10le',
|
|
163
|
+
},
|
|
164
|
+
gif: {
|
|
165
|
+
codec: 'gif',
|
|
166
|
+
ext: 'gif',
|
|
167
|
+
pixelFormat: 'rgb8',
|
|
168
|
+
},
|
|
169
|
+
};
|
|
170
|
+
const settings = codecSettings[config.codec] || codecSettings.h264;
|
|
171
|
+
// Video codec
|
|
172
|
+
args.push('-c:v', settings.codec);
|
|
173
|
+
// Pixel format
|
|
174
|
+
args.push('-pix_fmt', settings.pixelFormat);
|
|
175
|
+
// Quality (CRF or bitrate)
|
|
176
|
+
if (config.videoBitrate) {
|
|
177
|
+
args.push('-b:v', config.videoBitrate);
|
|
178
|
+
}
|
|
179
|
+
else if (config.crf !== null && config.codec !== 'gif') {
|
|
180
|
+
args.push('-crf', String(config.crf));
|
|
181
|
+
}
|
|
182
|
+
// Audio codec
|
|
183
|
+
if (config.audioCodec) {
|
|
184
|
+
args.push('-c:a', config.audioCodec);
|
|
185
|
+
}
|
|
186
|
+
// Audio bitrate
|
|
187
|
+
if (config.audioBitrate) {
|
|
188
|
+
args.push('-b:a', config.audioBitrate);
|
|
189
|
+
}
|
|
190
|
+
return args;
|
|
191
|
+
}
|
|
192
|
+
/**
|
|
193
|
+
* Get the file extension for the current codec.
|
|
194
|
+
* @returns {string} File extension (e.g., 'mp4', 'webm')
|
|
195
|
+
*/
|
|
196
|
+
export function getOutputExtension() {
|
|
197
|
+
const extensions = {
|
|
198
|
+
h264: 'mp4',
|
|
199
|
+
h265: 'mp4',
|
|
200
|
+
vp8: 'webm',
|
|
201
|
+
vp9: 'webm',
|
|
202
|
+
prores: 'mov',
|
|
203
|
+
gif: 'gif',
|
|
204
|
+
};
|
|
205
|
+
return extensions[currentConfig.codec] || 'mp4';
|
|
206
|
+
}
|
|
207
|
+
/**
|
|
208
|
+
* Validate configuration values.
|
|
209
|
+
* @returns {{ valid: boolean, errors: string[] }}
|
|
210
|
+
*/
|
|
211
|
+
export function validateConfig() {
|
|
212
|
+
const errors = [];
|
|
213
|
+
if (currentConfig.concurrency < 1) {
|
|
214
|
+
errors.push('concurrency must be at least 1');
|
|
215
|
+
}
|
|
216
|
+
if (currentConfig.crf !== null && (currentConfig.crf < 0 || currentConfig.crf > 51)) {
|
|
217
|
+
errors.push('crf must be between 0 and 51');
|
|
218
|
+
}
|
|
219
|
+
if (currentConfig.scale <= 0) {
|
|
220
|
+
errors.push('scale must be positive');
|
|
221
|
+
}
|
|
222
|
+
if (currentConfig.jpegQuality < 0 || currentConfig.jpegQuality > 100) {
|
|
223
|
+
errors.push('jpegQuality must be between 0 and 100');
|
|
224
|
+
}
|
|
225
|
+
const validCodecs = ['h264', 'h265', 'vp8', 'vp9', 'prores', 'gif'];
|
|
226
|
+
if (!validCodecs.includes(currentConfig.codec)) {
|
|
227
|
+
errors.push(`codec must be one of: ${validCodecs.join(', ')}`);
|
|
228
|
+
}
|
|
229
|
+
const validLogLevels = ['error', 'warn', 'info', 'verbose'];
|
|
230
|
+
if (!validLogLevels.includes(currentConfig.logLevel)) {
|
|
231
|
+
errors.push(`logLevel must be one of: ${validLogLevels.join(', ')}`);
|
|
232
|
+
}
|
|
233
|
+
return {
|
|
234
|
+
valid: errors.length === 0,
|
|
235
|
+
errors,
|
|
236
|
+
};
|
|
237
|
+
}
|
|
238
|
+
// Expose config globally for the renderer
|
|
239
|
+
if (typeof window !== 'undefined') {
|
|
240
|
+
window.__FRAMELY_CONFIG = currentConfig;
|
|
241
|
+
}
|
|
242
|
+
export default Config;
|
|
243
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
import { type ReactNode } from 'react';
|
|
2
|
+
/**
|
|
3
|
+
* The baseline shape stored in TimelineContext.
|
|
4
|
+
* Contains the current frame and video configuration.
|
|
5
|
+
*/
|
|
6
|
+
export interface TimelineContextValue {
|
|
7
|
+
/** Current frame index (0-based). */
|
|
8
|
+
frame: number;
|
|
9
|
+
/** Frames per second. */
|
|
10
|
+
fps: number;
|
|
11
|
+
/** Composition width in pixels. */
|
|
12
|
+
width: number;
|
|
13
|
+
/** Composition height in pixels. */
|
|
14
|
+
height: number;
|
|
15
|
+
/** Total number of frames in the composition. */
|
|
16
|
+
durationInFrames: number;
|
|
17
|
+
/** Whether playback is currently active. */
|
|
18
|
+
playing: boolean;
|
|
19
|
+
/** Whether we are in render mode (controlled externally by Playwright). */
|
|
20
|
+
renderMode: boolean;
|
|
21
|
+
/** Set the current frame (clamped to valid range). */
|
|
22
|
+
setFrame: (frame: number) => void;
|
|
23
|
+
/** Start playback. */
|
|
24
|
+
play: () => void;
|
|
25
|
+
/** Pause playback. */
|
|
26
|
+
pause: () => void;
|
|
27
|
+
/** Toggle between play and pause. */
|
|
28
|
+
toggle: () => void;
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Props accepted by the TimelineProvider component.
|
|
32
|
+
*/
|
|
33
|
+
export interface TimelineProviderProps {
|
|
34
|
+
/** Frames per second. @default 30 */
|
|
35
|
+
fps?: number;
|
|
36
|
+
/** Composition width in pixels. @default 1920 */
|
|
37
|
+
width?: number;
|
|
38
|
+
/** Composition height in pixels. @default 1080 */
|
|
39
|
+
height?: number;
|
|
40
|
+
/** Total number of frames. @default 300 */
|
|
41
|
+
durationInFrames?: number;
|
|
42
|
+
/**
|
|
43
|
+
* When true, the provider exposes `window.__setFrame()` for external
|
|
44
|
+
* control (e.g. Playwright-based rendering).
|
|
45
|
+
* @default false
|
|
46
|
+
*/
|
|
47
|
+
renderMode?: boolean;
|
|
48
|
+
/** Initial frame to display. @default 0 */
|
|
49
|
+
initialFrame?: number;
|
|
50
|
+
/** React children. */
|
|
51
|
+
children: ReactNode;
|
|
52
|
+
/** Called whenever the current frame changes. */
|
|
53
|
+
onFrameChange?: (frame: number) => void;
|
|
54
|
+
}
|
|
55
|
+
declare global {
|
|
56
|
+
interface Window {
|
|
57
|
+
__setFrame?: (frame: number) => Promise<void>;
|
|
58
|
+
__ready?: boolean;
|
|
59
|
+
__compositionWidth?: number;
|
|
60
|
+
__compositionHeight?: number;
|
|
61
|
+
__compositionFps?: number;
|
|
62
|
+
__compositionDurationInFrames?: number;
|
|
63
|
+
__FRAMELY_AUDIO_TRACKS?: Array<{
|
|
64
|
+
src: string;
|
|
65
|
+
startFrame: number;
|
|
66
|
+
volume: number;
|
|
67
|
+
}>;
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* TimelineContext holds the current frame and video configuration.
|
|
72
|
+
* This is the core of the framework — every component that needs
|
|
73
|
+
* to know "where in time we are" reads from this context.
|
|
74
|
+
*/
|
|
75
|
+
declare const TimelineContext: import("react").Context<TimelineContextValue>;
|
|
76
|
+
export declare function useTimeline(): TimelineContextValue;
|
|
77
|
+
export { TimelineContext };
|
|
78
|
+
/**
|
|
79
|
+
* TimelineProvider wraps a composition and manages playback state.
|
|
80
|
+
* In "render mode" (controlled externally), it exposes window.__setFrame().
|
|
81
|
+
*/
|
|
82
|
+
export declare function TimelineProvider({ fps, width, height, durationInFrames, renderMode, initialFrame, children, onFrameChange, }: TimelineProviderProps): JSX.Element;
|
|
83
|
+
export default TimelineContext;
|
|
84
|
+
//# sourceMappingURL=context.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../src/context.tsx"],"names":[],"mappings":"AAAA,OAAO,EAOL,KAAK,SAAS,EACf,MAAM,OAAO,CAAC;AAIf;;;GAGG;AACH,MAAM,WAAW,oBAAoB;IACnC,qCAAqC;IACrC,KAAK,EAAE,MAAM,CAAC;IACd,yBAAyB;IACzB,GAAG,EAAE,MAAM,CAAC;IACZ,mCAAmC;IACnC,KAAK,EAAE,MAAM,CAAC;IACd,oCAAoC;IACpC,MAAM,EAAE,MAAM,CAAC;IACf,iDAAiD;IACjD,gBAAgB,EAAE,MAAM,CAAC;IACzB,4CAA4C;IAC5C,OAAO,EAAE,OAAO,CAAC;IACjB,2EAA2E;IAC3E,UAAU,EAAE,OAAO,CAAC;IACpB,sDAAsD;IACtD,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAClC,sBAAsB;IACtB,IAAI,EAAE,MAAM,IAAI,CAAC;IACjB,sBAAsB;IACtB,KAAK,EAAE,MAAM,IAAI,CAAC;IAClB,qCAAqC;IACrC,MAAM,EAAE,MAAM,IAAI,CAAC;CACpB;AAED;;GAEG;AACH,MAAM,WAAW,qBAAqB;IACpC,qCAAqC;IACrC,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,iDAAiD;IACjD,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,kDAAkD;IAClD,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,2CAA2C;IAC3C,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B;;;;OAIG;IACH,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,2CAA2C;IAC3C,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,sBAAsB;IACtB,QAAQ,EAAE,SAAS,CAAC;IACpB,iDAAiD;IACjD,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;CACzC;AAID,OAAO,CAAC,MAAM,CAAC;IACb,UAAU,MAAM;QACd,UAAU,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;QAC9C,OAAO,CAAC,EAAE,OAAO,CAAC;QAClB,kBAAkB,CAAC,EAAE,MAAM,CAAC;QAC5B,mBAAmB,CAAC,EAAE,MAAM,CAAC;QAC7B,gBAAgB,CAAC,EAAE,MAAM,CAAC;QAC1B,6BAA6B,CAAC,EAAE,MAAM,CAAC;QACvC,sBAAsB,CAAC,EAAE,KAAK,CAAC;YAAE,GAAG,EAAE,MAAM,CAAC;YAAC,UAAU,EAAE,MAAM,CAAC;YAAC,MAAM,EAAE,MAAM,CAAA;SAAE,CAAC,CAAC;KACrF;CACF;AAID;;;;GAIG;AACH,QAAA,MAAM,eAAe,+CAYnB,CAAC;AAEH,wBAAgB,WAAW,IAAI,oBAAoB,CAElD;AAED,OAAO,EAAE,eAAe,EAAE,CAAC;AAI3B;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,EAC/B,GAAQ,EACR,KAAY,EACZ,MAAa,EACb,gBAAsB,EACtB,UAAkB,EAClB,YAAgB,EAChB,QAAQ,EACR,aAAa,GACd,EAAE,qBAAqB,GAAG,GAAG,CAAC,OAAO,CAmHrC;AAED,eAAe,eAAe,CAAC"}
|
package/dist/context.js
ADDED
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
import { createContext, useContext, useState, useCallback, useRef, useEffect, } from 'react';
|
|
3
|
+
// ─── Context ─────────────────────────────────────────────────────────────────
|
|
4
|
+
/**
|
|
5
|
+
* TimelineContext holds the current frame and video configuration.
|
|
6
|
+
* This is the core of the framework — every component that needs
|
|
7
|
+
* to know "where in time we are" reads from this context.
|
|
8
|
+
*/
|
|
9
|
+
const TimelineContext = createContext({
|
|
10
|
+
frame: 0,
|
|
11
|
+
fps: 30,
|
|
12
|
+
width: 1920,
|
|
13
|
+
height: 1080,
|
|
14
|
+
durationInFrames: 300,
|
|
15
|
+
playing: false,
|
|
16
|
+
renderMode: false,
|
|
17
|
+
setFrame: () => { },
|
|
18
|
+
play: () => { },
|
|
19
|
+
pause: () => { },
|
|
20
|
+
toggle: () => { },
|
|
21
|
+
});
|
|
22
|
+
export function useTimeline() {
|
|
23
|
+
return useContext(TimelineContext);
|
|
24
|
+
}
|
|
25
|
+
export { TimelineContext };
|
|
26
|
+
// ─── Provider ────────────────────────────────────────────────────────────────
|
|
27
|
+
/**
|
|
28
|
+
* TimelineProvider wraps a composition and manages playback state.
|
|
29
|
+
* In "render mode" (controlled externally), it exposes window.__setFrame().
|
|
30
|
+
*/
|
|
31
|
+
export function TimelineProvider({ fps = 30, width = 1920, height = 1080, durationInFrames = 300, renderMode = false, initialFrame = 0, children, onFrameChange, }) {
|
|
32
|
+
const [frame, setFrameState] = useState(initialFrame);
|
|
33
|
+
const [playing, setPlaying] = useState(false);
|
|
34
|
+
const rafRef = useRef(null);
|
|
35
|
+
const lastTimeRef = useRef(null);
|
|
36
|
+
const frameRef = useRef(frame);
|
|
37
|
+
// Keep ref in sync
|
|
38
|
+
frameRef.current = frame;
|
|
39
|
+
const setFrame = useCallback((f) => {
|
|
40
|
+
const clamped = Math.max(0, Math.min(f, durationInFrames - 1));
|
|
41
|
+
setFrameState(clamped);
|
|
42
|
+
onFrameChange?.(clamped);
|
|
43
|
+
}, [durationInFrames, onFrameChange]);
|
|
44
|
+
// Expose setFrame globally for the renderer (Playwright calls this)
|
|
45
|
+
useEffect(() => {
|
|
46
|
+
if (renderMode) {
|
|
47
|
+
window.__setFrame = (f) => {
|
|
48
|
+
return new Promise((resolve) => {
|
|
49
|
+
setFrame(f);
|
|
50
|
+
// Wait for React to render the new frame
|
|
51
|
+
requestAnimationFrame(() => {
|
|
52
|
+
requestAnimationFrame(() => {
|
|
53
|
+
resolve();
|
|
54
|
+
});
|
|
55
|
+
});
|
|
56
|
+
});
|
|
57
|
+
};
|
|
58
|
+
// Expose composition metadata for the CLI renderer
|
|
59
|
+
window.__compositionWidth = width;
|
|
60
|
+
window.__compositionHeight = height;
|
|
61
|
+
window.__compositionFps = fps;
|
|
62
|
+
window.__compositionDurationInFrames = durationInFrames;
|
|
63
|
+
// Initialize audio tracks array for Audio components to register into
|
|
64
|
+
window.__FRAMELY_AUDIO_TRACKS = [];
|
|
65
|
+
window.__ready = true;
|
|
66
|
+
return () => {
|
|
67
|
+
delete window.__setFrame;
|
|
68
|
+
delete window.__ready;
|
|
69
|
+
delete window.__compositionWidth;
|
|
70
|
+
delete window.__compositionHeight;
|
|
71
|
+
delete window.__compositionFps;
|
|
72
|
+
delete window.__compositionDurationInFrames;
|
|
73
|
+
delete window.__FRAMELY_AUDIO_TRACKS;
|
|
74
|
+
};
|
|
75
|
+
}
|
|
76
|
+
}, [renderMode, setFrame, width, height, fps, durationInFrames]);
|
|
77
|
+
// Playback loop
|
|
78
|
+
useEffect(() => {
|
|
79
|
+
if (!playing) {
|
|
80
|
+
if (rafRef.current)
|
|
81
|
+
cancelAnimationFrame(rafRef.current);
|
|
82
|
+
lastTimeRef.current = null;
|
|
83
|
+
return;
|
|
84
|
+
}
|
|
85
|
+
const frameDuration = 1000 / fps;
|
|
86
|
+
let accumulated = 0;
|
|
87
|
+
const tick = (timestamp) => {
|
|
88
|
+
if (lastTimeRef.current === null) {
|
|
89
|
+
lastTimeRef.current = timestamp;
|
|
90
|
+
}
|
|
91
|
+
const delta = timestamp - lastTimeRef.current;
|
|
92
|
+
lastTimeRef.current = timestamp;
|
|
93
|
+
accumulated += delta;
|
|
94
|
+
while (accumulated >= frameDuration) {
|
|
95
|
+
accumulated -= frameDuration;
|
|
96
|
+
const next = frameRef.current + 1;
|
|
97
|
+
if (next >= durationInFrames) {
|
|
98
|
+
setFrame(0);
|
|
99
|
+
setPlaying(false);
|
|
100
|
+
return;
|
|
101
|
+
}
|
|
102
|
+
setFrame(next);
|
|
103
|
+
}
|
|
104
|
+
rafRef.current = requestAnimationFrame(tick);
|
|
105
|
+
};
|
|
106
|
+
rafRef.current = requestAnimationFrame(tick);
|
|
107
|
+
return () => {
|
|
108
|
+
if (rafRef.current)
|
|
109
|
+
cancelAnimationFrame(rafRef.current);
|
|
110
|
+
};
|
|
111
|
+
}, [playing, fps, durationInFrames, setFrame]);
|
|
112
|
+
const play = useCallback(() => setPlaying(true), []);
|
|
113
|
+
const pause = useCallback(() => setPlaying(false), []);
|
|
114
|
+
const toggle = useCallback(() => setPlaying((p) => !p), []);
|
|
115
|
+
const value = {
|
|
116
|
+
frame,
|
|
117
|
+
fps,
|
|
118
|
+
width,
|
|
119
|
+
height,
|
|
120
|
+
durationInFrames,
|
|
121
|
+
playing,
|
|
122
|
+
renderMode,
|
|
123
|
+
setFrame,
|
|
124
|
+
play,
|
|
125
|
+
pause,
|
|
126
|
+
toggle,
|
|
127
|
+
};
|
|
128
|
+
return (_jsx(TimelineContext.Provider, { value: value, children: children }));
|
|
129
|
+
}
|
|
130
|
+
export default TimelineContext;
|
|
131
|
+
//# sourceMappingURL=context.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"context.js","sourceRoot":"","sources":["../src/context.tsx"],"names":[],"mappings":"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"}
|