swc_css_minifier/compressor/
keyframes.rs

1use swc_atoms::atom;
2use swc_common::DUMMY_SP;
3use swc_css_ast::*;
4
5use super::Compressor;
6use crate::is_css_wide_keyword;
7
8impl Compressor {
9    pub(super) fn compress_keyframes_at_rule(&mut self, at_rule: &mut AtRule) {
10        match at_rule.prelude.as_deref() {
11            Some(AtRulePrelude::KeyframesPrelude(KeyframesName::Str(string)))
12                if !is_css_wide_keyword(&string.value)
13                    && !string.value.eq_ignore_ascii_case("none") =>
14            {
15                at_rule.prelude = Some(Box::new(AtRulePrelude::KeyframesPrelude(
16                    if self.is_ident_shorter_than_str(&string.value) {
17                        KeyframesName::CustomIdent(Box::new(CustomIdent {
18                            span: string.span,
19                            value: string.value.clone(),
20                            raw: None,
21                        }))
22                    } else {
23                        KeyframesName::Str(Box::new(Str {
24                            span: string.span,
25                            value: string.value.clone(),
26                            raw: None,
27                        }))
28                    },
29                )));
30            }
31            _ => {}
32        }
33    }
34
35    pub(super) fn compress_keyframe_selector(&mut self, keyframe_selector: &mut KeyframeSelector) {
36        if let KeyframeSelector::Ident(i) = keyframe_selector {
37            i.value = i.value.to_ascii_lowercase();
38        }
39
40        match keyframe_selector {
41            KeyframeSelector::Ident(i) if i.value == "from" => {
42                *keyframe_selector = KeyframeSelector::Percentage(Percentage {
43                    span: i.span,
44                    value: Number {
45                        span: DUMMY_SP,
46                        value: 0.0,
47                        raw: None,
48                    },
49                })
50            }
51            KeyframeSelector::Percentage(i) if i.value.value == 100.0 => {
52                *keyframe_selector = KeyframeSelector::Ident(Ident {
53                    span: i.span,
54                    value: atom!("to"),
55                    raw: None,
56                })
57            }
58            _ => {}
59        }
60    }
61}