Skip to content

Easing Functions

Module: terminaltexteffects.utils.easing

Functions for easing calculations.

Functions:

Name Description
linear

Linear easing function.

in_sine

Ease in using a sine function.

out_sine

Ease out using a sine function.

in_out_sine

Ease in/out using a sine function.

in_quad

Ease in using a quadratic function.

out_quad

Ease out using a quadratic function.

in_out_quad

Ease in/out using a quadratic function.

in_cubic

Ease in using a cubic function.

out_cubic

Ease out using a cubic function.

in_out_cubic

Ease in/out using a cubic function.

in_quart

Ease in using a quartic function.

out_quart

Ease out using a quartic function.

in_out_quart

Ease in/out using a quartic function.

in_quint

Ease in using a quintic function.

out_quint

Ease out using a quintic function.

in_out_quint

Ease in/out using a quintic function.

in_expo

Ease in using an exponential function.

out_expo

Ease out using an exponential function.

in_out_expo

Ease in/out using an exponential function.

in_circ

Ease in using a circular function.

out_circ

Ease out using a circular function.

in_out_circ

Ease in/out using a circular function.

in_back

Ease in using a back function.

out_back

Ease out using a back function.

in_out_back

Ease in/out using a back function.

in_elastic

Ease in using an elastic function.

out_elastic

Ease out using an elastic function.

in_out_elastic

Ease in/out using an elastic function.

in_bounce

Ease in using a bounce function.

out_bounce

Ease out using a bounce function.

in_out_bounce

Ease in/out using a bounce function.

eased_step_function

Create a closure that returns the eased value of each step from 0 to 1 increasing by the step_size.

EasingFunction = typing.Callable[[float], float] module-attribute

EasingFunctions take a float between 0 and 1 and return a float between 0 and 1.

make_easing = functools.wraps(make_easing)(functools.lru_cache(maxsize=8192)(make_easing)) module-attribute

Create a cubic Bezier easing function using the provided control points.

The easing function maps an input progress ratio (0 to 1) to an output value (0 to 1) according to a cubic Bezier curve defined by four points: - Start point: (0, 0) - First control point: (x1, y1) - Second control point: (x2, y2) - End point: (1, 1)

Parameters:

Name Type Description Default
x1 float

Determines the horizontal position of the first control point. Smaller values make the curve start off steeper, while larger values delay the initial acceleration.

required
y1 float

Determines the vertical position of the first control point. Smaller values create a gentler ease-in effect; larger values increase the initial acceleration.

required
x2 float

Determines the horizontal position of the second control point. Larger values extend the period of change, affecting how late the acceleration or deceleration begins.

required
y2 float

Determines the vertical position of the second control point. Larger values can create a more abrupt ease-out effect; smaller values result in a smoother finish.

required

Note: Use a resource such as cubic-bezier.com to design an appropriate easing curve for your needs.

Returns:

Name Type Description
EasingFunction EasingFunction

A function that takes a progress_ratio (0 <= progress_ratio <= 1) and returns

EasingFunction

the eased value computed from the cubic Bezier curve.

eased_step_function(easing_func, step_size, *, clamp=False)

Create a closure that returns the eased value of each step from 0 to 1 increasing by the step_size.

Parameters:

Name Type Description Default
easing_func EasingFunction

The easing function to use.

required
step_size float

The step size.

required
clamp bool

If True, the easing function will be limited to 0 <= n <= 1. Defaults to False.

False

Returns:

Type Description
Callable[[], tuple[float, float]]

callable[[],tuple[float,float]]: A closure that returns a tuple of the current input step and eased value of

Callable[[], tuple[float, float]]

the current input step.

Source code in terminaltexteffects/utils/easing.py
def eased_step_function(
    easing_func: EasingFunction,
    step_size: float,
    *,
    clamp: bool = False,
) -> typing.Callable[[], tuple[float, float]]:
    """Create a closure that returns the eased value of each step from 0 to 1 increasing by the step_size.

    Args:
        easing_func (EasingFunction): The easing function to use.
        step_size (float): The step size.
        clamp (bool): If True, the easing function will be limited to 0 <= n <= 1. Defaults to False.

    Returns:
        callable[[],tuple[float,float]]: A closure that returns a tuple of the current input step and eased value of
        the current input step.

    """
    if not 0 < step_size <= 1:
        msg = "Step size must be 0 < n <= 1."
        raise ValueError(msg)

    current_step = 0.0

    def ease() -> tuple[float, float]:
        nonlocal current_step
        eased_value = easing_func(current_step)
        used_step = current_step
        if current_step < 1:
            current_step = min((current_step + step_size, 1.0))
        if clamp:
            eased_value = max(0, min(eased_value, 1))
        return used_step, eased_value

    return ease

