motion 10.18.0 → 11.11.13
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.turbo/turbo-build.log +32 -0
- package/{LICENSE → LICENSE.md} +2 -2
- package/README.md +99 -7
- package/dist/cjs/index.js +6117 -0
- package/dist/cjs/react-client.js +10003 -0
- package/dist/cjs/react-m.js +1852 -0
- package/dist/es/framer-motion/dist/es/animation/GroupPlaybackControls.mjs +78 -0
- package/dist/es/framer-motion/dist/es/animation/animate/index.mjs +34 -0
- package/dist/es/framer-motion/dist/es/animation/animate/resolve-subjects.mjs +19 -0
- package/dist/es/framer-motion/dist/es/animation/animate/sequence.mjs +14 -0
- package/dist/es/framer-motion/dist/es/animation/animate/single-value.mjs +11 -0
- package/dist/es/framer-motion/dist/es/animation/animate/subject.mjs +52 -0
- package/dist/es/framer-motion/dist/es/animation/animators/AcceleratedAnimation.mjs +318 -0
- package/dist/es/framer-motion/dist/es/animation/animators/BaseAnimation.mjs +113 -0
- package/dist/es/framer-motion/dist/es/animation/animators/MainThreadAnimation.mjs +384 -0
- package/dist/es/framer-motion/dist/es/animation/animators/drivers/driver-frameloop.mjs +17 -0
- package/dist/es/framer-motion/dist/es/animation/animators/utils/accelerated-values.mjs +14 -0
- package/dist/es/framer-motion/dist/es/animation/animators/utils/can-animate.mjs +42 -0
- package/dist/es/framer-motion/dist/es/animation/animators/waapi/NativeAnimation.mjs +169 -0
- package/dist/es/framer-motion/dist/es/animation/animators/waapi/animate-elements.mjs +36 -0
- package/dist/es/framer-motion/dist/es/animation/animators/waapi/animate-style.mjs +12 -0
- package/dist/es/framer-motion/dist/es/animation/animators/waapi/easing.mjs +44 -0
- package/dist/es/framer-motion/dist/es/animation/animators/waapi/index.mjs +23 -0
- package/dist/es/framer-motion/dist/es/animation/animators/waapi/utils/attach-timeline.mjs +6 -0
- package/dist/es/framer-motion/dist/es/animation/animators/waapi/utils/get-final-keyframe.mjs +12 -0
- package/dist/es/framer-motion/dist/es/animation/animators/waapi/utils/linear.mjs +15 -0
- package/dist/es/framer-motion/dist/es/animation/animators/waapi/utils/memo-supports.mjs +9 -0
- package/dist/es/framer-motion/dist/es/animation/animators/waapi/utils/style.mjs +8 -0
- package/dist/es/framer-motion/dist/es/animation/animators/waapi/utils/supports-flags.mjs +9 -0
- package/dist/es/framer-motion/dist/es/animation/animators/waapi/utils/supports-linear-easing.mjs +15 -0
- package/dist/es/framer-motion/dist/es/animation/animators/waapi/utils/supports-partial-keyframes.mjs +13 -0
- package/dist/es/framer-motion/dist/es/animation/animators/waapi/utils/supports-waapi.mjs +5 -0
- package/dist/es/framer-motion/dist/es/animation/generators/inertia.mjs +87 -0
- package/dist/es/framer-motion/dist/es/animation/generators/keyframes.mjs +51 -0
- package/dist/es/framer-motion/dist/es/animation/generators/spring/find.mjs +89 -0
- package/dist/es/framer-motion/dist/es/animation/generators/spring/index.mjs +129 -0
- package/dist/es/framer-motion/dist/es/animation/generators/utils/calc-duration.mjs +17 -0
- package/dist/es/framer-motion/dist/es/animation/generators/utils/is-generator.mjs +5 -0
- package/dist/es/framer-motion/dist/es/animation/generators/utils/velocity.mjs +9 -0
- package/dist/es/framer-motion/dist/es/animation/hooks/animation-controls.mjs +80 -0
- package/dist/es/framer-motion/dist/es/animation/hooks/use-animate-style.mjs +17 -0
- package/dist/es/framer-motion/dist/es/animation/hooks/use-animate.mjs +17 -0
- package/dist/es/framer-motion/dist/es/animation/hooks/use-animated-state.mjs +64 -0
- package/dist/es/framer-motion/dist/es/animation/hooks/use-animation.mjs +41 -0
- package/dist/es/framer-motion/dist/es/animation/interfaces/motion-value.mjs +113 -0
- package/dist/es/framer-motion/dist/es/animation/interfaces/visual-element-target.mjs +75 -0
- package/dist/es/framer-motion/dist/es/animation/interfaces/visual-element-variant.mjs +66 -0
- package/dist/es/framer-motion/dist/es/animation/interfaces/visual-element.mjs +26 -0
- package/dist/es/framer-motion/dist/es/animation/optimized-appear/data-id.mjs +6 -0
- package/dist/es/framer-motion/dist/es/animation/optimized-appear/get-appear-id.mjs +7 -0
- package/dist/es/framer-motion/dist/es/animation/optimized-appear/handoff.mjs +40 -0
- package/dist/es/framer-motion/dist/es/animation/optimized-appear/start.mjs +173 -0
- package/dist/es/framer-motion/dist/es/animation/optimized-appear/store-id.mjs +8 -0
- package/dist/es/framer-motion/dist/es/animation/optimized-appear/store.mjs +4 -0
- package/dist/es/framer-motion/dist/es/animation/sequence/create.mjs +230 -0
- package/dist/es/framer-motion/dist/es/animation/sequence/utils/calc-time.mjs +21 -0
- package/dist/es/framer-motion/dist/es/animation/sequence/utils/edit.mjs +31 -0
- package/dist/es/framer-motion/dist/es/animation/sequence/utils/sort.mjs +14 -0
- package/dist/es/framer-motion/dist/es/animation/utils/create-visual-element.mjs +44 -0
- package/dist/es/framer-motion/dist/es/animation/utils/default-transitions.mjs +40 -0
- package/dist/es/framer-motion/dist/es/animation/utils/get-value-transition.mjs +9 -0
- package/dist/es/framer-motion/dist/es/animation/utils/is-animatable.mjs +30 -0
- package/dist/es/framer-motion/dist/es/animation/utils/is-animation-controls.mjs +7 -0
- package/dist/es/framer-motion/dist/es/animation/utils/is-dom-keyframes.mjs +5 -0
- package/dist/es/framer-motion/dist/es/animation/utils/is-keyframes-target.mjs +5 -0
- package/dist/es/framer-motion/dist/es/animation/utils/is-none.mjs +15 -0
- package/dist/es/framer-motion/dist/es/animation/utils/is-transition-defined.mjs +10 -0
- package/dist/es/framer-motion/dist/es/animation/utils/stagger.mjs +26 -0
- package/dist/es/framer-motion/dist/es/components/AnimatePresence/PopChild.mjs +77 -0
- package/dist/es/framer-motion/dist/es/components/AnimatePresence/PresenceChild.mjs +61 -0
- package/dist/es/framer-motion/dist/es/components/AnimatePresence/index.mjs +163 -0
- package/dist/es/framer-motion/dist/es/components/AnimatePresence/use-presence.mjs +66 -0
- package/dist/es/framer-motion/dist/es/components/AnimatePresence/utils.mjs +14 -0
- package/dist/es/framer-motion/dist/es/components/AnimateSharedLayout.mjs +15 -0
- package/dist/es/framer-motion/dist/es/components/LayoutGroup/index.mjs +32 -0
- package/dist/es/framer-motion/dist/es/components/LazyMotion/index.mjs +68 -0
- package/dist/es/framer-motion/dist/es/components/MotionConfig/index.mjs +48 -0
- package/dist/es/framer-motion/dist/es/components/Reorder/Group.mjs +53 -0
- package/dist/es/framer-motion/dist/es/components/Reorder/Item.mjs +34 -0
- package/dist/es/framer-motion/dist/es/components/Reorder/namespace.mjs +2 -0
- package/dist/es/framer-motion/dist/es/components/Reorder/utils/check-reorder.mjs +24 -0
- package/dist/es/framer-motion/dist/es/context/DeprecatedLayoutGroupContext.mjs +10 -0
- package/dist/es/framer-motion/dist/es/context/LayoutGroupContext.mjs +6 -0
- package/dist/es/framer-motion/dist/es/context/LazyContext.mjs +6 -0
- package/dist/es/framer-motion/dist/es/context/MotionConfigContext.mjs +13 -0
- package/dist/es/framer-motion/dist/es/context/MotionContext/create.mjs +13 -0
- package/dist/es/framer-motion/dist/es/context/MotionContext/index.mjs +6 -0
- package/dist/es/framer-motion/dist/es/context/MotionContext/utils.mjs +17 -0
- package/dist/es/framer-motion/dist/es/context/PresenceContext.mjs +9 -0
- package/dist/es/framer-motion/dist/es/context/ReorderContext.mjs +6 -0
- package/dist/es/framer-motion/dist/es/context/SwitchLayoutGroupContext.mjs +9 -0
- package/dist/es/framer-motion/dist/es/easing/anticipate.mjs +5 -0
- package/dist/es/framer-motion/dist/es/easing/back.mjs +9 -0
- package/dist/es/framer-motion/dist/es/easing/circ.mjs +8 -0
- package/dist/es/framer-motion/dist/es/easing/cubic-bezier.mjs +51 -0
- package/dist/es/framer-motion/dist/es/easing/ease.mjs +7 -0
- package/dist/es/framer-motion/dist/es/easing/modifiers/mirror.mjs +5 -0
- package/dist/es/framer-motion/dist/es/easing/modifiers/reverse.mjs +5 -0
- package/dist/es/framer-motion/dist/es/easing/steps.mjs +15 -0
- package/dist/es/framer-motion/dist/es/easing/utils/create-generator-easing.mjs +17 -0
- package/dist/es/framer-motion/dist/es/easing/utils/get-easing-for-segment.mjs +8 -0
- package/dist/es/framer-motion/dist/es/easing/utils/is-bezier-definition.mjs +3 -0
- package/dist/es/framer-motion/dist/es/easing/utils/is-easing-array.mjs +5 -0
- package/dist/es/framer-motion/dist/es/easing/utils/map.mjs +38 -0
- package/dist/es/framer-motion/dist/es/events/add-dom-event.mjs +6 -0
- package/dist/es/framer-motion/dist/es/events/add-pointer-event.mjs +8 -0
- package/dist/es/framer-motion/dist/es/events/event-info.mjs +15 -0
- package/dist/es/framer-motion/dist/es/events/use-dom-event.mjs +34 -0
- package/dist/es/framer-motion/dist/es/events/utils/is-primary-pointer.mjs +18 -0
- package/dist/es/framer-motion/dist/es/frameloop/batcher.mjs +74 -0
- package/dist/es/framer-motion/dist/es/frameloop/frame.mjs +6 -0
- package/dist/es/framer-motion/dist/es/frameloop/index-legacy.mjs +20 -0
- package/dist/es/framer-motion/dist/es/frameloop/microtask.mjs +5 -0
- package/dist/es/framer-motion/dist/es/frameloop/render-step.mjs +80 -0
- package/dist/es/framer-motion/dist/es/frameloop/sync-time.mjs +31 -0
- package/dist/es/framer-motion/dist/es/gestures/drag/VisualElementDragControls.mjs +487 -0
- package/dist/es/framer-motion/dist/es/gestures/drag/index.mjs +27 -0
- package/dist/es/framer-motion/dist/es/gestures/drag/use-drag-controls.mjs +88 -0
- package/dist/es/framer-motion/dist/es/gestures/drag/utils/constraints.mjs +129 -0
- package/dist/es/framer-motion/dist/es/gestures/drag/utils/lock.mjs +53 -0
- package/dist/es/framer-motion/dist/es/gestures/focus.mjs +41 -0
- package/dist/es/framer-motion/dist/es/gestures/hover.mjs +33 -0
- package/dist/es/framer-motion/dist/es/gestures/pan/PanSession.mjs +156 -0
- package/dist/es/framer-motion/dist/es/gestures/pan/index.mjs +50 -0
- package/dist/es/framer-motion/dist/es/gestures/press.mjs +130 -0
- package/dist/es/framer-motion/dist/es/gestures/utils/is-node-or-child.mjs +20 -0
- package/dist/es/framer-motion/dist/es/motion/features/Feature.mjs +9 -0
- package/dist/es/framer-motion/dist/es/motion/features/animation/exit.mjs +31 -0
- package/dist/es/framer-motion/dist/es/motion/features/animation/index.mjs +41 -0
- package/dist/es/framer-motion/dist/es/motion/features/animations.mjs +13 -0
- package/dist/es/framer-motion/dist/es/motion/features/definitions.mjs +28 -0
- package/dist/es/framer-motion/dist/es/motion/features/drag.mjs +17 -0
- package/dist/es/framer-motion/dist/es/motion/features/gestures.mjs +21 -0
- package/dist/es/framer-motion/dist/es/motion/features/layout/MeasureLayout.mjs +134 -0
- package/dist/es/framer-motion/dist/es/motion/features/layout.mjs +11 -0
- package/dist/es/framer-motion/dist/es/motion/features/load-features.mjs +12 -0
- package/dist/es/framer-motion/dist/es/motion/features/viewport/index.mjs +72 -0
- package/dist/es/framer-motion/dist/es/motion/features/viewport/observers.mjs +49 -0
- package/dist/es/framer-motion/dist/es/motion/index.mjs +98 -0
- package/dist/es/framer-motion/dist/es/motion/utils/is-forced-motion-value.mjs +11 -0
- package/dist/es/framer-motion/dist/es/motion/utils/is-motion-component.mjs +12 -0
- package/dist/es/framer-motion/dist/es/motion/utils/symbol.mjs +3 -0
- package/dist/es/framer-motion/dist/es/motion/utils/unwrap-motion-component.mjs +17 -0
- package/dist/es/framer-motion/dist/es/motion/utils/use-motion-ref.mjs +36 -0
- package/dist/es/framer-motion/dist/es/motion/utils/use-visual-element.mjs +134 -0
- package/dist/es/framer-motion/dist/es/motion/utils/use-visual-state.mjs +82 -0
- package/dist/es/framer-motion/dist/es/motion/utils/valid-prop.mjs +57 -0
- package/dist/es/framer-motion/dist/es/projection/animation/mix-values.mjs +93 -0
- package/dist/es/framer-motion/dist/es/projection/geometry/conversion.mjs +33 -0
- package/dist/es/framer-motion/dist/es/projection/geometry/copy.mjs +31 -0
- package/dist/es/framer-motion/dist/es/projection/geometry/delta-apply.mjs +119 -0
- package/dist/es/framer-motion/dist/es/projection/geometry/delta-calc.mjs +52 -0
- package/dist/es/framer-motion/dist/es/projection/geometry/delta-remove.mjs +54 -0
- package/dist/es/framer-motion/dist/es/projection/geometry/models.mjs +17 -0
- package/dist/es/framer-motion/dist/es/projection/geometry/utils.mjs +31 -0
- package/dist/es/framer-motion/dist/es/projection/node/DocumentProjectionNode.mjs +13 -0
- package/dist/es/framer-motion/dist/es/projection/node/HTMLProjectionNode.mjs +27 -0
- package/dist/es/framer-motion/dist/es/projection/node/create-projection-node.mjs +1583 -0
- package/dist/es/framer-motion/dist/es/projection/node/group.mjs +24 -0
- package/dist/es/framer-motion/dist/es/projection/node/state.mjs +19 -0
- package/dist/es/framer-motion/dist/es/projection/shared/stack.mjs +112 -0
- package/dist/es/framer-motion/dist/es/projection/styles/scale-border-radius.mjs +41 -0
- package/dist/es/framer-motion/dist/es/projection/styles/scale-box-shadow.mjs +35 -0
- package/dist/es/framer-motion/dist/es/projection/styles/scale-correction.mjs +6 -0
- package/dist/es/framer-motion/dist/es/projection/styles/transform.mjs +49 -0
- package/dist/es/framer-motion/dist/es/projection/use-instant-layout-transition.mjs +14 -0
- package/dist/es/framer-motion/dist/es/projection/use-reset-projection.mjs +14 -0
- package/dist/es/framer-motion/dist/es/projection/utils/each-axis.mjs +5 -0
- package/dist/es/framer-motion/dist/es/projection/utils/has-transform.mjs +26 -0
- package/dist/es/framer-motion/dist/es/projection/utils/measure.mjs +17 -0
- package/dist/es/framer-motion/dist/es/render/VisualElement.mjs +477 -0
- package/dist/es/framer-motion/dist/es/render/components/create-factory.mjs +23 -0
- package/dist/es/framer-motion/dist/es/render/components/create-proxy.mjs +38 -0
- package/dist/es/framer-motion/dist/es/render/components/m/create.mjs +6 -0
- package/dist/es/framer-motion/dist/es/render/components/m/elements.mjs +227 -0
- package/dist/es/framer-motion/dist/es/render/components/m/proxy.mjs +6 -0
- package/dist/es/framer-motion/dist/es/render/components/motion/create.mjs +15 -0
- package/dist/es/framer-motion/dist/es/render/components/motion/elements.mjs +194 -0
- package/dist/es/framer-motion/dist/es/render/components/motion/proxy.mjs +6 -0
- package/dist/es/framer-motion/dist/es/render/dom/DOMKeyframesResolver.mjs +130 -0
- package/dist/es/framer-motion/dist/es/render/dom/DOMVisualElement.mjs +28 -0
- package/dist/es/framer-motion/dist/es/render/dom/create-visual-element.mjs +14 -0
- package/dist/es/framer-motion/dist/es/render/dom/features-animation.mjs +14 -0
- package/dist/es/framer-motion/dist/es/render/dom/features-max.mjs +14 -0
- package/dist/es/framer-motion/dist/es/render/dom/features-min.mjs +12 -0
- package/dist/es/framer-motion/dist/es/render/dom/resize/handle-element.mjs +64 -0
- package/dist/es/framer-motion/dist/es/render/dom/resize/handle-window.mjs +30 -0
- package/dist/es/framer-motion/dist/es/render/dom/resize/index.mjs +8 -0
- package/dist/es/framer-motion/dist/es/render/dom/scroll/index.mjs +80 -0
- package/dist/es/framer-motion/dist/es/render/dom/scroll/info.mjs +56 -0
- package/dist/es/framer-motion/dist/es/render/dom/scroll/observe.mjs +18 -0
- package/dist/es/framer-motion/dist/es/render/dom/scroll/offsets/edge.mjs +45 -0
- package/dist/es/framer-motion/dist/es/render/dom/scroll/offsets/index.mjs +59 -0
- package/dist/es/framer-motion/dist/es/render/dom/scroll/offsets/inset.mjs +45 -0
- package/dist/es/framer-motion/dist/es/render/dom/scroll/offsets/offset.mjs +35 -0
- package/dist/es/framer-motion/dist/es/render/dom/scroll/offsets/presets.mjs +20 -0
- package/dist/es/framer-motion/dist/es/render/dom/scroll/on-scroll-handler.mjs +48 -0
- package/dist/es/framer-motion/dist/es/render/dom/scroll/supports.mjs +5 -0
- package/dist/es/framer-motion/dist/es/render/dom/scroll/track.mjs +84 -0
- package/dist/es/framer-motion/dist/es/render/dom/use-render.mjs +33 -0
- package/dist/es/framer-motion/dist/es/render/dom/utils/camel-to-dash.mjs +6 -0
- package/dist/es/framer-motion/dist/es/render/dom/utils/css-variables-conversion.mjs +42 -0
- package/dist/es/framer-motion/dist/es/render/dom/utils/filter-props.mjs +59 -0
- package/dist/es/framer-motion/dist/es/render/dom/utils/is-css-variable.mjs +15 -0
- package/dist/es/framer-motion/dist/es/render/dom/utils/is-svg-component.mjs +30 -0
- package/dist/es/framer-motion/dist/es/render/dom/utils/is-svg-element.mjs +5 -0
- package/dist/es/framer-motion/dist/es/render/dom/utils/resolve-element.mjs +28 -0
- package/dist/es/framer-motion/dist/es/render/dom/utils/unit-conversion.mjs +65 -0
- package/dist/es/framer-motion/dist/es/render/dom/value-types/animatable-none.mjs +15 -0
- package/dist/es/framer-motion/dist/es/render/dom/value-types/defaults.mjs +30 -0
- package/dist/es/framer-motion/dist/es/render/dom/value-types/dimensions.mjs +15 -0
- package/dist/es/framer-motion/dist/es/render/dom/value-types/find.mjs +15 -0
- package/dist/es/framer-motion/dist/es/render/dom/value-types/get-as-type.mjs +10 -0
- package/dist/es/framer-motion/dist/es/render/dom/value-types/number-browser.mjs +41 -0
- package/dist/es/framer-motion/dist/es/render/dom/value-types/number.mjs +18 -0
- package/dist/es/framer-motion/dist/es/render/dom/value-types/test.mjs +6 -0
- package/dist/es/framer-motion/dist/es/render/dom/value-types/transform.mjs +31 -0
- package/dist/es/framer-motion/dist/es/render/dom/value-types/type-auto.mjs +9 -0
- package/dist/es/framer-motion/dist/es/render/dom/value-types/type-int.mjs +8 -0
- package/dist/es/framer-motion/dist/es/render/dom/viewport/index.mjs +43 -0
- package/dist/es/framer-motion/dist/es/render/html/HTMLVisualElement.mjs +57 -0
- package/dist/es/framer-motion/dist/es/render/html/config-motion.mjs +12 -0
- package/dist/es/framer-motion/dist/es/render/html/use-props.mjs +57 -0
- package/dist/es/framer-motion/dist/es/render/html/utils/build-styles.mjs +65 -0
- package/dist/es/framer-motion/dist/es/render/html/utils/build-transform.mjs +62 -0
- package/dist/es/framer-motion/dist/es/render/html/utils/create-render-state.mjs +8 -0
- package/dist/es/framer-motion/dist/es/render/html/utils/make-none-animatable.mjs +30 -0
- package/dist/es/framer-motion/dist/es/render/html/utils/render.mjs +9 -0
- package/dist/es/framer-motion/dist/es/render/html/utils/scrape-motion-values.mjs +20 -0
- package/dist/es/framer-motion/dist/es/render/html/utils/transform.mjs +28 -0
- package/dist/es/framer-motion/dist/es/render/object/ObjectVisualElement.mjs +41 -0
- package/dist/es/framer-motion/dist/es/render/store.mjs +3 -0
- package/dist/es/framer-motion/dist/es/render/svg/SVGVisualElement.mjs +45 -0
- package/dist/es/framer-motion/dist/es/render/svg/config-motion.mjs +40 -0
- package/dist/es/framer-motion/dist/es/render/svg/lowercase-elements.mjs +33 -0
- package/dist/es/framer-motion/dist/es/render/svg/use-props.mjs +24 -0
- package/dist/es/framer-motion/dist/es/render/svg/utils/build-attrs.mjs +52 -0
- package/dist/es/framer-motion/dist/es/render/svg/utils/camel-case-attrs.mjs +30 -0
- package/dist/es/framer-motion/dist/es/render/svg/utils/create-render-state.mjs +8 -0
- package/dist/es/framer-motion/dist/es/render/svg/utils/is-svg-tag.mjs +3 -0
- package/dist/es/framer-motion/dist/es/render/svg/utils/path.mjs +32 -0
- package/dist/es/framer-motion/dist/es/render/svg/utils/render.mjs +12 -0
- package/dist/es/framer-motion/dist/es/render/svg/utils/scrape-motion-values.mjs +19 -0
- package/dist/es/framer-motion/dist/es/render/svg/utils/transform-origin.mjs +18 -0
- package/dist/es/framer-motion/dist/es/render/utils/KeyframesResolver.mjs +164 -0
- package/dist/es/framer-motion/dist/es/render/utils/animation-state.mjs +332 -0
- package/dist/es/framer-motion/dist/es/render/utils/compare-by-depth.mjs +3 -0
- package/dist/es/framer-motion/dist/es/render/utils/flat-tree.mjs +24 -0
- package/dist/es/framer-motion/dist/es/render/utils/get-variant-context.mjs +28 -0
- package/dist/es/framer-motion/dist/es/render/utils/is-controlling-variants.mjs +13 -0
- package/dist/es/framer-motion/dist/es/render/utils/is-variant-label.mjs +8 -0
- package/dist/es/framer-motion/dist/es/render/utils/motion-values.mjs +59 -0
- package/dist/es/framer-motion/dist/es/render/utils/resolve-dynamic-variants.mjs +8 -0
- package/dist/es/framer-motion/dist/es/render/utils/resolve-variants.mjs +36 -0
- package/dist/es/framer-motion/dist/es/render/utils/setters.mjs +27 -0
- package/dist/es/framer-motion/dist/es/render/utils/variant-props.mjs +12 -0
- package/dist/es/framer-motion/dist/es/utils/GlobalConfig.mjs +6 -0
- package/dist/es/framer-motion/dist/es/utils/array.mjs +21 -0
- package/dist/es/framer-motion/dist/es/utils/clamp.mjs +9 -0
- package/dist/es/framer-motion/dist/es/utils/delay.mjs +24 -0
- package/dist/es/framer-motion/dist/es/utils/distance.mjs +9 -0
- package/dist/es/framer-motion/dist/es/utils/errors.mjs +18 -0
- package/dist/es/framer-motion/dist/es/utils/get-context-window.mjs +6 -0
- package/dist/es/framer-motion/dist/es/utils/hsla-to-rgba.mjs +42 -0
- package/dist/es/framer-motion/dist/es/utils/interpolate.mjs +75 -0
- package/dist/es/framer-motion/dist/es/utils/is-browser.mjs +3 -0
- package/dist/es/framer-motion/dist/es/utils/is-numerical-string.mjs +6 -0
- package/dist/es/framer-motion/dist/es/utils/is-ref-object.mjs +7 -0
- package/dist/es/framer-motion/dist/es/utils/is-zero-value-string.mjs +6 -0
- package/dist/es/framer-motion/dist/es/utils/memo.mjs +10 -0
- package/dist/es/framer-motion/dist/es/utils/mix/color.mjs +47 -0
- package/dist/es/framer-motion/dist/es/utils/mix/complex.mjs +94 -0
- package/dist/es/framer-motion/dist/es/utils/mix/immediate.mjs +5 -0
- package/dist/es/framer-motion/dist/es/utils/mix/index.mjs +14 -0
- package/dist/es/framer-motion/dist/es/utils/mix/number.mjs +26 -0
- package/dist/es/framer-motion/dist/es/utils/mix/visibility.mjs +16 -0
- package/dist/es/framer-motion/dist/es/utils/noop.mjs +3 -0
- package/dist/es/framer-motion/dist/es/utils/offsets/default.mjs +9 -0
- package/dist/es/framer-motion/dist/es/utils/offsets/fill.mjs +12 -0
- package/dist/es/framer-motion/dist/es/utils/offsets/time.mjs +5 -0
- package/dist/es/framer-motion/dist/es/utils/pipe.mjs +11 -0
- package/dist/es/framer-motion/dist/es/utils/progress.mjs +18 -0
- package/dist/es/framer-motion/dist/es/utils/reduced-motion/index.mjs +19 -0
- package/dist/es/framer-motion/dist/es/utils/reduced-motion/state.mjs +5 -0
- package/dist/es/framer-motion/dist/es/utils/reduced-motion/use-reduced-motion-config.mjs +19 -0
- package/dist/es/framer-motion/dist/es/utils/reduced-motion/use-reduced-motion.mjs +47 -0
- package/dist/es/framer-motion/dist/es/utils/resolve-value.mjs +11 -0
- package/dist/es/framer-motion/dist/es/utils/shallow-compare.mjs +14 -0
- package/dist/es/framer-motion/dist/es/utils/subscription-manager.mjs +40 -0
- package/dist/es/framer-motion/dist/es/utils/time-conversion.mjs +10 -0
- package/dist/es/framer-motion/dist/es/utils/transform.mjs +21 -0
- package/dist/es/framer-motion/dist/es/utils/use-animation-frame.mjs +21 -0
- package/dist/es/framer-motion/dist/es/utils/use-constant.mjs +18 -0
- package/dist/es/framer-motion/dist/es/utils/use-cycle.mjs +47 -0
- package/dist/es/framer-motion/dist/es/utils/use-force-update.mjs +19 -0
- package/dist/es/framer-motion/dist/es/utils/use-in-view.mjs +23 -0
- package/dist/es/framer-motion/dist/es/utils/use-instant-transition-state.mjs +5 -0
- package/dist/es/framer-motion/dist/es/utils/use-instant-transition.mjs +41 -0
- package/dist/es/framer-motion/dist/es/utils/use-is-mounted.mjs +15 -0
- package/dist/es/framer-motion/dist/es/utils/use-isomorphic-effect.mjs +6 -0
- package/dist/es/framer-motion/dist/es/utils/use-motion-value-event.mjs +13 -0
- package/dist/es/framer-motion/dist/es/utils/use-unmount-effect.mjs +7 -0
- package/dist/es/framer-motion/dist/es/utils/velocity-per-second.mjs +11 -0
- package/dist/es/framer-motion/dist/es/utils/warn-once.mjs +11 -0
- package/dist/es/framer-motion/dist/es/utils/wrap.mjs +6 -0
- package/dist/es/framer-motion/dist/es/value/index.mjs +319 -0
- package/dist/es/framer-motion/dist/es/value/scroll/use-element-scroll.mjs +14 -0
- package/dist/es/framer-motion/dist/es/value/scroll/use-viewport-scroll.mjs +14 -0
- package/dist/es/framer-motion/dist/es/value/types/color/hex.mjs +40 -0
- package/dist/es/framer-motion/dist/es/value/types/color/hsla.mjs +22 -0
- package/dist/es/framer-motion/dist/es/value/types/color/index.mjs +27 -0
- package/dist/es/framer-motion/dist/es/value/types/color/rgba.mjs +25 -0
- package/dist/es/framer-motion/dist/es/value/types/color/utils.mjs +29 -0
- package/dist/es/framer-motion/dist/es/value/types/complex/filter.mjs +30 -0
- package/dist/es/framer-motion/dist/es/value/types/complex/index.mjs +92 -0
- package/dist/es/framer-motion/dist/es/value/types/numbers/index.mjs +17 -0
- package/dist/es/framer-motion/dist/es/value/types/numbers/units.mjs +17 -0
- package/dist/es/framer-motion/dist/es/value/types/utils/color-regex.mjs +3 -0
- package/dist/es/framer-motion/dist/es/value/types/utils/float-regex.mjs +3 -0
- package/dist/es/framer-motion/dist/es/value/types/utils/is-nullish.mjs +5 -0
- package/dist/es/framer-motion/dist/es/value/types/utils/sanitize.mjs +5 -0
- package/dist/es/framer-motion/dist/es/value/types/utils/single-color-regex.mjs +3 -0
- package/dist/es/framer-motion/dist/es/value/use-combine-values.mjs +37 -0
- package/dist/es/framer-motion/dist/es/value/use-computed.mjs +19 -0
- package/dist/es/framer-motion/dist/es/value/use-inverted-scale.mjs +52 -0
- package/dist/es/framer-motion/dist/es/value/use-motion-template.mjs +45 -0
- package/dist/es/framer-motion/dist/es/value/use-motion-value.mjs +38 -0
- package/dist/es/framer-motion/dist/es/value/use-scroll.mjs +39 -0
- package/dist/es/framer-motion/dist/es/value/use-spring.mjs +85 -0
- package/dist/es/framer-motion/dist/es/value/use-time.mjs +10 -0
- package/dist/es/framer-motion/dist/es/value/use-transform.mjs +29 -0
- package/dist/es/framer-motion/dist/es/value/use-velocity.mjs +35 -0
- package/dist/es/framer-motion/dist/es/value/use-will-change/WillChangeMotionValue.mjs +22 -0
- package/dist/es/framer-motion/dist/es/value/use-will-change/add-will-change.mjs +14 -0
- package/dist/es/framer-motion/dist/es/value/use-will-change/get-will-change-name.mjs +14 -0
- package/dist/es/framer-motion/dist/es/value/use-will-change/index.mjs +8 -0
- package/dist/es/framer-motion/dist/es/value/use-will-change/is.mjs +7 -0
- package/dist/es/framer-motion/dist/es/value/utils/is-motion-value.mjs +3 -0
- package/dist/es/framer-motion/dist/es/value/utils/resolve-motion-value.mjs +16 -0
- package/dist/es/motion/lib/index.mjs +30 -0
- package/dist/es/motion/lib/react-client.mjs +3 -0
- package/dist/es/motion/lib/react-m.mjs +3 -0
- package/dist/es/motion/lib/react.mjs +110 -0
- package/dist/index.d.ts +1 -0
- package/dist/motion.dev.js +6121 -0
- package/dist/motion.js +1 -0
- package/dist/react-client.d.ts +1 -0
- package/dist/react-m.d.ts +1 -0
- package/dist/react.d.ts +1 -0
- package/lib/index.js +1 -3
- package/lib/index.js.map +1 -1
- package/lib/react-client.js +3 -0
- package/lib/react-client.js.map +1 -0
- package/lib/react-m.js +3 -0
- package/lib/react-m.js.map +1 -0
- package/lib/react.js +3 -0
- package/lib/react.js.map +1 -0
- package/package.json +79 -29
- package/react/package.json +6 -0
- package/react-client/package.json +6 -0
- package/react-m/package.json +6 -0
- package/rollup.config.mjs +184 -0
- package/src/index.ts +1 -0
- package/src/react-client.ts +3 -0
- package/src/react-m.ts +3 -0
- package/src/react.ts +3 -0
- package/tsconfig.json +25 -0
- package/types/index.d.ts +1 -4
- package/types/react-client.d.ts +1 -0
- package/types/react-m.d.ts +1 -0
- package/types/react.d.ts +1 -0
- package/CHANGELOG.md +0 -378
- package/dist/animate.cjs.js +0 -22
- package/dist/animate.es.js +0 -19
- package/dist/main.cjs.js +0 -21
- package/dist/main.es.js +0 -3
- package/dist/motion.min.js +0 -1
- package/dist/motion.umd.js +0 -2364
- package/dist/size-index.js +0 -1
- package/lib/animate.js +0 -17
- package/lib/animate.js.map +0 -1
- package/types/animate.d.ts +0 -6
- package/types/animate.d.ts.map +0 -1
- 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,113 @@
|
|
|
1
|
+
import { time } from '../../frameloop/sync-time.mjs';
|
|
2
|
+
import { flushKeyframeResolvers } from '../../render/utils/KeyframesResolver.mjs';
|
|
3
|
+
import { instantAnimationState } from '../../utils/use-instant-transition-state.mjs';
|
|
4
|
+
import { canAnimate } from './utils/can-animate.mjs';
|
|
5
|
+
import { getFinalKeyframe } from './waapi/utils/get-final-keyframe.mjs';
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* Maximum time allowed between an animation being created and it being
|
|
9
|
+
* resolved for us to use the latter as the start time.
|
|
10
|
+
*
|
|
11
|
+
* This is to ensure that while we prefer to "start" an animation as soon
|
|
12
|
+
* as it's triggered, we also want to avoid a visual jump if there's a big delay
|
|
13
|
+
* between these two moments.
|
|
14
|
+
*/
|
|
15
|
+
const MAX_RESOLVE_DELAY = 40;
|
|
16
|
+
class BaseAnimation {
|
|
17
|
+
constructor({ autoplay = true, delay = 0, type = "keyframes", repeat = 0, repeatDelay = 0, repeatType = "loop", ...options }) {
|
|
18
|
+
// Track whether the animation has been stopped. Stopped animations won't restart.
|
|
19
|
+
this.isStopped = false;
|
|
20
|
+
this.hasAttemptedResolve = false;
|
|
21
|
+
this.createdAt = time.now();
|
|
22
|
+
this.options = {
|
|
23
|
+
autoplay,
|
|
24
|
+
delay,
|
|
25
|
+
type,
|
|
26
|
+
repeat,
|
|
27
|
+
repeatDelay,
|
|
28
|
+
repeatType,
|
|
29
|
+
...options,
|
|
30
|
+
};
|
|
31
|
+
this.updateFinishedPromise();
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* This method uses the createdAt and resolvedAt to calculate the
|
|
35
|
+
* animation startTime. *Ideally*, we would use the createdAt time as t=0
|
|
36
|
+
* as the following frame would then be the first frame of the animation in
|
|
37
|
+
* progress, which would feel snappier.
|
|
38
|
+
*
|
|
39
|
+
* However, if there's a delay (main thread work) between the creation of
|
|
40
|
+
* the animation and the first commited frame, we prefer to use resolvedAt
|
|
41
|
+
* to avoid a sudden jump into the animation.
|
|
42
|
+
*/
|
|
43
|
+
calcStartTime() {
|
|
44
|
+
if (!this.resolvedAt)
|
|
45
|
+
return this.createdAt;
|
|
46
|
+
return this.resolvedAt - this.createdAt > MAX_RESOLVE_DELAY
|
|
47
|
+
? this.resolvedAt
|
|
48
|
+
: this.createdAt;
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* A getter for resolved data. If keyframes are not yet resolved, accessing
|
|
52
|
+
* this.resolved will synchronously flush all pending keyframe resolvers.
|
|
53
|
+
* This is a deoptimisation, but at its worst still batches read/writes.
|
|
54
|
+
*/
|
|
55
|
+
get resolved() {
|
|
56
|
+
if (!this._resolved && !this.hasAttemptedResolve) {
|
|
57
|
+
flushKeyframeResolvers();
|
|
58
|
+
}
|
|
59
|
+
return this._resolved;
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* A method to be called when the keyframes resolver completes. This method
|
|
63
|
+
* will check if its possible to run the animation and, if not, skip it.
|
|
64
|
+
* Otherwise, it will call initPlayback on the implementing class.
|
|
65
|
+
*/
|
|
66
|
+
onKeyframesResolved(keyframes, finalKeyframe) {
|
|
67
|
+
this.resolvedAt = time.now();
|
|
68
|
+
this.hasAttemptedResolve = true;
|
|
69
|
+
const { name, type, velocity, delay, onComplete, onUpdate, isGenerator, } = this.options;
|
|
70
|
+
/**
|
|
71
|
+
* If we can't animate this value with the resolved keyframes
|
|
72
|
+
* then we should complete it immediately.
|
|
73
|
+
*/
|
|
74
|
+
if (!isGenerator && !canAnimate(keyframes, name, type, velocity)) {
|
|
75
|
+
// Finish immediately
|
|
76
|
+
if (instantAnimationState.current || !delay) {
|
|
77
|
+
onUpdate === null || onUpdate === void 0 ? void 0 : onUpdate(getFinalKeyframe(keyframes, this.options, finalKeyframe));
|
|
78
|
+
onComplete === null || onComplete === void 0 ? void 0 : onComplete();
|
|
79
|
+
this.resolveFinishedPromise();
|
|
80
|
+
return;
|
|
81
|
+
}
|
|
82
|
+
// Finish after a delay
|
|
83
|
+
else {
|
|
84
|
+
this.options.duration = 0;
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
const resolvedAnimation = this.initPlayback(keyframes, finalKeyframe);
|
|
88
|
+
if (resolvedAnimation === false)
|
|
89
|
+
return;
|
|
90
|
+
this._resolved = {
|
|
91
|
+
keyframes,
|
|
92
|
+
finalKeyframe,
|
|
93
|
+
...resolvedAnimation,
|
|
94
|
+
};
|
|
95
|
+
this.onPostResolved();
|
|
96
|
+
}
|
|
97
|
+
onPostResolved() { }
|
|
98
|
+
/**
|
|
99
|
+
* Allows the returned animation to be awaited or promise-chained. Currently
|
|
100
|
+
* resolves when the animation finishes at all but in a future update could/should
|
|
101
|
+
* reject if its cancels.
|
|
102
|
+
*/
|
|
103
|
+
then(resolve, reject) {
|
|
104
|
+
return this.currentFinishedPromise.then(resolve, reject);
|
|
105
|
+
}
|
|
106
|
+
updateFinishedPromise() {
|
|
107
|
+
this.currentFinishedPromise = new Promise((resolve) => {
|
|
108
|
+
this.resolveFinishedPromise = resolve;
|
|
109
|
+
});
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
export { BaseAnimation };
|