- 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.
120 lines
3.7 KiB
Rust
120 lines
3.7 KiB
Rust
use pagetop::prelude::*;
|
|
|
|
// **< Kind >***************************************************************************************
|
|
|
|
/// Define la variante de presentación de un menú [`Nav`](crate::theme::Nav).
|
|
#[derive(AutoDefault, Clone, Copy, Debug, PartialEq)]
|
|
pub enum Kind {
|
|
/// Estilo por defecto, lista de enlaces flexible y minimalista.
|
|
#[default]
|
|
Default,
|
|
/// Pestañas con borde para cambiar entre secciones.
|
|
Tabs,
|
|
/// Botones con fondo que resaltan el elemento activo.
|
|
Pills,
|
|
/// Variante con subrayado del elemento activo, estética ligera.
|
|
Underline,
|
|
}
|
|
|
|
impl Kind {
|
|
const TABS: &str = "nav-tabs";
|
|
const PILLS: &str = "nav-pills";
|
|
const UNDERLINE: &str = "nav-underline";
|
|
|
|
// Devuelve la clase base asociada al tipo de menú, o una cadena vacía si no aplica.
|
|
#[rustfmt::skip]
|
|
#[inline]
|
|
const fn as_str(self) -> &'static str {
|
|
match self {
|
|
Self::Default => "",
|
|
Self::Tabs => Self::TABS,
|
|
Self::Pills => Self::PILLS,
|
|
Self::Underline => Self::UNDERLINE,
|
|
}
|
|
}
|
|
|
|
// Añade la clase asociada al tipo de menú 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 tipo de menú, o una cadena vacía si no aplica (reservado).
|
|
#[inline]
|
|
pub(crate) fn to_class(self) -> String {
|
|
self.as_str().to_owned()
|
|
} */
|
|
}
|
|
|
|
// **< Layout >*************************************************************************************
|
|
|
|
/// Distribución y orientación de un menú [`Nav`](crate::theme::Nav).
|
|
#[derive(AutoDefault, Clone, Copy, Debug, PartialEq)]
|
|
pub enum Layout {
|
|
/// Comportamiento por defecto, ancho definido por el contenido y sin alineación forzada.
|
|
#[default]
|
|
Default,
|
|
/// Alinea los elementos al inicio de la fila.
|
|
Start,
|
|
/// Centra horizontalmente los elementos.
|
|
Center,
|
|
/// Alinea los elementos al final de la fila.
|
|
End,
|
|
/// Apila los elementos en columna.
|
|
Vertical,
|
|
/// Los elementos se expanden para rellenar la fila.
|
|
Fill,
|
|
/// Todos los elementos ocupan el mismo ancho rellenando la fila.
|
|
Justified,
|
|
}
|
|
|
|
impl Layout {
|
|
const START: &str = "justify-content-start";
|
|
const CENTER: &str = "justify-content-center";
|
|
const END: &str = "justify-content-end";
|
|
const VERTICAL: &str = "flex-column";
|
|
const FILL: &str = "nav-fill";
|
|
const JUSTIFIED: &str = "nav-justified";
|
|
|
|
// Devuelve la clase base asociada a la distribución y orientación del menú.
|
|
#[rustfmt::skip]
|
|
#[inline]
|
|
const fn as_str(self) -> &'static str {
|
|
match self {
|
|
Self::Default => "",
|
|
Self::Start => Self::START,
|
|
Self::Center => Self::CENTER,
|
|
Self::End => Self::END,
|
|
Self::Vertical => Self::VERTICAL,
|
|
Self::Fill => Self::FILL,
|
|
Self::Justified => Self::JUSTIFIED,
|
|
}
|
|
}
|
|
|
|
// Añade la clase asociada a la distribución y orientación del menú 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 a la distribución y orientación del menú, o una cadena vacía si no
|
|
// aplica (reservado).
|
|
#[inline]
|
|
pub(crate) fn to_class(self) -> String {
|
|
self.as_str().to_owned()
|
|
} */
|
|
}
|