@framefields/node-compositor 0.0.0-stage → 2.0.3
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/.turbo/turbo-build.log +22 -0
- package/.turbo/turbo-test.log +21 -0
- package/CHANGELOG.md +34 -0
- package/LICENCE +202 -0
- package/SKILL.md +370 -0
- package/dist/index-B0ir9Z7o.d.mts +139 -0
- package/dist/index-B0ir9Z7o.d.mts.map +1 -0
- package/dist/index.d.mts +230 -0
- package/dist/index.d.mts.map +1 -0
- package/dist/index.mjs +674 -0
- package/dist/index.mjs.map +1 -0
- package/dist/renderer.d.mts +2 -0
- package/dist/renderer.mjs +3 -0
- package/dist/renderers-DoYYCzgA.mjs +3326 -0
- package/dist/renderers-DoYYCzgA.mjs.map +1 -0
- package/package.json +51 -3
- package/src/index.ts +2 -0
- package/src/renderers/audio-processor.ts +123 -0
- package/src/renderers/container-bg.test.ts +22 -0
- package/src/renderers/container-bg.ts +15 -0
- package/src/renderers/index.ts +9 -0
- package/src/renderers/transform.test.ts +120 -0
- package/src/renderers/transform.ts +101 -0
- package/src/renderers/transform3d.test.ts +290 -0
- package/src/renderers/transform3d.ts +428 -0
- package/src/renderers/webgpu-renderer.ts +4038 -0
- package/src/shared/audio-reactive.test.ts +224 -0
- package/src/shared/bezier-solver.test.ts +92 -0
- package/src/shared/bezier-solver.ts +257 -0
- package/src/shared/compiler.test.ts +1309 -0
- package/src/shared/compiler.ts +996 -0
- package/src/shared/config.ts +44 -0
- package/src/shared/index.ts +3 -0
- package/src/shared/kinetic-typography.test.ts +138 -0
- package/src/shared/presets.test.ts +217 -0
- package/src/shared/presets.ts +644 -0
- package/src/shared/processor.ts +105 -0
- package/tsconfig.json +13 -0
- package/tsdown.config.ts +13 -0
- package/README.md +0 -3
package/dist/index.d.mts
ADDED
|
@@ -0,0 +1,230 @@
|
|
|
1
|
+
import { a as Point3D, c as Transform3DPropsLike, i as Point2D, l as has3DTransform, n as Layer3DMatrixConfig, o as Quad2D, r as Matrix4x4, s as Transform3DMath, u as solveHomography } from "./index-B0ir9Z7o.mjs";
|
|
2
|
+
import * as _framefields_compositions_program0 from "@framefields/compositions/program";
|
|
3
|
+
import { AnimationTrack, CompositorProgramConfig, EaseRef, LayerAnimationSpec } from "@framefields/compositions/program";
|
|
4
|
+
import * as _framefields_core0 from "@framefields/core";
|
|
5
|
+
import { VirtualMediaData } from "@framefields/core";
|
|
6
|
+
import { z } from "zod";
|
|
7
|
+
|
|
8
|
+
//#region src/shared/compiler.d.ts
|
|
9
|
+
interface LayerStub {
|
|
10
|
+
id: string;
|
|
11
|
+
inputHandleId: string;
|
|
12
|
+
trackId?: string;
|
|
13
|
+
x: number;
|
|
14
|
+
y: number;
|
|
15
|
+
scale: number;
|
|
16
|
+
rotation: number;
|
|
17
|
+
opacity: number;
|
|
18
|
+
volume: number;
|
|
19
|
+
width?: number;
|
|
20
|
+
height?: number;
|
|
21
|
+
hidden: boolean;
|
|
22
|
+
muted: boolean;
|
|
23
|
+
text?: number;
|
|
24
|
+
fontSize?: number;
|
|
25
|
+
fill?: string;
|
|
26
|
+
borderColor?: string;
|
|
27
|
+
backgroundColor?: string;
|
|
28
|
+
rotateX?: number;
|
|
29
|
+
rotateY?: number;
|
|
30
|
+
rotateZ?: number;
|
|
31
|
+
perspective?: number;
|
|
32
|
+
perspectiveOriginX?: number;
|
|
33
|
+
perspectiveOriginY?: number;
|
|
34
|
+
translateZ?: number;
|
|
35
|
+
backfaceVisibility?: "visible" | "hidden";
|
|
36
|
+
transformStyle?: "flat" | "preserve-3d";
|
|
37
|
+
is3D?: boolean;
|
|
38
|
+
z?: number;
|
|
39
|
+
scaleZ?: number;
|
|
40
|
+
twoSided?: boolean;
|
|
41
|
+
material?: "lit" | "unlit" | "toon";
|
|
42
|
+
shininess?: number;
|
|
43
|
+
roughness?: number;
|
|
44
|
+
specularIntensity?: number;
|
|
45
|
+
ambientIntensity?: number;
|
|
46
|
+
metallic?: number;
|
|
47
|
+
cameraX?: number;
|
|
48
|
+
cameraY?: number;
|
|
49
|
+
cameraZ?: number;
|
|
50
|
+
targetX?: number;
|
|
51
|
+
targetY?: number;
|
|
52
|
+
targetZ?: number;
|
|
53
|
+
cameraPitch?: number;
|
|
54
|
+
cameraYaw?: number;
|
|
55
|
+
cameraRoll?: number;
|
|
56
|
+
cameraFov?: number;
|
|
57
|
+
cameraZoom?: number;
|
|
58
|
+
focalLength?: number;
|
|
59
|
+
focusDistance?: number;
|
|
60
|
+
fStop?: number;
|
|
61
|
+
maxBlurRadius?: number;
|
|
62
|
+
shakeTranslation?: number;
|
|
63
|
+
shakeRotation?: number;
|
|
64
|
+
orbitRadius?: number;
|
|
65
|
+
orbitAzimuth?: number;
|
|
66
|
+
orbitElevation?: number;
|
|
67
|
+
animationProgress?: number;
|
|
68
|
+
animationTime?: number;
|
|
69
|
+
animationSpeed?: number;
|
|
70
|
+
wireframe?: boolean;
|
|
71
|
+
scaleX?: number;
|
|
72
|
+
scaleY?: number;
|
|
73
|
+
lightType?: string;
|
|
74
|
+
intensity?: number;
|
|
75
|
+
radius?: number;
|
|
76
|
+
angle?: number;
|
|
77
|
+
penumbra?: number;
|
|
78
|
+
decay?: number;
|
|
79
|
+
[key: string]: unknown;
|
|
80
|
+
}
|
|
81
|
+
type CompilerVirtualMedia = {
|
|
82
|
+
metadata?: Partial<VirtualMediaData["metadata"]>;
|
|
83
|
+
operation?: Partial<VirtualMediaData["operation"]> & Record<string, any>;
|
|
84
|
+
children?: CompilerNodeVM[];
|
|
85
|
+
};
|
|
86
|
+
/** A node op inside the render tree (CompositorLayer). */
|
|
87
|
+
type CompilerNodeVM = CompilerVirtualMedia;
|
|
88
|
+
interface CompileResult {
|
|
89
|
+
tl: gsap.core.Timeline;
|
|
90
|
+
targetsById: Record<string, LayerStub>;
|
|
91
|
+
/** Node ops the timeline was compiled from (tree order). */
|
|
92
|
+
nodes: CompilerNodeVM[];
|
|
93
|
+
}
|
|
94
|
+
declare function getCachedTimeline(cacheKey: string): CompileResult | undefined;
|
|
95
|
+
declare function setCachedTimeline(cacheKey: string, value: CompileResult): void;
|
|
96
|
+
declare function mappedEase(ease?: EaseRef, durationFrames?: number, fps?: number): string | ((p: number) => number);
|
|
97
|
+
interface TruncationInfo {
|
|
98
|
+
layerId: string;
|
|
99
|
+
trackId: string;
|
|
100
|
+
prop: string;
|
|
101
|
+
dropped: number;
|
|
102
|
+
maxAuthoredFrame: number;
|
|
103
|
+
}
|
|
104
|
+
declare function compileTimeline(renderId: string, virtualMedia: CompilerVirtualMedia | null | undefined, options: {
|
|
105
|
+
fps: number;
|
|
106
|
+
durationSec: number;
|
|
107
|
+
}): CompileResult;
|
|
108
|
+
declare function compileLayerTimeline(layerId: string, animation: LayerAnimationSpec | undefined, baseVolume: number, baseMuted: boolean, fps: number): {
|
|
109
|
+
tl: gsap.core.Timeline;
|
|
110
|
+
stub: {
|
|
111
|
+
volume: number;
|
|
112
|
+
muted: boolean;
|
|
113
|
+
};
|
|
114
|
+
};
|
|
115
|
+
//#endregion
|
|
116
|
+
//#region src/shared/config.d.ts
|
|
117
|
+
/**
|
|
118
|
+
* v2 config — THE document (spec: SKILL.md).
|
|
119
|
+
* No `layers`, no `layerUpdates`, no aliases. The node config IS the
|
|
120
|
+
* composition program: strict zod, validated by the E-code pre-parse scan
|
|
121
|
+
* in `@framefields/compositions/program/validate`.
|
|
122
|
+
*/
|
|
123
|
+
declare const CompositorNodeConfigSchema: z.ZodObject<{
|
|
124
|
+
width: z.ZodNumber;
|
|
125
|
+
height: z.ZodNumber;
|
|
126
|
+
backgroundColor: z.ZodOptional<z.ZodString>;
|
|
127
|
+
volume: z.ZodDefault<z.ZodNumber>;
|
|
128
|
+
fps: z.ZodDefault<z.ZodNumber>;
|
|
129
|
+
mode: z.ZodDefault<z.ZodEnum<{
|
|
130
|
+
Image: "Image";
|
|
131
|
+
Video: "Video";
|
|
132
|
+
}>>;
|
|
133
|
+
antialias3d: z.ZodOptional<z.ZodBoolean>;
|
|
134
|
+
layout: z.ZodDefault<z.ZodArray<z.ZodType<_framefields_compositions_program0.LayoutNode, unknown, z.core.$ZodTypeInternals<_framefields_compositions_program0.LayoutNode, unknown>>>>;
|
|
135
|
+
fonts: z.ZodOptional<z.ZodArray<z.ZodString>>;
|
|
136
|
+
signals: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
|
|
137
|
+
effects: z.ZodOptional<z.ZodArray<z.ZodUnknown>>;
|
|
138
|
+
vision: z.ZodOptional<z.ZodUnknown>;
|
|
139
|
+
onRequestFrame: z.ZodOptional<z.ZodCustom<unknown, unknown>>;
|
|
140
|
+
}, z.core.$strict>;
|
|
141
|
+
type CompositorNodeConfig = CompositorProgramConfig;
|
|
142
|
+
/** Data types accepted by the variable composer inputs. */
|
|
143
|
+
declare const VariableInputDataTypes: readonly ["Text", "Image", "Video", "Audio", "Caption", "SVG", "GIF", "Lottie", "Signal"];
|
|
144
|
+
type VariableInputDataType = (typeof VariableInputDataTypes)[number];
|
|
145
|
+
/** The Compositor op framing (used in the render tree, per processCompositor). */
|
|
146
|
+
declare const CompositorOperationSchema: z.ZodObject<{
|
|
147
|
+
width: z.ZodNumber;
|
|
148
|
+
height: z.ZodNumber;
|
|
149
|
+
backgroundColor: z.ZodOptional<z.ZodString>;
|
|
150
|
+
volume: z.ZodDefault<z.ZodNumber>;
|
|
151
|
+
fps: z.ZodDefault<z.ZodNumber>;
|
|
152
|
+
mode: z.ZodDefault<z.ZodEnum<{
|
|
153
|
+
Image: "Image";
|
|
154
|
+
Video: "Video";
|
|
155
|
+
}>>;
|
|
156
|
+
antialias3d: z.ZodOptional<z.ZodBoolean>;
|
|
157
|
+
layout: z.ZodDefault<z.ZodArray<z.ZodType<_framefields_compositions_program0.LayoutNode, unknown, z.core.$ZodTypeInternals<_framefields_compositions_program0.LayoutNode, unknown>>>>;
|
|
158
|
+
fonts: z.ZodOptional<z.ZodArray<z.ZodString>>;
|
|
159
|
+
signals: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
|
|
160
|
+
effects: z.ZodOptional<z.ZodArray<z.ZodUnknown>>;
|
|
161
|
+
vision: z.ZodOptional<z.ZodUnknown>;
|
|
162
|
+
onRequestFrame: z.ZodOptional<z.ZodCustom<unknown, unknown>>;
|
|
163
|
+
op: z.ZodLiteral<"Compositor">;
|
|
164
|
+
dataType: z.ZodOptional<z.ZodEnum<{
|
|
165
|
+
Image: "Image";
|
|
166
|
+
Video: "Video";
|
|
167
|
+
}>>;
|
|
168
|
+
metadata: z.ZodOptional<z.ZodObject<{
|
|
169
|
+
width: z.ZodNullable<z.ZodOptional<z.ZodNumber>>;
|
|
170
|
+
height: z.ZodNullable<z.ZodOptional<z.ZodNumber>>;
|
|
171
|
+
fps: z.ZodNullable<z.ZodOptional<z.ZodNumber>>;
|
|
172
|
+
durationMs: z.ZodNullable<z.ZodOptional<z.ZodNumber>>;
|
|
173
|
+
sampleRate: z.ZodNullable<z.ZodOptional<z.ZodNumber>>;
|
|
174
|
+
channels: z.ZodNullable<z.ZodOptional<z.ZodNumber>>;
|
|
175
|
+
bitDepth: z.ZodNullable<z.ZodOptional<z.ZodNumber>>;
|
|
176
|
+
audioCodec: z.ZodNullable<z.ZodOptional<z.ZodString>>;
|
|
177
|
+
audioBitrate: z.ZodNullable<z.ZodOptional<z.ZodNumber>>;
|
|
178
|
+
}, z.core.$strip>>;
|
|
179
|
+
}, z.core.$strict>;
|
|
180
|
+
type CompositorOperation = z.infer<typeof CompositorOperationSchema>;
|
|
181
|
+
declare const CompositorResultSchema: z.ZodUnion<readonly [z.ZodObject<{
|
|
182
|
+
selectedOutputIndex: z.ZodLiteral<0>;
|
|
183
|
+
outputs: z.ZodTuple<[z.ZodObject<{
|
|
184
|
+
items: z.ZodTuple<[z.ZodType<_framefields_core0.OutputItem<"Video">, unknown, z.core.$ZodTypeInternals<_framefields_core0.OutputItem<"Video">, unknown>>], null>;
|
|
185
|
+
}, z.core.$strip>], null>;
|
|
186
|
+
}, z.core.$strip>, z.ZodObject<{
|
|
187
|
+
selectedOutputIndex: z.ZodLiteral<0>;
|
|
188
|
+
outputs: z.ZodTuple<[z.ZodObject<{
|
|
189
|
+
items: z.ZodTuple<[z.ZodType<_framefields_core0.OutputItem<"Image">, unknown, z.core.$ZodTypeInternals<_framefields_core0.OutputItem<"Image">, unknown>>], null>;
|
|
190
|
+
}, z.core.$strip>], null>;
|
|
191
|
+
}, z.core.$strip>]>;
|
|
192
|
+
//#endregion
|
|
193
|
+
//#region src/shared/presets.d.ts
|
|
194
|
+
interface LayerBase {
|
|
195
|
+
x: number;
|
|
196
|
+
y: number;
|
|
197
|
+
scale: number;
|
|
198
|
+
rotation: number;
|
|
199
|
+
opacity: number;
|
|
200
|
+
width?: number;
|
|
201
|
+
height?: number;
|
|
202
|
+
durationFrames: number;
|
|
203
|
+
}
|
|
204
|
+
interface PresetChip {
|
|
205
|
+
groupId: string;
|
|
206
|
+
presetType: string;
|
|
207
|
+
kind: "entrance" | "exit" | "emphasis";
|
|
208
|
+
label: string;
|
|
209
|
+
durationFrames: number;
|
|
210
|
+
ease?: EaseRef;
|
|
211
|
+
}
|
|
212
|
+
declare function getPresetDetails(presetType: string): {
|
|
213
|
+
kind: "entrance" | "exit" | "emphasis";
|
|
214
|
+
label: string;
|
|
215
|
+
};
|
|
216
|
+
declare function chipsForLayer(layer: {
|
|
217
|
+
animation?: {
|
|
218
|
+
tracks?: AnimationTrack[];
|
|
219
|
+
};
|
|
220
|
+
} | null | undefined): PresetChip[];
|
|
221
|
+
declare function materializePreset(layerBase: LayerBase, presetType: string, options: {
|
|
222
|
+
width: number;
|
|
223
|
+
height: number;
|
|
224
|
+
fps: number;
|
|
225
|
+
presetGroupId?: string;
|
|
226
|
+
durationFrames?: number;
|
|
227
|
+
}): AnimationTrack[];
|
|
228
|
+
//#endregion
|
|
229
|
+
export { CompileResult, CompilerNodeVM, CompilerVirtualMedia, CompositorNodeConfig, CompositorNodeConfigSchema, CompositorOperation, CompositorOperationSchema, CompositorResultSchema, Layer3DMatrixConfig, LayerBase, LayerStub, Matrix4x4, Point2D, Point3D, PresetChip, Quad2D, Transform3DMath, Transform3DPropsLike, TruncationInfo, VariableInputDataType, VariableInputDataTypes, chipsForLayer, compileLayerTimeline, compileTimeline, getCachedTimeline, getPresetDetails, has3DTransform, mappedEase, materializePreset, setCachedTimeline, solveHomography };
|
|
230
|
+
//# sourceMappingURL=index.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.mts","names":[],"sources":["../src/shared/compiler.ts","../src/shared/config.ts","../src/shared/presets.ts"],"sourcesContent":[],"mappings":"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"}
|