framer-motion 7.2.0 → 7.3.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/dist/cjs/index.js +762 -627
- package/dist/es/animation/use-animated-state.mjs +3 -5
- package/dist/es/animation/utils/default-transitions.mjs +1 -1
- package/dist/es/animation/utils/transitions.mjs +28 -26
- package/dist/es/components/AnimatePresence/PopChild.mjs +3 -2
- package/dist/es/components/AnimatePresence/PresenceChild.mjs +5 -2
- package/dist/es/components/AnimatePresence/use-presence.mjs +1 -1
- package/dist/es/components/LayoutGroup/index.mjs +4 -5
- package/dist/es/components/LazyMotion/index.mjs +3 -5
- package/dist/es/components/MotionConfig/index.mjs +2 -4
- package/dist/es/components/Reorder/Group.mjs +2 -4
- package/dist/es/components/Reorder/Item.mjs +6 -8
- package/dist/es/context/MotionContext/utils.mjs +3 -2
- package/dist/es/gestures/PanSession.mjs +2 -2
- package/dist/es/gestures/drag/VisualElementDragControls.mjs +16 -4
- package/dist/es/gestures/use-focus-gesture.mjs +3 -4
- package/dist/es/gestures/use-hover-gesture.mjs +4 -3
- package/dist/es/gestures/use-tap-gesture.mjs +9 -10
- package/dist/es/index.mjs +2 -1
- package/dist/es/motion/features/animations.mjs +8 -3
- package/dist/es/motion/features/definitions.mjs +1 -13
- package/dist/es/motion/features/layout/MeasureLayout.mjs +12 -6
- package/dist/es/motion/features/load-features.mjs +14 -0
- package/dist/es/motion/features/viewport/observers.mjs +4 -7
- package/dist/es/motion/features/viewport/use-viewport.mjs +8 -6
- package/dist/es/motion/index.mjs +23 -23
- package/dist/es/motion/utils/VisualElementHandler.mjs +2 -5
- package/dist/es/motion/utils/is-forced-motion-value.mjs +3 -3
- package/dist/es/motion/utils/use-motion-ref.mjs +1 -2
- package/dist/es/motion/utils/use-visual-element.mjs +14 -12
- package/dist/es/motion/utils/use-visual-state.mjs +19 -16
- package/dist/es/motion/utils/valid-prop.mjs +22 -17
- package/dist/es/projection/geometry/utils.mjs +10 -1
- package/dist/es/projection/node/HTMLProjectionNode.mjs +1 -1
- package/dist/es/projection/node/create-projection-node.mjs +62 -20
- package/dist/es/projection/use-instant-layout-transition.mjs +2 -2
- package/dist/es/render/dom/features-animation.mjs +5 -1
- package/dist/es/render/dom/features-max.mjs +6 -1
- package/dist/es/render/dom/motion.mjs +6 -1
- package/dist/es/render/dom/use-render.mjs +5 -1
- package/dist/es/render/dom/utils/camel-to-dash.mjs +1 -3
- package/dist/es/render/dom/utils/create-config.mjs +7 -2
- package/dist/es/render/dom/utils/css-variables-conversion.mjs +5 -7
- package/dist/es/render/dom/utils/unit-conversion.mjs +4 -4
- package/dist/es/render/dom/value-types/defaults.mjs +15 -3
- package/dist/es/render/dom/value-types/type-int.mjs +4 -1
- package/dist/es/render/html/config-motion.mjs +1 -1
- package/dist/es/render/html/use-props.mjs +5 -9
- package/dist/es/render/html/utils/build-styles.mjs +17 -15
- package/dist/es/render/html/utils/build-transform.mjs +8 -18
- package/dist/es/render/html/utils/transform.mjs +21 -30
- package/dist/es/render/html/visual-element.mjs +8 -9
- package/dist/es/render/index.mjs +118 -40
- package/dist/es/render/svg/use-props.mjs +5 -2
- package/dist/es/render/svg/utils/build-attrs.mjs +3 -5
- package/dist/es/render/svg/utils/create-render-state.mjs +4 -1
- package/dist/es/render/svg/visual-element.mjs +8 -4
- package/dist/es/render/utils/animation-state.mjs +12 -9
- package/dist/es/render/utils/animation.mjs +14 -8
- package/dist/es/render/utils/is-controlling-variants.mjs +22 -0
- package/dist/es/render/utils/is-variant-label.mjs +8 -0
- package/dist/es/render/utils/motion-values.mjs +3 -3
- package/dist/es/render/utils/resolve-dynamic-variants.mjs +24 -0
- package/dist/es/render/utils/resolve-variants.mjs +26 -0
- package/dist/es/render/utils/setters.mjs +12 -9
- package/dist/es/utils/reduced-motion/index.mjs +19 -0
- package/dist/es/utils/reduced-motion/state.mjs +5 -0
- package/dist/es/utils/reduced-motion/use-reduced-motion-config.mjs +19 -0
- package/dist/es/utils/reduced-motion/use-reduced-motion.mjs +43 -0
- package/dist/es/utils/transform.mjs +4 -1
- package/dist/es/utils/use-in-view.mjs +1 -2
- package/dist/es/value/index.mjs +1 -1
- package/dist/es/value/use-scroll.mjs +6 -4
- package/dist/es/value/use-spring.mjs +7 -1
- package/dist/es/value/use-will-change/index.mjs +4 -4
- package/dist/es/value/utils/is-motion-value.mjs +1 -3
- package/dist/framer-motion.dev.js +806 -670
- package/dist/framer-motion.js +1 -1
- package/dist/index.d.ts +60 -54
- package/dist/projection.dev.js +402 -213
- package/dist/size-rollup-dom-animation-assets.js +1 -0
- package/dist/size-rollup-dom-animation-m.js +1 -0
- package/dist/size-rollup-dom-animation.js +1 -1
- package/dist/size-rollup-dom-max-assets.js +1 -0
- package/dist/size-rollup-dom-max.js +1 -1
- package/dist/size-rollup-m.js +1 -1
- package/dist/size-rollup-motion.js +1 -0
- package/dist/size-webpack-dom-animation.js +1 -1
- package/dist/size-webpack-dom-max.js +1 -1
- package/dist/size-webpack-m.js +1 -1
- package/dist/three-entry.d.ts +41 -22
- package/package.json +12 -8
- package/dist/es/motion/features/use-features.mjs +0 -40
- package/dist/es/motion/features/use-projection.mjs +0 -33
- package/dist/es/render/utils/variants.mjs +0 -73
- package/dist/es/utils/use-reduced-motion.mjs +0 -73
|
@@ -3,12 +3,12 @@ import { rootProjectionNode } from './node/HTMLProjectionNode.mjs';
|
|
|
3
3
|
function useInstantLayoutTransition() {
|
|
4
4
|
return startTransition;
|
|
5
5
|
}
|
|
6
|
-
function startTransition(
|
|
6
|
+
function startTransition(callback) {
|
|
7
7
|
if (!rootProjectionNode.current)
|
|
8
8
|
return;
|
|
9
9
|
rootProjectionNode.current.isUpdating = false;
|
|
10
10
|
rootProjectionNode.current.blockUpdate();
|
|
11
|
-
|
|
11
|
+
callback && callback();
|
|
12
12
|
}
|
|
13
13
|
|
|
14
14
|
export { useInstantLayoutTransition };
|
|
@@ -5,6 +5,10 @@ import { createDomVisualElement } from './create-visual-element.mjs';
|
|
|
5
5
|
/**
|
|
6
6
|
* @public
|
|
7
7
|
*/
|
|
8
|
-
const domAnimation =
|
|
8
|
+
const domAnimation = {
|
|
9
|
+
renderer: createDomVisualElement,
|
|
10
|
+
...animations,
|
|
11
|
+
...gestureAnimations,
|
|
12
|
+
};
|
|
9
13
|
|
|
10
14
|
export { domAnimation };
|
|
@@ -6,6 +6,11 @@ import { HTMLProjectionNode } from '../../projection/node/HTMLProjectionNode.mjs
|
|
|
6
6
|
/**
|
|
7
7
|
* @public
|
|
8
8
|
*/
|
|
9
|
-
const domMax =
|
|
9
|
+
const domMax = {
|
|
10
|
+
...domAnimation,
|
|
11
|
+
...drag,
|
|
12
|
+
...layoutFeatures,
|
|
13
|
+
projectionNodeConstructor: HTMLProjectionNode,
|
|
14
|
+
};
|
|
10
15
|
|
|
11
16
|
export { domMax };
|
|
@@ -8,7 +8,12 @@ import { createDomVisualElement } from './create-visual-element.mjs';
|
|
|
8
8
|
import { layoutFeatures } from '../../motion/features/layout/index.mjs';
|
|
9
9
|
import { HTMLProjectionNode } from '../../projection/node/HTMLProjectionNode.mjs';
|
|
10
10
|
|
|
11
|
-
const featureBundle =
|
|
11
|
+
const featureBundle = {
|
|
12
|
+
...animations,
|
|
13
|
+
...gestureAnimations,
|
|
14
|
+
...drag,
|
|
15
|
+
...layoutFeatures,
|
|
16
|
+
};
|
|
12
17
|
/**
|
|
13
18
|
* HTML & SVG components, optimised for use with gestures and animation. These can be used as
|
|
14
19
|
* drop-in replacements for any HTML & SVG component, all CSS & SVG properties are supported.
|
|
@@ -11,7 +11,11 @@ function createUseRender(forwardMotionProps = false) {
|
|
|
11
11
|
: useHTMLProps;
|
|
12
12
|
const visualProps = useVisualProps(props, latestValues, isStatic);
|
|
13
13
|
const filteredProps = filterProps(props, typeof Component === "string", forwardMotionProps);
|
|
14
|
-
const elementProps =
|
|
14
|
+
const elementProps = {
|
|
15
|
+
...filteredProps,
|
|
16
|
+
...visualProps,
|
|
17
|
+
ref,
|
|
18
|
+
};
|
|
15
19
|
if (projectionId) {
|
|
16
20
|
elementProps["data-projection-id"] = projectionId;
|
|
17
21
|
}
|
|
@@ -1,8 +1,6 @@
|
|
|
1
|
-
const CAMEL_CASE_PATTERN = /([a-z])([A-Z])/g;
|
|
2
|
-
const REPLACE_TEMPLATE = "$1-$2";
|
|
3
1
|
/**
|
|
4
2
|
* Convert camelCase to dash-case properties.
|
|
5
3
|
*/
|
|
6
|
-
const camelToDash = (str) => str.replace(
|
|
4
|
+
const camelToDash = (str) => str.replace(/([a-z])([A-Z])/g, "$1-$2").toLowerCase();
|
|
7
5
|
|
|
8
6
|
export { camelToDash };
|
|
@@ -7,9 +7,14 @@ function createDomMotionConfig(Component, { forwardMotionProps = false }, preloa
|
|
|
7
7
|
const baseConfig = isSVGComponent(Component)
|
|
8
8
|
? svgMotionConfig
|
|
9
9
|
: htmlMotionConfig;
|
|
10
|
-
return
|
|
10
|
+
return {
|
|
11
|
+
...baseConfig,
|
|
12
|
+
preloadedFeatures,
|
|
13
|
+
useRender: createUseRender(forwardMotionProps),
|
|
14
|
+
createVisualElement,
|
|
11
15
|
projectionNodeConstructor,
|
|
12
|
-
Component
|
|
16
|
+
Component,
|
|
17
|
+
};
|
|
13
18
|
}
|
|
14
19
|
|
|
15
20
|
export { createDomMotionConfig };
|
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
import { __rest } from 'tslib';
|
|
2
1
|
import { invariant } from 'hey-listen';
|
|
3
2
|
|
|
4
3
|
function isCSSVariable(value) {
|
|
@@ -46,16 +45,14 @@ function getVariableValue(current, element, depth = 1) {
|
|
|
46
45
|
*
|
|
47
46
|
* @internal
|
|
48
47
|
*/
|
|
49
|
-
function resolveCSSVariables(visualElement,
|
|
50
|
-
var _b;
|
|
51
|
-
var target = __rest(_a, []);
|
|
48
|
+
function resolveCSSVariables(visualElement, { ...target }, transitionEnd) {
|
|
52
49
|
const element = visualElement.getInstance();
|
|
53
50
|
if (!(element instanceof Element))
|
|
54
51
|
return { target, transitionEnd };
|
|
55
52
|
// If `transitionEnd` isn't `undefined`, clone it. We could clone `target` and `transitionEnd`
|
|
56
53
|
// only if they change but I think this reads clearer and this isn't a performance-critical path.
|
|
57
54
|
if (transitionEnd) {
|
|
58
|
-
transitionEnd =
|
|
55
|
+
transitionEnd = { ...transitionEnd };
|
|
59
56
|
}
|
|
60
57
|
// Go through existing `MotionValue`s and ensure any existing CSS variables are resolved
|
|
61
58
|
visualElement.forEachValue((value) => {
|
|
@@ -80,8 +77,9 @@ function resolveCSSVariables(visualElement, _a, transitionEnd) {
|
|
|
80
77
|
// If the user hasn't already set this key on `transitionEnd`, set it to the unresolved
|
|
81
78
|
// CSS variable. This will ensure that after the animation the component will reflect
|
|
82
79
|
// changes in the value of the CSS variable.
|
|
83
|
-
if (transitionEnd)
|
|
84
|
-
|
|
80
|
+
if (transitionEnd && transitionEnd[key] === undefined) {
|
|
81
|
+
transitionEnd[key] = current;
|
|
82
|
+
}
|
|
85
83
|
}
|
|
86
84
|
return { target, transitionEnd };
|
|
87
85
|
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { px, number } from 'style-value-types';
|
|
2
2
|
import { isKeyframesTarget } from '../../../animation/utils/is-keyframes-target.mjs';
|
|
3
3
|
import { invariant } from 'hey-listen';
|
|
4
|
-
import {
|
|
4
|
+
import { transformPropOrder } from '../../html/utils/transform.mjs';
|
|
5
5
|
import { findDimensionValueType } from '../value-types/dimensions.mjs';
|
|
6
6
|
import { isBrowser } from '../../../utils/is-browser.mjs';
|
|
7
7
|
|
|
@@ -54,7 +54,7 @@ const getTranslateFromMatrix = (pos2, pos3) => (_bbox, { transform }) => {
|
|
|
54
54
|
}
|
|
55
55
|
};
|
|
56
56
|
const transformKeys = new Set(["x", "y", "z"]);
|
|
57
|
-
const nonTranslationalTransformKeys =
|
|
57
|
+
const nonTranslationalTransformKeys = transformPropOrder.filter((key) => !transformKeys.has(key));
|
|
58
58
|
function removeNonTranslationalTransform(visualElement) {
|
|
59
59
|
const removedTransforms = [];
|
|
60
60
|
nonTranslationalTransformKeys.forEach((key) => {
|
|
@@ -111,8 +111,8 @@ const convertChangedValueTypes = (target, visualElement, changedKeys) => {
|
|
|
111
111
|
return target;
|
|
112
112
|
};
|
|
113
113
|
const checkAndConvertChangedValueTypes = (visualElement, target, origin = {}, transitionEnd = {}) => {
|
|
114
|
-
target =
|
|
115
|
-
transitionEnd =
|
|
114
|
+
target = { ...target };
|
|
115
|
+
transitionEnd = { ...transitionEnd };
|
|
116
116
|
const targetPositionalKeys = Object.keys(target).filter(isPositionalKey);
|
|
117
117
|
// We want to remove any transform values that could affect the element's bounding box before
|
|
118
118
|
// it's measured. We'll reapply these later.
|
|
@@ -4,11 +4,23 @@ import { numberValueTypes } from './number.mjs';
|
|
|
4
4
|
/**
|
|
5
5
|
* A map of default value types for common values
|
|
6
6
|
*/
|
|
7
|
-
const defaultValueTypes =
|
|
7
|
+
const defaultValueTypes = {
|
|
8
|
+
...numberValueTypes,
|
|
8
9
|
// Color props
|
|
9
|
-
color,
|
|
10
|
+
color,
|
|
11
|
+
backgroundColor: color,
|
|
12
|
+
outlineColor: color,
|
|
13
|
+
fill: color,
|
|
14
|
+
stroke: color,
|
|
10
15
|
// Border props
|
|
11
|
-
borderColor: color,
|
|
16
|
+
borderColor: color,
|
|
17
|
+
borderTopColor: color,
|
|
18
|
+
borderRightColor: color,
|
|
19
|
+
borderBottomColor: color,
|
|
20
|
+
borderLeftColor: color,
|
|
21
|
+
filter,
|
|
22
|
+
WebkitFilter: filter,
|
|
23
|
+
};
|
|
12
24
|
/**
|
|
13
25
|
* Gets the default ValueType for the provided value key
|
|
14
26
|
*/
|
|
@@ -4,7 +4,7 @@ import { createHtmlRenderState } from './utils/create-render-state.mjs';
|
|
|
4
4
|
|
|
5
5
|
const htmlMotionConfig = {
|
|
6
6
|
useVisualState: makeUseVisualState({
|
|
7
|
-
scrapeMotionValuesFromProps
|
|
7
|
+
scrapeMotionValuesFromProps,
|
|
8
8
|
createRenderState: createHtmlRenderState,
|
|
9
9
|
}),
|
|
10
10
|
};
|
|
@@ -15,28 +15,24 @@ function useInitialMotionValues({ transformTemplate }, visualState, isStatic) {
|
|
|
15
15
|
return useMemo(() => {
|
|
16
16
|
const state = createHtmlRenderState();
|
|
17
17
|
buildHTMLStyles(state, visualState, { enableHardwareAcceleration: !isStatic }, transformTemplate);
|
|
18
|
-
|
|
19
|
-
return Object.assign(Object.assign({}, vars), style);
|
|
18
|
+
return Object.assign({}, state.vars, state.style);
|
|
20
19
|
}, [visualState]);
|
|
21
20
|
}
|
|
22
21
|
function useStyle(props, visualState, isStatic) {
|
|
23
22
|
const styleProp = props.style || {};
|
|
24
|
-
|
|
23
|
+
const style = {};
|
|
25
24
|
/**
|
|
26
25
|
* Copy non-Motion Values straight into style
|
|
27
26
|
*/
|
|
28
27
|
copyRawValuesOnly(style, styleProp, props);
|
|
29
28
|
Object.assign(style, useInitialMotionValues(props, visualState, isStatic));
|
|
30
|
-
|
|
31
|
-
style = props.transformValues(style);
|
|
32
|
-
}
|
|
33
|
-
return style;
|
|
29
|
+
return props.transformValues ? props.transformValues(style) : style;
|
|
34
30
|
}
|
|
35
31
|
function useHTMLProps(props, visualState, isStatic) {
|
|
36
32
|
// The `any` isn't ideal but it is the type of createElement props argument
|
|
37
33
|
const htmlProps = {};
|
|
38
34
|
const style = useStyle(props, visualState, isStatic);
|
|
39
|
-
if (
|
|
35
|
+
if (props.drag && props.dragListener !== false) {
|
|
40
36
|
// Disable the ghost element when a user drags
|
|
41
37
|
htmlProps.draggable = false;
|
|
42
38
|
// Disable text selection
|
|
@@ -54,4 +50,4 @@ function useHTMLProps(props, visualState, isStatic) {
|
|
|
54
50
|
return htmlProps;
|
|
55
51
|
}
|
|
56
52
|
|
|
57
|
-
export { copyRawValuesOnly, useHTMLProps
|
|
53
|
+
export { copyRawValuesOnly, useHTMLProps };
|
|
@@ -1,15 +1,11 @@
|
|
|
1
|
-
import { buildTransform
|
|
1
|
+
import { buildTransform } from './build-transform.mjs';
|
|
2
2
|
import { isCSSVariable } from '../../dom/utils/is-css-variable.mjs';
|
|
3
|
-
import {
|
|
3
|
+
import { transformProps } from './transform.mjs';
|
|
4
4
|
import { getValueAsType } from '../../dom/value-types/get-as-type.mjs';
|
|
5
5
|
import { numberValueTypes } from '../../dom/value-types/number.mjs';
|
|
6
6
|
|
|
7
7
|
function buildHTMLStyles(state, latestValues, options, transformTemplate) {
|
|
8
|
-
var _a;
|
|
9
8
|
const { style, vars, transform, transformKeys, transformOrigin } = state;
|
|
10
|
-
// Empty the transformKeys array. As we're throwing out refs to its items
|
|
11
|
-
// this might not be as cheap as suspected. Maybe using the array as a buffer
|
|
12
|
-
// with a manual incrementation would be better.
|
|
13
9
|
transformKeys.length = 0;
|
|
14
10
|
// Track whether we encounter any transform or transformOrigin values.
|
|
15
11
|
let hasTransform = false;
|
|
@@ -34,7 +30,7 @@ function buildHTMLStyles(state, latestValues, options, transformTemplate) {
|
|
|
34
30
|
// Convert the value to its default value type, ie 0 -> "0px"
|
|
35
31
|
const valueType = numberValueTypes[key];
|
|
36
32
|
const valueAsType = getValueAsType(value, valueType);
|
|
37
|
-
if (
|
|
33
|
+
if (transformProps.has(key)) {
|
|
38
34
|
// If this is a transform, flag to enable further transform processing
|
|
39
35
|
hasTransform = true;
|
|
40
36
|
transform[key] = valueAsType;
|
|
@@ -43,29 +39,35 @@ function buildHTMLStyles(state, latestValues, options, transformTemplate) {
|
|
|
43
39
|
if (!transformIsNone)
|
|
44
40
|
continue;
|
|
45
41
|
// Otherwise check to see if this is a default transform
|
|
46
|
-
if (value !== (
|
|
42
|
+
if (value !== (valueType.default || 0))
|
|
47
43
|
transformIsNone = false;
|
|
48
44
|
}
|
|
49
|
-
else if (
|
|
50
|
-
transformOrigin[key] = valueAsType;
|
|
45
|
+
else if (key.startsWith("origin")) {
|
|
51
46
|
// If this is a transform origin, flag and enable further transform-origin processing
|
|
52
47
|
hasTransformOrigin = true;
|
|
48
|
+
transformOrigin[key] = valueAsType;
|
|
53
49
|
}
|
|
54
50
|
else {
|
|
55
51
|
style[key] = valueAsType;
|
|
56
52
|
}
|
|
57
53
|
}
|
|
58
|
-
if (hasTransform) {
|
|
54
|
+
if (hasTransform || transformTemplate) {
|
|
59
55
|
style.transform = buildTransform(state, options, transformIsNone, transformTemplate);
|
|
60
56
|
}
|
|
61
|
-
else if (transformTemplate) {
|
|
62
|
-
style.transform = transformTemplate({}, "");
|
|
63
|
-
}
|
|
64
57
|
else if (!latestValues.transform && style.transform) {
|
|
58
|
+
/**
|
|
59
|
+
* If we have previously created a transform but currently don't have any,
|
|
60
|
+
* reset transform style to none.
|
|
61
|
+
*/
|
|
65
62
|
style.transform = "none";
|
|
66
63
|
}
|
|
64
|
+
/**
|
|
65
|
+
* Build a transformOrigin style. Uses the same defaults as the browser for
|
|
66
|
+
* undefined origins.
|
|
67
|
+
*/
|
|
67
68
|
if (hasTransformOrigin) {
|
|
68
|
-
|
|
69
|
+
const { originX = "50%", originY = "50%", originZ = 0, } = transformOrigin;
|
|
70
|
+
style.transformOrigin = `${originX} ${originY} ${originZ}`;
|
|
69
71
|
}
|
|
70
72
|
}
|
|
71
73
|
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { transformPropOrder } from './transform.mjs';
|
|
2
2
|
|
|
3
3
|
const translateAlias = {
|
|
4
4
|
x: "translateX",
|
|
@@ -6,6 +6,10 @@ const translateAlias = {
|
|
|
6
6
|
z: "translateZ",
|
|
7
7
|
transformPerspective: "perspective",
|
|
8
8
|
};
|
|
9
|
+
/**
|
|
10
|
+
* A function to use with Array.sort to sort transform keys by their default order.
|
|
11
|
+
*/
|
|
12
|
+
const sortTransformProps = (a, b) => transformPropOrder.indexOf(a) - transformPropOrder.indexOf(b);
|
|
9
13
|
/**
|
|
10
14
|
* Build a CSS transform style from individual x/y/scale etc properties.
|
|
11
15
|
*
|
|
@@ -17,18 +21,11 @@ function buildTransform({ transform, transformKeys }, { enableHardwareAccelerati
|
|
|
17
21
|
let transformString = "";
|
|
18
22
|
// Transform keys into their default order - this will determine the output order.
|
|
19
23
|
transformKeys.sort(sortTransformProps);
|
|
20
|
-
// Track whether the defined transform has a defined z so we don't add a
|
|
21
|
-
// second to enable hardware acceleration
|
|
22
|
-
let transformHasZ = false;
|
|
23
24
|
// Loop over each transform and build them into transformString
|
|
24
|
-
const
|
|
25
|
-
for (let i = 0; i < numTransformKeys; i++) {
|
|
26
|
-
const key = transformKeys[i];
|
|
25
|
+
for (const key of transformKeys) {
|
|
27
26
|
transformString += `${translateAlias[key] || key}(${transform[key]}) `;
|
|
28
|
-
if (key === "z")
|
|
29
|
-
transformHasZ = true;
|
|
30
27
|
}
|
|
31
|
-
if (
|
|
28
|
+
if (enableHardwareAcceleration && !transform.z) {
|
|
32
29
|
transformString += "translateZ(0)";
|
|
33
30
|
}
|
|
34
31
|
transformString = transformString.trim();
|
|
@@ -42,12 +39,5 @@ function buildTransform({ transform, transformKeys }, { enableHardwareAccelerati
|
|
|
42
39
|
}
|
|
43
40
|
return transformString;
|
|
44
41
|
}
|
|
45
|
-
/**
|
|
46
|
-
* Build a transformOrigin style. Uses the same defaults as the browser for
|
|
47
|
-
* undefined origins.
|
|
48
|
-
*/
|
|
49
|
-
function buildTransformOrigin({ originX = "50%", originY = "50%", originZ = 0, }) {
|
|
50
|
-
return `${originX} ${originY} ${originZ}`;
|
|
51
|
-
}
|
|
52
42
|
|
|
53
|
-
export { buildTransform
|
|
43
|
+
export { buildTransform };
|
|
@@ -1,37 +1,28 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* A list of all transformable axes. We'll use this list to generated a version
|
|
3
|
-
* of each axes for each transform.
|
|
4
|
-
*/
|
|
5
|
-
const transformAxes = ["", "X", "Y", "Z"];
|
|
6
|
-
/**
|
|
7
|
-
* An ordered array of each transformable value. By default, transform values
|
|
8
|
-
* will be sorted to this order.
|
|
9
|
-
*/
|
|
10
|
-
const order = ["translate", "scale", "rotate", "skew"];
|
|
11
1
|
/**
|
|
12
2
|
* Generate a list of every possible transform key.
|
|
13
3
|
*/
|
|
14
|
-
const
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
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
|
+
];
|
|
22
23
|
/**
|
|
23
24
|
* A quick lookup for transform props.
|
|
24
25
|
*/
|
|
25
|
-
const
|
|
26
|
-
function isTransformProp(key) {
|
|
27
|
-
return transformPropSet.has(key);
|
|
28
|
-
}
|
|
29
|
-
/**
|
|
30
|
-
* A quick lookup for transform origin props
|
|
31
|
-
*/
|
|
32
|
-
const transformOriginProps = new Set(["originX", "originY", "originZ"]);
|
|
33
|
-
function isTransformOriginProp(key) {
|
|
34
|
-
return transformOriginProps.has(key);
|
|
35
|
-
}
|
|
26
|
+
const transformProps = new Set(transformPropOrder);
|
|
36
27
|
|
|
37
|
-
export {
|
|
28
|
+
export { transformPropOrder, transformProps };
|
|
@@ -1,10 +1,9 @@
|
|
|
1
|
-
import { __rest } from 'tslib';
|
|
2
1
|
import { visualElement } from '../index.mjs';
|
|
3
2
|
import { getOrigin, checkTargetForNewValues } from '../utils/setters.mjs';
|
|
4
3
|
import { buildHTMLStyles } from './utils/build-styles.mjs';
|
|
5
4
|
import { isCSSVariable } from '../dom/utils/is-css-variable.mjs';
|
|
6
5
|
import { parseDomVariant } from '../dom/utils/parse-dom-variant.mjs';
|
|
7
|
-
import {
|
|
6
|
+
import { transformProps } from './utils/transform.mjs';
|
|
8
7
|
import { scrapeMotionValuesFromProps } from './utils/scrape-motion-values.mjs';
|
|
9
8
|
import { renderHTML } from './utils/render.mjs';
|
|
10
9
|
import { getDefaultValueType } from '../dom/value-types/defaults.mjs';
|
|
@@ -16,7 +15,7 @@ function getComputedStyle(element) {
|
|
|
16
15
|
const htmlConfig = {
|
|
17
16
|
treeType: "dom",
|
|
18
17
|
readValueFromInstance(domElement, key) {
|
|
19
|
-
if (
|
|
18
|
+
if (transformProps.has(key)) {
|
|
20
19
|
const defaultType = getDefaultValueType(key);
|
|
21
20
|
return defaultType ? defaultType.default || 0 : 0;
|
|
22
21
|
}
|
|
@@ -69,10 +68,7 @@ const htmlConfig = {
|
|
|
69
68
|
* Ensure that HTML and Framer-specific value types like `px`->`%` and `Color`
|
|
70
69
|
* can be animated by Motion.
|
|
71
70
|
*/
|
|
72
|
-
makeTargetAnimatable(element,
|
|
73
|
-
var { transition, transitionEnd } = _a, target = __rest(_a, ["transition", "transitionEnd"]);
|
|
74
|
-
var transformValues = _b.transformValues;
|
|
75
|
-
if (isMounted === void 0) { isMounted = true; }
|
|
71
|
+
makeTargetAnimatable(element, { transition, transitionEnd, ...target }, { transformValues }, isMounted = true) {
|
|
76
72
|
let origin = getOrigin(target, transition || {}, element);
|
|
77
73
|
/**
|
|
78
74
|
* If Framer has provided a function to convert `Color` etc value types, convert them
|
|
@@ -91,8 +87,11 @@ const htmlConfig = {
|
|
|
91
87
|
transitionEnd = parsed.transitionEnd;
|
|
92
88
|
target = parsed.target;
|
|
93
89
|
}
|
|
94
|
-
return
|
|
95
|
-
|
|
90
|
+
return {
|
|
91
|
+
transition,
|
|
92
|
+
transitionEnd,
|
|
93
|
+
...target,
|
|
94
|
+
};
|
|
96
95
|
},
|
|
97
96
|
scrapeMotionValuesFromProps,
|
|
98
97
|
build(element, renderState, latestValues, options, props) {
|