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.
Files changed (154) hide show
  1. package/README.md +1 -1
  2. package/dist/cjs/client.js +1 -1
  3. package/dist/cjs/{create-BErHrlzf.js → create-D5a67TOR.js} +99 -2828
  4. package/dist/cjs/dom-mini.js +82 -66
  5. package/dist/cjs/dom.js +276 -3011
  6. package/dist/cjs/index.js +149 -206
  7. package/dist/cjs/m.js +13 -170
  8. package/dist/cjs/mini.js +77 -9
  9. package/dist/dom-mini.js +1 -1
  10. package/dist/dom.d.ts +5 -94
  11. package/dist/dom.js +1 -1
  12. package/dist/es/animation/animate/sequence.mjs +1 -1
  13. package/dist/es/animation/animators/waapi/animate-elements.mjs +78 -10
  14. package/dist/es/animation/interfaces/motion-value.mjs +11 -30
  15. package/dist/es/animation/interfaces/visual-element-target.mjs +1 -2
  16. package/dist/es/animation/optimized-appear/store-id.mjs +1 -1
  17. package/dist/es/animation/sequence/create.mjs +2 -5
  18. package/dist/es/animation/sequence/utils/edit.mjs +2 -3
  19. package/dist/es/animation/utils/default-transitions.mjs +1 -1
  20. package/dist/es/animation/utils/stagger.mjs +1 -1
  21. package/dist/es/components/Reorder/utils/check-reorder.mjs +1 -1
  22. package/dist/es/dom.mjs +2 -18
  23. package/dist/es/gestures/drag/VisualElementDragControls.mjs +1 -3
  24. package/dist/es/gestures/drag/utils/constraints.mjs +2 -3
  25. package/dist/es/gestures/focus.mjs +1 -1
  26. package/dist/es/gestures/pan/PanSession.mjs +1 -2
  27. package/dist/es/index.mjs +3 -24
  28. package/dist/es/motion/utils/is-forced-motion-value.mjs +1 -1
  29. package/dist/es/projection/animation/mix-values.mjs +2 -4
  30. package/dist/es/projection/geometry/delta-apply.mjs +1 -1
  31. package/dist/es/projection/geometry/delta-calc.mjs +1 -1
  32. package/dist/es/projection/geometry/delta-remove.mjs +1 -2
  33. package/dist/es/projection/node/create-projection-node.mjs +3 -7
  34. package/dist/es/projection/styles/scale-border-radius.mjs +1 -1
  35. package/dist/es/projection/styles/scale-box-shadow.mjs +1 -2
  36. package/dist/es/projection/styles/scale-correction.mjs +1 -1
  37. package/dist/es/projection.mjs +1 -3
  38. package/dist/es/render/VisualElement.mjs +2 -9
  39. package/dist/es/render/dom/DOMVisualElement.mjs +1 -1
  40. package/dist/es/render/dom/scroll/attach-animation.mjs +17 -0
  41. package/dist/es/render/dom/scroll/attach-function.mjs +23 -0
  42. package/dist/es/render/dom/scroll/index.mjs +6 -82
  43. package/dist/es/render/dom/scroll/offsets/index.mjs +2 -3
  44. package/dist/es/render/dom/scroll/utils/get-timeline.mjs +30 -0
  45. package/dist/es/render/html/HTMLVisualElement.mjs +1 -3
  46. package/dist/es/render/html/utils/build-styles.mjs +1 -4
  47. package/dist/es/render/html/utils/build-transform.mjs +1 -3
  48. package/dist/es/render/svg/SVGVisualElement.mjs +1 -3
  49. package/dist/es/render/svg/config-motion.mjs +1 -2
  50. package/dist/es/render/svg/utils/path.mjs +1 -1
  51. package/dist/es/render/svg/utils/scrape-motion-values.mjs +1 -1
  52. package/dist/es/render/svg/utils/transform-origin.mjs +1 -1
  53. package/dist/es/render/utils/motion-values.mjs +1 -1
  54. package/dist/es/utils/delay.mjs +1 -1
  55. package/dist/es/utils/transform.mjs +1 -1
  56. package/dist/es/utils/use-cycle.mjs +1 -1
  57. package/dist/es/utils/use-instant-transition.mjs +4 -4
  58. package/dist/es/value/use-spring.mjs +2 -3
  59. package/dist/es/value/use-will-change/get-will-change-name.mjs +1 -2
  60. package/dist/framer-motion.dev.js +3864 -3405
  61. package/dist/framer-motion.js +1 -1
  62. package/dist/m.d.ts +3 -50
  63. package/dist/mini.js +1 -1
  64. package/dist/size-rollup-animate.js +1 -1
  65. package/dist/size-rollup-dom-animation-assets.js +1 -1
  66. package/dist/size-rollup-dom-animation.js +1 -1
  67. package/dist/size-rollup-dom-max-assets.js +1 -1
  68. package/dist/size-rollup-dom-max.js +1 -1
  69. package/dist/size-rollup-m.js +1 -1
  70. package/dist/size-rollup-motion.js +1 -1
  71. package/dist/size-rollup-scroll.js +1 -1
  72. package/dist/size-rollup-waapi-animate.js +1 -1
  73. package/dist/types/client.d.ts +4 -3
  74. package/dist/types/index.d.ts +56 -351
  75. package/dist/{types.d-B50aGbjN.d.ts → types.d-B1Voffvi.d.ts} +3 -138
  76. package/package.json +9 -9
  77. package/dist/es/animation/animators/AcceleratedAnimation.mjs +0 -319
  78. package/dist/es/animation/animators/BaseAnimation.mjs +0 -120
  79. package/dist/es/animation/animators/MainThreadAnimation.mjs +0 -394
  80. package/dist/es/animation/animators/drivers/driver-frameloop.mjs +0 -16
  81. package/dist/es/animation/animators/utils/accelerated-values.mjs +0 -14
  82. package/dist/es/animation/animators/utils/can-animate.mjs +0 -42
  83. package/dist/es/animation/animators/waapi/utils/supports-waapi.mjs +0 -5
  84. package/dist/es/animation/generators/inertia.mjs +0 -87
  85. package/dist/es/animation/generators/keyframes.mjs +0 -51
  86. package/dist/es/animation/generators/spring/defaults.mjs +0 -27
  87. package/dist/es/animation/generators/spring/find.mjs +0 -85
  88. package/dist/es/animation/generators/spring/index.mjs +0 -174
  89. package/dist/es/animation/generators/utils/velocity.mjs +0 -9
  90. package/dist/es/animation/utils/is-animatable.mjs +0 -30
  91. package/dist/es/animation/utils/is-none.mjs +0 -15
  92. package/dist/es/easing/anticipate.mjs +0 -5
  93. package/dist/es/easing/back.mjs +0 -9
  94. package/dist/es/easing/circ.mjs +0 -8
  95. package/dist/es/easing/cubic-bezier.mjs +0 -51
  96. package/dist/es/easing/ease.mjs +0 -7
  97. package/dist/es/easing/modifiers/mirror.mjs +0 -5
  98. package/dist/es/easing/modifiers/reverse.mjs +0 -5
  99. package/dist/es/easing/steps.mjs +0 -15
  100. package/dist/es/easing/utils/get-easing-for-segment.mjs +0 -8
  101. package/dist/es/easing/utils/is-easing-array.mjs +0 -5
  102. package/dist/es/easing/utils/map.mjs +0 -37
  103. package/dist/es/render/dom/DOMKeyframesResolver.mjs +0 -130
  104. package/dist/es/render/dom/scroll/observe.mjs +0 -18
  105. package/dist/es/render/dom/utils/css-variables-conversion.mjs +0 -42
  106. package/dist/es/render/dom/utils/is-css-variable.mjs +0 -15
  107. package/dist/es/render/dom/utils/unit-conversion.mjs +0 -36
  108. package/dist/es/render/dom/value-types/animatable-none.mjs +0 -15
  109. package/dist/es/render/dom/value-types/defaults.mjs +0 -30
  110. package/dist/es/render/dom/value-types/dimensions.mjs +0 -15
  111. package/dist/es/render/dom/value-types/find.mjs +0 -15
  112. package/dist/es/render/dom/value-types/get-as-type.mjs +0 -10
  113. package/dist/es/render/dom/value-types/number-browser.mjs +0 -41
  114. package/dist/es/render/dom/value-types/number.mjs +0 -18
  115. package/dist/es/render/dom/value-types/test.mjs +0 -6
  116. package/dist/es/render/dom/value-types/transform.mjs +0 -31
  117. package/dist/es/render/dom/value-types/type-auto.mjs +0 -9
  118. package/dist/es/render/dom/value-types/type-int.mjs +0 -8
  119. package/dist/es/render/html/utils/keys-position.mjs +0 -13
  120. package/dist/es/render/html/utils/keys-transform.mjs +0 -28
  121. package/dist/es/render/html/utils/make-none-animatable.mjs +0 -30
  122. package/dist/es/render/html/utils/parse-transform.mjs +0 -83
  123. package/dist/es/render/utils/KeyframesResolver.mjs +0 -163
  124. package/dist/es/utils/clamp.mjs +0 -9
  125. package/dist/es/utils/hsla-to-rgba.mjs +0 -42
  126. package/dist/es/utils/interpolate.mjs +0 -76
  127. package/dist/es/utils/is-numerical-string.mjs +0 -6
  128. package/dist/es/utils/is-zero-value-string.mjs +0 -6
  129. package/dist/es/utils/mix/color.mjs +0 -47
  130. package/dist/es/utils/mix/complex.mjs +0 -93
  131. package/dist/es/utils/mix/immediate.mjs +0 -5
  132. package/dist/es/utils/mix/index.mjs +0 -14
  133. package/dist/es/utils/mix/number.mjs +0 -26
  134. package/dist/es/utils/mix/visibility.mjs +0 -16
  135. package/dist/es/utils/offsets/default.mjs +0 -9
  136. package/dist/es/utils/offsets/fill.mjs +0 -12
  137. package/dist/es/utils/offsets/time.mjs +0 -5
  138. package/dist/es/utils/pipe.mjs +0 -11
  139. package/dist/es/utils/use-instant-transition-state.mjs +0 -5
  140. package/dist/es/utils/wrap.mjs +0 -6
  141. package/dist/es/value/types/color/hex.mjs +0 -40
  142. package/dist/es/value/types/color/hsla.mjs +0 -22
  143. package/dist/es/value/types/color/index.mjs +0 -27
  144. package/dist/es/value/types/color/rgba.mjs +0 -25
  145. package/dist/es/value/types/color/utils.mjs +0 -29
  146. package/dist/es/value/types/complex/filter.mjs +0 -30
  147. package/dist/es/value/types/complex/index.mjs +0 -91
  148. package/dist/es/value/types/numbers/index.mjs +0 -17
  149. package/dist/es/value/types/numbers/units.mjs +0 -17
  150. package/dist/es/value/types/utils/color-regex.mjs +0 -3
  151. package/dist/es/value/types/utils/float-regex.mjs +0 -3
  152. package/dist/es/value/types/utils/is-nullish.mjs +0 -5
  153. package/dist/es/value/types/utils/sanitize.mjs +0 -5
  154. 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,10 +0,0 @@