in_back(progress_ratio)

Ease in using a back function.

Parameters:

Name Type Description Default
progress_ratio float

the ratio of the current step to the maximum steps

required

Returns:

Name Type Description
float float

0 <= n <= 1 eased value

Source code in terminaltexteffects/utils/easing.py
def in_back(progress_ratio: float) -> float:
    """Ease in using a back function.

    Args:
        progress_ratio (float): the ratio of the current step to the maximum steps

    Returns:
        float: 0 <= n <= 1 eased value

    """
    c1 = 1.70158
    c3 = c1 + 1
    return c3 * progress_ratio**3 - c1 * progress_ratio**2

in_bounce(progress_ratio)

Ease in using a bounce function.

Parameters:

Name Type Description Default
progress_ratio float

the ratio of the current step to the maximum steps

required

Returns:

Name Type Description
float float

0 <= n <= 1 representing the percentage of the current waypoint speed to apply to the character

Source code in terminaltexteffects/utils/easing.py
def in_bounce(progress_ratio: float) -> float:
    """Ease in using a bounce function.

    Args:
        progress_ratio (float): the ratio of the current step to the maximum steps

    Returns:
        float: 0 <= n <= 1 representing the percentage of the current waypoint speed to apply to the character

    """
    return 1 - out_bounce(1 - progress_ratio)

in_circ(progress_ratio)

Ease in using a circular function.

Parameters:

Name Type Description Default
progress_ratio float

the ratio of the current step to the maximum steps

required

Returns:

Name Type Description
float float

0 <= n <= 1 eased value

Source code in terminaltexteffects/utils/easing.py
def in_circ(progress_ratio: float) -> float:
    """Ease in using a circular function.

    Args:
        progress_ratio (float): the ratio of the current step to the maximum steps

    Returns:
        float: 0 <= n <= 1 eased value

    """
    return 1 - math.sqrt(1 - progress_ratio**2)

in_cubic(progress_ratio)

Ease in using a cubic function.

Parameters:

Name Type Description Default
progress_ratio float

the ratio of the current step to the maximum steps

required

Returns:

Name Type Description
float float

0 <= n <= 1 eased value

Source code in terminaltexteffects/utils/easing.py
def in_cubic(progress_ratio: float) -> float:
    """Ease in using a cubic function.

    Args:
        progress_ratio (float): the ratio of the current step to the maximum steps

    Returns:
        float: 0 <= n <= 1 eased value

    """
    return progress_ratio**3

in_elastic(progress_ratio)

Ease in using an elastic function.

Parameters:

Name Type Description Default
progress_ratio float

the ratio of the current step to the maximum steps

required

Returns:

Name Type Description
float float

0 <= n <= 1 eased value

Source code in terminaltexteffects/utils/easing.py
def in_elastic(progress_ratio: float) -> float:
    """Ease in using an elastic function.

    Args:
        progress_ratio (float): the ratio of the current step to the maximum steps

    Returns:
        float: 0 <= n <= 1 eased value

    """
    c4 = (2 * math.pi) / 3
    if progress_ratio == 0:
        return 0
    if progress_ratio == 1:
        return 1
    return -(2 ** (10 * progress_ratio - 10)) * math.sin((progress_ratio * 10 - 10.75) * c4)

in_expo(progress_ratio)

Ease in using an exponential function.

Parameters:

Name Type Description Default
progress_ratio float

the ratio of the current step to the maximum steps

required

Returns:

Name Type Description
float float

0 <= n <= 1 eased value

Source code in terminaltexteffects/utils/easing.py
def in_expo(progress_ratio: float) -> float:
    """Ease in using an exponential function.

    Args:
        progress_ratio (float): the ratio of the current step to the maximum steps

    Returns:
        float: 0 <= n <= 1 eased value

    """
    if progress_ratio == 0:
        return 0
    return 2 ** (10 * progress_ratio - 10)

in_out_back(progress_ratio)

Ease in/out using a back function.

