@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
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Zoom Transition
|
|
3
|
+
*
|
|
4
|
+
* Scale-based transition that zooms scenes in and out.
|
|
5
|
+
*
|
|
6
|
+
* Usage:
|
|
7
|
+
* <TransitionSeries.Transition
|
|
8
|
+
* presentation={zoom()}
|
|
9
|
+
* timing={{ durationInFrames: 30 }}
|
|
10
|
+
* />
|
|
11
|
+
*
|
|
12
|
+
* // Zoom out on exit
|
|
13
|
+
* <TransitionSeries.Transition
|
|
14
|
+
* presentation={zoom({ exitDirection: 'out' })}
|
|
15
|
+
* timing={{ durationInFrames: 30 }}
|
|
16
|
+
* />
|
|
17
|
+
*/
|
|
18
|
+
import { Easing } from '../../Easing';
|
|
19
|
+
/**
|
|
20
|
+
* Create a zoom transition presentation.
|
|
21
|
+
*/
|
|
22
|
+
export function zoom(options = {}) {
|
|
23
|
+
const { enterDirection = 'in', exitDirection = 'in', scale = 0.5, withFade = true, easing = Easing.easeOutCubic, } = options;
|
|
24
|
+
return {
|
|
25
|
+
entering: (progress) => {
|
|
26
|
+
const easedProgress = easing(progress);
|
|
27
|
+
let scaleValue;
|
|
28
|
+
if (enterDirection === 'in') {
|
|
29
|
+
// Start small, zoom in to full size
|
|
30
|
+
scaleValue = scale + (1 - scale) * easedProgress;
|
|
31
|
+
}
|
|
32
|
+
else {
|
|
33
|
+
// Start large, zoom out to full size
|
|
34
|
+
scaleValue = (2 - scale) - (1 - scale) * easedProgress;
|
|
35
|
+
}
|
|
36
|
+
return {
|
|
37
|
+
transform: `scale(${scaleValue})`,
|
|
38
|
+
...(withFade ? { opacity: easedProgress } : {}),
|
|
39
|
+
};
|
|
40
|
+
},
|
|
41
|
+
exiting: (progress) => {
|
|
42
|
+
const easedProgress = easing(progress);
|
|
43
|
+
let scaleValue;
|
|
44
|
+
if (exitDirection === 'in') {
|
|
45
|
+
// Zoom in and fade out
|
|
46
|
+
scaleValue = 1 + (1 - scale) * easedProgress;
|
|
47
|
+
}
|
|
48
|
+
else {
|
|
49
|
+
// Zoom out and fade out
|
|
50
|
+
scaleValue = 1 - (1 - scale) * easedProgress;
|
|
51
|
+
}
|
|
52
|
+
return {
|
|
53
|
+
transform: `scale(${scaleValue})`,
|
|
54
|
+
...(withFade ? { opacity: 1 - easedProgress } : {}),
|
|
55
|
+
};
|
|
56
|
+
},
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Zoom in on enter, zoom out on exit.
|
|
61
|
+
*/
|
|
62
|
+
export function zoomInOut(options = {}) {
|
|
63
|
+
return zoom({ ...options, enterDirection: 'in', exitDirection: 'out' });
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Zoom out on enter, zoom in on exit.
|
|
67
|
+
*/
|
|
68
|
+
export function zoomOutIn(options = {}) {
|
|
69
|
+
return zoom({ ...options, enterDirection: 'out', exitDirection: 'in' });
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Ken Burns style zoom - subtle zoom during the entire sequence.
|
|
73
|
+
* Note: This is different from a transition, it's an effect.
|
|
74
|
+
*/
|
|
75
|
+
export function kenBurns(options = {}) {
|
|
76
|
+
const { startScale = 1, endScale = 1.1, origin = 'center', } = options;
|
|
77
|
+
// This returns a style generator for use with interpolate
|
|
78
|
+
return (progress) => ({
|
|
79
|
+
transform: `scale(${startScale + (endScale - startScale) * progress})`,
|
|
80
|
+
transformOrigin: origin,
|
|
81
|
+
});
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* Zoom with rotation.
|
|
85
|
+
*/
|
|
86
|
+
export function zoomRotate(options = {}) {
|
|
87
|
+
const { scale = 0.5, rotation = 90, withFade = true, easing = Easing.easeOutBack, } = options;
|
|
88
|
+
return {
|
|
89
|
+
entering: (progress) => {
|
|
90
|
+
const easedProgress = easing(progress);
|
|
91
|
+
const scaleValue = scale + (1 - scale) * easedProgress;
|
|
92
|
+
const rotateValue = rotation * (1 - easedProgress);
|
|
93
|
+
return {
|
|
94
|
+
transform: `scale(${scaleValue}) rotate(${rotateValue}deg)`,
|
|
95
|
+
...(withFade ? { opacity: easedProgress } : {}),
|
|
96
|
+
};
|
|
97
|
+
},
|
|
98
|
+
exiting: (progress) => {
|
|
99
|
+
const easedProgress = easing(progress);
|
|
100
|
+
const scaleValue = 1 - (1 - scale) * easedProgress;
|
|
101
|
+
const rotateValue = -rotation * easedProgress;
|
|
102
|
+
return {
|
|
103
|
+
transform: `scale(${scaleValue}) rotate(${rotateValue}deg)`,
|
|
104
|
+
...(withFade ? { opacity: 1 - easedProgress } : {}),
|
|
105
|
+
};
|
|
106
|
+
},
|
|
107
|
+
};
|
|
108
|
+
}
|
|
109
|
+
export default zoom;
|
|
110
|
+
//# sourceMappingURL=zoom.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"zoom.js","sourceRoot":"","sources":["../../../src/transitions/presets/zoom.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Audio Visualization Hooks
|
|
3
|
+
*
|
|
4
|
+
* Provides frequency and waveform data from audio elements
|
|
5
|
+
* for creating audio-reactive animations.
|
|
6
|
+
*/
|
|
7
|
+
import { RefObject } from 'react';
|
|
8
|
+
/**
|
|
9
|
+
* Options for configuring the audio analyser node.
|
|
10
|
+
*/
|
|
11
|
+
export interface AudioDataOptions {
|
|
12
|
+
/** FFT size (power of 2, 32-32768). Defaults to 256. */
|
|
13
|
+
fftSize?: number;
|
|
14
|
+
/** Smoothing time constant (0-1). Defaults to 0.8. */
|
|
15
|
+
smoothingTimeConstant?: number;
|
|
16
|
+
/** Minimum decibels for frequency data. Defaults to -100. */
|
|
17
|
+
minDecibels?: number;
|
|
18
|
+
/** Maximum decibels for frequency data. Defaults to -30. */
|
|
19
|
+
maxDecibels?: number;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Return value of the useAudioData hook.
|
|
23
|
+
*/
|
|
24
|
+
export interface AudioDataResult {
|
|
25
|
+
/** Frequency amplitude data (0-255 per bin). */
|
|
26
|
+
frequencyData: Uint8Array;
|
|
27
|
+
/** Waveform (time-domain) data (0-255 per sample). */
|
|
28
|
+
waveformData: Uint8Array;
|
|
29
|
+
/** RMS volume level normalized to 0-1. */
|
|
30
|
+
volume: number;
|
|
31
|
+
/** Whether the audio analyser has been successfully connected. */
|
|
32
|
+
isReady: boolean;
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* A mapping of band names to [minHz, maxHz] frequency ranges.
|
|
36
|
+
*/
|
|
37
|
+
export type FrequencyBandRanges<K extends string = string> = Record<K, [number, number]>;
|
|
38
|
+
/**
|
|
39
|
+
* Result of getFrequencyBands, mapping each band name to its average amplitude (0-1).
|
|
40
|
+
*/
|
|
41
|
+
export type FrequencyBandValues<K extends string = string> = Record<K, number>;
|
|
42
|
+
/** Augment the global Window interface for Framely render mode flag. */
|
|
43
|
+
declare global {
|
|
44
|
+
interface Window {
|
|
45
|
+
__FRAMELY_RENDER_MODE?: boolean;
|
|
46
|
+
webkitAudioContext?: typeof AudioContext;
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Extract audio frequency and waveform data from an audio element.
|
|
51
|
+
*
|
|
52
|
+
* In browser preview mode, connects to the Web Audio API to analyze
|
|
53
|
+
* audio in real-time. In render mode (Playwright), returns empty data
|
|
54
|
+
* since audio is not available during headless rendering.
|
|
55
|
+
*
|
|
56
|
+
* @param {RefObject<HTMLAudioElement>} audioRef - Ref to an audio element
|
|
57
|
+
* @param {AudioDataOptions} [options]
|
|
58
|
+
* @param {number} [options.fftSize=256] - FFT size (power of 2, 32-32768)
|
|
59
|
+
* @param {number} [options.smoothingTimeConstant=0.8] - Smoothing (0-1)
|
|
60
|
+
* @param {number} [options.minDecibels=-100] - Min dB for frequency data
|
|
61
|
+
* @param {number} [options.maxDecibels=-30] - Max dB for frequency data
|
|
62
|
+
* @returns {AudioDataResult}
|
|
63
|
+
*
|
|
64
|
+
* @example
|
|
65
|
+
* const audioRef = useRef(null);
|
|
66
|
+
* const { frequencyData, volume } = useAudioData(audioRef);
|
|
67
|
+
*
|
|
68
|
+
* // Use volume to drive animation
|
|
69
|
+
* const scale = 1 + volume * 0.5;
|
|
70
|
+
*
|
|
71
|
+
* // Use frequency bands for visualizer bars
|
|
72
|
+
* {Array.from(frequencyData).slice(0, 32).map((val, i) => (
|
|
73
|
+
* <div key={i} style={{ height: val }} />
|
|
74
|
+
* ))}
|
|
75
|
+
*/
|
|
76
|
+
export declare function useAudioData(audioRef: RefObject<HTMLAudioElement | null>, options?: AudioDataOptions): AudioDataResult;
|
|
77
|
+
/**
|
|
78
|
+
* Extract frequency bands from raw frequency data.
|
|
79
|
+
*
|
|
80
|
+
* Groups frequency bins into named bands based on frequency ranges.
|
|
81
|
+
* Each band value is the average amplitude (0-1) of bins in that range.
|
|
82
|
+
*
|
|
83
|
+
* @param {Uint8Array} frequencyData - Raw frequency data from useAudioData
|
|
84
|
+
* @param {FrequencyBandRanges<K>} bands - Named frequency ranges in Hz
|
|
85
|
+
* @param {number} [sampleRate=44100] - Audio sample rate
|
|
86
|
+
* @returns {FrequencyBandValues<K>} Object with same keys as bands, values 0-1
|
|
87
|
+
*
|
|
88
|
+
* @example
|
|
89
|
+
* const { bass, mid, treble } = getFrequencyBands(frequencyData, {
|
|
90
|
+
* bass: [20, 250],
|
|
91
|
+
* mid: [250, 4000],
|
|
92
|
+
* treble: [4000, 20000],
|
|
93
|
+
* });
|
|
94
|
+
*
|
|
95
|
+
* @example
|
|
96
|
+
* const bands = getFrequencyBands(frequencyData, {
|
|
97
|
+
* sub: [20, 60],
|
|
98
|
+
* bass: [60, 250],
|
|
99
|
+
* lowMid: [250, 500],
|
|
100
|
+
* mid: [500, 2000],
|
|
101
|
+
* highMid: [2000, 4000],
|
|
102
|
+
* presence: [4000, 6000],
|
|
103
|
+
* brilliance: [6000, 20000],
|
|
104
|
+
* });
|
|
105
|
+
*/
|
|
106
|
+
export declare function getFrequencyBands<K extends string>(frequencyData: Uint8Array, bands: FrequencyBandRanges<K>, sampleRate?: number): FrequencyBandValues<K>;
|
|
107
|
+
declare const _default: {
|
|
108
|
+
useAudioData: typeof useAudioData;
|
|
109
|
+
getFrequencyBands: typeof getFrequencyBands;
|
|
110
|
+
};
|
|
111
|
+
export default _default;
|
|
112
|
+
//# sourceMappingURL=useAudioData.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useAudioData.d.ts","sourceRoot":"","sources":["../src/useAudioData.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAA+B,SAAS,EAAE,MAAM,OAAO,CAAC;AAG/D;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,wDAAwD;IACxD,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,sDAAsD;IACtD,qBAAqB,CAAC,EAAE,MAAM,CAAC;IAC/B,6DAA6D;IAC7D,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,4DAA4D;IAC5D,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,gDAAgD;IAChD,aAAa,EAAE,UAAU,CAAC;IAC1B,sDAAsD;IACtD,YAAY,EAAE,UAAU,CAAC;IACzB,0CAA0C;IAC1C,MAAM,EAAE,MAAM,CAAC;IACf,kEAAkE;IAClE,OAAO,EAAE,OAAO,CAAC;CAClB;AAED;;GAEG;AACH,MAAM,MAAM,mBAAmB,CAAC,CAAC,SAAS,MAAM,GAAG,MAAM,IAAI,MAAM,CAAC,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;AAEzF;;GAEG;AACH,MAAM,MAAM,mBAAmB,CAAC,CAAC,SAAS,MAAM,GAAG,MAAM,IAAI,MAAM,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC;AAE/E,wEAAwE;AACxE,OAAO,CAAC,MAAM,CAAC;IACb,UAAU,MAAM;QACd,qBAAqB,CAAC,EAAE,OAAO,CAAC;QAChC,kBAAkB,CAAC,EAAE,OAAO,YAAY,CAAC;KAC1C;CACF;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,wBAAgB,YAAY,CAC1B,QAAQ,EAAE,SAAS,CAAC,gBAAgB,GAAG,IAAI,CAAC,EAC5C,OAAO,GAAE,gBAAqB,GAC7B,eAAe,CAsGjB;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AACH,wBAAgB,iBAAiB,CAAC,CAAC,SAAS,MAAM,EAChD,aAAa,EAAE,UAAU,EACzB,KAAK,EAAE,mBAAmB,CAAC,CAAC,CAAC,EAC7B,UAAU,GAAE,MAAc,GACzB,mBAAmB,CAAC,CAAC,CAAC,CAkCxB;;;;;AAED,wBAAmD"}
|
|
@@ -0,0 +1,183 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Audio Visualization Hooks
|
|
3
|
+
*
|
|
4
|
+
* Provides frequency and waveform data from audio elements
|
|
5
|
+
* for creating audio-reactive animations.
|
|
6
|
+
*/
|
|
7
|
+
import { useState, useEffect, useRef } from 'react';
|
|
8
|
+
import { useTimeline } from './context';
|
|
9
|
+
/**
|
|
10
|
+
* Extract audio frequency and waveform data from an audio element.
|
|
11
|
+
*
|
|
12
|
+
* In browser preview mode, connects to the Web Audio API to analyze
|
|
13
|
+
* audio in real-time. In render mode (Playwright), returns empty data
|
|
14
|
+
* since audio is not available during headless rendering.
|
|
15
|
+
*
|
|
16
|
+
* @param {RefObject<HTMLAudioElement>} audioRef - Ref to an audio element
|
|
17
|
+
* @param {AudioDataOptions} [options]
|
|
18
|
+
* @param {number} [options.fftSize=256] - FFT size (power of 2, 32-32768)
|
|
19
|
+
* @param {number} [options.smoothingTimeConstant=0.8] - Smoothing (0-1)
|
|
20
|
+
* @param {number} [options.minDecibels=-100] - Min dB for frequency data
|
|
21
|
+
* @param {number} [options.maxDecibels=-30] - Max dB for frequency data
|
|
22
|
+
* @returns {AudioDataResult}
|
|
23
|
+
*
|
|
24
|
+
* @example
|
|
25
|
+
* const audioRef = useRef(null);
|
|
26
|
+
* const { frequencyData, volume } = useAudioData(audioRef);
|
|
27
|
+
*
|
|
28
|
+
* // Use volume to drive animation
|
|
29
|
+
* const scale = 1 + volume * 0.5;
|
|
30
|
+
*
|
|
31
|
+
* // Use frequency bands for visualizer bars
|
|
32
|
+
* {Array.from(frequencyData).slice(0, 32).map((val, i) => (
|
|
33
|
+
* <div key={i} style={{ height: val }} />
|
|
34
|
+
* ))}
|
|
35
|
+
*/
|
|
36
|
+
export function useAudioData(audioRef, options = {}) {
|
|
37
|
+
const { fftSize = 256, smoothingTimeConstant = 0.8, minDecibels = -100, maxDecibels = -30, } = options;
|
|
38
|
+
const { frame } = useTimeline();
|
|
39
|
+
const analyserRef = useRef(null);
|
|
40
|
+
const contextRef = useRef(null);
|
|
41
|
+
const sourceRef = useRef(null);
|
|
42
|
+
const [isReady, setIsReady] = useState(false);
|
|
43
|
+
const frequencyBufferRef = useRef(null);
|
|
44
|
+
const waveformBufferRef = useRef(null);
|
|
45
|
+
const [frequencyData, setFrequencyData] = useState(() => new Uint8Array(fftSize / 2));
|
|
46
|
+
const [waveformData, setWaveformData] = useState(() => new Uint8Array(fftSize));
|
|
47
|
+
const [volume, setVolume] = useState(0);
|
|
48
|
+
// Set up audio context and analyser
|
|
49
|
+
useEffect(() => {
|
|
50
|
+
const audio = audioRef?.current;
|
|
51
|
+
if (!audio)
|
|
52
|
+
return;
|
|
53
|
+
// Don't set up in render mode
|
|
54
|
+
if (typeof window !== 'undefined' && window.__FRAMELY_RENDER_MODE) {
|
|
55
|
+
return;
|
|
56
|
+
}
|
|
57
|
+
let ctx;
|
|
58
|
+
try {
|
|
59
|
+
ctx = new (window.AudioContext || window.webkitAudioContext)();
|
|
60
|
+
}
|
|
61
|
+
catch {
|
|
62
|
+
return;
|
|
63
|
+
}
|
|
64
|
+
const analyser = ctx.createAnalyser();
|
|
65
|
+
analyser.fftSize = fftSize;
|
|
66
|
+
analyser.smoothingTimeConstant = smoothingTimeConstant;
|
|
67
|
+
analyser.minDecibels = minDecibels;
|
|
68
|
+
analyser.maxDecibels = maxDecibels;
|
|
69
|
+
let source;
|
|
70
|
+
try {
|
|
71
|
+
source = ctx.createMediaElementSource(audio);
|
|
72
|
+
source.connect(analyser);
|
|
73
|
+
analyser.connect(ctx.destination);
|
|
74
|
+
}
|
|
75
|
+
catch {
|
|
76
|
+
// Source may already be connected
|
|
77
|
+
return;
|
|
78
|
+
}
|
|
79
|
+
contextRef.current = ctx;
|
|
80
|
+
analyserRef.current = analyser;
|
|
81
|
+
sourceRef.current = source;
|
|
82
|
+
frequencyBufferRef.current = new Uint8Array(analyser.frequencyBinCount);
|
|
83
|
+
waveformBufferRef.current = new Uint8Array(analyser.fftSize);
|
|
84
|
+
setIsReady(true);
|
|
85
|
+
return () => {
|
|
86
|
+
try {
|
|
87
|
+
source.disconnect();
|
|
88
|
+
analyser.disconnect();
|
|
89
|
+
ctx.close();
|
|
90
|
+
}
|
|
91
|
+
catch {
|
|
92
|
+
// Ignore cleanup errors
|
|
93
|
+
}
|
|
94
|
+
contextRef.current = null;
|
|
95
|
+
analyserRef.current = null;
|
|
96
|
+
sourceRef.current = null;
|
|
97
|
+
setIsReady(false);
|
|
98
|
+
};
|
|
99
|
+
}, [audioRef?.current, fftSize, smoothingTimeConstant, minDecibels, maxDecibels]);
|
|
100
|
+
// Update data on each frame
|
|
101
|
+
useEffect(() => {
|
|
102
|
+
const analyser = analyserRef.current;
|
|
103
|
+
if (!analyser || !frequencyBufferRef.current || !waveformBufferRef.current)
|
|
104
|
+
return;
|
|
105
|
+
// Get frequency data
|
|
106
|
+
analyser.getByteFrequencyData(frequencyBufferRef.current);
|
|
107
|
+
const freqCopy = new Uint8Array(frequencyBufferRef.current.length);
|
|
108
|
+
freqCopy.set(frequencyBufferRef.current);
|
|
109
|
+
setFrequencyData(freqCopy);
|
|
110
|
+
// Get waveform data
|
|
111
|
+
analyser.getByteTimeDomainData(waveformBufferRef.current);
|
|
112
|
+
const waveCopy = new Uint8Array(waveformBufferRef.current.length);
|
|
113
|
+
waveCopy.set(waveformBufferRef.current);
|
|
114
|
+
setWaveformData(waveCopy);
|
|
115
|
+
// Calculate RMS volume (0-1)
|
|
116
|
+
let sum = 0;
|
|
117
|
+
for (let i = 0; i < frequencyBufferRef.current.length; i++) {
|
|
118
|
+
const normalized = frequencyBufferRef.current[i] / 255;
|
|
119
|
+
sum += normalized * normalized;
|
|
120
|
+
}
|
|
121
|
+
setVolume(Math.sqrt(sum / frequencyBufferRef.current.length));
|
|
122
|
+
}, [frame]);
|
|
123
|
+
return { frequencyData, waveformData, volume, isReady };
|
|
124
|
+
}
|
|
125
|
+
/**
|
|
126
|
+
* Extract frequency bands from raw frequency data.
|
|
127
|
+
*
|
|
128
|
+
* Groups frequency bins into named bands based on frequency ranges.
|
|
129
|
+
* Each band value is the average amplitude (0-1) of bins in that range.
|
|
130
|
+
*
|
|
131
|
+
* @param {Uint8Array} frequencyData - Raw frequency data from useAudioData
|
|
132
|
+
* @param {FrequencyBandRanges<K>} bands - Named frequency ranges in Hz
|
|
133
|
+
* @param {number} [sampleRate=44100] - Audio sample rate
|
|
134
|
+
* @returns {FrequencyBandValues<K>} Object with same keys as bands, values 0-1
|
|
135
|
+
*
|
|
136
|
+
* @example
|
|
137
|
+
* const { bass, mid, treble } = getFrequencyBands(frequencyData, {
|
|
138
|
+
* bass: [20, 250],
|
|
139
|
+
* mid: [250, 4000],
|
|
140
|
+
* treble: [4000, 20000],
|
|
141
|
+
* });
|
|
142
|
+
*
|
|
143
|
+
* @example
|
|
144
|
+
* const bands = getFrequencyBands(frequencyData, {
|
|
145
|
+
* sub: [20, 60],
|
|
146
|
+
* bass: [60, 250],
|
|
147
|
+
* lowMid: [250, 500],
|
|
148
|
+
* mid: [500, 2000],
|
|
149
|
+
* highMid: [2000, 4000],
|
|
150
|
+
* presence: [4000, 6000],
|
|
151
|
+
* brilliance: [6000, 20000],
|
|
152
|
+
* });
|
|
153
|
+
*/
|
|
154
|
+
export function getFrequencyBands(frequencyData, bands, sampleRate = 44100) {
|
|
155
|
+
if (!frequencyData || frequencyData.length === 0) {
|
|
156
|
+
const result = {};
|
|
157
|
+
for (const key of Object.keys(bands)) {
|
|
158
|
+
result[key] = 0;
|
|
159
|
+
}
|
|
160
|
+
return result;
|
|
161
|
+
}
|
|
162
|
+
const binCount = frequencyData.length;
|
|
163
|
+
const binWidth = sampleRate / 2 / binCount; // Hz per bin
|
|
164
|
+
const result = {};
|
|
165
|
+
for (const [name, [minHz, maxHz]] of Object.entries(bands)) {
|
|
166
|
+
const startBin = Math.max(0, Math.floor(minHz / binWidth));
|
|
167
|
+
const endBin = Math.min(binCount - 1, Math.ceil(maxHz / binWidth));
|
|
168
|
+
if (startBin >= binCount || endBin < 0 || startBin > endBin) {
|
|
169
|
+
result[name] = 0;
|
|
170
|
+
continue;
|
|
171
|
+
}
|
|
172
|
+
let sum = 0;
|
|
173
|
+
let count = 0;
|
|
174
|
+
for (let i = startBin; i <= endBin; i++) {
|
|
175
|
+
sum += frequencyData[i] / 255;
|
|
176
|
+
count++;
|
|
177
|
+
}
|
|
178
|
+
result[name] = count > 0 ? sum / count : 0;
|
|
179
|
+
}
|
|
180
|
+
return result;
|
|
181
|
+
}
|
|
182
|
+
export default { useAudioData, getFrequencyBands };
|
|
183
|
+
//# sourceMappingURL=useAudioData.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useAudioData.js","sourceRoot":"","sources":["../src/useAudioData.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* useSpring Hook
|
|
3
|
+
*
|
|
4
|
+
* Declarative spring animation driven by the current frame.
|
|
5
|
+
* Automatically animates between values using physics-based spring dynamics.
|
|
6
|
+
*/
|
|
7
|
+
/** Options for configuring spring physics behavior. */
|
|
8
|
+
export interface UseSpringOptions {
|
|
9
|
+
/** Initial value (defaults to 0 on first render, then tracks previous) */
|
|
10
|
+
from?: number;
|
|
11
|
+
/** Spring mass */
|
|
12
|
+
mass?: number;
|
|
13
|
+
/** Spring stiffness */
|
|
14
|
+
stiffness?: number;
|
|
15
|
+
/** Damping coefficient */
|
|
16
|
+
damping?: number;
|
|
17
|
+
/** Clamp overshoot */
|
|
18
|
+
overshootClamping?: boolean;
|
|
19
|
+
}
|
|
20
|
+
/** Options for configuring spring physics on a sequence of values. */
|
|
21
|
+
export interface UseSpringSequenceOptions {
|
|
22
|
+
/** Initial values (defaults to all 0s on first render, then tracks previous) */
|
|
23
|
+
from?: number[];
|
|
24
|
+
/** Spring mass */
|
|
25
|
+
mass?: number;
|
|
26
|
+
/** Spring stiffness */
|
|
27
|
+
stiffness?: number;
|
|
28
|
+
/** Damping coefficient */
|
|
29
|
+
damping?: number;
|
|
30
|
+
/** Clamp overshoot */
|
|
31
|
+
overshootClamping?: boolean;
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Animate a value using spring physics.
|
|
35
|
+
*
|
|
36
|
+
* When the target value changes, the spring animates from the current
|
|
37
|
+
* position to the new target starting from that frame.
|
|
38
|
+
*
|
|
39
|
+
* @param {number} target - The target value to spring toward
|
|
40
|
+
* @param {object} [options]
|
|
41
|
+
* @param {number} [options.from] - Initial value (defaults to 0 on first render, then tracks previous)
|
|
42
|
+
* @param {number} [options.mass=1] - Spring mass
|
|
43
|
+
* @param {number} [options.stiffness=100] - Spring stiffness
|
|
44
|
+
* @param {number} [options.damping=10] - Damping coefficient
|
|
45
|
+
* @param {boolean} [options.overshootClamping=false] - Clamp overshoot
|
|
46
|
+
* @returns {number} Current animated value
|
|
47
|
+
*
|
|
48
|
+
* @example
|
|
49
|
+
* const scale = useSpring(isVisible ? 1 : 0, { stiffness: 200, damping: 15 });
|
|
50
|
+
*
|
|
51
|
+
* @example
|
|
52
|
+
* // Animate position based on frame
|
|
53
|
+
* const frame = useCurrentFrame();
|
|
54
|
+
* const x = useSpring(frame >= 30 ? 200 : 0, { damping: 12 });
|
|
55
|
+
*/
|
|
56
|
+
export declare function useSpring(target: number, options?: UseSpringOptions): number;
|
|
57
|
+
/**
|
|
58
|
+
* Animate multiple values using spring physics.
|
|
59
|
+
*
|
|
60
|
+
* Same as useSpring but for an array of values. All values share
|
|
61
|
+
* the same spring configuration.
|
|
62
|
+
*
|
|
63
|
+
* @param {number[]} targets - Array of target values
|
|
64
|
+
* @param {object} [options] - Same as useSpring options
|
|
65
|
+
* @returns {number[]} Array of animated values
|
|
66
|
+
*
|
|
67
|
+
* @example
|
|
68
|
+
* const [x, y, rotation] = useSpringSequence(
|
|
69
|
+
* isActive ? [200, 100, 45] : [0, 0, 0],
|
|
70
|
+
* { stiffness: 150, damping: 12 }
|
|
71
|
+
* );
|
|
72
|
+
*/
|
|
73
|
+
export declare function useSpringSequence(targets: number[], options?: UseSpringSequenceOptions): number[];
|
|
74
|
+
declare const _default: {
|
|
75
|
+
useSpring: typeof useSpring;
|
|
76
|
+
useSpringSequence: typeof useSpringSequence;
|
|
77
|
+
};
|
|
78
|
+
export default _default;
|
|
79
|
+
//# sourceMappingURL=useSpring.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useSpring.d.ts","sourceRoot":"","sources":["../src/useSpring.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAMH,uDAAuD;AACvD,MAAM,WAAW,gBAAgB;IAC/B,0EAA0E;IAC1E,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,kBAAkB;IAClB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,uBAAuB;IACvB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,0BAA0B;IAC1B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,sBAAsB;IACtB,iBAAiB,CAAC,EAAE,OAAO,CAAC;CAC7B;AAED,sEAAsE;AACtE,MAAM,WAAW,wBAAwB;IACvC,gFAAgF;IAChF,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,kBAAkB;IAClB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,uBAAuB;IACvB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,0BAA0B;IAC1B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,sBAAsB;IACtB,iBAAiB,CAAC,EAAE,OAAO,CAAC;CAC7B;AAkBD;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,wBAAgB,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,GAAE,gBAAqB,GAAG,MAAM,CAqDhF;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE,OAAO,GAAE,wBAA6B,GAAG,MAAM,EAAE,CA+DrG;;;;;AAED,wBAAgD"}
|
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* useSpring Hook
|
|
3
|
+
*
|
|
4
|
+
* Declarative spring animation driven by the current frame.
|
|
5
|
+
* Automatically animates between values using physics-based spring dynamics.
|
|
6
|
+
*/
|
|
7
|
+
import { useRef, useMemo } from 'react';
|
|
8
|
+
import { useTimeline } from './context';
|
|
9
|
+
import { spring } from './interpolate';
|
|
10
|
+
/**
|
|
11
|
+
* Animate a value using spring physics.
|
|
12
|
+
*
|
|
13
|
+
* When the target value changes, the spring animates from the current
|
|
14
|
+
* position to the new target starting from that frame.
|
|
15
|
+
*
|
|
16
|
+
* @param {number} target - The target value to spring toward
|
|
17
|
+
* @param {object} [options]
|
|
18
|
+
* @param {number} [options.from] - Initial value (defaults to 0 on first render, then tracks previous)
|
|
19
|
+
* @param {number} [options.mass=1] - Spring mass
|
|
20
|
+
* @param {number} [options.stiffness=100] - Spring stiffness
|
|
21
|
+
* @param {number} [options.damping=10] - Damping coefficient
|
|
22
|
+
* @param {boolean} [options.overshootClamping=false] - Clamp overshoot
|
|
23
|
+
* @returns {number} Current animated value
|
|
24
|
+
*
|
|
25
|
+
* @example
|
|
26
|
+
* const scale = useSpring(isVisible ? 1 : 0, { stiffness: 200, damping: 15 });
|
|
27
|
+
*
|
|
28
|
+
* @example
|
|
29
|
+
* // Animate position based on frame
|
|
30
|
+
* const frame = useCurrentFrame();
|
|
31
|
+
* const x = useSpring(frame >= 30 ? 200 : 0, { damping: 12 });
|
|
32
|
+
*/
|
|
33
|
+
export function useSpring(target, options = {}) {
|
|
34
|
+
const { from: initialFrom, mass = 1, stiffness = 100, damping = 10, overshootClamping = false, } = options;
|
|
35
|
+
const { frame, fps } = useTimeline();
|
|
36
|
+
// Track when the target changes and from what value
|
|
37
|
+
const state = useRef({
|
|
38
|
+
prevTarget: undefined,
|
|
39
|
+
triggerFrame: 0,
|
|
40
|
+
fromValue: initialFrom ?? 0,
|
|
41
|
+
initialized: false,
|
|
42
|
+
});
|
|
43
|
+
// Detect target changes
|
|
44
|
+
if (!state.current.initialized) {
|
|
45
|
+
state.current.prevTarget = target;
|
|
46
|
+
state.current.fromValue = initialFrom ?? 0;
|
|
47
|
+
state.current.triggerFrame = 0;
|
|
48
|
+
state.current.initialized = true;
|
|
49
|
+
}
|
|
50
|
+
else if (target !== state.current.prevTarget) {
|
|
51
|
+
// Target changed — compute current value as the new "from"
|
|
52
|
+
const elapsed = frame - state.current.triggerFrame;
|
|
53
|
+
state.current.fromValue = spring(elapsed, {
|
|
54
|
+
from: state.current.fromValue,
|
|
55
|
+
to: state.current.prevTarget,
|
|
56
|
+
fps,
|
|
57
|
+
mass,
|
|
58
|
+
stiffness,
|
|
59
|
+
damping,
|
|
60
|
+
overshootClamping,
|
|
61
|
+
});
|
|
62
|
+
state.current.prevTarget = target;
|
|
63
|
+
state.current.triggerFrame = frame;
|
|
64
|
+
}
|
|
65
|
+
// Compute spring value
|
|
66
|
+
const elapsed = frame - state.current.triggerFrame;
|
|
67
|
+
return spring(elapsed, {
|
|
68
|
+
from: state.current.fromValue,
|
|
69
|
+
to: target,
|
|
70
|
+
fps,
|
|
71
|
+
mass,
|
|
72
|
+
stiffness,
|
|
73
|
+
damping,
|
|
74
|
+
overshootClamping,
|
|
75
|
+
});
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* Animate multiple values using spring physics.
|
|
79
|
+
*
|
|
80
|
+
* Same as useSpring but for an array of values. All values share
|
|
81
|
+
* the same spring configuration.
|
|
82
|
+
*
|
|
83
|
+
* @param {number[]} targets - Array of target values
|
|
84
|
+
* @param {object} [options] - Same as useSpring options
|
|
85
|
+
* @returns {number[]} Array of animated values
|
|
86
|
+
*
|
|
87
|
+
* @example
|
|
88
|
+
* const [x, y, rotation] = useSpringSequence(
|
|
89
|
+
* isActive ? [200, 100, 45] : [0, 0, 0],
|
|
90
|
+
* { stiffness: 150, damping: 12 }
|
|
91
|
+
* );
|
|
92
|
+
*/
|
|
93
|
+
export function useSpringSequence(targets, options = {}) {
|
|
94
|
+
const { from: initialFroms, mass = 1, stiffness = 100, damping = 10, overshootClamping = false, } = options;
|
|
95
|
+
const { frame, fps } = useTimeline();
|
|
96
|
+
const state = useRef({
|
|
97
|
+
prevTargets: undefined,
|
|
98
|
+
triggerFrame: 0,
|
|
99
|
+
fromValues: null,
|
|
100
|
+
initialized: false,
|
|
101
|
+
});
|
|
102
|
+
if (!state.current.initialized) {
|
|
103
|
+
state.current.prevTargets = [...targets];
|
|
104
|
+
state.current.fromValues = initialFroms
|
|
105
|
+
? [...initialFroms]
|
|
106
|
+
: targets.map(() => 0);
|
|
107
|
+
state.current.triggerFrame = 0;
|
|
108
|
+
state.current.initialized = true;
|
|
109
|
+
}
|
|
110
|
+
else {
|
|
111
|
+
// Check if any target changed
|
|
112
|
+
const changed = targets.some((t, i) => t !== state.current.prevTargets[i]);
|
|
113
|
+
if (changed) {
|
|
114
|
+
const elapsed = frame - state.current.triggerFrame;
|
|
115
|
+
state.current.fromValues = state.current.prevTargets.map((prevTarget, i) => spring(elapsed, {
|
|
116
|
+
from: state.current.fromValues[i],
|
|
117
|
+
to: prevTarget,
|
|
118
|
+
fps,
|
|
119
|
+
mass,
|
|
120
|
+
stiffness,
|
|
121
|
+
damping,
|
|
122
|
+
overshootClamping,
|
|
123
|
+
}));
|
|
124
|
+
state.current.prevTargets = [...targets];
|
|
125
|
+
state.current.triggerFrame = frame;
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
const elapsed = frame - state.current.triggerFrame;
|
|
129
|
+
return useMemo(() => targets.map((target, i) => spring(elapsed, {
|
|
130
|
+
from: state.current.fromValues[i],
|
|
131
|
+
to: target,
|
|
132
|
+
fps,
|
|
133
|
+
mass,
|
|
134
|
+
stiffness,
|
|
135
|
+
damping,
|
|
136
|
+
overshootClamping,
|
|
137
|
+
})), [elapsed, ...targets, fps, mass, stiffness, damping, overshootClamping]);
|
|
138
|
+
}
|
|
139
|
+
export default { useSpring, useSpringSequence };
|
|
140
|
+
//# sourceMappingURL=useSpring.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useSpring.js","sourceRoot":"","sources":["../src/useSpring.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,MAAM,EAAE,OAAO,EAAyB,MAAM,OAAO,CAAC;AAC/D,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AACxC,OAAO,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AA8CvC;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,MAAM,UAAU,SAAS,CAAC,MAAc,EAAE,UAA4B,EAAE;IACtE,MAAM,EACJ,IAAI,EAAE,WAAW,EACjB,IAAI,GAAG,CAAC,EACR,SAAS,GAAG,GAAG,EACf,OAAO,GAAG,EAAE,EACZ,iBAAiB,GAAG,KAAK,GAC1B,GAAG,OAAO,CAAC;IAEZ,MAAM,EAAE,KAAK,EAAE,GAAG,EAAE,GAAG,WAAW,EAAE,CAAC;IAErC,oDAAoD;IACpD,MAAM,KAAK,GAAkC,MAAM,CAAc;QAC/D,UAAU,EAAE,SAAS;QACrB,YAAY,EAAE,CAAC;QACf,SAAS,EAAE,WAAW,IAAI,CAAC;QAC3B,WAAW,EAAE,KAAK;KACnB,CAAC,CAAC;IAEH,wBAAwB;IACxB,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC;QAC/B,KAAK,CAAC,OAAO,CAAC,UAAU,GAAG,MAAM,CAAC;QAClC,KAAK,CAAC,OAAO,CAAC,SAAS,GAAG,WAAW,IAAI,CAAC,CAAC;QAC3C,KAAK,CAAC,OAAO,CAAC,YAAY,GAAG,CAAC,CAAC;QAC/B,KAAK,CAAC,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC;IACnC,CAAC;SAAM,IAAI,MAAM,KAAK,KAAK,CAAC,OAAO,CAAC,UAAU,EAAE,CAAC;QAC/C,2DAA2D;QAC3D,MAAM,OAAO,GAAG,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,YAAY,CAAC;QACnD,KAAK,CAAC,OAAO,CAAC,SAAS,GAAG,MAAM,CAAC,OAAO,EAAE;YACxC,IAAI,EAAE,KAAK,CAAC,OAAO,CAAC,SAAS;YAC7B,EAAE,EAAE,KAAK,CAAC,OAAO,CAAC,UAAU;YAC5B,GAAG;YACH,IAAI;YACJ,SAAS;YACT,OAAO;YACP,iBAAiB;SAClB,CAAC,CAAC;QACH,KAAK,CAAC,OAAO,CAAC,UAAU,GAAG,MAAM,CAAC;QAClC,KAAK,CAAC,OAAO,CAAC,YAAY,GAAG,KAAK,CAAC;IACrC,CAAC;IAED,uBAAuB;IACvB,MAAM,OAAO,GAAG,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,YAAY,CAAC;IAEnD,OAAO,MAAM,CAAC,OAAO,EAAE;QACrB,IAAI,EAAE,KAAK,CAAC,OAAO,CAAC,SAAS;QAC7B,EAAE,EAAE,MAAM;QACV,GAAG;QACH,IAAI;QACJ,SAAS;QACT,OAAO;QACP,iBAAiB;KAClB,CAAC,CAAC;AACL,CAAC;AAED;;;;;;;;;;;;;;;GAeG;AACH,MAAM,UAAU,iBAAiB,CAAC,OAAiB,EAAE,UAAoC,EAAE;IACzF,MAAM,EACJ,IAAI,EAAE,YAAY,EAClB,IAAI,GAAG,CAAC,EACR,SAAS,GAAG,GAAG,EACf,OAAO,GAAG,EAAE,EACZ,iBAAiB,GAAG,KAAK,GAC1B,GAAG,OAAO,CAAC;IAEZ,MAAM,EAAE,KAAK,EAAE,GAAG,EAAE,GAAG,WAAW,EAAE,CAAC;IAErC,MAAM,KAAK,GAA0C,MAAM,CAAsB;QAC/E,WAAW,EAAE,SAAS;QACtB,YAAY,EAAE,CAAC;QACf,UAAU,EAAE,IAAI;QAChB,WAAW,EAAE,KAAK;KACnB,CAAC,CAAC;IAEH,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC;QAC/B,KAAK,CAAC,OAAO,CAAC,WAAW,GAAG,CAAC,GAAG,OAAO,CAAC,CAAC;QACzC,KAAK,CAAC,OAAO,CAAC,UAAU,GAAG,YAAY;YACrC,CAAC,CAAC,CAAC,GAAG,YAAY,CAAC;YACnB,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC;QACzB,KAAK,CAAC,OAAO,CAAC,YAAY,GAAG,CAAC,CAAC;QAC/B,KAAK,CAAC,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC;IACnC,CAAC;SAAM,CAAC;QACN,8BAA8B;QAC9B,MAAM,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,KAAK,CAAC,OAAO,CAAC,WAAY,CAAC,CAAC,CAAC,CAAC,CAAC;QAC5E,IAAI,OAAO,EAAE,CAAC;YACZ,MAAM,OAAO,GAAG,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,YAAY,CAAC;YACnD,KAAK,CAAC,OAAO,CAAC,UAAU,GAAG,KAAK,CAAC,OAAO,CAAC,WAAY,CAAC,GAAG,CAAC,CAAC,UAAU,EAAE,CAAC,EAAE,EAAE,CAC1E,MAAM,CAAC,OAAO,EAAE;gBACd,IAAI,EAAE,KAAK,CAAC,OAAO,CAAC,UAAW,CAAC,CAAC,CAAC;gBAClC,EAAE,EAAE,UAAU;gBACd,GAAG;gBACH,IAAI;gBACJ,SAAS;gBACT,OAAO;gBACP,iBAAiB;aAClB,CAAC,CACH,CAAC;YACF,KAAK,CAAC,OAAO,CAAC,WAAW,GAAG,CAAC,GAAG,OAAO,CAAC,CAAC;YACzC,KAAK,CAAC,OAAO,CAAC,YAAY,GAAG,KAAK,CAAC;QACrC,CAAC;IACH,CAAC;IAED,MAAM,OAAO,GAAG,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,YAAY,CAAC;IAEnD,OAAO,OAAO,CACZ,GAAG,EAAE,CACH,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CACxB,MAAM,CAAC,OAAO,EAAE;QACd,IAAI,EAAE,KAAK,CAAC,OAAO,CAAC,UAAW,CAAC,CAAC,CAAC;QAClC,EAAE,EAAE,MAAM;QACV,GAAG;QACH,IAAI;QACJ,SAAS;QACT,OAAO;QACP,iBAAiB;KAClB,CAAC,CACH,EACH,CAAC,OAAO,EAAE,GAAG,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,iBAAiB,CAAC,CACxE,CAAC;AACJ,CAAC;AAED,eAAe,EAAE,SAAS,EAAE,iBAAiB,EAAE,CAAC"}
|