diff --git a/src/textual/_animator.py b/src/textual/_animator.py index 75927ec9a4..a2a924f3aa 100644 --- a/src/textual/_animator.py +++ b/src/textual/_animator.py @@ -11,7 +11,7 @@ from textual import _time from textual._callback import invoke from textual._compat import cached_property -from textual._easing import DEFAULT_EASING, EASING +from textual._easing import DEFAULT_EASING, EASING, DefaultEasingFunctions from textual._types import AnimationLevel, CallbackType from textual.timer import Timer @@ -303,7 +303,7 @@ def animate( final_value: object = ..., duration: float | None = None, speed: float | None = None, - easing: EasingFunction | str = DEFAULT_EASING, + easing: EasingFunction | DefaultEasingFunctions = DEFAULT_EASING, delay: float = 0.0, on_complete: CallbackType | None = None, level: AnimationLevel = "full", diff --git a/src/textual/_easing.py b/src/textual/_easing.py index 13b274ddd8..0dd41429d4 100644 --- a/src/textual/_easing.py +++ b/src/textual/_easing.py @@ -4,6 +4,7 @@ """ from math import cos, pi, sin, sqrt +from typing import Literal def _in_out_expo(x: float) -> float: @@ -129,3 +130,39 @@ def _in_out_bounce(x: float) -> float: DEFAULT_EASING = "in_out_cubic" DEFAULT_SCROLL_EASING = "out_cubic" + +DefaultEasingFunctions = Literal[ + "none", + "round", + "linear", + "in_sine", + "in_out_sine", + "out_sine", + "in_quad", + "in_out_quad", + "out_quad", + "in_cubic", + "in_out_cubic", + "out_cubic", + "in_quart", + "in_out_quart", + "out_quart", + "in_quint", + "in_out_quint", + "out_quint", + "in_expo", + "in_out_expo", + "out_expo", + "in_circ", + "in_out_circ", + "out_circ", + "in_back", + "in_out_back", + "out_back", + "in_elastic", + "in_out_elastic", + "out_elastic", + "in_bounce", + "in_out_bounce", + "out_bounce", +] diff --git a/src/textual/app.py b/src/textual/app.py index 9bf7ad11a1..d6d98e668c 100644 --- a/src/textual/app.py +++ b/src/textual/app.py @@ -80,6 +80,7 @@ from textual._context import active_app, active_message_pump from textual._context import message_hook as message_hook_context_var from textual._dispatch_key import dispatch_key +from textual._easing import DefaultEasingFunctions from textual._event_broker import NoHandler, extract_handler_actions from textual._files import generate_datetime_filename from textual._path import ( @@ -1064,7 +1065,7 @@ def animate( duration: float | None = None, speed: float | None = None, delay: float = 0.0, - easing: EasingFunction | str = DEFAULT_EASING, + easing: EasingFunction | DefaultEasingFunctions = DEFAULT_EASING, on_complete: CallbackType | None = None, level: AnimationLevel = "full", ) -> None: diff --git a/src/textual/css/styles.py b/src/textual/css/styles.py index e165d3590c..bf11c83f04 100644 --- a/src/textual/css/styles.py +++ b/src/textual/css/styles.py @@ -10,6 +10,7 @@ from typing_extensions import TypedDict from textual._animator import DEFAULT_EASING, Animatable, BoundAnimator, EasingFunction +from textual._easing import DefaultEasingFunctions from textual._types import AnimationLevel, CallbackType from textual.color import Color from textual.css._style_properties import ( @@ -1382,7 +1383,7 @@ def animate( duration: float | None = None, speed: float | None = None, delay: float = 0.0, - easing: EasingFunction | str = DEFAULT_EASING, + easing: EasingFunction | DefaultEasingFunctions = DEFAULT_EASING, on_complete: CallbackType | None = None, level: AnimationLevel = "full", ) -> None: diff --git a/src/textual/widget.py b/src/textual/widget.py index ad526e606e..7120073104 100644 --- a/src/textual/widget.py +++ b/src/textual/widget.py @@ -53,7 +53,7 @@ from textual._context import NoActiveAppError from textual._debug import get_caller_file_and_line from textual._dispatch_key import dispatch_key -from textual._easing import DEFAULT_SCROLL_EASING +from textual._easing import DEFAULT_SCROLL_EASING, DefaultEasingFunctions from textual._extrema import Extrema from textual._styles_cache import StylesCache from textual._types import AnimationLevel @@ -2463,7 +2463,7 @@ def animate( duration: float | None = None, speed: float | None = None, delay: float = 0.0, - easing: EasingFunction | str = DEFAULT_EASING, + easing: EasingFunction | DefaultEasingFunctions = DEFAULT_EASING, on_complete: CallbackType | None = None, level: AnimationLevel = "full", ) -> None: