framer-motion 12.7.4 → 12.7.5-alpha.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.
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-C7kXmWbI.js} +99 -2828
  4. package/dist/cjs/dom-mini.js +82 -66
  5. package/dist/cjs/dom.js +264 -3000
  6. package/dist/cjs/index.js +138 -196
  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 +29 -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 +3853 -3394
  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
@@ -5,58 +5,6 @@ Object.defineProperty(exports, '__esModule', { value: true });
5
5
  var motionDom = require('motion-dom');
6
6
  var motionUtils = require('motion-utils');
7
7
 
8
- const wrap = (min, max, v) => {
9
- const rangeSize = max - min;
10
- return ((((v - min) % rangeSize) + rangeSize) % rangeSize) + min;
11
- };
12
-
13
- const isEasingArray = (ease) => {
14
- return Array.isArray(ease) && typeof ease[0] !== "number";
15
- };
16
-
17
- function getEasingForSegment(easing, i) {
18
- return isEasingArray(easing) ? easing[wrap(0, easing.length, i)] : easing;
19
- }
20
-
21
- /*
22
- Value in range from progress
23
-
24
- Given a lower limit and an upper limit, we return the value within
25
- that range as expressed by progress (usually a number from 0 to 1)
26
-
27
- So progress = 0.5 would change
28
-
29
- from -------- to
30
-
31
- to
32
-
33
- from ---- to
34
-
35
- E.g. from = 10, to = 20, progress = 0.5 => 15
36
-
37
- @param [number]: Lower limit of range
38
- @param [number]: Upper limit of range
39
- @param [number]: The progress between lower and upper limits expressed 0-1
40
- @return [number]: Value as calculated from progress within range (not limited within range)
41
- */
42
- const mixNumber = (from, to, progress) => {
43
- return from + (to - from) * progress;
44
- };
45
-
46
- function fillOffset(offset, remaining) {
47
- const min = offset[offset.length - 1];
48
- for (let i = 1; i <= remaining; i++) {
49
- const offsetProgress = motionUtils.progress(0, remaining, i);
50
- offset.push(mixNumber(min, 1, offsetProgress));
51
- }
52
- }
53
-
54
- function defaultOffset(arr) {
55
- const offset = [0];
56
- fillOffset(offset, arr.length - 1);
57
- return offset;
58
- }
59
-
60
8
  const isMotionValue = (value) => Boolean(value && value.getVelocity);
61
9
 
