use pagetop::prelude::*; use crate::theme::*; /// Componente para crear un **contenedor de componentes** ([`container`]). /// /// Envuelve un conjunto de componentes en un contenedor establecido que se crea aplicando uno de /// los tipos definidos en [`container::Kind`]. /// /// Si no contiene elementos, el componente **no se renderiza**. /// /// # Ejemplo /// /// ```rust /// use pagetop_bootsier::theme::*; /// /// let main = Container::main() /// .with_id("main-page") /// .with_width(container::Width::From(BreakPoint::LG)); /// ``` #[derive(AutoDefault, Clone, Debug, Getters)] pub struct Container { #[getters(skip)] id: AttrId, /// Devuelve las clases CSS asociadas al contenedor. classes: Classes, /// Devuelve el tipo semántico del contenedor. container_kind: container::Kind, /// Devuelve el comportamiento para el ancho del contenedor. container_width: container::Width, /// Devuelve la lista de componentes (`children`) del contenedor. children: Children, } impl Component for Container { fn new() -> Self { Self::default() } fn id(&self) -> Option { self.id.get() } fn setup(&mut self, _cx: &Context) { self.alter_classes(ClassesOp::Prepend, self.container_width().to_class()); } fn prepare(&self, cx: &mut Context) -> Result { let output = self.children().render(cx); if output.is_empty() { return Ok(html! {}); } let style = match self.container_width() { container::Width::FluidMax(w) if w.is_measurable() => { Some(util::join!("max-width: ", w.to_string(), ";")) } _ => None, }; Ok(match self.container_kind() { container::Kind::Default => html! { div id=[self.id()] class=[self.classes().get()] style=[style] { (output) } }, container::Kind::Main => html! { main id=[self.id()] class=[self.classes().get()] style=[style] { (output) } }, container::Kind::Header => html! { header id=[self.id()] class=[self.classes().get()] style=[style] { (output) } }, container::Kind::Footer => html! { footer id=[self.id()] class=[self.classes().get()] style=[style] { (output) } }, container::Kind::Section => html! { section id=[self.id()] class=[self.classes().get()] style=[style] { (output) } }, container::Kind::Article => html! { article id=[self.id()] class=[self.classes().get()] style=[style] { (output) } }, }) } } impl Container { /// Crea un contenedor de tipo `Main` (`
`). pub fn main() -> Self { Self { container_kind: container::Kind::Main, ..Default::default() } } /// Crea un contenedor de tipo `Header` (`
`). pub fn header() -> Self { Self { container_kind: container::Kind::Header, ..Default::default() } } /// Crea un contenedor de tipo `Footer` (`