diff --git a/examples/hello-name.rs b/examples/hello-name.rs index c6a82aaf..b6f9c113 100644 --- a/examples/hello-name.rs +++ b/examples/hello-name.rs @@ -14,7 +14,11 @@ async fn hello_name( ) -> ResultPage { let name = path.into_inner(); Page::new(request) - .add_child(Html::with(move |_| html! { h1 { "Hello " (name) "!" } })) + .add_child(Html::with(move |_| { + html! { + h1 style="text-align: center;" { "Hello " (name) "!" } + } + })) .render() } diff --git a/examples/hello-world.rs b/examples/hello-world.rs index 64817466..74727ac2 100644 --- a/examples/hello-world.rs +++ b/examples/hello-world.rs @@ -10,7 +10,11 @@ impl Extension for HelloWorld { async fn hello_world(request: HttpRequest) -> ResultPage { Page::new(request) - .add_child(Html::with(|_| html! { h1 { "Hello World!" } })) + .add_child(Html::with(|_| { + html! { + h1 style="text-align: center;" { "Hello World!" } + } + })) .render() } diff --git a/examples/navbar-menus.rs b/examples/navbar-menus.rs index 341d394a..079508e9 100644 --- a/examples/navbar-menus.rs +++ b/examples/navbar-menus.rs @@ -95,7 +95,7 @@ impl Extension for SuperMenu { })), )); - InRegion::Named("header").add(Child::with( + InRegion::Global(&DefaultRegion::Header).add(Child::with( Container::new() .with_width(container::Width::FluidMax(UnitValue::RelRem(75.0))) .add_child(navbar_menu), diff --git a/extensions/pagetop-bootsier/src/lib.rs b/extensions/pagetop-bootsier/src/lib.rs index fb9b7206..5c88959a 100644 --- a/extensions/pagetop-bootsier/src/lib.rs +++ b/extensions/pagetop-bootsier/src/lib.rs @@ -102,6 +102,34 @@ pub mod prelude { pub use crate::theme::*; } +/// Plantillas que Bootsier añade. +#[derive(AutoDefault)] +pub enum BootsierTemplate { + /// Plantilla predeterminada de Bootsier. + #[default] + Standard, +} + +impl Template for BootsierTemplate { + fn render(&'static self, cx: &mut Context) -> Markup { + match self { + Self::Standard => theme::Container::new() + .with_classes(ClassesOp::Add, "container-wrapper") + .with_width(theme::container::Width::FluidMax( + config::SETTINGS.bootsier.max_width, + )) + .add_child(Html::with(|cx| { + html! { + (DefaultRegion::Header.render(cx)) + (DefaultRegion::Content.render(cx)) + (DefaultRegion::Footer.render(cx)) + } + })), + } + .render(cx) + } +} + /// Implementa el tema. pub struct Bootsier; @@ -117,6 +145,11 @@ impl Extension for Bootsier { } impl Theme for Bootsier { + #[inline] + fn default_template(&self) -> TemplateRef { + &BootsierTemplate::Standard + } + fn before_render_page_body(&self, page: &mut Page) { page.alter_assets(ContextOp::AddStyleSheet( StyleSheet::from("/bootsier/bs/bootstrap.min.css") @@ -127,16 +160,10 @@ impl Theme for Bootsier { JavaScript::defer("/bootsier/js/bootstrap.bundle.min.js") .with_version(BOOTSTRAP_VERSION) .with_weight(-90), - )); - } - - fn render_page_body(&self, page: &mut Page) -> Markup { - theme::Container::new() - .with_id("container-wrapper") - .with_width(theme::container::Width::FluidMax( - config::SETTINGS.bootsier.max_width, - )) - .add_child(Template::named(page.template())) - .render(page.context()) + )) + .alter_child_in( + &DefaultRegion::Footer, + ChildOp::AddIfEmpty(Child::with(PoweredBy::new())), + ); } } diff --git a/extensions/pagetop-bootsier/static/scss/_customs.scss b/extensions/pagetop-bootsier/static/scss/_customs.scss index 988d7055..45e41001 100644 --- a/extensions/pagetop-bootsier/static/scss/_customs.scss +++ b/extensions/pagetop-bootsier/static/scss/_customs.scss @@ -106,3 +106,9 @@ $utilities: map-merge( ), ) ); + +// Region Footer +.region-footer { + padding: .75rem 0 3rem; + text-align: center; +} diff --git a/helpers/pagetop-macros/src/lib.rs b/helpers/pagetop-macros/src/lib.rs index 5772a6ce..6fa12357 100644 --- a/helpers/pagetop-macros/src/lib.rs +++ b/helpers/pagetop-macros/src/lib.rs @@ -366,7 +366,7 @@ pub fn builder_fn(_: TokenStream, item: TokenStream) -> TokenStream { alter_name_str ); let with_alter_doc = concat!( - "Modifica la instancia actual (`&mut self`) con los mismos argumentos, ", + "Permite modificar la instancia actual (`&mut self`) con los mismos argumentos, ", "sin consumirla." ); diff --git a/src/base/component/html.rs b/src/base/component/html.rs index 1cca9899..48e47bbb 100644 --- a/src/base/component/html.rs +++ b/src/base/component/html.rs @@ -51,9 +51,8 @@ impl Html { /// Crea una instancia que generará el `Markup`, con acceso opcional al contexto. /// - /// El método [`prepare_component()`](crate::core::component::Component::prepare_component) - /// delega el renderizado en la función proporcionada, que recibe una referencia mutable al - /// contexto de renderizado ([`Context`]). + /// El método [`Self::prepare_component()`] delega el renderizado a la función que aquí se + /// proporciona, que recibe una referencia mutable al [`Context`]. pub fn with(f: F) -> Self where F: Fn(&mut Context) -> Markup + Send + Sync + 'static, @@ -64,8 +63,8 @@ impl Html { /// Sustituye la función que genera el `Markup`. /// /// Permite a otras extensiones modificar la función de renderizado que se ejecutará cuando - /// [`prepare_component()`](crate::core::component::Component::prepare_component) invoque esta - /// instancia. La nueva función también recibe una referencia al contexto ([`Context`]). + /// [`Self::prepare_component()`] invoque esta instancia. La nueva función también recibe una + /// referencia al [`Context`]. #[builder_fn] pub fn with_fn(mut self, f: F) -> Self where diff --git a/src/core/component/context.rs b/src/core/component/context.rs index 922067f4..4f2cdf18 100644 --- a/src/core/component/context.rs +++ b/src/core/component/context.rs @@ -11,7 +11,7 @@ use crate::{builder_fn, join}; use std::any::Any; use std::collections::HashMap; -/// Operaciones para modificar recursos asociados al contexto ([`Context`]) de un documento. +/// Operaciones para modificar recursos asociados al [`Context`] de un documento. pub enum ContextOp { /// Define el *favicon* del documento. Sobrescribe cualquier valor anterior. SetFavicon(Option), @@ -386,7 +386,7 @@ impl Context { /// 3. Un idioma válido extraído de la cabecera `Accept-Language` del navegador. /// 4. Y si ninguna de las opciones anteriores aplica, se usa el idioma de respaldo (`"en-US"`). /// -/// Resulta útil para usar un contexto ([`Context`]) como fuente de traducción en +/// Resulta útil para usar el [`Context`] como fuente de traducción en /// [`L10n::lookup()`](crate::locale::L10n::lookup) o [`L10n::using()`](crate::locale::L10n::using). impl LangId for Context { fn langid(&self) -> &'static LanguageIdentifier { diff --git a/static/css/intro.css b/static/css/intro.css index 9c47c5c4..e3de4153 100644 --- a/static/css/intro.css +++ b/static/css/intro.css @@ -17,13 +17,22 @@ --intro-shadow: 0 1px 3px 0 rgba(0, 0, 0, 0.1), 0 1px 2px 0 rgba(0, 0, 0, 0.06); } +body { + overflow-x: clip; +} + .intro { position: relative; min-width: 350px; color: var(--intro-color); background-color: var(--intro-bg-color); - width: 100%; + left: 50%; + right: 50%; + margin-left: -50vw; + margin-right: -50vw; + width: 100vw; + display: flex; flex-direction: column; justify-content: center;