@studiometa/js-toolkit 2.2.1 → 2.3.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 (131) hide show
  1. package/Base/index.cjs +60 -69
  2. package/Base/index.d.ts +0 -8
  3. package/Base/index.js +67 -82
  4. package/Base/managers/AbstractManager.cjs +5 -10
  5. package/Base/managers/AbstractManager.js +5 -11
  6. package/Base/managers/ChildrenManager.cjs +2 -11
  7. package/Base/managers/ChildrenManager.js +2 -12
  8. package/Base/managers/EventsManager.cjs +61 -67
  9. package/Base/managers/EventsManager.js +61 -68
  10. package/Base/managers/OptionsManager.cjs +26 -27
  11. package/Base/managers/OptionsManager.js +26 -28
  12. package/Base/managers/RefsManager.cjs +9 -7
  13. package/Base/managers/RefsManager.js +9 -7
  14. package/Base/managers/ResponsiveOptionsManager.cjs +4 -1
  15. package/Base/managers/ResponsiveOptionsManager.js +4 -1
  16. package/Base/managers/ServicesManager.cjs +10 -16
  17. package/Base/managers/ServicesManager.js +10 -17
  18. package/Base/utils.cjs +22 -4
  19. package/Base/utils.d.ts +25 -8
  20. package/Base/utils.js +22 -4
  21. package/decorators/withBreakpointManager.cjs +15 -5
  22. package/decorators/withBreakpointManager.js +15 -5
  23. package/decorators/withBreakpointObserver.cjs +19 -18
  24. package/decorators/withBreakpointObserver.js +19 -19
  25. package/decorators/withDrag.cjs +6 -11
  26. package/decorators/withDrag.js +6 -12
  27. package/decorators/withExtraConfig.cjs +3 -8
  28. package/decorators/withExtraConfig.js +3 -9
  29. package/decorators/withFreezedOptions.cjs +1 -9
  30. package/decorators/withFreezedOptions.js +1 -10
  31. package/decorators/withIntersectionObserver.cjs +11 -16
  32. package/decorators/withIntersectionObserver.js +11 -17
  33. package/decorators/withMountWhenInView.cjs +12 -17
  34. package/decorators/withMountWhenInView.js +12 -18
  35. package/decorators/withScrolledInView.cjs +30 -35
  36. package/decorators/withScrolledInView.js +30 -36
  37. package/decorators/withVue2.cjs +20 -18
  38. package/decorators/withVue2.js +20 -19
  39. package/helpers/getInstanceFromElement.cjs +1 -2
  40. package/helpers/getInstanceFromElement.js +1 -2
  41. package/helpers/importOnInteraction.cjs +3 -2
  42. package/helpers/importOnInteraction.js +3 -2
  43. package/helpers/importWhenIdle.cjs +2 -3
  44. package/helpers/importWhenIdle.js +2 -3
  45. package/helpers/importWhenVisible.cjs +3 -2
  46. package/helpers/importWhenVisible.js +3 -2
  47. package/helpers/utils.cjs +3 -2
  48. package/helpers/utils.js +3 -2
  49. package/package.json +4 -1
  50. package/services/drag.cjs +126 -148
  51. package/services/drag.d.ts +10 -10
  52. package/services/drag.js +125 -148
  53. package/services/index.cjs +3 -1
  54. package/services/index.d.ts +1 -0
  55. package/services/index.js +3 -1
  56. package/services/key.cjs +48 -63
  57. package/services/key.d.ts +0 -8
  58. package/services/key.js +47 -63
  59. package/services/load.cjs +24 -40
  60. package/services/load.d.ts +0 -8
  61. package/services/load.js +23 -37
  62. package/services/pointer.cjs +72 -103
  63. package/services/pointer.d.ts +1 -9
  64. package/services/pointer.js +71 -100
  65. package/services/raf.cjs +38 -58
  66. package/services/raf.d.ts +0 -8
  67. package/services/raf.js +37 -55
  68. package/services/resize.cjs +59 -68
  69. package/services/resize.d.ts +0 -7
  70. package/services/resize.js +58 -68
  71. package/services/scroll.cjs +49 -71
  72. package/services/scroll.js +48 -71
  73. package/services/service.cjs +68 -0
  74. package/services/service.d.ts +18 -0
  75. package/services/service.js +46 -0
  76. package/utils/css/animate.cjs +33 -102
  77. package/utils/css/animate.d.ts +4 -13
  78. package/utils/css/animate.js +31 -100
  79. package/utils/css/classes.cjs +2 -1
  80. package/utils/css/classes.js +2 -1
  81. package/utils/css/matrix.cjs +1 -2
  82. package/utils/css/matrix.js +1 -2
  83. package/utils/css/styles.cjs +2 -5
  84. package/utils/css/styles.js +1 -1
  85. package/utils/css/transform.cjs +14 -18
  86. package/utils/css/transform.js +2 -3
  87. package/utils/css/transition.cjs +7 -10
  88. package/utils/css/transition.js +7 -11
  89. package/utils/focusTrap.cjs +2 -1
  90. package/utils/focusTrap.js +2 -1
  91. package/utils/{isFunction.cjs → has.cjs} +7 -7
  92. package/utils/has.d.ts +6 -0
  93. package/utils/has.js +6 -0
  94. package/utils/history.cjs +5 -7
  95. package/utils/history.js +4 -3
  96. package/utils/index.cjs +6 -5
  97. package/utils/index.d.ts +4 -2
  98. package/utils/index.js +6 -5
  99. package/utils/{object/isObject.cjs → is.cjs} +20 -8
  100. package/utils/is.d.ts +8 -0
  101. package/utils/is.js +18 -0
  102. package/utils/math/inertiaFinalValue.cjs +5 -3
  103. package/utils/math/inertiaFinalValue.js +2 -3
  104. package/utils/nextFrame.cjs +5 -3
  105. package/utils/nextFrame.js +5 -3
  106. package/utils/nextMicrotask.cjs +2 -1
  107. package/utils/nextMicrotask.js +2 -1
  108. package/utils/nextTick.cjs +2 -1
  109. package/utils/nextTick.js +2 -1
  110. package/utils/{isDefined.cjs → noop.cjs} +10 -7
  111. package/utils/noop.d.ts +12 -0
  112. package/utils/noop.js +9 -0
  113. package/utils/object/autoBind.cjs +3 -2
  114. package/utils/object/autoBind.js +3 -2
  115. package/utils/object/getAllProperties.cjs +2 -1
  116. package/utils/object/getAllProperties.js +2 -1
  117. package/utils/object/index.cjs +1 -3
  118. package/utils/object/index.d.ts +0 -1
  119. package/utils/object/index.js +1 -3
  120. package/utils/tween.cjs +113 -0
  121. package/utils/tween.d.ts +25 -0
  122. package/utils/tween.js +88 -0
  123. package/services/Service.cjs +0 -76
  124. package/services/Service.d.ts +0 -76
  125. package/services/Service.js +0 -55
  126. package/utils/isDefined.d.ts +0 -7
  127. package/utils/isDefined.js +0 -6
  128. package/utils/isFunction.d.ts +0 -7
  129. package/utils/isFunction.js +0 -6
  130. package/utils/object/isObject.d.ts +0 -7
  131. package/utils/object/isObject.js +0 -6