62
10
  function isDOMKeyframes(keyframes) {
@@ -121,8 +69,8 @@ function addKeyframes(sequence, keyframes, easing, offset, startTime, endTime) {
121
69
  for (let i = 0; i < keyframes.length; i++) {
122
70
  sequence.push({
123
71
  value: keyframes[i],
124
- at: mixNumber(startTime, endTime, offset[i]),
125
- easing: getEasingForSegment(easing, i),
72
+ at: motionDom.mixNumber(startTime, endTime, offset[i]),
73
+ easing: motionUtils.getEasingForSegment(easing, i),
126
74
  });
127
75
  }
128
76
  }
@@ -196,7 +144,7 @@ function createAnimationsFromSequence(sequence, { defaultTransition = {}, ...seq
196
144
  let maxDuration = 0;
197
145
  const resolveValueSequence = (valueKeyframes, valueTransition, valueSequence, elementIndex = 0, numSubjects = 0) => {
198
146
  const valueKeyframesAsList = keyframesAsList(valueKeyframes);
199
- const { delay = 0, times = defaultOffset(valueKeyframesAsList), type = "keyframes", repeat, repeatType, repeatDelay = 0, ...remainingTransition } = valueTransition;
147
+ const { delay = 0, times = motionDom.defaultOffset(valueKeyframesAsList), type = "keyframes", repeat, repeatType, repeatDelay = 0, ...remainingTransition } = valueTransition;
200
148
  let { ease = defaultTransition.ease || "easeOut", duration } = valueTransition;
201
149
  /**
202
150
  * Resolve stagger() if defined.
@@ -244,7 +192,7 @@ function createAnimationsFromSequence(sequence, { defaultTransition = {}, ...seq
244
192
  * Fill out if offset if fewer offsets than keyframes
245
193
  */
246
194
  const remainder = times.length - valueKeyframesAsList.length;
247
- remainder > 0 && fillOffset(times, remainder);
195
+ remainder > 0 && motionDom.fillOffset(times, remainder);
248
196
  /**
249
197
  * If only one value has been set, ie [1], push a null to the start of
250
198
  * the keyframe array. This will let us mark a keyframe at this point
@@ -268,7 +216,7 @@ function createAnimationsFromSequence(sequence, { defaultTransition = {}, ...seq
268
216
  times.push(originalTimes[keyframeIndex] + (repeatIndex + 1));
269
217
  ease.push(keyframeIndex === 0
270
218
  ? "linear"
271
- : getEasingForSegment(originalEase, keyframeIndex - 1));
219
+ : motionUtils.getEasingForSegment(originalEase, keyframeIndex - 1));
272
220
  }
273
221
  }
274
222
  normalizeTimes(times, repeat);
@@ -395,7 +343,27 @@ function animateElements(elementOrSelector, keyframes, options, scope) {
395
343
  const elements = motionDom.resolveElements(elementOrSelector, scope);
396
344
  const numElements = elements.length;
397
345
  motionUtils.invariant(Boolean(numElements), "No valid element provided.");
398
- const animations = [];
346
+ /**
347
+ * WAAPI doesn't support interrupting animations.
348
+ *
349
+ * Therefore, starting animations requires a three-step process:
350
+ * 1. Stop existing animations (write styles to DOM)
351
+ * 2. Resolve keyframes (read styles from DOM)
352
+ * 3. Create new animations (write styles to DOM)
353
+ *
354
+ * The hybrid `animate()` function uses AsyncAnimation to resolve
355
+ * keyframes before creating new animations, which removes style
356
+ * thrashing. Here, we have much stricter filesize constraints.
357
+ * Therefore we do this in a synchronous way that ensures that
358
+ * at least within `animate()` calls there is no style thrashing.
359
+ *
360
+ * In the motion-native-animate-mini-interrupt benchmark this
361
+ * was 80% faster than a single loop.
362
+ */
363
+ const animationDefinitions = [];
364
+ /**
365
+ * Step 1: Build options and stop existing animations (write)
366
+ */
399
367
  for (let i = 0; i < numElements; i++) {
400
368
  const element = elements[i];
401
369
  const elementTransition = { ...options };
@@ -406,21 +374,69 @@ function animateElements(elementOrSelector, keyframes, options, scope) {
406
374
  elementTransition.delay = elementTransition.delay(i, numElements);
407
375
  }
408
376
  for (const valueName in keyframes) {
409
- const valueKeyframes = keyframes[valueName];
377
+ let valueKeyframes = keyframes[valueName];
378
+ if (!Array.isArray(valueKeyframes)) {
379
+ valueKeyframes = [valueKeyframes];
380
+ }
410
381
  const valueOptions = {
411
382
  ...motionDom.getValueTransition(elementTransition, valueName),
412
383
  };
413
384
  valueOptions.duration && (valueOptions.duration = motionUtils.secondsToMilliseconds(valueOptions.duration));
414
385
  valueOptions.delay && (valueOptions.delay = motionUtils.secondsToMilliseconds(valueOptions.delay));
415
- animations.push(new motionDom.NativeAnimation({
416
- element,
417
- name: valueName,
418
- keyframes: valueKeyframes,
419
- transition: valueOptions,
420
- allowFlatten: !elementTransition.type && !elementTransition.ease,
421
- }));
386
+ /**
387
+ * If there's an existing animation playing on this element then stop it
388
+ * before creating a new one.
389
+ */
390
+ const map = motionDom.getAnimationMap(element);
391
+ const key = motionDom.animationMapKey(valueName, valueOptions.pseudoElement || "");
392
+ const currentAnimation = map.get(key);
393
+ currentAnimation && currentAnimation.stop();
394
+ animationDefinitions.push({
395
+ map,
396
+ key,
397
+ unresolvedKeyframes: valueKeyframes,
398
+ options: {
399
+ ...valueOptions,
400
+ element,
401
+ name: valueName,
402
+ allowFlatten: !elementTransition.type && !elementTransition.ease,
403
+ },
404
+ });
422
405
  }
423
406
  }
407
+ /**
408
+ * Step 2: Resolve keyframes (read)
409
+ */
410
+ for (let i = 0; i < animationDefinitions.length; i++) {
411
+ const { unresolvedKeyframes, options: animationOptions } = animationDefinitions[i];
412
+ const { element, name, pseudoElement } = animationOptions;
413
+ if (!pseudoElement && unresolvedKeyframes[0] === null) {
414
+ unresolvedKeyframes[0] = motionDom.getComputedStyle(element, name);
415
+ }
416
+ motionDom.fillWildcards(unresolvedKeyframes);
417
+ motionDom.applyPxDefaults(unresolvedKeyframes, name);
418
+ /**
419
+ * If we only have one keyframe, explicitly read the initial keyframe
420
+ * from the computed style. This is to ensure consistency with WAAPI behaviour
421
+ * for restarting animations, for instance .play() after finish, when it
422
+ * has one vs two keyframes.
423
+ */
424
+ if (!pseudoElement && unresolvedKeyframes.length < 2) {
425
+ unresolvedKeyframes.unshift(motionDom.getComputedStyle(element, name));
426
+ }
427
+ animationOptions.keyframes = unresolvedKeyframes;
428
+ }
429
+ /**
430
+ * Step 3: Create new animations (write)
431
+ */
432
+ const animations = [];
433
+ for (let i = 0; i < animationDefinitions.length; i++) {
434
+ const { map, key, options: animationOptions } = animationDefinitions[i];
435
+ const animation = new motionDom.NativeAnimation(animationOptions);
436
+ map.set(key, animation);
437
+ animation.finished.finally(() => map.delete(key));
438
+ animations.push(animation);
439
+ }
424
440
  return animations;
425
441
  }
426
442