/* * Copyright (c) 2023, Aliaksandr Kalenik * Copyright (c) 2022, Martin Falisse * Copyright (c) 2025, Sam Atkins * * SPDX-License-Identifier: BSD-2-Clause */ #pragma once #include #include #include namespace Web::CSS { class GridTrackPlacement { public: static GridTrackPlacement make_auto() { return GridTrackPlacement(); } static GridTrackPlacement make_line(RefPtr line_number, Optional name) { return GridTrackPlacement(AreaOrLine { .line_number = move(line_number), .name = move(name) }); } static GridTrackPlacement make_span(NonnullRefPtr value, Optional name) { return GridTrackPlacement(Span { .value = move(value), .name = move(name) }); } bool is_auto() const { return m_value.has(); } bool is_span() const { return m_value.has(); } bool is_area_or_line() const { return m_value.has(); } bool is_auto_positioned() const { return is_auto() || is_span(); } bool is_positioned() const { return !is_auto_positioned(); } bool is_custom_ident() const { return is_area_or_line() && !m_value.get().line_number; } bool has_identifier() const { return is_area_or_line() && m_value.get().name.has_value(); } bool has_line_number() const { return is_area_or_line() && m_value.get().line_number; } String identifier() const { return *m_value.get().name; } NonnullRefPtr line_number() const { return *m_value.get().line_number; } NonnullRefPtr span() const { return *m_value.get().value; } void serialize(StringBuilder&, SerializationMode) const; String to_string(SerializationMode mode) const; GridTrackPlacement absolutized(ComputationContext const&) const; bool is_computationally_independent() const { return m_value.visit([](auto const& value) { return value.is_computationally_independent(); }); } bool operator==(GridTrackPlacement const& other) const = default; private: struct Auto { bool operator==(Auto const&) const = default; bool is_computationally_independent() const { return true; } }; struct AreaOrLine { ValueComparingRefPtr line_number; Optional name; bool operator==(AreaOrLine const& other) const = default; bool is_computationally_independent() const { return !line_number || line_number->is_computationally_independent(); } }; struct Span { ValueComparingNonnullRefPtr value; Optional name; bool operator==(Span const& other) const = default; bool is_computationally_independent() const { return value->is_computationally_independent(); } }; GridTrackPlacement() : m_value(Auto {}) { } GridTrackPlacement(AreaOrLine value) : m_value(move(value)) { } GridTrackPlacement(Span value) : m_value(move(value)) { } Variant m_value; }; }