@codellyson/framely 0.1.0 → 0.1.1
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 +3 -2
- package/src/AbsoluteFill.tsx +50 -0
- package/src/Audio.tsx +294 -0
- package/src/Composition.tsx +378 -0
- package/src/Easing.ts +294 -0
- package/src/ErrorBoundary.tsx +136 -0
- package/src/Folder.tsx +66 -0
- package/src/Freeze.tsx +63 -0
- package/src/IFrame.tsx +100 -0
- package/src/Img.tsx +146 -0
- package/src/Loop.tsx +139 -0
- package/src/Player.tsx +594 -0
- package/src/Sequence.tsx +80 -0
- package/src/Series.tsx +181 -0
- package/src/Text.tsx +376 -0
- package/src/Video.tsx +247 -0
- package/src/__tests__/Easing.test.js +119 -0
- package/src/__tests__/interpolate.test.js +127 -0
- package/src/config.ts +406 -0
- package/src/context.tsx +241 -0
- package/src/delayRender.ts +278 -0
- package/src/getInputProps.ts +217 -0
- package/src/hooks/useDelayRender.ts +117 -0
- package/src/hooks.ts +28 -0
- package/src/index.d.ts +571 -0
- package/src/index.ts +260 -0
- package/src/interpolate.ts +160 -0
- package/src/interpolateColors.ts +368 -0
- package/src/makeTransform.ts +339 -0
- package/src/measureSpring.ts +152 -0
- package/src/noise.ts +308 -0
- package/src/preload.ts +303 -0
- package/src/registerRoot.ts +346 -0
- package/src/shapes/Circle.tsx +37 -0
- package/src/shapes/Ellipse.tsx +39 -0
- package/src/shapes/Line.tsx +37 -0
- package/src/shapes/Path.tsx +56 -0
- package/src/shapes/Polygon.tsx +39 -0
- package/src/shapes/Rect.tsx +43 -0
- package/src/shapes/Svg.tsx +39 -0
- package/src/shapes/index.ts +16 -0
- package/src/shapes/usePathLength.ts +38 -0
- package/src/staticFile.ts +117 -0
- package/src/templates/api.ts +165 -0
- package/src/templates/index.ts +7 -0
- package/src/templates/mockData.ts +271 -0
- package/src/templates/types.ts +126 -0
- package/src/transitions/TransitionSeries.tsx +399 -0
- package/src/transitions/index.ts +109 -0
- package/src/transitions/presets/fade.ts +89 -0
- package/src/transitions/presets/flip.ts +263 -0
- package/src/transitions/presets/slide.ts +154 -0
- package/src/transitions/presets/wipe.ts +195 -0
- package/src/transitions/presets/zoom.ts +183 -0
- package/src/useAudioData.ts +260 -0
- package/src/useSpring.ts +215 -0
package/src/index.d.ts
ADDED
|
@@ -0,0 +1,571 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Framely TypeScript Declarations
|
|
3
|
+
*
|
|
4
|
+
* Type definitions for the Framely video framework.
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
import { ComponentType, ReactNode, CSSProperties } from 'react';
|
|
8
|
+
|
|
9
|
+
// ─── Core Types ────────────────────────────────────────────────────────────────
|
|
10
|
+
|
|
11
|
+
export interface TimelineContextValue {
|
|
12
|
+
frame: number;
|
|
13
|
+
fps: number;
|
|
14
|
+
width: number;
|
|
15
|
+
height: number;
|
|
16
|
+
durationInFrames: number;
|
|
17
|
+
playing: boolean;
|
|
18
|
+
volume: number;
|
|
19
|
+
playbackRate: number;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
export interface VideoConfig {
|
|
23
|
+
fps: number;
|
|
24
|
+
width: number;
|
|
25
|
+
height: number;
|
|
26
|
+
durationInFrames: number;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
// ─── Context & Hooks ───────────────────────────────────────────────────────────
|
|
30
|
+
|
|
31
|
+
export function TimelineProvider(props: {
|
|
32
|
+
value: TimelineContextValue;
|
|
33
|
+
children: ReactNode;
|
|
34
|
+
}): JSX.Element;
|
|
35
|
+
|
|
36
|
+
export function useTimeline(): TimelineContextValue;
|
|
37
|
+
export function useCurrentFrame(): number;
|
|
38
|
+
export function useVideoConfig(): VideoConfig;
|
|
39
|
+
|
|
40
|
+
// ─── Delay Render ──────────────────────────────────────────────────────────────
|
|
41
|
+
|
|
42
|
+
export interface DelayRenderHandle {
|
|
43
|
+
id: string;
|
|
44
|
+
label: string;
|
|
45
|
+
createdAt: number;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
export function delayRender(label?: string, options?: { timeout?: number }): DelayRenderHandle;
|
|
49
|
+
export function continueRender(handle: DelayRenderHandle): void;
|
|
50
|
+
export function cancelRender(error?: Error): void;
|
|
51
|
+
export function isDelayRenderPending(): boolean;
|
|
52
|
+
export function getPendingDelayRenders(): DelayRenderHandle[];
|
|
53
|
+
export function clearAllDelayRenders(): void;
|
|
54
|
+
|
|
55
|
+
export function useDelayRender(label?: string, options?: { timeout?: number }): () => void;
|
|
56
|
+
export function useDelayRenderWhile(condition: boolean, label?: string): void;
|
|
57
|
+
|
|
58
|
+
// ─── Animation ─────────────────────────────────────────────────────────────────
|
|
59
|
+
|
|
60
|
+
export type ExtrapolateType = 'clamp' | 'extend' | 'wrap' | 'identity';
|
|
61
|
+
|
|
62
|
+
export interface InterpolateOptions {
|
|
63
|
+
extrapolateLeft?: ExtrapolateType;
|
|
64
|
+
extrapolateRight?: ExtrapolateType;
|
|
65
|
+
easing?: (t: number) => number;
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
export function interpolate(
|
|
69
|
+
input: number,
|
|
70
|
+
inputRange: number[],
|
|
71
|
+
outputRange: number[],
|
|
72
|
+
options?: InterpolateOptions
|
|
73
|
+
): number;
|
|
74
|
+
|
|
75
|
+
export interface SpringOptions {
|
|
76
|
+
from?: number;
|
|
77
|
+
to?: number;
|
|
78
|
+
fps?: number;
|
|
79
|
+
delay?: number;
|
|
80
|
+
mass?: number;
|
|
81
|
+
stiffness?: number;
|
|
82
|
+
damping?: number;
|
|
83
|
+
overshootClamping?: boolean;
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
export function spring(frame: number, options?: SpringOptions): number;
|
|
87
|
+
|
|
88
|
+
export function interpolateColors(
|
|
89
|
+
value: number,
|
|
90
|
+
inputRange: number[],
|
|
91
|
+
outputRange: string[],
|
|
92
|
+
options?: InterpolateOptions
|
|
93
|
+
): string;
|
|
94
|
+
|
|
95
|
+
export interface SpringConfig {
|
|
96
|
+
mass?: number;
|
|
97
|
+
stiffness?: number;
|
|
98
|
+
damping?: number;
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
export function measureSpring(config?: SpringConfig & { fps?: number; threshold?: number }): number;
|
|
102
|
+
|
|
103
|
+
export const springPresets: {
|
|
104
|
+
default: SpringConfig;
|
|
105
|
+
gentle: SpringConfig;
|
|
106
|
+
bouncy: SpringConfig;
|
|
107
|
+
stiff: SpringConfig;
|
|
108
|
+
slow: SpringConfig;
|
|
109
|
+
snappy: SpringConfig;
|
|
110
|
+
};
|
|
111
|
+
|
|
112
|
+
export function springNaturalFrequency(config: SpringConfig): number;
|
|
113
|
+
export function springDampingRatio(config: SpringConfig): number;
|
|
114
|
+
|
|
115
|
+
// ─── Easing ────────────────────────────────────────────────────────────────────
|
|
116
|
+
|
|
117
|
+
export const Easing: {
|
|
118
|
+
linear: (t: number) => number;
|
|
119
|
+
ease: (t: number) => number;
|
|
120
|
+
quad: (t: number) => number;
|
|
121
|
+
cubic: (t: number) => number;
|
|
122
|
+
sin: (t: number) => number;
|
|
123
|
+
exp: (t: number) => number;
|
|
124
|
+
circle: (t: number) => number;
|
|
125
|
+
bounce: (t: number) => number;
|
|
126
|
+
poly: (n: number) => (t: number) => number;
|
|
127
|
+
back: (overshoot?: number) => (t: number) => number;
|
|
128
|
+
elastic: (bounciness?: number) => (t: number) => number;
|
|
129
|
+
bezier: (x1: number, y1: number, x2: number, y2: number) => (t: number) => number;
|
|
130
|
+
in: (easing: (t: number) => number) => (t: number) => number;
|
|
131
|
+
out: (easing: (t: number) => number) => (t: number) => number;
|
|
132
|
+
inOut: (easing: (t: number) => number) => (t: number) => number;
|
|
133
|
+
step0: (t: number) => number;
|
|
134
|
+
step1: (t: number) => number;
|
|
135
|
+
};
|
|
136
|
+
|
|
137
|
+
// ─── Components ────────────────────────────────────────────────────────────────
|
|
138
|
+
|
|
139
|
+
export interface SequenceProps {
|
|
140
|
+
from?: number;
|
|
141
|
+
durationInFrames?: number;
|
|
142
|
+
name?: string;
|
|
143
|
+
layout?: 'absolute-fill' | 'none';
|
|
144
|
+
style?: CSSProperties;
|
|
145
|
+
children: ReactNode;
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
export function Sequence(props: SequenceProps): JSX.Element;
|
|
149
|
+
|
|
150
|
+
export interface SeriesProps {
|
|
151
|
+
children: ReactNode;
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
export function Series(props: SeriesProps): JSX.Element;
|
|
155
|
+
|
|
156
|
+
export namespace Series {
|
|
157
|
+
interface SequenceProps {
|
|
158
|
+
durationInFrames: number;
|
|
159
|
+
offset?: number;
|
|
160
|
+
layout?: 'absolute-fill' | 'none';
|
|
161
|
+
style?: CSSProperties;
|
|
162
|
+
name?: string;
|
|
163
|
+
children: ReactNode;
|
|
164
|
+
}
|
|
165
|
+
function Sequence(props: SequenceProps): JSX.Element;
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
export interface LoopProps {
|
|
169
|
+
durationInFrames: number;
|
|
170
|
+
times?: number;
|
|
171
|
+
layout?: 'absolute-fill' | 'none';
|
|
172
|
+
style?: CSSProperties;
|
|
173
|
+
name?: string;
|
|
174
|
+
children: ReactNode;
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
export function Loop(props: LoopProps): JSX.Element;
|
|
178
|
+
export function useLoop(): { iteration: number; durationInFrames: number };
|
|
179
|
+
|
|
180
|
+
export interface FreezeProps {
|
|
181
|
+
frame: number;
|
|
182
|
+
active?: boolean;
|
|
183
|
+
children: ReactNode;
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
export function Freeze(props: FreezeProps): JSX.Element;
|
|
187
|
+
|
|
188
|
+
export interface FolderProps {
|
|
189
|
+
name: string;
|
|
190
|
+
children: ReactNode;
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
export function Folder(props: FolderProps): JSX.Element;
|
|
194
|
+
export function useFolder(): string[];
|
|
195
|
+
|
|
196
|
+
export interface AbsoluteFillProps {
|
|
197
|
+
style?: CSSProperties;
|
|
198
|
+
className?: string;
|
|
199
|
+
children?: ReactNode;
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
export function AbsoluteFill(props: AbsoluteFillProps): JSX.Element;
|
|
203
|
+
|
|
204
|
+
// ─── Media Components ──────────────────────────────────────────────────────────
|
|
205
|
+
|
|
206
|
+
export interface ImgProps extends React.ImgHTMLAttributes<HTMLImageElement> {
|
|
207
|
+
src: string;
|
|
208
|
+
maxRetries?: number;
|
|
209
|
+
pauseWhenLoading?: boolean;
|
|
210
|
+
onError?: (error: Error) => void;
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
export function Img(props: ImgProps): JSX.Element;
|
|
214
|
+
|
|
215
|
+
export interface VideoProps {
|
|
216
|
+
src: string;
|
|
217
|
+
volume?: number | ((frame: number) => number);
|
|
218
|
+
playbackRate?: number;
|
|
219
|
+
muted?: boolean;
|
|
220
|
+
loop?: boolean;
|
|
221
|
+
startFrom?: number;
|
|
222
|
+
endAt?: number;
|
|
223
|
+
style?: CSSProperties;
|
|
224
|
+
className?: string;
|
|
225
|
+
onError?: (error: Error) => void;
|
|
226
|
+
}
|
|
227
|
+
|
|
228
|
+
export function Video(props: VideoProps): JSX.Element;
|
|
229
|
+
|
|
230
|
+
export interface AudioProps {
|
|
231
|
+
src: string;
|
|
232
|
+
volume?: number | ((frame: number) => number);
|
|
233
|
+
playbackRate?: number;
|
|
234
|
+
muted?: boolean;
|
|
235
|
+
loop?: boolean;
|
|
236
|
+
startFrom?: number;
|
|
237
|
+
endAt?: number;
|
|
238
|
+
onError?: (error: Error) => void;
|
|
239
|
+
}
|
|
240
|
+
|
|
241
|
+
export function Audio(props: AudioProps): JSX.Element;
|
|
242
|
+
export function getAudioMetadata(src: string): Promise<{ duration: number; sampleRate: number }>;
|
|
243
|
+
export function getAudioDurationInFrames(src: string, fps: number): Promise<number>;
|
|
244
|
+
|
|
245
|
+
export interface IFrameProps extends React.IframeHTMLAttributes<HTMLIFrameElement> {
|
|
246
|
+
src: string;
|
|
247
|
+
delayRenderLabel?: string;
|
|
248
|
+
delayRenderTimeout?: number;
|
|
249
|
+
}
|
|
250
|
+
|
|
251
|
+
export function IFrame(props: IFrameProps): JSX.Element;
|
|
252
|
+
|
|
253
|
+
// ─── Composition ───────────────────────────────────────────────────────────────
|
|
254
|
+
|
|
255
|
+
export interface CompositionProps<T = Record<string, unknown>> {
|
|
256
|
+
id: string;
|
|
257
|
+
component?: ComponentType<T>;
|
|
258
|
+
lazyComponent?: () => Promise<{ default: ComponentType<T> }>;
|
|
259
|
+
width?: number;
|
|
260
|
+
height?: number;
|
|
261
|
+
fps?: number;
|
|
262
|
+
durationInFrames?: number;
|
|
263
|
+
defaultProps?: T;
|
|
264
|
+
calculateMetadata?: (params: {
|
|
265
|
+
defaultProps: T;
|
|
266
|
+
props: T;
|
|
267
|
+
abortSignal: AbortSignal;
|
|
268
|
+
}) => Promise<Partial<CompositionProps<T>>>;
|
|
269
|
+
schema?: unknown; // Zod schema
|
|
270
|
+
defaultCodec?: string;
|
|
271
|
+
}
|
|
272
|
+
|
|
273
|
+
export function Composition<T>(props: CompositionProps<T>): null;
|
|
274
|
+
|
|
275
|
+
export function defineComposition<T>(config: CompositionProps<T>): CompositionProps<T>;
|
|
276
|
+
export function resolveComponent<T>(composition: CompositionProps<T>): ComponentType<T>;
|
|
277
|
+
export function resolveMetadata<T>(composition: CompositionProps<T>, inputProps?: T): Promise<{
|
|
278
|
+
width: number;
|
|
279
|
+
height: number;
|
|
280
|
+
fps: number;
|
|
281
|
+
durationInFrames: number;
|
|
282
|
+
props: T;
|
|
283
|
+
defaultCodec?: string;
|
|
284
|
+
}>;
|
|
285
|
+
export function validateProps<T>(composition: CompositionProps<T>, props: T): {
|
|
286
|
+
success: boolean;
|
|
287
|
+
data?: T;
|
|
288
|
+
error?: unknown;
|
|
289
|
+
};
|
|
290
|
+
export function getDefaultProps<T>(composition: CompositionProps<T>): T;
|
|
291
|
+
export function createCompositionWrapper<T>(composition: CompositionProps<T>): ComponentType<T>;
|
|
292
|
+
|
|
293
|
+
// ─── Registry ──────────────────────────────────────────────────────────────────
|
|
294
|
+
|
|
295
|
+
export function registerRoot(RootComponent: ComponentType): void;
|
|
296
|
+
export function registerRootAsync(loader: () => Promise<{ default: ComponentType }>): Promise<void>;
|
|
297
|
+
export function getRoot(): ComponentType | null;
|
|
298
|
+
export function getCompositions(): Map<string, CompositionProps>;
|
|
299
|
+
export function getComposition(id: string): CompositionProps | undefined;
|
|
300
|
+
export function getCompositionTree(): Array<{ path: string[]; composition: CompositionProps }>;
|
|
301
|
+
export function isRootRegistered(): boolean;
|
|
302
|
+
export function onRootRegistered(callback: () => void): () => void;
|
|
303
|
+
export function clearRegistry(): void;
|
|
304
|
+
|
|
305
|
+
// ─── Input Props ───────────────────────────────────────────────────────────────
|
|
306
|
+
|
|
307
|
+
export function getInputProps<T = Record<string, unknown>>(): T;
|
|
308
|
+
export function setInputProps<T>(props: T, source?: string): void;
|
|
309
|
+
export function mergeInputProps<T>(props: Partial<T>): void;
|
|
310
|
+
export function getInputProp<T>(key: string, defaultValue?: T): T;
|
|
311
|
+
export function hasInputProps(): boolean;
|
|
312
|
+
export function getInputPropsSource(): string | null;
|
|
313
|
+
export function clearInputProps(): void;
|
|
314
|
+
export function parsePropsInput(input: string): Record<string, unknown>;
|
|
315
|
+
export function serializeProps(props: Record<string, unknown>): string;
|
|
316
|
+
export function createUrlWithProps(baseUrl: string, props: Record<string, unknown>): string;
|
|
317
|
+
|
|
318
|
+
// ─── Config ────────────────────────────────────────────────────────────────────
|
|
319
|
+
|
|
320
|
+
export interface FramelyConfig {
|
|
321
|
+
concurrency: number;
|
|
322
|
+
codec: string;
|
|
323
|
+
pixelFormat: string;
|
|
324
|
+
crf: number;
|
|
325
|
+
videoBitrate: string | null;
|
|
326
|
+
audioBitrate: string;
|
|
327
|
+
audioCodec: string;
|
|
328
|
+
scale: number;
|
|
329
|
+
outputLocation: string;
|
|
330
|
+
imageFormat: string;
|
|
331
|
+
jpegQuality: number;
|
|
332
|
+
browserExecutable: string | null;
|
|
333
|
+
chromiumDisableWebSecurity: boolean;
|
|
334
|
+
headless: boolean;
|
|
335
|
+
delayRenderTimeout: number;
|
|
336
|
+
puppeteerTimeout: number;
|
|
337
|
+
studioPort: number;
|
|
338
|
+
rendererPort: number;
|
|
339
|
+
openBrowser: boolean;
|
|
340
|
+
keyboardShortcutsEnabled: boolean;
|
|
341
|
+
maxTimelineTracks: number;
|
|
342
|
+
logLevel: 'error' | 'warn' | 'info' | 'verbose';
|
|
343
|
+
enableMultiprocessOnLinux: boolean;
|
|
344
|
+
hardwareAcceleration: 'auto' | 'on' | 'off';
|
|
345
|
+
}
|
|
346
|
+
|
|
347
|
+
export const Config: {
|
|
348
|
+
setConcurrency: (n: number) => void;
|
|
349
|
+
setCodec: (codec: string) => void;
|
|
350
|
+
setPixelFormat: (format: string) => void;
|
|
351
|
+
setCrf: (crf: number) => void;
|
|
352
|
+
setVideoBitrate: (bitrate: string) => void;
|
|
353
|
+
setAudioBitrate: (bitrate: string) => void;
|
|
354
|
+
setAudioCodec: (codec: string) => void;
|
|
355
|
+
setScale: (scale: number) => void;
|
|
356
|
+
setOutputLocation: (path: string) => void;
|
|
357
|
+
setImageFormat: (format: string) => void;
|
|
358
|
+
setJpegQuality: (quality: number) => void;
|
|
359
|
+
setBrowserExecutable: (path: string) => void;
|
|
360
|
+
setChromiumDisableWebSecurity: (disable: boolean) => void;
|
|
361
|
+
setChromiumHeadlessMode: (headless: boolean) => void;
|
|
362
|
+
setDelayRenderTimeoutInMilliseconds: (ms: number) => void;
|
|
363
|
+
setPuppeteerTimeout: (ms: number) => void;
|
|
364
|
+
setStudioPort: (port: number) => void;
|
|
365
|
+
setRendererPort: (port: number) => void;
|
|
366
|
+
setShouldOpenBrowser: (open: boolean) => void;
|
|
367
|
+
setKeyboardShortcutsEnabled: (enabled: boolean) => void;
|
|
368
|
+
setMaxTimelineTracks: (max: number) => void;
|
|
369
|
+
setLevel: (level: 'error' | 'warn' | 'info' | 'verbose') => void;
|
|
370
|
+
setEnableMultiprocessOnLinux: (enable: boolean) => void;
|
|
371
|
+
setHardwareAcceleration: (mode: 'auto' | 'on' | 'off') => void;
|
|
372
|
+
setAll: (config: Partial<FramelyConfig>) => void;
|
|
373
|
+
};
|
|
374
|
+
|
|
375
|
+
export function getConfig(): FramelyConfig;
|
|
376
|
+
export function getConfigValue<K extends keyof FramelyConfig>(key: K): FramelyConfig[K];
|
|
377
|
+
export function resetConfig(): void;
|
|
378
|
+
export function loadConfig(config: Partial<FramelyConfig>): void;
|
|
379
|
+
export function getFfmpegArgs(overrides?: Partial<FramelyConfig>): string[];
|
|
380
|
+
export function getOutputExtension(): string;
|
|
381
|
+
export function validateConfig(): { valid: boolean; errors: string[] };
|
|
382
|
+
|
|
383
|
+
// ─── Asset Utilities ───────────────────────────────────────────────────────────
|
|
384
|
+
|
|
385
|
+
export function staticFile(path: string): string;
|
|
386
|
+
export function isStaticFile(path: string): boolean;
|
|
387
|
+
export function getFileExtension(path: string): string;
|
|
388
|
+
export function getMimeType(path: string): string;
|
|
389
|
+
|
|
390
|
+
export function preloadImage(src: string): Promise<HTMLImageElement>;
|
|
391
|
+
export function preloadVideo(src: string): Promise<HTMLVideoElement>;
|
|
392
|
+
export function preloadAudio(src: string): Promise<HTMLAudioElement>;
|
|
393
|
+
export function preloadFont(src: string, family: string): Promise<FontFace>;
|
|
394
|
+
export function prefetch(src: string): Promise<Response>;
|
|
395
|
+
export function preloadAll(assets: string[]): Promise<void>;
|
|
396
|
+
export function resolveWhenLoaded(element: HTMLElement): Promise<void>;
|
|
397
|
+
|
|
398
|
+
// ─── Transitions ───────────────────────────────────────────────────────────────
|
|
399
|
+
|
|
400
|
+
export interface TransitionPresentation {
|
|
401
|
+
entering: (progress: number) => CSSProperties;
|
|
402
|
+
exiting: (progress: number) => CSSProperties;
|
|
403
|
+
}
|
|
404
|
+
|
|
405
|
+
export interface TransitionTiming {
|
|
406
|
+
durationInFrames: number;
|
|
407
|
+
easing?: (t: number) => number;
|
|
408
|
+
}
|
|
409
|
+
|
|
410
|
+
export interface TransitionState {
|
|
411
|
+
entering: boolean;
|
|
412
|
+
exiting: boolean;
|
|
413
|
+
progress: number;
|
|
414
|
+
presentationDirection: 'entering' | 'exiting' | 'stable';
|
|
415
|
+
}
|
|
416
|
+
|
|
417
|
+
export function TransitionSeries(props: {
|
|
418
|
+
children: ReactNode;
|
|
419
|
+
style?: CSSProperties;
|
|
420
|
+
name?: string;
|
|
421
|
+
}): JSX.Element;
|
|
422
|
+
|
|
423
|
+
export namespace TransitionSeries {
|
|
424
|
+
function Sequence(props: {
|
|
425
|
+
children: ReactNode;
|
|
426
|
+
durationInFrames: number;
|
|
427
|
+
offset?: number;
|
|
428
|
+
style?: CSSProperties;
|
|
429
|
+
name?: string;
|
|
430
|
+
}): null;
|
|
431
|
+
|
|
432
|
+
function Transition(props: {
|
|
433
|
+
presentation: TransitionPresentation;
|
|
434
|
+
timing: TransitionTiming;
|
|
435
|
+
}): null;
|
|
436
|
+
}
|
|
437
|
+
|
|
438
|
+
export function useTransition(): TransitionState;
|
|
439
|
+
export function createPresentation(config: TransitionPresentation): TransitionPresentation;
|
|
440
|
+
export function createTiming(config: TransitionTiming): TransitionTiming;
|
|
441
|
+
|
|
442
|
+
// Transition presets
|
|
443
|
+
export function fade(options?: { enterStyle?: string; exitStyle?: string; easing?: (t: number) => number }): TransitionPresentation;
|
|
444
|
+
export function crossfade(options?: { easing?: (t: number) => number }): TransitionPresentation;
|
|
445
|
+
export function slide(options?: { direction?: string; exitOpposite?: boolean; easing?: (t: number) => number }): TransitionPresentation;
|
|
446
|
+
export function slideFromLeft(options?: { easing?: (t: number) => number }): TransitionPresentation;
|
|
447
|
+
export function slideFromRight(options?: { easing?: (t: number) => number }): TransitionPresentation;
|
|
448
|
+
export function slideFromTop(options?: { easing?: (t: number) => number }): TransitionPresentation;
|
|
449
|
+
export function slideFromBottom(options?: { easing?: (t: number) => number }): TransitionPresentation;
|
|
450
|
+
export function push(options?: { direction?: string; easing?: (t: number) => number }): TransitionPresentation;
|
|
451
|
+
export function wipe(options?: { direction?: string; easing?: (t: number) => number }): TransitionPresentation;
|
|
452
|
+
export function wipeLeft(options?: { easing?: (t: number) => number }): TransitionPresentation;
|
|
453
|
+
export function wipeRight(options?: { easing?: (t: number) => number }): TransitionPresentation;
|
|
454
|
+
export function wipeTop(options?: { easing?: (t: number) => number }): TransitionPresentation;
|
|
455
|
+
export function wipeBottom(options?: { easing?: (t: number) => number }): TransitionPresentation;
|
|
456
|
+
export function iris(options?: { easing?: (t: number) => number }): TransitionPresentation;
|
|
457
|
+
export function diagonalWipe(options?: { corner?: string; easing?: (t: number) => number }): TransitionPresentation;
|
|
458
|
+
export function zoom(options?: { enterDirection?: string; exitDirection?: string; scale?: number; withFade?: boolean; easing?: (t: number) => number }): TransitionPresentation;
|
|
459
|
+
export function zoomInOut(options?: { scale?: number; withFade?: boolean; easing?: (t: number) => number }): TransitionPresentation;
|
|
460
|
+
export function zoomOutIn(options?: { scale?: number; withFade?: boolean; easing?: (t: number) => number }): TransitionPresentation;
|
|
461
|
+
export function kenBurns(options?: { startScale?: number; endScale?: number; origin?: string }): (progress: number) => CSSProperties;
|
|
462
|
+
export function zoomRotate(options?: { scale?: number; rotation?: number; withFade?: boolean; easing?: (t: number) => number }): TransitionPresentation;
|
|
463
|
+
export function flip(options?: { direction?: string; perspective?: number; easing?: (t: number) => number }): TransitionPresentation;
|
|
464
|
+
export function flipHorizontal(options?: { perspective?: number; easing?: (t: number) => number }): TransitionPresentation;
|
|
465
|
+
export function flipVertical(options?: { perspective?: number; easing?: (t: number) => number }): TransitionPresentation;
|
|
466
|
+
export function cardFlip(options?: { flipDirection?: string; perspective?: number; easing?: (t: number) => number }): TransitionPresentation;
|
|
467
|
+
export function cube(options?: { direction?: string; perspective?: number; easing?: (t: number) => number }): TransitionPresentation;
|
|
468
|
+
export function door(options?: { side?: string; perspective?: number; easing?: (t: number) => number }): TransitionPresentation;
|
|
469
|
+
|
|
470
|
+
export const transitionPresets: {
|
|
471
|
+
fade: typeof fade;
|
|
472
|
+
crossfade: typeof crossfade;
|
|
473
|
+
slide: typeof slide;
|
|
474
|
+
// ... all other presets
|
|
475
|
+
};
|
|
476
|
+
|
|
477
|
+
// ─── Transform Utilities ───────────────────────────────────────────────────────
|
|
478
|
+
|
|
479
|
+
export interface TransformOperation {
|
|
480
|
+
translateX?: number | string;
|
|
481
|
+
translateY?: number | string;
|
|
482
|
+
translateZ?: number | string;
|
|
483
|
+
translate?: number | string | [number | string, number | string];
|
|
484
|
+
translate3d?: [number | string, number | string, number | string];
|
|
485
|
+
scaleX?: number;
|
|
486
|
+
scaleY?: number;
|
|
487
|
+
scaleZ?: number;
|
|
488
|
+
scale?: number | [number, number];
|
|
489
|
+
scale3d?: [number, number, number];
|
|
490
|
+
rotate?: number | string;
|
|
491
|
+
rotateX?: number | string;
|
|
492
|
+
rotateY?: number | string;
|
|
493
|
+
rotateZ?: number | string;
|
|
494
|
+
rotate3d?: [number, number, number, number | string];
|
|
495
|
+
skewX?: number | string;
|
|
496
|
+
skewY?: number | string;
|
|
497
|
+
skew?: number | string | [number | string, number | string];
|
|
498
|
+
perspective?: number | string;
|
|
499
|
+
matrix?: number[];
|
|
500
|
+
matrix3d?: number[];
|
|
501
|
+
}
|
|
502
|
+
|
|
503
|
+
export function makeTransform(operations: TransformOperation | TransformOperation[]): string;
|
|
504
|
+
|
|
505
|
+
export interface TransformBuilder {
|
|
506
|
+
translateX(value: number | string): TransformBuilder;
|
|
507
|
+
translateY(value: number | string): TransformBuilder;
|
|
508
|
+
translateZ(value: number | string): TransformBuilder;
|
|
509
|
+
translate(x: number | string, y?: number | string): TransformBuilder;
|
|
510
|
+
translate3d(x: number | string, y: number | string, z: number | string): TransformBuilder;
|
|
511
|
+
scaleX(value: number): TransformBuilder;
|
|
512
|
+
scaleY(value: number): TransformBuilder;
|
|
513
|
+
scaleZ(value: number): TransformBuilder;
|
|
514
|
+
scale(x: number, y?: number): TransformBuilder;
|
|
515
|
+
scale3d(x: number, y: number, z: number): TransformBuilder;
|
|
516
|
+
rotate(value: number | string): TransformBuilder;
|
|
517
|
+
rotateX(value: number | string): TransformBuilder;
|
|
518
|
+
rotateY(value: number | string): TransformBuilder;
|
|
519
|
+
rotateZ(value: number | string): TransformBuilder;
|
|
520
|
+
rotate3d(x: number, y: number, z: number, angle: number | string): TransformBuilder;
|
|
521
|
+
skewX(value: number | string): TransformBuilder;
|
|
522
|
+
skewY(value: number | string): TransformBuilder;
|
|
523
|
+
skew(x: number | string, y?: number | string): TransformBuilder;
|
|
524
|
+
perspective(value: number | string): TransformBuilder;
|
|
525
|
+
matrix(...values: number[]): TransformBuilder;
|
|
526
|
+
matrix3d(...values: number[]): TransformBuilder;
|
|
527
|
+
toString(): string;
|
|
528
|
+
toArray(): TransformOperation[];
|
|
529
|
+
clear(): TransformBuilder;
|
|
530
|
+
}
|
|
531
|
+
|
|
532
|
+
export function transform(): TransformBuilder;
|
|
533
|
+
export function interpolateTransform(progress: number, fromOps: TransformOperation[], toOps: TransformOperation[]): string;
|
|
534
|
+
|
|
535
|
+
// ─── Player ────────────────────────────────────────────────────────────────────
|
|
536
|
+
|
|
537
|
+
export interface PlayerProps<T = Record<string, unknown>> {
|
|
538
|
+
component: ComponentType<T>;
|
|
539
|
+
durationInFrames: number;
|
|
540
|
+
fps?: number;
|
|
541
|
+
width?: number;
|
|
542
|
+
height?: number;
|
|
543
|
+
inputProps?: T;
|
|
544
|
+
autoPlay?: boolean;
|
|
545
|
+
loop?: boolean;
|
|
546
|
+
controls?: boolean;
|
|
547
|
+
showFrameCount?: boolean;
|
|
548
|
+
initialFrame?: number;
|
|
549
|
+
style?: CSSProperties;
|
|
550
|
+
className?: string;
|
|
551
|
+
onFrameChange?: (frame: number) => void;
|
|
552
|
+
onPlay?: () => void;
|
|
553
|
+
onPause?: () => void;
|
|
554
|
+
onEnded?: () => void;
|
|
555
|
+
onError?: (error: Error) => void;
|
|
556
|
+
}
|
|
557
|
+
|
|
558
|
+
export function Player<T>(props: PlayerProps<T>): JSX.Element;
|
|
559
|
+
|
|
560
|
+
export interface ThumbnailProps<T = Record<string, unknown>> {
|
|
561
|
+
component: ComponentType<T>;
|
|
562
|
+
frame?: number;
|
|
563
|
+
fps?: number;
|
|
564
|
+
width?: number;
|
|
565
|
+
height?: number;
|
|
566
|
+
inputProps?: T;
|
|
567
|
+
style?: CSSProperties;
|
|
568
|
+
className?: string;
|
|
569
|
+
}
|
|
570
|
+
|
|
571
|
+
export function Thumbnail<T>(props: ThumbnailProps<T>): JSX.Element;
|