@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.
Files changed (209) hide show
  1. package/dist/AbsoluteFill.d.ts +18 -0
  2. package/dist/AbsoluteFill.d.ts.map +1 -0
  3. package/dist/AbsoluteFill.js +25 -0
  4. package/dist/AbsoluteFill.js.map +1 -0
  5. package/dist/Audio.d.ts +80 -0
  6. package/dist/Audio.d.ts.map +1 -0
  7. package/dist/Audio.js +221 -0
  8. package/dist/Audio.js.map +1 -0
  9. package/dist/Composition.d.ts +208 -0
  10. package/dist/Composition.d.ts.map +1 -0
  11. package/dist/Composition.js +210 -0
  12. package/dist/Composition.js.map +1 -0
  13. package/dist/Easing.d.ts +88 -0
  14. package/dist/Easing.d.ts.map +1 -0
  15. package/dist/Easing.js +266 -0
  16. package/dist/Easing.js.map +1 -0
  17. package/dist/ErrorBoundary.d.ts +35 -0
  18. package/dist/ErrorBoundary.d.ts.map +1 -0
  19. package/dist/ErrorBoundary.js +74 -0
  20. package/dist/ErrorBoundary.js.map +1 -0
  21. package/dist/Folder.d.ts +46 -0
  22. package/dist/Folder.d.ts.map +1 -0
  23. package/dist/Folder.js +44 -0
  24. package/dist/Folder.js.map +1 -0
  25. package/dist/Freeze.d.ts +35 -0
  26. package/dist/Freeze.d.ts.map +1 -0
  27. package/dist/Freeze.js +40 -0
  28. package/dist/Freeze.js.map +1 -0
  29. package/dist/IFrame.d.ts +28 -0
  30. package/dist/IFrame.d.ts.map +1 -0
  31. package/dist/IFrame.js +57 -0
  32. package/dist/IFrame.js.map +1 -0
  33. package/dist/Img.d.ts +36 -0
  34. package/dist/Img.d.ts.map +1 -0
  35. package/dist/Img.js +91 -0
  36. package/dist/Img.js.map +1 -0
  37. package/dist/Loop.d.ts +66 -0
  38. package/dist/Loop.d.ts.map +1 -0
  39. package/dist/Loop.js +79 -0
  40. package/dist/Loop.js.map +1 -0
  41. package/dist/Player.d.ts +118 -0
  42. package/dist/Player.d.ts.map +1 -0
  43. package/dist/Player.js +311 -0
  44. package/dist/Player.js.map +1 -0
  45. package/dist/Sequence.d.ts +25 -0
  46. package/dist/Sequence.d.ts.map +1 -0
  47. package/dist/Sequence.js +37 -0
  48. package/dist/Sequence.js.map +1 -0
  49. package/dist/Series.d.ts +52 -0
  50. package/dist/Series.d.ts.map +1 -0
  51. package/dist/Series.js +86 -0
  52. package/dist/Series.js.map +1 -0
  53. package/dist/Text.d.ts +129 -0
  54. package/dist/Text.d.ts.map +1 -0
  55. package/dist/Text.js +211 -0
  56. package/dist/Text.js.map +1 -0
  57. package/dist/Video.d.ts +75 -0
  58. package/dist/Video.d.ts.map +1 -0
  59. package/dist/Video.js +136 -0
  60. package/dist/Video.js.map +1 -0
  61. package/dist/config.d.ts +128 -0
  62. package/dist/config.d.ts.map +1 -0
  63. package/dist/config.js +243 -0
  64. package/dist/config.js.map +1 -0
  65. package/dist/context.d.ts +84 -0
  66. package/dist/context.d.ts.map +1 -0
  67. package/dist/context.js +131 -0
  68. package/dist/context.js.map +1 -0
  69. package/dist/delayRender.d.ts +130 -0
  70. package/dist/delayRender.d.ts.map +1 -0
  71. package/dist/delayRender.js +197 -0
  72. package/dist/delayRender.js.map +1 -0
  73. package/dist/getInputProps.d.ts +118 -0
  74. package/dist/getInputProps.d.ts.map +1 -0
  75. package/dist/getInputProps.js +181 -0
  76. package/dist/getInputProps.js.map +1 -0
  77. package/dist/hooks/useDelayRender.d.ts +52 -0
  78. package/dist/hooks/useDelayRender.d.ts.map +1 -0
  79. package/dist/hooks/useDelayRender.js +92 -0
  80. package/dist/hooks/useDelayRender.js.map +1 -0
  81. package/dist/hooks.d.ts +19 -0
  82. package/dist/hooks.d.ts.map +1 -0
  83. package/dist/hooks.js +17 -0
  84. package/dist/hooks.js.map +1 -0
  85. package/dist/index.d.ts +71 -0
  86. package/dist/index.d.ts.map +1 -0
  87. package/dist/index.js +65 -0
  88. package/dist/index.js.map +1 -0
  89. package/dist/interpolate.d.ts +80 -0
  90. package/dist/interpolate.d.ts.map +1 -0
  91. package/dist/interpolate.js +108 -0
  92. package/dist/interpolate.js.map +1 -0
  93. package/dist/interpolateColors.d.ts +50 -0
  94. package/dist/interpolateColors.d.ts.map +1 -0
  95. package/dist/interpolateColors.js +300 -0
  96. package/dist/interpolateColors.js.map +1 -0
  97. package/dist/makeTransform.d.ts +98 -0
  98. package/dist/makeTransform.d.ts.map +1 -0
  99. package/dist/makeTransform.js +287 -0
  100. package/dist/makeTransform.js.map +1 -0
  101. package/dist/measureSpring.d.ts +75 -0
  102. package/dist/measureSpring.d.ts.map +1 -0
  103. package/dist/measureSpring.js +108 -0
  104. package/dist/measureSpring.js.map +1 -0
  105. package/dist/noise.d.ts +110 -0
  106. package/dist/noise.d.ts.map +1 -0
  107. package/dist/noise.js +228 -0
  108. package/dist/noise.js.map +1 -0
  109. package/dist/preload.d.ts +145 -0
  110. package/dist/preload.d.ts.map +1 -0
  111. package/dist/preload.js +225 -0
  112. package/dist/preload.js.map +1 -0
  113. package/dist/registerRoot.d.ts +140 -0
  114. package/dist/registerRoot.d.ts.map +1 -0
  115. package/dist/registerRoot.js +238 -0
  116. package/dist/registerRoot.js.map +1 -0
  117. package/dist/shapes/Circle.d.ts +15 -0
  118. package/dist/shapes/Circle.d.ts.map +1 -0
  119. package/dist/shapes/Circle.js +11 -0
  120. package/dist/shapes/Circle.js.map +1 -0
  121. package/dist/shapes/Ellipse.d.ts +16 -0
  122. package/dist/shapes/Ellipse.d.ts.map +1 -0
  123. package/dist/shapes/Ellipse.js +11 -0
  124. package/dist/shapes/Ellipse.js.map +1 -0
  125. package/dist/shapes/Line.d.ts +15 -0
  126. package/dist/shapes/Line.d.ts.map +1 -0
  127. package/dist/shapes/Line.js +11 -0
  128. package/dist/shapes/Line.js.map +1 -0
  129. package/dist/shapes/Path.d.ts +20 -0
  130. package/dist/shapes/Path.d.ts.map +1 -0
  131. package/dist/shapes/Path.js +14 -0
  132. package/dist/shapes/Path.js.map +1 -0
  133. package/dist/shapes/Polygon.d.ts +15 -0
  134. package/dist/shapes/Polygon.d.ts.map +1 -0
  135. package/dist/shapes/Polygon.js +16 -0
  136. package/dist/shapes/Polygon.js.map +1 -0
  137. package/dist/shapes/Rect.d.ts +18 -0
  138. package/dist/shapes/Rect.d.ts.map +1 -0
  139. package/dist/shapes/Rect.js +11 -0
  140. package/dist/shapes/Rect.js.map +1 -0
  141. package/dist/shapes/Svg.d.ts +16 -0
  142. package/dist/shapes/Svg.d.ts.map +1 -0
  143. package/dist/shapes/Svg.js +15 -0
  144. package/dist/shapes/Svg.js.map +1 -0
  145. package/dist/shapes/index.d.ts +16 -0
  146. package/dist/shapes/index.d.ts.map +1 -0
  147. package/dist/shapes/index.js +9 -0
  148. package/dist/shapes/index.js.map +1 -0
  149. package/dist/shapes/usePathLength.d.ts +24 -0
  150. package/dist/shapes/usePathLength.d.ts.map +1 -0
  151. package/dist/shapes/usePathLength.js +32 -0
  152. package/dist/shapes/usePathLength.js.map +1 -0
  153. package/dist/staticFile.d.ts +47 -0
  154. package/dist/staticFile.d.ts.map +1 -0
  155. package/dist/staticFile.js +105 -0
  156. package/dist/staticFile.js.map +1 -0
  157. package/dist/templates/api.d.ts +26 -0
  158. package/dist/templates/api.d.ts.map +1 -0
  159. package/dist/templates/api.js +142 -0
  160. package/dist/templates/api.js.map +1 -0
  161. package/dist/templates/index.d.ts +7 -0
  162. package/dist/templates/index.d.ts.map +1 -0
  163. package/dist/templates/index.js +7 -0
  164. package/dist/templates/index.js.map +1 -0
  165. package/dist/templates/mockData.d.ts +7 -0
  166. package/dist/templates/mockData.d.ts.map +1 -0
  167. package/dist/templates/mockData.js +262 -0
  168. package/dist/templates/mockData.js.map +1 -0
  169. package/dist/templates/types.d.ts +104 -0
  170. package/dist/templates/types.d.ts.map +1 -0
  171. package/dist/templates/types.js +16 -0
  172. package/dist/templates/types.js.map +1 -0
  173. package/dist/transitions/TransitionSeries.d.ts +127 -0
  174. package/dist/transitions/TransitionSeries.d.ts.map +1 -0
  175. package/dist/transitions/TransitionSeries.js +190 -0
  176. package/dist/transitions/TransitionSeries.js.map +1 -0
  177. package/dist/transitions/index.d.ts +52 -0
  178. package/dist/transitions/index.d.ts.map +1 -0
  179. package/dist/transitions/index.js +31 -0
  180. package/dist/transitions/index.js.map +1 -0
  181. package/dist/transitions/presets/fade.d.ts +45 -0
  182. package/dist/transitions/presets/fade.d.ts.map +1 -0
  183. package/dist/transitions/presets/fade.js +56 -0
  184. package/dist/transitions/presets/fade.js.map +1 -0
  185. package/dist/transitions/presets/flip.d.ts +99 -0
  186. package/dist/transitions/presets/flip.d.ts.map +1 -0
  187. package/dist/transitions/presets/flip.js +153 -0
  188. package/dist/transitions/presets/flip.js.map +1 -0
  189. package/dist/transitions/presets/slide.d.ts +61 -0
  190. package/dist/transitions/presets/slide.d.ts.map +1 -0
  191. package/dist/transitions/presets/slide.js +116 -0
  192. package/dist/transitions/presets/slide.js.map +1 -0
  193. package/dist/transitions/presets/wipe.d.ts +69 -0
  194. package/dist/transitions/presets/wipe.d.ts.map +1 -0
  195. package/dist/transitions/presets/wipe.js +136 -0
  196. package/dist/transitions/presets/wipe.js.map +1 -0
  197. package/dist/transitions/presets/zoom.d.ts +76 -0
  198. package/dist/transitions/presets/zoom.d.ts.map +1 -0
  199. package/dist/transitions/presets/zoom.js +110 -0
  200. package/dist/transitions/presets/zoom.js.map +1 -0
  201. package/dist/useAudioData.d.ts +112 -0
  202. package/dist/useAudioData.d.ts.map +1 -0
  203. package/dist/useAudioData.js +183 -0
  204. package/dist/useAudioData.js.map +1 -0
  205. package/dist/useSpring.d.ts +79 -0
  206. package/dist/useSpring.d.ts.map +1 -0
  207. package/dist/useSpring.js +140 -0
  208. package/dist/useSpring.js.map +1 -0
  209. 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":"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"}