1
- /**
2
- * Provided a value and a ValueType, returns the value as that value type.
3
- */
4
- const getValueAsType = (value, type) => {
5
- return type && typeof value === "number"
6
- ? type.transform(value)
7
- : value;
8
- };
9
-
10
- export { getValueAsType };
@@ -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,6 +0,0 @@
1
- /**
2
- * Tests a provided value against a ValueType
3
- */
4
- const testValueType = (v) => (type) => type.test(v);
5
-
6
- export { testValueType };
@@ -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,9 +0,0 @@
1
- /**
2
- * ValueType for "auto"
3
- */
4
- const auto = {
5
- test: (v) => v === "auto",
6
- parse: (v) => v,
7
- };
8
-
9
- export { auto };
@@ -1,8 +0,0 @@
1
- import { number } from '../../../value/types/numbers/index.mjs';
2
-
3
- const int = {
4
- ...number,
5
- transform: Math.round,
6
- };
7
-
8
- export { int };
@@ -1,13 +0,0 @@
1
- import { transformPropOrder } from './keys-transform.mjs';
2
-
3
- const positionalKeys = new Set([
4
- "width",
5
- "height",
6
- "top",
7
- "left",
8
- "right",
9
- "bottom",
10
- ...transformPropOrder,
11
- ]);
12
-
13
- export { positionalKeys };
@@ -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 };
@@ -1,9 +0,0 @@
1
- const clamp = (min, max, v) => {
2
- if (v > max)
3
- return max;
4
- if (v < min)
5
- return min;
6
- return v;
7
- };
8
-
9
- export { clamp };