@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,287 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* makeTransform Utility
|
|
3
|
+
*
|
|
4
|
+
* Build CSS transform strings from an array of transform operations.
|
|
5
|
+
* Helps construct complex transforms in a readable, composable way.
|
|
6
|
+
*
|
|
7
|
+
* Usage:
|
|
8
|
+
* const transform = makeTransform([
|
|
9
|
+
* { translateX: '100px' },
|
|
10
|
+
* { rotate: '45deg' },
|
|
11
|
+
* { scale: 1.5 },
|
|
12
|
+
* ]);
|
|
13
|
+
* // => "translateX(100px) rotate(45deg) scale(1.5)"
|
|
14
|
+
*
|
|
15
|
+
* // Or using the fluent API:
|
|
16
|
+
* const transform = transform()
|
|
17
|
+
* .translateX('100px')
|
|
18
|
+
* .rotate('45deg')
|
|
19
|
+
* .scale(1.5)
|
|
20
|
+
* .toString();
|
|
21
|
+
*/
|
|
22
|
+
/**
|
|
23
|
+
* Supported transform operations with their CSS function names.
|
|
24
|
+
*/
|
|
25
|
+
const transformFunctions = {
|
|
26
|
+
// 2D Transforms
|
|
27
|
+
translateX: 'translateX',
|
|
28
|
+
translateY: 'translateY',
|
|
29
|
+
translate: 'translate',
|
|
30
|
+
scaleX: 'scaleX',
|
|
31
|
+
scaleY: 'scaleY',
|
|
32
|
+
scale: 'scale',
|
|
33
|
+
rotate: 'rotate',
|
|
34
|
+
skewX: 'skewX',
|
|
35
|
+
skewY: 'skewY',
|
|
36
|
+
skew: 'skew',
|
|
37
|
+
// 3D Transforms
|
|
38
|
+
translateZ: 'translateZ',
|
|
39
|
+
translate3d: 'translate3d',
|
|
40
|
+
scaleZ: 'scaleZ',
|
|
41
|
+
scale3d: 'scale3d',
|
|
42
|
+
rotateX: 'rotateX',
|
|
43
|
+
rotateY: 'rotateY',
|
|
44
|
+
rotateZ: 'rotateZ',
|
|
45
|
+
rotate3d: 'rotate3d',
|
|
46
|
+
perspective: 'perspective',
|
|
47
|
+
// Matrix
|
|
48
|
+
matrix: 'matrix',
|
|
49
|
+
matrix3d: 'matrix3d',
|
|
50
|
+
};
|
|
51
|
+
/**
|
|
52
|
+
* Format a value for CSS transform.
|
|
53
|
+
* Numbers are kept as-is for scale, strings are used directly.
|
|
54
|
+
*/
|
|
55
|
+
function formatValue(key, value) {
|
|
56
|
+
// Handle arrays (for translate, scale, rotate3d, etc.)
|
|
57
|
+
if (Array.isArray(value)) {
|
|
58
|
+
return value.join(', ');
|
|
59
|
+
}
|
|
60
|
+
// Handle numbers - add units where needed
|
|
61
|
+
if (typeof value === 'number') {
|
|
62
|
+
// Scale values don't need units
|
|
63
|
+
if (key.startsWith('scale') || key === 'matrix' || key === 'matrix3d') {
|
|
64
|
+
return String(value);
|
|
65
|
+
}
|
|
66
|
+
// Rotation needs deg
|
|
67
|
+
if (key.startsWith('rotate') || key.startsWith('skew')) {
|
|
68
|
+
return `${value}deg`;
|
|
69
|
+
}
|
|
70
|
+
// Translation needs px
|
|
71
|
+
if (key.startsWith('translate') || key === 'perspective') {
|
|
72
|
+
return `${value}px`;
|
|
73
|
+
}
|
|
74
|
+
return String(value);
|
|
75
|
+
}
|
|
76
|
+
return String(value);
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* Convert a transform operation object to CSS string.
|
|
80
|
+
*/
|
|
81
|
+
function operationToString(operation) {
|
|
82
|
+
const entries = Object.entries(operation);
|
|
83
|
+
if (entries.length === 0)
|
|
84
|
+
return '';
|
|
85
|
+
return entries
|
|
86
|
+
.map(([key, value]) => {
|
|
87
|
+
const fnName = transformFunctions[key] || key;
|
|
88
|
+
const formattedValue = formatValue(key, value);
|
|
89
|
+
return `${fnName}(${formattedValue})`;
|
|
90
|
+
})
|
|
91
|
+
.join(' ');
|
|
92
|
+
}
|
|
93
|
+
/**
|
|
94
|
+
* Build a CSS transform string from an array of transform operations.
|
|
95
|
+
*
|
|
96
|
+
* @param {TransformOperation | TransformOperation[]} operations - Array of transform operation objects
|
|
97
|
+
* @returns {string} CSS transform string
|
|
98
|
+
*
|
|
99
|
+
* @example
|
|
100
|
+
* makeTransform([
|
|
101
|
+
* { translateX: 100 },
|
|
102
|
+
* { rotate: 45 },
|
|
103
|
+
* { scale: 1.5 },
|
|
104
|
+
* ])
|
|
105
|
+
* // => "translateX(100px) rotate(45deg) scale(1.5)"
|
|
106
|
+
*/
|
|
107
|
+
export function makeTransform(operations) {
|
|
108
|
+
if (!Array.isArray(operations)) {
|
|
109
|
+
return operationToString(operations);
|
|
110
|
+
}
|
|
111
|
+
return operations
|
|
112
|
+
.map(operationToString)
|
|
113
|
+
.filter(Boolean)
|
|
114
|
+
.join(' ');
|
|
115
|
+
}
|
|
116
|
+
/**
|
|
117
|
+
* Fluent transform builder class.
|
|
118
|
+
*/
|
|
119
|
+
class TransformBuilder {
|
|
120
|
+
operations;
|
|
121
|
+
constructor() {
|
|
122
|
+
this.operations = [];
|
|
123
|
+
}
|
|
124
|
+
// 2D Transforms
|
|
125
|
+
translateX(value) {
|
|
126
|
+
this.operations.push({ translateX: value });
|
|
127
|
+
return this;
|
|
128
|
+
}
|
|
129
|
+
translateY(value) {
|
|
130
|
+
this.operations.push({ translateY: value });
|
|
131
|
+
return this;
|
|
132
|
+
}
|
|
133
|
+
translate(x, y) {
|
|
134
|
+
this.operations.push({ translate: y !== undefined ? [x, y] : x });
|
|
135
|
+
return this;
|
|
136
|
+
}
|
|
137
|
+
scaleX(value) {
|
|
138
|
+
this.operations.push({ scaleX: value });
|
|
139
|
+
return this;
|
|
140
|
+
}
|
|
141
|
+
scaleY(value) {
|
|
142
|
+
this.operations.push({ scaleY: value });
|
|
143
|
+
return this;
|
|
144
|
+
}
|
|
145
|
+
scale(x, y) {
|
|
146
|
+
this.operations.push({ scale: y !== undefined ? [x, y] : x });
|
|
147
|
+
return this;
|
|
148
|
+
}
|
|
149
|
+
rotate(value) {
|
|
150
|
+
this.operations.push({ rotate: value });
|
|
151
|
+
return this;
|
|
152
|
+
}
|
|
153
|
+
skewX(value) {
|
|
154
|
+
this.operations.push({ skewX: value });
|
|
155
|
+
return this;
|
|
156
|
+
}
|
|
157
|
+
skewY(value) {
|
|
158
|
+
this.operations.push({ skewY: value });
|
|
159
|
+
return this;
|
|
160
|
+
}
|
|
161
|
+
skew(x, y) {
|
|
162
|
+
this.operations.push({ skew: y !== undefined ? [x, y] : x });
|
|
163
|
+
return this;
|
|
164
|
+
}
|
|
165
|
+
// 3D Transforms
|
|
166
|
+
translateZ(value) {
|
|
167
|
+
this.operations.push({ translateZ: value });
|
|
168
|
+
return this;
|
|
169
|
+
}
|
|
170
|
+
translate3d(x, y, z) {
|
|
171
|
+
this.operations.push({ translate3d: [x, y, z] });
|
|
172
|
+
return this;
|
|
173
|
+
}
|
|
174
|
+
scaleZ(value) {
|
|
175
|
+
this.operations.push({ scaleZ: value });
|
|
176
|
+
return this;
|
|
177
|
+
}
|
|
178
|
+
scale3d(x, y, z) {
|
|
179
|
+
this.operations.push({ scale3d: [x, y, z] });
|
|
180
|
+
return this;
|
|
181
|
+
}
|
|
182
|
+
rotateX(value) {
|
|
183
|
+
this.operations.push({ rotateX: value });
|
|
184
|
+
return this;
|
|
185
|
+
}
|
|
186
|
+
rotateY(value) {
|
|
187
|
+
this.operations.push({ rotateY: value });
|
|
188
|
+
return this;
|
|
189
|
+
}
|
|
190
|
+
rotateZ(value) {
|
|
191
|
+
this.operations.push({ rotateZ: value });
|
|
192
|
+
return this;
|
|
193
|
+
}
|
|
194
|
+
rotate3d(x, y, z, angle) {
|
|
195
|
+
this.operations.push({ rotate3d: [x, y, z, angle] });
|
|
196
|
+
return this;
|
|
197
|
+
}
|
|
198
|
+
perspective(value) {
|
|
199
|
+
this.operations.push({ perspective: value });
|
|
200
|
+
return this;
|
|
201
|
+
}
|
|
202
|
+
// Matrix
|
|
203
|
+
matrix(...values) {
|
|
204
|
+
this.operations.push({ matrix: values });
|
|
205
|
+
return this;
|
|
206
|
+
}
|
|
207
|
+
matrix3d(...values) {
|
|
208
|
+
this.operations.push({ matrix3d: values });
|
|
209
|
+
return this;
|
|
210
|
+
}
|
|
211
|
+
// Build the transform string
|
|
212
|
+
toString() {
|
|
213
|
+
return makeTransform(this.operations);
|
|
214
|
+
}
|
|
215
|
+
// Get the operations array
|
|
216
|
+
toArray() {
|
|
217
|
+
return [...this.operations];
|
|
218
|
+
}
|
|
219
|
+
// Clear all operations
|
|
220
|
+
clear() {
|
|
221
|
+
this.operations = [];
|
|
222
|
+
return this;
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
/**
|
|
226
|
+
* Create a new transform builder for fluent API usage.
|
|
227
|
+
*
|
|
228
|
+
* @returns {TransformBuilder}
|
|
229
|
+
*
|
|
230
|
+
* @example
|
|
231
|
+
* const transform = transform()
|
|
232
|
+
* .translateX(100)
|
|
233
|
+
* .rotate(45)
|
|
234
|
+
* .scale(1.5)
|
|
235
|
+
* .toString();
|
|
236
|
+
*/
|
|
237
|
+
export function transform() {
|
|
238
|
+
return new TransformBuilder();
|
|
239
|
+
}
|
|
240
|
+
/**
|
|
241
|
+
* Interpolate between two transform strings.
|
|
242
|
+
* Note: This is a simplified version that works best with matching operations.
|
|
243
|
+
*
|
|
244
|
+
* @param {number} progress - Interpolation progress (0-1)
|
|
245
|
+
* @param {TransformOperation[]} fromOps - Starting transform operations
|
|
246
|
+
* @param {TransformOperation[]} toOps - Ending transform operations
|
|
247
|
+
* @returns {string} Interpolated transform string
|
|
248
|
+
*/
|
|
249
|
+
export function interpolateTransform(progress, fromOps, toOps) {
|
|
250
|
+
const result = [];
|
|
251
|
+
const maxLength = Math.max(fromOps.length, toOps.length);
|
|
252
|
+
for (let i = 0; i < maxLength; i++) {
|
|
253
|
+
const fromOp = fromOps[i] || {};
|
|
254
|
+
const toOp = toOps[i] || {};
|
|
255
|
+
const interpolatedOp = {};
|
|
256
|
+
// Get all keys from both operations
|
|
257
|
+
const keys = new Set([...Object.keys(fromOp), ...Object.keys(toOp)]);
|
|
258
|
+
keys.forEach((key) => {
|
|
259
|
+
const fromValue = fromOp[key];
|
|
260
|
+
const toValue = toOp[key];
|
|
261
|
+
if (fromValue === undefined && toValue !== undefined) {
|
|
262
|
+
interpolatedOp[key] = toValue;
|
|
263
|
+
}
|
|
264
|
+
else if (toValue === undefined && fromValue !== undefined) {
|
|
265
|
+
interpolatedOp[key] = fromValue;
|
|
266
|
+
}
|
|
267
|
+
else if (typeof fromValue === 'number' && typeof toValue === 'number') {
|
|
268
|
+
interpolatedOp[key] = fromValue + (toValue - fromValue) * progress;
|
|
269
|
+
}
|
|
270
|
+
else if (Array.isArray(fromValue) && Array.isArray(toValue)) {
|
|
271
|
+
interpolatedOp[key] = fromValue.map((v, idx) => {
|
|
272
|
+
const from = typeof v === 'number' ? v : parseFloat(v) || 0;
|
|
273
|
+
const to = typeof toValue[idx] === 'number' ? toValue[idx] : parseFloat(toValue[idx]) || 0;
|
|
274
|
+
return from + (to - from) * progress;
|
|
275
|
+
});
|
|
276
|
+
}
|
|
277
|
+
else {
|
|
278
|
+
// Can't interpolate, use the target value
|
|
279
|
+
interpolatedOp[key] = progress < 0.5 ? fromValue : toValue;
|
|
280
|
+
}
|
|
281
|
+
});
|
|
282
|
+
result.push(interpolatedOp);
|
|
283
|
+
}
|
|
284
|
+
return makeTransform(result);
|
|
285
|
+
}
|
|
286
|
+
export default makeTransform;
|
|
287
|
+
//# sourceMappingURL=makeTransform.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"makeTransform.js","sourceRoot":"","sources":["../src/makeTransform.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Interface for spring preset configuration values.
|
|
3
|
+
*/
|
|
4
|
+
export interface SpringPreset {
|
|
5
|
+
mass: number;
|
|
6
|
+
stiffness: number;
|
|
7
|
+
damping: number;
|
|
8
|
+
}
|
|
9
|
+
/**
|
|
10
|
+
* Options for the measureSpring function.
|
|
11
|
+
*/
|
|
12
|
+
export interface MeasureSpringOptions {
|
|
13
|
+
/** Frames per second (required) */
|
|
14
|
+
fps: number;
|
|
15
|
+
/** Controls animation speed (lower = faster). Defaults to 1. */
|
|
16
|
+
mass?: number;
|
|
17
|
+
/** Bounciness (higher = more bounce). Defaults to 100. */
|
|
18
|
+
stiffness?: number;
|
|
19
|
+
/** Deceleration (higher = less bounce). Defaults to 10. */
|
|
20
|
+
damping?: number;
|
|
21
|
+
/** How close to final value to consider "settled". Defaults to 0.001. */
|
|
22
|
+
threshold?: number;
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Measures how many frames a spring animation takes to settle.
|
|
26
|
+
*
|
|
27
|
+
* This is useful for:
|
|
28
|
+
* - Determining the duration of a Sequence containing spring animations
|
|
29
|
+
* - Setting Loop durationInFrames to match spring completion
|
|
30
|
+
* - Calculating total video duration with springs
|
|
31
|
+
*
|
|
32
|
+
* Usage:
|
|
33
|
+
* const frames = measureSpring({ fps: 30 });
|
|
34
|
+
* const frames = measureSpring({ fps: 30, mass: 0.5, stiffness: 200 });
|
|
35
|
+
*
|
|
36
|
+
* @param {MeasureSpringOptions} options
|
|
37
|
+
* @param {number} options.fps - Frames per second (required)
|
|
38
|
+
* @param {number} [options.mass=1] - Controls animation speed (lower = faster)
|
|
39
|
+
* @param {number} [options.stiffness=100] - Bounciness (higher = more bounce)
|
|
40
|
+
* @param {number} [options.damping=10] - Deceleration (higher = less bounce)
|
|
41
|
+
* @param {number} [options.threshold=0.001] - How close to final value to consider "settled"
|
|
42
|
+
* @returns {number} Number of frames until the spring settles
|
|
43
|
+
*/
|
|
44
|
+
export declare function measureSpring(options: MeasureSpringOptions): number;
|
|
45
|
+
/**
|
|
46
|
+
* Calculate the natural frequency of a spring.
|
|
47
|
+
*
|
|
48
|
+
* @param {number} stiffness
|
|
49
|
+
* @param {number} mass
|
|
50
|
+
* @returns {number} Natural frequency in radians per second
|
|
51
|
+
*/
|
|
52
|
+
export declare function springNaturalFrequency(stiffness: number, mass: number): number;
|
|
53
|
+
/**
|
|
54
|
+
* Calculate the damping ratio of a spring.
|
|
55
|
+
*
|
|
56
|
+
* - zeta < 1: Underdamped (oscillates)
|
|
57
|
+
* - zeta = 1: Critically damped (fastest without oscillation)
|
|
58
|
+
* - zeta > 1: Overdamped (slow, no oscillation)
|
|
59
|
+
*
|
|
60
|
+
* @param {number} damping
|
|
61
|
+
* @param {number} stiffness
|
|
62
|
+
* @param {number} mass
|
|
63
|
+
* @returns {number} Damping ratio
|
|
64
|
+
*/
|
|
65
|
+
export declare function springDampingRatio(damping: number, stiffness: number, mass: number): number;
|
|
66
|
+
/**
|
|
67
|
+
* Get spring configuration presets.
|
|
68
|
+
*
|
|
69
|
+
* Usage:
|
|
70
|
+
* const config = springPresets.gentle;
|
|
71
|
+
* spring(frame, { ...config, from: 0, to: 100 });
|
|
72
|
+
*/
|
|
73
|
+
export declare const springPresets: Record<string, SpringPreset>;
|
|
74
|
+
export default measureSpring;
|
|
75
|
+
//# sourceMappingURL=measureSpring.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"measureSpring.d.ts","sourceRoot":"","sources":["../src/measureSpring.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED;;GAEG;AACH,MAAM,WAAW,oBAAoB;IACnC,mCAAmC;IACnC,GAAG,EAAE,MAAM,CAAC;IACZ,gEAAgE;IAChE,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,0DAA0D;IAC1D,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,2DAA2D;IAC3D,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,yEAAyE;IACzE,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAgB,aAAa,CAAC,OAAO,EAAE,oBAAoB,GAAG,MAAM,CAkDnE;AAED;;;;;;GAMG;AACH,wBAAgB,sBAAsB,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAE9E;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAE3F;AAED;;;;;;GAMG;AACH,eAAO,MAAM,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE,YAAY,CAkBtD,CAAC;AAEF,eAAe,aAAa,CAAC"}
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Measures how many frames a spring animation takes to settle.
|
|
3
|
+
*
|
|
4
|
+
* This is useful for:
|
|
5
|
+
* - Determining the duration of a Sequence containing spring animations
|
|
6
|
+
* - Setting Loop durationInFrames to match spring completion
|
|
7
|
+
* - Calculating total video duration with springs
|
|
8
|
+
*
|
|
9
|
+
* Usage:
|
|
10
|
+
* const frames = measureSpring({ fps: 30 });
|
|
11
|
+
* const frames = measureSpring({ fps: 30, mass: 0.5, stiffness: 200 });
|
|
12
|
+
*
|
|
13
|
+
* @param {MeasureSpringOptions} options
|
|
14
|
+
* @param {number} options.fps - Frames per second (required)
|
|
15
|
+
* @param {number} [options.mass=1] - Controls animation speed (lower = faster)
|
|
16
|
+
* @param {number} [options.stiffness=100] - Bounciness (higher = more bounce)
|
|
17
|
+
* @param {number} [options.damping=10] - Deceleration (higher = less bounce)
|
|
18
|
+
* @param {number} [options.threshold=0.001] - How close to final value to consider "settled"
|
|
19
|
+
* @returns {number} Number of frames until the spring settles
|
|
20
|
+
*/
|
|
21
|
+
export function measureSpring(options) {
|
|
22
|
+
const { fps, mass = 1, stiffness = 100, damping = 10, threshold = 0.001, } = options;
|
|
23
|
+
if (!fps || fps <= 0) {
|
|
24
|
+
throw new Error('measureSpring requires a positive fps value');
|
|
25
|
+
}
|
|
26
|
+
// Calculate spring physics parameters
|
|
27
|
+
const omega0 = Math.sqrt(stiffness / mass); // Natural frequency
|
|
28
|
+
const zeta = damping / (2 * Math.sqrt(stiffness * mass)); // Damping ratio
|
|
29
|
+
// Maximum time to search (10 seconds should be enough for any reasonable spring)
|
|
30
|
+
const maxTime = 10;
|
|
31
|
+
const maxFrames = Math.ceil(maxTime * fps);
|
|
32
|
+
// Simulate the spring frame by frame
|
|
33
|
+
for (let frame = 1; frame <= maxFrames; frame++) {
|
|
34
|
+
const t = frame / fps;
|
|
35
|
+
let displacement;
|
|
36
|
+
if (zeta < 1) {
|
|
37
|
+
// Underdamped (oscillates)
|
|
38
|
+
const omegaD = omega0 * Math.sqrt(1 - zeta * zeta);
|
|
39
|
+
displacement = Math.exp(-zeta * omega0 * t) *
|
|
40
|
+
(Math.cos(omegaD * t) + (zeta * omega0 / omegaD) * Math.sin(omegaD * t));
|
|
41
|
+
}
|
|
42
|
+
else if (zeta === 1) {
|
|
43
|
+
// Critically damped
|
|
44
|
+
displacement = Math.exp(-omega0 * t) * (1 + omega0 * t);
|
|
45
|
+
}
|
|
46
|
+
else {
|
|
47
|
+
// Overdamped
|
|
48
|
+
const s1 = -omega0 * (zeta - Math.sqrt(zeta * zeta - 1));
|
|
49
|
+
const s2 = -omega0 * (zeta + Math.sqrt(zeta * zeta - 1));
|
|
50
|
+
displacement = (s2 * Math.exp(s1 * t) - s1 * Math.exp(s2 * t)) / (s2 - s1);
|
|
51
|
+
}
|
|
52
|
+
// Check if we've settled (displacement from target is below threshold)
|
|
53
|
+
if (Math.abs(displacement) < threshold) {
|
|
54
|
+
return frame;
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
// If we didn't settle within maxFrames, return maxFrames
|
|
58
|
+
// This shouldn't happen with reasonable spring parameters
|
|
59
|
+
return maxFrames;
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Calculate the natural frequency of a spring.
|
|
63
|
+
*
|
|
64
|
+
* @param {number} stiffness
|
|
65
|
+
* @param {number} mass
|
|
66
|
+
* @returns {number} Natural frequency in radians per second
|
|
67
|
+
*/
|
|
68
|
+
export function springNaturalFrequency(stiffness, mass) {
|
|
69
|
+
return Math.sqrt(stiffness / mass);
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Calculate the damping ratio of a spring.
|
|
73
|
+
*
|
|
74
|
+
* - zeta < 1: Underdamped (oscillates)
|
|
75
|
+
* - zeta = 1: Critically damped (fastest without oscillation)
|
|
76
|
+
* - zeta > 1: Overdamped (slow, no oscillation)
|
|
77
|
+
*
|
|
78
|
+
* @param {number} damping
|
|
79
|
+
* @param {number} stiffness
|
|
80
|
+
* @param {number} mass
|
|
81
|
+
* @returns {number} Damping ratio
|
|
82
|
+
*/
|
|
83
|
+
export function springDampingRatio(damping, stiffness, mass) {
|
|
84
|
+
return damping / (2 * Math.sqrt(stiffness * mass));
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* Get spring configuration presets.
|
|
88
|
+
*
|
|
89
|
+
* Usage:
|
|
90
|
+
* const config = springPresets.gentle;
|
|
91
|
+
* spring(frame, { ...config, from: 0, to: 100 });
|
|
92
|
+
*/
|
|
93
|
+
export const springPresets = {
|
|
94
|
+
// Quick and snappy
|
|
95
|
+
snappy: { mass: 1, stiffness: 400, damping: 30 },
|
|
96
|
+
// Gentle, slow movement
|
|
97
|
+
gentle: { mass: 1, stiffness: 100, damping: 15 },
|
|
98
|
+
// Bouncy, playful
|
|
99
|
+
bouncy: { mass: 1, stiffness: 200, damping: 10 },
|
|
100
|
+
// Stiff, minimal overshoot
|
|
101
|
+
stiff: { mass: 1, stiffness: 300, damping: 25 },
|
|
102
|
+
// Slow, heavy feeling
|
|
103
|
+
slow: { mass: 2, stiffness: 100, damping: 20 },
|
|
104
|
+
// Default (matches Remotion)
|
|
105
|
+
default: { mass: 1, stiffness: 100, damping: 10 },
|
|
106
|
+
};
|
|
107
|
+
export default measureSpring;
|
|
108
|
+
//# sourceMappingURL=measureSpring.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"measureSpring.js","sourceRoot":"","sources":["../src/measureSpring.ts"],"names":[],"mappings":"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"}
|
package/dist/noise.d.ts
ADDED
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Noise Utilities
|
|
3
|
+
*
|
|
4
|
+
* Deterministic noise and random functions for reproducible animations.
|
|
5
|
+
* All functions are pure — same inputs always produce same outputs.
|
|
6
|
+
*/
|
|
7
|
+
/**
|
|
8
|
+
* Options for 2D and 3D Perlin noise functions.
|
|
9
|
+
*/
|
|
10
|
+
interface NoiseOptions {
|
|
11
|
+
/** Seed for the permutation table */
|
|
12
|
+
seed?: number;
|
|
13
|
+
/** Scales the input coordinates */
|
|
14
|
+
frequency?: number;
|
|
15
|
+
/** Scales the output value */
|
|
16
|
+
amplitude?: number;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Options for Fractal Brownian Motion (fBm).
|
|
20
|
+
*/
|
|
21
|
+
interface FbmOptions extends NoiseOptions {
|
|
22
|
+
/** Number of noise layers */
|
|
23
|
+
octaves?: number;
|
|
24
|
+
/** Frequency multiplier per octave */
|
|
25
|
+
lacunarity?: number;
|
|
26
|
+
/** Amplitude multiplier per octave */
|
|
27
|
+
persistence?: number;
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Generate a seeded pseudo-random number between 0 and 1.
|
|
31
|
+
*
|
|
32
|
+
* Uses a hash-based approach for single-call determinism (no state).
|
|
33
|
+
*
|
|
34
|
+
* @param {number} seed - Any number (typically frame number or index)
|
|
35
|
+
* @returns {number} Pseudo-random value in [0, 1)
|
|
36
|
+
*/
|
|
37
|
+
export declare function random(seed: number): number;
|
|
38
|
+
/**
|
|
39
|
+
* Generate a seeded random number within a range.
|
|
40
|
+
*
|
|
41
|
+
* @param {number} seed - Seed value
|
|
42
|
+
* @param {number} min - Minimum value (inclusive)
|
|
43
|
+
* @param {number} max - Maximum value (exclusive)
|
|
44
|
+
* @returns {number} Random value in [min, max)
|
|
45
|
+
*/
|
|
46
|
+
export declare function randomRange(seed: number, min: number, max: number): number;
|
|
47
|
+
/**
|
|
48
|
+
* Generate a seeded random integer within a range.
|
|
49
|
+
*
|
|
50
|
+
* @param {number} seed - Seed value
|
|
51
|
+
* @param {number} min - Minimum value (inclusive)
|
|
52
|
+
* @param {number} max - Maximum value (inclusive)
|
|
53
|
+
* @returns {number} Random integer in [min, max]
|
|
54
|
+
*/
|
|
55
|
+
export declare function randomInt(seed: number, min: number, max: number): number;
|
|
56
|
+
/**
|
|
57
|
+
* 2D Perlin noise.
|
|
58
|
+
*
|
|
59
|
+
* Returns a smooth, continuous noise value for the given coordinates.
|
|
60
|
+
* Same inputs always produce the same output.
|
|
61
|
+
*
|
|
62
|
+
* @param {number} x - X coordinate
|
|
63
|
+
* @param {number} y - Y coordinate
|
|
64
|
+
* @param {object} [options]
|
|
65
|
+
* @param {number} [options.seed=0] - Seed for the permutation table
|
|
66
|
+
* @param {number} [options.frequency=1] - Scales the input coordinates
|
|
67
|
+
* @param {number} [options.amplitude=1] - Scales the output value
|
|
68
|
+
* @returns {number} Noise value in [-amplitude, amplitude]
|
|
69
|
+
*/
|
|
70
|
+
export declare function noise2D(x: number, y: number, options?: NoiseOptions): number;
|
|
71
|
+
/**
|
|
72
|
+
* 3D Perlin noise.
|
|
73
|
+
*
|
|
74
|
+
* Useful for animated noise: use (x, y, frame * speed) as coordinates.
|
|
75
|
+
*
|
|
76
|
+
* @param {number} x - X coordinate
|
|
77
|
+
* @param {number} y - Y coordinate
|
|
78
|
+
* @param {number} z - Z coordinate (often frame * speed)
|
|
79
|
+
* @param {object} [options]
|
|
80
|
+
* @param {number} [options.seed=0] - Seed for the permutation table
|
|
81
|
+
* @param {number} [options.frequency=1] - Scales the input coordinates
|
|
82
|
+
* @param {number} [options.amplitude=1] - Scales the output value
|
|
83
|
+
* @returns {number} Noise value in [-amplitude, amplitude]
|
|
84
|
+
*/
|
|
85
|
+
export declare function noise3D(x: number, y: number, z: number, options?: NoiseOptions): number;
|
|
86
|
+
/**
|
|
87
|
+
* Fractal Brownian Motion (fBm) — layered 2D noise for natural textures.
|
|
88
|
+
*
|
|
89
|
+
* @param {number} x - X coordinate
|
|
90
|
+
* @param {number} y - Y coordinate
|
|
91
|
+
* @param {object} [options]
|
|
92
|
+
* @param {number} [options.seed=0] - Seed
|
|
93
|
+
* @param {number} [options.octaves=4] - Number of noise layers
|
|
94
|
+
* @param {number} [options.frequency=1] - Base frequency
|
|
95
|
+
* @param {number} [options.amplitude=1] - Base amplitude
|
|
96
|
+
* @param {number} [options.lacunarity=2] - Frequency multiplier per octave
|
|
97
|
+
* @param {number} [options.persistence=0.5] - Amplitude multiplier per octave
|
|
98
|
+
* @returns {number} Noise value
|
|
99
|
+
*/
|
|
100
|
+
export declare function fbm2D(x: number, y: number, options?: FbmOptions): number;
|
|
101
|
+
declare const _default: {
|
|
102
|
+
random: typeof random;
|
|
103
|
+
randomRange: typeof randomRange;
|
|
104
|
+
randomInt: typeof randomInt;
|
|
105
|
+
noise2D: typeof noise2D;
|
|
106
|
+
noise3D: typeof noise3D;
|
|
107
|
+
fbm2D: typeof fbm2D;
|
|
108
|
+
};
|
|
109
|
+
export default _default;
|
|
110
|
+
//# sourceMappingURL=noise.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"noise.d.ts","sourceRoot":"","sources":["../src/noise.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH;;GAEG;AACH,UAAU,YAAY;IACpB,qCAAqC;IACrC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,mCAAmC;IACnC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,8BAA8B;IAC9B,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;GAEG;AACH,UAAU,UAAW,SAAQ,YAAY;IACvC,6BAA6B;IAC7B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,sCAAsC;IACtC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,sCAAsC;IACtC,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAQD;;;;;;;GAOG;AACH,wBAAgB,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAM3C;AAED;;;;;;;GAOG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,CAE1E;AAED;;;;;;;GAOG;AACH,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,CAExE;AA6ED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,OAAO,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,OAAO,GAAE,YAAiB,GAAG,MAAM,CAqChF;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,OAAO,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,OAAO,GAAE,YAAiB,GAAG,MAAM,CAiD3F;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,KAAK,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,OAAO,GAAE,UAAe,GAAG,MAAM,CAqB5E;;;;;;;;;AAED,wBAA2E"}
|