motionwind-vanilla 2.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/cdn.ts","../../../../node_modules/motion-utils/src/array.ts","../../../../node_modules/motion-utils/src/clamp.ts","../../../../node_modules/motion-utils/src/errors.ts","../../../../node_modules/motion-utils/src/global-config.ts","../../../../node_modules/motion-utils/src/is-numerical-string.ts","../../../../node_modules/motion-utils/src/is-object.ts","../../../../node_modules/motion-utils/src/is-zero-value-string.ts","../../../../node_modules/motion-utils/src/memo.ts","../../../../node_modules/motion-utils/src/noop.ts","../../../../node_modules/motion-utils/src/pipe.ts","../../../../node_modules/motion-utils/src/progress.ts","../../../../node_modules/motion-utils/src/subscription-manager.ts","../../../../node_modules/motion-utils/src/time-conversion.ts","../../../../node_modules/motion-utils/src/velocity-per-second.ts","../../../../node_modules/motion-utils/src/wrap.ts","../../../../node_modules/motion-utils/src/easing/cubic-bezier.ts","../../../../node_modules/motion-utils/src/easing/modifiers/mirror.ts","../../../../node_modules/motion-utils/src/easing/modifiers/reverse.ts","../../../../node_modules/motion-utils/src/easing/back.ts","../../../../node_modules/motion-utils/src/easing/anticipate.ts","../../../../node_modules/motion-utils/src/easing/circ.ts","../../../../node_modules/motion-utils/src/easing/ease.ts","../../../../node_modules/motion-utils/src/easing/utils/is-easing-array.ts","../../../../node_modules/motion-utils/src/easing/utils/get-easing-for-segment.ts","../../../../node_modules/motion-utils/src/easing/utils/is-bezier-definition.ts","../../../../node_modules/motion-utils/src/easing/utils/map.ts","../../../../node_modules/motion-dom/src/frameloop/order.ts","../../../../node_modules/motion-dom/src/frameloop/render-step.ts","../../../../node_modules/motion-dom/src/frameloop/batcher.ts","../../../../node_modules/motion-dom/src/frameloop/frame.ts","../../../../node_modules/motion-dom/src/frameloop/sync-time.ts","../../../../node_modules/motion-dom/src/value/types/utils/sanitize.ts","../../../../node_modules/motion-dom/src/animation/utils/is-css-variable.ts","../../../../node_modules/motion-dom/src/value/types/numbers/index.ts","../../../../node_modules/motion-dom/src/value/types/utils/float-regex.ts","../../../../node_modules/motion-dom/src/value/types/utils/is-nullish.ts","../../../../node_modules/motion-dom/src/value/types/utils/single-color-regex.ts","../../../../node_modules/motion-dom/src/value/types/color/utils.ts","../../../../node_modules/motion-dom/src/value/types/color/rgba.ts","../../../../node_modules/motion-dom/src/value/types/color/hex.ts","../../../../node_modules/motion-dom/src/value/types/numbers/units.ts","../../../../node_modules/motion-dom/src/value/types/color/hsla.ts","../../../../node_modules/motion-dom/src/value/types/color/index.ts","../../../../node_modules/motion-dom/src/value/types/utils/color-regex.ts","../../../../node_modules/motion-dom/src/value/types/complex/index.ts","../../../../node_modules/motion-dom/src/value/types/color/hsla-to-rgba.ts","../../../../node_modules/motion-dom/src/utils/mix/immediate.ts","../../../../node_modules/motion-dom/src/utils/mix/number.ts","../../../../node_modules/motion-dom/src/utils/mix/color.ts","../../../../node_modules/motion-dom/src/utils/mix/visibility.ts","../../../../node_modules/motion-dom/src/utils/mix/complex.ts","../../../../node_modules/motion-dom/src/utils/mix/index.ts","../../../../node_modules/motion-dom/src/animation/drivers/frame.ts","../../../../node_modules/motion-dom/src/animation/waapi/utils/linear.ts","../../../../node_modules/motion-dom/src/animation/generators/utils/calc-duration.ts","../../../../node_modules/motion-dom/src/animation/generators/utils/create-generator-easing.ts","../../../../node_modules/motion-dom/src/animation/generators/spring.ts","../../../../node_modules/motion-dom/src/animation/generators/inertia.ts","../../../../node_modules/motion-dom/src/utils/interpolate.ts","../../../../node_modules/motion-dom/src/animation/keyframes/offsets/fill.ts","../../../../node_modules/motion-dom/src/animation/keyframes/offsets/default.ts","../../../../node_modules/motion-dom/src/animation/keyframes/offsets/time.ts","../../../../node_modules/motion-dom/src/animation/generators/keyframes.ts","../../../../node_modules/motion-dom/src/animation/generators/utils/velocity.ts","../../../../node_modules/motion-dom/src/animation/keyframes/get-final.ts","../../../../node_modules/motion-dom/src/animation/utils/replace-transition-type.ts","../../../../node_modules/motion-dom/src/animation/utils/notify-inspector.ts","../../../../node_modules/motion-dom/src/animation/utils/WithPromise.ts","../../../../node_modules/motion-dom/src/animation/JSAnimation.ts","../../../../node_modules/motion-dom/src/value/types/complex/filter.ts","../../../../node_modules/motion-dom/src/value/types/complex/mask.ts","../../../../node_modules/motion-dom/src/value/types/int.ts","../../../../node_modules/motion-dom/src/value/types/maps/transform.ts","../../../../node_modules/motion-dom/src/value/types/maps/number.ts","../../../../node_modules/motion-dom/src/value/types/maps/defaults.ts","../../../../node_modules/motion-dom/src/value/types/utils/animatable-none.ts","../../../../node_modules/motion-dom/src/animation/keyframes/utils/fill-wildcards.ts","../../../../node_modules/motion-dom/src/render/dom/parse-transform.ts","../../../../node_modules/motion-dom/src/render/utils/keys-transform.ts","../../../../node_modules/motion-dom/src/animation/keyframes/utils/unit-conversion.ts","../../../../node_modules/motion-dom/src/animation/keyframes/KeyframesResolver.ts","../../../../node_modules/motion-dom/src/render/dom/is-css-var.ts","../../../../node_modules/motion-dom/src/render/dom/style-set.ts","../../../../node_modules/motion-dom/src/utils/supports/flags.ts","../../../../node_modules/motion-dom/src/utils/supports/memo.ts","../../../../node_modules/motion-dom/src/utils/supports/scroll-timeline.ts","../../../../node_modules/motion-dom/src/utils/supports/linear-easing.ts","../../../../node_modules/motion-dom/src/animation/waapi/easing/cubic-bezier.ts","../../../../node_modules/motion-dom/src/animation/waapi/easing/supported.ts","../../../../node_modules/motion-dom/src/animation/waapi/easing/map-easing.ts","../../../../node_modules/motion-dom/src/animation/waapi/start-waapi-animation.ts","../../../../node_modules/motion-dom/src/animation/generators/utils/is-generator.ts","../../../../node_modules/motion-dom/src/animation/waapi/utils/apply-generator.ts","../../../../node_modules/motion-dom/src/animation/NativeAnimation.ts","../../../../node_modules/motion-dom/src/animation/waapi/utils/unsupported-easing.ts","../../../../node_modules/motion-dom/src/animation/NativeAnimationExtended.ts","../../../../node_modules/motion-dom/src/animation/utils/is-animatable.ts","../../../../node_modules/motion-dom/src/animation/utils/can-animate.ts","../../../../node_modules/motion-dom/src/animation/utils/make-animation-instant.ts","../../../../node_modules/motion-dom/src/animation/waapi/utils/accelerated-values.ts","../../../../node_modules/motion-dom/src/animation/waapi/utils/is-browser-color.ts","../../../../node_modules/motion-dom/src/animation/waapi/supports/waapi.ts","../../../../node_modules/motion-dom/src/animation/AsyncMotionValueAnimation.ts","../../../../node_modules/motion-dom/src/animation/GroupAnimation.ts","../../../../node_modules/motion-dom/src/animation/GroupAnimationWithThen.ts","../../../../node_modules/motion-dom/src/value/index.ts","../../../../node_modules/motion-dom/src/animation/utils/resolve-transition.ts","../../../../node_modules/motion-dom/src/animation/utils/get-value-transition.ts","../../../../node_modules/motion-dom/src/animation/utils/default-transitions.ts","../../../../node_modules/motion-dom/src/animation/utils/is-transition-defined.ts","../../../../node_modules/motion-dom/src/animation/interfaces/motion-value.ts","../../../../node_modules/motion-dom/src/animation/utils/css-variables-conversion.ts","../../../../node_modules/motion-dom/src/render/utils/keys-position.ts","../../../../node_modules/motion-dom/src/value/utils/is-motion-value.ts","../../../../node_modules/motion-dom/src/render/dom/utils/camel-to-dash.ts","../../../../node_modules/motion-dom/src/value/types/auto.ts","../../../../node_modules/motion-dom/src/value/types/test.ts","../../../../node_modules/motion-dom/src/value/types/dimensions.ts","../../../../node_modules/motion-dom/src/animation/keyframes/utils/is-none.ts","../../../../node_modules/motion-dom/src/animation/keyframes/utils/make-none-animatable.ts","../../../../node_modules/motion-dom/src/animation/keyframes/DOMKeyframesResolver.ts","../../../../node_modules/motion-dom/src/animation/animate/effects.ts","../../../../node_modules/motion-dom/src/utils/is-html-element.ts","../../../../node_modules/motion-dom/src/utils/is-svg-element.ts","../../../../node_modules/motion-dom/src/value/types/utils/get-as-type.ts","../../../../node_modules/motion-dom/src/utils/resolve-elements.ts","../../../../node_modules/motion-dom/src/effects/MotionValueState.ts","../../../../node_modules/motion-dom/src/effects/utils/create-effect.ts","../../../../node_modules/motion-dom/src/effects/style/transform.ts","../../../../node_modules/motion-dom/src/effects/style/index.ts","../../../../node_modules/motion-dom/src/render/svg/utils/build-attrs.ts","../../../../node_modules/motion-dom/src/effects/attr/index.ts","../../../../node_modules/motion-dom/src/effects/svg/index.ts","../../../../node_modules/motion-dom/src/projection/geometry/conversion.ts","../../../../node_modules/motion-dom/src/projection/utils/measure.ts","../../../../node_modules/motion-dom/src/animation/animate/element.ts","../../../../node_modules/motion-dom/src/effects/prop/index.ts","../../../../node_modules/motion-dom/src/gestures/drag/state/is-active.ts","../../../../node_modules/motion-dom/src/gestures/utils/setup.ts","../../../../node_modules/motion-dom/src/gestures/hover.ts","../../../../node_modules/motion-dom/src/gestures/utils/is-node-or-child.ts","../../../../node_modules/motion-dom/src/gestures/utils/is-primary-pointer.ts","../../../../node_modules/motion-dom/src/gestures/press/utils/is-keyboard-accessible.ts","../../../../node_modules/motion-dom/src/gestures/press/utils/state.ts","../../../../node_modules/motion-dom/src/gestures/press/utils/keyboard.ts","../../../../node_modules/motion-dom/src/gestures/press/index.ts","../../../../node_modules/motion-dom/src/resize/handle-element.ts","../../../../node_modules/motion-dom/src/resize/handle-window.ts","../../../../node_modules/motion-dom/src/resize/index.ts","../../../../node_modules/motion-dom/src/scroll/observe.ts","../../../../node_modules/motion-dom/src/render/store.ts","../../../../node_modules/motion-dom/src/animation/animate/single-value.ts","../../../../node_modules/framer-motion/src/animation/utils/is-dom-keyframes.ts","../../../../node_modules/framer-motion/src/animation/animate/resolve-subjects.ts","../../../../node_modules/framer-motion/src/animation/sequence/utils/calc-repeat-duration.ts","../../../../node_modules/framer-motion/src/animation/sequence/utils/calc-time.ts","../../../../node_modules/framer-motion/src/animation/sequence/utils/edit.ts","../../../../node_modules/framer-motion/src/animation/sequence/utils/normalize-times.ts","../../../../node_modules/framer-motion/src/animation/sequence/utils/sort.ts","../../../../node_modules/framer-motion/src/animation/sequence/create.ts","../../../../node_modules/framer-motion/src/animation/animate/subject.ts","../../../../node_modules/framer-motion/src/animation/animate/sequence.ts","../../../../node_modules/framer-motion/src/animation/animate/index.ts","../../../../node_modules/framer-motion/src/render/dom/scroll/utils/can-use-native-timeline.ts","../../../../node_modules/framer-motion/src/render/dom/scroll/info.ts","../../../../node_modules/framer-motion/src/render/dom/scroll/offsets/inset.ts","../../../../node_modules/framer-motion/src/render/dom/scroll/offsets/edge.ts","../../../../node_modules/framer-motion/src/render/dom/scroll/offsets/offset.ts","../../../../node_modules/framer-motion/src/render/dom/scroll/offsets/presets.ts","../../../../node_modules/framer-motion/src/render/dom/scroll/offsets/index.ts","../../../../node_modules/framer-motion/src/render/dom/scroll/on-scroll-handler.ts","../../../../node_modules/framer-motion/src/render/dom/scroll/track.ts","../../../../node_modules/framer-motion/src/render/dom/scroll/utils/offset-to-range.ts","../../../../node_modules/framer-motion/src/render/dom/scroll/utils/get-timeline.ts","../../../../node_modules/framer-motion/src/render/dom/scroll/attach-animation.ts","../../../../node_modules/framer-motion/src/render/dom/scroll/utils/is-element-tracking.ts","../../../../node_modules/framer-motion/src/render/dom/scroll/attach-function.ts","../../../../node_modules/framer-motion/src/render/dom/scroll/index.ts","../../../../node_modules/framer-motion/src/render/dom/viewport/index.ts","../../../motionwind-core/src/registry.ts","../../../motionwind-core/src/recipes.ts","../../../motionwind-core/src/parser.ts","../../../motionwind-core/src/adapter.ts","../../src/map.ts","../../src/adapter.ts","../../src/index.ts"],"sourcesContent":["import { motionwind } from \"./index.js\";\n\n// CDN entry: auto-initialize on load and expose `window.motionwind`.\nif (typeof document !== \"undefined\") {\n const run = () => motionwind();\n if (document.readyState === \"loading\") {\n document.addEventListener(\"DOMContentLoaded\", run);\n } else {\n run();\n }\n}\n\nexport { motionwind };\nexport default motionwind;\n","export function addUniqueItem<T>(arr: T[], item: T) {\n if (arr.indexOf(item) === -1) arr.push(item)\n}\n\nexport function removeItem<T>(arr: T[], item: T) {\n const index = arr.indexOf(item)\n if (index > -1) arr.splice(index, 1)\n}\n\n// Adapted from array-move\nexport function moveItem<T>([...arr]: T[], fromIndex: number, toIndex: number) {\n const startIndex = fromIndex < 0 ? arr.length + fromIndex : fromIndex\n\n if (startIndex >= 0 && startIndex < arr.length) {\n const endIndex = toIndex < 0 ? arr.length + toIndex : toIndex\n\n const [item] = arr.splice(fromIndex, 1)\n arr.splice(endIndex, 0, item)\n }\n\n return arr\n}\n","export const clamp = (min: number, max: number, v: number) => {\n if (v > max) return max\n if (v < min) return min\n return v\n}\n","import { formatErrorMessage } from \"./format-error-message\"\n\nexport type DevMessage = (\n check: boolean,\n message: string,\n errorCode?: string\n) => void\n\nlet warning: DevMessage = () => {}\nlet invariant: DevMessage = () => {}\n\nif (\n typeof process !== \"undefined\" &&\n process.env?.NODE_ENV !== \"production\"\n) {\n warning = (check, message, errorCode) => {\n if (!check && typeof console !== \"undefined\") {\n console.warn(formatErrorMessage(message, errorCode))\n }\n }\n\n invariant = (check, message, errorCode) => {\n if (!check) {\n throw new Error(formatErrorMessage(message, errorCode))\n }\n }\n}\n\nexport { invariant, warning }\n","export const MotionGlobalConfig: {\n skipAnimations?: boolean\n instantAnimations?: boolean\n useManualTiming?: boolean\n WillChange?: any\n mix?: <T>(a: T, b: T) => (p: number) => T\n} = {}\n","/**\n * Check if value is a numerical string, ie a string that is purely a number eg \"100\" or \"-100.1\"\n */\nexport const isNumericalString = (v: string) => /^-?(?:\\d+(?:\\.\\d+)?|\\.\\d+)$/u.test(v)\n","export const isObject = (value: unknown): value is object =>\n typeof value === \"object\" && value !== null\n","/**\n * Check if the value is a zero value string like \"0px\" or \"0%\"\n */\nexport const isZeroValueString = (v: string) => /^0[^.\\s]+$/u.test(v)\n","/*#__NO_SIDE_EFFECTS__*/\nexport function memo<T extends any>(callback: () => T) {\n let result: T | undefined\n\n return () => {\n if (result === undefined) result = callback()\n return result\n }\n}\n","/*#__NO_SIDE_EFFECTS__*/\nexport const noop = <T>(any: T): T => any\n","/**\n * Pipe\n * Compose other transformers to run linearily\n * pipe(min(20), max(40))\n * @param {...functions} transformers\n * @return {function}\n */\nexport const pipe = (...transformers: Function[]) =>\n transformers.reduce((a, b) => (v: any) => b(a(v)))\n","/*\n Progress within given range\n\n Given a lower limit and an upper limit, we return the progress\n (expressed as a number 0-1) represented by the given value, and\n limit that progress to within 0-1.\n*/\n/*#__NO_SIDE_EFFECTS__*/\nexport const progress = (from: number, to: number, value: number) => {\n const range = to - from\n return range ? (value - from) / range : 1\n}\n","import { addUniqueItem, removeItem } from \"./array\"\n\ntype GenericHandler = (...args: any) => void\n\nexport class SubscriptionManager<Handler extends GenericHandler> {\n private subscriptions: Handler[] = []\n\n add(handler: Handler): VoidFunction {\n addUniqueItem(this.subscriptions, handler)\n return () => this.remove(handler)\n }\n\n remove(handler: Handler) {\n removeItem(this.subscriptions, handler)\n }\n\n notify(\n a?: Parameters<Handler>[0],\n b?: Parameters<Handler>[1],\n c?: Parameters<Handler>[2]\n ) {\n const numSubscriptions = this.subscriptions.length\n\n if (!numSubscriptions) return\n\n if (numSubscriptions === 1) {\n /**\n * If there's only a single handler we can just call it without invoking a loop.\n */\n this.subscriptions[0](a, b, c)\n } else {\n for (let i = 0; i < numSubscriptions; i++) {\n /**\n * Check whether the handler exists before firing as it's possible\n * the subscriptions were modified during this loop running.\n */\n const handler = this.subscriptions[i]\n handler && handler(a, b, c)\n }\n }\n }\n\n getSize() {\n return this.subscriptions.length\n }\n\n clear() {\n this.subscriptions.length = 0\n }\n}\n","/**\n * Converts seconds to milliseconds\n *\n * @param seconds - Time in seconds.\n * @return milliseconds - Converted time in milliseconds.\n */\n\n/*#__NO_SIDE_EFFECTS__*/\nexport const secondsToMilliseconds = (seconds: number) => seconds * 1000\n\n/*#__NO_SIDE_EFFECTS__*/\nexport const millisecondsToSeconds = (milliseconds: number) =>\n milliseconds / 1000\n","/*\n Convert velocity into velocity per second\n*/\n/*#__NO_SIDE_EFFECTS__*/\nexport const velocityPerSecond = (velocity: number, frameDuration: number) =>\n frameDuration ? velocity * (1000 / frameDuration) : 0\n","export const wrap = (min: number, max: number, v: number) => {\n const rangeSize = max - min\n return ((((v - min) % rangeSize) + rangeSize) % rangeSize) + min\n}\n","/*\n Bezier function generator\n This has been modified from Gaëtan Renaudeau's BezierEasing\n https://github.com/gre/bezier-easing/blob/master/src/index.js\n https://github.com/gre/bezier-easing/blob/master/LICENSE\n \n I've removed the newtonRaphsonIterate algo because in benchmarking it\n wasn't noticeably faster than binarySubdivision, indeed removing it\n usually improved times, depending on the curve.\n I also removed the lookup table, as for the added bundle size and loop we're\n only cutting ~4 or so subdivision iterations. I bumped the max iterations up\n to 12 to compensate and this still tended to be faster for no perceivable\n loss in accuracy.\n Usage\n const easeOut = cubicBezier(.17,.67,.83,.67);\n const x = easeOut(0.5); // returns 0.627...\n*/\n\nimport { noop } from \"../noop\"\n\n// Returns x(t) given t, x1, and x2, or y(t) given t, y1, and y2.\nconst calcBezier = (t: number, a1: number, a2: number) =>\n (((1.0 - 3.0 * a2 + 3.0 * a1) * t + (3.0 * a2 - 6.0 * a1)) * t + 3.0 * a1) *\n t\n\nconst subdivisionPrecision = 0.0000001\nconst subdivisionMaxIterations = 12\n\nfunction binarySubdivide(\n x: number,\n lowerBound: number,\n upperBound: number,\n mX1: number,\n mX2: number\n) {\n let currentX: number\n let currentT: number\n let i: number = 0\n\n do {\n currentT = lowerBound + (upperBound - lowerBound) / 2.0\n currentX = calcBezier(currentT, mX1, mX2) - x\n if (currentX > 0.0) {\n upperBound = currentT\n } else {\n lowerBound = currentT\n }\n } while (\n Math.abs(currentX) > subdivisionPrecision &&\n ++i < subdivisionMaxIterations\n )\n\n return currentT\n}\n\n/*#__NO_SIDE_EFFECTS__*/\nexport function cubicBezier(\n mX1: number,\n mY1: number,\n mX2: number,\n mY2: number\n) {\n // If this is a linear gradient, return linear easing\n if (mX1 === mY1 && mX2 === mY2) return noop\n\n const getTForX = (aX: number) => binarySubdivide(aX, 0, 1, mX1, mX2)\n\n // If animation is at start/end, return t without easing\n return (t: number) =>\n t === 0 || t === 1 ? t : calcBezier(getTForX(t), mY1, mY2)\n}\n","// Accepts an easing function and returns a new one that outputs mirrored values for\n\nimport { EasingModifier } from \"../types\"\n\n// the second half of the animation. Turns easeIn into easeInOut.\n/*#__NO_SIDE_EFFECTS__*/\nexport const mirrorEasing: EasingModifier = (easing) => (p) =>\n p <= 0.5 ? easing(2 * p) / 2 : (2 - easing(2 * (1 - p))) / 2\n","// Accepts an easing function and returns a new one that outputs reversed values.\n\nimport { EasingModifier } from \"../types\"\n\n// Turns easeIn into easeOut.\n/*#__NO_SIDE_EFFECTS__*/\nexport const reverseEasing: EasingModifier = (easing) => (p) =>\n 1 - easing(1 - p)\n","import { cubicBezier } from \"./cubic-bezier\"\nimport { mirrorEasing } from \"./modifiers/mirror\"\nimport { reverseEasing } from \"./modifiers/reverse\"\n\nexport const backOut = /*@__PURE__*/ cubicBezier(0.33, 1.53, 0.69, 0.99)\nexport const backIn = /*@__PURE__*/ reverseEasing(backOut)\nexport const backInOut = /*@__PURE__*/ mirrorEasing(backIn)\n","import { backIn } from \"./back\"\n\nexport const anticipate = (p: number) =>\n p >= 1\n ? 1\n : (p *= 2) < 1\n ? 0.5 * backIn(p)\n : 0.5 * (2 - Math.pow(2, -10 * (p - 1)))\n","import { mirrorEasing } from \"./modifiers/mirror\"\nimport { reverseEasing } from \"./modifiers/reverse\"\nimport { EasingFunction } from \"./types\"\n\nexport const circIn: EasingFunction = (p) => 1 - Math.sin(Math.acos(p))\nexport const circOut = reverseEasing(circIn)\nexport const circInOut = mirrorEasing(circIn)\n","import { cubicBezier } from \"./cubic-bezier\"\n\nexport const easeIn = /*@__PURE__*/ cubicBezier(0.42, 0, 1, 1)\nexport const easeOut = /*@__PURE__*/ cubicBezier(0, 0, 0.58, 1)\nexport const easeInOut = /*@__PURE__*/ cubicBezier(0.42, 0, 0.58, 1)\n","import { Easing } from \"../types\"\n\n/*#__NO_SIDE_EFFECTS__*/\nexport const isEasingArray = (ease: any): ease is Easing[] => {\n return Array.isArray(ease) && typeof ease[0] !== \"number\"\n}\n","import { wrap } from \"../../wrap\"\nimport { Easing } from \"../types\"\nimport { isEasingArray } from \"./is-easing-array\"\n\n/*#__NO_SIDE_EFFECTS__*/\nexport function getEasingForSegment(\n easing: Easing | Easing[],\n i: number\n): Easing {\n return isEasingArray(easing) ? easing[wrap(0, easing.length, i)] : easing\n}\n","import { BezierDefinition, Easing } from \"../types\"\n\n/*#__NO_SIDE_EFFECTS__*/\nexport const isBezierDefinition = (\n easing: Easing | Easing[]\n): easing is BezierDefinition =>\n Array.isArray(easing) && typeof easing[0] === \"number\"\n","import { invariant } from \"../../errors\"\nimport { noop } from \"../../noop\"\nimport { anticipate } from \"../anticipate\"\nimport { backIn, backInOut, backOut } from \"../back\"\nimport { circIn, circInOut, circOut } from \"../circ\"\nimport { cubicBezier } from \"../cubic-bezier\"\nimport { easeIn, easeInOut, easeOut } from \"../ease\"\nimport { Easing, EasingFunction } from \"../types\"\nimport { isBezierDefinition } from \"./is-bezier-definition\"\n\nconst easingLookup = {\n linear: noop,\n easeIn,\n easeInOut,\n easeOut,\n circIn,\n circInOut,\n circOut,\n backIn,\n backInOut,\n backOut,\n anticipate,\n}\n\nconst isValidEasing = (easing: Easing): easing is keyof typeof easingLookup => {\n return typeof easing === \"string\"\n}\n\nexport const easingDefinitionToFunction = (\n definition: Easing\n): EasingFunction => {\n if (isBezierDefinition(definition)) {\n // If cubic bezier definition, create bezier curve\n invariant(\n definition.length === 4,\n `Cubic bezier arrays must contain four numerical values.`,\n \"cubic-bezier-length\"\n )\n\n const [x1, y1, x2, y2] = definition\n return cubicBezier(x1, y1, x2, y2)\n } else if (isValidEasing(definition)) {\n // Else lookup from table\n invariant(\n easingLookup[definition] !== undefined,\n `Invalid easing type '${definition}'`,\n \"invalid-easing-type\"\n )\n return easingLookup[definition]\n }\n\n return definition\n}\n","import { StepId } from \"./types\"\n\nexport const stepsOrder: StepId[] = [\n \"setup\", // Compute\n \"read\", // Read\n \"resolveKeyframes\", // Write/Read/Write/Read\n \"preUpdate\", // Compute\n \"update\", // Compute\n \"preRender\", // Compute\n \"render\", // Write\n \"postRender\", // Compute\n] as const\n\nexport type StepNames = (typeof stepsOrder)[number]\n","import { FrameData, Process, Step } from \"./types\"\n\nexport function createRenderStep(runNextFrame: () => void): Step {\n /**\n * We create and reuse two queues, one to queue jobs for the current frame\n * and one for the next. We reuse to avoid triggering GC after x frames.\n */\n let thisFrame = new Set<Process>()\n let nextFrame = new Set<Process>()\n\n /**\n * Track whether we're currently processing jobs in this step. This way\n * we can decide whether to schedule new jobs for this frame or next.\n */\n let isProcessing = false\n\n let flushNextFrame = false\n\n /**\n * A set of processes which were marked keepAlive when scheduled.\n * A keepAlive process is always also held by a frame queue until\n * it's cancelled, so a Set has the same lifetime semantics as a\n * WeakSet here while being considerably faster to query every frame.\n */\n const toKeepAlive = new Set<Process>()\n\n let latestFrameData: FrameData = {\n delta: 0.0,\n timestamp: 0.0,\n isProcessing: false,\n }\n\n function triggerCallback(callback: Process) {\n if (toKeepAlive.has(callback)) {\n nextFrame.add(callback)\n runNextFrame()\n }\n\n callback(latestFrameData)\n }\n\n const step: Step = {\n /**\n * Schedule a process to run on the next frame.\n */\n schedule: (callback, keepAlive = false, immediate = false) => {\n const addToCurrentFrame = immediate && isProcessing\n const queue = addToCurrentFrame ? thisFrame : nextFrame\n\n if (keepAlive) toKeepAlive.add(callback)\n\n queue.add(callback)\n\n return callback\n },\n\n /**\n * Cancel the provided callback from running on the next frame.\n */\n cancel: (callback) => {\n nextFrame.delete(callback)\n toKeepAlive.delete(callback)\n },\n\n /**\n * Execute all schedule callbacks.\n */\n process: (frameData) => {\n latestFrameData = frameData\n\n /**\n * If we're already processing we've probably been triggered by a flushSync\n * inside an existing process. Instead of executing, mark flushNextFrame\n * as true and ensure we flush the following frame at the end of this one.\n */\n if (isProcessing) {\n flushNextFrame = true\n return\n }\n\n isProcessing = true\n\n // Swap this frame and the next to avoid GC\n const prevFrame = thisFrame\n thisFrame = nextFrame\n nextFrame = prevFrame\n\n // Execute this frame\n thisFrame.forEach(triggerCallback)\n\n // Clear the frame so no callbacks remain. This is to avoid\n // memory leaks should this render step not run for a while.\n thisFrame.clear()\n\n isProcessing = false\n\n if (flushNextFrame) {\n flushNextFrame = false\n step.process(frameData)\n }\n },\n }\n\n return step\n}\n","import { MotionGlobalConfig } from \"motion-utils\"\nimport { stepsOrder } from \"./order\"\nimport { createRenderStep } from \"./render-step\"\nimport { Batcher, FrameData, Process, Steps } from \"./types\"\n\nconst maxElapsed = 40\n\nexport function createRenderBatcher(\n scheduleNextBatch: (callback: Function) => void,\n allowKeepAlive: boolean\n) {\n let runNextFrame = false\n let useDefaultElapsed = true\n\n const state: FrameData = {\n delta: 0.0,\n timestamp: 0.0,\n isProcessing: false,\n }\n\n const flagRunNextFrame = () => (runNextFrame = true)\n\n const steps = stepsOrder.reduce((acc, key) => {\n acc[key] = createRenderStep(flagRunNextFrame)\n return acc\n }, {} as Steps)\n\n const {\n setup,\n read,\n resolveKeyframes,\n preUpdate,\n update,\n preRender,\n render,\n postRender,\n } = steps\n\n const processBatch = () => {\n const useManualTiming = MotionGlobalConfig.useManualTiming\n const timestamp = useManualTiming\n ? state.timestamp\n : performance.now()\n runNextFrame = false\n\n if (!useManualTiming) {\n state.delta = useDefaultElapsed\n ? 1000 / 60\n : Math.max(Math.min(timestamp - state.timestamp, maxElapsed), 1)\n }\n\n state.timestamp = timestamp\n state.isProcessing = true\n\n // Unrolled render loop for better per-frame performance\n setup.process(state)\n read.process(state)\n resolveKeyframes.process(state)\n preUpdate.process(state)\n update.process(state)\n preRender.process(state)\n render.process(state)\n postRender.process(state)\n\n state.isProcessing = false\n\n if (runNextFrame && allowKeepAlive) {\n useDefaultElapsed = false\n scheduleNextBatch(processBatch)\n }\n }\n\n const wake = () => {\n runNextFrame = true\n useDefaultElapsed = true\n\n if (!state.isProcessing) {\n scheduleNextBatch(processBatch)\n }\n }\n\n const schedule = stepsOrder.reduce((acc, key) => {\n const step = steps[key]\n acc[key] = (process: Process, keepAlive = false, immediate = false) => {\n if (!runNextFrame) wake()\n\n return step.schedule(process, keepAlive, immediate)\n }\n return acc\n }, {} as Batcher)\n\n const cancel = (process: Process) => {\n for (let i = 0; i < stepsOrder.length; i++) {\n steps[stepsOrder[i]].cancel(process)\n }\n }\n\n return { schedule, cancel, state, steps }\n}\n","import { noop } from \"motion-utils\"\nimport { createRenderBatcher } from \"./batcher\"\n\nexport const {\n schedule: frame,\n cancel: cancelFrame,\n state: frameData,\n steps: frameSteps,\n} = /* @__PURE__ */ createRenderBatcher(\n typeof requestAnimationFrame !== \"undefined\" ? requestAnimationFrame : noop,\n true\n)\n","import { MotionGlobalConfig } from \"motion-utils\"\nimport { frameData } from \"./frame\"\n\nlet now: number | undefined\n\nfunction clearTime() {\n now = undefined\n}\n\n/**\n * An eventloop-synchronous alternative to performance.now().\n *\n * Ensures that time measurements remain consistent within a synchronous context.\n * Usually calling performance.now() twice within the same synchronous context\n * will return different values which isn't useful for animations when we're usually\n * trying to sync animations to the same frame.\n */\nexport const time = {\n now: (): number => {\n if (now === undefined) {\n time.set(\n frameData.isProcessing || MotionGlobalConfig.useManualTiming\n ? frameData.timestamp\n : performance.now()\n )\n }\n\n return now!\n },\n set: (newTime: number) => {\n now = newTime\n queueMicrotask(clearTime)\n },\n}\n","// If this number is a decimal, make it just five decimal places\n// to avoid exponents\nexport const sanitize = (v: number) => Math.round(v * 100000) / 100000\n","import { AnyResolvedKeyframe } from \"../types\"\n\nexport type CSSVariableName = `--${string}`\n\nexport type CSSVariableToken = `var(${CSSVariableName})`\n\nconst checkStringStartsWith =\n <T extends string>(token: string) =>\n (key?: AnyResolvedKeyframe | null): key is T =>\n typeof key === \"string\" && key.startsWith(token)\n\nexport const isCSSVariableName =\n /*@__PURE__*/ checkStringStartsWith<CSSVariableName>(\"--\")\n\nconst startsAsVariableToken =\n /*@__PURE__*/ checkStringStartsWith<CSSVariableToken>(\"var(--\")\nexport const isCSSVariableToken = (\n value?: string\n): value is CSSVariableToken => {\n const startsWithToken = startsAsVariableToken(value)\n\n if (!startsWithToken) return false\n\n // Ensure any comments are stripped from the value as this can harm performance of the regex.\n return singleCssVariableRegex.test(value.split(\"/*\")[0].trim())\n}\n\nconst singleCssVariableRegex =\n /var\\(--(?:[\\w-]+\\s*|[\\w-]+\\s*,(?:\\s*[^)(\\s]|\\s*\\((?:[^)(]|\\([^)(]*\\))*\\))+\\s*)\\)$/iu\n\n/**\n * Check if a value contains a CSS variable anywhere (e.g. inside calc()).\n * Unlike isCSSVariableToken which checks if the value IS a var() token,\n * this checks if the value CONTAINS var() somewhere in the string.\n */\nexport function containsCSSVariable(\n value?: AnyResolvedKeyframe | null\n): boolean {\n if (typeof value !== \"string\") return false\n // Strip comments to avoid false positives\n return value.split(\"/*\")[0].includes(\"var(--\")\n}\n","import { clamp } from \"motion-utils\"\n\nexport const number = {\n test: (v: number) => typeof v === \"number\",\n parse: parseFloat,\n transform: (v: number) => v,\n}\n\nexport const alpha = {\n ...number,\n transform: (v: number) => clamp(0, 1, v),\n}\n\nexport const scale = {\n ...number,\n default: 1,\n}\n","export const floatRegex = /-?(?:\\d+(?:\\.\\d+)?|\\.\\d+)/gu\n","export function isNullish(v: any): v is null | undefined {\n return v == null\n}\n","export const singleColorRegex =\n /^(?:#[\\da-f]{3,8}|(?:rgb|hsl)a?\\((?:-?[\\d.]+%?[,\\s]+){2}-?[\\d.]+%?\\s*(?:[,/]\\s*)?(?:\\b\\d+(?:\\.\\d+)?|\\.\\d+)?%?\\))$/iu\n","import { Color, HSLA, RGBA } from \"../types\"\nimport { floatRegex } from \"../utils/float-regex\"\nimport { isNullish } from \"../utils/is-nullish\"\nimport { singleColorRegex } from \"../utils/single-color-regex\"\n\n/**\n * Returns true if the provided string is a color, ie rgba(0,0,0,0) or #000,\n * but false if a number or multiple colors\n */\nexport const isColorString = (type: string, testProp?: string) => (v: any) => {\n return Boolean(\n (typeof v === \"string\" &&\n singleColorRegex.test(v) &&\n v.startsWith(type)) ||\n (testProp &&\n !isNullish(v) &&\n Object.prototype.hasOwnProperty.call(v, testProp))\n )\n}\n\nexport const splitColor =\n <V extends RGBA | HSLA>(aName: string, bName: string, cName: string) =>\n (v: string | Color): V => {\n if (typeof v !== \"string\") return v as any\n\n const [a, b, c, alpha] = v.match(floatRegex) as any\n\n return {\n [aName]: parseFloat(a),\n [bName]: parseFloat(b),\n [cName]: parseFloat(c),\n alpha: alpha !== undefined ? parseFloat(alpha) : 1,\n } as V\n }\n","import { clamp } from \"motion-utils\"\nimport { alpha as alphaType, number } from \"../numbers\"\nimport { RGBA } from \"../types\"\nimport { sanitize } from \"../utils/sanitize\"\nimport { isColorString, splitColor } from \"./utils\"\n\nconst clampRgbUnit = (v: number) => clamp(0, 255, v)\nexport const rgbUnit = {\n ...number,\n transform: (v: number) => Math.round(clampRgbUnit(v)),\n}\n\nexport const rgba = {\n test: /*@__PURE__*/ isColorString(\"rgb\", \"red\"),\n parse: /*@__PURE__*/ splitColor<RGBA>(\"red\", \"green\", \"blue\"),\n transform: ({ red, green, blue, alpha = 1 }: RGBA) =>\n \"rgba(\" +\n rgbUnit.transform(red) +\n \", \" +\n rgbUnit.transform(green) +\n \", \" +\n rgbUnit.transform(blue) +\n \", \" +\n sanitize(alphaType.transform(alpha)) +\n \")\",\n}\n","import { RGBA } from \"../types\"\nimport { rgba } from \"./rgba\"\nimport { isColorString } from \"./utils\"\n\nfunction parseHex(v: string): RGBA {\n let r = \"\"\n let g = \"\"\n let b = \"\"\n let a = \"\"\n\n // If we have 6 characters, ie #FF0000\n if (v.length > 5) {\n r = v.substring(1, 3)\n g = v.substring(3, 5)\n b = v.substring(5, 7)\n a = v.substring(7, 9)\n\n // Or we have 3 characters, ie #F00\n } else {\n r = v.substring(1, 2)\n g = v.substring(2, 3)\n b = v.substring(3, 4)\n a = v.substring(4, 5)\n r += r\n g += g\n b += b\n a += a\n }\n\n return {\n red: parseInt(r, 16),\n green: parseInt(g, 16),\n blue: parseInt(b, 16),\n alpha: a ? parseInt(a, 16) / 255 : 1,\n }\n}\n\nexport const hex = {\n test: /*@__PURE__*/ isColorString(\"#\"),\n parse: parseHex,\n transform: rgba.transform,\n}\n","import { AnyResolvedKeyframe } from \"../../../animation/types\"\n\n/*#__NO_SIDE_EFFECTS__*/\nconst createUnitType = (unit: string) => ({\n test: (v: AnyResolvedKeyframe) =>\n typeof v === \"string\" && v.endsWith(unit) && v.split(\" \").length === 1,\n parse: parseFloat,\n transform: (v: number | string) => `${v}${unit}`,\n})\n\nexport const degrees = /*@__PURE__*/ createUnitType(\"deg\")\nexport const percent = /*@__PURE__*/ createUnitType(\"%\")\nexport const px = /*@__PURE__*/ createUnitType(\"px\")\nexport const vh = /*@__PURE__*/ createUnitType(\"vh\")\nexport const vw = /*@__PURE__*/ createUnitType(\"vw\")\n\nexport const progressPercentage = /*@__PURE__*/ (() => ({\n ...percent,\n parse: (v: string) => percent.parse(v) / 100,\n transform: (v: number) => percent.transform(v * 100),\n}))()\n","import { alpha as alphaType } from \"../numbers\"\nimport { percent } from \"../numbers/units\"\nimport { HSLA } from \"../types\"\nimport { sanitize } from \"../utils/sanitize\"\nimport { isColorString, splitColor } from \"./utils\"\n\nexport const hsla = {\n test: /*@__PURE__*/ isColorString(\"hsl\", \"hue\"),\n parse: /*@__PURE__*/ splitColor<HSLA>(\"hue\", \"saturation\", \"lightness\"),\n transform: ({ hue, saturation, lightness, alpha = 1 }: HSLA) => {\n return (\n \"hsla(\" +\n Math.round(hue) +\n \", \" +\n percent.transform(sanitize(saturation)) +\n \", \" +\n percent.transform(sanitize(lightness)) +\n \", \" +\n sanitize(alphaType.transform(alpha)) +\n \")\"\n )\n },\n}\n","import { HSLA, RGBA } from \"../types\"\nimport { hex } from \"./hex\"\nimport { hsla } from \"./hsla\"\nimport { rgba } from \"./rgba\"\n\nexport const color = {\n test: (v: any) => rgba.test(v) || hex.test(v) || hsla.test(v),\n parse: (v: any): RGBA | HSLA => {\n if (rgba.test(v)) {\n return rgba.parse(v)\n } else if (hsla.test(v)) {\n return hsla.parse(v)\n } else {\n return hex.parse(v)\n }\n },\n transform: (v: HSLA | RGBA | string) => {\n return typeof v === \"string\"\n ? v\n : v.hasOwnProperty(\"red\")\n ? rgba.transform(v as RGBA)\n : hsla.transform(v as HSLA)\n },\n getAnimatableNone: (v: string) => {\n const parsed = color.parse(v)\n parsed.alpha = 0\n return color.transform(parsed)\n },\n}\n","export const colorRegex =\n /(?:#[\\da-f]{3,8}|(?:rgb|hsl)a?\\((?:-?[\\d.]+%?[,\\s]+){2}-?[\\d.]+%?\\s*(?:[,/]\\s*)?(?:\\b\\d+(?:\\.\\d+)?|\\.\\d+)?%?\\))/giu\n","import { AnyResolvedKeyframe } from \"../../../animation/types\"\nimport { CSSVariableToken } from \"../../../animation/utils/is-css-variable\"\nimport { color } from \"../color\"\nimport { Color } from \"../types\"\nimport { colorRegex } from \"../utils/color-regex\"\nimport { floatRegex } from \"../utils/float-regex\"\nimport { sanitize } from \"../utils/sanitize\"\n\n/**\n * Non-global copies of the token regexes so test() can use .test()\n * (no match array, stops at the first token) without lastIndex state.\n */\nconst hasFloat = /*@__PURE__*/ new RegExp(floatRegex.source)\nconst hasColor = /*@__PURE__*/ new RegExp(colorRegex.source, \"i\")\n\nfunction test(v: any) {\n return (\n isNaN(v) &&\n typeof v === \"string\" &&\n (hasFloat.test(v) || hasColor.test(v))\n )\n}\n\nconst NUMBER_TOKEN = \"number\"\nconst COLOR_TOKEN = \"color\"\nconst VAR_TOKEN = \"var\"\nconst VAR_FUNCTION_TOKEN = \"var(\"\nconst SPLIT_TOKEN = \"${}\"\n\nexport type ComplexValues = Array<\n CSSVariableToken | AnyResolvedKeyframe | Color\n>\n\nexport interface ValueIndexes {\n color: number[]\n number: number[]\n var: number[]\n}\n\nexport interface ComplexValueInfo {\n values: ComplexValues\n split: string[]\n indexes: ValueIndexes\n types: Array<keyof ValueIndexes>\n}\n\n// this regex consists of the `singleCssVariableRegex|rgbHSLValueRegex|digitRegex`\nconst complexRegex =\n /var\\s*\\(\\s*--(?:[\\w-]+\\s*|[\\w-]+\\s*,(?:\\s*[^)(\\s]|\\s*\\((?:[^)(]|\\([^)(]*\\))*\\))+\\s*)\\)|#[\\da-f]{3,8}|(?:rgb|hsl)a?\\((?:-?[\\d.]+%?[,\\s]+){2}-?[\\d.]+%?\\s*(?:[,/]\\s*)?(?:\\b\\d+(?:\\.\\d+)?|\\.\\d+)?%?\\)|-?(?:\\d+(?:\\.\\d+)?|\\.\\d+)/giu\n\n/**\n * Whether analyseComplexValue(value) would find any values, without\n * tokenising the string. CSS variables are resolved before this is\n * used, so it's enough to look for a number or a color.\n */\nexport function hasComplexValues(value: AnyResolvedKeyframe) {\n const asString = value.toString()\n return hasFloat.test(asString) || hasColor.test(asString)\n}\n\nexport function analyseComplexValue(\n value: AnyResolvedKeyframe\n): ComplexValueInfo {\n const originalValue = value.toString()\n\n const values: ComplexValues = []\n const indexes: ValueIndexes = {\n color: [],\n number: [],\n var: [],\n }\n const types: Array<keyof ValueIndexes> = []\n\n let i = 0\n const tokenised = originalValue.replace(complexRegex, (parsedValue) => {\n if (color.test(parsedValue)) {\n indexes.color.push(i)\n types.push(COLOR_TOKEN)\n values.push(color.parse(parsedValue))\n } else if (parsedValue.startsWith(VAR_FUNCTION_TOKEN)) {\n indexes.var.push(i)\n types.push(VAR_TOKEN)\n values.push(parsedValue)\n } else {\n indexes.number.push(i)\n types.push(NUMBER_TOKEN)\n values.push(parseFloat(parsedValue))\n }\n ++i\n return SPLIT_TOKEN\n })\n const split = tokenised.split(SPLIT_TOKEN)\n\n return { values, split, indexes, types }\n}\n\nfunction parseComplexValue(v: AnyResolvedKeyframe) {\n return analyseComplexValue(v).values\n}\n\nfunction buildTransformer({ split, types }: ComplexValueInfo) {\n const numSections = split.length\n return (v: Array<CSSVariableToken | Color | number | string>) => {\n let output = \"\"\n for (let i = 0; i < numSections; i++) {\n output += split[i]\n if (v[i] !== undefined) {\n const type = types[i]\n if (type === NUMBER_TOKEN) {\n output += sanitize(v[i] as number)\n } else if (type === COLOR_TOKEN) {\n output += color.transform(v[i] as Color)\n } else {\n output += v[i]\n }\n }\n }\n\n return output\n }\n}\n\nfunction createTransformer(source: AnyResolvedKeyframe) {\n return buildTransformer(analyseComplexValue(source))\n}\n\nconst convertNumbersToZero = (v: number | string) =>\n typeof v === \"number\" ? 0 : color.test(v) ? color.getAnimatableNone(v) : v\n\n/**\n * Convert a parsed value to its zero equivalent, but preserve numbers\n * that act as divisors in CSS calc() expressions.\n *\n * analyseComplexValue extracts numbers from CSS strings and puts the\n * surrounding text into a `split` template array. For example:\n * \"calc(var(--gap) / 5)\" → values: [var(--gap), 5]\n * split: [\"calc(\", \" / \", \")\"]\n *\n * When building a zero-equivalent for animation, naively zeroing all\n * numbers turns the divisor into 0 → \"calc(var(--gap) / 0)\" → NaN.\n * We detect this by checking whether the text preceding a number\n * (split[i]) ends with \"/\" — the CSS calc division operator.\n */\nconst convertToZero = (\n value: ComplexValues[number],\n splitBefore: string\n): ComplexValues[number] => {\n if (typeof value === \"number\") {\n return splitBefore?.trim().endsWith(\"/\") ? value : 0\n }\n return convertNumbersToZero(value as string)\n}\n\nfunction getAnimatableNone(v: AnyResolvedKeyframe) {\n const info = analyseComplexValue(v)\n const transformer = buildTransformer(info)\n return transformer(\n info.values.map((value, i) => convertToZero(value, info.split[i]))\n )\n}\n\nexport const complex = {\n test,\n parse: parseComplexValue,\n createTransformer,\n getAnimatableNone,\n}\n","import { HSLA, RGBA } from \"../types\"\n\n// Adapted from https://gist.github.com/mjackson/5311256\nfunction hueToRgb(p: number, q: number, t: number) {\n if (t < 0) t += 1\n if (t > 1) t -= 1\n if (t < 1 / 6) return p + (q - p) * 6 * t\n if (t < 1 / 2) return q\n if (t < 2 / 3) return p + (q - p) * (2 / 3 - t) * 6\n return p\n}\n\nexport function hslaToRgba({ hue, saturation, lightness, alpha }: HSLA): RGBA {\n hue /= 360\n saturation /= 100\n lightness /= 100\n\n let red = 0\n let green = 0\n let blue = 0\n\n if (!saturation) {\n red = green = blue = lightness\n } else {\n const q =\n lightness < 0.5\n ? lightness * (1 + saturation)\n : lightness + saturation - lightness * saturation\n const p = 2 * lightness - q\n\n red = hueToRgb(p, q, hue + 1 / 3)\n green = hueToRgb(p, q, hue)\n blue = hueToRgb(p, q, hue - 1 / 3)\n }\n\n return {\n red: Math.round(red * 255),\n green: Math.round(green * 255),\n blue: Math.round(blue * 255),\n alpha,\n }\n}\n","export function mixImmediate<T>(a: T, b: T) {\n return (p: number) => (p > 0 ? b : a)\n}\n","/*\n Value in range from progress\n\n Given a lower limit and an upper limit, we return the value within\n that range as expressed by progress (usually a number from 0 to 1)\n\n So progress = 0.5 would change\n\n from -------- to\n\n to\n\n from ---- to\n\n E.g. from = 10, to = 20, progress = 0.5 => 15\n\n @param [number]: Lower limit of range\n @param [number]: Upper limit of range\n @param [number]: The progress between lower and upper limits expressed 0-1\n @return [number]: Value as calculated from progress within range (not limited within range)\n*/\nexport const mixNumber = (from: number, to: number, progress: number) => {\n return from + (to - from) * progress\n}\n","import { warning } from \"motion-utils\"\nimport { hex } from \"../../value/types/color/hex\"\nimport { hsla } from \"../../value/types/color/hsla\"\nimport { hslaToRgba } from \"../../value/types/color/hsla-to-rgba\"\nimport { rgba } from \"../../value/types/color/rgba\"\nimport { Color, HSLA, RGBA } from \"../../value/types/types\"\nimport { mixImmediate } from \"./immediate\"\nimport { mixNumber } from \"./number\"\n\n// Linear color space blending\n// Explained https://www.youtube.com/watch?v=LKnqECcg6Gw\n// Demonstrated http://codepen.io/osublake/pen/xGVVaN\nexport const mixLinearColor = (from: number, to: number, v: number) => {\n const fromExpo = from * from\n const expo = v * (to * to - fromExpo) + fromExpo\n return expo < 0 ? 0 : Math.sqrt(expo)\n}\n\nconst colorTypes = [hex, rgba, hsla]\nconst getColorType = (v: Color | string) =>\n colorTypes.find((type) => type.test(v))\n\nfunction asRGBA(color: Color | string) {\n const type = getColorType(color)\n\n if (!type) {\n warning(\n false,\n `'${color}' is not an animatable color. Use the equivalent color code instead.`,\n \"color-not-animatable\"\n )\n return false\n }\n\n let model = type.parse(color)\n\n if (type === hsla) {\n // TODO Remove this cast - needed since Motion's stricter typing\n model = hslaToRgba(model as HSLA)\n }\n\n return model as RGBA\n}\n\nexport const mixColor = (from: Color | string, to: Color | string) => {\n const fromRGBA = asRGBA(from)\n const toRGBA = asRGBA(to)\n\n if (!fromRGBA || !toRGBA) {\n return mixImmediate(from, to)\n }\n\n const blended = { ...fromRGBA }\n\n return (v: number) => {\n blended.red = mixLinearColor(fromRGBA.red, toRGBA.red, v)\n blended.green = mixLinearColor(fromRGBA.green, toRGBA.green, v)\n blended.blue = mixLinearColor(fromRGBA.blue, toRGBA.blue, v)\n blended.alpha = mixNumber(fromRGBA.alpha, toRGBA.alpha, v)\n return rgba.transform!(blended)\n }\n}\n","export const invisibleValues = new Set([\"none\", \"hidden\"])\n\n/**\n * Returns a function that, when provided a progress value between 0 and 1,\n * will return the \"none\" or \"hidden\" string only when the progress is that of\n * the origin or target.\n */\nexport function mixVisibility(origin: string, target: string) {\n if (invisibleValues.has(origin)) {\n return (p: number) => (p <= 0 ? origin : target)\n } else {\n return (p: number) => (p >= 1 ? target : origin)\n }\n}\n","import { pipe, warning } from \"motion-utils\"\nimport { AnyResolvedKeyframe } from \"../../animation/types\"\nimport { isCSSVariableToken } from \"../../animation/utils/is-css-variable\"\nimport { color } from \"../../value/types/color\"\nimport {\n analyseComplexValue,\n complex,\n ComplexValueInfo,\n ComplexValues,\n} from \"../../value/types/complex\"\nimport { HSLA, RGBA } from \"../../value/types/types\"\nimport { mixColor } from \"./color\"\nimport { mixImmediate } from \"./immediate\"\nimport { mixNumber as mixNumberImmediate } from \"./number\"\nimport { invisibleValues, mixVisibility } from \"./visibility\"\n\ntype MixableArray = Array<number | RGBA | HSLA | string>\ninterface MixableObject {\n [key: string]: AnyResolvedKeyframe | RGBA | HSLA\n}\n\nfunction mixNumber(a: number, b: number) {\n return (p: number) => mixNumberImmediate(a, b, p)\n}\n\nexport function getMixer<T>(a: T) {\n if (typeof a === \"number\") {\n return mixNumber\n } else if (typeof a === \"string\") {\n return isCSSVariableToken(a)\n ? mixImmediate\n : color.test(a)\n ? mixColor\n : mixComplex\n } else if (Array.isArray(a)) {\n return mixArray\n } else if (typeof a === \"object\") {\n return color.test(a) ? mixColor : mixObject\n }\n\n return mixImmediate\n}\n\nexport function mixArray(a: MixableArray, b: MixableArray) {\n const output = [...a]\n const numValues = output.length\n\n const blendValue = a.map((v, i) => getMixer(v)(v as any, b[i] as any))\n\n return (p: number) => {\n for (let i = 0; i < numValues; i++) {\n output[i] = blendValue[i](p) as any\n }\n return output\n }\n}\n\nexport function mixObject(a: MixableObject, b: MixableObject) {\n const output = { ...a, ...b }\n const blendValue: { [key: string]: (v: number) => any } = {}\n\n for (const key in output) {\n if (a[key] !== undefined && b[key] !== undefined) {\n blendValue[key] = getMixer(a[key])(\n a[key] as any,\n b[key] as any\n ) as any\n }\n }\n\n return (v: number) => {\n for (const key in blendValue) {\n output[key] = blendValue[key](v)\n }\n return output\n }\n}\n\nfunction matchOrder(\n origin: ComplexValueInfo,\n target: ComplexValueInfo\n): ComplexValues {\n const orderedOrigin: ComplexValues = []\n\n const pointers = { color: 0, var: 0, number: 0 }\n\n for (let i = 0; i < target.values.length; i++) {\n const type = target.types[i]\n const originIndex = origin.indexes[type][pointers[type]]\n const originValue = origin.values[originIndex] ?? 0\n\n orderedOrigin[i] = originValue\n\n pointers[type]++\n }\n\n return orderedOrigin\n}\n\nexport const mixComplex = (\n origin: AnyResolvedKeyframe,\n target: AnyResolvedKeyframe\n) => {\n const template = complex.createTransformer(target)\n const originStats = analyseComplexValue(origin)\n const targetStats = analyseComplexValue(target)\n const canInterpolate =\n originStats.indexes.var.length === targetStats.indexes.var.length &&\n originStats.indexes.color.length === targetStats.indexes.color.length &&\n originStats.indexes.number.length >= targetStats.indexes.number.length\n\n if (canInterpolate) {\n if (\n (invisibleValues.has(origin as string) &&\n !targetStats.values.length) ||\n (invisibleValues.has(target as string) &&\n !originStats.values.length)\n ) {\n return mixVisibility(origin as string, target as string)\n }\n\n return pipe(\n mixArray(matchOrder(originStats, targetStats), targetStats.values),\n template\n )\n } else {\n warning(\n true,\n `Complex values '${origin}' and '${target}' too different to mix. Ensure all colors are of the same type, and that each contains the same quantity of number and color values. Falling back to instant transition.`,\n \"complex-values-different\"\n )\n\n return mixImmediate(origin, target)\n }\n}\n","import { sanitize } from \"../../value/types/utils/sanitize\"\nimport { getMixer } from \"./complex\"\nimport { mixNumber as mixNumberImmediate } from \"./number\"\nimport { Mixer } from \"./types\"\n\n/**\n * A single number with an optional unit, e.g. \"50%\", \"-10px\", \".5em\".\n * Exponents don't match, so they fall through to the complex mixer.\n */\nconst unitValue = /^(-?(?:\\d+(?:\\.\\d*)?|\\.\\d+))([a-z%]*)$/iu\n\n/**\n * Most CSS values Motion mixes are a single number with a unit. Mixing\n * these directly produces the same output as the complex mixer\n * (\"25%\", \"0.33333px\") without tokenising both strings.\n */\nfunction mixUnit(from: string, to: string): Mixer<string> | undefined {\n const a = unitValue.exec(from)\n if (!a) return\n const b = unitValue.exec(to)\n if (!b || a[2] !== b[2]) return\n\n const unit = a[2]\n const origin = parseFloat(a[1])\n const target = parseFloat(b[1])\n\n return (p: number) =>\n sanitize(mixNumberImmediate(origin, target, p)) + unit\n}\n\nexport function mix<T>(from: T, to: T): Mixer<T>\nexport function mix(from: number, to: number, p: number): number\nexport function mix<T>(from: T, to: T, p?: T): Mixer<T> | number {\n if (\n typeof from === \"number\" &&\n typeof to === \"number\" &&\n typeof p === \"number\"\n ) {\n return mixNumberImmediate(from, to, p)\n }\n\n if (typeof from === \"string\" && typeof to === \"string\") {\n const mixer = mixUnit(from, to)\n if (mixer) return mixer as Mixer<T>\n }\n\n const mixer = getMixer(from)\n return mixer(from as any, to as any) as Mixer<T>\n}\n","import { cancelFrame, frame, frameData } from \"../../frameloop\"\nimport { time } from \"../../frameloop/sync-time\"\nimport { FrameData } from \"../../frameloop/types\"\nimport { Driver } from \"./types\"\n\nexport const frameloopDriver: Driver = (update) => {\n const passTimestamp = ({ timestamp }: FrameData) => update(timestamp)\n\n return {\n start: (keepAlive = true) => frame.update(passTimestamp, keepAlive),\n stop: () => cancelFrame(passTimestamp),\n /**\n * If we're processing this frame we can use the\n * framelocked timestamp to keep things in sync.\n */\n now: () => (frameData.isProcessing ? frameData.timestamp : time.now()),\n }\n}\n","import { EasingFunction } from \"motion-utils\"\n\nexport const generateLinearEasing = (\n easing: EasingFunction,\n duration: number, // as milliseconds\n resolution: number = 10 // as milliseconds\n): string => {\n let points = \"\"\n const numPoints = Math.max(Math.round(duration / resolution), 2)\n\n for (let i = 0; i < numPoints; i++) {\n points += Math.round(easing(i / (numPoints - 1)) * 10000) / 10000 + \", \"\n }\n\n return `linear(${points.substring(0, points.length - 2)})`\n}\n","import { KeyframeGenerator } from \"../../types\"\n\n/**\n * Implement a practical max duration for keyframe generation\n * to prevent infinite loops\n */\nexport const maxGeneratorDuration = 20_000\n\nexport function calcGeneratorDuration<T>(\n generator: KeyframeGenerator<T>,\n timeStep = 50,\n maxDuration = maxGeneratorDuration,\n keyframes?: T[]\n): number {\n let duration = 0\n let state = generator.next(duration)\n keyframes?.push(state.value)\n\n while (!state.done && duration < maxDuration) {\n duration += timeStep\n state = generator.next(duration)\n keyframes?.push(state.value)\n }\n\n return duration >= maxDuration ? Infinity : duration\n}\n","import { millisecondsToSeconds } from \"motion-utils\"\nimport { GeneratorFactory, Transition } from \"../../types\"\nimport { calcGeneratorDuration, maxGeneratorDuration } from \"./calc-duration\"\n\n/**\n * Create a progress => progress easing function from a generator.\n */\nexport function createGeneratorEasing(\n options: Transition,\n scale = 100,\n createGenerator: GeneratorFactory\n) {\n const generator = createGenerator({ ...options, keyframes: [0, scale] })\n const duration = Math.min(\n calcGeneratorDuration(generator),\n maxGeneratorDuration\n )\n\n return {\n type: \"keyframes\",\n ease: (progress: number) => {\n return generator.next(duration * progress).value / scale\n },\n duration: millisecondsToSeconds(duration),\n }\n}\n","import {\n clamp,\n millisecondsToSeconds,\n secondsToMilliseconds,\n warning,\n} from \"motion-utils\"\nimport {\n AnimationState,\n KeyframeGenerator,\n SpringOptions,\n Transition,\n ValueAnimationOptions,\n} from \"../types\"\nimport { generateLinearEasing } from \"../waapi/utils/linear\"\nimport {\n calcGeneratorDuration,\n maxGeneratorDuration,\n} from \"./utils/calc-duration\"\nimport { createGeneratorEasing } from \"./utils/create-generator-easing\"\n\nconst springDefaults = {\n // Default spring physics\n stiffness: 100,\n damping: 10,\n mass: 1.0,\n velocity: 0.0,\n\n // Default duration/bounce-based options\n duration: 800, // in ms\n bounce: 0.3,\n visualDuration: 0.3, // in seconds\n\n // Rest thresholds\n restSpeed: {\n granular: 0.01,\n default: 2,\n },\n restDelta: {\n granular: 0.005,\n default: 0.5,\n },\n\n // Limits\n minDuration: 0.01, // in seconds\n maxDuration: 10.0, // in seconds\n minDamping: 0.05,\n maxDamping: 1,\n}\n\nfunction calcAngularFreq(undampedFreq: number, dampingRatio: number) {\n return undampedFreq * Math.sqrt(1 - dampingRatio * dampingRatio)\n}\n\nconst rootIterations = 12\nfunction approximateRoot(\n envelope: (num: number) => number,\n derivative: (num: number) => number,\n initialGuess: number\n): number {\n let result = initialGuess\n for (let i = 1; i < rootIterations; i++) {\n result = result - envelope(result) / derivative(result)\n }\n return result\n}\n\n/**\n * This is ported from the Framer implementation of duration-based spring resolution.\n */\nconst safeMin = 0.001\n\nfunction findSpring({\n duration = springDefaults.duration,\n bounce = springDefaults.bounce,\n velocity = springDefaults.velocity,\n mass = springDefaults.mass,\n}: SpringOptions) {\n let envelope: (num: number) => number\n let derivative: (num: number) => number\n\n warning(\n duration <= secondsToMilliseconds(springDefaults.maxDuration),\n \"Spring duration must be 10 seconds or less\",\n \"spring-duration-limit\"\n )\n\n let dampingRatio = 1 - bounce\n\n /**\n * Restrict dampingRatio and duration to within acceptable ranges.\n */\n dampingRatio = clamp(\n springDefaults.minDamping,\n springDefaults.maxDamping,\n dampingRatio\n )\n duration = clamp(\n springDefaults.minDuration,\n springDefaults.maxDuration,\n millisecondsToSeconds(duration)\n )\n\n if (dampingRatio < 1) {\n /**\n * Underdamped spring\n */\n envelope = (undampedFreq) => {\n const exponentialDecay = undampedFreq * dampingRatio\n const delta = exponentialDecay * duration\n const a = exponentialDecay - velocity\n const b = calcAngularFreq(undampedFreq, dampingRatio)\n const c = Math.exp(-delta)\n return safeMin - (a / b) * c\n }\n\n derivative = (undampedFreq) => {\n const exponentialDecay = undampedFreq * dampingRatio\n const delta = exponentialDecay * duration\n const d = delta * velocity + velocity\n const e =\n dampingRatio *\n dampingRatio *\n undampedFreq *\n undampedFreq *\n duration\n const f = Math.exp(-delta)\n const g = calcAngularFreq(undampedFreq * undampedFreq, dampingRatio)\n const factor = -envelope(undampedFreq) + safeMin > 0 ? -1 : 1\n return (factor * ((d - e) * f)) / g\n }\n } else {\n /**\n * Critically-damped spring\n */\n envelope = (undampedFreq) => {\n const a = Math.exp(-undampedFreq * duration)\n const b = (undampedFreq - velocity) * duration + 1\n return -safeMin + a * b\n }\n\n derivative = (undampedFreq) => {\n const a = Math.exp(-undampedFreq * duration)\n const b = (velocity - undampedFreq) * (duration * duration)\n return a * b\n }\n }\n\n const initialGuess = 5 / duration\n const undampedFreq = approximateRoot(envelope, derivative, initialGuess)\n\n duration = secondsToMilliseconds(duration)\n if (isNaN(undampedFreq)) {\n return {\n stiffness: springDefaults.stiffness,\n damping: springDefaults.damping,\n duration,\n }\n } else {\n const stiffness = undampedFreq * undampedFreq * mass\n return {\n stiffness,\n damping: dampingRatio * 2 * Math.sqrt(mass * stiffness),\n duration,\n }\n }\n}\n\nconst durationKeys = [\"duration\", \"bounce\"]\nconst physicsKeys = [\"stiffness\", \"damping\", \"mass\"]\n\nfunction isSpringType(options: SpringOptions, keys: string[]) {\n return keys.some((key) => (options as any)[key] !== undefined)\n}\n\nfunction getSpringOptions(options: SpringOptions) {\n let springOptions = {\n velocity: springDefaults.velocity,\n stiffness: springDefaults.stiffness,\n damping: springDefaults.damping,\n mass: springDefaults.mass,\n isResolvedFromDuration: false,\n ...options,\n }\n // stiffness/damping/mass overrides duration/bounce\n if (\n !isSpringType(options, physicsKeys) &&\n isSpringType(options, durationKeys)\n ) {\n // Time-defined springs should ignore inherited velocity.\n // Velocity from interrupted animations can cause findSpring()\n // to compute wildly different spring parameters, leading to\n // massive oscillation on small-range animations.\n springOptions.velocity = 0\n\n if (options.visualDuration) {\n const visualDuration = options.visualDuration\n const root = (2 * Math.PI) / (visualDuration * 1.2)\n const stiffness = root * root\n const damping =\n 2 *\n clamp(0.05, 1, 1 - (options.bounce || 0)) *\n Math.sqrt(stiffness)\n\n springOptions = {\n ...springOptions,\n mass: springDefaults.mass,\n stiffness,\n damping,\n }\n } else {\n const derived = findSpring({ ...options, velocity: 0 })\n\n springOptions = {\n ...springOptions,\n ...derived,\n mass: springDefaults.mass,\n }\n springOptions.isResolvedFromDuration = true\n }\n }\n\n return springOptions\n}\n\nfunction spring(\n optionsOrVisualDuration:\n | ValueAnimationOptions<number>\n | number = springDefaults.visualDuration,\n bounce = springDefaults.bounce\n): KeyframeGenerator<number> {\n const options =\n typeof optionsOrVisualDuration !== \"object\"\n ? ({\n visualDuration: optionsOrVisualDuration,\n keyframes: [0, 1],\n bounce,\n } as ValueAnimationOptions<number>)\n : optionsOrVisualDuration\n\n const origin = options.keyframes[0]\n const target = options.keyframes[options.keyframes.length - 1]\n\n /**\n * This is the Iterator-spec return value. We ensure it's mutable rather than using a generator\n * to reduce GC during animation.\n */\n const state: AnimationState<number> = { done: false, value: origin }\n\n const {\n stiffness,\n damping,\n mass,\n duration,\n velocity,\n isResolvedFromDuration,\n } = getSpringOptions({\n ...options,\n velocity: -millisecondsToSeconds(options.velocity || 0),\n })\n\n const dampingRatio = damping / (2 * Math.sqrt(stiffness * mass))\n const undampedAngularFreq = millisecondsToSeconds(\n Math.sqrt(stiffness / mass)\n )\n const decay = dampingRatio * undampedAngularFreq\n\n /**\n * Everything that changes when the spring is retargeted: written by\n * retarget() and update(), read by the resolvers. Grouped on one object,\n * like the coefficients (c) below. Writing doubles to object fields\n * measured marginally faster than to captured let variables in optimised\n * code; neither allocates, so this is a grouping choice, not a GC one.\n */\n const s = {\n target,\n delta: target - origin,\n velocity: velocity || 0.0,\n restSpeed: 0,\n restDelta: 0,\n }\n\n /**\n * If we're working on a granular scale, use smaller defaults for determining\n * when the spring is finished.\n *\n * These defaults have been selected emprically based on what strikes a good\n * ratio between feeling good and finishing as soon as changes are imperceptible.\n */\n const setRestThresholds = () => {\n const isGranularScale = Math.abs(s.delta) < 5\n s.restSpeed =\n options.restSpeed ||\n (isGranularScale\n ? springDefaults.restSpeed.granular\n : springDefaults.restSpeed.default)\n s.restDelta =\n options.restDelta ||\n (isGranularScale\n ? springDefaults.restDelta.granular\n : springDefaults.restDelta.default)\n }\n setRestThresholds()\n\n let resolveSpring: (v: number) => number\n let resolveVelocity: (t: number) => number\n\n /**\n * Derives the coefficients that depend on origin, target and initial\n * velocity. Called once now and again whenever the spring is retargeted.\n */\n let update: VoidFunction\n\n if (dampingRatio < 1) {\n const angularFreq = calcAngularFreq(undampedAngularFreq, dampingRatio)\n\n /**\n * A is the position coefficient, sinC/cosC the coefficients of the\n * analytical derivative (px/ms). The exp/sin/cos terms depend only\n * on t, so they're memoized by t independently of the target: a\n * spring retargeted every frame samples the same t each frame and\n * skips the transcendentals entirely.\n */\n const c = { A: 0, sinC: 0, cosC: 0, t: -1, env: 0, sin: 0, cos: 0 }\n\n update = () => {\n c.A = (s.velocity + decay * s.delta) / angularFreq\n c.sinC = decay * c.A + s.delta * angularFreq\n c.cosC = decay * s.delta - c.A * angularFreq\n }\n\n const sample = (t: number) => {\n if (t !== c.t) {\n c.t = t\n c.env = Math.exp(-decay * t)\n c.sin = Math.sin(angularFreq * t)\n c.cos = Math.cos(angularFreq * t)\n }\n }\n\n // Underdamped spring\n resolveSpring = (t: number) => {\n sample(t)\n return s.target - c.env * (c.A * c.sin + s.delta * c.cos)\n }\n\n resolveVelocity = (t: number) => {\n sample(t)\n return c.env * (c.sinC * c.sin + c.cosC * c.cos)\n }\n } else if (dampingRatio === 1) {\n // Critically damped spring\n resolveSpring = (t: number) =>\n s.target -\n Math.exp(-undampedAngularFreq * t) *\n (s.delta + (s.velocity + undampedAngularFreq * s.delta) * t)\n\n // Analytical derivative of critically damped spring (px/ms)\n const c = { C: 0 }\n update = () => {\n c.C = s.velocity + undampedAngularFreq * s.delta\n }\n resolveVelocity = (t: number) =>\n Math.exp(-undampedAngularFreq * t) *\n (undampedAngularFreq * c.C * t - s.velocity)\n } else {\n // Overdamped spring\n const dampedAngularFreq =\n undampedAngularFreq * Math.sqrt(dampingRatio * dampingRatio - 1)\n\n resolveSpring = (t: number) => {\n const envelope = Math.exp(-decay * t)\n\n // When performing sinh or cosh values can hit Infinity so we cap them here\n const freqForT = Math.min(dampedAngularFreq * t, 300)\n\n return (\n s.target -\n (envelope *\n ((s.velocity + decay * s.delta) * Math.sinh(freqForT) +\n dampedAngularFreq * s.delta * Math.cosh(freqForT))) /\n dampedAngularFreq\n )\n }\n\n // Analytical derivative of overdamped spring (px/ms)\n const c = { P: 0, sinh: 0, cosh: 0 }\n update = () => {\n c.P = (s.velocity + decay * s.delta) / dampedAngularFreq\n c.sinh = decay * c.P - s.delta * dampedAngularFreq\n c.cosh = decay * s.delta - c.P * dampedAngularFreq\n }\n resolveVelocity = (t: number) => {\n const envelope = Math.exp(-decay * t)\n const freqForT = Math.min(dampedAngularFreq * t, 300)\n return (\n envelope *\n (c.sinh * Math.sinh(freqForT) + c.cosh * Math.cosh(freqForT))\n )\n }\n }\n\n update()\n\n /**\n * Time-defined springs ignore inherited velocity, see getSpringOptions.\n */\n const ignoreVelocity =\n !isSpringType(options, physicsKeys) &&\n isSpringType(options, durationKeys)\n\n const calculatedDuration = isResolvedFromDuration ? duration || null : null\n\n const generator = {\n calculatedDuration,\n /**\n * Aim the spring at a new target from its current position and\n * velocity, reusing the resolved physics and closures.\n */\n retarget: (keyframes: number[], newVelocity: number) => {\n s.target = keyframes[keyframes.length - 1]\n s.delta = s.target - keyframes[0]\n s.velocity = ignoreVelocity\n ? 0\n : -millisecondsToSeconds(newVelocity)\n // Default thresholds depend on the scale of the new delta\n if (!(options.restSpeed && options.restDelta)) setRestThresholds()\n // Invalidate any duration lazily cached by JSAnimation\n generator.calculatedDuration = calculatedDuration\n state.done = false\n update()\n },\n velocity: (t: number) => secondsToMilliseconds(resolveVelocity(t)),\n next: (t: number) => {\n const current = resolveSpring(t)\n\n if (!isResolvedFromDuration) {\n const currentVelocity = secondsToMilliseconds(\n resolveVelocity(t)\n )\n state.done =\n Math.abs(currentVelocity) <= s.restSpeed &&\n Math.abs(s.target - current) <= s.restDelta\n } else {\n state.done = t >= duration!\n }\n\n state.value = state.done ? s.target : current\n\n return state\n },\n toString: () => {\n const easingDuration = Math.min(\n calcGeneratorDuration(generator),\n maxGeneratorDuration\n )\n\n const easing = generateLinearEasing(\n (progress: number) =>\n generator.next(easingDuration * progress).value,\n easingDuration,\n 30\n )\n\n return easingDuration + \"ms \" + easing\n },\n toTransition: () => {},\n }\n\n return generator\n}\n\nspring.applyToOptions = (options: Transition) => {\n const generatorOptions = createGeneratorEasing(options as any, 100, spring)\n\n options.ease = generatorOptions.ease\n options.duration = secondsToMilliseconds(generatorOptions.duration)\n options.type = \"keyframes\"\n return options\n}\n\nexport { spring }\n","import {\n AnimationState,\n KeyframeGenerator,\n ValueAnimationOptions,\n} from \"../types\"\nimport { spring as createSpring } from \"./spring\"\n\nexport function inertia({\n keyframes,\n velocity = 0.0,\n power = 0.8,\n timeConstant = 325,\n bounceDamping = 10,\n bounceStiffness = 500,\n modifyTarget,\n min,\n max,\n restDelta = 0.5,\n restSpeed,\n}: ValueAnimationOptions<number>): KeyframeGenerator<number> {\n const origin = keyframes[0]\n\n const state: AnimationState<number> = {\n done: false,\n value: origin,\n }\n\n const isOutOfBounds = (v: number) => v < min! || v > max!\n\n const nearestBoundary = (v: number) => {\n if (min === undefined) return max\n if (max === undefined) return min\n\n return Math.abs(min - v) < Math.abs(max - v) ? min : max\n }\n\n let amplitude = power * velocity\n const ideal = origin + amplitude\n const target = modifyTarget === undefined ? ideal : modifyTarget(ideal)\n\n /**\n * If the target has changed we need to re-calculate the amplitude, otherwise\n * the animation will start from the wrong position.\n */\n if (target !== ideal) amplitude = target - origin\n\n const calcDelta = (t: number) => -amplitude * Math.exp(-t / timeConstant)\n\n const applyFriction = (t: number) => {\n const delta = calcDelta(t)\n state.done = Math.abs(delta) <= restDelta\n state.value = state.done ? target : target + delta\n }\n\n /**\n * Ideally this would resolve for t in a stateless way, we could\n * do that by always precalculating the animation but as we know\n * this will be done anyway we can assume that spring will\n * be discovered during that.\n */\n let timeReachedBoundary: number | undefined\n let spring: KeyframeGenerator<number> | undefined\n\n const checkCatchBoundary = (t: number) => {\n if (!isOutOfBounds(state.value)) return\n\n timeReachedBoundary = t\n\n spring = createSpring({\n keyframes: [state.value, nearestBoundary(state.value)!],\n /**\n * The friction curve is target + calcDelta(t), so its exact\n * derivative is -calcDelta(t) / timeConstant in units/ms,\n * converted here to the units/second expected by spring.\n */\n velocity: (-calcDelta(t) / timeConstant) * 1000,\n damping: bounceDamping,\n stiffness: bounceStiffness,\n restDelta,\n restSpeed,\n })\n }\n\n checkCatchBoundary(0)\n\n return {\n calculatedDuration: null,\n next: (t: number) => {\n /**\n * We need to resolve the friction to figure out if we need a\n * spring but we don't want to do this twice per frame. So here\n * we flag if we updated for this frame and later if we did\n * we can skip doing it again.\n */\n let hasUpdatedFrame = false\n if (!spring && timeReachedBoundary === undefined) {\n hasUpdatedFrame = true\n applyFriction(t)\n checkCatchBoundary(t)\n }\n\n /**\n * If we have a spring and the provided t is beyond the moment the friction\n * animation crossed the min/max boundary, use the spring.\n */\n if (timeReachedBoundary !== undefined && t >= timeReachedBoundary) {\n return spring!.next(t - timeReachedBoundary)\n } else {\n !hasUpdatedFrame && applyFriction(t)\n return state\n }\n },\n }\n}\n","import {\n clamp,\n EasingFunction,\n invariant,\n MotionGlobalConfig,\n noop,\n pipe,\n progress,\n} from \"motion-utils\"\nimport { mix } from \"./mix\"\nimport { Mixer, MixerFactory } from \"./mix/types\"\n\nexport interface InterpolateOptions<T> {\n clamp?: boolean\n ease?: EasingFunction | EasingFunction[]\n mixer?: MixerFactory<T>\n}\n\nfunction createMixers<T>(\n output: T[],\n ease?: EasingFunction | EasingFunction[],\n customMixer?: MixerFactory<T>\n) {\n const mixers: Array<Mixer<T>> = []\n const mixerFactory: MixerFactory<T> =\n customMixer || MotionGlobalConfig.mix || mix\n const numMixers = output.length - 1\n\n for (let i = 0; i < numMixers; i++) {\n let mixer = mixerFactory(output[i], output[i + 1])\n\n if (ease) {\n const easingFunction = Array.isArray(ease) ? ease[i] || noop : ease\n mixer = pipe(easingFunction, mixer) as Mixer<T>\n }\n\n mixers.push(mixer)\n }\n\n return mixers\n}\n\n/**\n * Create a function that maps from a numerical input array to a generic output array.\n *\n * Accepts:\n * - Numbers\n * - Colors (hex, hsl, hsla, rgb, rgba)\n * - Complex (combinations of one or more numbers or strings)\n *\n * ```jsx\n * const mixColor = interpolate([0, 1], ['#fff', '#000'])\n *\n * mixColor(0.5) // 'rgba(128, 128, 128, 1)'\n * ```\n *\n * TODO Revisit this approach once we've moved to data models for values,\n * probably not needed to pregenerate mixer functions.\n *\n * @public\n */\nexport function interpolate<T>(\n input: number[],\n output: T[],\n { clamp: isClamp = true, ease, mixer }: InterpolateOptions<T> = {}\n): (v: number) => T {\n const inputLength = input.length\n\n invariant(\n inputLength === output.length,\n \"Both input and output ranges must be the same length\",\n \"range-length\"\n )\n\n /**\n * If we're only provided a single input, we can just make a function\n * that returns the output.\n */\n if (inputLength === 1) return () => output[0]\n if (inputLength === 2 && output[0] === output[1]) return () => output[1]\n\n const isZeroDeltaRange = input[0] === input[1]\n\n // If input runs highest -> lowest, reverse both arrays\n if (input[0] > input[inputLength - 1]) {\n input = [...input].reverse()\n output = [...output].reverse()\n }\n\n const mixers = createMixers(output, ease, mixer)\n const numMixers = mixers.length\n\n const interpolator = (v: number): T => {\n if (isZeroDeltaRange && v < input[0]) return output[0]\n\n let i = 0\n\n if (numMixers > 1) {\n for (; i < input.length - 2; i++) {\n if (v < input[i + 1]) break\n }\n }\n\n const progressInRange = progress(input[i], input[i + 1], v)\n\n return mixers[i](progressInRange)\n }\n\n return isClamp\n ? (v: number) =>\n interpolator(clamp(input[0], input[inputLength - 1], v))\n : interpolator\n}\n","import { progress } from \"motion-utils\"\nimport { mixNumber } from \"../../../utils/mix/number\"\n\nexport function fillOffset(offset: number[], remaining: number): void {\n const min = offset[offset.length - 1]\n for (let i = 1; i <= remaining; i++) {\n const offsetProgress = progress(0, remaining, i)\n offset.push(mixNumber(min, 1, offsetProgress))\n }\n}\n","import { fillOffset } from \"./fill\"\n\nexport function defaultOffset(arr: any[]): number[] {\n const offset = [0]\n fillOffset(offset, arr.length - 1)\n return offset\n}\n","export function convertOffsetToTimes(offset: number[], duration: number) {\n return offset.map((o) => o * duration)\n}\n","import {\n clamp,\n easeInOut,\n easingDefinitionToFunction,\n EasingFunction,\n isEasingArray,\n MotionGlobalConfig,\n} from \"motion-utils\"\nimport { interpolate } from \"../../utils/interpolate\"\nimport { mix } from \"../../utils/mix\"\nimport { defaultOffset } from \"../keyframes/offsets/default\"\nimport { convertOffsetToTimes } from \"../keyframes/offsets/time\"\nimport {\n AnimationState,\n AnyResolvedKeyframe,\n KeyframeGenerator,\n ValueAnimationOptions,\n} from \"../types\"\n\nexport function defaultEasing(\n values: any[],\n easing?: EasingFunction\n): EasingFunction[] {\n return values.map(() => easing || easeInOut).splice(0, values.length - 1)\n}\n\nexport function keyframes<T extends AnyResolvedKeyframe>({\n duration = 300,\n keyframes: keyframeValues,\n times,\n ease = \"easeInOut\",\n}: ValueAnimationOptions<T>): KeyframeGenerator<T> {\n /**\n * Easing functions can be externally defined as strings. Here we convert them\n * into actual functions.\n */\n const easingFunctions = isEasingArray(ease)\n ? ease.map(easingDefinitionToFunction)\n : easingDefinitionToFunction(ease)\n\n /**\n * This is the Iterator-spec return value. We ensure it's mutable rather than using a generator\n * to reduce GC during animation.\n */\n const state: AnimationState<T> = {\n done: false,\n value: keyframeValues[0],\n }\n\n /**\n * Fast setup path for two keyframes one easing.\n */\n if (\n keyframeValues.length === 2 &&\n !Array.isArray(easingFunctions) &&\n (!times ||\n times.length !== 2 ||\n (times[0] === 0 && times[1] === 1))\n ) {\n const [origin, target] = keyframeValues\n const mixer =\n origin === target\n ? undefined\n : (MotionGlobalConfig.mix || mix)(origin, target)\n\n return {\n calculatedDuration: duration,\n next: (t: number) => {\n state.value = mixer\n ? mixer(\n easingFunctions(\n duration > 0 ? clamp(0, 1, t / duration) : 1\n )\n )\n : target\n state.done = t >= duration\n return state\n },\n }\n }\n\n /**\n * Create a times array based on the provided 0-1 offsets\n */\n const absoluteTimes = convertOffsetToTimes(\n // Only use the provided offsets if they're the correct length\n // TODO Maybe we should warn here if there's a length mismatch\n times && times.length === keyframeValues.length\n ? times\n : defaultOffset(keyframeValues),\n duration\n )\n\n const mapTimeToKeyframe = interpolate<T>(absoluteTimes, keyframeValues, {\n ease: Array.isArray(easingFunctions)\n ? easingFunctions\n : defaultEasing(keyframeValues, easingFunctions),\n })\n\n return {\n calculatedDuration: duration,\n next: (t: number) => {\n state.value = mapTimeToKeyframe(t)\n state.done = t >= duration\n return state\n },\n }\n}\n","import { velocityPerSecond } from \"motion-utils\"\nimport { KeyframeGenerator } from \"../../types\"\n\nconst velocitySampleDuration = 5 // ms\n\nexport function getGeneratorVelocity(\n resolveValue: (v: number) => number,\n t: number,\n current: number\n) {\n const prevT = Math.max(t - velocitySampleDuration, 0)\n return velocityPerSecond(current - resolveValue(prevT), t - prevT)\n}\n\n/**\n * A generator's velocity at time t in units/second: analytical where the\n * generator provides it (springs), otherwise by finite difference. Before\n * the animation has started this is its initial velocity.\n */\nexport function calcGeneratorVelocity(\n generator: KeyframeGenerator<any>,\n t: number,\n initialVelocity = 0\n): number {\n if (t <= 0) return initialVelocity\n\n return generator.velocity\n ? generator.velocity(t)\n : getGeneratorVelocity(\n (s) => generator.next(s).value as number,\n t,\n generator.next(t).value as number\n )\n}\n","import { AnimationPlaybackOptions } from \"../types\"\n\nconst isNotNull = (value: unknown) => value !== null\n\nexport function getFinalKeyframe<T>(\n keyframes: T[],\n { repeat, repeatType = \"loop\" }: AnimationPlaybackOptions,\n finalKeyframe?: T,\n speed: number = 1\n): T {\n const resolvedKeyframes = keyframes.filter(isNotNull)\n const useFirstKeyframe =\n speed < 0 || (repeat && repeatType !== \"loop\" && repeat % 2 === 1)\n const index = useFirstKeyframe ? 0 : resolvedKeyframes.length - 1\n\n return !index || finalKeyframe === undefined\n ? resolvedKeyframes[index]\n : finalKeyframe\n}\n","import { inertia } from \"../generators/inertia\"\nimport { keyframes } from \"../generators/keyframes\"\nimport { spring } from \"../generators/spring\"\nimport { GeneratorFactory, ValueAnimationTransition } from \"../types\"\n\nconst transitionTypeMap: { [key: string]: GeneratorFactory } = {\n decay: inertia,\n inertia,\n tween: keyframes,\n keyframes: keyframes,\n spring,\n}\n\nexport function replaceTransitionType(transition: ValueAnimationTransition) {\n if (typeof transition.type === \"string\") {\n transition.type = transitionTypeMap[transition.type]\n }\n}\n","import { frameData } from \"../../frameloop/frame\"\nimport { time } from \"../../frameloop/sync-time\"\n\ninterface MotionInspectBase {\n animation: unknown\n timestamp: number\n frameTimestamp: number\n frameIsProcessing: boolean\n}\n\ninterface MotionInspectAnimationStart extends MotionInspectBase {\n kind: \"animation-start\"\n options: object\n}\n\ninterface MotionInspectLayoutAnimationStart extends MotionInspectBase {\n kind: \"layout-animation-start\"\n node: unknown\n}\n\ntype MotionInspectRecord =\n | MotionInspectAnimationStart\n | MotionInspectLayoutAnimationStart\n\ntype MotionInspectHook = (record: MotionInspectRecord) => void\n\ntype InspectGlobal = typeof globalThis & {\n __MOTION_INSPECT__?: MotionInspectHook\n}\n\nfunction baseRecord<K extends MotionInspectRecord[\"kind\"]>(\n kind: K,\n animation: unknown\n) {\n return {\n kind,\n animation,\n timestamp: time.now(),\n frameTimestamp: frameData.timestamp,\n frameIsProcessing: frameData.isProcessing,\n }\n}\n\n/**\n * Notify an optional inspector without adding a public Motion API.\n *\n * The record is a raw firehose: the live animation handle, the concrete\n * animation's internal options object untouched (timing fields in\n * internal milliseconds, name/keyframes/element/motionValue still\n * attached), a timestamp and the raw frameloop state at notify time.\n * All interpretation belongs to the consumer behind\n * globalThis.__MOTION_INSPECT__.\n */\nexport function notifyAnimationStart(\n animation: unknown,\n options: object,\n transition?: object\n): void {\n const notify = (globalThis as InspectGlobal).__MOTION_INSPECT__\n if (!notify) return\n\n try {\n notify({\n ...baseRecord(\"animation-start\", animation),\n options: transition ? { ...options, ...transition } : options,\n })\n } catch {}\n}\n\n/**\n * Layout animations drive a projection node's progress rather than a\n * property, so the record forwards the live node itself: it carries the\n * DOM instance, the layout options (layoutId) and the progress handle.\n * Fired inside the frame.update that starts the animation, so nodes\n * animating in the same layout commit share frameTimestamp.\n */\nexport function notifyLayoutAnimationStart(\n animation: unknown,\n node: unknown\n): void {\n const notify = (globalThis as InspectGlobal).__MOTION_INSPECT__\n if (!notify) return\n\n try {\n notify({\n ...baseRecord(\"layout-animation-start\", animation),\n node,\n })\n } catch {}\n}\n","export class WithPromise {\n /**\n * The promise and its resolver are only created when `finished` is\n * first read. Most animations are never awaited, so this saves a\n * Promise allocation per value animation.\n */\n private _finished?: Promise<void>\n\n private _resolve?: VoidFunction\n\n private isResolved = false\n\n get finished() {\n if (!this._finished) {\n this._finished = this.isResolved\n ? Promise.resolve()\n : new Promise<void>((resolve) => {\n this._resolve = resolve\n })\n }\n\n return this._finished\n }\n\n protected updateFinished() {\n this._finished = this._resolve = undefined\n this.isResolved = false\n }\n\n protected notifyFinished() {\n this.isResolved = true\n this._resolve?.()\n }\n\n /**\n * Allows the animation to be awaited.\n *\n * @deprecated Use `finished` instead.\n */\n then(onResolve: VoidFunction, onReject?: VoidFunction) {\n return this.finished.then(onResolve, onReject)\n }\n}\n","import {\n clamp,\n invariant,\n millisecondsToSeconds,\n pipe,\n secondsToMilliseconds,\n} from \"motion-utils\"\nimport { time } from \"../frameloop/sync-time\"\nimport { mix } from \"../utils/mix\"\nimport { Mixer } from \"../utils/mix/types\"\nimport { frameloopDriver } from \"./drivers/frame\"\nimport { DriverControls } from \"./drivers/types\"\nimport { inertia } from \"./generators/inertia\"\nimport { keyframes as keyframesGenerator } from \"./generators/keyframes\"\nimport { calcGeneratorDuration } from \"./generators/utils/calc-duration\"\nimport { calcGeneratorVelocity } from \"./generators/utils/velocity\"\nimport { getFinalKeyframe } from \"./keyframes/get-final\"\nimport {\n AnimationPlaybackControlsWithThen,\n AnimationState,\n GeneratorFactory,\n KeyframeGenerator,\n TimelineWithFallback,\n ValueAnimationOptions,\n} from \"./types\"\nimport { replaceTransitionType } from \"./utils/replace-transition-type\"\nimport { notifyAnimationStart } from \"./utils/notify-inspector\"\nimport { WithPromise } from \"./utils/WithPromise\"\n\nconst percentToProgress = (percent: number) => percent / 100\n\nexport class JSAnimation<T extends number | string>\n extends WithPromise\n implements AnimationPlaybackControlsWithThen\n{\n state: AnimationPlayState = \"idle\"\n\n startTime: number | null = null\n\n /**\n * The driver that's controlling the animation loop. Normally this is a requestAnimationFrame loop\n * but in tests we can pass in a synchronous loop.\n */\n private driver?: DriverControls\n\n private isStopped = false\n\n private generator: KeyframeGenerator<T>\n\n private calculatedDuration: number\n\n private resolvedDuration: number\n\n private totalDuration: number\n\n private options: ValueAnimationOptions<T>\n\n /**\n * The current time of the animation.\n */\n private currentTime: number = 0\n\n /**\n * The time at which the animation was paused.\n */\n private holdTime: number | null = null\n\n /**\n * Playback speed as a factor. 0 would be stopped, -1 reverse and 2 double speed.\n */\n private playbackSpeed = 1\n\n /*\n * If our generator doesn't support mixing numbers, we need to replace keyframes with\n * [0, 100] and then make a function that maps that to the actual keyframes.\n *\n * 100 is chosen instead of 1 as it works nicer with spring animations.\n */\n private mixKeyframes: Mixer<T> | undefined\n\n private mirroredGenerator: KeyframeGenerator<T> | undefined\n\n /**\n * Reusable state object for the delay phase to avoid\n * allocating a new object every frame.\n */\n private delayState: AnimationState<T> = {\n done: false,\n value: undefined as unknown as T,\n }\n\n constructor(options: ValueAnimationOptions<T>) {\n super()\n\n this.options = options\n this.initAnimation()\n this.play()\n\n if (options.autoplay === false) this.pause()\n\n notifyAnimationStart(this, this.options)\n }\n\n initAnimation() {\n const { options } = this\n\n replaceTransitionType(options)\n\n const {\n type = keyframesGenerator,\n repeat = 0,\n repeatDelay = 0,\n repeatType,\n velocity = 0,\n } = options\n let { keyframes } = options\n\n const generatorFactory =\n (type as GeneratorFactory) || keyframesGenerator\n\n if (\n process.env.NODE_ENV !== \"production\" &&\n generatorFactory !== keyframesGenerator\n ) {\n invariant(\n keyframes.length <= 2,\n `Only two keyframes currently supported with spring and inertia animations. Trying to animate ${keyframes}`,\n \"spring-two-frames\"\n )\n }\n\n if (\n generatorFactory !== keyframesGenerator &&\n typeof keyframes[0] !== \"number\"\n ) {\n this.mixKeyframes = pipe(\n percentToProgress,\n mix(keyframes[0], keyframes[1])\n ) as (t: number) => T\n\n keyframes = [0 as T, 100 as T]\n }\n\n const generator = generatorFactory(\n keyframes === options.keyframes\n ? options\n : { ...options, keyframes }\n )\n\n /**\n * If we have a mirror repeat type we need to create a second generator that outputs the\n * mirrored (not reversed) animation and later ping pong between the two generators.\n */\n if (repeatType === \"mirror\") {\n this.mirroredGenerator = generatorFactory({\n ...options,\n keyframes: [...keyframes].reverse(),\n velocity: -velocity,\n })\n }\n\n /**\n * If duration is undefined and we have repeat options,\n * we need to calculate a duration from the generator.\n *\n * We set it to the generator itself to cache the duration.\n * Any timeline resolver will need to have already precalculated\n * the duration by this step.\n */\n if (generator.calculatedDuration === null) {\n generator.calculatedDuration = calcGeneratorDuration(generator)\n }\n\n const { calculatedDuration } = generator\n this.calculatedDuration = calculatedDuration\n this.resolvedDuration = calculatedDuration + repeatDelay\n this.totalDuration = this.resolvedDuration * (repeat + 1) - repeatDelay\n this.generator = generator\n }\n\n updateTime(timestamp: number) {\n const animationTime =\n Math.round(timestamp - this.startTime!) * this.playbackSpeed\n\n // Update currentTime\n if (this.holdTime !== null) {\n this.currentTime = this.holdTime\n } else {\n // Rounding the time because floating point arithmetic is not always accurate, e.g. 3000.367 - 1000.367 =\n // 2000.0000000000002. This is a problem when we are comparing the currentTime with the duration, for\n // example.\n this.currentTime = animationTime\n }\n }\n\n tick(timestamp: number, sample = false) {\n const {\n generator,\n totalDuration,\n mixKeyframes,\n mirroredGenerator,\n resolvedDuration,\n calculatedDuration,\n } = this\n\n if (this.startTime === null) return generator.next(0)\n\n const {\n delay = 0,\n keyframes,\n repeat,\n repeatType,\n repeatDelay,\n type,\n onUpdate,\n finalKeyframe,\n } = this.options\n\n /**\n * requestAnimationFrame timestamps can come through as lower than\n * the startTime as set by performance.now(). Here we prevent this,\n * though in the future it could be possible to make setting startTime\n * a pending operation that gets resolved here.\n */\n if (this.speed > 0) {\n this.startTime = Math.min(this.startTime, timestamp)\n } else if (this.speed < 0) {\n this.startTime = Math.min(\n timestamp - totalDuration / this.speed,\n this.startTime\n )\n }\n\n if (sample) {\n this.currentTime = timestamp\n } else {\n this.updateTime(timestamp)\n }\n\n // Rebase on delay\n const timeWithoutDelay =\n this.currentTime - delay * (this.playbackSpeed >= 0 ? 1 : -1)\n const isInDelayPhase =\n this.playbackSpeed >= 0\n ? timeWithoutDelay < 0\n : timeWithoutDelay > totalDuration\n this.currentTime = Math.max(timeWithoutDelay, 0)\n\n // If this animation has finished, set the current time to the total duration.\n if (this.state === \"finished\" && this.holdTime === null) {\n this.currentTime = totalDuration\n }\n\n let elapsed = this.currentTime\n let frameGenerator = generator\n\n if (repeat) {\n /**\n * Get the current progress (0-1) of the animation. If t is >\n * than duration we'll get values like 2.5 (midway through the\n * third iteration)\n */\n const progress =\n Math.min(this.currentTime, totalDuration) / resolvedDuration\n\n /**\n * Get the current iteration (0 indexed). For instance the floor of\n * 2.5 is 2.\n */\n let currentIteration = Math.floor(progress)\n\n /**\n * Get the current progress of the iteration by taking the remainder\n * so 2.5 is 0.5 through iteration 2\n */\n let iterationProgress = progress % 1.0\n\n /**\n * If iteration progress is 1 we count that as the end\n * of the previous iteration.\n */\n if (!iterationProgress && progress >= 1) {\n iterationProgress = 1\n }\n\n iterationProgress === 1 && currentIteration--\n\n currentIteration = Math.min(currentIteration, repeat + 1)\n\n /**\n * Reverse progress if we're not running in \"normal\" direction\n */\n\n const isOddIteration = Boolean(currentIteration % 2)\n if (isOddIteration) {\n if (repeatType === \"reverse\") {\n iterationProgress = 1 - iterationProgress\n if (repeatDelay) {\n iterationProgress -= repeatDelay / resolvedDuration\n }\n } else if (repeatType === \"mirror\") {\n frameGenerator = mirroredGenerator!\n }\n }\n\n elapsed = clamp(0, 1, iterationProgress) * resolvedDuration\n }\n\n /**\n * If we're in negative time, set state as the initial keyframe.\n * This prevents delay: x, duration: 0 animations from finishing\n * instantly.\n */\n let state: AnimationState<T>\n if (isInDelayPhase) {\n this.delayState.value = keyframes[0]\n state = this.delayState\n } else {\n state = frameGenerator.next(elapsed)\n }\n\n if (mixKeyframes && !isInDelayPhase) {\n state.value = mixKeyframes(state.value as number)\n }\n\n let { done } = state\n\n if (!isInDelayPhase && calculatedDuration !== null) {\n done =\n this.playbackSpeed >= 0\n ? this.currentTime >= totalDuration\n : this.currentTime <= 0\n }\n\n const isAnimationFinished =\n this.holdTime === null &&\n (this.state === \"finished\" || (this.state === \"running\" && done))\n\n // TODO: The exception for inertia could be cleaner here\n if (isAnimationFinished && type !== inertia) {\n state.value = getFinalKeyframe(\n keyframes,\n this.options,\n finalKeyframe,\n this.speed\n )\n }\n\n if (onUpdate) {\n onUpdate(state.value)\n }\n\n if (isAnimationFinished) {\n this.finish()\n }\n\n return state\n }\n\n /**\n * Allows the returned animation to be awaited or promise-chained. Currently\n * resolves when the animation finishes at all but in a future update could/should\n * reject if its cancels.\n */\n then(resolve: VoidFunction, reject?: VoidFunction) {\n return this.finished.then(resolve, reject)\n }\n\n get duration() {\n return millisecondsToSeconds(this.calculatedDuration)\n }\n\n get iterationDuration() {\n const { delay = 0 } = this.options || {}\n return this.duration + millisecondsToSeconds(delay)\n }\n\n get time() {\n return millisecondsToSeconds(this.currentTime)\n }\n\n set time(newTime: number) {\n newTime = secondsToMilliseconds(newTime)\n this.currentTime = newTime\n\n if (\n this.startTime === null ||\n this.holdTime !== null ||\n this.playbackSpeed === 0\n ) {\n this.holdTime = newTime\n } else if (this.driver) {\n this.startTime = this.driver.now() - newTime / this.playbackSpeed\n }\n\n if (this.driver) {\n this.driver.start(false)\n } else {\n this.startTime = 0\n this.state = \"paused\"\n this.holdTime = newTime\n this.tick(newTime)\n }\n }\n\n /**\n * Returns the generator's velocity at the current time in units/second.\n * Uses the analytical derivative when available (springs), avoiding\n * the MotionValue's frame-dependent velocity estimation.\n */\n getGeneratorVelocity(): number {\n return calcGeneratorVelocity(\n this.generator,\n this.currentTime,\n this.options.velocity\n )\n }\n\n get speed() {\n return this.playbackSpeed\n }\n\n set speed(newSpeed: number) {\n const hasChanged = this.playbackSpeed !== newSpeed\n\n if (hasChanged && this.driver) {\n this.updateTime(time.now())\n }\n\n this.playbackSpeed = newSpeed\n\n if (hasChanged && this.driver) {\n this.time = millisecondsToSeconds(this.currentTime)\n }\n }\n\n play() {\n if (this.isStopped) return\n\n const { driver = frameloopDriver, startTime } = this.options\n\n if (!this.driver) {\n this.driver = driver((timestamp) => this.tick(timestamp))\n }\n\n this.options.onPlay?.()\n\n const now = this.driver.now()\n\n if (this.state === \"finished\") {\n this.updateFinished()\n this.startTime = now\n } else if (this.holdTime !== null) {\n this.startTime = now - this.holdTime\n } else if (!this.startTime) {\n this.startTime = startTime ?? now\n }\n\n if (this.state === \"finished\" && this.speed < 0) {\n this.startTime += this.calculatedDuration\n }\n\n this.holdTime = null\n\n /**\n * Set playState to running only after we've used it in\n * the previous logic.\n */\n this.state = \"running\"\n\n this.driver.start()\n }\n\n pause() {\n this.state = \"paused\"\n this.updateTime(time.now())\n this.holdTime = this.currentTime\n }\n\n /**\n * This method is bound to the instance to fix a pattern where\n * animation.stop is returned as a reference from a useEffect.\n */\n stop = () => {\n const { motionValue } = this.options\n if (motionValue && motionValue.updatedAt !== time.now()) {\n this.tick(time.now())\n }\n\n this.isStopped = true\n if (this.state === \"idle\") return\n this.teardown()\n this.options.onStop?.()\n }\n\n complete() {\n if (this.state !== \"running\") {\n this.play()\n }\n\n this.state = \"finished\"\n this.holdTime = null\n }\n\n finish() {\n this.notifyFinished()\n this.teardown()\n this.state = \"finished\"\n\n this.options.onComplete?.()\n }\n\n cancel() {\n this.holdTime = null\n this.startTime = 0\n this.tick(0)\n this.teardown()\n this.options.onCancel?.()\n }\n\n private teardown() {\n this.state = \"idle\"\n this.stopDriver()\n this.startTime = this.holdTime = null\n }\n\n private stopDriver() {\n if (!this.driver) return\n this.driver.stop()\n this.driver = undefined\n }\n\n sample(sampleTime: number): AnimationState<T> {\n this.startTime = 0\n return this.tick(sampleTime, true)\n }\n\n attachTimeline(timeline: TimelineWithFallback): VoidFunction {\n if (this.options.allowFlatten) {\n this.options.type = \"keyframes\"\n this.options.ease = \"linear\"\n this.initAnimation()\n }\n\n this.driver?.stop()\n return timeline.observe(this)\n }\n}\n\n// Legacy function support\nexport function animateValue<T extends number | string>(\n options: ValueAnimationOptions<T>\n) {\n return new JSAnimation(options)\n}\n","import { complex } from \".\"\nimport { floatRegex } from \"../utils/float-regex\"\n\n/**\n * Properties that should default to 1 or 100%\n */\nconst maxDefaults = new Set([\"brightness\", \"contrast\", \"saturate\", \"opacity\"])\n\nfunction applyDefaultFilter(v: string) {\n const [name, value] = v.slice(0, -1).split(\"(\")\n\n if (name === \"drop-shadow\") return v\n\n const [number] = value.match(floatRegex) || []\n if (!number) return v\n\n const unit = value.replace(number, \"\")\n let defaultValue = maxDefaults.has(name) ? 1 : 0\n if (number !== value) defaultValue *= 100\n\n return name + \"(\" + defaultValue + unit + \")\"\n}\n\nconst functionRegex = /\\b([a-z-]*)\\(.*?\\)/gu\n\nexport const filter = {\n ...complex,\n getAnimatableNone: (v: string) => {\n const functions = v.match(functionRegex)\n return functions ? functions.map(applyDefaultFilter).join(\" \") : v\n },\n}\n","import { complex } from \".\"\nimport { AnyResolvedKeyframe } from \"../../../animation/types\"\n\nexport const mask = {\n ...complex,\n getAnimatableNone: (v: AnyResolvedKeyframe) => {\n const parsed = complex.parse(v)\n const transformer = complex.createTransformer(v)\n return transformer(\n parsed.map((v) =>\n typeof v === \"number\" ? 0 : typeof v === \"object\" ? { ...v, alpha: 1 } : v\n )\n )\n },\n}\n","import { number } from \"./numbers\"\n\nexport const int = {\n ...number,\n transform: Math.round,\n}\n","import { alpha, scale } from \"../numbers\"\nimport { degrees, progressPercentage, px } from \"../numbers/units\"\nimport { ValueTypeMap } from \"./types\"\n\nexport const transformValueTypes: ValueTypeMap = {\n rotate: degrees,\n /**\n * Internal channel for `transition.path` orientToPath. Composed onto\n * `rotate` at the transform-build sites so the user's `rotate` is\n * never read or overwritten. Not part of `transformPropOrder`.\n */\n pathRotation: degrees,\n rotateX: degrees,\n rotateY: degrees,\n rotateZ: degrees,\n scale,\n scaleX: scale,\n scaleY: scale,\n scaleZ: scale,\n skew: degrees,\n skewX: degrees,\n skewY: degrees,\n distance: px,\n translateX: px,\n translateY: px,\n translateZ: px,\n x: px,\n y: px,\n z: px,\n perspective: px,\n transformPerspective: px,\n opacity: alpha,\n originX: progressPercentage,\n originY: progressPercentage,\n originZ: px,\n}\n","import { int } from \"../int\"\nimport { alpha } from \"../numbers\"\nimport { px } from \"../numbers/units\"\nimport { transformValueTypes } from \"./transform\"\nimport { ValueTypeMap } from \"./types\"\n\nexport const numberValueTypes: ValueTypeMap = {\n // Border props\n borderWidth: px,\n borderTopWidth: px,\n borderRightWidth: px,\n borderBottomWidth: px,\n borderLeftWidth: px,\n borderRadius: px,\n borderTopLeftRadius: px,\n borderTopRightRadius: px,\n borderBottomRightRadius: px,\n borderBottomLeftRadius: px,\n\n // Positioning props\n width: px,\n maxWidth: px,\n height: px,\n maxHeight: px,\n top: px,\n right: px,\n bottom: px,\n left: px,\n inset: px,\n insetBlock: px,\n insetBlockStart: px,\n insetBlockEnd: px,\n insetInline: px,\n insetInlineStart: px,\n insetInlineEnd: px,\n\n // Spacing props\n padding: px,\n paddingTop: px,\n paddingRight: px,\n paddingBottom: px,\n paddingLeft: px,\n paddingBlock: px,\n paddingBlockStart: px,\n paddingBlockEnd: px,\n paddingInline: px,\n paddingInlineStart: px,\n paddingInlineEnd: px,\n margin: px,\n marginTop: px,\n marginRight: px,\n marginBottom: px,\n marginLeft: px,\n marginBlock: px,\n marginBlockStart: px,\n marginBlockEnd: px,\n marginInline: px,\n marginInlineStart: px,\n marginInlineEnd: px,\n\n // Typography\n fontSize: px,\n\n // Misc\n backgroundPositionX: px,\n backgroundPositionY: px,\n\n ...transformValueTypes,\n zIndex: int,\n\n // SVG\n fillOpacity: alpha,\n strokeOpacity: alpha,\n numOctaves: int,\n}\n","import { color } from \"../color\"\nimport { filter } from \"../complex/filter\"\nimport { mask } from \"../complex/mask\"\nimport { numberValueTypes } from \"./number\"\nimport { ValueTypeMap } from \"./types\"\n\n/**\n * A map of default value types for common values\n */\nexport const defaultValueTypes: ValueTypeMap = {\n ...numberValueTypes,\n\n // Color props\n color,\n backgroundColor: color,\n outlineColor: color,\n fill: color,\n stroke: color,\n\n // Border props\n borderColor: color,\n borderTopColor: color,\n borderRightColor: color,\n borderBottomColor: color,\n borderLeftColor: color,\n filter,\n WebkitFilter: filter,\n mask,\n WebkitMask: mask,\n}\n\n/**\n * Gets the default ValueType for the provided value key\n */\nexport const getDefaultValueType = (key: string) => defaultValueTypes[key]\n","import { complex } from \"../complex\"\nimport { filter } from \"../complex/filter\"\nimport { mask } from \"../complex/mask\"\nimport { getDefaultValueType } from \"../maps/defaults\"\n\nconst customTypes = /*@__PURE__*/ new Set([filter, mask])\n\nexport function getAnimatableNone(key: string, value: string) {\n let defaultValueType = getDefaultValueType(key)\n if (!customTypes.has(defaultValueType as any)) defaultValueType = complex\n // If value is not recognised as animatable, ie \"none\", create an animatable version origin based on the target\n return defaultValueType.getAnimatableNone\n ? defaultValueType.getAnimatableNone(value)\n : undefined\n}\n","import { UnresolvedValueKeyframe, ValueKeyframe } from \"../../types\"\n\nexport function fillWildcards(\n keyframes: ValueKeyframe[] | UnresolvedValueKeyframe[]\n) {\n for (let i = 1; i < keyframes.length; i++) {\n keyframes[i] ??= keyframes[i - 1]\n }\n}\n","import { transformPropOrder } from \"../utils/keys-transform\"\n\nconst radToDeg = (rad: number) => (rad * 180) / Math.PI\n\ntype MatrixParser = (values: number[]) => number\n\ntype MatrixParsers = Record<\n (typeof transformPropOrder)[number],\n number | MatrixParser\n>\n\nconst rotate = (v: number[]) => {\n const angle = radToDeg(Math.atan2(v[1], v[0]))\n return rebaseAngle(angle)\n}\n\nconst matrix2dParsers: MatrixParsers = {\n x: 4,\n y: 5,\n translateX: 4,\n translateY: 5,\n scaleX: 0,\n scaleY: 3,\n scale: (v) => (Math.abs(v[0]) + Math.abs(v[3])) / 2,\n rotate,\n rotateZ: rotate,\n skewX: (v) => radToDeg(Math.atan(v[1])),\n skewY: (v) => radToDeg(Math.atan(v[2])),\n skew: (v) => (Math.abs(v[1]) + Math.abs(v[2])) / 2,\n} as const\n\nconst rebaseAngle = (angle: number) => {\n angle = angle % 360\n if (angle < 0) angle += 360\n return angle\n}\n\nconst rotateZ = rotate\n\nconst scaleX = (v: number[]) => Math.sqrt(v[0] * v[0] + v[1] * v[1])\nconst scaleY = (v: number[]) => Math.sqrt(v[4] * v[4] + v[5] * v[5])\n\nconst matrix3dParsers: MatrixParsers = {\n x: 12,\n y: 13,\n z: 14,\n translateX: 12,\n translateY: 13,\n translateZ: 14,\n scaleX,\n scaleY,\n scale: (v) => (scaleX(v) + scaleY(v)) / 2,\n rotateX: (v) => rebaseAngle(radToDeg(Math.atan2(v[6], v[5]))),\n rotateY: (v) => rebaseAngle(radToDeg(Math.atan2(-v[2], v[0]))),\n rotateZ,\n rotate: rotateZ,\n skewX: (v) => radToDeg(Math.atan(v[4])),\n skewY: (v) => radToDeg(Math.atan(v[1])),\n skew: (v) => (Math.abs(v[1]) + Math.abs(v[4])) / 2,\n} as const\n\nexport function defaultTransformValue(name: string): number {\n return name.includes(\"scale\") ? 1 : 0\n}\n\nexport function parseValueFromTransform(\n transform: string | undefined,\n name: string\n): number {\n if (!transform || transform === \"none\") {\n return defaultTransformValue(name)\n }\n\n const matrix3dMatch = transform.match(/^matrix3d\\(([-\\d.e\\s,]+)\\)$/u)\n\n let parsers: MatrixParsers\n let match: RegExpMatchArray | null\n\n if (matrix3dMatch) {\n parsers = matrix3dParsers\n match = matrix3dMatch\n } else {\n const matrix2dMatch = transform.match(/^matrix\\(([-\\d.e\\s,]+)\\)$/u)\n\n parsers = matrix2dParsers\n match = matrix2dMatch\n }\n\n if (!match) {\n return defaultTransformValue(name)\n }\n\n const valueParser = parsers[name]\n const values = match[1].split(\",\").map(convertTransformToNumber)\n\n return typeof valueParser === \"function\"\n ? valueParser(values)\n : values[valueParser]\n}\n\nexport const readTransformValue = (instance: HTMLElement, name: string) => {\n const { transform = \"none\" } = getComputedStyle(instance)\n return parseValueFromTransform(transform, name)\n}\n\nfunction convertTransformToNumber(value: string): number {\n return parseFloat(value.trim())\n}\n","/**\n * Generate a list of every possible transform key.\n */\nexport const transformPropOrder = [\n \"transformPerspective\",\n \"x\",\n \"y\",\n \"z\",\n \"translateX\",\n \"translateY\",\n \"translateZ\",\n \"scale\",\n \"scaleX\",\n \"scaleY\",\n \"rotate\",\n \"rotateX\",\n \"rotateY\",\n \"rotateZ\",\n \"skew\",\n \"skewX\",\n \"skewY\",\n]\n\n/**\n * A quick lookup for transform props.\n *\n * `pathRotation` is a transform for routing purposes (skipped from raw\n * style application, wired to the transform composite, flags transform\n * dirty) but is intentionally NOT in `transformPropOrder` — it is\n * composed onto `rotate` at the build sites, not serialized in its own\n * slot, and must stay out of the order-array consumers (parse-transform,\n * unit-conversion, keys-position).\n */\nexport const transformProps = /*@__PURE__*/ (() =>\n new Set([...transformPropOrder, \"pathRotation\"]))()\n","import type { Box } from \"motion-utils\"\nimport { parseValueFromTransform } from \"../../../render/dom/parse-transform\"\nimport { transformPropOrder } from \"../../../render/utils/keys-transform\"\nimport { MotionValue } from \"../../../value\"\nimport { number } from \"../../../value/types/numbers\"\nimport { px } from \"../../../value/types/numbers/units\"\nimport { ValueType } from \"../../../value/types/types\"\nimport { AnyResolvedKeyframe } from \"../../types\"\nimport { WithRender } from \"../types\"\n\nexport const isNumOrPxType = (v?: ValueType): v is ValueType =>\n v === number || v === px\n\n/**\n * Measures a positional value in pixels from an element's computed style.\n * The bounding box is only measured on demand as it forces layout and is\n * affected by transforms.\n */\ntype GetActualMeasurementInPixels = (\n computedStyle: Partial<CSSStyleDeclaration>,\n measureBox: () => Box\n) => number\n\nconst transformKeys = new Set([\"x\", \"y\", \"z\"])\nconst nonTranslationalTransformKeys = transformPropOrder.filter(\n (key) => !transformKeys.has(key)\n)\n\ntype RemovedTransforms = [string, AnyResolvedKeyframe][]\n\n/**\n * Reset any bounding box-changing transforms so the element can be\n * measured. Returns the values to restore. Values already at their\n * default don't change the box, so they're left alone: an element with\n * only `rotate: 0` doesn't need to be re-rendered before measuring.\n */\nexport function removeNonTranslationalTransform(visualElement: WithRender) {\n const removedTransforms: RemovedTransforms = []\n\n nonTranslationalTransformKeys.forEach((key) => {\n const value: MotionValue<AnyResolvedKeyframe> | undefined =\n visualElement.getValue(key)\n if (value !== undefined) {\n const current = value.get()\n const reset = key.startsWith(\"scale\") ? 1 : 0\n\n if (current === reset) return\n\n removedTransforms.push([key, current])\n value.set(reset)\n }\n })\n\n return removedTransforms\n}\n\n/**\n * Values that can only be measured from the bounding box. Elements with\n * these values need bounding box-changing transforms removed first.\n */\nexport const boxDependentValues = new Set([\"bottom\", \"right\"])\n\n/**\n * Computed width/height is already in pixels and unaffected by\n * transforms. It's \"auto\" for elements without a layout box (e.g. inline),\n * in which case we fall back to measuring the bounding box.\n */\nfunction measureDimension(\n computed: string | undefined,\n measureBox: () => Box,\n axis: \"x\" | \"y\",\n paddingStart: string,\n paddingEnd: string,\n boxSizing?: string\n) {\n const px = parseFloat(computed as string)\n if (!isNaN(px)) return px\n\n const { min, max } = measureBox()[axis]\n const size = max - min\n return boxSizing === \"border-box\"\n ? size\n : size - parseFloat(paddingStart) - parseFloat(paddingEnd)\n}\n\nexport const positionalValues: { [key: string]: GetActualMeasurementInPixels } =\n {\n // Dimensions\n width: (\n { width, paddingLeft = \"0\", paddingRight = \"0\", boxSizing },\n measureBox\n ) =>\n measureDimension(\n width,\n measureBox,\n \"x\",\n paddingLeft,\n paddingRight,\n boxSizing\n ),\n height: (\n { height, paddingTop = \"0\", paddingBottom = \"0\", boxSizing },\n measureBox\n ) =>\n measureDimension(\n height,\n measureBox,\n \"y\",\n paddingTop,\n paddingBottom,\n boxSizing\n ),\n\n top: ({ top }) => parseFloat(top as string),\n left: ({ left }) => parseFloat(left as string),\n bottom: ({ top }, measureBox) => {\n const { y } = measureBox()\n return parseFloat(top as string) + (y.max - y.min)\n },\n right: ({ left }, measureBox) => {\n const { x } = measureBox()\n return parseFloat(left as string) + (x.max - x.min)\n },\n\n // Transform\n x: ({ transform }) => parseValueFromTransform(transform, \"x\"),\n y: ({ transform }) => parseValueFromTransform(transform, \"y\"),\n }\n\n// Alias translate longform names\npositionalValues.translateX = positionalValues.x\npositionalValues.translateY = positionalValues.y\n","import { isNumericalString, isZeroValueString } from \"motion-utils\"\nimport { frame } from \"../../frameloop\"\nimport { MotionValue } from \"../../value\"\nimport { complex } from \"../../value/types/complex\"\nimport { getAnimatableNone } from \"../../value/types/utils/animatable-none\"\nimport { AnyResolvedKeyframe } from \"../types\"\nimport { WithRender } from \"./types\"\nimport { fillWildcards } from \"./utils/fill-wildcards\"\nimport {\n boxDependentValues,\n removeNonTranslationalTransform,\n} from \"./utils/unit-conversion\"\n\nexport type UnresolvedKeyframes<T extends AnyResolvedKeyframe> = Array<T | null>\n\nexport type ResolvedKeyframes<T extends AnyResolvedKeyframe> = Array<T>\n\nconst toResolve = new Set<KeyframeResolver>()\nlet isScheduled = false\nlet anyNeedsMeasurement = false\nlet isForced = false\n\nfunction measureAllKeyframes() {\n if (anyNeedsMeasurement) {\n const resolversToMeasure: KeyframeResolver[] = []\n const elementsToMeasure = new Set<WithRender>()\n const elementsToUntransform = new Set<WithRender>()\n\n toResolve.forEach((resolver) => {\n if (!resolver.needsMeasurement) return\n\n resolversToMeasure.push(resolver)\n elementsToMeasure.add(resolver.element!)\n\n if (boxDependentValues.has(resolver.name!)) {\n elementsToUntransform.add(resolver.element!)\n }\n })\n\n const transformsToRestore = new Map<\n WithRender,\n [string, AnyResolvedKeyframe][]\n >()\n\n /**\n * Write pass\n * Values measured from the bounding box need bounding box-changing\n * transforms removed first. Values read from computed style don't.\n */\n elementsToUntransform.forEach((element: WithRender) => {\n const removedTransforms = removeNonTranslationalTransform(\n element as any\n )\n\n if (!removedTransforms.length) return\n\n transformsToRestore.set(element, removedTransforms)\n\n element.render()\n })\n\n // Read\n resolversToMeasure.forEach((resolver) => resolver.measureInitialState())\n\n // Write\n elementsToMeasure.forEach((element: WithRender) => {\n element.render()\n\n const restore = transformsToRestore.get(element)\n if (restore) {\n restore.forEach(([key, value]) => {\n element.getValue(key)?.set(value)\n })\n }\n })\n\n // Read\n resolversToMeasure.forEach((resolver) => resolver.measureEndState())\n\n // Write\n resolversToMeasure.forEach((resolver) => {\n if (resolver.suspendedScrollY !== undefined) {\n window.scrollTo(0, resolver.suspendedScrollY)\n }\n })\n }\n\n anyNeedsMeasurement = false\n isScheduled = false\n\n toResolve.forEach((resolver) => resolver.complete(isForced))\n toResolve.clear()\n}\n\nfunction readAllKeyframes() {\n toResolve.forEach((resolver) => {\n resolver.readKeyframes()\n\n if (resolver.needsMeasurement) {\n anyNeedsMeasurement = true\n }\n })\n}\n\nexport function flushKeyframeResolvers() {\n isForced = true\n readAllKeyframes()\n measureAllKeyframes()\n isForced = false\n}\n\n/**\n * Normalise a value read from the subject into an animation origin: a\n * number read as a string (\"0\", \"200\") becomes a number, and a value\n * that isn't animatable (e.g. \"none\") but whose target is becomes an\n * animatable zero in the shape of the target.\n */\nfunction readOrigin(\n value: AnyResolvedKeyframe | null | undefined,\n name: string,\n target: AnyResolvedKeyframe | null\n) {\n if (typeof value === \"string\") {\n if (isNumericalString(value) || isZeroValueString(value)) {\n return parseFloat(value)\n } else if (!complex.test(value) && complex.test(target)) {\n return getAnimatableNone(name, target as string)\n }\n }\n\n return value ?? undefined\n}\n\nexport type OnKeyframesResolved<T extends AnyResolvedKeyframe> = (\n resolvedKeyframes: ResolvedKeyframes<T>,\n finalKeyframe: T,\n forced: boolean\n) => void\n\nexport class KeyframeResolver<T extends AnyResolvedKeyframe = any> {\n name?: string\n element?: WithRender\n finalKeyframe?: T\n suspendedScrollY?: number\n\n protected unresolvedKeyframes: UnresolvedKeyframes<AnyResolvedKeyframe>\n\n protected motionValue?: MotionValue<T>\n private onComplete: OnKeyframesResolved<T>\n\n state: \"pending\" | \"scheduled\" | \"complete\" = \"pending\"\n\n /**\n * Track whether this resolver is async. If it is, it'll be added to the\n * resolver queue and flushed in the next frame. Resolvers that aren't going\n * to trigger read/write thrashing don't need to be async.\n */\n private isAsync = false\n\n /**\n * Track whether this resolver needs to perform a measurement\n * to resolve its keyframes.\n */\n needsMeasurement = false\n\n constructor(\n unresolvedKeyframes: UnresolvedKeyframes<AnyResolvedKeyframe>,\n onComplete: OnKeyframesResolved<T>,\n name?: string,\n motionValue?: MotionValue<T>,\n element?: WithRender,\n isAsync = false\n ) {\n this.unresolvedKeyframes = [...unresolvedKeyframes]\n this.onComplete = onComplete\n this.name = name\n this.motionValue = motionValue\n this.element = element\n this.isAsync = isAsync\n }\n\n scheduleResolve() {\n this.state = \"scheduled\"\n\n if (this.isAsync) {\n toResolve.add(this)\n\n if (!isScheduled) {\n isScheduled = true\n frame.read(readAllKeyframes)\n frame.resolveKeyframes(measureAllKeyframes)\n }\n } else {\n this.readKeyframes()\n this.complete()\n }\n }\n\n readKeyframes() {\n const { unresolvedKeyframes, name, element, motionValue } = this\n\n // If initial keyframe is null we need to read it from the DOM\n if (unresolvedKeyframes[0] === null) {\n const currentValue = motionValue?.get()\n\n // TODO: This doesn't work if the final keyframe is a wildcard\n const finalKeyframe =\n unresolvedKeyframes[unresolvedKeyframes.length - 1]\n\n if (currentValue !== undefined) {\n unresolvedKeyframes[0] = currentValue\n } else if (element && name) {\n const valueAsRead = readOrigin(\n element.readValue(name, finalKeyframe),\n name,\n finalKeyframe\n )\n\n if (valueAsRead !== undefined) {\n unresolvedKeyframes[0] = valueAsRead\n }\n }\n\n if (unresolvedKeyframes[0] === undefined) {\n unresolvedKeyframes[0] = finalKeyframe\n }\n\n if (motionValue && currentValue === undefined) {\n motionValue.set(unresolvedKeyframes[0] as T)\n }\n }\n\n fillWildcards(unresolvedKeyframes)\n }\n\n setFinalKeyframe() {}\n measureInitialState() {}\n renderEndStyles() {}\n measureEndState() {}\n\n complete(isForcedComplete = false) {\n this.state = \"complete\"\n\n this.onComplete(\n this.unresolvedKeyframes as ResolvedKeyframes<T>,\n this.finalKeyframe as T,\n isForcedComplete\n )\n\n toResolve.delete(this)\n }\n\n cancel() {\n if (this.state === \"scheduled\") {\n toResolve.delete(this)\n this.state = \"pending\"\n }\n }\n\n resume() {\n if (this.state === \"pending\") this.scheduleResolve()\n }\n}\n","export const isCSSVar = (name: string) => name.startsWith(\"--\")\n","import { AnyResolvedKeyframe } from \"../../animation/types\"\nimport { isCSSVar } from \"./is-css-var\"\n\nexport function setStyle(\n element: HTMLElement | SVGElement,\n name: string,\n value: AnyResolvedKeyframe\n) {\n isCSSVar(name)\n ? element.style.setProperty(name, value as string)\n : (element.style[name as any] = value as string)\n}\n","/**\n * Add the ability for test suites to manually set support flags\n * to better test more environments.\n */\nexport const supportsFlags: Record<string, boolean | undefined> = {}\n","import { memo } from \"motion-utils\"\nimport { supportsFlags } from \"./flags\"\n\nexport function memoSupports<T extends any>(\n callback: () => T,\n supportsFlag: keyof typeof supportsFlags\n) {\n const memoized = memo(callback)\n return () => supportsFlags[supportsFlag] ?? memoized()\n}\n","import { ProgressTimeline } from \"../..\"\nimport { memoSupports } from \"./memo\"\n\ndeclare global {\n interface Window {\n ScrollTimeline: ScrollTimeline\n ViewTimeline: ViewTimeline\n }\n}\n\ndeclare class ScrollTimeline implements ProgressTimeline {\n constructor(options: ScrollOptions)\n\n currentTime: null | { value: number }\n\n cancel?: VoidFunction\n}\n\ndeclare class ViewTimeline implements ProgressTimeline {\n constructor(options: { subject: Element; axis?: string })\n\n currentTime: null | { value: number }\n\n cancel?: VoidFunction\n}\n\nexport const supportsScrollTimeline = /* @__PURE__ */ memoSupports(\n () => window.ScrollTimeline !== undefined,\n \"scrollTimeline\"\n)\n\nexport const supportsViewTimeline = /* @__PURE__ */ memoSupports(\n () => window.ViewTimeline !== undefined,\n \"viewTimeline\"\n)\n","import { memoSupports } from \"./memo\"\n\nexport const supportsLinearEasing = /*@__PURE__*/ memoSupports(() => {\n try {\n document\n .createElement(\"div\")\n .animate({ opacity: 0 }, { easing: \"linear(0, 1)\" })\n } catch (e) {\n return false\n }\n return true\n}, \"linearEasing\")\n","import { BezierDefinition } from \"motion-utils\"\n\nexport const cubicBezierAsString = ([a, b, c, d]: BezierDefinition) =>\n `cubic-bezier(${a}, ${b}, ${c}, ${d})`\n","import { cubicBezierAsString } from \"./cubic-bezier\"\n\nexport const supportedWaapiEasing = {\n linear: \"linear\",\n ease: \"ease\",\n easeIn: \"ease-in\",\n easeOut: \"ease-out\",\n easeInOut: \"ease-in-out\",\n circIn: /*@__PURE__*/ cubicBezierAsString([0, 0.65, 0.55, 1]),\n circOut: /*@__PURE__*/ cubicBezierAsString([0.55, 0, 1, 0.45]),\n backIn: /*@__PURE__*/ cubicBezierAsString([0.31, 0.01, 0.66, -0.59]),\n backOut: /*@__PURE__*/ cubicBezierAsString([0.33, 1.53, 0.69, 0.99]),\n}\n","import { Easing, isBezierDefinition } from \"motion-utils\"\nimport { supportsLinearEasing } from \"../../../utils/supports/linear-easing\"\nimport { generateLinearEasing } from \"../utils/linear\"\nimport { cubicBezierAsString } from \"./cubic-bezier\"\nimport { supportedWaapiEasing } from \"./supported\"\n\nexport function mapEasingToNativeEasing(\n easing: Easing | Easing[] | undefined,\n duration: number\n): undefined | string | string[] {\n if (!easing) {\n return undefined\n } else if (typeof easing === \"function\") {\n return supportsLinearEasing()\n ? generateLinearEasing(easing, duration)\n : \"ease-out\"\n } else if (isBezierDefinition(easing)) {\n return cubicBezierAsString(easing)\n } else if (Array.isArray(easing)) {\n return easing.map(\n (segmentEasing) =>\n (mapEasingToNativeEasing(segmentEasing, duration) as string) ||\n supportedWaapiEasing.easeOut\n )\n } else {\n return supportedWaapiEasing[easing as keyof typeof supportedWaapiEasing]\n }\n}\n","import { ValueKeyframesDefinition, ValueTransition } from \"../types\"\nimport { mapEasingToNativeEasing } from \"./easing/map-easing\"\n\nexport function startWaapiAnimation(\n element: Element,\n valueName: string,\n keyframes: ValueKeyframesDefinition,\n {\n delay = 0,\n duration = 300,\n repeat = 0,\n repeatType = \"loop\",\n ease = \"easeOut\",\n times,\n }: ValueTransition = {},\n pseudoElement: string | undefined = undefined\n) {\n const keyframeOptions: PropertyIndexedKeyframes = {\n [valueName]: keyframes as string[],\n }\n if (times) keyframeOptions.offset = times\n\n const easing = mapEasingToNativeEasing(ease, duration)\n\n /**\n * If this is an easing array, apply to keyframes, not animation as a whole\n */\n if (Array.isArray(easing)) keyframeOptions.easing = easing\n\n const options: KeyframeAnimationOptions = {\n delay,\n duration,\n easing: !Array.isArray(easing) ? easing : \"linear\",\n fill: \"both\",\n iterations: repeat + 1,\n direction: repeatType === \"reverse\" ? \"alternate\" : \"normal\",\n }\n\n if (pseudoElement) options.pseudoElement = pseudoElement\n\n return element.animate(keyframeOptions, options)\n}\n","import { AnimationGeneratorType, GeneratorFactory } from \"../../types\"\n\nexport function isGenerator(\n type?: AnimationGeneratorType\n): type is GeneratorFactory {\n return typeof type === \"function\" && \"applyToOptions\" in type\n}\n","import { ValueTransition } from \"../../../animation/types\"\nimport { supportsLinearEasing } from \"../../../utils/supports/linear-easing\"\nimport { isGenerator } from \"../../generators/utils/is-generator\"\n\nexport function applyGeneratorOptions({\n type,\n ...options\n}: ValueTransition): ValueTransition {\n if (isGenerator(type) && supportsLinearEasing()) {\n return type.applyToOptions!(options)\n } else {\n options.duration ??= 300\n options.ease ??= \"easeOut\"\n }\n\n return options\n}\n","import {\n invariant,\n millisecondsToSeconds,\n noop,\n secondsToMilliseconds,\n} from \"motion-utils\"\nimport { setStyle } from \"../render/dom/style-set\"\nimport { supportsScrollTimeline } from \"../utils/supports/scroll-timeline\"\nimport { getFinalKeyframe } from \"./keyframes/get-final\"\nimport {\n AnimationPlaybackControlsWithThen,\n AnyResolvedKeyframe,\n DOMValueAnimationOptions,\n TimelineWithFallback,\n} from \"./types\"\nimport { WithPromise } from \"./utils/WithPromise\"\nimport { notifyAnimationStart } from \"./utils/notify-inspector\"\nimport { startWaapiAnimation } from \"./waapi/start-waapi-animation\"\nimport { applyGeneratorOptions } from \"./waapi/utils/apply-generator\"\n\nexport interface NativeAnimationOptions<V extends AnyResolvedKeyframe = number>\n extends DOMValueAnimationOptions<V> {\n pseudoElement?: string\n startTime?: number\n}\n\n/**\n * NativeAnimation implements AnimationPlaybackControls for the browser's Web Animations API.\n */\nexport class NativeAnimation<T extends AnyResolvedKeyframe>\n extends WithPromise\n implements AnimationPlaybackControlsWithThen\n{\n /**\n * The interfaced Web Animation API animation\n */\n protected animation: Animation\n\n protected finishedTime: number | null = null\n\n protected options: NativeAnimationOptions\n\n private allowFlatten: boolean\n\n private isStopped = false\n\n private isPseudoElement: boolean\n\n /**\n * Tracks a manually-set start time that takes precedence over WAAPI's\n * dynamic startTime. This is cleared when play() or time setter is called,\n * allowing WAAPI to take over timing.\n */\n protected manualStartTime: number | null = null\n\n constructor(options?: NativeAnimationOptions) {\n super()\n\n if (!options) return\n\n const {\n element,\n name,\n keyframes,\n pseudoElement,\n allowFlatten = false,\n finalKeyframe,\n onComplete,\n } = options as any\n\n this.isPseudoElement = Boolean(pseudoElement)\n\n this.allowFlatten = allowFlatten\n this.options = options\n\n invariant(\n typeof options.type !== \"string\",\n `Mini animate() doesn't support \"type\" as a string.`,\n \"mini-spring\"\n )\n\n const transition = applyGeneratorOptions(options)\n\n this.animation = startWaapiAnimation(\n element,\n name,\n keyframes,\n transition,\n pseudoElement\n )\n\n if (transition.autoplay === false) {\n this.animation.pause()\n }\n\n this.animation.onfinish = () => {\n this.finishedTime = this.time\n\n if (!pseudoElement) {\n const keyframe = getFinalKeyframe(\n keyframes as any,\n this.options as any,\n finalKeyframe,\n this.speed\n )\n if (this.updateMotionValue) {\n this.updateMotionValue(keyframe)\n }\n\n /**\n * If we can, we want to commit the final style as set by the user,\n * rather than the computed keyframe value supplied by the animation.\n * We always do this, even when a motion value is present, to prevent\n * a visual flash in Firefox where the WAAPI animation's fill is removed\n * during cancel() before the scheduled render can apply the correct value.\n */\n setStyle(element, name, keyframe)\n\n this.animation.cancel()\n }\n\n onComplete?.()\n this.notifyFinished()\n }\n\n notifyAnimationStart(this, options, transition)\n }\n\n updateMotionValue?(value?: T): void\n\n play() {\n if (this.isStopped) return\n\n this.manualStartTime = null\n this.animation.play()\n\n if (this.state === \"finished\") {\n this.updateFinished()\n }\n }\n\n pause() {\n this.animation.pause()\n }\n\n complete() {\n this.animation.finish?.()\n }\n\n cancel() {\n try {\n this.animation.cancel()\n } catch (e) {}\n }\n\n stop() {\n if (this.isStopped) return\n this.isStopped = true\n const { state } = this\n\n if (state === \"idle\" || state === \"finished\") {\n return\n }\n\n if (this.updateMotionValue) {\n this.updateMotionValue()\n } else {\n this.commitStyles()\n }\n\n if (!this.isPseudoElement) this.cancel()\n }\n\n /**\n * WAAPI doesn't natively have any interruption capabilities.\n *\n * In this method, we commit styles back to the DOM before cancelling\n * the animation.\n *\n * This is designed to be overridden by NativeAnimationExtended, which\n * will create a renderless JS animation and sample it twice to calculate\n * its current value, \"previous\" value, and therefore allow\n * Motion to also correctly calculate velocity for any subsequent animation\n * while deferring the commit until the next animation frame.\n */\n protected commitStyles() {\n const element = this.options?.element\n if (!this.isPseudoElement && element?.isConnected) {\n this.animation.commitStyles?.()\n }\n }\n\n get duration() {\n const duration =\n this.animation.effect?.getComputedTiming?.().duration || 0\n\n return millisecondsToSeconds(Number(duration))\n }\n\n get iterationDuration() {\n const { delay = 0 } = this.options || {}\n return this.duration + millisecondsToSeconds(delay)\n }\n\n get time() {\n return millisecondsToSeconds(Number(this.animation.currentTime) || 0)\n }\n\n set time(newTime: number) {\n const wasFinished = this.finishedTime !== null\n this.manualStartTime = null\n this.finishedTime = null\n this.animation.currentTime = secondsToMilliseconds(newTime)\n\n if (wasFinished) {\n this.animation.pause()\n }\n }\n\n /**\n * The playback speed of the animation.\n * 1 = normal speed, 2 = double speed, 0.5 = half speed.\n */\n get speed() {\n return this.animation.playbackRate\n }\n\n set speed(newSpeed: number) {\n // Allow backwards playback after finishing\n if (newSpeed < 0) this.finishedTime = null\n\n this.animation.playbackRate = newSpeed\n }\n\n get state() {\n return this.finishedTime !== null\n ? \"finished\"\n : this.animation.playState\n }\n\n get startTime() {\n return this.manualStartTime ?? Number(this.animation.startTime)\n }\n\n set startTime(newStartTime: number) {\n this.manualStartTime = this.animation.startTime = newStartTime\n }\n\n /**\n * Attaches a timeline to the animation, for instance the `ScrollTimeline`.\n */\n attachTimeline({\n timeline,\n rangeStart,\n rangeEnd,\n observe,\n }: TimelineWithFallback): VoidFunction {\n if (this.allowFlatten) {\n this.animation.effect?.updateTiming({ easing: \"linear\" })\n }\n\n this.animation.onfinish = null\n\n if (timeline && supportsScrollTimeline()) {\n this.animation.timeline = timeline as any\n\n if (rangeStart) (this.animation as any).rangeStart = rangeStart\n if (rangeEnd) (this.animation as any).rangeEnd = rangeEnd\n\n return noop<void>\n } else {\n return observe(this)\n }\n }\n}\n","import { anticipate, backInOut, circInOut } from \"motion-utils\"\nimport { ValueAnimationTransition } from \"../../types\"\n\nconst unsupportedEasingFunctions = {\n anticipate,\n backInOut,\n circInOut,\n}\n\nfunction isUnsupportedEase(\n key: string\n): key is keyof typeof unsupportedEasingFunctions {\n return key in unsupportedEasingFunctions\n}\n\nexport function replaceStringEasing(transition: ValueAnimationTransition) {\n if (\n typeof transition.ease === \"string\" &&\n isUnsupportedEase(transition.ease)\n ) {\n transition.ease = unsupportedEasingFunctions[transition.ease]\n }\n}\n","import { clamp } from \"motion-utils\"\nimport { time } from \"../frameloop/sync-time\"\nimport { setStyle } from \"../render/dom/style-set\"\nimport { JSAnimation } from \"./JSAnimation\"\nimport { NativeAnimation, NativeAnimationOptions } from \"./NativeAnimation\"\nimport { AnyResolvedKeyframe, ValueAnimationOptions } from \"./types\"\nimport { replaceTransitionType } from \"./utils/replace-transition-type\"\nimport { replaceStringEasing } from \"./waapi/utils/unsupported-easing\"\n\nexport type NativeAnimationOptionsExtended<T extends AnyResolvedKeyframe> =\n NativeAnimationOptions & ValueAnimationOptions<T> & NativeAnimationOptions\n\n/**\n * 10ms is chosen here as it strikes a balance between smooth\n * results (more than one keyframe per frame at 60fps) and\n * keyframe quantity.\n */\nconst sampleDelta = 10 //ms\n\nexport class NativeAnimationExtended<\n T extends AnyResolvedKeyframe\n> extends NativeAnimation<T> {\n options: NativeAnimationOptionsExtended<T>\n\n constructor(options: NativeAnimationOptionsExtended<T>) {\n /**\n * The base NativeAnimation function only supports a subset\n * of Motion easings, and WAAPI also only supports some\n * easing functions via string/cubic-bezier definitions.\n *\n * This function replaces those unsupported easing functions\n * with a JS easing function. This will later get compiled\n * to a linear() easing function.\n */\n replaceStringEasing(options)\n\n /**\n * Ensure we replace the transition type with a generator function\n * before passing to WAAPI.\n *\n * TODO: Does this have a better home? It could be shared with\n * JSAnimation.\n */\n replaceTransitionType(options)\n\n super(options)\n\n /**\n * Only set startTime when the animation should autoplay.\n * Setting startTime on a paused WAAPI animation unpauses it\n * (per the WAAPI spec), which breaks autoplay: false.\n */\n if (options.startTime !== undefined && options.autoplay !== false) {\n this.startTime = options.startTime\n }\n\n this.options = options\n }\n\n /**\n * WAAPI doesn't natively have any interruption capabilities.\n *\n * Rather than read committed styles back out of the DOM, we can\n * create a renderless JS animation and sample it twice to calculate\n * its current value, \"previous\" value, and therefore allow\n * Motion to calculate velocity for any subsequent animation.\n */\n updateMotionValue(value?: T) {\n const { motionValue, onUpdate, onComplete, element, ...options } =\n this.options\n\n if (!motionValue) return\n\n if (value !== undefined) {\n motionValue.set(value)\n return\n }\n\n const sampleAnimation = new JSAnimation({\n ...options,\n autoplay: false,\n })\n\n /**\n * Use wall-clock elapsed time for sampling.\n * Under CPU load, WAAPI's currentTime may not reflect actual\n * elapsed time, causing incorrect sampling and visual jumps.\n */\n const sampleTime = Math.max(sampleDelta, time.now() - this.startTime)\n const delta = clamp(0, sampleDelta, sampleTime - sampleDelta)\n const current = sampleAnimation.sample(sampleTime).value\n\n /**\n * Write the estimated value to inline style so it persists\n * after cancel(), covering the async gap before the next\n * animation starts.\n */\n const { name } = this.options\n if (element && name) setStyle(element, name, current)\n\n motionValue.setWithVelocity(\n sampleAnimation.sample(Math.max(0, sampleTime - delta)).value,\n current,\n delta\n )\n\n sampleAnimation.stop()\n }\n}\n","import { complex } from \"../../value/types/complex\"\nimport { ValueKeyframesDefinition } from \"../types\"\n\n/**\n * Check if a value is animatable. Examples:\n *\n * ✅: 100, \"100px\", \"#fff\"\n * ❌: \"block\", \"url(2.jpg)\"\n * @param value\n *\n * @internal\n */\nexport const isAnimatable = (\n value: ValueKeyframesDefinition,\n name?: string\n) => {\n // If the list of keys that might be non-animatable grows, replace with Set\n if (name === \"zIndex\") return false\n\n // If it's a number or a keyframes array, we can animate it. We might at some point\n // need to do a deep isAnimatable check of keyframes, or let Popmotion handle this,\n // but for now lets leave it like this for performance reasons\n if (typeof value === \"number\" || Array.isArray(value)) return true\n\n if (\n typeof value === \"string\" && // It's animatable if we have a string\n (complex.test(value) || value === \"0\") && // And it contains numbers and/or colors\n !value.startsWith(\"url(\") // Unless it starts with \"url(\"\n ) {\n return true\n }\n\n return false\n}\n","import { warning } from \"motion-utils\"\nimport { isGenerator } from \"../generators/utils/is-generator\"\nimport { ResolvedKeyframes } from \"../keyframes/KeyframesResolver\"\nimport { AnimationGeneratorType } from \"../types\"\nimport { isAnimatable } from \"./is-animatable\"\n\nfunction hasKeyframesChanged(keyframes: ResolvedKeyframes<any>) {\n const current = keyframes[0]\n if (keyframes.length === 1) return true\n for (let i = 0; i < keyframes.length; i++) {\n if (keyframes[i] !== current) return true\n }\n}\n\nexport function canAnimate(\n keyframes: ResolvedKeyframes<any>,\n name?: string,\n type?: AnimationGeneratorType,\n velocity?: number\n) {\n /**\n * Check if we're able to animate between the start and end keyframes,\n * and throw a warning if we're attempting to animate between one that's\n * animatable and another that isn't.\n */\n const originKeyframe = keyframes[0]\n if (originKeyframe === null) {\n return false\n }\n\n /**\n * These aren't traditionally animatable but we do support them.\n * In future we could look into making this more generic or replacing\n * this function with mix() === mixImmediate\n */\n if (name === \"display\" || name === \"visibility\") return true\n\n const targetKeyframe = keyframes[keyframes.length - 1]\n const isOriginAnimatable = isAnimatable(originKeyframe, name)\n const isTargetAnimatable = isAnimatable(targetKeyframe, name)\n\n // Always skip if any of these are true\n if (!isOriginAnimatable || !isTargetAnimatable) {\n // Only build the message when we're going to warn\n isOriginAnimatable !== isTargetAnimatable &&\n warning(\n false,\n `You are trying to animate ${name} from \"${originKeyframe}\" to \"${targetKeyframe}\". \"${\n isOriginAnimatable ? targetKeyframe : originKeyframe\n }\" is not an animatable value.`,\n \"value-not-animatable\"\n )\n\n return false\n }\n\n return (\n hasKeyframesChanged(keyframes) ||\n ((type === \"spring\" || isGenerator(type)) && velocity)\n )\n}\n","import { ValueAnimationOptions } from \"../types\"\n\nexport function makeAnimationInstant(\n options: Partial<{\n duration: ValueAnimationOptions[\"duration\"]\n type: ValueAnimationOptions[\"type\"]\n }>\n): void {\n options.duration = 0\n options.type = \"keyframes\"\n}\n","/**\n * A list of values that can be hardware-accelerated.\n */\nexport const acceleratedValues = new Set<string>([\n \"opacity\",\n \"clipPath\",\n \"filter\",\n \"transform\",\n \"backgroundColor\",\n])\n","const browserColorFunctions =\n /^(?:oklch|oklab|lab|lch|color|color-mix|light-dark)\\(/\n\nexport function hasBrowserOnlyColors(keyframes: any[]): boolean {\n for (let i = 0; i < keyframes.length; i++) {\n if (\n typeof keyframes[i] === \"string\" &&\n browserColorFunctions.test(keyframes[i])\n ) {\n return true\n }\n }\n return false\n}\n","import { memo } from \"motion-utils\"\nimport {\n AnyResolvedKeyframe,\n ValueAnimationOptionsWithRenderContext,\n} from \"../../types\"\nimport { acceleratedValues } from \"../utils/accelerated-values\"\nimport { hasBrowserOnlyColors } from \"../utils/is-browser-color\"\n\nconst colorProperties = new Set([\n \"color\",\n \"backgroundColor\",\n \"outlineColor\",\n \"fill\",\n \"stroke\",\n \"borderColor\",\n \"borderTopColor\",\n \"borderRightColor\",\n \"borderBottomColor\",\n \"borderLeftColor\",\n])\n\nconst supportsWaapi = /*@__PURE__*/ memo(() =>\n Object.hasOwnProperty.call(Element.prototype, \"animate\")\n)\n\nexport function supportsBrowserAnimation<T extends AnyResolvedKeyframe>(\n options: ValueAnimationOptionsWithRenderContext<T>\n) {\n const {\n motionValue,\n name,\n repeatDelay,\n repeatType,\n damping,\n type,\n keyframes,\n } = options\n\n /**\n * Most values can't be accelerated at all, so check the name before\n * looking at the element or its props.\n */\n if (\n !name ||\n !(acceleratedValues.has(name) || colorProperties.has(name))\n ) {\n return false\n }\n\n const subject = motionValue?.owner?.current\n\n /**\n * We use instanceof checks instead of isHTMLElement()/isSVGElement()\n * because we explicitly **don't** want elements in different timing\n * contexts (i.e. popups) to be accelerated, as it's not possible to sync\n * these animations properly with those driven from the main window\n * frameloop.\n */\n if (\n !(subject instanceof HTMLElement) &&\n !(subject instanceof SVGElement)\n ) {\n return false\n }\n\n const { onUpdate, transformTemplate } = motionValue!.owner!.getProps()\n\n return (\n supportsWaapi() &&\n /**\n * Force WAAPI for color properties with browser-only color formats\n * (oklch, oklab, lab, lch, etc.) that the JS animation path can't parse.\n */\n (acceleratedValues.has(name) ||\n (colorProperties.has(name) &&\n hasBrowserOnlyColors(keyframes))) &&\n (name !== \"transform\" || !transformTemplate) &&\n /**\n * If we're outputting values to onUpdate then we can't use WAAPI as there's\n * no way to read the value from WAAPI every frame.\n */\n !onUpdate &&\n !repeatDelay &&\n repeatType !== \"mirror\" &&\n damping !== 0 &&\n type !== \"inertia\"\n )\n}\n","import { MotionGlobalConfig } from \"motion-utils\"\nimport { time } from \"../frameloop/sync-time\"\nimport { JSAnimation } from \"./JSAnimation\"\nimport { getFinalKeyframe } from \"./keyframes/get-final\"\nimport {\n KeyframeResolver as DefaultKeyframeResolver,\n flushKeyframeResolvers,\n ResolvedKeyframes,\n} from \"./keyframes/KeyframesResolver\"\nimport { NativeAnimationExtended } from \"./NativeAnimationExtended\"\nimport {\n AnimationPlaybackControls,\n AnyResolvedKeyframe,\n TimelineWithFallback,\n ValueAnimationOptions,\n} from \"./types\"\nimport { canAnimate } from \"./utils/can-animate\"\nimport { makeAnimationInstant } from \"./utils/make-animation-instant\"\nimport { WithPromise } from \"./utils/WithPromise\"\nimport { supportsBrowserAnimation } from \"./waapi/supports/waapi\"\n\n/**\n * Maximum time allowed between an animation being created and it being\n * resolved for us to use the latter as the start time.\n *\n * This is to ensure that while we prefer to \"start\" an animation as soon\n * as it's triggered, we also want to avoid a visual jump if there's a big delay\n * between these two moments.\n */\nconst MAX_RESOLVE_DELAY = 40\n\ntype ResolvedOptions<T extends AnyResolvedKeyframe> =\n ValueAnimationOptions<T> & {\n startTime?: number\n finalKeyframe?: T\n }\n\nexport class AsyncMotionValueAnimation<T extends AnyResolvedKeyframe>\n extends WithPromise\n implements AnimationPlaybackControls\n{\n private createdAt: number\n\n private resolvedAt: number | undefined\n\n private _animation: AnimationPlaybackControls | undefined\n\n private pendingTimeline: TimelineWithFallback | undefined\n\n private keyframeResolver: DefaultKeyframeResolver | undefined\n\n private stopTimeline: VoidFunction | undefined\n\n constructor(options: ValueAnimationOptions<T>) {\n super()\n\n this.createdAt = time.now()\n\n const { keyframes, name, motionValue, element } = options\n\n /**\n * animateMotionValue builds a fresh options object per value, so\n * it's completed in place as keyframes resolve rather than copied.\n */\n const optionsWithDefaults = options as ResolvedOptions<T>\n optionsWithDefaults.autoplay ??= true\n optionsWithDefaults.delay ??= 0\n optionsWithDefaults.type ??= \"keyframes\"\n optionsWithDefaults.repeat ??= 0\n optionsWithDefaults.repeatDelay ??= 0\n optionsWithDefaults.repeatType ??= \"loop\"\n\n const KeyframeResolver =\n element?.KeyframeResolver || DefaultKeyframeResolver\n\n this.keyframeResolver = new KeyframeResolver(\n keyframes,\n (\n resolvedKeyframes: ResolvedKeyframes<T>,\n finalKeyframe: T,\n forced: boolean\n ) =>\n this.onKeyframesResolved(\n resolvedKeyframes,\n finalKeyframe,\n optionsWithDefaults,\n !forced\n ),\n name,\n motionValue,\n element\n )\n this.keyframeResolver?.scheduleResolve()\n }\n\n onKeyframesResolved(\n keyframes: ResolvedKeyframes<T>,\n finalKeyframe: T,\n options: ResolvedOptions<T>,\n sync: boolean\n ) {\n this.keyframeResolver = undefined\n\n const { name, type, velocity, delay, isHandoff, onUpdate } = options\n this.resolvedAt = time.now()\n\n /**\n * If we can't animate this value with the resolved keyframes\n * then we should complete it immediately.\n */\n let canAnimateValue = true\n if (!canAnimate(keyframes, name, type, velocity)) {\n canAnimateValue = false\n\n if (MotionGlobalConfig.instantAnimations || !delay) {\n onUpdate?.(getFinalKeyframe(keyframes, options, finalKeyframe))\n }\n\n keyframes[0] = keyframes[keyframes.length - 1]\n\n makeAnimationInstant(options)\n options.repeat = 0\n }\n\n /**\n * Resolve startTime for the animation.\n *\n * This method uses the createdAt and resolvedAt to calculate the\n * animation startTime. *Ideally*, we would use the createdAt time as t=0\n * as the following frame would then be the first frame of the animation in\n * progress, which would feel snappier.\n *\n * However, if there's a delay (main thread work) between the creation of\n * the animation and the first committed frame, we prefer to use resolvedAt\n * to avoid a sudden jump into the animation.\n */\n const startTime = sync\n ? !this.resolvedAt\n ? this.createdAt\n : this.resolvedAt - this.createdAt > MAX_RESOLVE_DELAY\n ? this.resolvedAt\n : this.createdAt\n : undefined\n\n const { onComplete } = options\n /**\n * A startTime passed in options (an optimised appear handoff syncing\n * to its WAAPI animation) takes precedence over the derived one.\n */\n options.startTime ??= startTime\n options.finalKeyframe = finalKeyframe\n options.keyframes = keyframes\n /**\n * JSAnimation and NativeAnimation call onComplete exactly when\n * their own `finished` resolves, so this replaces a promise chain\n * per value with a callback.\n */\n options.onComplete = () => {\n onComplete?.()\n this.notifyFinished()\n }\n\n /**\n * Animate via WAAPI if possible. If this is a handoff animation, the optimised animation will be running via\n * WAAPI. Therefore, this animation must be JS to ensure it runs \"under\" the\n * optimised animation.\n *\n * Also skip WAAPI when keyframes aren't animatable, as the resolved\n * values may not be valid CSS and would trigger browser warnings.\n */\n const useWaapi =\n canAnimateValue && !isHandoff && supportsBrowserAnimation(options)\n\n let animation: AnimationPlaybackControls\n if (useWaapi) {\n /**\n * The resolver needed the VisualElement, WAAPI needs the DOM\n * element. JSAnimation reads neither, so this is safe to\n * leave in place if we fall back to it.\n */\n options.element = options.motionValue?.owner?.current\n try {\n animation = new NativeAnimationExtended(options as any)\n } catch {\n animation = new JSAnimation(options)\n }\n } else {\n animation = new JSAnimation(options)\n }\n\n if (this.pendingTimeline) {\n this.stopTimeline = animation.attachTimeline(this.pendingTimeline)\n this.pendingTimeline = undefined\n }\n\n this._animation = animation\n }\n\n get finished() {\n return this._animation ? this._animation.finished : super.finished\n }\n\n then(onResolve: VoidFunction, _onReject?: VoidFunction) {\n return this.finished.finally(onResolve).then(() => {})\n }\n\n get animation(): AnimationPlaybackControls {\n if (!this._animation) {\n this.keyframeResolver?.resume()\n flushKeyframeResolvers()\n }\n\n return this._animation!\n }\n\n get duration() {\n return this.animation.duration\n }\n\n get iterationDuration() {\n return this.animation.iterationDuration\n }\n\n get time() {\n return this.animation.time\n }\n\n set time(newTime: number) {\n this.animation.time = newTime\n }\n\n get speed() {\n return this.animation.speed\n }\n\n get state() {\n return this.animation.state\n }\n\n set speed(newSpeed: number) {\n this.animation.speed = newSpeed\n }\n\n get startTime() {\n return this.animation.startTime\n }\n\n attachTimeline(timeline: TimelineWithFallback) {\n if (this._animation) {\n this.stopTimeline = this.animation.attachTimeline(timeline)\n } else {\n this.pendingTimeline = timeline\n }\n\n return () => this.stop()\n }\n\n play() {\n this.animation.play()\n }\n\n pause() {\n this.animation.pause()\n }\n\n complete() {\n this.animation.complete()\n }\n\n cancel() {\n if (this._animation) {\n this.animation.cancel()\n }\n\n this.keyframeResolver?.cancel()\n }\n\n /**\n * Bound to support return animation.stop pattern\n */\n stop = () => {\n if (this._animation) {\n this._animation.stop()\n this.stopTimeline?.()\n }\n\n this.keyframeResolver?.cancel()\n }\n}\n","import { AnimationPlaybackControls, TimelineWithFallback } from \"./types\"\n\ntype PropNames =\n | \"time\"\n | \"speed\"\n | \"duration\"\n | \"attachTimeline\"\n | \"startTime\"\n | \"state\"\n\nexport type AcceptedAnimations = AnimationPlaybackControls\n\nexport type GroupedAnimations = AcceptedAnimations[]\n\nexport class GroupAnimation implements AnimationPlaybackControls {\n animations: GroupedAnimations\n\n constructor(animations: Array<AcceptedAnimations | undefined>) {\n this.animations = animations.filter(Boolean) as GroupedAnimations\n }\n\n get finished() {\n return Promise.all(\n this.animations.map((animation) => animation.finished)\n )\n }\n\n /**\n * TODO: Filter out cancelled or stopped animations before returning\n */\n private getAll(propName: PropNames) {\n return this.animations[0][propName] as any\n }\n\n private setAll(propName: PropNames, newValue: any) {\n for (let i = 0; i < this.animations.length; i++) {\n ;(this.animations[i][propName] as any) = newValue\n }\n }\n\n attachTimeline(timeline: TimelineWithFallback) {\n const subscriptions = this.animations.map((animation) =>\n animation.attachTimeline(timeline)\n )\n\n return () => {\n subscriptions.forEach((cancel, i) => {\n cancel && cancel()\n this.animations[i].stop()\n })\n }\n }\n\n get time() {\n return this.getAll(\"time\")\n }\n\n set time(time: number) {\n this.setAll(\"time\", time)\n }\n\n get speed() {\n return this.getAll(\"speed\")\n }\n\n set speed(speed: number) {\n this.setAll(\"speed\", speed)\n }\n\n get state() {\n return this.getAll(\"state\")\n }\n\n get startTime() {\n return this.getAll(\"startTime\")\n }\n\n get duration() {\n return getMax(this.animations, \"duration\")\n }\n\n get iterationDuration() {\n return getMax(this.animations, \"iterationDuration\")\n }\n\n private runAll(\n methodName: keyof Omit<\n AnimationPlaybackControls,\n PropNames | \"then\" | \"finished\" | \"iterationDuration\"\n >\n ) {\n this.animations.forEach((controls) => controls[methodName]())\n }\n\n play() {\n this.runAll(\"play\")\n }\n\n pause() {\n this.runAll(\"pause\")\n }\n\n // Bound to accomadate common `return animation.stop` pattern\n stop = () => this.runAll(\"stop\")\n\n cancel() {\n this.runAll(\"cancel\")\n }\n\n complete() {\n this.runAll(\"complete\")\n }\n}\n\nfunction getMax(\n animations: GroupedAnimations,\n propName: \"iterationDuration\" | \"duration\"\n): number {\n let max = 0\n\n for (let i = 0; i < animations.length; i++) {\n const value = animations[i][propName]\n if (value !== null && value > max) {\n max = value\n }\n }\n return max\n}\n","import { GroupAnimation } from \"./GroupAnimation\"\nimport { AnimationPlaybackControlsWithThen } from \"./types\"\n\nexport class GroupAnimationWithThen\n extends GroupAnimation\n implements AnimationPlaybackControlsWithThen\n{\n then(onResolve: VoidFunction, _onReject?: VoidFunction) {\n return this.finished.finally(onResolve).then(() => {})\n }\n}\n","import {\n EasingFunction,\n SubscriptionManager,\n velocityPerSecond,\n warnOnce,\n} from \"motion-utils\"\nimport {\n AnimationPlaybackControlsWithThen,\n AnyResolvedKeyframe,\n MotionValueAnimation,\n TransformProperties,\n} from \"../animation/types\"\nimport { frame } from \"../frameloop\"\nimport { time } from \"../frameloop/sync-time\"\n\n/**\n * @public\n */\nexport type Subscriber<T> = (v: T) => void\n\n/**\n * @public\n */\nexport type PassiveEffect<T> = (v: T, safeSetter: (v: T) => void) => void\n\nexport type StartAnimation = (\n complete: () => void\n) => AnimationPlaybackControlsWithThen | undefined\n\nexport interface MotionValueEventCallbacks<V> {\n animationStart: () => void\n animationComplete: () => void\n animationCancel: () => void\n change: (latestValue: V) => void\n destroy: () => void\n}\n\n/**\n * Maximum time between the value of two frames, beyond which we\n * assume the velocity has since been 0.\n */\nconst MAX_VELOCITY_DELTA = 30\n\nconst isFloat = (value: any): value is string => {\n return !isNaN(parseFloat(value))\n}\n\ninterface ResolvedValues {\n [key: string]: AnyResolvedKeyframe\n}\n\nexport interface Owner {\n current: HTMLElement | unknown\n getProps: () => {\n onUpdate?: (latest: ResolvedValues) => void\n transformTemplate?: (\n transform: TransformProperties,\n generatedTransform: string\n ) => string\n }\n}\n\nexport interface AccelerateConfig {\n factory: (animation: AnimationPlaybackControlsWithThen) => VoidFunction\n times: number[]\n keyframes: any[]\n ease?: EasingFunction | EasingFunction[]\n duration: number\n isTransformed?: boolean\n}\n\nexport interface MotionValueOptions {\n owner?: Owner\n}\n\nexport const collectMotionValues: { current: MotionValue[] | undefined } = {\n current: undefined,\n}\n\n/**\n * `MotionValue` is used to track the state and velocity of motion values.\n *\n * @public\n */\nexport class MotionValue<V = any> {\n /**\n * If a MotionValue has an owner, it was created internally within Motion\n * and therefore has no external listeners. It is therefore safe to animate via WAAPI.\n */\n owner?: Owner\n\n /**\n * The current state of the `MotionValue`.\n */\n private current: V | undefined\n\n /**\n * The previous state of the `MotionValue`.\n */\n private prev: V | undefined\n\n /**\n * The previous state of the `MotionValue` at the end of the previous frame.\n */\n private prevFrameValue: V | undefined\n\n /**\n * The last time the `MotionValue` was updated.\n */\n updatedAt: number\n\n /**\n * The time `prevFrameValue` was updated.\n */\n prevUpdatedAt: number | undefined\n\n /**\n * Add a passive effect to this `MotionValue`.\n *\n * A passive effect intercepts calls to `set`. For instance, `useSpring` adds\n * a passive effect that attaches a `spring` to the latest\n * set value. Hypothetically there could be a `useSmooth` that attaches an input smoothing effect.\n *\n * @internal\n */\n private passiveEffect?: PassiveEffect<V>\n private stopPassiveEffect?: VoidFunction\n\n /**\n * Whether the passive effect is active.\n */\n isEffectActive?: boolean\n\n /**\n * A reference to the currently-controlling animation.\n */\n animation?: MotionValueAnimation\n\n /**\n * The sole `change` subscriber. Most values have exactly one (an\n * effect or a follower), so it's stored and notified directly. A\n * SubscriptionManager is only created for a second subscriber.\n */\n private changeSubscriber?: Subscriber<V>\n\n /**\n * Tracks whether this value can output a velocity. Currently this is only true\n * if the value is numerical, but we might be able to widen the scope here and support\n * other value types.\n *\n * @internal\n */\n private canTrackVelocity: boolean | null = null\n\n /**\n * A list of MotionValues whose values are computed from this one.\n * This is a rough start to a proper signal-like dirtying system.\n */\n private dependents: Set<MotionValue> | undefined\n\n /**\n * Tracks whether this value should be removed\n */\n liveStyle?: boolean\n\n /**\n * Scroll timeline acceleration metadata. When set, VisualElement\n * can create a native WAAPI animation attached to a scroll timeline\n * instead of driving updates through JS.\n */\n accelerate?: AccelerateConfig\n\n /**\n * @param init - The initiating value\n * @param config - Optional configuration options\n *\n * - `transformer`: A function to transform incoming values with.\n */\n constructor(init: V, options: MotionValueOptions = {}) {\n this.setCurrent(init)\n this.owner = options.owner\n }\n\n setCurrent(current: V) {\n this.current = current\n this.updatedAt = time.now()\n\n if (this.canTrackVelocity === null && current !== undefined) {\n this.canTrackVelocity = isFloat(this.current)\n }\n }\n\n setPrevFrameValue(prevFrameValue: V | undefined = this.current) {\n this.prevFrameValue = prevFrameValue\n this.prevUpdatedAt = this.updatedAt\n }\n\n /**\n * Adds a function that will be notified when the `MotionValue` is updated.\n *\n * It returns a function that, when called, will cancel the subscription.\n *\n * When calling `onChange` inside a React component, it should be wrapped with the\n * `useEffect` hook. As it returns an unsubscribe function, this should be returned\n * from the `useEffect` function to ensure you don't add duplicate subscribers..\n *\n * ```jsx\n * export const MyComponent = () => {\n * const x = useMotionValue(0)\n * const y = useMotionValue(0)\n * const opacity = useMotionValue(1)\n *\n * useEffect(() => {\n * function updateOpacity() {\n * const maxXY = Math.max(x.get(), y.get())\n * const newOpacity = transform(maxXY, [0, 100], [1, 0])\n * opacity.set(newOpacity)\n * }\n *\n * const unsubscribeX = x.on(\"change\", updateOpacity)\n * const unsubscribeY = y.on(\"change\", updateOpacity)\n *\n * return () => {\n * unsubscribeX()\n * unsubscribeY()\n * }\n * }, [])\n *\n * return <motion.div style={{ x }} />\n * }\n * ```\n *\n * @param subscriber - A function that receives the latest value.\n * @returns A function that, when called, will cancel this subscription.\n *\n * @deprecated\n */\n onChange(subscription: Subscriber<V>): () => void {\n if (process.env.NODE_ENV !== \"production\") {\n warnOnce(\n false,\n `value.onChange(callback) is deprecated. Switch to value.on(\"change\", callback).`\n )\n }\n return this.on(\"change\", subscription)\n }\n\n /**\n * An object containing a SubscriptionManager for each active event.\n */\n private events: {\n [key: string]: SubscriptionManager<any>\n } = {}\n\n on<EventName extends keyof MotionValueEventCallbacks<V>>(\n eventName: EventName,\n callback: MotionValueEventCallbacks<V>[EventName]\n ): VoidFunction {\n if (eventName === \"change\") return this.onChangeSubscribe(callback)\n\n return (this.events[eventName] ||= new SubscriptionManager()).add(\n callback\n )\n }\n\n private onChangeSubscribe(callback: Subscriber<V>): VoidFunction {\n const { events } = this\n\n if (!events.change && !this.changeSubscriber) {\n this.changeSubscriber = callback\n } else {\n if (!events.change) {\n events.change = new SubscriptionManager()\n events.change.add(this.changeSubscriber!)\n this.changeSubscriber = undefined\n }\n events.change.add(callback)\n }\n\n return () => {\n if (this.changeSubscriber === callback) {\n this.changeSubscriber = undefined\n } else {\n events.change?.remove(callback)\n }\n this.stopIfUnobserved()\n }\n }\n\n /**\n * If we have no more change listeners by the start\n * of the next frame, stop active animations.\n */\n private stopIfUnobserved() {\n frame.read(() => {\n if (!this.changeSubscriber && !this.events.change?.getSize()) {\n this.stop()\n }\n })\n }\n\n clearListeners() {\n this.changeSubscriber = undefined\n for (const eventManagers in this.events) {\n this.events[eventManagers].clear()\n }\n }\n\n /**\n * Attaches a passive effect to the `MotionValue`.\n */\n attach(passiveEffect: PassiveEffect<V>, stopPassiveEffect: VoidFunction) {\n this.passiveEffect = passiveEffect\n this.stopPassiveEffect = stopPassiveEffect\n }\n\n /**\n * Sets the state of the `MotionValue`.\n *\n * @remarks\n *\n * ```jsx\n * const x = useMotionValue(0)\n * x.set(10)\n * ```\n *\n * @param latest - Latest value to set.\n * @param render - Whether to notify render subscribers. Defaults to `true`\n *\n * @public\n */\n set(v: V) {\n if (!this.passiveEffect) {\n this.updateAndNotify(v)\n } else {\n this.passiveEffect(v, this.updateAndNotify)\n }\n }\n\n setWithVelocity(prev: V, current: V, delta: number) {\n this.set(current)\n this.prev = undefined\n this.prevFrameValue = prev\n this.prevUpdatedAt = this.updatedAt - delta\n }\n\n /**\n * Set the state of the `MotionValue`, stopping any active animations,\n * effects, and resets velocity to `0`.\n */\n jump(v: V, endAnimation = true) {\n this.updateAndNotify(v)\n this.prev = v\n this.prevUpdatedAt = this.prevFrameValue = undefined\n endAnimation && this.stop()\n if (this.stopPassiveEffect) this.stopPassiveEffect()\n }\n\n dirty() {\n this.notifyChange()\n }\n\n private notifyChange() {\n const { current, changeSubscriber } = this\n /**\n * One or the other exists. Subscribing during the direct\n * subscriber's call moves it into a new manager, which must not\n * then be notified for the same change.\n */\n if (changeSubscriber) {\n changeSubscriber(current!)\n } else {\n this.events.change?.notify(current)\n }\n }\n\n addDependent(dependent: MotionValue) {\n if (!this.dependents) {\n this.dependents = new Set()\n }\n this.dependents.add(dependent)\n }\n\n removeDependent(dependent: MotionValue) {\n if (this.dependents) {\n this.dependents.delete(dependent)\n }\n }\n\n updateAndNotify = (v: V) => {\n const currentTime = time.now()\n\n /**\n * If we're updating the value during another frame or eventloop\n * than the previous frame, then the we set the previous frame value\n * to current.\n */\n if (this.updatedAt !== currentTime) {\n this.setPrevFrameValue()\n }\n\n this.prev = this.current\n\n this.setCurrent(v)\n\n // Update update subscribers\n if (this.current !== this.prev) {\n this.notifyChange()\n\n if (this.dependents) {\n for (const dependent of this.dependents) {\n dependent.dirty()\n }\n }\n }\n }\n\n /**\n * Returns the latest state of `MotionValue`\n *\n * @returns - The latest state of `MotionValue`\n *\n * @public\n */\n get() {\n if (collectMotionValues.current) {\n collectMotionValues.current.push(this)\n }\n\n return this.current!\n }\n\n /**\n * @public\n */\n getPrevious() {\n return this.prev\n }\n\n /**\n * Returns the latest velocity of `MotionValue`\n *\n * @returns - The latest velocity of `MotionValue`. Returns `0` if the state is non-numerical.\n *\n * @public\n */\n getVelocity() {\n const currentTime = time.now()\n\n if (\n !this.canTrackVelocity ||\n this.prevFrameValue === undefined ||\n currentTime - this.updatedAt > MAX_VELOCITY_DELTA\n ) {\n return 0\n }\n\n const delta = Math.min(\n this.updatedAt - this.prevUpdatedAt!,\n MAX_VELOCITY_DELTA\n )\n\n // Casts because of parseFloat's poor typing\n return velocityPerSecond(\n parseFloat(this.current as any) -\n parseFloat(this.prevFrameValue as any),\n delta\n )\n }\n\n hasAnimated = false\n\n /**\n * Registers a new animation to control this `MotionValue`. Only one\n * animation can drive a `MotionValue` at one time.\n *\n * ```jsx\n * value.start()\n * ```\n *\n * @param animation - A function that starts the provided animation\n */\n start(startAnimation: StartAnimation) {\n this.stop()\n\n return new Promise<void>((resolve) => {\n this.hasAnimated = true\n\n /**\n * Complete synchronously via the callback rather than chaining a\n * second promise per animation. Guard against animations that\n * complete before startAnimation has returned.\n */\n let isComplete = false\n let animation: MotionValueAnimation | undefined\n // eslint-disable-next-line prefer-const -- read by the callback before assignment when completing synchronously\n animation = startAnimation(() => {\n isComplete = true\n this.events.animationComplete?.notify()\n if (this.animation === animation) this.clearAnimation()\n resolve()\n })\n\n if (!isComplete) this.animation = animation\n\n this.events.animationStart?.notify()\n })\n }\n\n /**\n * Stop the currently active animation.\n *\n * @public\n */\n stop() {\n if (this.animation) {\n this.animation.stop()\n if (this.events.animationCancel) {\n this.events.animationCancel.notify()\n }\n }\n this.clearAnimation()\n }\n\n /**\n * Returns `true` if this value is currently animating.\n *\n * @public\n */\n isAnimating() {\n return !!this.animation\n }\n\n private clearAnimation() {\n // Assign rather than delete to keep the object's shape stable\n this.animation = undefined\n }\n\n /**\n * Destroy and clean up subscribers to this `MotionValue`.\n *\n * The `MotionValue` hooks like `useMotionValue` and `useTransform` automatically\n * handle the lifecycle of the returned `MotionValue`, so this method is only necessary if you've manually\n * created a `MotionValue` via the `motionValue` function.\n *\n * @public\n */\n destroy() {\n this.dependents?.clear()\n this.events.destroy?.notify()\n this.clearListeners()\n this.stop()\n\n if (this.stopPassiveEffect) {\n this.stopPassiveEffect()\n }\n }\n}\n\nexport function motionValue<V>(init: V, options?: MotionValueOptions) {\n return new MotionValue<V>(init, options)\n}\n","/**\n * If `transition` has `inherit: true`, shallow-merge it with\n * `parentTransition` (child keys win) and strip the `inherit` key.\n * Otherwise return `transition` unchanged.\n */\nexport function resolveTransition(\n transition: any,\n parentTransition?: any\n) {\n if (transition?.inherit && parentTransition) {\n const { inherit: _, ...rest } = transition\n return { ...parentTransition, ...rest }\n }\n\n return transition\n}\n","import { resolveTransition } from \"./resolve-transition\"\n\nexport function getValueTransition(transition: any, key: string) {\n const valueTransition =\n transition?.[key as keyof typeof transition] ??\n transition?.[\"default\"] ??\n transition\n\n if (valueTransition !== transition) {\n return resolveTransition(valueTransition, transition)\n }\n\n return valueTransition\n}\n","import { transformProps } from \"../../render/utils/keys-transform\"\nimport type { ValueAnimationOptions } from \"../types\"\n\nconst underDampedSpring: Partial<ValueAnimationOptions> = {\n type: \"spring\",\n stiffness: 500,\n damping: 25,\n restSpeed: 10,\n}\n\nconst criticallyDampedSpring = (\n target: unknown\n): Partial<ValueAnimationOptions> => ({\n type: \"spring\",\n stiffness: 550,\n damping: target === 0 ? 2 * Math.sqrt(550) : 30,\n restSpeed: 10,\n})\n\nconst keyframesTransition: Partial<ValueAnimationOptions> = {\n type: \"keyframes\",\n duration: 0.8,\n}\n\n/**\n * Default easing curve is a slightly shallower version of\n * the default browser easing curve.\n */\nconst ease: Partial<ValueAnimationOptions> = {\n type: \"keyframes\",\n ease: [0.25, 0.1, 0.35, 1],\n duration: 0.3,\n}\n\nexport const getDefaultTransition = (\n valueKey: string,\n { keyframes }: ValueAnimationOptions\n): Partial<ValueAnimationOptions> => {\n if (keyframes.length > 2) {\n return keyframesTransition\n } else if (transformProps.has(valueKey)) {\n return valueKey.startsWith(\"scale\")\n ? criticallyDampedSpring(keyframes[1])\n : underDampedSpring\n }\n\n return ease\n}\n","import type { AnyResolvedKeyframe } from \"../types\"\nimport type { Transition } from \"../types\"\n\nconst orchestrationKeys = new Set([\n \"when\",\n \"delay\",\n \"delayChildren\",\n \"staggerChildren\",\n \"staggerDirection\",\n \"repeat\",\n \"repeatType\",\n \"repeatDelay\",\n \"from\",\n \"elapsed\",\n])\n\n/**\n * Decide whether a transition is defined on a given Transition.\n * This filters out orchestration options and returns true\n * if any options are left.\n */\nexport function isTransitionDefined(\n transition: Transition & { elapsed?: number; from?: AnyResolvedKeyframe }\n) {\n for (const key in transition) {\n if (!orchestrationKeys.has(key)) return true\n }\n return false\n}\n","import { MotionGlobalConfig, secondsToMilliseconds } from \"motion-utils\"\nimport { AsyncMotionValueAnimation } from \"../AsyncMotionValueAnimation\"\nimport { JSAnimation } from \"../JSAnimation\"\nimport type {\n AnyResolvedKeyframe,\n ValueAnimationOptions,\n ValueTransition,\n} from \"../types\"\nimport type { UnresolvedKeyframes } from \"../keyframes/KeyframesResolver\"\nimport { getValueTransition } from \"../utils/get-value-transition\"\nimport { makeAnimationInstant } from \"../utils/make-animation-instant\"\nimport { getDefaultTransition } from \"../utils/default-transitions\"\nimport { getFinalKeyframe } from \"../keyframes/get-final\"\nimport { isTransitionDefined } from \"../utils/is-transition-defined\"\nimport { frame } from \"../../frameloop\"\nimport type { MotionValue, StartAnimation } from \"../../value\"\nimport type { AnimationElement } from \"../keyframes/types\"\n\nexport const animateMotionValue =\n <V extends AnyResolvedKeyframe>(\n name: string,\n value: MotionValue<V>,\n target: V | UnresolvedKeyframes<V>,\n transition: ValueTransition & { elapsed?: number } = {},\n element?: AnimationElement,\n isHandoff?: boolean\n ): StartAnimation =>\n (onComplete) => {\n const valueTransition = getValueTransition(transition, name) || {}\n\n /**\n * Most transition values are currently completely overwritten by value-specific\n * transitions. In the future it'd be nicer to blend these transitions. But for now\n * delay actually does inherit from the root transition if not value-specific.\n */\n const delay = valueTransition.delay || transition.delay || 0\n\n /**\n * Elapsed isn't a public transition option but can be passed through from\n * optimized appear effects in milliseconds.\n */\n let { elapsed = 0 } = transition\n elapsed = elapsed - secondsToMilliseconds(delay)\n\n const options: ValueAnimationOptions = {\n keyframes: Array.isArray(target) ? target : [null, target],\n ease: \"easeOut\",\n velocity: value.getVelocity(),\n ...valueTransition,\n delay: -elapsed,\n onUpdate: (v) => {\n value.set(v)\n valueTransition.onUpdate && valueTransition.onUpdate(v)\n },\n onComplete: () => {\n onComplete()\n valueTransition.onComplete && valueTransition.onComplete()\n },\n name,\n motionValue: value,\n element: isHandoff ? undefined : element,\n }\n\n /**\n * If there's no transition defined for this value, we can generate\n * unique transition settings for this value.\n */\n if (!isTransitionDefined(valueTransition)) {\n Object.assign(options, getDefaultTransition(name, options))\n }\n\n /**\n * Both WAAPI and our internal animation functions use durations\n * as defined by milliseconds, while our external API defines them\n * as seconds.\n */\n options.duration &&= secondsToMilliseconds(options.duration)\n options.repeatDelay &&= secondsToMilliseconds(options.repeatDelay)\n\n /**\n * Support deprecated way to set initial value. Prefer keyframe syntax.\n */\n if (options.from !== undefined) {\n options.keyframes[0] = options.from as any\n }\n\n let shouldSkip = false\n\n if (\n (options as any).type === false ||\n (options.duration === 0 && !options.repeatDelay)\n ) {\n makeAnimationInstant(options)\n\n if (options.delay === 0) {\n shouldSkip = true\n }\n }\n\n if (\n MotionGlobalConfig.instantAnimations ||\n MotionGlobalConfig.skipAnimations ||\n element?.shouldSkipAnimations ||\n valueTransition.skipAnimations\n ) {\n shouldSkip = true\n makeAnimationInstant(options)\n options.delay = 0\n }\n\n /**\n * If the transition type or easing has been explicitly set by the user\n * then we don't want to allow flattening the animation.\n */\n options.allowFlatten = !valueTransition.type && !valueTransition.ease\n\n /**\n * If we can or must skip creating the animation, and apply only\n * the final keyframe, do so. We also check once keyframes are resolved but\n * this early check prevents the need to create an animation at all.\n */\n if (shouldSkip && !isHandoff && value.get() !== undefined) {\n const finalKeyframe = getFinalKeyframe<V>(\n options.keyframes as V[],\n valueTransition\n )\n\n if (finalKeyframe !== undefined) {\n frame.update(() => {\n options.onUpdate!(finalKeyframe)\n options.onComplete!()\n })\n\n return\n }\n }\n\n return valueTransition.isSync\n ? new JSAnimation(options)\n : new AsyncMotionValueAnimation(options)\n }\n","import { invariant, isNumericalString } from \"motion-utils\"\nimport { AnyResolvedKeyframe } from \"../types\"\nimport { CSSVariableToken, isCSSVariableToken } from \"./is-css-variable\"\n\n/**\n * Parse Framer's special CSS variable format into a CSS token and a fallback.\n *\n * ```\n * `var(--foo, #fff)` => [`--foo`, '#fff']\n * ```\n *\n * @param current\n */\n\nconst splitCSSVariableRegex =\n // eslint-disable-next-line redos-detector/no-unsafe-regex -- false positive, as it can match a lot of words\n /^var\\(--(?:([\\w-]+)|([\\w-]+), ?([a-zA-Z\\d ()%#.,-]+))\\)/u\nexport function parseCSSVariable(current: string) {\n const match = splitCSSVariableRegex.exec(current)\n if (!match) return [,]\n\n const [, token1, token2, fallback] = match\n return [`--${token1 ?? token2}`, fallback]\n}\n\nconst maxDepth = 4\nexport function getVariableValue(\n current: CSSVariableToken,\n element: Element,\n depth = 1\n): AnyResolvedKeyframe | undefined {\n invariant(\n depth <= maxDepth,\n `Max CSS variable fallback depth detected in property \"${current}\". This may indicate a circular fallback dependency.`,\n \"max-css-var-depth\"\n )\n\n const [token, fallback] = parseCSSVariable(current)\n\n // No CSS variable detected\n if (!token) return\n\n // Attempt to read this CSS variable off the element\n const resolved = window.getComputedStyle(element).getPropertyValue(token)\n\n if (resolved) {\n const trimmed = resolved.trim()\n return isNumericalString(trimmed) ? parseFloat(trimmed) : trimmed\n }\n\n return isCSSVariableToken(fallback)\n ? getVariableValue(fallback, element, depth + 1)\n : fallback\n}\n","import { transformPropOrder } from \"./keys-transform\"\n\nexport const positionalKeys = new Set([\n \"width\",\n \"height\",\n \"top\",\n \"left\",\n \"right\",\n \"bottom\",\n ...transformPropOrder,\n])\n","import type { MotionValue } from \"..\"\n\nexport const isMotionValue = (value: any): value is MotionValue =>\n Boolean(value && value.getVelocity)\n","export function camelToDash(str: string): string {\n return str.replace(/([A-Z])/g, (match) => `-${match.toLowerCase()}`)\n}\n","import { ValueType } from \"./types\"\n\n/**\n * ValueType for \"auto\"\n */\nexport const auto: ValueType = {\n test: (v: any) => v === \"auto\",\n parse: (v) => v,\n}\n","import { ValueType } from \"./types\"\n\n/**\n * Tests a provided value against a ValueType\n */\nexport const testValueType = (v: any) => (type: ValueType) => type.test(v)\n","import { auto } from \"./auto\"\nimport { number } from \"./numbers\"\nimport { degrees, percent, px, vh, vw } from \"./numbers/units\"\nimport { testValueType } from \"./test\"\n\n/**\n * A list of value types commonly used for dimensions\n */\nexport const dimensionValueTypes = [number, px, percent, degrees, vw, vh, auto]\n\n/**\n * Tests a dimensional value against the list of dimension ValueTypes\n */\nexport const findDimensionValueType = (v: any) =>\n dimensionValueTypes.find(testValueType(v))\n","import { isZeroValueString } from \"motion-utils\"\nimport { AnyResolvedKeyframe } from \"../../types\"\n\nexport function isNone(value: AnyResolvedKeyframe | null) {\n if (typeof value === \"number\") {\n return value === 0\n } else if (value !== null) {\n return value === \"none\" || value === \"0\" || isZeroValueString(value)\n } else {\n return true\n }\n}\n","import { hasComplexValues } from \"../../../value/types/complex\"\nimport { getAnimatableNone } from \"../../../value/types/utils/animatable-none\"\nimport { AnyResolvedKeyframe } from \"../../types\"\nimport { UnresolvedKeyframes } from \"../KeyframesResolver\"\n\n/**\n * If we encounter keyframes like \"none\" or \"0\" and we also have keyframes like\n * \"#fff\" or \"200px 200px\" we want to find a keyframe to serve as a template for\n * the \"none\" keyframes. In this case \"#fff\" or \"200px 200px\" - then these get turned into\n * zero equivalents, i.e. \"#fff0\" or \"0px 0px\".\n */\nconst invalidTemplates = new Set([\"auto\", \"none\", \"0\"])\n\nexport function makeNoneKeyframesAnimatable(\n unresolvedKeyframes: UnresolvedKeyframes<AnyResolvedKeyframe>,\n noneKeyframeIndexes: number[],\n name?: string\n) {\n let i = 0\n let animatableTemplate: string | undefined = undefined\n while (i < unresolvedKeyframes.length && !animatableTemplate) {\n const keyframe = unresolvedKeyframes[i]\n if (\n typeof keyframe === \"string\" &&\n !invalidTemplates.has(keyframe) &&\n hasComplexValues(keyframe)\n ) {\n animatableTemplate = unresolvedKeyframes[i] as string\n }\n i++\n }\n\n if (animatableTemplate && name) {\n for (const noneIndex of noneKeyframeIndexes) {\n /**\n * A zero-valued template like \"0%\" is already its own\n * animatable none, so there's nothing to derive.\n */\n if (unresolvedKeyframes[noneIndex] === animatableTemplate) continue\n\n unresolvedKeyframes[noneIndex] = getAnimatableNone(\n name,\n animatableTemplate\n )\n }\n }\n}\n","import { positionalKeys } from \"../../render/utils/keys-position\"\nimport { MotionValue } from \"../../value\"\nimport { findDimensionValueType } from \"../../value/types/dimensions\"\nimport { AnyResolvedKeyframe } from \"../types\"\nimport { getVariableValue } from \"../utils/css-variables-conversion\"\nimport {\n containsCSSVariable,\n isCSSVariableToken,\n} from \"../utils/is-css-variable\"\nimport {\n KeyframeResolver,\n OnKeyframesResolved,\n UnresolvedKeyframes,\n} from \"./KeyframesResolver\"\nimport { WithRender } from \"./types\"\nimport { isNone } from \"./utils/is-none\"\nimport { makeNoneKeyframesAnimatable } from \"./utils/make-none-animatable\"\nimport { isNumOrPxType, positionalValues } from \"./utils/unit-conversion\"\n\nexport class DOMKeyframesResolver<\n T extends AnyResolvedKeyframe\n> extends KeyframeResolver<T> {\n name: string\n element?: WithRender\n\n private removedTransforms?: [string, AnyResolvedKeyframe][]\n private measuredOrigin?: AnyResolvedKeyframe\n\n constructor(\n unresolvedKeyframes: UnresolvedKeyframes<AnyResolvedKeyframe>,\n onComplete: OnKeyframesResolved<T>,\n name?: string,\n motionValue?: MotionValue<T>,\n element?: WithRender\n ) {\n super(unresolvedKeyframes, onComplete, name, motionValue, element, true)\n }\n\n readKeyframes() {\n const { unresolvedKeyframes, element, name } = this\n\n if (!element || !element.current) return\n\n super.readKeyframes()\n\n /**\n * If any keyframe is a CSS variable, we need to find its value by sampling the element\n */\n for (let i = 0; i < unresolvedKeyframes.length; i++) {\n let keyframe = unresolvedKeyframes[i]\n\n if (typeof keyframe === \"string\") {\n keyframe = keyframe.trim()\n\n if (isCSSVariableToken(keyframe)) {\n const resolved = getVariableValue(keyframe, element.current)\n\n if (resolved !== undefined) {\n unresolvedKeyframes[i] = resolved as T\n }\n\n if (i === unresolvedKeyframes.length - 1) {\n this.finalKeyframe = keyframe as T\n }\n }\n }\n }\n\n /**\n * Resolve \"none\" values. We do this potentially twice - once before and once after measuring keyframes.\n * This could be seen as inefficient but it's a trade-off to avoid measurements in more situations, which\n * have a far bigger performance impact.\n */\n this.resolveNoneKeyframes()\n\n /**\n * Check to see if unit type has changed. If so schedule jobs that will\n * temporarily set styles to the destination keyframes.\n * Skip if we have more than two keyframes or this isn't a positional value.\n * TODO: We can throw if there are multiple keyframes and the value type changes.\n */\n if (!positionalKeys.has(name) || unresolvedKeyframes.length !== 2) {\n return\n }\n\n const [origin, target] = unresolvedKeyframes\n\n // Two numbers share a unit, so skip the value type search.\n if (typeof origin === \"number\" && typeof target === \"number\") return\n\n const originType = findDimensionValueType(origin)\n const targetType = findDimensionValueType(target)\n\n /**\n * If one keyframe contains embedded CSS variables (e.g. in calc()) and the other\n * doesn't, we need to measure to convert to pixels. This handles GitHub issue #3410.\n */\n const originHasVar = containsCSSVariable(origin)\n const targetHasVar = containsCSSVariable(target)\n\n if (originHasVar !== targetHasVar && positionalValues[name]) {\n this.needsMeasurement = true\n return\n }\n\n /**\n * Either we don't recognise these value types or we can animate between them.\n */\n if (originType === targetType) return\n\n /**\n * If both values are numbers or pixels, we can animate between them by\n * converting them to numbers.\n */\n if (isNumOrPxType(originType) && isNumOrPxType(targetType)) {\n for (let i = 0; i < unresolvedKeyframes.length; i++) {\n const value = unresolvedKeyframes[i]\n if (typeof value === \"string\") {\n unresolvedKeyframes[i] = parseFloat(value as string)\n }\n }\n } else if (positionalValues[name]) {\n /**\n * Else, the only way to resolve this is by measuring the element.\n */\n this.needsMeasurement = true\n }\n }\n\n resolveNoneKeyframes() {\n const { unresolvedKeyframes, name } = this\n\n const noneKeyframeIndexes: number[] = []\n for (let i = 0; i < unresolvedKeyframes.length; i++) {\n if (\n unresolvedKeyframes[i] === null ||\n isNone(unresolvedKeyframes[i])\n ) {\n noneKeyframeIndexes.push(i)\n }\n }\n\n if (noneKeyframeIndexes.length) {\n makeNoneKeyframesAnimatable(\n unresolvedKeyframes,\n noneKeyframeIndexes,\n name\n )\n }\n }\n\n private measure() {\n const { element, name } = this\n return positionalValues[name](\n window.getComputedStyle(element!.current!),\n () => element!.measureViewportBox()\n )\n }\n\n measureInitialState() {\n const { element, unresolvedKeyframes, name } = this\n\n if (!element || !element.current) return\n\n if (name === \"height\") {\n this.suspendedScrollY = window.pageYOffset\n }\n\n this.measuredOrigin = this.measure()\n\n unresolvedKeyframes[0] = this.measuredOrigin\n\n // Set final key frame to measure after next render\n const measureKeyframe =\n unresolvedKeyframes[unresolvedKeyframes.length - 1]\n\n if (measureKeyframe !== undefined) {\n this.motionValue?.jump(measureKeyframe as T, false)\n }\n }\n\n measureEndState() {\n const { element, unresolvedKeyframes } = this\n\n if (!element || !element.current) return\n\n this.motionValue?.jump(this.measuredOrigin as T, false)\n\n const finalKeyframeIndex = unresolvedKeyframes.length - 1\n const finalKeyframe = unresolvedKeyframes[finalKeyframeIndex]\n\n unresolvedKeyframes[finalKeyframeIndex] = this.measure() as any\n\n if (finalKeyframe !== null && this.finalKeyframe === undefined) {\n this.finalKeyframe = finalKeyframe as T\n }\n\n // If we removed transform values, reapply them before the next render\n if (this.removedTransforms?.length) {\n this.removedTransforms.forEach(\n ([unsetTransformName, unsetTransformValue]) => {\n element\n .getValue(unsetTransformName)!\n .set(unsetTransformValue)\n }\n )\n }\n\n this.resolveNoneKeyframes()\n }\n}\n","import { invariant, removeItem } from \"motion-utils\"\nimport { AnimateEffect } from \"../../effects/utils/create-effect\"\nimport { frame } from \"../../frameloop\"\nimport { positionalKeys } from \"../../render/utils/keys-position\"\nimport { MotionValue, motionValue } from \"../../value\"\nimport { animateMotionValue } from \"../interfaces/motion-value\"\nimport { AnimationElement } from \"../keyframes/types\"\nimport {\n AnimationPlaybackControlsWithThen,\n AnyResolvedKeyframe,\n UnresolvedValueKeyframe,\n ValueTransition,\n} from \"../types\"\n\n/**\n * Effects registered via `animate.addEffect()`, most recent first.\n */\nconst effects: AnimateEffect<any>[] = []\n\nexport function addEffect(effect: AnimateEffect<any>): void {\n invariant(\n typeof effect.test === \"function\" && typeof effect.read === \"function\",\n \"Effects passed to animate.addEffect() need test() and read().\",\n \"effect-missing-test\"\n )\n\n removeEffect(effect)\n effects.unshift(effect)\n}\n\nexport function removeEffect(effect: AnimateEffect<any>): void {\n removeItem(effects, effect)\n}\n\nexport function findEffect(subject: unknown): AnimateEffect | undefined {\n return effects.find((effect) => effect.test(subject))\n}\n\nexport interface EffectKeyframes {\n [key: string]:\n | UnresolvedValueKeyframe\n | UnresolvedValueKeyframe[]\n | Record<string, unknown>\n | undefined\n transition?: Record<string, unknown>\n transitionEnd?: Record<string, AnyResolvedKeyframe>\n}\n\n/**\n * Effect subjects can expose any key, so per-key transition overrides\n * are keyed by arbitrary strings.\n */\nexport type EffectTransition = ValueTransition & {\n reduceMotion?: boolean\n skipAnimations?: boolean\n} & Record<string, unknown>\n\n/**\n * Animate each key in `keyframes` on the motion value `getValue` returns\n * for it. `element` is what the keyframe resolver uses to read, render\n * and measure the subject when the effect defers resolution to it.\n */\nexport function animateValues(\n getValue: (key: string) => MotionValue,\n keyframes: EffectKeyframes,\n transition: EffectTransition = {},\n element?: AnimationElement\n): AnimationPlaybackControlsWithThen[] {\n const animations: AnimationPlaybackControlsWithThen[] = []\n const { velocity } = transition\n const reduceMotion = transition.reduceMotion ?? element?.shouldReduceMotion\n\n for (const key in keyframes) {\n if (key === \"transition\" || key === \"transitionEnd\") continue\n\n const target = keyframes[key]\n if (target === undefined) continue\n\n const value = getValue(key)\n\n /**\n * If the value is already at the defined target, skip the animation.\n * We still re-assert the value via frame.update to take precedence\n * over any stale transitionEnd callbacks from previous animations.\n */\n const current = value.get()\n if (\n current !== undefined &&\n !value.isAnimating() &&\n !Array.isArray(target) &&\n target === current &&\n !velocity\n ) {\n frame.update(() => value.set(target))\n continue\n }\n\n value.start(\n animateMotionValue(\n key,\n value,\n target as any,\n reduceMotion && positionalKeys.has(key)\n ? { type: false }\n : transition,\n element\n )\n )\n\n value.animation &&\n animations.push(\n value.animation as AnimationPlaybackControlsWithThen\n )\n }\n\n const { transitionEnd } = keyframes\n if (transitionEnd) {\n const applyTransitionEnd = () =>\n frame.update(() => {\n for (const key in transitionEnd) {\n getValue(key).set(transitionEnd[key])\n }\n })\n\n animations.length\n ? Promise.all(animations).then(applyTransitionEnd)\n : applyTransitionEnd()\n }\n\n return animations\n}\n\n/**\n * Animate the keys of `subject` via `effect`. Motion values are created on\n * first animation and bound to the subject through the effect for the\n * rest of its life.\n *\n * Without `element`, a new value is seeded synchronously from the first\n * keyframe or `effect.read()`. With it, the value starts undefined and the\n * keyframe resolver reads the subject (batched, with unit conversion by\n * measurement) via `element`.\n */\nexport function animateEffectSubject<Subject extends object>(\n effect: AnimateEffect<Subject>,\n subject: Subject,\n keyframes: EffectKeyframes,\n transition?: EffectTransition,\n element?: AnimationElement\n): AnimationPlaybackControlsWithThen[] {\n return animateValues(\n (key) => {\n let value = effect.get(subject, key)\n\n if (!value) {\n let initial: AnyResolvedKeyframe | undefined\n\n if (!element) {\n const target = keyframes[key] as\n | UnresolvedValueKeyframe\n | UnresolvedValueKeyframe[]\n initial =\n firstKeyframe(target) ??\n effect.read(subject, key, target)\n\n invariant(\n initial !== undefined,\n `\"${key}\" can't be read from the animated subject. Provide [from, to] keyframes.`,\n \"effect-unreadable-value\"\n )\n }\n\n value = motionValue(initial, { owner: element })\n effect(subject, { [key]: value })\n }\n\n return value\n },\n keyframes,\n transition,\n element\n )\n}\n\nfunction firstKeyframe(\n target: UnresolvedValueKeyframe | UnresolvedValueKeyframe[] | undefined\n) {\n const first = Array.isArray(target) ? target[0] : undefined\n return first === null ? undefined : first\n}\n","import { isObject } from \"motion-utils\"\n\n/**\n * Checks if an element is an HTML element in a way\n * that works across iframes\n */\nexport function isHTMLElement(element: unknown): element is HTMLElement {\n return (\n isObject(element) &&\n \"offsetHeight\" in element &&\n !(\"ownerSVGElement\" in element)\n )\n}\n","import { isObject } from \"motion-utils\"\n\n/**\n * Checks if an element is an SVG element in a way\n * that works across iframes\n */\nexport function isSVGElement(element: unknown): element is SVGElement {\n return isObject(element) && \"ownerSVGElement\" in element\n}\n","import { ValueType } from \"../types\"\n\n/**\n * Provided a value and a ValueType, returns the value as that value type.\n */\nexport const getValueAsType = (value: any, type?: ValueType) => {\n return type && typeof value === \"number\"\n ? (type as any).transform(value)\n : value\n}\n","export type ElementOrSelector =\n | Element\n | Element[]\n | NodeListOf<Element>\n | string\n | null\n | undefined\n\nexport interface WithQuerySelectorAll {\n querySelectorAll: Element[\"querySelectorAll\"]\n}\n\nexport interface AnimationScope<T = any> {\n readonly current: T\n animations: any[] // TODO: Refactor to types package AnimationPlaybackControls[]\n}\n\nexport interface SelectorCache {\n [key: string]: NodeListOf<Element>\n}\n\nexport function resolveElements(\n elementOrSelector: ElementOrSelector,\n scope?: AnimationScope,\n selectorCache?: SelectorCache\n): Element[] {\n if (elementOrSelector == null) {\n return []\n }\n\n if (elementOrSelector instanceof EventTarget) {\n return [elementOrSelector]\n } else if (typeof elementOrSelector === \"string\") {\n let root: WithQuerySelectorAll = document\n\n if (scope) {\n root = scope.current\n }\n\n const elements =\n selectorCache?.[elementOrSelector] ??\n root.querySelectorAll(elementOrSelector)\n\n return elements ? Array.from(elements) : []\n }\n\n return Array.from(elementOrSelector).filter(\n (element): element is Element => element != null\n )\n}\n","import { frame } from \"../frameloop/frame\"\nimport { Schedule } from \"../frameloop/types\"\nimport { MotionValue } from \"../value\"\n\ninterface Entry {\n value: MotionValue\n render?: VoidFunction\n onRemove: VoidFunction\n}\n\nexport class MotionValueState {\n /**\n * Transform keys bound to this state, in `transformPropOrder`, and\n * the value bound to each. Lets the transform builder visit only\n * bound transforms, reading each value directly.\n */\n transformKeys?: string[]\n transformValues?: Record<string, MotionValue>\n\n private values = new Map<string, Entry>()\n\n /**\n * Renders scheduled for the next flush, usually one or two (values\n * bound to the same computed render, e.g. `x` and `y` to `transform`,\n * share an entry). Tracked with a count rather than truncating the\n * array so no backing store is reallocated every frame. Kept per\n * state so pending writes can be flushed synchronously before the\n * subject is measured.\n */\n private pending: VoidFunction[] = []\n private numPending = 0\n\n /**\n * @param step - The frameloop step renders are scheduled in. Defaults\n * to `frame.render`. Effects that feed a render loop running in\n * `frame.render` (GPU scenes) should write in `frame.preRender`.\n */\n constructor(private step: Schedule = frame.render) {}\n\n /**\n * @param render - Writes the value to the subject. Renders read the\n * motion value directly rather than a cached copy, so there is one\n * place a value lives.\n * @param computed - A value already in this state (e.g. `transform`)\n * whose render should run whenever `value` changes.\n */\n set(\n name: string,\n value: MotionValue,\n render?: VoidFunction,\n computed?: MotionValue\n ): VoidFunction {\n this.values.get(name)?.onRemove()\n\n if (computed) {\n for (const entry of this.values.values()) {\n if (entry.value === computed) render = entry.render\n }\n }\n\n const onChange = () => render && this.schedule(render)\n\n /**\n * Values created ahead of a DOM read start out undefined and\n * have nothing to render until they're set.\n */\n value.get() !== undefined && onChange()\n\n const cancelOnChange = value.on(\"change\", onChange)\n\n const onRemove = () => {\n cancelOnChange()\n render && !computed && this.cancel(render)\n this.values.delete(name)\n }\n\n this.values.set(name, {\n value,\n render: computed ? undefined : render,\n onRemove,\n })\n\n return onRemove\n }\n\n get(name: string): MotionValue | undefined {\n return this.values.get(name)?.value\n }\n\n /**\n * Detach every value from this state and return them, so another\n * renderer can take them over. The state stays cached by its effect,\n * so the bound transforms are reset too rather than leaking into\n * values bound later.\n */\n release() {\n const values = new Map<string, MotionValue>()\n this.values.forEach((entry, name) => {\n values.set(name, entry.value)\n entry.onRemove()\n })\n this.transformKeys = this.transformValues = undefined\n return values\n }\n\n private schedule(render: VoidFunction) {\n const { pending, numPending } = this\n\n for (let i = 0; i < numPending; i++) {\n if (pending[i] === render) return\n }\n\n numPending || this.step(this.flush)\n\n pending[this.numPending++] = render\n }\n\n private cancel(render: VoidFunction) {\n const { pending } = this\n\n for (let i = 0; i < this.numPending; i++) {\n if (pending[i] === render) {\n pending[i] = pending[--this.numPending]\n return\n }\n }\n }\n\n /**\n * Run the pending renders. Resetting the count first means a render\n * scheduled while flushing lands in the next frame, as with the\n * frameloop itself.\n */\n flush = () => {\n const { pending, numPending } = this\n this.numPending = 0\n for (let i = 0; i < numPending; i++) pending[i]()\n }\n}\n","import {\n AnyResolvedKeyframe,\n UnresolvedValueKeyframe,\n} from \"../../animation/types\"\nimport { Schedule } from \"../../frameloop/types\"\nimport { MotionValue } from \"../../value\"\nimport { MotionValueState } from \"../MotionValueState\"\n\n/**\n * Returns true if the effect knows how to write to `subject`.\n */\nexport type EffectTest<Subject extends object> = (\n subject: unknown\n) => subject is Subject\n\n/**\n * Reads the current value of `key` from `subject`, used as the initial\n * keyframe when `animate()` creates a motion value for the subject.\n * Returns `undefined` when the value can't be read.\n *\n * `keyframes` is the target being animated to, so effects can match\n * the format of the initial value (for instance color vs numeric).\n */\nexport type EffectRead<Subject extends object> = (\n subject: Subject,\n key: string,\n keyframes?: UnresolvedValueKeyframe | UnresolvedValueKeyframe[]\n) => AnyResolvedKeyframe | undefined\n\nexport interface EffectOptions<Subject extends object> {\n test?: EffectTest<Subject>\n read?: EffectRead<Subject>\n\n /**\n * Frameloop step writes are scheduled in. Defaults to `frame.render`.\n */\n step?: Schedule\n}\n\nexport interface Effect<Subject extends object = object>\n extends EffectOptions<Subject> {\n (subject: Subject, values: Record<string, MotionValue>): VoidFunction\n\n /**\n * Returns the motion value currently bound to `key` on `subject`, if any.\n */\n get(subject: Subject, key: string): MotionValue | undefined\n\n /**\n * Write `subject`'s pending values now rather than in the next frame,\n * e.g. so it can be measured with a target applied.\n */\n flush(subject: Subject): void\n\n /**\n * The state holding the motion values bound to `subject`, if any have\n * been, so they can be handed to another renderer.\n */\n state(subject: Subject): MotionValueState | undefined\n}\n\n/**\n * An effect that can be registered with `animate.addEffect()`.\n */\nexport interface AnimateEffect<Subject extends object = object>\n extends Effect<Subject> {\n test: EffectTest<Subject>\n read: EffectRead<Subject>\n}\n\nexport type AddEffectValue<Subject extends object> = (\n subject: Subject,\n state: MotionValueState,\n key: string,\n value: MotionValue\n) => VoidFunction\n\nexport function createEffect<Subject extends object>(\n addValue: AddEffectValue<Subject>,\n options: EffectOptions<Subject> & {\n test: EffectTest<Subject>\n read: EffectRead<Subject>\n }\n): AnimateEffect<Subject>\nexport function createEffect<Subject extends object>(\n addValue: AddEffectValue<Subject>,\n options?: EffectOptions<Subject>\n): Effect<Subject>\nexport function createEffect<Subject extends object>(\n addValue: AddEffectValue<Subject>,\n { step, ...options }: EffectOptions<Subject> = {}\n): Effect<Subject> {\n const stateCache = new WeakMap<Subject, MotionValueState>()\n\n const effect = (\n subject: Subject,\n values: Record<string, MotionValue>\n ): VoidFunction => {\n const state = stateCache.get(subject) ?? new MotionValueState(step)\n\n stateCache.set(subject, state)\n\n const subscriptions: VoidFunction[] = []\n\n for (const key in values) {\n const value = values[key]\n const remove = addValue(subject, state, key, value)\n subscriptions.push(remove)\n }\n\n return () => {\n for (const cancel of subscriptions) cancel()\n }\n }\n\n return Object.assign(effect, options, {\n get: (subject: Subject, key: string) =>\n stateCache.get(subject)?.get(key),\n flush: (subject: Subject) => stateCache.get(subject)?.flush(),\n state: (subject: Subject) => stateCache.get(subject),\n })\n}\n","import { transformValueTypes } from \"../../value/types/maps/transform\"\nimport { getValueAsType } from \"../../value/types/utils/get-as-type\"\nimport { MotionValueState } from \"../MotionValueState\"\n\nconst translateAlias: Record<string, string> = {\n x: \"translateX\",\n y: \"translateY\",\n z: \"translateZ\",\n transformPerspective: \"perspective\",\n}\n\n/**\n * Cache of `translateX(`-style openers so each render is a few string\n * concatenations rather than a template per transform.\n */\nconst openers: Record<string, string> = {}\n\nexport function buildTransform(state: MotionValueState) {\n let transform = \"\"\n const { transformKeys: keys = [], transformValues: values = {} } = state\n\n /**\n * Loop over the bound transforms in order, adding the ones that\n * aren't at their default value to the transform string.\n */\n for (let i = 0; i < keys.length; i++) {\n const key = keys[i]\n const value = values[key].get()\n\n if (value === undefined) continue\n\n const parsed = typeof value === \"number\" ? value : parseFloat(value)\n\n if (parsed !== (key.startsWith(\"scale\") ? 1 : 0)) {\n transform +=\n (transform && \" \") +\n (openers[key] ||\n (openers[key] = (translateAlias[key] || key) + \"(\")) +\n getValueAsType(value, transformValueTypes[key]) +\n \")\"\n }\n }\n\n // See build-transform.ts: additive `rotate()` so user `rotate` isn't\n // clobbered. Not a `transformPropOrder` slot.\n const pathRotation = state.get(\"pathRotation\")?.get()\n if (pathRotation) {\n transform +=\n (transform && \" \") +\n \"rotate(\" +\n getValueAsType(pathRotation, transformValueTypes.pathRotation) +\n \")\"\n }\n\n return transform || \"none\"\n}\n","import { isCSSVar } from \"../../render/dom/is-css-var\"\nimport { readTransformValue } from \"../../render/dom/parse-transform\"\nimport {\n transformPropOrder,\n transformProps,\n} from \"../../render/utils/keys-transform\"\nimport { isHTMLElement } from \"../../utils/is-html-element\"\nimport { isSVGElement } from \"../../utils/is-svg-element\"\nimport { MotionValue } from \"../../value\"\nimport { numberValueTypes } from \"../../value/types/maps/number\"\nimport { getValueAsType } from \"../../value/types/utils/get-as-type\"\nimport { MotionValueState } from \"../MotionValueState\"\nimport { createSelectorEffect } from \"../utils/create-dom-effect\"\nimport { createEffect } from \"../utils/create-effect\"\nimport { buildTransform } from \"./transform\"\n\nconst originProps = new Set([\"originX\", \"originY\", \"originZ\"])\n\n/**\n * A bound value in its default unit, e.g. `originX: 50` -> `\"50%\"`.\n */\nconst styleValue = (state: MotionValueState, key: string) =>\n getValueAsType(state.get(key)?.get(), numberValueTypes[key])\n\nexport const addStyleValue = (\n element: HTMLElement | SVGElement,\n state: MotionValueState,\n key: string,\n value: MotionValue\n) => {\n let render: VoidFunction | undefined = undefined\n let computed: MotionValue | undefined = undefined\n\n if (transformProps.has(key)) {\n if (key !== \"pathRotation\") {\n const keys = (state.transformKeys ??= [])\n ;(state.transformValues ??= {})[key] = value\n\n if (!keys.includes(key)) {\n keys.push(key)\n keys.sort(\n (a, b) =>\n transformPropOrder.indexOf(a) -\n transformPropOrder.indexOf(b)\n )\n }\n }\n\n if (!state.get(\"transform\")) {\n // If this is an HTML element, we need to set the transform-box to fill-box\n // to normalise the transform relative to the element's bounding box\n if (!isHTMLElement(element) && !state.get(\"transformBox\")) {\n addStyleValue(\n element,\n state,\n \"transformBox\",\n new MotionValue(\"fill-box\")\n )\n }\n\n state.set(\"transform\", new MotionValue(\"none\"), () => {\n element.style.transform = buildTransform(state)\n })\n }\n\n computed = state.get(\"transform\")\n } else if (originProps.has(key)) {\n if (!state.get(\"transformOrigin\")) {\n state.set(\"transformOrigin\", new MotionValue(\"\"), () => {\n const originX = styleValue(state, \"originX\") ?? \"50%\"\n const originY = styleValue(state, \"originY\") ?? \"50%\"\n const originZ = styleValue(state, \"originZ\") ?? 0\n element.style.transformOrigin = `${originX} ${originY} ${originZ}`\n })\n }\n\n computed = state.get(\"transformOrigin\")\n } else if (isCSSVar(key)) {\n render = () => {\n element.style.setProperty(key, value.get() as string)\n }\n } else {\n render = () => {\n element.style[key as any] = getValueAsType(\n value.get(),\n numberValueTypes[key]\n ) as string\n }\n }\n\n return state.set(key, value, render, computed)\n}\n\nexport type StyleSubject = HTMLElement | SVGElement\n\nconst isStyleSubject = (subject: unknown): subject is StyleSubject =>\n isHTMLElement(subject) || isSVGElement(subject)\n\n/**\n * Reads the current value of a style from the element, as the initial\n * keyframe when `animate()` targets an element via this effect. Transforms\n * are parsed out of the computed matrix; everything else is the computed\n * style. Units aren't converted to match the target keyframes. A style\n * the browser can't report is 0, as a VisualElement reports it.\n */\nexport const readStyleValue = (element: StyleSubject, key: string) => {\n if (transformProps.has(key)) {\n return readTransformValue(element as HTMLElement, key)\n }\n\n const computedStyle = getComputedStyle(element)\n const value = isCSSVar(key)\n ? computedStyle.getPropertyValue(key)\n : computedStyle[key as any]\n\n return (typeof value === \"string\" && value.trim()) || 0\n}\n\n/**\n * The per-element effect `animate()` binds through, so HTML values share\n * state with a direct `styleEffect()` call. The exported `styleEffect`\n * is this wrapped to also accept selectors.\n */\nexport const styleSubjectEffect = /*@__PURE__*/ createEffect(addStyleValue, {\n test: isStyleSubject,\n read: readStyleValue,\n})\n\nexport const styleEffect = /*@__PURE__*/ createSelectorEffect(styleSubjectEffect)\n","import type { MotionNodeOptions } from \"../../../node/types\"\nimport { buildHTMLStyles } from \"../../html/utils/build-styles\"\nimport { ResolvedValues } from \"../../types\"\nimport { SVGRenderState } from \"../types\"\nimport { buildSVGPath } from \"./path\"\n\nexport const cssStyleProperties = [\n \"transform\",\n \"opacity\",\n \"offsetDistance\",\n \"offsetPath\",\n \"offsetRotate\",\n \"offsetAnchor\",\n]\n\n/**\n * Build SVG visual attributes, like cx and style.transform\n */\nexport function buildSVGAttrs(\n state: SVGRenderState,\n {\n attrX,\n attrY,\n attrScale,\n pathLength,\n pathSpacing = 1,\n pathOffset = 0,\n // This is object creation, which we try to avoid per-frame.\n ...latest\n }: ResolvedValues,\n isSVGTag: boolean,\n transformTemplate?: MotionNodeOptions[\"transformTemplate\"],\n styleProp?: Record<string, any>\n) {\n buildHTMLStyles(state, latest, transformTemplate)\n\n /**\n * For svg tags we just want to make sure viewBox is animatable and treat all the styles\n * as normal HTML tags.\n */\n if (isSVGTag) {\n if (state.style.viewBox) {\n state.attrs.viewBox = state.style.viewBox\n }\n return\n }\n\n state.attrs = state.style\n state.style = {}\n const { attrs, style } = state\n\n for (const key of cssStyleProperties) {\n if (attrs[key] !== undefined) {\n style[key] = attrs[key]\n delete attrs[key]\n }\n }\n\n if (style.transform || attrs.transformOrigin) {\n style.transformOrigin = attrs.transformOrigin ?? \"50% 50%\"\n delete attrs.transformOrigin\n }\n\n if (style.transform) {\n /**\n * SVG's element transform-origin uses its own median as a reference.\n * Therefore, transformBox becomes a fill-box\n */\n style.transformBox = (styleProp?.transformBox as string) ?? \"fill-box\"\n delete attrs.transformBox\n }\n\n // Render attrX/attrY/attrScale as attributes\n if (attrX !== undefined) attrs.x = attrX\n if (attrY !== undefined) attrs.y = attrY\n if (attrScale !== undefined) attrs.scale = attrScale\n\n // Build SVG path if one has been defined\n if (pathLength !== undefined) {\n buildSVGPath(\n attrs,\n pathLength as number,\n pathSpacing as number,\n pathOffset as number,\n false\n )\n }\n}\n","import { camelToDash } from \"../../render/dom/utils/camel-to-dash\"\nimport { MotionValue } from \"../../value\"\nimport { numberValueTypes } from \"../../value/types/maps/number\"\nimport { getValueAsType } from \"../../value/types/utils/get-as-type\"\nimport { MotionValueState } from \"../MotionValueState\"\nimport { createSelectorEffect } from \"../utils/create-dom-effect\"\nimport { createEffect } from \"../utils/create-effect\"\n\nfunction canSetAsProperty(element: HTMLElement | SVGElement, name: string) {\n if (!(name in element)) return false\n\n const descriptor =\n Object.getOwnPropertyDescriptor(Object.getPrototypeOf(element), name) ||\n Object.getOwnPropertyDescriptor(element, name)\n\n // Check if it has a setter\n return descriptor && typeof descriptor.set === \"function\"\n}\n\n/**\n * `name` is the attribute written when it differs from the key the value\n * is stored under, e.g. `attrX` -> `x`. Numbers take the attribute's\n * default unit (`x: 100` -> `\"100px\"`), as they do when key and name match.\n */\nexport const addAttrValue = (\n element: HTMLElement | SVGElement,\n state: MotionValueState,\n key: string,\n value: MotionValue,\n name: string = key\n) => {\n const isProp = canSetAsProperty(element, name)\n if (!isProp && (name.startsWith(\"data\") || name.startsWith(\"aria\"))) {\n name = camelToDash(name)\n }\n\n const type = numberValueTypes[key] || numberValueTypes[name]\n\n /**\n * Set attribute directly via property if available\n */\n const render = isProp\n ? () => {\n ;(element as any)[name] = getValueAsType(\n value.get(),\n numberValueTypes[key]\n )\n }\n : () => {\n const v = getValueAsType(value.get(), type)\n if (v === null || v === undefined) {\n element.removeAttribute(name)\n } else {\n element.setAttribute(name, String(v))\n }\n }\n\n return state.set(key, value, render)\n}\n\nexport const attrEffect = /*@__PURE__*/ createSelectorEffect(\n /*@__PURE__*/ createEffect(addAttrValue)\n)\n","import { frame } from \"../../frameloop\"\nimport { camelToDash } from \"../../render/dom/utils/camel-to-dash\"\nimport { cssStyleProperties } from \"../../render/svg/utils/build-attrs\"\nimport { transformProps } from \"../../render/utils/keys-transform\"\nimport { isSVGElement } from \"../../utils/is-svg-element\"\nimport { MotionValue } from \"../../value\"\nimport { numberValueTypes } from \"../../value/types/maps/number\"\nimport { addAttrValue } from \"../attr\"\nimport { MotionValueState } from \"../MotionValueState\"\nimport { addStyleValue, readStyleValue } from \"../style\"\nimport { createSelectorEffect } from \"../utils/create-dom-effect\"\nimport { createEffect } from \"../utils/create-effect\"\n\nfunction addSVGPathValue(\n element: SVGElement,\n state: MotionValueState,\n key: string,\n value: MotionValue\n) {\n frame.render(() => element.setAttribute(\"pathLength\", \"1\"))\n\n if (key === \"pathOffset\") {\n return state.set(key, value, () => {\n // Use unitless value to avoid Safari zoom bug\n const offset = value.get()\n element.setAttribute(\"stroke-dashoffset\", `${-offset}`)\n })\n } else {\n if (!state.get(\"stroke-dasharray\")) {\n state.set(\"stroke-dasharray\", new MotionValue(\"1 1\"), () => {\n const pathLength = state.get(\"pathLength\")?.get() ?? 1\n const pathSpacing = state.get(\"pathSpacing\")?.get()\n\n // Use unitless values to avoid Safari zoom bug\n element.setAttribute(\n \"stroke-dasharray\",\n `${pathLength} ${pathSpacing ?? 1 - Number(pathLength)}`\n )\n })\n }\n\n return state.set(key, value, undefined, state.get(\"stroke-dasharray\"))\n }\n}\n\nexport const addSVGValue = (\n element: SVGElement,\n state: MotionValueState,\n key: string,\n value: MotionValue\n) => {\n if (key.startsWith(\"path\")) {\n return addSVGPathValue(element, state, key, value)\n } else if (key.startsWith(\"attr\")) {\n return addAttrValue(element, state, key, value, convertAttrKey(key))\n }\n\n const handler = key in element.style ? addStyleValue : addAttrValue\n return handler(element, state, key, value)\n}\n\n/**\n * Reads the current value of `key` from an SVG element as the origin of\n * an animation, as the SVG VisualElement does: transforms start from\n * their defaults, the few CSS-only properties come from computed style\n * and everything else is read from the attribute, dash-cased\n * (`strokeWidth` -> `stroke-width`) or, failing that, as written\n * (`baseFrequency`).\n */\nexport const readSVGValue = (element: SVGElement, key: string) => {\n if (transformProps.has(key)) {\n return numberValueTypes[key]?.default || 0\n }\n\n if (cssStyleProperties.includes(key)) {\n return readStyleValue(element, key)\n }\n\n key = convertAttrKey(key)\n\n return (\n element.getAttribute(camelToDash(key)) ??\n element.getAttribute(key) ??\n undefined\n )\n}\n\n/**\n * The per-element effect `animate()` binds through, so SVG values share\n * state with a direct `svgEffect()` call.\n */\nexport const svgSubjectEffect = /*@__PURE__*/ createEffect(addSVGValue, {\n test: isSVGElement,\n read: readSVGValue,\n})\n\nexport const svgEffect = /*@__PURE__*/ createSelectorEffect(svgSubjectEffect)\n\nfunction convertAttrKey(key: string) {\n return key.replace(/^attr([A-Z])/, (_, firstChar) =>\n firstChar.toLowerCase()\n )\n}\n","import { BoundingBox, Box, TransformPoint } from \"motion-utils\"\n\n/**\n * Bounding boxes tend to be defined as top, left, right, bottom. For various operations\n * it's easier to consider each axis individually. This function returns a bounding box\n * as a map of single-axis min/max values.\n */\nexport function convertBoundingBoxToBox({\n top,\n left,\n right,\n bottom,\n}: BoundingBox): Box {\n return {\n x: { min: left, max: right },\n y: { min: top, max: bottom },\n }\n}\n\nexport function convertBoxToBoundingBox({ x, y }: Box): BoundingBox {\n return { top: y.min, right: x.max, bottom: y.max, left: x.min }\n}\n\n/**\n * Applies a TransformPoint function to a bounding box. TransformPoint is usually a function\n * provided by Framer to allow measured points to be corrected for device scaling. This is used\n * when measuring DOM elements and DOM event points.\n */\nexport function transformBoxPoints(\n point: BoundingBox,\n transformPoint?: TransformPoint\n) {\n if (!transformPoint) return point\n const topLeft = transformPoint({ x: point.left, y: point.top })\n const bottomRight = transformPoint({ x: point.right, y: point.bottom })\n\n return {\n top: topLeft.y,\n left: topLeft.x,\n bottom: bottomRight.y,\n right: bottomRight.x,\n }\n}\n","import { TransformPoint } from \"motion-utils\"\nimport {\n convertBoundingBoxToBox,\n transformBoxPoints,\n} from \"../geometry/conversion\"\nimport { translateAxis } from \"../geometry/delta-apply\"\n\nexport function measureViewportBox(\n instance: HTMLElement,\n transformPoint?: TransformPoint\n) {\n return convertBoundingBoxToBox(\n transformBoxPoints(instance.getBoundingClientRect(), transformPoint)\n )\n}\n\nexport function measurePageBox(\n element: HTMLElement,\n rootProjectionNode: any,\n transformPagePoint?: TransformPoint\n) {\n const viewportBox = measureViewportBox(element, transformPagePoint)\n const { scroll } = rootProjectionNode\n\n if (scroll) {\n translateAxis(viewportBox.x, scroll.offset.x)\n translateAxis(viewportBox.y, scroll.offset.y)\n }\n\n return viewportBox\n}\n","import { styleSubjectEffect, StyleSubject } from \"../../effects/style\"\nimport { svgSubjectEffect } from \"../../effects/svg\"\nimport { measureViewportBox } from \"../../projection/utils/measure\"\nimport type { VisualElement } from \"../../render/VisualElement\"\nimport { isSVGElement } from \"../../utils/is-svg-element\"\nimport { MotionValue, Owner } from \"../../value\"\nimport { DOMKeyframesResolver } from \"../keyframes/DOMKeyframesResolver\"\nimport { AnimationElement } from \"../keyframes/types\"\nimport { AnimationPlaybackControlsWithThen } from \"../types\"\nimport {\n animateEffectSubject,\n animateValues,\n EffectKeyframes,\n EffectTransition,\n} from \"./effects\"\n\nconst noProps = {}\n\ntype ElementEffect = typeof styleSubjectEffect\n\nconst getElementEffect = (element: Element) =>\n (isSVGElement(element)\n ? svgSubjectEffect\n : styleSubjectEffect) as ElementEffect\n\n/**\n * Presents an effect bound to a DOM element in the shape the DOM keyframe\n * resolver and WAAPI expect, which is that of a VisualElement. Holds no\n * state: everything delegates to the effect. Goes once the resolver takes\n * an effect and subject directly.\n */\nclass EffectSubject implements AnimationElement, Owner {\n KeyframeResolver = DOMKeyframesResolver\n\n constructor(private effect: ElementEffect, public current: StyleSubject) {}\n\n getValue(key: string) {\n return this.effect.get(this.current, key)\n }\n\n readValue(key: string, target?: unknown) {\n return this.effect.read(this.current, key, target as any)\n }\n\n render() {\n this.effect.flush(this.current)\n }\n\n measureViewportBox() {\n return measureViewportBox(this.current as HTMLElement)\n }\n\n getProps() {\n return noProps\n }\n}\n\n/**\n * Animate a DOM element's styles. HTML elements are bound through\n * styleEffect, SVG through svgEffect, and both are resolved with the DOM\n * keyframe resolver so reads are batched, units are converted by\n * measurement and eligible values run on WAAPI.\n *\n * Pass the element's VisualElement (a <motion.*> component or an\n * animateLayout() node) to animate its values instead, so the two keep\n * sharing values and a renderer.\n */\nexport function animateElement(\n element: StyleSubject,\n keyframes: EffectKeyframes,\n transition?: EffectTransition,\n visualElement?: VisualElement\n): AnimationPlaybackControlsWithThen[] {\n if (visualElement) {\n return animateValues(\n (key) => visualElement.getValue(key, null),\n keyframes,\n transition,\n visualElement\n )\n }\n\n const effect = getElementEffect(element)\n\n return animateEffectSubject(\n effect,\n element,\n keyframes,\n transition,\n new EffectSubject(effect, element)\n )\n}\n\n/**\n * Hand the values styleEffect/svgEffect are rendering on `element`,\n * whether bound by animate() or directly, to a VisualElement that now\n * owns the element (e.g. created by animateLayout()), so a single\n * renderer drives them alongside its own values.\n */\nexport function handOffElementState(\n element: Element,\n visualElement: VisualElement\n) {\n const state = getElementEffect(element).state(element as StyleSubject)\n if (!state) return\n\n const { transformKeys } = state\n state.release().forEach((value: MotionValue, key: string) => {\n /**\n * The style effect derives transform (from the bound transform\n * keys) and transformBox itself; a VisualElement builds its own.\n */\n const derived =\n key === \"transformBox\" ||\n (key === \"transform\" && transformKeys?.length)\n\n derived || visualElement.addValue(key, value)\n })\n}\n","import { isObject } from \"motion-utils\"\nimport { MotionValue } from \"../../value\"\nimport { MotionValueState } from \"../MotionValueState\"\nimport { createEffect } from \"../utils/create-effect\"\n\ninterface PropSubject {\n [key: string]: any\n}\n\n/**\n * Writes motion values to the properties of any object. This is\n * animate()'s fallback for subjects no registered effect claims.\n */\nexport const propEffect = /*@__PURE__*/ createEffect(\n (\n subject: PropSubject,\n state: MotionValueState,\n key: string,\n value: MotionValue\n ) => {\n return state.set(\n key,\n value,\n () => {\n subject[key] = value.get()\n }\n )\n },\n {\n test: (subject: unknown): subject is PropSubject => isObject(subject),\n read: (subject, key) => {\n const value = subject[key]\n return typeof value === \"string\" || typeof value === \"number\"\n ? value\n : undefined\n },\n }\n)\n","export const isDragging = {\n x: false,\n y: false,\n}\n\nexport function isDragActive() {\n return isDragging.x || isDragging.y\n}\n","import {\n ElementOrSelector,\n resolveElements,\n} from \"../../utils/resolve-elements\"\nimport { EventOptions } from \"../types\"\n\nexport function setupGesture(\n elementOrSelector: ElementOrSelector,\n options: EventOptions\n): [Element[], AddEventListenerOptions, VoidFunction] {\n const elements = resolveElements(elementOrSelector)\n\n const gestureAbortController = new AbortController()\n\n const eventOptions = {\n passive: true,\n ...options,\n signal: gestureAbortController.signal,\n }\n\n const cancel = () => gestureAbortController.abort()\n\n return [elements, eventOptions, cancel]\n}\n","import { ElementOrSelector } from \"../utils/resolve-elements\"\nimport { isDragActive } from \"./drag/state/is-active\"\nimport { EventOptions } from \"./types\"\nimport { setupGesture } from \"./utils/setup\"\n\n/**\n * A function to be called when a hover gesture starts.\n *\n * This function can optionally return a function that will be called\n * when the hover gesture ends.\n *\n * @public\n */\nexport type OnHoverStartEvent = (\n element: Element,\n event: PointerEvent\n) => void | OnHoverEndEvent\n\n/**\n * A function to be called when a hover gesture ends.\n *\n * @public\n */\nexport type OnHoverEndEvent = (event: PointerEvent) => void\n\nfunction isValidHover(event: PointerEvent) {\n return !(event.pointerType === \"touch\" || isDragActive())\n}\n\n/**\n * Create a hover gesture. hover() is different to .addEventListener(\"pointerenter\")\n * in that it has an easier syntax, filters out polyfilled touch events, interoperates\n * with drag gestures, and automatically removes the \"pointerennd\" event listener when the hover ends.\n *\n * @public\n */\nexport function hover(\n elementOrSelector: ElementOrSelector,\n onHoverStart: OnHoverStartEvent,\n options: EventOptions = {}\n): VoidFunction {\n const [elements, eventOptions, cancel] = setupGesture(\n elementOrSelector,\n options\n )\n\n elements.forEach((element) => {\n let isPressed = false\n let deferredHoverEnd = false\n let hoverEndCallback: OnHoverEndEvent | undefined\n\n const removePointerLeave = () => {\n element.removeEventListener(\n \"pointerleave\",\n onPointerLeave as EventListener\n )\n }\n\n const endHover = (event: PointerEvent) => {\n if (hoverEndCallback) {\n hoverEndCallback(event)\n hoverEndCallback = undefined\n }\n removePointerLeave()\n }\n\n const onPointerUp = (event: Event) => {\n isPressed = false\n window.removeEventListener(\n \"pointerup\",\n onPointerUp as EventListener\n )\n window.removeEventListener(\n \"pointercancel\",\n onPointerUp as EventListener\n )\n\n if (deferredHoverEnd) {\n deferredHoverEnd = false\n endHover(event as PointerEvent)\n }\n }\n\n const onPointerDown = () => {\n isPressed = true\n window.addEventListener(\n \"pointerup\",\n onPointerUp as EventListener,\n eventOptions\n )\n window.addEventListener(\n \"pointercancel\",\n onPointerUp as EventListener,\n eventOptions\n )\n }\n\n const onPointerLeave = (leaveEvent: PointerEvent) => {\n if (leaveEvent.pointerType === \"touch\") return\n\n if (isPressed) {\n deferredHoverEnd = true\n return\n }\n\n endHover(leaveEvent)\n }\n\n const onPointerEnter = (enterEvent: PointerEvent) => {\n if (!isValidHover(enterEvent)) return\n\n deferredHoverEnd = false\n\n const onHoverEnd = onHoverStart(\n element as Element,\n enterEvent\n )\n\n if (typeof onHoverEnd !== \"function\") return\n\n hoverEndCallback = onHoverEnd\n\n element.addEventListener(\n \"pointerleave\",\n onPointerLeave as EventListener,\n eventOptions\n )\n }\n\n element.addEventListener(\n \"pointerenter\",\n onPointerEnter as EventListener,\n eventOptions\n )\n element.addEventListener(\n \"pointerdown\",\n onPointerDown as EventListener,\n eventOptions\n )\n })\n\n return cancel\n}\n","/**\n * Recursively traverse up the tree to check whether the provided child node\n * is the parent or a descendant of it.\n *\n * @param parent - Element to find\n * @param child - Element to test against parent\n */\nexport const isNodeOrChild = (\n parent: Element | null,\n child?: Element | null\n): boolean => {\n if (!child) {\n return false\n } else if (parent === child) {\n return true\n } else {\n return isNodeOrChild(parent, child.parentElement)\n }\n}\n","export const isPrimaryPointer = (event: PointerEvent) => {\n if (event.pointerType === \"mouse\") {\n return typeof event.button !== \"number\" || event.button <= 0\n } else {\n /**\n * isPrimary is true for all mice buttons, whereas every touch point\n * is regarded as its own input. So subsequent concurrent touch points\n * will be false.\n *\n * Specifically match against false here as incomplete versions of\n * PointerEvents in very old browser might have it set as undefined.\n */\n return event.isPrimary !== false\n }\n}\n","const keyboardAccessibleElements = new Set([\n \"BUTTON\",\n \"INPUT\",\n \"SELECT\",\n \"TEXTAREA\",\n \"A\",\n])\n\n/**\n * Checks if an element is natively keyboard accessible (focusable).\n * Used by the press gesture to determine if we need to add tabIndex.\n */\nexport function isElementKeyboardAccessible(element: Element) {\n return (\n keyboardAccessibleElements.has(element.tagName) ||\n (element as HTMLElement).isContentEditable === true\n )\n}\n\nconst textInputElements = new Set([\"INPUT\", \"SELECT\", \"TEXTAREA\"])\n\n/**\n * Checks if an element has text selection or direct interaction behavior\n * that should block drag gestures from starting.\n *\n * This specifically targets form controls where the user might want to select\n * text or interact with the control (e.g., sliders, dropdowns).\n *\n * Buttons and links are NOT included because they don't have click-and-move\n * actions of their own - they only respond to click events, so dragging\n * should still work when initiated from these elements.\n */\nexport function isElementTextInput(element: Element) {\n return (\n textInputElements.has(element.tagName) ||\n (element as HTMLElement).isContentEditable === true\n )\n}\n","export const isPressing = new WeakSet<EventTarget>()\n","import { isPressing } from \"./state\"\n\n/**\n * Filter out events that are not \"Enter\" keys.\n */\nfunction filterEvents(callback: (event: KeyboardEvent) => void) {\n return (event: KeyboardEvent) => {\n if (event.key !== \"Enter\") return\n callback(event)\n }\n}\n\nfunction firePointerEvent(target: EventTarget, type: \"down\" | \"up\" | \"cancel\") {\n target.dispatchEvent(\n new PointerEvent(\"pointer\" + type, { isPrimary: true, bubbles: true })\n )\n}\n\nexport const enableKeyboardPress = (\n focusEvent: FocusEvent,\n eventOptions: AddEventListenerOptions\n) => {\n const element = focusEvent.currentTarget as HTMLElement\n if (!element) return\n\n const handleKeydown = filterEvents(() => {\n if (isPressing.has(element)) return\n\n firePointerEvent(element, \"down\")\n\n const handleKeyup = filterEvents(() => {\n firePointerEvent(element, \"up\")\n })\n\n const handleBlur = () => firePointerEvent(element, \"cancel\")\n\n element.addEventListener(\"keyup\", handleKeyup, eventOptions)\n element.addEventListener(\"blur\", handleBlur, eventOptions)\n })\n\n element.addEventListener(\"keydown\", handleKeydown, eventOptions)\n\n /**\n * Add an event listener that fires on blur to remove the keydown events.\n */\n element.addEventListener(\n \"blur\",\n () => element.removeEventListener(\"keydown\", handleKeydown),\n eventOptions\n )\n}\n","import { isHTMLElement } from \"../../utils/is-html-element\"\nimport { ElementOrSelector } from \"../../utils/resolve-elements\"\nimport { isDragActive } from \"../drag/state/is-active\"\nimport { EventOptions } from \"../types\"\nimport { isNodeOrChild } from \"../utils/is-node-or-child\"\nimport { isPrimaryPointer } from \"../utils/is-primary-pointer\"\nimport { setupGesture } from \"../utils/setup\"\nimport { OnPressStartEvent } from \"./types\"\nimport { isElementKeyboardAccessible } from \"./utils/is-keyboard-accessible\"\nimport { enableKeyboardPress } from \"./utils/keyboard\"\nimport { isPressing } from \"./utils/state\"\n\n/**\n * Filter out events that are not primary pointer events, or are triggering\n * while a Motion gesture is active.\n */\nfunction isValidPressEvent(event: PointerEvent) {\n return isPrimaryPointer(event) && !isDragActive()\n}\n\nconst claimedPointerDownEvents = new WeakSet<Event>()\n\nexport interface PointerEventOptions extends EventOptions {\n useGlobalTarget?: boolean\n stopPropagation?: boolean\n}\n\n/**\n * Create a press gesture.\n *\n * Press is different to `\"pointerdown\"`, `\"pointerup\"` in that it\n * automatically filters out secondary pointer events like right\n * click and multitouch.\n *\n * It also adds accessibility support for keyboards, where\n * an element with a press gesture will receive focus and\n * trigger on Enter `\"keydown\"` and `\"keyup\"` events.\n *\n * This is different to a browser's `\"click\"` event, which does\n * respond to keyboards but only for the `\"click\"` itself, rather\n * than the press start and end/cancel. The element also needs\n * to be focusable for this to work, whereas a press gesture will\n * make an element focusable by default.\n *\n * @public\n */\nexport function press(\n targetOrSelector: ElementOrSelector,\n onPressStart: OnPressStartEvent,\n options: PointerEventOptions = {}\n): VoidFunction {\n const [targets, eventOptions, cancelEvents] = setupGesture(\n targetOrSelector,\n options\n )\n\n const startPress = (startEvent: PointerEvent) => {\n const target = startEvent.currentTarget as Element\n\n if (!isValidPressEvent(startEvent)) return\n if (claimedPointerDownEvents.has(startEvent)) return\n\n isPressing.add(target)\n\n if (options.stopPropagation) {\n claimedPointerDownEvents.add(startEvent)\n }\n\n const onPressEnd = onPressStart(target, startEvent)\n\n /**\n * End listeners run in the capture phase so a descendant calling\n * stopPropagation() in its own pointerup handler can't prevent the\n * press gesture from ending. This also keeps the gesture-end\n * ordering consistent with the drag gesture. See #2794.\n */\n const endEventOptions = { ...eventOptions, capture: true }\n\n const onPointerEnd = (endEvent: PointerEvent, success: boolean) => {\n window.removeEventListener(\n \"pointerup\",\n onPointerUp,\n endEventOptions\n )\n window.removeEventListener(\n \"pointercancel\",\n onPointerCancel,\n endEventOptions\n )\n\n if (isPressing.has(target)) {\n isPressing.delete(target)\n }\n\n if (!isValidPressEvent(endEvent)) {\n return\n }\n\n if (typeof onPressEnd === \"function\") {\n onPressEnd(endEvent, { success })\n }\n }\n\n const onPointerUp = (upEvent: PointerEvent) => {\n onPointerEnd(\n upEvent,\n (target as any) === window ||\n (target as any) === document ||\n options.useGlobalTarget ||\n isNodeOrChild(target, upEvent.target as Element)\n )\n }\n\n const onPointerCancel = (cancelEvent: PointerEvent) => {\n onPointerEnd(cancelEvent, false)\n }\n\n window.addEventListener(\"pointerup\", onPointerUp, endEventOptions)\n window.addEventListener(\n \"pointercancel\",\n onPointerCancel,\n endEventOptions\n )\n }\n\n targets.forEach((target: EventTarget) => {\n const pointerDownTarget = options.useGlobalTarget ? window : target\n pointerDownTarget.addEventListener(\n \"pointerdown\",\n startPress as EventListener,\n eventOptions\n )\n\n if (isHTMLElement(target)) {\n target.addEventListener(\"focus\", (event) =>\n enableKeyboardPress(event as FocusEvent, eventOptions)\n )\n\n if (\n !isElementKeyboardAccessible(target) &&\n !target.hasAttribute(\"tabindex\")\n ) {\n target.tabIndex = 0\n }\n }\n })\n\n return cancelEvents\n}\n","import { isSVGElement } from \"../utils/is-svg-element\"\nimport { ElementOrSelector, resolveElements } from \"../utils/resolve-elements\"\nimport { ResizeHandler } from \"./types\"\n\nconst resizeHandlers = new WeakMap<Element, Set<ResizeHandler<Element>>>()\n\nlet observer: ResizeObserver | undefined\n\nconst getSize =\n (\n borderBoxAxis: \"inline\" | \"block\",\n svgAxis: \"width\" | \"height\",\n htmlAxis: \"offsetWidth\" | \"offsetHeight\"\n ) =>\n (target: Element, borderBoxSize?: ReadonlyArray<ResizeObserverSize>) => {\n if (borderBoxSize && borderBoxSize[0]) {\n return borderBoxSize[0][\n (borderBoxAxis + \"Size\") as keyof ResizeObserverSize\n ]\n } else if (isSVGElement(target) && \"getBBox\" in target) {\n return (target as SVGGraphicsElement).getBBox()[svgAxis]\n } else {\n return (target as HTMLElement)[htmlAxis]\n }\n }\n\nconst getWidth = /*@__PURE__*/ getSize(\"inline\", \"width\", \"offsetWidth\")\nconst getHeight = /*@__PURE__*/ getSize(\"block\", \"height\", \"offsetHeight\")\n\nfunction notifyTarget({ target, borderBoxSize }: ResizeObserverEntry) {\n resizeHandlers.get(target)?.forEach((handler) => {\n handler(target, {\n get width() {\n return getWidth(target, borderBoxSize)\n },\n get height() {\n return getHeight(target, borderBoxSize)\n },\n })\n })\n}\n\nfunction notifyAll(entries: ResizeObserverEntry[]) {\n entries.forEach(notifyTarget)\n}\n\nfunction createResizeObserver() {\n if (typeof ResizeObserver === \"undefined\") return\n\n observer = new ResizeObserver(notifyAll)\n}\n\nexport function resizeElement(\n target: ElementOrSelector,\n handler: ResizeHandler<Element>\n) {\n if (!observer) createResizeObserver()\n\n const elements = resolveElements(target)\n\n elements.forEach((element) => {\n let elementHandlers = resizeHandlers.get(element)\n\n if (!elementHandlers) {\n elementHandlers = new Set()\n resizeHandlers.set(element, elementHandlers)\n }\n\n elementHandlers.add(handler)\n observer?.observe(element)\n })\n\n return () => {\n elements.forEach((element) => {\n const elementHandlers = resizeHandlers.get(element)\n\n elementHandlers?.delete(handler)\n\n if (!elementHandlers?.size) {\n observer?.unobserve(element)\n }\n })\n }\n}\n","import { WindowResizeHandler } from \"./types\"\n\nconst windowCallbacks = new Set<WindowResizeHandler>()\n\nlet windowResizeHandler: VoidFunction | undefined\n\nfunction createWindowResizeHandler() {\n windowResizeHandler = () => {\n const info = {\n get width() {\n return window.innerWidth\n },\n get height() {\n return window.innerHeight\n },\n }\n\n windowCallbacks.forEach((callback) => callback(info))\n }\n\n window.addEventListener(\"resize\", windowResizeHandler)\n}\n\nexport function resizeWindow(callback: WindowResizeHandler) {\n windowCallbacks.add(callback)\n\n if (!windowResizeHandler) createWindowResizeHandler()\n\n return () => {\n windowCallbacks.delete(callback)\n\n if (\n !windowCallbacks.size &&\n typeof windowResizeHandler === \"function\"\n ) {\n window.removeEventListener(\"resize\", windowResizeHandler)\n windowResizeHandler = undefined\n }\n }\n}\n","import { ElementOrSelector } from \"../utils/resolve-elements\"\nimport { resizeElement } from \"./handle-element\"\nimport { resizeWindow } from \"./handle-window\"\nimport { ResizeHandler, WindowResizeHandler } from \"./types\"\n\nexport function resize(onResize: WindowResizeHandler): VoidFunction\nexport function resize(\n target: ElementOrSelector,\n onResize: ResizeHandler<Element>\n): VoidFunction\nexport function resize(\n a: WindowResizeHandler | ElementOrSelector,\n b?: ResizeHandler<Element>\n) {\n return typeof a === \"function\" ? resizeWindow(a) : resizeElement(a, b!)\n}\n","import { ProgressTimeline } from \"../animation/types\"\nimport { cancelFrame, frame } from \"../frameloop\"\n\ntype Update = (progress: number) => void\n\nexport function observeTimeline(update: Update, timeline: ProgressTimeline) {\n let prevProgress: number\n\n const onFrame = () => {\n const { currentTime } = timeline\n const percentage = currentTime === null ? 0 : currentTime.value\n const progress = percentage / 100\n\n if (prevProgress !== progress) {\n update(progress)\n }\n\n prevProgress = progress\n }\n\n frame.preUpdate(onFrame, true)\n\n return () => cancelFrame(onFrame)\n}\n","import type { VisualElement } from \"./VisualElement\"\n\nexport const visualElementStore = new WeakMap<any, VisualElement>()\n","import { animateMotionValue } from \"../interfaces/motion-value\"\nimport type {\n AnimationPlaybackControlsWithThen,\n AnyResolvedKeyframe,\n UnresolvedValueKeyframe,\n ValueAnimationTransition,\n} from \"../types\"\nimport {\n motionValue as createMotionValue,\n MotionValue,\n} from \"../../value\"\nimport { isMotionValue } from \"../../value/utils/is-motion-value\"\n\nexport function animateSingleValue<V extends AnyResolvedKeyframe>(\n value: MotionValue<V> | V,\n keyframes: V | UnresolvedValueKeyframe<V>[],\n options?: ValueAnimationTransition\n): AnimationPlaybackControlsWithThen {\n const motionValue = isMotionValue(value) ? value : createMotionValue(value)\n\n motionValue.start(animateMotionValue(\"\", motionValue, keyframes, options))\n\n return motionValue.animation as AnimationPlaybackControlsWithThen\n}\n","import { DOMKeyframesDefinition } from \"motion-dom\"\n\nexport function isDOMKeyframes(\n keyframes: unknown\n): keyframes is DOMKeyframesDefinition {\n return typeof keyframes === \"object\" && !Array.isArray(keyframes)\n}\n","import {\n AnimationScope,\n DOMKeyframesDefinition,\n SelectorCache,\n resolveElements,\n} from \"motion-dom\"\nimport { ObjectTarget } from \"../sequence/types\"\nimport { isDOMKeyframes } from \"../utils/is-dom-keyframes\"\n\nexport function resolveSubjects<O extends {}>(\n subject:\n | string\n | Element\n | Element[]\n | NodeListOf<Element>\n | O\n | O[]\n | null\n | undefined,\n keyframes: DOMKeyframesDefinition | ObjectTarget<O>,\n scope?: AnimationScope,\n selectorCache?: SelectorCache\n) {\n if (subject == null) {\n return []\n }\n\n if (typeof subject === \"string\" && isDOMKeyframes(keyframes)) {\n return resolveElements(subject, scope, selectorCache)\n } else if (subject instanceof NodeList) {\n return Array.from(subject)\n } else if (Array.isArray(subject)) {\n return subject.filter((s) => s != null)\n } else {\n return [subject]\n }\n}\n","export function calculateRepeatDuration(\n duration: number,\n repeat: number,\n repeatDelay: number\n): number {\n return duration * (repeat + 1) + repeatDelay * repeat\n}\n","import { SequenceTime } from \"../types\"\n\n/**\n * Given a absolute or relative time definition and current/prev time state of the sequence,\n * calculate an absolute time for the next keyframes.\n */\nexport function calcNextTime(\n current: number,\n next: SequenceTime,\n prev: number,\n labels: Map<string, number>\n): number {\n if (typeof next === \"number\") {\n return next\n } else if (next.startsWith(\"-\") || next.startsWith(\"+\")) {\n return Math.max(0, current + parseFloat(next))\n } else if (next === \"<\") {\n return prev\n } else if (next.startsWith(\"<\")) {\n return Math.max(0, prev + parseFloat(next.slice(1)))\n } else {\n return labels.get(next) ?? current\n }\n}\n","import { mixNumber, UnresolvedValueKeyframe } from \"motion-dom\"\nimport { Easing, getEasingForSegment, removeItem } from \"motion-utils\"\nimport type { ValueSequence } from \"../types\"\n\nexport function eraseKeyframes(\n sequence: ValueSequence,\n startTime: number,\n endTime: number\n): void {\n for (let i = 0; i < sequence.length; i++) {\n const keyframe = sequence[i]\n\n if (keyframe.at > startTime && keyframe.at < endTime) {\n removeItem(sequence, keyframe)\n\n // If we remove this item we have to push the pointer back one\n i--\n }\n }\n}\n\nexport function addKeyframes(\n sequence: ValueSequence,\n keyframes: UnresolvedValueKeyframe[],\n easing: Easing | Easing[],\n offset: number[],\n startTime: number,\n endTime: number\n): void {\n /**\n * Erase every existing value between currentTime and targetTime,\n * this will essentially splice this timeline into any currently\n * defined ones.\n */\n eraseKeyframes(sequence, startTime, endTime)\n\n for (let i = 0; i < keyframes.length; i++) {\n sequence.push({\n value: keyframes[i],\n at: mixNumber(startTime, endTime, offset[i]),\n easing: getEasingForSegment(easing, i),\n })\n }\n}\n","/**\n * Take an array of times that represent repeated keyframes. For instance\n * if we have original times of [0, 0.5, 1] then our repeated times will\n * be [0, 0.5, 1, 1, 1.5, 2]. Loop over the times and scale them back\n * down to a 0-1 scale.\n *\n * `repeatDelayUnits` is the repeatDelay expressed in units of a single\n * iteration's duration, so the total span equals `(repeat + 1) + repeat * repeatDelayUnits`.\n */\nexport function normalizeTimes(\n times: number[],\n repeat: number,\n repeatDelayUnits = 0\n): void {\n const totalUnits = repeat + 1 + repeat * repeatDelayUnits\n for (let i = 0; i < times.length; i++) {\n times[i] = times[i] / totalUnits\n }\n}\n","import { AbsoluteKeyframe } from \"../types\"\n\nexport function compareByTime(\n a: AbsoluteKeyframe,\n b: AbsoluteKeyframe\n): number {\n if (a.at === b.at) {\n if (a.value === null) return 1\n if (b.value === null) return -1\n return 0\n } else {\n return a.at - b.at\n }\n}\n","import {\n AnimationScope,\n createGeneratorEasing,\n defaultOffset,\n DOMKeyframesDefinition,\n AnimationOptions as DynamicAnimationOptions,\n fillOffset,\n GeneratorFactory,\n isGenerator,\n isMotionValue,\n Transition,\n UnresolvedValueKeyframe,\n type AnyResolvedKeyframe,\n type MotionValue,\n} from \"motion-dom\"\nimport {\n Easing,\n getEasingForSegment,\n progress,\n reverseEasing,\n secondsToMilliseconds,\n warning,\n} from \"motion-utils\"\nimport { resolveSubjects } from \"../animate/resolve-subjects\"\nimport {\n AnimationSequence,\n At,\n ResolvedAnimationDefinitions,\n SequenceMap,\n SequenceOptions,\n ValueSequence,\n} from \"./types\"\nimport { calculateRepeatDuration } from \"./utils/calc-repeat-duration\"\nimport { calcNextTime } from \"./utils/calc-time\"\nimport { addKeyframes } from \"./utils/edit\"\nimport { normalizeTimes } from \"./utils/normalize-times\"\nimport { compareByTime } from \"./utils/sort\"\n\nconst defaultSegmentEasing = \"easeInOut\"\n\nconst MAX_REPEAT = 20\n\nexport function createAnimationsFromSequence(\n sequence: AnimationSequence,\n { defaultTransition = {}, ...sequenceTransition }: SequenceOptions = {},\n scope?: AnimationScope,\n generators?: { [key: string]: GeneratorFactory }\n): ResolvedAnimationDefinitions {\n const defaultDuration = defaultTransition.duration || 0.3\n const animationDefinitions: ResolvedAnimationDefinitions = new Map()\n const sequences = new Map<Element | MotionValue, SequenceMap>()\n const elementCache = {}\n const timeLabels = new Map<string, number>()\n\n let prevTime = 0\n let currentTime = 0\n let totalDuration = 0\n\n /**\n * Build the timeline by mapping over the sequence array and converting\n * the definitions into keyframes and offsets with absolute time values.\n * These will later get converted into relative offsets in a second pass.\n */\n for (let i = 0; i < sequence.length; i++) {\n const segment = sequence[i]\n\n /**\n * If this is a timeline label, mark it and skip the rest of this iteration.\n */\n if (typeof segment === \"string\") {\n timeLabels.set(segment, currentTime)\n continue\n } else if (!Array.isArray(segment)) {\n timeLabels.set(\n segment.name,\n calcNextTime(currentTime, segment.at, prevTime, timeLabels)\n )\n continue\n }\n\n let [subject, keyframes, transition = {}] = segment\n\n /**\n * If a relative or absolute time value has been specified we need to resolve\n * it in relation to the currentTime.\n */\n if (transition.at !== undefined) {\n currentTime = calcNextTime(\n currentTime,\n transition.at,\n prevTime,\n timeLabels\n )\n }\n\n /**\n * Keep track of the maximum duration in this definition. This will be\n * applied to currentTime once the definition has been parsed.\n */\n let maxDuration = 0\n\n const resolveValueSequence = (\n valueKeyframes: UnresolvedValueKeyframe | UnresolvedValueKeyframe[],\n valueTransition: Transition | DynamicAnimationOptions,\n valueSequence: ValueSequence,\n elementIndex = 0,\n numSubjects = 0\n ) => {\n const valueKeyframesAsList = keyframesAsList(valueKeyframes)\n const {\n delay = 0,\n times = defaultOffset(valueKeyframesAsList),\n type = defaultTransition.type || \"keyframes\",\n repeat,\n repeatType,\n repeatDelay = 0,\n ...remainingTransition\n } = valueTransition\n let { ease = defaultTransition.ease || \"easeOut\", duration } =\n valueTransition\n\n /**\n * Resolve stagger() if defined.\n */\n const calculatedDelay =\n typeof delay === \"function\"\n ? delay(elementIndex, numSubjects)\n : delay\n\n /**\n * If this animation should and can use a spring, generate a spring easing function.\n */\n const numKeyframes = valueKeyframesAsList.length\n const createGenerator = isGenerator(type)\n ? type\n : generators?.[type || \"keyframes\"]\n\n if (numKeyframes <= 2 && createGenerator) {\n /**\n * As we're creating an easing function from a spring,\n * ideally we want to generate it using the real distance\n * between the two keyframes. However this isn't always\n * possible - in these situations we use 0-100.\n */\n let absoluteDelta = 100\n if (\n numKeyframes === 2 &&\n isNumberKeyframesArray(valueKeyframesAsList)\n ) {\n const delta =\n valueKeyframesAsList[1] - valueKeyframesAsList[0]\n absoluteDelta = Math.abs(delta)\n }\n\n const springTransition = {\n ...defaultTransition,\n ...remainingTransition,\n }\n if (duration !== undefined) {\n springTransition.duration = secondsToMilliseconds(duration)\n }\n\n const springEasing = createGeneratorEasing(\n springTransition,\n absoluteDelta,\n createGenerator\n )\n\n ease = springEasing.ease\n duration = springEasing.duration\n }\n\n duration ??= defaultDuration\n\n const startTime = currentTime + calculatedDelay\n\n /**\n * If there's only one time offset of 0, fill in a second with length 1\n */\n if (times.length === 1 && times[0] === 0) {\n times[1] = 1\n }\n\n /**\n * Fill out if offset if fewer offsets than keyframes\n */\n const remainder = times.length - valueKeyframesAsList.length\n remainder > 0 && fillOffset(times, remainder)\n\n /**\n * If only one value has been set, ie [1], push a null to the start of\n * the keyframe array. This will let us mark a keyframe at this point\n * that will later be hydrated with the previous value.\n */\n valueKeyframesAsList.length === 1 &&\n valueKeyframesAsList.unshift(null)\n\n /**\n * Segments can't express `repeat: Infinity` or very large\n * counts — they'd leave dead time after the segment or\n * explode the keyframe array. Ignore with a warning.\n */\n if (repeat) {\n warning(\n repeat < MAX_REPEAT,\n `Sequence segments can't repeat ${repeat} times — ignoring repeat option. Use a value below ${MAX_REPEAT} or apply repeat at the sequence level instead.`\n )\n }\n\n if (repeat && repeat < MAX_REPEAT) {\n /**\n * Express repeatDelay in units of a single iteration's duration\n * so it can be added to the per-iteration time offsets below\n * before they're normalized to 0-1.\n */\n const repeatDelayUnits =\n duration > 0 ? repeatDelay / duration : 0\n\n duration = calculateRepeatDuration(\n duration,\n repeat,\n repeatDelay\n )\n\n const originalKeyframes = [...valueKeyframesAsList]\n const originalTimes = [...times]\n ease = Array.isArray(ease) ? [...ease] : [ease]\n const originalEase = [...ease]\n\n /**\n * For reverse/mirror, alternate iterations play the segment\n * backwards. mirror matches JSAnimation's mirroredGenerator:\n * reversed keyframes, easings unchanged. reverse matches\n * JSAnimation's iterationProgress = 1 - p: reversed\n * keyframes, easing array reversed AND each function easing\n * mapped through reverseEasing (string easings unchanged —\n * they're resolved later by the keyframes engine).\n */\n const isFlipping =\n repeatType === \"reverse\" || repeatType === \"mirror\"\n let flippedKeyframes = originalKeyframes\n let flippedEases = originalEase\n if (isFlipping) {\n flippedKeyframes = [...originalKeyframes].reverse()\n if (repeatType === \"reverse\") {\n flippedEases = [...originalEase]\n .reverse()\n .map((e) =>\n typeof e === \"function\"\n ? reverseEasing(e)\n : e\n )\n }\n }\n\n for (\n let repeatIndex = 0;\n repeatIndex < repeat;\n repeatIndex++\n ) {\n const isFlipped = isFlipping && repeatIndex % 2 === 0\n const iterKeyframes = isFlipped\n ? flippedKeyframes\n : originalKeyframes\n const iterEase = isFlipped ? flippedEases : originalEase\n const iterStartOffset =\n (repeatIndex + 1) * (1 + repeatDelayUnits)\n\n /**\n * If repeatDelay is set, hold the previous iteration's\n * final value through the delay by inserting a keyframe\n * at the moment the next iteration begins.\n */\n if (repeatDelayUnits > 0) {\n valueKeyframesAsList.push(\n valueKeyframesAsList[\n valueKeyframesAsList.length - 1\n ]\n )\n times.push(iterStartOffset)\n ease.push(\"linear\")\n }\n\n valueKeyframesAsList.push(...iterKeyframes)\n\n for (\n let keyframeIndex = 0;\n keyframeIndex < iterKeyframes.length;\n keyframeIndex++\n ) {\n times.push(\n originalTimes[keyframeIndex] + iterStartOffset\n )\n ease.push(\n keyframeIndex === 0\n ? \"linear\"\n : getEasingForSegment(\n iterEase,\n keyframeIndex - 1\n )\n )\n }\n }\n\n normalizeTimes(times, repeat, repeatDelayUnits)\n }\n\n const targetTime = startTime + duration\n\n /**\n * Add keyframes, mapping offsets to absolute time.\n */\n addKeyframes(\n valueSequence,\n valueKeyframesAsList,\n ease as Easing | Easing[],\n times,\n startTime,\n targetTime\n )\n\n maxDuration = Math.max(calculatedDelay + duration, maxDuration)\n totalDuration = Math.max(targetTime, totalDuration)\n }\n\n if (isMotionValue(subject)) {\n const subjectSequence = getSubjectSequence(subject, sequences)\n resolveValueSequence(\n keyframes as AnyResolvedKeyframe,\n transition,\n getValueSequence(\"default\", subjectSequence)\n )\n } else {\n const subjects = resolveSubjects(\n subject,\n keyframes as DOMKeyframesDefinition,\n scope,\n elementCache\n )\n\n const numSubjects = subjects.length\n\n /**\n * For every element in this segment, process the defined values.\n */\n for (\n let subjectIndex = 0;\n subjectIndex < numSubjects;\n subjectIndex++\n ) {\n /**\n * Cast necessary, but we know these are of this type\n */\n keyframes = keyframes as DOMKeyframesDefinition\n transition = transition as DynamicAnimationOptions\n\n const thisSubject = subjects[subjectIndex]\n const subjectSequence = getSubjectSequence(\n thisSubject,\n sequences\n )\n\n for (const key in keyframes) {\n resolveValueSequence(\n keyframes[\n key as keyof typeof keyframes\n ] as UnresolvedValueKeyframe,\n getValueTransition(transition, key),\n getValueSequence(key, subjectSequence),\n subjectIndex,\n numSubjects\n )\n }\n }\n }\n\n prevTime = currentTime\n currentTime += maxDuration\n }\n\n /**\n * For every element and value combination create a new animation.\n */\n sequences.forEach((valueSequences, element) => {\n for (const key in valueSequences) {\n const valueSequence = valueSequences[key]\n\n /**\n * Arrange all the keyframes in ascending time order.\n */\n valueSequence.sort(compareByTime)\n\n const keyframes: UnresolvedValueKeyframe[] = []\n const valueOffset: number[] = []\n const valueEasing: Easing[] = []\n\n /**\n * For each keyframe, translate absolute times into\n * relative offsets based on the total duration of the timeline.\n */\n for (let i = 0; i < valueSequence.length; i++) {\n const { at, value, easing } = valueSequence[i]\n keyframes.push(value)\n valueOffset.push(progress(0, totalDuration, at))\n valueEasing.push(easing || \"easeOut\")\n }\n\n /**\n * If the first keyframe doesn't land on offset: 0\n * provide one by duplicating the initial keyframe. This ensures\n * it snaps to the first keyframe when the animation starts.\n */\n if (valueOffset[0] !== 0) {\n valueOffset.unshift(0)\n keyframes.unshift(keyframes[0])\n valueEasing.unshift(defaultSegmentEasing)\n }\n\n /**\n * If the last keyframe doesn't land on offset: 1\n * provide one with a null wildcard value. This will ensure it\n * stays static until the end of the animation.\n */\n if (valueOffset[valueOffset.length - 1] !== 1) {\n valueOffset.push(1)\n keyframes.push(null)\n }\n\n if (!animationDefinitions.has(element)) {\n animationDefinitions.set(element, {\n keyframes: {},\n transition: {},\n })\n }\n\n const definition = animationDefinitions.get(element)!\n\n definition.keyframes[key] = keyframes\n\n /**\n * Exclude `type` from defaultTransition since springs have been\n * converted to duration-based easing functions in resolveValueSequence.\n * Including `type: \"spring\"` would cause JSAnimation to error when\n * the merged keyframes array has more than 2 keyframes.\n */\n const { type: _type, ...remainingDefaultTransition } =\n defaultTransition\n definition.transition[key] = {\n ...remainingDefaultTransition,\n duration: totalDuration,\n ease: valueEasing,\n times: valueOffset,\n ...sequenceTransition,\n }\n }\n })\n\n return animationDefinitions\n}\n\nfunction getSubjectSequence<O extends {}>(\n subject: Element | MotionValue | O,\n sequences: Map<Element | MotionValue | O, SequenceMap>\n): SequenceMap {\n !sequences.has(subject) && sequences.set(subject, {})\n return sequences.get(subject)!\n}\n\nfunction getValueSequence(name: string, sequences: SequenceMap): ValueSequence {\n if (!sequences[name]) sequences[name] = []\n return sequences[name]\n}\n\nfunction keyframesAsList(\n keyframes: UnresolvedValueKeyframe | UnresolvedValueKeyframe[]\n): UnresolvedValueKeyframe[] {\n return Array.isArray(keyframes) ? keyframes : [keyframes]\n}\n\nexport function getValueTransition(\n transition: DynamicAnimationOptions & At,\n key: string\n): DynamicAnimationOptions {\n return transition && transition[key as keyof typeof transition]\n ? {\n ...transition,\n ...(transition[key as keyof typeof transition] as Transition),\n }\n : { ...transition }\n}\n\nconst isNumber = (keyframe: unknown) => typeof keyframe === \"number\"\nconst isNumberKeyframesArray = (\n keyframes: UnresolvedValueKeyframe[]\n): keyframes is number[] => keyframes.every(isNumber)\n","import {\n animateEffectSubject,\n animateElement,\n AnimationPlaybackControlsWithThen,\n AnimationScope,\n AnyResolvedKeyframe,\n DOMKeyframesDefinition,\n AnimationOptions as DynamicAnimationOptions,\n EffectKeyframes,\n EffectTransition,\n ElementOrSelector,\n findEffect,\n isMotionValue,\n MotionValue,\n propEffect,\n UnresolvedValueKeyframe,\n ValueAnimationTransition,\n visualElementStore,\n} from \"motion-dom\"\nimport { invariant } from \"motion-utils\"\nimport { ObjectTarget } from \"../sequence/types\"\nimport { isDOMKeyframes } from \"../utils/is-dom-keyframes\"\nimport { resolveSubjects } from \"./resolve-subjects\"\nimport { animateSingleValue } from \"motion-dom\"\n\nexport type AnimationSubject = Element | MotionValue<any> | any\n\nfunction isSingleValue(\n subject: unknown,\n keyframes: unknown\n): subject is MotionValue | AnyResolvedKeyframe {\n return (\n isMotionValue(subject) ||\n typeof subject === \"number\" ||\n (typeof subject === \"string\" && !isDOMKeyframes(keyframes))\n )\n}\n\n/**\n * Animate a string\n */\nexport function animateSubject(\n value: string | MotionValue<string>,\n keyframes: string | UnresolvedValueKeyframe<string>[],\n options?: ValueAnimationTransition<string>\n): AnimationPlaybackControlsWithThen[]\n/**\n * Animate a number\n */\nexport function animateSubject(\n value: number | MotionValue<number>,\n keyframes: number | UnresolvedValueKeyframe<number>[],\n options?: ValueAnimationTransition<number>\n): AnimationPlaybackControlsWithThen[]\n/**\n * Animate a Element\n */\nexport function animateSubject(\n element: ElementOrSelector,\n keyframes: DOMKeyframesDefinition,\n options?: DynamicAnimationOptions,\n scope?: AnimationScope\n): AnimationPlaybackControlsWithThen[]\n/**\n * Animate a object\n */\nexport function animateSubject<O extends Object>(\n object: O | O[],\n keyframes: ObjectTarget<O>,\n options?: DynamicAnimationOptions\n): AnimationPlaybackControlsWithThen[]\n/**\n * Implementation\n */\nexport function animateSubject<O extends Object>(\n subject:\n | MotionValue<number>\n | MotionValue<string>\n | number\n | string\n | ElementOrSelector\n | O\n | O[],\n keyframes:\n | number\n | string\n | UnresolvedValueKeyframe<number>[]\n | UnresolvedValueKeyframe<string>[]\n | DOMKeyframesDefinition\n | ObjectTarget<O>,\n options?:\n | ValueAnimationTransition<number>\n | ValueAnimationTransition<string>\n | DynamicAnimationOptions,\n scope?: AnimationScope\n): AnimationPlaybackControlsWithThen[] {\n const animations: AnimationPlaybackControlsWithThen[] = []\n\n if (isSingleValue(subject, keyframes)) {\n animations.push(\n animateSingleValue(\n subject,\n isDOMKeyframes(keyframes)\n ? (keyframes as any).default || keyframes\n : keyframes,\n options ? (options as any).default || options : options\n )\n )\n } else {\n // Gracefully handle null/undefined subjects (e.g., from querySelector returning null)\n if (subject == null) {\n return animations\n }\n\n const subjects = resolveSubjects(\n subject,\n keyframes as DOMKeyframesDefinition,\n scope\n )\n\n const numSubjects = subjects.length\n\n invariant(\n Boolean(numSubjects),\n \"No valid elements provided.\",\n \"no-valid-elements\"\n )\n\n for (let i = 0; i < numSubjects; i++) {\n const thisSubject = subjects[i]\n const transition = { ...options }\n\n /**\n * Resolve stagger function if provided.\n */\n if (\n \"delay\" in transition &&\n typeof transition.delay === \"function\"\n ) {\n transition.delay = transition.delay(i, numSubjects)\n }\n\n if (thisSubject instanceof Element) {\n /**\n * An element already owned by a VisualElement (a <motion.*>\n * component or animateLayout()) animates its values so they\n * share one renderer. Anything else is driven through\n * styleEffect (or svgEffect) and the DOM keyframe resolver,\n * without creating a VisualElement.\n */\n animations.push(\n ...animateElement(\n thisSubject as HTMLElement | SVGElement,\n keyframes as EffectKeyframes,\n transition as EffectTransition,\n visualElementStore.get(thisSubject)\n )\n )\n } else {\n /**\n * Registered effects (animate.addEffect) claim non-DOM\n * subjects before we fall back to writing plain properties.\n */\n animations.push(\n ...animateEffectSubject(\n findEffect(thisSubject) ?? propEffect,\n thisSubject as object,\n keyframes as EffectKeyframes,\n transition as EffectTransition\n )\n )\n }\n }\n }\n\n return animations\n}\n","import {\n AnimationPlaybackControlsWithThen,\n AnimationScope,\n motionValue,\n spring,\n} from \"motion-dom\"\nimport { createAnimationsFromSequence } from \"../sequence/create\"\nimport { AnimationSequence, SequenceOptions } from \"../sequence/types\"\nimport { animateSubject } from \"./subject\"\n\nexport function animateSequence(\n sequence: AnimationSequence,\n options?: SequenceOptions,\n scope?: AnimationScope\n) {\n const animations: AnimationPlaybackControlsWithThen[] = []\n\n /**\n * Pre-process: replace function segments with MotionValue segments,\n * subscribe callbacks immediately\n */\n const processedSequence = sequence.map((segment) => {\n if (Array.isArray(segment) && typeof segment[0] === \"function\") {\n const callback = segment[0] as (value: any) => void\n const mv = motionValue(0)\n mv.on(\"change\", callback)\n\n if (segment.length === 1) {\n return [mv, [0, 1]] as any\n } else if (segment.length === 2) {\n return [mv, [0, 1], segment[1]] as any\n } else {\n return [mv, segment[1], segment[2]] as any\n }\n }\n return segment\n }) as AnimationSequence\n\n const animationDefinitions = createAnimationsFromSequence(\n processedSequence,\n options,\n scope,\n { spring }\n )\n\n animationDefinitions.forEach(({ keyframes, transition }, subject) => {\n animations.push(...animateSubject(subject, keyframes, transition))\n })\n\n return animations\n}\n","import type {\n AnimationPlaybackControlsWithThen,\n AnimationScope,\n DOMKeyframesDefinition,\n AnimationOptions as DynamicAnimationOptions,\n ElementOrSelector,\n MotionValue,\n UnresolvedValueKeyframe,\n ValueAnimationTransition,\n} from \"motion-dom\"\nimport { addEffect, GroupAnimationWithThen, removeEffect } from \"motion-dom\"\nimport { removeItem } from \"motion-utils\"\nimport {\n AnimationSequence,\n ObjectTarget,\n SequenceOptions,\n} from \"../sequence/types\"\nimport { animateSequence } from \"./sequence\"\nimport { animateSubject } from \"./subject\"\n\nfunction isSequence(value: unknown): value is AnimationSequence {\n return Array.isArray(value) && value.some(Array.isArray)\n}\n\ninterface ScopedAnimateOptions {\n scope?: AnimationScope\n reduceMotion?: boolean\n skipAnimations?: boolean\n}\n\n/**\n * Creates an animation function that is optionally scoped\n * to a specific element.\n */\nexport function createScopedAnimate(options: ScopedAnimateOptions = {}) {\n const { scope, reduceMotion, skipAnimations } = options\n /**\n * Animate a sequence\n */\n function scopedAnimate(\n sequence: AnimationSequence,\n options?: SequenceOptions\n ): AnimationPlaybackControlsWithThen\n /**\n * Animate a string\n */\n function scopedAnimate(\n value: string | MotionValue<string>,\n keyframes: string | UnresolvedValueKeyframe<string>[],\n options?: ValueAnimationTransition<string>\n ): AnimationPlaybackControlsWithThen\n /**\n * Animate a number\n */\n function scopedAnimate(\n value: number | MotionValue<number>,\n keyframes: number | UnresolvedValueKeyframe<number>[],\n options?: ValueAnimationTransition<number>\n ): AnimationPlaybackControlsWithThen\n /**\n * Animate a generic motion value\n */\n function scopedAnimate<V extends string | number>(\n value: V | MotionValue<V>,\n keyframes: V | UnresolvedValueKeyframe<V>[],\n options?: ValueAnimationTransition<V>\n ): AnimationPlaybackControlsWithThen\n /**\n * Animate an Element\n */\n function scopedAnimate(\n element: ElementOrSelector,\n keyframes: DOMKeyframesDefinition,\n options?: DynamicAnimationOptions\n ): AnimationPlaybackControlsWithThen\n /**\n * Animate an object\n */\n function scopedAnimate<O extends {}>(\n object: O | O[],\n keyframes: ObjectTarget<O>,\n options?: DynamicAnimationOptions\n ): AnimationPlaybackControlsWithThen\n /**\n * Implementation\n */\n function scopedAnimate<O extends {}>(\n subjectOrSequence:\n | AnimationSequence\n | MotionValue<number>\n | MotionValue<string>\n | number\n | string\n | ElementOrSelector\n | O\n | O[],\n optionsOrKeyframes?:\n | SequenceOptions\n | number\n | string\n | UnresolvedValueKeyframe<number>[]\n | UnresolvedValueKeyframe<string>[]\n | DOMKeyframesDefinition\n | ObjectTarget<O>,\n options?:\n | ValueAnimationTransition<number>\n | ValueAnimationTransition<string>\n | DynamicAnimationOptions\n ): AnimationPlaybackControlsWithThen {\n let animations: AnimationPlaybackControlsWithThen[] = []\n let animationOnComplete: VoidFunction | undefined\n\n const inherited: { reduceMotion?: boolean; skipAnimations?: boolean } =\n {}\n if (reduceMotion !== undefined) inherited.reduceMotion = reduceMotion\n if (skipAnimations !== undefined)\n inherited.skipAnimations = skipAnimations\n\n if (isSequence(subjectOrSequence)) {\n const { onComplete, ...sequenceOptions } =\n (optionsOrKeyframes as SequenceOptions) || {}\n if (typeof onComplete === \"function\") {\n animationOnComplete = onComplete as VoidFunction\n }\n animations = animateSequence(\n subjectOrSequence,\n { ...inherited, ...sequenceOptions } as SequenceOptions,\n scope\n )\n } else {\n // Extract top-level onComplete so it doesn't get applied per-value\n const { onComplete, ...rest } = options || {}\n if (typeof onComplete === \"function\") {\n animationOnComplete = onComplete as VoidFunction\n }\n animations = animateSubject(\n subjectOrSequence as ElementOrSelector,\n optionsOrKeyframes as DOMKeyframesDefinition,\n { ...inherited, ...rest } as DynamicAnimationOptions,\n scope\n )\n }\n\n const animation = new GroupAnimationWithThen(animations)\n\n if (animationOnComplete) {\n animation.finished.then(animationOnComplete)\n }\n\n if (scope) {\n scope.animations.push(animation)\n animation.finished.then(() => {\n removeItem(scope.animations, animation)\n })\n }\n\n return animation\n }\n\n return scopedAnimate\n}\n\nexport const animate = Object.assign(createScopedAnimate(), {\n /**\n * Register an effect so `animate()` can animate the subjects it\n * claims, for instance `animate.addEffect(threeEffect)`. The most\n * recently added effect is tested first. DOM elements are always\n * animated directly.\n */\n addEffect,\n removeEffect,\n})\n","import { supportsScrollTimeline, supportsViewTimeline } from \"motion-dom\"\n\nexport function canUseNativeTimeline(target?: Element) {\n if (typeof window === \"undefined\") return false\n return target ? supportsViewTimeline() : supportsScrollTimeline()\n}\n","import { progress, velocityPerSecond } from \"motion-utils\"\nimport { AxisScrollInfo, ScrollInfo } from \"./types\"\n\n/**\n * A time in milliseconds, beyond which we consider the scroll velocity to be 0.\n */\nconst maxElapsed = 50\n\nconst createAxisInfo = (): AxisScrollInfo => ({\n current: 0,\n offset: [],\n progress: 0,\n scrollLength: 0,\n targetOffset: 0,\n targetLength: 0,\n containerLength: 0,\n velocity: 0,\n})\n\nexport const createScrollInfo = (): ScrollInfo => ({\n time: 0,\n x: createAxisInfo(),\n y: createAxisInfo(),\n})\n\nconst keys = {\n x: {\n length: \"Width\",\n position: \"Left\",\n },\n y: {\n length: \"Height\",\n position: \"Top\",\n },\n} as const\n\nfunction updateAxisInfo(\n element: Element,\n axisName: \"x\" | \"y\",\n info: ScrollInfo,\n time: number\n) {\n const axis = info[axisName]\n const { length, position } = keys[axisName]\n\n const prev = axis.current\n const prevTime = info.time\n\n axis.current = Math.abs(element[`scroll${position}`])\n axis.scrollLength = element[`scroll${length}`] - element[`client${length}`]\n\n axis.offset.length = 0\n axis.offset[0] = 0\n axis.offset[1] = axis.scrollLength\n axis.progress = progress(0, axis.scrollLength, axis.current)\n\n const elapsed = time - prevTime\n axis.velocity =\n elapsed > maxElapsed\n ? 0\n : velocityPerSecond(axis.current - prev, elapsed)\n}\n\nexport function updateScrollInfo(\n element: Element,\n info: ScrollInfo,\n time: number\n) {\n updateAxisInfo(element, \"x\", info, time)\n updateAxisInfo(element, \"y\", info, time)\n info.time = time\n}\n","import { isHTMLElement } from \"motion-dom\"\n\nexport function calcInset(element: Element, container: Element) {\n const inset = { x: 0, y: 0 }\n\n let current: Element | null = element\n while (current && current !== container) {\n if (isHTMLElement(current)) {\n inset.x += current.offsetLeft\n inset.y += current.offsetTop\n current = current.offsetParent\n } else if (current.tagName === \"svg\") {\n /**\n * This isn't an ideal approach to measuring the offset of <svg /> tags.\n * It would be preferable, given they behave like HTMLElements in most ways\n * to use offsetLeft/Top. But these don't exist on <svg />. Likewise we\n * can't use .getBBox() like most SVG elements as these provide the offset\n * relative to the SVG itself, which for <svg /> is usually 0x0.\n */\n const svgBoundingBox = current.getBoundingClientRect()\n current = current.parentElement!\n const parentBoundingBox = current.getBoundingClientRect()\n inset.x += svgBoundingBox.left - parentBoundingBox.left\n inset.y += svgBoundingBox.top - parentBoundingBox.top\n } else if (current instanceof SVGGraphicsElement) {\n const { x, y } = current.getBBox()\n inset.x += x\n inset.y += y\n\n let svg: SVGElement | null = null\n let parent: SVGElement = current.parentNode as SVGElement\n while (!svg) {\n if (parent.tagName === \"svg\") {\n svg = parent\n }\n parent = current.parentNode as SVGElement\n }\n current = svg\n } else {\n break\n }\n }\n\n return inset\n}\n","import { Edge, NamedEdges } from \"../types\"\n\nexport const namedEdges: Record<NamedEdges, number> = {\n start: 0,\n center: 0.5,\n end: 1,\n}\n\nexport function resolveEdge(edge: Edge, length: number, inset = 0) {\n let delta = 0\n\n /**\n * If we have this edge defined as a preset, replace the definition\n * with the numerical value.\n */\n if (edge in namedEdges) {\n edge = namedEdges[edge as NamedEdges]\n }\n\n /**\n * Handle unit values\n */\n if (typeof edge === \"string\") {\n const asNumber = parseFloat(edge)\n\n if (edge.endsWith(\"px\")) {\n delta = asNumber\n } else if (edge.endsWith(\"%\")) {\n edge = asNumber / 100\n } else if (edge.endsWith(\"vw\")) {\n delta = (asNumber / 100) * document.documentElement.clientWidth\n } else if (edge.endsWith(\"vh\")) {\n delta = (asNumber / 100) * document.documentElement.clientHeight\n } else {\n edge = asNumber\n }\n }\n\n /**\n * If the edge is defined as a number, handle as a progress value.\n */\n if (typeof edge === \"number\") {\n delta = length * edge\n }\n\n return inset + delta\n}\n","import { Edge, EdgeString, Intersection, ProgressIntersection } from \"../types\"\nimport { namedEdges, resolveEdge } from \"./edge\"\n\nconst defaultOffset: ProgressIntersection = [0, 0]\n\nexport function resolveOffset(\n offset: Edge | Intersection | ProgressIntersection,\n containerLength: number,\n targetLength: number,\n targetInset: number\n) {\n let offsetDefinition: ProgressIntersection | [EdgeString, EdgeString] =\n Array.isArray(offset) ? offset : defaultOffset\n\n let targetPoint = 0\n let containerPoint = 0\n\n if (typeof offset === \"number\") {\n /**\n * If we're provided offset: [0, 0.5, 1] then each number x should become\n * [x, x], so we default to the behaviour of mapping 0 => 0 of both target\n * and container etc.\n */\n offsetDefinition = [offset, offset]\n } else if (typeof offset === \"string\") {\n offset = offset.trim() as EdgeString\n\n if (offset.includes(\" \")) {\n offsetDefinition = offset.split(\" \") as [EdgeString, EdgeString]\n } else {\n /**\n * If we're provided a definition like \"100px\" then we want to apply\n * that only to the top of the target point, leaving the container at 0.\n * Whereas a named offset like \"end\" should be applied to both.\n */\n offsetDefinition = [offset, namedEdges[offset as keyof typeof namedEdges] ? offset : `0`]\n }\n }\n\n targetPoint = resolveEdge(offsetDefinition[0], targetLength, targetInset)\n containerPoint = resolveEdge(offsetDefinition[1], containerLength)\n\n return targetPoint - containerPoint\n}\n","import { ProgressIntersection } from \"../types\"\n\nexport const ScrollOffset: Record<string, ProgressIntersection[]> = {\n Enter: [\n [0, 1],\n [1, 1],\n ],\n Exit: [\n [0, 0],\n [1, 0],\n ],\n Any: [\n [1, 0],\n [0, 1],\n ],\n All: [\n [0, 0],\n [1, 1],\n ],\n}\n","import { defaultOffset, interpolate } from \"motion-dom\"\nimport { clamp } from \"motion-utils\"\nimport { ScrollInfo, ScrollInfoOptions } from \"../types\"\nimport { calcInset } from \"./inset\"\nimport { resolveOffset } from \"./offset\"\nimport { ScrollOffset } from \"./presets\"\n\nconst point = { x: 0, y: 0 }\n\nfunction getTargetSize(target: Element) {\n return \"getBBox\" in target && target.tagName !== \"svg\"\n ? (target as SVGGraphicsElement).getBBox()\n : { width: target.clientWidth, height: target.clientHeight }\n}\n\nexport function resolveOffsets(\n container: Element,\n info: ScrollInfo,\n options: ScrollInfoOptions\n) {\n const { offset: offsetDefinition = ScrollOffset.All } = options\n const { target = container, axis = \"y\" } = options\n const lengthLabel = axis === \"y\" ? \"height\" : \"width\"\n\n const inset = target !== container ? calcInset(target, container) : point\n\n /**\n * Measure the target and container. If they're the same thing then we\n * use the container's scrollWidth/Height as the target, from there\n * all other calculations can remain the same.\n */\n const targetSize =\n target === container\n ? { width: container.scrollWidth, height: container.scrollHeight }\n : getTargetSize(target)\n\n const containerSize = {\n width: container.clientWidth,\n height: container.clientHeight,\n }\n\n /**\n * Reset the length of the resolved offset array rather than creating a new one.\n * TODO: More reusable data structures for targetSize/containerSize would also be good.\n */\n info[axis].offset.length = 0\n\n /**\n * Populate the offset array by resolving the user's offset definition into\n * a list of pixel scroll offets.\n */\n let hasChanged = !info[axis].interpolate\n\n const numOffsets = offsetDefinition.length\n for (let i = 0; i < numOffsets; i++) {\n const offset = resolveOffset(\n offsetDefinition[i],\n containerSize[lengthLabel],\n targetSize[lengthLabel],\n inset[axis]\n )\n\n if (!hasChanged && offset !== info[axis].interpolatorOffsets![i]) {\n hasChanged = true\n }\n\n info[axis].offset[i] = offset\n }\n\n /**\n * If the pixel scroll offsets have changed, create a new interpolator function\n * to map scroll value into a progress.\n */\n if (hasChanged) {\n info[axis].interpolate = interpolate(\n info[axis].offset,\n defaultOffset(offsetDefinition),\n { clamp: false }\n )\n\n info[axis].interpolatorOffsets = [...info[axis].offset]\n }\n\n info[axis].progress = clamp(\n 0,\n 1,\n info[axis].interpolate!(info[axis].current)\n )\n}\n","import { warnOnce } from \"motion-utils\"\nimport { updateScrollInfo } from \"./info\"\nimport { resolveOffsets } from \"./offsets/index\"\nimport {\n OnScrollHandler,\n OnScrollInfo,\n ScrollInfo,\n ScrollInfoOptions,\n} from \"./types\"\n\nfunction measure(\n container: Element,\n target: Element = container,\n info: ScrollInfo\n) {\n /**\n * Find inset of target within scrollable container\n */\n info.x.targetOffset = 0\n info.y.targetOffset = 0\n if (target !== container) {\n let node = target as HTMLElement\n while (node && node !== container) {\n info.x.targetOffset += node.offsetLeft\n info.y.targetOffset += node.offsetTop\n node = node.offsetParent as HTMLElement\n }\n }\n\n info.x.targetLength =\n target === container ? target.scrollWidth : target.clientWidth\n info.y.targetLength =\n target === container ? target.scrollHeight : target.clientHeight\n info.x.containerLength = container.clientWidth\n info.y.containerLength = container.clientHeight\n\n /**\n * In development mode ensure scroll containers aren't position: static as this makes\n * it difficult to measure their relative positions. The document scrolling element\n * is exempt: offsetParent measurements naturally resolve relative to the document.\n */\n if (process.env.NODE_ENV !== \"production\") {\n if (\n container &&\n target &&\n target !== container &&\n container !== document.documentElement &&\n container !== document.scrollingElement &&\n container !== document.body\n ) {\n warnOnce(\n getComputedStyle(container).position !== \"static\",\n \"Please ensure that the container has a non-static position, like 'relative', 'fixed', or 'absolute' to ensure scroll offset is calculated correctly.\"\n )\n }\n }\n}\n\nexport function createOnScrollHandler(\n element: Element,\n onScroll: OnScrollInfo,\n info: ScrollInfo,\n options: ScrollInfoOptions = {}\n): OnScrollHandler {\n return {\n measure: (time) => {\n measure(element, options.target, info)\n updateScrollInfo(element, info, time)\n\n if (options.offset || options.target) {\n resolveOffsets(element, info, options)\n }\n },\n notify: () => onScroll(info),\n }\n}\n","import { cancelFrame, frame, frameData, resize, Process } from \"motion-dom\"\nimport { noop } from \"motion-utils\"\nimport { createScrollInfo } from \"./info\"\nimport { createOnScrollHandler } from \"./on-scroll-handler\"\nimport { OnScrollHandler, OnScrollInfo, ScrollInfoOptions } from \"./types\"\n\nconst scrollListeners = new WeakMap<Element, VoidFunction>()\nconst resizeListeners = new WeakMap<Element, VoidFunction>()\nconst onScrollHandlers = new WeakMap<Element, Set<OnScrollHandler>>()\nconst scrollSize = new WeakMap<Element, { width: number; height: number }>()\nconst dimensionCheckProcesses = new WeakMap<Element, Process>()\n\nexport type ScrollTargets = Array<HTMLElement>\n\nconst getEventTarget = (element: Element) =>\n element === document.scrollingElement ? window : element\n\nexport function scrollInfo(\n onScroll: OnScrollInfo,\n {\n container = document.scrollingElement as Element,\n trackContentSize = false,\n ...options\n }: ScrollInfoOptions = {}\n) {\n if (!container) return noop as VoidFunction\n\n let containerHandlers = onScrollHandlers.get(container)\n\n /**\n * Get the onScroll handlers for this container.\n * If one isn't found, create a new one.\n */\n if (!containerHandlers) {\n containerHandlers = new Set()\n onScrollHandlers.set(container, containerHandlers)\n }\n\n /**\n * Create a new onScroll handler for the provided callback.\n */\n const info = createScrollInfo()\n const containerHandler = createOnScrollHandler(\n container,\n onScroll,\n info,\n options\n )\n containerHandlers.add(containerHandler)\n\n /**\n * Check if there's a scroll event listener for this container.\n * If not, create one.\n */\n if (!scrollListeners.has(container)) {\n const measureAll = () => {\n for (const handler of containerHandlers) {\n handler.measure(frameData.timestamp)\n }\n\n frame.preUpdate(notifyAll)\n }\n\n const notifyAll = () => {\n for (const handler of containerHandlers) {\n handler.notify()\n }\n }\n\n const listener = () => frame.read(measureAll)\n\n scrollListeners.set(container, listener)\n\n const target = getEventTarget(container)\n window.addEventListener(\"resize\", listener)\n if (container !== document.documentElement) {\n resizeListeners.set(container, resize(container, listener))\n }\n\n target.addEventListener(\"scroll\", listener)\n\n listener()\n }\n\n /**\n * Enable content size tracking if requested and not already enabled.\n */\n if (trackContentSize && !dimensionCheckProcesses.has(container)) {\n const listener = scrollListeners.get(container)!\n\n // Store initial scroll dimensions (object is reused to avoid allocation)\n const size = {\n width: container.scrollWidth,\n height: container.scrollHeight,\n }\n scrollSize.set(container, size)\n\n // Add frame-based scroll dimension checking to detect content changes\n const checkScrollDimensions: Process = () => {\n const newWidth = container.scrollWidth\n const newHeight = container.scrollHeight\n\n if (size.width !== newWidth || size.height !== newHeight) {\n listener()\n size.width = newWidth\n size.height = newHeight\n }\n }\n\n // Schedule with keepAlive=true to run every frame\n const dimensionCheckProcess = frame.read(checkScrollDimensions, true)\n dimensionCheckProcesses.set(container, dimensionCheckProcess)\n }\n\n const listener = scrollListeners.get(container)!\n frame.read(listener, false, true)\n\n return () => {\n cancelFrame(listener)\n\n /**\n * Check if we even have any handlers for this container.\n */\n const currentHandlers = onScrollHandlers.get(container)\n if (!currentHandlers) return\n\n currentHandlers.delete(containerHandler)\n\n if (currentHandlers.size) return\n\n /**\n * If no more handlers, remove the scroll listener too.\n */\n const scrollListener = scrollListeners.get(container)\n scrollListeners.delete(container)\n\n if (scrollListener) {\n getEventTarget(container).removeEventListener(\n \"scroll\",\n scrollListener\n )\n resizeListeners.get(container)?.()\n window.removeEventListener(\"resize\", scrollListener)\n }\n\n // Clean up scroll dimension checking\n const dimensionCheckProcess = dimensionCheckProcesses.get(container)\n if (dimensionCheckProcess) {\n cancelFrame(dimensionCheckProcess)\n dimensionCheckProcesses.delete(container)\n }\n scrollSize.delete(container)\n }\n}\n","import { ScrollOffset as ScrollOffsetPresets } from \"../offsets/presets\"\nimport { ProgressIntersection, ScrollOffset } from \"../types\"\n\ninterface ViewTimelineRange {\n rangeStart: string\n rangeEnd: string\n}\n\n/**\n * Maps from ProgressIntersection pairs used by Motion's preset offsets to\n * ViewTimeline named ranges. Returns undefined for unrecognised patterns,\n * which signals the caller to fall back to JS-based scroll tracking.\n */\nconst presets: [ProgressIntersection[], string][] = [\n [ScrollOffsetPresets.Enter, \"entry\"],\n [ScrollOffsetPresets.Exit, \"exit\"],\n [ScrollOffsetPresets.Any, \"cover\"],\n [ScrollOffsetPresets.All, \"contain\"],\n]\n\nconst stringToProgress: Record<string, number> = {\n start: 0,\n end: 1,\n}\n\nfunction parseStringOffset(\n s: string\n): ProgressIntersection | undefined {\n const parts = s.trim().split(/\\s+/)\n if (parts.length !== 2) return undefined\n const a = stringToProgress[parts[0]]\n const b = stringToProgress[parts[1]]\n if (a === undefined || b === undefined) return undefined\n return [a, b]\n}\n\nfunction normaliseOffset(offset: ScrollOffset): ProgressIntersection[] | undefined {\n if (offset.length !== 2) return undefined\n const result: ProgressIntersection[] = []\n for (const item of offset) {\n if (Array.isArray(item)) {\n result.push(item as ProgressIntersection)\n } else if (typeof item === \"string\") {\n const parsed = parseStringOffset(item)\n if (!parsed) return undefined\n result.push(parsed)\n } else {\n return undefined\n }\n }\n return result\n}\n\nfunction matchesPreset(\n offset: ScrollOffset,\n preset: ProgressIntersection[]\n): boolean {\n const normalised = normaliseOffset(offset)\n if (!normalised) return false\n\n for (let i = 0; i < 2; i++) {\n const o = normalised[i]\n const p = preset[i]\n if (o[0] !== p[0] || o[1] !== p[1]) return false\n }\n return true\n}\n\nexport function offsetToViewTimelineRange(\n offset?: ScrollOffset\n): ViewTimelineRange | undefined {\n if (!offset) {\n return { rangeStart: \"contain 0%\", rangeEnd: \"contain 100%\" }\n }\n\n for (const [preset, name] of presets) {\n if (matchesPreset(offset, preset)) {\n return { rangeStart: `${name} 0%`, rangeEnd: `${name} 100%` }\n }\n }\n\n return undefined\n}\n","import { ProgressTimeline } from \"motion-dom\"\nimport { scrollInfo } from \"../track\"\nimport { ScrollOptionsWithDefaults } from \"../types\"\nimport { canUseNativeTimeline } from \"./can-use-native-timeline\"\nimport { offsetToViewTimelineRange } from \"./offset-to-range\"\n\ndeclare class ScrollTimeline implements ProgressTimeline {\n constructor(options: ScrollOptions)\n\n currentTime: null | { value: number }\n\n cancel?: VoidFunction\n}\n\ndeclare class ViewTimeline implements ProgressTimeline {\n constructor(options: { subject: Element; axis?: string })\n\n currentTime: null | { value: number }\n\n cancel?: VoidFunction\n}\n\nconst timelineCache = new Map<\n Element,\n Map<Element | \"self\", Record<string, ProgressTimeline>>\n>()\n\nfunction scrollTimelineFallback(options: ScrollOptionsWithDefaults) {\n const currentTime = { value: 0 }\n\n const cancel = scrollInfo((info) => {\n currentTime.value = info[options.axis!].progress * 100\n }, options)\n\n return { currentTime, cancel }\n}\n\nexport function getTimeline({\n source,\n container,\n ...options\n}: ScrollOptionsWithDefaults): ProgressTimeline {\n const { axis } = options\n\n if (source) container = source\n\n let containerCache = timelineCache.get(container)\n if (!containerCache) {\n containerCache = new Map()\n timelineCache.set(container, containerCache)\n }\n\n const targetKey = options.target ?? \"self\"\n let targetCache = containerCache.get(targetKey)\n if (!targetCache) {\n targetCache = {}\n containerCache.set(targetKey, targetCache)\n }\n\n const axisKey = axis + (options.offset ?? []).join(\",\")\n\n if (!targetCache[axisKey]) {\n if (options.target && canUseNativeTimeline(options.target)) {\n const range = offsetToViewTimelineRange(options.offset)\n if (range) {\n targetCache[axisKey] = new ViewTimeline({\n subject: options.target,\n axis,\n })\n } else {\n targetCache[axisKey] = scrollTimelineFallback({\n container,\n ...options,\n })\n }\n } else if (canUseNativeTimeline()) {\n targetCache[axisKey] = new ScrollTimeline({\n source: container,\n axis,\n } as any)\n } else {\n targetCache[axisKey] = scrollTimelineFallback({\n container,\n ...options,\n })\n }\n }\n\n return targetCache[axisKey]!\n}\n","import { AnimationPlaybackControls, observeTimeline } from \"motion-dom\"\nimport { ScrollOptionsWithDefaults } from \"./types\"\nimport { canUseNativeTimeline } from \"./utils/can-use-native-timeline\"\nimport { getTimeline } from \"./utils/get-timeline\"\nimport { offsetToViewTimelineRange } from \"./utils/offset-to-range\"\n\nexport function attachToAnimation(\n animation: AnimationPlaybackControls,\n options: ScrollOptionsWithDefaults\n) {\n const timeline = getTimeline(options)\n\n const range = options.target\n ? offsetToViewTimelineRange(options.offset)\n : undefined\n\n /**\n * Use native timeline when:\n * - No target: ScrollTimeline (existing behaviour)\n * - Target with mappable offset: ViewTimeline with named range\n * - Target with unmappable offset: fall back to JS observe\n */\n const useNative = options.target\n ? canUseNativeTimeline(options.target) && !!range\n : canUseNativeTimeline()\n\n return animation.attachTimeline({\n timeline: useNative ? timeline : undefined,\n ...(range &&\n useNative && {\n rangeStart: range.rangeStart,\n rangeEnd: range.rangeEnd,\n }),\n observe: (valueAnimation) => {\n valueAnimation.pause()\n\n return observeTimeline((progress) => {\n valueAnimation.time =\n valueAnimation.iterationDuration * progress\n }, timeline)\n },\n })\n}\n","import { ScrollOptionsWithDefaults } from \"../types\"\n\n/**\n * Currently, we only support element tracking with `scrollInfo`, though in\n * the future we can also offer ViewTimeline support.\n */\nexport function isElementTracking(options?: ScrollOptionsWithDefaults) {\n return options && (options.target || options.offset)\n}\n","import { observeTimeline } from \"motion-dom\"\nimport { scrollInfo } from \"./track\"\nimport { OnScroll, OnScrollWithInfo, ScrollOptionsWithDefaults } from \"./types\"\nimport { getTimeline } from \"./utils/get-timeline\"\nimport { isElementTracking } from \"./utils/is-element-tracking\"\n\n/**\n * If the onScroll function has two arguments, it's expecting\n * more specific information about the scroll from scrollInfo.\n */\nfunction isOnScrollWithInfo(onScroll: OnScroll): onScroll is OnScrollWithInfo {\n return onScroll.length === 2\n}\n\nexport function attachToFunction(\n onScroll: OnScroll,\n options: ScrollOptionsWithDefaults\n) {\n if (isOnScrollWithInfo(onScroll) || isElementTracking(options)) {\n return scrollInfo((info) => {\n onScroll(info[options.axis!].progress, info)\n }, options)\n } else {\n return observeTimeline(onScroll, getTimeline(options))\n }\n}\n","import { AnimationPlaybackControls } from \"motion-dom\"\nimport { noop } from \"motion-utils\"\nimport { attachToAnimation } from \"./attach-animation\"\nimport { attachToFunction } from \"./attach-function\"\nimport { OnScroll, ScrollOptions } from \"./types\"\n\nexport function scroll(\n onScroll: OnScroll | AnimationPlaybackControls,\n {\n axis = \"y\",\n container = document.scrollingElement as Element,\n ...options\n }: ScrollOptions = {}\n): VoidFunction {\n if (!container) return noop as VoidFunction\n\n const optionsWithDefaults = { axis, container, ...options }\n\n return typeof onScroll === \"function\"\n ? attachToFunction(onScroll, optionsWithDefaults)\n : attachToAnimation(onScroll, optionsWithDefaults)\n}\n","import { ElementOrSelector, resolveElements } from \"motion-dom\"\n\nexport type ViewChangeHandler = (entry: IntersectionObserverEntry) => void\n\ntype MarginValue = `${number}${\"px\" | \"%\"}`\ntype MarginType =\n | MarginValue\n | `${MarginValue} ${MarginValue}`\n | `${MarginValue} ${MarginValue} ${MarginValue}`\n | `${MarginValue} ${MarginValue} ${MarginValue} ${MarginValue}`\n\nexport interface InViewOptions {\n root?: Element | Document\n margin?: MarginType\n amount?: \"some\" | \"all\" | number\n}\n\nconst thresholds = {\n some: 0,\n all: 1,\n}\n\nexport function inView(\n elementOrSelector: ElementOrSelector,\n onStart: (\n element: Element,\n entry: IntersectionObserverEntry\n ) => void | ViewChangeHandler,\n { root, margin: rootMargin, amount = \"some\" }: InViewOptions = {}\n): VoidFunction {\n const elements = resolveElements(elementOrSelector)\n\n const activeIntersections = new WeakMap<Element, ViewChangeHandler>()\n\n const onIntersectionChange: IntersectionObserverCallback = (entries) => {\n entries.forEach((entry) => {\n const onEnd = activeIntersections.get(entry.target)\n\n /**\n * If there's no change to the intersection, we don't need to\n * do anything here.\n */\n if (entry.isIntersecting === Boolean(onEnd)) return\n\n if (entry.isIntersecting) {\n const newOnEnd = onStart(entry.target, entry)\n if (typeof newOnEnd === \"function\") {\n activeIntersections.set(entry.target, newOnEnd)\n } else {\n observer.unobserve(entry.target)\n }\n } else if (typeof onEnd === \"function\") {\n onEnd(entry)\n activeIntersections.delete(entry.target)\n }\n })\n }\n\n const observer = new IntersectionObserver(onIntersectionChange, {\n root,\n rootMargin,\n threshold: typeof amount === \"number\" ? amount : thresholds[amount],\n })\n\n elements.forEach((element) => observer.observe(element))\n\n return () => observer.disconnect()\n}\n","import type { GestureKey } from \"./types.js\";\n\nexport type SyntaxCategory =\n | \"gesture\"\n | \"property\"\n | \"transition\"\n | \"viewport\"\n | \"scroll\"\n | \"drag\"\n | \"layout\"\n | \"variant\"\n | \"preset\"\n | \"modifier\";\n\nexport type Platform = \"react\" | \"vue\" | \"vanilla\" | \"react-native\";\n\n/** Machine-readable syntax metadata shared by docs, editors and diagnostics. */\nexport interface SyntaxDefinition {\n id: string;\n category: SyntaxCategory;\n label: string;\n snippet: string;\n description: string;\n motionKey?: string;\n platforms?: Platform[];\n}\n\nconst ALL: Platform[] = [\"react\", \"vue\", \"vanilla\", \"react-native\"];\nconst WEB: Platform[] = [\"react\", \"vue\", \"vanilla\"];\n\nconst gesture = (\n id: string,\n motionKey: GestureKey,\n description: string,\n): SyntaxDefinition => ({\n id: `gesture.${id}`,\n category: \"gesture\",\n label: `animate-${id}:`,\n snippet: `animate-${id}:`,\n description,\n motionKey,\n platforms: ALL,\n});\n\nexport const GESTURE_DEFINITIONS = [\n gesture(\"hover\", \"whileHover\", \"Animate while an element is hovered.\"),\n gesture(\"tap\", \"whileTap\", \"Animate while an element is pressed.\"),\n gesture(\"focus\", \"whileFocus\", \"Animate while an element has focus.\"),\n gesture(\"inview\", \"whileInView\", \"Animate while an element is in view.\"),\n gesture(\"drag\", \"whileDrag\", \"Animate while an element is dragged.\"),\n gesture(\"initial\", \"initial\", \"Set the state before an animation begins.\"),\n gesture(\"enter\", \"animate\", \"Animate to a state when an element enters.\"),\n gesture(\"exit\", \"exit\", \"Animate to a state when an element exits.\"),\n] as const satisfies readonly SyntaxDefinition[];\n\n/**\n * Modifier prefixes that wrap an inner class token and control conditional\n * application based on the user's motion preference media query.\n */\nexport const MODIFIER_DEFINITIONS: readonly SyntaxDefinition[] = [\n {\n id: \"modifier.motion-reduce\",\n category: \"modifier\",\n label: \"motion-reduce:\",\n snippet: \"motion-reduce:\",\n description:\n \"Apply the wrapped class only when `prefers-reduced-motion: reduce` is active.\",\n platforms: WEB,\n },\n {\n id: \"modifier.motion-safe\",\n category: \"modifier\",\n label: \"motion-safe:\",\n snippet: \"motion-safe:\",\n description:\n \"Apply the wrapped class only when `prefers-reduced-motion: no-preference` is active.\",\n platforms: WEB,\n },\n];\n\nconst property = (\n label: string,\n snippet: string,\n motionKey: string,\n description: string,\n platforms: Platform[] = ALL,\n): SyntaxDefinition => ({\n id: `property.${label.replace(/[^a-z0-9]+/gi, \"-\").replace(/^-|-$/g, \"\")}`,\n category: \"property\",\n label,\n snippet,\n motionKey,\n description,\n platforms,\n});\n\nexport const PROPERTY_DEFINITIONS = [\n property(\n \"scale-\",\n \"scale-${1:110}\",\n \"scale\",\n \"Scale (100 is the resting value).\",\n ),\n property(\"scale-x-\", \"scale-x-${1:110}\", \"scaleX\", \"Scale on the x axis.\"),\n property(\"scale-y-\", \"scale-y-${1:110}\", \"scaleY\", \"Scale on the y axis.\"),\n property(\n \"scale-z-\",\n \"scale-z-${1:110}\",\n \"scaleZ\",\n \"Scale on the z axis.\",\n WEB,\n ),\n property(\"rotate-\", \"rotate-${1:45}\", \"rotate\", \"Rotate in degrees.\"),\n property(\n \"rotate-x-\",\n \"rotate-x-${1:45}\",\n \"rotateX\",\n \"Rotate around the x axis.\",\n ),\n property(\n \"rotate-y-\",\n \"rotate-y-${1:45}\",\n \"rotateY\",\n \"Rotate around the y axis.\",\n ),\n property(\"x-\", \"x-${1:20}\", \"x\", \"Translate on the x axis.\"),\n property(\"y-\", \"y-${1:20}\", \"y\", \"Translate on the y axis.\"),\n property(\"z-\", \"z-${1:20}\", \"z\", \"Translate on the z axis.\", WEB),\n // z-{0,10,20,30,40,50,auto} maps to zIndex (Tailwind-standard values)\n {\n id: \"property.z-zIndex\",\n category: \"property\",\n label: \"z-\",\n snippet: \"z-${1|0,10,20,30,40,50,auto|}\",\n motionKey: \"zIndex\",\n description:\n \"Animate z-index (Tailwind values: 0, 10, 20, 30, 40, 50, auto). Non-standard values translate on the z axis instead.\",\n platforms: WEB,\n },\n property(\"skew-x-\", \"skew-x-${1:12}\", \"skewX\", \"Skew on the x axis.\"),\n property(\"skew-y-\", \"skew-y-${1:12}\", \"skewY\", \"Skew on the y axis.\"),\n property(\n \"origin-x-\",\n \"origin-x-${1:50}\",\n \"originX\",\n \"Set the x transform origin.\",\n WEB,\n ),\n property(\n \"origin-y-\",\n \"origin-y-${1:50}\",\n \"originY\",\n \"Set the y transform origin.\",\n WEB,\n ),\n property(\n \"perspective-\",\n \"perspective-${1:800}\",\n \"perspective\",\n \"Set 3D perspective.\",\n WEB,\n ),\n property(\"opacity-\", \"opacity-${1:0}\", \"opacity\", \"Animate opacity (0–100).\"),\n property(\"blur-\", \"blur-${1:10}\", \"filter\", \"Animate CSS blur.\", WEB),\n property(\n \"brightness-\",\n \"brightness-${1:120}\",\n \"filter\",\n \"Animate CSS brightness.\",\n WEB,\n ),\n property(\n \"contrast-\",\n \"contrast-${1:120}\",\n \"filter\",\n \"Animate CSS contrast.\",\n WEB,\n ),\n property(\n \"saturate-\",\n \"saturate-${1:120}\",\n \"filter\",\n \"Animate CSS saturation.\",\n WEB,\n ),\n property(\n \"grayscale-\",\n \"grayscale-${1:100}\",\n \"filter\",\n \"Animate CSS grayscale.\",\n WEB,\n ),\n property(\n \"backdrop-blur-\",\n \"backdrop-blur-${1:10}\",\n \"backdropFilter\",\n \"Animate backdrop blur.\",\n WEB,\n ),\n property(\"w-\", \"w-${1:100}\", \"width\", \"Animate width.\"),\n property(\"h-\", \"h-${1:100}\", \"height\", \"Animate height.\"),\n property(\n \"rounded-\",\n \"rounded-${1:12}\",\n \"borderRadius\",\n \"Animate border radius.\",\n ),\n property(\n \"rounded-tl-\",\n \"rounded-tl-${1:12}\",\n \"borderTopLeftRadius\",\n \"Animate top-left border radius.\",\n ),\n property(\n \"rounded-tr-\",\n \"rounded-tr-${1:12}\",\n \"borderTopRightRadius\",\n \"Animate top-right border radius.\",\n ),\n property(\n \"rounded-bl-\",\n \"rounded-bl-${1:12}\",\n \"borderBottomLeftRadius\",\n \"Animate bottom-left border radius.\",\n ),\n property(\n \"rounded-br-\",\n \"rounded-br-${1:12}\",\n \"borderBottomRightRadius\",\n \"Animate bottom-right border radius.\",\n ),\n property(\"top-\", \"top-${1:0}\", \"top\", \"Animate top position.\"),\n property(\"left-\", \"left-${1:0}\", \"left\", \"Animate left position.\"),\n property(\"right-\", \"right-${1:0}\", \"right\", \"Animate right position.\"),\n property(\"bottom-\", \"bottom-${1:0}\", \"bottom\", \"Animate bottom position.\"),\n property(\"p-\", \"p-${1:16}\", \"padding\", \"Animate padding.\"),\n property(\"m-\", \"m-${1:16}\", \"margin\", \"Animate margin.\"),\n property(\"gap-\", \"gap-${1:8}\", \"gap\", \"Animate gap.\"),\n property(\"text-size-\", \"text-size-${1:16}\", \"fontSize\", \"Animate font size.\"),\n property(\n \"tracking-\",\n \"tracking-${1:1}\",\n \"letterSpacing\",\n \"Animate letter spacing.\",\n ),\n property(\"leading-\", \"leading-${1:24}\", \"lineHeight\", \"Animate line height.\"),\n property(\n \"border-w-\",\n \"border-w-${1:2}\",\n \"borderWidth\",\n \"Animate border width.\",\n ),\n property(\n \"bg-#\",\n \"bg-#${1:c8ff2e}\",\n \"backgroundColor\",\n \"Animate background color.\",\n ),\n property(\"text-#\", \"text-#${1:ffffff}\", \"color\", \"Animate text color.\"),\n property(\n \"border-#\",\n \"border-#${1:c8ff2e}\",\n \"borderColor\",\n \"Animate border color.\",\n ),\n property(\n \"path-length-\",\n \"path-length-${1:1}\",\n \"pathLength\",\n \"Animate SVG path length.\",\n WEB,\n ),\n property(\n \"text-shadow-[\",\n \"text-shadow-[${1:value}]\",\n \"textShadow\",\n \"Animate text shadow (arbitrary value; underscores become spaces).\",\n WEB,\n ),\n property(\n \"[=]\",\n \"[${1:property}=${2:value}]\",\n \"arbitrary\",\n \"Animate an allow-listed arbitrary value.\",\n WEB,\n ),\n] as const satisfies readonly SyntaxDefinition[];\n\nconst config = (\n category: Exclude<SyntaxCategory, \"gesture\" | \"property\">,\n label: string,\n snippet: string,\n description: string,\n platforms: Platform[] = ALL,\n): SyntaxDefinition => ({\n id: `${category}.${label}`,\n category,\n label: `animate-${label}`,\n snippet: `animate-${snippet}`,\n description,\n platforms,\n});\n\nexport const CONFIG_DEFINITIONS = [\n config(\n \"transition\",\n \"duration-\",\n \"duration-${1:300}\",\n \"Duration in milliseconds.\",\n ),\n config(\"transition\", \"delay-\", \"delay-${1:100}\", \"Delay in milliseconds.\"),\n config(\"transition\", \"ease-in\", \"ease-in\", \"Ease into the animation.\"),\n config(\"transition\", \"ease-out\", \"ease-out\", \"Ease out of the animation.\"),\n config(\"transition\", \"ease-in-out\", \"ease-in-out\", \"Ease in and out.\"),\n config(\"transition\", \"ease-linear\", \"ease-linear\", \"Use linear easing.\"),\n config(\"transition\", \"spring\", \"spring\", \"Use spring physics.\"),\n config(\"transition\", \"stiffness-\", \"stiffness-${1:300}\", \"Spring stiffness.\"),\n config(\"transition\", \"damping-\", \"damping-${1:24}\", \"Spring damping.\"),\n config(\"transition\", \"bounce-\", \"bounce-${1:20}\", \"Spring bounce (0–100).\"),\n config(\"transition\", \"mass-\", \"mass-${1:10}\", \"Spring mass in tenths.\"),\n config(\"transition\", \"repeat-\", \"repeat-${1:2}\", \"Repeat count.\"),\n config(\"transition\", \"repeat-infinite\", \"repeat-infinite\", \"Repeat forever.\"),\n config(\n \"transition\",\n \"repeat-reverse\",\n \"repeat-reverse\",\n \"Reverse each repetition.\",\n ),\n config(\n \"transition\",\n \"stagger-\",\n \"stagger-${1:60}\",\n \"Stagger children in milliseconds.\",\n ),\n config(\n \"transition\",\n \"delay-children-\",\n \"delay-children-${1:100}\",\n \"Delay child animations.\",\n ),\n config(\"viewport\", \"once\", \"once\", \"Run an in-view animation once.\"),\n config(\"viewport\", \"amount-\", \"amount-${1:50}\", \"Required visible amount.\"),\n config(\n \"viewport\",\n \"margin-\",\n \"margin-${1:100}\",\n \"Viewport margin in pixels.\",\n ),\n config(\n \"scroll\",\n \"scroll-axis-x\",\n \"scroll-axis-x\",\n \"Use horizontal scroll progress.\",\n WEB,\n ),\n config(\n \"scroll\",\n \"scroll-container\",\n \"scroll-container\",\n \"Track the page scroll container.\",\n WEB,\n ),\n config(\"drag\", \"drag-x\", \"drag-x\", \"Enable horizontal drag.\", [\n \"react\",\n \"vue\",\n \"react-native\",\n ]),\n config(\"drag\", \"drag-y\", \"drag-y\", \"Enable vertical drag.\", [\n \"react\",\n \"vue\",\n \"react-native\",\n ]),\n config(\"drag\", \"drag-both\", \"drag-both\", \"Enable drag on both axes.\", [\n \"react\",\n \"vue\",\n \"react-native\",\n ]),\n config(\n \"drag\",\n \"drag-elastic-\",\n \"drag-elastic-${1:50}\",\n \"Set drag elasticity.\",\n [\"react\", \"vue\", \"react-native\"],\n ),\n config(\"drag\", \"drag-snap\", \"drag-snap\", \"Snap drag to its origin.\", [\n \"react\",\n \"vue\",\n \"react-native\",\n ]),\n config(\"layout\", \"layout\", \"layout\", \"Animate layout changes.\", [\n \"react\",\n \"vue\",\n ]),\n config(\n \"layout\",\n \"layout-position\",\n \"layout-position\",\n \"Animate layout position.\",\n [\"react\", \"vue\"],\n ),\n config(\"layout\", \"layout-size\", \"layout-size\", \"Animate layout size.\", [\n \"react\",\n \"vue\",\n ]),\n config(\n \"layout\",\n \"layout-id-\",\n \"layout-id-${1:shared}\",\n \"Set a shared layout id.\",\n [\"react\", \"vue\"],\n ),\n config(\n \"variant\",\n \"from-\",\n \"from-${1:hidden}\",\n \"Select the initial named variant.\",\n [\"react\", \"vue\", \"react-native\"],\n ),\n config(\n \"variant\",\n \"to-\",\n \"to-${1:visible}\",\n \"Select the active named variant.\",\n [\"react\", \"vue\", \"react-native\"],\n ),\n config(\n \"preset\",\n \"preset-\",\n \"preset-${1:button-press}\",\n \"Apply a configured animation preset.\",\n ),\n] as const satisfies readonly SyntaxDefinition[];\n\nexport const MOTIONWIND_SYNTAX_REGISTRY: readonly SyntaxDefinition[] = [\n ...GESTURE_DEFINITIONS,\n ...MODIFIER_DEFINITIONS,\n ...PROPERTY_DEFINITIONS,\n ...CONFIG_DEFINITIONS,\n];\n\nexport const GESTURE_MAP = Object.fromEntries(\n GESTURE_DEFINITIONS.map((definition) => [\n definition.label.slice(\"animate-\".length, -1),\n definition.motionKey,\n ]),\n) as Record<string, GestureKey>;\n\nexport const GESTURE_KEYS = new Set(Object.keys(GESTURE_MAP));\n\nexport const EASING_MAP: Record<string, string> = {\n \"ease-in\": \"easeIn\",\n \"ease-out\": \"easeOut\",\n \"ease-in-out\": \"easeInOut\",\n \"ease-linear\": \"linear\",\n \"ease-circ-in\": \"circIn\",\n \"ease-circ-out\": \"circOut\",\n \"ease-circ-in-out\": \"circInOut\",\n \"ease-back-in\": \"backIn\",\n \"ease-back-out\": \"backOut\",\n \"ease-back-in-out\": \"backInOut\",\n \"ease-anticipate\": \"anticipate\",\n};\n\nexport function getSyntaxDefinitions(\n category?: SyntaxCategory,\n): readonly SyntaxDefinition[] {\n return category\n ? MOTIONWIND_SYNTAX_REGISTRY.filter(\n (definition) => definition.category === category,\n )\n : MOTIONWIND_SYNTAX_REGISTRY;\n}\n","import { definePreset } from \"./config.js\";\n\nexport interface MotionwindRecipe {\n id: string;\n name: string;\n description: string;\n category: \"interaction\" | \"entrance\" | \"layout\" | \"loading\" | \"scroll\";\n classes: string;\n accessibility: string;\n adapters: readonly (\"react\" | \"vue\" | \"vanilla\" | \"react-native\")[];\n maintainer: string;\n version: string;\n compatibleCore: string;\n bundleImpact: string;\n source: string;\n}\n\nconst COMMUNITY_METADATA = {\n maintainer: \"motionwind/core\",\n version: \"1.0.0\",\n compatibleCore: \">=2.0.0 <3\",\n bundleImpact: \"Preset only; no runtime code added.\",\n} as const;\n\nconst source = (id: string) =>\n `https://github.com/piyushzingade/motionwind/tree/main/registry/recipes/${id}.json`;\n\nexport const MOTIONWIND_RECIPES: readonly MotionwindRecipe[] = [\n {\n id: \"button-press\",\n name: \"Button press\",\n description: \"A compact spring response for primary actions.\",\n category: \"interaction\",\n classes:\n \"animate-hover:scale-105 animate-tap:scale-95 animate-spring animate-stiffness-420 animate-damping-24\",\n accessibility:\n \"Preserves keyboard focus and does not communicate state through motion alone.\",\n adapters: [\"react\", \"vue\", \"vanilla\", \"react-native\"],\n ...COMMUNITY_METADATA,\n source: source(\"button-press\"),\n },\n {\n id: \"dialog-enter\",\n name: \"Dialog entrance\",\n description: \"Fade and lift a dialog into place without excessive travel.\",\n category: \"entrance\",\n classes:\n \"animate-initial:opacity-0 animate-initial:y-12 animate-enter:opacity-100 animate-enter:y-0 animate-duration-240 animate-ease-out\",\n accessibility:\n \"Pair with a focus trap and disable transform movement for reduced-motion users.\",\n adapters: [\"react\", \"vue\", \"vanilla\", \"react-native\"],\n ...COMMUNITY_METADATA,\n source: source(\"dialog-enter\"),\n },\n {\n id: \"list-stagger\",\n name: \"List stagger\",\n description: \"A restrained stagger for newly revealed collections.\",\n category: \"entrance\",\n classes: \"animate-stagger-55 animate-delay-children-40 animate-when-before\",\n accessibility:\n \"Keep the list readable before and after animation; avoid repeated autoplay.\",\n adapters: [\"react\", \"vue\"],\n ...COMMUNITY_METADATA,\n source: source(\"list-stagger\"),\n },\n {\n id: \"page-reveal\",\n name: \"Page reveal\",\n description: \"A single-run opacity and vertical reveal for page sections.\",\n category: \"scroll\",\n classes:\n \"animate-initial:opacity-0 animate-initial:y-24 animate-inview:opacity-100 animate-inview:y-0 animate-once animate-duration-480 animate-ease-out\",\n accessibility:\n \"Content remains in document order and visible when reduced motion is requested.\",\n adapters: [\"react\", \"vue\", \"vanilla\"],\n ...COMMUNITY_METADATA,\n source: source(\"page-reveal\"),\n },\n {\n id: \"loading-orbit\",\n name: \"Loading orbit\",\n description:\n \"A continuous linear rotation for non-blocking progress indicators.\",\n category: \"loading\",\n classes:\n \"animate-enter:rotate-360 animate-repeat-infinite animate-duration-900 animate-ease-linear\",\n accessibility:\n \"Add an accessible status label and stop the loop when loading completes.\",\n adapters: [\"react\", \"vue\", \"vanilla\", \"react-native\"],\n ...COMMUNITY_METADATA,\n source: source(\"loading-orbit\"),\n },\n {\n id: \"menu-pop\",\n name: \"Menu pop\",\n description: \"A fast scale-and-fade entrance for contextual menus.\",\n category: \"entrance\",\n classes:\n \"animate-initial:opacity-0 animate-initial:scale-95 animate-enter:opacity-100 animate-enter:scale-100 animate-duration-160 animate-ease-out\",\n accessibility:\n \"Move focus into the menu, return it on close, and preserve arrow-key navigation.\",\n adapters: [\"react\", \"vue\", \"vanilla\", \"react-native\"],\n ...COMMUNITY_METADATA,\n source: source(\"menu-pop\"),\n },\n {\n id: \"accordion-reveal\",\n name: \"Accordion reveal\",\n description: \"A layout-aware reveal for expandable disclosure content.\",\n category: \"layout\",\n classes:\n \"animate-layout-size animate-initial:opacity-0 animate-enter:opacity-100 animate-duration-220 animate-ease-out\",\n accessibility:\n \"Use a native button with aria-expanded and keep content reachable without animation.\",\n adapters: [\"react\", \"vue\"],\n ...COMMUNITY_METADATA,\n source: source(\"accordion-reveal\"),\n },\n {\n id: \"tab-indicator\",\n name: \"Tab indicator\",\n description: \"A shared-layout spring for an active tab indicator.\",\n category: \"layout\",\n classes:\n \"animate-layout-id-active-tab animate-spring animate-stiffness-440 animate-damping-34\",\n accessibility:\n \"Pair with tablist semantics, roving focus, and an independent selected-state cue.\",\n adapters: [\"react\", \"vue\"],\n ...COMMUNITY_METADATA,\n source: source(\"tab-indicator\"),\n },\n {\n id: \"toast-enter\",\n name: \"Toast entrance\",\n description: \"A short horizontal slide for non-blocking notifications.\",\n category: \"entrance\",\n classes:\n \"animate-initial:opacity-0 animate-initial:x-24 animate-enter:opacity-100 animate-enter:x-0 animate-duration-240 animate-ease-out\",\n accessibility:\n \"Use an appropriate live region and provide enough time to read or dismiss the toast.\",\n adapters: [\"react\", \"vue\", \"vanilla\", \"react-native\"],\n ...COMMUNITY_METADATA,\n source: source(\"toast-enter\"),\n },\n {\n id: \"sortable-item\",\n name: \"Sortable item\",\n description:\n \"Layout animation and vertical drag feedback for reorderable lists.\",\n category: \"interaction\",\n classes:\n \"animate-layout-position animate-drag-y animate-drag-snap animate-drag:scale-103 animate-spring animate-stiffness-360 animate-damping-28\",\n accessibility:\n \"Provide keyboard reordering controls and announce the new item position.\",\n adapters: [\"react\", \"vue\"],\n ...COMMUNITY_METADATA,\n source: source(\"sortable-item\"),\n },\n {\n id: \"svg-line-loader\",\n name: \"SVG line loader\",\n description: \"Draw and repeat an SVG path for compact progress feedback.\",\n category: \"loading\",\n classes:\n \"animate-initial:path-length-0 animate-enter:path-length-1 animate-duration-900 animate-ease-in-out animate-repeat-infinite animate-repeat-reverse\",\n accessibility:\n \"Give the SVG a status label and stop repeating when the operation completes.\",\n adapters: [\"react\", \"vue\", \"vanilla\"],\n ...COMMUNITY_METADATA,\n source: source(\"svg-line-loader\"),\n },\n {\n id: \"scroll-progress\",\n name: \"Scroll progress\",\n description: \"Map page scroll progress to a horizontal scale indicator.\",\n category: \"scroll\",\n classes: \"animate-scroll:scaleX-[0,1] animate-scroll-container\",\n accessibility:\n \"Treat the indicator as supplemental; expose document progress in text when it matters.\",\n adapters: [\"react\", \"vanilla\"],\n ...COMMUNITY_METADATA,\n source: source(\"scroll-progress\"),\n },\n {\n id: \"flip-card\",\n name: \"Flip card\",\n description:\n \"A 3-D card that rotates 180 degrees around the Y axis on hover.\",\n category: \"interaction\",\n classes:\n \"animate-hover:rotate-y-180 animate-duration-480 animate-ease-in-out\",\n accessibility:\n \"Pair with a separate back face and keep both sides keyboard-accessible.\",\n adapters: [\"react\", \"vue\", \"vanilla\"],\n ...COMMUNITY_METADATA,\n source: source(\"flip-card\"),\n },\n {\n id: \"marquee\",\n name: \"Marquee\",\n description:\n \"A continuously looping horizontal scroll for text or image strips.\",\n category: \"entrance\",\n classes:\n \"animate-initial:x-100pct animate-enter:-x-100pct animate-repeat-infinite animate-ease-linear animate-duration-4000\",\n accessibility:\n \"Pause the marquee on focus or hover; do not convey critical information through motion alone.\",\n adapters: [\"react\", \"vue\", \"vanilla\"],\n ...COMMUNITY_METADATA,\n source: source(\"marquee\"),\n },\n {\n id: \"magnetic-button\",\n name: \"Magnetic button\",\n description:\n \"A subtle spring scale that draws attention on hover without moving the element.\",\n category: \"interaction\",\n classes:\n \"animate-hover:scale-103 animate-spring animate-stiffness-280 animate-damping-22\",\n accessibility:\n \"Do not use scale change as the only indicator of an interactive element.\",\n adapters: [\"react\", \"vue\", \"vanilla\"],\n ...COMMUNITY_METADATA,\n source: source(\"magnetic-button\"),\n },\n {\n id: \"drawer\",\n name: \"Drawer\",\n description:\n \"A side panel that slides in from the edge and returns on exit.\",\n category: \"entrance\",\n classes:\n \"animate-initial:x-100pct animate-enter:x-0 animate-exit:x-100pct animate-duration-320 animate-ease-out\",\n accessibility:\n \"Trap focus inside the drawer, return focus on close, and support Escape to dismiss.\",\n adapters: [\"react\", \"vue\", \"vanilla\", \"react-native\"],\n ...COMMUNITY_METADATA,\n source: source(\"drawer\"),\n },\n {\n id: \"tooltip-pop\",\n name: \"Tooltip pop\",\n description: \"A small scale-and-fade entrance for contextual tooltips.\",\n category: \"entrance\",\n classes:\n \"animate-initial:opacity-0 animate-initial:scale-75 animate-enter:opacity-100 animate-enter:scale-100 animate-duration-160 animate-ease-back-out\",\n accessibility:\n \"Use role='tooltip', aria-describedby, and ensure the tooltip is dismissible without a mouse.\",\n adapters: [\"react\", \"vue\", \"vanilla\", \"react-native\"],\n ...COMMUNITY_METADATA,\n source: source(\"tooltip-pop\"),\n },\n {\n id: \"skeleton-pulse\",\n name: \"Skeleton pulse\",\n description:\n \"A pulsing opacity loop for placeholder content while data loads.\",\n category: \"loading\",\n classes:\n \"animate-initial:opacity-100 animate-enter:opacity-40 animate-repeat-infinite animate-repeat-reverse animate-duration-800 animate-ease-in-out\",\n accessibility:\n \"Announce loading state with aria-busy; remove skeleton when content arrives.\",\n adapters: [\"react\", \"vue\", \"vanilla\", \"react-native\"],\n ...COMMUNITY_METADATA,\n source: source(\"skeleton-pulse\"),\n },\n {\n id: \"shimmer-load\",\n name: \"Shimmer load\",\n description:\n \"A left-to-right gradient shimmer applied to a loading overlay.\",\n category: \"loading\",\n classes:\n \"animate-initial:-x-100pct animate-enter:x-100pct animate-repeat-infinite animate-duration-1200 animate-ease-in-out\",\n accessibility:\n \"Place the shimmer on a decorative overlay; expose loading status through accessible text.\",\n adapters: [\"react\", \"vue\", \"vanilla\"],\n ...COMMUNITY_METADATA,\n source: source(\"shimmer-load\"),\n },\n {\n id: \"card-hover\",\n name: \"Card hover\",\n description:\n \"A spring lift and upward nudge for interactive cards on hover.\",\n category: \"interaction\",\n classes:\n \"animate-hover:scale-103 animate-hover:y--4 animate-spring animate-stiffness-380 animate-damping-26\",\n accessibility:\n \"Ensure focus styles are visible and the hover state is not the only interactive cue.\",\n adapters: [\"react\", \"vue\", \"vanilla\"],\n ...COMMUNITY_METADATA,\n source: source(\"card-hover\"),\n },\n {\n id: \"number-counter\",\n name: \"Number counter\",\n description:\n \"A fade and rise entrance for statistic values triggered when they scroll into view.\",\n category: \"scroll\",\n classes:\n \"animate-initial:opacity-0 animate-initial:y-12 animate-inview:opacity-100 animate-inview:y-0 animate-once animate-duration-400 animate-ease-out\",\n accessibility:\n \"Present the final value in document order and avoid conveying meaning through counting motion.\",\n adapters: [\"react\", \"vue\", \"vanilla\"],\n ...COMMUNITY_METADATA,\n source: source(\"number-counter\"),\n },\n {\n id: \"progress-bar\",\n name: \"Progress bar\",\n description:\n \"An animated width fill for a progress bar triggered on scroll into view.\",\n category: \"scroll\",\n classes:\n \"animate-initial:w-0 animate-inview:w-100pct animate-once animate-duration-800 animate-ease-out\",\n accessibility:\n \"Use a native progress element or role='progressbar' with aria-valuenow to expose state.\",\n adapters: [\"react\", \"vue\", \"vanilla\"],\n ...COMMUNITY_METADATA,\n source: source(\"progress-bar\"),\n },\n {\n id: \"ripple\",\n name: \"Ripple\",\n description:\n \"A radial scale-and-fade burst that emanates from a tap point.\",\n category: \"interaction\",\n classes:\n \"animate-initial:scale-0 animate-initial:opacity-100 animate-enter:scale-400 animate-enter:opacity-0 animate-duration-500 animate-ease-out\",\n accessibility:\n \"Use the ripple as a purely decorative effect and do not rely on it to communicate state.\",\n adapters: [\"react\", \"vue\", \"vanilla\"],\n ...COMMUNITY_METADATA,\n source: source(\"ripple\"),\n },\n {\n id: \"blob-morph\",\n name: \"Blob morph\",\n description:\n \"An organic border-radius keyframe loop for fluid decorative shapes.\",\n category: \"loading\",\n classes:\n \"animate-enter:rounded-[0,30,60,30,0] animate-repeat-infinite animate-duration-3000 animate-ease-in-out animate-repeat-reverse\",\n accessibility:\n \"Use only for decorative elements; apply aria-hidden to prevent interference with screen readers.\",\n adapters: [\"react\", \"vue\", \"vanilla\"],\n ...COMMUNITY_METADATA,\n source: source(\"blob-morph\"),\n },\n {\n id: \"ticker\",\n name: \"Ticker\",\n description:\n \"A stock- or news-style ticker where items enter from the right and exit to the left.\",\n category: \"entrance\",\n classes:\n \"animate-initial:x-100pct animate-enter:x-0 animate-exit:-x-100pct animate-duration-500 animate-ease-out animate-stagger-150\",\n accessibility:\n \"Provide a way to pause the ticker and make all content available in a static list.\",\n adapters: [\"react\", \"vue\", \"vanilla\"],\n ...COMMUNITY_METADATA,\n source: source(\"ticker\"),\n },\n {\n id: \"popover-reveal\",\n name: \"Popover reveal\",\n description:\n \"A short downward fade-in for anchored popovers and dropdowns.\",\n category: \"entrance\",\n classes:\n \"animate-initial:opacity-0 animate-initial:y--8 animate-enter:opacity-100 animate-enter:y-0 animate-duration-180 animate-ease-out\",\n accessibility:\n \"Move focus into the popover on open and return it to the trigger on close.\",\n adapters: [\"react\", \"vue\", \"vanilla\", \"react-native\"],\n ...COMMUNITY_METADATA,\n source: source(\"popover-reveal\"),\n },\n {\n id: \"stepper\",\n name: \"Stepper\",\n description: \"Sequential staggered entrances for step-indicator items.\",\n category: \"entrance\",\n classes:\n \"animate-initial:opacity-0 animate-initial:scale-80 animate-enter:opacity-100 animate-enter:scale-100 animate-stagger-80 animate-delay-children-100 animate-duration-200 animate-ease-back-out\",\n accessibility:\n \"Announce the current step and total steps; keep step content readable without animation.\",\n adapters: [\"react\", \"vue\", \"vanilla\", \"react-native\"],\n ...COMMUNITY_METADATA,\n source: source(\"stepper\"),\n },\n {\n id: \"notification-stack\",\n name: \"Notification stack\",\n description: \"Staggered upward entrances for stacked notification cards.\",\n category: \"entrance\",\n classes:\n \"animate-initial:opacity-0 animate-initial:y--20 animate-enter:opacity-100 animate-enter:y-0 animate-stagger-80 animate-duration-260 animate-ease-back-out\",\n accessibility:\n \"Use a live region with aria-live='polite' and provide enough time to read each notification.\",\n adapters: [\"react\", \"vue\", \"vanilla\", \"react-native\"],\n ...COMMUNITY_METADATA,\n source: source(\"notification-stack\"),\n },\n {\n id: \"drag-reorder\",\n name: \"Drag reorder\",\n description:\n \"Vertical drag with layout animation for reorderable list items.\",\n category: \"interaction\",\n classes:\n \"animate-drag-y animate-layout-position animate-drag:scale-102 animate-spring animate-stiffness-320 animate-damping-30\",\n accessibility:\n \"Provide keyboard controls for reordering and announce the new position after a drop.\",\n adapters: [\"react\", \"vue\"],\n ...COMMUNITY_METADATA,\n source: source(\"drag-reorder\"),\n },\n {\n id: \"parallax-scroll\",\n name: \"Parallax scroll\",\n description:\n \"Map scroll progress to a Y translation so a layer moves at a different speed.\",\n category: \"scroll\",\n classes: \"animate-scroll:y-[-50,50] animate-scroll-container\",\n accessibility:\n \"Respect prefers-reduced-motion; parallax depth cues must not convey meaning exclusively.\",\n adapters: [\"react\", \"vanilla\"],\n ...COMMUNITY_METADATA,\n source: source(\"parallax-scroll\"),\n },\n];\n\nexport const BUILT_IN_PRESETS = Object.fromEntries(\n MOTIONWIND_RECIPES.map((recipe) => [recipe.id, definePreset(recipe.classes)]),\n) as Record<string, string>;\n\nexport function getRecipe(id: string): MotionwindRecipe | undefined {\n return MOTIONWIND_RECIPES.find((recipe) => recipe.id === id);\n}\n","import type {\n AnimatableValues,\n GestureKey,\n ParsedResult,\n TransitionConfig,\n ViewportConfig,\n DragConfig,\n LayoutConfig,\n ScrollConfig,\n VariantMap,\n VariantState,\n} from \"./types.js\";\nimport { GESTURE_MAP, GESTURE_KEYS, EASING_MAP } from \"./constants.js\";\nimport type {\n MotionwindConfig,\n MotionwindDiagnostic,\n MotionwindResultPatch,\n} from \"./config.js\";\nimport { BUILT_IN_PRESETS } from \"./recipes.js\";\n\nconst CACHE_MAX = 1000;\nconst cache = new Map<string, ParsedResult>();\n\nfunction presetClasses(value: string | readonly string[]): string[] {\n return (typeof value === \"string\" ? value.split(/\\s+/) : [...value]).filter(\n Boolean,\n );\n}\n\nfunction availablePresets(\n config?: MotionwindConfig,\n): Record<string, string | readonly string[]> {\n const pluginPresets = Object.assign(\n {},\n ...(config?.plugins ?? []).map((plugin) => plugin.presets ?? {}),\n );\n return { ...BUILT_IN_PRESETS, ...pluginPresets, ...(config?.presets ?? {}) };\n}\n\nfunction expandConfiguredTokens(\n className: string,\n config: MotionwindConfig | undefined,\n diagnostics: MotionwindDiagnostic[],\n): string[] {\n const presets = availablePresets(config);\n const output: string[] = [];\n\n const expand = (token: string, stack: string[]) => {\n if (!token.startsWith(\"animate-preset-\")) {\n const durationName = token.startsWith(\"animate-duration-\")\n ? token.slice(\"animate-duration-\".length)\n : \"\";\n const duration = durationName\n ? config?.tokens?.durations?.[durationName]\n : undefined;\n if (duration !== undefined) {\n output.push(`animate-duration-${duration}`);\n return;\n }\n\n const easingName = token.startsWith(\"animate-ease-\")\n ? token.slice(\"animate-ease-\".length)\n : \"\";\n const easing = easingName\n ? config?.tokens?.easings?.[easingName]\n : undefined;\n if (Array.isArray(easing)) {\n output.push(`animate-ease-[${easing.join(\",\")}]`);\n return;\n }\n\n const springName = token.startsWith(\"animate-spring-\")\n ? token.slice(\"animate-spring-\".length)\n : \"\";\n const spring = springName\n ? config?.tokens?.springs?.[springName]\n : undefined;\n if (spring) {\n output.push(\"animate-spring\");\n if (spring.stiffness !== undefined)\n output.push(`animate-stiffness-${spring.stiffness}`);\n if (spring.damping !== undefined)\n output.push(`animate-damping-${spring.damping}`);\n if (spring.bounce !== undefined)\n output.push(`animate-bounce-${spring.bounce}`);\n if (spring.mass !== undefined)\n output.push(`animate-mass-${spring.mass}`);\n return;\n }\n\n output.push(token);\n return;\n }\n\n const name = token.slice(\"animate-preset-\".length);\n const preset = presets[name];\n if (!preset) {\n diagnostics.push({\n code: \"unknown-preset\",\n message: `Unknown motionwind preset \"${name}\".`,\n severity: config?.strict ? \"error\" : \"warning\",\n token,\n });\n output.push(token);\n return;\n }\n if (stack.includes(name) || stack.length >= 8) {\n diagnostics.push({\n code: \"circular-preset\",\n message: `Circular motionwind preset expansion: ${[...stack, name].join(\" → \")}.`,\n severity: \"error\",\n token,\n });\n return;\n }\n for (const expanded of presetClasses(preset))\n expand(expanded, [...stack, name]);\n };\n\n for (const token of className.split(/\\s+/).filter(Boolean)) expand(token, []);\n return output;\n}\n\nfunction mergePatch(\n patch: MotionwindResultPatch,\n gestures: Partial<Record<GestureKey, AnimatableValues>>,\n transition: TransitionConfig,\n viewport: ViewportConfig,\n dragConfig: DragConfig,\n layoutConfig: LayoutConfig,\n scroll: ScrollConfig,\n variants: VariantMap,\n variantState: VariantState,\n): void {\n for (const [key, values] of Object.entries(patch.gestures ?? {})) {\n gestures[key as GestureKey] = {\n ...(gestures[key as GestureKey] ?? {}),\n ...(values ?? {}),\n };\n }\n Object.assign(transition, patch.transition);\n Object.assign(viewport, patch.viewport);\n Object.assign(dragConfig, patch.dragConfig);\n Object.assign(layoutConfig, patch.layoutConfig);\n if (patch.scroll) {\n Object.assign(scroll, patch.scroll);\n if (patch.scroll.values)\n scroll.values = { ...scroll.values, ...patch.scroll.values };\n }\n for (const [name, values] of Object.entries(patch.variants ?? {})) {\n variants[name] = { ...(variants[name] ?? {}), ...values };\n }\n Object.assign(variantState, patch.variantState);\n}\n\n/** Tailwind CSS built-in animate-* classes to exclude from warnings */\nconst TAILWIND_ANIMATE_CLASSES = new Set([\n \"animate-spin\",\n \"animate-ping\",\n \"animate-pulse\",\n \"animate-bounce\",\n \"animate-none\",\n]);\n\n/** Evict oldest entries when cache exceeds max size */\nfunction cacheSet(key: string, value: ParsedResult): void {\n if (cache.size >= CACHE_MAX) {\n // Map iterates in insertion order — delete the first (oldest) key\n const firstKey = cache.keys().next().value;\n if (firstKey !== undefined) cache.delete(firstKey);\n }\n cache.set(key, value);\n}\n\n/** Unit suffix map for string-unit values: x-100pct → \"100%\" */\nconst UNIT_MAP: Record<string, string> = {\n pct: \"%\",\n px: \"px\",\n vh: \"vh\",\n vw: \"vw\",\n rem: \"rem\",\n em: \"em\",\n dvh: \"dvh\",\n svh: \"svh\",\n lvh: \"lvh\",\n};\n\n/**\n * Try to parse a numeric value with an optional unit suffix.\n * Returns the number if no unit, or a string like \"100%\" / \"50vh\" if unit present.\n * Returns null if not a valid number.\n */\nfunction parseNumericWithUnit(\n str: string,\n sign: number,\n): string | number | null {\n // Check for \"auto\" keyword\n if (str === \"auto\") return \"auto\";\n\n // Check for unit suffix: e.g. \"100pct\", \"50vh\", \"2rem\"\n for (const [suffix, unit] of Object.entries(UNIT_MAP)) {\n if (str.endsWith(suffix)) {\n const numPart = str.slice(0, -suffix.length);\n const n = Number(numPart);\n if (isNaN(n)) return null;\n return `${n * sign}${unit}`;\n }\n }\n\n // Plain number\n const n = Number(str);\n if (isNaN(n)) return null;\n return n * sign;\n}\n\n/** Allowed properties for arbitrary value syntax [key=value] */\nconst ARBITRARY_VALUE_ALLOWLIST = new Set([\n \"x\",\n \"y\",\n \"z\",\n \"scale\",\n \"scaleX\",\n \"scaleY\",\n \"scaleZ\",\n \"rotate\",\n \"rotateX\",\n \"rotateY\",\n \"rotateZ\",\n \"skew\",\n \"skewX\",\n \"skewY\",\n \"originX\",\n \"originY\",\n \"originZ\",\n \"perspective\",\n \"opacity\",\n \"filter\",\n \"backdropFilter\",\n \"clipPath\",\n \"width\",\n \"height\",\n \"top\",\n \"left\",\n \"right\",\n \"bottom\",\n \"padding\",\n \"margin\",\n \"gap\",\n \"borderRadius\",\n \"borderTopLeftRadius\",\n \"borderTopRightRadius\",\n \"borderBottomLeftRadius\",\n \"borderBottomRightRadius\",\n \"borderWidth\",\n \"fontSize\",\n \"letterSpacing\",\n \"lineHeight\",\n \"backgroundColor\",\n \"color\",\n \"borderColor\",\n \"boxShadow\",\n \"textShadow\",\n \"zIndex\",\n \"pathLength\",\n \"pathOffset\",\n \"pathSpacing\",\n]);\n\n/**\n * Parse a property-value string (e.g. \"scale-110\", \"x-20\", \"opacity-0\")\n * into a Motion-compatible key-value pair.\n */\nfunction parsePropertyValue(\n raw: string,\n): { key: string; value: string | number | (string | number)[] } | null {\n // Arbitrary value: [key=value]\n if (raw.startsWith(\"[\") && raw.endsWith(\"]\")) {\n const inner = raw.slice(1, -1);\n const eqIdx = inner.indexOf(\"=\");\n if (eqIdx === -1) return null;\n const key = inner.slice(0, eqIdx);\n if (!ARBITRARY_VALUE_ALLOWLIST.has(key)) return null;\n const val = inner.slice(eqIdx + 1);\n const num = Number(val);\n return { key, value: isNaN(num) ? val : num };\n }\n\n // Negative prefix\n let negative = false;\n let str = raw;\n if (str.startsWith(\"-\")) {\n negative = true;\n str = str.slice(1);\n }\n\n const sign = negative ? -1 : 1;\n\n // Keyframe array syntax: property-[v1,v2,v3] — supports numbers and unit values\n const keyframeMatch = str.match(/^(\\w+(?:-\\w+)?)-\\[([^\\]]+)\\]$/);\n if (keyframeMatch) {\n const propName = keyframeMatch[1]!;\n const valuesStr = keyframeMatch[2]!;\n const propKey = normalizePropertyName(propName);\n if (propKey) {\n const rawValues = valuesStr.split(\",\").reduce<string[]>((acc, v) => {\n const t = v.trim();\n if (t) acc.push(t);\n return acc;\n }, []);\n if (rawValues.length > 0) {\n const scaleProps = new Set([\n \"scale\",\n \"scaleX\",\n \"scaleY\",\n \"scaleZ\",\n \"opacity\",\n \"brightness\",\n \"contrast\",\n \"saturate\",\n ]);\n const parsed: (string | number)[] = [];\n let valid = true;\n for (const rv of rawValues) {\n const unitVal = parseNumericWithUnit(rv, 1);\n if (unitVal === null) {\n valid = false;\n break;\n }\n if (typeof unitVal === \"number\" && scaleProps.has(propKey)) {\n parsed.push(unitVal / 100);\n } else {\n parsed.push(unitVal);\n }\n }\n if (valid) {\n return { key: propKey, value: parsed };\n }\n }\n }\n // Fall through — may be shadow-[...] etc.\n }\n\n // --- Transform properties ---\n\n // scale-z-{n}\n if (str.startsWith(\"scale-z-\")) {\n const n = Number(str.slice(8));\n if (!isNaN(n)) return { key: \"scaleZ\", value: (n / 100) * sign };\n }\n\n // scale-x-{n}\n if (str.startsWith(\"scale-x-\")) {\n const n = Number(str.slice(8));\n if (!isNaN(n)) return { key: \"scaleX\", value: (n / 100) * sign };\n }\n if (str.startsWith(\"scale-y-\")) {\n const n = Number(str.slice(8));\n if (!isNaN(n)) return { key: \"scaleY\", value: (n / 100) * sign };\n }\n\n // scale-{n}\n if (str.startsWith(\"scale-\")) {\n const n = Number(str.slice(6));\n if (!isNaN(n)) return { key: \"scale\", value: (n / 100) * sign };\n }\n\n // rotate-x-{n} / rotate-y-{n}\n if (str.startsWith(\"rotate-x-\")) {\n const n = Number(str.slice(9));\n if (!isNaN(n)) return { key: \"rotateX\", value: n * sign };\n }\n if (str.startsWith(\"rotate-y-\")) {\n const n = Number(str.slice(9));\n if (!isNaN(n)) return { key: \"rotateY\", value: n * sign };\n }\n\n // rotate-{n}\n if (str.startsWith(\"rotate-\")) {\n const n = Number(str.slice(7));\n if (!isNaN(n)) return { key: \"rotate\", value: n * sign };\n }\n\n // skew-x-{n}\n if (str.startsWith(\"skew-x-\")) {\n const n = Number(str.slice(7));\n if (!isNaN(n)) return { key: \"skewX\", value: n * sign };\n }\n\n // skew-y-{n}\n if (str.startsWith(\"skew-y-\")) {\n const n = Number(str.slice(7));\n if (!isNaN(n)) return { key: \"skewY\", value: n * sign };\n }\n\n // skew-{n} (uniform)\n if (str.startsWith(\"skew-\")) {\n const n = Number(str.slice(5));\n if (!isNaN(n)) return { key: \"skew\", value: n * sign };\n }\n\n // origin-x-{n} (0-100 → 0-1)\n if (str.startsWith(\"origin-x-\")) {\n const n = Number(str.slice(9));\n if (!isNaN(n)) return { key: \"originX\", value: (n / 100) * sign };\n }\n\n // origin-y-{n}\n if (str.startsWith(\"origin-y-\")) {\n const n = Number(str.slice(9));\n if (!isNaN(n)) return { key: \"originY\", value: (n / 100) * sign };\n }\n\n // origin-z-{n}\n if (str.startsWith(\"origin-z-\")) {\n const n = Number(str.slice(9));\n if (!isNaN(n)) return { key: \"originZ\", value: n * sign };\n }\n\n // perspective-{n}\n if (str.startsWith(\"perspective-\")) {\n const n = Number(str.slice(12));\n if (!isNaN(n)) return { key: \"perspective\", value: n * sign };\n }\n\n // --- Translate with unit support: x-{n}, x-{n}pct, x-{n}vh, x-auto ---\n\n if (str.startsWith(\"x-\")) {\n const val = parseNumericWithUnit(str.slice(2), sign);\n if (val !== null) return { key: \"x\", value: val };\n }\n\n if (str.startsWith(\"y-\")) {\n const val = parseNumericWithUnit(str.slice(2), sign);\n if (val !== null) return { key: \"y\", value: val };\n }\n\n // z-{n} → zIndex for Tailwind-standard values (0, 10, 20, 30, 40, 50, auto).\n // Any other numeric value falls through to the z-translate handler below.\n if (str.startsWith(\"z-\")) {\n const suffix = str.slice(2);\n if (suffix === \"auto\") return { key: \"zIndex\", value: \"auto\" };\n const zn = Number(suffix);\n if (!isNaN(zn) && [0, 10, 20, 30, 40, 50].includes(zn))\n return { key: \"zIndex\", value: zn };\n }\n\n // z-{n} → z-translate (arbitrary values with optional unit)\n if (str.startsWith(\"z-\")) {\n const val = parseNumericWithUnit(str.slice(2), sign);\n if (val !== null) return { key: \"z\", value: val };\n }\n\n // --- Visual properties ---\n\n // opacity-{n}\n if (str.startsWith(\"opacity-\")) {\n const n = Number(str.slice(8));\n if (!isNaN(n)) return { key: \"opacity\", value: (n / 100) * sign };\n }\n\n // blur-{n} — clamped to 0 minimum (negative blur is invalid CSS)\n if (str.startsWith(\"blur-\")) {\n const n = Number(str.slice(5));\n if (!isNaN(n))\n return { key: \"filter\", value: `blur(${Math.max(0, n * sign)}px)` };\n }\n\n // brightness-{n} — clamped to 0 minimum\n if (str.startsWith(\"brightness-\")) {\n const n = Number(str.slice(11));\n if (!isNaN(n))\n return {\n key: \"filter\",\n value: `brightness(${Math.max(0, (n / 100) * sign)})`,\n };\n }\n\n // contrast-{n} — clamped to 0 minimum\n if (str.startsWith(\"contrast-\")) {\n const n = Number(str.slice(9));\n if (!isNaN(n))\n return {\n key: \"filter\",\n value: `contrast(${Math.max(0, (n / 100) * sign)})`,\n };\n }\n\n // saturate-{n} — clamped to 0 minimum\n if (str.startsWith(\"saturate-\")) {\n const n = Number(str.slice(9));\n if (!isNaN(n))\n return {\n key: \"filter\",\n value: `saturate(${Math.max(0, (n / 100) * sign)})`,\n };\n }\n\n // grayscale-{n} — 0-100 → 0-1, clamped to 0 minimum\n if (str.startsWith(\"grayscale-\")) {\n const n = Number(str.slice(10));\n if (!isNaN(n))\n return {\n key: \"filter\",\n value: `grayscale(${Math.max(0, (n / 100) * sign)})`,\n };\n }\n\n // sepia-{n} — 0-100 → 0-1, clamped to 0 minimum\n if (str.startsWith(\"sepia-\")) {\n const n = Number(str.slice(6));\n if (!isNaN(n))\n return {\n key: \"filter\",\n value: `sepia(${Math.max(0, (n / 100) * sign)})`,\n };\n }\n\n // invert-{n} — 0-100 → 0-1, clamped to 0 minimum\n if (str.startsWith(\"invert-\")) {\n const n = Number(str.slice(7));\n if (!isNaN(n))\n return {\n key: \"filter\",\n value: `invert(${Math.max(0, (n / 100) * sign)})`,\n };\n }\n\n // hue-rotate-{n} — degrees, supports negative values\n if (str.startsWith(\"hue-rotate-\")) {\n const n = Number(str.slice(11));\n if (!isNaN(n))\n return { key: \"filter\", value: `hue-rotate(${n * sign}deg)` };\n }\n\n // drop-shadow: drop-shadow-[value] — underscores become spaces (Tailwind convention)\n if (str.startsWith(\"drop-shadow-\")) {\n const val = str.slice(12);\n if (val.startsWith(\"[\") && val.endsWith(\"]\")) {\n return {\n key: \"filter\",\n value: `drop-shadow(${val.slice(1, -1).replace(/_/g, \" \")})`,\n };\n }\n }\n\n // backdrop-blur-{n} — clamped to 0 minimum\n if (str.startsWith(\"backdrop-blur-\")) {\n const n = Number(str.slice(14));\n if (!isNaN(n))\n return {\n key: \"backdropFilter\",\n value: `blur(${Math.max(0, n * sign)}px)`,\n };\n }\n\n // clip-path: clip-[value]\n if (str.startsWith(\"clip-\")) {\n const val = str.slice(5);\n if (val.startsWith(\"[\") && val.endsWith(\"]\")) {\n return { key: \"clipPath\", value: val.slice(1, -1) };\n }\n }\n\n // --- Dimensions with unit support ---\n\n // Per-corner border radius (must come before generic rounded- check)\n if (str.startsWith(\"rounded-tl-\")) {\n const n = Number(str.slice(11));\n if (!isNaN(n)) return { key: \"borderTopLeftRadius\", value: n * sign };\n }\n if (str.startsWith(\"rounded-tr-\")) {\n const n = Number(str.slice(11));\n if (!isNaN(n)) return { key: \"borderTopRightRadius\", value: n * sign };\n }\n if (str.startsWith(\"rounded-bl-\")) {\n const n = Number(str.slice(11));\n if (!isNaN(n)) return { key: \"borderBottomLeftRadius\", value: n * sign };\n }\n if (str.startsWith(\"rounded-br-\")) {\n const n = Number(str.slice(11));\n if (!isNaN(n)) return { key: \"borderBottomRightRadius\", value: n * sign };\n }\n\n // rounded-{n}\n if (str.startsWith(\"rounded-\")) {\n const n = Number(str.slice(8));\n if (!isNaN(n)) return { key: \"borderRadius\", value: n * sign };\n }\n\n // w-{n} / w-auto / w-{n}pct\n if (str.startsWith(\"w-\")) {\n const val = parseNumericWithUnit(str.slice(2), sign);\n if (val !== null) return { key: \"width\", value: val };\n }\n\n // h-{n} / h-auto / h-{n}pct\n if (str.startsWith(\"h-\")) {\n const val = parseNumericWithUnit(str.slice(2), sign);\n if (val !== null) return { key: \"height\", value: val };\n }\n\n // --- Position properties ---\n\n // top-{n} / top-{n}pct / top-auto\n if (str.startsWith(\"top-\")) {\n const val = parseNumericWithUnit(str.slice(4), sign);\n if (val !== null) return { key: \"top\", value: val };\n }\n\n // left-{n}\n if (str.startsWith(\"left-\")) {\n const val = parseNumericWithUnit(str.slice(5), sign);\n if (val !== null) return { key: \"left\", value: val };\n }\n\n // right-{n}\n if (str.startsWith(\"right-\")) {\n const val = parseNumericWithUnit(str.slice(6), sign);\n if (val !== null) return { key: \"right\", value: val };\n }\n\n // bottom-{n}\n if (str.startsWith(\"bottom-\")) {\n const val = parseNumericWithUnit(str.slice(7), sign);\n if (val !== null) return { key: \"bottom\", value: val };\n }\n\n // --- Spacing ---\n\n // p-{n} → padding\n if (str.startsWith(\"p-\")) {\n const val = parseNumericWithUnit(str.slice(2), sign);\n if (val !== null) return { key: \"padding\", value: val };\n }\n\n // m-{n} → margin\n if (str.startsWith(\"m-\")) {\n const val = parseNumericWithUnit(str.slice(2), sign);\n if (val !== null) return { key: \"margin\", value: val };\n }\n\n // gap-{n}\n if (str.startsWith(\"gap-\")) {\n const val = parseNumericWithUnit(str.slice(4), sign);\n if (val !== null) return { key: \"gap\", value: val };\n }\n\n // --- Typography ---\n\n // text-size-{n} → fontSize\n if (str.startsWith(\"text-size-\")) {\n const val = parseNumericWithUnit(str.slice(10), sign);\n if (val !== null) return { key: \"fontSize\", value: val };\n }\n\n // tracking-{n} → letterSpacing\n if (str.startsWith(\"tracking-\")) {\n const val = parseNumericWithUnit(str.slice(9), sign);\n if (val !== null) return { key: \"letterSpacing\", value: val };\n }\n\n // leading-{n} → lineHeight\n if (str.startsWith(\"leading-\")) {\n const val = parseNumericWithUnit(str.slice(8), sign);\n if (val !== null) return { key: \"lineHeight\", value: val };\n }\n\n // --- Border ---\n\n // border-w-{n} → borderWidth\n if (str.startsWith(\"border-w-\")) {\n const n = Number(str.slice(9));\n if (!isNaN(n)) return { key: \"borderWidth\", value: n * sign };\n }\n\n // --- SVG path properties ---\n\n if (str.startsWith(\"path-length-\")) {\n const n = Number(str.slice(12));\n if (!isNaN(n)) return { key: \"pathLength\", value: n * sign };\n }\n\n if (str.startsWith(\"path-offset-\")) {\n const n = Number(str.slice(12));\n if (!isNaN(n)) return { key: \"pathOffset\", value: n * sign };\n }\n\n if (str.startsWith(\"path-spacing-\")) {\n const n = Number(str.slice(13));\n if (!isNaN(n)) return { key: \"pathSpacing\", value: n * sign };\n }\n\n // --- Color properties ---\n\n if (str.startsWith(\"bg-\")) {\n const color = str.slice(3);\n if (isValidColor(color)) {\n return { key: \"backgroundColor\", value: color };\n }\n return null;\n }\n\n // text-shadow: text-shadow-[value] — underscores become spaces\n if (str.startsWith(\"text-shadow-\")) {\n const val = str.slice(12);\n if (val.startsWith(\"[\") && val.endsWith(\"]\")) {\n return {\n key: \"textShadow\",\n value: val.slice(1, -1).replace(/_/g, \" \"),\n };\n }\n }\n\n if (str.startsWith(\"text-\")) {\n const color = str.slice(5);\n if (isValidColor(color)) {\n return { key: \"color\", value: color };\n }\n // fall through — could be text-size which is handled above\n return null;\n }\n\n if (str.startsWith(\"border-\")) {\n const color = str.slice(7);\n if (isValidColor(color)) {\n return { key: \"borderColor\", value: color };\n }\n // fall through — could be border-w which is handled above\n return null;\n }\n\n // box-shadow: shadow-[value]\n if (str.startsWith(\"shadow-\")) {\n const val = str.slice(7);\n if (val.startsWith(\"[\") && val.endsWith(\"]\")) {\n return { key: \"boxShadow\", value: val.slice(1, -1) };\n }\n return null;\n }\n\n return null;\n}\n\n/** Validate that a color string is a plausible CSS color */\nconst HEX_COLOR_RE = /^#(?:[0-9a-fA-F]{3,4}|[0-9a-fA-F]{6}|[0-9a-fA-F]{8})$/;\nconst FUNC_COLOR_RE = /^(?:rgb|rgba|hsl|hsla)\\(.+\\)$/;\n\nfunction isValidColor(color: string): boolean {\n return HEX_COLOR_RE.test(color) || FUNC_COLOR_RE.test(color);\n}\n\n/** Map shorthand property names to Motion property keys */\nfunction normalizePropertyName(name: string): string | null {\n const map: Record<string, string> = {\n scale: \"scale\",\n \"scale-x\": \"scaleX\",\n \"scale-y\": \"scaleY\",\n \"scale-z\": \"scaleZ\",\n rotate: \"rotate\",\n \"rotate-x\": \"rotateX\",\n \"rotate-y\": \"rotateY\",\n x: \"x\",\n y: \"y\",\n z: \"z\",\n opacity: \"opacity\",\n \"skew-x\": \"skewX\",\n \"skew-y\": \"skewY\",\n skew: \"skew\",\n w: \"width\",\n h: \"height\",\n rounded: \"borderRadius\",\n \"rounded-tl\": \"borderTopLeftRadius\",\n \"rounded-tr\": \"borderTopRightRadius\",\n \"rounded-bl\": \"borderBottomLeftRadius\",\n \"rounded-br\": \"borderBottomRightRadius\",\n \"origin-x\": \"originX\",\n \"origin-y\": \"originY\",\n \"origin-z\": \"originZ\",\n perspective: \"perspective\",\n };\n return map[name] ?? null;\n}\n\n/** Normalize a scroll property name to a Motion style key. */\nfunction normalizeScrollProp(name: string): string | null {\n const n = name.toLowerCase().replace(/-/g, \"\");\n const map: Record<string, string> = {\n x: \"x\",\n y: \"y\",\n z: \"z\",\n opacity: \"opacity\",\n rotate: \"rotate\",\n rotatex: \"rotateX\",\n rotatey: \"rotateY\",\n scale: \"scale\",\n scalex: \"scaleX\",\n scaley: \"scaleY\",\n };\n return map[n] ?? null;\n}\n\n/**\n * Parse a scroll value token like \"y-[0,-200]\" or \"scaleX-[0,1]\" into a\n * Motion style key and a literal output range. Unlike gesture values, scroll\n * ranges are NOT rescaled (0.5 means 0.5, 200 means 200px).\n */\nfunction parseScrollValue(\n raw: string,\n): { key: string; value: number[] } | null {\n const m = raw.match(/^([\\w-]+?)-\\[([^\\]]+)\\]$/);\n if (!m) return null;\n const key = normalizeScrollProp(m[1]!);\n if (!key) return null;\n const parts = m[2]!.split(\",\").map((v) => Number(v.trim()));\n if (parts.length < 2 || parts.some((n) => isNaN(n))) return null;\n return { key, value: parts };\n}\n\n/**\n * Classify a single class token and update the result accordingly.\n * Returns true if the token was consumed (is a motionwind class).\n */\nfunction classifyToken(\n token: string,\n gestures: Partial<Record<GestureKey, AnimatableValues>>,\n transition: TransitionConfig,\n viewport: ViewportConfig,\n dragConfig: DragConfig,\n layoutConfig: LayoutConfig,\n scroll: ScrollConfig,\n variants: VariantMap,\n variantState: VariantState,\n): boolean {\n if (!token.startsWith(\"animate-\")) return false;\n\n const rest = token.slice(8);\n\n // --- Gesture prefix: animate-{gesture}:{property-value} ---\n const colonIdx = rest.indexOf(\":\");\n if (colonIdx !== -1) {\n const gesturePrefix = rest.slice(0, colonIdx);\n const propValueStr = rest.slice(colonIdx + 1);\n\n // Scroll-linked value: animate-scroll:{prop}-[from,to]\n if (gesturePrefix === \"scroll\") {\n const parsed = parseScrollValue(propValueStr);\n if (parsed) {\n scroll.values[parsed.key] = parsed.value;\n return true;\n }\n return false;\n }\n\n // Variant definition: animate-variant-{name}:{prop-value}\n if (gesturePrefix.startsWith(\"variant-\")) {\n const variantName = gesturePrefix.slice(8);\n const parsed = parsePropertyValue(propValueStr);\n if (variantName && parsed) {\n if (!variants[variantName]) variants[variantName] = {};\n const bucket = variants[variantName]!;\n if (\n (parsed.key === \"filter\" || parsed.key === \"backdropFilter\") &&\n typeof parsed.value === \"string\" &&\n typeof bucket[parsed.key] === \"string\"\n ) {\n bucket[parsed.key] += ` ${parsed.value}`;\n } else {\n bucket[parsed.key] = parsed.value;\n }\n return true;\n }\n return false;\n }\n\n if (GESTURE_KEYS.has(gesturePrefix)) {\n const gestureKey = GESTURE_MAP[gesturePrefix]!;\n const parsed = parsePropertyValue(propValueStr);\n if (parsed) {\n if (!gestures[gestureKey]) gestures[gestureKey] = {};\n // Combine multiple filter/backdropFilter functions\n if (\n (parsed.key === \"filter\" || parsed.key === \"backdropFilter\") &&\n typeof parsed.value === \"string\" &&\n typeof gestures[gestureKey]![parsed.key] === \"string\"\n ) {\n gestures[gestureKey]![parsed.key] += ` ${parsed.value}`;\n } else {\n if (\n process.env.NODE_ENV !== \"production\" &&\n gestures[gestureKey]![parsed.key] !== undefined\n ) {\n console.warn(\n `[motionwind] Duplicate property \"${parsed.key}\" in \"${gestureKey}\" ` +\n `(class \"${token}\"). The last value will be used.`,\n );\n }\n gestures[gestureKey]![parsed.key] = parsed.value;\n }\n return true;\n }\n }\n return false;\n }\n\n // --- Transition config tokens ---\n\n // duration\n if (rest.startsWith(\"duration-\")) {\n const ms = Number(rest.slice(9));\n if (!isNaN(ms)) {\n transition.duration = ms / 1000;\n return true;\n }\n }\n\n // delay-children (must come before delay)\n if (rest.startsWith(\"delay-children-\")) {\n const ms = Number(rest.slice(15));\n if (!isNaN(ms)) {\n transition.delayChildren = ms / 1000;\n return true;\n }\n }\n\n // delay\n if (rest.startsWith(\"delay-\")) {\n const ms = Number(rest.slice(6));\n if (!isNaN(ms)) {\n transition.delay = ms / 1000;\n return true;\n }\n }\n\n // ease-[n,n,n,n] — custom cubic-bezier\n if (rest.startsWith(\"ease-[\") && rest.endsWith(\"]\")) {\n const inner = rest.slice(6, -1);\n const values = inner.split(\",\").map((v) => Number(v.trim()));\n if (values.length === 4 && values.every((v) => !isNaN(v))) {\n transition.ease = values;\n return true;\n }\n }\n\n // ease-steps-{n}\n if (rest.startsWith(\"ease-steps-\")) {\n const n = Number(rest.slice(11));\n if (!isNaN(n) && n > 0) {\n transition.ease = `steps(${n})`;\n return true;\n }\n }\n\n // Named easing from EASING_MAP\n for (const [suffix, easeValue] of Object.entries(EASING_MAP)) {\n if (rest === suffix) {\n transition.ease = easeValue;\n return true;\n }\n }\n\n // spring\n if (rest === \"spring\") {\n transition.type = \"spring\";\n return true;\n }\n\n // stiffness\n if (rest.startsWith(\"stiffness-\")) {\n const n = Number(rest.slice(10));\n if (!isNaN(n)) {\n transition.stiffness = n;\n return true;\n }\n }\n\n // damping\n if (rest.startsWith(\"damping-\")) {\n const n = Number(rest.slice(8));\n if (!isNaN(n)) {\n transition.damping = n;\n return true;\n }\n }\n\n // bounce\n if (rest.startsWith(\"bounce-\")) {\n const n = Number(rest.slice(7));\n if (!isNaN(n)) {\n transition.bounce = n / 100;\n return true;\n }\n }\n\n // mass\n if (rest.startsWith(\"mass-\")) {\n const n = Number(rest.slice(5));\n if (!isNaN(n)) {\n transition.mass = n / 10;\n return true;\n }\n }\n\n // repeat-infinite\n if (rest === \"repeat-infinite\") {\n transition.repeat = Infinity;\n return true;\n }\n\n // repeat-reverse\n if (rest === \"repeat-reverse\") {\n transition.repeatType = \"reverse\";\n return true;\n }\n\n // repeat-mirror\n if (rest === \"repeat-mirror\") {\n transition.repeatType = \"mirror\";\n return true;\n }\n\n // repeat-delay-{ms}\n if (rest.startsWith(\"repeat-delay-\")) {\n const ms = Number(rest.slice(13));\n if (!isNaN(ms)) {\n transition.repeatDelay = ms / 1000;\n return true;\n }\n }\n\n // repeat-{n}\n if (rest.startsWith(\"repeat-\")) {\n const n = Number(rest.slice(7));\n if (!isNaN(n)) {\n transition.repeat = n;\n return true;\n }\n }\n\n // stagger-reverse\n if (rest === \"stagger-reverse\") {\n transition.staggerDirection = -1;\n return true;\n }\n\n // stagger-{ms}\n if (rest.startsWith(\"stagger-\")) {\n const ms = Number(rest.slice(8));\n if (!isNaN(ms)) {\n transition.staggerChildren = ms / 1000;\n return true;\n }\n }\n\n // when-before / when-after\n if (rest === \"when-before\") {\n transition.when = \"beforeChildren\";\n return true;\n }\n if (rest === \"when-after\") {\n transition.when = \"afterChildren\";\n return true;\n }\n\n // rest-speed-{n} (0.01 increments via hundredths)\n if (rest.startsWith(\"rest-speed-\")) {\n const n = Number(rest.slice(11));\n if (!isNaN(n)) {\n transition.restSpeed = n;\n return true;\n }\n }\n\n // rest-delta-{n}\n if (rest.startsWith(\"rest-delta-\")) {\n const n = Number(rest.slice(11));\n if (!isNaN(n)) {\n transition.restDelta = n;\n return true;\n }\n }\n\n // times-[0,0.5,1]\n if (rest.startsWith(\"times-[\") && rest.endsWith(\"]\")) {\n const inner = rest.slice(7, -1);\n const values = inner.split(\",\").map((v) => Number(v.trim()));\n if (!values.some(isNaN)) {\n transition.times = values;\n return true;\n }\n }\n\n // --- Viewport config tokens ---\n\n if (rest === \"once\") {\n viewport.once = true;\n return true;\n }\n\n if (rest === \"amount-all\") {\n viewport.amount = \"all\";\n return true;\n }\n\n if (rest.startsWith(\"amount-\")) {\n const n = Number(rest.slice(7));\n if (!isNaN(n)) {\n viewport.amount = n / 100;\n return true;\n }\n }\n\n if (rest.startsWith(\"margin-\")) {\n const n = Number(rest.slice(7));\n if (!isNaN(n)) {\n viewport.margin = `${n}px`;\n return true;\n }\n }\n\n // --- Scroll-linked config tokens ---\n\n if (rest === \"scroll-axis-x\") {\n scroll.axis = \"x\";\n return true;\n }\n if (rest === \"scroll-axis-y\") {\n scroll.axis = \"y\";\n return true;\n }\n if (rest === \"scroll-container\") {\n scroll.container = true;\n return true;\n }\n\n // scroll-offset-[start_end,end_start] — underscores become spaces\n if (rest.startsWith(\"scroll-offset-[\") && rest.endsWith(\"]\")) {\n const inner = rest.slice(15, -1);\n const parts = inner.split(\",\").map((p) => p.trim().replace(/_/g, \" \"));\n if (parts.length === 2) {\n scroll.offset = [parts[0]!, parts[1]!];\n return true;\n }\n }\n\n // --- Variant state selectors ---\n // animate-from-{name} → initial, animate-to-{name} → animate, animate-exit-{name} → exit\n if (rest.startsWith(\"from-\")) {\n const name = rest.slice(5);\n if (name && !/\\s/.test(name)) {\n variantState.initial = name;\n return true;\n }\n }\n if (rest.startsWith(\"to-\")) {\n const name = rest.slice(3);\n if (name && !/\\s/.test(name)) {\n variantState.animate = name;\n return true;\n }\n }\n if (rest.startsWith(\"exit-\")) {\n const name = rest.slice(5);\n if (name && !/\\s/.test(name)) {\n variantState.exit = name;\n return true;\n }\n }\n\n // --- Drag config tokens ---\n\n if (rest === \"drag-x\") {\n dragConfig.drag = \"x\";\n return true;\n }\n if (rest === \"drag-y\") {\n dragConfig.drag = \"y\";\n return true;\n }\n if (rest === \"drag-both\") {\n dragConfig.drag = true;\n return true;\n }\n\n if (rest.startsWith(\"drag-elastic-\")) {\n const n = Number(rest.slice(13));\n if (!isNaN(n)) {\n dragConfig.dragElastic = n / 100;\n return true;\n }\n }\n\n if (rest === \"drag-snap\") {\n dragConfig.dragSnapToOrigin = true;\n return true;\n }\n if (rest === \"drag-no-momentum\") {\n dragConfig.dragMomentum = false;\n return true;\n }\n if (rest === \"drag-lock\") {\n dragConfig.dragDirectionLock = true;\n return true;\n }\n\n // drag-constraint-{side}-{n}\n if (rest.startsWith(\"drag-constraint-\")) {\n const sub = rest.slice(16);\n const sides: Record<string, string> = {\n \"t-\": \"top\",\n \"l-\": \"left\",\n \"r-\": \"right\",\n \"b-\": \"bottom\",\n };\n for (const [prefix, side] of Object.entries(sides)) {\n if (sub.startsWith(prefix)) {\n const n = Number(sub.slice(2));\n if (!isNaN(n)) {\n if (!dragConfig.dragConstraints) dragConfig.dragConstraints = {};\n (dragConfig.dragConstraints as Record<string, number>)[side] = n;\n return true;\n }\n }\n }\n }\n\n // --- Layout config tokens ---\n\n if (rest === \"layout\") {\n layoutConfig.layout = true;\n return true;\n }\n if (rest === \"layout-position\") {\n layoutConfig.layout = \"position\";\n return true;\n }\n if (rest === \"layout-size\") {\n layoutConfig.layout = \"size\";\n return true;\n }\n if (rest === \"layout-preserve\") {\n layoutConfig.layout = \"preserve-aspect\";\n return true;\n }\n if (rest === \"layout-scroll\") {\n layoutConfig.layoutScroll = true;\n return true;\n }\n if (rest === \"layout-root\") {\n layoutConfig.layoutRoot = true;\n return true;\n }\n\n if (rest.startsWith(\"layout-id-\")) {\n const id = rest.slice(10);\n if (id && !/\\s/.test(id)) {\n layoutConfig.layoutId = id;\n return true;\n }\n return false;\n }\n\n return false;\n}\n\n/**\n * Parse a className string and extract motionwind classes into structured\n * Motion props. All non-motionwind classes pass through as tailwindClasses.\n *\n * Results are memoized by input string.\n */\nexport function parseMotionClasses(\n className: string,\n config?: MotionwindConfig,\n): ParsedResult {\n const cached = config ? undefined : cache.get(className);\n if (cached) return cached;\n\n const diagnostics: MotionwindDiagnostic[] = [];\n const tokens = expandConfiguredTokens(className, config, diagnostics);\n const tailwind: string[] = [];\n const gestures: Partial<Record<GestureKey, AnimatableValues>> = {};\n const transition: TransitionConfig = {};\n const viewport: ViewportConfig = {};\n const dragConfig: DragConfig = {};\n const layoutConfig: LayoutConfig = {};\n const scroll: ScrollConfig = { axis: \"y\", container: false, values: {} };\n const variants: VariantMap = {};\n const variantState: VariantState = {};\n let reducedMotionPolicy: \"reduce\" | \"safe\" | undefined = undefined;\n\n for (const token of tokens) {\n // Detect and strip motion-reduce:/motion-safe: prefixes.\n // The inner token is processed normally; the prefix sets reducedMotionPolicy.\n let innerToken = token;\n if (token.startsWith(\"motion-reduce:\")) {\n reducedMotionPolicy = \"reduce\";\n innerToken = token.slice(\"motion-reduce:\".length);\n } else if (token.startsWith(\"motion-safe:\")) {\n reducedMotionPolicy = \"safe\";\n innerToken = token.slice(\"motion-safe:\".length);\n }\n // Skip empty inner tokens (e.g. a bare \"motion-reduce:\" with nothing after)\n if (!innerToken) continue;\n\n let consumed = classifyToken(\n innerToken,\n gestures,\n transition,\n viewport,\n dragConfig,\n layoutConfig,\n scroll,\n variants,\n variantState,\n );\n\n if (!consumed) {\n const easingName = innerToken.startsWith(\"animate-ease-\")\n ? innerToken.slice(\"animate-ease-\".length)\n : \"\";\n const easing = easingName\n ? config?.tokens?.easings?.[easingName]\n : undefined;\n if (typeof easing === \"string\") {\n transition.ease = easing;\n consumed = true;\n }\n }\n\n if (!consumed) {\n for (const plugin of config?.plugins ?? []) {\n const patch = plugin.transformToken?.(innerToken, { config: config! });\n if (!patch) continue;\n mergePatch(\n patch,\n gestures,\n transition,\n viewport,\n dragConfig,\n layoutConfig,\n scroll,\n variants,\n variantState,\n );\n consumed = true;\n break;\n }\n }\n\n if (!consumed) {\n if (\n innerToken.startsWith(\"animate-\") &&\n !TAILWIND_ANIMATE_CLASSES.has(innerToken)\n ) {\n diagnostics.push({\n code: \"unknown-class\",\n message: `Unrecognized motionwind class \"${innerToken}\".`,\n severity: config?.strict ? \"error\" : \"warning\",\n token: innerToken,\n });\n }\n if (\n process.env.NODE_ENV !== \"production\" &&\n innerToken.startsWith(\"animate-\") &&\n !TAILWIND_ANIMATE_CLASSES.has(innerToken)\n ) {\n console.warn(\n `[motionwind] Unrecognized class \"${innerToken}\". ` +\n `It starts with \"animate-\" but doesn't match any known pattern.`,\n );\n }\n tailwind.push(innerToken);\n }\n }\n\n const hasMotion =\n Object.keys(gestures).length > 0 ||\n Object.keys(transition).length > 0 ||\n Object.keys(viewport).length > 0 ||\n Object.keys(dragConfig).length > 0 ||\n Object.keys(layoutConfig).length > 0 ||\n Object.keys(scroll.values).length > 0 ||\n Object.keys(variants).length > 0 ||\n Object.keys(variantState).length > 0;\n\n const result: ParsedResult = {\n tailwindClasses: tailwind.join(\" \"),\n gestures,\n transition,\n viewport,\n dragConfig,\n layoutConfig,\n scroll,\n variants,\n variantState,\n hasMotion,\n ...(reducedMotionPolicy !== undefined && { reducedMotionPolicy }),\n diagnostics,\n };\n\n for (const plugin of config?.plugins ?? []) {\n const pluginDiagnostics =\n plugin.diagnose?.(className, result, { config: config! }) ?? [];\n diagnostics.push(\n ...pluginDiagnostics.map((diagnostic) => ({\n ...diagnostic,\n plugin: plugin.name,\n })),\n );\n }\n\n if (!config) cacheSet(className, result);\n return result;\n}\n\n/** Clear the parser memoization cache */\nexport function clearParserCache(): void {\n cache.clear();\n}\n\n/** Category of a single class token, used by tooling (linting, sorting). */\nexport type MotionTokenCategory =\n | \"variant\"\n | \"gesture\"\n | \"transition\"\n | \"viewport\"\n | \"scroll\"\n | \"drag\"\n | \"layout\"\n | \"tailwind\"\n | \"unknown\";\n\n/** Build throwaway accumulators for single-token classification. */\nfunction freshAccumulators() {\n return {\n gestures: {} as Partial<Record<GestureKey, AnimatableValues>>,\n transition: {} as TransitionConfig,\n viewport: {} as ViewportConfig,\n dragConfig: {} as DragConfig,\n layoutConfig: {} as LayoutConfig,\n scroll: { axis: \"y\", container: false, values: {} } as ScrollConfig,\n variants: {} as VariantMap,\n variantState: {} as VariantState,\n };\n}\n\n/**\n * Classify a single class token into a motionwind category. Non-motionwind\n * classes are \"tailwind\"; `animate-*` classes that don't match any pattern are\n * \"unknown\". Reuses the real `classifyToken` so it never drifts from parsing.\n */\nexport function classifyMotionToken(\n token: string,\n config?: MotionwindConfig,\n): MotionTokenCategory {\n // Strip motion-reduce:/motion-safe: wrapper prefixes and classify the inner token.\n if (token.startsWith(\"motion-reduce:\") || token.startsWith(\"motion-safe:\")) {\n const inner = token.startsWith(\"motion-reduce:\")\n ? token.slice(\"motion-reduce:\".length)\n : token.slice(\"motion-safe:\".length);\n return inner ? classifyMotionToken(inner, config) : \"tailwind\";\n }\n if (!token.startsWith(\"animate-\")) return \"tailwind\";\n if (TAILWIND_ANIMATE_CLASSES.has(token)) return \"tailwind\";\n if (config || token.startsWith(\"animate-preset-\")) {\n const parsed = parseMotionClasses(token, config);\n if (!parsed.hasMotion) return \"unknown\";\n if (\n Object.keys(parsed.variantState).length ||\n Object.keys(parsed.variants).length\n )\n return \"variant\";\n if (Object.keys(parsed.gestures).length) return \"gesture\";\n if (Object.keys(parsed.viewport).length) return \"viewport\";\n if (Object.keys(parsed.scroll.values).length) return \"scroll\";\n if (Object.keys(parsed.dragConfig).length) return \"drag\";\n if (Object.keys(parsed.layoutConfig).length) return \"layout\";\n return \"transition\";\n }\n const a = freshAccumulators();\n const consumed = classifyToken(\n token,\n a.gestures,\n a.transition,\n a.viewport,\n a.dragConfig,\n a.layoutConfig,\n a.scroll,\n a.variants,\n a.variantState,\n );\n if (!consumed) return \"unknown\";\n if (token.startsWith(\"animate-scroll\")) return \"scroll\";\n if (token.startsWith(\"animate-variant-\")) return \"variant\";\n if (Object.keys(a.variantState).length) return \"variant\";\n if (Object.keys(a.gestures).length) return \"gesture\";\n if (Object.keys(a.viewport).length) return \"viewport\";\n if (Object.keys(a.dragConfig).length) return \"drag\";\n if (Object.keys(a.layoutConfig).length) return \"layout\";\n return \"transition\";\n}\n","import type { ParsedResult } from \"./types.js\";\n\nexport type MotionwindCapability =\n | \"gestures\"\n | \"scroll\"\n | \"layout\"\n | \"drag\"\n | \"variants\"\n | \"svg\"\n | \"reduced-motion\";\n\nexport type AdapterCapabilities = Readonly<\n Record<MotionwindCapability, boolean>\n>;\n\nexport interface MotionwindAdapter<TContext = unknown, TOutput = unknown> {\n name: string;\n version: string;\n capabilities: AdapterCapabilities;\n compile: (parsed: ParsedResult, context: TContext) => TOutput;\n}\n\nexport function defineMotionwindAdapter<\n TContext,\n TOutput,\n const T extends MotionwindAdapter<TContext, TOutput>,\n>(adapter: T): T {\n return adapter;\n}\n\nexport function unsupportedCapabilities(\n parsed: ParsedResult,\n capabilities: AdapterCapabilities,\n): MotionwindCapability[] {\n const unsupported: MotionwindCapability[] = [];\n if (Object.keys(parsed.gestures).length > 0 && !capabilities.gestures)\n unsupported.push(\"gestures\");\n if (Object.keys(parsed.scroll.values).length > 0 && !capabilities.scroll)\n unsupported.push(\"scroll\");\n if (Object.keys(parsed.layoutConfig).length > 0 && !capabilities.layout)\n unsupported.push(\"layout\");\n if (Object.keys(parsed.dragConfig).length > 0 && !capabilities.drag)\n unsupported.push(\"drag\");\n if (\n (Object.keys(parsed.variants).length > 0 ||\n Object.keys(parsed.variantState).length > 0) &&\n !capabilities.variants\n )\n unsupported.push(\"variants\");\n const svgProperties = new Set([\"pathLength\", \"pathOffset\", \"pathSpacing\"]);\n if (\n !capabilities.svg &&\n Object.values(parsed.gestures).some((values) =>\n Object.keys(values ?? {}).some((property) => svgProperties.has(property)),\n )\n ) {\n unsupported.push(\"svg\");\n }\n return unsupported;\n}\n","import type {\n AnimatableValues,\n ParsedResult,\n TransitionConfig,\n} from \"motionwind-core\";\n\n/** Resting values used to animate back after a gesture ends. */\nconst RESET_DEFAULTS: Record<string, number | string> = {\n scale: 1,\n scaleX: 1,\n scaleY: 1,\n opacity: 1,\n x: 0,\n y: 0,\n z: 0,\n rotate: 0,\n rotateX: 0,\n rotateY: 0,\n skewX: 0,\n skewY: 0,\n};\n\n/** Transition keys that apply to a single vanilla `animate()` call. */\nconst OPTION_KEYS: (keyof TransitionConfig)[] = [\n \"duration\",\n \"delay\",\n \"ease\",\n \"type\",\n \"stiffness\",\n \"damping\",\n \"mass\",\n \"bounce\",\n \"repeat\",\n \"repeatType\",\n \"repeatDelay\",\n \"times\",\n];\n\n/** Project our TransitionConfig onto vanilla Motion's animate() options. */\nexport function toAnimateOptions(\n transition: TransitionConfig,\n): Record<string, unknown> {\n const opts: Record<string, unknown> = {};\n for (const key of OPTION_KEYS) {\n if (transition[key] !== undefined) opts[key] = transition[key];\n }\n return opts;\n}\n\n/**\n * Build the resting values to animate back to when a gesture (hover/tap/focus)\n * ends. Prefers the enter (`animate`) value, then `initial`, then a sensible\n * default, for each key the gestures touch.\n */\nexport function baseValues(parsed: ParsedResult): AnimatableValues {\n const keys = new Set<string>();\n for (const g of [\n parsed.gestures.whileHover,\n parsed.gestures.whileTap,\n parsed.gestures.whileFocus,\n parsed.gestures.whileInView,\n ]) {\n if (g) Object.keys(g).forEach((k) => keys.add(k));\n }\n\n const base: AnimatableValues = {};\n const enter = parsed.gestures.animate;\n const initial = parsed.gestures.initial;\n for (const k of keys) {\n const v =\n (enter as Record<string, AnimatableValues[string]> | undefined)?.[k] ??\n (initial as Record<string, AnimatableValues[string]> | undefined)?.[k] ??\n RESET_DEFAULTS[k] ??\n 0;\n base[k] = v;\n }\n return base;\n}\n\n/** Pick a subset of `values` limited to the keys present in `shape`. */\nexport function subset(\n values: AnimatableValues,\n shape: AnimatableValues,\n): AnimatableValues {\n const out: AnimatableValues = {};\n for (const k of Object.keys(shape)) {\n if (values[k] !== undefined) out[k] = values[k]!;\n }\n return out;\n}\n\n/** Merge concurrent gesture states using Motion's interaction priority. */\nexport function interactiveValues(\n parsed: ParsedResult,\n state: { focused: boolean; hovered: boolean; pressed: boolean },\n): AnimatableValues {\n return {\n ...baseValues(parsed),\n ...(state.focused ? parsed.gestures.whileFocus : undefined),\n ...(state.hovered ? parsed.gestures.whileHover : undefined),\n ...(state.pressed ? parsed.gestures.whileTap : undefined),\n };\n}\n","import { defineMotionwindAdapter } from \"motionwind-core\";\n\nexport const VANILLA_CAPABILITIES = {\n gestures: true,\n scroll: true,\n layout: false,\n drag: false,\n variants: true,\n svg: true,\n \"reduced-motion\": true,\n} as const;\n\nexport const vanillaAdapter = defineMotionwindAdapter({\n name: \"motionwind-vanilla\",\n version: \"2.0.0\",\n capabilities: VANILLA_CAPABILITIES,\n compile(parsed) {\n return parsed;\n },\n});\n","import { animate, hover, press, inView, scroll } from \"motion\";\nimport {\n parseMotionClasses,\n unsupportedCapabilities,\n type MotionwindConfig,\n type ParsedResult,\n type AnimatableValues,\n} from \"motionwind-core\";\nimport {\n toAnimateOptions,\n baseValues,\n interactiveValues,\n subset,\n} from \"./map.js\";\nimport { VANILLA_CAPABILITIES } from \"./adapter.js\";\n\nexport { vanillaAdapter, VANILLA_CAPABILITIES } from \"./adapter.js\";\n\nexport interface MotionwindOptions {\n /** Where to scan for motion elements. Defaults to `document`. */\n root?: ParentNode;\n /** Selector for candidate elements. Defaults to `[class*=\"animate-\"]`. */\n selector?: string;\n /** Honor `prefers-reduced-motion` (jump to final state, no motion). Default true. */\n respectReducedMotion?: boolean;\n /** Watch the DOM and wire elements added after init (SPA/HTMX). Default false. */\n observe?: boolean;\n /** Project tokens, presets, plugins, and strictness. */\n config?: MotionwindConfig;\n}\n\nconst anim = animate as any;\n\nfunction prefersReducedMotion(): boolean {\n return (\n typeof window !== \"undefined\" &&\n typeof window.matchMedia === \"function\" &&\n window.matchMedia(\"(prefers-reduced-motion: reduce)\").matches\n );\n}\n\n/**\n * Resolve the initial/animate/exit gesture values for an element, preferring\n * named-variant values from `parsed.variants` when `parsed.variantState`\n * references them, and falling back to the inline gesture values otherwise.\n */\nfunction resolveGestures(parsed: ParsedResult): {\n initial?: AnimatableValues;\n animate?: AnimatableValues;\n exit?: AnimatableValues;\n} {\n const { variants, variantState, gestures } = parsed;\n const hasVariants = Object.keys(variants).length > 0;\n return {\n initial:\n (hasVariants && variantState.initial\n ? variants[variantState.initial]\n : undefined) ?? gestures.initial,\n animate:\n (hasVariants && variantState.animate\n ? variants[variantState.animate]\n : undefined) ?? gestures.animate,\n exit:\n (hasVariants && variantState.exit\n ? variants[variantState.exit]\n : undefined) ?? gestures.exit,\n };\n}\n\n/** Wire a single element's gestures/enter/scroll animations. Returns cleanup. */\nfunction wireElement(\n el: Element,\n parsed: ParsedResult,\n reduce: boolean,\n): () => void {\n const opts = toAnimateOptions(parsed.transition);\n const base = baseValues(parsed);\n const cleanups: Array<() => void> = [];\n const resolved = resolveGestures(parsed);\n const whileHover = parsed.gestures.whileHover;\n const whileTap = parsed.gestures.whileTap;\n const whileFocus = parsed.gestures.whileFocus;\n let hovered = false;\n let pressed = false;\n let focused = false;\n const updateInteractive = () => {\n const target = interactiveValues(parsed, { focused, hovered, pressed });\n if (Object.keys(target).length > 0) anim(el, target, opts);\n };\n\n // Strip animate-* classes; keep the passthrough (Tailwind/util) classes. This\n // also makes re-scans idempotent — a wired element no longer matches the\n // `animate-*` selector.\n if (parsed.tailwindClasses) {\n el.setAttribute(\"class\", parsed.tailwindClasses);\n } else {\n el.removeAttribute(\"class\");\n }\n\n // Reduced motion: jump straight to the final resting/visible state with no\n // animation, and skip all interactive + scroll wiring.\n if (reduce) {\n const rest = {\n ...(resolved.animate ?? {}),\n ...(parsed.gestures.whileInView ?? {}),\n };\n if (Object.keys(rest).length > 0) anim(el, rest, { duration: 0 });\n return () => {};\n }\n\n // Initial state (applied instantly), then enter animation.\n // Use resolved values so that named variants are applied correctly.\n if (resolved.initial) anim(el, resolved.initial, { duration: 0 });\n if (resolved.animate) anim(el, resolved.animate, opts);\n\n // Exit animation: when a consumer dispatches a custom \"motionwind:remove\"\n // event on the element, we play the exit keyframes and remove it afterwards.\n const exitValues = resolved.exit;\n if (exitValues && Object.keys(exitValues).length > 0) {\n const handleRemove = () => {\n anim(el, exitValues, {\n ...opts,\n onComplete: () => el.remove(),\n });\n };\n el.addEventListener(\"motionwind:remove\", handleRemove as EventListener);\n cleanups.push(() =>\n el.removeEventListener(\n \"motionwind:remove\",\n handleRemove as EventListener,\n ),\n );\n }\n\n // Hover\n if (whileHover) {\n cleanups.push(\n hover(el, () => {\n hovered = true;\n updateInteractive();\n return () => {\n hovered = false;\n updateInteractive();\n };\n }),\n );\n }\n\n // Tap / press\n if (whileTap) {\n cleanups.push(\n press(el, () => {\n pressed = true;\n updateInteractive();\n return () => {\n pressed = false;\n updateInteractive();\n };\n }),\n );\n }\n\n // Focus\n if (whileFocus) {\n const onFocus = () => {\n focused = true;\n updateInteractive();\n };\n const onBlur = () => {\n focused = false;\n updateInteractive();\n };\n el.addEventListener(\"focus\", onFocus);\n el.addEventListener(\"blur\", onBlur);\n cleanups.push(() => {\n el.removeEventListener(\"focus\", onFocus);\n el.removeEventListener(\"blur\", onBlur);\n });\n }\n\n // In view\n const whileInView = parsed.gestures.whileInView;\n if (whileInView) {\n const viewportOpts: Record<string, unknown> = {};\n if (parsed.viewport.amount !== undefined)\n viewportOpts.amount = parsed.viewport.amount;\n if (parsed.viewport.margin !== undefined)\n viewportOpts.margin = parsed.viewport.margin;\n cleanups.push(\n inView(\n el,\n () => {\n anim(el, whileInView, opts);\n if (parsed.viewport.once) return;\n return () => anim(el, subset(base, whileInView), opts);\n },\n viewportOpts,\n ),\n );\n }\n\n // Scroll-linked: drive style values from scroll progress.\n if (Object.keys(parsed.scroll.values).length > 0) {\n // Motion's ScrollOptions.offset is a strict string union; our offset is\n // user-provided, so cast the options bag.\n const scrollOpts: any = parsed.scroll.container\n ? { axis: parsed.scroll.axis }\n : { target: el, axis: parsed.scroll.axis, offset: parsed.scroll.offset };\n const stop = scroll(\n anim(el, parsed.scroll.values, { ease: \"linear\" }),\n scrollOpts,\n );\n if (typeof stop === \"function\") cleanups.push(stop);\n }\n\n return () => cleanups.forEach((fn) => fn());\n}\n\n/**\n * Scan the DOM for elements with `animate-*` classes and wire up their\n * animations using the vanilla Motion API. Returns a cleanup function.\n *\n * Supports: initial/enter, hover, tap, focus, in-view, scroll-linked, named\n * variants (resolved at wire-up time), and exit animations (triggered by\n * dispatching a `\"motionwind:remove\"` custom event on the element).\n * Honors `prefers-reduced-motion`, is idempotent across re-runs, and can watch\n * for dynamically-added elements via `{ observe: true }`.\n * (drag and layout are React/Vue-only.)\n *\n * @example\n * ```js\n * import { motionwind } from \"motionwind-vanilla\";\n * const stop = motionwind({ observe: true });\n * ```\n */\nexport function motionwind(options: MotionwindOptions = {}): () => void {\n const root =\n options.root ?? (typeof document !== \"undefined\" ? document : null);\n if (!root) return () => {};\n\n const selector = options.selector ?? '[class*=\"animate-\"]';\n const reduce =\n (options.respectReducedMotion ?? true) && prefersReducedMotion();\n const cleanups: Array<() => void> = [];\n\n const wire = (el: Element) => {\n try {\n // SVGElement.className is SVGAnimatedString rather than a string, so the\n // attribute is the portable source for both HTML and SVG elements.\n const parsed = parseMotionClasses(\n el.getAttribute(\"class\") ?? \"\",\n options.config,\n );\n const unsupported = unsupportedCapabilities(parsed, VANILLA_CAPABILITIES);\n if (unsupported.length && typeof console !== \"undefined\") {\n console.warn(\n `[motionwind-vanilla] Unsupported capabilities: ${unsupported.join(\", \")}.`,\n el,\n );\n }\n if (parsed.hasMotion) cleanups.push(wireElement(el, parsed, reduce));\n } catch (err) {\n // A single malformed element/class must never break the whole page.\n if (typeof console !== \"undefined\") {\n console.warn(\n \"[motionwind-vanilla] failed to animate an element; skipping it.\",\n el,\n err,\n );\n }\n }\n };\n\n root.querySelectorAll<Element>(selector).forEach(wire);\n\n if (options.observe && typeof MutationObserver !== \"undefined\") {\n const target =\n root instanceof Document ? (root.body ?? root.documentElement) : root;\n const observer = new MutationObserver((mutations) => {\n for (const m of mutations) {\n m.addedNodes.forEach((node) => {\n if (!(node instanceof Element)) return;\n if (node.matches(selector)) wire(node);\n node.querySelectorAll<Element>(selector).forEach(wire);\n });\n }\n });\n observer.observe(target as Node, { childList: true, subtree: true });\n cleanups.push(() => observer.disconnect());\n }\n\n return () => cleanups.forEach((fn) => fn());\n}\n\nexport {\n parseMotionClasses,\n defineConfig,\n definePreset,\n defineMotionwindPlugin,\n MOTIONWIND_RECIPES,\n} from \"motionwind-core\";\nexport type { ParsedResult, MotionwindConfig } from \"motionwind-core\";\n"],"mappings":"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","names":["cdn_exports","__export","cdn_default","motionwind","addUniqueItem","arr","item","removeItem","index","clamp","min","max","v","warning","invariant","MotionGlobalConfig","isNumericalString","v","isObject","value","isZeroValueString","v","memo","callback","result","noop","any","pipe","transformers","a","b","v","progress","from","to","value","range","SubscriptionManager","handler","addUniqueItem","removeItem","a","b","c","numSubscriptions","secondsToMilliseconds","seconds","millisecondsToSeconds","milliseconds","velocityPerSecond","velocity","frameDuration","wrap","min","max","v","rangeSize","calcBezier","t","a1","a2","subdivisionPrecision","subdivisionMaxIterations","binarySubdivide","x","lowerBound","upperBound","mX1","mX2","currentX","currentT","i","cubicBezier","mY1","mY2","noop","getTForX","aX","mirrorEasing","easing","p","reverseEasing","easing","p","backOut","cubicBezier","backIn","reverseEasing","backInOut","mirrorEasing","anticipate","p","backIn","circIn","p","circOut","reverseEasing","circInOut","mirrorEasing","easeIn","cubicBezier","easeOut","easeInOut","isEasingArray","ease","getEasingForSegment","easing","i","isEasingArray","wrap","isBezierDefinition","easing","easingLookup","noop","easeIn","easeInOut","easeOut","circIn","circInOut","circOut","backIn","backInOut","backOut","anticipate","isValidEasing","easing","easingDefinitionToFunction","definition","isBezierDefinition","invariant","x1","y1","x2","y2","cubicBezier","stepsOrder","createRenderStep","runNextFrame","thisFrame","nextFrame","isProcessing","flushNextFrame","toKeepAlive","latestFrameData","triggerCallback","callback","step","keepAlive","immediate","queue","frameData","prevFrame","maxElapsed","createRenderBatcher","scheduleNextBatch","allowKeepAlive","runNextFrame","useDefaultElapsed","state","flagRunNextFrame","steps","stepsOrder","acc","key","createRenderStep","setup","read","resolveKeyframes","preUpdate","update","preRender","render","postRender","processBatch","useManualTiming","MotionGlobalConfig","timestamp","wake","step","process","keepAlive","immediate","i","frame","cancelFrame","frameData","frameSteps","createRenderBatcher","noop","now","clearTime","time","frameData","MotionGlobalConfig","newTime","sanitize","v","checkStringStartsWith","token","key","startsAsVariableToken","checkStringStartsWith","isCSSVariableToken","value","singleCssVariableRegex","containsCSSVariable","number","v","alpha","clamp","scale","floatRegex","isNullish","v","singleColorRegex","isColorString","type","testProp","v","singleColorRegex","isNullish","splitColor","aName","bName","cName","a","b","c","alpha","floatRegex","clampRgbUnit","v","clamp","rgbUnit","number","rgba","isColorString","splitColor","red","green","blue","alpha","sanitize","alphaType","parseHex","v","r","g","b","a","hex","isColorString","rgba","createUnitType","unit","v","degrees","percent","px","vh","vw","progressPercentage","hsla","isColorString","splitColor","hue","saturation","lightness","alpha","percent","sanitize","alphaType","color","v","rgba","hex","hsla","parsed","colorRegex","hasFloat","floatRegex","hasColor","colorRegex","test","v","NUMBER_TOKEN","COLOR_TOKEN","VAR_TOKEN","VAR_FUNCTION_TOKEN","SPLIT_TOKEN","complexRegex","hasComplexValues","value","asString","analyseComplexValue","originalValue","values","indexes","types","split","parsedValue","color","parseComplexValue","buildTransformer","numSections","output","type","sanitize","createTransformer","source","convertNumbersToZero","convertToZero","splitBefore","getAnimatableNone","info","i","complex","hueToRgb","p","q","t","hslaToRgba","hue","saturation","lightness","alpha","red","green","blue","mixImmediate","a","b","p","mixNumber","from","to","progress","mixLinearColor","from","to","v","fromExpo","expo","colorTypes","hex","rgba","hsla","getColorType","type","asRGBA","color","warning","model","hslaToRgba","mixColor","fromRGBA","toRGBA","mixImmediate","blended","mixNumber","invisibleValues","mixVisibility","origin","target","p","mixNumber","a","b","p","mixNumberImmediate","getMixer","isCSSVariableToken","mixImmediate","color","mixColor","mixComplex","mixArray","mixObject","output","numValues","blendValue","v","i","key","matchOrder","origin","target","orderedOrigin","pointers","type","originIndex","originValue","template","complex","originStats","analyseComplexValue","targetStats","invisibleValues","mixVisibility","pipe","warning","unitValue","mixUnit","from","to","a","b","unit","origin","target","p","sanitize","mixNumberImmediate","mix","mixer","getMixer","frameloopDriver","update","passTimestamp","timestamp","keepAlive","frame","cancelFrame","frameData","time","generateLinearEasing","easing","duration","resolution","points","numPoints","calcGeneratorDuration","generator","timeStep","maxDuration","keyframes","duration","state","createGeneratorEasing","options","scale","createGenerator","generator","duration","calcGeneratorDuration","progress","millisecondsToSeconds","springDefaults","calcAngularFreq","undampedFreq","dampingRatio","rootIterations","approximateRoot","envelope","derivative","initialGuess","result","i","safeMin","findSpring","duration","bounce","velocity","mass","warning","secondsToMilliseconds","clamp","millisecondsToSeconds","exponentialDecay","delta","a","b","c","d","e","f","g","stiffness","durationKeys","physicsKeys","isSpringType","options","keys","key","getSpringOptions","springOptions","visualDuration","root","damping","derived","spring","optionsOrVisualDuration","origin","target","state","isResolvedFromDuration","undampedAngularFreq","decay","s","setRestThresholds","isGranularScale","resolveSpring","resolveVelocity","update","angularFreq","sample","t","dampedAngularFreq","freqForT","ignoreVelocity","calculatedDuration","generator","keyframes","newVelocity","current","currentVelocity","easingDuration","calcGeneratorDuration","easing","generateLinearEasing","progress","generatorOptions","createGeneratorEasing","inertia","keyframes","velocity","power","timeConstant","bounceDamping","bounceStiffness","modifyTarget","min","max","restDelta","restSpeed","origin","state","isOutOfBounds","v","nearestBoundary","amplitude","ideal","target","calcDelta","t","applyFriction","delta","timeReachedBoundary","spring","checkCatchBoundary","createSpring","hasUpdatedFrame","createMixers","output","ease","customMixer","mixers","mixerFactory","MotionGlobalConfig","mix","numMixers","i","mixer","easingFunction","noop","pipe","interpolate","input","isClamp","inputLength","invariant","isZeroDeltaRange","interpolator","v","progressInRange","progress","clamp","fillOffset","offset","remaining","min","i","offsetProgress","progress","mixNumber","defaultOffset","arr","offset","fillOffset","convertOffsetToTimes","offset","duration","o","defaultEasing","values","easing","easeInOut","keyframes","duration","keyframeValues","times","ease","easingFunctions","isEasingArray","easingDefinitionToFunction","state","origin","target","mixer","MotionGlobalConfig","mix","t","clamp","absoluteTimes","convertOffsetToTimes","defaultOffset","mapTimeToKeyframe","interpolate","velocitySampleDuration","getGeneratorVelocity","resolveValue","current","prevT","velocityPerSecond","calcGeneratorVelocity","generator","initialVelocity","s","isNotNull","value","getFinalKeyframe","keyframes","repeat","repeatType","finalKeyframe","speed","resolvedKeyframes","index","transitionTypeMap","inertia","keyframes","spring","replaceTransitionType","transition","baseRecord","kind","animation","time","frameData","notifyAnimationStart","options","transition","notify","WithPromise","resolve","onResolve","onReject","percentToProgress","percent","JSAnimation","WithPromise","options","motionValue","time","notifyAnimationStart","replaceTransitionType","type","keyframesGenerator","repeat","repeatDelay","repeatType","velocity","keyframes","generatorFactory","pipe","mix","generator","calcGeneratorDuration","calculatedDuration","timestamp","animationTime","sample","totalDuration","mixKeyframes","mirroredGenerator","resolvedDuration","delay","onUpdate","finalKeyframe","timeWithoutDelay","isInDelayPhase","elapsed","frameGenerator","progress","currentIteration","iterationProgress","clamp","state","done","isAnimationFinished","inertia","getFinalKeyframe","resolve","reject","millisecondsToSeconds","newTime","secondsToMilliseconds","calcGeneratorVelocity","newSpeed","hasChanged","driver","frameloopDriver","startTime","now","sampleTime","timeline","maxDefaults","applyDefaultFilter","v","name","value","number","floatRegex","unit","defaultValue","functionRegex","filter","complex","functions","mask","complex","v","parsed","int","number","transformValueTypes","degrees","scale","px","alpha","progressPercentage","numberValueTypes","px","transformValueTypes","int","alpha","defaultValueTypes","numberValueTypes","color","filter","mask","getDefaultValueType","key","customTypes","filter","mask","getAnimatableNone","key","value","defaultValueType","getDefaultValueType","complex","fillWildcards","keyframes","i","radToDeg","rad","rotate","v","angle","rebaseAngle","matrix2dParsers","rotateZ","scaleX","scaleY","matrix3dParsers","defaultTransformValue","name","parseValueFromTransform","transform","matrix3dMatch","parsers","match","matrix2dMatch","valueParser","values","convertTransformToNumber","readTransformValue","instance","value","transformPropOrder","transformProps","isNumOrPxType","v","number","px","transformKeys","nonTranslationalTransformKeys","transformPropOrder","key","removeNonTranslationalTransform","visualElement","removedTransforms","value","current","reset","boxDependentValues","measureDimension","computed","measureBox","axis","paddingStart","paddingEnd","boxSizing","min","max","size","positionalValues","width","paddingLeft","paddingRight","height","paddingTop","paddingBottom","top","left","y","x","transform","parseValueFromTransform","toResolve","isScheduled","anyNeedsMeasurement","isForced","measureAllKeyframes","resolversToMeasure","elementsToMeasure","elementsToUntransform","resolver","boxDependentValues","transformsToRestore","element","removedTransforms","removeNonTranslationalTransform","restore","key","value","readAllKeyframes","flushKeyframeResolvers","readOrigin","name","target","isNumericalString","isZeroValueString","complex","getAnimatableNone","KeyframeResolver","unresolvedKeyframes","onComplete","motionValue","isAsync","frame","currentValue","finalKeyframe","valueAsRead","fillWildcards","isForcedComplete","isCSSVar","name","setStyle","element","name","value","isCSSVar","supportsFlags","memoSupports","callback","supportsFlag","memoized","memo","supportsFlags","supportsScrollTimeline","memoSupports","supportsViewTimeline","supportsLinearEasing","memoSupports","cubicBezierAsString","a","b","c","d","supportedWaapiEasing","cubicBezierAsString","mapEasingToNativeEasing","easing","duration","supportsLinearEasing","generateLinearEasing","isBezierDefinition","cubicBezierAsString","segmentEasing","supportedWaapiEasing","startWaapiAnimation","element","valueName","keyframes","delay","duration","repeat","repeatType","ease","times","pseudoElement","keyframeOptions","easing","mapEasingToNativeEasing","options","isGenerator","type","applyGeneratorOptions","type","options","isGenerator","supportsLinearEasing","NativeAnimation","WithPromise","options","element","name","keyframes","pseudoElement","allowFlatten","finalKeyframe","onComplete","invariant","transition","applyGeneratorOptions","startWaapiAnimation","keyframe","getFinalKeyframe","setStyle","notifyAnimationStart","state","duration","millisecondsToSeconds","delay","newTime","wasFinished","secondsToMilliseconds","newSpeed","newStartTime","timeline","rangeStart","rangeEnd","observe","supportsScrollTimeline","noop","unsupportedEasingFunctions","anticipate","backInOut","circInOut","isUnsupportedEase","key","replaceStringEasing","transition","sampleDelta","NativeAnimationExtended","NativeAnimation","options","replaceStringEasing","replaceTransitionType","value","motionValue","onUpdate","onComplete","element","sampleAnimation","JSAnimation","sampleTime","time","delta","clamp","current","name","setStyle","isAnimatable","value","name","complex","hasKeyframesChanged","keyframes","current","i","canAnimate","name","type","velocity","originKeyframe","targetKeyframe","isOriginAnimatable","isAnimatable","isTargetAnimatable","warning","isGenerator","makeAnimationInstant","options","acceleratedValues","browserColorFunctions","hasBrowserOnlyColors","keyframes","i","colorProperties","supportsWaapi","memo","supportsBrowserAnimation","options","motionValue","name","repeatDelay","repeatType","damping","type","keyframes","acceleratedValues","subject","onUpdate","transformTemplate","hasBrowserOnlyColors","MAX_RESOLVE_DELAY","AsyncMotionValueAnimation","WithPromise","options","time","keyframes","name","motionValue","element","optionsWithDefaults","KeyframeResolver","DefaultKeyframeResolver","resolvedKeyframes","finalKeyframe","forced","sync","type","velocity","delay","isHandoff","onUpdate","canAnimateValue","canAnimate","MotionGlobalConfig","getFinalKeyframe","makeAnimationInstant","startTime","onComplete","useWaapi","supportsBrowserAnimation","animation","NativeAnimationExtended","JSAnimation","onResolve","_onReject","flushKeyframeResolvers","newTime","newSpeed","timeline","GroupAnimation","animations","animation","propName","newValue","i","timeline","subscriptions","cancel","time","speed","getMax","methodName","controls","max","value","GroupAnimationWithThen","GroupAnimation","onResolve","_onReject","MAX_VELOCITY_DELTA","isFloat","value","collectMotionValues","MotionValue","init","options","v","currentTime","time","dependent","current","prevFrameValue","subscription","eventName","callback","_a","SubscriptionManager","events","frame","eventManagers","passiveEffect","stopPassiveEffect","prev","delta","endAnimation","changeSubscriber","velocityPerSecond","startAnimation","resolve","isComplete","animation","motionValue","resolveTransition","transition","parentTransition","_","rest","getValueTransition","transition","key","valueTransition","resolveTransition","underDampedSpring","criticallyDampedSpring","target","keyframesTransition","ease","getDefaultTransition","valueKey","keyframes","transformProps","orchestrationKeys","isTransitionDefined","transition","key","animateMotionValue","name","value","target","transition","element","isHandoff","onComplete","valueTransition","getValueTransition","delay","elapsed","secondsToMilliseconds","options","v","isTransitionDefined","getDefaultTransition","shouldSkip","makeAnimationInstant","MotionGlobalConfig","finalKeyframe","getFinalKeyframe","frame","JSAnimation","AsyncMotionValueAnimation","splitCSSVariableRegex","parseCSSVariable","current","match","token1","token2","fallback","maxDepth","getVariableValue","element","depth","invariant","token","resolved","trimmed","isNumericalString","isCSSVariableToken","positionalKeys","transformPropOrder","isMotionValue","value","camelToDash","str","match","auto","v","testValueType","v","type","dimensionValueTypes","number","px","percent","degrees","vw","vh","auto","findDimensionValueType","v","testValueType","isNone","value","isZeroValueString","invalidTemplates","makeNoneKeyframesAnimatable","unresolvedKeyframes","noneKeyframeIndexes","name","i","animatableTemplate","keyframe","hasComplexValues","noneIndex","getAnimatableNone","DOMKeyframesResolver","KeyframeResolver","unresolvedKeyframes","onComplete","name","motionValue","element","i","keyframe","isCSSVariableToken","resolved","getVariableValue","positionalKeys","origin","target","originType","findDimensionValueType","targetType","originHasVar","containsCSSVariable","targetHasVar","positionalValues","isNumOrPxType","value","noneKeyframeIndexes","isNone","makeNoneKeyframesAnimatable","measureKeyframe","finalKeyframeIndex","finalKeyframe","unsetTransformName","unsetTransformValue","effects","addEffect","effect","invariant","removeEffect","removeItem","findEffect","subject","animateValues","getValue","keyframes","transition","element","animations","velocity","reduceMotion","key","target","value","current","frame","animateMotionValue","positionalKeys","transitionEnd","applyTransitionEnd","animateEffectSubject","initial","firstKeyframe","motionValue","first","isHTMLElement","element","isObject","isSVGElement","element","isObject","getValueAsType","value","type","resolveElements","elementOrSelector","scope","selectorCache","root","elements","element","MotionValueState","step","frame","pending","numPending","i","name","value","render","computed","entry","onChange","cancelOnChange","onRemove","values","createEffect","addValue","step","options","stateCache","subject","values","state","MotionValueState","subscriptions","key","value","remove","cancel","translateAlias","openers","buildTransform","state","transform","keys","values","key","value","getValueAsType","transformValueTypes","pathRotation","originProps","styleValue","state","key","getValueAsType","numberValueTypes","addStyleValue","element","value","render","computed","transformProps","keys","a","b","transformPropOrder","isHTMLElement","MotionValue","buildTransform","originX","originY","originZ","isCSSVar","isStyleSubject","subject","isSVGElement","readStyleValue","readTransformValue","computedStyle","styleSubjectEffect","createEffect","cssStyleProperties","canSetAsProperty","element","name","descriptor","addAttrValue","state","key","value","isProp","camelToDash","type","numberValueTypes","render","getValueAsType","v","addSVGPathValue","element","state","key","value","frame","offset","MotionValue","pathLength","pathSpacing","addSVGValue","addAttrValue","convertAttrKey","addStyleValue","readSVGValue","transformProps","numberValueTypes","cssStyleProperties","readStyleValue","camelToDash","svgSubjectEffect","createEffect","isSVGElement","convertAttrKey","key","_","firstChar","convertBoundingBoxToBox","top","left","right","bottom","transformBoxPoints","point","transformPoint","topLeft","bottomRight","measureViewportBox","instance","transformPoint","convertBoundingBoxToBox","transformBoxPoints","noProps","getElementEffect","element","isSVGElement","svgSubjectEffect","styleSubjectEffect","EffectSubject","effect","current","DOMKeyframesResolver","key","target","measureViewportBox","animateElement","keyframes","transition","visualElement","animateValues","animateEffectSubject","propEffect","createEffect","subject","state","key","value","isObject","isDragging","isDragActive","setupGesture","elementOrSelector","options","elements","resolveElements","gestureAbortController","eventOptions","isValidHover","event","isDragActive","hover","elementOrSelector","onHoverStart","options","elements","eventOptions","cancel","setupGesture","element","isPressed","deferredHoverEnd","hoverEndCallback","removePointerLeave","onPointerLeave","endHover","onPointerUp","onPointerDown","leaveEvent","onPointerEnter","enterEvent","onHoverEnd","isNodeOrChild","parent","child","isPrimaryPointer","event","keyboardAccessibleElements","isElementKeyboardAccessible","element","isPressing","filterEvents","callback","event","firePointerEvent","target","type","enableKeyboardPress","focusEvent","eventOptions","element","handleKeydown","isPressing","handleKeyup","handleBlur","isValidPressEvent","event","isPrimaryPointer","isDragActive","claimedPointerDownEvents","press","targetOrSelector","onPressStart","options","targets","eventOptions","cancelEvents","setupGesture","startPress","startEvent","target","isPressing","onPressEnd","endEventOptions","onPointerEnd","endEvent","success","onPointerUp","onPointerCancel","upEvent","isNodeOrChild","cancelEvent","isHTMLElement","enableKeyboardPress","isElementKeyboardAccessible","resizeHandlers","observer","getSize","borderBoxAxis","svgAxis","htmlAxis","target","borderBoxSize","isSVGElement","getWidth","getHeight","notifyTarget","handler","notifyAll","entries","createResizeObserver","resizeElement","elements","resolveElements","element","elementHandlers","windowCallbacks","windowResizeHandler","createWindowResizeHandler","info","callback","resizeWindow","resize","a","b","resizeWindow","resizeElement","observeTimeline","update","timeline","prevProgress","onFrame","currentTime","progress","frame","cancelFrame","visualElementStore","animateSingleValue","value","keyframes","options","motionValue","isMotionValue","createMotionValue","animateMotionValue","isDOMKeyframes","keyframes","resolveSubjects","subject","keyframes","scope","selectorCache","isDOMKeyframes","resolveElements","s","calculateRepeatDuration","duration","repeat","repeatDelay","calcNextTime","current","next","prev","labels","eraseKeyframes","sequence","startTime","endTime","i","keyframe","removeItem","addKeyframes","keyframes","easing","offset","mixNumber","getEasingForSegment","normalizeTimes","times","repeat","repeatDelayUnits","totalUnits","i","compareByTime","a","b","defaultSegmentEasing","MAX_REPEAT","createAnimationsFromSequence","sequence","defaultTransition","sequenceTransition","scope","generators","defaultDuration","animationDefinitions","sequences","elementCache","timeLabels","prevTime","currentTime","totalDuration","i","segment","calcNextTime","subject","keyframes","transition","maxDuration","resolveValueSequence","valueKeyframes","valueTransition","valueSequence","elementIndex","numSubjects","valueKeyframesAsList","keyframesAsList","delay","times","defaultOffset","type","repeat","repeatType","repeatDelay","remainingTransition","ease","duration","calculatedDelay","numKeyframes","createGenerator","isGenerator","absoluteDelta","isNumberKeyframesArray","delta","springTransition","secondsToMilliseconds","springEasing","createGeneratorEasing","startTime","remainder","fillOffset","warning","repeatDelayUnits","calculateRepeatDuration","originalKeyframes","originalTimes","originalEase","isFlipping","flippedKeyframes","flippedEases","e","reverseEasing","repeatIndex","isFlipped","iterKeyframes","iterEase","iterStartOffset","keyframeIndex","getEasingForSegment","normalizeTimes","targetTime","addKeyframes","isMotionValue","subjectSequence","getSubjectSequence","getValueSequence","subjects","resolveSubjects","subjectIndex","thisSubject","key","getValueTransition","valueSequences","element","compareByTime","valueOffset","valueEasing","at","value","easing","progress","definition","_type","remainingDefaultTransition","name","isNumber","keyframe","isSingleValue","subject","keyframes","isMotionValue","isDOMKeyframes","animateSubject","options","scope","animations","animateSingleValue","subjects","resolveSubjects","numSubjects","invariant","i","thisSubject","transition","animateElement","visualElementStore","animateEffectSubject","findEffect","propEffect","animateSequence","sequence","options","scope","animations","processedSequence","segment","callback","mv","motionValue","createAnimationsFromSequence","spring","keyframes","transition","subject","animateSubject","isSequence","value","createScopedAnimate","options","scope","reduceMotion","skipAnimations","scopedAnimate","subjectOrSequence","optionsOrKeyframes","animations","animationOnComplete","inherited","onComplete","sequenceOptions","animateSequence","rest","animateSubject","animation","GroupAnimationWithThen","removeItem","animate","addEffect","removeEffect","canUseNativeTimeline","target","supportsViewTimeline","supportsScrollTimeline","maxElapsed","createAxisInfo","createScrollInfo","keys","updateAxisInfo","element","axisName","info","time","axis","length","position","prev","prevTime","progress","elapsed","velocityPerSecond","updateScrollInfo","calcInset","element","container","inset","current","isHTMLElement","svgBoundingBox","parentBoundingBox","x","y","svg","parent","namedEdges","resolveEdge","edge","length","inset","delta","asNumber","defaultOffset","resolveOffset","offset","containerLength","targetLength","targetInset","offsetDefinition","targetPoint","containerPoint","namedEdges","resolveEdge","ScrollOffset","point","getTargetSize","target","resolveOffsets","container","info","options","offsetDefinition","ScrollOffset","axis","lengthLabel","inset","calcInset","targetSize","containerSize","hasChanged","numOffsets","i","offset","resolveOffset","interpolate","defaultOffset","clamp","measure","container","target","info","node","createOnScrollHandler","element","onScroll","options","time","updateScrollInfo","resolveOffsets","scrollListeners","resizeListeners","onScrollHandlers","scrollSize","dimensionCheckProcesses","getEventTarget","element","scrollInfo","onScroll","container","trackContentSize","options","noop","containerHandlers","info","createScrollInfo","containerHandler","createOnScrollHandler","measureAll","handler","frameData","frame","notifyAll","listener","target","resize","size","checkScrollDimensions","newWidth","newHeight","dimensionCheckProcess","cancelFrame","currentHandlers","scrollListener","presets","ScrollOffsetPresets","stringToProgress","parseStringOffset","s","parts","a","b","normaliseOffset","offset","result","item","parsed","matchesPreset","preset","normalised","i","p","offsetToViewTimelineRange","name","timelineCache","scrollTimelineFallback","options","currentTime","cancel","scrollInfo","info","getTimeline","source","container","axis","containerCache","targetKey","targetCache","axisKey","canUseNativeTimeline","offsetToViewTimelineRange","attachToAnimation","animation","options","timeline","getTimeline","range","offsetToViewTimelineRange","useNative","canUseNativeTimeline","valueAnimation","observeTimeline","progress","isElementTracking","options","isOnScrollWithInfo","onScroll","attachToFunction","options","isElementTracking","scrollInfo","info","observeTimeline","getTimeline","scroll","onScroll","axis","container","options","noop","optionsWithDefaults","attachToFunction","attachToAnimation","thresholds","inView","elementOrSelector","onStart","root","rootMargin","amount","elements","resolveElements","activeIntersections","onIntersectionChange","entries","entry","onEnd","newOnEnd","observer","element","ALL","WEB","gesture","id","motionKey","description","GESTURE_DEFINITIONS","MODIFIER_DEFINITIONS","property","label","snippet","platforms","PROPERTY_DEFINITIONS","config","category","CONFIG_DEFINITIONS","MOTIONWIND_SYNTAX_REGISTRY","GESTURE_MAP","definition","GESTURE_KEYS","EASING_MAP","COMMUNITY_METADATA","source","id","MOTIONWIND_RECIPES","BUILT_IN_PRESETS","recipe","CACHE_MAX","cache","presetClasses","value","availablePresets","config","pluginPresets","plugin","BUILT_IN_PRESETS","expandConfiguredTokens","className","diagnostics","presets","output","expand","token","stack","durationName","duration","easingName","easing","springName","spring","name","preset","expanded","mergePatch","patch","gestures","transition","viewport","dragConfig","layoutConfig","scroll","variants","variantState","key","values","TAILWIND_ANIMATE_CLASSES","cacheSet","firstKey","UNIT_MAP","parseNumericWithUnit","str","sign","suffix","unit","numPart","n","ARBITRARY_VALUE_ALLOWLIST","parsePropertyValue","raw","inner","eqIdx","val","num","negative","keyframeMatch","propName","valuesStr","propKey","normalizePropertyName","rawValues","acc","v","t","scaleProps","parsed","valid","rv","unitVal","zn","color","isValidColor","HEX_COLOR_RE","FUNC_COLOR_RE","normalizeScrollProp","parseScrollValue","m","parts","classifyToken","rest","colonIdx","gesturePrefix","propValueStr","variantName","bucket","GESTURE_KEYS","gestureKey","GESTURE_MAP","ms","easeValue","EASING_MAP","sub","sides","prefix","side","id","parseMotionClasses","cached","tokens","tailwind","reducedMotionPolicy","innerToken","consumed","hasMotion","result","pluginDiagnostics","diagnostic","unsupportedCapabilities","parsed","capabilities","unsupported","svgProperties","values","property","RESET_DEFAULTS","OPTION_KEYS","toAnimateOptions","transition","opts","key","baseValues","parsed","keys","g","k","base","enter","initial","v","subset","values","shape","out","interactiveValues","state","VANILLA_CAPABILITIES","vanillaAdapter","parsed","anim","animate","prefersReducedMotion","resolveGestures","parsed","variants","variantState","gestures","hasVariants","wireElement","el","reduce","opts","toAnimateOptions","base","baseValues","cleanups","resolved","whileHover","whileTap","whileFocus","hovered","pressed","focused","updateInteractive","target","interactiveValues","rest","exitValues","handleRemove","hover","press","onFocus","onBlur","whileInView","viewportOpts","inView","subset","scrollOpts","stop","scroll","fn","motionwind","options","root","selector","wire","parseMotionClasses","unsupported","unsupportedCapabilities","VANILLA_CAPABILITIES","err","observer","mutations","m","node","run","motionwind","cdn_default","motionwind"]}