@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 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
- // note: this looks really cool
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")
@@ -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>(onListen: (handler: Handler<T>) => UnsubscribeFunc): Emitter<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: (handler: Handler<T>) => UnsubscribeFunc, api: Omit<API, keyof Emitter<T>>): Emitter<T> & API;
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: (handler: Handler<number>) => UnsubscribeFunc, api: Omit<API, keyof RangeProgression>): RangeProgression & API;
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: (handler: Handler<number>) => UnsubscribeFunc): RangeProgression;
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 {};
@@ -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(onListen, api) {
9
+ function createEmitter(listen, api) {
10
10
  const propertyDescriptor = Object.fromEntries(Object.entries({
11
- listen: (handler) => onListen((value) => {
11
+ listen: (handler) => listen((value) => {
12
12
  handler(value);
13
13
  }),
14
- map: (mapFunc) => createEmitter(handler => onListen((value) => {
14
+ map: (mapFunc) => createEmitter(handler => listen((value) => {
15
15
  handler(mapFunc(value));
16
16
  })),
17
- filter: (filterFunc) => createEmitter(handler => onListen((value) => {
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 onListen(filteredHandler);
32
+ return listen(filteredHandler);
33
33
  });
34
34
  },
35
- tap: (cb) => createEmitter(createTapListener(cb, onListen)),
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(onListen, api = {}) {
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 => onListen((progress) => {
49
+ return createProgressEmitter(easer ? (handler => listen((progress) => {
50
50
  handler(easerFunc(progress));
51
- })) : onListen);
51
+ })) : listen);
52
52
  },
53
- tween: (from, to) => createEmitter(handler => onListen(progress => handler((0, tween_1.tweenValue)(from, to, progress)))),
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 => onListen(progress => {
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 => onListen(progress => {
63
+ threshold: (threshold) => createProgressEmitter(handler => listen(progress => {
64
64
  handler(progress >= threshold ? 1 : 0);
65
65
  })),
66
- clamp: (min = 0, max = 1) => createProgressEmitter(handler => onListen(progress => handler((0, utils_1.clamp)(progress, min, max)))),
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 => onListen(progress => {
69
+ return createProgressEmitter(handler => listen(progress => {
70
70
  const out = (progress * repetitions) % 1;
71
71
  handler(out);
72
72
  }));
73
73
  },
74
- tap: (cb) => createProgressEmitter(createTapListener(cb, onListen)),
75
- filter: (filterFunc) => createProgressEmitter(handler => onListen((value) => {
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 onListen((value) => {
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 createEmitter(onListen, Object.create(api, propertyDescriptor));
95
+ return Object.create(api ?? {}, propertyDescriptor);
95
96
  }
96
- function createTapListener(callback, parentOnListen) {
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 = parentOnListen(value => {
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
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@xtia/timeline",
3
- "version": "1.0.3",
3
+ "version": "1.0.4",
4
4
  "repository": {
5
5
  "url": "https://github.com/tiadrop/timeline",
6
6
  "type": "github"