/* * Copyright (c) 2024, Matthew Olsson * Copyright (c) 2024, Sam Atkins * * SPDX-License-Identifier: BSD-2-Clause */ #pragma once #include #include #include #include #include namespace Web::CSS { class CSSTransition : public Animations::Animation { WEB_PLATFORM_OBJECT(CSSTransition, Animations::Animation); GC_DECLARE_ALLOCATOR(CSSTransition); public: static GC::Ref start_a_transition(DOM::Element&, PropertyID, size_t transition_generation, double start_time, double end_time, NonnullRefPtr start_value, NonnullRefPtr end_value, NonnullRefPtr reversing_adjusted_start_value, double reversing_shortening_factor); StringView transition_property() const { return string_from_property_id(m_transition_property); } virtual Animations::AnimationClass animation_class() const override; virtual Optional class_specific_composite_order(GC::Ref other) const override; double transition_start_time() const { return m_start_time; } double transition_end_time() const { return m_end_time; } NonnullRefPtr transition_start_value() const { return m_start_value; } NonnullRefPtr transition_end_value() const { return m_end_value; } NonnullRefPtr reversing_adjusted_start_value() const { return m_reversing_adjusted_start_value; } double reversing_shortening_factor() const { return m_reversing_shortening_factor; } double timing_function_output_at_time(double t) const; NonnullRefPtr value_at_time(double t) const; // This is designed to be created from AnimationEffect::Phase. enum class Phase : u8 { Before, Active, After, Idle, Pending, }; Phase previous_phase() const { return m_previous_phase; } void set_previous_phase(Phase phase) { m_previous_phase = phase; } private: CSSTransition(JS::Realm&, DOM::Element&, PropertyID, size_t transition_generation, double start_time, double end_time, NonnullRefPtr start_value, NonnullRefPtr end_value, NonnullRefPtr reversing_adjusted_start_value, double reversing_shortening_factor); virtual void initialize(JS::Realm&) override; virtual void visit_edges(Cell::Visitor&) override; virtual bool is_css_transition() const override { return true; } PropertyID m_transition_property; // https://drafts.csswg.org/css-transitions-2/#transition-generation size_t m_transition_generation; // https://drafts.csswg.org/css-transitions/#transition-start-time double m_start_time; // https://drafts.csswg.org/css-transitions/#transition-end-time double m_end_time; // https://drafts.csswg.org/css-transitions/#transition-start-value NonnullRefPtr m_start_value; // https://drafts.csswg.org/css-transitions/#transition-end-value NonnullRefPtr m_end_value; // https://drafts.csswg.org/css-transitions/#transition-reversing-adjusted-start-value NonnullRefPtr m_reversing_adjusted_start_value; // https://drafts.csswg.org/css-transitions/#transition-reversing-shortening-factor double m_reversing_shortening_factor; GC::Ref m_keyframe_effect; GC::Ptr m_cached_declaration; Phase m_previous_phase { Phase::Idle }; }; }