pagetop/extensions/pagetop-bootsier
Manuel Cillero 64113aff09 ♻️ (pagetop): Sustituye StyleSheet::inline
- `StyleSheet::inline` se resuelve ahora con `ResponsiveStyles`.
- `StyleSheet` se simplifica a sólo hojas de estilo externas.
- `ResponsiveStyles` añade `add_styles()` para declarar varias
  propiedades en una sola llamada.
- `AssetsOp` gana un constructor por variante y conversiones
  "From<Favicon/Preload/StyleSheet/JavaScript>" para pasarlos
  directamente a `with_assets()`.
2026-09-12 20:44:17 +02:00
..
assets (bootsier): Añade componentes esenciales 2026-08-28 19:46:56 +02:00
src ♻️ (pagetop): Sustituye StyleSheet::inline 2026-09-12 20:44:17 +02:00
tests (bootsier): Añade componentes esenciales 2026-08-28 19:46:56 +02:00
.gitattributes 🎨 (bootsier): Ajusta estilos para personalizar 2025-10-12 20:37:38 +02:00
build.rs (bootsier): Añade componentes esenciales 2026-08-28 19:46:56 +02:00
Cargo.toml 📝 Limpia y corrige documentación de extensiones 2026-06-12 21:29:10 +02:00
CHANGELOG.md 🔖 Prepara publicación de pagetop-bootsier 0.1.1 2026-05-07 21:21:47 +02:00
LICENSE-APACHE 📄 Actualiza licencias y revisa *badges* de README 2025-10-12 13:08:33 +02:00
LICENSE-MIT 📄 Actualiza licencias y revisa *badges* de README 2025-10-12 13:08:33 +02:00
README.md (bootsier): Añade componentes esenciales 2026-08-28 19:46:56 +02:00

PageTop Bootsier

Tema de PageTop basado en Bootstrap para aplicar su catálogo de estilos y componentes flexibles.

Doc API Crates.io Descargas Licencia

Sobre PageTop

PageTop es un entorno de desarrollo que reivindica la esencia de la web clásica para crear soluciones web SSR (renderizadas en el servidor) modulares, extensibles y configurables, basadas en HTML, CSS y JavaScript.

Guía rápida

Igual que con otras extensiones, añade la dependencia a tu Cargo.toml:

[dependencies]
pagetop-bootsier = { ... }

Declara la extensión en tu aplicación (o extensión que la requiera). Recuerda que el orden en dependencies() determina la prioridad relativa frente a las otras extensiones:

use pagetop::prelude::*;

struct MyApp;

#[async_trait]
impl Extension for MyApp {
    fn dependencies(&self) -> Vec<ExtensionRef> {
        vec![
            // ...
            &pagetop_bootsier::Bootsier,
            // ...
        ]
    }
}

Y selecciona el tema en la configuración de la aplicación:

[app]
theme = "Bootsier"

o fuerza el tema por código en una página concreta:

use pagetop::prelude::*;
use pagetop_bootsier::Bootsier;

async fn homepage(request: HttpRequest) -> Result<Markup, ErrorPage> {
    Page::new(request)
        .with_theme(&Bootsier)
        .with_child(
            Block::new()
                .with_title(Lc::l("sample_title"))
                .with_child(Html::with(|cx| html! {
                    p { (Lc::l("sample_content").using(cx)) }
                })),
        )
        .render().await
}

Plantillas

Bootsier ofrece dos plantillas (BootsierTemplates): Standard, con cabecera, contenido y pie, que es la plantilla por defecto de cualquier página; y Admin, con la shell completa de AdminLTE 4 (barra superior + barra lateral + área de contenido), que se activa creando la página con Page::admin() en lugar de Page::new().

use pagetop::prelude::*;

async fn about(request: HttpRequest) -> Result<Markup, ErrorPage> {
    Page::new(request)
        .with_child(Html::with(|_| html! {
            h1 { "Sobre nosotros" }
            p { "Texto de presentación." }
        }))
        .render()
}

Barra lateral

Registra elementos en BootsierRegion::Sidebar para poblar la barra lateral de la shell. Los elementos esperados son theme::sidebar::Item y theme::sidebar::Section.

De forma global (visibles en todas las páginas de administración):

use pagetop::prelude::*;
use pagetop_bootsier::theme::{BootsierRegion, sidebar};

fn register_navigation() {
    InRegion::Global(&BootsierRegion::Sidebar)
        .add(sidebar::Section::titled(Lc::n("Administración")))
        .add(sidebar::Item::link(Lc::n("Usuarios"), "/users", "people"))
        .add(sidebar::Item::link(Lc::n("Roles"), "/roles", "shield-check"));
}

O de forma por página:

use pagetop::prelude::*;
use pagetop_bootsier::theme::{BootsierRegion, sidebar};

async fn settings(request: HttpRequest) -> Result<Markup, ErrorPage> {
    Page::admin(request)
        .with_child_in(
            &BootsierRegion::Sidebar,
            sidebar::Item::link(Lc::n("Ajustes"), "/settings", "gear"),
        )
        .with_child(Html::with(|_| html! { h3 { "Ajustes" } }))
        .render()
}

Barra de navegación superior

La barra superior incluye por defecto los controles de pantalla completa y selector de tema. Para añadir elementos adicionales en el lado derecho (por ejemplo, el dropdown de usuario de pagetop-user), registra componentes en BootsierRegion::Navbar:

use pagetop::prelude::*;
use pagetop_bootsier::theme::BootsierRegion;

InRegion::Global(&BootsierRegion::Navbar)
    .add(Html::with(|_| html! {
        li class="nav-item" {
            a class="nav-link" href="/logout" { "Cerrar sesión" }
        }
    }));

Créditos

Este crate integra la biblioteca de estilos Bootstrap 5.3.8 para definir el comportamiento, la apariencia y los componentes de la interfaz. Bootstrap se distribuye bajo licencia MIT.

Advertencia

PageTop es un proyecto personal para aprender Rust y conocer su ecosistema. Su API está sujeta a cambios frecuentes. No se recomienda su uso en producción, al menos hasta que se libere la versión 1.0.0.

Licencia

El código está disponible bajo una doble licencia:

Puedes elegir la licencia que prefieras. Este enfoque de doble licencia es el estándar de facto en el ecosistema Rust.