[{"name":"Anim.Builder","comment":" Shared builder types and settings for animations.\n\nMost app code will use the engine and property modules directly.\n\nThis module contains shared types and global builder settings.\n\n\n# Types\n\n@docs AnimBuilder\n\n\n## Engine Capability Types\n\nUse these to constrain a builder function to one specific Engine.\n\n@docs ForKeyframe, ForSub, ForTransition, ForWAAPI, ForScroll, ForView\n\n\n# Builder Settings\n\nAll the engines expose their own equivalents of these functions that are engine-specific,\nthese are the engine-agnostic versions. Use these when you are writing builder functions\nthat should work across engines, or when you don't want to commit to a specific engine.\n\n\n## Timing\n\nThese settings are for Document timeline engines: Keyframe, Sub, Transition, and WAAPI.\nThey make no sense when applied to Scroll and View timelines, and will raise a type error\nif used in builders for those engines.\n\n@docs delay, duration, speed\n\n\n## Playback\n\n@docs iterations, alternate\n\n\n# Motion Behaviour\n\n@docs easing, spring\n\n\n# CSS Units\n\nSet the CSS unit for properties that use length values.\n\nThis is useful when you want properties to render in units like `rem`, `cqh` or `vw`, for example, instead of `px`, the default.\n\n📖 See the property docs and [Responsive Animations](https://phollyer.github.io/elm-motion/animation/concepts/responsive-animations/)\nfor more details.\n\n@docs cssUnit, cssUnitX, cssUnitY, cssUnitZ, cssUnitWidth, cssUnitHeight\n\n","unions":[],"aliases":[{"name":"AnimBuilder","comment":" Base builder type for animations.\n\n    f : AnimBuilder eng -> AnimBuilder eng\n\nThe `eng` type parameter is a phantom type used to optionally constrain\nbuilder functions to specific engines or capabilities.\n\n📖 See [Engine Capabilities](https://phollyer.github.io/elm-motion/animation/concepts/engine-capabilities/)\nfor details.\n\n","args":["eng"],"type":"Anim.Internal.Builder.AnimBuilder eng"},{"name":"ForKeyframe","comment":" Builder type for Keyframe builders.\n\n    f : AnimBuilder ForKeyframe -> AnimBuilder ForKeyframe\n\n","args":[],"type":"Anim.Internal.Builder.ForKeyframe"},{"name":"ForScroll","comment":" Builder type for ScrollTimeline builders.\n\n    f : AnimBuilder ForScroll -> AnimBuilder ForScroll\n\n","args":[],"type":"Anim.Internal.Builder.ForScroll"},{"name":"ForSub","comment":" Builder type for Sub builders.\n\n    f : AnimBuilder ForSub -> AnimBuilder ForSub\n\n","args":[],"type":"Anim.Internal.Builder.ForSub"},{"name":"ForTransition","comment":" Builder type for Transition builders.\n\n    f : AnimBuilder ForTransition -> AnimBuilder ForTransition\n\n","args":[],"type":"Anim.Internal.Builder.ForTransition"},{"name":"ForView","comment":" Builder type for ViewTimeline builders.\n\n    f : AnimBuilder ForView -> AnimBuilder ForView\n\n","args":[],"type":"Anim.Internal.Builder.ForView"},{"name":"ForWAAPI","comment":" Builder type for WAAPI builders.\n\n    f : AnimBuilder ForWAAPI -> AnimBuilder ForWAAPI\n\n","args":[],"type":"Anim.Internal.Builder.ForWAAPI"}],"values":[{"name":"alternate","comment":" Make an animation alternate direction on each iteration.\n\n    floatingCardLoop : AnimBuilder { eng | withAlternate : () } -> AnimBuilder { eng | withAlternate : () }\n    floatingCardLoop =\n        iterations 4\n            >> alternate\n            >> liftCard\n            >> glowCardBorder\n\n`alternate` only has a visible effect when the animation runs more than once,\nso calling it when `iterations` is unset or `1` automatically bumps\n`iterations` to `2`. An explicit `iterations` count (or `loopForever`) set\nbefore or after `alternate` is preserved.\n\n","type":"Anim.Builder.AnimBuilder { eng | withAlternate : () } -> Anim.Builder.AnimBuilder { eng | withAlternate : () }"},{"name":"cssUnit","comment":" Set the default length unit for all length-bearing properties.\n\n    responsivePanelMotion : AnimBuilder { eng | withCssUnit : () } -> AnimBuilder { eng | withCssUnit : () }\n    responsivePanelMotion =\n        cssUnit Unit.Vw\n            >> slidePanelIn\n            >> growPanelHeight\n\n","type":"Anim.Unit.Unit -> Anim.Builder.AnimBuilder { eng | withCssUnit : () } -> Anim.Builder.AnimBuilder { eng | withCssUnit : () }"},{"name":"cssUnitHeight","comment":" Set the default length unit used for height values.\n\n    responsivePanelHeight : AnimBuilder eng -> AnimBuilder eng\n    responsivePanelHeight =\n        cssUnitHeight Unit.Vh\n            >> expandPanelHeight\n            >> alignPanelHeaderY\n\n","type":"Anim.Unit.Unit -> Anim.Builder.AnimBuilder eng -> Anim.Builder.AnimBuilder eng"},{"name":"cssUnitWidth","comment":" Set the default length unit used for width values.\n\n    responsiveCardWidth : AnimBuilder { eng | withCssUnit : () } -> AnimBuilder { eng | withCssUnit : () }\n    responsiveCardWidth =\n        cssUnitWidth Unit.Vw\n            >> growCardWidth\n            >> settleCardSpacing\n\n","type":"Anim.Unit.Unit -> Anim.Builder.AnimBuilder eng -> Anim.Builder.AnimBuilder eng"},{"name":"cssUnitX","comment":" Set the default length unit for the X axis.\n\n    responsiveDrawerMotion : AnimBuilder { eng | withCssUnit : () } -> AnimBuilder { eng | withCssUnit : () }\n    responsiveDrawerMotion =\n        cssUnitX Unit.Vw\n            >> slideDrawerX\n            >> alignDrawerLabelX\n\n","type":"Anim.Unit.Unit -> Anim.Builder.AnimBuilder { eng | withCssUnit : () } -> Anim.Builder.AnimBuilder { eng | withCssUnit : () }"},{"name":"cssUnitY","comment":" Set the default length unit for the Y axis.\n\n    responsiveSheetMotion : AnimBuilder { eng | withCssUnit : () } -> AnimBuilder { eng | withCssUnit : () }\n    responsiveSheetMotion =\n        cssUnitY Unit.Vh\n            >> slideSheetY\n            >> alignSheetHeaderY\n\n","type":"Anim.Unit.Unit -> Anim.Builder.AnimBuilder { eng | withCssUnit : () } -> Anim.Builder.AnimBuilder { eng | withCssUnit : () }"},{"name":"cssUnitZ","comment":" Set the default length unit for the Z axis.\n\n    layeredSceneMotion : AnimBuilder { eng | withCssUnit : () } -> AnimBuilder { eng | withCssUnit : () }\n    layeredSceneMotion =\n        cssUnitZ Unit.Px\n            >> pushSceneBackgroundBack\n            >> bringFloatingCardForward\n\n","type":"Anim.Unit.Unit -> Anim.Builder.AnimBuilder { eng | withCssUnit : () } -> Anim.Builder.AnimBuilder { eng | withCssUnit : () }"},{"name":"delay","comment":" Set the global delay for all animations in a Document timeline builder.\n\n    introAnim : AnimBuilder { eng | withTiming : () } -> AnimBuilder { eng | withTiming : () }\n    introAnim =\n        delay 500\n            >> fadeInHeader\n            >> slideInSidebar\n            >> fadeInContent\n\n","type":"Basics.Int -> Anim.Builder.AnimBuilder { eng | withTiming : () } -> Anim.Builder.AnimBuilder { eng | withTiming : () }"},{"name":"duration","comment":" Set the global duration for all animations in a Document timeline builder.\n\n    introAnim : AnimBuilder { eng | withTiming : () } -> AnimBuilder { eng | withTiming : () }\n    introAnim =\n        duration 500\n            >> fadeInHeader\n            >> slideInSidebar\n            >> fadeInContent\n\n","type":"Basics.Int -> Anim.Builder.AnimBuilder { eng | withTiming : () } -> Anim.Builder.AnimBuilder { eng | withTiming : () }"},{"name":"easing","comment":" Set the global easing function.\n\n    heroEntrance : AnimBuilder eng -> AnimBuilder eng\n    heroEntrance =\n        easing EaseInOut\n            >> fadeInHeroTitle\n            >> slideInHeroArtwork\n            >> revealPrimaryCta\n\n","type":"Motion.Easing.Easing -> Anim.Builder.AnimBuilder eng -> Anim.Builder.AnimBuilder eng"},{"name":"iterations","comment":" Set how many times an animation should repeat.\n\n    notificationAttentionLoop : AnimBuilder { eng | withIterations : () } -> AnimBuilder { eng | withIterations : () }\n    notificationAttentionLoop =\n        iterations 3\n            >> pulseBadge\n            >> nudgeBellIcon\n\n","type":"Basics.Int -> Anim.Builder.AnimBuilder { eng | withIterations : () } -> Anim.Builder.AnimBuilder { eng | withIterations : () }"},{"name":"speed","comment":" Set the global speed for all animations in a Document timeline builder.\n\n    introAnim : AnimBuilder { eng | withTiming : () } -> AnimBuilder { eng | withTiming : () }\n    introAnim =\n        speed 300\n            >> slideDownHeader\n            >> slideInSidebar\n            >> slideUpContent\n\n","type":"Basics.Float -> Anim.Builder.AnimBuilder { eng | withTiming : () } -> Anim.Builder.AnimBuilder { eng | withTiming : () }"},{"name":"spring","comment":" Set the global spring.\n\n    draggableCardSettle : AnimBuilder { eng | withSpring : () } -> AnimBuilder { eng | withSpring : () }\n    draggableCardSettle =\n        spring Spring.wobbly\n            >> settleCardPosition\n            >> settleCardShadow\n\n","type":"Motion.Spring.Spring -> Anim.Builder.AnimBuilder { eng | withSpring : () } -> Anim.Builder.AnimBuilder { eng | withSpring : () }"}],"binops":[]},{"name":"Anim.Engine.Keyframe","comment":" CSS keyframe animations with browser-native performance.\n\nThis engine is a good fit for 'on-load' animations, or if you need looping, alternating, or pause/resume functionality.\n\n📖 See\n[Keyframe Engine Documentation](https://phollyer.github.io/elm-motion/animation/engines/keyframes/)\nand\n[Engine Overview](https://phollyer.github.io/elm-motion/animation/engines/overview/)\nfor details.\n\n\n# Types\n\n@docs AnimState, AnimGroupName\n\n\n## Builders\n\n@docs AnimBuilder\n\n\n### Engine Builder\n\n@docs EngineBuilder\n\n\n# Initialize\n\n📖 See [Initialize](https://phollyer.github.io/elm-motion/animation/workflow/init/) for details.\n\n@docs init\n\n\n# Target\n\n@docs for\n\n\n# Trigger\n\n📖 See [Triggering Animations](https://phollyer.github.io/elm-motion/animation/workflow/trigger/) for details.\n\n@docs animate, retarget\n\n\n# Events\n\n📖 See [Event Reference](https://phollyer.github.io/elm-motion/animation/workflow/react/#event-reference) for details.\n\n@docs CurrentTargetId, TargetId, AnimEvent\n\n\n# Update\n\n📖 See [React](https://phollyer.github.io/elm-motion/animation/workflow/react/) for details.\n\n@docs AnimMsg, update\n\n\n# View\n\nTo render keyframes, add `attributes` to the element and include `styleNode`\nor `styleNodeFor` somewhere in your view.\n\n📖 See [Render](https://phollyer.github.io/elm-motion/animation/workflow/render/) and\n[Keyframe Style Node](https://phollyer.github.io/elm-motion/animation/engines/keyframes/#keyframes-style-node)\nfor details.\n\n@docs attributes\n\n@docs styleNode, styleNodeFor, maybeString\n\n\n# Event Listeners\n\n📖 See [Events](https://phollyer.github.io/elm-motion/animation/engines/keyframes/#events) for details.\n\n@docs events, eventsStopPropagation\n\n\n# Unit\n\n@docs cssUnit, cssUnitX, cssUnitY, cssUnitZ, cssUnitWidth, cssUnitHeight\n\n\n# Playback\n\nThese functions are precedence functions, so they can operate as a global setting for all groups in the\nbuilder chain, or you can set them on a per-group basis which overrides any global setting\nfor that group.\n\n    Keyframe.iterations 3 -- global setting\n        >> Keyframe.for \"box\"\n        >> Keyframe.iterations 5 -- overrides global for this group\n        >> ... -- other builders\n\n@docs iterations, loopForever, alternate\n\n\n# Timing\n\n📖 See [Timing](https://phollyer.github.io/elm-motion/animation/concepts/timing/) for details.\n\n@docs delay, duration, speed\n\n\n# Easing\n\n📖 See [Easing](https://phollyer.github.io/elm-motion/animation/concepts/easing/) for details.\n\n@docs easing\n\n\n# Spring\n\n@docs spring\n\n\n# Animation Control\n\n📖 See [Controlling Animations](https://phollyer.github.io/elm-motion/animation/concepts/controlling-animations/) for details.\n\n@docs stop, reset, restart, pause, resume\n\n\n# Discrete Properties\n\n📖 See [Discrete Properties](https://phollyer.github.io/elm-motion/animation/concepts/discrete-properties/) for details.\n\n@docs discreteEntry, discreteExit\n\n\n# Transform Order\n\n📖 See [Transform Ordering](https://phollyer.github.io/elm-motion/animation/concepts/transform-order/) for details.\n\n@docs transformOrder\n\n\n# State Queries\n\n📖 See [State Queries](https://phollyer.github.io/elm-motion/animation/engines/keyframes/#state-queries) for details.\n\n@docs anyRunning, isRunning, allComplete, isComplete, isCancelled\n\n\n# Property Queries\n\n📖 See [Property Queries](https://phollyer.github.io/elm-motion/animation/engines/keyframes/#property-queries) and\n[Properties](https://phollyer.github.io/elm-motion/animation/properties/getting-started/) for details.\n\n\n## Custom Properties\n\n@docs getPropertyEnd, getPropertyRange, getPropertyStart\n\n\n## Custom Color Properties\n\n@docs getColorPropertyEnd, getColorPropertyRange, getColorPropertyStart\n\n\n## Opacity\n\n@docs getOpacityStart, getOpacityEnd, getOpacityRange\n\n\n## Perspective Origin\n\n@docs getPerspectiveOriginStart, getPerspectiveOriginEnd, getPerspectiveOriginRange\n\n\n## Rotate\n\n@docs getRotateStart, getRotateEnd, getRotateRange\n\n\n## Scale\n\n@docs getScaleStart, getScaleEnd, getScaleRange\n\n\n## Size\n\n@docs getSizeStart, getSizeEnd, getSizeRange\n\n\n## Skew\n\n@docs getSkewEnd, getSkewRange, getSkewStart\n\n\n## Translate\n\n@docs getTranslateStart, getTranslateEnd, getTranslateRange\n\n","unions":[{"name":"AnimEvent","comment":" CSS keyframe animation lifecycle events.\n","args":[],"cases":[["Ended",["Anim.Engine.Keyframe.CurrentTargetId","Anim.Engine.Keyframe.TargetId","Anim.Engine.Keyframe.AnimGroupName"]],["Cancelled",["Anim.Engine.Keyframe.CurrentTargetId","Anim.Engine.Keyframe.TargetId","Anim.Engine.Keyframe.AnimGroupName"]],["Iteration",["Anim.Engine.Keyframe.CurrentTargetId","Anim.Engine.Keyframe.TargetId","Anim.Engine.Keyframe.AnimGroupName","Basics.Int"]],["Paused",["Anim.Engine.Keyframe.AnimGroupName"]],["Resumed",["Anim.Engine.Keyframe.AnimGroupName"]],["Restarted",["Anim.Engine.Keyframe.AnimGroupName"]],["Run",["Anim.Engine.Keyframe.CurrentTargetId","Anim.Engine.Keyframe.TargetId","Anim.Engine.Keyframe.AnimGroupName"]]]}],"aliases":[{"name":"AnimBuilder","comment":" Type alias for the base [AnimBuilder](Anim.Builder#AnimBuilder) type.\n","args":["eng"],"type":"Anim.Internal.Engine.CSS.CSS.AnimBuilder eng"},{"name":"AnimGroupName","comment":" The name of the animation group you want to target.\n","args":[],"type":"String.String"},{"name":"AnimMsg","comment":" Message type used with `update`.\n\n    import Anim.Engine.Keyframe as Keyframe\n\n    type Msg\n        = KeyframeMsg Keyframe.AnimMsg\n        | ...\n\n","args":[],"type":"Anim.Internal.Engine.Keyframe.AnimMsg"},{"name":"AnimState","comment":" Holds the Keyframe engine state.\n\nKeep this in your model.\n\n    type alias Model =\n        { animState : Keyframe.AnimState }\n\n","args":[],"type":"Anim.Internal.Engine.Keyframe.AnimState"},{"name":"CurrentTargetId","comment":" The ID of the element that owns the event listener.\n","args":[],"type":"Maybe.Maybe String.String"},{"name":"EngineBuilder","comment":" Builder type for Keyframe-only builders.\n\nUse this in type annotations when a builder function should only work with this engine.\n\nEquivalent to `AnimBuilder ForKeyframe`.\n\n📖 See [Engine Capabilities](https://phollyer.github.io/elm-motion/animation/concepts/engine-capabilities/)\nfor patterns and examples.\n\n","args":[],"type":"Anim.Internal.Engine.Keyframe.EngineBuilder"},{"name":"TargetId","comment":" The ID of the element that started the event.\n\nThis will be different from `CurrentTargetId` if the event bubbled from a child element.\n\n","args":[],"type":"Maybe.Maybe String.String"}],"values":[{"name":"allComplete","comment":" Check if all animations are complete.\n\nReturns `Nothing` if there are no animations.\n\n","type":"Anim.Engine.Keyframe.AnimState -> Maybe.Maybe Basics.Bool"},{"name":"alternate","comment":" Make an animation alternate direction on each iteration.\n\nOnly has a visible effect when the animation runs more than once,\nso calling it when `iterations` is unset or `1` automatically bumps\n`iterations` to `2`.\n\nAn explicit `iterations` count (or `loopForever`) set before or after\n`alternate` is preserved.\n\n","type":"Anim.Engine.Keyframe.EngineBuilder -> Anim.Engine.Keyframe.EngineBuilder"},{"name":"animate","comment":" Trigger animations.\n\n    import Anim.Engine.Keyframe as Keyframe\n\n    { model\n        | animState =\n            Keyframe.animate model.animState <|\n                Keyframe.for \"animGroupName\"\n                    >> entryAnim\n    }\n\n","type":"Anim.Engine.Keyframe.AnimState -> (Anim.Engine.Keyframe.EngineBuilder -> Anim.Engine.Keyframe.EngineBuilder) -> Anim.Engine.Keyframe.AnimState"},{"name":"anyRunning","comment":" Check if any animations are currently running.\n\nReturns `Nothing` if there are no animations.\n\n","type":"Anim.Engine.Keyframe.AnimState -> Maybe.Maybe Basics.Bool"},{"name":"attributes","comment":" Apply the animation `attributes` to your element.\n\n    import Anim.Engine.Keyframe as Keyframe\n    import Html exposing (div, text)\n\n    div\n        (Keyframe.attributes \"animGroupName\" animState)\n        [ text \"Animating element\" ]\n\n","type":"Anim.Engine.Keyframe.AnimGroupName -> Anim.Engine.Keyframe.AnimState -> List.List (Html.Attribute msg)"},{"name":"cssUnit","comment":" Set the default length unit for all length-bearing properties.\n\n    responsivePanelMotion : EngineBuilder -> EngineBuilder\n    responsivePanelMotion =\n        cssUnit Unit.Vw\n            >> slidePanelIn\n            >> growPanel\n\n","type":"Anim.Unit.Unit -> Anim.Engine.Keyframe.EngineBuilder -> Anim.Engine.Keyframe.EngineBuilder"},{"name":"cssUnitHeight","comment":" Set the default length unit used for height values in Keyframe animations.\n\n    responsivePanelHeight : EngineBuilder -> EngineBuilder\n    responsivePanelHeight =\n        cssUnitHeight Unit.Vh\n            >> slidePanelIn\n            >> growPanel\n\n","type":"Anim.Unit.Unit -> Anim.Engine.Keyframe.EngineBuilder -> Anim.Engine.Keyframe.EngineBuilder"},{"name":"cssUnitWidth","comment":" Set the default length unit used for width values in Keyframe animations.\n\n    responsiveCardWidth : EngineBuilder -> EngineBuilder\n    responsiveCardWidth =\n        cssUnitWidth Unit.Vw\n            >> slidePanelIn\n            >> growPanel\n\n","type":"Anim.Unit.Unit -> Anim.Engine.Keyframe.EngineBuilder -> Anim.Engine.Keyframe.EngineBuilder"},{"name":"cssUnitX","comment":" Set the default length unit for the X axis.\n\n    responsiveDrawerMotion : EngineBuilder -> EngineBuilder\n    responsiveDrawerMotion =\n        cssUnitX Unit.Vw\n            >> slidePanelIn\n            >> growPanel\n\n","type":"Anim.Unit.Unit -> Anim.Engine.Keyframe.EngineBuilder -> Anim.Engine.Keyframe.EngineBuilder"},{"name":"cssUnitY","comment":" Set the default length unit for the Y axis.\n\n    responsiveSheetMotion : EngineBuilder -> EngineBuilder\n    responsiveSheetMotion =\n        cssUnitY Unit.Vh\n            >> slidePanelIn\n            >> growPanel\n\n","type":"Anim.Unit.Unit -> Anim.Engine.Keyframe.EngineBuilder -> Anim.Engine.Keyframe.EngineBuilder"},{"name":"cssUnitZ","comment":" Set the default length unit for the Z axis.\n\n    layeredSceneMotion : EngineBuilder -> EngineBuilder\n    layeredSceneMotion =\n        cssUnitZ Unit.Px\n            >> slidePanelIn\n            >> growPanel\n\n","type":"Anim.Unit.Unit -> Anim.Engine.Keyframe.EngineBuilder -> Anim.Engine.Keyframe.EngineBuilder"},{"name":"delay","comment":" Set the global delay for all animations in this builder.\n\n    introAnim : EngineBuilder -> EngineBuilder\n    introAnim =\n        delay 500\n            >> fadeInHeader\n            >> slideInSidebar\n            >> fadeInContent\n\n","type":"Basics.Int -> Anim.Engine.Keyframe.EngineBuilder -> Anim.Engine.Keyframe.EngineBuilder"},{"name":"discreteEntry","comment":" Add a discrete CSS property for entry animations.\n\nThe value is applied at every step of the animation, ensuring the element is\nimmediately in the target state when the animation starts. The browser already\nknows the element's pre-animation state from its own CSS.\n\nThis function is a precedence function, so it can operate as a global setting\nfor all groups in the builder chain, or you can set it on a per-group basis\nwhich overrides any global setting for that group.\n\n    import Anim.Engine.Keyframe as Keyframe\n    import Anim.Property.Opacity as Opacity\n\n    Keyframe.animate model.animState <|\n        Keyframe.discreteEntry \"display\" \"block\"\n            >> Keyframe.discreteEntry \"pointer-events\" \"auto\"\n            >> Keyframe.for \"box\"\n            >> Opacity.begin\n            >> Opacity.to 1\n            >> Opacity.end\n\n","type":"String.String -> String.String -> Anim.Engine.Keyframe.EngineBuilder -> Anim.Engine.Keyframe.EngineBuilder"},{"name":"discreteExit","comment":" Add a discrete CSS property for exit animations.\n\nExit animations need to hold their initial state\nuntil the very end of the animation, at which point they flip to the final state.\nTherefore you need to set both entry and exit values for the property.\n\nThis function is a precedence function, so it can operate as a global setting\nfor all groups in the builder chain, or you can set it on a per-group basis\nwhich overrides any global setting for that group.\n\nUse when an element is disappearing (e.g., going from\n`display: block` to `display: none`):\n\n    import Anim.Engine.Keyframe as Keyframe\n    import Anim.Property.Opacity as Opacity\n\n    Keyframe.animate model.animState <|\n        Keyframe.discreteExit \"display\" \"block\" \"none\"\n            >> Keyframe.for \"box\"\n            >> Opacity.begin\n            >> Opacity.to 0\n            >> Opacity.end\n\n","type":"String.String -> String.String -> String.String -> Anim.Engine.Keyframe.EngineBuilder -> Anim.Engine.Keyframe.EngineBuilder"},{"name":"duration","comment":" Set the global duration for all animations in this builder.\n\n    introAnim : EngineBuilder -> EngineBuilder\n    introAnim =\n        duration 500\n            >> fadeInHeader\n            >> slideInSidebar\n            >> fadeInContent\n\n","type":"Basics.Int -> Anim.Engine.Keyframe.EngineBuilder -> Anim.Engine.Keyframe.EngineBuilder"},{"name":"easing","comment":" Set the global easing function.\n\n    heroEntrance : EngineBuilder -> EngineBuilder\n    heroEntrance =\n        easing EaseInOut\n            >> fadeInHeroTitle\n            >> slideInHeroArtwork\n            >> revealPrimaryCta\n\n","type":"Motion.Easing.Easing -> Anim.Engine.Keyframe.EngineBuilder -> Anim.Engine.Keyframe.EngineBuilder"},{"name":"events","comment":" Receive keyframe animation lifecycle events.\n\nAdd `events` to your element with a message constructor that wraps `AnimMsg`.\n\n    import Anim.Engine.Keyframe as Keyframe\n    import Html exposing (div, text)\n\n    type Msg\n        = KeyframeMsg Keyframe.AnimMsg\n\n    div\n        (Keyframe.attributes \"animGroupName\" animState\n            ++ Keyframe.events KeyframeMsg\n        )\n        [ text \"Animating element\" ]\n\n","type":"(Anim.Engine.Keyframe.AnimMsg -> msg) -> List.List (Html.Attribute msg)"},{"name":"eventsStopPropagation","comment":" The same as [events](#events) but with propagation stopped.\n\n    import Anim.Engine.Keyframe as Keyframe\n    import Html exposing (div, text)\n\n    div\n        (Keyframe.attributes \"animGroupName\" animState\n            ++ Keyframe.eventsStopPropagation KeyframeMsg\n        )\n        [ text \"Animated element\" ]\n\n","type":"(Anim.Engine.Keyframe.AnimMsg -> msg) -> List.List (Html.Attribute msg)"},{"name":"for","comment":" Select the animation group that subsequent property builders will target.\n\n    Keyframe.for \"animGroupName\"\n        >> Opacity.begin\n        >> Opacity.to 0.2\n        >> Opacity.end\n\n","type":"Anim.Engine.Keyframe.AnimGroupName -> Anim.Engine.Keyframe.EngineBuilder -> Anim.Engine.Keyframe.EngineBuilder"},{"name":"getColorPropertyEnd","comment":" Get the end value of a custom color property animation.\n\nThe second argument is the CSS property name.\n\nReturns `Nothing` if the element has no animation for the given custom color property.\n\n","type":"Anim.Engine.Keyframe.AnimGroupName -> String.String -> Anim.Engine.Keyframe.AnimState -> Maybe.Maybe Anim.Extra.Color.Color"},{"name":"getColorPropertyRange","comment":" Get the custom color property range (start and end) of an element being animated.\n\nThe second argument is the CSS property name.\n\nReturns `Nothing` if the element has no animation for the given custom color property.\n\n","type":"Anim.Engine.Keyframe.AnimGroupName -> String.String -> Anim.Engine.Keyframe.AnimState -> Maybe.Maybe { start : Maybe.Maybe Anim.Extra.Color.Color, end : Anim.Extra.Color.Color }"},{"name":"getColorPropertyStart","comment":" Get the start value of a custom color property animation.\n\nThe second argument is the CSS property name.\n\nReturns `Nothing` if the element has no animation for the given custom color property.\n\nReturns `transparent white (rgba 255 255 255 0)` if no explicit start value was set, which is the default when no start value is set.\n\n","type":"Anim.Engine.Keyframe.AnimGroupName -> String.String -> Anim.Engine.Keyframe.AnimState -> Maybe.Maybe Anim.Extra.Color.Color"},{"name":"getOpacityEnd","comment":" Get the end opacity of an element being animated.\n\nReturns `Nothing` if the element has no opacity animation.\n\n","type":"Anim.Engine.Keyframe.AnimGroupName -> Anim.Engine.Keyframe.AnimState -> Maybe.Maybe Basics.Float"},{"name":"getOpacityRange","comment":" Get the opacity range (start and end) of an element being animated.\n\nReturns `Nothing` if the element has no opacity animation.\n\n","type":"Anim.Engine.Keyframe.AnimGroupName -> Anim.Engine.Keyframe.AnimState -> Maybe.Maybe { start : Maybe.Maybe Basics.Float, end : Basics.Float }"},{"name":"getOpacityStart","comment":" Get the start opacity of an element being animated.\n\nReturns `Nothing` if the element has no opacity animation.\n\nReturns `Just 1.0` (fully opaque) if no explicit start value was set, which is the default when no start value is set.\n\n","type":"Anim.Engine.Keyframe.AnimGroupName -> Anim.Engine.Keyframe.AnimState -> Maybe.Maybe Basics.Float"},{"name":"getPerspectiveOriginEnd","comment":" Get the end perspective origin of an element being animated.\n\nReturns `Nothing` if the element has no perspective origin animation.\n\n","type":"Anim.Engine.Keyframe.AnimGroupName -> Anim.Engine.Keyframe.AnimState -> Maybe.Maybe { x : Basics.Float, y : Basics.Float }"},{"name":"getPerspectiveOriginRange","comment":" Get the perspective origin range (start and end) of an element being animated.\n\nReturns `Nothing` if the element has no perspective origin animation.\n\n","type":"Anim.Engine.Keyframe.AnimGroupName -> Anim.Engine.Keyframe.AnimState -> Maybe.Maybe { start : Maybe.Maybe { x : Basics.Float, y : Basics.Float }, end : { x : Basics.Float, y : Basics.Float } }"},{"name":"getPerspectiveOriginStart","comment":" Get the start perspective origin of an element being animated.\n\nReturns `Nothing` if the element has no perspective origin animation.\n\nReturns `Just { x = 50, y = 50 }` if no explicit start value was set, which is the default when no start value is set.\n\n","type":"Anim.Engine.Keyframe.AnimGroupName -> Anim.Engine.Keyframe.AnimState -> Maybe.Maybe { x : Basics.Float, y : Basics.Float }"},{"name":"getPropertyEnd","comment":" Get the end value of a custom property animation.\n\nThe second argument is the CSS property name.\n\nReturns `Nothing` if the element has no animation for the given custom property.\n\n","type":"Anim.Engine.Keyframe.AnimGroupName -> String.String -> Anim.Engine.Keyframe.AnimState -> Maybe.Maybe Basics.Float"},{"name":"getPropertyRange","comment":" Get the custom property range (start and end) of an element being animated.\n\nThe second argument is the CSS property name.\n\nReturns `Nothing` if the element has no animation for the given custom property.\n\n","type":"Anim.Engine.Keyframe.AnimGroupName -> String.String -> Anim.Engine.Keyframe.AnimState -> Maybe.Maybe { start : Maybe.Maybe Basics.Float, end : Basics.Float }"},{"name":"getPropertyStart","comment":" Get the start value of a custom property animation.\n\nThe second argument is the CSS property name.\n\nReturns `Nothing` if the element has no animation for the given custom property.\n\nReturns `Just 0` if no explicit start value was set, which is the default when no start value is set.\n\n","type":"Anim.Engine.Keyframe.AnimGroupName -> String.String -> Anim.Engine.Keyframe.AnimState -> Maybe.Maybe Basics.Float"},{"name":"getRotateEnd","comment":" Get the end rotation of an element being animated.\n\nReturns `Nothing` if the element has no rotate animation.\n\n","type":"Anim.Engine.Keyframe.AnimGroupName -> Anim.Engine.Keyframe.AnimState -> Maybe.Maybe { x : Basics.Float, y : Basics.Float, z : Basics.Float }"},{"name":"getRotateRange","comment":" Get the rotate range (start and end) of an element being animated.\n\nReturns `Nothing` if the element has no rotate animation.\n\n","type":"Anim.Engine.Keyframe.AnimGroupName -> Anim.Engine.Keyframe.AnimState -> Maybe.Maybe { start : Maybe.Maybe { x : Basics.Float, y : Basics.Float, z : Basics.Float }, end : { x : Basics.Float, y : Basics.Float, z : Basics.Float } }"},{"name":"getRotateStart","comment":" Get the start rotation of an element being animated.\n\nReturns `Nothing` if the element has no rotate animation.\n\nReturns `Just { x = 0, y = 0, z = 0 }` if no explicit start value was set, which is the default when no start value is set.\n\n","type":"Anim.Engine.Keyframe.AnimGroupName -> Anim.Engine.Keyframe.AnimState -> Maybe.Maybe { x : Basics.Float, y : Basics.Float, z : Basics.Float }"},{"name":"getScaleEnd","comment":" Get the end scale of an element being animated.\n\nReturns `Nothing` if the element has no scale animation.\n\n","type":"Anim.Engine.Keyframe.AnimGroupName -> Anim.Engine.Keyframe.AnimState -> Maybe.Maybe { x : Basics.Float, y : Basics.Float, z : Basics.Float }"},{"name":"getScaleRange","comment":" Get the scale range (start and end) of an element being animated.\n\nReturns `Nothing` if the element has no scale animation.\n\n","type":"Anim.Engine.Keyframe.AnimGroupName -> Anim.Engine.Keyframe.AnimState -> Maybe.Maybe { start : Maybe.Maybe { x : Basics.Float, y : Basics.Float, z : Basics.Float }, end : { x : Basics.Float, y : Basics.Float, z : Basics.Float } }"},{"name":"getScaleStart","comment":" Get the start scale of an element being animated.\n\nReturns `Nothing` if the element has no scale animation.\n\nReturns `Just { x = 1, y = 1, z = 1 }` if no explicit start value was set, which is the default when no start value is set.\n\n","type":"Anim.Engine.Keyframe.AnimGroupName -> Anim.Engine.Keyframe.AnimState -> Maybe.Maybe { x : Basics.Float, y : Basics.Float, z : Basics.Float }"},{"name":"getSizeEnd","comment":" Get the end size of an element being animated.\n\nReturns `Nothing` if the element has no size animation.\n\n","type":"Anim.Engine.Keyframe.AnimGroupName -> Anim.Engine.Keyframe.AnimState -> Maybe.Maybe { width : Basics.Float, height : Basics.Float }"},{"name":"getSizeRange","comment":" Get the size range (start and end) of an element being animated.\n\nReturns `Nothing` if the element has no size animation.\n\n","type":"Anim.Engine.Keyframe.AnimGroupName -> Anim.Engine.Keyframe.AnimState -> Maybe.Maybe { start : Maybe.Maybe { width : Basics.Float, height : Basics.Float }, end : { width : Basics.Float, height : Basics.Float } }"},{"name":"getSizeStart","comment":" Get the start size of an element being animated.\n\nReturns `Nothing` if the element has no size animation.\n\nReturns `Just { width = 0, height = 0 }` if no explicit start value was set, which is the default when no start value is set.\n\n","type":"Anim.Engine.Keyframe.AnimGroupName -> Anim.Engine.Keyframe.AnimState -> Maybe.Maybe { width : Basics.Float, height : Basics.Float }"},{"name":"getSkewEnd","comment":" Get the end skew of an element being animated.\n\nReturns `Nothing` if the element has no skew animation.\n\n","type":"Anim.Engine.Keyframe.AnimGroupName -> Anim.Engine.Keyframe.AnimState -> Maybe.Maybe { x : Basics.Float, y : Basics.Float }"},{"name":"getSkewRange","comment":" Get the skew range (start and end) of an element being animated.\n\nReturns `Nothing` if the element has no skew animation.\n\n","type":"Anim.Engine.Keyframe.AnimGroupName -> Anim.Engine.Keyframe.AnimState -> Maybe.Maybe { start : Maybe.Maybe { x : Basics.Float, y : Basics.Float }, end : { x : Basics.Float, y : Basics.Float } }"},{"name":"getSkewStart","comment":" Get the start skew of an element being animated.\n\nReturns `Nothing` if the element has no skew animation.\n\nReturns `Just { x = 0, y = 0 }` if no explicit start value was set, which is the default when no start value is set.\n\n","type":"Anim.Engine.Keyframe.AnimGroupName -> Anim.Engine.Keyframe.AnimState -> Maybe.Maybe { x : Basics.Float, y : Basics.Float }"},{"name":"getTranslateEnd","comment":" Get the end translate of an element being animated.\n\nReturns `Nothing` if the element has no translate animation.\n\n","type":"Anim.Engine.Keyframe.AnimGroupName -> Anim.Engine.Keyframe.AnimState -> Maybe.Maybe { x : Basics.Float, y : Basics.Float, z : Basics.Float }"},{"name":"getTranslateRange","comment":" Get the translate range (start and end) of an element being animated.\n\nReturns `Nothing` if the element has no translate animation.\n\n","type":"Anim.Engine.Keyframe.AnimGroupName -> Anim.Engine.Keyframe.AnimState -> Maybe.Maybe { start : Maybe.Maybe { x : Basics.Float, y : Basics.Float, z : Basics.Float }, end : { x : Basics.Float, y : Basics.Float, z : Basics.Float } }"},{"name":"getTranslateStart","comment":" Get the start translate of an element being animated.\n\nReturns `Nothing` if the element has no translate animation.\n\nReturns `Just { x = 0, y = 0, z = 0 }` if no explicit start value was set, which is the default when no start value is set.\n\n","type":"Anim.Engine.Keyframe.AnimGroupName -> Anim.Engine.Keyframe.AnimState -> Maybe.Maybe { x : Basics.Float, y : Basics.Float, z : Basics.Float }"},{"name":"init","comment":" Initialize the engine state with optional property initializers.\n\n    import Anim.Engine.Keyframe as Keyframe\n    import Anim.Property.Opacity as Opacity\n\n    Keyframe.init\n        [ Opacity.init \"animGroupName\" 0.5\n        , ... -- other property initializers\n        ]\n\n","type":"List.List (Anim.Engine.Keyframe.EngineBuilder -> Anim.Engine.Keyframe.EngineBuilder) -> Anim.Engine.Keyframe.AnimState"},{"name":"isCancelled","comment":" Check if a specific animation group was cancelled.\n\nReturns `Nothing` if there are no animations for the group.\n\n","type":"Anim.Engine.Keyframe.AnimGroupName -> Anim.Engine.Keyframe.AnimState -> Maybe.Maybe Basics.Bool"},{"name":"isComplete","comment":" Check if a specific animation group has completed.\n\nReturns `Nothing` if there are no animations for the group.\n\n","type":"Anim.Engine.Keyframe.AnimGroupName -> Anim.Engine.Keyframe.AnimState -> Maybe.Maybe Basics.Bool"},{"name":"isRunning","comment":" Check if a specific animation group is currently running.\n\nReturns `Nothing` if there are no animations for the group.\n\n","type":"Anim.Engine.Keyframe.AnimGroupName -> Anim.Engine.Keyframe.AnimState -> Maybe.Maybe Basics.Bool"},{"name":"iterations","comment":" Set how many times an animation should repeat.\n","type":"Basics.Int -> Anim.Engine.Keyframe.EngineBuilder -> Anim.Engine.Keyframe.EngineBuilder"},{"name":"loopForever","comment":" Make an animation loop infinitely.\n","type":"Anim.Engine.Keyframe.EngineBuilder -> Anim.Engine.Keyframe.EngineBuilder"},{"name":"maybeString","comment":" Get the raw generated CSS keyframes string for advanced use cases.\n\nYou probably want [styleNodeFor](#styleNodeFor) instead,\nwhich handles creating the full `<style>` node for you.\n\n","type":"Anim.Engine.Keyframe.AnimGroupName -> Anim.Engine.Keyframe.AnimState -> Maybe.Maybe String.String"},{"name":"pause","comment":" Pause a running animation.\n\n    import Anim.Engine.Keyframe as Keyframe\n\n    let\n        ( newState, cmd ) =\n            Keyframe.pause \"boxAnim\" GotAnimMsg model.animState\n    in\n    ( { model | animState = newState }, cmd )\n\n","type":"Anim.Engine.Keyframe.AnimGroupName -> (Anim.Engine.Keyframe.AnimMsg -> msg) -> Anim.Engine.Keyframe.AnimState -> ( Anim.Engine.Keyframe.AnimState, Platform.Cmd.Cmd msg )"},{"name":"reset","comment":" Reset an animation by instantly jumping back to its start state.\n\n    import Anim.Engine.Keyframe as Keyframe\n\n    Keyframe.reset \"animGroup\" model.animState\n\n","type":"Anim.Engine.Keyframe.AnimGroupName -> Anim.Engine.Keyframe.AnimState -> Anim.Engine.Keyframe.AnimState"},{"name":"restart","comment":" Restart an animation from the beginning.\n\n    import Anim.Engine.Keyframe as Keyframe\n\n    let\n        ( newState, cmd ) =\n            Keyframe.restart \"boxAnim\" GotAnimMsg model.animState\n    in\n    ( { model | animState = newState }, cmd )\n\n","type":"Anim.Engine.Keyframe.AnimGroupName -> (Anim.Engine.Keyframe.AnimMsg -> msg) -> Anim.Engine.Keyframe.AnimState -> ( Anim.Engine.Keyframe.AnimState, Platform.Cmd.Cmd msg )"},{"name":"resume","comment":" Resume a paused animation.\n\n    import Anim.Engine.Keyframe as Keyframe\n\n    let\n        ( newState, cmd ) =\n            Keyframe.resume \"boxAnim\" GotAnimMsg model.animState\n    in\n    ( { model | animState = newState }, cmd )\n\n","type":"Anim.Engine.Keyframe.AnimGroupName -> (Anim.Engine.Keyframe.AnimMsg -> msg) -> Anim.Engine.Keyframe.AnimState -> ( Anim.Engine.Keyframe.AnimState, Platform.Cmd.Cmd msg )"},{"name":"retarget","comment":" Change the targeted properties instantly to their new values. If currently animating,\nstop.\n\nThis is a convenience function for immediately snapping properties or axes to new values\nwithout needing to construct a full animation builder with `animate`.\n\nJust target the properties or axes you want to change. Any other properties or axes on\nthe group will snap to their targeted end values if mid-flight.\n\n    import Anim.Engine.Keyframe as Keyframe\n    import Anim.Property.Translate as Translate\n\n    { model\n        | animState =\n            Keyframe.retarget model.animState <|\n                Keyframe.for \"animGroupName\"\n                    >> Translate.begin\n                    >> Translate.toY 0\n                    >> Translate.end\n    }\n\n","type":"Anim.Engine.Keyframe.AnimState -> (Anim.Engine.Keyframe.EngineBuilder -> Anim.Engine.Keyframe.EngineBuilder) -> Anim.Engine.Keyframe.AnimState"},{"name":"speed","comment":" Set the global speed for all animations in this builder.\n\n    introAnim : EngineBuilder -> EngineBuilder\n    introAnim =\n        speed 300\n            >> slideDownHeader\n            >> slideInSidebar\n            >> slideUpContent\n\n","type":"Basics.Float -> Anim.Engine.Keyframe.EngineBuilder -> Anim.Engine.Keyframe.EngineBuilder"},{"name":"spring","comment":" Set the global spring.\n\n    draggableCardSettle : EngineBuilder -> EngineBuilder\n    draggableCardSettle =\n        spring Spring.wobbly\n            >> settleCardPosition\n            >> settleCardShadow\n\n","type":"Motion.Spring.Spring -> Anim.Engine.Keyframe.EngineBuilder -> Anim.Engine.Keyframe.EngineBuilder"},{"name":"stop","comment":" Stop a running animation by instantly jumping to its end state.\n\n    import Anim.Engine.Keyframe as Keyframe\n\n    Keyframe.stop \"animGroup\" model.animState\n\n","type":"Anim.Engine.Keyframe.AnimGroupName -> Anim.Engine.Keyframe.AnimState -> Anim.Engine.Keyframe.AnimState"},{"name":"styleNode","comment":" Get a `<style>` node containing the keyframes for all animations.\n\n    import Anim.Engine.Keyframe as Keyframe\n    import Html exposing (div)\n\n    view model =\n        div []\n            [ Keyframe.styleNode model.animState\n            , ...\n            ]\n\nIf there are no animations, this returns an empty text node.\n\n","type":"Anim.Engine.Keyframe.AnimState -> Html.Html msg"},{"name":"styleNodeFor","comment":" Get a `<style>` node containing keyframes for a specific animation group.\n\n    import Anim.Engine.Keyframe as Keyframe\n    import Html exposing (div)\n\n    view model =\n        div []\n            [ Keyframe.styleNodeFor \"animGroupName\" model.animState\n            , ...\n            ]\n\nIf there are no animations, this returns an empty text node.\n\n","type":"Anim.Engine.Keyframe.AnimGroupName -> Anim.Engine.Keyframe.AnimState -> Html.Html msg"},{"name":"transformOrder","comment":" Set the transform order.\n\nThe transform order specifies how `translate`, `rotate`, `skew` and `scale` transforms\nare combined. Start the list with the transform to apply first.\n\nThis is a precedence function, so it can operate as a global setting for all groups in the\nbuilder chain, or you can set it on a per-group basis which overrides any global setting\nfor that group.\n\nAny missing transforms are automatically appended in the default order\n(`Translate` → `Rotate` → `Skew` → `Scale`).\n\n    import Anim.Engine.Keyframe as Keyframe\n    import Anim.Extra.TransformOrder exposing (TransformProperty(..))\n\n    Keyframe.transformOrder [ Scale, Rotate, Translate, Skew ] -- global setting\n        >> Keyframe.for \"box\"\n        >> Keyframe.transformOrder [ Rotate, Translate ] -- overrides global for this group\n        >> ... -- other builders\n\n","type":"List.List Anim.Extra.TransformOrder.TransformProperty -> Anim.Engine.Keyframe.EngineBuilder -> Anim.Engine.Keyframe.EngineBuilder"},{"name":"update","comment":" Handle messages from this engine.\n\nReturns the updated state and an event for this message, if one should\nbe surfaced.\n\n    import Anim.Engine.Keyframe as Keyframe\n\n    update : Msg -> Model -> ( Model, Cmd Msg )\n    update msg model =\n        case msg of\n            KeyframeMsg animMsg ->\n                let\n                    ( animState, maybeEvent ) =\n                        Keyframe.update animMsg model.animState\n\n                    nextModel =\n                        { model | animState = animState }\n                in\n                case maybeEvent of\n                    Just event ->\n                        handleAnimationEvent event nextModel\n\n                    Nothing ->\n                        ( nextModel, Cmd.none )\n\n    handleAnimationEvent : Keyframe.AnimEvent -> Model -> ( Model, Cmd Msg )\n    handleAnimationEvent event model =\n        case event of\n            ...\n\n","type":"Anim.Engine.Keyframe.AnimMsg -> Anim.Engine.Keyframe.AnimState -> ( Anim.Engine.Keyframe.AnimState, Maybe.Maybe Anim.Engine.Keyframe.AnimEvent )"}],"binops":[]},{"name":"Anim.Engine.ScrollTimeline","comment":" Use scroll position to drive animation progress.\n\nAnimations run automatically as the user scrolls, so you do not need an `AnimState`.\n`update` and `subscriptions` are optional and only matter when you want events.\n\n📖 For setup, browser support, and examples, see the\n[ScrollTimeline Engine Documentation](https://phollyer.github.io/elm-motion/animation/engines/scroll-timeline/)\nand the\n[Engine Overview](https://phollyer.github.io/elm-motion/animation/engines/overview/).\n\n\n# Types\n\n@docs EngineBuilder, AnimGroupName\n\n\n# Target\n\n@docs for\n\n\n# Trigger\n\n📖 See [Triggering Animations](https://phollyer.github.io/elm-motion/animation/workflow/trigger/) for details.\n\n@docs Container\n\n@docs animate\n\n\n# Events\n\n📖 See [Event Reference](https://phollyer.github.io/elm-motion/animation/workflow/react/#event-reference) for details.\n\n@docs AnimEvent\n\n\n## Progress Events\n\n@docs withProgressEvents, setUpdateThrottle\n\n\n# Update\n\n📖 See [React](https://phollyer.github.io/elm-motion/animation/workflow/react/) for details.\n\n@docs AnimMsg, update\n\n\n# Subscriptions\n\n📖 See [Subscriptions](https://phollyer.github.io/elm-motion/animation/engines/scroll-timeline/#subscriptions) for details.\n\n@docs subscriptions\n\n\n# View\n\n📖 See [Render](https://phollyer.github.io/elm-motion/animation/workflow/render/) for details.\n\n@docs attributes\n\n\n# Axis\n\n@docs horizontal\n\n\n# Playback\n\nThese functions are precedence functions, so they can operate as a global setting for all groups in the\nbuilder chain, or you can set them on a per-group basis which overrides any global setting\nfor that group.\n\n    ScrollTimeline.iterations 3 -- global setting\n        >> ScrollTimeline.for \"box\"\n        >> ScrollTimeline.iterations 5 -- overrides global for this group\n        >> ... -- other builders\n\n@docs iterations, alternate\n\n\n# Easing\n\n📖 See [Easing](https://phollyer.github.io/elm-motion/animation/concepts/easing/) for details.\n\n@docs easing\n\n\n# Spring\n\n@docs spring\n\n\n# Unit\n\n@docs cssUnit, cssUnitX, cssUnitY, cssUnitZ, cssUnitWidth, cssUnitHeight\n\n\n# Discrete Properties\n\n@docs discreteEntry, discreteExit\n\n\n# Transform Order\n\n@docs transformOrder\n\n","unions":[{"name":"AnimEvent","comment":" Lifecycle events from the ScrollTimeline engine.\n\n  - `Started String` — the scroll position entered the animation range. Fires every\n    time the timeline re-enters range, not just on the first entry.\n  - `Ended String` — the scroll position reached the end of the animation range\n  - `Cancelled String` — the animation was cancelled (e.g. element removed)\n  - `Iteration String Int` — the animation looped; the `Int` is the cumulative iteration count\n  - `Progress String Float` — the timeline's current progress (0..1) while in range.\n    Only emitted when [`withProgressEvents`](#withProgressEvents) `True` was set on the builder.\n  - `AnimError String` — a message arrived but could not be decoded\n\n","args":[],"cases":[["Run",["Anim.Engine.ScrollTimeline.AnimGroupName"]],["Started",["Anim.Engine.ScrollTimeline.AnimGroupName"]],["Ended",["Anim.Engine.ScrollTimeline.AnimGroupName"]],["Cancelled",["Anim.Engine.ScrollTimeline.AnimGroupName","Basics.Float"]],["Iteration",["Anim.Engine.ScrollTimeline.AnimGroupName","Basics.Int"]],["Progress",["Anim.Engine.ScrollTimeline.AnimGroupName","Basics.Float"]],["AnimError",["String.String"]]]},{"name":"Container","comment":" Identifies the scroll surface handled by the engine.\n\nUse `Document` for the document body, or `Container \"element-id\"` for a\nspecific scrollable element.\n\n","args":[],"cases":[["Document",[]],["Container",["String.String"]]]}],"aliases":[{"name":"AnimGroupName","comment":" Type alias for the animation group name.\n","args":[],"type":"String.String"},{"name":"AnimMsg","comment":" Message type used with `update`.\n\n    type Msg\n        = GotScrollMsg ScrollTimeline.AnimMsg\n        | ...\n\n","args":[],"type":"Anim.Internal.Engine.ScrollTimeline.AnimMsg"},{"name":"EngineBuilder","comment":" Builder type for scroll-driven animations.\n","args":[],"type":"Anim.Internal.Engine.ScrollTimeline.EngineBuilder"}],"values":[{"name":"alternate","comment":" Make an animation alternate direction on each iteration.\n\n`alternate` only has a visible effect when the animation runs more than once,\nso calling it when `iterations` is unset or `1` automatically bumps\n`iterations` to `2`. An explicit `iterations` count set before or after\n`alternate` is preserved.\n\n","type":"Anim.Engine.ScrollTimeline.EngineBuilder -> Anim.Engine.ScrollTimeline.EngineBuilder"},{"name":"animate","comment":" Fire-and-forget scroll-driven animation using the browser's `ScrollTimeline`.\n\n    port motionCmd : Encode.Value -> Cmd msg\n\n    ScrollTimeline.animate motionCmd (Container \"scroller\") <|\n        ScrollTimeline.for \"hero-card\"\n            >> Opacity.begin\n            >> Opacity.from 0\n            >> Opacity.to 1\n            >> Opacity.end\n\n","type":"(Json.Encode.Value -> Platform.Cmd.Cmd msg) -> Anim.Engine.ScrollTimeline.Container -> (Anim.Engine.ScrollTimeline.EngineBuilder -> Anim.Engine.ScrollTimeline.EngineBuilder) -> Platform.Cmd.Cmd msg"},{"name":"attributes","comment":" Attach the animation group identifier to an element.\n\n    div (ScrollTimeline.attributes \"hero-card\") [ ... ]\n\n","type":"Anim.Engine.ScrollTimeline.AnimGroupName -> List.List (Html.Attribute msg)"},{"name":"cssUnit","comment":" Set the default length unit for all length-bearing properties.\n\n    responsivePanelMotion : EngineBuilder -> EngineBuilder\n    responsivePanelMotion =\n        cssUnit Unit.Vw\n            >> slidePanelIn\n            >> growPanelHeight\n\n","type":"Anim.Unit.Unit -> Anim.Engine.ScrollTimeline.EngineBuilder -> Anim.Engine.ScrollTimeline.EngineBuilder"},{"name":"cssUnitHeight","comment":" Set the default length unit used for height values in ScrollTimeline animations.\n\n    responsivePanelHeight : EngineBuilder -> EngineBuilder\n    responsivePanelHeight =\n        cssUnitHeight Unit.Vh\n            >> expandPanelHeight\n            >> alignPanelHeaderY\n\n","type":"Anim.Unit.Unit -> Anim.Engine.ScrollTimeline.EngineBuilder -> Anim.Engine.ScrollTimeline.EngineBuilder"},{"name":"cssUnitWidth","comment":" Set the default length unit used for width values in ScrollTimeline animations.\n\n    responsiveCardWidth : EngineBuilder -> EngineBuilder\n    responsiveCardWidth =\n        cssUnitWidth Unit.Vw\n            >> growCardWidth\n            >> settleCardSpacing\n\n","type":"Anim.Unit.Unit -> Anim.Engine.ScrollTimeline.EngineBuilder -> Anim.Engine.ScrollTimeline.EngineBuilder"},{"name":"cssUnitX","comment":" Set the default length unit for the X axis.\n\n    responsiveDrawerMotion : EngineBuilder -> EngineBuilder\n    responsiveDrawerMotion =\n        cssUnitX Unit.Vw\n            >> slideDrawerX\n            >> alignDrawerLabelX\n\n","type":"Anim.Unit.Unit -> Anim.Engine.ScrollTimeline.EngineBuilder -> Anim.Engine.ScrollTimeline.EngineBuilder"},{"name":"cssUnitY","comment":" Set the default length unit for the Y axis.\n\n    responsiveSheetMotion : EngineBuilder -> EngineBuilder\n    responsiveSheetMotion =\n        cssUnitY Unit.Vh\n            >> slideSheetY\n            >> alignSheetHeaderY\n\n","type":"Anim.Unit.Unit -> Anim.Engine.ScrollTimeline.EngineBuilder -> Anim.Engine.ScrollTimeline.EngineBuilder"},{"name":"cssUnitZ","comment":" Set the default length unit for the Z axis.\n\n    layeredSceneMotion : EngineBuilder -> EngineBuilder\n    layeredSceneMotion =\n        cssUnitZ Unit.Px\n            >> pushSceneBackgroundBack\n            >> bringFloatingCardForward\n\n","type":"Anim.Unit.Unit -> Anim.Engine.ScrollTimeline.EngineBuilder -> Anim.Engine.ScrollTimeline.EngineBuilder"},{"name":"discreteEntry","comment":" Set a discrete CSS property to hold during the animation.\n\nUsed for non-interpolatable properties like `display` or `visibility` that need\nto be set to a specific value while the animation is active.\n\nThis function is a precedence function, so it can operate as a global setting\nfor all groups in the builder chain, or you can set it on a per-group basis\nwhich overrides any global setting for that group.\n\n    ScrollTimeline.animate motionCmd (Container \"scroller\") <|\n        ScrollTimeline.discreteEntry \"display\" \"block\"\n            >> ScrollTimeline.discreteEntry \"visibility\" \"visible\"\n            >> ScrollTimeline.for \"box\"\n            >> Opacity.begin\n            >> Opacity.from 0\n            >> Opacity.to 1\n            >> Opacity.end\n\n","type":"String.String -> String.String -> Anim.Engine.ScrollTimeline.EngineBuilder -> Anim.Engine.ScrollTimeline.EngineBuilder"},{"name":"discreteExit","comment":" Add a discrete CSS property for exit animations.\n\nExit animations need to hold their initial state\nuntil the very end of the animation, at which point they flip to the final state.\nTherefore you need to set both entry and exit values for the property.\n\nThis function is a precedence function, so it can operate as a global setting\nfor all groups in the builder chain, or you can set it on a per-group basis\nwhich overrides any global setting for that group.\n\nUse when an element is disappearing (e.g., going from\n`display: block` to `display: none`).\n\n    import Anim.Engine.ScrollTimeline as ScrollTimeline\n    import Anim.Property.Opacity as Opacity\n\n    ScrollTimeline.animate motionCmd (Container \"scroller\") <|\n        ScrollTimeline.discreteExit \"display\" \"block\" \"none\"\n            >> ScrollTimeline.for \"box\"\n            >> Opacity.begin\n            >> Opacity.to 0\n            >> Opacity.end\n\n","type":"String.String -> String.String -> String.String -> Anim.Engine.ScrollTimeline.EngineBuilder -> Anim.Engine.ScrollTimeline.EngineBuilder"},{"name":"easing","comment":" Set the global easing function.\n\n    heroEntrance : EngineBuilder -> EngineBuilder\n    heroEntrance =\n        easing EaseInOut\n            >> fadeInHeroTitle\n            >> slideInHeroArtwork\n            >> revealPrimaryCta\n\n","type":"Motion.Easing.Easing -> Anim.Engine.ScrollTimeline.EngineBuilder -> Anim.Engine.ScrollTimeline.EngineBuilder"},{"name":"for","comment":" Select the animation group that subsequent property builders will target.\n\n    ScrollTimeline.for \"hero-card\"\n        >> Opacity.begin\n        >> Opacity.from 0\n        >> Opacity.to 1\n        >> Opacity.end\n\n","type":"Anim.Engine.ScrollTimeline.AnimGroupName -> Anim.Engine.ScrollTimeline.EngineBuilder -> Anim.Engine.ScrollTimeline.EngineBuilder"},{"name":"horizontal","comment":" Use horizontal scroll as the timeline source.\n\nVertical scroll is the default, so this is only needed when the\ncontainer scrolls horizontally.\n\n    -- Animate based on horizontal scroll position in a carousel\n    ScrollTimeline.animate motionCmd (Container \"carousel\") <|\n        ScrollTimeline.horizontal\n            >> ScrollTimeline.for \"slide\"\n            >> Opacity.begin\n            >> Opacity.from 0\n            >> Opacity.to 1\n            >> Opacity.end\n\n","type":"Anim.Engine.ScrollTimeline.EngineBuilder -> Anim.Engine.ScrollTimeline.EngineBuilder"},{"name":"iterations","comment":" Set how many times an animation should repeat.\n","type":"Basics.Int -> Anim.Engine.ScrollTimeline.EngineBuilder -> Anim.Engine.ScrollTimeline.EngineBuilder"},{"name":"setUpdateThrottle","comment":" Set the minimum interval in milliseconds between per-frame\n`propertyUpdate` emissions from the JavaScript runtime.\n\nThe visual animation is driven by the browser compositor and is **never**\naffected by this setting - it only controls how much port traffic is generated.\n\nThis is a precedence function, so it can operate as a global setting for all\ngroups in the builder chain, or you can set it on a per-group basis which\noverrides any global setting for that group.\n\n  - Pass `0` (the default) to emit on every `requestAnimationFrame` tick.\n  - Pass a positive number of milliseconds to cap the emission rate, e.g.\n    `16` for ~60 Hz, `33` for ~30 Hz.\n\n**Note**: Higher throttle values reduce Elm-side mid-flight precision for\nqueries and interruption bookkeeping.\n\n    ScrollTimeline.setUpdateThrottle 33 -- global default\n        >> ScrollTimeline.for \"hero\"\n        >> ScrollTimeline.setUpdateThrottle 0 -- dense updates for interactions\n        >> ScrollTimeline.for \"background\"\n        >> ScrollTimeline.setUpdateThrottle 50 -- lower traffic for passive motion\n        >> ... -- other builders\n\n","type":"Basics.Int -> Anim.Engine.ScrollTimeline.EngineBuilder -> Anim.Engine.ScrollTimeline.EngineBuilder"},{"name":"spring","comment":" Set the global spring.\n\n    draggableCardSettle : EngineBuilder -> EngineBuilder\n    draggableCardSettle =\n        spring Spring.wobbly\n            >> settleCardPosition\n            >> settleCardShadow\n\n","type":"Motion.Spring.Spring -> Anim.Engine.ScrollTimeline.EngineBuilder -> Anim.Engine.ScrollTimeline.EngineBuilder"},{"name":"subscriptions","comment":" Subscribe to lifecycle events for this engine.\n\nThis is only required if you want to receive events.\n\n    subscriptions : Model -> Sub Msg\n    subscriptions _ =\n        ScrollTimeline.subscriptions GotScrollMsg motionMsg\n\n","type":"(Anim.Engine.ScrollTimeline.AnimMsg -> msg) -> ((Json.Decode.Value -> msg) -> Platform.Sub.Sub msg) -> Platform.Sub.Sub msg"},{"name":"transformOrder","comment":" Set the transform order.\n\nThe transform order specifies how `translate`, `rotate`, `skew` and `scale` transforms\nare combined. Start the list with the transform to apply first.\n\nThis is a precedence function, so it can operate as a global setting for all groups in the\nbuilder chain, or you can set it on a per-group basis which overrides any global setting\nfor that group.\n\nAny missing transforms are automatically appended in the default order\n(`Translate` → `Rotate` → `Skew` → `Scale`).\n\n    import Anim.Extra.TransformOrder exposing (TransformProperty(..))\n\n    ScrollTimeline.animate motionCmd (Container \"scroller\") <|\n        ScrollTimeline.transformOrder [ Scale, Rotate, Translate, Skew ] -- global setting\n            >> ScrollTimeline.for \"box\"\n            >> ScrollTimeline.transformOrder [ Rotate, Translate ] -- overrides global for this group\n            >> Translate.begin\n            >> Translate.fromXY 0 0\n            >> Translate.toXY 100 0\n            >> Translate.end\n\n","type":"List.List Anim.Extra.TransformOrder.TransformProperty -> Anim.Engine.ScrollTimeline.EngineBuilder -> Anim.Engine.ScrollTimeline.EngineBuilder"},{"name":"update","comment":" Turn an engine message into an event.\n\nMessages that do not belong to this engine return `Nothing`.\n\n    update : Msg -> Model -> ( Model, Cmd Msg )\n    update msg model =\n        case msg of\n            GotScrollMsg animMsg ->\n                case ScrollTimeline.update animMsg of\n                    Just (ScrollTimeline.Ended animGroup) ->\n                        ...\n\n                    _ ->\n                        ( model, Cmd.none )\n\n","type":"Anim.Engine.ScrollTimeline.AnimMsg -> Maybe.Maybe Anim.Engine.ScrollTimeline.AnimEvent"},{"name":"withProgressEvents","comment":" Opt in to per-frame `Progress` events.\n\nOff by default.\n\nProgress events can create a lot of noise in your update loop,\nespecially when debugging the `Msg` flow in your app. Therefore\nthey are suppressed by default and you need to explicitly opt in\nto receive them.\n\nThis is a precedence function, so it can operate as a global setting for all\ngroups in the builder chain, or you can set it on a per-group basis which\noverrides any global setting for that group.\n\n    ScrollTimeline.withProgressEvents True -- global setting\n        >> ScrollTimeline.for \"box\"\n        >> ScrollTimeline.withProgressEvents False -- overrides global for this group\n        >> ... -- other builders\n\n","type":"Basics.Bool -> Anim.Engine.ScrollTimeline.EngineBuilder -> Anim.Engine.ScrollTimeline.EngineBuilder"}],"binops":[]},{"name":"Anim.Engine.Sub","comment":" A pure Elm subscription-based animation engine with full control, looping, and seamless mid-flight interruptions.\n\nThe pure-Elm counterpart to the WAAPI engine. Same feature set — looping, retargeting, per-axis freezing, pause/resume,\nmid-flight queries, springs — but driven by Elm's `update` loop instead of the browser compositor. No JavaScript companion,\nno ports, and interpolated values are available synchronously on every frame.\n\nReach for Sub when you want the WAAPI-like feature set but without the JS dependency.\n\n📖 See\n[Sub Engine Documentation](https://phollyer.github.io/elm-motion/animation/engines/sub/)\nand\n[Engine Overview](https://phollyer.github.io/elm-motion/animation/engines/overview/)\nfor details.\n\n\n# Types\n\n@docs AnimState, AnimGroupName\n\n\n## Builders\n\n@docs AnimBuilder\n\n\n### Engine Builder\n\n@docs EngineBuilder\n\n\n# Initialize\n\n📖 See [Initialize](https://phollyer.github.io/elm-motion/animation/workflow/init/) for details.\n\n@docs init\n\n\n# Target\n\n@docs for\n\n\n# Trigger\n\n📖 See [Triggering Animations](https://phollyer.github.io/elm-motion/animation/workflow/trigger/) for details.\n\n@docs animate, retarget, onResize\n\n\n# Events\n\n@docs AnimEvent\n\n\n## Progress Events\n\n📖 See [Event Reference](https://phollyer.github.io/elm-motion/animation/workflow/react/#event-reference) for details.\n\n@docs withProgressEvents\n\n\n# Update\n\n📖 See [React](https://phollyer.github.io/elm-motion/animation/workflow/react/) for details.\n\n@docs AnimMsg, update\n\n\n# Subscriptions\n\n📖 See [Subscriptions](https://phollyer.github.io/elm-motion/animation/engines/sub/#subscriptions) for details.\n\n@docs subscriptions\n\n\n# View\n\nTo render an animation, add `attributes` to the element you want to animate.\n\n📖 See [Render](https://phollyer.github.io/elm-motion/animation/workflow/render/) for details.\n\n@docs attributes\n\n\n# Playback\n\nThese functions are precedence functions, so they can operate as a global setting for all groups in the\nbuilder chain, or you can set them on a per-group basis which overrides any global setting\nfor that group.\n\n    Sub.iterations 3 -- global setting\n        >> Sub.for \"box\"\n        >> Sub.iterations 5 -- overrides global for this group\n        >> ... -- other builders\n\n@docs iterations, loopForever, alternate\n\n\n# Timing\n\n📖 See [Timing](https://phollyer.github.io/elm-motion/animation/concepts/timing/) for details.\n\n@docs delay, duration, speed\n\n\n# Easing\n\n📖 See [Easing](https://phollyer.github.io/elm-motion/animation/concepts/easing/) for details.\n\n@docs easing\n\n\n# Spring\n\n@docs spring\n\n\n# Unit\n\n@docs cssUnit, cssUnitX, cssUnitY, cssUnitZ, cssUnitWidth, cssUnitHeight\n\n\n# Animation Control\n\n📖 See [Controlling Animations](https://phollyer.github.io/elm-motion/animation/concepts/controlling-animations/) for details.\n\n@docs stop, reset, restart, pause, resume\n\n\n# Discrete Properties\n\n📖 See [Discrete Properties](https://phollyer.github.io/elm-motion/animation/concepts/discrete-properties/) for details.\n\n@docs discreteEntry, discreteExit\n\n\n# Transform Order\n\n📖 See [Transform Ordering](https://phollyer.github.io/elm-motion/animation/concepts/transform-order/) for details.\n\n@docs transformOrder\n\n\n# Freeze\n\nFreeze an axis to hold it in place while other axes or properties animate.\n\nThis is a precedence function, so it can operate as a global setting for all groups in the builder chain, or you\ncan add a per-group freeze on top of the inherited global frozen axes for that group.\n\n    Sub.freezeX [ Sub.translate ] -- global setting\n        >> Sub.for \"box\"\n        >> Sub.freezeY [ Sub.rotate ] -- adds to the inherited global freeze for this group\n        >> ... -- other builders\n\n📖 See [Interrupting Animations](https://phollyer.github.io/elm-motion/animation/concepts/interruptions/) for details.\n\n@docs FreezeProperty, translate, rotate, scale, skew\n\n@docs freezeX, freezeY, freezeZ, freezeXY, freezeXZ, freezeYZ, freezeXYZ\n\n\n# Unfreeze\n\nUnfreeze an axis to allow it to animate.\n\nThis is a precedence function, so it can operate as a global setting for all groups in the builder chain, or you\ncan remove axes on a per-group basis from the inherited global frozen axes for that group.\n\n    Sub.freezeX [ Sub.translate ] -- global freeze setting\n        >> Sub.for \"box\"\n        >> Sub.unfreezeX [ Sub.translate ] -- removes the inherited global freeze for this group\n        >> ... -- other builders\n\n@docs unfreezeX, unfreezeY, unfreezeZ, unfreezeXY, unfreezeXZ, unfreezeYZ, unfreezeXYZ\n\n\n# State Queries\n\n📖 See [State Queries](https://phollyer.github.io/elm-motion/animation/engines/sub/#state-queries) for details.\n\n@docs anyRunning, isRunning, allComplete, isComplete, getProgress\n\n\n## Timing Queries\n\n@docs getDuration, getElapsed, getRemaining\n\n\n# Property Queries\n\n📖 See [Property Queries](https://phollyer.github.io/elm-motion/animation/engines/sub/#property-queries) and\n[Properties](https://phollyer.github.io/elm-motion/animation/properties/getting-started/) for details.\n\n\n## Custom Properties\n\n@docs getPropertyCurrent, getPropertyEnd, getPropertyRange, getPropertyStart\n\n\n## Custom Color Properties\n\n@docs getColorPropertyCurrent, getColorPropertyEnd, getColorPropertyRange, getColorPropertyStart\n\n\n## Opacity\n\n@docs getOpacityRange, getOpacityStart, getOpacityEnd, getOpacityCurrent\n\n\n## Perspective Origin\n\n@docs getPerspectiveOriginRange, getPerspectiveOriginStart, getPerspectiveOriginEnd, getPerspectiveOriginCurrent\n\n\n## Rotate\n\n@docs getRotateRange, getRotateStart, getRotateEnd, getRotateCurrent\n\n\n## Scale\n\n@docs getScaleRange, getScaleStart, getScaleEnd, getScaleCurrent\n\n\n## Size\n\n@docs getSizeRange, getSizeStart, getSizeEnd, getSizeCurrent\n\n\n## Skew\n\n@docs getSkewRange, getSkewStart, getSkewEnd, getSkewCurrent\n\n\n## Translate\n\n@docs getTranslateRange, getTranslateStart, getTranslateEnd, getTranslateCurrent\n\n","unions":[{"name":"AnimEvent","comment":" Subscription animation lifecycle events.\n","args":[],"cases":[["Run",["Anim.Engine.Sub.AnimGroupName"]],["Started",["Anim.Engine.Sub.AnimGroupName"]],["Ended",["Anim.Engine.Sub.AnimGroupName"]],["Cancelled",["Anim.Engine.Sub.AnimGroupName","Basics.Float"]],["Restarted",["Anim.Engine.Sub.AnimGroupName"]],["Paused",["Anim.Engine.Sub.AnimGroupName","Basics.Float"]],["Resumed",["Anim.Engine.Sub.AnimGroupName"]],["Iteration",["Anim.Engine.Sub.AnimGroupName","Basics.Int"]],["Progress",["Anim.Engine.Sub.AnimGroupName","Basics.Float"]]]}],"aliases":[{"name":"AnimBuilder","comment":" Type alias for the base [AnimBuilder](Anim.Builder#AnimBuilder) type.\n","args":["eng"],"type":"Anim.Internal.Engine.Sub.AnimBuilder eng"},{"name":"AnimGroupName","comment":" The name of the animation group you want to target.\n","args":[],"type":"String.String"},{"name":"AnimMsg","comment":" Message type used with `update`.\n\n    import Anim.Engine.Sub as Sub\n\n    type Msg\n        = SubMsg Sub.AnimMsg\n        | ...\n\n","args":[],"type":"Anim.Internal.Engine.Sub.AnimMsg"},{"name":"AnimState","comment":" Holds the Sub engine state.\n\nKeep this in your model.\n\n    type alias Model =\n        { animState : Sub.AnimState }\n\n","args":[],"type":"Anim.Internal.Engine.Sub.AnimState"},{"name":"EngineBuilder","comment":" Builder type for Sub-only builders.\n\nUse this in type annotations when a builder function should only work with this engine.\n\n📖 See [Engine Capabilities](https://phollyer.github.io/elm-motion/animation/concepts/engine-capabilities/)\nfor patterns and examples.\n\n","args":[],"type":"Anim.Internal.Engine.Sub.EngineBuilder"},{"name":"FreezeProperty","comment":" Identifies a property that can be frozen at its current animated position.\n\nUse with [freezeX](#freezeX), [freezeY](#freezeY), etc. to hold specific axes\nat their current values during animation interruptions.\n\n","args":[],"type":"Anim.Internal.Engine.Sub.FreezeProperty"}],"values":[{"name":"allComplete","comment":" Check if all animations are complete.\n\nReturns `Nothing` if there are no animations.\n\n","type":"Anim.Engine.Sub.AnimState -> Maybe.Maybe Basics.Bool"},{"name":"alternate","comment":" Make an animation alternate direction on each iteration.\n\n`alternate` only has a visible effect when the animation runs more than once,\nso calling it when `iterations` is unset or `1` automatically bumps\n`iterations` to `2`. An explicit `iterations` count (or `loopForever`) set\nbefore or after `alternate` is preserved.\n\n","type":"Anim.Engine.Sub.EngineBuilder -> Anim.Engine.Sub.EngineBuilder"},{"name":"animate","comment":" Trigger animations.\n\n    import Anim.Engine.Sub as Sub\n\n    { model\n        | animState =\n            Sub.animate model.animState <|\n                Sub.for \"animGroupName\"\n                    >> entryAnim\n    }\n\n","type":"Anim.Engine.Sub.AnimState -> (Anim.Engine.Sub.EngineBuilder -> Anim.Engine.Sub.EngineBuilder) -> Anim.Engine.Sub.AnimState"},{"name":"anyRunning","comment":" Check if any animations are currently running.\n\nReturns `Nothing` if there are no animations.\n\n","type":"Anim.Engine.Sub.AnimState -> Maybe.Maybe Basics.Bool"},{"name":"attributes","comment":" Apply the animation `attributes` to your element.\n\n    import Anim.Engine.Sub as Sub\n    import Html exposing (div, text)\n\n    div\n        (Sub.attributes \"animGroupName\" animState)\n        [ text \"Animating element\" ]\n\n","type":"Anim.Engine.Sub.AnimGroupName -> Anim.Engine.Sub.AnimState -> List.List (Html.Attribute msg)"},{"name":"cssUnit","comment":" Set the default length unit for all length-bearing properties.\n\n    responsivePanelMotion : EngineBuilder -> EngineBuilder\n    responsivePanelMotion =\n        cssUnit Unit.Vw\n            >> slidePanelIn\n            >> growPanelHeight\n\n","type":"Anim.Unit.Unit -> Anim.Engine.Sub.EngineBuilder -> Anim.Engine.Sub.EngineBuilder"},{"name":"cssUnitHeight","comment":" Set the default length unit used for height values in Sub animations.\n\n    responsivePanelHeight : EngineBuilder -> EngineBuilder\n    responsivePanelHeight =\n        cssUnitHeight Unit.Vh\n            >> expandPanelHeight\n            >> alignPanelHeaderY\n\n","type":"Anim.Unit.Unit -> Anim.Engine.Sub.EngineBuilder -> Anim.Engine.Sub.EngineBuilder"},{"name":"cssUnitWidth","comment":" Set the default length unit used for width values in Sub animations.\n\n    responsiveCardWidth : EngineBuilder -> EngineBuilder\n    responsiveCardWidth =\n        cssUnitWidth Unit.Vw\n            >> growCardWidth\n            >> settleCardSpacing\n\n","type":"Anim.Unit.Unit -> Anim.Engine.Sub.EngineBuilder -> Anim.Engine.Sub.EngineBuilder"},{"name":"cssUnitX","comment":" Set the default length unit for the X axis.\n\n    responsiveDrawerMotion : EngineBuilder -> EngineBuilder\n    responsiveDrawerMotion =\n        cssUnitX Unit.Vw\n            >> slideDrawerX\n            >> alignDrawerLabelX\n\n","type":"Anim.Unit.Unit -> Anim.Engine.Sub.EngineBuilder -> Anim.Engine.Sub.EngineBuilder"},{"name":"cssUnitY","comment":" Set the default length unit for the Y axis.\n\n    responsiveSheetMotion : EngineBuilder -> EngineBuilder\n    responsiveSheetMotion =\n        cssUnitY Unit.Vh\n            >> slideSheetY\n            >> alignSheetHeaderY\n\n","type":"Anim.Unit.Unit -> Anim.Engine.Sub.EngineBuilder -> Anim.Engine.Sub.EngineBuilder"},{"name":"cssUnitZ","comment":" Set the default length unit for the Z axis.\n\n    layeredSceneMotion : EngineBuilder -> EngineBuilder\n    layeredSceneMotion =\n        cssUnitZ Unit.Px\n            >> pushSceneBackgroundBack\n            >> bringFloatingCardForward\n\n","type":"Anim.Unit.Unit -> Anim.Engine.Sub.EngineBuilder -> Anim.Engine.Sub.EngineBuilder"},{"name":"delay","comment":" Set the global delay for all animations in this builder.\n\n    introAnim : EngineBuilder -> EngineBuilder\n    introAnim =\n        delay 500\n            >> fadeInHeader\n            >> slideInSidebar\n            >> fadeInContent\n\n","type":"Basics.Int -> Anim.Engine.Sub.EngineBuilder -> Anim.Engine.Sub.EngineBuilder"},{"name":"discreteEntry","comment":" Add a discrete CSS property for entry animations.\n\nThe value is applied as an inline style from the first frame and held throughout\nthe animation. Use this when an element is appearing (e.g., going from\n`display: none` to `display: block`).\n\nThis function is a precedence function, so it can operate as a global setting\nfor all groups in the builder chain, or you can set it on a per-group basis\nwhich overrides any global setting for that group.\n\n    import Anim.Engine.Sub as Sub\n    import Anim.Property.Opacity as Opacity\n\n    Sub.animate model.animState <|\n        Sub.discreteEntry \"display\" \"block\"\n            >> Sub.discreteEntry \"visibility\" \"visible\"\n            >> Sub.for \"box\"\n            >> Opacity.begin\n            >> Opacity.to 1\n            >> Opacity.end\n\n","type":"String.String -> String.String -> Anim.Engine.Sub.EngineBuilder -> Anim.Engine.Sub.EngineBuilder"},{"name":"discreteExit","comment":" Add a discrete CSS property for exit animations.\n\nExit animations need to hold their initial state\nuntil the very end of the animation, at which point they flip to the final state.\nTherefore you need to set both entry and exit values for the property.\n\nThis function is a precedence function, so it can operate as a global setting\nfor all groups in the builder chain, or you can set it on a per-group basis\nwhich overrides any global setting for that group.\n\nUse when an element is disappearing (e.g., going from\n`display: block` to `display: none`).\n\n    import Anim.Engine.Sub as Sub\n    import Anim.Property.Opacity as Opacity\n\n    Sub.animate model.animState <|\n        Sub.discreteExit \"display\" \"block\" \"none\"\n            >> Sub.for \"box\"\n            >> Opacity.begin\n            >> Opacity.to 0\n            >> Opacity.end\n\n","type":"String.String -> String.String -> String.String -> Anim.Engine.Sub.EngineBuilder -> Anim.Engine.Sub.EngineBuilder"},{"name":"duration","comment":" Set the global duration for all animations in this builder.\n\n    introAnim : EngineBuilder -> EngineBuilder\n    introAnim =\n        duration 500\n            >> fadeInHeader\n            >> slideInSidebar\n            >> fadeInContent\n\n","type":"Basics.Int -> Anim.Engine.Sub.EngineBuilder -> Anim.Engine.Sub.EngineBuilder"},{"name":"easing","comment":" Set the global easing function.\n\n    heroEntrance : EngineBuilder -> EngineBuilder\n    heroEntrance =\n        easing EaseInOut\n            >> fadeInHeroTitle\n            >> slideInHeroArtwork\n            >> revealPrimaryCta\n\n","type":"Motion.Easing.Easing -> Anim.Engine.Sub.EngineBuilder -> Anim.Engine.Sub.EngineBuilder"},{"name":"for","comment":" Select the animation group that subsequent property builders will target.\n\n    Sub.for \"animGroupName\"\n        >> Opacity.begin\n        >> Opacity.to 0.2\n        >> Opacity.end\n\n","type":"Anim.Engine.Sub.AnimGroupName -> Anim.Engine.Sub.EngineBuilder -> Anim.Engine.Sub.EngineBuilder"},{"name":"freezeX","comment":" Freeze the X axis of the specified properties at their current animated values.\n\nThe named axis indicates which axis will remain frozen while you animate the others.\n\n    import Anim.Engine.Sub as Sub\n    import Anim.Property.Translate as Translate\n\n    Sub.animate model.animState <|\n        Sub.freezeX [ Sub.translate ]\n            >> Sub.for \"box\"\n            >> Translate.begin\n            >> Translate.toY 0\n            >> Translate.end\n\n","type":"List.List Anim.Engine.Sub.FreezeProperty -> Anim.Engine.Sub.EngineBuilder -> Anim.Engine.Sub.EngineBuilder"},{"name":"freezeXY","comment":" Freeze the X and Y axes of the specified properties at their current animated values.\n","type":"List.List Anim.Engine.Sub.FreezeProperty -> Anim.Engine.Sub.EngineBuilder -> Anim.Engine.Sub.EngineBuilder"},{"name":"freezeXYZ","comment":" Freeze all axes of the specified properties at their current animated values.\n","type":"List.List Anim.Engine.Sub.FreezeProperty -> Anim.Engine.Sub.EngineBuilder -> Anim.Engine.Sub.EngineBuilder"},{"name":"freezeXZ","comment":" Freeze the X and Z axes of the specified properties at their current animated values.\n","type":"List.List Anim.Engine.Sub.FreezeProperty -> Anim.Engine.Sub.EngineBuilder -> Anim.Engine.Sub.EngineBuilder"},{"name":"freezeY","comment":" Freeze the Y axis of the specified properties at their current animated values.\n","type":"List.List Anim.Engine.Sub.FreezeProperty -> Anim.Engine.Sub.EngineBuilder -> Anim.Engine.Sub.EngineBuilder"},{"name":"freezeYZ","comment":" Freeze the Y and Z axes of the specified properties at their current animated values.\n","type":"List.List Anim.Engine.Sub.FreezeProperty -> Anim.Engine.Sub.EngineBuilder -> Anim.Engine.Sub.EngineBuilder"},{"name":"freezeZ","comment":" Freeze the Z axis of the specified properties at their current animated values.\n","type":"List.List Anim.Engine.Sub.FreezeProperty -> Anim.Engine.Sub.EngineBuilder -> Anim.Engine.Sub.EngineBuilder"},{"name":"getColorPropertyCurrent","comment":" Get the current interpolated value of a custom color property animation.\n\nThe second argument is the CSS property name.\n\nReturns `Nothing` if the element has no animation for the given custom color property.\n\n","type":"Anim.Engine.Sub.AnimGroupName -> String.String -> Anim.Engine.Sub.AnimState -> Maybe.Maybe Anim.Extra.Color.Color"},{"name":"getColorPropertyEnd","comment":" Get the end value of a custom color property animation.\n\nThe second argument is the CSS property name.\n\nReturns `Nothing` if the element has no animation for the given custom color property.\n\n","type":"Anim.Engine.Sub.AnimGroupName -> String.String -> Anim.Engine.Sub.AnimState -> Maybe.Maybe Anim.Extra.Color.Color"},{"name":"getColorPropertyRange","comment":" Get the custom color property range (start and end) of an element being animated.\n\nThe second argument is the CSS property name.\n\nReturns `Nothing` if the element has no animation for the given custom color property.\n\n","type":"Anim.Engine.Sub.AnimGroupName -> String.String -> Anim.Engine.Sub.AnimState -> Maybe.Maybe { start : Maybe.Maybe Anim.Extra.Color.Color, end : Anim.Extra.Color.Color }"},{"name":"getColorPropertyStart","comment":" Get the start value of a custom color property animation.\n\nThe second argument is the CSS property name.\n\nReturns `Nothing` if the element has no animation for the given custom color property.\n\nReturns `transparent white (rgba 255 255 255 0)` if no explicit start value was set, which is the default when no start value is set.\n\n","type":"Anim.Engine.Sub.AnimGroupName -> String.String -> Anim.Engine.Sub.AnimState -> Maybe.Maybe Anim.Extra.Color.Color"},{"name":"getDuration","comment":" Get the total duration of an animation group, in milliseconds.\n\nThis is the wall-clock time for a single iteration - the longest `delay + duration`\nacross the group's properties. Looping does not multiply it; each iteration reports\nthe same span.\n\nReturns `Nothing` if there are no animations for the group.\n\n    import Anim.Engine.Sub as Sub\n\n    Sub.getDuration \"myAnimation\" model.animState\n    -- Just 600\n\n","type":"Anim.Engine.Sub.AnimGroupName -> Anim.Engine.Sub.AnimState -> Maybe.Maybe Basics.Int"},{"name":"getElapsed","comment":" Get the elapsed time of an animation group within its current iteration, in milliseconds.\n\nCounts from the moment the animation is triggered, so it includes any `delay` before motion\nbegins. Resets to `0` at each iteration boundary and never exceeds `getDuration`.\n\nReturns `Nothing` if there are no animations for the group.\n\n    import Anim.Engine.Sub as Sub\n\n    Sub.getElapsed \"myAnimation\" model.animState\n    -- Just 300 (halfway through a 600ms animation)\n\n","type":"Anim.Engine.Sub.AnimGroupName -> Anim.Engine.Sub.AnimState -> Maybe.Maybe Basics.Int"},{"name":"getOpacityCurrent","comment":" Get the current opacity of an element based on its animation state.\n\nReturns `Nothing` if the element has no opacity animation.\n\nReturns the start opacity if the animation has not started yet.\n\nReturns the current interpolated opacity if the animation is running.\n\nReturns the end opacity if the animation has completed.\n\n","type":"Anim.Engine.Sub.AnimGroupName -> Anim.Engine.Sub.AnimState -> Maybe.Maybe Basics.Float"},{"name":"getOpacityEnd","comment":" Get the end opacity of an element being animated.\n\nReturns `Nothing` if the element has no opacity animation.\n\n","type":"Anim.Engine.Sub.AnimGroupName -> Anim.Engine.Sub.AnimState -> Maybe.Maybe Basics.Float"},{"name":"getOpacityRange","comment":" Get the opacity range (start and end) of an element being animated.\n\nReturns `Nothing` if the element has no opacity animation.\n\n","type":"Anim.Engine.Sub.AnimGroupName -> Anim.Engine.Sub.AnimState -> Maybe.Maybe { start : Maybe.Maybe Basics.Float, end : Basics.Float }"},{"name":"getOpacityStart","comment":" Get the start opacity of an element being animated.\n\nReturns `Nothing` if the element has no opacity animation.\n\nReturns `Just 1.0` (fully opaque) if no explicit start value was set, which is the default when no start value is set.\n\n","type":"Anim.Engine.Sub.AnimGroupName -> Anim.Engine.Sub.AnimState -> Maybe.Maybe Basics.Float"},{"name":"getPerspectiveOriginCurrent","comment":" Get the current perspective origin of an element based on its animation state.\n\nReturns `Nothing` if the element has no perspective origin animation.\n\nReturns the start perspective origin if the animation has not started yet.\n\nReturns the current interpolated perspective origin if the animation is running.\n\nReturns the end perspective origin if the animation has completed.\n\n","type":"Anim.Engine.Sub.AnimGroupName -> Anim.Engine.Sub.AnimState -> Maybe.Maybe { x : Basics.Float, y : Basics.Float }"},{"name":"getPerspectiveOriginEnd","comment":" Get the end perspective origin of an element being animated.\n\nReturns `Nothing` if the element has no perspective origin animation.\n\n","type":"Anim.Engine.Sub.AnimGroupName -> Anim.Engine.Sub.AnimState -> Maybe.Maybe { x : Basics.Float, y : Basics.Float }"},{"name":"getPerspectiveOriginRange","comment":" Get the perspective origin range (start and end) of an element being animated.\n\nReturns `Nothing` if the element has no perspective origin animation.\n\n","type":"Anim.Engine.Sub.AnimGroupName -> Anim.Engine.Sub.AnimState -> Maybe.Maybe { start : Maybe.Maybe { x : Basics.Float, y : Basics.Float }, end : { x : Basics.Float, y : Basics.Float } }"},{"name":"getPerspectiveOriginStart","comment":" Get the start perspective origin of an element being animated.\n\nReturns `Nothing` if the element has no perspective origin animation.\n\nReturns `Just { x = 50, y = 50 }` if no explicit start value was set, which is the default when no start value is set.\n\n","type":"Anim.Engine.Sub.AnimGroupName -> Anim.Engine.Sub.AnimState -> Maybe.Maybe { x : Basics.Float, y : Basics.Float }"},{"name":"getProgress","comment":" Get the current progress of an animation group as a value from 0.0 to 1.0.\n\nReturns `Nothing` if there are no animations for the group.\n\n    import Anim.Engine.Sub as Sub\n\n    Sub.getProgress \"myAnimation\" model.animState\n    -- Just 0.5 (halfway through)\n\n","type":"Anim.Engine.Sub.AnimGroupName -> Anim.Engine.Sub.AnimState -> Maybe.Maybe Basics.Float"},{"name":"getPropertyCurrent","comment":" Get the current interpolated value of a custom property animation.\n\nThe second argument is the CSS property name.\n\nReturns `Nothing` if the element has no animation for the given custom property.\n\n","type":"Anim.Engine.Sub.AnimGroupName -> String.String -> Anim.Engine.Sub.AnimState -> Maybe.Maybe Basics.Float"},{"name":"getPropertyEnd","comment":" Get the end value of a custom property animation.\n\nThe second argument is the CSS property name.\n\nReturns `Nothing` if the element has no animation for the given custom property.\n\n","type":"Anim.Engine.Sub.AnimGroupName -> String.String -> Anim.Engine.Sub.AnimState -> Maybe.Maybe Basics.Float"},{"name":"getPropertyRange","comment":" Get the custom property range (start and end) of an element being animated.\n\nThe second argument is the CSS property name.\n\nReturns `Nothing` if the element has no animation for the given custom property.\n\n","type":"Anim.Engine.Sub.AnimGroupName -> String.String -> Anim.Engine.Sub.AnimState -> Maybe.Maybe { start : Maybe.Maybe Basics.Float, end : Basics.Float }"},{"name":"getPropertyStart","comment":" Get the start value of a custom property animation.\n\nThe second argument is the CSS property name.\n\nReturns `Nothing` if the element has no animation for the given custom property.\n\nReturns `Just 0` if no explicit start value was set, which is the default when no start value is set.\n\n","type":"Anim.Engine.Sub.AnimGroupName -> String.String -> Anim.Engine.Sub.AnimState -> Maybe.Maybe Basics.Float"},{"name":"getRemaining","comment":" Get the remaining time of an animation group within its current iteration, in milliseconds.\n\nEqual to `getDuration - getElapsed`, clamped at `0`.\n\nReturns `Nothing` if there are no animations for the group.\n\n    import Anim.Engine.Sub as Sub\n\n    Sub.getRemaining \"myAnimation\" model.animState\n    -- Just 300 (halfway through a 600ms animation)\n\n","type":"Anim.Engine.Sub.AnimGroupName -> Anim.Engine.Sub.AnimState -> Maybe.Maybe Basics.Int"},{"name":"getRotateCurrent","comment":" Get the current rotation of an element based on its animation state.\n\nReturns `Nothing` if the element has no rotate animation.\n\nReturns the start rotation if the animation has not started yet.\n\nReturns the current interpolated rotation if the animation is running.\n\nReturns the end rotation if the animation has completed.\n\n","type":"Anim.Engine.Sub.AnimGroupName -> Anim.Engine.Sub.AnimState -> Maybe.Maybe { x : Basics.Float, y : Basics.Float, z : Basics.Float }"},{"name":"getRotateEnd","comment":" Get the end rotation of an element being animated.\n\nReturns `Nothing` if the element has no rotate animation.\n\n","type":"Anim.Engine.Sub.AnimGroupName -> Anim.Engine.Sub.AnimState -> Maybe.Maybe { x : Basics.Float, y : Basics.Float, z : Basics.Float }"},{"name":"getRotateRange","comment":" Get the rotate range (start and end) of an element being animated.\n\nReturns `Nothing` if the element has no rotate animation.\n\n","type":"Anim.Engine.Sub.AnimGroupName -> Anim.Engine.Sub.AnimState -> Maybe.Maybe { start : Maybe.Maybe { x : Basics.Float, y : Basics.Float, z : Basics.Float }, end : { x : Basics.Float, y : Basics.Float, z : Basics.Float } }"},{"name":"getRotateStart","comment":" Get the start rotation of an element being animated.\n\nReturns `Nothing` if the element has no rotate animation.\n\nReturns `Just { x = 0, y = 0, z = 0 }` if no explicit start value was set, which is the default when no start value is set.\n\n","type":"Anim.Engine.Sub.AnimGroupName -> Anim.Engine.Sub.AnimState -> Maybe.Maybe { x : Basics.Float, y : Basics.Float, z : Basics.Float }"},{"name":"getScaleCurrent","comment":" Get the current scale of an element based on its animation state.\n\nReturns `Nothing` if the element has no scale animation.\n\nReturns the start scale if the animation has not started yet.\n\nReturns the current interpolated scale if the animation is running.\n\nReturns the end scale if the animation has completed.\n\n","type":"Anim.Engine.Sub.AnimGroupName -> Anim.Engine.Sub.AnimState -> Maybe.Maybe { x : Basics.Float, y : Basics.Float, z : Basics.Float }"},{"name":"getScaleEnd","comment":" Get the end scale of an element being animated.\n\nReturns `Nothing` if the element has no scale animation.\n\n","type":"Anim.Engine.Sub.AnimGroupName -> Anim.Engine.Sub.AnimState -> Maybe.Maybe { x : Basics.Float, y : Basics.Float, z : Basics.Float }"},{"name":"getScaleRange","comment":" Get the scale range (start and end) of an element being animated.\n\nReturns `Nothing` if the element has no scale animation.\n\n","type":"Anim.Engine.Sub.AnimGroupName -> Anim.Engine.Sub.AnimState -> Maybe.Maybe { start : Maybe.Maybe { x : Basics.Float, y : Basics.Float, z : Basics.Float }, end : { x : Basics.Float, y : Basics.Float, z : Basics.Float } }"},{"name":"getScaleStart","comment":" Get the start scale of an element being animated.\n\nReturns `Nothing` if the element has no scale animation.\n\nReturns `Just { x = 1, y = 1, z = 1 }` if no explicit start value was set, which is the default when no start value is set.\n\n","type":"Anim.Engine.Sub.AnimGroupName -> Anim.Engine.Sub.AnimState -> Maybe.Maybe { x : Basics.Float, y : Basics.Float, z : Basics.Float }"},{"name":"getSizeCurrent","comment":" Get the current size of an element based on its animation state.\n\nReturns `Nothing` if the element has no size animation.\n\nReturns the start size if the animation has not started yet.\n\nReturns the current interpolated size if the animation is running.\n\nReturns the end size if the animation has completed.\n\n","type":"Anim.Engine.Sub.AnimGroupName -> Anim.Engine.Sub.AnimState -> Maybe.Maybe { width : Basics.Float, height : Basics.Float }"},{"name":"getSizeEnd","comment":" Get the end size of an element being animated.\n\nReturns `Nothing` if the element has no size animation.\n\n","type":"Anim.Engine.Sub.AnimGroupName -> Anim.Engine.Sub.AnimState -> Maybe.Maybe { width : Basics.Float, height : Basics.Float }"},{"name":"getSizeRange","comment":" Get the size range (start and end) of an element being animated.\n\nReturns `Nothing` if the element has no size animation.\n\n","type":"Anim.Engine.Sub.AnimGroupName -> Anim.Engine.Sub.AnimState -> Maybe.Maybe { start : Maybe.Maybe { width : Basics.Float, height : Basics.Float }, end : { width : Basics.Float, height : Basics.Float } }"},{"name":"getSizeStart","comment":" Get the start size of an element being animated.\n\nReturns `Nothing` if the element has no size animation.\n\nReturns `Just { width = 0, height = 0 }` if no explicit start value was set, which is the default when no start value is set.\n\n","type":"Anim.Engine.Sub.AnimGroupName -> Anim.Engine.Sub.AnimState -> Maybe.Maybe { width : Basics.Float, height : Basics.Float }"},{"name":"getSkewCurrent","comment":" Get the current skew of an element based on its animation state.\n\nReturns `Nothing` if the element has no skew animation.\n\nReturns the start skew if the animation has not started yet.\n\nReturns the current interpolated skew if the animation is running.\n\nReturns the end skew if the animation has completed.\n\n","type":"Anim.Engine.Sub.AnimGroupName -> Anim.Engine.Sub.AnimState -> Maybe.Maybe { x : Basics.Float, y : Basics.Float }"},{"name":"getSkewEnd","comment":" Get the end skew of an element being animated.\n\nReturns `Nothing` if the element has no skew animation.\n\n","type":"Anim.Engine.Sub.AnimGroupName -> Anim.Engine.Sub.AnimState -> Maybe.Maybe { x : Basics.Float, y : Basics.Float }"},{"name":"getSkewRange","comment":" Get the skew range (start and end) of an element being animated.\n\nReturns `Nothing` if the element has no skew animation.\n\n","type":"Anim.Engine.Sub.AnimGroupName -> Anim.Engine.Sub.AnimState -> Maybe.Maybe { start : Maybe.Maybe { x : Basics.Float, y : Basics.Float }, end : { x : Basics.Float, y : Basics.Float } }"},{"name":"getSkewStart","comment":" Get the start skew of an element being animated.\n\nReturns `Nothing` if the element has no skew animation.\n\n","type":"Anim.Engine.Sub.AnimGroupName -> Anim.Engine.Sub.AnimState -> Maybe.Maybe { x : Basics.Float, y : Basics.Float }"},{"name":"getTranslateCurrent","comment":" Get the current translate of an element based on its animation state.\n\nReturns `Nothing` if the element has no translate animation.\n\nReturns the start translate if the animation has not started yet.\n\nReturns the current interpolated translate if the animation is running.\n\nReturns the end translate if the animation has completed.\n\n","type":"Anim.Engine.Sub.AnimGroupName -> Anim.Engine.Sub.AnimState -> Maybe.Maybe { x : Basics.Float, y : Basics.Float, z : Basics.Float }"},{"name":"getTranslateEnd","comment":" Get the end translate of an element being animated.\n\nReturns `Nothing` if the element has no translate animation.\n\n","type":"Anim.Engine.Sub.AnimGroupName -> Anim.Engine.Sub.AnimState -> Maybe.Maybe { x : Basics.Float, y : Basics.Float, z : Basics.Float }"},{"name":"getTranslateRange","comment":" Get the translate range (start and end) of an element being animated.\n\nReturns `Nothing` if the element has no translate animation.\n\n","type":"Anim.Engine.Sub.AnimGroupName -> Anim.Engine.Sub.AnimState -> Maybe.Maybe { start : Maybe.Maybe { x : Basics.Float, y : Basics.Float, z : Basics.Float }, end : { x : Basics.Float, y : Basics.Float, z : Basics.Float } }"},{"name":"getTranslateStart","comment":" Get the start translate of an element being animated.\n\nReturns `Nothing` if the element has no translate animation.\n\nReturns `Just {x = 0, y = 0, z = 0}` if no explicit start value was set, which is the default when no start value is set.\n\n","type":"Anim.Engine.Sub.AnimGroupName -> Anim.Engine.Sub.AnimState -> Maybe.Maybe { x : Basics.Float, y : Basics.Float, z : Basics.Float }"},{"name":"init","comment":" Initialize the engine state with a list of property initializers.\n\n    import Anim.Engine.Sub as Sub\n    import Anim.Property.Opacity as Opacity\n\n    Sub.init\n        [ Opacity.init \"animGroupName\" 0.5\n        , ... -- other property initializers\n        ]\n\n","type":"List.List (Anim.Engine.Sub.EngineBuilder -> Anim.Engine.Sub.EngineBuilder) -> Anim.Engine.Sub.AnimState"},{"name":"isComplete","comment":" Check if a specific animation group has completed.\n\nReturns `Nothing` if there are no animations for the group.\n\n","type":"Anim.Engine.Sub.AnimGroupName -> Anim.Engine.Sub.AnimState -> Maybe.Maybe Basics.Bool"},{"name":"isRunning","comment":" Check if a specific animation group is currently running.\n\nReturns `Nothing` if there are no animations for the group.\n\n","type":"Anim.Engine.Sub.AnimGroupName -> Anim.Engine.Sub.AnimState -> Maybe.Maybe Basics.Bool"},{"name":"iterations","comment":" Set how many times an animation should repeat.\n","type":"Basics.Int -> Anim.Engine.Sub.EngineBuilder -> Anim.Engine.Sub.EngineBuilder"},{"name":"loopForever","comment":" Make an animation loop infinitely.\n","type":"Anim.Engine.Sub.EngineBuilder -> Anim.Engine.Sub.EngineBuilder"},{"name":"onResize","comment":" Update one or more animation groups after a layout change, or resize event.\n\nUse this to set the new pixel bounds for your animation groups, and the animations\nwill adjust proportionally to the new bounds.\n\nTypical resize handler:\n\n    import Anim.Engine.Sub as Sub\n    import Anim.Property.Translate as Translate\n\n    GotTrack (Ok { element }) ->\n        let\n            bounds =\n                { x = Just { min = 0, max = element.width - boxSize }\n                , y = Nothing\n                , z = Nothing\n                }\n        in\n        ( { model\n            | trackPx = element.element.width\n            , animState =\n                Sub.onResize model.animState <|\n                    Translate.bounds \"boxAnim\" bounds\n                        >> Translate.bounds \"cardAnim\" bounds\n          }\n        , Cmd.none\n        )\n\n**Note**: all `bounds` are pixel values, regardless of the CSS unit used in your builder.\nIt makes no sense to remap relative units, that's the browser's job, so this function will\nonly target pixel values. Any non-pixel units are ignored. So if \"boxAnim\" is using `Unit.Cqh`\nfor its axes, any new `bounds` will be ignored and the animation will continue as before.\n\n📖 For resize strategies and examples, see\n[Responsive Animations](https://phollyer.github.io/elm-motion/animation/concepts/responsive-animations/).\n\n","type":"Anim.Engine.Sub.AnimState -> (Anim.Engine.Sub.AnimBuilder Anim.Internal.Builder.ForResizeSub -> Anim.Engine.Sub.AnimBuilder Anim.Internal.Builder.ForResizeSub) -> Anim.Engine.Sub.AnimState"},{"name":"pause","comment":" Pause a running animation.\n\n    import Anim.Engine.Sub as Sub\n\n    Sub.pause \"animGroup\" model.animState\n\n","type":"Anim.Engine.Sub.AnimGroupName -> Anim.Engine.Sub.AnimState -> Anim.Engine.Sub.AnimState"},{"name":"reset","comment":" Reset an animation by instantly jumping back to its start state.\n\n    import Anim.Engine.Sub as Sub\n\n    Sub.reset \"animGroup\" model.animState\n\n","type":"Anim.Engine.Sub.AnimGroupName -> Anim.Engine.Sub.AnimState -> Anim.Engine.Sub.AnimState"},{"name":"restart","comment":" Restart an animation from the beginning.\n\n    import Anim.Engine.Sub as Sub\n\n    Sub.restart \"animGroup\" model.animState\n\n","type":"Anim.Engine.Sub.AnimGroupName -> Anim.Engine.Sub.AnimState -> Anim.Engine.Sub.AnimState"},{"name":"resume","comment":" Resume a paused animation.\n\n    import Anim.Engine.Sub as Sub\n\n    Sub.resume \"animGroup\" model.animState\n\n","type":"Anim.Engine.Sub.AnimGroupName -> Anim.Engine.Sub.AnimState -> Anim.Engine.Sub.AnimState"},{"name":"retarget","comment":" Change the targeted properties instantly to their new values. If currently animating,\nstop.\n\nThis is a convenience function for immediately snapping properties or axes to new values\nwithout needing to construct a full animation builder with `animate`.\n\nJust target the properties or axes you want to change, and any properties or axes you\ndon't mention will be left untouched - if mid-flight, they will continue.\n\n    import Anim.Engine.Sub as Sub\n    import Anim.Property.Translate as Translate\n\n    { model\n        | animState =\n            Sub.retarget model.animState <|\n                Sub.for \"animGroupName\"\n                    >> Translate.begin\n                    >> Translate.toY 0\n                    >> Translate.end\n    }\n\n","type":"Anim.Engine.Sub.AnimState -> (Anim.Engine.Sub.EngineBuilder -> Anim.Engine.Sub.EngineBuilder) -> Anim.Engine.Sub.AnimState"},{"name":"rotate","comment":" Freeze the rotate property.\n","type":"Anim.Engine.Sub.FreezeProperty"},{"name":"scale","comment":" Freeze the scale property.\n","type":"Anim.Engine.Sub.FreezeProperty"},{"name":"skew","comment":" Freeze the scale property.\n","type":"Anim.Engine.Sub.FreezeProperty"},{"name":"speed","comment":" Set the global speed for all animations in this builder.\n\n    introAnim : EngineBuilder -> EngineBuilder\n    introAnim =\n        speed 300\n            >> slideDownHeader\n            >> slideInSidebar\n            >> slideUpContent\n\n","type":"Basics.Float -> Anim.Engine.Sub.EngineBuilder -> Anim.Engine.Sub.EngineBuilder"},{"name":"spring","comment":" Set the global spring.\n\n    draggableCardSettle : EngineBuilder -> EngineBuilder\n    draggableCardSettle =\n        spring Spring.wobbly\n            >> settleCardPosition\n            >> settleCardShadow\n\n","type":"Motion.Spring.Spring -> Anim.Engine.Sub.EngineBuilder -> Anim.Engine.Sub.EngineBuilder"},{"name":"stop","comment":" Stop a running animation by instantly jumping to its end state.\n\n`stop` is silent — no `Cancelled` event is emitted. `Cancelled` is\nreserved for genuine external interruptions (e.g. browser-level\ncancellation outside the engine's control).\n\n    import Anim.Engine.Sub as Sub\n\n    Sub.stop \"animGroup\" model.animState\n\n","type":"Anim.Engine.Sub.AnimGroupName -> Anim.Engine.Sub.AnimState -> Anim.Engine.Sub.AnimState"},{"name":"subscriptions","comment":" Subscribe to receive animation frame updates.\n\nYour animations will not run without this subscription, and when\nno animations are running, this subscription is silent and has no\nperformance impact.\n\n    import Anim.Engine.Sub as Sub\n\n    type Msg\n        = SubMsg Sub.AnimMsg\n        | ...\n\n    subscriptions : Model -> Sub Msg\n    subscriptions model =\n        Sub.subscriptions SubMsg model.animState\n\n","type":"(Anim.Engine.Sub.AnimMsg -> msg) -> Anim.Engine.Sub.AnimState -> Platform.Sub.Sub msg"},{"name":"transformOrder","comment":" Set the transform order.\n\nThe transform order specifies how `translate`, `rotate`, `skew` and `scale` transforms\nare combined. Start the list with the transform to apply first.\n\nThis is a precedence function, so it can operate as a global setting for all groups in the\nbuilder chain, or you can set it on a per-group basis which overrides any global setting\nfor that group.\n\nAny missing transforms are automatically appended in the default order\n(`Translate` → `Rotate` → `Skew` → `Scale`).\n\n    import Anim.Engine.Sub as Sub\n    import Anim.Extra.TransformOrder exposing (TransformProperty(..))\n\n    Sub.transformOrder [ Scale, Rotate, Translate, Skew ] -- global setting\n        >> Sub.for \"box\"\n        >> Sub.transformOrder [ Rotate, Translate ] -- overrides global for this group\n        >> ... -- other builders\n\n","type":"List.List Anim.Extra.TransformOrder.TransformProperty -> Anim.Engine.Sub.EngineBuilder -> Anim.Engine.Sub.EngineBuilder"},{"name":"translate","comment":" Freeze the translate property.\n","type":"Anim.Engine.Sub.FreezeProperty"},{"name":"unfreezeX","comment":" Unfreeze the X axis of the specified properties, allowing it to animate again.\n","type":"List.List Anim.Engine.Sub.FreezeProperty -> Anim.Engine.Sub.EngineBuilder -> Anim.Engine.Sub.EngineBuilder"},{"name":"unfreezeXY","comment":" Unfreeze the X and Y axes of the specified properties.\n","type":"List.List Anim.Engine.Sub.FreezeProperty -> Anim.Engine.Sub.EngineBuilder -> Anim.Engine.Sub.EngineBuilder"},{"name":"unfreezeXYZ","comment":" Unfreeze all axes of the specified properties.\n","type":"List.List Anim.Engine.Sub.FreezeProperty -> Anim.Engine.Sub.EngineBuilder -> Anim.Engine.Sub.EngineBuilder"},{"name":"unfreezeXZ","comment":" Unfreeze the X and Z axes of the specified properties.\n","type":"List.List Anim.Engine.Sub.FreezeProperty -> Anim.Engine.Sub.EngineBuilder -> Anim.Engine.Sub.EngineBuilder"},{"name":"unfreezeY","comment":" Unfreeze the Y axis of the specified properties, allowing it to animate again.\n","type":"List.List Anim.Engine.Sub.FreezeProperty -> Anim.Engine.Sub.EngineBuilder -> Anim.Engine.Sub.EngineBuilder"},{"name":"unfreezeYZ","comment":" Unfreeze the Y and Z axes of the specified properties.\n","type":"List.List Anim.Engine.Sub.FreezeProperty -> Anim.Engine.Sub.EngineBuilder -> Anim.Engine.Sub.EngineBuilder"},{"name":"unfreezeZ","comment":" Unfreeze the Z axis of the specified properties, allowing it to animate again.\n","type":"List.List Anim.Engine.Sub.FreezeProperty -> Anim.Engine.Sub.EngineBuilder -> Anim.Engine.Sub.EngineBuilder"},{"name":"update","comment":" Handle animation lifecycle messages.\n\nReturns the updated state and a list of [AnimEvent](#AnimEvent)s for you to pattern match on.\n\n    import Anim.Engine.Sub as Sub\n\n    update : Msg -> Model -> ( Model, Cmd Msg )\n    update msg model =\n        case msg of\n            SubMsg animMsg ->\n                let\n                    ( animState, events ) =\n                        Sub.update animMsg model.animState\n                in\n                ( List.foldl handleEvent { model | animState = animState } events\n                , Cmd.none\n                )\n\n    handleEvent : Sub.AnimEvent -> (Model, Cmd Msg) -> ( Model, Cmd Msg )\n    handleEvent event (model, cmd) =\n        case event of\n            ...\n\n","type":"Anim.Engine.Sub.AnimMsg -> Anim.Engine.Sub.AnimState -> ( Anim.Engine.Sub.AnimState, List.List Anim.Engine.Sub.AnimEvent )"},{"name":"withProgressEvents","comment":" Opt in to per-frame `Progress` events.\n\nOff by default.\n\nProgress events can create a lot of noise in your update loop,\nespecially when debugging the `Msg` flow in your app. Therefore\nthey are suppressed by default and you need to explicitly opt in\nto receive them.\n\nThis is a precedence function, so it can operate as a global setting for all\ngroups in the builder chain, or you can set it on a per-group basis which\noverrides any global setting for that group.\n\n    Sub.withProgressEvents True -- global setting\n        >> Sub.for \"box\"\n        >> Sub.withProgressEvents False -- overrides global for this group\n        >> ... -- other builders\n\n","type":"Basics.Bool -> Anim.Engine.Sub.EngineBuilder -> Anim.Engine.Sub.EngineBuilder"}],"binops":[]},{"name":"Anim.Engine.Transition","comment":" CSS transitions for simple A→B animations with browser-native performance.\n\nThis engine is a good fit for hover effects, focus effects, and other simple state changes.\n\n📖 See\n[Transition Engine Documentation](https://phollyer.github.io/elm-motion/animation/engines/transition/)\nand\n[Engine Overview](https://phollyer.github.io/elm-motion/animation/engines/overview/)\nfor details.\n\n\n# Types\n\n@docs AnimState, AnimGroupName\n\n\n## Builders\n\n@docs AnimBuilder\n\n\n### Engine Builder\n\n@docs EngineBuilder\n\n\n# Initialize\n\n📖 See [Initialize](https://phollyer.github.io/elm-motion/animation/workflow/init/) for details.\n\n@docs init\n\n\n# Target\n\n@docs for\n\n\n# Trigger\n\n📖 See [Triggering Animations](https://phollyer.github.io/elm-motion/animation/workflow/trigger/) for details.\n\n@docs animate, retarget\n\n\n# Events\n\n📖 See [Event Reference](https://phollyer.github.io/elm-motion/animation/workflow/react/#event-reference) for details.\n\n@docs CurrentTargetId, TargetId, AnimEvent\n\n\n# Update\n\n📖 See [React](https://phollyer.github.io/elm-motion/animation/workflow/react/) for details.\n\n@docs AnimMsg, update\n\n\n# View\n\nTo render a transition, add `attributes` to the element you want to animate.\n\n📖 See [Render](https://phollyer.github.io/elm-motion/animation/workflow/render/) for details.\n\n@docs attributes\n\n\n# Event Listeners\n\n@docs events, eventsStopPropagation\n\n\n# Unit\n\n@docs cssUnit, cssUnitX, cssUnitY, cssUnitZ, cssUnitWidth, cssUnitHeight\n\n\n# Timing\n\n📖 See [Timing](https://phollyer.github.io/elm-motion/animation/concepts/timing/) for details.\n\n@docs delay, duration, speed\n\n\n# Easing\n\n📖 See [Easing](https://phollyer.github.io/elm-motion/animation/concepts/easing/) for details.\n\n@docs easing\n\n\n# Animation Control\n\n📖 See [Controlling Animations](https://phollyer.github.io/elm-motion/animation/concepts/controlling-animations/) for details.\n\n@docs stop, reset\n\n\n# Discrete Properties\n\n📖 See [Discrete Properties](https://phollyer.github.io/elm-motion/animation/concepts/discrete-properties/) for details.\n\n**Note**: You must have [Event Listeners](#event-listeners) set up so that the Engine can handle discrete property changes.\n\n@docs discreteEntry, startingStyleNode, startingStyleNodeFor, discreteExit\n\n\n# State Queries\n\n📖 See [State Queries](https://phollyer.github.io/elm-motion/animation/engines/transition/#state-queries) for details.\n\n@docs anyRunning, isRunning, allComplete, isComplete, isCancelled\n\n\n# Property Queries\n\n📖 See [Property Queries](https://phollyer.github.io/elm-motion/animation/engines/transition/#property-queries) and\n[Properties](https://phollyer.github.io/elm-motion/animation/properties/getting-started/) for details.\n\n\n## Custom Properties\n\n@docs getPropertyEnd\n\n\n## Custom Color Properties\n\n@docs getColorPropertyEnd\n\n\n## Opacity\n\n@docs getOpacityEnd\n\n\n## Perspective Origin\n\n@docs getPerspectiveOriginEnd\n\n\n## Rotate\n\n@docs getRotateEnd\n\n\n## Scale\n\n@docs getScaleEnd\n\n\n## Size\n\n@docs getSizeEnd\n\n\n## Skew\n\n@docs getSkewEnd\n\n\n## Translate\n\n@docs getTranslateEnd\n\n","unions":[{"name":"AnimEvent","comment":" CSS transition lifecycle events.\n","args":[],"cases":[["Started",["Anim.Engine.Transition.CurrentTargetId","Anim.Engine.Transition.TargetId","Anim.Engine.Transition.AnimGroupName"]],["Ended",["Anim.Engine.Transition.CurrentTargetId","Anim.Engine.Transition.TargetId","Anim.Engine.Transition.AnimGroupName"]],["Cancelled",["Anim.Engine.Transition.CurrentTargetId","Anim.Engine.Transition.TargetId","Anim.Engine.Transition.AnimGroupName"]],["Run",["Anim.Engine.Transition.CurrentTargetId","Anim.Engine.Transition.TargetId","Anim.Engine.Transition.AnimGroupName"]]]}],"aliases":[{"name":"AnimBuilder","comment":" Type alias for the base [AnimBuilder](Anim.Builder#AnimBuilder) type.\n","args":["eng"],"type":"Anim.Internal.Engine.Transition.AnimBuilder eng"},{"name":"AnimGroupName","comment":" The name of the animation group you want to target.\n","args":[],"type":"String.String"},{"name":"AnimMsg","comment":" Message type used with `update`.\n\n    import Anim.Engine.Transition as Transition\n\n    type Msg\n        = TransitionMsg Transition.AnimMsg\n        | ...\n\n","args":[],"type":"Anim.Internal.Engine.Transition.AnimMsg"},{"name":"AnimState","comment":" Holds the Transition engine state.\n\nKeep this in your model.\n\n    type alias Model =\n        { animState : Transition.AnimState }\n\n","args":[],"type":"Anim.Internal.Engine.Transition.AnimState"},{"name":"CurrentTargetId","comment":" The ID of the element that owns the event listener.\n","args":[],"type":"Maybe.Maybe String.String"},{"name":"EngineBuilder","comment":" Builder type for Transition-only builders.\n\nUse this in type annotations when a builder function should only work with this engine.\n\n📖 See [Engine Capabilities](https://phollyer.github.io/elm-motion/animation/concepts/engine-capabilities/)\nfor patterns and examples.\n\n","args":[],"type":"Anim.Internal.Engine.Transition.EngineBuilder"},{"name":"TargetId","comment":" The ID of the element that started the event.\n\nThis will be different from `CurrentTargetId` if the event bubbled from a child element.\n\n","args":[],"type":"Maybe.Maybe String.String"}],"values":[{"name":"allComplete","comment":" Check if all animations are complete.\n\nReturns `Nothing` if there are no animations.\n\n","type":"Anim.Engine.Transition.AnimState -> Maybe.Maybe Basics.Bool"},{"name":"animate","comment":" Trigger animations.\n\n    import Anim.Engine.Transition as Transition\n\n    { model\n        | animState = Transition.animate model.animState entryAnim\n    }\n\n","type":"Anim.Engine.Transition.AnimState -> (Anim.Engine.Transition.EngineBuilder -> Anim.Engine.Transition.EngineBuilder) -> Anim.Engine.Transition.AnimState"},{"name":"anyRunning","comment":" Check if any animations are currently running.\n\nReturns `Nothing` if there are no animations.\n\n","type":"Anim.Engine.Transition.AnimState -> Maybe.Maybe Basics.Bool"},{"name":"attributes","comment":" Apply the animation `attributes` to your element.\n\n    import Anim.Engine.Transition as Transition\n    import Html exposing (div, text)\n\n    div\n        (Transition.attributes \"animGroupName\" animState)\n        [ text \"Animating element\" ]\n\n","type":"Anim.Engine.Transition.AnimGroupName -> Anim.Engine.Transition.AnimState -> List.List (Html.Attribute msg)"},{"name":"cssUnit","comment":" Set the default length unit for all length-bearing properties.\n\n    responsivePanelMotion : EngineBuilder -> EngineBuilder\n    responsivePanelMotion =\n        cssUnit Unit.Vw\n            >> slidePanelIn\n            >> growPanel\n\n","type":"Anim.Unit.Unit -> Anim.Engine.Transition.EngineBuilder -> Anim.Engine.Transition.EngineBuilder"},{"name":"cssUnitHeight","comment":" Set the default length unit used for height values in Transition animations.\n\n    responsivePanelHeight : EngineBuilder -> EngineBuilder\n    responsivePanelHeight =\n        cssUnitHeight Unit.Vh\n            >> slidePanelIn\n            >> growPanel\n\n","type":"Anim.Unit.Unit -> Anim.Engine.Transition.EngineBuilder -> Anim.Engine.Transition.EngineBuilder"},{"name":"cssUnitWidth","comment":" Set the default length unit used for width values in Transition animations.\n\n    responsiveCardWidth : EngineBuilder -> EngineBuilder\n    responsiveCardWidth =\n        cssUnitWidth Unit.Vw\n            >> slidePanelIn\n            >> growPanel\n\n","type":"Anim.Unit.Unit -> Anim.Engine.Transition.EngineBuilder -> Anim.Engine.Transition.EngineBuilder"},{"name":"cssUnitX","comment":" Set the default length unit for the X axis.\n\n    responsiveDrawerMotion : EngineBuilder -> EngineBuilder\n    responsiveDrawerMotion =\n        cssUnitX Unit.Vw\n            >> slidePanelIn\n            >> growPanel\n\n","type":"Anim.Unit.Unit -> Anim.Engine.Transition.EngineBuilder -> Anim.Engine.Transition.EngineBuilder"},{"name":"cssUnitY","comment":" Set the default length unit for the Y axis.\n\n    responsiveSheetMotion : EngineBuilder -> EngineBuilder\n    responsiveSheetMotion =\n        cssUnitY Unit.Vh\n            >> slidePanelIn\n            >> growPanel\n\n","type":"Anim.Unit.Unit -> Anim.Engine.Transition.EngineBuilder -> Anim.Engine.Transition.EngineBuilder"},{"name":"cssUnitZ","comment":" Set the default length unit for the Z axis.\n\n    layeredSceneMotion : EngineBuilder -> EngineBuilder\n    layeredSceneMotion =\n        cssUnitZ Unit.Px\n            >> slidePanelIn\n            >> growPanel\n\n","type":"Anim.Unit.Unit -> Anim.Engine.Transition.EngineBuilder -> Anim.Engine.Transition.EngineBuilder"},{"name":"delay","comment":" Set the global delay for all animations in this builder.\n\n    introAnim : EngineBuilder -> EngineBuilder\n    introAnim =\n        delay 500\n            >> fadeInHeader\n            >> slideInSidebar\n            >> fadeInContent\n\n","type":"Basics.Int -> Anim.Engine.Transition.EngineBuilder -> Anim.Engine.Transition.EngineBuilder"},{"name":"discreteEntry","comment":" Add a discrete CSS property for entry animations.\n\nThe value is applied as an inline style from the first frame and held throughout\nthe animation. Use this when an element is appearing (e.g., going from\n`display: none` to `display: block`).\n\nThis function is a precedence function, so it can operate as a global setting\nfor all groups in the builder chain, or you can set it on a per-group basis\nwhich overrides any global setting for that group.\n\nFor entry animations, pair this with `startingStyleNode` so the browser knows\nwhat values to transition from.\n\n    import Anim.Engine.Transition as Transition\n    import Anim.Property.Opacity as Opacity\n\n    Transition.animate model.animState <|\n        Transition.discreteEntry \"display\" \"block\"\n            >> Transition.for \"box\"\n            >> Opacity.begin\n            >> Opacity.to 1\n            >> Opacity.end\n\n","type":"String.String -> String.String -> Anim.Engine.Transition.EngineBuilder -> Anim.Engine.Transition.EngineBuilder"},{"name":"discreteExit","comment":" Add a discrete CSS property for exit animations.\n\nExit animations need to hold their initial state\nuntil the very end of the animation, at which point they flip to the final state.\nTherefore you need to set both entry and exit values for the property.\n\nThis function is a precedence function, so it can operate as a global setting\nfor all groups in the builder chain, or you can set it on a per-group basis\nwhich overrides any global setting for that group.\n\nUse when an element is disappearing (e.g., going from\n`display: block` to `display: none`).\n\n    import Anim.Engine.Transition as Transition\n    import Anim.Property.Opacity as Opacity\n\n    Transition.animate model.animState <|\n        Transition.discreteExit \"display\" \"block\" \"none\"\n            >> Transition.for \"box\"\n            >> Opacity.begin\n            >> Opacity.to 0\n            >> Opacity.end\n\n","type":"String.String -> String.String -> String.String -> Anim.Engine.Transition.EngineBuilder -> Anim.Engine.Transition.EngineBuilder"},{"name":"duration","comment":" Set the global duration for all animations in this builder.\n\n    introAnim : EngineBuilder -> EngineBuilder\n    introAnim =\n        duration 500\n            >> fadeInHeader\n            >> slideInSidebar\n            >> fadeInContent\n\n","type":"Basics.Int -> Anim.Engine.Transition.EngineBuilder -> Anim.Engine.Transition.EngineBuilder"},{"name":"easing","comment":" Set the global easing function.\n\n    heroEntrance : EngineBuilder -> EngineBuilder\n    heroEntrance =\n        easing EaseInOut\n            >> fadeInHeroTitle\n            >> slideInHeroArtwork\n            >> revealPrimaryCta\n\n","type":"Motion.Easing.Easing -> Anim.Engine.Transition.EngineBuilder -> Anim.Engine.Transition.EngineBuilder"},{"name":"events","comment":" Receive transition lifecycle events.\n\nAdd `events` to your element with a message constructor that wraps `AnimMsg`.\n\n    import Anim.Engine.Transition as Transition\n    import Html exposing (div, text)\n\n    type Msg\n        = TransitionMsg Transition.AnimMsg\n\n    div\n        (Transition.attributes \"animGroupName\" animState\n            ++ Transition.events TransitionMsg\n        )\n        [ text \"Animating element\" ]\n\n","type":"(Anim.Engine.Transition.AnimMsg -> msg) -> List.List (Html.Attribute msg)"},{"name":"eventsStopPropagation","comment":" The same as [events](#events) but with propagation stopped.\n\n    import Anim.Engine.Transition as Transition\n    import Html exposing (div, text)\n\n    div\n        (Transition.attributes \"animGroupName\" model.animState\n            ++ Transition.eventsStopPropagation TransitionMsg\n        )\n        [ text \"Animated element\" ]\n\n","type":"(Anim.Engine.Transition.AnimMsg -> msg) -> List.List (Html.Attribute msg)"},{"name":"for","comment":" Select the animation group that subsequent property builders will target.\n\n    Transition.for \"animGroupName\"\n        >> Opacity.begin\n        >> Opacity.to 0.2\n        >> Opacity.end\n\n","type":"Anim.Engine.Transition.AnimGroupName -> Anim.Engine.Transition.EngineBuilder -> Anim.Engine.Transition.EngineBuilder"},{"name":"getColorPropertyEnd","comment":" Get the end value of a custom color property animation.\n\nThe second argument is the CSS property name.\n\nReturns `Nothing` if the element has no animation for the given custom color property.\n\n","type":"Anim.Engine.Transition.AnimGroupName -> String.String -> Anim.Engine.Transition.AnimState -> Maybe.Maybe Anim.Extra.Color.Color"},{"name":"getOpacityEnd","comment":" Get the end opacity of an element being animated.\n\nReturns `Nothing` if the element has no opacity animation.\n\n","type":"Anim.Engine.Transition.AnimGroupName -> Anim.Engine.Transition.AnimState -> Maybe.Maybe Basics.Float"},{"name":"getPerspectiveOriginEnd","comment":" Get the end perspective origin of an element being animated.\n\nReturns `Nothing` if the element has no perspective origin animation.\n\n","type":"Anim.Engine.Transition.AnimGroupName -> Anim.Engine.Transition.AnimState -> Maybe.Maybe { x : Basics.Float, y : Basics.Float }"},{"name":"getPropertyEnd","comment":" Get the end value of a custom property animation.\n\nThe second argument is the CSS property name.\n\nReturns `Nothing` if the element has no animation for the given custom property.\n\n","type":"Anim.Engine.Transition.AnimGroupName -> String.String -> Anim.Engine.Transition.AnimState -> Maybe.Maybe Basics.Float"},{"name":"getRotateEnd","comment":" Get the end rotation of an element being animated.\n\nReturns `Nothing` if the element has no rotate animation.\n\n","type":"Anim.Engine.Transition.AnimGroupName -> Anim.Engine.Transition.AnimState -> Maybe.Maybe { x : Basics.Float, y : Basics.Float, z : Basics.Float }"},{"name":"getScaleEnd","comment":" Get the end scale of an element being animated.\n\nReturns `Nothing` if the element has no scale animation.\n\n","type":"Anim.Engine.Transition.AnimGroupName -> Anim.Engine.Transition.AnimState -> Maybe.Maybe { x : Basics.Float, y : Basics.Float, z : Basics.Float }"},{"name":"getSizeEnd","comment":" Get the end size of an element being animated.\n\nReturns `Nothing` if the element has no size animation.\n\n","type":"Anim.Engine.Transition.AnimGroupName -> Anim.Engine.Transition.AnimState -> Maybe.Maybe { width : Basics.Float, height : Basics.Float }"},{"name":"getSkewEnd","comment":" Get the end skew of an element being animated.\n\nReturns `Nothing` if the element has no skew animation.\n\n","type":"Anim.Engine.Transition.AnimGroupName -> Anim.Engine.Transition.AnimState -> Maybe.Maybe { x : Basics.Float, y : Basics.Float }"},{"name":"getTranslateEnd","comment":" Get the end translate of an element being animated.\n\nReturns `Nothing` if the element has no translate animation.\n\n","type":"Anim.Engine.Transition.AnimGroupName -> Anim.Engine.Transition.AnimState -> Maybe.Maybe { x : Basics.Float, y : Basics.Float, z : Basics.Float }"},{"name":"init","comment":" Initialize the engine state with a list of property initializers.\n\n    import Anim.Engine.Transition as Transition\n    import Anim.Property.Opacity as Opacity\n\n    Transition.init\n        [ Opacity.init \"animGroupName\" 0.5\n        , ... -- other property initializers\n        ]\n\n","type":"List.List (Anim.Engine.Transition.EngineBuilder -> Anim.Engine.Transition.EngineBuilder) -> Anim.Engine.Transition.AnimState"},{"name":"isCancelled","comment":" Check if a specific animation group was cancelled.\n\nReturns `Nothing` if there are no animations for the group.\n\n","type":"Anim.Engine.Transition.AnimGroupName -> Anim.Engine.Transition.AnimState -> Maybe.Maybe Basics.Bool"},{"name":"isComplete","comment":" Check if a specific animation group has completed.\n\nReturns `Nothing` if there are no animations for the group.\n\n","type":"Anim.Engine.Transition.AnimGroupName -> Anim.Engine.Transition.AnimState -> Maybe.Maybe Basics.Bool"},{"name":"isRunning","comment":" Check if a specific animation group is currently running.\n\nReturns `Nothing` if there are no animations for the group.\n\n","type":"Anim.Engine.Transition.AnimGroupName -> Anim.Engine.Transition.AnimState -> Maybe.Maybe Basics.Bool"},{"name":"reset","comment":" Reset an animation by instantly jumping back to its start state.\n\n    import Anim.Engine.Transition as Transition\n\n    Transition.reset \"animGroup\" model.animState\n\n","type":"Anim.Engine.Transition.AnimGroupName -> Anim.Engine.Transition.AnimState -> Anim.Engine.Transition.AnimState"},{"name":"retarget","comment":" Change the targeted properties instantly to their new values. If currently animating,\nstop.\n\nThis is a convenience function for immediately snapping properties or axes to new values\nwithout needing to construct a full animation builder with `animate`.\n\nJust target the properties or axes you want to change. Any other properties or axes on\nthe group will snap to their targeted end values if mid-flight.\n\n    import Anim.Engine.Transition as Transition\n    import Anim.Property.Translate as Translate\n\n    { model\n        | animState =\n            Transition.retarget model.animState <|\n                Transition.for \"animGroupName\"\n                    >> Translate.begin\n                    >> Translate.toY 0\n                    >> Translate.end\n    }\n\n","type":"Anim.Engine.Transition.AnimState -> (Anim.Engine.Transition.EngineBuilder -> Anim.Engine.Transition.EngineBuilder) -> Anim.Engine.Transition.AnimState"},{"name":"speed","comment":" Set the global speed for all animations in this builder.\n\n    introAnim : EngineBuilder -> EngineBuilder\n    introAnim =\n        speed 300\n            >> slideDownHeader\n            >> slideInSidebar\n            >> slideUpContent\n\n","type":"Basics.Float -> Anim.Engine.Transition.EngineBuilder -> Anim.Engine.Transition.EngineBuilder"},{"name":"startingStyleNode","comment":" Generate a `<style>` node containing `@starting-style` rules for all animated elements.\n\nWhen an element enters the DOM (or changes from `display: none`), the browser needs\nto know what values to animate FROM. Without `@starting-style`, the browser skips\nthe transition.\n\n    import Anim.Engine.Transition as Transition\n    import Html exposing (div, text)\n\n    view model =\n        div []\n            [ Transition.startingStyleNode model.animState\n            , div\n                (Transition.attributes \"fadeIn\" model.animState\n                    ++ Transition.events TransitionMsg\n                )\n                [ text \"I fade in!\" ]\n            ]\n\n","type":"Anim.Engine.Transition.AnimState -> Html.Html msg"},{"name":"startingStyleNodeFor","comment":" Generate `@starting-style` rules for a specific animation group.\n\n    import Anim.Engine.Transition as Transition\n    import Html exposing (div, text)\n\n    view model =\n        div []\n            [ Transition.startingStyleNodeFor \"fadeIn\" model.animState\n            , div\n                (Transition.attributes \"fadeIn\" model.animState\n                    ++ Transition.events TransitionMsg\n                )\n                [ text \"I fade in!\" ]\n            ]\n\n","type":"Anim.Engine.Transition.AnimGroupName -> Anim.Engine.Transition.AnimState -> Html.Html msg"},{"name":"stop","comment":" Stop a running animation by instantly jumping to its end state.\n\n    import Anim.Engine.Transition as Transition\n\n    Transition.stop \"animGroup\" model.animState\n\n","type":"Anim.Engine.Transition.AnimGroupName -> Anim.Engine.Transition.AnimState -> Anim.Engine.Transition.AnimState"},{"name":"update","comment":" Handle messages from this engine.\n\nReturns the updated state and an event for this message, if one should\nbe surfaced.\n\n    import Anim.Engine.Transition as Transition\n\n    update : Msg -> Model -> ( Model, Cmd Msg )\n    update msg model =\n        case msg of\n            TransitionMsg animMsg ->\n                let\n                    ( animState, maybeEvent ) =\n                        Transition.update animMsg model.animState\n\n                    nextModel =\n                        { model | animState = animState }\n                in\n                case maybeEvent of\n                    Just event ->\n                        handleAnimationEvent event nextModel\n\n                    Nothing ->\n                        ( nextModel, Cmd.none )\n\n    handleAnimationEvent : Transition.AnimEvent -> Model -> ( Model, Cmd Msg )\n    handleAnimationEvent event model =\n        case event of\n            ...\n\n","type":"Anim.Engine.Transition.AnimMsg -> Anim.Engine.Transition.AnimState -> ( Anim.Engine.Transition.AnimState, Maybe.Maybe Anim.Engine.Transition.AnimEvent )"}],"binops":[]},{"name":"Anim.Engine.ViewTimeline","comment":" Use an element's position in the viewport to drive animation progress.\n\nAnimations run automatically as the element moves through view, so you do not need an `AnimState`.\n`update` and `subscriptions` are optional and only matter when you want events.\n\n📖 For setup, browser support, and examples, see the\n[ViewTimeline Engine Documentation](https://phollyer.github.io/elm-motion/animation/engines/view-timeline/)\nand the\n[Engine Overview](https://phollyer.github.io/elm-motion/animation/engines/overview/).\n\n\n# Types\n\n@docs EngineBuilder, AnimGroupName\n\n\n# Target\n\n@docs for\n\n\n# Trigger\n\n📖 See [Triggering Animations](https://phollyer.github.io/elm-motion/animation/workflow/trigger/) for details.\n\n@docs animate\n\n\n# Events\n\n📖 See [Event Reference](https://phollyer.github.io/elm-motion/animation/workflow/react/#event-reference) for details.\n\n@docs AnimEvent\n\n\n## Progress Events\n\n@docs withProgressEvents, setUpdateThrottle\n\n\n# Update\n\n📖 See [React](https://phollyer.github.io/elm-motion/animation/workflow/react/) for details.\n\n@docs AnimMsg, update\n\n\n# Subscriptions\n\n📖 See [Subscriptions](https://phollyer.github.io/elm-motion/animation/engines/view-timeline/#subscriptions) for details.\n\n@docs subscriptions\n\n\n# View\n\n📖 See [Render](https://phollyer.github.io/elm-motion/animation/workflow/render/) for details.\n\n@docs attributes\n\n\n# Axis\n\n@docs horizontal\n\n\n# Range\n\n📖 See [Range](https://phollyer.github.io/elm-motion/animation/engines/view-timeline/#range)\nfor details.\n\n@docs Unit, Range, rangeStart, rangeEnd\n\n\n# Playback\n\nThese functions are precedence functions, so they can operate as a global setting for all groups in the\nbuilder chain, or you can set them on a per-group basis which overrides any global setting\nfor that group.\n\n    ViewTimeline.iterations 3 -- global setting\n        >> ViewTimeline.for \"box\"\n        >> ViewTimeline.iterations 5 -- overrides global for this group\n        >> ... -- other builders\n\n@docs iterations, alternate\n\n\n# Easing\n\n📖 See [Easing](https://phollyer.github.io/elm-motion/animation/concepts/easing/) for details.\n\n@docs easing\n\n\n# Spring\n\n@docs spring\n\n\n# Unit\n\n@docs cssUnit, cssUnitX, cssUnitY, cssUnitZ, cssUnitWidth, cssUnitHeight\n\n\n# Discrete Properties\n\n@docs discreteEntry, discreteExit\n\n\n# Transform Order\n\n@docs transformOrder\n\n","unions":[{"name":"AnimEvent","comment":" Lifecycle events from the ViewTimeline engine.\n\n  - `Started String` — the element entered the animation range. Fires every\n    time the element re-enters range, not just on the first entry.\n  - `Ended String` — the element scrolled past the end of the animation range\n  - `Cancelled String` — the animation was cancelled (e.g. element removed)\n  - `Iteration String Int` — the animation looped; the `Int` is the cumulative iteration count\n  - `Progress String Float` — the timeline's current progress (0..1) while in range.\n    Only emitted when [`withProgressEvents`](#withProgressEvents) `True` was set on the builder.\n  - `AnimError String` — a message arrived but could not be decoded\n\n","args":[],"cases":[["Run",["Anim.Engine.ViewTimeline.AnimGroupName"]],["Started",["Anim.Engine.ViewTimeline.AnimGroupName"]],["Ended",["Anim.Engine.ViewTimeline.AnimGroupName"]],["Cancelled",["Anim.Engine.ViewTimeline.AnimGroupName","Basics.Float"]],["Iteration",["Anim.Engine.ViewTimeline.AnimGroupName","Basics.Int"]],["Progress",["Anim.Engine.ViewTimeline.AnimGroupName","Basics.Float"]],["AnimError",["String.String"]]]},{"name":"Range","comment":" A position along the view timeline, used to configure `rangeStart` and `rangeEnd`.\n\nEach constructor takes a numeric value and a `Unit`:\n\n    rangeStart (Entry 0 Perc) -- entry 0%\n\n    rangeEnd (Exit 100 Px) -- exit 100px\n\n","args":[],"cases":[["Cover",["Basics.Float","Anim.Engine.ViewTimeline.Unit"]],["Contain",["Basics.Float","Anim.Engine.ViewTimeline.Unit"]],["Entry",["Basics.Float","Anim.Engine.ViewTimeline.Unit"]],["EntryCrossing",["Basics.Float","Anim.Engine.ViewTimeline.Unit"]],["Exit",["Basics.Float","Anim.Engine.ViewTimeline.Unit"]],["ExitCrossing",["Basics.Float","Anim.Engine.ViewTimeline.Unit"]],["Scroll",["Basics.Float","Anim.Engine.ViewTimeline.Unit"]]]},{"name":"Unit","comment":" The unit for a `Range` offset value.\n\n  - `Perc` — percentage of the named range (`Cover 20 Perc` → `cover 20%`)\n  - `Px` — fixed pixel offset (`Cover 100 Px` → `cover 100px`)\n\n","args":[],"cases":[["Perc",[]],["Px",[]]]}],"aliases":[{"name":"AnimGroupName","comment":" Type alias for the animation group name.\n","args":[],"type":"String.String"},{"name":"AnimMsg","comment":" Message type used with `update`.\n\n    type Msg\n        = GotViewMsg ViewTimeline.AnimMsg\n        | ...\n\n","args":[],"type":"Anim.Internal.Engine.ViewTimeline.AnimMsg"},{"name":"EngineBuilder","comment":" Builder type for view-driven animations.\n\nUse this in type annotations when a builder function should only work with ViewTimeline.\n\n📖 See [Engine Capabilities](https://phollyer.github.io/elm-motion/animation/concepts/engine-capabilities/)\nfor patterns and examples.\n\n","args":[],"type":"Anim.Internal.Engine.ViewTimeline.EngineBuilder"}],"values":[{"name":"alternate","comment":" Make an animation alternate direction on each iteration.\n\n`alternate` only has a visible effect when the animation runs more than once,\nso calling it when `iterations` is unset or `1` automatically bumps\n`iterations` to `2`. An explicit `iterations` count set before or after\n`alternate` is preserved.\n\n","type":"Anim.Engine.ViewTimeline.EngineBuilder -> Anim.Engine.ViewTimeline.EngineBuilder"},{"name":"animate","comment":" Fire-and-forget view-driven animation using the browser's `ViewTimeline`.\n\n    port motionCmd : Encode.Value -> Cmd msg\n\n    ViewTimeline.animate motionCmd <|\n        ViewTimeline.for \"hero-card\"\n            >> Opacity.begin\n            >> Opacity.from 0\n            >> Opacity.to 1\n            >> Opacity.end\n\n","type":"(Json.Encode.Value -> Platform.Cmd.Cmd msg) -> (Anim.Engine.ViewTimeline.EngineBuilder -> Anim.Engine.ViewTimeline.EngineBuilder) -> Platform.Cmd.Cmd msg"},{"name":"attributes","comment":" Attach the animation group identifier to an element.\n\n    div (ViewTimeline.attributes \"hero-card\") [ ... ]\n\n","type":"Anim.Engine.ViewTimeline.AnimGroupName -> List.List (Html.Attribute msg)"},{"name":"cssUnit","comment":" Set the default length unit for all length-bearing properties.\n\n    responsivePanelMotion : EngineBuilder -> EngineBuilder\n    responsivePanelMotion =\n        cssUnit Unit.Vw\n            >> slidePanelIn\n            >> growPanelHeight\n\n","type":"Anim.Unit.Unit -> Anim.Engine.ViewTimeline.EngineBuilder -> Anim.Engine.ViewTimeline.EngineBuilder"},{"name":"cssUnitHeight","comment":" Set the default length unit used for height values in ViewTimeline animations.\n\n    responsivePanelHeight : EngineBuilder -> EngineBuilder\n    responsivePanelHeight =\n        cssUnitHeight LengthUnit.Vh\n            >> expandPanelHeight\n            >> alignPanelHeaderY\n\n","type":"Anim.Unit.Unit -> Anim.Engine.ViewTimeline.EngineBuilder -> Anim.Engine.ViewTimeline.EngineBuilder"},{"name":"cssUnitWidth","comment":" Set the default length unit used for width values in ViewTimeline animations.\n\n    responsiveCardWidth : EngineBuilder -> EngineBuilder\n    responsiveCardWidth =\n        cssUnitWidth LengthUnit.Vw\n            >> growCardWidth\n            >> settleCardSpacing\n\n","type":"Anim.Unit.Unit -> Anim.Engine.ViewTimeline.EngineBuilder -> Anim.Engine.ViewTimeline.EngineBuilder"},{"name":"cssUnitX","comment":" Set the default length unit for the X axis.\n\n    responsiveDrawerMotion : EngineBuilder -> EngineBuilder\n    responsiveDrawerMotion =\n        cssUnitX Unit.Vw\n            >> slideDrawerX\n            >> alignDrawerLabelX\n\n","type":"Anim.Unit.Unit -> Anim.Engine.ViewTimeline.EngineBuilder -> Anim.Engine.ViewTimeline.EngineBuilder"},{"name":"cssUnitY","comment":" Set the default length unit for the Y axis.\n\n    responsiveSheetMotion : EngineBuilder -> EngineBuilder\n    responsiveSheetMotion =\n        cssUnitY Unit.Vh\n            >> slideSheetY\n            >> alignSheetHeaderY\n\n","type":"Anim.Unit.Unit -> Anim.Engine.ViewTimeline.EngineBuilder -> Anim.Engine.ViewTimeline.EngineBuilder"},{"name":"cssUnitZ","comment":" Set the default length unit for the Z axis.\n\n    layeredSceneMotion : EngineBuilder -> EngineBuilder\n    layeredSceneMotion =\n        cssUnitZ Unit.Px\n            >> pushSceneBackgroundBack\n            >> bringFloatingCardForward\n\n","type":"Anim.Unit.Unit -> Anim.Engine.ViewTimeline.EngineBuilder -> Anim.Engine.ViewTimeline.EngineBuilder"},{"name":"discreteEntry","comment":" Set a discrete CSS property to hold during the animation.\n\nUsed for non-interpolatable properties like `display` or `visibility` that need\nto be set to a specific value while the animation is active.\n\nThis function is a precedence function, so it can operate as a global setting\nfor all groups in the builder chain, or you can set it on a per-group basis\nwhich overrides any global setting for that group.\n\n    ViewTimeline.animate motionCmd <|\n        ViewTimeline.discreteEntry \"display\" \"block\"\n            >> ViewTimeline.for \"box\"\n            >> ViewTimeline.discreteEntry \"visibility\" \"visible\"\n            >> Opacity.begin\n            >> Opacity.from 0\n            >> Opacity.to 1\n            >> Opacity.end\n\n","type":"String.String -> String.String -> Anim.Engine.ViewTimeline.EngineBuilder -> Anim.Engine.ViewTimeline.EngineBuilder"},{"name":"discreteExit","comment":" Add a discrete CSS property for exit animations.\n\nExit animations need to hold their initial state\nuntil the very end of the animation, at which point they flip to the final state.\nTherefore you need to set both entry and exit values for the property.\n\nThis function is a precedence function, so it can operate as a global setting\nfor all groups in the builder chain, or you can set it on a per-group basis\nwhich overrides any global setting for that group.\n\nUse when an element is disappearing (e.g., going from\n`display: block` to `display: none`).\n\n    import Anim.Engine.ViewTimeline as ViewTimeline\n    import Anim.Property.Opacity as Opacity\n\n    ViewTimeline.animate motionCmd <|\n        ViewTimeline.discreteExit \"display\" \"block\" \"none\"\n            >> ViewTimeline.for \"box\"\n            >> Opacity.begin\n            >> Opacity.to 0\n            >> Opacity.end\n\n","type":"String.String -> String.String -> String.String -> Anim.Engine.ViewTimeline.EngineBuilder -> Anim.Engine.ViewTimeline.EngineBuilder"},{"name":"easing","comment":" Set the global easing function.\n\n    heroEntrance : EngineBuilder -> EngineBuilder\n    heroEntrance =\n        easing EaseInOut\n            >> fadeInHeroTitle\n            >> slideInHeroArtwork\n            >> revealPrimaryCta\n\n","type":"Motion.Easing.Easing -> Anim.Engine.ViewTimeline.EngineBuilder -> Anim.Engine.ViewTimeline.EngineBuilder"},{"name":"for","comment":" Select the animation group that subsequent property builders will target.\n\n    ViewTimeline.for \"hero-card\"\n        >> Opacity.begin\n        >> Opacity.from 0\n        >> Opacity.to 1\n        >> Opacity.end\n\n","type":"Anim.Engine.ViewTimeline.AnimGroupName -> Anim.Engine.ViewTimeline.EngineBuilder -> Anim.Engine.ViewTimeline.EngineBuilder"},{"name":"horizontal","comment":" Use horizontal viewport tracking for the timeline.\n\nVertical scroll is the default, so this is only needed when the\ncontainer scrolls horizontally.\n\n    -- Animate an element entering from the side in a horizontal layout\n    ViewTimeline.animate motionCmd <|\n        ViewTimeline.horizontal\n            >> ViewTimeline.for \"slide\"\n            >> Opacity.begin\n            >> Opacity.from 0\n            >> Opacity.to 1\n            >> Opacity.end\n\n","type":"Anim.Engine.ViewTimeline.EngineBuilder -> Anim.Engine.ViewTimeline.EngineBuilder"},{"name":"iterations","comment":" Set how many times an animation should repeat.\n","type":"Basics.Int -> Anim.Engine.ViewTimeline.EngineBuilder -> Anim.Engine.ViewTimeline.EngineBuilder"},{"name":"rangeEnd","comment":" Set when the animation ends relative to the element's position in the viewport.\n\nOptional — defaults to `Cover 100 Perc` when not called.\n\nThis is a precedence function, so it can act as a global default for the\nwhole builder chain or be set after `for` to override the range for a\nspecific group.\n\n    -- End animating as the element begins to leave the viewport\n    ViewTimeline.rangeEnd (Exit 0 Perc)\n        >> ViewTimeline.for \"section-a\"\n        -- Give one section its own range inside the same pipeline\n        >> ViewTimeline.rangeEnd (Exit 60 Perc)\n\n","type":"Anim.Engine.ViewTimeline.Range -> Anim.Engine.ViewTimeline.EngineBuilder -> Anim.Engine.ViewTimeline.EngineBuilder"},{"name":"rangeStart","comment":" Set when the animation starts relative to the element's position in the viewport.\n\nOptional — defaults to `Cover 0 Perc` when not called.\n\nThis is a precedence function, so it can act as a global default for the\nwhole builder chain or be set after `for` to override the range for a\nspecific group.\n\n    -- Start animating as the element enters the viewport\n    ViewTimeline.rangeStart (Entry 0 Perc)\n        >> ViewTimeline.for \"section-a\"\n        -- Give one section its own range inside the same pipeline\n        >> ViewTimeline.rangeStart (Entry 10 Perc)\n\n","type":"Anim.Engine.ViewTimeline.Range -> Anim.Engine.ViewTimeline.EngineBuilder -> Anim.Engine.ViewTimeline.EngineBuilder"},{"name":"setUpdateThrottle","comment":" Set the minimum interval in milliseconds between per-frame\n`propertyUpdate` emissions from the JavaScript runtime.\n\nThe visual animation is driven by the browser compositor and is **never**\naffected by this setting - it only controls how much port traffic is generated.\n\nThis is a precedence function, so it can operate as a global setting for all\ngroups in the builder chain, or you can set it on a per-group basis which\noverrides any global setting for that group.\n\n  - Pass `0` (the default) to emit on every `requestAnimationFrame` tick.\n  - Pass a positive number of milliseconds to cap the emission rate, e.g.\n    `16` for ~60 Hz, `33` for ~30 Hz.\n\n**Note**: Higher throttle values reduce Elm-side mid-flight precision for\nqueries and interruption bookkeeping.\n\n    ViewTimeline.setUpdateThrottle 33 -- global default\n        >> ViewTimeline.for \"hero\"\n        >> ViewTimeline.setUpdateThrottle 0 -- dense updates for interactions\n        >> ViewTimeline.for \"background\"\n        >> ViewTimeline.setUpdateThrottle 50 -- lower traffic for passive motion\n        >> ... -- other builders\n\n","type":"Basics.Int -> Anim.Engine.ViewTimeline.EngineBuilder -> Anim.Engine.ViewTimeline.EngineBuilder"},{"name":"spring","comment":" Set the global spring.\n\n    draggableCardSettle : EngineBuilder -> EngineBuilder\n    draggableCardSettle =\n        spring Spring.wobbly\n            >> settleCardPosition\n            >> settleCardShadow\n\n","type":"Motion.Spring.Spring -> Anim.Engine.ViewTimeline.EngineBuilder -> Anim.Engine.ViewTimeline.EngineBuilder"},{"name":"subscriptions","comment":" Subscribe to lifecycle events for this engine.\n\nThis is only required if you want to receive events.\n\n    subscriptions : Model -> Sub Msg\n    subscriptions _ =\n        ViewTimeline.subscriptions GotViewMsg motionMsg\n\n","type":"(Anim.Engine.ViewTimeline.AnimMsg -> msg) -> ((Json.Decode.Value -> msg) -> Platform.Sub.Sub msg) -> Platform.Sub.Sub msg"},{"name":"transformOrder","comment":" Set the transform order.\n\nThe transform order specifies how `translate`, `rotate`, `skew` and `scale` transforms\nare combined. Start the list with the transform to apply first.\n\nThis is a precedence function, so it can operate as a global setting for all groups in the\nbuilder chain, or you can set it on a per-group basis which overrides any global setting\nfor that group.\n\nAny missing transforms are automatically appended in the default order\n(`Translate` → `Rotate` → `Skew` → `Scale`).\n\n    import Anim.Extra.TransformOrder exposing (TransformProperty(..))\n\n    ViewTimeline.animate motionCmd <|\n        ViewTimeline.transformOrder [ Scale, Rotate, Translate, Skew ] -- global setting\n            >> ViewTimeline.for \"box\"\n            >> ViewTimeline.transformOrder [ Rotate, Translate ] -- overrides global for this group\n            >> Translate.begin\n            >> Translate.fromXY 0 0\n            >> Translate.toXY 100 0\n            >> Translate.end\n\n","type":"List.List Anim.Extra.TransformOrder.TransformProperty -> Anim.Engine.ViewTimeline.EngineBuilder -> Anim.Engine.ViewTimeline.EngineBuilder"},{"name":"update","comment":" Turn an engine message into an event.\n\nMessages that do not belong to this engine return `Nothing`.\n\n    update : Msg -> Model -> ( Model, Cmd Msg )\n    update msg model =\n        case msg of\n            GotViewMsg animMsg ->\n                case ViewTimeline.update animMsg of\n                    Just (ViewTimeline.Ended animGroup) ->\n                        ...\n\n                    _ ->\n                        ( model, Cmd.none )\n\n","type":"Anim.Engine.ViewTimeline.AnimMsg -> Maybe.Maybe Anim.Engine.ViewTimeline.AnimEvent"},{"name":"withProgressEvents","comment":" Opt in to per-frame `Progress` events.\n\nOff by default.\n\nProgress events can create a lot of noise in your update loop,\nespecially when debugging the `Msg` flow in your app. Therefore\nthey are suppressed by default and you need to explicitly opt in\nto receive them.\n\nThis is a precedence function, so it can operate as a global setting for all\ngroups in the builder chain, or you can set it on a per-group basis which\noverrides any global setting for that group.\n\n    ViewTimeline.withProgressEvents True -- global setting\n        >> ViewTimeline.for \"box\"\n        >> ViewTimeline.withProgressEvents False -- overrides global for this group\n        >> ... -- other builders\n\n","type":"Basics.Bool -> Anim.Engine.ViewTimeline.EngineBuilder -> Anim.Engine.ViewTimeline.EngineBuilder"}],"binops":[]},{"name":"Anim.Engine.WAAPI","comment":" Use the Web Animations API through ports.\n\nChoose this engine when you want browser-driven animation with the maximum feature set.\n\n📖 See\n[WAAPI Engine Documentation](https://phollyer.github.io/elm-motion/animation/engines/waapi/)\nand\n[Engine Overview](https://phollyer.github.io/elm-motion/animation/engines/overview/)\nfor engine details, and [JS Installation](https://phollyer.github.io/elm-motion/installation/#waapi-javascript)\nfor setup instructions.\n\n\n# Ports\n\nTo use this engine, you need to make your module a port module and set up two ports:\n\n    port module MyModule exposing (..)\n\n    import Json.Decode as Decode\n    import Json.Encode as Encode\n\n\n    -- Outgoing port to send animation commands to JavaScript\n    port motionCmd : Encode.Value -> Cmd msg\n\n    -- Incoming port to receive animation messages from JavaScript\n    port motionMsg : (Decode.Value -> msg) -> Sub msg\n\n\n# Types\n\n@docs AnimState, AnimGroupName\n\n\n## Builders\n\n@docs AnimBuilder\n\n\n### Engine Builder\n\n@docs EngineBuilder\n\n\n# Initialize\n\n📖 See [Initialize](https://phollyer.github.io/elm-motion/animation/workflow/init/) for details.\n\n@docs init\n\n\n# Target\n\n@docs for\n\n\n# Trigger\n\n📖 See [Triggering Animations](https://phollyer.github.io/elm-motion/animation/workflow/trigger/) for details.\n\n@docs animate, fireAndForget, retarget\n\n\n# Events\n\n@docs AnimEvent\n\n\n## Progress Events\n\n📖 See [Event Reference](https://phollyer.github.io/elm-motion/animation/workflow/react/#event-reference) for details.\n\n@docs withProgressEvents, setUpdateThrottle\n\n\n# Update\n\n📖 See [React](https://phollyer.github.io/elm-motion/animation/workflow/react/) for details.\n\n@docs AnimMsg, update\n\n\n# Subscriptions\n\n📖 See [Subscriptions](https://phollyer.github.io/elm-motion/animation/engines/waapi/#subscriptions) for details.\n\n@docs subscriptions\n\n\n# View\n\nAdd `attributes` to the element you want to animate.\n\n📖 See [Render](https://phollyer.github.io/elm-motion/animation/workflow/render/) for details.\n\n@docs attributes\n\n\n# Responsive Animations\n\n📖 See [Responsive Animations](https://phollyer.github.io/elm-motion/animation/concepts/responsive-animations/#path-3-measured-pixel-values) for details.\n\n@docs onResize\n\n\n# Playback\n\nThese functions are precedence functions, so they can operate as a global setting for all groups in the\nbuilder chain, or you can set them on a per-group basis which overrides any global setting\nfor that group.\n\n    WAAPI.iterations 3 -- global setting\n        >> WAAPI.for \"box\"\n        >> WAAPI.iterations 5 -- overrides global for this group\n        >> ... -- other builders\n\n@docs iterations, loopForever, alternate\n\n\n# Timing\n\n📖 See [Timing](https://phollyer.github.io/elm-motion/animation/concepts/timing/) for details.\n\n@docs delay, duration, speed\n\n\n# Easing\n\n📖 See [Easing](https://phollyer.github.io/elm-motion/animation/concepts/easing/) for details.\n\n@docs easing\n\n\n# Spring\n\n@docs spring\n\n\n# Unit\n\n@docs cssUnit, cssUnitX, cssUnitY, cssUnitZ, cssUnitWidth, cssUnitHeight\n\n\n# Animation Control\n\n📖 See [Controlling Animations](https://phollyer.github.io/elm-motion/animation/concepts/controlling-animations/) for details.\n\n@docs stop, reset, restart, pause, resume\n\n\n# Discrete Properties\n\n📖 See [Discrete Properties](https://phollyer.github.io/elm-motion/animation/concepts/discrete-properties/) for details.\n\n@docs discreteEntry, discreteExit\n\n\n# Transform Order\n\n📖 See [Transform Ordering](https://phollyer.github.io/elm-motion/animation/concepts/transform-order/) for details.\n\n@docs transformOrder\n\n\n# Freeze\n\nFreeze an axis to hold it in place while other axes or properties animate.\n\nThis is a precedence function, so it can operate as a global setting for all groups in the builder chain, or you\ncan add a per-group freeze on top of the inherited global frozen axes for that group.\n\n    WAAPI.freezeX [ WAAPI.translate ] -- global setting\n        >> WAAPI.for \"box\"\n        >> WAAPI.freezeX [ WAAPI.rotate ] -- adds to the inherited global freeze for this group\n        >> ... -- other builders\n\n📖 See [Interrupting Animations](https://phollyer.github.io/elm-motion/animation/concepts/interrupting-animations/) for details.\n\n@docs FreezeProperty, translate, rotate, scale, skew\n\n@docs freezeX, freezeY, freezeZ, freezeXY, freezeXZ, freezeYZ, freezeXYZ\n\n\n# Unfreeze\n\nUnfreeze an axis to allow it to animate.\n\nThis is a precedence function, so it can operate as a global setting for all groups in the builder chain, or you\ncan remove axes on a per-group basis from the inherited global frozen axes for that group.\n\n    WAAPI.freezeX [ WAAPI.translate ] -- global freeze setting\n        >> WAAPI.for \"box\"\n        >> WAAPI.unfreezeX [ WAAPI.translate ] -- removes the inherited global freeze for this group\n        >> ... -- other builders\n\n@docs unfreezeX, unfreezeY, unfreezeZ, unfreezeXY, unfreezeXZ, unfreezeYZ, unfreezeXYZ\n\n\n# State Queries\n\n📖 See [State Queries](https://phollyer.github.io/elm-motion/animation/engines/waapi/#state-queries) for details.\n\n@docs anyRunning, isRunning, allComplete, isComplete, getProgress\n\n\n# Property Queries\n\n📖 See [Property Queries](https://phollyer.github.io/elm-motion/animation/engines/waapi/#property-queries) and\n[Properties](https://phollyer.github.io/elm-motion/animation/properties/getting-started/) for details.\n\n\n## Custom Properties\n\n@docs getPropertyCurrent, getPropertyEnd, getPropertyRange, getPropertyStart\n\n\n## Custom Color Properties\n\n@docs getColorPropertyCurrent, getColorPropertyEnd, getColorPropertyRange, getColorPropertyStart\n\n\n## Opacity\n\n@docs getOpacityRange, getOpacityStart, getOpacityEnd, getOpacityCurrent\n\n\n## Perspective Origin\n\n@docs getPerspectiveOriginRange, getPerspectiveOriginStart, getPerspectiveOriginEnd, getPerspectiveOriginCurrent\n\n\n## Rotate\n\n@docs getRotateRange, getRotateStart, getRotateEnd, getRotateCurrent\n\n\n## Scale\n\n@docs getScaleRange, getScaleStart, getScaleEnd, getScaleCurrent\n\n\n## Size\n\n@docs getSizeRange, getSizeStart, getSizeEnd, getSizeCurrent\n\n\n## Skew\n\n@docs getSkewRange, getSkewStart, getSkewEnd, getSkewCurrent\n\n\n## Translate\n\n@docs getTranslateRange, getTranslateStart, getTranslateEnd, getTranslateCurrent\n\n","unions":[{"name":"AnimEvent","comment":" Animation lifecycle events from this engine.\n","args":[],"cases":[["Run",["Anim.Engine.WAAPI.AnimGroupName"]],["Started",["Anim.Engine.WAAPI.AnimGroupName"]],["Ended",["Anim.Engine.WAAPI.AnimGroupName"]],["Cancelled",["Anim.Engine.WAAPI.AnimGroupName","Basics.Float"]],["Restarted",["Anim.Engine.WAAPI.AnimGroupName"]],["Paused",["Anim.Engine.WAAPI.AnimGroupName","Basics.Float"]],["Resumed",["Anim.Engine.WAAPI.AnimGroupName"]],["Iteration",["Anim.Engine.WAAPI.AnimGroupName","Basics.Int"]],["Progress",["Anim.Engine.WAAPI.AnimGroupName","Basics.Float"]],["AnimError",["String.String"]]]}],"aliases":[{"name":"AnimBuilder","comment":" Base animation builder type for this engine.\n","args":["eng"],"type":"Anim.Internal.Engine.WAAPI.AnimBuilder eng"},{"name":"AnimGroupName","comment":" The name of the animation group you want to target.\n","args":[],"type":"String.String"},{"name":"AnimMsg","comment":" Message type used with `update`.\n\n    import Anim.Engine.WAAPI as WAAPI\n\n    type Msg\n        = WaapiMsg WAAPI.AnimMsg\n        | ...\n\n","args":[],"type":"Anim.Internal.Engine.WAAPI.AnimMsg"},{"name":"AnimState","comment":" Holds the WAAPI engine state.\n\nKeep this in your model.\n\nThe `msg` type parameter is your `Msg` type.\n\n    type alias Model =\n        { animState : WAAPI.AnimState Msg }\n\n","args":["msg"],"type":"Anim.Internal.Engine.WAAPI.AnimState msg"},{"name":"EngineBuilder","comment":" Builder type for WAAPI-only builders.\n\nUse this in type annotations when a builder function should only work with this engine.\n\n📖 See [Engine Capabilities](https://phollyer.github.io/elm-motion/animation/concepts/engine-capabilities/)\nfor patterns and examples.\n\n","args":[],"type":"Anim.Internal.Engine.WAAPI.EngineBuilder"},{"name":"FreezeProperty","comment":" Identifies a property that can be frozen at its current animated position.\n\nUse with [freezeX](#freezeX), [freezeY](#freezeY), etc. to hold specific axes\nat their current values during animation interruptions.\n\n","args":[],"type":"Anim.Internal.Engine.WAAPI.FreezeProperty"}],"values":[{"name":"allComplete","comment":" Check if all animations are complete.\n\nReturns `Nothing` if there are no animations.\n\n","type":"Anim.Engine.WAAPI.AnimState msg -> Maybe.Maybe Basics.Bool"},{"name":"alternate","comment":" Make an animation alternate direction on each iteration.\n\n`alternate` only has a visible effect when the animation runs more than once,\nso calling it when `iterations` is unset or `1` automatically bumps\n`iterations` to `2`. An explicit `iterations` count (or `loopForever`) set\nbefore or after `alternate` is preserved.\n\n","type":"Anim.Engine.WAAPI.EngineBuilder -> Anim.Engine.WAAPI.EngineBuilder"},{"name":"animate","comment":" Trigger animations.\n\nReturns the updated animation state and the command to send to JavaScript.\n\n    import Anim.Engine.WAAPI as WAAPI\n\n    let\n        ( animState, animCmd ) =\n            WAAPI.animate model.animState entryAnim\n    in\n    ( { model | animState = animState }, animCmd )\n\n","type":"Anim.Engine.WAAPI.AnimState msg -> (Anim.Engine.WAAPI.EngineBuilder -> Anim.Engine.WAAPI.EngineBuilder) -> ( Anim.Engine.WAAPI.AnimState msg, Platform.Cmd.Cmd msg )"},{"name":"anyRunning","comment":" Check if any animations are currently running.\n\nReturns `Nothing` if there are no animations.\n\n","type":"Anim.Engine.WAAPI.AnimState msg -> Maybe.Maybe Basics.Bool"},{"name":"attributes","comment":" Apply baseline and state styles to your element.\n\nSets the element's starting, current, and end property values as inline styles,\nand adds the `data-anim-target` attribute so the JavaScript companion can locate\nthe element when the animation is triggered.\n\n    import Anim.Engine.WAAPI as WAAPI\n    import Html exposing (div, text)\n\n    div\n        (WAAPI.attributes \"animGroupName\" model.animState)\n        [ text \"Animating element\" ]\n\n","type":"Anim.Engine.WAAPI.AnimGroupName -> Anim.Engine.WAAPI.AnimState msg -> List.List (Html.Attribute msg)"},{"name":"cssUnit","comment":" Set the default length unit for all length-bearing properties.\n\n    responsivePanelMotion : EngineBuilder -> EngineBuilder\n    responsivePanelMotion =\n        cssUnit Unit.Vw\n            >> slidePanelIn\n            >> growPanelHeight\n\n","type":"Anim.Unit.Unit -> Anim.Engine.WAAPI.EngineBuilder -> Anim.Engine.WAAPI.EngineBuilder"},{"name":"cssUnitHeight","comment":" Set the default length unit used for height values in WAAPI animations.\n\n    responsivePanelHeight : EngineBuilder -> EngineBuilder\n    responsivePanelHeight =\n        cssUnitHeight Unit.Vh\n            >> expandPanelHeight\n            >> alignPanelHeaderY\n\n","type":"Anim.Unit.Unit -> Anim.Engine.WAAPI.EngineBuilder -> Anim.Engine.WAAPI.EngineBuilder"},{"name":"cssUnitWidth","comment":" Set the default length unit used for width values in WAAPI animations.\n\n    responsiveCardWidth : EngineBuilder -> EngineBuilder\n    responsiveCardWidth =\n        cssUnitWidth Unit.Vw\n            >> growCardWidth\n            >> settleCardSpacing\n\n","type":"Anim.Unit.Unit -> Anim.Engine.WAAPI.EngineBuilder -> Anim.Engine.WAAPI.EngineBuilder"},{"name":"cssUnitX","comment":" Set the default length unit for the X axis.\n\n    responsiveDrawerMotion : EngineBuilder -> EngineBuilder\n    responsiveDrawerMotion =\n        cssUnitX Unit.Vw\n            >> slideDrawerX\n            >> alignDrawerLabelX\n\n","type":"Anim.Unit.Unit -> Anim.Engine.WAAPI.EngineBuilder -> Anim.Engine.WAAPI.EngineBuilder"},{"name":"cssUnitY","comment":" Set the default length unit for the Y axis.\n\n    responsiveSheetMotion : EngineBuilder -> EngineBuilder\n    responsiveSheetMotion =\n        cssUnitY Unit.Vh\n            >> slideSheetY\n            >> alignSheetHeaderY\n\n","type":"Anim.Unit.Unit -> Anim.Engine.WAAPI.EngineBuilder -> Anim.Engine.WAAPI.EngineBuilder"},{"name":"cssUnitZ","comment":" Set the default length unit for the Z axis.\n\n    layeredSceneMotion : EngineBuilder -> EngineBuilder\n    layeredSceneMotion =\n        cssUnitZ Unit.Px\n            >> pushSceneBackgroundBack\n            >> bringFloatingCardForward\n\n","type":"Anim.Unit.Unit -> Anim.Engine.WAAPI.EngineBuilder -> Anim.Engine.WAAPI.EngineBuilder"},{"name":"delay","comment":" Set the global delay for all animations in this builder.\n\n    introAnim : EngineBuilder -> EngineBuilder\n    introAnim =\n        delay 500\n            >> fadeInHeader\n            >> slideInSidebar\n            >> fadeInContent\n\n","type":"Basics.Int -> Anim.Engine.WAAPI.EngineBuilder -> Anim.Engine.WAAPI.EngineBuilder"},{"name":"discreteEntry","comment":" Add a discrete CSS property for entry animations.\n\nThe value is applied as an inline style from the first frame and held throughout\nthe animation. Use this when an element is appearing (e.g., going from\n`display: none` to `display: block`).\n\nThis function is a precedence function, so it can operate as a global setting\nfor all groups in the builder chain, or you can set it on a per-group basis\nwhich overrides any global setting for that group.\n\n    import Anim.Engine.WAAPI as WAAPI\n    import Anim.Property.Opacity as Opacity\n\n    WAAPI.animate model.animState <|\n        WAAPI.discreteEntry \"display\" \"block\"\n            >> WAAPI.discreteEntry \"visibility\" \"visible\"\n            >> WAAPI.for \"box\"\n            >> Opacity.begin\n            >> Opacity.to 1\n            >> Opacity.end\n\n","type":"String.String -> String.String -> Anim.Engine.WAAPI.EngineBuilder -> Anim.Engine.WAAPI.EngineBuilder"},{"name":"discreteExit","comment":" Add a discrete CSS property for exit animations.\n\nExit animations need to hold their initial state\nuntil the very end of the animation, at which point they flip to the final state.\nTherefore you need to set both entry and exit values for the property.\n\nThis function is a precedence function, so it can operate as a global setting\nfor all groups in the builder chain, or you can set it on a per-group basis\nwhich overrides any global setting for that group.\n\nUse when an element is disappearing (e.g., going from\n`display: block` to `display: none`).\n\n    import Anim.Engine.WAAPI as WAAPI\n    import Anim.Property.Opacity as Opacity\n\n    WAAPI.animate model.animState <|\n        WAAPI.discreteExit \"display\" \"block\" \"none\"\n            >> WAAPI.for \"box\"\n            >> Opacity.begin\n            >> Opacity.to 0\n            >> Opacity.end\n\n","type":"String.String -> String.String -> String.String -> Anim.Engine.WAAPI.EngineBuilder -> Anim.Engine.WAAPI.EngineBuilder"},{"name":"duration","comment":" Set the global duration for all animations in this builder.\n\n    introAnim : EngineBuilder -> EngineBuilder\n    introAnim =\n        duration 500\n            >> fadeInHeader\n            >> slideInSidebar\n            >> fadeInContent\n\n","type":"Basics.Int -> Anim.Engine.WAAPI.EngineBuilder -> Anim.Engine.WAAPI.EngineBuilder"},{"name":"easing","comment":" Set the global easing function.\n\n    heroEntrance : EngineBuilder -> EngineBuilder\n    heroEntrance =\n        easing EaseInOut\n            >> fadeInHeroTitle\n            >> slideInHeroArtwork\n            >> revealPrimaryCta\n\n","type":"Motion.Easing.Easing -> Anim.Engine.WAAPI.EngineBuilder -> Anim.Engine.WAAPI.EngineBuilder"},{"name":"fireAndForget","comment":" Execute a fire-and-forget animation without state tracking.\n\n    import Anim.Engine.WAAPI as WAAPI\n    import Json.Encode as Encode\n\n    port motionCmd : Encode.Value -> Cmd msg\n\n    WAAPI.fireAndForget motionCmd entryAnim\n\nUseful if you don't need to track the animation state in your model or handle events\nfrom the engine, and just want to trigger an animation with a one-off command.\n\n","type":"(Json.Encode.Value -> Platform.Cmd.Cmd msg) -> (Anim.Engine.WAAPI.EngineBuilder -> Anim.Engine.WAAPI.EngineBuilder) -> Platform.Cmd.Cmd msg"},{"name":"for","comment":" Select the animation group that subsequent property builders will target.\n\n    WAAPI.for \"animGroupName\"\n        >> Opacity.begin\n        >> Opacity.to 0.2\n        >> Opacity.end\n\n","type":"Anim.Engine.WAAPI.AnimGroupName -> Anim.Engine.WAAPI.EngineBuilder -> Anim.Engine.WAAPI.EngineBuilder"},{"name":"freezeX","comment":" Freeze the X axis of the specified properties at their current animated values.\n\nThe named axis indicates which axis will remain frozen while you animate the others.\n\n    import Anim.Engine.WAAPI as WAAPI\n    import Anim.Property.Translate as Translate\n\n    let\n        ( animState, animCmd ) =\n            WAAPI.animate model.animState <|\n                WAAPI.freezeX [ WAAPI.translate ]\n                    >> WAAPI.for \"box\"\n                    >> Translate.begin\n                    >> Translate.toY 0\n                    >> Translate.end\n    in\n    ( { model | animState = animState }, animCmd )\n\n","type":"List.List Anim.Engine.WAAPI.FreezeProperty -> Anim.Engine.WAAPI.EngineBuilder -> Anim.Engine.WAAPI.EngineBuilder"},{"name":"freezeXY","comment":" Freeze the X and Y axes of the specified properties at their current animated values.\n","type":"List.List Anim.Engine.WAAPI.FreezeProperty -> Anim.Engine.WAAPI.EngineBuilder -> Anim.Engine.WAAPI.EngineBuilder"},{"name":"freezeXYZ","comment":" Freeze all axes of the specified properties at their current animated values.\n","type":"List.List Anim.Engine.WAAPI.FreezeProperty -> Anim.Engine.WAAPI.EngineBuilder -> Anim.Engine.WAAPI.EngineBuilder"},{"name":"freezeXZ","comment":" Freeze the X and Z axes of the specified properties at their current animated values.\n","type":"List.List Anim.Engine.WAAPI.FreezeProperty -> Anim.Engine.WAAPI.EngineBuilder -> Anim.Engine.WAAPI.EngineBuilder"},{"name":"freezeY","comment":" Freeze the Y axis of the specified properties at their current animated values.\n","type":"List.List Anim.Engine.WAAPI.FreezeProperty -> Anim.Engine.WAAPI.EngineBuilder -> Anim.Engine.WAAPI.EngineBuilder"},{"name":"freezeYZ","comment":" Freeze the Y and Z axes of the specified properties at their current animated values.\n","type":"List.List Anim.Engine.WAAPI.FreezeProperty -> Anim.Engine.WAAPI.EngineBuilder -> Anim.Engine.WAAPI.EngineBuilder"},{"name":"freezeZ","comment":" Freeze the Z axis of the specified properties at their current animated values.\n","type":"List.List Anim.Engine.WAAPI.FreezeProperty -> Anim.Engine.WAAPI.EngineBuilder -> Anim.Engine.WAAPI.EngineBuilder"},{"name":"getColorPropertyCurrent","comment":" Get the current interpolated value of a custom color property animation.\n\nThe second argument is the CSS property name.\n\nReturns `Nothing` if the element has no animation for the given custom color property.\n\n","type":"Anim.Engine.WAAPI.AnimGroupName -> String.String -> Anim.Engine.WAAPI.AnimState msg -> Maybe.Maybe Anim.Extra.Color.Color"},{"name":"getColorPropertyEnd","comment":" Get the end value of a custom color property animation.\n\nThe second argument is the CSS property name.\n\nReturns `Nothing` if the element has no animation for the given custom color property.\n\n","type":"Anim.Engine.WAAPI.AnimGroupName -> String.String -> Anim.Engine.WAAPI.AnimState msg -> Maybe.Maybe Anim.Extra.Color.Color"},{"name":"getColorPropertyRange","comment":" Get the custom color property range (start and end) of an element being animated.\n\nThe second argument is the CSS property name.\n\nReturns `Nothing` if the element has no animation for the given custom color property.\n\n","type":"Anim.Engine.WAAPI.AnimGroupName -> String.String -> Anim.Engine.WAAPI.AnimState msg -> Maybe.Maybe { start : Maybe.Maybe Anim.Extra.Color.Color, end : Anim.Extra.Color.Color }"},{"name":"getColorPropertyStart","comment":" Get the start value of a custom color property animation.\n\nThe second argument is the CSS property name.\n\nReturns `Nothing` if the element has no animation for the given custom color property.\n\nReturns `transparent white (rgba 255 255 255 0)` if no explicit start value was set, which is the default when no start value is set.\n\n","type":"Anim.Engine.WAAPI.AnimGroupName -> String.String -> Anim.Engine.WAAPI.AnimState msg -> Maybe.Maybe Anim.Extra.Color.Color"},{"name":"getOpacityCurrent","comment":" Get the current opacity of an element based on its animation state.\n\nReturns `Nothing` if the element has no opacity animation.\n\nReturns the start opacity if the animation has not started yet.\n\nReturns the current interpolated opacity if the animation is running.\n\nReturns the end opacity if the animation has completed.\n\n","type":"Anim.Engine.WAAPI.AnimGroupName -> Anim.Engine.WAAPI.AnimState msg -> Maybe.Maybe Basics.Float"},{"name":"getOpacityEnd","comment":" Get the end opacity of an element being animated.\n\nReturns `Nothing` if the element has no opacity animation.\n\n","type":"Anim.Engine.WAAPI.AnimGroupName -> Anim.Engine.WAAPI.AnimState msg -> Maybe.Maybe Basics.Float"},{"name":"getOpacityRange","comment":" Get the opacity range (start and end) of an element being animated.\n\nReturns `Nothing` if the element has no opacity animation.\n\n","type":"Anim.Engine.WAAPI.AnimGroupName -> Anim.Engine.WAAPI.AnimState msg -> Maybe.Maybe { start : Maybe.Maybe Basics.Float, end : Basics.Float }"},{"name":"getOpacityStart","comment":" Get the start opacity of an element being animated.\n\nReturns `Nothing` if the element has no opacity animation.\n\nReturns `Just 1.0` (fully opaque) if no explicit start value was set, which is the default when no start value is set.\n\n","type":"Anim.Engine.WAAPI.AnimGroupName -> Anim.Engine.WAAPI.AnimState msg -> Maybe.Maybe Basics.Float"},{"name":"getPerspectiveOriginCurrent","comment":" Get the current perspective origin of an element based on its animation state.\n\nReturns `Nothing` if the element has no perspective origin animation.\n\nReturns the current perspective origin from the latest engine snapshot.\n\n","type":"Anim.Engine.WAAPI.AnimGroupName -> Anim.Engine.WAAPI.AnimState msg -> Maybe.Maybe { x : Basics.Float, y : Basics.Float }"},{"name":"getPerspectiveOriginEnd","comment":" Get the end perspective origin of an element being animated.\n\nReturns `Nothing` if the element has no perspective origin animation.\n\n","type":"Anim.Engine.WAAPI.AnimGroupName -> Anim.Engine.WAAPI.AnimState msg -> Maybe.Maybe { x : Basics.Float, y : Basics.Float }"},{"name":"getPerspectiveOriginRange","comment":" Get the perspective origin range (start and end) of an element being animated.\n\nReturns `Nothing` if the element has no perspective origin animation.\n\n","type":"Anim.Engine.WAAPI.AnimGroupName -> Anim.Engine.WAAPI.AnimState msg -> Maybe.Maybe { start : Maybe.Maybe { x : Basics.Float, y : Basics.Float }, end : { x : Basics.Float, y : Basics.Float } }"},{"name":"getPerspectiveOriginStart","comment":" Get the start perspective origin of an element being animated.\n\nReturns `Nothing` if the element has no perspective origin animation.\n\nReturns `Just { x = 50, y = 50 }` if no explicit start value was set, which is the default when no start value is set.\n\n","type":"Anim.Engine.WAAPI.AnimGroupName -> Anim.Engine.WAAPI.AnimState msg -> Maybe.Maybe { x : Basics.Float, y : Basics.Float }"},{"name":"getProgress","comment":" Get the current progress of an animation group as a value from 0.0 to 1.0.\n\nReturns `Nothing` if there are no animations for the group.\n\n    import Anim.Engine.WAAPI as WAAPI\n\n    WAAPI.getProgress \"myAnimation\" model.animState\n    -- Just 0.5 (halfway through)\n\n","type":"Anim.Engine.WAAPI.AnimGroupName -> Anim.Engine.WAAPI.AnimState msg -> Maybe.Maybe Basics.Float"},{"name":"getPropertyCurrent","comment":" Get the current interpolated value of a custom property animation.\n\nThe second argument is the CSS property name.\n\nReturns `Nothing` if the element has no animation for the given custom property.\n\n","type":"Anim.Engine.WAAPI.AnimGroupName -> String.String -> Anim.Engine.WAAPI.AnimState msg -> Maybe.Maybe Basics.Float"},{"name":"getPropertyEnd","comment":" Get the end value of a custom property animation.\n\nThe second argument is the CSS property name.\n\nReturns `Nothing` if the element has no animation for the given custom property.\n\n","type":"Anim.Engine.WAAPI.AnimGroupName -> String.String -> Anim.Engine.WAAPI.AnimState msg -> Maybe.Maybe Basics.Float"},{"name":"getPropertyRange","comment":" Get the custom property range (start and end) of an element being animated.\n\nThe second argument is the CSS property name.\n\nReturns `Nothing` if the element has no animation for the given custom property.\n\n","type":"Anim.Engine.WAAPI.AnimGroupName -> String.String -> Anim.Engine.WAAPI.AnimState msg -> Maybe.Maybe { start : Maybe.Maybe Basics.Float, end : Basics.Float }"},{"name":"getPropertyStart","comment":" Get the start value of a custom property animation.\n\nThe second argument is the CSS property name.\n\nReturns `Nothing` if the element has no animation for the given custom property.\n\nReturns `Just 0` if no explicit start value was set, which is the default when no start value is set.\n\n","type":"Anim.Engine.WAAPI.AnimGroupName -> String.String -> Anim.Engine.WAAPI.AnimState msg -> Maybe.Maybe Basics.Float"},{"name":"getRotateCurrent","comment":" Get the current rotation of an element based on its animation state.\n\nReturns `Nothing` if the element has no rotate animation.\n\nReturns the start rotation if the animation has not started yet.\n\nReturns the current interpolated rotation if the animation is running.\n\nReturns the end rotation if the animation has completed.\n\n","type":"Anim.Engine.WAAPI.AnimGroupName -> Anim.Engine.WAAPI.AnimState msg -> Maybe.Maybe { x : Basics.Float, y : Basics.Float, z : Basics.Float }"},{"name":"getRotateEnd","comment":" Get the end rotation of an element being animated.\n\nReturns `Nothing` if the element has no rotate animation.\n\n","type":"Anim.Engine.WAAPI.AnimGroupName -> Anim.Engine.WAAPI.AnimState msg -> Maybe.Maybe { x : Basics.Float, y : Basics.Float, z : Basics.Float }"},{"name":"getRotateRange","comment":" Get the rotate range (start and end) of an element being animated.\n\nReturns `Nothing` if the element has no rotate animation.\n\n","type":"Anim.Engine.WAAPI.AnimGroupName -> Anim.Engine.WAAPI.AnimState msg -> Maybe.Maybe { start : Maybe.Maybe { x : Basics.Float, y : Basics.Float, z : Basics.Float }, end : { x : Basics.Float, y : Basics.Float, z : Basics.Float } }"},{"name":"getRotateStart","comment":" Get the start rotation of an element being animated.\n\nReturns `Nothing` if the element has no rotate animation.\n\nReturns `Just { x = 0, y = 0, z = 0 }` if no explicit start value was set, which is the default when no start value is set.\n\n","type":"Anim.Engine.WAAPI.AnimGroupName -> Anim.Engine.WAAPI.AnimState msg -> Maybe.Maybe { x : Basics.Float, y : Basics.Float, z : Basics.Float }"},{"name":"getScaleCurrent","comment":" Get the current scale of an element based on its animation state.\n\nReturns `Nothing` if the element has no scale animation.\n\nReturns the start scale if the animation has not started yet.\n\nReturns the current interpolated scale if the animation is running.\n\nReturns the end scale if the animation has completed.\n\n","type":"Anim.Engine.WAAPI.AnimGroupName -> Anim.Engine.WAAPI.AnimState msg -> Maybe.Maybe { x : Basics.Float, y : Basics.Float, z : Basics.Float }"},{"name":"getScaleEnd","comment":" Get the end scale of an element being animated.\n\nReturns `Nothing` if the element has no scale animation.\n\n","type":"Anim.Engine.WAAPI.AnimGroupName -> Anim.Engine.WAAPI.AnimState msg -> Maybe.Maybe { x : Basics.Float, y : Basics.Float, z : Basics.Float }"},{"name":"getScaleRange","comment":" Get the scale range (start and end) of an element being animated.\n\nReturns `Nothing` if the element has no scale animation.\n\n","type":"Anim.Engine.WAAPI.AnimGroupName -> Anim.Engine.WAAPI.AnimState msg -> Maybe.Maybe { start : Maybe.Maybe { x : Basics.Float, y : Basics.Float, z : Basics.Float }, end : { x : Basics.Float, y : Basics.Float, z : Basics.Float } }"},{"name":"getScaleStart","comment":" Get the start scale of an element being animated.\n\nReturns `Nothing` if the element has no scale animation.\n\nReturns `Just { x = 1, y = 1, z = 1 }` if no explicit start value was set, which is the default when no start value is set.\n\n","type":"Anim.Engine.WAAPI.AnimGroupName -> Anim.Engine.WAAPI.AnimState msg -> Maybe.Maybe { x : Basics.Float, y : Basics.Float, z : Basics.Float }"},{"name":"getSizeCurrent","comment":" Get the current size of an element based on its animation state.\n\nReturns `Nothing` if the element has no size animation.\n\nReturns the start size if the animation has not started yet.\n\nReturns the current interpolated size if the animation is running.\n\nReturns the end size if the animation has completed.\n\n","type":"Anim.Engine.WAAPI.AnimGroupName -> Anim.Engine.WAAPI.AnimState msg -> Maybe.Maybe { width : Basics.Float, height : Basics.Float }"},{"name":"getSizeEnd","comment":" Get the end size of an element being animated.\n\nReturns `Nothing` if the element has no size animation.\n\n","type":"Anim.Engine.WAAPI.AnimGroupName -> Anim.Engine.WAAPI.AnimState msg -> Maybe.Maybe { width : Basics.Float, height : Basics.Float }"},{"name":"getSizeRange","comment":" Get the size range (start and end) of an element being animated.\n\nReturns `Nothing` if the element has no size animation.\n\n","type":"Anim.Engine.WAAPI.AnimGroupName -> Anim.Engine.WAAPI.AnimState msg -> Maybe.Maybe { start : Maybe.Maybe { width : Basics.Float, height : Basics.Float }, end : { width : Basics.Float, height : Basics.Float } }"},{"name":"getSizeStart","comment":" Get the start size of an element being animated.\n\nReturns `Nothing` if the element has no size animation.\n\nReturns `Just { width = 0, height = 0 }` if no explicit start value was set, which is the default when no start value is set.\n\n","type":"Anim.Engine.WAAPI.AnimGroupName -> Anim.Engine.WAAPI.AnimState msg -> Maybe.Maybe { width : Basics.Float, height : Basics.Float }"},{"name":"getSkewCurrent","comment":" Get the current skew of an element based on its animation state.\n\nReturns `Nothing` if the element has no skew animation.\n\nReturns the start skew if the animation has not started yet.\n\nReturns the current interpolated skew if the animation is running.\n\nReturns the end skew if the animation has completed.\n\n","type":"Anim.Engine.WAAPI.AnimGroupName -> Anim.Engine.WAAPI.AnimState msg -> Maybe.Maybe { x : Basics.Float, y : Basics.Float }"},{"name":"getSkewEnd","comment":" Get the end skew of an element being animated.\n\nReturns `Nothing` if the element has no skew animation.\n\n","type":"Anim.Engine.WAAPI.AnimGroupName -> Anim.Engine.WAAPI.AnimState msg -> Maybe.Maybe { x : Basics.Float, y : Basics.Float }"},{"name":"getSkewRange","comment":" Get the skew range (start and end) of an element being animated.\n\nReturns `Nothing` if the element has no skew animation.\n\n","type":"Anim.Engine.WAAPI.AnimGroupName -> Anim.Engine.WAAPI.AnimState msg -> Maybe.Maybe { start : Maybe.Maybe { x : Basics.Float, y : Basics.Float }, end : { x : Basics.Float, y : Basics.Float } }"},{"name":"getSkewStart","comment":" Get the start skew of an element being animated.\n\nReturns `Nothing` if the element has no skew animation.\n\nReturns `Just {x = 0, y = 0}` if no explicit start value was set, which is the default when no start value is set.\n\n","type":"Anim.Engine.WAAPI.AnimGroupName -> Anim.Engine.WAAPI.AnimState msg -> Maybe.Maybe { x : Basics.Float, y : Basics.Float }"},{"name":"getTranslateCurrent","comment":" Get the current translate of an element based on its animation state.\n\nReturns `Nothing` if the element has no translate animation.\n\nReturns the start translate if the animation has not started yet.\n\nReturns the current interpolated translate if the animation is running.\n\nReturns the end translate if the animation has completed.\n\n","type":"Anim.Engine.WAAPI.AnimGroupName -> Anim.Engine.WAAPI.AnimState msg -> Maybe.Maybe { x : Basics.Float, y : Basics.Float, z : Basics.Float }"},{"name":"getTranslateEnd","comment":" Get the end translate of an element being animated.\n\nReturns `Nothing` if the element has no translate animation.\n\n","type":"Anim.Engine.WAAPI.AnimGroupName -> Anim.Engine.WAAPI.AnimState msg -> Maybe.Maybe { x : Basics.Float, y : Basics.Float, z : Basics.Float }"},{"name":"getTranslateRange","comment":" Get the translate range (start and end) of an element being animated.\n\nReturns `Nothing` if the element has no translate animation.\n\n","type":"Anim.Engine.WAAPI.AnimGroupName -> Anim.Engine.WAAPI.AnimState msg -> Maybe.Maybe { start : Maybe.Maybe { x : Basics.Float, y : Basics.Float, z : Basics.Float }, end : { x : Basics.Float, y : Basics.Float, z : Basics.Float } }"},{"name":"getTranslateStart","comment":" Get the start translate of an element being animated.\n\nReturns `Nothing` if the element has no translate animation.\n\nReturns `Just {x = 0, y = 0, z = 0}` if no explicit start value was set, which is the default when no start value is set.\n\n","type":"Anim.Engine.WAAPI.AnimGroupName -> Anim.Engine.WAAPI.AnimState msg -> Maybe.Maybe { x : Basics.Float, y : Basics.Float, z : Basics.Float }"},{"name":"init","comment":" Initialize the engine state.\n\nTakes the command port, message port, and a list of property initializers:\n\n    import Anim.Engine.WAAPI as WAAPI\n    import Anim.Property.Opacity as Opacity\n\n    WAAPI.init motionCmd motionMsg <|\n        [ Opacity.init \"animGroupName\" 0.5\n        , ... -- any other property initializers\n        ]\n\n","type":"(Json.Encode.Value -> Platform.Cmd.Cmd msg) -> ((Json.Decode.Value -> msg) -> Platform.Sub.Sub msg) -> List.List (Anim.Engine.WAAPI.EngineBuilder -> Anim.Engine.WAAPI.EngineBuilder) -> Anim.Engine.WAAPI.AnimState msg"},{"name":"isComplete","comment":" Check if a specific animation group has completed.\n\nReturns `Nothing` if there are no animations for the group.\n\n","type":"Anim.Engine.WAAPI.AnimGroupName -> Anim.Engine.WAAPI.AnimState msg -> Maybe.Maybe Basics.Bool"},{"name":"isRunning","comment":" Check if a specific animation group is currently running.\n\nReturns `Nothing` if there are no animations for the group.\n\n","type":"Anim.Engine.WAAPI.AnimGroupName -> Anim.Engine.WAAPI.AnimState msg -> Maybe.Maybe Basics.Bool"},{"name":"iterations","comment":" Set how many times an animation should repeat.\n","type":"Basics.Int -> Anim.Engine.WAAPI.EngineBuilder -> Anim.Engine.WAAPI.EngineBuilder"},{"name":"loopForever","comment":" Make an animation loop infinitely.\n","type":"Anim.Engine.WAAPI.EngineBuilder -> Anim.Engine.WAAPI.EngineBuilder"},{"name":"onResize","comment":" A resize handler that updates animation configurations in response to a\nlayout changes.\n\nPair this with the `bounds` functions in property modules in order to remap the\nproperties to new element dimensions or positions on the fly.\n\nExample resize handler targeting two groups in one call:\n\n    import Anim.Engine.WAAPI as WAAPI\n    import Anim.Property.Scale as Scale\n    import Anim.Property.Translate as Translate\n\n    GotTrack (Ok element) ->\n        let\n            ( animState, animCmd ) =\n                WAAPI.onResize model.animState <|\n                    Translate.bounds \"box\" translateBounds\n                        >> Scale.bounds \"cube\" scaleBounds\n        in\n        ( { model | animState = animState }\n        , animCmd\n        )\n\n","type":"Anim.Engine.WAAPI.AnimState msg -> (Anim.Engine.WAAPI.AnimBuilder Anim.Internal.Builder.ForResizeWAAPI -> Anim.Engine.WAAPI.AnimBuilder Anim.Internal.Builder.ForResizeWAAPI) -> ( Anim.Engine.WAAPI.AnimState msg, Platform.Cmd.Cmd msg )"},{"name":"pause","comment":" Pause a running animation.\n\n    import Anim.Engine.WAAPI as WAAPI\n\n    let\n        ( animState, pauseCmd ) =\n            WAAPI.pause \"animGroup\" model.animState\n    in\n    ( { model | animState = animState }, pauseCmd )\n\n","type":"Anim.Engine.WAAPI.AnimGroupName -> Anim.Engine.WAAPI.AnimState msg -> ( Anim.Engine.WAAPI.AnimState msg, Platform.Cmd.Cmd msg )"},{"name":"reset","comment":" Reset an animation by instantly jumping back to its start state.\n\n    import Anim.Engine.WAAPI as WAAPI\n\n    let\n        ( animState, resetCmd ) =\n            WAAPI.reset \"animGroup\" model.animState\n    in\n    ( { model | animState = animState }, resetCmd )\n\n","type":"Anim.Engine.WAAPI.AnimGroupName -> Anim.Engine.WAAPI.AnimState msg -> ( Anim.Engine.WAAPI.AnimState msg, Platform.Cmd.Cmd msg )"},{"name":"restart","comment":" Restart an animation from the beginning.\n\n    import Anim.Engine.WAAPI as WAAPI\n\n    let\n        ( animState, restartCmd ) =\n            WAAPI.restart \"animGroup\" model.animState\n    in\n    ( { model | animState = animState }, restartCmd )\n\n","type":"Anim.Engine.WAAPI.AnimGroupName -> Anim.Engine.WAAPI.AnimState msg -> ( Anim.Engine.WAAPI.AnimState msg, Platform.Cmd.Cmd msg )"},{"name":"resume","comment":" Resume a paused animation.\n\n    import Anim.Engine.WAAPI as WAAPI\n\n    let\n        ( animState, resumeCmd ) =\n            WAAPI.resume \"animGroup\" model.animState\n    in\n    ( { model | animState = animState }, resumeCmd )\n\n","type":"Anim.Engine.WAAPI.AnimGroupName -> Anim.Engine.WAAPI.AnimState msg -> ( Anim.Engine.WAAPI.AnimState msg, Platform.Cmd.Cmd msg )"},{"name":"retarget","comment":" Change the targeted properties instantly to their new values. If currently animating,\nstop.\n\nThis is a convenience function for immediately snapping properties or axes to new values\nwithout needing to construct a full animation builder with `animate`.\n\nJust target the properties or axes you want to change, and any properties or axes you\ndon't mention will be left untouched - if mid-flight, they will continue.\n\n    import Anim.Engine.WAAPI as WAAPI\n    import Anim.Property.Translate as Translate\n\n    let\n        ( animState, animCmd ) =\n            WAAPI.retarget model.animState <|\n                WAAPI.for \"animGroupName\"\n                    >> Translate.begin\n                    >> Translate.toY 0\n                    >> Translate.end\n    in\n    ( { model | animState = animState }, animCmd )\n\n","type":"Anim.Engine.WAAPI.AnimState msg -> (Anim.Engine.WAAPI.EngineBuilder -> Anim.Engine.WAAPI.EngineBuilder) -> ( Anim.Engine.WAAPI.AnimState msg, Platform.Cmd.Cmd msg )"},{"name":"rotate","comment":" Freeze the rotate property.\n","type":"Anim.Engine.WAAPI.FreezeProperty"},{"name":"scale","comment":" Freeze the scale property.\n","type":"Anim.Engine.WAAPI.FreezeProperty"},{"name":"setUpdateThrottle","comment":" Set the minimum interval in milliseconds between per-frame\n`propertyUpdate` emissions from the JavaScript runtime.\n\nThe visual animation is driven by the browser compositor and is **never**\naffected by this setting - it only controls how much port traffic is generated.\n\nThis is a precedence function, so it can operate as a global setting for all\ngroups in the builder chain, or you can set it on a per-group basis which\noverrides any global setting for that group.\n\n  - Pass `0` (the default) to emit on every `requestAnimationFrame` tick,\n    matching the display refresh rate (60 Hz, 120 Hz, 144 Hz, …).\n  - Pass a positive number of milliseconds to cap the emission rate, e.g.\n    `16` for ~60 Hz, `33` for ~30 Hz.\n\n**Note**: Higher throttle values reduce Elm-side mid-flight precision for\nqueries and interruption bookkeeping.\n\n    WAAPI.setUpdateThrottle 33 -- global default\n            >> WAAPI.for \"hero\"\n            >> WAAPI.setUpdateThrottle 0 -- dense updates for interactions\n            >> ... -- other builders\n            >> WAAPI.for \"background\"\n            >> WAAPI.setUpdateThrottle 50 -- lower traffic for passive motion\n            >> ... -- other builders\n\n","type":"Basics.Int -> Anim.Engine.WAAPI.EngineBuilder -> Anim.Engine.WAAPI.EngineBuilder"},{"name":"skew","comment":" Freeze the skew property.\n","type":"Anim.Engine.WAAPI.FreezeProperty"},{"name":"speed","comment":" Set the global speed for all animations in this builder.\n\n    introAnim : EngineBuilder -> EngineBuilder\n    introAnim =\n        speed 300\n            >> slideDownHeader\n            >> slideInSidebar\n            >> slideUpContent\n\n","type":"Basics.Float -> Anim.Engine.WAAPI.EngineBuilder -> Anim.Engine.WAAPI.EngineBuilder"},{"name":"spring","comment":" Set the global spring.\n\n    draggableCardSettle : EngineBuilder -> EngineBuilder\n    draggableCardSettle =\n        spring Spring.wobbly\n            >> settleCardPosition\n            >> settleCardShadow\n\n","type":"Motion.Spring.Spring -> Anim.Engine.WAAPI.EngineBuilder -> Anim.Engine.WAAPI.EngineBuilder"},{"name":"stop","comment":" Stop a running animation by instantly jumping to its end state.\n\n    import Anim.Engine.WAAPI as WAAPI\n\n    let\n        ( animState, stopCmd ) =\n            WAAPI.stop \"animGroup\" model.animState\n    in\n    ( { model | animState = animState }, stopCmd )\n\n","type":"Anim.Engine.WAAPI.AnimGroupName -> Anim.Engine.WAAPI.AnimState msg -> ( Anim.Engine.WAAPI.AnimState msg, Platform.Cmd.Cmd msg )"},{"name":"subscriptions","comment":" Subscribe to receive animation updates from JavaScript.\n\nWithout this, your app won't receive any animation events or updates.\n\n    import Anim.Engine.WAAPI as WAAPI\n\n    type Msg\n        = WaapiMsg WAAPI.AnimMsg\n        | ...\n\n    subscriptions : Model -> Sub Msg\n    subscriptions model =\n        WAAPI.subscriptions WaapiMsg model.animState\n\n","type":"(Anim.Engine.WAAPI.AnimMsg -> msg) -> Anim.Engine.WAAPI.AnimState msg -> Platform.Sub.Sub msg"},{"name":"transformOrder","comment":" Set the transform order.\n\nThe transform order specifies how `translate`, `rotate`, `skew` and `scale` transforms\nare combined. Start the list with the transform to apply first.\n\nThis is a precedence function, so it can operate as a global setting for all groups in the\nbuilder chain, or you can set it on a per-group basis which overrides any global setting\nfor that group.\n\nAny missing transforms are automatically appended in the default order\n(`Translate` → `Rotate` → `Skew` → `Scale`).\n\n    import Anim.Engine.WAAPI as WAAPI\n    import Anim.Extra.TransformOrder exposing (TransformProperty(..))\n\n    WAAPI.transformOrder [ Scale, Rotate, Translate, Skew ] -- global setting\n        >> WAAPI.for \"box\"\n        >> WAAPI.transformOrder [ Rotate, Translate ] -- overrides global for this group\n        >> ... -- other builders\n\n","type":"List.List Anim.Extra.TransformOrder.TransformProperty -> Anim.Engine.WAAPI.EngineBuilder -> Anim.Engine.WAAPI.EngineBuilder"},{"name":"translate","comment":" Freeze the translate property.\n","type":"Anim.Engine.WAAPI.FreezeProperty"},{"name":"unfreezeX","comment":" Unfreeze the X axis of the specified properties, allowing it to animate again.\n","type":"List.List Anim.Engine.WAAPI.FreezeProperty -> Anim.Engine.WAAPI.EngineBuilder -> Anim.Engine.WAAPI.EngineBuilder"},{"name":"unfreezeXY","comment":" Unfreeze the X and Y axes of the specified properties.\n","type":"List.List Anim.Engine.WAAPI.FreezeProperty -> Anim.Engine.WAAPI.EngineBuilder -> Anim.Engine.WAAPI.EngineBuilder"},{"name":"unfreezeXYZ","comment":" Unfreeze all axes of the specified properties.\n","type":"List.List Anim.Engine.WAAPI.FreezeProperty -> Anim.Engine.WAAPI.EngineBuilder -> Anim.Engine.WAAPI.EngineBuilder"},{"name":"unfreezeXZ","comment":" Unfreeze the X and Z axes of the specified properties.\n","type":"List.List Anim.Engine.WAAPI.FreezeProperty -> Anim.Engine.WAAPI.EngineBuilder -> Anim.Engine.WAAPI.EngineBuilder"},{"name":"unfreezeY","comment":" Unfreeze the Y axis of the specified properties, allowing it to animate again.\n","type":"List.List Anim.Engine.WAAPI.FreezeProperty -> Anim.Engine.WAAPI.EngineBuilder -> Anim.Engine.WAAPI.EngineBuilder"},{"name":"unfreezeYZ","comment":" Unfreeze the Y and Z axes of the specified properties.\n","type":"List.List Anim.Engine.WAAPI.FreezeProperty -> Anim.Engine.WAAPI.EngineBuilder -> Anim.Engine.WAAPI.EngineBuilder"},{"name":"unfreezeZ","comment":" Unfreeze the Z axis of the specified properties, allowing it to animate again.\n","type":"List.List Anim.Engine.WAAPI.FreezeProperty -> Anim.Engine.WAAPI.EngineBuilder -> Anim.Engine.WAAPI.EngineBuilder"},{"name":"update","comment":" Handle messages from this engine.\n\nReturns the updated state and the event for this message.\n\nMessages that do not belong to this engine return `(animState, Nothing)`.\n\n    import Anim.Engine.WAAPI as WAAPI\n\n    update : Msg -> Model -> ( Model, Cmd Msg )\n    update msg model =\n        case msg of\n            WaapiMsg animMsg ->\n                let\n                    ( animState, maybeAnimEvent ) =\n                        WAAPI.update animMsg model.animState\n                in\n                handleAnimationEvent maybeAnimEvent { model | animState = animState }\n\n    handleAnimationEvent : Maybe WAAPI.AnimEvent -> Model -> ( Model, Cmd Msg )\n    handleAnimationEvent event model =\n        case event of\n            ...\n\n","type":"Anim.Engine.WAAPI.AnimMsg -> Anim.Engine.WAAPI.AnimState msg -> ( Anim.Engine.WAAPI.AnimState msg, Maybe.Maybe Anim.Engine.WAAPI.AnimEvent )"},{"name":"withProgressEvents","comment":" Opt in to per-frame `Progress` events.\n\nOff by default.\n\nProgress events can create a lot of noise in your update loop,\nespecially when debugging the `Msg` flow in your app. Therefore\nthey are suppressed by default and you need to explicitly opt in\nto receive them.\n\nThis is a precedence function, so it can operate as a global setting for all\ngroups in the builder chain, or you can set it on a per-group basis which\noverrides any global setting for that group.\n\n    WAAPI.withProgressEvents True -- global setting\n        >> WAAPI.for \"box\"\n        >> WAAPI.withProgressEvents False -- overrides global for this group\n        >> ... -- other builders\n\n","type":"Basics.Bool -> Anim.Engine.WAAPI.EngineBuilder -> Anim.Engine.WAAPI.EngineBuilder"}],"binops":[]},{"name":"Anim.Extra.Color","comment":" Color manipulation and conversion utilities for the shared Color type.\n\nUse these functions to create, transform, and convert colors in various formats, then use them in animations.\n\n\n# Color Type\n\n@docs Color\n\n\n# Color Constructors\n\nUse these functions to create colors.\n\n@docs hex, rgb, rgba, hsl, hsla, elmColor\n\n\n# Color Transformations\n\n\n## Hex Colors\n\n@docs fromHex, toHex\n\n\n## RGB Colors\n\n@docs fromRgb, fromRgba, toRgb, toRgba\n\n\n## HSL Colors\n\n@docs fromHsl, fromHsla, toHsl, toHsla\n\n\n## Elm Color\n\nUse colors from the [avh4/elm-color](https://package.elm-lang.org/packages/avh4/elm-color/latest/) package.\n\n@docs fromElmColor, toElmColor\n\n\n## Parsing\n\n@docs fromString\n\n\n# Manipulation\n\n@docs setAlpha, brighten, darken, saturate, desaturate\n\n\n# Common Colors\n\n@docs transparent, black, white, red, green, blue\n\n","unions":[],"aliases":[{"name":"Color","comment":" Color used in animations.\n","args":[],"type":"Anim.Internal.Extra.Color.Color"}],"values":[{"name":"black","comment":" ","type":"Anim.Extra.Color.Color"},{"name":"blue","comment":" ","type":"Anim.Extra.Color.Color"},{"name":"brighten","comment":" Increase the lightness of a color.\n\n    brighten 0.2 <|\n        fromRgb { r = 100, g = 100, b = 100 } -- Lighter gray\n\n","type":"Basics.Float -> Anim.Extra.Color.Color -> Anim.Extra.Color.Color"},{"name":"darken","comment":" Decrease the lightness of a color.\n\n    darken 0.2 <|\n        fromRgb { r = 100, g = 100, b = 100 } -- Darker gray\n\n","type":"Basics.Float -> Anim.Extra.Color.Color -> Anim.Extra.Color.Color"},{"name":"desaturate","comment":" Decrease the saturation of a color.\n\n    desaturate 0.2 <|\n        fromHsl {h = 0, s = 50, l = 50} -- Less saturated red\n\n","type":"Basics.Float -> Anim.Extra.Color.Color -> Anim.Extra.Color.Color"},{"name":"elmColor","comment":" Create a Color from an [elm-color](https://package.elm-lang.org/packages/avh4/elm-color/latest/) Color value.\n\n    elmColor Color.red\n\n","type":"Color.Color -> Anim.Extra.Color.Color"},{"name":"fromElmColor","comment":" Create a [Color](#Color) from an [elm-color](https://package.elm-lang.org/packages/avh4/elm-color/latest/) [Color](https://package.elm-lang.org/packages/avh4/elm-color/latest/Color) value.\n\n    import Color\n\n    fromElmColor Color.red\n\n","type":"Color.Color -> Anim.Extra.Color.Color"},{"name":"fromHex","comment":" Create a color from a hex string.\n\n    fromHex \"#ff0000\" -- Just Red\n\n    fromHex \"#f00\" -- Just Red (shorthand)\n\n    fromHex \"invalid\" -- Nothing\n\nInvalid hex strings will return `Nothing`.\n\n","type":"String.String -> Maybe.Maybe Anim.Extra.Color.Color"},{"name":"fromHsl","comment":" Create a Color from HSL components.\n\n  - `h` (hue): 0-360 degrees\n  - `s` (saturation): 0-100 percent\n  - `l` (lightness): 0-100 percent\n\n```\nfromHsl { h = 0, s = 100, l = 50 } -- Red\n```\n\n","type":"{ h : Basics.Float, s : Basics.Float, l : Basics.Float } -> Anim.Extra.Color.Color"},{"name":"fromHsla","comment":" Create a Color from HSLA components.\n\n  - `h` (hue): 0-360 degrees\n  - `s` (saturation): 0-100 percent\n  - `l` (lightness): 0-100 percent\n  - `a` (alpha): 0-1\n\n```\nfromHsla { h = 0, s = 100, l = 50, a = 0.5 } -- Semi-transparent red\n```\n\n","type":"{ h : Basics.Float, s : Basics.Float, l : Basics.Float, a : Basics.Float } -> Anim.Extra.Color.Color"},{"name":"fromRgb","comment":" Create a Color from RGB components.\n\n    fromRgb { r = 255, g = 0, b = 0 } -- Red\n\n","type":"{ r : Basics.Int, g : Basics.Int, b : Basics.Int } -> Anim.Extra.Color.Color"},{"name":"fromRgba","comment":" Create a Color from RGBA components.\n\n    fromRgba { r = 255, g = 0, b = 0, a = 0.5 } -- Semi-transparent red\n\n","type":"{ r : Basics.Int, g : Basics.Int, b : Basics.Int, a : Basics.Float } -> Anim.Extra.Color.Color"},{"name":"fromString","comment":" Parse a color from various string formats.\n\nSupports:\n\n  - Hex: \"#ff0000\", \"#f00\", \"ff0000\", \"f00\"\n\n  - RGB: \"rgb(255, 0, 0)\"\n\n  - RGBA: \"rgba(255, 0, 0, 0.5)\"\n\n  - HSL: \"hsl(0, 100%, 50%)\"\n\n  - HSLA: \"hsla(0, 100%, 50%, 0.5)\"\n\n```elm\nfromString \"#ff0000\" -- Just red\n\nfromString \"rgb(255, 0, 0)\" -- Just red\n\nfromString \"invalid\" -- Nothing\n```\n\n","type":"String.String -> Maybe.Maybe Anim.Extra.Color.Color"},{"name":"green","comment":" ","type":"Anim.Extra.Color.Color"},{"name":"hex","comment":" Create a hex color from a string.\n\n    hex \"#ff0000\" -- Red\n\n    hex \"#f00\" -- Red (shorthand)\n\n    hex \"ff0000\" -- Red (without #)\n\nInvalid hex strings will return `Nothing`.\n\n","type":"String.String -> Maybe.Maybe Anim.Extra.Color.Color"},{"name":"hsl","comment":" Create an HSL color from individual components.\n\n  - `h` (hue): 0-360 degrees\n  - `s` (saturation): 0-100 percent\n  - `l` (lightness): 0-100 percent\n\n```\nhsl 0 100 50 -- Red\n```\n\n","type":"Basics.Float -> Basics.Float -> Basics.Float -> Anim.Extra.Color.Color"},{"name":"hsla","comment":" Create an HSLA color from individual components.\n\n  - `h` (hue): 0-360 degrees\n  - `s` (saturation): 0-100 percent\n  - `l` (lightness): 0-100 percent\n  - `a` (alpha): 0-1\n\n```\nhsla 0 100 50 0.5 -- Semi-transparent red\n```\n\n","type":"Basics.Float -> Basics.Float -> Basics.Float -> Basics.Float -> Anim.Extra.Color.Color"},{"name":"red","comment":" ","type":"Anim.Extra.Color.Color"},{"name":"rgb","comment":" Create an RGB color from individual components.\n\n    rgb 255 0 0 -- Red\n\n","type":"Basics.Int -> Basics.Int -> Basics.Int -> Anim.Extra.Color.Color"},{"name":"rgba","comment":" Create an RGBA color from individual components.\n\n    rgba 255 0 0 0.5 -- Semi-transparent red\n\n","type":"Basics.Int -> Basics.Int -> Basics.Int -> Basics.Float -> Anim.Extra.Color.Color"},{"name":"saturate","comment":" Increase the saturation of a color.\n\n    saturate 0.2 <|\n        fromHsl {h = 0, s = 50, l = 50} -- More saturated red\n\n","type":"Basics.Float -> Anim.Extra.Color.Color -> Anim.Extra.Color.Color"},{"name":"setAlpha","comment":" Set the alpha (transparency) value of a color.\n\n    -- Semi-transparent red\n    setAlpha 0.5 <|\n        fromRgb { r = 255, g = 0, b = 0 }\n\n","type":"Basics.Float -> Anim.Extra.Color.Color -> Anim.Extra.Color.Color"},{"name":"toElmColor","comment":" Convert a Color to an [elm-color](https://package.elm-lang.org/packages/avh4/elm-color/latest/) [Color](https://package.elm-lang.org/packages/avh4/elm-color/latest/Color) value.\n","type":"Anim.Extra.Color.Color -> Color.Color"},{"name":"toHex","comment":" Convert a Color to a hex string .\n","type":"Anim.Extra.Color.Color -> String.String"},{"name":"toHsl","comment":" Convert a Color to an HSL color record.\n","type":"Anim.Extra.Color.Color -> { h : Basics.Float, s : Basics.Float, l : Basics.Float }"},{"name":"toHsla","comment":" Convert a Color to an HSLA color record.\n","type":"Anim.Extra.Color.Color -> { h : Basics.Float, s : Basics.Float, l : Basics.Float, a : Basics.Float }"},{"name":"toRgb","comment":" Convert a Color to an RGB color record.\n","type":"Anim.Extra.Color.Color -> { r : Basics.Int, g : Basics.Int, b : Basics.Int }"},{"name":"toRgba","comment":" Convert a Color to an RGBA color record.\n","type":"Anim.Extra.Color.Color -> { r : Basics.Int, g : Basics.Int, b : Basics.Int, a : Basics.Float }"},{"name":"transparent","comment":" Fully transparent white.\n","type":"Anim.Extra.Color.Color"},{"name":"white","comment":" ","type":"Anim.Extra.Color.Color"}],"binops":[]},{"name":"Anim.Extra.TransformOrder","comment":" **Note**: You probably won't need this module much, if at all. The default transform order is sufficient for the vast majority\nof use cases, but you can customize it if needed.\n\nThe order of transform properties affects the final result of animations.\nFor example, if you rotate an element and then translate it, you will get a different result\nthan if you translate it first and then rotate it.\n\nAll Engines use the same default transform order, which is: `translate`, then `rotate`, then `skew`, then `scale`.\nUse the `transformOrder` function from each engine to change the order.\n\nThe only Engine that does not support customizing the transform order is the Transition Engine, which\nwas a design trade-off. See the\n[Transition Engine - Transform Ordering](https://phollyer.github.io/elm-motion/animation/engines/transition/#transform-ordering)\nfor details.\n\n📖 See [Transform Ordering](https://phollyer.github.io/elm-motion/animation/concepts/transform-order/)\nfor details.\n\n@docs TransformProperty\n\n@docs default\n\n","unions":[{"name":"TransformProperty","comment":" Represents transform properties.\n","args":[],"cases":[["Translate",[]],["Rotate",[]],["Skew",[]],["Scale",[]]]}],"aliases":[],"values":[{"name":"default","comment":" The default order in which transform properties are applied when multiple transform\nproperties are being animated at the same time.\n\nThe default order is: `translate`, then `rotate`, then `skew`, then `scale`.\n\n","type":"List.List Anim.Extra.TransformOrder.TransformProperty"}],"binops":[]},{"name":"Anim.Extra.View3D","comment":" Create 3D animations.\n\n📖 See the [3D Animations Documentation](https://phollyer.github.io/elm-motion/animation/concepts/3d-animations/) for details.\n\n\n# Perspective\n\n@docs perspective\n\n\n# Perspective Origin\n\n@docs PerspectiveOrigin, perspectiveOrigin\n\n\n# Backface Visibility\n\n@docs BackfaceVisibility, backfaceVisibility\n\n\n# Transform Style\n\n@docs TransformStyle, transformStyle\n\n\n# Workarounds\n\n@docs opacityHack\n\n","unions":[{"name":"BackfaceVisibility","comment":" Whether the back face of an element is visible when rotated.\n\n  - `Visible` — Back face is shown (browser default).\n  - `Hidden` — Back face is invisible.\n\n","args":[],"cases":[["Visible",[]],["Hidden",[]]]},{"name":"PerspectiveOrigin","comment":" The origin point for perspective calculations.\n\n  - `Center` — Center of the element (browser default).\n  - `TopLeft`, `TopCenter`, `TopRight`, `LeftMiddle`, `RightMiddle`, `BottomLeft`, `BottomCenter`, `BottomRight` — Named positions.\n  - `Percent Float Float` — Custom position as percentages from left and top.\n  - `Px Float Float` — Custom position in pixels from left and top.\n\n","args":[],"cases":[["Center",[]],["TopLeft",[]],["TopCenter",[]],["TopRight",[]],["LeftMiddle",[]],["RightMiddle",[]],["BottomLeft",[]],["BottomCenter",[]],["BottomRight",[]],["Percent",["Basics.Float","Basics.Float"]],["Px",["Basics.Float","Basics.Float"]]]},{"name":"TransformStyle","comment":" Whether children are flattened onto the parent's plane or rendered in 3D space.\n\n  - `Flat` — Children are flattened (browser default).\n  - `Preserve3D` — Children keep their own 3D positions.\n\n","args":[],"cases":[["Flat",[]],["Preserve3D",[]]]}],"aliases":[],"values":[{"name":"backfaceVisibility","comment":" Set the `backface-visibility` CSS property on an element.\n\nEssential for card flip animations where you don't want to see\nthe mirrored back of the front face.\n\n    import Anim.Extra.View3D exposing (BackfaceVisibility(..))\n\n    -- Front of card\n    div\n        [ class \"card-front\"\n        , View3D.backfaceVisibility Hidden\n        ]\n        [ text \"Front\" ]\n\n    -- Back of card (rotated 180°)\n    div\n        [ class \"card-back\"\n        , style \"transform\" \"rotateY(180deg)\"\n        , View3D.backfaceVisibility Hidden\n        ]\n        [ text \"Back\" ]\n\n","type":"Anim.Extra.View3D.BackfaceVisibility -> Html.Attribute msg"},{"name":"opacityHack","comment":" Hack for Chrome GPU compositing issues on macOS.\n\nSome complex 3D animations may cause rendering artifacts in Chrome on macOS\n(colored rectangles appearing over the page). Apply this attribute to the\n**direct parent** of the animated element to 'fix' the issue.\n\n    div\n        [ View3D.opacityHack\n        , View3D.perspective 1000\n        ]\n        [ animated3DElement ]\n\nThis sets `opacity: 0.99`, which forces a new compositing layer without\nvisible effect. From what I could discover, when the new compositing layer\nis created, it bypasses the GPU compositing issues.\n\nYou can safely include this on all 3D containers.\n\n**Note**: This is a hack, not a perfect solution - YMMV - suggestions welcome.\n\n","type":"Html.Attribute msg"},{"name":"perspective","comment":" Set the perspective depth on a container element.\n\nPerspective controls the intensity of the 3D effect. Smaller values create\nmore dramatic effects, larger values are more subtle. A good starting point is around 800-1200px.\n\nPerspective applies to **direct children** of the element. For deeper nesting,\nsee [transformStyle](#transformStyle).\n\n","type":"Basics.Float -> Html.Attribute msg"},{"name":"perspectiveOrigin","comment":" Set the `perspective-origin` CSS property on a container element.\n\nControls where the viewer is looking from. Default is `Center`.\n\n    import Anim.Extra.View3D exposing (PerspectiveOrigin(..))\n\n    -- Vanishing point at top-left corner\n    div\n        [ View3D.perspective 1000\n        , View3D.perspectiveOrigin TopLeft\n        ]\n        [ card ]\n\n    -- Custom vanishing point at 25% from left, 75% from top\n    div\n        [ View3D.perspective 1000\n        , View3D.perspectiveOrigin (Percent 25 75)\n        ]\n        [ card ]\n\n","type":"Anim.Extra.View3D.PerspectiveOrigin -> Html.Attribute msg"},{"name":"transformStyle","comment":" Set the `transform-style` CSS property on an element.\n\n    import Anim.Extra.View3D exposing (TransformStyle(..))\n\n    -- Parent maintains 3D context for children\n    div\n        [ View3D.perspective 1000\n        , View3D.transformStyle Preserve3D\n        ]\n        [ rotatedChild1\n        , rotatedChild2\n        ]\n\n","type":"Anim.Extra.View3D.TransformStyle -> Html.Attribute msg"}],"binops":[]},{"name":"Anim.Property.Custom","comment":" Animate any numeric CSS property not covered by the first-class\nproperty modules (Translate, Rotate, Scale etc.).\n\n**Default**: 0\n\nWhen no start value is configured, the default will be used.\n\n\n# Types\n\n@docs Builder, AnimGroupName, Property\n\n\n# Initialize\n\n@docs init\n\n\n# Build\n\n@docs begin, end\n\n\n# Configure\n\n\n## Start Value\n\nWhen not set, the default will be used.\n\n📖 See [Start Values](https://phollyer.github.io/elm-motion/animation/properties/overview/#start-values)\nfor details.\n\n@docs from\n\n\n## End Value\n\n📖 See [End Values](https://phollyer.github.io/elm-motion/animation/properties/overview/#end-values)\nfor details.\n\n\n### Absolute\n\n@docs to\n\n\n### Relative\n\nMove by a delta instead of to a fixed value. The end value is\n`current + delta`, where `current` is the live animated value.\n\nOnly available on the Sub and WAAPI engines. Using these with\nany other engine results in a type error.\n\n@docs by\n\n\n## Timing\n\n📖 See [Animation Timing](https://phollyer.github.io/elm-motion/animation/concepts/timing/)\nfor details.\n\n@docs delay, duration, speed\n\n\n## Easing\n\n📖 See [Easing](https://phollyer.github.io/elm-motion/animation/concepts/easing/)\nfor details.\n\n@docs easing\n\n\n## Spring\n\n📖 See [Spring](https://phollyer.github.io/elm-motion/animation/concepts/spring/)\nfor details.\n\n@docs spring\n\n\n## Clamping\n\nKeep property values within a range you choose.\n\nValues outside the range are clamped to the nearest boundary.\n\nThe range stays in effect for future animations\nuntil you [Unclamp](#unclamp) it:\n\n    update msg model =\n        case msg of\n            FontSizeChanged size ->\n                let\n                    ( animState, cmd ) =\n                        WAAPI.animate model.animState <|\n                            Custom.begin (Custom.FontSize Px)\n                                >> Custom.to size\n                                >> Custom.clamp 12 32\n                                >> Custom.end\n                in\n                ( { model | animState = animState }\n                , cmd\n                )\n\nUseful if `to` values are coming from external sources; user input, slider values, or external data\netc, and you need to keep them within a specific range.\n\nPairs well with [by](#by) for relative animations where the delta could push the value outside the desired range.\n\n\n### Clamp\n\n@docs clamp\n\n\n### Unclamp\n\n@docs unclamp\n\n\n## Snap\n\n@docs set\n\n","unions":[{"name":"Property","comment":" A typed set of common numeric CSS properties with a custom escape hatch.\n\n    import Anim.Property.Custom as Property\n    import Anim.Unit exposing (Unit(..))\n\n\n    Property.begin (Property.LineHeight Em)\n        >> Property.to 1.4 -- Animate to \"1.4em\"\n        >> Property.end\n\n    Property.begin (Property.LineHeight Unitless)\n        >> Property.to 1.4 -- Animate to \"1.4\" - 1.4x the element's font-size\n        >> Property.end\n\n    Property.begin (Property.Custom \"property-name\" \"unit\")\n        >> Property.to 32 -- Animate to \"32unit\"\n        >> Property.end\n\n","args":[],"cases":[["BorderBottomLeftRadius",["Anim.Unit.Unit"]],["BorderBottomRightRadius",["Anim.Unit.Unit"]],["BorderBottomWidth",["Anim.Unit.Unit"]],["BorderLeftWidth",["Anim.Unit.Unit"]],["BorderRadius",["Anim.Unit.Unit"]],["BorderRightWidth",["Anim.Unit.Unit"]],["BorderTopLeftRadius",["Anim.Unit.Unit"]],["BorderTopRightRadius",["Anim.Unit.Unit"]],["BorderTopWidth",["Anim.Unit.Unit"]],["BorderWidth",["Anim.Unit.Unit"]],["Bottom",["Anim.Unit.Unit"]],["ColumnGap",["Anim.Unit.Unit"]],["ColumnWidth",["Anim.Unit.Unit"]],["FontSize",["Anim.Unit.Unit"]],["Gap",["Anim.Unit.Unit"]],["Inset",["Anim.Unit.Unit"]],["Left",["Anim.Unit.Unit"]],["LetterSpacing",["Anim.Unit.Unit"]],["LineHeight",["Anim.Unit.Unit"]],["Margin",["Anim.Unit.Unit"]],["MarginBottom",["Anim.Unit.Unit"]],["MarginLeft",["Anim.Unit.Unit"]],["MarginRight",["Anim.Unit.Unit"]],["MarginTop",["Anim.Unit.Unit"]],["MaxHeight",["Anim.Unit.Unit"]],["MaxWidth",["Anim.Unit.Unit"]],["MinHeight",["Anim.Unit.Unit"]],["MinWidth",["Anim.Unit.Unit"]],["OutlineOffset",["Anim.Unit.Unit"]],["OutlineWidth",["Anim.Unit.Unit"]],["Padding",["Anim.Unit.Unit"]],["PaddingBottom",["Anim.Unit.Unit"]],["PaddingLeft",["Anim.Unit.Unit"]],["PaddingRight",["Anim.Unit.Unit"]],["PaddingTop",["Anim.Unit.Unit"]],["Perspective",["Anim.Unit.Unit"]],["Right",["Anim.Unit.Unit"]],["RowGap",["Anim.Unit.Unit"]],["TabSize",["Anim.Unit.Unit"]],["TextIndent",["Anim.Unit.Unit"]],["Top",["Anim.Unit.Unit"]],["WordSpacing",["Anim.Unit.Unit"]],["FlexBasis",["Anim.Unit.Unit"]],["FlexGrow",[]],["FlexShrink",[]],["Cx",[]],["Cy",[]],["R",[]],["Rx",[]],["Ry",[]],["StrokeDashOffset",[]],["StrokeWidth",[]],["Custom",["String.String","String.String"]]]}],"aliases":[{"name":"AnimGroupName","comment":" Type alias for the animation group name.\n","args":[],"type":"String.String"},{"name":"Builder","comment":" Builder type for custom property animations.\n","args":["eng"],"type":"Anim.Internal.Property.Custom.Builder eng"}],"values":[{"name":"begin","comment":" Begin the animation configuration by turning an `AnimBuilder` into a custom property animation `Builder`.\n\n    import Anim.Unit exposing (Unit(..))\n\n    myAnimation : AnimBuilder eng -> AnimBuilder eng\n    myAnimation =\n        Property.begin (Property.BorderRadius Px)\n            >> Property.to 16\n            >> Property.end\n\n","type":"Anim.Property.Custom.Property -> Anim.Internal.Builder.AnimBuilder eng -> Anim.Property.Custom.Builder eng"},{"name":"by","comment":" Move by a delta instead of to a fixed value.\n\n    import Anim.Property.Custom as Property\n    import Anim.Unit exposing (Unit(..))\n\n    myAnimation : AnimBuilder eng -> AnimBuilder eng\n    myAnimation =\n        Property.begin (Property.BorderRadius Px)\n            >> Property.by 4\n            >> Property.end\n\n","type":"Basics.Float -> Anim.Property.Custom.Builder { eng | withLiveDelta : () } -> Anim.Property.Custom.Builder { eng | withLiveDelta : () }"},{"name":"clamp","comment":" Keep this CSS property's value within the min and max range.\n\nIf `min > max`, the values are swapped.\n\n","type":"Basics.Float -> Basics.Float -> Anim.Property.Custom.Builder eng -> Anim.Property.Custom.Builder eng"},{"name":"delay","comment":" Set the delay (milliseconds) before the animation starts.\n","type":"Basics.Int -> Anim.Property.Custom.Builder { eng | withTiming : () } -> Anim.Property.Custom.Builder { eng | withTiming : () }"},{"name":"duration","comment":" Set the animation duration (milliseconds).\n","type":"Basics.Int -> Anim.Property.Custom.Builder { eng | withTiming : () } -> Anim.Property.Custom.Builder { eng | withTiming : () }"},{"name":"easing","comment":" Set the easing function.\n\n    import Motion.Easing exposing (Easing(..))\n\n    Property.easing EaseInOut\n\n","type":"Motion.Easing.Easing -> Anim.Property.Custom.Builder eng -> Anim.Property.Custom.Builder eng"},{"name":"end","comment":" Complete the animation configuration and return an `AnimBuilder`.\n","type":"Anim.Property.Custom.Builder eng -> Anim.Internal.Builder.AnimBuilder eng"},{"name":"from","comment":" Set the starting value.\n","type":"Basics.Float -> Anim.Property.Custom.Builder eng -> Anim.Property.Custom.Builder eng"},{"name":"init","comment":" Set the initial value for a custom CSS property.\n\nUse this to initialize the property in your Engine's `init` function.\n\n    import Anim.Engine.* as Engine\n    import Anim.Property.Custom as Property\n    import Anim.Unit exposing (Unit(..))\n\n    init : ( Model, Cmd Msg )\n    init =\n        ( { animState =\n                Engine.init\n                    [ Property.init \"box\" (BorderRadius Px) 0 ]\n          }\n        , Cmd.none\n        )\n\n","type":"Anim.Property.Custom.AnimGroupName -> Anim.Property.Custom.Property -> Basics.Float -> Anim.Internal.Builder.AnimBuilder eng -> Anim.Internal.Builder.AnimBuilder eng"},{"name":"set","comment":" Snap the value silently, cancelling any in-flight animation\non this property.\n","type":"Basics.Float -> Anim.Property.Custom.Builder eng -> Anim.Property.Custom.Builder eng"},{"name":"speed","comment":" Set the animation speed (units per second).\n","type":"Basics.Float -> Anim.Property.Custom.Builder { eng | withTiming : () } -> Anim.Property.Custom.Builder { eng | withTiming : () }"},{"name":"spring","comment":" Drive this property with a spring.\n\n    import Motion.Spring as Spring\n\n    Property.spring Spring.wobbly\n\n","type":"Motion.Spring.Spring -> Anim.Property.Custom.Builder { eng | withSpring : () } -> Anim.Property.Custom.Builder { eng | withSpring : () }"},{"name":"to","comment":" Set the target value.\n","type":"Basics.Float -> Anim.Property.Custom.Builder eng -> Anim.Property.Custom.Builder eng"},{"name":"unclamp","comment":" Remove the range for this CSS property. Does nothing if no range is set.\n","type":"Anim.Property.Custom.Builder eng -> Anim.Property.Custom.Builder eng"}],"binops":[]},{"name":"Anim.Property.CustomColor","comment":" Animate any CSS color property not covered by the first-class\nproperty modules.\n\n**Default**: transparent\n\nWhen no start value is configured, the default will be used.\n\n\n# Types\n\n@docs Builder, AnimGroupName, ColorProperty\n\n\n# Initialize\n\n@docs init\n\n\n# Build\n\n@docs begin, end\n\n\n# Configure\n\n\n## Start Value\n\nWhen not set, the default will be used.\n\n📖 See [Start Values](https://phollyer.github.io/elm-motion/animation/properties/overview/#start-values)\nfor details.\n\n@docs from\n\n\n## End Value\n\n📖 See [End Values](https://phollyer.github.io/elm-motion/animation/properties/overview/#end-values)\nfor details.\n\n@docs to\n\n\n## Timing\n\n📖 See [Animation Timing](https://phollyer.github.io/elm-motion/animation/concepts/timing/)\nfor details.\n\n@docs delay, duration, speed\n\n\n## Easing\n\n📖 See [Easing](https://phollyer.github.io/elm-motion/animation/concepts/easing/)\nfor details.\n\n@docs easing\n\n\n## Spring\n\n📖 See [Spring](https://phollyer.github.io/elm-motion/animation/concepts/spring/)\nfor details.\n\n@docs spring\n\n\n## Snap\n\nSnap to a specific color, cancelling any in-flight animation on this property.\n\n@docs set\n\n","unions":[{"name":"ColorProperty","comment":" A typed set of common color properties with a custom escape hatch.\n\nUse the escape hatch `Custom` to animate any CSS color property not currently supported out of the box.\n\n    import Anim.Extra.Color as Color\n    import Anim.Property.CustomColor as CustomColor\n\n    CustomColor.begin (Custom \"outline-color\")\n        >> CustomColor.to (Color.rgb 255 0 0)\n        >> CustomColor.end\n\n","args":[],"cases":[["AccentColor",[]],["BackgroundColor",[]],["BorderColor",[]],["BorderTopColor",[]],["BorderRightColor",[]],["BorderBottomColor",[]],["BorderLeftColor",[]],["BorderBlockColor",[]],["BorderBlockStartColor",[]],["BorderBlockEndColor",[]],["BorderInlineColor",[]],["BorderInlineStartColor",[]],["BorderInlineEndColor",[]],["CaretColor",[]],["ColumnRuleColor",[]],["OutlineColor",[]],["TextColor",[]],["TextDecorationColor",[]],["TextEmphasisColor",[]],["Fill",[]],["Stroke",[]],["StopColor",[]],["FloodColor",[]],["LightingColor",[]],["Custom",["String.String"]]]}],"aliases":[{"name":"AnimGroupName","comment":" Type alias for the animation group name.\n","args":[],"type":"String.String"},{"name":"Builder","comment":" Builder type for custom color animations.\n","args":["eng"],"type":"Anim.Internal.Property.CustomColor.Builder eng"}],"values":[{"name":"begin","comment":" Begin the animation configuration by turning an `AnimBuilder` into a custom property animation `Builder`.\n\n    myAnimation : AnimBuilder eng -> AnimBuilder eng\n    myAnimation =\n        CustomColor.begin TextColor\n            >> CustomColor.to (Color.rgb 255 0 0)\n            >> CustomColor.end\n\n","type":"Anim.Property.CustomColor.ColorProperty -> Anim.Internal.Builder.AnimBuilder eng -> Anim.Property.CustomColor.Builder eng"},{"name":"delay","comment":" Set the delay (milliseconds) before the animation starts.\n","type":"Basics.Int -> Anim.Property.CustomColor.Builder { eng | withTiming : () } -> Anim.Property.CustomColor.Builder { eng | withTiming : () }"},{"name":"duration","comment":" Set the animation duration (milliseconds).\n","type":"Basics.Int -> Anim.Property.CustomColor.Builder { eng | withTiming : () } -> Anim.Property.CustomColor.Builder { eng | withTiming : () }"},{"name":"easing","comment":" Set the easing function.\n\n    import Motion.Easing exposing (Easing(..))\n\n    CustomColor.easing EaseInOut\n\n","type":"Motion.Easing.Easing -> Anim.Property.CustomColor.Builder eng -> Anim.Property.CustomColor.Builder eng"},{"name":"end","comment":" Complete the animation configuration and return an `AnimBuilder`.\n","type":"Anim.Property.CustomColor.Builder eng -> Anim.Internal.Builder.AnimBuilder eng"},{"name":"from","comment":" Set the starting color value.\n","type":"Anim.Extra.Color.Color -> Anim.Property.CustomColor.Builder eng -> Anim.Property.CustomColor.Builder eng"},{"name":"init","comment":" Set the initial color value.\n\nUse this to initialize the property in your Engine's `init` function.\n\n    import Anim.Engine.* as Engine\n    import Anim.Extra.Color as Color\n    import Anim.Property.CustomColor as CustomColor\n\n    init : ( Model, Cmd Msg )\n    init =\n        ( { animState =\n                Engine.init\n                    [ CustomColor.init \"box\" BorderColor <|\n                        Color.rgb 99 102 241\n                    ]\n          }\n        , Cmd.none\n        )\n\n","type":"Anim.Property.CustomColor.AnimGroupName -> Anim.Property.CustomColor.ColorProperty -> Anim.Extra.Color.Color -> Anim.Internal.Builder.AnimBuilder eng -> Anim.Internal.Builder.AnimBuilder eng"},{"name":"set","comment":" Snap to a specific color, cancelling any in-flight animation on this property.\n","type":"Anim.Extra.Color.Color -> Anim.Property.CustomColor.Builder eng -> Anim.Property.CustomColor.Builder eng"},{"name":"speed","comment":" Set the animation speed (units per second).\n","type":"Basics.Float -> Anim.Property.CustomColor.Builder { eng | withTiming : () } -> Anim.Property.CustomColor.Builder { eng | withTiming : () }"},{"name":"spring","comment":" Drive this property with a spring.\n\n    import Motion.Spring as Spring\n\n    CustomColor.spring Spring.wobbly\n\n","type":"Motion.Spring.Spring -> Anim.Property.CustomColor.Builder { eng | withSpring : () } -> Anim.Property.CustomColor.Builder { eng | withSpring : () }"},{"name":"to","comment":" Set the target color value.\n","type":"Anim.Extra.Color.Color -> Anim.Property.CustomColor.Builder eng -> Anim.Property.CustomColor.Builder eng"}],"binops":[]},{"name":"Anim.Property.Opacity","comment":" Animate the opacity of elements.\n\n**Default**: 1.0 (fully opaque)\n\nWhen no start value is configured, the default will be used.\n\n\n# Types\n\n@docs Builder, AnimGroupName\n\n\n# Initialize\n\n@docs init\n\n\n# Build\n\n@docs begin, end\n\n\n# Configure\n\n\n## Start Value\n\nWhen not set, the default will be used.\n\n📖 See [Start Values](https://phollyer.github.io/elm-motion/animation/properties/overview/#start-values)\nfor details.\n\n@docs from\n\n\n## End Value\n\n📖 See [End Values](https://phollyer.github.io/elm-motion/animation/properties/overview/#end-values)\nfor details.\n\n\n### Absolute\n\n@docs to\n\n\n### Relative\n\nMove by a delta instead of to a fixed opacity. The end value is\n`current + delta` where `current` is the live animated opacity.\n\nOnly available on the Sub and WAAPI engines. Using these with any\nother engine results in a type error.\n\n@docs by\n\n\n## Timing\n\n📖 See [Animation Timing](https://phollyer.github.io/elm-motion/animation/concepts/timing/)\nfor details.\n\n@docs delay, duration, speed\n\n\n## Easing\n\n📖 See [Easing](https://phollyer.github.io/elm-motion/animation/concepts/easing/)\nfor details.\n\n@docs easing\n\n\n## Spring\n\n📖 See [Spring](https://phollyer.github.io/elm-motion/animation/concepts/spring/)\nfor details.\n\n@docs spring\n\n\n## Clamping\n\nKeep opacity within a range you choose.\n\nValues outside the range are clamped to the nearest boundary.\n\nThe range stays in effect for future animations\nuntil you [Unclamp](#unclamp) it:\n\n    update msg model =\n        case msg of\n            HoverEnded ->\n                let\n                    ( animState, cmd ) =\n                        WAAPI.animate model.animState <|\n                            Opacity.begin\n                                >> Opacity.clamp 0.2 1.0\n                                >> Opacity.end\n                in\n                ( { model | animState = animState }\n                , cmd\n                )\n\n\n### Clamp\n\n@docs clamp\n\n\n### Unclamp\n\n@docs unclamp\n\n\n## Snap\n\nSnap to a specific opacity, cancelling any in-flight animation on this property.\n\n@docs set\n\n","unions":[],"aliases":[{"name":"AnimGroupName","comment":" Type alias for the animation group name.\n","args":[],"type":"String.String"},{"name":"Builder","comment":" Builder type for opacity animations.\n","args":["eng"],"type":"Anim.Internal.Builder.Opacity.OpacityBuilder eng"}],"values":[{"name":"begin","comment":" Turn the `AnimBuilder` into an opacity animation `Builder` for the specified animation group.\n\nUse this to start configuring an opacity animation.\n\n    myAnimation : AnimBuilder eng -> AnimBuilder eng\n    myAnimation =\n        Opacity.begin\n            >> ... -- Configure and build the animation\n\n","type":"Anim.Internal.Builder.AnimBuilder eng -> Anim.Property.Opacity.Builder eng"},{"name":"by","comment":" Move by a delta instead of to a fixed opacity.\n\n    myAnimation : AnimBuilder eng -> AnimBuilder eng\n    myAnimation =\n        Opacity.begin\n            >> Opacity.by 0.25\n            >> ... -- continue with animation\n\n","type":"Basics.Float -> Anim.Property.Opacity.Builder eng -> Anim.Property.Opacity.Builder eng"},{"name":"clamp","comment":" Keep opacity within `min` and `max` values. If `min > max` the values are flipped.\n","type":"Basics.Float -> Basics.Float -> Anim.Property.Opacity.Builder eng -> Anim.Property.Opacity.Builder eng"},{"name":"delay","comment":" Set the delay (milliseconds) before the animation starts.\n","type":"Basics.Int -> Anim.Property.Opacity.Builder { eng | withTiming : () } -> Anim.Property.Opacity.Builder { eng | withTiming : () }"},{"name":"duration","comment":" Set the animation duration (milliseconds).\n","type":"Basics.Int -> Anim.Property.Opacity.Builder { eng | withTiming : () } -> Anim.Property.Opacity.Builder { eng | withTiming : () }"},{"name":"easing","comment":" Set the easing function for the animation.\n\n    import Motion.Easing exposing (Easing(..))\n\n    Opacity.easing EaseInOut\n\n","type":"Motion.Easing.Easing -> Anim.Property.Opacity.Builder eng -> Anim.Property.Opacity.Builder eng"},{"name":"end","comment":" Complete the [Builder](#Builder) animation configuration and return an `AnimBuilder`\nso you can continue configuring other property animations or execute the animation with an Engine.\n\n    myAnimation : AnimBuilder eng -> AnimBuilder eng\n    myAnimation =\n        Opacity.begin\n            >> ... -- configure the animation with from, to, duration, easing, etc.\n            >> Opacity.end\n            >> ... -- continue with animation\n\n","type":"Anim.Property.Opacity.Builder eng -> Anim.Internal.Builder.AnimBuilder eng"},{"name":"from","comment":" Set the starting opacity.\n\n    myAnimation : AnimBuilder eng -> AnimBuilder eng\n    myAnimation =\n        Opacity.begin\n            >> Opacity.from 1.0\n            >> ... -- continue with animation\n\n","type":"Basics.Float -> Anim.Property.Opacity.Builder eng -> Anim.Property.Opacity.Builder eng"},{"name":"init","comment":" Set the initial opacity.\n\nUse this to initialize the opacity in your Engine's `init` function.\n\n    import Anim.Engine.* as Engine\n    import Anim.Property.Opacity as Opacity\n\n    init : ( Model, Cmd Msg )\n    init =\n        ( { animState = Engine.init [ Opacity.init \"animGroupName\" 0.5 ] }\n        , Cmd.none\n        )\n\n","type":"Anim.Property.Opacity.AnimGroupName -> Basics.Float -> Anim.Internal.Builder.AnimBuilder eng -> Anim.Internal.Builder.AnimBuilder eng"},{"name":"set","comment":" Snap the opacity to a specific value.\n","type":"Basics.Float -> Anim.Property.Opacity.Builder eng -> Anim.Property.Opacity.Builder eng"},{"name":"speed","comment":" The speed represents how much the opacity value changes per second.\n\nSince opacity ranges from 0.0 (transparent) to 1.0 (opaque), a speed of `2.0`\nmeans the opacity will change by 2.0 units per second (e.g., from 0.0 to 1.0\ntakes 0.5 seconds).\n\n","type":"Basics.Float -> Anim.Property.Opacity.Builder { eng | withTiming : () } -> Anim.Property.Opacity.Builder { eng | withTiming : () }"},{"name":"spring","comment":" Drive this property with a spring.\n\n    import Motion.Spring as Spring\n\n    Opacity.spring Spring.wobbly\n\n","type":"Motion.Spring.Spring -> Anim.Property.Opacity.Builder { eng | withSpring : () } -> Anim.Property.Opacity.Builder { eng | withSpring : () }"},{"name":"to","comment":" Set the target opacity for the current animation group.\n\n    myAnimation : AnimBuilder eng -> AnimBuilder eng\n    myAnimation =\n        Opacity.begin\n            >> Opacity.to 0.5\n            >> ... -- continue with animation\n\n","type":"Basics.Float -> Anim.Property.Opacity.Builder eng -> Anim.Property.Opacity.Builder eng"},{"name":"unclamp","comment":" Remove the opacity range for this animation group. Does nothing if no range is set.\n","type":"Anim.Property.Opacity.Builder eng -> Anim.Property.Opacity.Builder eng"}],"binops":[]},{"name":"Anim.Property.PerspectiveOrigin","comment":" Animate the CSS `perspective-origin` property, which controls the vanishing point\nfor 3D transforms applied to a parent element.\n\n**Default unit**: `%`.\n\n**Default value**: `50% 50%` (center of the element)\n\n**Note**: This module is for _animating_ `perspective-origin`, if all you need is to\nset a static `perspective-origin`, use the\n[View3D.perspectiveOrigin](Anim.Extra.View3D#perspectiveOrigin) function instead, or\nset the `style` attribute yourself in your view.\n\n\n# Types\n\n@docs Builder, AnimGroupName\n\n\n# Initialize\n\n@docs initXY, initX, initY\n\n\n# Build\n\n@docs begin, end\n\n\n# Configure\n\n\n## Start Value\n\nWhen not set, the default will be used.\n\n📖 See [Start Values](https://phollyer.github.io/elm-motion/animation/properties/overview/#start-values)\nfor details.\n\n@docs from, fromXY, fromX, fromY\n\n\n## End Value\n\n📖 See [End Values](https://phollyer.github.io/elm-motion/animation/properties/overview/#end-values)\nfor details.\n\n\n### Absolute\n\n@docs to, toXY, toX, toY\n\n\n### Relative\n\nMove by a delta instead of to a fixed perspective origin. The end value is\n`current + delta` where `current` is the live animated position.\n\nOnly available on the Sub and WAAPI engines. Using these with any other engine results in a type error.\n\n@docs by, byXY, byX, byY\n\n\n## Timing\n\n📖 See [Animation Timing](https://phollyer.github.io/elm-motion/animation/concepts/timing/)\nfor details.\n\n@docs delay, duration, speed\n\n\n## Easing\n\n📖 See [Easing](https://phollyer.github.io/elm-motion/animation/concepts/easing/)\nfor details.\n\n@docs easing\n\n\n## Spring\n\n📖 See [Spring](https://phollyer.github.io/elm-motion/animation/concepts/spring/)\nfor details.\n\n@docs spring\n\n\n## CSS Units\n\nSet the CSS [Unit](Anim-Unit#Unit) for one or both axes.\n\n\n### Initializing\n\nInitialize the the CSS [Unit](Anim-Unit#Unit) to be used on first render and subsequent animations.\n\n**Note**: Must be called after an anim group has been initialized, otherwise it will have no effect.\n\n@docs initCssUnit, initCssUnitX, initCssUnitY\n\n\n### Animating\n\nSet the CSS [Unit](Anim-Unit#Unit) for one or both axes. This will also affect all future animations\nfor the associated anim group.\n\n@docs cssUnit, cssUnitX, cssUnitY\n\n\n## Responsive Animations\n\nWhen using responsive units like `%` or `Cqw`, the animation automatically responds\nto changes in screen or container size without extra configuration. However, when\nusing fixed units like `Px`, the animation needs to be made aware of size changes\nin order to respond to them. This is done with the functions below.\n\n📖 See [Responsive Animations](https://phollyer.github.io/elm-motion/animation/concepts/responsive-animations/)\nfor patterns and examples.\n\n\n### Bounds\n\nKeep perspective origin values within a range you choose. Values outside the range are clamped\nto the nearest boundary. An animation that is within the bounds, either mid-flight or\npaused, will me remapped proportionally inside the bounds.\n\n@docs Bounds, AxisBounds, bounds\n\n\n## Clamping\n\nKeep perspective-origin values on each axis within a range you choose.\n\nValues outside the range are clamped to the nearest boundary.\n\nSimilar to `bounds`, but without proportional remapping.\n\nThe range stays in effect for future animations\nuntil you [Unclamp](#unclamp) it:\n\n    update msg model =\n        case msg of\n            GotCard (Ok { element }) ->\n                let\n                    w =\n                        element.width\n\n                    h =\n                        element.height\n\n                    ( animState, cmd ) =\n                        WAAPI.retarget model.animState <|\n                            PerspectiveOrigin.begin\n                                >> PerspectiveOrigin.clampX 0 w\n                                >> PerspectiveOrigin.clampY 0 h\n                                >> PerspectiveOrigin.end\n                in\n                ( { model | animState = animState }\n                , cmd\n                )\n\n\n### Clamp\n\n@docs clampX, clampY\n\n\n### Unclamp\n\n@docs unclampX, unclampY\n\n\n## Snap\n\nSnap to a specific perspective origin, cancelling any in-flight animation on this property.\n\n@docs set, setXY, setX, setY\n\n","unions":[],"aliases":[{"name":"AnimGroupName","comment":" Type alias for the animation group name.\n","args":[],"type":"String.String"},{"name":"AxisBounds","comment":" Per-axis resize ranges. `Nothing` leaves an axis untouched.\n`z` is ignored for this property.\n\n    { x = Just { min = 0, max = 100 }\n    , y = Nothing\n    , z = Nothing\n    }\n\n","args":[],"type":"{ x : Maybe.Maybe Anim.Property.PerspectiveOrigin.Bounds, y : Maybe.Maybe Anim.Property.PerspectiveOrigin.Bounds, z : Maybe.Maybe Anim.Property.PerspectiveOrigin.Bounds }"},{"name":"Bounds","comment":" A numeric range with `min` and `max` boundaries.\n","args":[],"type":"{ min : Basics.Float, max : Basics.Float }"},{"name":"Builder","comment":" Builder type for perspective-origin animations.\n","args":["eng"],"type":"Anim.Internal.Builder.PerspectiveOrigin.PerspectiveOriginBuilder eng"}],"values":[{"name":"begin","comment":" Turn the `AnimBuilder` into a perspective origin animation `Builder` for the specified animation group.\n\nUse this to start configuring a perspective origin animation.\n\n    myAnimation : AnimBuilder eng -> AnimBuilder eng\n    myAnimation =\n        PerspectiveOrigin.begin\n            >> ... -- Configure and build the animation\n\n","type":"Anim.Internal.Builder.AnimBuilder eng -> Anim.Property.PerspectiveOrigin.Builder eng"},{"name":"bounds","comment":" Apply new perspective-origin bounds for an anim group during resize.\n\nPass this inside an engine's `onResize` builder:\n\n    Sub.onResize model.animState <|\n        PerspectiveOrigin.bounds \"box\"\n            { x = Just { min = 0, max = newWidth - boxSize }\n            , y = Nothing\n            , z = Nothing\n            }\n\nYou can set the bounds for multiple anim groups in one call:\n\n    Sub.onResize model.animState <|\n        PerspectiveOrigin.bounds \"box\" boxBounds\n            >> PerspectiveOrigin.bounds \"card\" cardBounds\n\nThe engine proportionally remaps the in-flight animation onto the new\nrange and pins its endpoints to it.\n\nOnly callable from inside an engine's `onResize` builder - calling it from\nanywhere else results in a type error.\n\n","type":"Anim.Property.PerspectiveOrigin.AnimGroupName -> Anim.Property.PerspectiveOrigin.AxisBounds -> Anim.Internal.Builder.AnimBuilder { eng | withBounds : () } -> Anim.Internal.Builder.AnimBuilder { eng | withBounds : () }"},{"name":"by","comment":" Move by a delta on both axes.\n","type":"Basics.Float -> Anim.Property.PerspectiveOrigin.Builder eng -> Anim.Property.PerspectiveOrigin.Builder eng"},{"name":"byX","comment":" Move by a delta on the X axis. Y is unaffected.\n","type":"Basics.Float -> Anim.Property.PerspectiveOrigin.Builder eng -> Anim.Property.PerspectiveOrigin.Builder eng"},{"name":"byXY","comment":" Move by a delta on the X and Y axes.\n","type":"Basics.Float -> Basics.Float -> Anim.Property.PerspectiveOrigin.Builder eng -> Anim.Property.PerspectiveOrigin.Builder eng"},{"name":"byY","comment":" Move by a delta on the Y axis. X is unaffected.\n","type":"Basics.Float -> Anim.Property.PerspectiveOrigin.Builder eng -> Anim.Property.PerspectiveOrigin.Builder eng"},{"name":"clampX","comment":" Keep the X axis perspective-origin within `min` and `max` values. If `min > max` the values are flipped.\n","type":"Basics.Float -> Basics.Float -> Anim.Property.PerspectiveOrigin.Builder eng -> Anim.Property.PerspectiveOrigin.Builder eng"},{"name":"clampY","comment":" Keep the Y axis perspective-origin within `min` and `max` values. If `min > max` the values are flipped.\n","type":"Basics.Float -> Basics.Float -> Anim.Property.PerspectiveOrigin.Builder eng -> Anim.Property.PerspectiveOrigin.Builder eng"},{"name":"cssUnit","comment":" Set the CSS [Unit](Anim-Unit#Unit) for both axes.\n\n    import Anim.Property.PerspectiveOrigin as PerspectiveOrigin\n    import Anim.Unit as Unit\n\n    PerspectiveOrigin.begin\n        >> PerspectiveOrigin.cssUnit Unit.Cqh\n        >> ... -- configure the animation\n\n","type":"Anim.Unit.Unit -> Anim.Property.PerspectiveOrigin.Builder eng -> Anim.Property.PerspectiveOrigin.Builder eng"},{"name":"cssUnitX","comment":" Set the CSS [Unit](Anim-Unit#Unit) for the X axis.\n","type":"Anim.Unit.Unit -> Anim.Property.PerspectiveOrigin.Builder eng -> Anim.Property.PerspectiveOrigin.Builder eng"},{"name":"cssUnitY","comment":" Set the CSS [Unit](Anim-Unit#Unit) for the Y axis.\n","type":"Anim.Unit.Unit -> Anim.Property.PerspectiveOrigin.Builder eng -> Anim.Property.PerspectiveOrigin.Builder eng"},{"name":"delay","comment":" Set the delay (milliseconds) before the animation starts.\n","type":"Basics.Int -> Anim.Property.PerspectiveOrigin.Builder { eng | withTiming : () } -> Anim.Property.PerspectiveOrigin.Builder { eng | withTiming : () }"},{"name":"duration","comment":" Set the animation duration (milliseconds).\n","type":"Basics.Int -> Anim.Property.PerspectiveOrigin.Builder { eng | withTiming : () } -> Anim.Property.PerspectiveOrigin.Builder { eng | withTiming : () }"},{"name":"easing","comment":" Set the easing function for the animation.\n\n    import Motion.Easing exposing (Easing(..))\n\n    PerspectiveOrigin.easing EaseInOut\n\n","type":"Motion.Easing.Easing -> Anim.Property.PerspectiveOrigin.Builder eng -> Anim.Property.PerspectiveOrigin.Builder eng"},{"name":"end","comment":" Complete the [Builder](#Builder) animation configuration and return an `AnimBuilder`\nso you can continue configuring other property animations or execute the animation with an Engine.\n\n    myAnimation : AnimBuilder eng -> AnimBuilder eng\n    myAnimation =\n        PerspectiveOrigin.begin\n            >> ... -- configure the animation with from, to, duration, easing, etc.\n            >> PerspectiveOrigin.end\n            >> ... -- continue with animation\n\n","type":"Anim.Property.PerspectiveOrigin.Builder eng -> Anim.Internal.Builder.AnimBuilder eng"},{"name":"from","comment":" Set the uniform starting X and Y values.\n","type":"Basics.Float -> Anim.Property.PerspectiveOrigin.Builder eng -> Anim.Property.PerspectiveOrigin.Builder eng"},{"name":"fromX","comment":" Set the starting X value, preserving the current Y value.\n","type":"Basics.Float -> Anim.Property.PerspectiveOrigin.Builder eng -> Anim.Property.PerspectiveOrigin.Builder eng"},{"name":"fromXY","comment":" Set the starting X and Y values.\n","type":"Basics.Float -> Basics.Float -> Anim.Property.PerspectiveOrigin.Builder eng -> Anim.Property.PerspectiveOrigin.Builder eng"},{"name":"fromY","comment":" Set the starting Y value, preserving the current X value.\n","type":"Basics.Float -> Anim.Property.PerspectiveOrigin.Builder eng -> Anim.Property.PerspectiveOrigin.Builder eng"},{"name":"initCssUnit","comment":" Initialize the CSS [Unit](Anim-Unit#Unit) for both axes.\n\n    import Anim.Engine.Keyframe as Keyframe\n    import Anim.Property.PerspectiveOrigin as PerspectiveOrigin\n    import Anim.Unit as Unit\n\n    Keyframe.init\n        [ PerspectiveOrigin.initXY \"animGroupName\" 200 150\n            >> PerspectiveOrigin.initCssUnit Unit.Cqw\n        ]\n\n","type":"Anim.Unit.Unit -> Anim.Internal.Builder.AnimBuilder eng -> Anim.Internal.Builder.AnimBuilder eng"},{"name":"initCssUnitX","comment":" Initialize the CSS [Unit](Anim-Unit#Unit) for the X axis.\n","type":"Anim.Unit.Unit -> Anim.Internal.Builder.AnimBuilder eng -> Anim.Internal.Builder.AnimBuilder eng"},{"name":"initCssUnitY","comment":" Initialize the CSS [Unit](Anim-Unit#Unit) for the Y axis.\n","type":"Anim.Unit.Unit -> Anim.Internal.Builder.AnimBuilder eng -> Anim.Internal.Builder.AnimBuilder eng"},{"name":"initX","comment":" Set the initial X-axis perspective origin.\n","type":"Anim.Property.PerspectiveOrigin.AnimGroupName -> Basics.Float -> Anim.Internal.Builder.AnimBuilder eng -> Anim.Internal.Builder.AnimBuilder eng"},{"name":"initXY","comment":" Set the initial perspective origin on both axes.\n\n    import Anim.Engine.* as Engine\n    import Anim.Property.PerspectiveOrigin as PerspectiveOrigin\n\n    init : ( Model, Cmd Msg )\n    init =\n        ( { animState = Engine.init [ PerspectiveOrigin.initXY \"animGroupName\" 50 50 ] }\n        , Cmd.none\n        )\n\n","type":"Anim.Property.PerspectiveOrigin.AnimGroupName -> Basics.Float -> Basics.Float -> Anim.Internal.Builder.AnimBuilder eng -> Anim.Internal.Builder.AnimBuilder eng"},{"name":"initY","comment":" Set the initial Y-axis perspective origin.\n","type":"Anim.Property.PerspectiveOrigin.AnimGroupName -> Basics.Float -> Anim.Internal.Builder.AnimBuilder eng -> Anim.Internal.Builder.AnimBuilder eng"},{"name":"set","comment":" Snap to a uniform X and Y value.\n","type":"Basics.Float -> Anim.Property.PerspectiveOrigin.Builder eng -> Anim.Property.PerspectiveOrigin.Builder eng"},{"name":"setX","comment":" Snap target X value, preserving the current Y value.\n","type":"Basics.Float -> Anim.Property.PerspectiveOrigin.Builder eng -> Anim.Property.PerspectiveOrigin.Builder eng"},{"name":"setXY","comment":" Snap target X and Y values.\n","type":"Basics.Float -> Basics.Float -> Anim.Property.PerspectiveOrigin.Builder eng -> Anim.Property.PerspectiveOrigin.Builder eng"},{"name":"setY","comment":" Snap target Y value, preserving the current X value.\n","type":"Basics.Float -> Anim.Property.PerspectiveOrigin.Builder eng -> Anim.Property.PerspectiveOrigin.Builder eng"},{"name":"speed","comment":" The speed represents how many units per second the perspective origin changes.\n\nFor example, an animation from `0` to `200px` with a speed of `100.0`\nwill take 2 seconds to complete.\n\n","type":"Basics.Float -> Anim.Property.PerspectiveOrigin.Builder { eng | withTiming : () } -> Anim.Property.PerspectiveOrigin.Builder { eng | withTiming : () }"},{"name":"spring","comment":" Drive this property with a spring.\n\n    import Motion.Spring as Spring\n\n    PerspectiveOrigin.spring Spring.wobbly\n\n","type":"Motion.Spring.Spring -> Anim.Property.PerspectiveOrigin.Builder { eng | withSpring : () } -> Anim.Property.PerspectiveOrigin.Builder { eng | withSpring : () }"},{"name":"to","comment":" Set the uniform target X and Y values.\n","type":"Basics.Float -> Anim.Property.PerspectiveOrigin.Builder eng -> Anim.Property.PerspectiveOrigin.Builder eng"},{"name":"toX","comment":" Set the target X value, preserving the current Y value.\n","type":"Basics.Float -> Anim.Property.PerspectiveOrigin.Builder eng -> Anim.Property.PerspectiveOrigin.Builder eng"},{"name":"toXY","comment":" Set the target X and Y values.\n","type":"Basics.Float -> Basics.Float -> Anim.Property.PerspectiveOrigin.Builder eng -> Anim.Property.PerspectiveOrigin.Builder eng"},{"name":"toY","comment":" Set the target Y value, preserving the current X value.\n","type":"Basics.Float -> Anim.Property.PerspectiveOrigin.Builder eng -> Anim.Property.PerspectiveOrigin.Builder eng"},{"name":"unclampX","comment":" Remove the X axis range for this animation group. Does nothing if no range is set.\n","type":"Anim.Property.PerspectiveOrigin.Builder eng -> Anim.Property.PerspectiveOrigin.Builder eng"},{"name":"unclampY","comment":" Remove the Y axis range for this animation group. Does nothing if no range is set.\n","type":"Anim.Property.PerspectiveOrigin.Builder eng -> Anim.Property.PerspectiveOrigin.Builder eng"}],"binops":[]},{"name":"Anim.Property.Rotate","comment":" Rotate elements around the X, Y, and Z axes.\n\n**Default**: 0 degrees for all axes\n\nWhen no start value is configured for any axis, the default will be used for that axis.\n\n\n# Types\n\n@docs Builder, AnimGroupName\n\n\n# Initialize\n\n@docs initXYZ, initXY, initXZ, initX, initYZ, initY, initZ\n\n\n# Build\n\n@docs begin, end\n\n\n# Configure\n\n\n## Start Value\n\n📖 See [Start Values](https://phollyer.github.io/elm-motion/animation/properties/overview/#start-values)\nfor details.\n\n@docs fromXYZ, fromXY, fromXZ, fromX, fromYZ, fromY, fromZ\n\n\n## End Value\n\n📖 See [End Values](https://phollyer.github.io/elm-motion/animation/properties/overview/#end-values)\nfor details.\n\n\n### Absolute\n\n@docs toXYZ, toXY, toXZ, toX, toYZ, toY, toZ\n\n\n### Relative\n\nMove by a delta instead of to a fixed rotation. The end\nvalue is `current + delta` where `current` is the live animated rotation.\n\nOnly available on the Sub and WAAPI engines. Using these with any other engine results in a type error.\n\n@docs byXYZ, byXY, byXZ, byX, byYZ, byY, byZ\n\n\n## Timing\n\n📖 See [Animation Timing](https://phollyer.github.io/elm-motion/animation/concepts/timing/)\nfor details.\n\n@docs delay, duration, speed\n\n\n## Easing\n\n📖 See [Easing](https://phollyer.github.io/elm-motion/animation/concepts/easing/)\nfor details.\n\n@docs easing\n\n\n## Spring\n\n📖 See [Spring](https://phollyer.github.io/elm-motion/animation/concepts/spring/)\nfor details.\n\n@docs spring\n\n\n## Clamping\n\nKeep rotate values on each axis within a range you choose.\n\nValues outside the range are clamped to the nearest boundary.\n\nThe range stays in effect for future animations\nuntil you [Unclamp](#unclamp) it:\n\n    update msg model =\n        case msg of\n            KnobTurned angle ->\n                let\n                    ( animState, cmd ) =\n                        WAAPI.animate model.animState <|\n                            Rotate.begin\n                                >> Rotate.clampZ -90 90\n                                >> Rotate.end\n                in\n                ( { model | animState = animState }\n                , cmd\n                )\n\n\n### Clamp\n\n@docs clampX, clampY, clampZ\n\n\n### Unclamp\n\n@docs unclampX, unclampY, unclampZ\n\n\n## Snap\n\nSnap to a specific rotation, cancelling any in-flight animation on this property.\n\n@docs set, setXYZ, setXY, setXZ, setX, setYZ, setY, setZ\n\n","unions":[],"aliases":[{"name":"AnimGroupName","comment":" Type alias for the animation group name.\n","args":[],"type":"String.String"},{"name":"Builder","comment":" Builder type for rotate animations.\n","args":["eng"],"type":"Anim.Internal.Builder.Rotate.RotateBuilder eng"}],"values":[{"name":"begin","comment":" Turn the `AnimBuilder` into a rotate animation `Builder` for the specified animation group.\n\nUse this to start configuring a rotate animation.\n\n    myAnimation : AnimBuilder eng -> AnimBuilder eng\n    myAnimation =\n        Rotate.begin\n            >> ... -- Configure and build the animation\n\n","type":"Anim.Internal.Builder.AnimBuilder eng -> Anim.Property.Rotate.Builder eng"},{"name":"byX","comment":" Move by a delta on the X axis. Y and Z are unaffected.\n","type":"Basics.Float -> Anim.Property.Rotate.Builder eng -> Anim.Property.Rotate.Builder eng"},{"name":"byXY","comment":" Move by a delta on the X and Y axes. Z is unaffected.\n","type":"Basics.Float -> Basics.Float -> Anim.Property.Rotate.Builder eng -> Anim.Property.Rotate.Builder eng"},{"name":"byXYZ","comment":" Move by a delta on the X, Y, and Z axes.\n","type":"Basics.Float -> Basics.Float -> Basics.Float -> Anim.Property.Rotate.Builder eng -> Anim.Property.Rotate.Builder eng"},{"name":"byXZ","comment":" Move by a delta on the X and Z axes. Y is unaffected.\n","type":"Basics.Float -> Basics.Float -> Anim.Property.Rotate.Builder eng -> Anim.Property.Rotate.Builder eng"},{"name":"byY","comment":" Move by a delta on the Y axis. X and Z are unaffected.\n","type":"Basics.Float -> Anim.Property.Rotate.Builder eng -> Anim.Property.Rotate.Builder eng"},{"name":"byYZ","comment":" Move by a delta on the Y and Z axes. X is unaffected.\n","type":"Basics.Float -> Basics.Float -> Anim.Property.Rotate.Builder eng -> Anim.Property.Rotate.Builder eng"},{"name":"byZ","comment":" Move by a delta on the Z axis. X and Y are unaffected.\n","type":"Basics.Float -> Anim.Property.Rotate.Builder eng -> Anim.Property.Rotate.Builder eng"},{"name":"clampX","comment":" Keep the X axis rotation within `min` and `max` values. If `min > max` the values are flipped.\n","type":"Basics.Float -> Basics.Float -> Anim.Property.Rotate.Builder eng -> Anim.Property.Rotate.Builder eng"},{"name":"clampY","comment":" Keep the Y axis rotation within `min` and `max` values. If `min > max` the values are flipped.\n","type":"Basics.Float -> Basics.Float -> Anim.Property.Rotate.Builder eng -> Anim.Property.Rotate.Builder eng"},{"name":"clampZ","comment":" Keep the Z axis rotation within `min` and `max` values. If `min > max` the values are flipped.\n","type":"Basics.Float -> Basics.Float -> Anim.Property.Rotate.Builder eng -> Anim.Property.Rotate.Builder eng"},{"name":"delay","comment":" Set the delay (milliseconds) before the animation starts.\n","type":"Basics.Int -> Anim.Property.Rotate.Builder { eng | withTiming : () } -> Anim.Property.Rotate.Builder { eng | withTiming : () }"},{"name":"duration","comment":" Set the animation duration (milliseconds).\n","type":"Basics.Int -> Anim.Property.Rotate.Builder { eng | withTiming : () } -> Anim.Property.Rotate.Builder { eng | withTiming : () }"},{"name":"easing","comment":" Set the easing function for the animation.\n\n    import Motion.Easing exposing (Easing(..))\n\n    Rotate.easing EaseInOut\n\n","type":"Motion.Easing.Easing -> Anim.Property.Rotate.Builder eng -> Anim.Property.Rotate.Builder eng"},{"name":"end","comment":" Complete the [Builder](#Builder) animation configuration and return an `AnimBuilder`\nso you can continue configuring other property animations or execute the animation with an Engine.\n\n    myAnimation : AnimBuilder eng -> AnimBuilder eng\n    myAnimation =\n        Rotate.begin\n            >> ... -- configure the animation with from, to, duration, easing, etc.\n            >> Rotate.end\n            >> ... -- continue with animation\n\n","type":"Anim.Property.Rotate.Builder eng -> Anim.Internal.Builder.AnimBuilder eng"},{"name":"fromX","comment":" Set the starting X rotation (degrees). Y and Z are left unchanged (or 0 if not set).\n","type":"Basics.Float -> Anim.Property.Rotate.Builder eng -> Anim.Property.Rotate.Builder eng"},{"name":"fromXY","comment":" Set the starting X and Y rotations (degrees). Z is left unchanged (or 0 if not set).\n","type":"Basics.Float -> Basics.Float -> Anim.Property.Rotate.Builder eng -> Anim.Property.Rotate.Builder eng"},{"name":"fromXYZ","comment":" Set the starting X, Y, and Z rotations (degrees).\n\n    myAnimation : AnimBuilder eng -> AnimBuilder eng\n    myAnimation =\n        Rotate.begin\n            >> Rotate.fromXYZ 45 90 180\n            >> ... -- continue with animation\n\n","type":"Basics.Float -> Basics.Float -> Basics.Float -> Anim.Property.Rotate.Builder eng -> Anim.Property.Rotate.Builder eng"},{"name":"fromXZ","comment":" Set the starting X and Z rotations (degrees). Y is left unchanged (or 0 if not set).\n","type":"Basics.Float -> Basics.Float -> Anim.Property.Rotate.Builder eng -> Anim.Property.Rotate.Builder eng"},{"name":"fromY","comment":" Set the starting Y rotation (degrees). X and Z are left unchanged (or 0 if not set).\n","type":"Basics.Float -> Anim.Property.Rotate.Builder eng -> Anim.Property.Rotate.Builder eng"},{"name":"fromYZ","comment":" Set the starting Y and Z rotations (degrees). X is left unchanged (or 0 if not set).\n","type":"Basics.Float -> Basics.Float -> Anim.Property.Rotate.Builder eng -> Anim.Property.Rotate.Builder eng"},{"name":"fromZ","comment":" Set the starting Z rotation (degrees). X and Y are left unchanged (or 0 if not set).\n","type":"Basics.Float -> Anim.Property.Rotate.Builder eng -> Anim.Property.Rotate.Builder eng"},{"name":"initX","comment":" Set the initial X rotation.\n\n    import Anim.Engine.* as Engine\n    import Anim.Property.Rotate as Rotate\n\n    init : ( Model, Cmd Msg )\n    init =\n        ( { animState = Engine.init [ Rotate.initX \"animGroupName\" 45 ] }\n        , Cmd.none\n        )\n\n","type":"Anim.Property.Rotate.AnimGroupName -> Basics.Float -> Anim.Internal.Builder.AnimBuilder eng -> Anim.Internal.Builder.AnimBuilder eng"},{"name":"initXY","comment":" Set the initial X and Y rotation.\n\n    import Anim.Engine.* as Engine\n    import Anim.Property.Rotate as Rotate\n\n    init : ( Model, Cmd Msg )\n    init =\n        ( { animState = Engine.init [ Rotate.initXY \"animGroupName\" 45 30 ] }\n        , Cmd.none\n        )\n\n","type":"Anim.Property.Rotate.AnimGroupName -> Basics.Float -> Basics.Float -> Anim.Internal.Builder.AnimBuilder eng -> Anim.Internal.Builder.AnimBuilder eng"},{"name":"initXYZ","comment":" Set the initial X, Y, and Z rotation.\n\n    import Anim.Engine.* as Engine\n    import Anim.Property.Rotate as Rotate\n\n    init : ( Model, Cmd Msg )\n    init =\n        ( { animState = Engine.init [ Rotate.initXYZ \"animGroupName\" 45 30 60 ] }\n        , Cmd.none\n        )\n\n","type":"Anim.Property.Rotate.AnimGroupName -> Basics.Float -> Basics.Float -> Basics.Float -> Anim.Internal.Builder.AnimBuilder eng -> Anim.Internal.Builder.AnimBuilder eng"},{"name":"initXZ","comment":" Set the initial X and Z rotation.\n\n    import Anim.Engine.* as Engine\n    import Anim.Property.Rotate as Rotate\n\n    init : ( Model, Cmd Msg )\n    init =\n        ( { animState = Engine.init [ Rotate.initXZ \"animGroupName\" 45 60 ] }\n        , Cmd.none\n        )\n\n","type":"Anim.Property.Rotate.AnimGroupName -> Basics.Float -> Basics.Float -> Anim.Internal.Builder.AnimBuilder eng -> Anim.Internal.Builder.AnimBuilder eng"},{"name":"initY","comment":" Set the initial Y rotation.\n\n    import Anim.Engine.* as Engine\n    import Anim.Property.Rotate as Rotate\n\n    init : ( Model, Cmd Msg )\n    init =\n        ( { animState = Engine.init [ Rotate.initY \"animGroupName\" 30 ] }\n        , Cmd.none\n        )\n\n","type":"Anim.Property.Rotate.AnimGroupName -> Basics.Float -> Anim.Internal.Builder.AnimBuilder eng -> Anim.Internal.Builder.AnimBuilder eng"},{"name":"initYZ","comment":" Set the initial Y and Z rotation.\n\n    import Anim.Engine.* as Engine\n    import Anim.Property.Rotate as Rotate\n\n    init : ( Model, Cmd Msg )\n    init =\n        ( { animState = Engine.init [ Rotate.initYZ \"animGroupName\" 30 60 ] }\n        , Cmd.none\n        )\n\n","type":"Anim.Property.Rotate.AnimGroupName -> Basics.Float -> Basics.Float -> Anim.Internal.Builder.AnimBuilder eng -> Anim.Internal.Builder.AnimBuilder eng"},{"name":"initZ","comment":" Set the initial Z rotation.\n\n    import Anim.Engine.* as Engine\n    import Anim.Property.Rotate as Rotate\n\n    init : ( Model, Cmd Msg )\n    init =\n        ( { animState = Engine.init [ Rotate.initZ \"animGroupName\" 60 ] }\n        , Cmd.none\n        )\n\n","type":"Anim.Property.Rotate.AnimGroupName -> Basics.Float -> Anim.Internal.Builder.AnimBuilder eng -> Anim.Internal.Builder.AnimBuilder eng"},{"name":"set","comment":" Snap to a uniform rotation on all three axes silently, cancelling\nany in-flight animation on this property.\n","type":"Basics.Float -> Anim.Property.Rotate.Builder eng -> Anim.Property.Rotate.Builder eng"},{"name":"setX","comment":" Snap target X angle, preserving the current Y and Z angles.\n","type":"Basics.Float -> Anim.Property.Rotate.Builder eng -> Anim.Property.Rotate.Builder eng"},{"name":"setXY","comment":" Snap target X and Y angles, preserving the current Z angle.\n","type":"Basics.Float -> Basics.Float -> Anim.Property.Rotate.Builder eng -> Anim.Property.Rotate.Builder eng"},{"name":"setXYZ","comment":" Snap target X, Y and Z angles.\n","type":"Basics.Float -> Basics.Float -> Basics.Float -> Anim.Property.Rotate.Builder eng -> Anim.Property.Rotate.Builder eng"},{"name":"setXZ","comment":" Snap target X and Z angles, preserving the current Y angle.\n","type":"Basics.Float -> Basics.Float -> Anim.Property.Rotate.Builder eng -> Anim.Property.Rotate.Builder eng"},{"name":"setY","comment":" Snap target Y angle, preserving the current X and Z angles.\n","type":"Basics.Float -> Anim.Property.Rotate.Builder eng -> Anim.Property.Rotate.Builder eng"},{"name":"setYZ","comment":" Snap target Y and Z angles, preserving the current X angle.\n","type":"Basics.Float -> Basics.Float -> Anim.Property.Rotate.Builder eng -> Anim.Property.Rotate.Builder eng"},{"name":"setZ","comment":" Snap target Z angle, preserving the current X and Y angles.\n","type":"Basics.Float -> Anim.Property.Rotate.Builder eng -> Anim.Property.Rotate.Builder eng"},{"name":"speed","comment":" The speed represents how many degrees the element rotates per second.\n\nFor example, a rotation animation from `0°` to `180°` with a speed of `90.0`\nwill take 2 seconds to complete.\n\n","type":"Basics.Float -> Anim.Property.Rotate.Builder { eng | withTiming : () } -> Anim.Property.Rotate.Builder { eng | withTiming : () }"},{"name":"spring","comment":" Drive this property with a spring.\n\n    import Motion.Spring as Spring\n\n    Rotate.spring Spring.wobbly\n\n","type":"Motion.Spring.Spring -> Anim.Property.Rotate.Builder { eng | withSpring : () } -> Anim.Property.Rotate.Builder { eng | withSpring : () }"},{"name":"toX","comment":" Set the target X rotation (degrees). Y and Z are left unchanged (or 0 if not set).\n","type":"Basics.Float -> Anim.Property.Rotate.Builder eng -> Anim.Property.Rotate.Builder eng"},{"name":"toXY","comment":" Set the target X and Y rotations (degrees). Z is left unchanged (or 0 if not set).\n","type":"Basics.Float -> Basics.Float -> Anim.Property.Rotate.Builder eng -> Anim.Property.Rotate.Builder eng"},{"name":"toXYZ","comment":" Set the target X, Y, and Z rotations (degrees).\n\n    myAnimation : AnimBuilder eng -> AnimBuilder eng\n    myAnimation =\n        Rotate.begin\n            >> Rotate.toXYZ 45 90 180\n            >> ... -- continue with animation\n\n","type":"Basics.Float -> Basics.Float -> Basics.Float -> Anim.Property.Rotate.Builder eng -> Anim.Property.Rotate.Builder eng"},{"name":"toXZ","comment":" Set the target X and Z rotations (degrees). Y is left unchanged (or 0 if not set).\n","type":"Basics.Float -> Basics.Float -> Anim.Property.Rotate.Builder eng -> Anim.Property.Rotate.Builder eng"},{"name":"toY","comment":" Set the target Y rotation (degrees). X and Z are left unchanged (or 0 if not set).\n","type":"Basics.Float -> Anim.Property.Rotate.Builder eng -> Anim.Property.Rotate.Builder eng"},{"name":"toYZ","comment":" Set the target Y and Z rotations (degrees). X is left unchanged (or 0 if not set).\n","type":"Basics.Float -> Basics.Float -> Anim.Property.Rotate.Builder eng -> Anim.Property.Rotate.Builder eng"},{"name":"toZ","comment":" Set the target Z rotation (degrees). X and Y are left unchanged (or 0 if not set).\n","type":"Basics.Float -> Anim.Property.Rotate.Builder eng -> Anim.Property.Rotate.Builder eng"},{"name":"unclampX","comment":" Remove the X axis range for this animation group. Does nothing if no range is set.\n","type":"Anim.Property.Rotate.Builder eng -> Anim.Property.Rotate.Builder eng"},{"name":"unclampY","comment":" Remove the Y axis range for this animation group. Does nothing if no range is set.\n","type":"Anim.Property.Rotate.Builder eng -> Anim.Property.Rotate.Builder eng"},{"name":"unclampZ","comment":" Remove the Z axis range for this animation group. Does nothing if no range is set.\n","type":"Anim.Property.Rotate.Builder eng -> Anim.Property.Rotate.Builder eng"}],"binops":[]},{"name":"Anim.Property.Scale","comment":" Scale elements along the X, Y, and Z axes.\n\n**Default**: 1.0 (original size) for all axes\n\nWhen no start value is configured, the default will be used.\n\n\n# Types\n\n@docs Builder, AnimGroupName\n\n\n# Initialize\n\n@docs init, initXYZ, initXY, initXZ, initX, initYZ, initY, initZ\n\n\n# Build\n\n@docs begin, end\n\n\n# Configure\n\n\n## Start Value\n\nWhen not set, the default will be used.\n\n📖 See [Start Values](https://phollyer.github.io/elm-motion/animation/properties/overview/#start-values)\nfor details.\n\n@docs from, fromXYZ, fromXY, fromXZ, fromX, fromYZ, fromY, fromZ\n\n\n## End Value\n\n📖 See [End Values](https://phollyer.github.io/elm-motion/animation/properties/overview/#end-values)\nfor details.\n\n\n### Absolute\n\n@docs to, toXYZ, toXY, toXZ, toX, toYZ, toY, toZ\n\n\n### Relative\n\nMove by a delta instead of to a fixed scale. The end value\nis `current + delta` where `current` is the live animated scale.\n\nOnly available on the Sub and WAAPI engines. Using these with any other engine results in a type error.\n\n@docs byXYZ, byXY, byXZ, byX, byYZ, byY, byZ\n\n\n## Timing\n\n📖 See [Animation Timing](https://phollyer.github.io/elm-motion/animation/concepts/timing/)\nfor details.\n\n@docs delay, duration, speed\n\n\n## Easing\n\n📖 See [Easing](https://phollyer.github.io/elm-motion/animation/concepts/easing/)\nfor details.\n\n@docs easing\n\n\n## Spring\n\n📖 See [Spring](https://phollyer.github.io/elm-motion/animation/concepts/spring/)\nfor details.\n\n@docs spring\n\n\n## Responsive Animations\n\n📖 See [Responsive Animations](https://phollyer.github.io/elm-motion/animation/concepts/responsive-animations/)\nfor patterns and examples.\n\n\n### Bounds\n\nKeep scale values within a range you choose. Values outside the range are clamped\nto the nearest boundary. An animation that is within the bounds, either mid-flight or\npaused, will be remapped proportionally inside the bounds.\n\n@docs Bounds, AxisBounds, bounds\n\n\n## Clamping\n\nKeep scale values on each axis within a range you choose.\n\nValues outside the range are clamped to the nearest boundary.\n\nSimilar to `bounds`, but without proportional remapping.\n\nThe range stays in effect for future animations\nuntil you [Unclamp](#unclamp) it:\n\n    motion : Scale.Builder { eng | withTiming : () } -> Scale.Builder { eng | withTiming : () }\n    motion =\n        Scale.duration 600\n            >> Scale.easing Easing.easeOutCubic\n\n    update msg model =\n        case msg of\n            ZoomChanged factor ->\n                let\n                    ( animState, cmd ) =\n                        WAAPI.retarget model.animState <|\n                            Scale.begin\n                                >> Scale.clampX 0.5 2.0\n                                >> Scale.clampY 0.5 2.0\n                                >> Scale.toXY factor factor\n                                >> Scale.end\n                in\n                ( { model | animState = animState }\n                , cmd\n                )\n\n\n### Clamp\n\n@docs clampX, clampY, clampZ\n\n\n### Unclamp\n\n@docs unclampX, unclampY, unclampZ\n\n\n## Snap\n\nSnap to a specific scale, cancelling any in-flight animation on this property.\n\n@docs set, setXYZ, setXY, setXZ, setX, setYZ, setY, setZ\n\n","unions":[],"aliases":[{"name":"AnimGroupName","comment":" Type alias for the animation group name.\n","args":[],"type":"String.String"},{"name":"AxisBounds","comment":" Per-axis resize ranges. `Nothing` leaves an axis untouched.\n\n    { x = Just { min = 1, max = 2 }\n    , y = Nothing\n    , z = Nothing\n    }\n\n","args":[],"type":"{ x : Maybe.Maybe Anim.Property.Scale.Bounds, y : Maybe.Maybe Anim.Property.Scale.Bounds, z : Maybe.Maybe Anim.Property.Scale.Bounds }"},{"name":"Bounds","comment":" A numeric range with `min` and `max` boundaries.\n","args":[],"type":"{ min : Basics.Float, max : Basics.Float }"},{"name":"Builder","comment":" Builder type for scale animations.\n","args":["eng"],"type":"Anim.Internal.Builder.Scale.ScaleBuilder eng"}],"values":[{"name":"begin","comment":" Turn the `AnimBuilder` into a scale animation `Builder` for the specified animation group.\n\nUse this to start configuring a scale animation.\n\n    myAnimation : AnimBuilder eng -> AnimBuilder eng\n    myAnimation =\n        Scale.begin\n            >> ... -- Configure and build the animation\n\n","type":"Anim.Internal.Builder.AnimBuilder eng -> Anim.Property.Scale.Builder eng"},{"name":"bounds","comment":" Apply new scale bounds for an anim group during resize.\n\nPass this inside an engine's `onResize` builder:\n\n    Sub.onResize model.animState <|\n        Scale.bounds \"cube\"\n            { x = Just { min = 1, max = newWidth / cubeSize }\n            , y = Just { min = 1, max = newHeight / cubeSize }\n            , z = Nothing\n            }\n\nYou can set the bounds for multiple anim groups in one call:\n\n    Sub.onResize model.animState <|\n        Scale.bounds \"box\" boxBounds\n            >> Scale.bounds \"card\" cardBounds\n\nThe engine proportionally remaps the in-flight animation onto the new\nrange and pins its endpoints to it.\n\nOnly callable from inside an engine's `onResize` builder - calling it from\nanywhere else results in a type error.\n\n","type":"Anim.Property.Scale.AnimGroupName -> Anim.Property.Scale.AxisBounds -> Anim.Internal.Builder.AnimBuilder { eng | withBounds : () } -> Anim.Internal.Builder.AnimBuilder { eng | withBounds : () }"},{"name":"byX","comment":" Move by a delta on the X axis. Y and Z are unaffected.\n","type":"Basics.Float -> Anim.Property.Scale.Builder eng -> Anim.Property.Scale.Builder eng"},{"name":"byXY","comment":" Move by a delta on the X and Y axes. Z is unaffected.\n","type":"Basics.Float -> Basics.Float -> Anim.Property.Scale.Builder eng -> Anim.Property.Scale.Builder eng"},{"name":"byXYZ","comment":" Move by a delta on the X, Y, and Z axes.\n","type":"Basics.Float -> Basics.Float -> Basics.Float -> Anim.Property.Scale.Builder eng -> Anim.Property.Scale.Builder eng"},{"name":"byXZ","comment":" Move by a delta on the X and Z axes. Y is unaffected.\n","type":"Basics.Float -> Basics.Float -> Anim.Property.Scale.Builder eng -> Anim.Property.Scale.Builder eng"},{"name":"byY","comment":" Move by a delta on the Y axis. X and Z are unaffected.\n","type":"Basics.Float -> Anim.Property.Scale.Builder eng -> Anim.Property.Scale.Builder eng"},{"name":"byYZ","comment":" Move by a delta on the Y and Z axes. X is unaffected.\n","type":"Basics.Float -> Basics.Float -> Anim.Property.Scale.Builder eng -> Anim.Property.Scale.Builder eng"},{"name":"byZ","comment":" Move by a delta on the Z axis. X and Y are unaffected.\n","type":"Basics.Float -> Anim.Property.Scale.Builder eng -> Anim.Property.Scale.Builder eng"},{"name":"clampX","comment":" Keep the X axis scale within `min` and `max` values. If `min > max` the values are flipped.\n","type":"Basics.Float -> Basics.Float -> Anim.Property.Scale.Builder eng -> Anim.Property.Scale.Builder eng"},{"name":"clampY","comment":" Keep the Y axis scale within `min` and `max` values. If `min > max` the values are flipped.\n","type":"Basics.Float -> Basics.Float -> Anim.Property.Scale.Builder eng -> Anim.Property.Scale.Builder eng"},{"name":"clampZ","comment":" Keep the Z axis scale within `min` and `max` values. If `min > max` the values are flipped.\n","type":"Basics.Float -> Basics.Float -> Anim.Property.Scale.Builder eng -> Anim.Property.Scale.Builder eng"},{"name":"delay","comment":" Set the delay (milliseconds) before the animation starts.\n","type":"Basics.Int -> Anim.Property.Scale.Builder { eng | withTiming : () } -> Anim.Property.Scale.Builder { eng | withTiming : () }"},{"name":"duration","comment":" Set the animation duration (milliseconds).\n","type":"Basics.Int -> Anim.Property.Scale.Builder { eng | withTiming : () } -> Anim.Property.Scale.Builder { eng | withTiming : () }"},{"name":"easing","comment":" Set the easing function for the animation.\n\n    import Motion.Easing exposing (Easing(..))\n\n    Scale.easing EaseInOut\n\n","type":"Motion.Easing.Easing -> Anim.Property.Scale.Builder eng -> Anim.Property.Scale.Builder eng"},{"name":"end","comment":" Complete the [Builder](#Builder) animation configuration and return an `AnimBuilder`\nso you can continue configuring other property animations or execute the animation with an Engine.\n\n    myAnimation : AnimBuilder eng -> AnimBuilder eng\n    myAnimation =\n        Scale.begin\n            >> ... -- configure the animation with from, to, duration, easing, etc.\n            >> Scale.end\n            >> ... -- continue with animation\n\n","type":"Anim.Property.Scale.Builder eng -> Anim.Internal.Builder.AnimBuilder eng"},{"name":"from","comment":" Set the starting scale (uniform across all axes).\n\n    myAnimation : AnimBuilder eng -> AnimBuilder eng\n    myAnimation =\n        Scale.begin\n            >> Scale.from 0.8\n            >> ... -- continue with animation\n\nThis is equivalent to `Scale.fromXYZ 0.8 0.8 0.8`.\n\n","type":"Basics.Float -> Anim.Property.Scale.Builder eng -> Anim.Property.Scale.Builder eng"},{"name":"fromX","comment":" Set the starting X scale. Y and Z are left unchanged (or 1.0 if not set).\n","type":"Basics.Float -> Anim.Property.Scale.Builder eng -> Anim.Property.Scale.Builder eng"},{"name":"fromXY","comment":" Set the starting X and Y scale. Z is left unchanged (or 1.0 if not set).\n","type":"Basics.Float -> Basics.Float -> Anim.Property.Scale.Builder eng -> Anim.Property.Scale.Builder eng"},{"name":"fromXYZ","comment":" Set the starting X, Y, and Z scale.\n\n    myAnimation : AnimBuilder eng -> AnimBuilder eng\n    myAnimation =\n        Scale.begin\n            >> Scale.fromXYZ 0.8 1.2 0.9\n            >> ... -- continue with animation\n\n","type":"Basics.Float -> Basics.Float -> Basics.Float -> Anim.Property.Scale.Builder eng -> Anim.Property.Scale.Builder eng"},{"name":"fromXZ","comment":" Set the starting X and Z scale. Y is left unchanged (or 1.0 if not set).\n","type":"Basics.Float -> Basics.Float -> Anim.Property.Scale.Builder eng -> Anim.Property.Scale.Builder eng"},{"name":"fromY","comment":" Set the starting Y scale. X and Z are left unchanged (or 1.0 if not set).\n","type":"Basics.Float -> Anim.Property.Scale.Builder eng -> Anim.Property.Scale.Builder eng"},{"name":"fromYZ","comment":" Set the starting Y and Z scale. X is left unchanged (or 1.0 if not set).\n","type":"Basics.Float -> Basics.Float -> Anim.Property.Scale.Builder eng -> Anim.Property.Scale.Builder eng"},{"name":"fromZ","comment":" Set the starting Z scale. X and Y are left unchanged (or 1.0 if not set).\n","type":"Basics.Float -> Anim.Property.Scale.Builder eng -> Anim.Property.Scale.Builder eng"},{"name":"init","comment":" Set the initial scale.\n\nUse this to initialize the scale in your Engine's `init` function.\n\n    import Anim.Engine.* as Engine\n    import Anim.Property.Scale as Scale\n\n    init : ( Model, Cmd Msg )\n    init =\n        ( { animState = Engine.init [ Scale.init \"animGroupName\" 1.5 ] }\n        , Cmd.none\n        )\n\nThis is equivalent to calling `initXYZ 1.5 1.5 1.5`.\n\n","type":"Anim.Property.Scale.AnimGroupName -> Basics.Float -> Anim.Internal.Builder.AnimBuilder eng -> Anim.Internal.Builder.AnimBuilder eng"},{"name":"initX","comment":" Set the initial X scale.\n\n    import Anim.Engine.* as Engine\n    import Anim.Property.Scale as Scale\n\n    init : ( Model, Cmd Msg )\n    init =\n        ( { animState = Engine.init [ Scale.initX \"animGroupName\" 1.5 ] }\n        , Cmd.none\n        )\n\n","type":"Anim.Property.Scale.AnimGroupName -> Basics.Float -> Anim.Internal.Builder.AnimBuilder eng -> Anim.Internal.Builder.AnimBuilder eng"},{"name":"initXY","comment":" Set the initial X and Y scale.\n\n    import Anim.Engine.* as Engine\n    import Anim.Property.Scale as Scale\n\n    init : ( Model, Cmd Msg )\n    init =\n        ( { animState = Engine.init [ Scale.initXY \"animGroupName\" 1.5 1.2 ] }\n        , Cmd.none\n        )\n\n","type":"Anim.Property.Scale.AnimGroupName -> Basics.Float -> Basics.Float -> Anim.Internal.Builder.AnimBuilder eng -> Anim.Internal.Builder.AnimBuilder eng"},{"name":"initXYZ","comment":" Set the initial X, Y, and Z scale.\n\n    import Anim.Engine.* as Engine\n    import Anim.Property.Scale as Scale\n\n    init : ( Model, Cmd Msg )\n    init =\n        ( { animState = Engine.init [ Scale.initXYZ \"animGroupName\" 1.5 1.2 1.0 ] }\n        , Cmd.none\n        )\n\n","type":"Anim.Property.Scale.AnimGroupName -> Basics.Float -> Basics.Float -> Basics.Float -> Anim.Internal.Builder.AnimBuilder eng -> Anim.Internal.Builder.AnimBuilder eng"},{"name":"initXZ","comment":" Set the initial X and Z scale.\n\n    import Anim.Engine.* as Engine\n    import Anim.Property.Scale as Scale\n\n    init : ( Model, Cmd Msg )\n    init =\n        ( { animState = Engine.init [ Scale.initXZ \"animGroupName\" 1.5 1.0 ] }\n        , Cmd.none\n        )\n\n","type":"Anim.Property.Scale.AnimGroupName -> Basics.Float -> Basics.Float -> Anim.Internal.Builder.AnimBuilder eng -> Anim.Internal.Builder.AnimBuilder eng"},{"name":"initY","comment":" Set the initial Y scale.\n\n    import Anim.Engine.* as Engine\n    import Anim.Property.Scale as Scale\n\n    init : ( Model, Cmd Msg )\n    init =\n        ( { animState = Engine.init [ Scale.initY \"animGroupName\" 1.2 ] }\n        , Cmd.none\n        )\n\n","type":"Anim.Property.Scale.AnimGroupName -> Basics.Float -> Anim.Internal.Builder.AnimBuilder eng -> Anim.Internal.Builder.AnimBuilder eng"},{"name":"initYZ","comment":" Set the initial Y and Z scale.\n\n    import Anim.Engine.* as Engine\n    import Anim.Property.Scale as Scale\n\n    init : ( Model, Cmd Msg )\n    init =\n        ( { animState = Engine.init [ Scale.initYZ \"animGroupName\" 1.2 1.0 ] }\n        , Cmd.none\n        )\n\n","type":"Anim.Property.Scale.AnimGroupName -> Basics.Float -> Basics.Float -> Anim.Internal.Builder.AnimBuilder eng -> Anim.Internal.Builder.AnimBuilder eng"},{"name":"initZ","comment":" Set the initial Z scale.\n\n    import Anim.Engine.* as Engine\n    import Anim.Property.Scale as Scale\n\n    init : ( Model, Cmd Msg )\n    init =\n        ( { animState = Engine.init [ Scale.initZ \"animGroupName\" 1.0 ] }\n        , Cmd.none\n        )\n\n","type":"Anim.Property.Scale.AnimGroupName -> Basics.Float -> Anim.Internal.Builder.AnimBuilder eng -> Anim.Internal.Builder.AnimBuilder eng"},{"name":"set","comment":" Snap to a uniform scale on all three axes silently, cancelling\nany in-flight animation on this property.\n","type":"Basics.Float -> Anim.Property.Scale.Builder eng -> Anim.Property.Scale.Builder eng"},{"name":"setX","comment":" Snap target X scale, preserving the current Y and Z scales.\n","type":"Basics.Float -> Anim.Property.Scale.Builder eng -> Anim.Property.Scale.Builder eng"},{"name":"setXY","comment":" Snap target X and Y scales, preserving the current Z scale.\n","type":"Basics.Float -> Basics.Float -> Anim.Property.Scale.Builder eng -> Anim.Property.Scale.Builder eng"},{"name":"setXYZ","comment":" Snap target X, Y and Z scales.\n","type":"Basics.Float -> Basics.Float -> Basics.Float -> Anim.Property.Scale.Builder eng -> Anim.Property.Scale.Builder eng"},{"name":"setXZ","comment":" Snap target X and Z scales, preserving the current Y scale.\n","type":"Basics.Float -> Basics.Float -> Anim.Property.Scale.Builder eng -> Anim.Property.Scale.Builder eng"},{"name":"setY","comment":" Snap target Y scale, preserving the current X and Z scales.\n","type":"Basics.Float -> Anim.Property.Scale.Builder eng -> Anim.Property.Scale.Builder eng"},{"name":"setYZ","comment":" Snap target Y and Z scales, preserving the current X scale.\n","type":"Basics.Float -> Basics.Float -> Anim.Property.Scale.Builder eng -> Anim.Property.Scale.Builder eng"},{"name":"setZ","comment":" Snap target Z scale, preserving the current X and Y scales.\n","type":"Basics.Float -> Anim.Property.Scale.Builder eng -> Anim.Property.Scale.Builder eng"},{"name":"speed","comment":" The speed represents how much the scale factor changes per second.\n\nFor example, a scale animation from `1.0` to `5.0` with a speed of `2.0`\nwill take 2 seconds to complete.\n\n","type":"Basics.Float -> Anim.Property.Scale.Builder { eng | withTiming : () } -> Anim.Property.Scale.Builder { eng | withTiming : () }"},{"name":"spring","comment":" Drive this property with a spring.\n\n    import Motion.Spring as Spring\n\n    Scale.spring Spring.wobbly\n\n","type":"Motion.Spring.Spring -> Anim.Property.Scale.Builder { eng | withSpring : () } -> Anim.Property.Scale.Builder { eng | withSpring : () }"},{"name":"to","comment":" Set the target scale (uniform across all axes).\n\n    myAnimation : AnimBuilder eng -> AnimBuilder eng\n    myAnimation =\n        Scale.begin\n            >> Scale.to 1.5\n            >> ... -- continue with animation\n\nThis is equivalent to `toXYZ 1.5 1.5 1.5`.\n\n","type":"Basics.Float -> Anim.Property.Scale.Builder eng -> Anim.Property.Scale.Builder eng"},{"name":"toX","comment":" Set the target X scale. Y and Z are left unchanged (or 1.0 if not set).\n","type":"Basics.Float -> Anim.Property.Scale.Builder eng -> Anim.Property.Scale.Builder eng"},{"name":"toXY","comment":" Set the target X and Y scale. Z is left unchanged (or 1.0 if not set).\n","type":"Basics.Float -> Basics.Float -> Anim.Property.Scale.Builder eng -> Anim.Property.Scale.Builder eng"},{"name":"toXYZ","comment":" Set the target X, Y, and Z scale.\n\n    myAnimation : AnimBuilder eng -> AnimBuilder eng\n    myAnimation =\n        Scale.begin\n            >> Scale.toXYZ 1.5 2.0 0.8\n            >> ... -- continue with animation\n\n","type":"Basics.Float -> Basics.Float -> Basics.Float -> Anim.Property.Scale.Builder eng -> Anim.Property.Scale.Builder eng"},{"name":"toXZ","comment":" Set the target X and Z scale. Y is left unchanged (or 1.0 if not set).\n","type":"Basics.Float -> Basics.Float -> Anim.Property.Scale.Builder eng -> Anim.Property.Scale.Builder eng"},{"name":"toY","comment":" Set the target Y scale. X and Z are left unchanged (or 1.0 if not set).\n","type":"Basics.Float -> Anim.Property.Scale.Builder eng -> Anim.Property.Scale.Builder eng"},{"name":"toYZ","comment":" Set the target Y and Z scale. X is left unchanged (or 1.0 if not set).\n","type":"Basics.Float -> Basics.Float -> Anim.Property.Scale.Builder eng -> Anim.Property.Scale.Builder eng"},{"name":"toZ","comment":" Set the target Z scale. X and Y are left unchanged (or 1.0 if not set).\n","type":"Basics.Float -> Anim.Property.Scale.Builder eng -> Anim.Property.Scale.Builder eng"},{"name":"unclampX","comment":" Remove the X axis range for this animation group. Does nothing if no range is set.\n","type":"Anim.Property.Scale.Builder eng -> Anim.Property.Scale.Builder eng"},{"name":"unclampY","comment":" Remove the Y axis range for this animation group. Does nothing if no range is set.\n","type":"Anim.Property.Scale.Builder eng -> Anim.Property.Scale.Builder eng"},{"name":"unclampZ","comment":" Remove the Z axis range for this animation group. Does nothing if no range is set.\n","type":"Anim.Property.Scale.Builder eng -> Anim.Property.Scale.Builder eng"}],"binops":[]},{"name":"Anim.Property.Size","comment":" Animate the width and height of elements.\n\n**Default**: 0 for width and height\n\nWhen no start value is configured, the default will be used.\n\nIf height or width is not defined in the animation configuration, it will remain unchanged,\nor 0 if not set.\n\n\n# Types\n\n@docs Builder, AnimGroupName\n\n\n# Initialize\n\n@docs init, initHW, initW, initH\n\n\n# Build\n\n@docs begin, end\n\n\n# Configure\n\n\n## Start Value\n\nWhen not set, the default will be used.\n\n📖 See [Start Values](https://phollyer.github.io/elm-motion/animation/properties/overview/#start-values)\nfor details.\n\n@docs fromHW, fromH, fromW, from\n\n\n## End Value\n\n📖 See [End Values](https://phollyer.github.io/elm-motion/animation/properties/overview/#end-values)\nfor details.\n\n\n### Absolute\n\n@docs toHW, toH, toW\n\n\n### Relative\n\nMove by a delta on width and height instead of to a fixed size. The end value\nis `current + delta` where `current` is the live animated size.\n\nOnly available on the Sub and WAAPI engines. Using these with any other engine results in a type error.\n\n@docs byHW, byH, byW\n\n\n## Timing\n\n📖 See [Animation Timing](https://phollyer.github.io/elm-motion/animation/concepts/timing/)\nfor details.\n\n@docs delay, duration, speed\n\n\n## Easing\n\n📖 See [Easing](https://phollyer.github.io/elm-motion/animation/concepts/easing/)\nfor details.\n\n@docs easing\n\n\n## Spring\n\n📖 See [Spring](https://phollyer.github.io/elm-motion/animation/concepts/spring/)\nfor details.\n\n@docs spring\n\n\n## CSS Units\n\nSet the CSS [Unit](Anim-Unit#Unit) for one or both sides.\n\n\n### Initializing\n\nInitialize the the CSS [Unit](Anim-Unit#Unit) to be used on first render and subsequent animations.\n\n**Note**: Must be called after an anim group has been initialized, otherwise it will have no effect.\n\n@docs initCssUnit, initCssUnitW, initCssUnitH\n\n\n### Animating\n\nSet the CSS [Unit](Anim-Unit#Unit) for one or both sides. This will also affect all future animations\nfor the associated anim group.\n\n@docs cssUnit, cssUnitW, cssUnitH\n\n\n## Responsive Animations\n\n📖 See [Responsive Animations](https://phollyer.github.io/elm-motion/animation/concepts/responsive-animations/)\nfor patterns and examples.\n\n\n### Bounds\n\nProportionally remap an in-flight size animation onto new width / height\nranges from inside an engine's `onResize` callback.\n\n@docs Bounds, AxisBounds, bounds\n\n\n## Clamping\n\nKeep width and height within a range you choose.\n\nValues outside the range are clamped to the nearest boundary.\n\nSimilar to `bounds`, but without proportional remapping.\n\nThe range stays in effect for future animations\nuntil you [Unclamp](#unclamp) it:\n\n    update msg model =\n        case msg of\n            GotContainer (Ok { element }) ->\n                let\n                    w =\n                        element.width\n\n                    h =\n                        element.height\n\n                    ( animState, cmd ) =\n                        WAAPI.retarget model.animState <|\n                            Size.begin\n                                >> Size.clampWidth 0 w\n                                >> Size.clampHeight 0 h\n                                >> Size.end\n                in\n                ( { model | animState = animState }\n                , cmd\n                )\n\n\n### Clamp\n\n@docs clampWidth, clampHeight\n\n\n### Unclamp\n\n@docs unclampWidth, unclampHeight\n\n\n## Snap\n\nSnap to a specific size, cancelling any in-flight animation on this property.\n\n@docs set, setHW, setH, setW\n\n","unions":[],"aliases":[{"name":"AnimGroupName","comment":" Type alias for the animation group name.\n","args":[],"type":"String.String"},{"name":"AxisBounds","comment":" Per-axis resize ranges. `Nothing` leaves an axis untouched.\n\n    { width = Just { min = 0, max = 400 }\n    , height = Nothing\n    }\n\n","args":[],"type":"{ width : Maybe.Maybe Anim.Property.Size.Bounds, height : Maybe.Maybe Anim.Property.Size.Bounds }"},{"name":"Bounds","comment":" A numeric range with `min` and `max` boundaries.\n","args":[],"type":"{ min : Basics.Float, max : Basics.Float }"},{"name":"Builder","comment":" Builder type for size animations.\n","args":["eng"],"type":"Anim.Internal.Builder.Size.SizeBuilder eng"}],"values":[{"name":"begin","comment":" Turn the `AnimBuilder` into a size animation `Builder` for the specified animation group.\n\nUse this to start configuring a size animation.\n\n    myAnimation : AnimBuilder eng -> AnimBuilder eng\n    myAnimation =\n        Size.begin\n            >> ... -- Configure and build the animation\n\n","type":"Anim.Internal.Builder.AnimBuilder eng -> Anim.Property.Size.Builder eng"},{"name":"bounds","comment":" Apply new size bounds for an anim group during resize.\n\nPass this inside an engine's `onResize` builder:\n\n    Sub.onResize model.animState <|\n        Size.bounds \"box\"\n            { width = Just { min = 0, max = newWidth }\n            , height = Just { min = 0, max = newHeight }\n            }\n\nYou can set the bounds for multiple anim groups in one call:\n\n    Sub.onResize model.animState <|\n        Size.bounds \"box\" boxBounds\n            >> Size.bounds \"card\" cardBounds\n\nThe engine proportionally remaps the in-flight animation onto the new\nrange and pins its endpoints to it.\n\nOnly callable from inside an engine's `onResize` builder - calling it from\nanywhere else results in a type error.\n\n","type":"Anim.Property.Size.AnimGroupName -> Anim.Property.Size.AxisBounds -> Anim.Internal.Builder.AnimBuilder { eng | withBounds : () } -> Anim.Internal.Builder.AnimBuilder { eng | withBounds : () }"},{"name":"byH","comment":" Move by a delta on height. Width is unaffected.\n","type":"Basics.Float -> Anim.Property.Size.Builder eng -> Anim.Property.Size.Builder eng"},{"name":"byHW","comment":" Move by a delta on height and width.\n","type":"Basics.Float -> Basics.Float -> Anim.Property.Size.Builder eng -> Anim.Property.Size.Builder eng"},{"name":"byW","comment":" Move by a delta on width. Height is unaffected.\n","type":"Basics.Float -> Anim.Property.Size.Builder eng -> Anim.Property.Size.Builder eng"},{"name":"clampHeight","comment":" Keep height within `min` and `max` values. If `min > max` the values are flipped.\n","type":"Basics.Float -> Basics.Float -> Anim.Property.Size.Builder eng -> Anim.Property.Size.Builder eng"},{"name":"clampWidth","comment":" Keep width within `min` and `max` values. If `min > max` the values are flipped.\n","type":"Basics.Float -> Basics.Float -> Anim.Property.Size.Builder eng -> Anim.Property.Size.Builder eng"},{"name":"cssUnit","comment":" Set the CSS [Unit](Anim-Unit#Unit) for both sides.\n\n    import Anim.Property.Size as Size\n    import Anim.Unit as Unit\n\n    Size.begin\n        >> Size.cssUnit Unit.Cqmin\n        >> ... -- continue with animation\n\n","type":"Anim.Unit.Unit -> Anim.Property.Size.Builder eng -> Anim.Property.Size.Builder eng"},{"name":"cssUnitH","comment":" Set the CSS [Unit](Anim-Unit#Unit) for the height.\n","type":"Anim.Unit.Unit -> Anim.Property.Size.Builder eng -> Anim.Property.Size.Builder eng"},{"name":"cssUnitW","comment":" Set the CSS [Unit](Anim-Unit#Unit) for the width.\n","type":"Anim.Unit.Unit -> Anim.Property.Size.Builder eng -> Anim.Property.Size.Builder eng"},{"name":"delay","comment":" Set the delay (milliseconds) before the animation starts.\n","type":"Basics.Int -> Anim.Property.Size.Builder { eng | withTiming : () } -> Anim.Property.Size.Builder { eng | withTiming : () }"},{"name":"duration","comment":" Set the animation duration (milliseconds).\n","type":"Basics.Int -> Anim.Property.Size.Builder { eng | withTiming : () } -> Anim.Property.Size.Builder { eng | withTiming : () }"},{"name":"easing","comment":" Set the easing function for the animation.\n\n    import Motion.Easing exposing (Easing(..))\n\n    Size.easing EaseInOut\n\n","type":"Motion.Easing.Easing -> Anim.Property.Size.Builder eng -> Anim.Property.Size.Builder eng"},{"name":"end","comment":" Complete the [Builder](#Builder) animation configuration and return an `AnimBuilder`\nso you can continue configuring other property animations or execute the animation with an Engine.\n\n    myAnimation : AnimBuilder eng -> AnimBuilder eng\n    myAnimation =\n        Size.begin\n            >> ... -- configure the animation with from, to, duration, easing, etc.\n            >> Size.end\n            >> ... -- continue with animation\n\n","type":"Anim.Property.Size.Builder eng -> Anim.Internal.Builder.AnimBuilder eng"},{"name":"from","comment":" Set both starting width and height to the same value.\n\nThis is equivalent to calling `fromHW value value`.\n\n","type":"Basics.Float -> Anim.Property.Size.Builder eng -> Anim.Property.Size.Builder eng"},{"name":"fromH","comment":" Set the starting height. Width is left unchanged (or 0 if not set).\n","type":"Basics.Float -> Anim.Property.Size.Builder eng -> Anim.Property.Size.Builder eng"},{"name":"fromHW","comment":" Set the starting height and width.\n\n    myAnimation : AnimBuilder eng -> AnimBuilder eng\n    myAnimation =\n        Size.begin\n            >> Size.fromHW 200 100\n            >> ... -- continue with animation\n\n","type":"Basics.Float -> Basics.Float -> Anim.Property.Size.Builder eng -> Anim.Property.Size.Builder eng"},{"name":"fromW","comment":" Set the starting width. Height is left unchanged (or 0 if not set).\n","type":"Basics.Float -> Anim.Property.Size.Builder eng -> Anim.Property.Size.Builder eng"},{"name":"init","comment":" Set the initial size.\n\nUse this to initialize the size in your Engine's `init` function.\n\n    import Anim.Engine.* as Engine\n    import Anim.Property.Size as Size\n\n    init : ( Model, Cmd Msg )\n    init =\n        ( { animState = Engine.init [ Size.init \"animGroupName\" 100 ] }\n        , Cmd.none\n        )\n\nThis is equivalent to calling `initHW 100 100`.\n\n","type":"Anim.Property.Size.AnimGroupName -> Basics.Float -> Anim.Internal.Builder.AnimBuilder eng -> Anim.Internal.Builder.AnimBuilder eng"},{"name":"initCssUnit","comment":" Initialize the CSS [Unit](Anim-Unit#Unit) for all sides.\n\n    import Anim.Engine.Keyframe as Keyframe\n    import Anim.Property.Size as Size\n    import Anim.Unit as Unit\n\n    Keyframe.init\n        [ Size.initHW \"animGroupName\" 8 25\n            >> Size.initCssUnit Unit.Cqmin\n        ]\n\n","type":"Anim.Unit.Unit -> Anim.Internal.Builder.AnimBuilder eng -> Anim.Internal.Builder.AnimBuilder eng"},{"name":"initCssUnitH","comment":" Initialize the CSS [Unit](Anim-Unit#Unit) for the height.\n","type":"Anim.Unit.Unit -> Anim.Internal.Builder.AnimBuilder eng -> Anim.Internal.Builder.AnimBuilder eng"},{"name":"initCssUnitW","comment":" Initialize the CSS [Unit](Anim-Unit#Unit) for the width.\n","type":"Anim.Unit.Unit -> Anim.Internal.Builder.AnimBuilder eng -> Anim.Internal.Builder.AnimBuilder eng"},{"name":"initH","comment":" Set the initial height.\n\n    import Anim.Engine.* as Engine\n    import Anim.Property.Size as Size\n\n    init : ( Model, Cmd Msg )\n    init =\n        ( { animState = Engine.init [ Size.initH \"animGroupName\" 150 ] }\n        , Cmd.none\n        )\n\n","type":"Anim.Property.Size.AnimGroupName -> Basics.Float -> Anim.Internal.Builder.AnimBuilder eng -> Anim.Internal.Builder.AnimBuilder eng"},{"name":"initHW","comment":" Set the initial width and height.\n\n    import Anim.Engine.* as Engine\n    import Anim.Property.Size as Size\n\n    init : ( Model, Cmd Msg )\n    init =\n        ( { animState = Engine.init [ Size.initHW \"animGroupName\" 200 100 ] }\n        , Cmd.none\n        )\n\n","type":"Anim.Property.Size.AnimGroupName -> Basics.Float -> Basics.Float -> Anim.Internal.Builder.AnimBuilder eng -> Anim.Internal.Builder.AnimBuilder eng"},{"name":"initW","comment":" Set the initial width.\n\n    import Anim.Engine.* as Engine\n    import Anim.Property.Size as Size\n\n    init : ( Model, Cmd Msg )\n    init =\n        ( { animState = Engine.init [ Size.initW \"animGroupName\" 200 ] }\n        , Cmd.none\n        )\n\n","type":"Anim.Property.Size.AnimGroupName -> Basics.Float -> Anim.Internal.Builder.AnimBuilder eng -> Anim.Internal.Builder.AnimBuilder eng"},{"name":"set","comment":" Snap to a uniform width and height.\n","type":"Basics.Float -> Anim.Property.Size.Builder eng -> Anim.Property.Size.Builder eng"},{"name":"setH","comment":" Snap target height, preserving the current width.\n","type":"Basics.Float -> Anim.Property.Size.Builder eng -> Anim.Property.Size.Builder eng"},{"name":"setHW","comment":" Snap target height and width values.\n","type":"Basics.Float -> Basics.Float -> Anim.Property.Size.Builder eng -> Anim.Property.Size.Builder eng"},{"name":"setW","comment":" Snap target width, preserving the current height.\n","type":"Basics.Float -> Anim.Property.Size.Builder eng -> Anim.Property.Size.Builder eng"},{"name":"speed","comment":" The speed represents how many units the element's size changes per second.\n\nFor example, a size animation from `(100, 100)` to `(200, 200)` with a speed\nof `50.0` will take 2 seconds to complete.\n\n","type":"Basics.Float -> Anim.Property.Size.Builder { eng | withTiming : () } -> Anim.Property.Size.Builder { eng | withTiming : () }"},{"name":"spring","comment":" Drive this property with a spring.\n\n    import Motion.Spring as Spring\n\n    Size.spring Spring.wobbly\n\n","type":"Motion.Spring.Spring -> Anim.Property.Size.Builder { eng | withSpring : () } -> Anim.Property.Size.Builder { eng | withSpring : () }"},{"name":"toH","comment":" Set the target height. Width is left unchanged (or 0 if not set).\n","type":"Basics.Float -> Anim.Property.Size.Builder eng -> Anim.Property.Size.Builder eng"},{"name":"toHW","comment":" Set the target height and width.\n\n    myAnimation : AnimBuilder eng -> AnimBuilder eng\n    myAnimation =\n        Size.begin\n            >> Size.toHW 200 100\n            >> ... -- continue with animation\n\n","type":"Basics.Float -> Basics.Float -> Anim.Property.Size.Builder eng -> Anim.Property.Size.Builder eng"},{"name":"toW","comment":" Set the target width. Height is left unchanged (or 0 if not set).\n","type":"Basics.Float -> Anim.Property.Size.Builder eng -> Anim.Property.Size.Builder eng"},{"name":"unclampHeight","comment":" Remove the height range for this animation group. Does nothing if no range is set.\n","type":"Anim.Property.Size.Builder eng -> Anim.Property.Size.Builder eng"},{"name":"unclampWidth","comment":" Remove the width range for this animation group. Does nothing if no range is set.\n","type":"Anim.Property.Size.Builder eng -> Anim.Property.Size.Builder eng"}],"binops":[]},{"name":"Anim.Property.Skew","comment":" Skew elements along the X and Y axes.\n\n**Default**: 0 degrees for both axes\n\nWhen no start value is configured for any axis, the default will be used.\n\n\n# Types\n\n@docs Builder, AnimGroupName\n\n\n# Initialize\n\n@docs initXY, initX, initY\n\n\n# Build\n\n@docs begin, end\n\n\n# Configure\n\n\n## Start Value\n\nWhen not set, the default will be used.\n\n📖 See [Start Values](https://phollyer.github.io/elm-motion/animation/properties/overview/#start-values)\nfor details.\n\n@docs fromXY, fromX, fromY\n\n\n## End Value\n\n📖 See [End Values](https://phollyer.github.io/elm-motion/animation/properties/overview/#end-values)\nfor details.\n\n\n### Absolute\n\n@docs toXY, toX, toY\n\n\n### Relative\n\nMove by a delta instead of to a fixed skew. The end value\nis `current + delta` where `current` is the live animated skew.\n\nOnly available on the Sub and WAAPI engines. Using these with any other engine results in a type error.\n\n@docs byXY, byX, byY\n\n\n## Timing\n\n📖 See [Animation Timing](https://phollyer.github.io/elm-motion/animation/concepts/timing/)\nfor details.\n\n@docs delay, duration, speed\n\n\n## Easing\n\n📖 See [Easing](https://phollyer.github.io/elm-motion/animation/concepts/easing/)\nfor details.\n\n@docs easing\n\n\n## Spring\n\n📖 See [Spring](https://phollyer.github.io/elm-motion/animation/concepts/spring/)\nfor details.\n\n@docs spring\n\n\n## Clamping\n\nKeep skew values on each axis within a range you choose.\n\nValues outside the range are clamped to the nearest boundary.\n\nThe range stays in effect for future animations\nuntil you [Unclamp](#unclamp) it:\n\n    update msg model =\n        case msg of\n            TiltChanged xDeg yDeg ->\n                let\n                    ( animState, cmd ) =\n                        WAAPI.animate model.animState <|\n                            Skew.begin\n                                >> Skew.clampX -30 30\n                                >> Skew.clampY -30 30\n                                >> Skew.end\n                in\n                ( { model | animState = animState }\n                , cmd\n                )\n\n\n### Clamp\n\n@docs clampX, clampY\n\n\n### Unclamp\n\n@docs unclampX, unclampY\n\n\n## Snap\n\nSnap to a specific skew, cancelling any in-flight animation on this property.\n\n@docs setXY, setX, setY\n\n","unions":[],"aliases":[{"name":"AnimGroupName","comment":" Type alias for the animation group name.\n","args":[],"type":"String.String"},{"name":"Builder","comment":" Builder type for skew animations.\n","args":["eng"],"type":"Anim.Internal.Builder.Skew.SkewBuilder eng"}],"values":[{"name":"begin","comment":" Turn the `AnimBuilder` into a skew animation `Builder` for the specified animation group.\n\nUse this to start configuring a skew animation.\n\n    myAnimation : AnimBuilder eng -> AnimBuilder eng\n    myAnimation =\n        Skew.begin\n            >> ... -- Configure and build the animation\n\n","type":"Anim.Internal.Builder.AnimBuilder eng -> Anim.Property.Skew.Builder eng"},{"name":"byX","comment":" Move by a delta on the X axis. Y is unaffected.\n","type":"Basics.Float -> Anim.Property.Skew.Builder eng -> Anim.Property.Skew.Builder eng"},{"name":"byXY","comment":" Move by a delta on the X and Y axes.\n","type":"Basics.Float -> Basics.Float -> Anim.Property.Skew.Builder eng -> Anim.Property.Skew.Builder eng"},{"name":"byY","comment":" Move by a delta on the Y axis. X is unaffected.\n","type":"Basics.Float -> Anim.Property.Skew.Builder eng -> Anim.Property.Skew.Builder eng"},{"name":"clampX","comment":" Keep the X axis skew within `min` and `max` values. If `min > max` the values are flipped.\n","type":"Basics.Float -> Basics.Float -> Anim.Property.Skew.Builder eng -> Anim.Property.Skew.Builder eng"},{"name":"clampY","comment":" Keep the Y axis skew within `min` and `max` values. If `min > max` the values are flipped.\n","type":"Basics.Float -> Basics.Float -> Anim.Property.Skew.Builder eng -> Anim.Property.Skew.Builder eng"},{"name":"delay","comment":" Set the delay (milliseconds) before the animation starts.\n","type":"Basics.Int -> Anim.Property.Skew.Builder { eng | withTiming : () } -> Anim.Property.Skew.Builder { eng | withTiming : () }"},{"name":"duration","comment":" Set the animation duration (milliseconds).\n","type":"Basics.Int -> Anim.Property.Skew.Builder { eng | withTiming : () } -> Anim.Property.Skew.Builder { eng | withTiming : () }"},{"name":"easing","comment":" Set the easing function for the animation.\n\n    import Motion.Easing exposing (Easing(..))\n\n    Skew.easing EaseInOut\n\n","type":"Motion.Easing.Easing -> Anim.Property.Skew.Builder eng -> Anim.Property.Skew.Builder eng"},{"name":"end","comment":" Complete the [Builder](#Builder) animation configuration and return an `AnimBuilder`\nso you can continue configuring other property animations or execute the animation with an Engine.\n\n    myAnimation : AnimBuilder eng -> AnimBuilder eng\n    myAnimation =\n        Skew.begin\n            >> ... -- configure the animation with from, to, duration, easing, etc.\n            >> Skew.end\n            >> ... -- continue with animation\n\n","type":"Anim.Property.Skew.Builder eng -> Anim.Internal.Builder.AnimBuilder eng"},{"name":"fromX","comment":" Set the starting X skew (degrees). Y is left unchanged (or 0 if not set).\n","type":"Basics.Float -> Anim.Property.Skew.Builder eng -> Anim.Property.Skew.Builder eng"},{"name":"fromXY","comment":" Set the starting X and Y skew (degrees).\n","type":"Basics.Float -> Basics.Float -> Anim.Property.Skew.Builder eng -> Anim.Property.Skew.Builder eng"},{"name":"fromY","comment":" Set the starting Y skew (degrees). X is left unchanged (or 0 if not set).\n","type":"Basics.Float -> Anim.Property.Skew.Builder eng -> Anim.Property.Skew.Builder eng"},{"name":"initX","comment":" Set the initial X skew.\n\n    import Anim.Engine.* as Engine\n    import Anim.Property.Skew as Skew\n\n    init : ( Model, Cmd Msg )\n    init =\n        ( { animState = Engine.init [ Skew.initX \"animGroupName\" 12 ] }\n        , Cmd.none\n        )\n\n","type":"Anim.Property.Skew.AnimGroupName -> Basics.Float -> Anim.Internal.Builder.AnimBuilder eng -> Anim.Internal.Builder.AnimBuilder eng"},{"name":"initXY","comment":" Set the initial X and Y skew.\n\n    import Anim.Engine.* as Engine\n    import Anim.Property.Skew as Skew\n\n    init : ( Model, Cmd Msg )\n    init =\n        ( { animState = Engine.init [ Skew.initXY \"animGroupName\" 12 6 ] }\n        , Cmd.none\n        )\n\n","type":"Anim.Property.Skew.AnimGroupName -> Basics.Float -> Basics.Float -> Anim.Internal.Builder.AnimBuilder eng -> Anim.Internal.Builder.AnimBuilder eng"},{"name":"initY","comment":" Set the initial Y skew.\n\n    import Anim.Engine.* as Engine\n    import Anim.Property.Skew as Skew\n\n    init : ( Model, Cmd Msg )\n    init =\n        ( { animState = Engine.init [ Skew.initY \"animGroupName\" 8 ] }\n        , Cmd.none\n        )\n\n","type":"Anim.Property.Skew.AnimGroupName -> Basics.Float -> Anim.Internal.Builder.AnimBuilder eng -> Anim.Internal.Builder.AnimBuilder eng"},{"name":"setX","comment":" Snap target X angle, preserving the current Y angle.\n","type":"Basics.Float -> Anim.Property.Skew.Builder eng -> Anim.Property.Skew.Builder eng"},{"name":"setXY","comment":" Snap target X and Y skew angles.\n","type":"Basics.Float -> Basics.Float -> Anim.Property.Skew.Builder eng -> Anim.Property.Skew.Builder eng"},{"name":"setY","comment":" Snap target Y angle, preserving the current X angle.\n","type":"Basics.Float -> Anim.Property.Skew.Builder eng -> Anim.Property.Skew.Builder eng"},{"name":"speed","comment":" The speed represents how many degrees the skew changes per second.\n\nFor example, a skew animation from `0` to `30` degrees with a speed of `15.0`\nwill take 2 seconds to complete.\n\n","type":"Basics.Float -> Anim.Property.Skew.Builder { eng | withTiming : () } -> Anim.Property.Skew.Builder { eng | withTiming : () }"},{"name":"spring","comment":" Drive this property with a spring.\n\n    import Motion.Spring as Spring\n\n    Skew.spring Spring.wobbly\n\n","type":"Motion.Spring.Spring -> Anim.Property.Skew.Builder { eng | withSpring : () } -> Anim.Property.Skew.Builder { eng | withSpring : () }"},{"name":"toX","comment":" Set the target X skew (degrees). Y is left unchanged (or 0 if not set).\n","type":"Basics.Float -> Anim.Property.Skew.Builder eng -> Anim.Property.Skew.Builder eng"},{"name":"toXY","comment":" Set the target X and Y skew (degrees).\n","type":"Basics.Float -> Basics.Float -> Anim.Property.Skew.Builder eng -> Anim.Property.Skew.Builder eng"},{"name":"toY","comment":" Set the target Y skew (degrees). X is left unchanged (or 0 if not set).\n","type":"Basics.Float -> Anim.Property.Skew.Builder eng -> Anim.Property.Skew.Builder eng"},{"name":"unclampX","comment":" Remove the X axis range for this animation group. Does nothing if no range is set.\n","type":"Anim.Property.Skew.Builder eng -> Anim.Property.Skew.Builder eng"},{"name":"unclampY","comment":" Remove the Y axis range for this animation group. Does nothing if no range is set.\n","type":"Anim.Property.Skew.Builder eng -> Anim.Property.Skew.Builder eng"}],"binops":[]},{"name":"Anim.Property.Translate","comment":" Move elements along the X, Y, and Z axes.\n\n**Default**: 0 for all axes\n\nWhen no start value is configured for any axis, the default will be used for that axis.\n\n\n# Types\n\n@docs Builder, AnimGroupName\n\n\n# Initialize\n\n@docs initXYZ, initXY, initXZ, initX, initYZ, initY, initZ\n\n\n# Build\n\n@docs begin, end\n\n\n# Configure\n\n\n## Start Value\n\n📖 See [Start Values](https://phollyer.github.io/elm-motion/animation/properties/overview/#start-values)\nfor details.\n\n@docs fromXYZ, fromXY, fromXZ, fromX, fromYZ, fromY, fromZ\n\n\n## End Value\n\n📖 See [End Values](https://phollyer.github.io/elm-motion/animation/properties/overview/#end-values)\nfor details.\n\n\n### Absolute\n\n@docs toXYZ, toXY, toXZ, toX, toYZ, toY, toZ\n\n\n### Relative\n\nMove by a delta instead of to a fixed position. The end value is\n`current + delta`, where `current` is the live animated position.\n\nOnly available on the Sub and WAAPI engines. Using these with\nany other engine results in a type error.\n\n@docs byXYZ, byXY, byXZ, byX, byYZ, byY, byZ\n\n\n## Timing\n\n📖 See [Animation Timing](https://phollyer.github.io/elm-motion/animation/concepts/timing/)\nfor details.\n\n@docs delay, duration, speed\n\n\n## Easing\n\n📖 See [Easing](https://phollyer.github.io/elm-motion/animation/concepts/easing/)\nfor details.\n\n@docs easing\n\n\n## Spring\n\n📖 See [Spring](https://phollyer.github.io/elm-motion/animation/concepts/spring/)\nfor details.\n\n@docs spring\n\n\n## CSS Units\n\nSet the CSS [Unit](Anim-Unit#Unit) for one or more axes.\n\n\n### Initializing\n\nInitialize the the CSS [Unit](Anim-Unit#Unit) to be used on first render and subsequent animations.\n\n**Note**: Must be called after an anim group has been initialized, otherwise it will have no effect.\n\n@docs initCssUnit, initCssUnitX, initCssUnitY, initCssUnitZ\n\n\n### Animating\n\nSet the CSS [Unit](Anim-Unit#Unit) for one or more axes. This will also affect all future animations\nfor the associated anim group.\n\n@docs cssUnit, cssUnitX, cssUnitY, cssUnitZ\n\n\n## Responsive Animations\n\nWhen using responsive units like `%` or `Cqw`, the animation automatically responds\nto changes in screen or container size without extra configuration. However, when\nusing fixed units like `Px`, the animation needs to be made aware of size changes\nin order to respond to them. This is done with the functions below.\n\n📖 See [Responsive Animations](https://phollyer.github.io/elm-motion/animation/concepts/responsive-animations/)\nfor patterns and examples.\n\n\n### Bounds\n\nKeep translate values within a range you choose. Values outside the range are clamped\nto the nearest boundary. An animation that is within the bounds, either mid-flight or\npaused, will be remapped proportionally inside the bounds.\n\n@docs Bounds, AxisBounds, bounds\n\n\n## Clamping\n\nKeep translate values on each axis within a range you choose.\n\nValues outside the range are clamped to the nearest boundary.\n\nSimilar to `bounds`, but without proportional remapping.\n\nThe range stays in effect for future animations\nuntil you [Unclamp](#unclamp) it:\n\n    update msg model =\n        case msg of\n            GotCanvas (Ok { element }) ->\n                let\n                    w =\n                        element.width\n\n                    h =\n                        element.height\n\n                    ( animState, cmd ) =\n                        WAAPI.retarget model.animState <|\n                            Translate.begin\n                                >> Translate.clampX 0 (w - boxWidth)\n                                >> Translate.clampY 0 (h - boxWidth)\n                                >> Translate.end\n                in\n                ( { model | animState = animState }\n                , cmd\n                )\n\n\n### Clamp\n\n@docs clampX, clampY, clampZ\n\n\n### Unclamp\n\n@docs unclampX, unclampY, unclampZ\n\n\n## Snap\n\nSnap to a specific position, cancelling any in-flight animation on this property.\n\n@docs setXYZ, setXY, setXZ, setX, setYZ, setY, setZ\n\n","unions":[],"aliases":[{"name":"AnimGroupName","comment":" Type alias for the animation group name.\n","args":[],"type":"String.String"},{"name":"AxisBounds","comment":" Per-axis resize ranges. `Nothing` leaves an axis untouched.\n\n    { x = Just { min = 0, max = 100 }\n    , y = Nothing\n    , z = Nothing\n    }\n\n","args":[],"type":"{ x : Maybe.Maybe Anim.Property.Translate.Bounds, y : Maybe.Maybe Anim.Property.Translate.Bounds, z : Maybe.Maybe Anim.Property.Translate.Bounds }"},{"name":"Bounds","comment":" A numeric range with `min` and `max` boundaries.\n","args":[],"type":"{ min : Basics.Float, max : Basics.Float }"},{"name":"Builder","comment":" Builder type for translate animations.\n","args":["eng"],"type":"Anim.Internal.Builder.Translate.TranslateBuilder eng"}],"values":[{"name":"begin","comment":" Turn the `AnimBuilder` into a translate animation `Builder` for the specified animation group.\n\nUse this to start configuring a translate animation.\n\n    myAnimation : AnimBuilder eng -> AnimBuilder eng\n    myAnimation =\n        Translate.begin\n            >> ... -- Configure and build the animation\n\n","type":"Anim.Internal.Builder.AnimBuilder eng -> Anim.Property.Translate.Builder eng"},{"name":"bounds","comment":" Apply new translate bounds for an anim group during resize.\n\nPass this inside an engine's `onResize` builder:\n\n    Sub.onResize model.animState <|\n        Translate.bounds \"box\"\n            { x = Just { min = 0, max = newWidth - boxSize }\n            , y = Nothing\n            , z = Nothing\n            }\n\nYou can set the bounds for multiple anim groups in one call:\n\n    Sub.onResize model.animState <|\n        Translate.bounds \"box\" boxBounds\n            >> Translate.bounds \"card\" cardBounds\n\nThe engine proportionally remaps the in-flight animation onto the new\nrange and pins its endpoints to it.\n\nOnly callable from inside an engine's `onResize` builder - calling it from\nanywhere else results in a type error.\n\n","type":"Anim.Property.Translate.AnimGroupName -> Anim.Property.Translate.AxisBounds -> Anim.Internal.Builder.AnimBuilder { eng | withBounds : () } -> Anim.Internal.Builder.AnimBuilder { eng | withBounds : () }"},{"name":"byX","comment":" Move by a specific amount on the X axis. Y and Z are unaffected.\n","type":"Basics.Float -> Anim.Property.Translate.Builder { eng | withLiveDelta : () } -> Anim.Property.Translate.Builder { eng | withLiveDelta : () }"},{"name":"byXY","comment":" Move by specific amounts on the X and Y axes. Z is unaffected.\n","type":"Basics.Float -> Basics.Float -> Anim.Property.Translate.Builder { eng | withLiveDelta : () } -> Anim.Property.Translate.Builder { eng | withLiveDelta : () }"},{"name":"byXYZ","comment":" Move by specific amounts on the X, Y, and Z axes.\n\n    myAnimation : AnimBuilder { eng | withLiveDelta : () } -> AnimBuilder { eng | withLiveDelta : () }\n    myAnimation =\n        Translate.begin\n            >> Translate.byXYZ 50 -25 10\n            >> ... -- continue with animation\n\n","type":"Basics.Float -> Basics.Float -> Basics.Float -> Anim.Property.Translate.Builder { eng | withLiveDelta : () } -> Anim.Property.Translate.Builder { eng | withLiveDelta : () }"},{"name":"byXZ","comment":" Move by specific amounts on the X and Z axes. Y is unaffected.\n","type":"Basics.Float -> Basics.Float -> Anim.Property.Translate.Builder { eng | withLiveDelta : () } -> Anim.Property.Translate.Builder { eng | withLiveDelta : () }"},{"name":"byY","comment":" Move by a specific amount on the Y axis. X and Z are unaffected.\n","type":"Basics.Float -> Anim.Property.Translate.Builder { eng | withLiveDelta : () } -> Anim.Property.Translate.Builder { eng | withLiveDelta : () }"},{"name":"byYZ","comment":" Move by specific amounts on the Y and Z axes. X is unaffected.\n","type":"Basics.Float -> Basics.Float -> Anim.Property.Translate.Builder { eng | withLiveDelta : () } -> Anim.Property.Translate.Builder { eng | withLiveDelta : () }"},{"name":"byZ","comment":" Move by a specific amount on the Z axis. X and Y are unaffected.\n","type":"Basics.Float -> Anim.Property.Translate.Builder { eng | withLiveDelta : () } -> Anim.Property.Translate.Builder { eng | withLiveDelta : () }"},{"name":"clampX","comment":" Keep the X axis translate within `min` and `max` values. If `min > max` the values are flipped.\n","type":"Basics.Float -> Basics.Float -> Anim.Property.Translate.Builder eng -> Anim.Property.Translate.Builder eng"},{"name":"clampY","comment":" Keep the Y axis translate within `min` and `max` values. If `min > max` the values are flipped.\n","type":"Basics.Float -> Basics.Float -> Anim.Property.Translate.Builder eng -> Anim.Property.Translate.Builder eng"},{"name":"clampZ","comment":" Keep the Z axis translate within `min` and `max` values. If `min > max` the values are flipped.\n","type":"Basics.Float -> Basics.Float -> Anim.Property.Translate.Builder eng -> Anim.Property.Translate.Builder eng"},{"name":"cssUnit","comment":" Set the CSS [Unit](Anim-Unit#Unit) for all axes.\n\n    import Anim.Property.Translate as Translate\n    import Anim.Unit as Unit\n\n    Translate.begin\n        >> Translate.cssUnit Unit.Cqw\n        >> ... -- configure the animation\n\n","type":"Anim.Unit.Unit -> Anim.Property.Translate.Builder eng -> Anim.Property.Translate.Builder eng"},{"name":"cssUnitX","comment":" Set the CSS [Unit](Anim-Unit#Unit) for the X axis.\n","type":"Anim.Unit.Unit -> Anim.Property.Translate.Builder eng -> Anim.Property.Translate.Builder eng"},{"name":"cssUnitY","comment":" Set the CSS [Unit](Anim-Unit#Unit) for the Y axis.\n","type":"Anim.Unit.Unit -> Anim.Property.Translate.Builder eng -> Anim.Property.Translate.Builder eng"},{"name":"cssUnitZ","comment":" Set the CSS [Unit](Anim-Unit#Unit) for the Z axis.\n","type":"Anim.Unit.Unit -> Anim.Property.Translate.Builder eng -> Anim.Property.Translate.Builder eng"},{"name":"delay","comment":" Set the delay (milliseconds) before the animation starts.\n","type":"Basics.Int -> Anim.Property.Translate.Builder { eng | withTiming : () } -> Anim.Property.Translate.Builder { eng | withTiming : () }"},{"name":"duration","comment":" Set the animation duration (milliseconds).\n","type":"Basics.Int -> Anim.Property.Translate.Builder { eng | withTiming : () } -> Anim.Property.Translate.Builder { eng | withTiming : () }"},{"name":"easing","comment":" Set the easing function for the animation.\n\n    import Motion.Easing exposing (Easing(..))\n\n    Translate.easing EaseInOut\n\n","type":"Motion.Easing.Easing -> Anim.Property.Translate.Builder eng -> Anim.Property.Translate.Builder eng"},{"name":"end","comment":" Complete the [Builder](#Builder) animation configuration and return an `AnimBuilder`\nso you can continue configuring other property animations or execute the animation with an Engine.\n\n    myAnimation : AnimBuilder eng -> AnimBuilder eng\n    myAnimation =\n        Translate.begin\n            >> ... -- configure the animation with from, to, duration, easing, etc.\n            >> Translate.end\n            >> ... -- continue with animation\n\n","type":"Anim.Property.Translate.Builder eng -> Anim.Internal.Builder.AnimBuilder eng"},{"name":"fromX","comment":" Set the starting X position. Y and Z are left unchanged (or 0 if not set).\n","type":"Basics.Float -> Anim.Property.Translate.Builder eng -> Anim.Property.Translate.Builder eng"},{"name":"fromXY","comment":" Set the starting X and Y position. Z is left unchanged (or 0 if not set).\n","type":"Basics.Float -> Basics.Float -> Anim.Property.Translate.Builder eng -> Anim.Property.Translate.Builder eng"},{"name":"fromXYZ","comment":" Set the starting X, Y, and Z position.\n\n    myAnimation : AnimBuilder eng -> AnimBuilder eng\n    myAnimation =\n        Translate.begin\n            >> Translate.fromXYZ 100 20 50\n            >> ... -- continue with animation\n\n","type":"Basics.Float -> Basics.Float -> Basics.Float -> Anim.Property.Translate.Builder eng -> Anim.Property.Translate.Builder eng"},{"name":"fromXZ","comment":" Set the starting X and Z position. Y is left unchanged (or 0 if not set).\n","type":"Basics.Float -> Basics.Float -> Anim.Property.Translate.Builder eng -> Anim.Property.Translate.Builder eng"},{"name":"fromY","comment":" Set the starting Y position. X and Z are left unchanged (or 0 if not set).\n","type":"Basics.Float -> Anim.Property.Translate.Builder eng -> Anim.Property.Translate.Builder eng"},{"name":"fromYZ","comment":" Set the starting Y and Z position. X is left unchanged (or 0 if not set).\n","type":"Basics.Float -> Basics.Float -> Anim.Property.Translate.Builder eng -> Anim.Property.Translate.Builder eng"},{"name":"fromZ","comment":" Set the starting Z position. X and Y are left unchanged (or 0 if not set).\n","type":"Basics.Float -> Anim.Property.Translate.Builder eng -> Anim.Property.Translate.Builder eng"},{"name":"initCssUnit","comment":" Initialize the CSS [Unit](Anim-Unit#Unit) for all axes.\n\n    import Anim.Engine.Keyframe as Keyframe\n    import Anim.Property.Translate as Translate\n    import Anim.Unit as Unit\n\n    Keyframe.init\n        [ Translate.initX \"animGroupName\" 50\n            >> Translate.initCssUnit Cqw\n        ]\n\n","type":"Anim.Unit.Unit -> Anim.Internal.Builder.AnimBuilder eng -> Anim.Internal.Builder.AnimBuilder eng"},{"name":"initCssUnitX","comment":" Initialize the CSS [Unit](Anim-Unit#Unit) for the X axis.\n","type":"Anim.Unit.Unit -> Anim.Internal.Builder.AnimBuilder eng -> Anim.Internal.Builder.AnimBuilder eng"},{"name":"initCssUnitY","comment":" Initialize the CSS [Unit](Anim-Unit#Unit) for the Y axis.\n","type":"Anim.Unit.Unit -> Anim.Internal.Builder.AnimBuilder eng -> Anim.Internal.Builder.AnimBuilder eng"},{"name":"initCssUnitZ","comment":" Initialize the CSS [Unit](Anim-Unit#Unit) for the Z axis.\n","type":"Anim.Unit.Unit -> Anim.Internal.Builder.AnimBuilder eng -> Anim.Internal.Builder.AnimBuilder eng"},{"name":"initX","comment":" Set the initial X position.\n","type":"Anim.Property.Translate.AnimGroupName -> Basics.Float -> Anim.Internal.Builder.AnimBuilder eng -> Anim.Internal.Builder.AnimBuilder eng"},{"name":"initXY","comment":" Set the initial X and Y position.\n","type":"Anim.Property.Translate.AnimGroupName -> Basics.Float -> Basics.Float -> Anim.Internal.Builder.AnimBuilder eng -> Anim.Internal.Builder.AnimBuilder eng"},{"name":"initXYZ","comment":" Set the initial X, Y, and Z position.\n\n    import Anim.Engine.* as Engine\n    import Anim.Property.Translate as Translate\n\n    init : ( Model, Cmd Msg )\n    init =\n        ( { animState = Engine.init [ Translate.initXYZ \"animGroupName\" 100 20 50 ] }\n        , Cmd.none\n        )\n\n","type":"Anim.Property.Translate.AnimGroupName -> Basics.Float -> Basics.Float -> Basics.Float -> Anim.Internal.Builder.AnimBuilder eng -> Anim.Internal.Builder.AnimBuilder eng"},{"name":"initXZ","comment":" Set the initial X and Z position.\n","type":"Anim.Property.Translate.AnimGroupName -> Basics.Float -> Basics.Float -> Anim.Internal.Builder.AnimBuilder eng -> Anim.Internal.Builder.AnimBuilder eng"},{"name":"initY","comment":" Set the initial Y position.\n","type":"Anim.Property.Translate.AnimGroupName -> Basics.Float -> Anim.Internal.Builder.AnimBuilder eng -> Anim.Internal.Builder.AnimBuilder eng"},{"name":"initYZ","comment":" Set the initial Y and Z position.\n","type":"Anim.Property.Translate.AnimGroupName -> Basics.Float -> Basics.Float -> Anim.Internal.Builder.AnimBuilder eng -> Anim.Internal.Builder.AnimBuilder eng"},{"name":"initZ","comment":" Set the initial Z position.\n","type":"Anim.Property.Translate.AnimGroupName -> Basics.Float -> Anim.Internal.Builder.AnimBuilder eng -> Anim.Internal.Builder.AnimBuilder eng"},{"name":"setX","comment":" Snap target X value, preserving the current Y and Z values.\n","type":"Basics.Float -> Anim.Property.Translate.Builder eng -> Anim.Property.Translate.Builder eng"},{"name":"setXY","comment":" Snap target X and Y values, preserving the current Z value.\n","type":"Basics.Float -> Basics.Float -> Anim.Property.Translate.Builder eng -> Anim.Property.Translate.Builder eng"},{"name":"setXYZ","comment":" Snap target X, Y and Z values silently\n","type":"Basics.Float -> Basics.Float -> Basics.Float -> Anim.Property.Translate.Builder eng -> Anim.Property.Translate.Builder eng"},{"name":"setXZ","comment":" Snap target X and Z values, preserving the current Y value.\n","type":"Basics.Float -> Basics.Float -> Anim.Property.Translate.Builder eng -> Anim.Property.Translate.Builder eng"},{"name":"setY","comment":" Snap target Y value, preserving the current X and Z values.\n","type":"Basics.Float -> Anim.Property.Translate.Builder eng -> Anim.Property.Translate.Builder eng"},{"name":"setYZ","comment":" Snap target Y and Z values, preserving the current X value.\n","type":"Basics.Float -> Basics.Float -> Anim.Property.Translate.Builder eng -> Anim.Property.Translate.Builder eng"},{"name":"setZ","comment":" Snap target Z value, preserving the current X and Y values.\n","type":"Basics.Float -> Anim.Property.Translate.Builder eng -> Anim.Property.Translate.Builder eng"},{"name":"speed","comment":" The speed represents how many `Unit`s the element moves per second.\n\nSo if the CSS Unit is `Px` and the speed is `100`, the element will move 100 pixels per second,\nlikewise, if the CSS Unit is `Cqw` and the speed is `100`, the element will move 100% of it's\ncontainer's width per second.\n\n","type":"Basics.Float -> Anim.Property.Translate.Builder { eng | withTiming : () } -> Anim.Property.Translate.Builder { eng | withTiming : () }"},{"name":"spring","comment":" Drive this property with a spring.\n\n    import Motion.Spring as Spring\n\n    Translate.spring Spring.wobbly\n\n","type":"Motion.Spring.Spring -> Anim.Property.Translate.Builder { eng | withSpring : () } -> Anim.Property.Translate.Builder { eng | withSpring : () }"},{"name":"toX","comment":" Set the target X position. Y and Z are left unchanged (or 0 if not set).\n","type":"Basics.Float -> Anim.Property.Translate.Builder eng -> Anim.Property.Translate.Builder eng"},{"name":"toXY","comment":" Set the target X and Y position. Z is left unchanged (or 0 if not set).\n","type":"Basics.Float -> Basics.Float -> Anim.Property.Translate.Builder eng -> Anim.Property.Translate.Builder eng"},{"name":"toXYZ","comment":" Set the target X, Y, and Z position for the current animation group.\n","type":"Basics.Float -> Basics.Float -> Basics.Float -> Anim.Property.Translate.Builder eng -> Anim.Property.Translate.Builder eng"},{"name":"toXZ","comment":" Set the target X and Z position. Y is left unchanged (or 0 if not set).\n","type":"Basics.Float -> Basics.Float -> Anim.Property.Translate.Builder eng -> Anim.Property.Translate.Builder eng"},{"name":"toY","comment":" Set the target Y position. X and Z are left unchanged (or 0 if not set).\n","type":"Basics.Float -> Anim.Property.Translate.Builder eng -> Anim.Property.Translate.Builder eng"},{"name":"toYZ","comment":" Set the target Y and Z position. X is left unchanged (or 0 if not set).\n","type":"Basics.Float -> Basics.Float -> Anim.Property.Translate.Builder eng -> Anim.Property.Translate.Builder eng"},{"name":"toZ","comment":" Set the target Z position. X and Y are left unchanged (or 0 if not set).\n","type":"Basics.Float -> Anim.Property.Translate.Builder eng -> Anim.Property.Translate.Builder eng"},{"name":"unclampX","comment":" Remove the X axis range for this animation group. Does nothing if no range is set.\n","type":"Anim.Property.Translate.Builder eng -> Anim.Property.Translate.Builder eng"},{"name":"unclampY","comment":" Remove the Y axis range for this animation group. Does nothing if no range is set.\n","type":"Anim.Property.Translate.Builder eng -> Anim.Property.Translate.Builder eng"},{"name":"unclampZ","comment":" Remove the Z axis range for this animation group. Does nothing if no range is set.\n","type":"Anim.Property.Translate.Builder eng -> Anim.Property.Translate.Builder eng"}],"binops":[]},{"name":"Anim.Unit","comment":" Length unit for length-bearing properties\n([Translate](Anim.Property.Translate), [Size](Anim.Property.Size),\n[PerspectiveOrigin](Anim.Property.PerspectiveOrigin),\n[Custom](Anim.Property.Custom)).\n\n📖 See [Responsive Animations](https://phollyer.github.io/elm-motion/animation/concepts/responsive-animations/)\nfor full per-engine behaviour.\n\n\n# Type\n\n@docs Unit\n\n","unions":[{"name":"Unit","comment":" The length unit applied when rendering length-bearing values.\n","args":[],"cases":[["Cap",[]],["Ch",[]],["Cm",[]],["Cqb",[]],["Cqh",[]],["Cqi",[]],["Cqmax",[]],["Cqmin",[]],["Cqw",[]],["Dvb",[]],["Dvh",[]],["Dvi",[]],["Dvmax",[]],["Dvmin",[]],["Dvw",[]],["Em",[]],["Ex",[]],["Ic",[]],["In",[]],["Lh",[]],["Lvb",[]],["Lvh",[]],["Lvi",[]],["Lvmax",[]],["Lvmin",[]],["Lvw",[]],["Mm",[]],["Pc",[]],["Percent",[]],["Pt",[]],["Px",[]],["Q",[]],["Rcap",[]],["Rch",[]],["Rem",[]],["Rex",[]],["Ric",[]],["Rlh",[]],["Svb",[]],["Svh",[]],["Svi",[]],["Svmax",[]],["Svmin",[]],["Svw",[]],["Vb",[]],["Vh",[]],["Vi",[]],["Vmax",[]],["Vmin",[]],["Vw",[]],["Unitless",[]]]}],"aliases":[],"values":[],"binops":[]},{"name":"Motion.Easing","comment":" Easing functions for animations and scrolls.\n\nUse them to create smooth and natural movement.\n\nIf you don't set an easing function, the defaults are:\n\n  - Animations: `EaseInOut`, which is a good general-purpose easing.\n  - Scrolls: `QuintOut`, which gives a nice smooth scroll effect, with a natural \"settling into place\" feel.\n\n📖 See [Easing Documentation](https://phollyer.github.io/elm-motion/animation/concepts/easing/) for details.\n\n\n# Easing Type\n\n@docs Easing\n\n\n# Utility\n\n@docs toString\n\n","unions":[{"name":"Easing","comment":" ","args":[],"cases":[["BackIn",[]],["BackOut",[]],["BackInOut",[]],["BounceIn",[]],["BounceOut",[]],["BounceInOut",[]],["CircIn",[]],["CircOut",[]],["CircInOut",[]],["CubicBezier",["Basics.Float","Basics.Float","Basics.Float","Basics.Float"]],["CubicIn",[]],["CubicOut",[]],["CubicInOut",[]],["Ease",[]],["EaseIn",[]],["EaseOut",[]],["EaseInOut",[]],["ElasticIn",[]],["ElasticOut",[]],["ElasticInOut",[]],["ExpoIn",[]],["ExpoOut",[]],["ExpoInOut",[]],["Linear",[]],["QuadIn",[]],["QuadOut",[]],["QuadInOut",[]],["QuartIn",[]],["QuartOut",[]],["QuartInOut",[]],["QuintIn",[]],["QuintOut",[]],["QuintInOut",[]],["SineIn",[]],["SineOut",[]],["SineInOut",[]]]}],"aliases":[],"values":[{"name":"toString","comment":" Convert an easing function to a string representation.\n\nThis is useful for debugging and logging purposes.\n\n","type":"Motion.Easing.Easing -> String.String"}],"binops":[]},{"name":"Motion.Spring","comment":" Spring-based motion configurations.\n\nSprings describe physical motion — stiffness, damping, mass — rather\nthan time-and-curve. Their duration is _emergent_: the motion ends\nwhen the value has settled at the target. This makes springs the\nright primitive for anything that should \"feel physical\": bouncy UI\nreveals, gesture-handoff momentum, anything where a tween's\nfixed-duration ramp would feel artificial.\n\n\n# The Spring type\n\n@docs Spring\n\n\n# Presets\n\nCurated configurations covering the common feel-points.\n\n@docs gentle, wobbly, stiff, slow, noWobble\n\n\n# Custom configuration\n\n@docs custom\n\n","unions":[],"aliases":[{"name":"Spring","comment":" Opaque spring configuration. Construct one via a preset (`gentle`,\n`wobbly`, `stiff`, `slow`, `noWobble`) or [`custom`](#custom).\n\nPass to whichever animation or scroll engine accepts a spring; the\nengine will run the motion until the value is settled. There is no\nexplicit duration — the spring's stiffness, damping, and mass\ndetermine how long it takes to come to rest.\n\n","args":[],"type":"Motion.Internal.Spring.Spring"}],"values":[{"name":"custom","comment":" Hand-tune a spring's physics.\n\n  - `stiffness` — how strongly the spring pulls toward the target.\n    Higher is snappier, lower is loose. Typical `100..400`.\n    (Hooke's-law. Must be `>= 0`.)\n  - `damping` — how much friction slows the motion. Higher is less\n    wobbly, lower is bouncier. Typical `10..40`.\n    (Viscous friction. Must be `>= 0`.)\n  - `mass` — how heavy the thing feels. Heavier is more sluggish,\n    lighter is more reactive. Typical `1.0`. Must be `> 0`.\n\nIf you want to dial in a specific feel, the ratio\n`damping / (2·√(stiffness·mass))` controls the overall character:\n\n  - less than `1` — bouncy: overshoots and oscillates before settling\n  - exactly `1` — crisp: fastest possible settle with no overshoot\n  - more than `1` — sluggish: eases in slowly without overshoot\n\nInputs are clamped: stiffness and damping below 0 become 0, mass\nbelow 1e-6 becomes 1e-6.\n\n    customSpring : Spring\n    customSpring =\n        Motion.Spring.custom\n            { stiffness = 220\n            , damping = 16\n            , mass = 1\n            }\n\n","type":"{ stiffness : Basics.Float, damping : Basics.Float, mass : Basics.Float } -> Motion.Spring.Spring"},{"name":"gentle","comment":" A soft, slow settle. Mild overshoot, takes its time.\n\nGood for: hero-element reveals, large modals, anything where a sense\nof weight is welcome.\n\n","type":"Motion.Spring.Spring"},{"name":"noWobble","comment":" Critically damped — the fastest approach to the target with no\novershoot whatsoever.\n\nGood for: when you want spring-like timing but tween-like absence of\novershoot. Useful for scroll handoffs and other places where bounce\nwould look like a bug.\n\n","type":"Motion.Spring.Spring"},{"name":"slow","comment":" Low stiffness with extra damping — a long, mellow approach.\n\nGood for: ambient motion, slow-developing reveals, \"drifting into\nplace\" effects.\n\n","type":"Motion.Spring.Spring"},{"name":"stiff","comment":" Snappy and direct. Small overshoot, settles quickly.\n\nGood for: button presses, tooltip reveals, anything that should feel\ncrisp and immediate.\n\n","type":"Motion.Spring.Spring"},{"name":"wobbly","comment":" Lively and bouncy. Several visible oscillations before settling.\n\nGood for: playful UI accents, attention-grabbing reveals, cartoony\ninteractions.\n\n","type":"Motion.Spring.Spring"}],"binops":[]},{"name":"Scroll.Builder","comment":" Configure individual scroll animations.\n\nUse this module to define where and how each scroll animation should behave.\nThe Scroll engine modules ([Cmd](Scroll-Engine-Cmd), [Task](Scroll-Engine-Task),\n[Sub](Scroll-Engine-Sub)) handle execution, while this module handles per-scroll configuration.\n\n    import Motion.Easing exposing (Easing(..))\n    import Scroll.Builder as Scroll exposing (ScrollBuilder)\n\n    scrollToElement : String -> ScrollBuilder -> ScrollBuilder\n    scrollToElement elementId =\n        Scroll.forDocument\n            >> Scroll.toElement elementId\n            >> Scroll.speed 100\n            >> Scroll.easing EaseInOut\n            >> Scroll.build\n\n📖 See [Scroll Overview](https://phollyer.github.io/elm-motion/scroll/engines/overview/) for details.\n\n\n# Build\n\n@docs ScrollBuilder, Builder, forDocument, forContainer, build\n\n\n# Timing\n\n@docs delay, duration, speed\n\n\n# Easing\n\n@docs easing\n\n\n# Element Targeting\n\n📖 See [Scroll to Element](https://phollyer.github.io/elm-motion/scroll/engines/overview/#scroll-to-element)\nfor details.\n\n@docs toElement\n\n\n# Position Targeting\n\n📖 See [Scroll to Position](https://phollyer.github.io/elm-motion/scroll/engines/overview/#scroll-to-position)\nfor details.\n\n@docs toCenter\n\n\n## Edges\n\n@docs toTop, toBottom, toLeft, toRight\n\n\n## Corners\n\n@docs toTopLeft, toTopRight, toBottomLeft, toBottomRight\n\n\n# Coordinate Targeting\n\n\n## Axes\n\n@docs toXY, toX, toY\n\n## Percentages\n\n@docs toPercentageXY, toPercentageX, toPercentageY\n\n\n## Relative Scrolling\n\n@docs byXY, byX, byY\n\n\n# Offsets\n\n📖 See [Offset](https://phollyer.github.io/elm-motion/scroll/engines/overview/#offset)\nfor details.\n\n@docs withOffsetXY, withOffsetX, withOffsetY\n\n\n# Axis Selection\n\nUse axis selection when you want to lock one direction and scroll\nin the other. Primarily for scrolling containers whose overflow is\nscrollable in both directions but you only want to scroll in one direction.\n\n📖 See [Axis](https://phollyer.github.io/elm-motion/scroll/engines/overview/#axis)\nfor details.\n\n@docs onBothAxes, onXAxis, onYAxis\n\n","unions":[],"aliases":[{"name":"Builder","comment":" Builder type for configuring individual scroll animations.\n","args":[],"type":"Scroll.Internal.ScrollBuilder.Builder"},{"name":"ScrollBuilder","comment":" The same builder type used by the Scroll Engines.\n","args":[],"type":"Scroll.Internal.ScrollBuilder.ScrollBuilder"}],"values":[{"name":"build","comment":" Complete the scroll animation configuration and return a `ScrollBuilder`\nso you can continue configuring other scroll animations or execute\nthe animation with a Scroll Engine.\n\n    import Scroll.Builder as Scroll\n\n    scrollDocument : ScrollBuilder -> ScrollBuilder\n    scrollDocument =\n        Scroll.forDocument\n            >> ... -- Configure the animation\n            >> Scroll.build\n\n","type":"Scroll.Builder.Builder -> Scroll.Builder.ScrollBuilder"},{"name":"byX","comment":" Scroll by a relative amount on X axis only.\n\nPositive values scroll right, negative values scroll left.\n\n    import Scroll.Builder as Scroll\n\n    scrollByX : ScrollBuilder -> ScrollBuilder\n    scrollByX =\n        Scroll.forDocument\n            >> Scroll.byX 100\n            >> ... -- Configure the animation\n            >> Scroll.build\n\n","type":"Basics.Float -> Scroll.Builder.Builder -> Scroll.Builder.Builder"},{"name":"byXY","comment":" Scroll by a relative amount on both X and Y axes.\n\nPositive values scroll right/down, negative values scroll left/up.\n\n    import Scroll.Builder as Scroll\n\n    scrollByXY : ScrollBuilder -> ScrollBuilder\n    scrollByXY =\n        Scroll.forDocument\n            >> Scroll.byXY 100 200\n            >> ... -- Configure the animation\n            >> Scroll.build\n\n","type":"Basics.Float -> Basics.Float -> Scroll.Builder.Builder -> Scroll.Builder.Builder"},{"name":"byY","comment":" Scroll by a relative amount on Y axis only.\n\nPositive values scroll down, negative values scroll up.\n\n    import Scroll.Builder as Scroll\n\n    scrollByY : ScrollBuilder -> ScrollBuilder\n    scrollByY =\n        Scroll.forDocument\n            >> Scroll.byY 200\n            >> ... -- Configure the animation\n            >> Scroll.build\n\n","type":"Basics.Float -> Scroll.Builder.Builder -> Scroll.Builder.Builder"},{"name":"delay","comment":" Set the delay (milliseconds) before this scroll animation starts.\n\nOverrides the global default delay set on a Scroll Engine.\n\n    import Scroll.Builder as Scroll\n\n    scrollAfterDelay : ScrollBuilder -> ScrollBuilder\n    scrollAfterDelay =\n        Scroll.forDocument\n            >> Scroll.toTop\n            >> Scroll.delay 500\n            >> ... -- Configure the animation\n            >> Scroll.build\n\n","type":"Basics.Int -> Scroll.Builder.Builder -> Scroll.Builder.Builder"},{"name":"duration","comment":" Set the duration (milliseconds) for this scroll animation.\n\nOverrides the global default duration (or speed) set on a Scroll Engine.\n\n    import Scroll.Builder as Scroll\n\n    scrollWithDuration : ScrollBuilder -> ScrollBuilder\n    scrollWithDuration =\n        Scroll.forDocument\n            >> Scroll.toElement \"target\"\n            >> Scroll.duration 1000\n            >> ... -- Configure the animation\n            >> Scroll.build\n\n","type":"Basics.Int -> Scroll.Builder.Builder -> Scroll.Builder.Builder"},{"name":"easing","comment":" Set the easing function for this scroll animation.\n\nOverrides the global default easing set on a Scroll Engine.\n\n    import Motion.Easing exposing (Easing(..))\n    import Scroll.Builder as Scroll\n\n    scrollWithEasing : ScrollBuilder -> ScrollBuilder\n    scrollWithEasing =\n        Scroll.forDocument\n            >> Scroll.toElement \"section-1\"\n            >> Scroll.easing BounceOut\n            >> ... -- Configure the animation\n            >> Scroll.build\n\n","type":"Motion.Easing.Easing -> Scroll.Builder.Builder -> Scroll.Builder.Builder"},{"name":"forContainer","comment":" Start configuring a scroll animation for a specific container element.\n\n    import Scroll.Builder as Scroll\n\n    scrollContainer : String -> ScrollBuilder -> ScrollBuilder\n    scrollContainer containerId =\n        Scroll.forContainer containerId\n            >> ... -- Configure and build the animation\n\n","type":"String.String -> Scroll.Builder.ScrollBuilder -> Scroll.Builder.Builder"},{"name":"forDocument","comment":" Start configuring a scroll animation for the document body.\n\n    import Scroll.Builder as Scroll\n\n    scrollDocument : ScrollBuilder -> ScrollBuilder\n    scrollDocument =\n        Scroll.forDocument\n            >> ... -- Configure and build the animation\n\n","type":"Scroll.Builder.ScrollBuilder -> Scroll.Builder.Builder"},{"name":"onBothAxes","comment":" Scroll on both X and Y axes (default).\n\n    import Scroll.Builder as Scroll\n\n    scrollBothAxes : ScrollBuilder -> ScrollBuilder\n    scrollBothAxes =\n        Scroll.forContainer \"containerId\"\n            >> Scroll.onBothAxes\n            >> Scroll.toElement \"section-1\"\n            >> ... -- Configure the animation\n            >> Scroll.build\n\n","type":"Scroll.Builder.Builder -> Scroll.Builder.Builder"},{"name":"onXAxis","comment":" Scroll on X axis only.\n\n    import Scroll.Builder as Scroll\n\n    scrollXOnly : ScrollBuilder -> ScrollBuilder\n    scrollXOnly =\n        Scroll.forContainer \"containerId\"\n            >> Scroll.onXAxis\n            >> Scroll.toElement \"section-1\"\n            >> ... -- Configure the animation\n            >> Scroll.build\n\n","type":"Scroll.Builder.Builder -> Scroll.Builder.Builder"},{"name":"onYAxis","comment":" Scroll on Y axis only.\n\n    import Scroll.Builder as Scroll\n\n    scrollYOnly : ScrollBuilder -> ScrollBuilder\n    scrollYOnly =\n        Scroll.forDocument\n            >> Scroll.onYAxis\n            >> Scroll.toElement \"section-1\"\n            >> ... -- Configure the animation\n            >> Scroll.build\n\n","type":"Scroll.Builder.Builder -> Scroll.Builder.Builder"},{"name":"speed","comment":" Set the speed (pixels per second) for this scroll animation.\n\nOverrides the global default speed (or duration) set on a Scroll Engine.\n\n    import Scroll.Builder as Scroll\n\n    scrollWithSpeed : ScrollBuilder -> ScrollBuilder\n    scrollWithSpeed =\n        Scroll.forDocument\n            >> Scroll.toTop\n            >> Scroll.speed 500\n            >> ... -- Configure the animation\n            >> Scroll.build\n\n","type":"Basics.Float -> Scroll.Builder.Builder -> Scroll.Builder.Builder"},{"name":"toBottom","comment":" Scroll to the bottom of the container.\n\n    import Scroll.Builder as Scroll\n\n    scrollToBottom : ScrollBuilder -> ScrollBuilder\n    scrollToBottom =\n        Scroll.forContainer \"containerId\"\n            >> Scroll.toBottom\n            >> ... -- Configure the animation\n            >> Scroll.build\n\n","type":"Scroll.Builder.Builder -> Scroll.Builder.Builder"},{"name":"toBottomLeft","comment":" Scroll to the bottom-left corner of the container.\n\n    import Scroll.Builder as Scroll\n\n    scrollToBottomLeft : ScrollBuilder -> ScrollBuilder\n    scrollToBottomLeft =\n        Scroll.forContainer \"containerId\"\n            >> Scroll.toBottomLeft\n            >> ... -- Configure the animation\n            >> Scroll.build\n\n","type":"Scroll.Builder.Builder -> Scroll.Builder.Builder"},{"name":"toBottomRight","comment":" Scroll to the bottom-right corner of the container.\n\n    import Scroll.Builder as Scroll\n\n    scrollToBottomRight : ScrollBuilder -> ScrollBuilder\n    scrollToBottomRight =\n        Scroll.forContainer \"containerId\"\n            >> Scroll.toBottomRight\n            >> ... -- Configure the animation\n            >> Scroll.build\n\n","type":"Scroll.Builder.Builder -> Scroll.Builder.Builder"},{"name":"toCenter","comment":" Scroll to the center of the container.\n\n    import Scroll.Builder as Scroll\n\n    scrollToCenter : ScrollBuilder -> ScrollBuilder\n    scrollToCenter =\n        Scroll.forContainer \"containerId\"\n            >> Scroll.toCenter\n            >> ... -- Configure the animation\n            >> Scroll.build\n\n","type":"Scroll.Builder.Builder -> Scroll.Builder.Builder"},{"name":"toElement","comment":" Scroll to a specific element by ID.\n\n    import Scroll.Builder as Scroll\n\n    scrollToElement : String -> ScrollBuilder -> ScrollBuilder\n    scrollToElement elementId =\n        Scroll.forDocument\n            >> Scroll.toElement elementId\n            >> ... -- Configure the animation\n            >> Scroll.build\n\n","type":"String.String -> Scroll.Builder.Builder -> Scroll.Builder.Builder"},{"name":"toLeft","comment":" Scroll to the left edge of the container.\n\n    import Scroll.Builder as Scroll\n\n    scrollToLeft : ScrollBuilder -> ScrollBuilder\n    scrollToLeft =\n        Scroll.forContainer \"containerId\"\n            >> Scroll.toLeft\n            >> ... -- Configure the animation\n            >> Scroll.build\n\n","type":"Scroll.Builder.Builder -> Scroll.Builder.Builder"},{"name":"toPercentageX","comment":" Scroll to percentage of container width (X axis only).\n\n    import Scroll.Builder as Scroll\n\n    scrollToPercentageX : ScrollBuilder -> ScrollBuilder\n    scrollToPercentageX =\n        Scroll.forContainer \"containerId\"\n            >> Scroll.toPercentageX 0.5\n            >> ... -- Configure the animation\n            >> Scroll.build\n\n","type":"Basics.Float -> Scroll.Builder.Builder -> Scroll.Builder.Builder"},{"name":"toPercentageXY","comment":" Scroll to percentage of container size.\n\n    import Scroll.Builder as Scroll\n\n    scrollToPercentage : ScrollBuilder -> ScrollBuilder\n    scrollToPercentage =\n        Scroll.forContainer \"containerId\"\n            >> Scroll.toPercentageXY 0.5 0.8\n            >> ... -- Configure the animation\n            >> Scroll.build\n\n","type":"Basics.Float -> Basics.Float -> Scroll.Builder.Builder -> Scroll.Builder.Builder"},{"name":"toPercentageY","comment":" Scroll to percentage of container height (Y axis only).\n\n    import Scroll.Builder as Scroll\n\n    scrollToPercentageY : ScrollBuilder -> ScrollBuilder\n    scrollToPercentageY =\n        Scroll.forContainer \"containerId\"\n            >> Scroll.toPercentageY 0.8\n            >> ... -- Configure the animation\n            >> Scroll.build\n\n","type":"Basics.Float -> Scroll.Builder.Builder -> Scroll.Builder.Builder"},{"name":"toRight","comment":" Scroll to the right edge of the container.\n\n    import Scroll.Builder as Scroll\n\n    scrollToRight : ScrollBuilder -> ScrollBuilder\n    scrollToRight =\n        Scroll.forContainer \"containerId\"\n            >> Scroll.toRight\n            >> ... -- Configure the animation\n            >> Scroll.build\n\n","type":"Scroll.Builder.Builder -> Scroll.Builder.Builder"},{"name":"toTop","comment":" Scroll to the top of the container.\n\n    import Scroll.Builder as Scroll\n\n    scrollToTop : ScrollBuilder -> ScrollBuilder\n    scrollToTop =\n        Scroll.forDocument\n            >> Scroll.toTop\n            >> ... -- Configure the animation\n            >> Scroll.build\n\n","type":"Scroll.Builder.Builder -> Scroll.Builder.Builder"},{"name":"toTopLeft","comment":" Scroll to the top-left corner of the container.\n\n    import Scroll.Builder as Scroll\n\n    scrollToTopLeft : ScrollBuilder -> ScrollBuilder\n    scrollToTopLeft =\n        Scroll.forContainer \"containerId\"\n            >> Scroll.toTopLeft\n            >> ... -- Configure the animation\n            >> Scroll.build\n\n","type":"Scroll.Builder.Builder -> Scroll.Builder.Builder"},{"name":"toTopRight","comment":" Scroll to the top-right corner of the container.\n\n    import Scroll.Builder as Scroll\n\n    scrollToTopRight : ScrollBuilder -> ScrollBuilder\n    scrollToTopRight =\n        Scroll.forContainer \"containerId\"\n            >> Scroll.toTopRight\n            >> ... -- Configure the animation\n            >> Scroll.build\n\n","type":"Scroll.Builder.Builder -> Scroll.Builder.Builder"},{"name":"toX","comment":" Scroll to specific X coordinate only.\n\n    import Scroll.Builder as Scroll\n\n    scrollToX : ScrollBuilder -> ScrollBuilder\n    scrollToX =\n        Scroll.forDocument\n            >> Scroll.toX 100\n            >> ... -- Configure the animation\n            >> Scroll.build\n\n","type":"Basics.Float -> Scroll.Builder.Builder -> Scroll.Builder.Builder"},{"name":"toXY","comment":" Scroll to specific X and Y coordinates.\n\n    import Scroll.Builder as Scroll\n\n    scrollToCoordinates : ScrollBuilder -> ScrollBuilder\n    scrollToCoordinates =\n        Scroll.forContainer \"containerId\"\n            >> Scroll.toXY 100 200\n            >> ... -- Configure the animation\n            >> Scroll.build\n\n","type":"Basics.Float -> Basics.Float -> Scroll.Builder.Builder -> Scroll.Builder.Builder"},{"name":"toY","comment":" Scroll to specific Y coordinate only.\n\n    import Scroll.Builder as Scroll\n\n    scrollToY : ScrollBuilder -> ScrollBuilder\n    scrollToY =\n        Scroll.forDocument\n            >> Scroll.toY 200\n            >> ... -- Configure the animation\n            >> Scroll.build\n\n","type":"Basics.Float -> Scroll.Builder.Builder -> Scroll.Builder.Builder"},{"name":"withOffsetX","comment":" Set X scroll offset.\n\n    import Scroll.Builder as Scroll\n\n    scrollWithOffsetX : ScrollBuilder -> ScrollBuilder\n    scrollWithOffsetX =\n        Scroll.forDocument\n            >> Scroll.toElement \"section-1\"\n            >> Scroll.withOffsetX 20\n            >> ... -- Configure the animation\n            >> Scroll.build\n\n","type":"Basics.Float -> Scroll.Builder.Builder -> Scroll.Builder.Builder"},{"name":"withOffsetXY","comment":" Set X and Y scroll offsets.\n\nOffsets are added to the target scroll position. Useful for accounting for\nfixed headers or other UI elements.\n\n    import Scroll.Builder as Scroll\n\n    scrollWithOffset : ScrollBuilder -> ScrollBuilder\n    scrollWithOffset =\n        Scroll.forDocument\n            >> Scroll.toElement \"section-1\"\n            >> Scroll.withOffsetXY 20 60\n            >> ... -- Configure the animation\n            >> Scroll.build\n\n","type":"Basics.Float -> Basics.Float -> Scroll.Builder.Builder -> Scroll.Builder.Builder"},{"name":"withOffsetY","comment":" Set Y scroll offset.\n\nCommonly used to account for fixed headers.\n\n    import Scroll.Builder as Scroll\n\n    scrollWithOffsetY : ScrollBuilder -> ScrollBuilder\n    scrollWithOffsetY =\n        Scroll.forDocument\n            >> Scroll.toElement \"section-1\"\n            >> Scroll.withOffsetY 60\n            >> ... -- Configure the animation\n            >> Scroll.build\n\n","type":"Basics.Float -> Scroll.Builder.Builder -> Scroll.Builder.Builder"}],"binops":[]},{"name":"Scroll.Engine.Cmd","comment":" A simple fire-and-forget scroll command.\n\nChoose this engine when you just want to trigger a scroll and move on.\n\n📖 See\n[Scroll Cmd Engine Documentation](https://phollyer.github.io/elm-motion/scroll/engines/cmd/)\nand\n[Scroll Overview](https://phollyer.github.io/elm-motion/scroll/engines/overview/)\nfor details.\n\nUse the [Builder](Scroll-Builder) module to configure scroll targets.\n\n\n# Types\n\n@docs ScrollBuilder\n\n\n# Trigger\n\n@docs scroll\n\n\n# Timing\n\n📖 See [Timing](https://phollyer.github.io/elm-motion/animation/concepts/timing/) for details.\n\n@docs delay, duration, speed\n\n\n# Easing\n\n📖 See [Easing](https://phollyer.github.io/elm-motion/animation/concepts/easing/) for details.\n\n@docs easing\n\n","unions":[],"aliases":[{"name":"ScrollBuilder","comment":" Builder type for scroll animations.\n","args":[],"type":"Scroll.Internal.ScrollBuilder.ScrollBuilder"}],"values":[{"name":"delay","comment":" Set the delay for all scrolls.\n\nThis will be inherited by all scrolls that\ndon't define their own delay.\n\n    import Scroll.Builder as Scroll\n    import Scroll.Engine.Cmd as Cmd\n\n    scrollToElement : String -> ScrollBuilder -> ScrollBuilder\n    scrollToElement elementId =\n        Cmd.delay 100\n            >> Scroll.forDocument\n            >> Scroll.toElement elementId\n            >> Scroll.speed 200\n            >> Scroll.build\n\n","type":"Basics.Int -> Scroll.Engine.Cmd.ScrollBuilder -> Scroll.Engine.Cmd.ScrollBuilder"},{"name":"duration","comment":" Set the duration of all scrolls.\n\nThis will be inherited by all scrolls that\ndon't define their own duration.\n\n    import Scroll.Builder as Scroll\n    import Scroll.Engine.Cmd as Cmd\n\n    scrollToElement : String -> ScrollBuilder -> ScrollBuilder\n    scrollToElement elementId =\n        Cmd.duration 1000\n            >> Scroll.forDocument\n            >> Scroll.toElement elementId\n            >> Scroll.build\n\n","type":"Basics.Int -> Scroll.Engine.Cmd.ScrollBuilder -> Scroll.Engine.Cmd.ScrollBuilder"},{"name":"easing","comment":" Set the easing function to be used by all scrolls.\n\nThis will be inherited by all scrolls that\ndon't define their own easing.\n\n    import Motion.Easing exposing (Easing(..))\n    import Scroll.Builder as Scroll\n    import Scroll.Engine.Cmd as Cmd\n\n    scrollToElement : String -> ScrollBuilder -> ScrollBuilder\n    scrollToElement elementId =\n        Cmd.easing BounceOut\n            >> Scroll.forDocument\n            >> Scroll.toElement elementId\n            >> Scroll.speed 200\n            >> Scroll.build\n\n","type":"Motion.Easing.Easing -> Scroll.Engine.Cmd.ScrollBuilder -> Scroll.Engine.Cmd.ScrollBuilder"},{"name":"scroll","comment":" Start a scroll as a fire-and-forget [Cmd](https://package.elm-lang.org/packages/elm/core/latest/Cmd).\n\n    import Scroll.Engine.Cmd as Cmd\n\n    type Msg\n        = ScrollCompleted\n        | ...\n\n    Cmd.scroll ScrollCompleted <|\n        scrollToElement \"target-section\"\n\nIf you need progress, cancellation, or safe retriggering, use\n[Scroll.Engine.Sub](Scroll-Engine-Sub) instead.\n\n","type":"msg -> (Scroll.Engine.Cmd.ScrollBuilder -> Scroll.Engine.Cmd.ScrollBuilder) -> Platform.Cmd.Cmd msg"},{"name":"speed","comment":" Set the speed that scrolls should run at.\n\nThis will be inherited by all scrolls that\ndon't define their own speed.\n\n    import Scroll.Builder as Scroll\n    import Scroll.Engine.Cmd as Cmd\n\n    scrollToElement : String -> ScrollBuilder -> ScrollBuilder\n    scrollToElement elementId =\n        Cmd.speed 200\n            >> Scroll.forDocument\n            >> Scroll.toElement elementId\n            >> Scroll.build\n\n","type":"Basics.Float -> Scroll.Engine.Cmd.ScrollBuilder -> Scroll.Engine.Cmd.ScrollBuilder"}],"binops":[]},{"name":"Scroll.Engine.Sub","comment":" A stateful scroll engine for when you need progress, control, or scroll events.\n\n📖 See\n[Scroll Sub Engine Documentation](https://phollyer.github.io/elm-motion/scroll/engines/sub/)\nand\n[Scroll Overview](https://phollyer.github.io/elm-motion/scroll/engines/overview/)\nfor details.\n\nUse the [Builder](Scroll-Builder) module to configure scroll targets.\n\n\n# Types\n\n@docs ScrollState, ScrollBuilder, Container\n\n\n# Initialize\n\n@docs init\n\n\n# Trigger\n\n@docs scroll\n\n\n# Update\n\n@docs ScrollMsg, update\n\n\n# Subscriptions\n\n@docs subscriptions\n\n\n# Events\n\n@docs ScrollEvent\n\n\n# Timing\n\n@docs delay, duration, speed\n\n\n# Easing\n\n@docs easing\n\n\n# Controls\n\n@docs stop, pause, resume, reset, restart\n\n\n# State Queries\n\n@docs anyRunning, isRunning\n\n\n# Querying Scroll Position\n\n@docs getPosition, getPositionX, getPositionY\n\n","unions":[{"name":"Container","comment":" Identifies the scroll surface handled by the engine.\n\nUse `Document` for the document body, or `Container \"element-id\"` for a\nspecific scrollable element.\n\n","args":[],"cases":[["Document",[]],["Container",["String.String"]]]},{"name":"ScrollEvent","comment":" Scroll lifecycle events from this engine.\n\n  - `Started` - A scroll animation began playing\n  - `Ended` - A scroll animation completed naturally\n  - `Stopped` - A scroll animation was stopped via [`stop`](#stop)\n  - `Restarted` - A scroll animation was restarted via [`restart`](#restart)\n  - `Paused` - A scroll animation was paused via [`pause`](#pause)\n  - `Resumed` - A scroll animation was resumed via [`resume`](#resume)\n  - `Progress` - A scroll animation frame with current position and progress (0.0 to 1.0)\n\nThe `Container` parameter identifies the scroll surface.\n\nYou receive these events from [`update`](#update).\n\n","args":[],"cases":[["Started",["Scroll.Engine.Sub.Container"]],["Ended",["Scroll.Engine.Sub.Container"]],["Stopped",["Scroll.Engine.Sub.Container"]],["Restarted",["Scroll.Engine.Sub.Container"]],["Paused",["Scroll.Engine.Sub.Container"]],["Resumed",["Scroll.Engine.Sub.Container"]],["Progress",["Scroll.Engine.Sub.Container","{ x : Basics.Float, y : Basics.Float }","Basics.Float"]]]}],"aliases":[{"name":"ScrollBuilder","comment":" Builder type for scroll animations.\n","args":[],"type":"Scroll.Internal.ScrollBuilder.ScrollBuilder"},{"name":"ScrollMsg","comment":" Message type used with `update`.\n","args":[],"type":"Scroll.Internal.Engine.Sub.ScrollMsg"},{"name":"ScrollState","comment":" Holds the scroll engine state.\n\nKeep this in your model.\n\n    import Scroll.Engine.Sub as Sub\n\n    type alias Model =\n        { scrollState : Sub.ScrollState }\n\n","args":[],"type":"Scroll.Internal.Engine.Sub.ScrollState"}],"values":[{"name":"anyRunning","comment":" Check if any scroll animations are currently running.\n\nReturns `Nothing` if there are no animations.\n\n","type":"Scroll.Engine.Sub.ScrollState -> Maybe.Maybe Basics.Bool"},{"name":"delay","comment":" Set the delay for all scrolls.\n\nThis will be inherited by all scrolls that\ndon't define their own delay.\n\n    import Scroll.Builder as Scroll\n    import Scroll.Engine.Sub as Sub\n\n    scrollToElement : String -> ScrollBuilder -> ScrollBuilder\n    scrollToElement elementId =\n        Sub.delay 100\n            >> Scroll.forDocument\n            >> Scroll.toElement elementId\n            >> Scroll.speed 200\n            >> Scroll.build\n\n","type":"Basics.Int -> Scroll.Engine.Sub.ScrollBuilder -> Scroll.Engine.Sub.ScrollBuilder"},{"name":"duration","comment":" Set the duration of all scrolls.\n\nThis will be inherited by all scrolls that\ndon't define their own duration.\n\n    import Scroll.Builder as Scroll\n    import Scroll.Engine.Sub as Sub\n\n    scrollToElement : String -> ScrollBuilder -> ScrollBuilder\n    scrollToElement elementId =\n        Sub.duration 1000\n            >> Scroll.forDocument\n            >> Scroll.toElement elementId\n            >> Scroll.build\n\n","type":"Basics.Int -> Scroll.Engine.Sub.ScrollBuilder -> Scroll.Engine.Sub.ScrollBuilder"},{"name":"easing","comment":" Set the easing function to be used by all scrolls.\n\nThis will be inherited by all scrolls that\ndon't define their own easing.\n\n    import Scroll.Builder as Scroll\n    import Scroll.Engine.Sub as Sub\n\n    scrollToElement : String -> ScrollBuilder -> ScrollBuilder\n    scrollToElement elementId =\n        Sub.easing BounceOut\n            >> Scroll.forDocument\n            >> Scroll.toElement elementId\n            >> Scroll.speed 200\n            >> Scroll.build\n\n","type":"Motion.Easing.Easing -> Scroll.Engine.Sub.ScrollBuilder -> Scroll.Engine.Sub.ScrollBuilder"},{"name":"getPosition","comment":" Get the current scroll position for a specific container.\n\nReturns X and Y coordinates as a record.\n\nReturns `Nothing` if the container is not found or scroll position is unavailable.\n\n","type":"Scroll.Engine.Sub.Container -> Scroll.Engine.Sub.ScrollState -> Maybe.Maybe { x : Basics.Float, y : Basics.Float }"},{"name":"getPositionX","comment":" Get current horizontal scroll position for a specific container.\n","type":"Scroll.Engine.Sub.Container -> Scroll.Engine.Sub.ScrollState -> Maybe.Maybe Basics.Float"},{"name":"getPositionY","comment":" Get current vertical scroll position for a specific container.\n","type":"Scroll.Engine.Sub.Container -> Scroll.Engine.Sub.ScrollState -> Maybe.Maybe Basics.Float"},{"name":"init","comment":" Initialize empty scroll animation state.\n\n    import Scroll.Engine.Sub as Sub\n\n    init : Model\n    init =\n        { scrollState = Sub.init }\n\n","type":"Scroll.Engine.Sub.ScrollState"},{"name":"isRunning","comment":" Check if a scroll animation for a specific container is currently running.\n\nReturns `Nothing` if there are no animations for the container.\n\n","type":"Scroll.Engine.Sub.Container -> Scroll.Engine.Sub.ScrollState -> Maybe.Maybe Basics.Bool"},{"name":"pause","comment":" Pause a scroll animation.\n\n    import Scroll.Engine.Sub as Sub\n\n    Sub.pause (Container \"my-container\") model.scrollState\n\n","type":"Scroll.Engine.Sub.Container -> Scroll.Engine.Sub.ScrollState -> Scroll.Engine.Sub.ScrollState"},{"name":"reset","comment":" Reset a scroll animation to its starting position.\n\n    import Scroll.Engine.Sub as Sub\n\n    let\n        ( newScrollState, scrollCmd ) =\n            Sub.reset (Container \"my-container\") ScrollMsg model.scrollState\n    in\n    ( { model | scrollState = newScrollState }, scrollCmd )\n\n","type":"Scroll.Engine.Sub.Container -> (Scroll.Engine.Sub.ScrollMsg -> msg) -> Scroll.Engine.Sub.ScrollState -> ( Scroll.Engine.Sub.ScrollState, Platform.Cmd.Cmd msg )"},{"name":"restart","comment":" Restart a scroll animation from its starting position.\n\n    import Scroll.Engine.Sub as Sub\n\n    let\n        ( newScrollState, scrollCmd ) =\n            Sub.restart Document ScrollMsg model.scrollState\n    in\n    ( { model | scrollState = newScrollState }, scrollCmd )\n\n","type":"Scroll.Engine.Sub.Container -> (Scroll.Engine.Sub.ScrollMsg -> msg) -> Scroll.Engine.Sub.ScrollState -> ( Scroll.Engine.Sub.ScrollState, Platform.Cmd.Cmd msg )"},{"name":"resume","comment":" Resume a scroll animation.\n\n    import Scroll.Engine.Sub as Sub\n\n    Sub.resume Document model.scrollState\n\n","type":"Scroll.Engine.Sub.Container -> Scroll.Engine.Sub.ScrollState -> Scroll.Engine.Sub.ScrollState"},{"name":"scroll","comment":" Start a scroll animation and keep tracking it in state.\n\n    import Scroll.Engine.Sub as Sub\n\n    type Msg\n        = ScrollMsg Sub.ScrollMsg\n        | ...\n\n    let\n        ( newScrollState, scrollCmd ) =\n            Sub.scroll ScrollMsg model.scrollState <|\n                scrollToElement \"target-section\"\n    in\n    ( { model | scrollState = newScrollState }, scrollCmd )\n\n","type":"(Scroll.Engine.Sub.ScrollMsg -> msg) -> Scroll.Engine.Sub.ScrollState -> (Scroll.Engine.Sub.ScrollBuilder -> Scroll.Engine.Sub.ScrollBuilder) -> ( Scroll.Engine.Sub.ScrollState, Platform.Cmd.Cmd msg )"},{"name":"speed","comment":" Set the speed that scrolls should run at.\n\nThis will be inherited by all scrolls that\ndon't define their own speed.\n\n    import Scroll.Builder as Scroll\n    import Scroll.Engine.Sub as Sub\n\n    scrollToElement : String -> ScrollBuilder -> ScrollBuilder\n    scrollToElement elementId =\n        Sub.speed 200\n            >> Scroll.forDocument\n            >> Scroll.toElement elementId\n            >> Scroll.build\n\n","type":"Basics.Float -> Scroll.Engine.Sub.ScrollBuilder -> Scroll.Engine.Sub.ScrollBuilder"},{"name":"stop","comment":" Stop a scroll animation by jumping to the target position.\n\n    import Scroll.Engine.Sub as Sub\n\n    let\n        ( newScrollState, scrollCmd ) =\n            Sub.stop Document ScrollMsg model.scrollState\n    in\n    ( { model | scrollState = newScrollState }, scrollCmd )\n\n","type":"Scroll.Engine.Sub.Container -> (Scroll.Engine.Sub.ScrollMsg -> msg) -> Scroll.Engine.Sub.ScrollState -> ( Scroll.Engine.Sub.ScrollState, Platform.Cmd.Cmd msg )"},{"name":"subscriptions","comment":" Subscribe to receive scroll animation updates - without this your scrolls won't run.\n\n    import Scroll.Engine.Sub as Sub\n\n    type Msg\n        = ScrollMsg Sub.ScrollMsg\n        | ...\n\n    subscriptions : Model -> Sub Msg\n    subscriptions model =\n        Sub.subscriptions ScrollMsg model.scrollState\n\n","type":"(Scroll.Engine.Sub.ScrollMsg -> msg) -> Scroll.Engine.Sub.ScrollState -> Platform.Sub.Sub msg"},{"name":"update","comment":" Handle messages from this engine.\n\n    import Scroll.Engine.Sub as Sub\n\n    type Msg\n        = ScrollMsg Sub.ScrollMsg\n        | ...\n\n    update : Msg -> Model -> ( Model, Cmd Msg )\n    update msg model =\n        case msg of\n            ScrollMsg scrollMsg ->\n                let\n                    ( newScrollState, events, scrollCmd ) =\n                        Sub.update ScrollMsg scrollMsg model.scrollState\n                in\n                handleEvents events <|\n                    ( { model | scrollState = newScrollState }, scrollCmd )\n\n","type":"(Scroll.Engine.Sub.ScrollMsg -> msg) -> Scroll.Engine.Sub.ScrollMsg -> Scroll.Engine.Sub.ScrollState -> ( Scroll.Engine.Sub.ScrollState, List.List Scroll.Engine.Sub.ScrollEvent, Platform.Cmd.Cmd msg )"}],"binops":[]},{"name":"Scroll.Engine.Task","comment":" Scroll animations as Tasks for when you want results, typed error handling or composition\nwith other Tasks.\n\n📖 See\n[Scroll Task Engine Documentation](https://phollyer.github.io/elm-motion/scroll/engines/task/)\nand\n[Scroll Overview](https://phollyer.github.io/elm-motion/scroll/engines/overview/)\nfor details.\n\nUse the [Builder](Scroll-Builder) module to configure scroll targets.\n\n\n# Types\n\n@docs ScrollBuilder, Container\n\n\n# Trigger\n\n@docs ScrollError, ScrollOk\n\n@docs scroll, scrollEach\n\n\n# Timing\n\n📖 See [Timing](https://phollyer.github.io/elm-motion/animation/concepts/timing/) for details.\n\n@docs delay, duration, speed\n\n\n# Easing\n\n📖 See [Easing](https://phollyer.github.io/elm-motion/animation/concepts/easing/) for details.\n\n@docs easing\n\n","unions":[{"name":"Container","comment":" Identifies the scroll surface handled by the engine.\n\nUse `Document` for the document body, or `Container \"element-id\"` for a\nspecific scrollable element.\n\n","args":[],"cases":[["Document",[]],["Container",["String.String"]]]},{"name":"ScrollError","comment":" Error returned when a scroll task fails.\n\nIt tells you what container failed, which target was involved, and the DOM error:\n\n  - `container`: The container that was being scrolled\n  - `targetElementId`: The element ID if scrolling to an element target\n  - `domError`: The underlying [Dom.Error](https://package.elm-lang.org/packages/elm/browser/latest/Browser-Dom#Error) that caused the scroll to fail\n\n","args":[],"cases":[["ScrollError",["{ container : Scroll.Engine.Task.Container, targetElementId : Maybe.Maybe String.String, domError : Browser.Dom.Error }"]]]}],"aliases":[{"name":"ScrollBuilder","comment":" Builder type for scroll animations.\n","args":[],"type":"Scroll.Internal.ScrollBuilder.ScrollBuilder"},{"name":"ScrollOk","comment":" Value returned when a scroll task succeeds.\n\nIt tells you which container finished scrolling and, when relevant, which target element was used:\n\n  - `container`: The container that was scrolled\n  - `targetElementId`: The element ID if scrolled to an element target\n\n","args":[],"type":"{ container : Scroll.Engine.Task.Container, targetElementId : Maybe.Maybe String.String }"}],"values":[{"name":"delay","comment":" Set the delay for all scrolls.\n\nThis will be inherited by all scrolls that\ndon't define their own delay.\n\n    import Scroll.Builder as Scroll\n    import Scroll.Engine.Task as Task\n\n    scrollToElement : String -> ScrollBuilder -> ScrollBuilder\n    scrollToElement elementId =\n        Task.delay 100\n            >> Scroll.forDocument\n            >> Scroll.toElement elementId\n            >> Scroll.speed 200\n            >> Scroll.build\n\n","type":"Basics.Int -> Scroll.Engine.Task.ScrollBuilder -> Scroll.Engine.Task.ScrollBuilder"},{"name":"duration","comment":" Set the duration of all scrolls.\n\nThis will be inherited by all scrolls that\ndon't define their own duration.\n\n    import Scroll.Builder as Scroll\n    import Scroll.Engine.Task as Task\n\n    scrollToElement : String -> ScrollBuilder -> ScrollBuilder\n    scrollToElement elementId =\n        Task.duration 1000\n            >> Scroll.forDocument\n            >> Scroll.toElement elementId\n            >> Scroll.build\n\n","type":"Basics.Int -> Scroll.Engine.Task.ScrollBuilder -> Scroll.Engine.Task.ScrollBuilder"},{"name":"easing","comment":" Set the easing function to be used by all scrolls.\n\nThis will be inherited by all scrolls that\ndon't define their own easing.\n\n    import Motion.Easing exposing (Easing(..))\n    import Scroll.Builder as Scroll\n    import Scroll.Engine.Task as Task\n\n    scrollToElement : String -> ScrollBuilder -> ScrollBuilder\n    scrollToElement elementId =\n        Task.easing BounceOut\n            >> Scroll.forDocument\n            >> Scroll.toElement elementId\n            >> Scroll.speed 200\n            >> Scroll.build\n\n","type":"Motion.Easing.Easing -> Scroll.Engine.Task.ScrollBuilder -> Scroll.Engine.Task.ScrollBuilder"},{"name":"scroll","comment":" Start one or more scrolls as a [Task](https://package.elm-lang.org/packages/elm/core/latest/Task).\n\nYou get one `ScrollOk` for each completed target. If any target fails, the task stops with `ScrollError`.\nUse [`scrollEach`](#scrollEach) when you want every target to run even if one fails.\n\n    import Scroll.Builder as Scroll\n    import Scroll.Engine.Task as Task\n    import Task\n\n    type Msg\n        = HandleScrollResult (Result ScrollError (List ScrollOk))\n        | ...\n\n    Task.scroll (scrollToElement \"target-section\")\n         |> Task.attempt HandleScrollResult\n\nIf you need progress, cancellation, or safe retriggering, use\n[Scroll.Engine.Sub](Scroll-Engine-Sub) instead.\n\n","type":"(Scroll.Engine.Task.ScrollBuilder -> Scroll.Engine.Task.ScrollBuilder) -> Task.Task Scroll.Engine.Task.ScrollError (List.List Scroll.Engine.Task.ScrollOk)"},{"name":"scrollEach","comment":" Run each scroll target in order and collect every result.\n\nUnlike [`scroll`](#scroll), this keeps going after failures and gives you one `Result` per target.\n\n    import Scroll.Builder as Scroll\n    import Scroll.Engine.Task as Task\n    import Task\n\n    type Msg\n        = HandleScrollResults (List (Result ScrollError ScrollOk))\n        | ...\n\n    Task.scrollEach (scrollSequence \"chapter-2\")\n         |> Task.perform HandleScrollResults\n\n","type":"(Scroll.Engine.Task.ScrollBuilder -> Scroll.Engine.Task.ScrollBuilder) -> Task.Task Basics.Never (List.List (Result.Result Scroll.Engine.Task.ScrollError Scroll.Engine.Task.ScrollOk))"},{"name":"speed","comment":" Set the speed that scrolls should run at.\n\nThis will be inherited by all scrolls that\ndon't define their own speed.\n\n    import Scroll.Builder as Scroll\n    import Scroll.Engine.Task as Task\n\n    scrollToElement : String -> ScrollBuilder -> ScrollBuilder\n    scrollToElement elementId =\n        Task.speed 200\n            >> Scroll.forDocument\n            >> Scroll.toElement elementId\n            >> Scroll.build\n\n","type":"Basics.Float -> Scroll.Engine.Task.ScrollBuilder -> Scroll.Engine.Task.ScrollBuilder"}],"binops":[]}]