motion 10.17.1 → 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.
- package/.turbo/turbo-build.log +29 -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 +112 -0
- package/dist/es/framer-motion/dist/es/animation/animators/MainThreadAnimation.mjs +380 -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/interfaces/motion-value.mjs +105 -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/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/use-presence.mjs +40 -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/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/utils/is-primary-pointer.mjs +18 -0
- package/dist/es/framer-motion/dist/es/frameloop/batcher.mjs +71 -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/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/symbol.mjs +3 -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/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/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/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/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/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/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 +11 -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/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-constant.mjs +18 -0
- package/dist/es/framer-motion/dist/es/utils/use-isomorphic-effect.mjs +6 -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 +313 -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-will-change/add-will-change.mjs +14 -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/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/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 +174 -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 -372
- 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 -2359
- 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,64 @@
|
|
|
1
|
+
import { resolveElements } from '../utils/resolve-element.mjs';
|
|
2
|
+
|
|
3
|
+
const resizeHandlers = new WeakMap();
|
|
4
|
+
let observer;
|
|
5
|
+
function getElementSize(target, borderBoxSize) {
|
|
6
|
+
if (borderBoxSize) {
|
|
7
|
+
const { inlineSize, blockSize } = borderBoxSize[0];
|
|
8
|
+
return { width: inlineSize, height: blockSize };
|
|
9
|
+
}
|
|
10
|
+
else if (target instanceof SVGElement && "getBBox" in target) {
|
|
11
|
+
return target.getBBox();
|
|
12
|
+
}
|
|
13
|
+
else {
|
|
14
|
+
return {
|
|
15
|
+
width: target.offsetWidth,
|
|
16
|
+
height: target.offsetHeight,
|
|
17
|
+
};
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
function notifyTarget({ target, contentRect, borderBoxSize, }) {
|
|
21
|
+
var _a;
|
|
22
|
+
(_a = resizeHandlers.get(target)) === null || _a === void 0 ? void 0 : _a.forEach((handler) => {
|
|
23
|
+
handler({
|
|
24
|
+
target,
|
|
25
|
+
contentSize: contentRect,
|
|
26
|
+
get size() {
|
|
27
|
+
return getElementSize(target, borderBoxSize);
|
|
28
|
+
},
|
|
29
|
+
});
|
|
30
|
+
});
|
|
31
|
+
}
|
|
32
|
+
function notifyAll(entries) {
|
|
33
|
+
entries.forEach(notifyTarget);
|
|
34
|
+
}
|
|
35
|
+
function createResizeObserver() {
|
|
36
|
+
if (typeof ResizeObserver === "undefined")
|
|
37
|
+
return;
|
|
38
|
+
observer = new ResizeObserver(notifyAll);
|
|
39
|
+
}
|
|
40
|
+
function resizeElement(target, handler) {
|
|
41
|
+
if (!observer)
|
|
42
|
+
createResizeObserver();
|
|
43
|
+
const elements = resolveElements(target);
|
|
44
|
+
elements.forEach((element) => {
|
|
45
|
+
let elementHandlers = resizeHandlers.get(element);
|
|
46
|
+
if (!elementHandlers) {
|
|
47
|
+
elementHandlers = new Set();
|
|
48
|
+
resizeHandlers.set(element, elementHandlers);
|
|
49
|
+
}
|
|
50
|
+
elementHandlers.add(handler);
|
|
51
|
+
observer === null || observer === void 0 ? void 0 : observer.observe(element);
|
|
52
|
+
});
|
|
53
|
+
return () => {
|
|
54
|
+
elements.forEach((element) => {
|
|
55
|
+
const elementHandlers = resizeHandlers.get(element);
|
|
56
|
+
elementHandlers === null || elementHandlers === void 0 ? void 0 : elementHandlers.delete(handler);
|
|
57
|
+
if (!(elementHandlers === null || elementHandlers === void 0 ? void 0 : elementHandlers.size)) {
|
|
58
|
+
observer === null || observer === void 0 ? void 0 : observer.unobserve(element);
|
|
59
|
+
}
|
|
60
|
+
});
|
|
61
|
+
};
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
export { resizeElement };
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
const windowCallbacks = new Set();
|
|
2
|
+
let windowResizeHandler;
|
|
3
|
+
function createWindowResizeHandler() {
|
|
4
|
+
windowResizeHandler = () => {
|
|
5
|
+
const size = {
|
|
6
|
+
width: window.innerWidth,
|
|
7
|
+
height: window.innerHeight,
|
|
8
|
+
};
|
|
9
|
+
const info = {
|
|
10
|
+
target: window,
|
|
11
|
+
size,
|
|
12
|
+
contentSize: size,
|
|
13
|
+
};
|
|
14
|
+
windowCallbacks.forEach((callback) => callback(info));
|
|
15
|
+
};
|
|
16
|
+
window.addEventListener("resize", windowResizeHandler);
|
|
17
|
+
}
|
|
18
|
+
function resizeWindow(callback) {
|
|
19
|
+
windowCallbacks.add(callback);
|
|
20
|
+
if (!windowResizeHandler)
|
|
21
|
+
createWindowResizeHandler();
|
|
22
|
+
return () => {
|
|
23
|
+
windowCallbacks.delete(callback);
|
|
24
|
+
if (!windowCallbacks.size && windowResizeHandler) {
|
|
25
|
+
windowResizeHandler = undefined;
|
|
26
|
+
}
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
export { resizeWindow };
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
import { scrollInfo } from './track.mjs';
|
|
2
|
+
import { observeTimeline } from './observe.mjs';
|
|
3
|
+
import { supportsScrollTimeline } from './supports.mjs';
|
|
4
|
+
|
|
5
|
+
function scrollTimelineFallback({ source, container, axis = "y", }) {
|
|
6
|
+
// Support legacy source argument. Deprecate later.
|
|
7
|
+
if (source)
|
|
8
|
+
container = source;
|
|
9
|
+
// ScrollTimeline records progress as a percentage CSSUnitValue
|
|
10
|
+
const currentTime = { value: 0 };
|
|
11
|
+
const cancel = scrollInfo((info) => {
|
|
12
|
+
currentTime.value = info[axis].progress * 100;
|
|
13
|
+
}, { container, axis });
|
|
14
|
+
return { currentTime, cancel };
|
|
15
|
+
}
|
|
16
|
+
const timelineCache = new Map();
|
|
17
|
+
function getTimeline({ source, container = document.documentElement, axis = "y", } = {}) {
|
|
18
|
+
// Support legacy source argument. Deprecate later.
|
|
19
|
+
if (source)
|
|
20
|
+
container = source;
|
|
21
|
+
if (!timelineCache.has(container)) {
|
|
22
|
+
timelineCache.set(container, {});
|
|
23
|
+
}
|
|
24
|
+
const elementCache = timelineCache.get(container);
|
|
25
|
+
if (!elementCache[axis]) {
|
|
26
|
+
elementCache[axis] = supportsScrollTimeline()
|
|
27
|
+
? new ScrollTimeline({ source: container, axis })
|
|
28
|
+
: scrollTimelineFallback({ source: container, axis });
|
|
29
|
+
}
|
|
30
|
+
return elementCache[axis];
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* If the onScroll function has two arguments, it's expecting
|
|
34
|
+
* more specific information about the scroll from scrollInfo.
|
|
35
|
+
*/
|
|
36
|
+
function isOnScrollWithInfo(onScroll) {
|
|
37
|
+
return onScroll.length === 2;
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Currently, we only support element tracking with `scrollInfo`, though in
|
|
41
|
+
* the future we can also offer ViewTimeline support.
|
|
42
|
+
*/
|
|
43
|
+
function needsElementTracking(options) {
|
|
44
|
+
return options && (options.target || options.offset);
|
|
45
|
+
}
|
|
46
|
+
function scrollFunction(onScroll, options) {
|
|
47
|
+
if (isOnScrollWithInfo(onScroll) || needsElementTracking(options)) {
|
|
48
|
+
return scrollInfo((info) => {
|
|
49
|
+
onScroll(info[options.axis].progress, info);
|
|
50
|
+
}, options);
|
|
51
|
+
}
|
|
52
|
+
else {
|
|
53
|
+
return observeTimeline(onScroll, getTimeline(options));
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
function scrollAnimation(animation, options) {
|
|
57
|
+
if (needsElementTracking(options)) {
|
|
58
|
+
animation.pause();
|
|
59
|
+
return scrollInfo((info) => {
|
|
60
|
+
animation.time = animation.duration * info[options.axis].progress;
|
|
61
|
+
}, options);
|
|
62
|
+
}
|
|
63
|
+
else {
|
|
64
|
+
const timeline = getTimeline(options);
|
|
65
|
+
return animation.attachTimeline(timeline, (valueAnimation) => {
|
|
66
|
+
valueAnimation.pause();
|
|
67
|
+
return observeTimeline((progress) => {
|
|
68
|
+
valueAnimation.time = valueAnimation.duration * progress;
|
|
69
|
+
}, timeline);
|
|
70
|
+
});
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
function scroll(onScroll, { axis = "y", ...options } = {}) {
|
|
74
|
+
const optionsWithDefaults = { axis, ...options };
|
|
75
|
+
return typeof onScroll === "function"
|
|
76
|
+
? scrollFunction(onScroll, optionsWithDefaults)
|
|
77
|
+
: scrollAnimation(onScroll, optionsWithDefaults);
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
export { scroll };
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import { progress } from '../../../utils/progress.mjs';
|
|
2
|
+
import { velocityPerSecond } from '../../../utils/velocity-per-second.mjs';
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* A time in milliseconds, beyond which we consider the scroll velocity to be 0.
|
|
6
|
+
*/
|
|
7
|
+
const maxElapsed = 50;
|
|
8
|
+
const createAxisInfo = () => ({
|
|
9
|
+
current: 0,
|
|
10
|
+
offset: [],
|
|
11
|
+
progress: 0,
|
|
12
|
+
scrollLength: 0,
|
|
13
|
+
targetOffset: 0,
|
|
14
|
+
targetLength: 0,
|
|
15
|
+
containerLength: 0,
|
|
16
|
+
velocity: 0,
|
|
17
|
+
});
|
|
18
|
+
const createScrollInfo = () => ({
|
|
19
|
+
time: 0,
|
|
20
|
+
x: createAxisInfo(),
|
|
21
|
+
y: createAxisInfo(),
|
|
22
|
+
});
|
|
23
|
+
const keys = {
|
|
24
|
+
x: {
|
|
25
|
+
length: "Width",
|
|
26
|
+
position: "Left",
|
|
27
|
+
},
|
|
28
|
+
y: {
|
|
29
|
+
length: "Height",
|
|
30
|
+
position: "Top",
|
|
31
|
+
},
|
|
32
|
+
};
|
|
33
|
+
function updateAxisInfo(element, axisName, info, time) {
|
|
34
|
+
const axis = info[axisName];
|
|
35
|
+
const { length, position } = keys[axisName];
|
|
36
|
+
const prev = axis.current;
|
|
37
|
+
const prevTime = info.time;
|
|
38
|
+
axis.current = element[`scroll${position}`];
|
|
39
|
+
axis.scrollLength = element[`scroll${length}`] - element[`client${length}`];
|
|
40
|
+
axis.offset.length = 0;
|
|
41
|
+
axis.offset[0] = 0;
|
|
42
|
+
axis.offset[1] = axis.scrollLength;
|
|
43
|
+
axis.progress = progress(0, axis.scrollLength, axis.current);
|
|
44
|
+
const elapsed = time - prevTime;
|
|
45
|
+
axis.velocity =
|
|
46
|
+
elapsed > maxElapsed
|
|
47
|
+
? 0
|
|
48
|
+
: velocityPerSecond(axis.current - prev, elapsed);
|
|
49
|
+
}
|
|
50
|
+
function updateScrollInfo(element, info, time) {
|
|
51
|
+
updateAxisInfo(element, "x", info, time);
|
|
52
|
+
updateAxisInfo(element, "y", info, time);
|
|
53
|
+
info.time = time;
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
export { createScrollInfo, updateScrollInfo };
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { frame, cancelFrame } from '../../../frameloop/frame.mjs';
|
|
2
|
+
|
|
3
|
+
function observeTimeline(update, timeline) {
|
|
4
|
+
let prevProgress;
|
|
5
|
+
const onFrame = () => {
|
|
6
|
+
const { currentTime } = timeline;
|
|
7
|
+
const percentage = currentTime === null ? 0 : currentTime.value;
|
|
8
|
+
const progress = percentage / 100;
|
|
9
|
+
if (prevProgress !== progress) {
|
|
10
|
+
update(progress);
|
|
11
|
+
}
|
|
12
|
+
prevProgress = progress;
|
|
13
|
+
};
|
|
14
|
+
frame.update(onFrame, true);
|
|
15
|
+
return () => cancelFrame(onFrame);
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
export { observeTimeline };
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
const namedEdges = {
|
|
2
|
+
start: 0,
|
|
3
|
+
center: 0.5,
|
|
4
|
+
end: 1,
|
|
5
|
+
};
|
|
6
|
+
function resolveEdge(edge, length, inset = 0) {
|
|
7
|
+
let delta = 0;
|
|
8
|
+
/**
|
|
9
|
+
* If we have this edge defined as a preset, replace the definition
|
|
10
|
+
* with the numerical value.
|
|
11
|
+
*/
|
|
12
|
+
if (edge in namedEdges) {
|
|
13
|
+
edge = namedEdges[edge];
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Handle unit values
|
|
17
|
+
*/
|
|
18
|
+
if (typeof edge === "string") {
|
|
19
|
+
const asNumber = parseFloat(edge);
|
|
20
|
+
if (edge.endsWith("px")) {
|
|
21
|
+
delta = asNumber;
|
|
22
|
+
}
|
|
23
|
+
else if (edge.endsWith("%")) {
|
|
24
|
+
edge = asNumber / 100;
|
|
25
|
+
}
|
|
26
|
+
else if (edge.endsWith("vw")) {
|
|
27
|
+
delta = (asNumber / 100) * document.documentElement.clientWidth;
|
|
28
|
+
}
|
|
29
|
+
else if (edge.endsWith("vh")) {
|
|
30
|
+
delta = (asNumber / 100) * document.documentElement.clientHeight;
|
|
31
|
+
}
|
|
32
|
+
else {
|
|
33
|
+
edge = asNumber;
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* If the edge is defined as a number, handle as a progress value.
|
|
38
|
+
*/
|
|
39
|
+
if (typeof edge === "number") {
|
|
40
|
+
delta = length * edge;
|
|
41
|
+
}
|
|
42
|
+
return inset + delta;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
export { namedEdges, resolveEdge };
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import { calcInset } from './inset.mjs';
|
|
2
|
+
import { ScrollOffset } from './presets.mjs';
|
|
3
|
+
import { resolveOffset } from './offset.mjs';
|
|
4
|
+
import { interpolate } from '../../../../utils/interpolate.mjs';
|
|
5
|
+
import { defaultOffset } from '../../../../utils/offsets/default.mjs';
|
|
6
|
+
|
|
7
|
+
const point = { x: 0, y: 0 };
|
|
8
|
+
function getTargetSize(target) {
|
|
9
|
+
return "getBBox" in target && target.tagName !== "svg"
|
|
10
|
+
? target.getBBox()
|
|
11
|
+
: { width: target.clientWidth, height: target.clientHeight };
|
|
12
|
+
}
|
|
13
|
+
function resolveOffsets(container, info, options) {
|
|
14
|
+
const { offset: offsetDefinition = ScrollOffset.All } = options;
|
|
15
|
+
const { target = container, axis = "y" } = options;
|
|
16
|
+
const lengthLabel = axis === "y" ? "height" : "width";
|
|
17
|
+
const inset = target !== container ? calcInset(target, container) : point;
|
|
18
|
+
/**
|
|
19
|
+
* Measure the target and container. If they're the same thing then we
|
|
20
|
+
* use the container's scrollWidth/Height as the target, from there
|
|
21
|
+
* all other calculations can remain the same.
|
|
22
|
+
*/
|
|
23
|
+
const targetSize = target === container
|
|
24
|
+
? { width: container.scrollWidth, height: container.scrollHeight }
|
|
25
|
+
: getTargetSize(target);
|
|
26
|
+
const containerSize = {
|
|
27
|
+
width: container.clientWidth,
|
|
28
|
+
height: container.clientHeight,
|
|
29
|
+
};
|
|
30
|
+
/**
|
|
31
|
+
* Reset the length of the resolved offset array rather than creating a new one.
|
|
32
|
+
* TODO: More reusable data structures for targetSize/containerSize would also be good.
|
|
33
|
+
*/
|
|
34
|
+
info[axis].offset.length = 0;
|
|
35
|
+
/**
|
|
36
|
+
* Populate the offset array by resolving the user's offset definition into
|
|
37
|
+
* a list of pixel scroll offets.
|
|
38
|
+
*/
|
|
39
|
+
let hasChanged = !info[axis].interpolate;
|
|
40
|
+
const numOffsets = offsetDefinition.length;
|
|
41
|
+
for (let i = 0; i < numOffsets; i++) {
|
|
42
|
+
const offset = resolveOffset(offsetDefinition[i], containerSize[lengthLabel], targetSize[lengthLabel], inset[axis]);
|
|
43
|
+
if (!hasChanged && offset !== info[axis].interpolatorOffsets[i]) {
|
|
44
|
+
hasChanged = true;
|
|
45
|
+
}
|
|
46
|
+
info[axis].offset[i] = offset;
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* If the pixel scroll offsets have changed, create a new interpolator function
|
|
50
|
+
* to map scroll value into a progress.
|
|
51
|
+
*/
|
|
52
|
+
if (hasChanged) {
|
|
53
|
+
info[axis].interpolate = interpolate(info[axis].offset, defaultOffset(offsetDefinition));
|
|
54
|
+
info[axis].interpolatorOffsets = [...info[axis].offset];
|
|
55
|
+
}
|
|
56
|
+
info[axis].progress = info[axis].interpolate(info[axis].current);
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
export { resolveOffsets };
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
function calcInset(element, container) {
|
|
2
|
+
const inset = { x: 0, y: 0 };
|
|
3
|
+
let current = element;
|
|
4
|
+
while (current && current !== container) {
|
|
5
|
+
if (current instanceof HTMLElement) {
|
|
6
|
+
inset.x += current.offsetLeft;
|
|
7
|
+
inset.y += current.offsetTop;
|
|
8
|
+
current = current.offsetParent;
|
|
9
|
+
}
|
|
10
|
+
else if (current.tagName === "svg") {
|
|
11
|
+
/**
|
|
12
|
+
* This isn't an ideal approach to measuring the offset of <svg /> tags.
|
|
13
|
+
* It would be preferable, given they behave like HTMLElements in most ways
|
|
14
|
+
* to use offsetLeft/Top. But these don't exist on <svg />. Likewise we
|
|
15
|
+
* can't use .getBBox() like most SVG elements as these provide the offset
|
|
16
|
+
* relative to the SVG itself, which for <svg /> is usually 0x0.
|
|
17
|
+
*/
|
|
18
|
+
const svgBoundingBox = current.getBoundingClientRect();
|
|
19
|
+
current = current.parentElement;
|
|
20
|
+
const parentBoundingBox = current.getBoundingClientRect();
|
|
21
|
+
inset.x += svgBoundingBox.left - parentBoundingBox.left;
|
|
22
|
+
inset.y += svgBoundingBox.top - parentBoundingBox.top;
|
|
23
|
+
}
|
|
24
|
+
else if (current instanceof SVGGraphicsElement) {
|
|
25
|
+
const { x, y } = current.getBBox();
|
|
26
|
+
inset.x += x;
|
|
27
|
+
inset.y += y;
|
|
28
|
+
let svg = null;
|
|
29
|
+
let parent = current.parentNode;
|
|
30
|
+
while (!svg) {
|
|
31
|
+
if (parent.tagName === "svg") {
|
|
32
|
+
svg = parent;
|
|
33
|
+
}
|
|
34
|
+
parent = current.parentNode;
|
|
35
|
+
}
|
|
36
|
+
current = svg;
|
|
37
|
+
}
|
|
38
|
+
else {
|
|
39
|
+
break;
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
return inset;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
export { calcInset };
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { resolveEdge, namedEdges } from './edge.mjs';
|
|
2
|
+
|
|
3
|
+
const defaultOffset = [0, 0];
|
|
4
|
+
function resolveOffset(offset, containerLength, targetLength, targetInset) {
|
|
5
|
+
let offsetDefinition = Array.isArray(offset) ? offset : defaultOffset;
|
|
6
|
+
let targetPoint = 0;
|
|
7
|
+
let containerPoint = 0;
|
|
8
|
+
if (typeof offset === "number") {
|
|
9
|
+
/**
|
|
10
|
+
* If we're provided offset: [0, 0.5, 1] then each number x should become
|
|
11
|
+
* [x, x], so we default to the behaviour of mapping 0 => 0 of both target
|
|
12
|
+
* and container etc.
|
|
13
|
+
*/
|
|
14
|
+
offsetDefinition = [offset, offset];
|
|
15
|
+
}
|
|
16
|
+
else if (typeof offset === "string") {
|
|
17
|
+
offset = offset.trim();
|
|
18
|
+
if (offset.includes(" ")) {
|
|
19
|
+
offsetDefinition = offset.split(" ");
|
|
20
|
+
}
|
|
21
|
+
else {
|
|
22
|
+
/**
|
|
23
|
+
* If we're provided a definition like "100px" then we want to apply
|
|
24
|
+
* that only to the top of the target point, leaving the container at 0.
|
|
25
|
+
* Whereas a named offset like "end" should be applied to both.
|
|
26
|
+
*/
|
|
27
|
+
offsetDefinition = [offset, namedEdges[offset] ? offset : `0`];
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
targetPoint = resolveEdge(offsetDefinition[0], targetLength, targetInset);
|
|
31
|
+
containerPoint = resolveEdge(offsetDefinition[1], containerLength);
|
|
32
|
+
return targetPoint - containerPoint;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
export { resolveOffset };
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import { warnOnce } from '../../../utils/warn-once.mjs';
|
|
2
|
+
import { updateScrollInfo } from './info.mjs';
|
|
3
|
+
import { resolveOffsets } from './offsets/index.mjs';
|
|
4
|
+
|
|
5
|
+
function measure(container, target = container, info) {
|
|
6
|
+
/**
|
|
7
|
+
* Find inset of target within scrollable container
|
|
8
|
+
*/
|
|
9
|
+
info.x.targetOffset = 0;
|
|
10
|
+
info.y.targetOffset = 0;
|
|
11
|
+
if (target !== container) {
|
|
12
|
+
let node = target;
|
|
13
|
+
while (node && node !== container) {
|
|
14
|
+
info.x.targetOffset += node.offsetLeft;
|
|
15
|
+
info.y.targetOffset += node.offsetTop;
|
|
16
|
+
node = node.offsetParent;
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
info.x.targetLength =
|
|
20
|
+
target === container ? target.scrollWidth : target.clientWidth;
|
|
21
|
+
info.y.targetLength =
|
|
22
|
+
target === container ? target.scrollHeight : target.clientHeight;
|
|
23
|
+
info.x.containerLength = container.clientWidth;
|
|
24
|
+
info.y.containerLength = container.clientHeight;
|
|
25
|
+
/**
|
|
26
|
+
* In development mode ensure scroll containers aren't position: static as this makes
|
|
27
|
+
* it difficult to measure their relative positions.
|
|
28
|
+
*/
|
|
29
|
+
if (process.env.NODE_ENV !== "production") {
|
|
30
|
+
if (container && target && target !== container) {
|
|
31
|
+
warnOnce(getComputedStyle(container).position !== "static", "Please ensure that the container has a non-static position, like 'relative', 'fixed', or 'absolute' to ensure scroll offset is calculated correctly.");
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
function createOnScrollHandler(element, onScroll, info, options = {}) {
|
|
36
|
+
return {
|
|
37
|
+
measure: () => measure(element, options.target, info),
|
|
38
|
+
update: (time) => {
|
|
39
|
+
updateScrollInfo(element, info, time);
|
|
40
|
+
if (options.offset || options.target) {
|
|
41
|
+
resolveOffsets(element, info, options);
|
|
42
|
+
}
|
|
43
|
+
},
|
|
44
|
+
notify: () => onScroll(info),
|
|
45
|
+
};
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
export { createOnScrollHandler };
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
import { resize } from '../resize/index.mjs';
|
|
2
|
+
import { createScrollInfo } from './info.mjs';
|
|
3
|
+
import { createOnScrollHandler } from './on-scroll-handler.mjs';
|
|
4
|
+
import { frame, cancelFrame, frameData } from '../../../frameloop/frame.mjs';
|
|
5
|
+
|
|
6
|
+
const scrollListeners = new WeakMap();
|
|
7
|
+
const resizeListeners = new WeakMap();
|
|
8
|
+
const onScrollHandlers = new WeakMap();
|
|
9
|
+
const getEventTarget = (element) => element === document.documentElement ? window : element;
|
|
10
|
+
function scrollInfo(onScroll, { container = document.documentElement, ...options } = {}) {
|
|
11
|
+
let containerHandlers = onScrollHandlers.get(container);
|
|
12
|
+
/**
|
|
13
|
+
* Get the onScroll handlers for this container.
|
|
14
|
+
* If one isn't found, create a new one.
|
|
15
|
+
*/
|
|
16
|
+
if (!containerHandlers) {
|
|
17
|
+
containerHandlers = new Set();
|
|
18
|
+
onScrollHandlers.set(container, containerHandlers);
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Create a new onScroll handler for the provided callback.
|
|
22
|
+
*/
|
|
23
|
+
const info = createScrollInfo();
|
|
24
|
+
const containerHandler = createOnScrollHandler(container, onScroll, info, options);
|
|
25
|
+
containerHandlers.add(containerHandler);
|
|
26
|
+
/**
|
|
27
|
+
* Check if there's a scroll event listener for this container.
|
|
28
|
+
* If not, create one.
|
|
29
|
+
*/
|
|
30
|
+
if (!scrollListeners.has(container)) {
|
|
31
|
+
const measureAll = () => {
|
|
32
|
+
for (const handler of containerHandlers)
|
|
33
|
+
handler.measure();
|
|
34
|
+
};
|
|
35
|
+
const updateAll = () => {
|
|
36
|
+
for (const handler of containerHandlers) {
|
|
37
|
+
handler.update(frameData.timestamp);
|
|
38
|
+
}
|
|
39
|
+
};
|
|
40
|
+
const notifyAll = () => {
|
|
41
|
+
for (const handler of containerHandlers)
|
|
42
|
+
handler.notify();
|
|
43
|
+
};
|
|
44
|
+
const listener = () => {
|
|
45
|
+
frame.read(measureAll, false, true);
|
|
46
|
+
frame.read(updateAll, false, true);
|
|
47
|
+
frame.update(notifyAll, false, true);
|
|
48
|
+
};
|
|
49
|
+
scrollListeners.set(container, listener);
|
|
50
|
+
const target = getEventTarget(container);
|
|
51
|
+
window.addEventListener("resize", listener, { passive: true });
|
|
52
|
+
if (container !== document.documentElement) {
|
|
53
|
+
resizeListeners.set(container, resize(container, listener));
|
|
54
|
+
}
|
|
55
|
+
target.addEventListener("scroll", listener, { passive: true });
|
|
56
|
+
}
|
|
57
|
+
const listener = scrollListeners.get(container);
|
|
58
|
+
frame.read(listener, false, true);
|
|
59
|
+
return () => {
|
|
60
|
+
var _a;
|
|
61
|
+
cancelFrame(listener);
|
|
62
|
+
/**
|
|
63
|
+
* Check if we even have any handlers for this container.
|
|
64
|
+
*/
|
|
65
|
+
const currentHandlers = onScrollHandlers.get(container);
|
|
66
|
+
if (!currentHandlers)
|
|
67
|
+
return;
|
|
68
|
+
currentHandlers.delete(containerHandler);
|
|
69
|
+
if (currentHandlers.size)
|
|
70
|
+
return;
|
|
71
|
+
/**
|
|
72
|
+
* If no more handlers, remove the scroll listener too.
|
|
73
|
+
*/
|
|
74
|
+
const scrollListener = scrollListeners.get(container);
|
|
75
|
+
scrollListeners.delete(container);
|
|
76
|
+
if (scrollListener) {
|
|
77
|
+
getEventTarget(container).removeEventListener("scroll", scrollListener);
|
|
78
|
+
(_a = resizeListeners.get(container)) === null || _a === void 0 ? void 0 : _a();
|
|
79
|
+
window.removeEventListener("resize", scrollListener);
|
|
80
|
+
}
|
|
81
|
+
};
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
export { scrollInfo };
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { Fragment, useMemo, createElement } from 'react';
|
|
2
|
+
import { useHTMLProps } from '../html/use-props.mjs';
|
|
3
|
+
import { filterProps } from './utils/filter-props.mjs';
|
|
4
|
+
import { isSVGComponent } from './utils/is-svg-component.mjs';
|
|
5
|
+
import { useSVGProps } from '../svg/use-props.mjs';
|
|
6
|
+
import { isMotionValue } from '../../value/utils/is-motion-value.mjs';
|
|
7
|
+
|
|
8
|
+
function createUseRender(forwardMotionProps = false) {
|
|
9
|
+
const useRender = (Component, props, ref, { latestValues }, isStatic) => {
|
|
10
|
+
const useVisualProps = isSVGComponent(Component)
|
|
11
|
+
? useSVGProps
|
|
12
|
+
: useHTMLProps;
|
|
13
|
+
const visualProps = useVisualProps(props, latestValues, isStatic, Component);
|
|
14
|
+
const filteredProps = filterProps(props, typeof Component === "string", forwardMotionProps);
|
|
15
|
+
const elementProps = Component !== Fragment
|
|
16
|
+
? { ...filteredProps, ...visualProps, ref }
|
|
17
|
+
: {};
|
|
18
|
+
/**
|
|
19
|
+
* If component has been handed a motion value as its child,
|
|
20
|
+
* memoise its initial value and render that. Subsequent updates
|
|
21
|
+
* will be handled by the onChange handler
|
|
22
|
+
*/
|
|
23
|
+
const { children } = props;
|
|
24
|
+
const renderedChildren = useMemo(() => (isMotionValue(children) ? children.get() : children), [children]);
|
|
25
|
+
return createElement(Component, {
|
|
26
|
+
...elementProps,
|
|
27
|
+
children: renderedChildren,
|
|
28
|
+
});
|
|
29
|
+
};
|
|
30
|
+
return useRender;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
export { createUseRender };
|