@@ -4,7 +4,6 @@ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
4
  var __getOwnPropNames = Object.getOwnPropertyNames;
5
5
  var __getProtoOf = Object.getPrototypeOf;
6
6
  var __hasOwnProp = Object.prototype.hasOwnProperty;
7
- var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
8
7
  var __export = (target, all) => {
9
8
  for (var name in all)
10
9
  __defProp(target, name, { get: all[name], enumerable: true });
@@ -19,10 +18,6 @@ var __copyProps = (to, from, except, desc) => {
19
18
  };
20
19
  var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, mod));
21
20
  var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
22
- var __publicField = (obj, key, value) => {
23
- __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
24
- return value;
25
- };
26
21
 
27
22
  // packages/js-toolkit/services/scroll.js
28
23
  var scroll_exports = {};
@@ -30,12 +25,41 @@ __export(scroll_exports, {
30
25
  default: () => useScroll
31
26
  });
32
27
  module.exports = __toCommonJS(scroll_exports);
33
- var import_Service = __toESM(require("./Service.cjs"), 1);
28
+ var import_service = require("./service.cjs");
34
29
  var import_debounce = __toESM(require("../utils/debounce.cjs"), 1);
35
- var Scroll = class extends import_Service.default {
36
- constructor() {
37
- super(...arguments);
38
- __publicField(this, "props", {
30
+ function createScrollService() {
31
+ function updateProps() {
32
+ const yLast = props.y;
33
+ const xLast = props.x;
34
+ if (window.pageYOffset !== props.y) {
35
+ props.y = window.pageYOffset;
36
+ }
37
+ if (window.pageXOffset !== props.x) {
38
+ props.x = window.pageXOffset;
39
+ }
40
+ props.changed.x = props.x !== xLast;
41
+ props.changed.y = props.y !== yLast;
42
+ props.last.x = xLast;
43
+ props.last.y = yLast;
44
+ props.delta.x = props.x - xLast;
45
+ props.delta.y = props.y - yLast;
46
+ props.max.x = (document.scrollingElement || document.body).scrollWidth - window.innerWidth;
47
+ props.max.y = (document.scrollingElement || document.body).scrollHeight - window.innerHeight;
48
+ props.progress.x = props.max.x === 0 ? 1 : props.x / props.max.x;
49
+ props.progress.y = props.max.y === 0 ? 1 : props.y / props.max.y;
50
+ props.direction.x = props.x > xLast ? "RIGHT" : props.x < xLast ? "LEFT" : "NONE";
51
+ props.direction.y = props.y > yLast ? "DOWN" : props.y < yLast ? "UP" : "NONE";
52
+ return props;
53
+ }
54
+ const onScrollDebounced = (0, import_debounce.default)(() => {
55
+ trigger(updateProps());
56
+ }, 100);
57
+ function onScroll() {
58
+ trigger(updateProps());
59
+ onScrollDebounced();
60
+ }
61
+ const { add, remove, has, props, trigger } = (0, import_service.useService)({
62
+ props: {
39
63
  x: window.pageXOffset,
40
64
  y: window.pageYOffset,
41
65
  changed: {
@@ -62,71 +86,25 @@ var Scroll = class extends import_Service.default {
62
86
  x: "NONE",
63
87
  y: "NONE"
64
88
  }
65
- });
66
- }
67
- init() {
68
- this.updateProps();
69
- document.addEventListener("scroll", this, { passive: true, capture: true });
70
- return this;
71
- }
72
- get debouncedHandler() {
73
- const debounced = (0, import_debounce.default)(() => {
74
- this.updateProps();
75
- this.trigger(this.props);
76
- }, 100);
77
- Object.defineProperty(this, "debouncedHandler", {
78
- value: debounced
79
- });
80
- return debounced;
81
- }
82
- handleEvent() {
83
- this.updateProps();
84
- this.trigger(this.props);
85
- this.debouncedHandler();
86
- }
87
- kill() {
88
- document.removeEventListener("scroll", this);
89
- return this;
90
- }
91
- updateProps() {
92
- const yLast = this.props.y;
93
- const xLast = this.props.x;
94
- if (window.pageYOffset !== this.props.y) {
95
- this.props.y = window.pageYOffset;
89
+ },
90
+ init() {
91
+ document.addEventListener("scroll", onScroll, { passive: true, capture: true });
92
+ },
93
+ kill() {
94
+ document.removeEventListener("scroll", onScroll);
96
95
  }
97
- if (window.pageXOffset !== this.props.x) {
98
- this.props.x = window.pageXOffset;
99
- }
100
- this.props.changed.x = this.props.x !== xLast;
101
- this.props.changed.y = this.props.y !== yLast;
102
- this.props.last.x = xLast;
103
- this.props.last.y = yLast;
104
- this.props.delta.x = this.props.x - xLast;
105
- this.props.delta.y = this.props.y - yLast;
106
- this.props.max.x = (document.scrollingElement || document.body).scrollWidth - window.innerWidth;
107
- this.props.max.y = (document.scrollingElement || document.body).scrollHeight - window.innerHeight;
108
- this.props.progress.x = this.props.max.x === 0 ? 1 : this.props.x / this.props.max.x;
109
- this.props.progress.y = this.props.max.y === 0 ? 1 : this.props.y / this.props.max.y;
110
- this.props.direction.x = this.props.x > xLast ? "RIGHT" : this.props.x < xLast ? "LEFT" : "NONE";
111
- this.props.direction.y = this.props.y > yLast ? "DOWN" : this.props.y < yLast ? "UP" : "NONE";
112
- return this.props;
113
- }
114
- };
115
- var instance;
96
+ });
97
+ return {
98
+ add,
99
+ remove,
100
+ has,
101
+ props: () => props
102
+ };
103
+ }
116
104
  var scroll;
117
105
  function useScroll() {
118
106
  if (!scroll) {
119
- if (!instance) {
120
- instance = new Scroll();
121
- }
122
- scroll = {
123
- add: instance.add.bind(instance),
124
- remove: instance.remove.bind(instance),
125
- has: instance.has.bind(instance),
126
- props() {
127
- return instance.props;
128
- }
129
- };
107
+ scroll = createScrollService();
130
108
  }
131
109
  return scroll;
132
110
  }
@@ -1,15 +1,38 @@
1
- var __defProp = Object.defineProperty;
2
- var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
3
- var __publicField = (obj, key, value) => {
4
- __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
5
- return value;
6
- };
7
- import Service from "./Service.js";
1
+ import { useService } from "./service.js";
8
2
  import debounce from "../utils/debounce.js";
9
- class Scroll extends Service {
10
- constructor() {
11
- super(...arguments);
12
- __publicField(this, "props", {
3
+ function createScrollService() {
4
+ function updateProps() {
5
+ const yLast = props.y;
6
+ const xLast = props.x;
7
+ if (window.pageYOffset !== props.y) {
8
+ props.y = window.pageYOffset;
9
+ }
10
+ if (window.pageXOffset !== props.x) {
11
+ props.x = window.pageXOffset;
12
+ }
13
+ props.changed.x = props.x !== xLast;
14
+ props.changed.y = props.y !== yLast;
15
+ props.last.x = xLast;
16
+ props.last.y = yLast;
17
+ props.delta.x = props.x - xLast;
18
+ props.delta.y = props.y - yLast;
19
+ props.max.x = (document.scrollingElement || document.body).scrollWidth - window.innerWidth;
20
+ props.max.y = (document.scrollingElement || document.body).scrollHeight - window.innerHeight;
21
+ props.progress.x = props.max.x === 0 ? 1 : props.x / props.max.x;
22
+ props.progress.y = props.max.y === 0 ? 1 : props.y / props.max.y;
23
+ props.direction.x = props.x > xLast ? "RIGHT" : props.x < xLast ? "LEFT" : "NONE";
24
+ props.direction.y = props.y > yLast ? "DOWN" : props.y < yLast ? "UP" : "NONE";
25
+ return props;
26
+ }
27
+ const onScrollDebounced = debounce(() => {
28
+ trigger(updateProps());
29
+ }, 100);
30
+ function onScroll() {
31
+ trigger(updateProps());
32
+ onScrollDebounced();
33
+ }
34
+ const { add, remove, has, props, trigger } = useService({
35
+ props: {
13
36
  x: window.pageXOffset,
14
37
  y: window.pageYOffset,
15
38
  changed: {
@@ -36,71 +59,25 @@ class Scroll extends Service {
36
59
  x: "NONE",
37
60
  y: "NONE"
38
61
  }
39
- });
40
- }
41
- init() {
42
- this.updateProps();
43
- document.addEventListener("scroll", this, { passive: true, capture: true });
44
- return this;
45
- }
46
- get debouncedHandler() {
47
- const debounced = debounce(() => {
48
- this.updateProps();
49
- this.trigger(this.props);
50
- }, 100);
51
- Object.defineProperty(this, "debouncedHandler", {
52
- value: debounced
53
- });
54
- return debounced;
55
- }
56
- handleEvent() {
57
- this.updateProps();
58
- this.trigger(this.props);
59
- this.debouncedHandler();
60
- }
61
- kill() {
62
- document.removeEventListener("scroll", this);
63
- return this;
64
- }
65
- updateProps() {
66
- const yLast = this.props.y;
67
- const xLast = this.props.x;
68
- if (window.pageYOffset !== this.props.y) {
69
- this.props.y = window.pageYOffset;
70
- }
71
- if (window.pageXOffset !== this.props.x) {
72
- this.props.x = window.pageXOffset;
62
+ },
63
+ init() {
64
+ document.addEventListener("scroll", onScroll, { passive: true, capture: true });
65
+ },
66
+ kill() {
67
+ document.removeEventListener("scroll", onScroll);
73
68
  }
74
- this.props.changed.x = this.props.x !== xLast;
75
- this.props.changed.y = this.props.y !== yLast;
76
- this.props.last.x = xLast;
77
- this.props.last.y = yLast;
78
- this.props.delta.x = this.props.x - xLast;
79
- this.props.delta.y = this.props.y - yLast;
80
- this.props.max.x = (document.scrollingElement || document.body).scrollWidth - window.innerWidth;
81
- this.props.max.y = (document.scrollingElement || document.body).scrollHeight - window.innerHeight;
82
- this.props.progress.x = this.props.max.x === 0 ? 1 : this.props.x / this.props.max.x;
83
- this.props.progress.y = this.props.max.y === 0 ? 1 : this.props.y / this.props.max.y;
84
- this.props.direction.x = this.props.x > xLast ? "RIGHT" : this.props.x < xLast ? "LEFT" : "NONE";
85
- this.props.direction.y = this.props.y > yLast ? "DOWN" : this.props.y < yLast ? "UP" : "NONE";
86
- return this.props;
87
- }
69
+ });
70
+ return {
71
+ add,
72
+ remove,
73
+ has,
74
+ props: () => props
75
+ };
88
76
  }
89
- let instance;
90
77
  let scroll;
91
78
  function useScroll() {
92
79
  if (!scroll) {
93
- if (!instance) {
94
- instance = new Scroll();
95
- }
96
- scroll = {
97
- add: instance.add.bind(instance),
98
- remove: instance.remove.bind(instance),
99
- has: instance.has.bind(instance),
100
- props() {
101
- return instance.props;
102
- }
103
- };
80
+ scroll = createScrollService();
104
81
  }
105
82
  return scroll;
106
83
  }
@@ -0,0 +1,68 @@
1
+ var __defProp = Object.defineProperty;
2
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
3
+ var __getOwnPropNames = Object.getOwnPropertyNames;
4
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
5
+ var __export = (target, all) => {
6
+ for (var name in all)
7
+ __defProp(target, name, { get: all[name], enumerable: true });
8
+ };
9
+ var __copyProps = (to, from, except, desc) => {
10
+ if (from && typeof from === "object" || typeof from === "function") {
11
+ for (let key of __getOwnPropNames(from))
12
+ if (!__hasOwnProp.call(to, key) && key !== except)
13
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
14
+ }
15
+ return to;
16
+ };
17
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
18
+
19
+ // packages/js-toolkit/services/service.js
20
+ var service_exports = {};
21
+ __export(service_exports, {
22
+ useService: () => useService
23
+ });
24
+ module.exports = __toCommonJS(service_exports);
25
+ function useService(options) {
26
+ const callbacks = /* @__PURE__ */ new Map();
27
+ let isInit = false;
28
+ const { init, kill, props } = options;
29
+ function has(key) {
30
+ return callbacks.has(key);
31
+ }
32
+ function get(key) {
33
+ return callbacks.get(key);
34
+ }
35
+ function add(key, callback) {
36
+ if (has(key)) {
37
+ console.warn(`The key \`${key}\` has already been added.`);
38
+ return;
39
+ }
40
+ if (callbacks.size === 0 && !isInit) {
41
+ init();
42
+ isInit = true;
43
+ }
44
+ callbacks.set(key, callback);
45
+ }
46
+ function remove(key) {
47
+ callbacks.delete(key);
48
+ if (callbacks.size === 0 && isInit) {
49
+ kill();
50
+ isInit = false;
51
+ }
52
+ }
53
+ function trigger(p) {
54
+ callbacks.forEach(function forEachCallback(callback) {
55
+ callback(p);
56
+ });
57
+ }
58
+ return {
59
+ callbacks,
60
+ props,
61
+ add,
62
+ remove,
63
+ has,
64
+ get,
65
+ trigger
66
+ };
67
+ }
68
+ if (module.exports.default) module.exports = module.exports.default;
@@ -0,0 +1,18 @@
1
+ /**
2
+ * Use a service.
3
+ * @template {Record<string, any>} T
4
+ * @param {{ init: () => void, kill: () => void, props: T }} options
5
+ */
6
+ export function useService<T extends Record<string, any>>(options: {
7
+ init: () => void;
8
+ kill: () => void;
9
+ props: T;
10
+ }): {
11
+ callbacks: Map<string, (props: T) => any>;
12
+ props: T;
13
+ add: (key: string, callback: (props: T) => any) => void;
14
+ remove: (key: string) => void;
15
+ has: (key: string) => boolean;
16
+ get: (key: string) => (props: T) => any;
17
+ trigger: (p: T) => void;
18
+ };
@@ -0,0 +1,46 @@
1
+ function useService(options) {
2
+ const callbacks = /* @__PURE__ */ new Map();
3
+ let isInit = false;
4
+ const { init, kill, props } = options;
5
+ function has(key) {
6
+ return callbacks.has(key);
7
+ }
8
+ function get(key) {
9
+ return callbacks.get(key);
10
+ }
11
+ function add(key, callback) {
12
+ if (has(key)) {
13
+ console.warn(`The key \`${key}\` has already been added.`);
14
+ return;
15
+ }
16
+ if (callbacks.size === 0 && !isInit) {
17
+ init();
18
+ isInit = true;
19
+ }
20
+ callbacks.set(key, callback);
21
+ }
22
+ function remove(key) {
23
+ callbacks.delete(key);
24
+ if (callbacks.size === 0 && isInit) {
25
+ kill();
26
+ isInit = false;
27
+ }
28
+ }
29
+ function trigger(p) {
30
+ callbacks.forEach(function forEachCallback(callback) {
31
+ callback(p);
32
+ });
33
+ }
34
+ return {
35
+ callbacks,
36
+ props,
37
+ add,
38
+ remove,
39
+ has,
40
+ get,
41
+ trigger
42
+ };
43
+ }
44
+ export {
45
+ useService
46
+ };
@@ -25,18 +25,13 @@ __export(animate_exports, {
25
25
  animate: () => animate
26
26
  });
27
27
  module.exports = __toCommonJS(animate_exports);
28
- var import_easing = require("@motionone/easing");
29
28
  var import_math = require("../math/index.cjs");
30
- var import_isDefined = __toESM(require("../isDefined.cjs"), 1);
29
+ var import_is = require("../is.cjs");
31
30
  var import_transform = __toESM(require("./transform.cjs"), 1);
32
- var import_raf = __toESM(require("../../services/raf.cjs"), 1);
33
31
  var import_scheduler = require("../scheduler.cjs");
32
+ var import_tween = require("../tween.cjs");
34
33
  var id = 0;
35
34
  var running = /* @__PURE__ */ new WeakMap();
36
- var raf = (0, import_raf.default)();
37
- var noop = () => {
38
- };
39
- var PROGRESS_PRECISION = 1e-4;
40
35
  var CSSUnitConverter = {
41
36
  "%": (value, getSizeRef) => value * getSizeRef() / 100,
42
37
  vh: (value) => value * window.innerHeight / 100,
@@ -45,7 +40,7 @@ var CSSUnitConverter = {
45
40
  vmax: (value) => value * Math.max(window.innerWidth, window.innerHeight) / 100
46
41
  };
47
42
  function getAnimationStepValue(val, getSizeRef) {
48
- if (typeof val === "number") {
43
+ if ((0, import_is.isNumber)(val)) {
49
44
  return val;
50
45
  }
51
46
  if (!val[1] || !CSSUnitConverter[val[1]]) {
@@ -53,22 +48,10 @@ function getAnimationStepValue(val, getSizeRef) {
53
48
  }
54
49
  return CSSUnitConverter[val[1]](val[0], getSizeRef);
55
50
  }
56
- function linear(value) {
57
- return value;
58
- }
59
- function normalizeEase(ease) {
60
- if (!(0, import_isDefined.default)(ease)) {
61
- return linear;
62
- }
63
- if (Array.isArray(ease)) {
64
- return (0, import_easing.cubicBezier)(...ease);
65
- }
66
- return ease;
67
- }
68
- var generateTranslateRenderStrategy = (sizeRef) => (element, fromValue, toValue, progress) => (0, import_math.lerp)(getAnimationStepValue(fromValue != null ? fromValue : 0, () => element[sizeRef]), getAnimationStepValue(toValue != null ? toValue : 0, () => element[sizeRef]), progress);
51
+ var generateTranslateRenderStrategy = (sizeRef) => (element, fromValue, toValue, progress) => (0, import_math.lerp)(getAnimationStepValue(fromValue ?? 0, () => element[sizeRef]), getAnimationStepValue(toValue ?? 0, () => element[sizeRef]), progress);
69
52
  var widthBasedTranslateRenderStrategy = generateTranslateRenderStrategy("offsetWidth");
70
53
  var heightBasedTranslateRenderStrategy = generateTranslateRenderStrategy("offsetHeight");
71
- var generateLerpRenderStrategy = (defaultValue) => (element, fromValue, toValue, progress) => (0, import_math.lerp)(fromValue != null ? fromValue : defaultValue, toValue != null ? toValue : defaultValue, progress);
54
+ var generateLerpRenderStrategy = (defaultValue) => (element, fromValue, toValue, progress) => (0, import_math.lerp)(fromValue ?? defaultValue, toValue ?? defaultValue, progress);
72
55
  var scaleRenderStrategy = generateLerpRenderStrategy(1);
73
56
  var degreesRenderStrategy = generateLerpRenderStrategy(0);
74
57
  var transformRenderStrategies = {
@@ -90,20 +73,19 @@ var transformRenderStrategies = {
90
73
  function render(element, from, to, progress) {
91
74
  const stepProgress = to.easing((0, import_math.map)(progress, from.offset, to.offset, 0, 1));
92
75
  import_scheduler.domScheduler.read(function renderRead() {
93
- var _a, _b;
94
76
  let opacity = false;
95
- if ((0, import_isDefined.default)(from.opacity) || (0, import_isDefined.default)(to.opacity)) {
96
- opacity = (0, import_math.map)(stepProgress, 0, 1, (_a = from.opacity) != null ? _a : 1, (_b = to.opacity) != null ? _b : 1);
77
+ if ((0, import_is.isDefined)(from.opacity) || (0, import_is.isDefined)(to.opacity)) {
78
+ opacity = (0, import_math.map)(stepProgress, 0, 1, from.opacity ?? 1, to.opacity ?? 1);
97
79
  } else if (element.style.opacity) {
98
80
  opacity = "";
99
81
  }
100
82
  let transformOrigin = false;
101
- if ((0, import_isDefined.default)(to.transformOrigin)) {
83
+ if ((0, import_is.isDefined)(to.transformOrigin)) {
102
84
  transformOrigin = to.transformOrigin;
103
85
  } else if (element.style.transformOrigin) {
104
86
  transformOrigin = "";
105
87
  }
106
- const props = Object.fromEntries(import_transform.TRANSFORM_PROPS.filter((name) => (0, import_isDefined.default)(from[name]) || (0, import_isDefined.default)(to[name])).map((name) => {
88
+ const props = Object.fromEntries(import_transform.TRANSFORM_PROPS.filter((name) => (0, import_is.isDefined)(from[name]) || (0, import_is.isDefined)(to[name])).map((name) => {
107
89
  return [name, transformRenderStrategies[name](element, from[name], to[name], stepProgress)];
108
90
  }));
109
91
  import_scheduler.domScheduler.write(function renderWrite() {
@@ -118,90 +100,39 @@ function render(element, from, to, progress) {
118
100
  });
119
101
  }
120
102
  function animate(element, keyframes, options = {}) {
121
- var _a;
122
- let progressValue = 0;
123
- let easedProgress = 0;
103
+ const keyframesCount = keyframes.length - 1;
104
+ const normalizedKeyframes = keyframes.map((keyframe, index) => ({
105
+ ...keyframe,
106
+ offset: keyframe.offset ?? index / keyframesCount,
107
+ easing: (0, import_tween.normalizeEase)(keyframe.easing)
108
+ }));
124
109
  if (!running.has(element)) {
125
110
  running.set(element, /* @__PURE__ */ new Map());
126
111
  }
127
- const ease = normalizeEase(options.easing);
128
- let duration = (_a = options.duration) != null ? _a : 1;
129
- duration *= 1e3;
130
- let startTime = performance.now();
131
- let endTime = startTime + duration;
132
112
  const key = `animate-${id}`;
133
113
  id += 1;
134
- const { onProgress = noop, onFinish = noop } = options;
135
- let isRunning = false;
136
- const keyframesCount = keyframes.length - 1;
137
- const normalizedKeyframes = keyframes.map((keyframe, index) => {
138
- var _a2;
139
- return {
140
- ...keyframe,
141
- offset: (_a2 = keyframe.offset) != null ? _a2 : index / keyframesCount,
142
- easing: normalizeEase(keyframe.easing)
143
- };
144
- });
145
- function pause() {
146
- isRunning = false;
147
- raf.remove(key);
148
- }
149
- function progress(newProgress) {
150
- if (typeof newProgress === "undefined") {
151
- return progressValue;
152
- }
153
- progressValue = newProgress;
154
- if (Math.abs(1 - progressValue) < PROGRESS_PRECISION) {
155
- progressValue = 1;
156
- pause();
157
- import_scheduler.domScheduler.afterWrite(() => onFinish(progressValue, easedProgress));
158
- }
159
- easedProgress = ease(progressValue);
114
+ function callback(progress) {
160
115
  let toIndex = 0;
161
- while (normalizedKeyframes[toIndex] && normalizedKeyframes[toIndex].offset <= easedProgress && normalizedKeyframes[toIndex].offset !== 1) {
116
+ while (normalizedKeyframes[toIndex] && normalizedKeyframes[toIndex].offset <= progress && normalizedKeyframes[toIndex].offset !== 1) {
162
117
  toIndex += 1;
163
118
  }
164
- render(element, normalizedKeyframes[toIndex - 1], normalizedKeyframes[toIndex], easedProgress);
165
- onProgress(progressValue, easedProgress);
166
- return progressValue;
119
+ render(element, normalizedKeyframes[toIndex - 1], normalizedKeyframes[toIndex], progress);
167
120
  }
168
- function tick(props) {
169
- if (!isRunning) {
170
- raf.remove(key);
171
- return;
172
- }
173
- progress((0, import_math.clamp01)((0, import_math.map)(props.time, startTime, endTime, 0, 1)));
174
- }
175
- function start() {
176
- const runningKeys = running.get(element);
177
- runningKeys.forEach((runningPause, runningKey) => {
178
- runningPause();
179
- runningKeys.delete(runningKey);
180
- });
181
- runningKeys.set(key, pause);
182
- running.set(element, runningKeys);
183
- startTime = performance.now();
184
- endTime = startTime + duration;
185
- progressValue = 0;
186
- easedProgress = 0;
187
- isRunning = true;
188
- raf.add(key, tick);
189
- }
190
- function play() {
191
- if (isRunning) {
192
- return;
121
+ const controls = (0, import_tween.tween)(callback, {
122
+ ...options,
123
+ onStart() {
124
+ if ((0, import_is.isFunction)(options.onStart)) {
125
+ options.onStart();
126
+ }
127
+ const runningKeys = running.get(element);
128
+ runningKeys.forEach((runningPause, runningKey) => {
129
+ runningPause();
130
+ runningKeys.delete(runningKey);
131
+ });
132
+ runningKeys.set(key, controls.pause);
133
+ running.set(element, runningKeys);
193
134
  }
194
- startTime = performance.now() - (0, import_math.lerp)(0, duration, progressValue);
195
- endTime = startTime + duration;
196
- isRunning = true;
197
- raf.add(key, tick);
198
- }
199
- return {
200
- start,
201
- finish: () => progress(1),
202
- pause,
203
- play,
204
- progress
205
- };
135
+ });
136
+ return controls;
206
137
  }
207
138
  if (module.exports.default) module.exports = module.exports.default;
@@ -1,16 +1,9 @@
1
1
  /**
2
2
  * @typedef {import('./transform.js').TransformProps} TransformProps
3
- * @typedef {[number, number, number, number]} BezierCurve
4
- * @typedef {{
5
- * duration?: number;
6
- * easing?: import('../math/createEases.js').EasingFunction|BezierCurve;
7
- * onProgress?: (progress: number, easedProgress: number) => void;
8
- * onFinish?: (progress: number, easedProgress: number) => void;
9
- * }} Options
10
3
  * @typedef {TransformProps & {
11
4
  * opacity?: number;
12
5
  * transformOrigin?: string;
13
- * easing?: import('../math/createEases.js').EasingFunction|BezierCurve;
6
+ * easing?: import('../math/createEases.js').EasingFunction|import('../tween.js').BezierCurve;
14
7
  * offset?: number;
15
8
  * }} Keyframe
16
9
  * @typedef {Keyframe & {
@@ -29,17 +22,15 @@
29
22
  * Animate an element.
30
23
  * @param {HTMLElement} element
31
24
  * @param {Keyframe[]} keyframes
32
- * @param {Options} options
25
+ * @param {import('../tween.js').TweenOptions} [options]
33
26
  * @returns {Animate}
34
27
  */
35
- export function animate(element: HTMLElement, keyframes: Keyframe[], options?: Options): Animate;
28
+ export function animate(element: HTMLElement, keyframes: Keyframe[], options?: import('../tween.js').TweenOptions): Animate;
36
29
  export type TransformProps = import('./transform.js').TransformProps;
37
- export type BezierCurve = [number, number, number, number];
38
- export type Options = Options;
39
30
  export type Keyframe = TransformProps & {
40
31
  opacity?: number;
41
32
  transformOrigin?: string;
42
- easing?: import('../math/createEases.js').EasingFunction | [number, number, number, number];
33
+ easing?: import('../math/createEases.js').EasingFunction | import('../tween.js').BezierCurve;
43
34
  offset?: number;
44
35
  };
45
36
  export type NormalizedKeyframe = Keyframe & {