From ed25a17e80279f72160d91db3166c258c95a39fe Mon Sep 17 00:00:00 2001 From: Manuel Cillero Date: Thu, 24 Jul 2025 09:11:29 +0200 Subject: [PATCH] =?UTF-8?q?=E2=9C=A8=20A=C3=B1ade=20el=20primer=20componen?= =?UTF-8?q?te=20b=C3=A1sico=20nativo?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Este componente renderiza directamente código HTML durante el renderizado del documento. --- src/base.rs | 4 +++- src/base/component.rs | 4 ++++ src/base/component/html.rs | 28 ++++++++++++++++++++++++++++ src/core/component/definition.rs | 8 +++----- src/lib.rs | 2 +- src/prelude.rs | 1 + 6 files changed, 40 insertions(+), 7 deletions(-) create mode 100644 src/base/component.rs create mode 100644 src/base/component/html.rs diff --git a/src/base.rs b/src/base.rs index 491223e..6f22dd7 100644 --- a/src/base.rs +++ b/src/base.rs @@ -1,5 +1,7 @@ -//! Reúne acciones y temas listos para usar. +//! Reúne acciones, componentes y temas listos para usar. pub mod action; +pub mod component; + pub mod theme; diff --git a/src/base/component.rs b/src/base/component.rs new file mode 100644 index 0000000..27f0f73 --- /dev/null +++ b/src/base/component.rs @@ -0,0 +1,4 @@ +//! Componentes nativos proporcionados por `PageTop`. + +mod html; +pub use html::Html; diff --git a/src/base/component/html.rs b/src/base/component/html.rs new file mode 100644 index 0000000..0937605 --- /dev/null +++ b/src/base/component/html.rs @@ -0,0 +1,28 @@ +use crate::prelude::*; + +/// Componente básico para renderizar directamente código HTML. +#[derive(AutoDefault)] +pub struct Html(Markup); + +impl ComponentTrait for Html { + fn new() -> Self { + Html::default() + } + + fn prepare_component(&self, _cx: &mut Context) -> PrepareMarkup { + PrepareMarkup::With(html! { (self.0) }) + } +} + +impl Html { + /// Crear una instancia con el código HTML del argumento. + pub fn with(html: Markup) -> Self { + Html(html) + } + + /// Modifica el código HTML de la instancia con el nuevo código del argumento. + pub fn alter_html(&mut self, html: Markup) -> &mut Self { + self.0 = html; + self + } +} diff --git a/src/core/component/definition.rs b/src/core/component/definition.rs index 4c93960..63264b7 100644 --- a/src/core/component/definition.rs +++ b/src/core/component/definition.rs @@ -14,12 +14,10 @@ pub trait ComponentRender { /// Interfaz común que debe implementar un componente renderizable en `PageTop`. /// /// Se recomienda que los componentes deriven [`AutoDefault`](crate::AutoDefault). También deben -/// implementar el método [`new`](Self::new) y pueden sobrescribir los otros métodos para -/// personalizar su comportamiento. +/// implementar explícitamente el método [`new`](Self::new) y pueden sobrescribir los otros métodos +/// para personalizar su comportamiento. pub trait ComponentTrait: AnyInfo + ComponentRender + Send + Sync { /// Crea una nueva instancia del componente. - /// - /// Este método debe implementarse explícitamente. fn new() -> Self where Self: Sized; @@ -53,7 +51,7 @@ pub trait ComponentTrait: AnyInfo + ComponentRender + Send + Sync { #[allow(unused_variables)] fn setup_before_prepare(&mut self, cx: &mut Context) {} - /// Devuelve la representación estructurada del componente lista para renderizar. + /// Devuelve una representación estructurada del componente lista para renderizar. /// /// Puede sobrescribirse para generar dinámicamente el contenido HTML. Por defecto, devuelve /// [`PrepareMarkup::None`]. diff --git a/src/lib.rs b/src/lib.rs index 03bae53..0818be6 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -96,7 +96,7 @@ pub mod datetime; pub mod core; // Gestión del servidor y servicios web. pub mod service; -// Reúne acciones y temas listos para usar. +// Reúne acciones, componentes y temas listos para usar. pub mod base; // Prepara y ejecuta la aplicación. pub mod app; diff --git a/src/prelude.rs b/src/prelude.rs index fe84e28..11c785f 100644 --- a/src/prelude.rs +++ b/src/prelude.rs @@ -43,6 +43,7 @@ pub use crate::core::extension::*; pub use crate::core::theme::*; pub use crate::base::action; +pub use crate::base::component::*; pub use crate::base::theme; pub use crate::app::Application;