/*!
<div align="center">

<h1>PageTop Aliner</h1>

<p>Tema de <strong>PageTop</strong> que muestra esquemáticamente la composición de las páginas HTML.</p>

[![Doc API](https://img.shields.io/docsrs/pagetop-aliner?label=Doc%20API&style=for-the-badge&logo=Docs.rs)](https://docs.rs/pagetop-aliner)
[![Crates.io](https://img.shields.io/crates/v/pagetop-aliner.svg?style=for-the-badge&logo=ipfs)](https://crates.io/crates/pagetop-aliner)
[![Descargas](https://img.shields.io/crates/d/pagetop-aliner.svg?label=Descargas&style=for-the-badge&logo=transmission)](https://crates.io/crates/pagetop-aliner)
[![Licencia](https://img.shields.io/badge/license-MIT%2FApache-blue.svg?label=Licencia&style=for-the-badge)](https://git.cillero.es/manuelcillero/pagetop/src/branch/main/extensions/pagetop-aliner#licencia)

</div>

## Sobre PageTop

[PageTop](https://docs.rs/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`:

```toml
[dependencies]
pagetop-aliner = { ... }
```

**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:

```rust,no_run
use pagetop::prelude::*;

struct MyApp;

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

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

```toml
[app]
theme = "Aliner"
```

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

```rust,no_run
use pagetop::prelude::*;
use pagetop_aliner::Aliner;

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

use pagetop::prelude::*;

include_locales!(LOCALES_ALINER);

/// Implementa el tema.
///
/// Define un tema mínimo que muestra esquemáticamente la composición de las páginas HTML; útil
/// para:
///
/// - Comprobar el funcionamiento de temas, plantillas y regiones.
/// - Verificar integración de componentes y composiciones (*layouts*) sin estilos complejos.
/// - Realizar pruebas de renderizado rápido con salida estable y predecible.
/// - Preparar ejemplos y documentación, sin dependencias visuales (CSS/JS) innecesarias.
pub struct Aliner;

#[async_trait]
impl Extension for Aliner {
    fn name(&self) -> L10n {
        L10n::t("extension_name", &LOCALES_ALINER)
    }

    fn description(&self) -> L10n {
        L10n::t("extension_description", &LOCALES_ALINER)
    }

    fn theme(&self) -> Option<ThemeRef> {
        Some(&Self)
    }

    fn configure_router(&self, router: Router) -> Router {
        serve_static_files!(router, [aliner] => "/aliner");
        router
    }
}

#[async_trait]
impl Theme for Aliner {
    fn before_render_page_body(&self, page: &mut Page) {
        page.alter_assets(AssetsOp::AddStyleSheet(
            StyleSheet::from("/pagetop/css/normalize.css")
                .with_version("8.0.1")
                .with_weight(-99),
        ))
        .alter_assets(AssetsOp::AddStyleSheet(
            StyleSheet::from("/pagetop/css/basic.css")
                .with_version(PAGETOP_VERSION)
                .with_weight(-99),
        ))
        .alter_assets(AssetsOp::AddStyleSheet(
            StyleSheet::from("/aliner/css/styles.css")
                .with_version(env!("CARGO_PKG_VERSION"))
                .with_weight(-99),
        ))
        .alter_child_in(
            &DefaultRegions::Footer,
            ChildOp::AddIfEmpty(PoweredBy::new().into()),
        );
    }
}
