framer-motion 12.7.4 → 12.7.5-alpha.1
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 +1 -1
- package/dist/cjs/client.js +1 -1
- package/dist/cjs/{create-BErHrlzf.js → create-D5a67TOR.js} +99 -2828
- package/dist/cjs/dom-mini.js +82 -66
- package/dist/cjs/dom.js +276 -3011
- package/dist/cjs/index.js +149 -206
- package/dist/cjs/m.js +13 -170
- package/dist/cjs/mini.js +77 -9
- package/dist/dom-mini.js +1 -1
- package/dist/dom.d.ts +5 -94
- package/dist/dom.js +1 -1
- package/dist/es/animation/animate/sequence.mjs +1 -1
- package/dist/es/animation/animators/waapi/animate-elements.mjs +78 -10
- package/dist/es/animation/interfaces/motion-value.mjs +11 -30
- package/dist/es/animation/interfaces/visual-element-target.mjs +1 -2
- package/dist/es/animation/optimized-appear/store-id.mjs +1 -1
- package/dist/es/animation/sequence/create.mjs +2 -5
- package/dist/es/animation/sequence/utils/edit.mjs +2 -3
- package/dist/es/animation/utils/default-transitions.mjs +1 -1
- package/dist/es/animation/utils/stagger.mjs +1 -1
- package/dist/es/components/Reorder/utils/check-reorder.mjs +1 -1
- package/dist/es/dom.mjs +2 -18
- package/dist/es/gestures/drag/VisualElementDragControls.mjs +1 -3
- package/dist/es/gestures/drag/utils/constraints.mjs +2 -3
- package/dist/es/gestures/focus.mjs +1 -1
- package/dist/es/gestures/pan/PanSession.mjs +1 -2
- package/dist/es/index.mjs +3 -24
- package/dist/es/motion/utils/is-forced-motion-value.mjs +1 -1
- package/dist/es/projection/animation/mix-values.mjs +2 -4
- package/dist/es/projection/geometry/delta-apply.mjs +1 -1
- package/dist/es/projection/geometry/delta-calc.mjs +1 -1
- package/dist/es/projection/geometry/delta-remove.mjs +1 -2
- package/dist/es/projection/node/create-projection-node.mjs +3 -7
- package/dist/es/projection/styles/scale-border-radius.mjs +1 -1
- package/dist/es/projection/styles/scale-box-shadow.mjs +1 -2
- package/dist/es/projection/styles/scale-correction.mjs +1 -1
- package/dist/es/projection.mjs +1 -3
- package/dist/es/render/VisualElement.mjs +2 -9
- package/dist/es/render/dom/DOMVisualElement.mjs +1 -1
- package/dist/es/render/dom/scroll/attach-animation.mjs +17 -0
- package/dist/es/render/dom/scroll/attach-function.mjs +23 -0
- package/dist/es/render/dom/scroll/index.mjs +6 -82
- package/dist/es/render/dom/scroll/offsets/index.mjs +2 -3
- package/dist/es/render/dom/scroll/utils/get-timeline.mjs +30 -0
- package/dist/es/render/html/HTMLVisualElement.mjs +1 -3
- package/dist/es/render/html/utils/build-styles.mjs +1 -4
- package/dist/es/render/html/utils/build-transform.mjs +1 -3
- package/dist/es/render/svg/SVGVisualElement.mjs +1 -3
- package/dist/es/render/svg/config-motion.mjs +1 -2
- package/dist/es/render/svg/utils/path.mjs +1 -1
- package/dist/es/render/svg/utils/scrape-motion-values.mjs +1 -1
- package/dist/es/render/svg/utils/transform-origin.mjs +1 -1
- package/dist/es/render/utils/motion-values.mjs +1 -1
- package/dist/es/utils/delay.mjs +1 -1
- package/dist/es/utils/transform.mjs +1 -1
- package/dist/es/utils/use-cycle.mjs +1 -1
- package/dist/es/utils/use-instant-transition.mjs +4 -4
- package/dist/es/value/use-spring.mjs +2 -3
- package/dist/es/value/use-will-change/get-will-change-name.mjs +1 -2
- package/dist/framer-motion.dev.js +3864 -3405
- package/dist/framer-motion.js +1 -1
- package/dist/m.d.ts +3 -50
- package/dist/mini.js +1 -1
- package/dist/size-rollup-animate.js +1 -1
- package/dist/size-rollup-dom-animation-assets.js +1 -1
- package/dist/size-rollup-dom-animation.js +1 -1
- package/dist/size-rollup-dom-max-assets.js +1 -1
- package/dist/size-rollup-dom-max.js +1 -1
- package/dist/size-rollup-m.js +1 -1
- package/dist/size-rollup-motion.js +1 -1
- package/dist/size-rollup-scroll.js +1 -1
- package/dist/size-rollup-waapi-animate.js +1 -1
- package/dist/types/client.d.ts +4 -3
- package/dist/types/index.d.ts +56 -351
- package/dist/{types.d-B50aGbjN.d.ts → types.d-B1Voffvi.d.ts} +3 -138
- package/package.json +9 -9
- package/dist/es/animation/animators/AcceleratedAnimation.mjs +0 -319
- package/dist/es/animation/animators/BaseAnimation.mjs +0 -120
- package/dist/es/animation/animators/MainThreadAnimation.mjs +0 -394
- package/dist/es/animation/animators/drivers/driver-frameloop.mjs +0 -16
- package/dist/es/animation/animators/utils/accelerated-values.mjs +0 -14
- package/dist/es/animation/animators/utils/can-animate.mjs +0 -42
- package/dist/es/animation/animators/waapi/utils/supports-waapi.mjs +0 -5
- package/dist/es/animation/generators/inertia.mjs +0 -87
- package/dist/es/animation/generators/keyframes.mjs +0 -51
- package/dist/es/animation/generators/spring/defaults.mjs +0 -27
- package/dist/es/animation/generators/spring/find.mjs +0 -85
- package/dist/es/animation/generators/spring/index.mjs +0 -174
- package/dist/es/animation/generators/utils/velocity.mjs +0 -9
- package/dist/es/animation/utils/is-animatable.mjs +0 -30
- package/dist/es/animation/utils/is-none.mjs +0 -15
- package/dist/es/easing/anticipate.mjs +0 -5
- package/dist/es/easing/back.mjs +0 -9
- package/dist/es/easing/circ.mjs +0 -8
- package/dist/es/easing/cubic-bezier.mjs +0 -51
- package/dist/es/easing/ease.mjs +0 -7
- package/dist/es/easing/modifiers/mirror.mjs +0 -5
- package/dist/es/easing/modifiers/reverse.mjs +0 -5
- package/dist/es/easing/steps.mjs +0 -15
- package/dist/es/easing/utils/get-easing-for-segment.mjs +0 -8
- package/dist/es/easing/utils/is-easing-array.mjs +0 -5
- package/dist/es/easing/utils/map.mjs +0 -37
- package/dist/es/render/dom/DOMKeyframesResolver.mjs +0 -130
- package/dist/es/render/dom/scroll/observe.mjs +0 -18
- package/dist/es/render/dom/utils/css-variables-conversion.mjs +0 -42
- package/dist/es/render/dom/utils/is-css-variable.mjs +0 -15
- package/dist/es/render/dom/utils/unit-conversion.mjs +0 -36
- package/dist/es/render/dom/value-types/animatable-none.mjs +0 -15
- package/dist/es/render/dom/value-types/defaults.mjs +0 -30
- package/dist/es/render/dom/value-types/dimensions.mjs +0 -15
- package/dist/es/render/dom/value-types/find.mjs +0 -15
- package/dist/es/render/dom/value-types/get-as-type.mjs +0 -10
- package/dist/es/render/dom/value-types/number-browser.mjs +0 -41
- package/dist/es/render/dom/value-types/number.mjs +0 -18
- package/dist/es/render/dom/value-types/test.mjs +0 -6
- package/dist/es/render/dom/value-types/transform.mjs +0 -31
- package/dist/es/render/dom/value-types/type-auto.mjs +0 -9
- package/dist/es/render/dom/value-types/type-int.mjs +0 -8
- package/dist/es/render/html/utils/keys-position.mjs +0 -13
- package/dist/es/render/html/utils/keys-transform.mjs +0 -28
- package/dist/es/render/html/utils/make-none-animatable.mjs +0 -30
- package/dist/es/render/html/utils/parse-transform.mjs +0 -83
- package/dist/es/render/utils/KeyframesResolver.mjs +0 -163
- package/dist/es/utils/clamp.mjs +0 -9
- package/dist/es/utils/hsla-to-rgba.mjs +0 -42
- package/dist/es/utils/interpolate.mjs +0 -76
- package/dist/es/utils/is-numerical-string.mjs +0 -6
- package/dist/es/utils/is-zero-value-string.mjs +0 -6
- package/dist/es/utils/mix/color.mjs +0 -47
- package/dist/es/utils/mix/complex.mjs +0 -93
- package/dist/es/utils/mix/immediate.mjs +0 -5
- package/dist/es/utils/mix/index.mjs +0 -14
- package/dist/es/utils/mix/number.mjs +0 -26
- package/dist/es/utils/mix/visibility.mjs +0 -16
- package/dist/es/utils/offsets/default.mjs +0 -9
- package/dist/es/utils/offsets/fill.mjs +0 -12
- package/dist/es/utils/offsets/time.mjs +0 -5
- package/dist/es/utils/pipe.mjs +0 -11
- package/dist/es/utils/use-instant-transition-state.mjs +0 -5
- package/dist/es/utils/wrap.mjs +0 -6
- package/dist/es/value/types/color/hex.mjs +0 -40
- package/dist/es/value/types/color/hsla.mjs +0 -22
- package/dist/es/value/types/color/index.mjs +0 -27
- package/dist/es/value/types/color/rgba.mjs +0 -25
- package/dist/es/value/types/color/utils.mjs +0 -29
- package/dist/es/value/types/complex/filter.mjs +0 -30
- package/dist/es/value/types/complex/index.mjs +0 -91
- package/dist/es/value/types/numbers/index.mjs +0 -17
- package/dist/es/value/types/numbers/units.mjs +0 -17
- package/dist/es/value/types/utils/color-regex.mjs +0 -3
- package/dist/es/value/types/utils/float-regex.mjs +0 -3
- package/dist/es/value/types/utils/is-nullish.mjs +0 -5
- package/dist/es/value/types/utils/sanitize.mjs +0 -5
- package/dist/es/value/types/utils/single-color-regex.mjs +0 -3
|
@@ -1,42 +0,0 @@
|
|
|
1
|
-
import { invariant } from 'motion-utils';
|
|
2
|
-
import { isNumericalString } from '../../../utils/is-numerical-string.mjs';
|
|
3
|
-
import { isCSSVariableToken } from './is-css-variable.mjs';
|
|
4
|
-
|
|
5
|
-
/**
|
|
6
|
-
* Parse Framer's special CSS variable format into a CSS token and a fallback.
|
|
7
|
-
*
|
|
8
|
-
* ```
|
|
9
|
-
* `var(--foo, #fff)` => [`--foo`, '#fff']
|
|
10
|
-
* ```
|
|
11
|
-
*
|
|
12
|
-
* @param current
|
|
13
|
-
*/
|
|
14
|
-
const splitCSSVariableRegex =
|
|
15
|
-
// eslint-disable-next-line redos-detector/no-unsafe-regex -- false positive, as it can match a lot of words
|
|
16
|
-
/^var\(--(?:([\w-]+)|([\w-]+), ?([a-zA-Z\d ()%#.,-]+))\)/u;
|
|
17
|
-
function parseCSSVariable(current) {
|
|
18
|
-
const match = splitCSSVariableRegex.exec(current);
|
|
19
|
-
if (!match)
|
|
20
|
-
return [,];
|
|
21
|
-
const [, token1, token2, fallback] = match;
|
|
22
|
-
return [`--${token1 ?? token2}`, fallback];
|
|
23
|
-
}
|
|
24
|
-
const maxDepth = 4;
|
|
25
|
-
function getVariableValue(current, element, depth = 1) {
|
|
26
|
-
invariant(depth <= maxDepth, `Max CSS variable fallback depth detected in property "${current}". This may indicate a circular fallback dependency.`);
|
|
27
|
-
const [token, fallback] = parseCSSVariable(current);
|
|
28
|
-
// No CSS variable detected
|
|
29
|
-
if (!token)
|
|
30
|
-
return;
|
|
31
|
-
// Attempt to read this CSS variable off the element
|
|
32
|
-
const resolved = window.getComputedStyle(element).getPropertyValue(token);
|
|
33
|
-
if (resolved) {
|
|
34
|
-
const trimmed = resolved.trim();
|
|
35
|
-
return isNumericalString(trimmed) ? parseFloat(trimmed) : trimmed;
|
|
36
|
-
}
|
|
37
|
-
return isCSSVariableToken(fallback)
|
|
38
|
-
? getVariableValue(fallback, element, depth + 1)
|
|
39
|
-
: fallback;
|
|
40
|
-
}
|
|
41
|
-
|
|
42
|
-
export { getVariableValue, parseCSSVariable };
|
|
@@ -1,15 +0,0 @@
|
|
|
1
|
-
const checkStringStartsWith = (token) => (key) => typeof key === "string" && key.startsWith(token);
|
|
2
|
-
const isCSSVariableName =
|
|
3
|
-
/*@__PURE__*/ checkStringStartsWith("--");
|
|
4
|
-
const startsAsVariableToken =
|
|
5
|
-
/*@__PURE__*/ checkStringStartsWith("var(--");
|
|
6
|
-
const isCSSVariableToken = (value) => {
|
|
7
|
-
const startsWithToken = startsAsVariableToken(value);
|
|
8
|
-
if (!startsWithToken)
|
|
9
|
-
return false;
|
|
10
|
-
// Ensure any comments are stripped from the value as this can harm performance of the regex.
|
|
11
|
-
return singleCssVariableRegex.test(value.split("/*")[0].trim());
|
|
12
|
-
};
|
|
13
|
-
const singleCssVariableRegex = /var\(--(?:[\w-]+\s*|[\w-]+\s*,(?:\s*[^)(\s]|\s*\((?:[^)(]|\([^)(]*\))*\))+\s*)\)$/iu;
|
|
14
|
-
|
|
15
|
-
export { isCSSVariableName, isCSSVariableToken };
|
|
@@ -1,36 +0,0 @@
|
|
|
1
|
-
import { number } from '../../../value/types/numbers/index.mjs';
|
|
2
|
-
import { px } from '../../../value/types/numbers/units.mjs';
|
|
3
|
-
import { transformPropOrder } from '../../html/utils/keys-transform.mjs';
|
|
4
|
-
import { parseValueFromTransform } from '../../html/utils/parse-transform.mjs';
|
|
5
|
-
|
|
6
|
-
const isNumOrPxType = (v) => v === number || v === px;
|
|
7
|
-
const transformKeys = new Set(["x", "y", "z"]);
|
|
8
|
-
const nonTranslationalTransformKeys = transformPropOrder.filter((key) => !transformKeys.has(key));
|
|
9
|
-
function removeNonTranslationalTransform(visualElement) {
|
|
10
|
-
const removedTransforms = [];
|
|
11
|
-
nonTranslationalTransformKeys.forEach((key) => {
|
|
12
|
-
const value = visualElement.getValue(key);
|
|
13
|
-
if (value !== undefined) {
|
|
14
|
-
removedTransforms.push([key, value.get()]);
|
|
15
|
-
value.set(key.startsWith("scale") ? 1 : 0);
|
|
16
|
-
}
|
|
17
|
-
});
|
|
18
|
-
return removedTransforms;
|
|
19
|
-
}
|
|
20
|
-
const positionalValues = {
|
|
21
|
-
// Dimensions
|
|
22
|
-
width: ({ x }, { paddingLeft = "0", paddingRight = "0" }) => x.max - x.min - parseFloat(paddingLeft) - parseFloat(paddingRight),
|
|
23
|
-
height: ({ y }, { paddingTop = "0", paddingBottom = "0" }) => y.max - y.min - parseFloat(paddingTop) - parseFloat(paddingBottom),
|
|
24
|
-
top: (_bbox, { top }) => parseFloat(top),
|
|
25
|
-
left: (_bbox, { left }) => parseFloat(left),
|
|
26
|
-
bottom: ({ y }, { top }) => parseFloat(top) + (y.max - y.min),
|
|
27
|
-
right: ({ x }, { left }) => parseFloat(left) + (x.max - x.min),
|
|
28
|
-
// Transform
|
|
29
|
-
x: (_bbox, { transform }) => parseValueFromTransform(transform, "x"),
|
|
30
|
-
y: (_bbox, { transform }) => parseValueFromTransform(transform, "y"),
|
|
31
|
-
};
|
|
32
|
-
// Alias translate longform names
|
|
33
|
-
positionalValues.translateX = positionalValues.x;
|
|
34
|
-
positionalValues.translateY = positionalValues.y;
|
|
35
|
-
|
|
36
|
-
export { isNumOrPxType, positionalValues, removeNonTranslationalTransform };
|
|
@@ -1,15 +0,0 @@
|
|
|
1
|
-
import { complex } from '../../../value/types/complex/index.mjs';
|
|
2
|
-
import { filter } from '../../../value/types/complex/filter.mjs';
|
|
3
|
-
import { getDefaultValueType } from './defaults.mjs';
|
|
4
|
-
|
|
5
|
-
function getAnimatableNone(key, value) {
|
|
6
|
-
let defaultValueType = getDefaultValueType(key);
|
|
7
|
-
if (defaultValueType !== filter)
|
|
8
|
-
defaultValueType = complex;
|
|
9
|
-
// If value is not recognised as animatable, ie "none", create an animatable version origin based on the target
|
|
10
|
-
return defaultValueType.getAnimatableNone
|
|
11
|
-
? defaultValueType.getAnimatableNone(value)
|
|
12
|
-
: undefined;
|
|
13
|
-
}
|
|
14
|
-
|
|
15
|
-
export { getAnimatableNone };
|
|
@@ -1,30 +0,0 @@
|
|
|
1
|
-
import { color } from '../../../value/types/color/index.mjs';
|
|
2
|
-
import { filter } from '../../../value/types/complex/filter.mjs';
|
|
3
|
-
import { numberValueTypes } from './number.mjs';
|
|
4
|
-
|
|
5
|
-
/**
|
|
6
|
-
* A map of default value types for common values
|
|
7
|
-
*/
|
|
8
|
-
const defaultValueTypes = {
|
|
9
|
-
...numberValueTypes,
|
|
10
|
-
// Color props
|
|
11
|
-
color,
|
|
12
|
-
backgroundColor: color,
|
|
13
|
-
outlineColor: color,
|
|
14
|
-
fill: color,
|
|
15
|
-
stroke: color,
|
|
16
|
-
// Border props
|
|
17
|
-
borderColor: color,
|
|
18
|
-
borderTopColor: color,
|
|
19
|
-
borderRightColor: color,
|
|
20
|
-
borderBottomColor: color,
|
|
21
|
-
borderLeftColor: color,
|
|
22
|
-
filter,
|
|
23
|
-
WebkitFilter: filter,
|
|
24
|
-
};
|
|
25
|
-
/**
|
|
26
|
-
* Gets the default ValueType for the provided value key
|
|
27
|
-
*/
|
|
28
|
-
const getDefaultValueType = (key) => defaultValueTypes[key];
|
|
29
|
-
|
|
30
|
-
export { defaultValueTypes, getDefaultValueType };
|
|
@@ -1,15 +0,0 @@
|
|
|
1
|
-
import { number } from '../../../value/types/numbers/index.mjs';
|
|
2
|
-
import { px, percent, degrees, vw, vh } from '../../../value/types/numbers/units.mjs';
|
|
3
|
-
import { testValueType } from './test.mjs';
|
|
4
|
-
import { auto } from './type-auto.mjs';
|
|
5
|
-
|
|
6
|
-
/**
|
|
7
|
-
* A list of value types commonly used for dimensions
|
|
8
|
-
*/
|
|
9
|
-
const dimensionValueTypes = [number, px, percent, degrees, vw, vh, auto];
|
|
10
|
-
/**
|
|
11
|
-
* Tests a dimensional value against the list of dimension ValueTypes
|
|
12
|
-
*/
|
|
13
|
-
const findDimensionValueType = (v) => dimensionValueTypes.find(testValueType(v));
|
|
14
|
-
|
|
15
|
-
export { dimensionValueTypes, findDimensionValueType };
|
|
@@ -1,15 +0,0 @@
|
|
|
1
|
-
import { color } from '../../../value/types/color/index.mjs';
|
|
2
|
-
import { complex } from '../../../value/types/complex/index.mjs';
|
|
3
|
-
import { dimensionValueTypes } from './dimensions.mjs';
|
|
4
|
-
import { testValueType } from './test.mjs';
|
|
5
|
-
|
|
6
|
-
/**
|
|
7
|
-
* A list of all ValueTypes
|
|
8
|
-
*/
|
|
9
|
-
const valueTypes = [...dimensionValueTypes, color, complex];
|
|
10
|
-
/**
|
|
11
|
-
* Tests a value against the list of ValueTypes
|
|
12
|
-
*/
|
|
13
|
-
const findValueType = (v) => valueTypes.find(testValueType(v));
|
|
14
|
-
|
|
15
|
-
export { findValueType };
|
|
@@ -1,41 +0,0 @@
|
|
|
1
|
-
import { px } from '../../../value/types/numbers/units.mjs';
|
|
2
|
-
|
|
3
|
-
const browserNumberValueTypes = {
|
|
4
|
-
// Border props
|
|
5
|
-
borderWidth: px,
|
|
6
|
-
borderTopWidth: px,
|
|
7
|
-
borderRightWidth: px,
|
|
8
|
-
borderBottomWidth: px,
|
|
9
|
-
borderLeftWidth: px,
|
|
10
|
-
borderRadius: px,
|
|
11
|
-
radius: px,
|
|
12
|
-
borderTopLeftRadius: px,
|
|
13
|
-
borderTopRightRadius: px,
|
|
14
|
-
borderBottomRightRadius: px,
|
|
15
|
-
borderBottomLeftRadius: px,
|
|
16
|
-
// Positioning props
|
|
17
|
-
width: px,
|
|
18
|
-
maxWidth: px,
|
|
19
|
-
height: px,
|
|
20
|
-
maxHeight: px,
|
|
21
|
-
top: px,
|
|
22
|
-
right: px,
|
|
23
|
-
bottom: px,
|
|
24
|
-
left: px,
|
|
25
|
-
// Spacing props
|
|
26
|
-
padding: px,
|
|
27
|
-
paddingTop: px,
|
|
28
|
-
paddingRight: px,
|
|
29
|
-
paddingBottom: px,
|
|
30
|
-
paddingLeft: px,
|
|
31
|
-
margin: px,
|
|
32
|
-
marginTop: px,
|
|
33
|
-
marginRight: px,
|
|
34
|
-
marginBottom: px,
|
|
35
|
-
marginLeft: px,
|
|
36
|
-
// Misc
|
|
37
|
-
backgroundPositionX: px,
|
|
38
|
-
backgroundPositionY: px,
|
|
39
|
-
};
|
|
40
|
-
|
|
41
|
-
export { browserNumberValueTypes };
|
|
@@ -1,18 +0,0 @@
|
|
|
1
|
-
import { alpha } from '../../../value/types/numbers/index.mjs';
|
|
2
|
-
import { px } from '../../../value/types/numbers/units.mjs';
|
|
3
|
-
import { browserNumberValueTypes } from './number-browser.mjs';
|
|
4
|
-
import { transformValueTypes } from './transform.mjs';
|
|
5
|
-
import { int } from './type-int.mjs';
|
|
6
|
-
|
|
7
|
-
const numberValueTypes = {
|
|
8
|
-
...browserNumberValueTypes,
|
|
9
|
-
...transformValueTypes,
|
|
10
|
-
zIndex: int,
|
|
11
|
-
size: px,
|
|
12
|
-
// SVG
|
|
13
|
-
fillOpacity: alpha,
|
|
14
|
-
strokeOpacity: alpha,
|
|
15
|
-
numOctaves: int,
|
|
16
|
-
};
|
|
17
|
-
|
|
18
|
-
export { numberValueTypes };
|
|
@@ -1,31 +0,0 @@
|
|
|
1
|
-
import { scale, alpha } from '../../../value/types/numbers/index.mjs';
|
|
2
|
-
import { degrees, px, progressPercentage } from '../../../value/types/numbers/units.mjs';
|
|
3
|
-
|
|
4
|
-
const transformValueTypes = {
|
|
5
|
-
rotate: degrees,
|
|
6
|
-
rotateX: degrees,
|
|
7
|
-
rotateY: degrees,
|
|
8
|
-
rotateZ: degrees,
|
|
9
|
-
scale,
|
|
10
|
-
scaleX: scale,
|
|
11
|
-
scaleY: scale,
|
|
12
|
-
scaleZ: scale,
|
|
13
|
-
skew: degrees,
|
|
14
|
-
skewX: degrees,
|
|
15
|
-
skewY: degrees,
|
|
16
|
-
distance: px,
|
|
17
|
-
translateX: px,
|
|
18
|
-
translateY: px,
|
|
19
|
-
translateZ: px,
|
|
20
|
-
x: px,
|
|
21
|
-
y: px,
|
|
22
|
-
z: px,
|
|
23
|
-
perspective: px,
|
|
24
|
-
transformPerspective: px,
|
|
25
|
-
opacity: alpha,
|
|
26
|
-
originX: progressPercentage,
|
|
27
|
-
originY: progressPercentage,
|
|
28
|
-
originZ: px,
|
|
29
|
-
};
|
|
30
|
-
|
|
31
|
-
export { transformValueTypes };
|
|
@@ -1,28 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Generate a list of every possible transform key.
|
|
3
|
-
*/
|
|
4
|
-
const transformPropOrder = [
|
|
5
|
-
"transformPerspective",
|
|
6
|
-
"x",
|
|
7
|
-
"y",
|
|
8
|
-
"z",
|
|
9
|
-
"translateX",
|
|
10
|
-
"translateY",
|
|
11
|
-
"translateZ",
|
|
12
|
-
"scale",
|
|
13
|
-
"scaleX",
|
|
14
|
-
"scaleY",
|
|
15
|
-
"rotate",
|
|
16
|
-
"rotateX",
|
|
17
|
-
"rotateY",
|
|
18
|
-
"rotateZ",
|
|
19
|
-
"skew",
|
|
20
|
-
"skewX",
|
|
21
|
-
"skewY",
|
|
22
|
-
];
|
|
23
|
-
/**
|
|
24
|
-
* A quick lookup for transform props.
|
|
25
|
-
*/
|
|
26
|
-
const transformProps = new Set(transformPropOrder);
|
|
27
|
-
|
|
28
|
-
export { transformPropOrder, transformProps };
|
|
@@ -1,30 +0,0 @@
|
|
|
1
|
-
import { analyseComplexValue } from '../../../value/types/complex/index.mjs';
|
|
2
|
-
import { getAnimatableNone } from '../../dom/value-types/animatable-none.mjs';
|
|
3
|
-
|
|
4
|
-
/**
|
|
5
|
-
* If we encounter keyframes like "none" or "0" and we also have keyframes like
|
|
6
|
-
* "#fff" or "200px 200px" we want to find a keyframe to serve as a template for
|
|
7
|
-
* the "none" keyframes. In this case "#fff" or "200px 200px" - then these get turned into
|
|
8
|
-
* zero equivalents, i.e. "#fff0" or "0px 0px".
|
|
9
|
-
*/
|
|
10
|
-
const invalidTemplates = new Set(["auto", "none", "0"]);
|
|
11
|
-
function makeNoneKeyframesAnimatable(unresolvedKeyframes, noneKeyframeIndexes, name) {
|
|
12
|
-
let i = 0;
|
|
13
|
-
let animatableTemplate = undefined;
|
|
14
|
-
while (i < unresolvedKeyframes.length && !animatableTemplate) {
|
|
15
|
-
const keyframe = unresolvedKeyframes[i];
|
|
16
|
-
if (typeof keyframe === "string" &&
|
|
17
|
-
!invalidTemplates.has(keyframe) &&
|
|
18
|
-
analyseComplexValue(keyframe).values.length) {
|
|
19
|
-
animatableTemplate = unresolvedKeyframes[i];
|
|
20
|
-
}
|
|
21
|
-
i++;
|
|
22
|
-
}
|
|
23
|
-
if (animatableTemplate && name) {
|
|
24
|
-
for (const noneIndex of noneKeyframeIndexes) {
|
|
25
|
-
unresolvedKeyframes[noneIndex] = getAnimatableNone(name, animatableTemplate);
|
|
26
|
-
}
|
|
27
|
-
}
|
|
28
|
-
}
|
|
29
|
-
|
|
30
|
-
export { makeNoneKeyframesAnimatable };
|
|
@@ -1,83 +0,0 @@
|
|
|
1
|
-
const radToDeg = (rad) => (rad * 180) / Math.PI;
|
|
2
|
-
const rotate = (v) => {
|
|
3
|
-
const angle = radToDeg(Math.atan2(v[1], v[0]));
|
|
4
|
-
return rebaseAngle(angle);
|
|
5
|
-
};
|
|
6
|
-
const matrix2dParsers = {
|
|
7
|
-
x: 4,
|
|
8
|
-
y: 5,
|
|
9
|
-
translateX: 4,
|
|
10
|
-
translateY: 5,
|
|
11
|
-
scaleX: 0,
|
|
12
|
-
scaleY: 3,
|
|
13
|
-
scale: (v) => (Math.abs(v[0]) + Math.abs(v[3])) / 2,
|
|
14
|
-
rotate,
|
|
15
|
-
rotateZ: rotate,
|
|
16
|
-
skewX: (v) => radToDeg(Math.atan(v[1])),
|
|
17
|
-
skewY: (v) => radToDeg(Math.atan(v[2])),
|
|
18
|
-
skew: (v) => (Math.abs(v[1]) + Math.abs(v[2])) / 2,
|
|
19
|
-
};
|
|
20
|
-
const rebaseAngle = (angle) => {
|
|
21
|
-
angle = angle % 360;
|
|
22
|
-
if (angle < 0)
|
|
23
|
-
angle += 360;
|
|
24
|
-
return angle;
|
|
25
|
-
};
|
|
26
|
-
const rotateZ = rotate;
|
|
27
|
-
const scaleX = (v) => Math.sqrt(v[0] * v[0] + v[1] * v[1]);
|
|
28
|
-
const scaleY = (v) => Math.sqrt(v[4] * v[4] + v[5] * v[5]);
|
|
29
|
-
const matrix3dParsers = {
|
|
30
|
-
x: 12,
|
|
31
|
-
y: 13,
|
|
32
|
-
z: 14,
|
|
33
|
-
translateX: 12,
|
|
34
|
-
translateY: 13,
|
|
35
|
-
translateZ: 14,
|
|
36
|
-
scaleX,
|
|
37
|
-
scaleY,
|
|
38
|
-
scale: (v) => (scaleX(v) + scaleY(v)) / 2,
|
|
39
|
-
rotateX: (v) => rebaseAngle(radToDeg(Math.atan2(v[6], v[5]))),
|
|
40
|
-
rotateY: (v) => rebaseAngle(radToDeg(Math.atan2(-v[2], v[0]))),
|
|
41
|
-
rotateZ,
|
|
42
|
-
rotate: rotateZ,
|
|
43
|
-
skewX: (v) => radToDeg(Math.atan(v[4])),
|
|
44
|
-
skewY: (v) => radToDeg(Math.atan(v[1])),
|
|
45
|
-
skew: (v) => (Math.abs(v[1]) + Math.abs(v[4])) / 2,
|
|
46
|
-
};
|
|
47
|
-
function defaultTransformValue(name) {
|
|
48
|
-
return name.includes("scale") ? 1 : 0;
|
|
49
|
-
}
|
|
50
|
-
function parseValueFromTransform(transform, name) {
|
|
51
|
-
if (!transform || transform === "none") {
|
|
52
|
-
return defaultTransformValue(name);
|
|
53
|
-
}
|
|
54
|
-
const matrix3dMatch = transform.match(/^matrix3d\(([-\d.e\s,]+)\)$/u);
|
|
55
|
-
let parsers;
|
|
56
|
-
let match;
|
|
57
|
-
if (matrix3dMatch) {
|
|
58
|
-
parsers = matrix3dParsers;
|
|
59
|
-
match = matrix3dMatch;
|
|
60
|
-
}
|
|
61
|
-
else {
|
|
62
|
-
const matrix2dMatch = transform.match(/^matrix\(([-\d.e\s,]+)\)$/u);
|
|
63
|
-
parsers = matrix2dParsers;
|
|
64
|
-
match = matrix2dMatch;
|
|
65
|
-
}
|
|
66
|
-
if (!match) {
|
|
67
|
-
return defaultTransformValue(name);
|
|
68
|
-
}
|
|
69
|
-
const valueParser = parsers[name];
|
|
70
|
-
const values = match[1].split(",").map(convertTransformToNumber);
|
|
71
|
-
return typeof valueParser === "function"
|
|
72
|
-
? valueParser(values)
|
|
73
|
-
: values[valueParser];
|
|
74
|
-
}
|
|
75
|
-
const readTransformValue = (instance, name) => {
|
|
76
|
-
const { transform = "none" } = getComputedStyle(instance);
|
|
77
|
-
return parseValueFromTransform(transform, name);
|
|
78
|
-
};
|
|
79
|
-
function convertTransformToNumber(value) {
|
|
80
|
-
return parseFloat(value.trim());
|
|
81
|
-
}
|
|
82
|
-
|
|
83
|
-
export { parseValueFromTransform, readTransformValue };
|
|
@@ -1,163 +0,0 @@
|
|
|
1
|
-
import { frame } from 'motion-dom';
|
|
2
|
-
import { removeNonTranslationalTransform } from '../dom/utils/unit-conversion.mjs';
|
|
3
|
-
|
|
4
|
-
const toResolve = new Set();
|
|
5
|
-
let isScheduled = false;
|
|
6
|
-
let anyNeedsMeasurement = false;
|
|
7
|
-
function measureAllKeyframes() {
|
|
8
|
-
if (anyNeedsMeasurement) {
|
|
9
|
-
const resolversToMeasure = Array.from(toResolve).filter((resolver) => resolver.needsMeasurement);
|
|
10
|
-
const elementsToMeasure = new Set(resolversToMeasure.map((resolver) => resolver.element));
|
|
11
|
-
const transformsToRestore = new Map();
|
|
12
|
-
/**
|
|
13
|
-
* Write pass
|
|
14
|
-
* If we're measuring elements we want to remove bounding box-changing transforms.
|
|
15
|
-
*/
|
|
16
|
-
elementsToMeasure.forEach((element) => {
|
|
17
|
-
const removedTransforms = removeNonTranslationalTransform(element);
|
|
18
|
-
if (!removedTransforms.length)
|
|
19
|
-
return;
|
|
20
|
-
transformsToRestore.set(element, removedTransforms);
|
|
21
|
-
element.render();
|
|
22
|
-
});
|
|
23
|
-
// Read
|
|
24
|
-
resolversToMeasure.forEach((resolver) => resolver.measureInitialState());
|
|
25
|
-
// Write
|
|
26
|
-
elementsToMeasure.forEach((element) => {
|
|
27
|
-
element.render();
|
|
28
|
-
const restore = transformsToRestore.get(element);
|
|
29
|
-
if (restore) {
|
|
30
|
-
restore.forEach(([key, value]) => {
|
|
31
|
-
element.getValue(key)?.set(value);
|
|
32
|
-
});
|
|
33
|
-
}
|
|
34
|
-
});
|
|
35
|
-
// Read
|
|
36
|
-
resolversToMeasure.forEach((resolver) => resolver.measureEndState());
|
|
37
|
-
// Write
|
|
38
|
-
resolversToMeasure.forEach((resolver) => {
|
|
39
|
-
if (resolver.suspendedScrollY !== undefined) {
|
|
40
|
-
window.scrollTo(0, resolver.suspendedScrollY);
|
|
41
|
-
}
|
|
42
|
-
});
|
|
43
|
-
}
|
|
44
|
-
anyNeedsMeasurement = false;
|
|
45
|
-
isScheduled = false;
|
|
46
|
-
toResolve.forEach((resolver) => resolver.complete());
|
|
47
|
-
toResolve.clear();
|
|
48
|
-
}
|
|
49
|
-
function readAllKeyframes() {
|
|
50
|
-
toResolve.forEach((resolver) => {
|
|
51
|
-
resolver.readKeyframes();
|
|
52
|
-
if (resolver.needsMeasurement) {
|
|
53
|
-
anyNeedsMeasurement = true;
|
|
54
|
-
}
|
|
55
|
-
});
|
|
56
|
-
}
|
|
57
|
-
function flushKeyframeResolvers() {
|
|
58
|
-
readAllKeyframes();
|
|
59
|
-
measureAllKeyframes();
|
|
60
|
-
}
|
|
61
|
-
class KeyframeResolver {
|
|
62
|
-
constructor(unresolvedKeyframes, onComplete, name, motionValue, element, isAsync = false) {
|
|
63
|
-
/**
|
|
64
|
-
* Track whether this resolver has completed. Once complete, it never
|
|
65
|
-
* needs to attempt keyframe resolution again.
|
|
66
|
-
*/
|
|
67
|
-
this.isComplete = false;
|
|
68
|
-
/**
|
|
69
|
-
* Track whether this resolver is async. If it is, it'll be added to the
|
|
70
|
-
* resolver queue and flushed in the next frame. Resolvers that aren't going
|
|
71
|
-
* to trigger read/write thrashing don't need to be async.
|
|
72
|
-
*/
|
|
73
|
-
this.isAsync = false;
|
|
74
|
-
/**
|
|
75
|
-
* Track whether this resolver needs to perform a measurement
|
|
76
|
-
* to resolve its keyframes.
|
|
77
|
-
*/
|
|
78
|
-
this.needsMeasurement = false;
|
|
79
|
-
/**
|
|
80
|
-
* Track whether this resolver is currently scheduled to resolve
|
|
81
|
-
* to allow it to be cancelled and resumed externally.
|
|
82
|
-
*/
|
|
83
|
-
this.isScheduled = false;
|
|
84
|
-
this.unresolvedKeyframes = [...unresolvedKeyframes];
|
|
85
|
-
this.onComplete = onComplete;
|
|
86
|
-
this.name = name;
|
|
87
|
-
this.motionValue = motionValue;
|
|
88
|
-
this.element = element;
|
|
89
|
-
this.isAsync = isAsync;
|
|
90
|
-
}
|
|
91
|
-
scheduleResolve() {
|
|
92
|
-
this.isScheduled = true;
|
|
93
|
-
if (this.isAsync) {
|
|
94
|
-
toResolve.add(this);
|
|
95
|
-
if (!isScheduled) {
|
|
96
|
-
isScheduled = true;
|
|
97
|
-
frame.read(readAllKeyframes);
|
|
98
|
-
frame.resolveKeyframes(measureAllKeyframes);
|
|
99
|
-
}
|
|
100
|
-
}
|
|
101
|
-
else {
|
|
102
|
-
this.readKeyframes();
|
|
103
|
-
this.complete();
|
|
104
|
-
}
|
|
105
|
-
}
|
|
106
|
-
readKeyframes() {
|
|
107
|
-
const { unresolvedKeyframes, name, element, motionValue } = this;
|
|
108
|
-
/**
|
|
109
|
-
* If a keyframe is null, we hydrate it either by reading it from
|
|
110
|
-
* the instance, or propagating from previous keyframes.
|
|
111
|
-
*/
|
|
112
|
-
for (let i = 0; i < unresolvedKeyframes.length; i++) {
|
|
113
|
-
if (unresolvedKeyframes[i] === null) {
|
|
114
|
-
/**
|
|
115
|
-
* If the first keyframe is null, we need to find its value by sampling the element
|
|
116
|
-
*/
|
|
117
|
-
if (i === 0) {
|
|
118
|
-
const currentValue = motionValue?.get();
|
|
119
|
-
const finalKeyframe = unresolvedKeyframes[unresolvedKeyframes.length - 1];
|
|
120
|
-
if (currentValue !== undefined) {
|
|
121
|
-
unresolvedKeyframes[0] = currentValue;
|
|
122
|
-
}
|
|
123
|
-
else if (element && name) {
|
|
124
|
-
const valueAsRead = element.readValue(name, finalKeyframe);
|
|
125
|
-
if (valueAsRead !== undefined && valueAsRead !== null) {
|
|
126
|
-
unresolvedKeyframes[0] = valueAsRead;
|
|
127
|
-
}
|
|
128
|
-
}
|
|
129
|
-
if (unresolvedKeyframes[0] === undefined) {
|
|
130
|
-
unresolvedKeyframes[0] = finalKeyframe;
|
|
131
|
-
}
|
|
132
|
-
if (motionValue && currentValue === undefined) {
|
|
133
|
-
motionValue.set(unresolvedKeyframes[0]);
|
|
134
|
-
}
|
|
135
|
-
}
|
|
136
|
-
else {
|
|
137
|
-
unresolvedKeyframes[i] = unresolvedKeyframes[i - 1];
|
|
138
|
-
}
|
|
139
|
-
}
|
|
140
|
-
}
|
|
141
|
-
}
|
|
142
|
-
setFinalKeyframe() { }
|
|
143
|
-
measureInitialState() { }
|
|
144
|
-
renderEndStyles() { }
|
|
145
|
-
measureEndState() { }
|
|
146
|
-
complete() {
|
|
147
|
-
this.isComplete = true;
|
|
148
|
-
this.onComplete(this.unresolvedKeyframes, this.finalKeyframe);
|
|
149
|
-
toResolve.delete(this);
|
|
150
|
-
}
|
|
151
|
-
cancel() {
|
|
152
|
-
if (!this.isComplete) {
|
|
153
|
-
this.isScheduled = false;
|
|
154
|
-
toResolve.delete(this);
|
|
155
|
-
}
|
|
156
|
-
}
|
|
157
|
-
resume() {
|
|
158
|
-
if (!this.isComplete)
|
|
159
|
-
this.scheduleResolve();
|
|
160
|
-
}
|
|
161
|
-
}
|
|
162
|
-
|
|
163
|
-
export { KeyframeResolver, flushKeyframeResolvers };
|