Parameters:

Name Type Description Default
progress_ratio float

the ratio of the current step to the maximum steps

required

Returns:

Name Type Description
float float

0 <= n <= 1 eased value

Source code in terminaltexteffects/utils/easing.py
def in_out_back(progress_ratio: float) -> float:
    """Ease in/out using a back function.

    Args:
        progress_ratio (float): the ratio of the current step to the maximum steps

    Returns:
        float: 0 <= n <= 1 eased value

    """
    c1 = 1.70158
    c2 = c1 * 1.525
    if progress_ratio < 0.5:
        return ((2 * progress_ratio) ** 2 * ((c2 + 1) * 2 * progress_ratio - c2)) / 2
    return ((2 * progress_ratio - 2) ** 2 * ((c2 + 1) * (progress_ratio * 2 - 2) + c2) + 2) / 2

in_out_bounce(progress_ratio)

Ease in/out using a bounce function.

Parameters:

Name Type Description Default
progress_ratio float

the ratio of the current step to the maximum steps

required

Returns:

Name Type Description
float float

0 <= n <= 1 eased value

Source code in terminaltexteffects/utils/easing.py
def in_out_bounce(progress_ratio: float) -> float:
    """Ease in/out using a bounce function.

    Args:
        progress_ratio (float): the ratio of the current step to the maximum steps

    Returns:
        float: 0 <= n <= 1 eased value

    """
    if progress_ratio < 0.5:
        return (1 - out_bounce(1 - 2 * progress_ratio)) / 2
    return (1 + out_bounce(2 * progress_ratio - 1)) / 2

in_out_circ(progress_ratio)

Ease in/out using a circular function.

Parameters:

Name Type Description Default
progress_ratio float

the ratio of the current step to the maximum steps

required

Returns:

Name Type Description
float float

0 <= n <= 1 eased value

Source code in terminaltexteffects/utils/easing.py
def in_out_circ(progress_ratio: float) -> float:
    """Ease in/out using a circular function.

    Args:
        progress_ratio (float): the ratio of the current step to the maximum steps

    Returns:
        float: 0 <= n <= 1 eased value

    """
    if progress_ratio < 0.5:
        return (1 - math.sqrt(1 - (2 * progress_ratio) ** 2)) / 2
    return (math.sqrt(1 - (-2 * progress_ratio + 2) ** 2) + 1) / 2

in_out_cubic(progress_ratio)

Ease in/out using a cubic function.

Parameters:

Name Type Description Default
progress_ratio float

the ratio of the current step to the maximum steps

required

Returns:

Name Type Description
float float

0 <= n <= 1 representing the percentage of the current waypoint speed to apply to the

float

character

Source code in terminaltexteffects/utils/easing.py
def in_out_cubic(progress_ratio: float) -> float:
    """Ease in/out using a cubic function.

    Args:
        progress_ratio (float): the ratio of the current step to the maximum steps

    Returns:
        float: 0 <= n <= 1 representing the percentage of the current waypoint speed to apply to the
        character

    """
    if progress_ratio < 0.5:
        return 4 * progress_ratio**3
    return 1 - (-2 * progress_ratio + 2) ** 3 / 2

in_out_elastic(progress_ratio)

Ease in/out using an elastic function.

Parameters:

Name Type Description Default
progress_ratio float

the ratio of the current step to the maximum steps

required

Returns:

Name Type Description
float float

0 <= n <= 1 representing the percentage of the current waypoint speed to apply to the character

Source code in terminaltexteffects/utils/easing.py
def in_out_elastic(progress_ratio: float) -> float:
    """Ease in/out using an elastic function.

    Args:
        progress_ratio (float): the ratio of the current step to the maximum steps

    Returns:
        float: 0 <= n <= 1 representing the percentage of the current waypoint speed to apply to the character

    """
    c5 = (2 * math.pi) / 4.5
    if progress_ratio == 0:
        return 0
    if progress_ratio == 1:
        return 1
    if progress_ratio < 0.5:
        return -(2 ** (20 * progress_ratio - 10) * math.sin((20 * progress_ratio - 11.125) * c5)) / 2
    return (2 ** (-20 * progress_ratio + 10) * math.sin((20 * progress_ratio - 11.125) * c5)) / 2 + 1

in_out_expo(progress_ratio)

Ease in/out using an exponential function.

Parameters:

