Introduce Region y Template (`base::component::layout`) para componer el
`<body>` de una página, con captura explícita vía `handle_component()`
en lugar de maquetado implícito:
- `RegionName`/`TemplateName` (`core/theme.rs`) como interfaces de
identidad; `CoreRegion` (`Header`/`Content`/`Footer`) y `CoreTemplate`
(`Standard`/`Admin`) como catálogo por defecto.
- `ReservedRegion` (`PageTop`/`PageBottom`, en `response/page.rs`) queda
fuera de `CoreRegion`. `Page::render()` las renderiza siempre,
envolviendo `Theme::render_page_body()`, con independencia de la
plantilla o el tema activos.
- Elimina `TemplateSource` en `Context`: la plantilla pasa a ser un
`TemplateRef` fijo, sin resolución por tema (ese mecanismo nunca llegó
a implementarse).
- La personalización por tema es por captura (`handle_component()` +
`downcast_ref()`), no por sustituir qué constante se resuelve.
- Corrige referencias obsoletas a `DefaultRegions` por `CoreRegion`.
- Sustituye `tests/theme_template.rs` (API anterior) por
`tests/component_template.rs`, que cubre el patrón de captura con el
API nuevo.
`Route` resuelve URLs sensibles al `Context`/idioma en propiedades de
componentes; `RoutePath` (renombrado desde html/route.rs) es el valor
concreto de ruta + query. `Waypoint` transporta la URL de retorno entre
pantallas de listado/alta/edición vía query string.
Ajusta `Context::route()`, `Redirect` y los componentes que aceptan
rutas para integrarse con el nuevo tipo `Route`.
- Los errores controlados (403, 404, fatales) se renderizan con el tema
activo; un `panic!` no controlado se intercepta con un HTML mínimo y
autónomo, sin depender del tema ni de los componentes.
- Corrige además que `Context::template()` no seguía los cambios de tema
hechos con `with_theme()` después de crear la página.
- Renombra `DefaultRegion(s)`/`DefaultTemplate(s)`, añade
`Theme::admin_template()` y `Page::admin()`, y documenta la creación
de temas e `InRegion` en `core/theme.rs`.
Permite sustituir una o varias clases por otras nuevas en una sola
operación, preservando su posición. Adapta el tema Bootsier para usarla
en `Button` y elimina el handler duplicado sin referencias.
- Reordena campos, variantes y métodos para mayor consistencia interna.
- Añade `extra_or`, `extra_or_default` y `extra_or_else` a `Props`.
- Mejora la documentación y amplía los tests de integración.
`prepare()` de `Component`, `render()` de `Region` y `Template`, y la
implementación de `ComponentRender` pasan a ser funciones async. Se
actualizan todos los componentes base, helpers, tests y ejemplos.
`async_trait` se re-exporta desde `pagetop` y se añade al preludio; ya
no es necesario declararlo como dependencia en las extensiones.
`initialize()` es ahora verdaderamente `async` (con `.await`), y
`Application::new()` y `prepare()` pasan también a ser funciones
`async`.
- Nuevo módulo `auth` que exporta `CurrentUser`, `CheckPermission` y
`has_permission()`.
- `Context` y `Page` exponen `current_user()` vía `Contextual`.
- `HttpRequest` accede a extensiones de middleware con `extension<T>()`.
- `Extension` incluye nuevo método `configure_middleware`.
- `try_dispatch_actions` para despachar acciones con control del flujo.
Introduce `Props`/`PropsOp` para gestionar pares `atributo="valor"` y
clases CSS para aplicar en componentes.
- Constructores `Props::new()`, `Props::classes()` y `Props::default()`.
- `Page.body_classes` reemplazado por `body_props` (permite atributos
arbitrarios en `<body>`, no sólo clases).
- Tests nuevos para atributos y reescritos para clases.
Elimina `ClassesOp::Replace` (sustituible con `Remove`+`Add`), renombra
`Set` a `Reset` por claridad semántica, añade `Classes::is_empty()` y
mejora documentación de `ClassesOp` con nota sobre orden CSS.
- Sustituye `service::test::*` por `web::test::*` (migración de actix-web a
axum).
- Extrae `setup()` en los módulos que sólo renderizan componentes,
evitando levantar un router completo en cada test.
- Elimina los `env::set_var("PAGETOP_RUN_MODE", "test")` manuales, ya
cubiertos por la *feature* `testing`.
- `From<T: Component> for ChildOp: with_child()` acepta componentes
directamente sin envolverlos en `Child::with(...)`.
- `From<Child> for ChildOp` para completar las conversiones implícitas.
- Actualiza ejemplos y tests con la nueva API en bootsier y aliner.
- Patrón prototipo en `InRegion`: cada petición recibe clones profundos.
- `ComponentClone` habilita clonar `dyn Component` de forma segura.
- `ChildTyped<C>` renombrado a `Slot<C>`, elimina `ChildTypedOp`.
- `Mutex` en lugar de `Arc<RwLock>` en `Child` y `Slot`.
- `is_renderable` y `setup_before_prepare` reciben `&Context`.
- Nuevos tests para `Children`, `ChildOp` y `Slot`.
`prepare_component()` ahora devuelve `Result<Markup, ComponentError>` en
lugar de `Markup`, para que los componentes señalen fallos durante el
renderizado de forma explícita.
`ComponentError` encapsula un mensaje de error y un marcado HTML
alternativo opcional (`fallback`). Si se produce un error, el ciclo de
renderizado registra la traza y muestra el `fallback` en lugar del
componente fallido, sin interrumpir el resto de la página.
Lo mismo aplica a los errores devueltos por la acción `PrepareRender` de
los temas, que siguen el mismo mecanismo.
Elimina `PrepareMarkup` como tipo de retorno de prepare_component() y de
`FnPrepareRender`, sustituyéndolo directamente por `Markup`. Se elimina
una capa innecesaria, ya que html! {} y html! { ... } cubren todos los
casos que ofrecía `PrepareMarkup`.
Como `String::from()` y `.to_string()` son equivalentes, se sustituyen
todas las ocurrencias de `String::from()` por `to_string()` para mayor
coherencia y legibilidad.
- Amplía la documentación del componente.
- Aplica la nueva funcionalidad en la página de bienvenida usando el
nuevo renderizado dinámico con contexto.
- Añade pruebas unitarias para el componente.
- Añade nueva hoja de estilos (normalize.css) al tema básico.
- Activa la extensión de la página de bienvenida por defecto en el
registro de extensiones.
- Añade traducciones en inglés y español para el contenido de la página
de bienvenida.
- Incluye estilos CSS y recursos gráficos para el diseño y disposición
de la página de bienvenida.
- Incluye los recursos favicon, hojas de estilo y scripts JavaScript.
- Se introduce una estructura de contexto que, además de gestionar el
idioma y el uso de parámetros contextuales, permite administrar estos
recursos en documentos HTML.
- Añade dosnuevas macros `include_files` y `include_files_service` para
incluir los recursos preparados con `pagetop-build`.
- Añade nueva función útil `absolute_dir` y sus tests correspondientes.
- Soporta jerarquía de ficheros TOML que mapean ajustes a estructuras
fuertemente tipadas con valores predefinidos.
- Permite definir configuraciones distintas para cada entorno.
- Añade la macro `include_config!` para facilitar la asignación modular
de ajustes de configuración.
- Añade documentación detallada y tests de verificación.
- Crea el crate raíz `pagetop` y configura el workspace con
`helpers/pagetop-macros`.
- Añade las macros #[pagetop::main] y #[pagetop::test] que envuelven
Actix-web para crear aplicaciones y pruebas asíncronas sin depender
explícitamente del framework.
- Reexporta, mediante el módulo `service`, los tipos esenciales de
Actix-web para gestionar servidores y servicios web.
- Implementa `Application::{new, run, test}` para simplificar el
arranque y la ejecución de tests.
- Expone `pagetop::prelude` con las macros, `service` y `Application`
para una API pública coherente.
- Incorpora ejemplo `examples/app-basic.rs` que levanta un servidor web
vacío con el código mínimo para hacerlo.