motion 10.18.0 → 11.11.12

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 (320) hide show
  1. package/.turbo/turbo-build.log +29 -0
  2. package/{LICENSE → LICENSE.md} +2 -2
  3. package/README.md +99 -7
  4. package/dist/cjs/index.js +6117 -0
  5. package/dist/cjs/react-client.js +10003 -0
  6. package/dist/cjs/react-m.js +1852 -0
  7. package/dist/es/framer-motion/dist/es/animation/GroupPlaybackControls.mjs +78 -0
  8. package/dist/es/framer-motion/dist/es/animation/animate/index.mjs +34 -0
  9. package/dist/es/framer-motion/dist/es/animation/animate/resolve-subjects.mjs +19 -0
  10. package/dist/es/framer-motion/dist/es/animation/animate/sequence.mjs +14 -0
  11. package/dist/es/framer-motion/dist/es/animation/animate/single-value.mjs +11 -0
  12. package/dist/es/framer-motion/dist/es/animation/animate/subject.mjs +52 -0
  13. package/dist/es/framer-motion/dist/es/animation/animators/AcceleratedAnimation.mjs +318 -0
  14. package/dist/es/framer-motion/dist/es/animation/animators/BaseAnimation.mjs +112 -0
  15. package/dist/es/framer-motion/dist/es/animation/animators/MainThreadAnimation.mjs +380 -0
  16. package/dist/es/framer-motion/dist/es/animation/animators/drivers/driver-frameloop.mjs +17 -0
  17. package/dist/es/framer-motion/dist/es/animation/animators/utils/accelerated-values.mjs +14 -0
  18. package/dist/es/framer-motion/dist/es/animation/animators/utils/can-animate.mjs +42 -0
  19. package/dist/es/framer-motion/dist/es/animation/animators/waapi/NativeAnimation.mjs +169 -0
  20. package/dist/es/framer-motion/dist/es/animation/animators/waapi/animate-elements.mjs +36 -0
  21. package/dist/es/framer-motion/dist/es/animation/animators/waapi/animate-style.mjs +12 -0
  22. package/dist/es/framer-motion/dist/es/animation/animators/waapi/easing.mjs +44 -0
  23. package/dist/es/framer-motion/dist/es/animation/animators/waapi/index.mjs +23 -0
  24. package/dist/es/framer-motion/dist/es/animation/animators/waapi/utils/attach-timeline.mjs +6 -0
  25. package/dist/es/framer-motion/dist/es/animation/animators/waapi/utils/get-final-keyframe.mjs +12 -0
  26. package/dist/es/framer-motion/dist/es/animation/animators/waapi/utils/linear.mjs +15 -0
  27. package/dist/es/framer-motion/dist/es/animation/animators/waapi/utils/memo-supports.mjs +9 -0
  28. package/dist/es/framer-motion/dist/es/animation/animators/waapi/utils/style.mjs +8 -0
  29. package/dist/es/framer-motion/dist/es/animation/animators/waapi/utils/supports-flags.mjs +9 -0
  30. package/dist/es/framer-motion/dist/es/animation/animators/waapi/utils/supports-linear-easing.mjs +15 -0
  31. package/dist/es/framer-motion/dist/es/animation/animators/waapi/utils/supports-partial-keyframes.mjs +13 -0
  32. package/dist/es/framer-motion/dist/es/animation/animators/waapi/utils/supports-waapi.mjs +5 -0
  33. package/dist/es/framer-motion/dist/es/animation/generators/inertia.mjs +87 -0
  34. package/dist/es/framer-motion/dist/es/animation/generators/keyframes.mjs +51 -0
  35. package/dist/es/framer-motion/dist/es/animation/generators/spring/find.mjs +89 -0
  36. package/dist/es/framer-motion/dist/es/animation/generators/spring/index.mjs +129 -0
  37. package/dist/es/framer-motion/dist/es/animation/generators/utils/calc-duration.mjs +17 -0
  38. package/dist/es/framer-motion/dist/es/animation/generators/utils/is-generator.mjs +5 -0
  39. package/dist/es/framer-motion/dist/es/animation/generators/utils/velocity.mjs +9 -0
  40. package/dist/es/framer-motion/dist/es/animation/interfaces/motion-value.mjs +105 -0
  41. package/dist/es/framer-motion/dist/es/animation/interfaces/visual-element-target.mjs +75 -0
  42. package/dist/es/framer-motion/dist/es/animation/interfaces/visual-element-variant.mjs +66 -0
  43. package/dist/es/framer-motion/dist/es/animation/interfaces/visual-element.mjs +26 -0
  44. package/dist/es/framer-motion/dist/es/animation/optimized-appear/data-id.mjs +6 -0
  45. package/dist/es/framer-motion/dist/es/animation/optimized-appear/get-appear-id.mjs +7 -0
  46. package/dist/es/framer-motion/dist/es/animation/sequence/create.mjs +230 -0
  47. package/dist/es/framer-motion/dist/es/animation/sequence/utils/calc-time.mjs +21 -0
  48. package/dist/es/framer-motion/dist/es/animation/sequence/utils/edit.mjs +31 -0
  49. package/dist/es/framer-motion/dist/es/animation/sequence/utils/sort.mjs +14 -0
  50. package/dist/es/framer-motion/dist/es/animation/utils/create-visual-element.mjs +44 -0
  51. package/dist/es/framer-motion/dist/es/animation/utils/default-transitions.mjs +40 -0
  52. package/dist/es/framer-motion/dist/es/animation/utils/get-value-transition.mjs +9 -0
  53. package/dist/es/framer-motion/dist/es/animation/utils/is-animatable.mjs +30 -0
  54. package/dist/es/framer-motion/dist/es/animation/utils/is-animation-controls.mjs +7 -0
  55. package/dist/es/framer-motion/dist/es/animation/utils/is-dom-keyframes.mjs +5 -0
  56. package/dist/es/framer-motion/dist/es/animation/utils/is-keyframes-target.mjs +5 -0
  57. package/dist/es/framer-motion/dist/es/animation/utils/is-none.mjs +15 -0
  58. package/dist/es/framer-motion/dist/es/animation/utils/is-transition-defined.mjs +10 -0
  59. package/dist/es/framer-motion/dist/es/animation/utils/stagger.mjs +26 -0
  60. package/dist/es/framer-motion/dist/es/components/AnimatePresence/use-presence.mjs +40 -0
  61. package/dist/es/framer-motion/dist/es/context/LayoutGroupContext.mjs +6 -0
  62. package/dist/es/framer-motion/dist/es/context/LazyContext.mjs +6 -0
  63. package/dist/es/framer-motion/dist/es/context/MotionConfigContext.mjs +13 -0
  64. package/dist/es/framer-motion/dist/es/context/MotionContext/create.mjs +13 -0
  65. package/dist/es/framer-motion/dist/es/context/MotionContext/index.mjs +6 -0
  66. package/dist/es/framer-motion/dist/es/context/MotionContext/utils.mjs +17 -0
  67. package/dist/es/framer-motion/dist/es/context/PresenceContext.mjs +9 -0
  68. package/dist/es/framer-motion/dist/es/context/SwitchLayoutGroupContext.mjs +9 -0
  69. package/dist/es/framer-motion/dist/es/easing/anticipate.mjs +5 -0
  70. package/dist/es/framer-motion/dist/es/easing/back.mjs +9 -0
  71. package/dist/es/framer-motion/dist/es/easing/circ.mjs +8 -0
  72. package/dist/es/framer-motion/dist/es/easing/cubic-bezier.mjs +51 -0
  73. package/dist/es/framer-motion/dist/es/easing/ease.mjs +7 -0
  74. package/dist/es/framer-motion/dist/es/easing/modifiers/mirror.mjs +5 -0
  75. package/dist/es/framer-motion/dist/es/easing/modifiers/reverse.mjs +5 -0
  76. package/dist/es/framer-motion/dist/es/easing/steps.mjs +15 -0
  77. package/dist/es/framer-motion/dist/es/easing/utils/create-generator-easing.mjs +17 -0
  78. package/dist/es/framer-motion/dist/es/easing/utils/get-easing-for-segment.mjs +8 -0
  79. package/dist/es/framer-motion/dist/es/easing/utils/is-bezier-definition.mjs +3 -0
  80. package/dist/es/framer-motion/dist/es/easing/utils/is-easing-array.mjs +5 -0
  81. package/dist/es/framer-motion/dist/es/easing/utils/map.mjs +38 -0
  82. package/dist/es/framer-motion/dist/es/events/add-dom-event.mjs +6 -0
  83. package/dist/es/framer-motion/dist/es/events/add-pointer-event.mjs +8 -0
  84. package/dist/es/framer-motion/dist/es/events/event-info.mjs +15 -0
  85. package/dist/es/framer-motion/dist/es/events/utils/is-primary-pointer.mjs +18 -0
  86. package/dist/es/framer-motion/dist/es/frameloop/batcher.mjs +71 -0
  87. package/dist/es/framer-motion/dist/es/frameloop/frame.mjs +6 -0
  88. package/dist/es/framer-motion/dist/es/frameloop/index-legacy.mjs +20 -0
  89. package/dist/es/framer-motion/dist/es/frameloop/microtask.mjs +5 -0
  90. package/dist/es/framer-motion/dist/es/frameloop/render-step.mjs +80 -0
  91. package/dist/es/framer-motion/dist/es/frameloop/sync-time.mjs +31 -0
  92. package/dist/es/framer-motion/dist/es/gestures/drag/VisualElementDragControls.mjs +487 -0
  93. package/dist/es/framer-motion/dist/es/gestures/drag/index.mjs +27 -0
  94. package/dist/es/framer-motion/dist/es/gestures/drag/utils/constraints.mjs +129 -0
  95. package/dist/es/framer-motion/dist/es/gestures/drag/utils/lock.mjs +53 -0
  96. package/dist/es/framer-motion/dist/es/gestures/focus.mjs +41 -0
  97. package/dist/es/framer-motion/dist/es/gestures/hover.mjs +33 -0
  98. package/dist/es/framer-motion/dist/es/gestures/pan/PanSession.mjs +156 -0
  99. package/dist/es/framer-motion/dist/es/gestures/pan/index.mjs +50 -0
  100. package/dist/es/framer-motion/dist/es/gestures/press.mjs +130 -0
  101. package/dist/es/framer-motion/dist/es/gestures/utils/is-node-or-child.mjs +20 -0
  102. package/dist/es/framer-motion/dist/es/motion/features/Feature.mjs +9 -0
  103. package/dist/es/framer-motion/dist/es/motion/features/animation/exit.mjs +31 -0
  104. package/dist/es/framer-motion/dist/es/motion/features/animation/index.mjs +41 -0
  105. package/dist/es/framer-motion/dist/es/motion/features/animations.mjs +13 -0
  106. package/dist/es/framer-motion/dist/es/motion/features/definitions.mjs +28 -0
  107. package/dist/es/framer-motion/dist/es/motion/features/drag.mjs +17 -0
  108. package/dist/es/framer-motion/dist/es/motion/features/gestures.mjs +21 -0
  109. package/dist/es/framer-motion/dist/es/motion/features/layout/MeasureLayout.mjs +134 -0
  110. package/dist/es/framer-motion/dist/es/motion/features/layout.mjs +11 -0
  111. package/dist/es/framer-motion/dist/es/motion/features/load-features.mjs +12 -0
  112. package/dist/es/framer-motion/dist/es/motion/features/viewport/index.mjs +72 -0
  113. package/dist/es/framer-motion/dist/es/motion/features/viewport/observers.mjs +49 -0
  114. package/dist/es/framer-motion/dist/es/motion/index.mjs +98 -0
  115. package/dist/es/framer-motion/dist/es/motion/utils/is-forced-motion-value.mjs +11 -0
  116. package/dist/es/framer-motion/dist/es/motion/utils/symbol.mjs +3 -0
  117. package/dist/es/framer-motion/dist/es/motion/utils/use-motion-ref.mjs +36 -0
  118. package/dist/es/framer-motion/dist/es/motion/utils/use-visual-element.mjs +134 -0
  119. package/dist/es/framer-motion/dist/es/motion/utils/use-visual-state.mjs +82 -0
  120. package/dist/es/framer-motion/dist/es/motion/utils/valid-prop.mjs +57 -0
  121. package/dist/es/framer-motion/dist/es/projection/animation/mix-values.mjs +93 -0
  122. package/dist/es/framer-motion/dist/es/projection/geometry/conversion.mjs +33 -0
  123. package/dist/es/framer-motion/dist/es/projection/geometry/copy.mjs +31 -0
  124. package/dist/es/framer-motion/dist/es/projection/geometry/delta-apply.mjs +119 -0
  125. package/dist/es/framer-motion/dist/es/projection/geometry/delta-calc.mjs +52 -0
  126. package/dist/es/framer-motion/dist/es/projection/geometry/delta-remove.mjs +54 -0
  127. package/dist/es/framer-motion/dist/es/projection/geometry/models.mjs +17 -0
  128. package/dist/es/framer-motion/dist/es/projection/geometry/utils.mjs +31 -0
  129. package/dist/es/framer-motion/dist/es/projection/node/DocumentProjectionNode.mjs +13 -0
  130. package/dist/es/framer-motion/dist/es/projection/node/HTMLProjectionNode.mjs +27 -0
  131. package/dist/es/framer-motion/dist/es/projection/node/create-projection-node.mjs +1583 -0
  132. package/dist/es/framer-motion/dist/es/projection/node/state.mjs +19 -0
  133. package/dist/es/framer-motion/dist/es/projection/shared/stack.mjs +112 -0
  134. package/dist/es/framer-motion/dist/es/projection/styles/scale-border-radius.mjs +41 -0
  135. package/dist/es/framer-motion/dist/es/projection/styles/scale-box-shadow.mjs +35 -0
  136. package/dist/es/framer-motion/dist/es/projection/styles/scale-correction.mjs +6 -0
  137. package/dist/es/framer-motion/dist/es/projection/styles/transform.mjs +49 -0
  138. package/dist/es/framer-motion/dist/es/projection/utils/each-axis.mjs +5 -0
  139. package/dist/es/framer-motion/dist/es/projection/utils/has-transform.mjs +26 -0
  140. package/dist/es/framer-motion/dist/es/projection/utils/measure.mjs +17 -0
  141. package/dist/es/framer-motion/dist/es/render/VisualElement.mjs +477 -0
  142. package/dist/es/framer-motion/dist/es/render/components/create-factory.mjs +23 -0
  143. package/dist/es/framer-motion/dist/es/render/components/m/create.mjs +6 -0
  144. package/dist/es/framer-motion/dist/es/render/components/m/elements.mjs +227 -0
  145. package/dist/es/framer-motion/dist/es/render/components/motion/create.mjs +15 -0
  146. package/dist/es/framer-motion/dist/es/render/components/motion/elements.mjs +194 -0
  147. package/dist/es/framer-motion/dist/es/render/dom/DOMKeyframesResolver.mjs +130 -0
  148. package/dist/es/framer-motion/dist/es/render/dom/DOMVisualElement.mjs +28 -0
  149. package/dist/es/framer-motion/dist/es/render/dom/create-visual-element.mjs +14 -0
  150. package/dist/es/framer-motion/dist/es/render/dom/resize/handle-element.mjs +64 -0
  151. package/dist/es/framer-motion/dist/es/render/dom/resize/handle-window.mjs +30 -0
  152. package/dist/es/framer-motion/dist/es/render/dom/resize/index.mjs +8 -0
  153. package/dist/es/framer-motion/dist/es/render/dom/scroll/index.mjs +80 -0
  154. package/dist/es/framer-motion/dist/es/render/dom/scroll/info.mjs +56 -0
  155. package/dist/es/framer-motion/dist/es/render/dom/scroll/observe.mjs +18 -0
  156. package/dist/es/framer-motion/dist/es/render/dom/scroll/offsets/edge.mjs +45 -0
  157. package/dist/es/framer-motion/dist/es/render/dom/scroll/offsets/index.mjs +59 -0
  158. package/dist/es/framer-motion/dist/es/render/dom/scroll/offsets/inset.mjs +45 -0
  159. package/dist/es/framer-motion/dist/es/render/dom/scroll/offsets/offset.mjs +35 -0
  160. package/dist/es/framer-motion/dist/es/render/dom/scroll/offsets/presets.mjs +20 -0
  161. package/dist/es/framer-motion/dist/es/render/dom/scroll/on-scroll-handler.mjs +48 -0
  162. package/dist/es/framer-motion/dist/es/render/dom/scroll/supports.mjs +5 -0
  163. package/dist/es/framer-motion/dist/es/render/dom/scroll/track.mjs +84 -0
  164. package/dist/es/framer-motion/dist/es/render/dom/use-render.mjs +33 -0
  165. package/dist/es/framer-motion/dist/es/render/dom/utils/camel-to-dash.mjs +6 -0
  166. package/dist/es/framer-motion/dist/es/render/dom/utils/css-variables-conversion.mjs +42 -0
  167. package/dist/es/framer-motion/dist/es/render/dom/utils/filter-props.mjs +59 -0
  168. package/dist/es/framer-motion/dist/es/render/dom/utils/is-css-variable.mjs +15 -0
  169. package/dist/es/framer-motion/dist/es/render/dom/utils/is-svg-component.mjs +30 -0
  170. package/dist/es/framer-motion/dist/es/render/dom/utils/is-svg-element.mjs +5 -0
  171. package/dist/es/framer-motion/dist/es/render/dom/utils/resolve-element.mjs +28 -0
  172. package/dist/es/framer-motion/dist/es/render/dom/utils/unit-conversion.mjs +65 -0
  173. package/dist/es/framer-motion/dist/es/render/dom/value-types/animatable-none.mjs +15 -0
  174. package/dist/es/framer-motion/dist/es/render/dom/value-types/defaults.mjs +30 -0
  175. package/dist/es/framer-motion/dist/es/render/dom/value-types/dimensions.mjs +15 -0
  176. package/dist/es/framer-motion/dist/es/render/dom/value-types/find.mjs +15 -0
  177. package/dist/es/framer-motion/dist/es/render/dom/value-types/get-as-type.mjs +10 -0
  178. package/dist/es/framer-motion/dist/es/render/dom/value-types/number-browser.mjs +41 -0
  179. package/dist/es/framer-motion/dist/es/render/dom/value-types/number.mjs +18 -0
  180. package/dist/es/framer-motion/dist/es/render/dom/value-types/test.mjs +6 -0
  181. package/dist/es/framer-motion/dist/es/render/dom/value-types/transform.mjs +31 -0
  182. package/dist/es/framer-motion/dist/es/render/dom/value-types/type-auto.mjs +9 -0
  183. package/dist/es/framer-motion/dist/es/render/dom/value-types/type-int.mjs +8 -0
  184. package/dist/es/framer-motion/dist/es/render/dom/viewport/index.mjs +43 -0
  185. package/dist/es/framer-motion/dist/es/render/html/HTMLVisualElement.mjs +57 -0
  186. package/dist/es/framer-motion/dist/es/render/html/config-motion.mjs +12 -0
  187. package/dist/es/framer-motion/dist/es/render/html/use-props.mjs +57 -0
  188. package/dist/es/framer-motion/dist/es/render/html/utils/build-styles.mjs +65 -0
  189. package/dist/es/framer-motion/dist/es/render/html/utils/build-transform.mjs +62 -0
  190. package/dist/es/framer-motion/dist/es/render/html/utils/create-render-state.mjs +8 -0
  191. package/dist/es/framer-motion/dist/es/render/html/utils/make-none-animatable.mjs +30 -0
  192. package/dist/es/framer-motion/dist/es/render/html/utils/render.mjs +9 -0
  193. package/dist/es/framer-motion/dist/es/render/html/utils/scrape-motion-values.mjs +20 -0
  194. package/dist/es/framer-motion/dist/es/render/html/utils/transform.mjs +28 -0
  195. package/dist/es/framer-motion/dist/es/render/object/ObjectVisualElement.mjs +41 -0
  196. package/dist/es/framer-motion/dist/es/render/store.mjs +3 -0
  197. package/dist/es/framer-motion/dist/es/render/svg/SVGVisualElement.mjs +45 -0
  198. package/dist/es/framer-motion/dist/es/render/svg/config-motion.mjs +40 -0
  199. package/dist/es/framer-motion/dist/es/render/svg/lowercase-elements.mjs +33 -0
  200. package/dist/es/framer-motion/dist/es/render/svg/use-props.mjs +24 -0
  201. package/dist/es/framer-motion/dist/es/render/svg/utils/build-attrs.mjs +52 -0
  202. package/dist/es/framer-motion/dist/es/render/svg/utils/camel-case-attrs.mjs +30 -0
  203. package/dist/es/framer-motion/dist/es/render/svg/utils/create-render-state.mjs +8 -0
  204. package/dist/es/framer-motion/dist/es/render/svg/utils/is-svg-tag.mjs +3 -0
  205. package/dist/es/framer-motion/dist/es/render/svg/utils/path.mjs +32 -0
  206. package/dist/es/framer-motion/dist/es/render/svg/utils/render.mjs +12 -0
  207. package/dist/es/framer-motion/dist/es/render/svg/utils/scrape-motion-values.mjs +19 -0
  208. package/dist/es/framer-motion/dist/es/render/svg/utils/transform-origin.mjs +18 -0
  209. package/dist/es/framer-motion/dist/es/render/utils/KeyframesResolver.mjs +164 -0
  210. package/dist/es/framer-motion/dist/es/render/utils/animation-state.mjs +332 -0
  211. package/dist/es/framer-motion/dist/es/render/utils/compare-by-depth.mjs +3 -0
  212. package/dist/es/framer-motion/dist/es/render/utils/flat-tree.mjs +24 -0
  213. package/dist/es/framer-motion/dist/es/render/utils/get-variant-context.mjs +28 -0
  214. package/dist/es/framer-motion/dist/es/render/utils/is-controlling-variants.mjs +13 -0
  215. package/dist/es/framer-motion/dist/es/render/utils/is-variant-label.mjs +8 -0
  216. package/dist/es/framer-motion/dist/es/render/utils/motion-values.mjs +59 -0
  217. package/dist/es/framer-motion/dist/es/render/utils/resolve-dynamic-variants.mjs +8 -0
  218. package/dist/es/framer-motion/dist/es/render/utils/resolve-variants.mjs +36 -0
  219. package/dist/es/framer-motion/dist/es/render/utils/setters.mjs +27 -0
  220. package/dist/es/framer-motion/dist/es/render/utils/variant-props.mjs +12 -0
  221. package/dist/es/framer-motion/dist/es/utils/GlobalConfig.mjs +6 -0
  222. package/dist/es/framer-motion/dist/es/utils/array.mjs +11 -0
  223. package/dist/es/framer-motion/dist/es/utils/clamp.mjs +9 -0
  224. package/dist/es/framer-motion/dist/es/utils/delay.mjs +24 -0
  225. package/dist/es/framer-motion/dist/es/utils/distance.mjs +9 -0
  226. package/dist/es/framer-motion/dist/es/utils/errors.mjs +18 -0
  227. package/dist/es/framer-motion/dist/es/utils/get-context-window.mjs +6 -0
  228. package/dist/es/framer-motion/dist/es/utils/hsla-to-rgba.mjs +42 -0
  229. package/dist/es/framer-motion/dist/es/utils/interpolate.mjs +75 -0
  230. package/dist/es/framer-motion/dist/es/utils/is-browser.mjs +3 -0
  231. package/dist/es/framer-motion/dist/es/utils/is-numerical-string.mjs +6 -0
  232. package/dist/es/framer-motion/dist/es/utils/is-ref-object.mjs +7 -0
  233. package/dist/es/framer-motion/dist/es/utils/is-zero-value-string.mjs +6 -0
  234. package/dist/es/framer-motion/dist/es/utils/memo.mjs +10 -0
  235. package/dist/es/framer-motion/dist/es/utils/mix/color.mjs +47 -0
  236. package/dist/es/framer-motion/dist/es/utils/mix/complex.mjs +94 -0
  237. package/dist/es/framer-motion/dist/es/utils/mix/immediate.mjs +5 -0
  238. package/dist/es/framer-motion/dist/es/utils/mix/index.mjs +14 -0
  239. package/dist/es/framer-motion/dist/es/utils/mix/number.mjs +26 -0
  240. package/dist/es/framer-motion/dist/es/utils/mix/visibility.mjs +16 -0
  241. package/dist/es/framer-motion/dist/es/utils/noop.mjs +3 -0
  242. package/dist/es/framer-motion/dist/es/utils/offsets/default.mjs +9 -0
  243. package/dist/es/framer-motion/dist/es/utils/offsets/fill.mjs +12 -0
  244. package/dist/es/framer-motion/dist/es/utils/offsets/time.mjs +5 -0
  245. package/dist/es/framer-motion/dist/es/utils/pipe.mjs +11 -0
  246. package/dist/es/framer-motion/dist/es/utils/progress.mjs +18 -0
  247. package/dist/es/framer-motion/dist/es/utils/reduced-motion/index.mjs +19 -0
  248. package/dist/es/framer-motion/dist/es/utils/reduced-motion/state.mjs +5 -0
  249. package/dist/es/framer-motion/dist/es/utils/resolve-value.mjs +11 -0
  250. package/dist/es/framer-motion/dist/es/utils/shallow-compare.mjs +14 -0
  251. package/dist/es/framer-motion/dist/es/utils/subscription-manager.mjs +40 -0
  252. package/dist/es/framer-motion/dist/es/utils/time-conversion.mjs +10 -0
  253. package/dist/es/framer-motion/dist/es/utils/transform.mjs +21 -0
  254. package/dist/es/framer-motion/dist/es/utils/use-constant.mjs +18 -0
  255. package/dist/es/framer-motion/dist/es/utils/use-isomorphic-effect.mjs +6 -0
  256. package/dist/es/framer-motion/dist/es/utils/velocity-per-second.mjs +11 -0
  257. package/dist/es/framer-motion/dist/es/utils/warn-once.mjs +11 -0
  258. package/dist/es/framer-motion/dist/es/utils/wrap.mjs +6 -0
  259. package/dist/es/framer-motion/dist/es/value/index.mjs +313 -0
  260. package/dist/es/framer-motion/dist/es/value/types/color/hex.mjs +40 -0
  261. package/dist/es/framer-motion/dist/es/value/types/color/hsla.mjs +22 -0
  262. package/dist/es/framer-motion/dist/es/value/types/color/index.mjs +27 -0
  263. package/dist/es/framer-motion/dist/es/value/types/color/rgba.mjs +25 -0
  264. package/dist/es/framer-motion/dist/es/value/types/color/utils.mjs +29 -0
  265. package/dist/es/framer-motion/dist/es/value/types/complex/filter.mjs +30 -0
  266. package/dist/es/framer-motion/dist/es/value/types/complex/index.mjs +92 -0
  267. package/dist/es/framer-motion/dist/es/value/types/numbers/index.mjs +17 -0
  268. package/dist/es/framer-motion/dist/es/value/types/numbers/units.mjs +17 -0
  269. package/dist/es/framer-motion/dist/es/value/types/utils/color-regex.mjs +3 -0
  270. package/dist/es/framer-motion/dist/es/value/types/utils/float-regex.mjs +3 -0
  271. package/dist/es/framer-motion/dist/es/value/types/utils/is-nullish.mjs +5 -0
  272. package/dist/es/framer-motion/dist/es/value/types/utils/sanitize.mjs +5 -0
  273. package/dist/es/framer-motion/dist/es/value/types/utils/single-color-regex.mjs +3 -0
  274. package/dist/es/framer-motion/dist/es/value/use-will-change/add-will-change.mjs +14 -0
  275. package/dist/es/framer-motion/dist/es/value/use-will-change/is.mjs +7 -0
  276. package/dist/es/framer-motion/dist/es/value/utils/is-motion-value.mjs +3 -0
  277. package/dist/es/framer-motion/dist/es/value/utils/resolve-motion-value.mjs +16 -0
  278. package/dist/es/motion/lib/index.mjs +30 -0
  279. package/dist/es/motion/lib/react-client.mjs +3 -0
  280. package/dist/es/motion/lib/react-m.mjs +3 -0
  281. package/dist/index.d.ts +1 -0
  282. package/dist/motion.dev.js +6121 -0
  283. package/dist/motion.js +1 -0
  284. package/dist/react-client.d.ts +1 -0
  285. package/dist/react-m.d.ts +1 -0
  286. package/lib/index.js +1 -3
  287. package/lib/index.js.map +1 -1
  288. package/lib/react-client.js +3 -0
  289. package/lib/react-client.js.map +1 -0
  290. package/lib/react-m.js +3 -0
  291. package/lib/react-m.js.map +1 -0
  292. package/lib/react.js +3 -0
  293. package/lib/react.js.map +1 -0
  294. package/package.json +79 -29
  295. package/react/package.json +6 -0
  296. package/react-client/package.json +6 -0
  297. package/react-m/package.json +6 -0
  298. package/rollup.config.mjs +174 -0
  299. package/src/index.ts +1 -0
  300. package/src/react-client.ts +3 -0
  301. package/src/react-m.ts +3 -0
  302. package/src/react.ts +3 -0
  303. package/tsconfig.json +25 -0
  304. package/types/index.d.ts +1 -4
  305. package/types/react-client.d.ts +1 -0
  306. package/types/react-m.d.ts +1 -0
  307. package/types/react.d.ts +1 -0
  308. package/CHANGELOG.md +0 -378
  309. package/dist/animate.cjs.js +0 -22
  310. package/dist/animate.es.js +0 -19
  311. package/dist/main.cjs.js +0 -21
  312. package/dist/main.es.js +0 -3
  313. package/dist/motion.min.js +0 -1
  314. package/dist/motion.umd.js +0 -2364
  315. package/dist/size-index.js +0 -1
  316. package/lib/animate.js +0 -17
  317. package/lib/animate.js.map +0 -1
  318. package/types/animate.d.ts +0 -6
  319. package/types/animate.d.ts.map +0 -1
  320. package/types/index.d.ts.map +0 -1
