♻️ (bootsier): Refactoriza y renombra estilos aux

This commit is contained in:
Manuel Cillero 2025-11-03 22:43:31 +01:00
parent 9a26d579ed
commit d5f0d83939
10 changed files with 267 additions and 223 deletions

View file

@ -6,7 +6,7 @@ use std::fmt;
// **< BorderSize >*********************************************************************************
/// Tamaño (**ancho**) para los bordes ([`Border`]).
/// Tamaño para el ancho de los bordes ([`Border`]).
///
/// Mapea a `border`, `border-0` y `border-{1..5}`:
///
@ -58,7 +58,7 @@ impl fmt::Display for BorderSize {
/// - Definir un tamaño **global** para todo el borde (`size`).
/// - Ajustar el tamaño de cada **lado lógico** (`top`, `end`, `bottom`, `start`, **en este orden**,
/// respetando LTR/RTL).
/// - Aplicar un **color** al borde (`BorderColor`).
/// - Aplicar un **color** al borde (`ColorBorder`).
/// - Aplicar un nivel de **opacidad** (`BorderOpacity`).
///
/// # Comportamiento aditivo / sustractivo
@ -107,21 +107,19 @@ impl fmt::Display for BorderSize {
/// let b = Border::with(BorderSize::Default) // Borde global por defecto.
/// .with_top(BorderSize::Zero) // Quita borde superior.
/// .with_end(BorderSize::Scale3) // Ancho 3 para el lado lógico final.
/// .with_color(BorderColor::Theme(Color::Primary))
/// .with_opacity(BorderOpacity::Theme(Opacity::Half));
/// .with_style(StyleBorder::Both(ColorBorder::Theme(Color::Primary), Opacity::Half));
///
/// assert_eq!(b.to_string(), "border border-top-0 border-end-3 border-primary border-opacity-50");
/// ```
#[rustfmt::skip]
#[derive(AutoDefault)]
pub struct Border {
size : BorderSize,
top : BorderSize,
end : BorderSize,
bottom : BorderSize,
start : BorderSize,
color : BorderColor,
opacity: BorderOpacity,
size : BorderSize,
top : BorderSize,
end : BorderSize,
bottom: BorderSize,
start : BorderSize,
style : StyleBorder,
}
impl Border {
@ -167,22 +165,16 @@ impl Border {
self
}
/// Establece el **color** del borde.
pub fn with_color(mut self, color: BorderColor) -> Self {
self.color = color;
self
}
/// Establece la **opacidad** del borde.
pub fn with_opacity(mut self, opacity: BorderOpacity) -> Self {
self.opacity = opacity;
/// Establece el estilo de color/opacidad del borde.
pub fn with_style(mut self, style: StyleBorder) -> Self {
self.style = style;
self
}
}
impl fmt::Display for Border {
/// Concatena cada definición en el orden: *global*, `top`, `end`, `bottom`, `start`, *color* y
/// *opacidad*; respetando LTR/RTL y omitiendo las definiciones vacías.
/// Concatena cada definición en el orden: *global*, `top`, `end`, `bottom`, `start` y
/// *color*/*opacidad*; respetando LTR/RTL y omitiendo las definiciones vacías.
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
write!(
f,
@ -193,8 +185,7 @@ impl fmt::Display for Border {
self.end.to_class("border-end"),
self.bottom.to_class("border-bottom"),
self.start.to_class("border-start"),
self.color.to_string(),
self.opacity.to_string(),
self.style.to_string(),
]; " ")
.unwrap_or_default()
)

View file

@ -4,11 +4,11 @@ use std::fmt;
// **< Color >**************************************************************************************
/// Paleta de colores **temáticos**.
/// Paleta de colores temáticos.
///
/// Equivalente a los nombres estándar de Bootstrap (`primary`, `secondary`, `success`, etc.). Sirve
/// como base para componer clases de fondo ([`BgColor`]), borde ([`BorderColor`]) y texto
/// ([`TextColor`]).
/// Equivalen a los nombres estándar definidos por Bootstrap (`primary`, `secondary`, `success`,
/// etc.). Este tipo enumerado sirve de base para componer clases de color para el fondo
/// ([`ColorBg`]), bordes ([`ColorBorder`]) y texto ([`ColorText`]).
#[derive(AutoDefault)]
pub enum Color {
#[default]
@ -38,32 +38,34 @@ impl fmt::Display for Color {
}
}
// **< BgColor >************************************************************************************
// **< ColorBg >************************************************************************************
/// Colores de fondo (`bg-*`).
///
/// - `Default` no añade clase (devuelve `""` para facilitar la composición de clases).
/// - `Body*` usa fondos predefinidos del tema (`bg-body`, `bg-body-secondary`, `bg-body-tertiary`).
/// - `Theme(Color)` genera `bg-{color}` (p. ej., `bg-primary`).
/// - `Subtle(Color)` genera `bg-{color}-subtle` (tono suave).
/// - `Black` y `White` son colores explícitos.
/// - `Transparent` no aplica color de fondo (`bg-transparent`).
/// Colores `bg-*` para el fondo.
#[derive(AutoDefault)]
pub enum BgColor {
pub enum ColorBg {
/// No define ninguna clase (devuelve `""` para facilitar la composición de clases).
#[default]
Default,
/// Fondo predefinido del tema (`bg-body`).
Body,
/// Fondo predefinido del tema (`bg-body-secondary`).
BodySecondary,
/// Fondo predefinido del tema (`bg-body-tertiary`).
BodyTertiary,
/// Genera internamente clases `bg-{color}` (p. ej., `bg-primary`).
Theme(Color),
/// Genera internamente clases `bg-{color}-subtle` (un tono suavizado del color).
Subtle(Color),
/// Color negro.
Black,
/// Color blanco.
White,
/// No aplica ningún color de fondo (`bg-transparent`).
Transparent,
}
#[rustfmt::skip]
impl fmt::Display for BgColor {
impl fmt::Display for ColorBg {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
match self {
Self::Default => Ok(()),
@ -79,26 +81,26 @@ impl fmt::Display for BgColor {
}
}
// **< BorderColor >********************************************************************************
// **< ColorBorder >********************************************************************************
/// Colores (`border-*`) para los bordes ([`Border`](crate::theme::aux::Border)).
///
/// - `Default` no añade clase (devuelve `""` para facilitar la composición de clases).
/// - `Theme(Color)` genera `border-{color}`.
/// - `Subtle(Color)` genera `border-{color}-subtle` (versión suavizada).
/// - `Black` y `White` son colores explícitos.
/// Colores `border-*` para los bordes ([`Border`](crate::theme::aux::Border)).
#[derive(AutoDefault)]
pub enum BorderColor {
pub enum ColorBorder {
/// No define ninguna clase (devuelve `""` para facilitar la composición de clases).
#[default]
Default,
/// Genera internamente clases `border-{color}`.
Theme(Color),
/// Genera internamente clases `border-{color}-subtle` (un tono suavizado del color).
Subtle(Color),
/// Color negro.
Black,
/// Color blanco.
White,
}
#[rustfmt::skip]
impl fmt::Display for BorderColor {
impl fmt::Display for ColorBorder {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
match self {
Self::Default => Ok(()),
@ -110,25 +112,24 @@ impl fmt::Display for BorderColor {
}
}
// **< ButtonColor >********************************************************************************
// **< ColorButton >********************************************************************************
/// Variantes de color (`btn-*`) para **botones**.
///
/// - `Default` no añade clase (devuelve `""` para facilitar la composición de clases).
/// - `Background(Color)` genera `btn-{color}` (botón relleno).
/// - `Outline(Color)` genera `btn-outline-{color}` (contorno: texto y borde, fondo transparente).
/// - `Link` aplica estilo de enlace (`btn-link`), sin caja ni fondo, heredando el color de texto.
/// Variantes de color `btn-*` para botones.
#[derive(AutoDefault)]
pub enum ButtonColor {
pub enum ColorButton {
/// No define ninguna clase (devuelve `""` para facilitar la composición de clases).
#[default]
Default,
/// Genera internamente clases `btn-{color}` (botón relleno).
Background(Color),
/// Genera `btn-outline-{color}` (fondo transparente y contorno con borde).
Outline(Color),
/// Aplica estilo de los enlaces (`btn-link`), sin caja ni fondo, heredando el color de texto.
Link,
}
#[rustfmt::skip]
impl fmt::Display for ButtonColor {
impl fmt::Display for ColorButton {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
match self {
Self::Default => Ok(()),
@ -139,34 +140,34 @@ impl fmt::Display for ButtonColor {
}
}
// **< TextColor >**********************************************************************************
// **< ColorText >**********************************************************************************
/// Colores de texto y fondos de texto (`text-*`).
///
/// - `Default` no añade clase (devuelve `""` para facilitar la composición de clases).
/// - `Body*` aplica colores predefinidos del tema (`text-body`, `text-body-emphasis`,
/// `text-body-secondary`, `text-body-tertiary`).
/// - `Theme(Color)` genera `text-{color}`.
/// - `Emphasis(Color)` genera `text-{color}-emphasis` (contraste mayor acorde al tema).
/// - `Background(Color)` genera `text-bg-{color}` (para color de fondo del texto).
/// - `Black` y `White` son colores explícitos.
/// Colores `text-*` para el texto.
#[derive(AutoDefault)]
pub enum TextColor {
pub enum ColorText {
/// No define ninguna clase (devuelve `""` para facilitar la composición de clases).
#[default]
Default,
/// Color predefinido del tema (`text-body`).
Body,
/// Color predefinido del tema (`text-body-emphasis`).
BodyEmphasis,
/// Color predefinido del tema (`text-body-secondary`).
BodySecondary,
/// Color predefinido del tema (`text-body-tertiary`).
BodyTertiary,
/// Genera internamente clases `text-{color}`.
Theme(Color),
/// Genera internamente clases `text-{color}-emphasis` (mayor contraste acorde al tema).
Emphasis(Color),
Background(Color),
/// Color negro.
Black,
/// Color blanco.
White,
}
#[rustfmt::skip]
impl fmt::Display for TextColor {
impl fmt::Display for ColorText {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
match self {
Self::Default => Ok(()),
@ -176,9 +177,140 @@ impl fmt::Display for TextColor {
Self::BodyTertiary => f.write_str("text-body-tertiary"),
Self::Theme(c) => write!(f, "text-{c}"),
Self::Emphasis(c) => write!(f, "text-{c}-emphasis"),
Self::Background(c) => write!(f, "text-bg-{c}"),
Self::Black => f.write_str("text-black"),
Self::White => f.write_str("text-white"),
}
}
}
// **< Opacity >************************************************************************************
/// Niveles de opacidad (`opacity-*`).
///
/// Se usa normalmente para graduar la transparencia del color de fondo `bg-opacity-*`
/// ([`StyleBg`]), de los bordes `border-opacity-*` ([`StyleBorder`]) o del texto `text-opacity-*`
/// ([`StyleText`]).
#[rustfmt::skip]
#[derive(AutoDefault)]
pub enum Opacity {
/// Genera internamente clases `opacity-100` (100% de opacidad).
#[default]
Opaque,
/// Genera internamente clases `opacity-75` (75%).
SemiOpaque,
/// Genera internamente clases `opacity-50` (50%).
Half,
/// Genera internamente clases `opacity-25` (25%).
SemiTransparent,
/// Genera internamente clases `opacity-10` (10%).
AlmostTransparent,
/// Genera internamente clases `opacity-0` (0%, totalmente transparente).
Transparent,
}
#[rustfmt::skip]
impl fmt::Display for Opacity {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
match self {
Self::Opaque => f.write_str("opacity-100"),
Self::SemiOpaque => f.write_str("opacity-75"),
Self::Half => f.write_str("opacity-50"),
Self::SemiTransparent => f.write_str("opacity-25"),
Self::AlmostTransparent => f.write_str("opacity-10"),
Self::Transparent => f.write_str("opacity-0"),
}
}
}
// **< StyleBg >***********************************************************************************
/// Estilos de color/opacidad para el fondo.
#[derive(AutoDefault)]
pub enum StyleBg {
/// No define ninguna clase (devuelve `""` para facilitar la composición de clases).
#[default]
Default,
/// Genera internamente clases `bg-*`.
Color(ColorBg),
/// Genera internamente clases `bg-opacity-*`.
Opacity(Opacity),
/// Genera internamente clases `bg-* bg-opacity-*`.
Both(ColorBg, Opacity),
}
#[rustfmt::skip]
impl fmt::Display for StyleBg {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
match self {
Self::Default => Ok(()),
Self::Color(c) => write!(f, "{c}"),
Self::Opacity(o) => write!(f, "bg-{o}"),
Self::Both(c, o) => write!(f, "{c} bg-{o}"),
}
}
}
// **< StyleBorder >*******************************************************************************
/// Estilos de color/opacidad para los bordes ([`Border`](crate::theme::aux::Border)).
#[derive(AutoDefault)]
pub enum StyleBorder {
/// No define ninguna clase (devuelve `""` para facilitar la composición de clases).
#[default]
Default,
/// Genera internamente clases `border-*`.
Color(ColorBorder),
/// Genera internamente clases `border-opacity-*`.
Opacity(Opacity),
/// Genera internamente clases `border-* border-opacity-*`.
Both(ColorBorder, Opacity),
}
#[rustfmt::skip]
impl fmt::Display for StyleBorder {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
match self {
Self::Default => Ok(()),
Self::Color(c) => write!(f, "{c}"),
Self::Opacity(o) => write!(f, "border-{o}"),
Self::Both(c, o) => write!(f, "{c} border-{o}"),
}
}
}
// **< StyleText >*********************************************************************************
/// Estilos de color/opacidad para texto y fondo del texto.
#[derive(AutoDefault)]
pub enum StyleText {
/// No define ninguna clase (devuelve `""` para facilitar la composición de clases).
#[default]
Default,
/// Genera internamente clases `text-*`.
Color(ColorText),
/// Genera internamente clases `text-opacity-*`.
Opacity(Opacity),
/// Genera internamente clases `text-* text-opacity-*`.
Both(ColorText, Opacity),
/// Genera internamente clases `text-bg-*` (para el color de fondo del texto).
Bg(Color),
/// Genera internamente clases `text-bg-* text-*`.
BgAndColor(Color, ColorText),
/// Genera internamente clases `text-bg-* text-* text-opacity-*`.
All(Color, ColorText, Opacity),
}
#[rustfmt::skip]
impl fmt::Display for StyleText {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
match self {
Self::Default => Ok(()),
Self::Color(c) => write!(f, "{c}"),
Self::Opacity(o) => write!(f, "text-{o}"),
Self::Both(c, o) => write!(f, "{c} text-{o}"),
Self::Bg(bg) => write!(f, "text-bg-{bg}"),
Self::BgAndColor(bg, c) => write!(f, "text-bg-{bg} {c}"),
Self::All(bg, c, o) => write!(f, "text-bg-{bg} {c} text-{o}"),
}
}
}

View file

@ -1,109 +0,0 @@
use pagetop::prelude::*;
use std::fmt;
// **< Opacity >************************************************************************************
/// Niveles de **opacidad** (`opacity-*`).
///
/// Se usa para modular la transparencia del color de fondo `bg-opacity-*` ([`BgOpacity`]), borde
/// `border-opacity-*` ([`BorderOpacity`]) o texto `text-opacity-*` ([`TextOpacity`]), según las
/// siguientes equivalencias:
///
/// - `Opaque` => `opacity-100` (100% de opacidad).
/// - `SemiOpaque` => `opacity-75` (75%).
/// - `Half` => `opacity-50` (50%).
/// - `SemiTransparent` => `opacity-25` (25%).
/// - `AlmostTransparent` => `opacity-10` (10%).
/// - `Transparent` => `opacity-0` (0%, totalmente transparente).
#[rustfmt::skip]
#[derive(AutoDefault)]
pub enum Opacity {
#[default]
Opaque, // 100%
SemiOpaque, // 75%
Half, // 50%
SemiTransparent, // 25%
AlmostTransparent, // 10%
Transparent, // 0%
}
#[rustfmt::skip]
impl fmt::Display for Opacity {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
match self {
Self::Opaque => f.write_str("opacity-100"),
Self::SemiOpaque => f.write_str("opacity-75"),
Self::Half => f.write_str("opacity-50"),
Self::SemiTransparent => f.write_str("opacity-25"),
Self::AlmostTransparent => f.write_str("opacity-10"),
Self::Transparent => f.write_str("opacity-0"),
}
}
}
// **< BgOpacity >**********************************************************************************
/// Opacidad para el fondo (`bg-opacity-*`).
///
/// - `Default` no añade clase (devuelve `""` para facilitar la composición de clases).
/// - `Theme(Opacity)` genera `bg-{opacity}` (p. ej., `bg-opacity-50`).
#[derive(AutoDefault)]
pub enum BgOpacity {
#[default]
Default,
Theme(Opacity),
}
impl fmt::Display for BgOpacity {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
match self {
Self::Default => Ok(()),
Self::Theme(o) => write!(f, "bg-{o}"),
}
}
}
// **< BorderOpacity >******************************************************************************
/// Opacidad (`border-opacity-*`) para los bordes ([`Border`](crate::theme::aux::Border)).
///
/// - `Default` no añade clase (devuelve `""` para facilitar la composición de clases).
/// - `Theme(Opacity)` genera `border-{opacity}` (p. ej., `border-opacity-25`).
#[derive(AutoDefault)]
pub enum BorderOpacity {
#[default]
Default,
Theme(Opacity),
}
impl fmt::Display for BorderOpacity {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
match self {
Self::Default => Ok(()),
Self::Theme(o) => write!(f, "border-{o}"),
}
}
}
// **< TextOpacity >********************************************************************************
/// Opacidad para el texto (`text-opacity-*`).
///
/// - `Default` no añade clase (devuelve `""` para facilitar la composición de clases).
/// - `Theme(Opacity)` genera `text-{opacity}` (p. ej., `text-opacity-100`).
#[derive(AutoDefault)]
pub enum TextOpacity {
#[default]
Default,
Theme(Opacity),
}
impl fmt::Display for TextOpacity {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
match self {
Self::Default => Ok(()),
Self::Theme(o) => write!(f, "text-{o}"),
}
}
}

View file

@ -4,7 +4,7 @@ use std::fmt;
// **< RoundedRadius >******************************************************************************
/// Radio (**redondeo**) para las esquinas ([`Rounded`]).
/// Radio para el redondeo de esquinas ([`Rounded`]).
///
/// Mapea a `rounded`, `rounded-0`, `rounded-{1..5}`, `rounded-circle` y `rounded-pill`.
///

View file

@ -5,17 +5,14 @@ use std::fmt;
// **< ButtonSize >*********************************************************************************
/// Tamaño visual de un botón.
///
/// Controla la escala del botón según el diseño del tema:
///
/// - `Default`, tamaño por defecto del tema (no añade clase).
/// - `Small`, botón compacto.
/// - `Large`, botón destacado/grande.
#[derive(AutoDefault)]
pub enum ButtonSize {
/// Tamaño por defecto del tema (no añade clase).
#[default]
Default,
/// Botón compacto.
Small,
/// Botón destacado/grande.
Large,
}