diff --git a/extensions/pagetop-bootsier/src/theme/container/component.rs b/extensions/pagetop-bootsier/src/theme/container/component.rs
index 38fc9e1f..5578765f 100644
--- a/extensions/pagetop-bootsier/src/theme/container/component.rs
+++ b/extensions/pagetop-bootsier/src/theme/container/component.rs
@@ -6,7 +6,7 @@ use crate::prelude::*;
///
/// Envuelve un contenido con la etiqueta HTML indicada por [`container::Kind`]. Sólo se renderiza
/// si existen componentes hijos (*children*).
-#[derive(AutoDefault, Getters)]
+#[derive(AutoDefault, Debug, Getters)]
pub struct Container {
#[getters(skip)]
id: AttrId,
diff --git a/extensions/pagetop-bootsier/src/theme/dropdown/component.rs b/extensions/pagetop-bootsier/src/theme/dropdown/component.rs
index a5f17298..046f6ec1 100644
--- a/extensions/pagetop-bootsier/src/theme/dropdown/component.rs
+++ b/extensions/pagetop-bootsier/src/theme/dropdown/component.rs
@@ -19,7 +19,7 @@ use crate::LOCALES_BOOTSIER;
///
/// Ver ejemplo en el módulo [`dropdown`].
/// Si no contiene elementos, el componente **no se renderiza**.
-#[derive(AutoDefault, Getters)]
+#[derive(AutoDefault, Debug, Getters)]
pub struct Dropdown {
#[getters(skip)]
id: AttrId,
diff --git a/extensions/pagetop-bootsier/src/theme/dropdown/item.rs b/extensions/pagetop-bootsier/src/theme/dropdown/item.rs
index 2bc3bf02..2b94a8f1 100644
--- a/extensions/pagetop-bootsier/src/theme/dropdown/item.rs
+++ b/extensions/pagetop-bootsier/src/theme/dropdown/item.rs
@@ -7,7 +7,7 @@ use pagetop::prelude::*;
///
/// Define internamente la naturaleza del elemento y su comportamiento al mostrarse o interactuar
/// con él.
-#[derive(AutoDefault)]
+#[derive(AutoDefault, Debug)]
pub enum ItemKind {
/// Elemento vacío, no produce salida.
#[default]
@@ -43,7 +43,7 @@ pub enum ItemKind {
///
/// Permite definir el identificador, las clases de estilo adicionales y el tipo de interacción
/// asociada, manteniendo una interfaz común para renderizar todos los elementos del menú.
-#[derive(AutoDefault, Getters)]
+#[derive(AutoDefault, Debug, Getters)]
pub struct Item {
#[getters(skip)]
id: AttrId,
diff --git a/extensions/pagetop-bootsier/src/theme/form/component.rs b/extensions/pagetop-bootsier/src/theme/form/component.rs
index b3a814a1..5212554b 100644
--- a/extensions/pagetop-bootsier/src/theme/form/component.rs
+++ b/extensions/pagetop-bootsier/src/theme/form/component.rs
@@ -27,7 +27,7 @@ use crate::theme::form;
/// .with_classes(ClassesOp::Add, "mb-3")
/// .add_child(Input::new().with_name("q"));
/// ```
-#[derive(AutoDefault, Getters)]
+#[derive(AutoDefault, Debug, Getters)]
pub struct Form {
#[getters(skip)]
id: AttrId,
diff --git a/extensions/pagetop-bootsier/src/theme/form/fieldset.rs b/extensions/pagetop-bootsier/src/theme/form/fieldset.rs
index f731e566..6d6a08cb 100644
--- a/extensions/pagetop-bootsier/src/theme/form/fieldset.rs
+++ b/extensions/pagetop-bootsier/src/theme/form/fieldset.rs
@@ -3,7 +3,7 @@ use pagetop::prelude::*;
/// Agrupa controles relacionados de un formulario (`
`).
///
/// Se usa para mejorar la accesibilidad cuando se acompaña de una leyenda que encabeza el grupo.
-#[derive(AutoDefault, Getters)]
+#[derive(AutoDefault, Debug, Getters)]
pub struct Fieldset {
#[getters(skip)]
id: AttrId,
diff --git a/extensions/pagetop-bootsier/src/theme/form/input.rs b/extensions/pagetop-bootsier/src/theme/form/input.rs
index 019c98c0..bb37681b 100644
--- a/extensions/pagetop-bootsier/src/theme/form/input.rs
+++ b/extensions/pagetop-bootsier/src/theme/form/input.rs
@@ -3,7 +3,7 @@ use pagetop::prelude::*;
use crate::theme::form;
use crate::LOCALES_BOOTSIER;
-#[derive(AutoDefault, Getters)]
+#[derive(AutoDefault, Debug, Getters)]
pub struct Input {
classes: Classes,
input_type: form::InputType,
diff --git a/extensions/pagetop-bootsier/src/theme/icon.rs b/extensions/pagetop-bootsier/src/theme/icon.rs
index dfce3aa9..4a2abde2 100644
--- a/extensions/pagetop-bootsier/src/theme/icon.rs
+++ b/extensions/pagetop-bootsier/src/theme/icon.rs
@@ -13,7 +13,7 @@ pub enum IconKind {
},
}
-#[derive(AutoDefault, Getters)]
+#[derive(AutoDefault, Debug, Getters)]
pub struct Icon {
/// Devuelve las clases CSS asociadas al icono.
classes: Classes,
diff --git a/extensions/pagetop-bootsier/src/theme/image/component.rs b/extensions/pagetop-bootsier/src/theme/image/component.rs
index de2866cc..597446c7 100644
--- a/extensions/pagetop-bootsier/src/theme/image/component.rs
+++ b/extensions/pagetop-bootsier/src/theme/image/component.rs
@@ -9,7 +9,7 @@ use crate::prelude::*;
/// ([`classes::Border`](crate::theme::classes::Border)) y **redondeo de esquinas**
/// ([`classes::Rounded`](crate::theme::classes::Rounded)).
/// - Resuelve el texto alternativo `alt` con **localización** mediante [`L10n`].
-#[derive(AutoDefault, Getters)]
+#[derive(AutoDefault, Debug, Getters)]
pub struct Image {
#[getters(skip)]
id: AttrId,
diff --git a/extensions/pagetop-bootsier/src/theme/nav/component.rs b/extensions/pagetop-bootsier/src/theme/nav/component.rs
index 48cef0a3..d01fd1d7 100644
--- a/extensions/pagetop-bootsier/src/theme/nav/component.rs
+++ b/extensions/pagetop-bootsier/src/theme/nav/component.rs
@@ -10,7 +10,7 @@ use crate::prelude::*;
///
/// Ver ejemplo en el módulo [`nav`].
/// Si no contiene elementos, el componente **no se renderiza**.
-#[derive(AutoDefault, Getters)]
+#[derive(AutoDefault, Debug, Getters)]
pub struct Nav {
#[getters(skip)]
id: AttrId,
diff --git a/extensions/pagetop-bootsier/src/theme/nav/item.rs b/extensions/pagetop-bootsier/src/theme/nav/item.rs
index be9b2932..5db8864e 100644
--- a/extensions/pagetop-bootsier/src/theme/nav/item.rs
+++ b/extensions/pagetop-bootsier/src/theme/nav/item.rs
@@ -10,7 +10,7 @@ use crate::LOCALES_BOOTSIER;
///
/// Define internamente la naturaleza del elemento y su comportamiento al mostrarse o interactuar
/// con él.
-#[derive(AutoDefault)]
+#[derive(AutoDefault, Debug)]
pub enum ItemKind {
/// Elemento vacío, no produce salida.
#[default]
@@ -76,7 +76,7 @@ impl ItemKind {
///
/// Permite definir el identificador, las clases de estilo adicionales y el tipo de interacción
/// asociada, manteniendo una interfaz común para renderizar todos los elementos del menú.
-#[derive(AutoDefault, Getters)]
+#[derive(AutoDefault, Debug, Getters)]
pub struct Item {
#[getters(skip)]
id: AttrId,
diff --git a/extensions/pagetop-bootsier/src/theme/navbar/brand.rs b/extensions/pagetop-bootsier/src/theme/navbar/brand.rs
index 15a7c57f..7dd43ef5 100644
--- a/extensions/pagetop-bootsier/src/theme/navbar/brand.rs
+++ b/extensions/pagetop-bootsier/src/theme/navbar/brand.rs
@@ -11,7 +11,7 @@ use crate::prelude::*;
/// - Si no hay imagen ([`with_image()`](Self::with_image)) ni título
/// ([`with_title()`](Self::with_title)), la marca de identidad no se renderiza.
/// - El eslogan ([`with_slogan()`](Self::with_slogan)) es opcional; por defecto no tiene contenido.
-#[derive(AutoDefault, Getters)]
+#[derive(AutoDefault, Debug, Getters)]
pub struct Brand {
#[getters(skip)]
id: AttrId,
diff --git a/extensions/pagetop-bootsier/src/theme/navbar/component.rs b/extensions/pagetop-bootsier/src/theme/navbar/component.rs
index 36ce7961..7b56f2a2 100644
--- a/extensions/pagetop-bootsier/src/theme/navbar/component.rs
+++ b/extensions/pagetop-bootsier/src/theme/navbar/component.rs
@@ -14,7 +14,7 @@ const TOGGLE_OFFCANVAS: &str = "offcanvas";
///
/// Ver ejemplos en el módulo [`navbar`].
/// Si no contiene elementos, el componente **no se renderiza**.
-#[derive(AutoDefault, Getters)]
+#[derive(AutoDefault, Debug, Getters)]
pub struct Navbar {
#[getters(skip)]
id: AttrId,
diff --git a/extensions/pagetop-bootsier/src/theme/navbar/item.rs b/extensions/pagetop-bootsier/src/theme/navbar/item.rs
index 89b7c45e..25ad3a0e 100644
--- a/extensions/pagetop-bootsier/src/theme/navbar/item.rs
+++ b/extensions/pagetop-bootsier/src/theme/navbar/item.rs
@@ -7,7 +7,7 @@ use crate::prelude::*;
/// Cada variante determina qué se renderiza y cómo. Estos elementos se colocan **dentro del
/// contenido** de la barra (la parte colapsable, el *offcanvas* o el bloque simple), por lo que son
/// independientes de la marca o del botón que ya pueda definir el propio [`navbar::Layout`].
-#[derive(AutoDefault)]
+#[derive(AutoDefault, Debug)]
pub enum Item {
/// Sin contenido, no produce salida.
#[default]
diff --git a/extensions/pagetop-bootsier/src/theme/navbar/props.rs b/extensions/pagetop-bootsier/src/theme/navbar/props.rs
index 59189946..1d88aab7 100644
--- a/extensions/pagetop-bootsier/src/theme/navbar/props.rs
+++ b/extensions/pagetop-bootsier/src/theme/navbar/props.rs
@@ -5,7 +5,7 @@ use crate::prelude::*;
// **< Layout >*************************************************************************************
/// Representa los diferentes tipos de presentación de una barra de navegación [`Navbar`].
-#[derive(AutoDefault)]
+#[derive(AutoDefault, Debug)]
pub enum Layout {
/// Barra simple, sin marca de identidad y sin botón de despliegue.
///
diff --git a/extensions/pagetop-bootsier/src/theme/offcanvas/component.rs b/extensions/pagetop-bootsier/src/theme/offcanvas/component.rs
index 2e35f96d..ee175547 100644
--- a/extensions/pagetop-bootsier/src/theme/offcanvas/component.rs
+++ b/extensions/pagetop-bootsier/src/theme/offcanvas/component.rs
@@ -21,7 +21,7 @@ use crate::LOCALES_BOOTSIER;
///
/// Ver ejemplo en el módulo [`offcanvas`].
/// Si no contiene elementos, el componente **no se renderiza**.
-#[derive(AutoDefault, Getters)]
+#[derive(AutoDefault, Debug, Getters)]
pub struct Offcanvas {
#[getters(skip)]
id: AttrId,
diff --git a/src/base/component/block.rs b/src/base/component/block.rs
index c10c6fa2..1e075e2e 100644
--- a/src/base/component/block.rs
+++ b/src/base/component/block.rs
@@ -4,7 +4,7 @@ use crate::prelude::*;
///
/// Los bloques se utilizan como contenedores de otros componentes o contenidos, con un título
/// opcional y un cuerpo que sólo se renderiza si existen componentes hijos (*children*).
-#[derive(AutoDefault, Getters)]
+#[derive(AutoDefault, Debug, Getters)]
pub struct Block {
#[getters(skip)]
id: AttrId,
diff --git a/src/base/component/html.rs b/src/base/component/html.rs
index 58d16857..ac0edb2f 100644
--- a/src/base/component/html.rs
+++ b/src/base/component/html.rs
@@ -1,5 +1,7 @@
use crate::prelude::*;
+use std::fmt;
+
/// Componente básico que renderiza dinámicamente código HTML según el contexto.
///
/// Este componente permite generar contenido HTML arbitrario, usando la macro `html!` y accediendo
@@ -31,6 +33,14 @@ use crate::prelude::*;
/// ```
pub struct Html(Box Markup + Send + Sync>);
+impl fmt::Debug for Html {
+ fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
+ f.debug_tuple("Html")
+ .field(&"Fn(&mut Context) -> Markup")
+ .finish()
+ }
+}
+
impl Default for Html {
fn default() -> Self {
Self::with(|_| html! {})
diff --git a/src/base/component/intro.rs b/src/base/component/intro.rs
index fd68d2bc..378ca42a 100644
--- a/src/base/component/intro.rs
+++ b/src/base/component/intro.rs
@@ -76,7 +76,7 @@ pub enum IntroOpening {
/// })),
/// );
/// ```
-#[derive(Getters)]
+#[derive(Debug, Getters)]
pub struct Intro {
/// Devuelve el título de entrada.
title: L10n,
diff --git a/src/base/component/poweredby.rs b/src/base/component/poweredby.rs
index 61f7ab84..b9ffe61f 100644
--- a/src/base/component/poweredby.rs
+++ b/src/base/component/poweredby.rs
@@ -8,7 +8,7 @@ const LINK: &str = ",
diff --git a/src/core/component/children.rs b/src/core/component/children.rs
index 1c424870..7aa9b053 100644
--- a/src/core/component/children.rs
+++ b/src/core/component/children.rs
@@ -7,6 +7,7 @@ use parking_lot::RwLock;
pub use parking_lot::RwLockReadGuard as ComponentReadGuard;
pub use parking_lot::RwLockWriteGuard as ComponentWriteGuard;
+use std::fmt;
use std::sync::Arc;
use std::vec::IntoIter;
@@ -17,6 +18,15 @@ use std::vec::IntoIter;
#[derive(AutoDefault, Clone)]
pub struct Child(Option>>);
+impl fmt::Debug for Child {
+ fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
+ match &self.0 {
+ None => write!(f, "Child(None)"),
+ Some(c) => write!(f, "Child({})", c.read().name()),
+ }
+ }
+}
+
impl Child {
/// Crea un nuevo `Child` a partir de un componente.
pub fn with(component: impl Component) -> Self {
@@ -71,6 +81,15 @@ impl Child {
#[derive(AutoDefault, Clone)]
pub struct Typed(Option>>);
+impl fmt::Debug for Typed {
+ fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
+ match &self.0 {
+ None => write!(f, "Typed(None)"),
+ Some(c) => write!(f, "Typed({})", c.read().name()),
+ }
+ }
+}
+
impl Typed {
/// Crea un nuevo `Typed` a partir de un componente.
pub fn with(component: C) -> Self {
@@ -202,7 +221,7 @@ pub enum TypedOp {
/// Esta lista permite añadir, modificar, renderizar y consultar componentes hijo en orden de
/// inserción, soportando operaciones avanzadas como inserción relativa o reemplazo por
/// identificador.
-#[derive(AutoDefault, Clone)]
+#[derive(AutoDefault, Clone, Debug)]
pub struct Children(Vec);
impl Children {
diff --git a/src/locale/l10n.rs b/src/locale/l10n.rs
index 7b096d9f..af5e9535 100644
--- a/src/locale/l10n.rs
+++ b/src/locale/l10n.rs
@@ -62,6 +62,17 @@ pub struct L10n {
args: Vec<(CowStr, CowStr)>,
}
+impl fmt::Debug for L10n {
+ fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
+ f.debug_struct("L10n")
+ .field("op", &self.op)
+ .field("args", &self.args)
+ // No se puede mostrar `locales`; se representa con un texto fijo.
+ .field("locales", &"")
+ .finish()
+ }
+}
+
impl L10n {
/// **n** = *“native”*. Crea una instancia con una cadena literal sin traducción.
pub fn n(text: impl Into) -> Self {
@@ -177,14 +188,3 @@ impl L10n {
PreEscaped(self.lookup(language).unwrap_or_default())
}
}
-
-impl fmt::Debug for L10n {
- fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
- f.debug_struct("L10n")
- .field("op", &self.op)
- .field("args", &self.args)
- // No se puede mostrar `locales`; se representa con un texto fijo.
- .field("locales", &"")
- .finish()
- }
-}