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.
- `configure_service` como `configure_router(Router) -> Router`.
- Macro `static_files_service!` como `serve_static_files!`.
- `ResultPage<M, E>` eliminado; handlers devuelven `Result<M, E>`.
- `ErrorPage` implementa `IntoResponse` en lugar de `ResponseError`.
- Registro con `OnceLock`; eliminados `drop_extensions` y `app.welcome`.
- `Redirect` devuelve `Response`; docs y ejemplos actualizados.
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`.
- Modulariza la lógica de localización.
- Actualiza la estructura de `Locale` para mejorar la resolución y
gestión de idiomas.
- Introduce `RequestLocale` para manejar la negociación de idioma basada
en las peticiones HTTP.
- Mejora `L10n` para ofrecer una gestión más flexible de traducciones
con argumentos dinámicos.
- Actualiza la implementación de `LangId` en `Page` para garantizar una
identificación de idioma coherente.
- Elimina código obsoleto y simplifica la gestión de identificadores de
idioma.
- Incorpora nuevo *crate* `pagetop-minimal` con macros básicas para
operaciones con cadenas, bloques de texto o colecciones clave-valor.
- Refactoriza código para usar `util::join!` y `util::join_pair!` en la
concatenación de cadenas.
- Normaliza la gestión de localización usando `util::kv!` para los
argumentos con pares clave-valor.
- Actualizada documentación y archivos README para reflejar la nueva
estructura y funcionalidades.
- Mejora la legibilidad del código.
- Simplifica las alteraciones de clases en los componentes `Container`,
`Dropdown`, `Image`, `Nav`, `Navbar` y `Offcanvas` usando métodos
dedicados para generar clases en función de sus propiedades.
- Mejora los enums añadiendo métodos que devuelven sus clases
asociadas, reduciendo código repetitivo.
- Elimina el trait `JoinClasses` y su implementación, integrando la
lógica de unión de clases directamente en los componentes.
Como `String::from()` y `.to_string()` son equivalentes, se sustituyen
todas las ocurrencias de `String::from()` por `to_string()` para mayor
coherencia y legibilidad.