@@ -8,6 +8,7 @@ use crate::declaration::DeclarationBlock;
88use crate :: error:: { ParserError , PrinterError } ;
99use crate :: parser:: ParserOptions ;
1010use crate :: printer:: Printer ;
11+ use crate :: properties:: animation:: TimelineRangeName ;
1112use crate :: properties:: custom:: { CustomProperty , UnparsedProperty } ;
1213use crate :: properties:: Property ;
1314use crate :: targets:: Targets ;
@@ -265,6 +266,34 @@ impl<'i> ToCss for KeyframesRule<'i> {
265266 }
266267}
267268
269+ /// A percentage of a given timeline range
270+ #[ derive( Debug , PartialEq , Clone ) ]
271+ #[ cfg_attr( feature = "visitor" , derive( Visit ) ) ]
272+ #[ cfg_attr(
273+ feature = "serde" ,
274+ derive( serde:: Serialize , serde:: Deserialize ) ,
275+ serde( tag = "type" , rename_all = "camelCase" )
276+ ) ]
277+ #[ cfg_attr( feature = "jsonschema" , derive( schemars:: JsonSchema ) ) ]
278+ #[ cfg_attr( feature = "into_owned" , derive( static_self:: IntoOwned ) ) ]
279+ pub struct TimelineRangePercentage {
280+ /// A named timeline range
281+ timeline_range_name : TimelineRangeName ,
282+ /// The percentage progress between the start and end of the rage
283+ percentage : Percentage
284+ }
285+
286+ impl < ' i > Parse < ' i > for TimelineRangePercentage {
287+ fn parse < ' t > ( input : & mut Parser < ' i , ' t > ) -> Result < Self , ParseError < ' i , ParserError < ' i > > > {
288+ let timeline_range_name = TimelineRangeName :: parse ( input) ?;
289+ let percentage = Percentage :: parse ( input) ?;
290+ Ok ( TimelineRangePercentage {
291+ timeline_range_name,
292+ percentage
293+ } )
294+ }
295+ }
296+
268297/// A [keyframe selector](https://drafts.csswg.org/css-animations/#typedef-keyframe-selector)
269298/// within an `@keyframes` rule.
270299#[ derive( Debug , PartialEq , Clone , Parse ) ]
@@ -283,6 +312,8 @@ pub enum KeyframeSelector {
283312 From ,
284313 /// The `to` keyword. Equivalent to 100%.
285314 To ,
315+ /// A [named timeline range selector](https://drafts.csswg.org/scroll-animations-1/#named-range-keyframes)
316+ TimelineRangePercentage ( TimelineRangePercentage )
286317}
287318
288319impl ToCss for KeyframeSelector {
@@ -306,6 +337,14 @@ impl ToCss for KeyframeSelector {
306337 }
307338 }
308339 KeyframeSelector :: To => dest. write_str ( "to" ) ,
340+ KeyframeSelector :: TimelineRangePercentage ( TimelineRangePercentage {
341+ timeline_range_name,
342+ percentage
343+ } ) => {
344+ timeline_range_name. to_css ( dest) ?;
345+ dest. write_char ( ' ' ) ?;
346+ percentage. to_css ( dest)
347+ }
309348 }
310349 }
311350}
0 commit comments