use crate::ui::UIWidget; use maud::{Markup, Render, html}; use super::{Side, Size}; #[allow(non_snake_case)] pub fn Rounded(inner: T) -> RoundedWidget { RoundedWidget(Box::new(inner), None, None) } pub struct RoundedWidget(Box, Option, Option); impl RoundedWidget { #[must_use] pub fn size(mut self, size: Size) -> Self { self.1 = Some(size); self } #[must_use] pub const fn side(mut self, side: Side) -> Self { self.2 = Some(side); self } } impl Render for RoundedWidget { fn render(&self) -> Markup { self.render_with_class("") } } impl UIWidget for RoundedWidget { fn can_inherit(&self) -> bool { true } fn base_class(&self) -> Vec { if let Some(side) = &self.2 { if let Some(size) = &self.1 { return vec![format!("rounded-{}-{}", side.to_value(), size.to_value())]; } } else if let Some(size) = &self.1 { return vec![format!("rounded-{}", size.to_value())]; } vec!["rounded".to_owned()] } fn extended_class(&self) -> Vec { let mut c = self.base_class(); c.extend_from_slice(&self.0.extended_class()); c } fn render_with_class(&self, class: &str) -> Markup { if self.0.as_ref().can_inherit() { self.0 .as_ref() .render_with_class(&format!("{} {class}", self.base_class().join(" "))) } else { html! { div class=(format!("{} {class}", self.base_class().join(" "))) { (self.0.as_ref()) } } } } }