source: node_modules/recharts/es6/animation/easing.js@ a762898

Last change on this file since a762898 was a762898, checked in by istevanoska <ilinastevanoska@…>, 5 months ago

Added visualizations

  • Property mode set to 100644
File size: 4.0 KB
Line 
1export var ACCURACY = 1e-4;
2var cubicBezierFactor = (c1, c2) => [0, 3 * c1, 3 * c2 - 6 * c1, 3 * c1 - 3 * c2 + 1];
3var evaluatePolynomial = (params, t) => params.map((param, i) => param * t ** i).reduce((pre, curr) => pre + curr);
4var cubicBezier = (c1, c2) => t => {
5 var params = cubicBezierFactor(c1, c2);
6 return evaluatePolynomial(params, t);
7};
8var derivativeCubicBezier = (c1, c2) => t => {
9 var params = cubicBezierFactor(c1, c2);
10 var newParams = [...params.map((param, i) => param * i).slice(1), 0];
11 return evaluatePolynomial(newParams, t);
12};
13var parseCubicBezier = easing => {
14 var _easingParts$;
15 var easingParts = easing.split('(');
16 if (easingParts.length !== 2 || easingParts[0] !== 'cubic-bezier') {
17 return null;
18 }
19 var numbers = (_easingParts$ = easingParts[1]) === null || _easingParts$ === void 0 || (_easingParts$ = _easingParts$.split(')')[0]) === null || _easingParts$ === void 0 ? void 0 : _easingParts$.split(',');
20 if (numbers == null || numbers.length !== 4) {
21 return null;
22 }
23 var coords = numbers.map(x => parseFloat(x));
24 return [coords[0], coords[1], coords[2], coords[3]];
25};
26var getBezierCoordinates = function getBezierCoordinates() {
27 for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
28 args[_key] = arguments[_key];
29 }
30 if (args.length === 1) {
31 switch (args[0]) {
32 case 'linear':
33 return [0.0, 0.0, 1.0, 1.0];
34 case 'ease':
35 return [0.25, 0.1, 0.25, 1.0];
36 case 'ease-in':
37 return [0.42, 0.0, 1.0, 1.0];
38 case 'ease-out':
39 return [0.42, 0.0, 0.58, 1.0];
40 case 'ease-in-out':
41 return [0.0, 0.0, 0.58, 1.0];
42 default:
43 {
44 var easing = parseCubicBezier(args[0]);
45 if (easing) {
46 return easing;
47 }
48 }
49 }
50 }
51 if (args.length === 4) {
52 return args;
53 }
54
55 // Fallback for invalid inputs. The previous implementation was buggy and would lead to NaN.
56 // Returning linear easing is a safe default.
57 return [0.0, 0.0, 1.0, 1.0];
58};
59var createBezierEasing = (x1, y1, x2, y2) => {
60 var curveX = cubicBezier(x1, x2);
61 var curveY = cubicBezier(y1, y2);
62 var derCurveX = derivativeCubicBezier(x1, x2);
63 var rangeValue = value => {
64 if (value > 1) {
65 return 1;
66 }
67 if (value < 0) {
68 return 0;
69 }
70 return value;
71 };
72 var bezier = _t => {
73 var t = _t > 1 ? 1 : _t;
74 var x = t;
75 for (var i = 0; i < 8; ++i) {
76 var evalT = curveX(x) - t;
77 var derVal = derCurveX(x);
78 if (Math.abs(evalT - t) < ACCURACY || derVal < ACCURACY) {
79 return curveY(x);
80 }
81 x = rangeValue(x - evalT / derVal);
82 }
83 return curveY(x);
84 };
85 bezier.isStepper = false;
86 return bezier;
87};
88
89// calculate cubic-bezier using Newton's method
90export var configBezier = function configBezier() {
91 return createBezierEasing(...getBezierCoordinates(...arguments));
92};
93export var configSpring = function configSpring() {
94 var config = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
95 var {
96 stiff = 100,
97 damping = 8,
98 dt = 17
99 } = config;
100 var stepper = (currX, destX, currV) => {
101 var FSpring = -(currX - destX) * stiff;
102 var FDamping = currV * damping;
103 var newV = currV + (FSpring - FDamping) * dt / 1000;
104 var newX = currV * dt / 1000 + currX;
105 if (Math.abs(newX - destX) < ACCURACY && Math.abs(newV) < ACCURACY) {
106 return [destX, 0];
107 }
108 return [newX, newV];
109 };
110 stepper.isStepper = true;
111 stepper.dt = dt;
112 return stepper;
113};
114export var configEasing = easing => {
115 if (typeof easing === 'string') {
116 switch (easing) {
117 case 'ease':
118 case 'ease-in-out':
119 case 'ease-out':
120 case 'ease-in':
121 case 'linear':
122 return configBezier(easing);
123 case 'spring':
124 return configSpring();
125 default:
126 if (easing.split('(')[0] === 'cubic-bezier') {
127 return configBezier(easing);
128 }
129 }
130 }
131 if (typeof easing === 'function') {
132 return easing;
133 }
134 return null;
135};
Note: See TracBrowser for help on using the repository browser.