{"version":3,"file":"VisualElement.mjs","sources":["../../../src/render/VisualElement.ts"],"sourcesContent":["import {\n    Box,\n    isNumericalString,\n    isZeroValueString,\n    secondsToMilliseconds,\n    SubscriptionManager,\n    warnOnce,\n} from \"motion-utils\"\nimport { KeyframeResolver } from \"../animation/keyframes/KeyframesResolver\"\nimport { NativeAnimation } from \"../animation/NativeAnimation\"\nimport type { AnyResolvedKeyframe } from \"../animation/types\"\nimport { acceleratedValues } from \"../animation/waapi/utils/accelerated-values\"\nimport { cancelFrame, frame } from \"../frameloop\"\nimport { microtask } from \"../frameloop/microtask\"\nimport { time } from \"../frameloop/sync-time\"\nimport type { MotionNodeOptions } from \"../node/types\"\nimport { createBox } from \"../projection/geometry/models\"\nimport { motionValue, MotionValue } from \"../value\"\nimport { complex } from \"../value/types/complex\"\nimport { getAnimatableNone } from \"../value/types/utils/animatable-none\"\nimport { findValueType } from \"../value/types/utils/find\"\nimport { isMotionValue } from \"../value/utils/is-motion-value\"\nimport { Feature } from \"./Feature\"\nimport { visualElementStore } from \"./store\"\nimport {\n    FeatureDefinitions,\n    MotionConfigContextProps,\n    PresenceContextProps,\n    ReducedMotionConfig,\n    ResolvedValues,\n    VisualElementEventCallbacks,\n    VisualElementOptions,\n} from \"./types\"\nimport { AnimationState } from \"./utils/animation-state\"\nimport {\n    isControllingVariants as checkIsControllingVariants,\n    isVariantNode as checkIsVariantNode,\n} from \"./utils/is-controlling-variants\"\nimport { transformProps } from \"./utils/keys-transform\"\nimport { updateMotionValuesFromProps } from \"./utils/motion-values\"\nimport {\n    hasReducedMotionListener,\n    initPrefersReducedMotion,\n    prefersReducedMotion,\n} from \"./utils/reduced-motion\"\nimport { resolveVariantFromProps } from \"./utils/resolve-variants\"\n\nconst propEventHandlers = [\n    \"AnimationStart\",\n    \"AnimationComplete\",\n    \"Update\",\n    \"BeforeLayoutMeasure\",\n    \"LayoutMeasure\",\n    \"LayoutAnimationStart\",\n    \"LayoutAnimationComplete\",\n] as const\n\n/**\n * Static feature definitions - can be injected by framework layer\n */\nlet featureDefinitions: Partial<FeatureDefinitions> = {}\n\n/**\n * Set feature definitions for all VisualElements.\n * This should be called by the framework layer (e.g., framer-motion) during initialization.\n */\nexport function setFeatureDefinitions(\n    definitions: Partial<FeatureDefinitions>\n) {\n    featureDefinitions = definitions\n}\n\n/**\n * Get the current feature definitions\n */\nexport function getFeatureDefinitions(): Partial<FeatureDefinitions> {\n    return featureDefinitions\n}\n\n/**\n * Motion style type - a subset of CSS properties that can contain motion values\n */\nexport type MotionStyle = {\n    [K: string]: AnyResolvedKeyframe | MotionValue | undefined\n}\n\n/**\n * A VisualElement is an imperative abstraction around UI elements such as\n * HTMLElement, SVGElement, Three.Object3D etc.\n */\nexport abstract class VisualElement<\n    Instance = unknown,\n    RenderState = unknown,\n    Options extends {} = {}\n> {\n    /**\n     * VisualElements are arranged in trees mirroring that of the React tree.\n     * Each type of VisualElement has a unique name, to detect when we're crossing\n     * type boundaries within that tree.\n     */\n    abstract type: string\n\n    /**\n     * An `Array.sort` compatible function that will compare two Instances and\n     * compare their respective positions within the tree.\n     */\n    abstract sortInstanceNodePosition(a: Instance, b: Instance): number\n\n    /**\n     * Measure the viewport-relative bounding box of the Instance.\n     */\n    abstract measureInstanceViewportBox(\n        instance: Instance,\n        props: MotionNodeOptions & Partial<MotionConfigContextProps>\n    ): Box\n\n    /**\n     * When a value has been removed from all animation props we need to\n     * pick a target to animate back to. For instance, for HTMLElements\n     * we can look in the style prop.\n     */\n    abstract getBaseTargetFromProps(\n        props: MotionNodeOptions,\n        key: string\n    ): AnyResolvedKeyframe | undefined | MotionValue\n\n    /**\n     * When we first animate to a value we need to animate it *from* a value.\n     * Often this have been specified via the initial prop but it might be\n     * that the value needs to be read from the Instance.\n     */\n    abstract readValueFromInstance(\n        instance: Instance,\n        key: string,\n        options: Options\n    ): AnyResolvedKeyframe | null | undefined\n\n    /**\n     * When a value has been removed from the VisualElement we use this to remove\n     * it from the inherting class' unique render state.\n     */\n    abstract removeValueFromRenderState(\n        key: string,\n        renderState: RenderState\n    ): void\n\n    /**\n     * Run before a React or VisualElement render, builds the latest motion\n     * values into an Instance-specific format. For example, HTMLVisualElement\n     * will use this step to build `style` and `var` values.\n     */\n    abstract build(\n        renderState: RenderState,\n        latestValues: ResolvedValues,\n        props: MotionNodeOptions\n    ): void\n\n    /**\n     * Apply the built values to the Instance. For example, HTMLElements will have\n     * styles applied via `setProperty` and the style attribute, whereas SVGElements\n     * will have values applied to attributes.\n     */\n    abstract renderInstance(\n        instance: Instance,\n        renderState: RenderState,\n        styleProp?: MotionStyle,\n        projection?: any\n    ): void\n\n    /**\n     * This method is called when a transform property is bound to a motion value.\n     * It's currently used to measure SVG elements when a new transform property is bound.\n     */\n    onBindTransform?(): void\n\n    /**\n     * If the component child is provided as a motion value, handle subscriptions\n     * with the renderer-specific VisualElement.\n     */\n    handleChildMotionValue?(): void\n\n    /**\n     * This method takes React props and returns found MotionValues. For example, HTML\n     * MotionValues will be found within the style prop, whereas for Three.js within attribute arrays.\n     *\n     * This isn't an abstract method as it needs calling in the constructor, but it is\n     * intended to be one.\n     */\n    scrapeMotionValuesFromProps(\n        _props: MotionNodeOptions,\n        _prevProps: MotionNodeOptions,\n        _visualElement: VisualElement\n    ): {\n        [key: string]: MotionValue | AnyResolvedKeyframe\n    } {\n        return {}\n    }\n\n    /**\n     * A reference to the current underlying Instance, e.g. a HTMLElement\n     * or Three.Mesh etc.\n     */\n    current: Instance | null = null\n\n    /**\n     * A reference to the parent VisualElement (if exists).\n     */\n    parent: VisualElement | undefined\n\n    /**\n     * A set containing references to this VisualElement's children.\n     */\n    children = new Set<VisualElement>()\n\n    /**\n     * A set containing the latest children of this VisualElement. This is flushed\n     * at the start of every commit. We use it to calculate the stagger delay\n     * for newly-added children.\n     */\n    enteringChildren?: Set<VisualElement>\n\n    /**\n     * The depth of this VisualElement within the overall VisualElement tree.\n     */\n    depth: number\n\n    /**\n     * The current render state of this VisualElement. Defined by inherting VisualElements.\n     */\n    renderState: RenderState\n\n    /**\n     * An object containing the latest static values for each of this VisualElement's\n     * MotionValues.\n     */\n    latestValues: ResolvedValues\n\n    /**\n     * Determine what role this visual element should take in the variant tree.\n     */\n    isVariantNode: boolean = false\n    isControllingVariants: boolean = false\n\n    /**\n     * If this component is part of the variant tree, it should track\n     * any children that are also part of the tree. This is essentially\n     * a shadow tree to simplify logic around how to stagger over children.\n     */\n    variantChildren?: Set<VisualElement>\n\n    /**\n     * Decides whether this VisualElement should animate in reduced motion\n     * mode.\n     *\n     * TODO: This is currently set on every individual VisualElement but feels\n     * like it could be set globally.\n     */\n    shouldReduceMotion: boolean | null = null\n\n    /**\n     * Decides whether animations should be skipped for this VisualElement.\n     * Useful for E2E tests and visual regression testing.\n     */\n    shouldSkipAnimations: boolean = false\n\n    /**\n     * Normally, if a component is controlled by a parent's variants, it can\n     * rely on that ancestor to trigger animations further down the tree.\n     * However, if a component is created after its parent is mounted, the parent\n     * won't trigger that mount animation so the child needs to.\n     *\n     * TODO: This might be better replaced with a method isParentMounted\n     */\n    manuallyAnimateOnMount: boolean\n\n    /**\n     * This can be set by AnimatePresence to force components that mount\n     * at the same time as it to mount as if they have initial={false} set.\n     */\n    blockInitialAnimation: boolean\n\n    /**\n     * A reference to this VisualElement's projection node, used in layout animations.\n     */\n    projection?: any\n\n    /**\n     * A map of all motion values attached to this visual element. Motion\n     * values are source of truth for any given animated value. A motion\n     * value might be provided externally by the component via props.\n     */\n    values = new Map<string, MotionValue>()\n\n    /**\n     * The AnimationState, this is hydrated by the animation Feature.\n     */\n    animationState?: AnimationState\n\n    KeyframeResolver = KeyframeResolver\n\n    /**\n     * The options used to create this VisualElement. The Options type is defined\n     * by the inheriting VisualElement and is passed straight through to the render functions.\n     */\n    readonly options: Options\n\n    /**\n     * A reference to the latest props provided to the VisualElement's host React component.\n     */\n    props: MotionNodeOptions\n    prevProps?: MotionNodeOptions\n\n    presenceContext: PresenceContextProps | null\n    prevPresenceContext?: PresenceContextProps | null\n\n    /**\n     * Cleanup functions for active features (hover/tap/exit etc)\n     */\n    private features: {\n        [K in keyof FeatureDefinitions]?: Feature<Instance>\n    } = {}\n\n    /**\n     * A map of every subscription that binds the provided or generated\n     * motion values onChange listeners to this visual element.\n     */\n    private valueSubscriptions = new Map<string, VoidFunction>()\n\n    /**\n     * A reference to the ReducedMotionConfig passed to the VisualElement's host React component.\n     */\n    private reducedMotionConfig: ReducedMotionConfig | undefined\n\n    /**\n     * A reference to the skipAnimations config passed to the VisualElement's host React component.\n     */\n    private skipAnimationsConfig: boolean | undefined\n\n    /**\n     * On mount, this will be hydrated with a callback to disconnect\n     * this visual element from its parent on unmount.\n     */\n    private removeFromVariantTree: undefined | VoidFunction\n\n    /**\n     * A reference to the previously-provided motion values as returned\n     * from scrapeMotionValuesFromProps. We use the keys in here to determine\n     * if any motion values need to be removed after props are updated.\n     */\n    private prevMotionValues: MotionStyle = {}\n\n    /**\n     * When values are removed from all animation props we need to search\n     * for a fallback value to animate to. These values are tracked in baseTarget.\n     */\n    private baseTarget: ResolvedValues\n\n    /**\n     * Create an object of the values we initially animated from (if initial prop present).\n     */\n    private initialValues: ResolvedValues\n\n    /**\n     * Track whether this element has been mounted before, to detect\n     * remounts after Suspense unmount/remount cycles.\n     */\n    private hasBeenMounted = false\n\n    /**\n     * An object containing a SubscriptionManager for each active event.\n     */\n    private events: {\n        [key: string]: SubscriptionManager<any>\n    } = {}\n\n    /**\n     * An object containing an unsubscribe function for each prop event subscription.\n     * For example, every \"Update\" event can have multiple subscribers via\n     * VisualElement.on(), but only one of those can be defined via the onUpdate prop.\n     */\n    private propEventSubscriptions: {\n        [key: string]: VoidFunction\n    } = {}\n\n    constructor(\n        {\n            parent,\n            props,\n            presenceContext,\n            reducedMotionConfig,\n            skipAnimations,\n            blockInitialAnimation,\n            visualState,\n        }: VisualElementOptions<Instance, RenderState>,\n        options: Options = {} as any\n    ) {\n        const { latestValues, renderState } = visualState\n        this.latestValues = latestValues\n        this.baseTarget = { ...latestValues }\n        this.initialValues = props.initial ? { ...latestValues } : {}\n        this.renderState = renderState\n        this.parent = parent\n        this.props = props\n        this.presenceContext = presenceContext\n        this.depth = parent ? parent.depth + 1 : 0\n        this.reducedMotionConfig = reducedMotionConfig\n        this.skipAnimationsConfig = skipAnimations\n        this.options = options\n        this.blockInitialAnimation = Boolean(blockInitialAnimation)\n\n        this.isControllingVariants = checkIsControllingVariants(props)\n        this.isVariantNode = checkIsVariantNode(props)\n        if (this.isVariantNode) {\n            this.variantChildren = new Set()\n        }\n\n        this.manuallyAnimateOnMount = Boolean(parent && parent.current)\n\n        /**\n         * Any motion values that are provided to the element when created\n         * aren't yet bound to the element, as this would technically be impure.\n         * However, we iterate through the motion values and set them to the\n         * initial values for this component.\n         *\n         * TODO: This is impure and we should look at changing this to run on mount.\n         * Doing so will break some tests but this isn't necessarily a breaking change,\n         * more a reflection of the test.\n         */\n        const { willChange, ...initialMotionValues } =\n            this.scrapeMotionValuesFromProps(props, {}, this)\n\n        for (const key in initialMotionValues) {\n            const value = initialMotionValues[key]\n\n            if (latestValues[key] !== undefined && isMotionValue(value)) {\n                value.set(latestValues[key])\n            }\n        }\n    }\n\n    mount(instance: Instance) {\n        /**\n         * If this element has been mounted before (e.g. after a Suspense\n         * unmount/remount), reset motion values to their initial state\n         * so animations replay correctly from initial → animate.\n         */\n        if (this.hasBeenMounted) {\n            for (const key in this.initialValues) {\n                this.values.get(key)?.jump(this.initialValues[key])\n                this.latestValues[key] = this.initialValues[key]\n            }\n        }\n\n        this.current = instance\n\n        visualElementStore.set(instance, this)\n\n        if (this.projection && !this.projection.instance) {\n            this.projection.mount(instance)\n        }\n\n        if (this.parent && this.isVariantNode && !this.isControllingVariants) {\n            this.removeFromVariantTree = this.parent.addVariantChild(this)\n        }\n\n        this.values.forEach((value, key) => this.bindToMotionValue(key, value))\n\n        /**\n         * Determine reduced motion preference. Only initialize the matchMedia\n         * listener if we actually need the dynamic value (i.e., when config\n         * is neither \"never\" nor \"always\").\n         */\n        if (this.reducedMotionConfig === \"never\") {\n            this.shouldReduceMotion = false\n        } else if (this.reducedMotionConfig === \"always\") {\n            this.shouldReduceMotion = true\n        } else {\n            if (!hasReducedMotionListener.current) {\n                initPrefersReducedMotion()\n            }\n            this.shouldReduceMotion = prefersReducedMotion.current\n        }\n\n        if (process.env.NODE_ENV !== \"production\") {\n            warnOnce(\n                this.shouldReduceMotion !== true,\n                \"You have Reduced Motion enabled on your device. Animations may not appear as expected.\",\n                \"reduced-motion-disabled\"\n            )\n        }\n\n        /**\n         * Set whether animations should be skipped based on the config.\n         */\n        this.shouldSkipAnimations = this.skipAnimationsConfig ?? false\n\n        this.parent?.addChild(this)\n\n        this.update(this.props, this.presenceContext)\n\n        this.hasBeenMounted = true\n    }\n\n    unmount() {\n        this.projection && this.projection.unmount()\n        cancelFrame(this.notifyUpdate)\n        cancelFrame(this.render)\n        this.valueSubscriptions.forEach((remove) => remove())\n        this.valueSubscriptions.clear()\n        this.removeFromVariantTree && this.removeFromVariantTree()\n        this.parent?.removeChild(this)\n\n        for (const key in this.events) {\n            this.events[key].clear()\n        }\n\n        for (const key in this.features) {\n            const feature = this.features[key as keyof typeof this.features]\n            if (feature) {\n                feature.unmount()\n                feature.isMounted = false\n            }\n        }\n        this.current = null\n    }\n\n    addChild(child: VisualElement) {\n        this.children.add(child)\n        this.enteringChildren ??= new Set()\n        this.enteringChildren.add(child)\n    }\n\n    removeChild(child: VisualElement) {\n        this.children.delete(child)\n        this.enteringChildren && this.enteringChildren.delete(child)\n    }\n\n    private bindToMotionValue(key: string, value: MotionValue) {\n        if (this.valueSubscriptions.has(key)) {\n            this.valueSubscriptions.get(key)!()\n        }\n\n        if (\n            value.accelerate &&\n            acceleratedValues.has(key) &&\n            this.current instanceof HTMLElement\n        ) {\n            const { factory, keyframes, times, ease, duration } =\n                value.accelerate\n\n            const animation = new NativeAnimation({\n                element: this.current,\n                name: key,\n                keyframes,\n                times,\n                ease,\n                duration: secondsToMilliseconds(duration),\n            })\n\n            const cleanup = factory(animation)\n\n            this.valueSubscriptions.set(key, () => {\n                cleanup()\n                animation.cancel()\n            })\n            return\n        }\n\n        const valueIsTransform = transformProps.has(key)\n\n        if (valueIsTransform && this.onBindTransform) {\n            this.onBindTransform()\n        }\n\n        const removeOnChange = value.on(\n            \"change\",\n            (latestValue: AnyResolvedKeyframe) => {\n                this.latestValues[key] = latestValue\n\n                this.props.onUpdate && frame.preRender(this.notifyUpdate)\n\n                if (valueIsTransform && this.projection) {\n                    this.projection.isTransformDirty = true\n                }\n\n                this.scheduleRender()\n            }\n        )\n\n        let removeSyncCheck: VoidFunction | void\n        if (\n            typeof window !== \"undefined\" &&\n            (window as any).MotionCheckAppearSync\n        ) {\n            removeSyncCheck = (window as any).MotionCheckAppearSync(\n                this,\n                key,\n                value\n            )\n        }\n\n        this.valueSubscriptions.set(key, () => {\n            removeOnChange()\n            if (removeSyncCheck) removeSyncCheck()\n            if (value.owner) value.stop()\n        })\n    }\n\n    sortNodePosition(other: VisualElement<Instance>) {\n        /**\n         * If these nodes aren't even of the same type we can't compare their depth.\n         */\n        if (\n            !this.current ||\n            !this.sortInstanceNodePosition ||\n            this.type !== other.type\n        ) {\n            return 0\n        }\n\n        return this.sortInstanceNodePosition(\n            this.current as Instance,\n            other.current as Instance\n        )\n    }\n\n    updateFeatures() {\n        let key: keyof typeof featureDefinitions = \"animation\"\n\n        for (key in featureDefinitions) {\n            const featureDefinition = featureDefinitions[key]\n\n            if (!featureDefinition) continue\n\n            const { isEnabled, Feature: FeatureConstructor } = featureDefinition\n\n            /**\n             * If this feature is enabled but not active, make a new instance.\n             */\n            if (\n                !this.features[key] &&\n                FeatureConstructor &&\n                isEnabled(this.props)\n            ) {\n                this.features[key] = new FeatureConstructor(this) as any\n            }\n\n            /**\n             * If we have a feature, mount or update it.\n             */\n            if (this.features[key]) {\n                const feature = this.features[key]!\n                if (feature.isMounted) {\n                    feature.update()\n                } else {\n                    feature.mount()\n                    feature.isMounted = true\n                }\n            }\n        }\n    }\n\n    notifyUpdate = () => this.notify(\"Update\", this.latestValues)\n\n    triggerBuild() {\n        this.build(this.renderState, this.latestValues, this.props)\n    }\n\n    render = () => {\n        if (!this.current) return\n        this.triggerBuild()\n        this.renderInstance(\n            this.current,\n            this.renderState,\n            (this.props as any).style,\n            this.projection\n        )\n    }\n\n    private renderScheduledAt = 0.0\n    scheduleRender = () => {\n        const now = time.now()\n        if (this.renderScheduledAt < now) {\n            this.renderScheduledAt = now\n            frame.render(this.render, false, true)\n        }\n    }\n\n    /**\n     * Measure the current viewport box with or without transforms.\n     * Only measures axis-aligned boxes, rotate and skew must be manually\n     * removed with a re-render to work.\n     */\n    measureViewportBox() {\n        return this.current\n            ? this.measureInstanceViewportBox(this.current, this.props)\n            : createBox()\n    }\n\n    getStaticValue(key: string) {\n        return this.latestValues[key]\n    }\n\n    setStaticValue(key: string, value: AnyResolvedKeyframe) {\n        this.latestValues[key] = value\n    }\n\n    /**\n     * Update the provided props. Ensure any newly-added motion values are\n     * added to our map, old ones removed, and listeners updated.\n     */\n    update(\n        props: MotionNodeOptions,\n        presenceContext: PresenceContextProps | null\n    ) {\n        if (props.transformTemplate || this.props.transformTemplate) {\n            this.scheduleRender()\n        }\n\n        this.prevProps = this.props\n        this.props = props\n\n        this.prevPresenceContext = this.presenceContext\n        this.presenceContext = presenceContext\n\n        /**\n         * Update prop event handlers ie onAnimationStart, onAnimationComplete\n         */\n        for (let i = 0; i < propEventHandlers.length; i++) {\n            const key = propEventHandlers[i]\n            if (this.propEventSubscriptions[key]) {\n                this.propEventSubscriptions[key]()\n                delete this.propEventSubscriptions[key]\n            }\n\n            const listenerName = (\"on\" + key) as keyof typeof props\n            const listener = props[listenerName]\n            if (listener) {\n                this.propEventSubscriptions[key] = this.on(key as any, listener)\n            }\n        }\n\n        this.prevMotionValues = updateMotionValuesFromProps(\n            this,\n            this.scrapeMotionValuesFromProps(props, this.prevProps || {}, this),\n            this.prevMotionValues\n        )\n\n        if (this.handleChildMotionValue) {\n            this.handleChildMotionValue()\n        }\n    }\n\n    getProps() {\n        return this.props\n    }\n\n    /**\n     * Returns the variant definition with a given name.\n     */\n    getVariant(name: string) {\n        return this.props.variants ? this.props.variants[name] : undefined\n    }\n\n    /**\n     * Returns the defined default transition on this component.\n     */\n    getDefaultTransition() {\n        return this.props.transition\n    }\n\n    getTransformPagePoint() {\n        return (this.props as any).transformPagePoint\n    }\n\n    getClosestVariantNode(): VisualElement | undefined {\n        return this.isVariantNode\n            ? this\n            : this.parent\n            ? this.parent.getClosestVariantNode()\n            : undefined\n    }\n\n    /**\n     * Add a child visual element to our set of children.\n     */\n    addVariantChild(child: VisualElement) {\n        const closestVariantNode = this.getClosestVariantNode()\n        if (closestVariantNode) {\n            closestVariantNode.variantChildren &&\n                closestVariantNode.variantChildren.add(child)\n            return () => closestVariantNode.variantChildren!.delete(child)\n        }\n    }\n\n    /**\n     * Add a motion value and bind it to this visual element.\n     */\n    addValue(key: string, value: MotionValue) {\n        // Remove existing value if it exists\n        const existingValue = this.values.get(key)\n\n        if (value !== existingValue) {\n            if (existingValue) this.removeValue(key)\n            this.bindToMotionValue(key, value)\n            this.values.set(key, value)\n            this.latestValues[key] = value.get()\n        }\n    }\n\n    /**\n     * Remove a motion value and unbind any active subscriptions.\n     */\n    removeValue(key: string) {\n        this.values.delete(key)\n        const unsubscribe = this.valueSubscriptions.get(key)\n        if (unsubscribe) {\n            unsubscribe()\n            this.valueSubscriptions.delete(key)\n        }\n        delete this.latestValues[key]\n        this.removeValueFromRenderState(key, this.renderState)\n    }\n\n    /**\n     * Check whether we have a motion value for this key\n     */\n    hasValue(key: string) {\n        return this.values.has(key)\n    }\n\n    /**\n     * Get a motion value for this key. If called with a default\n     * value, we'll create one if none exists.\n     */\n    getValue(key: string): MotionValue | undefined\n    getValue(key: string, defaultValue: AnyResolvedKeyframe | null): MotionValue\n    getValue(\n        key: string,\n        defaultValue?: AnyResolvedKeyframe | null\n    ): MotionValue | undefined {\n        if (this.props.values && this.props.values[key]) {\n            return this.props.values[key]\n        }\n\n        let value = this.values.get(key)\n\n        if (value === undefined && defaultValue !== undefined) {\n            value = motionValue(\n                defaultValue === null ? undefined : defaultValue,\n                { owner: this }\n            )\n            this.addValue(key, value)\n        }\n\n        return value\n    }\n\n    /**\n     * If we're trying to animate to a previously unencountered value,\n     * we need to check for it in our state and as a last resort read it\n     * directly from the instance (which might have performance implications).\n     */\n    readValue(key: string, target?: AnyResolvedKeyframe | null) {\n        let value =\n            this.latestValues[key] !== undefined || !this.current\n                ? this.latestValues[key]\n                : this.getBaseTargetFromProps(this.props, key) ??\n                  this.readValueFromInstance(this.current, key, this.options)\n\n        if (value !== undefined && value !== null) {\n            if (\n                typeof value === \"string\" &&\n                (isNumericalString(value) || isZeroValueString(value))\n            ) {\n                // If this is a number read as a string, ie \"0\" or \"200\", convert it to a number\n                value = parseFloat(value)\n            } else if (!findValueType(value) && complex.test(target)) {\n                value = getAnimatableNone(key, target as string)\n            }\n\n            this.setBaseTarget(key, isMotionValue(value) ? value.get() : value)\n        }\n\n        return isMotionValue(value) ? value.get() : value\n    }\n\n    /**\n     * Set the base target to later animate back to. This is currently\n     * only hydrated on creation and when we first read a value.\n     */\n    setBaseTarget(key: string, value: AnyResolvedKeyframe) {\n        this.baseTarget[key] = value\n    }\n\n    /**\n     * Find the base target for a value thats been removed from all animation\n     * props.\n     */\n    getBaseTarget(key: string): ResolvedValues[string] | undefined | null {\n        const { initial } = this.props\n\n        let valueFromInitial: ResolvedValues[string] | undefined | null\n\n        if (typeof initial === \"string\" || typeof initial === \"object\") {\n            const variant = resolveVariantFromProps(\n                this.props,\n                initial as any,\n                this.presenceContext?.custom\n            )\n            if (variant) {\n                valueFromInitial = variant[\n                    key as keyof typeof variant\n                ] as string\n            }\n        }\n\n        /**\n         * If this value still exists in the current initial variant, read that.\n         */\n        if (initial && valueFromInitial !== undefined) {\n            return valueFromInitial\n        }\n\n        /**\n         * Alternatively, if this VisualElement config has defined a getBaseTarget\n         * so we can read the value from an alternative source, try that.\n         */\n        const target = this.getBaseTargetFromProps(this.props, key)\n        if (target !== undefined && !isMotionValue(target)) return target\n\n        /**\n         * If the value was initially defined on initial, but it doesn't any more,\n         * return undefined. Otherwise return the value as initially read from the DOM.\n         */\n        return this.initialValues[key] !== undefined &&\n            valueFromInitial === undefined\n            ? undefined\n            : this.baseTarget[key]\n    }\n\n    on<EventName extends keyof VisualElementEventCallbacks>(\n        eventName: EventName,\n        callback: VisualElementEventCallbacks[EventName]\n    ) {\n        if (!this.events[eventName]) {\n            this.events[eventName] = new SubscriptionManager()\n        }\n\n        return this.events[eventName].add(callback)\n    }\n\n    notify<EventName extends keyof VisualElementEventCallbacks>(\n        eventName: EventName,\n        ...args: any\n    ) {\n        if (this.events[eventName]) {\n            this.events[eventName].notify(...args)\n        }\n    }\n\n    scheduleRenderMicrotask() {\n        microtask.render(this.render)\n    }\n}\n"],"names":["checkIsControllingVariants","checkIsVariantNode"],"mappings":"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"}