parcel_css/rules/
media.rs

1//! The `@media` rule.
2
3use super::Location;
4use super::{CssRuleList, MinifyContext};
5use crate::error::{MinifyError, PrinterError};
6use crate::media_query::MediaList;
7use crate::printer::Printer;
8use crate::rules::{StyleContext, ToCssWithContext};
9use crate::traits::ToCss;
10
11/// A [@media](https://drafts.csswg.org/css-conditional-3/#at-media) rule.
12#[derive(Debug, PartialEq, Clone)]
13#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
14pub struct MediaRule<'i> {
15  /// The media query list.
16  #[cfg_attr(feature = "serde", serde(borrow))]
17  pub query: MediaList<'i>,
18  /// The rules within the `@media` rule.
19  pub rules: CssRuleList<'i>,
20  /// The location of the rule in the source file.
21  pub loc: Location,
22}
23
24impl<'i> MediaRule<'i> {
25  pub(crate) fn minify(
26    &mut self,
27    context: &mut MinifyContext<'_, 'i>,
28    parent_is_unused: bool,
29  ) -> Result<bool, MinifyError> {
30    self.rules.minify(context, parent_is_unused)?;
31
32    if let Some(custom_media) = &context.custom_media {
33      self.query.transform_custom_media(self.loc, custom_media)?;
34    }
35
36    Ok(self.rules.0.is_empty() || self.query.never_matches())
37  }
38}
39
40impl<'a, 'i> ToCssWithContext<'a, 'i> for MediaRule<'i> {
41  fn to_css_with_context<W>(
42    &self,
43    dest: &mut Printer<W>,
44    context: Option<&StyleContext<'a, 'i>>,
45  ) -> Result<(), PrinterError>
46  where
47    W: std::fmt::Write,
48  {
49    // If the media query always matches, we can just output the nested rules.
50    if dest.minify && self.query.always_matches() {
51      self.rules.to_css_with_context(dest, context)?;
52      return Ok(());
53    }
54
55    dest.add_mapping(self.loc);
56    dest.write_str("@media ")?;
57    self.query.to_css(dest)?;
58    dest.whitespace()?;
59    dest.write_char('{')?;
60    dest.indent();
61    dest.newline()?;
62    self.rules.to_css_with_context(dest, context)?;
63    dest.dedent();
64    dest.newline()?;
65    dest.write_char('}')
66  }
67}