use crate::view::context::ElementContext;
use crate::view::div::Div;
use crate::view::style::Style;
pub const SM: f32 = 640.0;
pub const MD: f32 = 768.0;
pub const LG: f32 = 1024.0;
pub const XL: f32 = 1280.0;
pub const XXL: f32 = 1536.0;
#[derive(Clone, Copy, Debug, PartialEq)]
pub enum Variant {
MinWidth(f32),
Dark,
Light,
}
impl Variant {
pub(crate) fn applies(self, cx: &ElementContext) -> bool {
match self {
Variant::MinWidth(width) => cx.viewport().width.0 >= width,
Variant::Dark => cx.theme.is_dark,
Variant::Light => !cx.theme.is_dark,
}
}
}
impl Div {
pub fn at_least(mut self, width: f32, refine: impl FnOnce(Style) -> Style) -> Self {
let variant = Variant::MinWidth(width);
let at = self.interactivity.variants.partition_point(|(existing, _)| match existing {
Variant::MinWidth(other) => *other <= width,
_ => false,
});
self.interactivity.variants.insert(at, (variant, refine(Style::default())));
self
}
pub fn sm(self, refine: impl FnOnce(Style) -> Style) -> Self {
self.at_least(SM, refine)
}
pub fn md(self, refine: impl FnOnce(Style) -> Style) -> Self {
self.at_least(MD, refine)
}
pub fn lg(self, refine: impl FnOnce(Style) -> Style) -> Self {
self.at_least(LG, refine)
}
pub fn xl(self, refine: impl FnOnce(Style) -> Style) -> Self {
self.at_least(XL, refine)
}
pub fn xxl(self, refine: impl FnOnce(Style) -> Style) -> Self {
self.at_least(XXL, refine)
}
pub fn dark(mut self, refine: impl FnOnce(Style) -> Style) -> Self {
self.interactivity.variants.push((Variant::Dark, refine(Style::default())));
self
}
pub fn light(mut self, refine: impl FnOnce(Style) -> Style) -> Self {
self.interactivity.variants.push((Variant::Light, refine(Style::default())));
self
}
}