Name Type Description Default
progress_ratio float

the ratio of the current step to the maximum steps

required

Returns:

Name Type Description
float float

0 <= n <= 1 eased value

Source code in terminaltexteffects/utils/easing.py
def in_out_expo(progress_ratio: float) -> float:
    """Ease in/out using an exponential function.

    Args:
        progress_ratio (float): the ratio of the current step to the maximum steps

    Returns:
        float: 0 <= n <= 1 eased value

    """
    if progress_ratio == 0:
        return 0
    if progress_ratio == 1:
        return 1
    if progress_ratio < 0.5:
        return 2 ** (20 * progress_ratio - 10) / 2
    return (2 - 2 ** (-20 * progress_ratio + 10)) / 2

in_out_quad(progress_ratio)

Ease in/out using a quadratic function.

Parameters:

Name Type Description Default
progress_ratio float

the ratio of the current step to the maximum steps

required

Returns:

Name Type Description
float float

0 <= n <= 1 eased value

Source code in terminaltexteffects/utils/easing.py
def in_out_quad(progress_ratio: float) -> float:
    """Ease in/out using a quadratic function.

    Args:
        progress_ratio (float): the ratio of the current step to the maximum steps

    Returns:
        float: 0 <= n <= 1 eased value

    """
    if progress_ratio < 0.5:
        return 2 * progress_ratio**2
    return 1 - (-2 * progress_ratio + 2) ** 2 / 2

in_out_quart(progress_ratio)

Ease in/out using a quartic function.

Parameters:

Name Type Description Default
progress_ratio float

the ratio of the current step to the maximum steps

required

Returns:

Name Type Description
float float

0 <= n <= 1 eased value

Source code in terminaltexteffects/utils/easing.py
def in_out_quart(progress_ratio: float) -> float:
    """Ease in/out using a quartic function.

    Args:
        progress_ratio (float): the ratio of the current step to the maximum steps

    Returns:
        float: 0 <= n <= 1 eased value

    """
    if progress_ratio < 0.5:
        return 8 * progress_ratio**4
    return 1 - (-2 * progress_ratio + 2) ** 4 / 2

in_out_quint(progress_ratio)

Ease in/out using a quintic function.

Parameters:

Name Type Description Default
progress_ratio float

the ratio of the current step to the maximum steps

required

Returns:

Name Type Description
float float

0 <= n <= 1 eased value

Source code in terminaltexteffects/utils/easing.py
def in_out_quint(progress_ratio: float) -> float:
    """Ease in/out using a quintic function.

    Args:
        progress_ratio (float): the ratio of the current step to the maximum steps

    Returns:
        float: 0 <= n <= 1 eased value

    """
    if progress_ratio < 0.5:
        return 16 * progress_ratio**5
    return 1 - (-2 * progress_ratio + 2) ** 5 / 2

in_out_sine(progress_ratio)

Ease in/out using a sine function.

Parameters:

Name Type Description Default
progress_ratio float

the ratio of the current step to the maximum steps

required

Returns:

Name Type Description
float float

0 <= n <= 1 eased value

Source code in terminaltexteffects/utils/easing.py
def in_out_sine(progress_ratio: float) -> float:
    """Ease in/out using a sine function.

    Args:
        progress_ratio (float): the ratio of the current step to the maximum steps

    Returns:
        float: 0 <= n <= 1 eased value

    """
    return -(math.cos(math.pi * progress_ratio) - 1) / 2

in_quad(progress_ratio)

Ease in using a quadratic function.

Parameters:

Name Type Description Default
progress_ratio float

the ratio of the current step to the maximum steps

required

Returns:

Name Type Description
float float

0 <= n <= 1 eased value

Source code in terminaltexteffects/utils/easing.py
def in_quad(progress_ratio: float) -> float:
    """Ease in using a quadratic function.

    Args:
        progress_ratio (float): the ratio of the current step to the maximum steps

    Returns:
        float: 0 <= n <= 1 eased value

    """
    return progress_ratio**2

in_quart(progress_ratio)

Ease in using a quartic function.

Parameters:

Name Type Description Default
progress_ratio float

the ratio of the current step to the maximum steps

required

Returns:

Name Type Description
float float

0 <= n <= 1 representing the percentage

float

of the current waypoint speed to apply to the character