@@ -0,0 +1,78 @@
1
+ import { supportsScrollTimeline } from '../render/dom/scroll/supports.mjs';
2
+
3
+ class GroupPlaybackControls {
4
+ constructor(animations) {
5
+ // Bound to accomodate common `return animation.stop` pattern
6
+ this.stop = () => this.runAll("stop");
7
+ this.animations = animations.filter(Boolean);
8
+ }
9
+ then(onResolve, onReject) {
10
+ return Promise.all(this.animations).then(onResolve).catch(onReject);
11
+ }
12
+ /**
13
+ * TODO: Filter out cancelled or stopped animations before returning
14
+ */
15
+ getAll(propName) {
16
+ return this.animations[0][propName];
17
+ }
18
+ setAll(propName, newValue) {
19
+ for (let i = 0; i < this.animations.length; i++) {
20
+ this.animations[i][propName] = newValue;
21
+ }
22
+ }
23
+ attachTimeline(timeline, fallback) {
24
+ const subscriptions = this.animations.map((animation) => {
25
+ if (supportsScrollTimeline() && animation.attachTimeline) {
26
+ return animation.attachTimeline(timeline);
27
+ }
28
+ else {
29
+ return fallback(animation);
30
+ }
31
+ });
32
+ return () => {
33
+ subscriptions.forEach((cancel, i) => {
34
+ cancel && cancel();
35
+ this.animations[i].stop();
36
+ });
37
+ };
38
+ }
39
+ get time() {
40
+ return this.getAll("time");
41
+ }
42
+ set time(time) {
43
+ this.setAll("time", time);
44
+ }
45
+ get speed() {
46
+ return this.getAll("speed");
47
+ }
48
+ set speed(speed) {
49
+ this.setAll("speed", speed);
50
+ }
51
+ get startTime() {
52
+ return this.getAll("startTime");
53
+ }
54
+ get duration() {
55
+ let max = 0;
56
+ for (let i = 0; i < this.animations.length; i++) {
57
+ max = Math.max(max, this.animations[i].duration);
58
+ }
59
+ return max;
60
+ }
61
+ runAll(methodName) {
62
+ this.animations.forEach((controls) => controls[methodName]());
63
+ }
64
+ play() {
65
+ this.runAll("play");
66
+ }
67
+ pause() {
68
+ this.runAll("pause");
69
+ }
70
+ cancel() {
71
+ this.runAll("cancel");
72
+ }
73
+ complete() {
74
+ this.runAll("complete");
75
+ }
76
+ }
77
+
78
+ export { GroupPlaybackControls };
@@ -0,0 +1,34 @@
1
+ import { GroupPlaybackControls } from '../GroupPlaybackControls.mjs';
2
+ import { animateSequence } from './sequence.mjs';
3
+ import { animateSubject } from './subject.mjs';
4
+
5
+ function isSequence(value) {
6
+ return Array.isArray(value) && Array.isArray(value[0]);
7
+ }
8
+ /**
9
+ * Creates an animation function that is optionally scoped
10
+ * to a specific element.
11
+ */
12
+ function createScopedAnimate(scope) {
13
+ /**
14
+ * Implementation
15
+ */
16
+ function scopedAnimate(subjectOrSequence, optionsOrKeyframes, options) {
17
+ let animations = [];
18
+ if (isSequence(subjectOrSequence)) {
19
+ animations = animateSequence(subjectOrSequence, optionsOrKeyframes, scope);
20
+ }
21
+ else {
22
+ animations = animateSubject(subjectOrSequence, optionsOrKeyframes, options, scope);
23
+ }
24
+ const animation = new GroupPlaybackControls(animations);
25
+ if (scope) {
26
+ scope.animations.push(animation);
27
+ }
28
+ return animation;
29
+ }
30
+ return scopedAnimate;
31
+ }
32
+ const animate = createScopedAnimate();
33
+
34
+ export { animate, createScopedAnimate };
@@ -0,0 +1,19 @@
1
+ import { resolveElements } from '../../render/dom/utils/resolve-element.mjs';
2
+ import { isDOMKeyframes } from '../utils/is-dom-keyframes.mjs';
3
+
4
+ function resolveSubjects(subject, keyframes, scope, selectorCache) {
5
+ if (typeof subject === "string" && isDOMKeyframes(keyframes)) {
6
+ return resolveElements(subject, scope, selectorCache);
7
+ }
8
+ else if (subject instanceof NodeList) {
9
+ return Array.from(subject);
10
+ }
11
+ else if (Array.isArray(subject)) {
12
+ return subject;
13
+ }
14
+ else {
15
+ return [subject];
16
+ }
17
+ }
18
+
19
+ export { resolveSubjects };
@@ -0,0 +1,14 @@
1
+ import { spring } from '../generators/spring/index.mjs';
2
+ import { createAnimationsFromSequence } from '../sequence/create.mjs';
3
+ import { animateSubject } from './subject.mjs';
4
+
5
+ function animateSequence(sequence, options, scope) {
6
+ const animations = [];
7
+ const animationDefinitions = createAnimationsFromSequence(sequence, options, scope, { spring });
8
+ animationDefinitions.forEach(({ keyframes, transition }, subject) => {
9
+ animations.push(...animateSubject(subject, keyframes, transition));
10
+ });
11
+ return animations;
12
+ }
13
+
14
+ export { animateSequence };
@@ -0,0 +1,11 @@
1
+ import { animateMotionValue } from '../interfaces/motion-value.mjs';
2
+ import { motionValue } from '../../value/index.mjs';
3
+ import { isMotionValue } from '../../value/utils/is-motion-value.mjs';
4
+
5
+ function animateSingleValue(value, keyframes, options) {
6
+ const motionValue$1 = isMotionValue(value) ? value : motionValue(value);
7
+ motionValue$1.start(animateMotionValue("", motionValue$1, keyframes, options));
8
+ return motionValue$1.animation;
9
+ }
10
+
11
+ export { animateSingleValue };
@@ -0,0 +1,52 @@
1
+ import { visualElementStore } from '../../render/store.mjs';
2
+ import { invariant } from '../../utils/errors.mjs';
3
+ import { isMotionValue } from '../../value/utils/is-motion-value.mjs';
4
+ import { animateTarget } from '../interfaces/visual-element-target.mjs';
5
+ import { createDOMVisualElement, createObjectVisualElement } from '../utils/create-visual-element.mjs';
6
+ import { isDOMKeyframes } from '../utils/is-dom-keyframes.mjs';
7
+ import { resolveSubjects } from './resolve-subjects.mjs';
8
+ import { animateSingleValue } from './single-value.mjs';
9
+
10
+ function isSingleValue(subject, keyframes) {
11
+ return (isMotionValue(subject) ||
12
+ typeof subject === "number" ||
13
+ (typeof subject === "string" && !isDOMKeyframes(keyframes)));
14
+ }
15
+ /**
16
+ * Implementation
17
+ */
18
+ function animateSubject(subject, keyframes, options, scope) {
19
+ const animations = [];
20
+ if (isSingleValue(subject, keyframes)) {
21
+ animations.push(animateSingleValue(subject, isDOMKeyframes(keyframes)
22
+ ? keyframes.default || keyframes
23
+ : keyframes, options ? options.default || options : options));
24
+ }
25
+ else {
26
+ const subjects = resolveSubjects(subject, keyframes, scope);
27
+ const numSubjects = subjects.length;
28
+ invariant(Boolean(numSubjects), "No valid elements provided.");
29
+ for (let i = 0; i < numSubjects; i++) {
30
+ const thisSubject = subjects[i];
31
+ const createVisualElement = thisSubject instanceof Element
32
+ ? createDOMVisualElement
33
+ : createObjectVisualElement;
34
+ if (!visualElementStore.has(thisSubject)) {
35
+ createVisualElement(thisSubject);
36
+ }
37
+ const visualElement = visualElementStore.get(thisSubject);
38
+ const transition = { ...options };
39
+ /**
40
+ * Resolve stagger function if provided.
41
+ */
42
+ if ("delay" in transition &&
43
+ typeof transition.delay === "function") {
44
+ transition.delay = transition.delay(i, numSubjects);
45
+ }
46
+ animations.push(...animateTarget(visualElement, { ...keyframes, transition }, {}));
47
+ }
48
+ }
49
+ return animations;
50
+ }
51
+
52
+ export { animateSubject };
@@ -0,0 +1,318 @@
1
+ import { anticipate } from '../../easing/anticipate.mjs';
2
+ import { backInOut } from '../../easing/back.mjs';
3
+ import { circInOut } from '../../easing/circ.mjs';
4
+ import { DOMKeyframesResolver } from '../../render/dom/DOMKeyframesResolver.mjs';
5
+ import { noop } from '../../utils/noop.mjs';
6
+ import { millisecondsToSeconds, secondsToMilliseconds } from '../../utils/time-conversion.mjs';
7
+ import { isGenerator } from '../generators/utils/is-generator.mjs';
8
+ import { BaseAnimation } from './BaseAnimation.mjs';
9
+ import { MainThreadAnimation } from './MainThreadAnimation.mjs';
10
+ import { acceleratedValues } from './utils/accelerated-values.mjs';
11
+ import { startWaapiAnimation } from './waapi/index.mjs';
12
+ import { isWaapiSupportedEasing } from './waapi/easing.mjs';
13
+ import { attachTimeline } from './waapi/utils/attach-timeline.mjs';
14
+ import { getFinalKeyframe } from './waapi/utils/get-final-keyframe.mjs';
15
+ import { supportsLinearEasing } from './waapi/utils/supports-linear-easing.mjs';
16
+ import { supportsWaapi } from './waapi/utils/supports-waapi.mjs';
17
+
18
+ /**
19
+ * 10ms is chosen here as it strikes a balance between smooth
20
+ * results (more than one keyframe per frame at 60fps) and
21
+ * keyframe quantity.
22
+ */
23
+ const sampleDelta = 10; //ms
24
+ /**
25
+ * Implement a practical max duration for keyframe generation
26
+ * to prevent infinite loops
27
+ */
28
+ const maxDuration = 20000;
29
+ /**
30
+ * Check if an animation can run natively via WAAPI or requires pregenerated keyframes.
31
+ * WAAPI doesn't support spring or function easings so we run these as JS animation before
32
+ * handing off.
33
+ */
34
+ function requiresPregeneratedKeyframes(options) {
35
+ return (isGenerator(options.type) ||
36
+ options.type === "spring" ||
37
+ !isWaapiSupportedEasing(options.ease));
38
+ }
39
+ function pregenerateKeyframes(keyframes, options) {
40
+ /**
41
+ * Create a main-thread animation to pregenerate keyframes.
42
+ * We sample this at regular intervals to generate keyframes that we then
43
+ * linearly interpolate between.
44
+ */
45
+ const sampleAnimation = new MainThreadAnimation({
46
+ ...options,
47
+ keyframes,
48
+ repeat: 0,
49
+ delay: 0,
50
+ isGenerator: true,
51
+ });
52
+ let state = { done: false, value: keyframes[0] };
53
+ const pregeneratedKeyframes = [];
54
+ /**
55
+ * Bail after 20 seconds of pre-generated keyframes as it's likely
56
+ * we're heading for an infinite loop.
57
+ */
58
+ let t = 0;
59
+ while (!state.done && t < maxDuration) {
60
+ state = sampleAnimation.sample(t);
61
+ pregeneratedKeyframes.push(state.value);
62
+ t += sampleDelta;
63
+ }
64
+ return {
65
+ times: undefined,
66
+ keyframes: pregeneratedKeyframes,
67
+ duration: t - sampleDelta,
68
+ ease: "linear",
69
+ };
70
+ }
71
+ const unsupportedEasingFunctions = {
72
+ anticipate,
73
+ backInOut,
74
+ circInOut,
75
+ };
76
+ function isUnsupportedEase(key) {
77
+ return key in unsupportedEasingFunctions;
78
+ }
79
+ class AcceleratedAnimation extends BaseAnimation {
80
+ constructor(options) {
81
+ super(options);
82
+ const { name, motionValue, element, keyframes } = this.options;
83
+ this.resolver = new DOMKeyframesResolver(keyframes, (resolvedKeyframes, finalKeyframe) => this.onKeyframesResolved(resolvedKeyframes, finalKeyframe), name, motionValue, element);
84
+ this.resolver.scheduleResolve();
85
+ }
86
+ initPlayback(keyframes, finalKeyframe) {
87
+ var _a;
88
+ let { duration = 300, times, ease, type, motionValue, name, startTime, } = this.options;
89
+ /**
90
+ * If element has since been unmounted, return false to indicate
91
+ * the animation failed to initialised.
92
+ */
93
+ if (!((_a = motionValue.owner) === null || _a === void 0 ? void 0 : _a.current)) {
94
+ return false;
95
+ }
96
+ /**
97
+ * If the user has provided an easing function name that isn't supported
98
+ * by WAAPI (like "anticipate"), we need to provide the corressponding
99
+ * function. This will later get converted to a linear() easing function.
100
+ */
101
+ if (typeof ease === "string" &&
102
+ supportsLinearEasing() &&
103
+ isUnsupportedEase(ease)) {
104
+ ease = unsupportedEasingFunctions[ease];
105
+ }
106
+ /**
107
+ * If this animation needs pre-generated keyframes then generate.
108
+ */
109
+ if (requiresPregeneratedKeyframes(this.options)) {
110
+ const { onComplete, onUpdate, motionValue, element, ...options } = this.options;
111
+ const pregeneratedAnimation = pregenerateKeyframes(keyframes, options);
112
+ keyframes = pregeneratedAnimation.keyframes;
113
+ // If this is a very short animation, ensure we have
114
+ // at least two keyframes to animate between as older browsers
115
+ // can't animate between a single keyframe.
116
+ if (keyframes.length === 1) {
117
+ keyframes[1] = keyframes[0];
118
+ }
119
+ duration = pregeneratedAnimation.duration;
120
+ times = pregeneratedAnimation.times;
121
+ ease = pregeneratedAnimation.ease;
122
+ type = "keyframes";
123
+ }
124
+ const animation = startWaapiAnimation(motionValue.owner.current, name, keyframes, { ...this.options, duration, times, ease });
125
+ // Override the browser calculated startTime with one synchronised to other JS
126
+ // and WAAPI animations starting this event loop.
127
+ animation.startTime = startTime !== null && startTime !== void 0 ? startTime : this.calcStartTime();
128
+ if (this.pendingTimeline) {
129
+ attachTimeline(animation, this.pendingTimeline);
130
+ this.pendingTimeline = undefined;
131
+ }
132
+ else {
133
+ /**
134
+ * Prefer the `onfinish` prop as it's more widely supported than
135
+ * the `finished` promise.
136
+ *
137
+ * Here, we synchronously set the provided MotionValue to the end
138
+ * keyframe. If we didn't, when the WAAPI animation is finished it would
139
+ * be removed from the element which would then revert to its old styles.
140
+ */
141
+ animation.onfinish = () => {
142
+ const { onComplete } = this.options;
143
+ motionValue.set(getFinalKeyframe(keyframes, this.options, finalKeyframe));
144
+ onComplete && onComplete();
145
+ this.cancel();
146
+ this.resolveFinishedPromise();
147
+ };
148
+ }
149
+ return {
150
+ animation,
151
+ duration,
152
+ times,
153
+ type,
154
+ ease,
155
+ keyframes: keyframes,
156
+ };
157
+ }
158
+ get duration() {
159
+ const { resolved } = this;
160
+ if (!resolved)
161
+ return 0;
162
+ const { duration } = resolved;
163
+ return millisecondsToSeconds(duration);
164
+ }
165
+ get time() {
166
+ const { resolved } = this;
167
+ if (!resolved)
168
+ return 0;
169
+ const { animation } = resolved;
170
+ return millisecondsToSeconds(animation.currentTime || 0);
171
+ }
172
+ set time(newTime) {
173
+ const { resolved } = this;
174
+ if (!resolved)
175
+ return;
176
+ const { animation } = resolved;
177
+ animation.currentTime = secondsToMilliseconds(newTime);
178
+ }
179
+ get speed() {
180
+ const { resolved } = this;
181
+ if (!resolved)
182
+ return 1;
183
+ const { animation } = resolved;
184
+ return animation.playbackRate;
185
+ }
186
+ set speed(newSpeed) {
187
+ const { resolved } = this;
188
+ if (!resolved)
189
+ return;
190
+ const { animation } = resolved;
191
+ animation.playbackRate = newSpeed;
192
+ }
193
+ get state() {
194
+ const { resolved } = this;
195
+ if (!resolved)
196
+ return "idle";
197
+ const { animation } = resolved;
198
+ return animation.playState;
199
+ }
200
+ get startTime() {
201
+ const { resolved } = this;
202
+ if (!resolved)
203
+ return null;
204
+ const { animation } = resolved;
205
+ // Coerce to number as TypeScript incorrectly types this
206
+ // as CSSNumberish
207
+ return animation.startTime;
208
+ }
209
+ /**
210
+ * Replace the default DocumentTimeline with another AnimationTimeline.
211
+ * Currently used for scroll animations.
212
+ */
213
+ attachTimeline(timeline) {
214
+ if (!this._resolved) {
215
+ this.pendingTimeline = timeline;
216
+ }
217
+ else {
218
+ const { resolved } = this;
219
+ if (!resolved)
220
+ return noop;
221
+ const { animation } = resolved;
222
+ attachTimeline(animation, timeline);
223
+ }
224
+ return noop;
225
+ }
226
+ play() {
227
+ if (this.isStopped)
228
+ return;
229
+ const { resolved } = this;
230
+ if (!resolved)
231
+ return;
232
+ const { animation } = resolved;
233
+ if (animation.playState === "finished") {
234
+ this.updateFinishedPromise();
235
+ }
236
+ animation.play();
237
+ }
238
+ pause() {
239
+ const { resolved } = this;
240
+ if (!resolved)
241
+ return;
242
+ const { animation } = resolved;
243
+ animation.pause();
244
+ }
245
+ stop() {
246
+ this.resolver.cancel();
247
+ this.isStopped = true;
248
+ if (this.state === "idle")
249
+ return;
250
+ this.resolveFinishedPromise();
251
+ this.updateFinishedPromise();
252
+ const { resolved } = this;
253
+ if (!resolved)
254
+ return;
255
+ const { animation, keyframes, duration, type, ease, times } = resolved;
256
+ if (animation.playState === "idle" ||
257
+ animation.playState === "finished") {
258
+ return;
259
+ }
260
+ /**
261
+ * WAAPI doesn't natively have any interruption capabilities.
262
+ *
263
+ * Rather than read commited styles back out of the DOM, we can
264
+ * create a renderless JS animation and sample it twice to calculate
265
+ * its current value, "previous" value, and therefore allow
266
+ * Motion to calculate velocity for any subsequent animation.
267
+ */
268
+ if (this.time) {
269
+ const { motionValue, onUpdate, onComplete, element, ...options } = this.options;
270
+ const sampleAnimation = new MainThreadAnimation({
271
+ ...options,
272
+ keyframes,
273
+ duration,
274
+ type,
275
+ ease,
276
+ times,
277
+ isGenerator: true,
278
+ });
279
+ const sampleTime = secondsToMilliseconds(this.time);
280
+ motionValue.setWithVelocity(sampleAnimation.sample(sampleTime - sampleDelta).value, sampleAnimation.sample(sampleTime).value, sampleDelta);
281
+ }
282
+ const { onStop } = this.options;
283
+ onStop && onStop();
284
+ this.cancel();
285
+ }
286
+ complete() {
287
+ const { resolved } = this;
288
+ if (!resolved)
289
+ return;
290
+ resolved.animation.finish();
291
+ }
292
+ cancel() {
293
+ const { resolved } = this;
294
+ if (!resolved)
295
+ return;
296
+ resolved.animation.cancel();
297
+ }
298
+ static supports(options) {
299
+ const { motionValue, name, repeatDelay, repeatType, damping, type } = options;
300
+ return (supportsWaapi() &&
301
+ name &&
302
+ acceleratedValues.has(name) &&
303
+ motionValue &&
304
+ motionValue.owner &&
305
+ motionValue.owner.current instanceof HTMLElement &&
306
+ /**
307
+ * If we're outputting values to onUpdate then we can't use WAAPI as there's
308
+ * no way to read the value from WAAPI every frame.
309
+ */
310
+ !motionValue.owner.getProps().onUpdate &&
311
+ !repeatDelay &&
312
+ repeatType !== "mirror" &&
313
+ damping !== 0 &&
314
+ type !== "inertia");
315
+ }
316
+ }
317
+
318
+ export { AcceleratedAnimation };
@@ -0,0 +1,112 @@
1
+ import { time } from '../../frameloop/sync-time.mjs';
2
+ import { flushKeyframeResolvers } from '../../render/utils/KeyframesResolver.mjs';
3
+ import { canAnimate } from './utils/can-animate.mjs';
4
+ import { getFinalKeyframe } from './waapi/utils/get-final-keyframe.mjs';
5
+
6
+ /**
7
+ * Maximum time allowed between an animation being created and it being
8
+ * resolved for us to use the latter as the start time.
9
+ *
10
+ * This is to ensure that while we prefer to "start" an animation as soon
11
+ * as it's triggered, we also want to avoid a visual jump if there's a big delay
12
+ * between these two moments.
13
+ */
14
+ const MAX_RESOLVE_DELAY = 40;
15
+ class BaseAnimation {
16
+ constructor({ autoplay = true, delay = 0, type = "keyframes", repeat = 0, repeatDelay = 0, repeatType = "loop", ...options }) {
17
+ // Track whether the animation has been stopped. Stopped animations won't restart.
18
+ this.isStopped = false;
19
+ this.hasAttemptedResolve = false;
20
+ this.createdAt = time.now();
21
+ this.options = {
22
+ autoplay,
23
+ delay,
24
+ type,
25
+ repeat,
26
+ repeatDelay,
27
+ repeatType,
28
+ ...options,
29
+ };
30
+ this.updateFinishedPromise();
31
+ }
32
+ /**
33
+ * This method uses the createdAt and resolvedAt to calculate the
34
+ * animation startTime. *Ideally*, we would use the createdAt time as t=0
35
+ * as the following frame would then be the first frame of the animation in
36
+ * progress, which would feel snappier.
37
+ *
38
+ * However, if there's a delay (main thread work) between the creation of
39
+ * the animation and the first commited frame, we prefer to use resolvedAt
40
+ * to avoid a sudden jump into the animation.
41
+ */
42
+ calcStartTime() {
43
+ if (!this.resolvedAt)
44
+ return this.createdAt;
45
+ return this.resolvedAt - this.createdAt > MAX_RESOLVE_DELAY
46
+ ? this.resolvedAt
47
+ : this.createdAt;
48
+ }
49
+ /**
50
+ * A getter for resolved data. If keyframes are not yet resolved, accessing
51
+ * this.resolved will synchronously flush all pending keyframe resolvers.
52
+ * This is a deoptimisation, but at its worst still batches read/writes.
53
+ */
54
+ get resolved() {
55
+ if (!this._resolved && !this.hasAttemptedResolve) {
56
+ flushKeyframeResolvers();
57
+ }
58
+ return this._resolved;
59
+ }
60
+ /**
61
+ * A method to be called when the keyframes resolver completes. This method
62
+ * will check if its possible to run the animation and, if not, skip it.
63
+ * Otherwise, it will call initPlayback on the implementing class.
64
+ */
65
+ onKeyframesResolved(keyframes, finalKeyframe) {
66
+ this.resolvedAt = time.now();
67
+ this.hasAttemptedResolve = true;
68
+ const { name, type, velocity, delay, onComplete, onUpdate, isGenerator, } = this.options;
69
+ /**
70
+ * If we can't animate this value with the resolved keyframes
71
+ * then we should complete it immediately.
72
+ */
73
+ if (!isGenerator && !canAnimate(keyframes, name, type, velocity)) {
74
+ // Finish immediately
75
+ if (!delay) {
76
+ onUpdate === null || onUpdate === void 0 ? void 0 : onUpdate(getFinalKeyframe(keyframes, this.options, finalKeyframe));
77
+ onComplete === null || onComplete === void 0 ? void 0 : onComplete();
78
+ this.resolveFinishedPromise();
79
+ return;
80
+ }
81
+ // Finish after a delay
82
+ else {
83
+ this.options.duration = 0;
84
+ }
85
+ }
86
+ const resolvedAnimation = this.initPlayback(keyframes, finalKeyframe);
87
+ if (resolvedAnimation === false)
88
+ return;
89
+ this._resolved = {
90
+ keyframes,
91
+ finalKeyframe,
92
+ ...resolvedAnimation,
93
+ };
94
+ this.onPostResolved();
95
+ }
96
+ onPostResolved() { }
97
+ /**
98
+ * Allows the returned animation to be awaited or promise-chained. Currently
99
+ * resolves when the animation finishes at all but in a future update could/should
100
+ * reject if its cancels.
101
+ */
102
+ then(resolve, reject) {
103
+ return this.currentFinishedPromise.then(resolve, reject);
104
+ }
105
+ updateFinishedPromise() {
106
+ this.currentFinishedPromise = new Promise((resolve) => {
107
+ this.resolveFinishedPromise = resolve;
108
+ });
109
+ }
110
+ }
111
+
112
+ export { BaseAnimation };