@hanzogui/cubic-bezier-animator 2.0.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/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2021 Radix
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,3 @@
1
+ # Cubic Bezier animation library
2
+
3
+ A quick guide on using Radix Colors with Stitches.
@@ -0,0 +1,80 @@
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) __defProp(target, name, {
7
+ get: all[name],
8
+ enumerable: !0
9
+ });
10
+ },
11
+ __copyProps = (to, from, except, desc) => {
12
+ if (from && typeof from == "object" || typeof from == "function") for (let key of __getOwnPropNames(from)) !__hasOwnProp.call(to, key) && key !== except && __defProp(to, key, {
13
+ get: () => from[key],
14
+ enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable
15
+ });
16
+ return to;
17
+ };
18
+ var __toCommonJS = mod => __copyProps(__defProp({}, "__esModule", {
19
+ value: !0
20
+ }), mod);
21
+ var cubicBezier_exports = {};
22
+ __export(cubicBezier_exports, {
23
+ bezier: () => bezier
24
+ });
25
+ module.exports = __toCommonJS(cubicBezier_exports);
26
+ const float32ArraySupported = typeof Float32Array == "function";
27
+ function A(aA1, aA2) {
28
+ return 1 - 3 * aA2 + 3 * aA1;
29
+ }
30
+ function B(aA1, aA2) {
31
+ return 3 * aA2 - 6 * aA1;
32
+ }
33
+ function C(aA1) {
34
+ return 3 * aA1;
35
+ }
36
+ function calcBezier(aT, aA1, aA2) {
37
+ return ((A(aA1, aA2) * aT + B(aA1, aA2)) * aT + C(aA1)) * aT;
38
+ }
39
+ function getSlope(aT, aA1, aA2) {
40
+ return 3 * A(aA1, aA2) * aT * aT + 2 * B(aA1, aA2) * aT + C(aA1);
41
+ }
42
+ function binarySubdivide(aX, aA, aB, mX1, mX2) {
43
+ let currentX,
44
+ currentT,
45
+ i = 0;
46
+ do currentT = aA + (aB - aA) / 2, currentX = calcBezier(currentT, mX1, mX2) - aX, currentX > 0 ? aB = currentT : aA = currentT; while (Math.abs(currentX) > 1e-7 && ++i < 10);
47
+ return currentT;
48
+ }
49
+ function newtonRaphsonIterate(aX, aGuessT, mX1, mX2) {
50
+ for (let i = 0; i < 4; ++i) {
51
+ const currentSlope = getSlope(aGuessT, mX1, mX2);
52
+ if (currentSlope === 0) return aGuessT;
53
+ const currentX = calcBezier(aGuessT, mX1, mX2) - aX;
54
+ aGuessT -= currentX / currentSlope;
55
+ }
56
+ return aGuessT;
57
+ }
58
+ function LinearEasing(x) {
59
+ return x;
60
+ }
61
+ function bezier(mX1, mY1, mX2, mY2) {
62
+ if (!(0 <= mX1 && mX1 <= 1 && 0 <= mX2 && mX2 <= 1)) throw new Error("bezier x values must be in [0, 1] range");
63
+ if (mX1 === mY1 && mX2 === mY2) return LinearEasing;
64
+ const sampleValues = float32ArraySupported ? new Float32Array(11) : new Array(11);
65
+ for (let i = 0; i < 11; ++i) sampleValues[i] = calcBezier(i * 0.1, mX1, mX2);
66
+ function getTForX(aX) {
67
+ let intervalStart = 0,
68
+ currentSample = 1;
69
+ const lastSample = 10;
70
+ for (; currentSample !== lastSample && sampleValues[currentSample] <= aX; ++currentSample) intervalStart += 0.1;
71
+ --currentSample;
72
+ const dist = (aX - sampleValues[currentSample]) / (sampleValues[currentSample + 1] - sampleValues[currentSample]),
73
+ guessForT = intervalStart + dist * 0.1,
74
+ initialSlope = getSlope(guessForT, mX1, mX2);
75
+ return initialSlope >= 1e-3 ? newtonRaphsonIterate(aX, guessForT, mX1, mX2) : initialSlope === 0 ? guessForT : binarySubdivide(aX, intervalStart, intervalStart + 0.1, mX1, mX2);
76
+ }
77
+ return function (x) {
78
+ return x === 0 || x === 1 ? x : calcBezier(getTForX(x), mY1, mY2);
79
+ };
80
+ }
@@ -0,0 +1,85 @@
1
+ "use strict";
2
+
3
+ var __defProp = Object.defineProperty;
4
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
5
+ var __getOwnPropNames = Object.getOwnPropertyNames;
6
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
7
+ var __export = (target, all) => {
8
+ for (var name in all) __defProp(target, name, {
9
+ get: all[name],
10
+ enumerable: !0
11
+ });
12
+ },
13
+ __copyProps = (to, from, except, desc) => {
14
+ if (from && typeof from == "object" || typeof from == "function") for (let key of __getOwnPropNames(from)) !__hasOwnProp.call(to, key) && key !== except && __defProp(to, key, {
15
+ get: () => from[key],
16
+ enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable
17
+ });
18
+ return to;
19
+ };
20
+ var __toCommonJS = mod => __copyProps(__defProp({}, "__esModule", {
21
+ value: !0
22
+ }), mod);
23
+ var cubicBezier_exports = {};
24
+ __export(cubicBezier_exports, {
25
+ bezier: () => bezier
26
+ });
27
+ module.exports = __toCommonJS(cubicBezier_exports);
28
+ var NEWTON_ITERATIONS = 4,
29
+ NEWTON_MIN_SLOPE = 1e-3,
30
+ SUBDIVISION_PRECISION = 1e-7,
31
+ SUBDIVISION_MAX_ITERATIONS = 10,
32
+ kSplineTableSize = 11,
33
+ kSampleStepSize = 1 / (kSplineTableSize - 1),
34
+ float32ArraySupported = typeof Float32Array == "function";
35
+ function A(aA1, aA2) {
36
+ return 1 - 3 * aA2 + 3 * aA1;
37
+ }
38
+ function B(aA1, aA2) {
39
+ return 3 * aA2 - 6 * aA1;
40
+ }
41
+ function C(aA1) {
42
+ return 3 * aA1;
43
+ }
44
+ function calcBezier(aT, aA1, aA2) {
45
+ return ((A(aA1, aA2) * aT + B(aA1, aA2)) * aT + C(aA1)) * aT;
46
+ }
47
+ function getSlope(aT, aA1, aA2) {
48
+ return 3 * A(aA1, aA2) * aT * aT + 2 * B(aA1, aA2) * aT + C(aA1);
49
+ }
50
+ function binarySubdivide(aX, aA, aB, mX1, mX2) {
51
+ var currentX,
52
+ currentT,
53
+ i = 0;
54
+ do currentT = aA + (aB - aA) / 2, currentX = calcBezier(currentT, mX1, mX2) - aX, currentX > 0 ? aB = currentT : aA = currentT; while (Math.abs(currentX) > SUBDIVISION_PRECISION && ++i < SUBDIVISION_MAX_ITERATIONS);
55
+ return currentT;
56
+ }
57
+ function newtonRaphsonIterate(aX, aGuessT, mX1, mX2) {
58
+ for (var i = 0; i < NEWTON_ITERATIONS; ++i) {
59
+ var currentSlope = getSlope(aGuessT, mX1, mX2);
60
+ if (currentSlope === 0) return aGuessT;
61
+ var currentX = calcBezier(aGuessT, mX1, mX2) - aX;
62
+ aGuessT -= currentX / currentSlope;
63
+ }
64
+ return aGuessT;
65
+ }
66
+ function LinearEasing(x) {
67
+ return x;
68
+ }
69
+ function bezier(mX1, mY1, mX2, mY2) {
70
+ if (!(0 <= mX1 && mX1 <= 1 && 0 <= mX2 && mX2 <= 1)) throw new Error("bezier x values must be in [0, 1] range");
71
+ if (mX1 === mY1 && mX2 === mY2) return LinearEasing;
72
+ for (var sampleValues = float32ArraySupported ? new Float32Array(kSplineTableSize) : new Array(kSplineTableSize), i = 0; i < kSplineTableSize; ++i) sampleValues[i] = calcBezier(i * kSampleStepSize, mX1, mX2);
73
+ function getTForX(aX) {
74
+ for (var intervalStart = 0, currentSample = 1, lastSample = kSplineTableSize - 1; currentSample !== lastSample && sampleValues[currentSample] <= aX; ++currentSample) intervalStart += kSampleStepSize;
75
+ --currentSample;
76
+ var dist = (aX - sampleValues[currentSample]) / (sampleValues[currentSample + 1] - sampleValues[currentSample]),
77
+ guessForT = intervalStart + dist * kSampleStepSize,
78
+ initialSlope = getSlope(guessForT, mX1, mX2);
79
+ return initialSlope >= NEWTON_MIN_SLOPE ? newtonRaphsonIterate(aX, guessForT, mX1, mX2) : initialSlope === 0 ? guessForT : binarySubdivide(aX, intervalStart, intervalStart + kSampleStepSize, mX1, mX2);
80
+ }
81
+ return function (x) {
82
+ return x === 0 || x === 1 ? x : calcBezier(getTForX(x), mY1, mY2);
83
+ };
84
+ }
85
+ //# sourceMappingURL=cubicBezier.native.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["__toCommonJS","mod","__copyProps","__defProp","value","cubicBezier_exports","__export","bezier","module","exports","NEWTON_ITERATIONS","NEWTON_MIN_SLOPE","SUBDIVISION_PRECISION","SUBDIVISION_MAX_ITERATIONS","kSplineTableSize","kSampleStepSize","float32ArraySupported","Float32Array","A","aA1","aA2","B","C","calcBezier","aT","getSlope","binarySubdivide","aX","aA","aB","mX1","mX2","currentX","currentT","i","Math","abs","newtonRaphsonIterate","aGuessT","currentSlope","LinearEasing","x","mY1","mY2","Error","sampleValues","Array","getTForX","intervalStart","currentSample","lastSample","dist","guessForT","initialSlope"],"sources":["../../src/cubicBezier.tsx"],"sourcesContent":[null],"mappings":";;;;;;;;;;;;;;;;;;;AAAA,IAAAA,YAAA,GAAAC,GAAA,IAAAC,WAAA,CAAAC,SAAA;EAAAC,KAAA;AAAA,IAAAH,GAAA;AAAA,IAAAI,mBAAA;AAAAC,QAAA,CAAAD,mBAAA;EAAAE,MAAA,EAAAA,CAAA,KAAAA;AAAA;AAeAC,MAAM,CAAAC,OAAA,GAAAT,YAAA,CAAwBK,mBAAO;AAErC,IAAAK,iBAAqC;EAAAC,gBAAA;EAAAC,qBAAA;EAAAC,0BAAA;EAAAC,gBAAA;EAAAC,eAAA,QAAAD,gBAAA;EAAAE,qBAAA,UAAAC,YAAA;AACnC,SAAOC,EAAAC,GAAM,EAAAC,GAAM;EACrB,eAAAA,GAAA,OAAAD,GAAA;AACA;AACE,SAAOE,EAAAF,GAAM,EAAAC,GAAM;EACrB,WAAAA,GAAA,OAAAD,GAAA;AACA;AACE,SAAOG,EAAAH,GAAM;EACf,WAAAA,GAAA;AAGA;AACE,SAAAI,UAAgBA,CAAAC,EAAG,EAAAL,GAAI,EAAAC,GAAO;EAChC,SAAAF,CAAA,CAAAC,GAAA,EAAAC,GAAA,IAAAI,EAAA,GAAAH,CAAA,CAAAF,GAAA,EAAAC,GAAA,KAAAI,EAAA,GAAAF,CAAA,CAAAH,GAAA,KAAAK,EAAA;AAGA;AACE,SAAOC,QAAQA,CAAAD,EAAK,EAAAL,GAAG,EAAIC,GAAA,EAAK;EAClC,WAAAF,CAAA,CAAAC,GAAA,EAAAC,GAAA,IAAAI,EAAA,GAAAA,EAAA,OAAAH,CAAA,CAAAF,GAAA,EAAAC,GAAA,IAAAI,EAAA,GAAAF,CAAA,CAAAH,GAAA;AAEA;AACE,SAAIO,eACAA,CAAAC,EACA,EAAAC,EAAI,EAAAC,EAAA,EAAAC,GAAA,EAAAC,GAAA;EACR,IAAAC,QAAA;IAAAC,QAAA;IAAAC,CAAA;EACE,GAKOD,QAEA,GAAKL,EAAA,GAAI,CAAAC,EAAA,GAAQD,EAAA,IAAI,GAAAI,QAA2B,GAAIT,UAAA,CAAAU,QAAA,EAAAH,GAAA,EAAAC,GAAA,IAAAJ,EAAA,EAAAK,QAAA,OAAAH,EAAA,GAAAI,QAAA,GAAAL,EAAA,GAAAK,QAAA,SACtDE,IAAA,CAAAC,GAAA,CAAAJ,QAAA,IAAApB,qBAAA,MAAAsB,CAAA,GAAArB,0BAAA;EACT,OAAAoB,QAAA;AAEA;AACE,SAAAI,oBAAyCA,CAAGV,EAAA,EAAAW,OAAA,EAAAR,GAAA,EAAAC,GAAA;EAC1C,SAAMG,CAAA,MAAAA,CAAA,GAAAxB,iBAAwB,IAASwB,CAAA;IACvC,IAAIK,YAAA,GAAAd,QAAiB,CAAAa,OAAA,EAAAR,GAAA,EAAAC,GAAA;IACnB,IAAAQ,YAAO,QAET,OAAMD,OAAA;IACN,IAAAN,QAAW,GAAAT,UAAW,CAAAe,OAAA,EAAAR,GAAA,EAAAC,GAAA,IAAAJ,EAAA;IACxBW,OAAA,IAAAN,QAAA,GAAAO,YAAA;EACA;EACF,OAAAD,OAAA;AAEA;AACE,SAAOE,aAAAC,CAAA;EACT,OAAAA,CAAA;AAEO;AAML,SAAMlC,MAAKA,CAAAuB,GAAA,EAAOY,GAAA,EAAAX,GAAO,EAAAY,GAAK;EAC5B,WAAMb,GAAI,IAAMA,GAAA,cAAAC,GAAA,IAAAA,GAAA,QAGlB,MAAI,IAAQa,KAAA,0CAAe;EACzB,IAAAd,GAAA,KAAOY,GAAA,IAAAX,GAAA,KAAAY,GAAA,EAIT,OAAMH,YAAe;EAGrB,SAASK,YAAW,GAAkB7B,qBAAE,OAAAC,YAAA,CAAAH,gBAAA,QAAAgC,KAAA,CAAAhC,gBAAA,GAAAoB,CAAA,MAAAA,CAAA,GAAApB,gBAAA,IAAAoB,CAAA,EACtCW,YAAA,CAAaX,CAAC,IAAIX,UAAA,CAAWW,CAAA,GAAInB,eAAyB,EAAAe,GAAA,EAAAC,GAAA;EAG5D,SAASgB,SAASpB,EAAA,EAAI;IACpB,KAAI,IAAAqB,aAAgB,GAChB,GAAAC,aAAgB,MAAAC,UAAA,GAAApC,gBAAA,MAAAmC,aAAA,KAAAC,UAAA,IAAAL,YAAA,CAAAI,aAAA,KAAAtB,EAAA,IAAAsB,aAAA,EACpBD,aAAM,IAAajC,eAAA;IAEnB,EAAAkC,aAEE;IAGA,IAAAE,IAAA,IAAAxB,EAAA,GAAAkB,YAAiB,CAAAI,aAAA,MAAAJ,YAAA,CAAAI,aAAA,QAAAJ,YAAA,CAAAI,aAAA;MAAAG,SAAA,GAAAJ,aAAA,GAAAG,IAAA,GAAApC,eAAA;MAAAsC,YAAA,GAAA5B,QAAA,CAAA2B,SAAA,EAAAtB,GAAA,EAAAC,GAAA;IAEnB,OAAEsB,YAAA,IAAA1C,gBAAA,GAAA0B,oBAAA,CAAAV,EAAA,EAAAyB,SAAA,EAAAtB,GAAA,EAAAC,GAAA,IAAAsB,YAAA,SAAAD,SAAA,GAAA1B,eAAA,CAAAC,EAAA,EAAAqB,aAAA,EAAAA,aAAA,GAAAjC,eAAA,EAAAe,GAAA,EAAAC,GAAA;EAGF;EAMA,iBAAIU,CAAA;IAON,OAAAA,CAAA,UAAAA,CAAA,SAAAA,CAAA,GAAAlB,UAAA,CAAAwB,QAAA,CAAAN,CAAA,GAAAC,GAAA,EAAAC,GAAA;EAEA;AAEE","ignoreList":[]}
@@ -0,0 +1,57 @@
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) __defProp(target, name, {
7
+ get: all[name],
8
+ enumerable: !0
9
+ });
10
+ },
11
+ __copyProps = (to, from, except, desc) => {
12
+ if (from && typeof from == "object" || typeof from == "function") for (let key of __getOwnPropNames(from)) !__hasOwnProp.call(to, key) && key !== except && __defProp(to, key, {
13
+ get: () => from[key],
14
+ enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable
15
+ });
16
+ return to;
17
+ };
18
+ var __toCommonJS = mod => __copyProps(__defProp({}, "__esModule", {
19
+ value: !0
20
+ }), mod);
21
+ var index_exports = {};
22
+ __export(index_exports, {
23
+ animate: () => animate
24
+ });
25
+ module.exports = __toCommonJS(index_exports);
26
+ var import_cubicBezier = require("./cubicBezier.cjs");
27
+ function animate(param) {
28
+ let start = null;
29
+ const easing = param.cubicBezier ? (0, import_cubicBezier.bezier)(...param.cubicBezier) : v => v,
30
+ {
31
+ x: fromX,
32
+ y: fromY,
33
+ scaleX: fromScaleX,
34
+ scaleY: fromScaleY
35
+ } = param.from,
36
+ {
37
+ x: toX,
38
+ y: toY,
39
+ scaleX: toScaleX,
40
+ scaleY: toScaleY
41
+ } = param.to;
42
+ function frame(timestamp) {
43
+ start || (start = timestamp);
44
+ const progress = timestamp - start,
45
+ x = toX !== void 0 ? fromX + (toX - fromX) * easing(progress / param.duration) : void 0,
46
+ y = toY !== void 0 ? fromY + (toY - fromY) * easing(progress / param.duration) : void 0,
47
+ scaleX = toScaleX !== void 0 ? fromScaleX + (toScaleX - fromScaleX) * easing(progress / param.duration) : void 0,
48
+ scaleY = toScaleY !== void 0 ? fromScaleY + (toScaleY - fromScaleY) * easing(progress / param.duration) : void 0;
49
+ param.onUpdate({
50
+ x,
51
+ y,
52
+ scaleX,
53
+ scaleY
54
+ }), progress < param.duration && requestAnimationFrame(frame);
55
+ }
56
+ requestAnimationFrame(frame);
57
+ }
@@ -0,0 +1,62 @@
1
+ "use strict";
2
+
3
+ var __defProp = Object.defineProperty;
4
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
5
+ var __getOwnPropNames = Object.getOwnPropertyNames;
6
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
7
+ var __export = (target, all) => {
8
+ for (var name in all) __defProp(target, name, {
9
+ get: all[name],
10
+ enumerable: !0
11
+ });
12
+ },
13
+ __copyProps = (to, from, except, desc) => {
14
+ if (from && typeof from == "object" || typeof from == "function") for (let key of __getOwnPropNames(from)) !__hasOwnProp.call(to, key) && key !== except && __defProp(to, key, {
15
+ get: () => from[key],
16
+ enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable
17
+ });
18
+ return to;
19
+ };
20
+ var __toCommonJS = mod => __copyProps(__defProp({}, "__esModule", {
21
+ value: !0
22
+ }), mod);
23
+ var index_exports = {};
24
+ __export(index_exports, {
25
+ animate: () => animate
26
+ });
27
+ module.exports = __toCommonJS(index_exports);
28
+ var import_cubicBezier = require("./cubicBezier.native.js");
29
+ function animate(param) {
30
+ var start = null,
31
+ easing = param.cubicBezier ? (0, import_cubicBezier.bezier)(...param.cubicBezier) : function (v) {
32
+ return v;
33
+ },
34
+ {
35
+ x: fromX,
36
+ y: fromY,
37
+ scaleX: fromScaleX,
38
+ scaleY: fromScaleY
39
+ } = param.from,
40
+ {
41
+ x: toX,
42
+ y: toY,
43
+ scaleX: toScaleX,
44
+ scaleY: toScaleY
45
+ } = param.to;
46
+ function frame(timestamp) {
47
+ start || (start = timestamp);
48
+ var progress = timestamp - start,
49
+ x = toX !== void 0 ? fromX + (toX - fromX) * easing(progress / param.duration) : void 0,
50
+ y = toY !== void 0 ? fromY + (toY - fromY) * easing(progress / param.duration) : void 0,
51
+ scaleX = toScaleX !== void 0 ? fromScaleX + (toScaleX - fromScaleX) * easing(progress / param.duration) : void 0,
52
+ scaleY = toScaleY !== void 0 ? fromScaleY + (toScaleY - fromScaleY) * easing(progress / param.duration) : void 0;
53
+ param.onUpdate({
54
+ x,
55
+ y,
56
+ scaleX,
57
+ scaleY
58
+ }), progress < param.duration && requestAnimationFrame(frame);
59
+ }
60
+ requestAnimationFrame(frame);
61
+ }
62
+ //# sourceMappingURL=index.native.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["__toCommonJS","mod","__copyProps","__defProp","value","index_exports","__export","animate","module","exports","import_cubicBezier","require","param","start","easing","cubicBezier","bezier","v","x","fromX","y","fromY","scaleX","fromScaleX","scaleY","fromScaleY","from","toX","toY","toScaleX","toScaleY","to","frame","timestamp","progress","duration","onUpdate"],"sources":["../../src/index.tsx"],"sourcesContent":[null],"mappings":";;;;;;;;;;;;;;;;;;;AAAA,IAAAA,YAAA,GAAAC,GAAA,IAAAC,WAAA,CAAAC,SAAA;EAAAC,KAAA;AAAA,IAAAH,GAAA;AAAA,IAAAI,aAAA;AAAAC,QAAA,CAAAD,aAAA;EAAAE,OAAA,EAAAA,CAAA,KAAAA;AAAA;AAAAC,MAAA,CAAAC,OAAA,GAAAT,YAAuB,CAAAK,aAAA;AAmBhB,IAAAK,kBAAiB,GAA2BC,OAAA;AACjD,SAAIJ,OAAQA,CAAAK,KAAA;EACZ,IAAAC,KAAM,OAAS;IAAAC,MAAM,GAAAF,KAAA,CAAAG,WAAc,OAAAL,kBAAU,CAAAM,MAAM,KAAAJ,KAAW,CAAAG,WAAmB,IAEzE,UAAGE,CAAO;MAGlB,OAASA,CAAA;IACP;IAAK;MAAAC,CAAA,EAAAC,KAAO;MAAAC,CAAA,EAAAC,KAAQ;MAAAC,MAAA,EAAAC,UAAA;MAAAC,MAAA,EAAAC;IAAA,IAAAb,KAAA,CAAAc,IAAA;IAAA;MAAAR,CAAA,EAAAS,GAAA;MAAAP,CAAA,EAAAQ,GAAA;MAAAN,MAAA,EAAAO,QAAA;MAAAL,MAAA,EAAAM;IAAA,IAAAlB,KAAA,CAAAmB,EAAA;EACpB,SAAMC,MAAAC,SAAW;IAiBjBpB,KAAA,KAAMA,KAAS,GAAEoB,SAAM;IAKzB,IAAAC,QAAA,GAAAD,SAAA,GAAApB,KAAA;MAAAK,CAAA,GAAAS,GAAA,cAAAR,KAAA,IAAAQ,GAAA,GAAAR,KAAA,IAAAL,MAAA,CAAAoB,QAAA,GAAAtB,KAAA,CAAAuB,QAAA;MAAAf,CAAA,GAAAQ,GAAA,cAAAP,KAAA,IAAAO,GAAA,GAAAP,KAAA,IAAAP,MAAA,CAAAoB,QAAA,GAAAtB,KAAA,CAAAuB,QAAA;MAAAb,MAAA,GAAAO,QAAA,cAAAN,UAAA,IAAAM,QAAA,GAAAN,UAAA,IAAAT,MAAA,CAAAoB,QAAA,GAAAtB,KAAA,CAAAuB,QAAA;MAAAX,MAAA,GAAAM,QAAA,cAAAL,UAAA,IAAAK,QAAA,GAAAL,UAAA,IAAAX,MAAA,CAAAoB,QAAA,GAAAtB,KAAA,CAAAuB,QAAA;IACAvB,KAAA,CAAAwB,QAAA;MACFlB,CAAA","ignoreList":[]}
@@ -0,0 +1,57 @@
1
+ const float32ArraySupported = typeof Float32Array == "function";
2
+ function A(aA1, aA2) {
3
+ return 1 - 3 * aA2 + 3 * aA1;
4
+ }
5
+ function B(aA1, aA2) {
6
+ return 3 * aA2 - 6 * aA1;
7
+ }
8
+ function C(aA1) {
9
+ return 3 * aA1;
10
+ }
11
+ function calcBezier(aT, aA1, aA2) {
12
+ return ((A(aA1, aA2) * aT + B(aA1, aA2)) * aT + C(aA1)) * aT;
13
+ }
14
+ function getSlope(aT, aA1, aA2) {
15
+ return 3 * A(aA1, aA2) * aT * aT + 2 * B(aA1, aA2) * aT + C(aA1);
16
+ }
17
+ function binarySubdivide(aX, aA, aB, mX1, mX2) {
18
+ let currentX,
19
+ currentT,
20
+ i = 0;
21
+ do currentT = aA + (aB - aA) / 2, currentX = calcBezier(currentT, mX1, mX2) - aX, currentX > 0 ? aB = currentT : aA = currentT; while (Math.abs(currentX) > 1e-7 && ++i < 10);
22
+ return currentT;
23
+ }
24
+ function newtonRaphsonIterate(aX, aGuessT, mX1, mX2) {
25
+ for (let i = 0; i < 4; ++i) {
26
+ const currentSlope = getSlope(aGuessT, mX1, mX2);
27
+ if (currentSlope === 0) return aGuessT;
28
+ const currentX = calcBezier(aGuessT, mX1, mX2) - aX;
29
+ aGuessT -= currentX / currentSlope;
30
+ }
31
+ return aGuessT;
32
+ }
33
+ function LinearEasing(x) {
34
+ return x;
35
+ }
36
+ function bezier(mX1, mY1, mX2, mY2) {
37
+ if (!(0 <= mX1 && mX1 <= 1 && 0 <= mX2 && mX2 <= 1)) throw new Error("bezier x values must be in [0, 1] range");
38
+ if (mX1 === mY1 && mX2 === mY2) return LinearEasing;
39
+ const sampleValues = float32ArraySupported ? new Float32Array(11) : new Array(11);
40
+ for (let i = 0; i < 11; ++i) sampleValues[i] = calcBezier(i * 0.1, mX1, mX2);
41
+ function getTForX(aX) {
42
+ let intervalStart = 0,
43
+ currentSample = 1;
44
+ const lastSample = 10;
45
+ for (; currentSample !== lastSample && sampleValues[currentSample] <= aX; ++currentSample) intervalStart += 0.1;
46
+ --currentSample;
47
+ const dist = (aX - sampleValues[currentSample]) / (sampleValues[currentSample + 1] - sampleValues[currentSample]),
48
+ guessForT = intervalStart + dist * 0.1,
49
+ initialSlope = getSlope(guessForT, mX1, mX2);
50
+ return initialSlope >= 1e-3 ? newtonRaphsonIterate(aX, guessForT, mX1, mX2) : initialSlope === 0 ? guessForT : binarySubdivide(aX, intervalStart, intervalStart + 0.1, mX1, mX2);
51
+ }
52
+ return function (x) {
53
+ return x === 0 || x === 1 ? x : calcBezier(getTForX(x), mY1, mY2);
54
+ };
55
+ }
56
+ export { bezier };
57
+ //# sourceMappingURL=cubicBezier.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["float32ArraySupported","Float32Array","A","aA1","aA2","B","C","calcBezier","aT","getSlope","binarySubdivide","aX","aA","aB","mX1","mX2","currentX","currentT","i","Math","abs","newtonRaphsonIterate","aGuessT","currentSlope","LinearEasing","x","bezier","mY1","mY2","Error","sampleValues","Array","getTForX","intervalStart","currentSample","lastSample","dist","guessForT","initialSlope"],"sources":["../../src/cubicBezier.tsx"],"sourcesContent":[null],"mappings":"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","ignoreList":[]}
@@ -0,0 +1,59 @@
1
+ var NEWTON_ITERATIONS = 4,
2
+ NEWTON_MIN_SLOPE = 1e-3,
3
+ SUBDIVISION_PRECISION = 1e-7,
4
+ SUBDIVISION_MAX_ITERATIONS = 10,
5
+ kSplineTableSize = 11,
6
+ kSampleStepSize = 1 / (kSplineTableSize - 1),
7
+ float32ArraySupported = typeof Float32Array == "function";
8
+ function A(aA1, aA2) {
9
+ return 1 - 3 * aA2 + 3 * aA1;
10
+ }
11
+ function B(aA1, aA2) {
12
+ return 3 * aA2 - 6 * aA1;
13
+ }
14
+ function C(aA1) {
15
+ return 3 * aA1;
16
+ }
17
+ function calcBezier(aT, aA1, aA2) {
18
+ return ((A(aA1, aA2) * aT + B(aA1, aA2)) * aT + C(aA1)) * aT;
19
+ }
20
+ function getSlope(aT, aA1, aA2) {
21
+ return 3 * A(aA1, aA2) * aT * aT + 2 * B(aA1, aA2) * aT + C(aA1);
22
+ }
23
+ function binarySubdivide(aX, aA, aB, mX1, mX2) {
24
+ var currentX,
25
+ currentT,
26
+ i = 0;
27
+ do currentT = aA + (aB - aA) / 2, currentX = calcBezier(currentT, mX1, mX2) - aX, currentX > 0 ? aB = currentT : aA = currentT; while (Math.abs(currentX) > SUBDIVISION_PRECISION && ++i < SUBDIVISION_MAX_ITERATIONS);
28
+ return currentT;
29
+ }
30
+ function newtonRaphsonIterate(aX, aGuessT, mX1, mX2) {
31
+ for (var i = 0; i < NEWTON_ITERATIONS; ++i) {
32
+ var currentSlope = getSlope(aGuessT, mX1, mX2);
33
+ if (currentSlope === 0) return aGuessT;
34
+ var currentX = calcBezier(aGuessT, mX1, mX2) - aX;
35
+ aGuessT -= currentX / currentSlope;
36
+ }
37
+ return aGuessT;
38
+ }
39
+ function LinearEasing(x) {
40
+ return x;
41
+ }
42
+ function bezier(mX1, mY1, mX2, mY2) {
43
+ if (!(0 <= mX1 && mX1 <= 1 && 0 <= mX2 && mX2 <= 1)) throw new Error("bezier x values must be in [0, 1] range");
44
+ if (mX1 === mY1 && mX2 === mY2) return LinearEasing;
45
+ for (var sampleValues = float32ArraySupported ? new Float32Array(kSplineTableSize) : new Array(kSplineTableSize), i = 0; i < kSplineTableSize; ++i) sampleValues[i] = calcBezier(i * kSampleStepSize, mX1, mX2);
46
+ function getTForX(aX) {
47
+ for (var intervalStart = 0, currentSample = 1, lastSample = kSplineTableSize - 1; currentSample !== lastSample && sampleValues[currentSample] <= aX; ++currentSample) intervalStart += kSampleStepSize;
48
+ --currentSample;
49
+ var dist = (aX - sampleValues[currentSample]) / (sampleValues[currentSample + 1] - sampleValues[currentSample]),
50
+ guessForT = intervalStart + dist * kSampleStepSize,
51
+ initialSlope = getSlope(guessForT, mX1, mX2);
52
+ return initialSlope >= NEWTON_MIN_SLOPE ? newtonRaphsonIterate(aX, guessForT, mX1, mX2) : initialSlope === 0 ? guessForT : binarySubdivide(aX, intervalStart, intervalStart + kSampleStepSize, mX1, mX2);
53
+ }
54
+ return function (x) {
55
+ return x === 0 || x === 1 ? x : calcBezier(getTForX(x), mY1, mY2);
56
+ };
57
+ }
58
+ export { bezier };
59
+ //# sourceMappingURL=cubicBezier.native.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["NEWTON_ITERATIONS","NEWTON_MIN_SLOPE","SUBDIVISION_PRECISION","SUBDIVISION_MAX_ITERATIONS","kSplineTableSize","kSampleStepSize","float32ArraySupported","Float32Array","A","aA1","aA2","B","C","calcBezier","aT","getSlope","binarySubdivide","aX","aA","aB","mX1","mX2","currentX","currentT","i","Math","abs","newtonRaphsonIterate","aGuessT","currentSlope","LinearEasing","x","bezier","mY1","mY2","Error","sampleValues","Array","getTForX","intervalStart","currentSample","lastSample","dist","guessForT","initialSlope"],"sources":["../../src/cubicBezier.tsx"],"sourcesContent":[null],"mappings":"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","ignoreList":[]}
@@ -0,0 +1,34 @@
1
+ import { bezier } from "./cubicBezier.mjs";
2
+ function animate(param) {
3
+ let start = null;
4
+ const easing = param.cubicBezier ? bezier(...param.cubicBezier) : v => v,
5
+ {
6
+ x: fromX,
7
+ y: fromY,
8
+ scaleX: fromScaleX,
9
+ scaleY: fromScaleY
10
+ } = param.from,
11
+ {
12
+ x: toX,
13
+ y: toY,
14
+ scaleX: toScaleX,
15
+ scaleY: toScaleY
16
+ } = param.to;
17
+ function frame(timestamp) {
18
+ start || (start = timestamp);
19
+ const progress = timestamp - start,
20
+ x = toX !== void 0 ? fromX + (toX - fromX) * easing(progress / param.duration) : void 0,
21
+ y = toY !== void 0 ? fromY + (toY - fromY) * easing(progress / param.duration) : void 0,
22
+ scaleX = toScaleX !== void 0 ? fromScaleX + (toScaleX - fromScaleX) * easing(progress / param.duration) : void 0,
23
+ scaleY = toScaleY !== void 0 ? fromScaleY + (toScaleY - fromScaleY) * easing(progress / param.duration) : void 0;
24
+ param.onUpdate({
25
+ x,
26
+ y,
27
+ scaleX,
28
+ scaleY
29
+ }), progress < param.duration && requestAnimationFrame(frame);
30
+ }
31
+ requestAnimationFrame(frame);
32
+ }
33
+ export { animate };
34
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["bezier","animate","param","start","easing","cubicBezier","v","x","fromX","y","fromY","scaleX","fromScaleX","scaleY","fromScaleY","from","toX","toY","toScaleX","toScaleY","to","frame","timestamp","progress","duration","onUpdate","requestAnimationFrame"],"sources":["../../src/index.tsx"],"sourcesContent":[null],"mappings":"AAAA,SAASA,MAAA,QAAc;AAmBhB,SAASC,QAAQC,KAAA,EAA2B;EACjD,IAAIC,KAAA,GAAQ;EACZ,MAAMC,MAAA,GAASF,KAAA,CAAMG,WAAA,GAAcL,MAAA,CAAO,GAAGE,KAAA,CAAMG,WAAW,IAAKC,CAAA,IAAcA,CAAA;IAE3E;MAAEC,CAAA,EAAGC,KAAA;MAAOC,CAAA,EAAGC,KAAA;MAAOC,MAAA,EAAQC,UAAA;MAAYC,MAAA,EAAQC;IAAW,IAAIZ,KAAA,CAAMa,IAAA;IACvE;MAAER,CAAA,EAAGS,GAAA;MAAKP,CAAA,EAAGQ,GAAA;MAAKN,MAAA,EAAQO,QAAA;MAAUL,MAAA,EAAQM;IAAS,IAAIjB,KAAA,CAAMkB,EAAA;EAErE,SAASC,MAAMC,SAAA,EAAW;IACnBnB,KAAA,KAAOA,KAAA,GAAQmB,SAAA;IACpB,MAAMC,QAAA,GAAWD,SAAA,GAAYnB,KAAA;MACvBI,CAAA,GACJS,GAAA,KAAQ,SACJR,KAAA,IAAUQ,GAAA,GAAMR,KAAA,IAAUJ,MAAA,CAAOmB,QAAA,GAAWrB,KAAA,CAAMsB,QAAQ,IAC1D;MACAf,CAAA,GACJQ,GAAA,KAAQ,SACJP,KAAA,IAAUO,GAAA,GAAMP,KAAA,IAAUN,MAAA,CAAOmB,QAAA,GAAWrB,KAAA,CAAMsB,QAAQ,IAC1D;MACAb,MAAA,GACJO,QAAA,KAAa,SACTN,UAAA,IAAeM,QAAA,GAAWN,UAAA,IAAeR,MAAA,CAAOmB,QAAA,GAAWrB,KAAA,CAAMsB,QAAQ,IACzE;MACAX,MAAA,GACJM,QAAA,KAAa,SACTL,UAAA,IAAeK,QAAA,GAAWL,UAAA,IAAeV,MAAA,CAAOmB,QAAA,GAAWrB,KAAA,CAAMsB,QAAQ,IACzE;IACNtB,KAAA,CAAMuB,QAAA,CAAS;MAAElB,CAAA;MAAGE,CAAA;MAAGE,MAAA;MAAQE;IAAO,CAAC,GAEnCU,QAAA,GAAWrB,KAAA,CAAMsB,QAAA,IACnBE,qBAAA,CAAsBL,KAAK;EAE/B;EACAK,qBAAA,CAAsBL,KAAK;AAC7B","ignoreList":[]}
@@ -0,0 +1,34 @@
1
+ import { bezier } from "./cubicBezier.mjs";
2
+ function animate(param) {
3
+ let start = null;
4
+ const easing = param.cubicBezier ? bezier(...param.cubicBezier) : v => v,
5
+ {
6
+ x: fromX,
7
+ y: fromY,
8
+ scaleX: fromScaleX,
9
+ scaleY: fromScaleY
10
+ } = param.from,
11
+ {
12
+ x: toX,
13
+ y: toY,
14
+ scaleX: toScaleX,
15
+ scaleY: toScaleY
16
+ } = param.to;
17
+ function frame(timestamp) {
18
+ start || (start = timestamp);
19
+ const progress = timestamp - start,
20
+ x = toX !== void 0 ? fromX + (toX - fromX) * easing(progress / param.duration) : void 0,
21
+ y = toY !== void 0 ? fromY + (toY - fromY) * easing(progress / param.duration) : void 0,
22
+ scaleX = toScaleX !== void 0 ? fromScaleX + (toScaleX - fromScaleX) * easing(progress / param.duration) : void 0,
23
+ scaleY = toScaleY !== void 0 ? fromScaleY + (toScaleY - fromScaleY) * easing(progress / param.duration) : void 0;
24
+ param.onUpdate({
25
+ x,
26
+ y,
27
+ scaleX,
28
+ scaleY
29
+ }), progress < param.duration && requestAnimationFrame(frame);
30
+ }
31
+ requestAnimationFrame(frame);
32
+ }
33
+ export { animate };
34
+ //# sourceMappingURL=index.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["bezier","animate","param","start","easing","cubicBezier","v","x","fromX","y","fromY","scaleX","fromScaleX","scaleY","fromScaleY","from","toX","toY","toScaleX","toScaleY","to","frame","timestamp","progress","duration","onUpdate","requestAnimationFrame"],"sources":["../../src/index.tsx"],"sourcesContent":[null],"mappings":"AAAA,SAASA,MAAA,QAAc;AAmBhB,SAASC,QAAQC,KAAA,EAA2B;EACjD,IAAIC,KAAA,GAAQ;EACZ,MAAMC,MAAA,GAASF,KAAA,CAAMG,WAAA,GAAcL,MAAA,CAAO,GAAGE,KAAA,CAAMG,WAAW,IAAKC,CAAA,IAAcA,CAAA;IAE3E;MAAEC,CAAA,EAAGC,KAAA;MAAOC,CAAA,EAAGC,KAAA;MAAOC,MAAA,EAAQC,UAAA;MAAYC,MAAA,EAAQC;IAAW,IAAIZ,KAAA,CAAMa,IAAA;IACvE;MAAER,CAAA,EAAGS,GAAA;MAAKP,CAAA,EAAGQ,GAAA;MAAKN,MAAA,EAAQO,QAAA;MAAUL,MAAA,EAAQM;IAAS,IAAIjB,KAAA,CAAMkB,EAAA;EAErE,SAASC,MAAMC,SAAA,EAAW;IACnBnB,KAAA,KAAOA,KAAA,GAAQmB,SAAA;IACpB,MAAMC,QAAA,GAAWD,SAAA,GAAYnB,KAAA;MACvBI,CAAA,GACJS,GAAA,KAAQ,SACJR,KAAA,IAAUQ,GAAA,GAAMR,KAAA,IAAUJ,MAAA,CAAOmB,QAAA,GAAWrB,KAAA,CAAMsB,QAAQ,IAC1D;MACAf,CAAA,GACJQ,GAAA,KAAQ,SACJP,KAAA,IAAUO,GAAA,GAAMP,KAAA,IAAUN,MAAA,CAAOmB,QAAA,GAAWrB,KAAA,CAAMsB,QAAQ,IAC1D;MACAb,MAAA,GACJO,QAAA,KAAa,SACTN,UAAA,IAAeM,QAAA,GAAWN,UAAA,IAAeR,MAAA,CAAOmB,QAAA,GAAWrB,KAAA,CAAMsB,QAAQ,IACzE;MACAX,MAAA,GACJM,QAAA,KAAa,SACTL,UAAA,IAAeK,QAAA,GAAWL,UAAA,IAAeV,MAAA,CAAOmB,QAAA,GAAWrB,KAAA,CAAMsB,QAAQ,IACzE;IACNtB,KAAA,CAAMuB,QAAA,CAAS;MAAElB,CAAA;MAAGE,CAAA;MAAGE,MAAA;MAAQE;IAAO,CAAC,GAEnCU,QAAA,GAAWrB,KAAA,CAAMsB,QAAA,IACnBE,qBAAA,CAAsBL,KAAK;EAE/B;EACAK,qBAAA,CAAsBL,KAAK;AAC7B","ignoreList":[]}
@@ -0,0 +1,36 @@
1
+ import { bezier } from "./cubicBezier.native.js";
2
+ function animate(param) {
3
+ var start = null,
4
+ easing = param.cubicBezier ? bezier(...param.cubicBezier) : function (v) {
5
+ return v;
6
+ },
7
+ {
8
+ x: fromX,
9
+ y: fromY,
10
+ scaleX: fromScaleX,
11
+ scaleY: fromScaleY
12
+ } = param.from,
13
+ {
14
+ x: toX,
15
+ y: toY,
16
+ scaleX: toScaleX,
17
+ scaleY: toScaleY
18
+ } = param.to;
19
+ function frame(timestamp) {
20
+ start || (start = timestamp);
21
+ var progress = timestamp - start,
22
+ x = toX !== void 0 ? fromX + (toX - fromX) * easing(progress / param.duration) : void 0,
23
+ y = toY !== void 0 ? fromY + (toY - fromY) * easing(progress / param.duration) : void 0,
24
+ scaleX = toScaleX !== void 0 ? fromScaleX + (toScaleX - fromScaleX) * easing(progress / param.duration) : void 0,
25
+ scaleY = toScaleY !== void 0 ? fromScaleY + (toScaleY - fromScaleY) * easing(progress / param.duration) : void 0;
26
+ param.onUpdate({
27
+ x,
28
+ y,
29
+ scaleX,
30
+ scaleY
31
+ }), progress < param.duration && requestAnimationFrame(frame);
32
+ }
33
+ requestAnimationFrame(frame);
34
+ }
35
+ export { animate };
36
+ //# sourceMappingURL=index.native.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["bezier","animate","param","start","easing","cubicBezier","v","x","fromX","y","fromY","scaleX","fromScaleX","scaleY","fromScaleY","from","toX","toY","toScaleX","toScaleY","to","frame","timestamp","progress","duration","onUpdate"],"sources":["../../src/index.tsx"],"sourcesContent":[null],"mappings":"AAAA,SAASA,MAAA,QAAc;AAmBhB,SAASC,QAAQC,KAAA,EAA2B;EACjD,IAAIC,KAAA,GAAQ;IAAAC,MAAA,GAAAF,KAAA,CAAAG,WAAA,GAAAL,MAAA,IAAAE,KAAA,CAAAG,WAAA,cAAAC,CAAA;MACZ,OAAMA,CAAA;IAKN;IAAA;MAAAC,CAAA,EAAAC,KAAS;MAAMC,CAAA,EAAAC,KAAA;MAAAC,MAAW,EAAAC,UAAA;MAAAC,MAAA,EAAAC;IAAA,IAAAZ,KAAA,CAAAa,IAAA;IAAA;MAAAR,CAAA,EAAAS,GAAA;MAAAP,CAAA,EAAAQ,GAAA;MAAAN,MAAA,EAAAO,QAAA;MAAAL,MAAA,EAAAM;IAAA,IAAAjB,KAAA,CAAAkB,EAAA;EACxB,SAAKC,KAAOA,CAAAC,SAAQ;IACpBnB,KAAA,KAAMA,KAAA,GAAWmB,SAAA;IAiBjB,IAAAC,QAAM,GAASD,SAAQ,GAAAnB,KAAQ;MAAAI,CAAA,GAAOS,GAAC,KAEnC,SAAWR,KAAM,IAAAQ,GAAA,GAAAR,KACnB,IAAAJ,MAAA,CAAAmB,QAAsB,GAAArB,KAAK,CAAAsB,QAAA;MAAAf,CAAA,GAAAQ,GAAA,cAAAP,KAAA,IAAAO,GAAA,GAAAP,KAAA,IAAAN,MAAA,CAAAmB,QAAA,GAAArB,KAAA,CAAAsB,QAAA;MAAAb,MAAA,GAAAO,QAAA,cAAAN,UAAA,IAAAM,QAAA,GAAAN,UAAA,IAAAR,MAAA,CAAAmB,QAAA,GAAArB,KAAA,CAAAsB,QAAA;MAAAX,MAAA,GAAAM,QAAA,cAAAL,UAAA,IAAAK,QAAA,GAAAL,UAAA,IAAAV,MAAA,CAAAmB,QAAA,GAAArB,KAAA,CAAAsB,QAAA;IAE/BtB,KAAA,CAAAuB,QAAA;MACAlB,CAAA;MACFE,CAAA","ignoreList":[]}
package/package.json ADDED
@@ -0,0 +1,39 @@
1
+ {
2
+ "name": "@hanzogui/cubic-bezier-animator",
3
+ "version": "2.0.0",
4
+ "source": "src/index.tsx",
5
+ "files": [
6
+ "src",
7
+ "types",
8
+ "dist"
9
+ ],
10
+ "type": "module",
11
+ "sideEffects": false,
12
+ "main": "dist/cjs",
13
+ "module": "dist/esm",
14
+ "types": "./types/index.d.ts",
15
+ "exports": {
16
+ "./package.json": "./package.json",
17
+ ".": {
18
+ "types": "./types/index.d.ts",
19
+ "react-native": "./dist/esm/index.native.js",
20
+ "browser": "./dist/esm/index.mjs",
21
+ "module": "./dist/esm/index.mjs",
22
+ "import": "./dist/esm/index.mjs",
23
+ "require": "./dist/cjs/index.cjs",
24
+ "default": "./dist/esm/index.mjs"
25
+ }
26
+ },
27
+ "publishConfig": {
28
+ "access": "public"
29
+ },
30
+ "scripts": {
31
+ "build": "hanzo-gui-build",
32
+ "watch": "hanzo-gui-build --watch",
33
+ "clean": "hanzo-gui-build clean",
34
+ "clean:build": "hanzo-gui-build clean:build"
35
+ },
36
+ "devDependencies": {
37
+ "@hanzogui/build": "workspace:*"
38
+ }
39
+ }
@@ -0,0 +1,129 @@
1
+ /**
2
+ * https://github.com/gre/bezier-easing
3
+ * BezierEasing - use bezier curve for transition easing function
4
+ * by Gaëtan Renaudeau 2014 - 2015 – MIT License
5
+ */
6
+
7
+ // These values are established by empiricism with tests (tradeoff: performance VS precision)
8
+ const NEWTON_ITERATIONS = 4
9
+ const NEWTON_MIN_SLOPE = 0.001
10
+ const SUBDIVISION_PRECISION = 0.0000001
11
+ const SUBDIVISION_MAX_ITERATIONS = 10
12
+
13
+ const kSplineTableSize = 11
14
+ const kSampleStepSize = 1.0 / (kSplineTableSize - 1.0)
15
+
16
+ const float32ArraySupported = typeof Float32Array === 'function'
17
+
18
+ function A(aA1: number, aA2: number) {
19
+ return 1.0 - 3.0 * aA2 + 3.0 * aA1
20
+ }
21
+ function B(aA1: number, aA2: number) {
22
+ return 3.0 * aA2 - 6.0 * aA1
23
+ }
24
+ function C(aA1: number) {
25
+ return 3.0 * aA1
26
+ }
27
+
28
+ // Returns x(t) given t, x1, and x2, or y(t) given t, y1, and y2.
29
+ function calcBezier(aT: number, aA1: number, aA2: number) {
30
+ return ((A(aA1, aA2) * aT + B(aA1, aA2)) * aT + C(aA1)) * aT
31
+ }
32
+
33
+ // Returns dx/dt given t, x1, and x2, or dy/dt given t, y1, and y2.
34
+ function getSlope(aT: number, aA1: number, aA2: number) {
35
+ return 3.0 * A(aA1, aA2) * aT * aT + 2.0 * B(aA1, aA2) * aT + C(aA1)
36
+ }
37
+
38
+ function binarySubdivide(aX: number, aA: number, aB: number, mX1: number, mX2: number) {
39
+ let currentX: number
40
+ let currentT: number
41
+ let i = 0
42
+ do {
43
+ currentT = aA + (aB - aA) / 2.0
44
+ currentX = calcBezier(currentT, mX1, mX2) - aX
45
+ if (currentX > 0.0) {
46
+ aB = currentT
47
+ } else {
48
+ aA = currentT
49
+ }
50
+ } while (Math.abs(currentX) > SUBDIVISION_PRECISION && ++i < SUBDIVISION_MAX_ITERATIONS)
51
+ return currentT
52
+ }
53
+
54
+ function newtonRaphsonIterate(aX: number, aGuessT: number, mX1: number, mX2: number) {
55
+ for (let i = 0; i < NEWTON_ITERATIONS; ++i) {
56
+ const currentSlope = getSlope(aGuessT, mX1, mX2)
57
+ if (currentSlope === 0.0) {
58
+ return aGuessT
59
+ }
60
+ const currentX = calcBezier(aGuessT, mX1, mX2) - aX
61
+ aGuessT -= currentX / currentSlope
62
+ }
63
+ return aGuessT
64
+ }
65
+
66
+ function LinearEasing(x: number): number {
67
+ return x
68
+ }
69
+
70
+ export function bezier(
71
+ mX1: number,
72
+ mY1: number,
73
+ mX2: number,
74
+ mY2: number
75
+ ): (x: number) => number {
76
+ if (!(0 <= mX1 && mX1 <= 1 && 0 <= mX2 && mX2 <= 1)) {
77
+ throw new Error('bezier x values must be in [0, 1] range')
78
+ }
79
+
80
+ if (mX1 === mY1 && mX2 === mY2) {
81
+ return LinearEasing
82
+ }
83
+
84
+ // Precompute samples table
85
+ const sampleValues = float32ArraySupported
86
+ ? new Float32Array(kSplineTableSize)
87
+ : new Array(kSplineTableSize)
88
+ for (let i = 0; i < kSplineTableSize; ++i) {
89
+ sampleValues[i] = calcBezier(i * kSampleStepSize, mX1, mX2)
90
+ }
91
+
92
+ function getTForX(aX) {
93
+ let intervalStart = 0.0
94
+ let currentSample = 1
95
+ const lastSample = kSplineTableSize - 1
96
+
97
+ for (
98
+ ;
99
+ currentSample !== lastSample && sampleValues[currentSample] <= aX;
100
+ ++currentSample
101
+ ) {
102
+ intervalStart += kSampleStepSize
103
+ }
104
+ --currentSample
105
+
106
+ // Interpolate to provide an initial guess for t
107
+ const dist =
108
+ (aX - sampleValues[currentSample]) /
109
+ (sampleValues[currentSample + 1] - sampleValues[currentSample])
110
+ const guessForT = intervalStart + dist * kSampleStepSize
111
+
112
+ const initialSlope = getSlope(guessForT, mX1, mX2)
113
+ if (initialSlope >= NEWTON_MIN_SLOPE) {
114
+ return newtonRaphsonIterate(aX, guessForT, mX1, mX2)
115
+ }
116
+ if (initialSlope === 0.0) {
117
+ return guessForT
118
+ }
119
+ return binarySubdivide(aX, intervalStart, intervalStart + kSampleStepSize, mX1, mX2)
120
+ }
121
+
122
+ return function BezierEasing(x: number) {
123
+ // Because JavaScript number are imprecise, we should guarantee the extremes are right.
124
+ if (x === 0 || x === 1) {
125
+ return x
126
+ }
127
+ return calcBezier(getTForX(x), mY1, mY2)
128
+ }
129
+ }
package/src/index.tsx ADDED
@@ -0,0 +1,53 @@
1
+ import { bezier } from './cubicBezier'
2
+
3
+ type TransformType = {
4
+ x: number | undefined
5
+ y: number | undefined
6
+ scaleX: number | undefined
7
+ scaleY: number | undefined
8
+ }
9
+
10
+ type CubicBuzier = [number, number, number, number]
11
+
12
+ interface AnimateProps {
13
+ from: TransformType
14
+ to: TransformType
15
+ duration: number
16
+ onUpdate: (param: TransformType) => void
17
+ cubicBezier?: CubicBuzier
18
+ }
19
+
20
+ export function animate(param: AnimateProps): void {
21
+ let start = null
22
+ const easing = param.cubicBezier ? bezier(...param.cubicBezier) : (v: number) => v
23
+
24
+ const { x: fromX, y: fromY, scaleX: fromScaleX, scaleY: fromScaleY } = param.from
25
+ const { x: toX, y: toY, scaleX: toScaleX, scaleY: toScaleY } = param.to
26
+
27
+ function frame(timestamp) {
28
+ if (!start) start = timestamp
29
+ const progress = timestamp - start!
30
+ const x =
31
+ toX !== undefined
32
+ ? fromX! + (toX - fromX!) * easing(progress / param.duration)
33
+ : undefined // apply the easing function to the progress
34
+ const y =
35
+ toY !== undefined
36
+ ? fromY! + (toY - fromY!) * easing(progress / param.duration)
37
+ : undefined
38
+ const scaleX =
39
+ toScaleX !== undefined
40
+ ? fromScaleX! + (toScaleX - fromScaleX!) * easing(progress / param.duration)
41
+ : undefined
42
+ const scaleY =
43
+ toScaleY !== undefined
44
+ ? fromScaleY! + (toScaleY - fromScaleY!) * easing(progress / param.duration)
45
+ : undefined
46
+ param.onUpdate({ x, y, scaleX, scaleY })
47
+
48
+ if (progress < param.duration) {
49
+ requestAnimationFrame(frame) // continue animating
50
+ }
51
+ }
52
+ requestAnimationFrame(frame)
53
+ }
@@ -0,0 +1,3 @@
1
+ export declare function bezier(mX1: number, mY1: number, mX2: number, mY2: number): (x: number) => number;
2
+
3
+ //# sourceMappingURL=cubicBezier.d.ts.map
@@ -0,0 +1,11 @@
1
+ {
2
+ "mappings": "AAqEA,OAAO,iBAAS,OACd,aACA,aACA,aACA,eACE",
3
+ "names": [],
4
+ "sources": [
5
+ "src/cubicBezier.tsx"
6
+ ],
7
+ "version": 3,
8
+ "sourcesContent": [
9
+ "/**\n * https://github.com/gre/bezier-easing\n * BezierEasing - use bezier curve for transition easing function\n * by Gaëtan Renaudeau 2014 - 2015 – MIT License\n */\n\n// These values are established by empiricism with tests (tradeoff: performance VS precision)\nconst NEWTON_ITERATIONS = 4\nconst NEWTON_MIN_SLOPE = 0.001\nconst SUBDIVISION_PRECISION = 0.0000001\nconst SUBDIVISION_MAX_ITERATIONS = 10\n\nconst kSplineTableSize = 11\nconst kSampleStepSize = 1.0 / (kSplineTableSize - 1.0)\n\nconst float32ArraySupported = typeof Float32Array === 'function'\n\nfunction A(aA1: number, aA2: number) {\n return 1.0 - 3.0 * aA2 + 3.0 * aA1\n}\nfunction B(aA1: number, aA2: number) {\n return 3.0 * aA2 - 6.0 * aA1\n}\nfunction C(aA1: number) {\n return 3.0 * aA1\n}\n\n// Returns x(t) given t, x1, and x2, or y(t) given t, y1, and y2.\nfunction calcBezier(aT: number, aA1: number, aA2: number) {\n return ((A(aA1, aA2) * aT + B(aA1, aA2)) * aT + C(aA1)) * aT\n}\n\n// Returns dx/dt given t, x1, and x2, or dy/dt given t, y1, and y2.\nfunction getSlope(aT: number, aA1: number, aA2: number) {\n return 3.0 * A(aA1, aA2) * aT * aT + 2.0 * B(aA1, aA2) * aT + C(aA1)\n}\n\nfunction binarySubdivide(aX: number, aA: number, aB: number, mX1: number, mX2: number) {\n let currentX: number\n let currentT: number\n let i = 0\n do {\n currentT = aA + (aB - aA) / 2.0\n currentX = calcBezier(currentT, mX1, mX2) - aX\n if (currentX > 0.0) {\n aB = currentT\n } else {\n aA = currentT\n }\n } while (Math.abs(currentX) > SUBDIVISION_PRECISION && ++i < SUBDIVISION_MAX_ITERATIONS)\n return currentT\n}\n\nfunction newtonRaphsonIterate(aX: number, aGuessT: number, mX1: number, mX2: number) {\n for (let i = 0; i < NEWTON_ITERATIONS; ++i) {\n const currentSlope = getSlope(aGuessT, mX1, mX2)\n if (currentSlope === 0.0) {\n return aGuessT\n }\n const currentX = calcBezier(aGuessT, mX1, mX2) - aX\n aGuessT -= currentX / currentSlope\n }\n return aGuessT\n}\n\nfunction LinearEasing(x: number): number {\n return x\n}\n\nexport function bezier(\n mX1: number,\n mY1: number,\n mX2: number,\n mY2: number\n): (x: number) => number {\n if (!(0 <= mX1 && mX1 <= 1 && 0 <= mX2 && mX2 <= 1)) {\n throw new Error('bezier x values must be in [0, 1] range')\n }\n\n if (mX1 === mY1 && mX2 === mY2) {\n return LinearEasing\n }\n\n // Precompute samples table\n const sampleValues = float32ArraySupported\n ? new Float32Array(kSplineTableSize)\n : new Array(kSplineTableSize)\n for (let i = 0; i < kSplineTableSize; ++i) {\n sampleValues[i] = calcBezier(i * kSampleStepSize, mX1, mX2)\n }\n\n function getTForX(aX) {\n let intervalStart = 0.0\n let currentSample = 1\n const lastSample = kSplineTableSize - 1\n\n for (\n ;\n currentSample !== lastSample && sampleValues[currentSample] <= aX;\n ++currentSample\n ) {\n intervalStart += kSampleStepSize\n }\n --currentSample\n\n // Interpolate to provide an initial guess for t\n const dist =\n (aX - sampleValues[currentSample]) /\n (sampleValues[currentSample + 1] - sampleValues[currentSample])\n const guessForT = intervalStart + dist * kSampleStepSize\n\n const initialSlope = getSlope(guessForT, mX1, mX2)\n if (initialSlope >= NEWTON_MIN_SLOPE) {\n return newtonRaphsonIterate(aX, guessForT, mX1, mX2)\n }\n if (initialSlope === 0.0) {\n return guessForT\n }\n return binarySubdivide(aX, intervalStart, intervalStart + kSampleStepSize, mX1, mX2)\n }\n\n return function BezierEasing(x: number) {\n // Because JavaScript number are imprecise, we should guarantee the extremes are right.\n if (x === 0 || x === 1) {\n return x\n }\n return calcBezier(getTForX(x), mY1, mY2)\n }\n}\n"
10
+ ]
11
+ }
@@ -0,0 +1,18 @@
1
+ type TransformType = {
2
+ x: number | undefined;
3
+ y: number | undefined;
4
+ scaleX: number | undefined;
5
+ scaleY: number | undefined;
6
+ };
7
+ type CubicBuzier = [number, number, number, number];
8
+ interface AnimateProps {
9
+ from: TransformType;
10
+ to: TransformType;
11
+ duration: number;
12
+ onUpdate: (param: TransformType) => void;
13
+ cubicBezier?: CubicBuzier;
14
+ }
15
+ export declare function animate(param: AnimateProps): void;
16
+ export {};
17
+
18
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1,11 @@
1
+ {
2
+ "mappings": "KAEK,gBAAgB;CACnB;CACA;CACA;CACA;;KAGG;UAEK,aAAa;CACrB,MAAM;CACN,IAAI;CACJ;CACA,WAAW,OAAO;CAClB,cAAc;;AAGhB,OAAO,iBAAS,QAAQ,OAAO",
3
+ "names": [],
4
+ "sources": [
5
+ "src/index.tsx"
6
+ ],
7
+ "version": 3,
8
+ "sourcesContent": [
9
+ "import { bezier } from './cubicBezier'\n\ntype TransformType = {\n x: number | undefined\n y: number | undefined\n scaleX: number | undefined\n scaleY: number | undefined\n}\n\ntype CubicBuzier = [number, number, number, number]\n\ninterface AnimateProps {\n from: TransformType\n to: TransformType\n duration: number\n onUpdate: (param: TransformType) => void\n cubicBezier?: CubicBuzier\n}\n\nexport function animate(param: AnimateProps): void {\n let start = null\n const easing = param.cubicBezier ? bezier(...param.cubicBezier) : (v: number) => v\n\n const { x: fromX, y: fromY, scaleX: fromScaleX, scaleY: fromScaleY } = param.from\n const { x: toX, y: toY, scaleX: toScaleX, scaleY: toScaleY } = param.to\n\n function frame(timestamp) {\n if (!start) start = timestamp\n const progress = timestamp - start!\n const x =\n toX !== undefined\n ? fromX! + (toX - fromX!) * easing(progress / param.duration)\n : undefined // apply the easing function to the progress\n const y =\n toY !== undefined\n ? fromY! + (toY - fromY!) * easing(progress / param.duration)\n : undefined\n const scaleX =\n toScaleX !== undefined\n ? fromScaleX! + (toScaleX - fromScaleX!) * easing(progress / param.duration)\n : undefined\n const scaleY =\n toScaleY !== undefined\n ? fromScaleY! + (toScaleY - fromScaleY!) * easing(progress / param.duration)\n : undefined\n param.onUpdate({ x, y, scaleX, scaleY })\n\n if (progress < param.duration) {\n requestAnimationFrame(frame) // continue animating\n }\n }\n requestAnimationFrame(frame)\n}\n"
10
+ ]
11
+ }