Source code in terminaltexteffects/utils/easing.py
def in_quart(progress_ratio: float) -> float:
    """Ease in using a quartic function.

    Args:
        progress_ratio (float): the ratio of the current step to the maximum steps

    Returns:
        float: 0 <= n <= 1 representing the percentage
        of the current waypoint speed to apply to the character

    """
    return progress_ratio**4

in_quint(progress_ratio)

Ease in using a quintic function.

Parameters:

Name Type Description Default
progress_ratio float

the ratio of the current step to the maximum steps

required

Returns:

Name Type Description
float float

0 <= n <= 1 eased value

Source code in terminaltexteffects/utils/easing.py
def in_quint(progress_ratio: float) -> float:
    """Ease in using a quintic function.

    Args:
        progress_ratio (float): the ratio of the current step to the maximum steps

    Returns:
        float: 0 <= n <= 1 eased value

    """
    return progress_ratio**5

in_sine(progress_ratio)

Ease in using a sine function.

Parameters:

Name Type Description Default
progress_ratio float

the ratio of the current step to the maximum steps

required

Returns:

Name Type Description
float float

0 <= n <= 1 eased value

Source code in terminaltexteffects/utils/easing.py
def in_sine(progress_ratio: float) -> float:
    """Ease in using a sine function.

    Args:
        progress_ratio (float): the ratio of the current step to the maximum steps

    Returns:
        float: 0 <= n <= 1 eased value

    """
    return 1 - math.cos((progress_ratio * math.pi) / 2)

linear(progress_ratio)

Linear easing function.

Parameters:

Name Type Description Default
progress_ratio float

the ratio of the current step to the maximum steps

required

Returns:

Name Type Description
float float

0 <= n <= 1 eased value

Source code in terminaltexteffects/utils/easing.py
def linear(progress_ratio: float) -> float:
    """Linear easing function.

    Args:
        progress_ratio (float): the ratio of the current step to the maximum steps

    Returns:
        float: 0 <= n <= 1 eased value

    """
    return progress_ratio

out_back(progress_ratio)

Ease out using a back function.

Parameters:

Name Type Description Default
progress_ratio float

the ratio of the current step to the maximum steps

required

Returns:

Name Type Description
float float

0 <= n <= 1 eased value

Source code in terminaltexteffects/utils/easing.py
def out_back(progress_ratio: float) -> float:
    """Ease out using a back function.

    Args:
        progress_ratio (float): the ratio of the current step to the maximum steps

    Returns:
        float: 0 <= n <= 1 eased value

    """
    c1 = 1.70158
    c3 = c1 + 1
    return 1 + c3 * (progress_ratio - 1) ** 3 + c1 * (progress_ratio - 1) ** 2

out_bounce(progress_ratio)

Ease out using a bounce function.

Parameters:

Name Type Description Default
progress_ratio float

the ratio of the current step to the maximum steps

required

Returns:

Name Type Description
float float

0 <= n <= 1 eased value

Source code in terminaltexteffects/utils/easing.py
def out_bounce(progress_ratio: float) -> float:
    """Ease out using a bounce function.

    Args:
        progress_ratio (float): the ratio of the current step to the maximum steps

    Returns:
        float: 0 <= n <= 1 eased value

    """
    n1 = 7.5625
    d1 = 2.75
    if progress_ratio < 1 / d1:
        return n1 * progress_ratio**2
    if progress_ratio < 2 / d1:
        return n1 * (progress_ratio - 1.5 / d1) ** 2 + 0.75
    if progress_ratio < 2.5 / d1:
        return n1 * (progress_ratio - 2.25 / d1) ** 2 + 0.9375
    return n1 * (progress_ratio - 2.625 / d1) ** 2 + 0.984375

out_circ(progress_ratio)

Ease out using a circular function.

Parameters:

Name Type Description Default
progress_ratio float

the ratio of the current step to the maximum steps

required

Returns:

Name Type Description
float float

0 <= n <= 1 eased value

Source code in terminaltexteffects/utils/easing.py
def out_circ(progress_ratio: float) -> float:
    """Ease out using a circular function.

    Args:
        progress_ratio (float): the ratio of the current step to the maximum steps

    Returns:
        float: 0 <= n <= 1 eased value

    """
    return math.sqrt(1 - (progress_ratio - 1) ** 2)

out_cubic(progress_ratio)

Ease out using a cubic function.

Parameters:

