- 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.
119 lines
3.9 KiB
Rust
119 lines
3.9 KiB
Rust
use pagetop::prelude::*;
|
|
|
|
// **< Backdrop >***********************************************************************************
|
|
|
|
/// Comportamiento de la capa de fondo (*backdrop*) de un panel
|
|
/// [`Offcanvas`](crate::theme::Offcanvas) al deslizarse.
|
|
#[derive(AutoDefault, Clone, Copy, Debug, PartialEq)]
|
|
pub enum Backdrop {
|
|
/// Sin capa de fondo, la página principal permanece visible e interactiva.
|
|
Disabled,
|
|
/// Opción por defecto, se oscurece el fondo; un clic fuera del panel suele cerrarlo.
|
|
#[default]
|
|
Enabled,
|
|
/// Muestra la capa de fondo pero no se cierra al hacer clic fuera del panel. Útil si se
|
|
/// requiere completar una acción antes de salir.
|
|
Static,
|
|
}
|
|
|
|
// **< BodyScroll >*********************************************************************************
|
|
|
|
/// Controla si la página principal puede desplazarse al abrir un panel
|
|
/// [`Offcanvas`](crate::theme::Offcanvas).
|
|
#[derive(AutoDefault, Clone, Copy, Debug, PartialEq)]
|
|
pub enum BodyScroll {
|
|
/// Opción por defecto, la página principal se bloquea centrando la interacción en el panel.
|
|
#[default]
|
|
Disabled,
|
|
/// Permite el desplazamiento de la página principal.
|
|
Enabled,
|
|
}
|
|
|
|
// **< Placement >**********************************************************************************
|
|
|
|
/// Posición de aparición de un panel [`Offcanvas`](crate::theme::Offcanvas) al deslizarse.
|
|
///
|
|
/// Define desde qué borde de la ventana entra y se ancla el panel.
|
|
#[derive(AutoDefault, Clone, Copy, Debug, PartialEq)]
|
|
pub enum Placement {
|
|
/// Opción por defecto, desde el borde inicial según dirección de lectura (respetando LTR/RTL).
|
|
#[default]
|
|
Start,
|
|
/// Desde el borde final según dirección de lectura (respetando LTR/RTL).
|
|
End,
|
|
/// Desde la parte superior.
|
|
Top,
|
|
/// Desde la parte inferior.
|
|
Bottom,
|
|
}
|
|
|
|
impl Placement {
|
|
// Devuelve la clase base asociada a la posición de aparición del panel.
|
|
#[rustfmt::skip]
|
|
#[inline]
|
|
const fn as_str(self) -> &'static str {
|
|
match self {
|
|
Placement::Start => "offcanvas-start",
|
|
Placement::End => "offcanvas-end",
|
|
Placement::Top => "offcanvas-top",
|
|
Placement::Bottom => "offcanvas-bottom",
|
|
}
|
|
}
|
|
|
|
// Añade la clase asociada a la posición de aparición del panel a la cadena de clases.
|
|
#[inline]
|
|
pub(crate) fn push_class(self, classes: &mut String) {
|
|
if !classes.is_empty() {
|
|
classes.push(' ');
|
|
}
|
|
classes.push_str(self.as_str());
|
|
}
|
|
|
|
/* Devuelve la clase asociada a la posición de aparición del panel (reservado).
|
|
#[inline]
|
|
pub(crate) fn to_class(self) -> String {
|
|
self.as_str().to_owned()
|
|
} */
|
|
}
|
|
|
|
// **< Visibility >*********************************************************************************
|
|
|
|
/// Estado inicial de un panel [`Offcanvas`](crate::theme::Offcanvas).
|
|
#[derive(AutoDefault, Clone, Copy, Debug, PartialEq)]
|
|
pub enum Visibility {
|
|
/// El panel permanece oculto desde el principio.
|
|
#[default]
|
|
Default,
|
|
/// El panel se muestra abierto al cargar.
|
|
Show,
|
|
}
|
|
|
|
impl Visibility {
|
|
// Devuelve la clase base asociada al estado inicial del panel.
|
|
#[inline]
|
|
const fn as_str(self) -> &'static str {
|
|
match self {
|
|
Visibility::Default => "",
|
|
Visibility::Show => "show",
|
|
}
|
|
}
|
|
|
|
// Añade la clase asociada al estado inicial del panel a la cadena de clases.
|
|
#[inline]
|
|
pub(crate) fn push_class(self, classes: &mut String) {
|
|
let class = self.as_str();
|
|
if class.is_empty() {
|
|
return;
|
|
}
|
|
if !classes.is_empty() {
|
|
classes.push(' ');
|
|
}
|
|
classes.push_str(class);
|
|
}
|
|
|
|
/* Devuelve la clase asociada al estado inicial, o una cadena vacía si no aplica (reservado).
|
|
#[inline]
|
|
pub(crate) fn to_class(self) -> String {
|
|
self.as_str().to_owned()
|
|
} */
|
|
}
|