LibWeb: Implement the animation-composition property

This commit is contained in:
Tim Ledbetter 2025-09-18 19:59:33 +01:00 committed by Sam Atkins
commit e502f19fa7
Notes: github-actions[bot] 2025-09-19 09:11:25 +00:00
14 changed files with 222 additions and 7 deletions

View file

@ -67,6 +67,7 @@
"absolute",
"accentcolor",
"accentcolortext",
"accumulate",
"active",
"activeborder",
"activecaption",
@ -424,6 +425,7 @@
"repeat",
"repeat-x",
"repeat-y",
"replace",
"reverse",
"revert",
"revert-layer",

View file

@ -209,6 +209,17 @@
"animation-fill-mode"
]
},
"animation-composition": {
"affects-layout": false,
"animation-type": "none",
"inherited": false,
"initial": "replace",
"valid-identifiers": [
"replace",
"add",
"accumulate"
]
},
"animation-delay": {
"affects-layout": false,
"animation-type": "none",

View file

@ -1243,6 +1243,20 @@ static void apply_animation_properties(DOM::Document& document, CascadedProperti
if (auto timing_property = cascaded_properties.property(PropertyID::AnimationTimingFunction); timing_property && timing_property->is_easing())
timing_function = timing_property->as_easing().function();
Bindings::CompositeOperation composite_operation { Bindings::CompositeOperation::Replace };
if (auto composite_property = cascaded_properties.property(PropertyID::AnimationComposition); composite_property) {
switch (composite_property->to_keyword()) {
case Keyword::Add:
composite_operation = Bindings::CompositeOperation::Add;
break;
case Keyword::Accumulate:
composite_operation = Bindings::CompositeOperation::Accumulate;
break;
default:
break;
}
}
auto iteration_duration = duration.has_value()
? Variant<double, String> { duration.release_value().to_milliseconds() }
: "auto"_string;
@ -1252,6 +1266,7 @@ static void apply_animation_properties(DOM::Document& document, CascadedProperti
effect.set_timing_function(move(timing_function));
effect.set_fill_mode(Animations::css_fill_mode_to_bindings_fill_mode(fill_mode));
effect.set_playback_direction(Animations::css_animation_direction_to_bindings_playback_direction(direction));
effect.set_composite(composite_operation);
if (play_state != effect.last_css_animation_play_state()) {
if (play_state == CSS::AnimationPlayState::Running && animation.play_state() != Bindings::AnimationPlayState::Running) {