ladybird/Libraries/LibWeb/CSS/CSSNumericValue.h
Callum Law 435791b754 LibWeb: Implement AnimationTimline::duration property
This was added in Level 2 of the Web Animations spec

In this level of the spec, all time values associated with animations
(including this duration property) are no longer simple numbers but are
instead either percentages or numbers for progress- and time-based
timelines respectively. These values are represented internally by a new
`TimeValue` wrapper struct, and externally (i.e. in JS) as
`CSSNumberish`.
2025-12-12 10:49:18 +00:00

77 lines
2.3 KiB
C++

/*
* Copyright (c) 2025, Sam Atkins <sam@ladybird.org>
*
* SPDX-License-Identifier: BSD-2-Clause
*/
#pragma once
#include <AK/FlyString.h>
#include <LibWeb/Bindings/CSSNumericValuePrototype.h>
#include <LibWeb/CSS/CSSStyleValue.h>
#include <LibWeb/CSS/NumericType.h>
#include <LibWeb/WebIDL/ExceptionOr.h>
#include <LibWeb/WebIDL/Types.h>
namespace Web::CSS {
struct CSSNumericType {
Optional<WebIDL::Long> length;
Optional<WebIDL::Long> angle;
Optional<WebIDL::Long> time;
Optional<WebIDL::Long> frequency;
Optional<WebIDL::Long> resolution;
Optional<WebIDL::Long> flex;
Optional<WebIDL::Long> percent;
Optional<Bindings::CSSNumericBaseType> percent_hint;
};
// https://drafts.css-houdini.org/css-typed-om-1/#cssnumericvalue-sum-value
struct SumValueItem {
double value;
UnitMap unit_map;
};
using SumValue = Vector<SumValueItem>;
// https://drafts.css-houdini.org/css-typed-om-1/#cssnumericvalue
class CSSNumericValue : public CSSStyleValue {
WEB_PLATFORM_OBJECT(CSSNumericValue, CSSStyleValue);
GC_DECLARE_ALLOCATOR(CSSNumericValue);
public:
struct SerializationParams {
Optional<double> minimum {};
Optional<double> maximum {};
bool nested { false };
bool parenless { false };
};
virtual ~CSSNumericValue() override = default;
bool equals_for_bindings(Vector<CSSNumberish>) const;
virtual bool is_equal_numeric_value(GC::Ref<CSSNumericValue> other) const = 0;
WebIDL::ExceptionOr<GC::Ref<CSSUnitValue>> to(FlyString const& unit) const;
virtual Optional<SumValue> create_a_sum_value() const = 0;
CSSNumericType type_for_bindings() const;
NumericType const& type() const { return m_type; }
virtual WebIDL::ExceptionOr<String> to_string() const final override { return to_string({}); }
String to_string(SerializationParams const&) const;
static WebIDL::ExceptionOr<GC::Ref<CSSNumericValue>> parse(JS::VM&, String const& css_text);
virtual WebIDL::ExceptionOr<NonnullRefPtr<CalculationNode const>> create_calculation_node(CalculationContext const&) const = 0;
protected:
explicit CSSNumericValue(JS::Realm&, NumericType);
virtual void initialize(JS::Realm&) override;
NumericType m_type;
};
GC::Ref<CSSNumericValue> rectify_a_numberish_value(JS::Realm&, CSSNumberish const&, Optional<FlyString> unit = {});
}