Name Type Description Default
progress_ratio float

the ratio of the current step to the maximum steps

required

Returns:

Name Type Description
float float

0 <= n <= 1 eased value

Source code in terminaltexteffects/utils/easing.py
def out_cubic(progress_ratio: float) -> float:
    """Ease out using a cubic function.

    Args:
        progress_ratio (float): the ratio of the current step to the maximum steps

    Returns:
        float: 0 <= n <= 1 eased value

    """
    return 1 - (1 - progress_ratio) ** 3

out_elastic(progress_ratio)

Ease out using an elastic function.

Parameters:

Name Type Description Default
progress_ratio float

the ratio of the current step to the maximum steps

required

Returns:

Name Type Description
float float

0 <= n <= 1 representing the percentage of the current waypoint speed to apply to the character

Source code in terminaltexteffects/utils/easing.py
def out_elastic(progress_ratio: float) -> float:
    """Ease out using an elastic function.

    Args:
        progress_ratio (float): the ratio of the current step to the maximum steps

    Returns:
        float: 0 <= n <= 1 representing the percentage of the current waypoint speed to apply to the character

    """
    c4 = (2 * math.pi) / 3
    if progress_ratio == 0:
        return 0
    if progress_ratio == 1:
        return 1
    return 2 ** (-10 * progress_ratio) * math.sin((progress_ratio * 10 - 0.75) * c4) + 1

out_expo(progress_ratio)

Ease out using an exponential function.

Parameters:

Name Type Description Default
progress_ratio float

the ratio of the current step to the maximum steps

required

Returns:

Name Type Description
float float

0 <= n <= 1 eased value

Source code in terminaltexteffects/utils/easing.py
def out_expo(progress_ratio: float) -> float:
    """Ease out using an exponential function.

    Args:
        progress_ratio (float): the ratio of the current step to the maximum steps

    Returns:
        float: 0 <= n <= 1 eased value

    """
    if progress_ratio == 1:
        return 1
    return 1 - 2 ** (-10 * progress_ratio)

out_quad(progress_ratio)

Ease out using a quadratic function.

Parameters:

Name Type Description Default
progress_ratio float

the ratio of the current step to the maximum steps

required

Returns:

Name Type Description
float float

0 <= n <= 1 eased value

Source code in terminaltexteffects/utils/easing.py
def out_quad(progress_ratio: float) -> float:
    """Ease out using a quadratic function.

    Args:
        progress_ratio (float): the ratio of the current step to the maximum steps

    Returns:
        float: 0 <= n <= 1 eased value

    """
    return 1 - (1 - progress_ratio) * (1 - progress_ratio)

out_quart(progress_ratio)

Ease out using a quartic function.

Parameters:

Name Type Description Default
progress_ratio float

the ratio of the current step to the maximum steps

required

Returns:

Name Type Description
float float

0 <= n <= 1 eased value

Source code in terminaltexteffects/utils/easing.py
def out_quart(progress_ratio: float) -> float:
    """Ease out using a quartic function.

    Args:
        progress_ratio (float): the ratio of the current step to the maximum steps

    Returns:
        float: 0 <= n <= 1 eased value

    """
    return 1 - (1 - progress_ratio) ** 4

out_quint(progress_ratio)

Ease out using a quintic function.

Parameters:

Name Type Description Default
progress_ratio float

the ratio of the current step to the maximum steps

required

Returns:

Name Type Description
float float

0 <= n <= 1 eased value

Source code in terminaltexteffects/utils/easing.py
def out_quint(progress_ratio: float) -> float:
    """Ease out using a quintic function.

    Args:
        progress_ratio (float): the ratio of the current step to the maximum steps

    Returns:
        float: 0 <= n <= 1 eased value

    """
    return 1 - (1 - progress_ratio) ** 5

out_sine(progress_ratio)

Ease out using a sine function.

Parameters:

Name Type Description Default
progress_ratio float

the ratio of the current step to the maximum steps

required

Returns:

Name Type Description
float float

0 <= n <= 1 eased value

Source code in terminaltexteffects/utils/easing.py
def out_sine(progress_ratio: float) -> float:
    """Ease out using a sine function.

    Args:
        progress_ratio (float): the ratio of the current step to the maximum steps

    Returns:
        float: 0 <= n <= 1 eased value

    """
    return math.sin((progress_ratio * math.pi) / 2)