@xtia/timeline 1.0.3 → 1.0.4
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/README.md +2 -1
- package/internal/emitters.d.ts +22 -4
- package/internal/emitters.js +22 -21
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -163,7 +163,8 @@ Tween emitters can interpolate numbers, arrays of numbers, strings, and objects
|
|
|
163
163
|
* Otherwise the `from` string is progressively replaced, left-to-right, with the `to` string
|
|
164
164
|
|
|
165
165
|
```ts
|
|
166
|
-
//
|
|
166
|
+
// tween four values in a CSS string
|
|
167
|
+
// see this live: https://codepen.io/xtaltia/pen/PwZYbKY
|
|
167
168
|
timeline
|
|
168
169
|
.range(0, 2000)
|
|
169
170
|
.ease("elastic")
|
package/internal/emitters.d.ts
CHANGED
|
@@ -1,14 +1,15 @@
|
|
|
1
1
|
import { Easer, easers } from "./easing";
|
|
2
2
|
import { Blendable } from "./tween";
|
|
3
3
|
/** @internal */
|
|
4
|
-
export declare function createEmitter<T>(
|
|
4
|
+
export declare function createEmitter<T>(listen: ListenFunc<T>): Emitter<T>;
|
|
5
5
|
/** @internal */
|
|
6
|
-
export declare function createEmitter<T, API extends object>(onListen:
|
|
6
|
+
export declare function createEmitter<T, API extends object>(onListen: ListenFunc<T>, api: Omit<API, keyof Emitter<T>>): Emitter<T> & API;
|
|
7
7
|
/** @internal */
|
|
8
|
-
export declare function createProgressEmitter<API extends object>(onListen:
|
|
8
|
+
export declare function createProgressEmitter<API extends object>(onListen: ListenFunc<number>, api: Omit<API, keyof RangeProgression>): RangeProgression & API;
|
|
9
9
|
/** @internal */
|
|
10
|
-
export declare function createProgressEmitter(onListen:
|
|
10
|
+
export declare function createProgressEmitter(onListen: ListenFunc<number>): RangeProgression;
|
|
11
11
|
type Handler<T> = (value: T) => void;
|
|
12
|
+
type ListenFunc<T> = (handler: Handler<T>) => UnsubscribeFunc;
|
|
12
13
|
export type UnsubscribeFunc = () => void;
|
|
13
14
|
export interface Emitter<T> {
|
|
14
15
|
/**
|
|
@@ -149,5 +150,22 @@ export interface RangeProgression extends Emitter<number> {
|
|
|
149
150
|
* @returns Listenable: emits non-repeating values
|
|
150
151
|
*/
|
|
151
152
|
noRepeat(): RangeProgression;
|
|
153
|
+
/**
|
|
154
|
+
* Creates a chainable progress emitter that offsets its parent's values by the given delta, wrapping between 0 and 1
|
|
155
|
+
*
|
|
156
|
+
* ```plain
|
|
157
|
+
* 1
|
|
158
|
+
* | /
|
|
159
|
+
* o| /
|
|
160
|
+
* u|/ __ delta=.5
|
|
161
|
+
* t| /
|
|
162
|
+
* | /
|
|
163
|
+
* |___/__
|
|
164
|
+
* 0 in 1
|
|
165
|
+
* ```
|
|
166
|
+
*
|
|
167
|
+
* @param delta
|
|
168
|
+
*/
|
|
169
|
+
offset(delta: number): RangeProgression;
|
|
152
170
|
}
|
|
153
171
|
export {};
|
package/internal/emitters.js
CHANGED
|
@@ -6,15 +6,15 @@ const easing_1 = require("./easing");
|
|
|
6
6
|
const tween_1 = require("./tween");
|
|
7
7
|
const utils_1 = require("./utils");
|
|
8
8
|
/** @internal */
|
|
9
|
-
function createEmitter(
|
|
9
|
+
function createEmitter(listen, api) {
|
|
10
10
|
const propertyDescriptor = Object.fromEntries(Object.entries({
|
|
11
|
-
listen: (handler) =>
|
|
11
|
+
listen: (handler) => listen((value) => {
|
|
12
12
|
handler(value);
|
|
13
13
|
}),
|
|
14
|
-
map: (mapFunc) => createEmitter(handler =>
|
|
14
|
+
map: (mapFunc) => createEmitter(handler => listen((value) => {
|
|
15
15
|
handler(mapFunc(value));
|
|
16
16
|
})),
|
|
17
|
-
filter: (filterFunc) => createEmitter(handler =>
|
|
17
|
+
filter: (filterFunc) => createEmitter(handler => listen((value) => {
|
|
18
18
|
if (filterFunc(value))
|
|
19
19
|
handler(value);
|
|
20
20
|
})),
|
|
@@ -29,10 +29,10 @@ function createEmitter(onListen, api) {
|
|
|
29
29
|
previous = { value };
|
|
30
30
|
}
|
|
31
31
|
};
|
|
32
|
-
return
|
|
32
|
+
return listen(filteredHandler);
|
|
33
33
|
});
|
|
34
34
|
},
|
|
35
|
-
tap: (cb) =>
|
|
35
|
+
tap: (cb) => createTap(cb, createEmitter, listen),
|
|
36
36
|
}).map(([key, value]) => [
|
|
37
37
|
key,
|
|
38
38
|
{ value }
|
|
@@ -40,46 +40,46 @@ function createEmitter(onListen, api) {
|
|
|
40
40
|
return Object.create(api ?? {}, propertyDescriptor);
|
|
41
41
|
}
|
|
42
42
|
/** @internal */
|
|
43
|
-
function createProgressEmitter(
|
|
43
|
+
function createProgressEmitter(listen, api = {}) {
|
|
44
44
|
const propertyDescriptor = Object.fromEntries(Object.entries({
|
|
45
45
|
ease: (easer) => {
|
|
46
46
|
const easerFunc = typeof easer == "string"
|
|
47
47
|
? easing_1.easers[easer]
|
|
48
48
|
: easer;
|
|
49
|
-
return createProgressEmitter(easer ? (handler =>
|
|
49
|
+
return createProgressEmitter(easer ? (handler => listen((progress) => {
|
|
50
50
|
handler(easerFunc(progress));
|
|
51
|
-
})) :
|
|
51
|
+
})) : listen);
|
|
52
52
|
},
|
|
53
|
-
tween: (from, to) => createEmitter(handler =>
|
|
53
|
+
tween: (from, to) => createEmitter(handler => listen(progress => handler((0, tween_1.tweenValue)(from, to, progress)))),
|
|
54
54
|
snap: (steps) => {
|
|
55
55
|
if (!Number.isInteger(steps) || steps <= 0) {
|
|
56
56
|
throw new RangeError('snap(steps) requires a positive integer');
|
|
57
57
|
}
|
|
58
|
-
return createProgressEmitter(handler =>
|
|
58
|
+
return createProgressEmitter(handler => listen(progress => {
|
|
59
59
|
const snapped = Math.round(progress * steps) / steps;
|
|
60
60
|
handler((0, utils_1.clamp)(snapped, 0, 1));
|
|
61
61
|
}));
|
|
62
62
|
},
|
|
63
|
-
threshold: (threshold) => createProgressEmitter(handler =>
|
|
63
|
+
threshold: (threshold) => createProgressEmitter(handler => listen(progress => {
|
|
64
64
|
handler(progress >= threshold ? 1 : 0);
|
|
65
65
|
})),
|
|
66
|
-
clamp: (min = 0, max = 1) => createProgressEmitter(handler =>
|
|
66
|
+
clamp: (min = 0, max = 1) => createProgressEmitter(handler => listen(progress => handler((0, utils_1.clamp)(progress, min, max)))),
|
|
67
67
|
repeat: (repetitions) => {
|
|
68
68
|
repetitions = Math.max(0, repetitions);
|
|
69
|
-
return createProgressEmitter(handler =>
|
|
69
|
+
return createProgressEmitter(handler => listen(progress => {
|
|
70
70
|
const out = (progress * repetitions) % 1;
|
|
71
71
|
handler(out);
|
|
72
72
|
}));
|
|
73
73
|
},
|
|
74
|
-
tap: (cb) =>
|
|
75
|
-
filter: (filterFunc) => createProgressEmitter(handler =>
|
|
74
|
+
tap: (cb) => createTap(cb, createProgressEmitter, listen),
|
|
75
|
+
filter: (filterFunc) => createProgressEmitter(handler => listen((value) => {
|
|
76
76
|
if (filterFunc(value))
|
|
77
77
|
handler(value);
|
|
78
78
|
})),
|
|
79
79
|
noRepeat: () => {
|
|
80
80
|
let previous = null;
|
|
81
81
|
return createProgressEmitter(handler => {
|
|
82
|
-
return
|
|
82
|
+
return listen((value) => {
|
|
83
83
|
if (!previous || (previous.value !== value)) {
|
|
84
84
|
handler(value);
|
|
85
85
|
previous = { value };
|
|
@@ -87,19 +87,20 @@ function createProgressEmitter(onListen, api = {}) {
|
|
|
87
87
|
});
|
|
88
88
|
});
|
|
89
89
|
},
|
|
90
|
+
offset: (delta) => createProgressEmitter(handler => listen(value => handler((value + delta) % 1))),
|
|
90
91
|
}).map(([key, value]) => [
|
|
91
92
|
key,
|
|
92
93
|
{ value }
|
|
93
94
|
]));
|
|
94
|
-
return
|
|
95
|
+
return Object.create(api ?? {}, propertyDescriptor);
|
|
95
96
|
}
|
|
96
|
-
function
|
|
97
|
+
function createTap(callback, create, parentListen) {
|
|
97
98
|
const listeners = [];
|
|
98
99
|
let parentUnsubscribe = null;
|
|
99
100
|
const tapOnListen = (handler) => {
|
|
100
101
|
listeners.push(handler);
|
|
101
102
|
if (listeners.length === 1) {
|
|
102
|
-
parentUnsubscribe =
|
|
103
|
+
parentUnsubscribe = parentListen(value => {
|
|
103
104
|
callback(value);
|
|
104
105
|
listeners.slice().forEach(fn => fn(value));
|
|
105
106
|
});
|
|
@@ -113,5 +114,5 @@ function createTapListener(callback, parentOnListen) {
|
|
|
113
114
|
}
|
|
114
115
|
};
|
|
115
116
|
};
|
|
116
|
-
return tapOnListen;
|
|
117
|
+
return create(tapOnListen);
|
|
117
118
|
}
|