///|
/// CSS Media Query Types
/// Represents parsed media queries for @media rules
///|
/// Media type (screen, print, all, etc.)
pub enum MediaType {
All
Screen
Print
Speech
} derive(Eq, Show)
///|
/// Comparison operator for range queries
pub enum RangeOp {
Eq // =
Lt // <
Le // <=
Gt // >
Ge // >=
} derive(Eq, Show)
///|
/// Media feature value
pub enum MediaValue {
Number(Double)
Dimension(Double, String) // value and unit (e.g., 768px, 2dppx)
Ratio(Int, Int) // e.g., 16/9
Ident(String) // e.g., landscape, portrait
} derive(Eq, Show)
///|
/// Media feature (e.g., width, height, color, etc.)
pub enum MediaFeature {
// Boolean features (no value)
Color
ColorGamut
ColorIndex
Grid
Hover
Monochrome
Pointer
Scripting
Update
// Range features with optional min/max prefix
Width(MediaValue?)
MinWidth(MediaValue)
MaxWidth(MediaValue)
Height(MediaValue?)
MinHeight(MediaValue)
MaxHeight(MediaValue)
AspectRatio(MediaValue?)
MinAspectRatio(MediaValue)
MaxAspectRatio(MediaValue)
Resolution(MediaValue?)
MinResolution(MediaValue)
MaxResolution(MediaValue)
// Range syntax (CSS Media Queries Level 4)
WidthRange(RangeOp, MediaValue)
HeightRange(RangeOp, MediaValue)
// Discrete features with value
Orientation(String) // portrait | landscape
DisplayMode(String) // fullscreen | standalone | minimal-ui | browser
PrefersColorScheme(String) // light | dark
PrefersReducedMotion(String) // reduce | no-preference
// Generic feature for unknown features
Custom(String, MediaValue?)
} derive(Eq, Show)
///|
/// A complete media query
pub struct MediaQuery {
/// "not" modifier
negated : Bool
/// "only" modifier
only : Bool
/// The media type (if any)
media_type : MediaType?
/// The conditions (features)
conditions : Array[MediaFeature]
} derive(Eq, Show)
///|
/// Create a default media query (matches all)
pub fn MediaQuery::default() -> MediaQuery {
{ negated: false, only: false, media_type: None, conditions: [] }
}
///|
/// A list of media queries (comma-separated in CSS)
pub struct MediaQueryList {
queries : Array[MediaQuery]
} derive(Eq, Show)
///|
/// Create an empty media query list
pub fn MediaQueryList::new() -> MediaQueryList {
{ queries: [] }
}
///|
/// Check if a media query list is empty
pub fn MediaQueryList::is_empty(self : MediaQueryList) -> Bool {
self.queries.is_empty()
}
///|
/// Get the number of queries
pub fn MediaQueryList::length(self : MediaQueryList) -> Int {
self.queries.length()
}