♻️ (bootsier): Adapta componentes a nueva API
Sustituye `Classes`/`ClassesOp` por `Props`/`PropsOp` en todos los componentes: campo, *builder* `with_prop()`, `setup()` y `prepare()`.
This commit is contained in:
parent
1bd97d5705
commit
8d0103c257
31 changed files with 218 additions and 220 deletions
|
|
@ -57,7 +57,7 @@ impl BorderColor {
|
||||||
///
|
///
|
||||||
/// # Ejemplos
|
/// # Ejemplos
|
||||||
///
|
///
|
||||||
/// ```rust
|
/// ```rust,no_run
|
||||||
/// # use pagetop_bootsier::theme::*;
|
/// # use pagetop_bootsier::theme::*;
|
||||||
/// assert_eq!(BorderColor::Theme(Color::Primary).to_class(), "border-primary");
|
/// assert_eq!(BorderColor::Theme(Color::Primary).to_class(), "border-primary");
|
||||||
/// assert_eq!(BorderColor::Subtle(Color::Warning).to_class(), "border-warning-subtle");
|
/// assert_eq!(BorderColor::Subtle(Color::Warning).to_class(), "border-warning-subtle");
|
||||||
|
|
|
||||||
|
|
@ -69,7 +69,7 @@ impl BreakPoint {
|
||||||
///
|
///
|
||||||
/// # Ejemplos
|
/// # Ejemplos
|
||||||
///
|
///
|
||||||
/// ```rust
|
/// ```rust,no_run
|
||||||
/// # use pagetop_bootsier::theme::*;
|
/// # use pagetop_bootsier::theme::*;
|
||||||
/// let bp = BreakPoint::MD;
|
/// let bp = BreakPoint::MD;
|
||||||
/// assert_eq!(bp.class_with("col", ""), "col-md");
|
/// assert_eq!(bp.class_with("col", ""), "col-md");
|
||||||
|
|
|
||||||
|
|
@ -75,7 +75,7 @@ impl ButtonColor {
|
||||||
///
|
///
|
||||||
/// # Ejemplos
|
/// # Ejemplos
|
||||||
///
|
///
|
||||||
/// ```rust
|
/// ```rust,no_run
|
||||||
/// # use pagetop_bootsier::theme::*;
|
/// # use pagetop_bootsier::theme::*;
|
||||||
/// assert_eq!(
|
/// assert_eq!(
|
||||||
/// ButtonColor::Background(Color::Primary).to_class(),
|
/// ButtonColor::Background(Color::Primary).to_class(),
|
||||||
|
|
@ -131,7 +131,7 @@ impl ButtonSize {
|
||||||
///
|
///
|
||||||
/// # Ejemplos
|
/// # Ejemplos
|
||||||
///
|
///
|
||||||
/// ```rust
|
/// ```rust,no_run
|
||||||
/// # use pagetop_bootsier::theme::*;
|
/// # use pagetop_bootsier::theme::*;
|
||||||
/// assert_eq!(ButtonSize::Small.to_class(), "btn-sm");
|
/// assert_eq!(ButtonSize::Small.to_class(), "btn-sm");
|
||||||
/// assert_eq!(ButtonSize::Large.to_class(), "btn-lg");
|
/// assert_eq!(ButtonSize::Large.to_class(), "btn-lg");
|
||||||
|
|
|
||||||
|
|
@ -43,7 +43,7 @@ impl Color {
|
||||||
///
|
///
|
||||||
/// # Ejemplos
|
/// # Ejemplos
|
||||||
///
|
///
|
||||||
/// ```rust
|
/// ```rust,no_run
|
||||||
/// # use pagetop_bootsier::theme::*;
|
/// # use pagetop_bootsier::theme::*;
|
||||||
/// assert_eq!(Color::Primary.to_class(), "primary");
|
/// assert_eq!(Color::Primary.to_class(), "primary");
|
||||||
/// assert_eq!(Color::Danger.to_class(), "danger");
|
/// assert_eq!(Color::Danger.to_class(), "danger");
|
||||||
|
|
@ -123,7 +123,7 @@ impl Opacity {
|
||||||
///
|
///
|
||||||
/// # Ejemplos
|
/// # Ejemplos
|
||||||
///
|
///
|
||||||
/// ```rust
|
/// ```rust,no_run
|
||||||
/// # use pagetop_bootsier::theme::*;
|
/// # use pagetop_bootsier::theme::*;
|
||||||
/// assert_eq!(Opacity::Opaque.class_with(""), "opacity-100");
|
/// assert_eq!(Opacity::Opaque.class_with(""), "opacity-100");
|
||||||
/// assert_eq!(Opacity::Half.class_with("bg"), "bg-opacity-50");
|
/// assert_eq!(Opacity::Half.class_with("bg"), "bg-opacity-50");
|
||||||
|
|
@ -155,7 +155,7 @@ impl Opacity {
|
||||||
///
|
///
|
||||||
/// # Ejemplos
|
/// # Ejemplos
|
||||||
///
|
///
|
||||||
/// ```rust
|
/// ```rust,no_run
|
||||||
/// # use pagetop_bootsier::theme::*;
|
/// # use pagetop_bootsier::theme::*;
|
||||||
/// assert_eq!(Opacity::Opaque.to_class(), "opacity-100");
|
/// assert_eq!(Opacity::Opaque.to_class(), "opacity-100");
|
||||||
/// assert_eq!(Opacity::Half.to_class(), "opacity-50");
|
/// assert_eq!(Opacity::Half.to_class(), "opacity-50");
|
||||||
|
|
@ -236,7 +236,7 @@ impl ColorBg {
|
||||||
///
|
///
|
||||||
/// # Ejemplos
|
/// # Ejemplos
|
||||||
///
|
///
|
||||||
/// ```rust
|
/// ```rust,no_run
|
||||||
/// # use pagetop_bootsier::theme::*;
|
/// # use pagetop_bootsier::theme::*;
|
||||||
/// assert_eq!(ColorBg::Body.to_class(), "bg-body");
|
/// assert_eq!(ColorBg::Body.to_class(), "bg-body");
|
||||||
/// assert_eq!(ColorBg::Theme(Color::Primary).to_class(), "bg-primary");
|
/// assert_eq!(ColorBg::Theme(Color::Primary).to_class(), "bg-primary");
|
||||||
|
|
@ -320,7 +320,7 @@ impl ColorText {
|
||||||
///
|
///
|
||||||
/// # Ejemplos
|
/// # Ejemplos
|
||||||
///
|
///
|
||||||
/// ```rust
|
/// ```rust,no_run
|
||||||
/// # use pagetop_bootsier::theme::*;
|
/// # use pagetop_bootsier::theme::*;
|
||||||
/// assert_eq!(ColorText::Body.to_class(), "text-body");
|
/// assert_eq!(ColorText::Body.to_class(), "text-body");
|
||||||
/// assert_eq!(ColorText::Theme(Color::Primary).to_class(), "text-primary");
|
/// assert_eq!(ColorText::Theme(Color::Primary).to_class(), "text-primary");
|
||||||
|
|
|
||||||
|
|
@ -60,7 +60,7 @@ impl ScaleSize {
|
||||||
///
|
///
|
||||||
/// # Ejemplo
|
/// # Ejemplo
|
||||||
///
|
///
|
||||||
/// ```rust
|
/// ```rust,no_run
|
||||||
/// # use pagetop_bootsier::theme::*;
|
/// # use pagetop_bootsier::theme::*;
|
||||||
/// assert_eq!(ScaleSize::Auto.class_with("border"), "border");
|
/// assert_eq!(ScaleSize::Auto.class_with("border"), "border");
|
||||||
/// assert_eq!(ScaleSize::Zero.class_with("m"), "m-0");
|
/// assert_eq!(ScaleSize::Zero.class_with("m"), "m-0");
|
||||||
|
|
|
||||||
|
|
@ -70,7 +70,7 @@ impl RoundedRadius {
|
||||||
///
|
///
|
||||||
/// # Ejemplos
|
/// # Ejemplos
|
||||||
///
|
///
|
||||||
/// ```rust
|
/// ```rust,no_run
|
||||||
/// # use pagetop_bootsier::theme::*;
|
/// # use pagetop_bootsier::theme::*;
|
||||||
/// assert_eq!(RoundedRadius::Scale2.class_with(""), "rounded-2");
|
/// assert_eq!(RoundedRadius::Scale2.class_with(""), "rounded-2");
|
||||||
/// assert_eq!(RoundedRadius::Zero.class_with("rounded-top"), "rounded-top-0");
|
/// assert_eq!(RoundedRadius::Zero.class_with("rounded-top"), "rounded-top-0");
|
||||||
|
|
@ -102,7 +102,7 @@ impl RoundedRadius {
|
||||||
///
|
///
|
||||||
/// # Ejemplos
|
/// # Ejemplos
|
||||||
///
|
///
|
||||||
/// ```rust
|
/// ```rust,no_run
|
||||||
/// # use pagetop_bootsier::theme::*;
|
/// # use pagetop_bootsier::theme::*;
|
||||||
/// assert_eq!(RoundedRadius::Default.to_class(), "rounded");
|
/// assert_eq!(RoundedRadius::Default.to_class(), "rounded");
|
||||||
/// assert_eq!(RoundedRadius::Zero.to_class(), "rounded-0");
|
/// assert_eq!(RoundedRadius::Zero.to_class(), "rounded-0");
|
||||||
|
|
|
||||||
|
|
@ -18,7 +18,7 @@ use crate::theme::{ButtonAction, ButtonColor, ButtonSize};
|
||||||
///
|
///
|
||||||
/// # Ejemplo
|
/// # Ejemplo
|
||||||
///
|
///
|
||||||
/// ```rust
|
/// ```rust,no_run
|
||||||
/// use pagetop::prelude::*;
|
/// use pagetop::prelude::*;
|
||||||
/// use pagetop_bootsier::theme::*;
|
/// use pagetop_bootsier::theme::*;
|
||||||
///
|
///
|
||||||
|
|
@ -47,8 +47,8 @@ use crate::theme::{ButtonAction, ButtonColor, ButtonSize};
|
||||||
pub struct Button {
|
pub struct Button {
|
||||||
#[getters(skip)]
|
#[getters(skip)]
|
||||||
id: AttrId,
|
id: AttrId,
|
||||||
/// Devuelve las clases CSS del botón.
|
/// Devuelve los atributos HTML y clases CSS del botón.
|
||||||
classes: Classes,
|
props: Props,
|
||||||
/// Devuelve el comportamiento del botón al activarse.
|
/// Devuelve el comportamiento del botón al activarse.
|
||||||
kind: ButtonAction,
|
kind: ButtonAction,
|
||||||
/// Devuelve el esquema de color del botón.
|
/// Devuelve el esquema de color del botón.
|
||||||
|
|
@ -80,7 +80,7 @@ impl Component for Button {
|
||||||
let mut classes = "btn".to_string();
|
let mut classes = "btn".to_string();
|
||||||
(*self.color()).push_class(&mut classes);
|
(*self.color()).push_class(&mut classes);
|
||||||
(*self.size()).push_class(&mut classes);
|
(*self.size()).push_class(&mut classes);
|
||||||
self.alter_classes(ClassesOp::Prepend, classes);
|
self.alter_prop(PropsOp::prepend_classes(classes));
|
||||||
}
|
}
|
||||||
|
|
||||||
fn prepare(&self, cx: &mut Context) -> Result<Markup, ComponentError> {
|
fn prepare(&self, cx: &mut Context) -> Result<Markup, ComponentError> {
|
||||||
|
|
@ -88,7 +88,7 @@ impl Component for Button {
|
||||||
button
|
button
|
||||||
id=[self.id()]
|
id=[self.id()]
|
||||||
type=(self.kind())
|
type=(self.kind())
|
||||||
class=[self.classes().get()]
|
(self.props())
|
||||||
name=[self.name().get()]
|
name=[self.name().get()]
|
||||||
value=[self.value().get()]
|
value=[self.value().get()]
|
||||||
autofocus[*self.autofocus()]
|
autofocus[*self.autofocus()]
|
||||||
|
|
@ -147,10 +147,10 @@ impl Button {
|
||||||
self
|
self
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Modifica la lista de clases CSS aplicadas al botón.
|
/// Modifica los atributos HTML o las clases CSS del botón.
|
||||||
#[builder_fn]
|
#[builder_fn]
|
||||||
pub fn with_classes(mut self, op: ClassesOp, classes: impl AsRef<str>) -> Self {
|
pub fn with_prop(mut self, op: PropsOp) -> Self {
|
||||||
self.classes.alter_classes(op, classes);
|
self.props.alter_prop(op);
|
||||||
self
|
self
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -26,7 +26,7 @@ use crate::theme::attrs::{BorderColor, Opacity, ScaleSize, Side};
|
||||||
///
|
///
|
||||||
/// # Ejemplos
|
/// # Ejemplos
|
||||||
///
|
///
|
||||||
/// ```rust
|
/// ```rust,no_run
|
||||||
/// use pagetop_bootsier::theme::*;
|
/// use pagetop_bootsier::theme::*;
|
||||||
///
|
///
|
||||||
/// // Borde global.
|
/// // Borde global.
|
||||||
|
|
@ -145,7 +145,7 @@ impl Border {
|
||||||
///
|
///
|
||||||
/// # Ejemplos
|
/// # Ejemplos
|
||||||
///
|
///
|
||||||
/// ```rust
|
/// ```rust,no_run
|
||||||
/// # use pagetop_bootsier::theme::*;
|
/// # use pagetop_bootsier::theme::*;
|
||||||
/// // Convertir explícitamente con `From::from`:
|
/// // Convertir explícitamente con `From::from`:
|
||||||
/// let b = classes::Border::from(ScaleSize::Two);
|
/// let b = classes::Border::from(ScaleSize::Two);
|
||||||
|
|
|
||||||
|
|
@ -9,7 +9,7 @@ use crate::theme::attrs::{ScaleSize, Side};
|
||||||
///
|
///
|
||||||
/// # Ejemplos
|
/// # Ejemplos
|
||||||
///
|
///
|
||||||
/// ```rust
|
/// ```rust,no_run
|
||||||
/// use pagetop_bootsier::theme::*;
|
/// use pagetop_bootsier::theme::*;
|
||||||
///
|
///
|
||||||
/// let m = classes::Margin::with(Side::Top, ScaleSize::Three);
|
/// let m = classes::Margin::with(Side::Top, ScaleSize::Three);
|
||||||
|
|
@ -97,7 +97,7 @@ impl Margin {
|
||||||
///
|
///
|
||||||
/// # Ejemplos
|
/// # Ejemplos
|
||||||
///
|
///
|
||||||
/// ```rust
|
/// ```rust,no_run
|
||||||
/// use pagetop_bootsier::theme::*;
|
/// use pagetop_bootsier::theme::*;
|
||||||
///
|
///
|
||||||
/// let p = classes::Padding::with(Side::LeftAndRight, ScaleSize::Two);
|
/// let p = classes::Padding::with(Side::LeftAndRight, ScaleSize::Two);
|
||||||
|
|
|
||||||
|
|
@ -14,7 +14,7 @@ use crate::theme::attrs::RoundedRadius;
|
||||||
///
|
///
|
||||||
/// # Ejemplos
|
/// # Ejemplos
|
||||||
///
|
///
|
||||||
/// ```rust
|
/// ```rust,no_run
|
||||||
/// use pagetop_bootsier::theme::*;
|
/// use pagetop_bootsier::theme::*;
|
||||||
///
|
///
|
||||||
/// // Radio global:
|
/// // Radio global:
|
||||||
|
|
|
||||||
|
|
@ -11,7 +11,7 @@ use crate::theme::*;
|
||||||
///
|
///
|
||||||
/// # Ejemplo
|
/// # Ejemplo
|
||||||
///
|
///
|
||||||
/// ```rust
|
/// ```rust,no_run
|
||||||
/// use pagetop_bootsier::theme::*;
|
/// use pagetop_bootsier::theme::*;
|
||||||
///
|
///
|
||||||
/// let main = Container::main()
|
/// let main = Container::main()
|
||||||
|
|
@ -22,8 +22,8 @@ use crate::theme::*;
|
||||||
pub struct Container {
|
pub struct Container {
|
||||||
#[getters(skip)]
|
#[getters(skip)]
|
||||||
id: AttrId,
|
id: AttrId,
|
||||||
/// Devuelve las clases CSS asociadas al contenedor.
|
/// Devuelve los atributos HTML y clases CSS del contenedor.
|
||||||
classes: Classes,
|
props: Props,
|
||||||
/// Devuelve el tipo semántico del contenedor.
|
/// Devuelve el tipo semántico del contenedor.
|
||||||
container_kind: container::Kind,
|
container_kind: container::Kind,
|
||||||
/// Devuelve el comportamiento para el ancho del contenedor.
|
/// Devuelve el comportamiento para el ancho del contenedor.
|
||||||
|
|
@ -42,7 +42,7 @@ impl Component for Container {
|
||||||
}
|
}
|
||||||
|
|
||||||
fn setup(&mut self, _cx: &Context) {
|
fn setup(&mut self, _cx: &Context) {
|
||||||
self.alter_classes(ClassesOp::Prepend, self.container_width().to_class());
|
self.alter_prop(PropsOp::prepend_classes(self.container_width().to_class()));
|
||||||
}
|
}
|
||||||
|
|
||||||
fn prepare(&self, cx: &mut Context) -> Result<Markup, ComponentError> {
|
fn prepare(&self, cx: &mut Context) -> Result<Markup, ComponentError> {
|
||||||
|
|
@ -58,32 +58,32 @@ impl Component for Container {
|
||||||
};
|
};
|
||||||
Ok(match self.container_kind() {
|
Ok(match self.container_kind() {
|
||||||
container::Kind::Default => html! {
|
container::Kind::Default => html! {
|
||||||
div id=[self.id()] class=[self.classes().get()] style=[style] {
|
div id=[self.id()] (self.props()) style=[style] {
|
||||||
(output)
|
(output)
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
container::Kind::Main => html! {
|
container::Kind::Main => html! {
|
||||||
main id=[self.id()] class=[self.classes().get()] style=[style] {
|
main id=[self.id()] (self.props()) style=[style] {
|
||||||
(output)
|
(output)
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
container::Kind::Header => html! {
|
container::Kind::Header => html! {
|
||||||
header id=[self.id()] class=[self.classes().get()] style=[style] {
|
header id=[self.id()] (self.props()) style=[style] {
|
||||||
(output)
|
(output)
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
container::Kind::Footer => html! {
|
container::Kind::Footer => html! {
|
||||||
footer id=[self.id()] class=[self.classes().get()] style=[style] {
|
footer id=[self.id()] (self.props()) style=[style] {
|
||||||
(output)
|
(output)
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
container::Kind::Section => html! {
|
container::Kind::Section => html! {
|
||||||
section id=[self.id()] class=[self.classes().get()] style=[style] {
|
section id=[self.id()] (self.props()) style=[style] {
|
||||||
(output)
|
(output)
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
container::Kind::Article => html! {
|
container::Kind::Article => html! {
|
||||||
article id=[self.id()] class=[self.classes().get()] style=[style] {
|
article id=[self.id()] (self.props()) style=[style] {
|
||||||
(output)
|
(output)
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
@ -141,7 +141,7 @@ impl Container {
|
||||||
self
|
self
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Modifica la lista de clases CSS aplicadas al contenedor.
|
/// Modifica los atributos HTML o las clases CSS del contenedor.
|
||||||
///
|
///
|
||||||
/// También acepta clases predefinidas para:
|
/// También acepta clases predefinidas para:
|
||||||
///
|
///
|
||||||
|
|
@ -150,8 +150,8 @@ impl Container {
|
||||||
/// - Establecer bordes ([`classes::Border`]).
|
/// - Establecer bordes ([`classes::Border`]).
|
||||||
/// - Redondear las esquinas ([`classes::Rounded`]).
|
/// - Redondear las esquinas ([`classes::Rounded`]).
|
||||||
#[builder_fn]
|
#[builder_fn]
|
||||||
pub fn with_classes(mut self, op: ClassesOp, classes: impl AsRef<str>) -> Self {
|
pub fn with_prop(mut self, op: PropsOp) -> Self {
|
||||||
self.classes.alter_classes(op, classes);
|
self.props.alter_prop(op);
|
||||||
self
|
self
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -21,7 +21,7 @@ use crate::theme::*;
|
||||||
///
|
///
|
||||||
/// # Ejemplo
|
/// # Ejemplo
|
||||||
///
|
///
|
||||||
/// ```rust
|
/// ```rust,no_run
|
||||||
/// use pagetop::prelude::*;
|
/// use pagetop::prelude::*;
|
||||||
/// use pagetop_bootsier::theme::*;
|
/// use pagetop_bootsier::theme::*;
|
||||||
///
|
///
|
||||||
|
|
@ -40,8 +40,8 @@ use crate::theme::*;
|
||||||
pub struct Dropdown {
|
pub struct Dropdown {
|
||||||
#[getters(skip)]
|
#[getters(skip)]
|
||||||
id: AttrId,
|
id: AttrId,
|
||||||
/// Devuelve las clases CSS asociadas al menú desplegable.
|
/// Devuelve los atributos HTML y clases CSS del menú desplegable.
|
||||||
classes: Classes,
|
props: Props,
|
||||||
/// Devuelve el título del menú desplegable.
|
/// Devuelve el título del menú desplegable.
|
||||||
title: L10n,
|
title: L10n,
|
||||||
/// Devuelve el tamaño configurado del botón.
|
/// Devuelve el tamaño configurado del botón.
|
||||||
|
|
@ -74,10 +74,9 @@ impl Component for Dropdown {
|
||||||
}
|
}
|
||||||
|
|
||||||
fn setup(&mut self, _cx: &Context) {
|
fn setup(&mut self, _cx: &Context) {
|
||||||
self.alter_classes(
|
self.alter_prop(PropsOp::prepend_classes(
|
||||||
ClassesOp::Prepend,
|
|
||||||
self.direction().class_with(*self.button_grouped()),
|
self.direction().class_with(*self.button_grouped()),
|
||||||
);
|
));
|
||||||
}
|
}
|
||||||
|
|
||||||
fn prepare(&self, cx: &mut Context) -> Result<Markup, ComponentError> {
|
fn prepare(&self, cx: &mut Context) -> Result<Markup, ComponentError> {
|
||||||
|
|
@ -91,23 +90,23 @@ impl Component for Dropdown {
|
||||||
let title = self.title().using(cx);
|
let title = self.title().using(cx);
|
||||||
|
|
||||||
Ok(html! {
|
Ok(html! {
|
||||||
div id=[self.id()] class=[self.classes().get()] {
|
div id=[self.id()] (self.props()) {
|
||||||
@if !title.is_empty() {
|
@if !title.is_empty() {
|
||||||
@let mut btn_classes = Classes::new({
|
@let btn_base = {
|
||||||
let mut classes = "btn".to_string();
|
let mut classes = "btn".to_string();
|
||||||
self.button_size().push_class(&mut classes);
|
self.button_size().push_class(&mut classes);
|
||||||
self.button_color().push_class(&mut classes);
|
self.button_color().push_class(&mut classes);
|
||||||
classes
|
classes
|
||||||
});
|
};
|
||||||
@let pos = self.menu_position();
|
@let pos = self.menu_position();
|
||||||
@let offset = pos.data_offset();
|
@let offset = pos.data_offset();
|
||||||
@let reference = pos.data_reference();
|
@let reference = pos.data_reference();
|
||||||
@let auto_close = self.auto_close.as_str();
|
@let auto_close = self.auto_close.as_str();
|
||||||
@let menu_classes = Classes::new({
|
@let menu_classes = {
|
||||||
let mut classes = "dropdown-menu".to_string();
|
let mut classes = "dropdown-menu".to_string();
|
||||||
self.menu_align().push_class(&mut classes);
|
self.menu_align().push_class(&mut classes);
|
||||||
classes
|
classes
|
||||||
});
|
};
|
||||||
|
|
||||||
// Renderizado en modo split (dos botones) o simple (un botón).
|
// Renderizado en modo split (dos botones) o simple (un botón).
|
||||||
@if *self.button_split() {
|
@if *self.button_split() {
|
||||||
|
|
@ -115,18 +114,18 @@ impl Component for Dropdown {
|
||||||
@let btn = html! {
|
@let btn = html! {
|
||||||
button
|
button
|
||||||
type="button"
|
type="button"
|
||||||
class=[btn_classes.get()]
|
class=(&btn_base)
|
||||||
{
|
{
|
||||||
(title)
|
(title)
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
// Botón *toggle* que abre/cierra el menú asociado.
|
// Botón *toggle* que abre/cierra el menú asociado.
|
||||||
|
@let btn_toggle_classes =
|
||||||
|
util::join!(&btn_base, " dropdown-toggle dropdown-toggle-split");
|
||||||
@let btn_toggle = html! {
|
@let btn_toggle = html! {
|
||||||
button
|
button
|
||||||
type="button"
|
type="button"
|
||||||
class=[btn_classes.alter_classes(
|
class=(&btn_toggle_classes)
|
||||||
ClassesOp::Add, "dropdown-toggle dropdown-toggle-split"
|
|
||||||
).get()]
|
|
||||||
data-bs-toggle="dropdown"
|
data-bs-toggle="dropdown"
|
||||||
data-bs-offset=[offset]
|
data-bs-offset=[offset]
|
||||||
data-bs-reference=[reference]
|
data-bs-reference=[reference]
|
||||||
|
|
@ -142,22 +141,21 @@ impl Component for Dropdown {
|
||||||
@match self.direction() {
|
@match self.direction() {
|
||||||
dropdown::Direction::Dropstart => {
|
dropdown::Direction::Dropstart => {
|
||||||
(btn_toggle)
|
(btn_toggle)
|
||||||
ul class=[menu_classes.get()] { (items) }
|
ul class=(&menu_classes) { (items) }
|
||||||
(btn)
|
(btn)
|
||||||
}
|
}
|
||||||
_ => {
|
_ => {
|
||||||
(btn)
|
(btn)
|
||||||
(btn_toggle)
|
(btn_toggle)
|
||||||
ul class=[menu_classes.get()] { (items) }
|
ul class=(&menu_classes) { (items) }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} @else {
|
} @else {
|
||||||
// Botón único con funcionalidad de *toggle*.
|
// Botón único con funcionalidad de *toggle*.
|
||||||
|
@let btn_toggle_classes = util::join!(&btn_base, " dropdown-toggle");
|
||||||
button
|
button
|
||||||
type="button"
|
type="button"
|
||||||
class=[btn_classes.alter_classes(
|
class=(&btn_toggle_classes)
|
||||||
ClassesOp::Add, "dropdown-toggle"
|
|
||||||
).get()]
|
|
||||||
data-bs-toggle="dropdown"
|
data-bs-toggle="dropdown"
|
||||||
data-bs-offset=[offset]
|
data-bs-offset=[offset]
|
||||||
data-bs-reference=[reference]
|
data-bs-reference=[reference]
|
||||||
|
|
@ -166,7 +164,7 @@ impl Component for Dropdown {
|
||||||
{
|
{
|
||||||
(title)
|
(title)
|
||||||
}
|
}
|
||||||
ul class=[menu_classes.get()] { (items) }
|
ul class=(&menu_classes) { (items) }
|
||||||
}
|
}
|
||||||
} @else {
|
} @else {
|
||||||
// Sin botón: sólo el listado como menú contextual.
|
// Sin botón: sólo el listado como menú contextual.
|
||||||
|
|
@ -187,10 +185,10 @@ impl Dropdown {
|
||||||
self
|
self
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Modifica la lista de clases CSS aplicadas al menú desplegable.
|
/// Modifica los atributos HTML o las clases CSS del menú desplegable.
|
||||||
#[builder_fn]
|
#[builder_fn]
|
||||||
pub fn with_classes(mut self, op: ClassesOp, classes: impl AsRef<str>) -> Self {
|
pub fn with_prop(mut self, op: PropsOp) -> Self {
|
||||||
self.classes.alter_classes(op, classes);
|
self.props.alter_prop(op);
|
||||||
self
|
self
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -47,8 +47,8 @@ pub enum ItemKind {
|
||||||
pub struct Item {
|
pub struct Item {
|
||||||
#[getters(skip)]
|
#[getters(skip)]
|
||||||
id: AttrId,
|
id: AttrId,
|
||||||
/// Devuelve las clases CSS asociadas al elemento.
|
/// Devuelve los atributos HTML y clases CSS del elemento.
|
||||||
classes: Classes,
|
props: Props,
|
||||||
/// Devuelve el tipo de elemento representado.
|
/// Devuelve el tipo de elemento representado.
|
||||||
item_kind: ItemKind,
|
item_kind: ItemKind,
|
||||||
}
|
}
|
||||||
|
|
@ -67,7 +67,7 @@ impl Component for Item {
|
||||||
ItemKind::Void => html! {},
|
ItemKind::Void => html! {},
|
||||||
|
|
||||||
ItemKind::Label(label) => html! {
|
ItemKind::Label(label) => html! {
|
||||||
li id=[self.id()] class=[self.classes().get()] {
|
li id=[self.id()] (self.props()) {
|
||||||
span class="dropdown-item-text" {
|
span class="dropdown-item-text" {
|
||||||
(label.using(cx))
|
(label.using(cx))
|
||||||
}
|
}
|
||||||
|
|
@ -101,7 +101,7 @@ impl Component for Item {
|
||||||
let tabindex = disabled.then_some("-1");
|
let tabindex = disabled.then_some("-1");
|
||||||
|
|
||||||
html! {
|
html! {
|
||||||
li id=[self.id()] class=[self.classes().get()] {
|
li id=[self.id()] (self.props()) {
|
||||||
a
|
a
|
||||||
class=(classes)
|
class=(classes)
|
||||||
href=[href]
|
href=[href]
|
||||||
|
|
@ -127,7 +127,7 @@ impl Component for Item {
|
||||||
let disabled_attr = disabled.then_some("disabled");
|
let disabled_attr = disabled.then_some("disabled");
|
||||||
|
|
||||||
html! {
|
html! {
|
||||||
li id=[self.id()] class=[self.classes().get()] {
|
li id=[self.id()] (self.props()) {
|
||||||
button
|
button
|
||||||
class=(classes)
|
class=(classes)
|
||||||
type="button"
|
type="button"
|
||||||
|
|
@ -141,7 +141,7 @@ impl Component for Item {
|
||||||
}
|
}
|
||||||
|
|
||||||
ItemKind::Header(label) => html! {
|
ItemKind::Header(label) => html! {
|
||||||
li id=[self.id()] class=[self.classes().get()] {
|
li id=[self.id()] (self.props()) {
|
||||||
h6 class="dropdown-header" {
|
h6 class="dropdown-header" {
|
||||||
(label.using(cx))
|
(label.using(cx))
|
||||||
}
|
}
|
||||||
|
|
@ -149,7 +149,7 @@ impl Component for Item {
|
||||||
},
|
},
|
||||||
|
|
||||||
ItemKind::Divider => html! {
|
ItemKind::Divider => html! {
|
||||||
li id=[self.id()] class=[self.classes().get()] { hr class="dropdown-divider" {} }
|
li id=[self.id()] (self.props()) { hr class="dropdown-divider" {} }
|
||||||
},
|
},
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
@ -267,10 +267,10 @@ impl Item {
|
||||||
self
|
self
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Modifica la lista de clases CSS aplicadas al elemento.
|
/// Modifica los atributos HTML o las clases CSS del elemento.
|
||||||
#[builder_fn]
|
#[builder_fn]
|
||||||
pub fn with_classes(mut self, op: ClassesOp, classes: impl AsRef<str>) -> Self {
|
pub fn with_prop(mut self, op: PropsOp) -> Self {
|
||||||
self.classes.alter_classes(op, classes);
|
self.props.alter_prop(op);
|
||||||
self
|
self
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -15,7 +15,7 @@ use pagetop::prelude::*;
|
||||||
///
|
///
|
||||||
/// # Ejemplo
|
/// # Ejemplo
|
||||||
///
|
///
|
||||||
/// ```rust
|
/// ```rust,no_run
|
||||||
/// # use pagetop::prelude::*;
|
/// # use pagetop::prelude::*;
|
||||||
/// # use pagetop_bootsier::theme::*;
|
/// # use pagetop_bootsier::theme::*;
|
||||||
/// let item = form::check::Item::new("apple", L10n::n("Apple")).with_checked(true);
|
/// let item = form::check::Item::new("apple", L10n::n("Apple")).with_checked(true);
|
||||||
|
|
@ -80,7 +80,7 @@ impl Item {
|
||||||
///
|
///
|
||||||
/// # Ejemplo
|
/// # Ejemplo
|
||||||
///
|
///
|
||||||
/// ```rust
|
/// ```rust,no_run
|
||||||
/// # use pagetop::prelude::*;
|
/// # use pagetop::prelude::*;
|
||||||
/// # use pagetop_bootsier::theme::*;
|
/// # use pagetop_bootsier::theme::*;
|
||||||
/// let interests = form::check::Field::new()
|
/// let interests = form::check::Field::new()
|
||||||
|
|
@ -110,8 +110,8 @@ impl Item {
|
||||||
pub struct Field {
|
pub struct Field {
|
||||||
#[getters(skip)]
|
#[getters(skip)]
|
||||||
id: AttrId,
|
id: AttrId,
|
||||||
/// Devuelve las clases CSS del contenedor del grupo.
|
/// Devuelve los atributos HTML y clases CSS del contenedor del grupo.
|
||||||
classes: Classes,
|
props: Props,
|
||||||
/// Devuelve el nombre base compartido por todas las casillas del grupo.
|
/// Devuelve el nombre base compartido por todas las casillas del grupo.
|
||||||
name: AttrName,
|
name: AttrName,
|
||||||
/// Devuelve la etiqueta del grupo.
|
/// Devuelve la etiqueta del grupo.
|
||||||
|
|
@ -136,7 +136,7 @@ impl Component for Field {
|
||||||
}
|
}
|
||||||
|
|
||||||
fn setup(&mut self, _cx: &Context) {
|
fn setup(&mut self, _cx: &Context) {
|
||||||
self.alter_classes(ClassesOp::Prepend, "form-field form-field-checkboxes");
|
self.alter_prop(PropsOp::prepend_classes("form-field form-field-checkboxes"));
|
||||||
}
|
}
|
||||||
|
|
||||||
fn prepare(&self, cx: &mut Context) -> Result<Markup, ComponentError> {
|
fn prepare(&self, cx: &mut Context) -> Result<Markup, ComponentError> {
|
||||||
|
|
@ -146,7 +146,7 @@ impl Component for Field {
|
||||||
.unwrap_or_else(|| cx.required_id::<Self>(self.id(), 3));
|
.unwrap_or_else(|| cx.required_id::<Self>(self.id(), 3));
|
||||||
let container_id = self.id().unwrap_or_else(|| util::join!("edit-", &name));
|
let container_id = self.id().unwrap_or_else(|| util::join!("edit-", &name));
|
||||||
Ok(html! {
|
Ok(html! {
|
||||||
div id=(&container_id) class=[self.classes().get()] {
|
div id=(&container_id) (self.props()) {
|
||||||
@if let Some(label) = self.label().lookup(cx) {
|
@if let Some(label) = self.label().lookup(cx) {
|
||||||
label class="form-label" { (label) }
|
label class="form-label" { (label) }
|
||||||
}
|
}
|
||||||
|
|
@ -195,10 +195,10 @@ impl Field {
|
||||||
self
|
self
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Modifica la lista de clases CSS aplicadas al contenedor del grupo de casillas.
|
/// Modifica los atributos HTML o las clases CSS del contenedor del grupo de casillas.
|
||||||
#[builder_fn]
|
#[builder_fn]
|
||||||
pub fn with_classes(mut self, op: ClassesOp, classes: impl AsRef<str>) -> Self {
|
pub fn with_prop(mut self, op: PropsOp) -> Self {
|
||||||
self.classes.alter_classes(op, classes);
|
self.props.alter_prop(op);
|
||||||
self
|
self
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -15,7 +15,7 @@ use crate::theme::form;
|
||||||
///
|
///
|
||||||
/// # Ejemplo
|
/// # Ejemplo
|
||||||
///
|
///
|
||||||
/// ```rust
|
/// ```rust,no_run
|
||||||
/// # use pagetop::prelude::*;
|
/// # use pagetop::prelude::*;
|
||||||
/// # use pagetop_bootsier::theme::*;
|
/// # use pagetop_bootsier::theme::*;
|
||||||
/// let accept_terms = form::Checkbox::check() // También sirve new() o default().
|
/// let accept_terms = form::Checkbox::check() // También sirve new() o default().
|
||||||
|
|
@ -45,8 +45,8 @@ use crate::theme::form;
|
||||||
pub struct Checkbox {
|
pub struct Checkbox {
|
||||||
#[getters(skip)]
|
#[getters(skip)]
|
||||||
id: AttrId,
|
id: AttrId,
|
||||||
/// Devuelve las clases CSS del contenedor del control.
|
/// Devuelve los atributos HTML y clases CSS del contenedor del control.
|
||||||
classes: Classes,
|
props: Props,
|
||||||
/// Devuelve la variante visual del control.
|
/// Devuelve la variante visual del control.
|
||||||
checkbox_kind: form::CheckboxKind,
|
checkbox_kind: form::CheckboxKind,
|
||||||
/// Devuelve el nombre del campo.
|
/// Devuelve el nombre del campo.
|
||||||
|
|
@ -87,7 +87,7 @@ impl Component for Checkbox {
|
||||||
if *self.reverse() {
|
if *self.reverse() {
|
||||||
classes.push_str(" form-check-reverse");
|
classes.push_str(" form-check-reverse");
|
||||||
}
|
}
|
||||||
self.alter_classes(ClassesOp::Prepend, classes);
|
self.alter_prop(PropsOp::prepend_classes(classes));
|
||||||
}
|
}
|
||||||
|
|
||||||
fn prepare(&self, cx: &mut Context) -> Result<Markup, ComponentError> {
|
fn prepare(&self, cx: &mut Context) -> Result<Markup, ComponentError> {
|
||||||
|
|
@ -99,7 +99,7 @@ impl Component for Checkbox {
|
||||||
let checkbox_id = util::join!(&container_id, "-checkbox");
|
let checkbox_id = util::join!(&container_id, "-checkbox");
|
||||||
let is_switch = *self.checkbox_kind() == form::CheckboxKind::Switch;
|
let is_switch = *self.checkbox_kind() == form::CheckboxKind::Switch;
|
||||||
Ok(html! {
|
Ok(html! {
|
||||||
div id=(&container_id) class=[self.classes().get()] {
|
div id=(&container_id) (self.props()) {
|
||||||
input
|
input
|
||||||
type="checkbox"
|
type="checkbox"
|
||||||
role=[is_switch.then_some("switch")]
|
role=[is_switch.then_some("switch")]
|
||||||
|
|
@ -152,10 +152,10 @@ impl Checkbox {
|
||||||
self
|
self
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Modifica la lista de clases CSS aplicadas al contenedor del control.
|
/// Modifica los atributos HTML o las clases CSS del contenedor del control.
|
||||||
#[builder_fn]
|
#[builder_fn]
|
||||||
pub fn with_classes(mut self, op: ClassesOp, classes: impl AsRef<str>) -> Self {
|
pub fn with_prop(mut self, op: PropsOp) -> Self {
|
||||||
self.classes.alter_classes(op, classes);
|
self.props.alter_prop(op);
|
||||||
self
|
self
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -16,7 +16,7 @@ use crate::theme::form;
|
||||||
///
|
///
|
||||||
/// # Ejemplo
|
/// # Ejemplo
|
||||||
///
|
///
|
||||||
/// ```rust
|
/// ```rust,no_run
|
||||||
/// use pagetop::prelude::*;
|
/// use pagetop::prelude::*;
|
||||||
/// use pagetop_bootsier::theme::*;
|
/// use pagetop_bootsier::theme::*;
|
||||||
///
|
///
|
||||||
|
|
@ -49,8 +49,8 @@ use crate::theme::form;
|
||||||
pub struct Form {
|
pub struct Form {
|
||||||
#[getters(skip)]
|
#[getters(skip)]
|
||||||
id: AttrId,
|
id: AttrId,
|
||||||
/// Devuelve las clases CSS del formulario.
|
/// Devuelve los atributos HTML y clases CSS del formulario.
|
||||||
classes: Classes,
|
props: Props,
|
||||||
/// Devuelve la URL/ruta de destino del formulario.
|
/// Devuelve la URL/ruta de destino del formulario.
|
||||||
action: AttrValue,
|
action: AttrValue,
|
||||||
/// Devuelve el método para enviar el formulario.
|
/// Devuelve el método para enviar el formulario.
|
||||||
|
|
@ -72,7 +72,7 @@ impl Component for Form {
|
||||||
}
|
}
|
||||||
|
|
||||||
fn setup(&mut self, _cx: &Context) {
|
fn setup(&mut self, _cx: &Context) {
|
||||||
self.alter_classes(ClassesOp::Prepend, "form");
|
self.alter_prop(PropsOp::prepend_classes("form"));
|
||||||
}
|
}
|
||||||
|
|
||||||
fn prepare(&self, cx: &mut Context) -> Result<Markup, ComponentError> {
|
fn prepare(&self, cx: &mut Context) -> Result<Markup, ComponentError> {
|
||||||
|
|
@ -83,7 +83,7 @@ impl Component for Form {
|
||||||
Ok(html! {
|
Ok(html! {
|
||||||
form
|
form
|
||||||
id=[self.id()]
|
id=[self.id()]
|
||||||
class=[self.classes().get()]
|
(self.props())
|
||||||
action=[self.action().get()]
|
action=[self.action().get()]
|
||||||
method=[method]
|
method=[method]
|
||||||
accept-charset=[self.charset().get()]
|
accept-charset=[self.charset().get()]
|
||||||
|
|
@ -104,10 +104,10 @@ impl Form {
|
||||||
self
|
self
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Modifica la lista de clases CSS aplicadas al formulario.
|
/// Modifica los atributos HTML o las clases CSS del formulario.
|
||||||
#[builder_fn]
|
#[builder_fn]
|
||||||
pub fn with_classes(mut self, op: ClassesOp, classes: impl AsRef<str>) -> Self {
|
pub fn with_prop(mut self, op: PropsOp) -> Self {
|
||||||
self.classes.alter_classes(op, classes);
|
self.props.alter_prop(op);
|
||||||
self
|
self
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -13,7 +13,7 @@ use pagetop::prelude::*;
|
||||||
///
|
///
|
||||||
/// # Ejemplo
|
/// # Ejemplo
|
||||||
///
|
///
|
||||||
/// ```rust
|
/// ```rust,no_run
|
||||||
/// # use pagetop::prelude::*;
|
/// # use pagetop::prelude::*;
|
||||||
/// # use pagetop_bootsier::theme::*;
|
/// # use pagetop_bootsier::theme::*;
|
||||||
/// let personal_data = form::Fieldset::new()
|
/// let personal_data = form::Fieldset::new()
|
||||||
|
|
@ -26,8 +26,8 @@ use pagetop::prelude::*;
|
||||||
pub struct Fieldset {
|
pub struct Fieldset {
|
||||||
#[getters(skip)]
|
#[getters(skip)]
|
||||||
id: AttrId,
|
id: AttrId,
|
||||||
/// Devuelve las clases CSS del `fieldset`.
|
/// Devuelve los atributos HTML y clases CSS del `fieldset`.
|
||||||
classes: Classes,
|
props: Props,
|
||||||
/// Devuelve la leyenda del `fieldset`.
|
/// Devuelve la leyenda del `fieldset`.
|
||||||
legend: Attr<L10n>,
|
legend: Attr<L10n>,
|
||||||
/// Devuelve la descripción del `fieldset`.
|
/// Devuelve la descripción del `fieldset`.
|
||||||
|
|
@ -55,7 +55,7 @@ impl Component for Fieldset {
|
||||||
}
|
}
|
||||||
|
|
||||||
Ok(html! {
|
Ok(html! {
|
||||||
fieldset id=[self.id()] class=[self.classes().get()] disabled[*self.disabled()] {
|
fieldset id=[self.id()] (self.props()) disabled[*self.disabled()] {
|
||||||
@if let Some(legend) = self.legend().lookup(cx) {
|
@if let Some(legend) = self.legend().lookup(cx) {
|
||||||
legend { (legend) }
|
legend { (legend) }
|
||||||
}
|
}
|
||||||
|
|
@ -78,10 +78,10 @@ impl Fieldset {
|
||||||
self
|
self
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Modifica la lista de clases CSS aplicadas al `fieldset`.
|
/// Modifica los atributos HTML o las clases CSS del `fieldset`.
|
||||||
#[builder_fn]
|
#[builder_fn]
|
||||||
pub fn with_classes(mut self, op: ClassesOp, classes: impl AsRef<str>) -> Self {
|
pub fn with_prop(mut self, op: PropsOp) -> Self {
|
||||||
self.classes.alter_classes(op, classes);
|
self.props.alter_prop(op);
|
||||||
self
|
self
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -10,7 +10,7 @@ use pagetop::prelude::*;
|
||||||
///
|
///
|
||||||
/// # Ejemplo
|
/// # Ejemplo
|
||||||
///
|
///
|
||||||
/// ```rust
|
/// ```rust,no_run
|
||||||
/// # use pagetop::prelude::*;
|
/// # use pagetop::prelude::*;
|
||||||
/// # use pagetop_bootsier::theme::*;
|
/// # use pagetop_bootsier::theme::*;
|
||||||
/// let token = form::Hidden::new()
|
/// let token = form::Hidden::new()
|
||||||
|
|
|
||||||
|
|
@ -104,7 +104,7 @@ impl fmt::Display for Mode {
|
||||||
///
|
///
|
||||||
/// # Ejemplo
|
/// # Ejemplo
|
||||||
///
|
///
|
||||||
/// ```rust
|
/// ```rust,no_run
|
||||||
/// # use pagetop::prelude::*;
|
/// # use pagetop::prelude::*;
|
||||||
/// # use pagetop_bootsier::theme::*;
|
/// # use pagetop_bootsier::theme::*;
|
||||||
/// let email = form::input::Field::email()
|
/// let email = form::input::Field::email()
|
||||||
|
|
@ -128,8 +128,8 @@ impl fmt::Display for Mode {
|
||||||
pub struct Field {
|
pub struct Field {
|
||||||
#[getters(skip)]
|
#[getters(skip)]
|
||||||
id: AttrId,
|
id: AttrId,
|
||||||
/// Devuelve las clases CSS del contenedor del campo.
|
/// Devuelve los atributos HTML y clases CSS del contenedor del campo.
|
||||||
classes: Classes,
|
props: Props,
|
||||||
/// Devuelve el tipo de campo.
|
/// Devuelve el tipo de campo.
|
||||||
kind: Kind,
|
kind: Kind,
|
||||||
/// Devuelve el nombre del campo.
|
/// Devuelve el nombre del campo.
|
||||||
|
|
@ -175,12 +175,12 @@ impl Component for Field {
|
||||||
|
|
||||||
fn setup(&mut self, _cx: &Context) {
|
fn setup(&mut self, _cx: &Context) {
|
||||||
if *self.floating_label() {
|
if *self.floating_label() {
|
||||||
self.alter_classes(ClassesOp::Prepend, "form-floating");
|
self.alter_prop(PropsOp::prepend_classes("form-floating"));
|
||||||
}
|
}
|
||||||
self.alter_classes(
|
self.alter_prop(PropsOp::prepend_classes(util::join!(
|
||||||
ClassesOp::Prepend,
|
"form-field form-field-",
|
||||||
util::join!("form-field form-field-", self.kind().to_string()),
|
self.kind().to_string()
|
||||||
);
|
)));
|
||||||
}
|
}
|
||||||
|
|
||||||
fn prepare(&self, cx: &mut Context) -> Result<Markup, ComponentError> {
|
fn prepare(&self, cx: &mut Context) -> Result<Markup, ComponentError> {
|
||||||
|
|
@ -217,7 +217,7 @@ impl Component for Field {
|
||||||
None => html! {},
|
None => html! {},
|
||||||
};
|
};
|
||||||
Ok(html! {
|
Ok(html! {
|
||||||
div id=[container_id.as_deref()] class=[self.classes().get()] {
|
div id=[container_id.as_deref()] (self.props()) {
|
||||||
@if !*self.floating_label() {
|
@if !*self.floating_label() {
|
||||||
(label)
|
(label)
|
||||||
}
|
}
|
||||||
|
|
@ -320,10 +320,10 @@ impl Field {
|
||||||
self
|
self
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Modifica la lista de clases CSS aplicadas al contenedor del campo.
|
/// Modifica los atributos HTML o las clases CSS del contenedor del campo.
|
||||||
#[builder_fn]
|
#[builder_fn]
|
||||||
pub fn with_classes(mut self, op: ClassesOp, classes: impl AsRef<str>) -> Self {
|
pub fn with_prop(mut self, op: PropsOp) -> Self {
|
||||||
self.classes.alter_classes(op, classes);
|
self.props.alter_prop(op);
|
||||||
self
|
self
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -50,7 +50,7 @@ pub enum CheckboxKind {
|
||||||
///
|
///
|
||||||
/// # Ejemplo
|
/// # Ejemplo
|
||||||
///
|
///
|
||||||
/// ```rust
|
/// ```rust,no_run
|
||||||
/// # use pagetop::prelude::*;
|
/// # use pagetop::prelude::*;
|
||||||
/// # use pagetop_bootsier::theme::*;
|
/// # use pagetop_bootsier::theme::*;
|
||||||
/// // Correo electrónico con sugerencia semántica del navegador.
|
/// // Correo electrónico con sugerencia semántica del navegador.
|
||||||
|
|
@ -243,7 +243,7 @@ impl fmt::Display for Autocomplete {
|
||||||
///
|
///
|
||||||
/// # Ejemplo
|
/// # Ejemplo
|
||||||
///
|
///
|
||||||
/// ```rust
|
/// ```rust,no_run
|
||||||
/// # use pagetop_bootsier::theme::*;
|
/// # use pagetop_bootsier::theme::*;
|
||||||
/// let ac = form::Autocomplete::token(form::AutofillField::Username);
|
/// let ac = form::Autocomplete::token(form::AutofillField::Username);
|
||||||
/// let ac = form::Autocomplete::shipping(form::AutofillField::StreetAddress);
|
/// let ac = form::Autocomplete::shipping(form::AutofillField::StreetAddress);
|
||||||
|
|
|
||||||
|
|
@ -14,7 +14,7 @@ use crate::LOCALES_BOOTSIER;
|
||||||
///
|
///
|
||||||
/// # Ejemplo
|
/// # Ejemplo
|
||||||
///
|
///
|
||||||
/// ```rust
|
/// ```rust,no_run
|
||||||
/// # use pagetop::prelude::*;
|
/// # use pagetop::prelude::*;
|
||||||
/// # use pagetop_bootsier::theme::*;
|
/// # use pagetop_bootsier::theme::*;
|
||||||
/// let item = form::radio::Item::new("monthly", L10n::n("Monthly")).with_checked(true);
|
/// let item = form::radio::Item::new("monthly", L10n::n("Monthly")).with_checked(true);
|
||||||
|
|
@ -74,7 +74,7 @@ impl Item {
|
||||||
///
|
///
|
||||||
/// # Ejemplo
|
/// # Ejemplo
|
||||||
///
|
///
|
||||||
/// ```rust
|
/// ```rust,no_run
|
||||||
/// # use pagetop::prelude::*;
|
/// # use pagetop::prelude::*;
|
||||||
/// # use pagetop_bootsier::theme::*;
|
/// # use pagetop_bootsier::theme::*;
|
||||||
/// let plan = form::radio::Field::new()
|
/// let plan = form::radio::Field::new()
|
||||||
|
|
@ -98,8 +98,8 @@ impl Item {
|
||||||
pub struct Field {
|
pub struct Field {
|
||||||
#[getters(skip)]
|
#[getters(skip)]
|
||||||
id: AttrId,
|
id: AttrId,
|
||||||
/// Devuelve las clases CSS del contenedor del grupo.
|
/// Devuelve los atributos HTML y clases CSS del contenedor del grupo.
|
||||||
classes: Classes,
|
props: Props,
|
||||||
/// Devuelve el nombre compartido por todos los botones de opción del grupo.
|
/// Devuelve el nombre compartido por todos los botones de opción del grupo.
|
||||||
name: AttrName,
|
name: AttrName,
|
||||||
/// Devuelve la etiqueta del grupo.
|
/// Devuelve la etiqueta del grupo.
|
||||||
|
|
@ -126,7 +126,7 @@ impl Component for Field {
|
||||||
}
|
}
|
||||||
|
|
||||||
fn setup(&mut self, _cx: &Context) {
|
fn setup(&mut self, _cx: &Context) {
|
||||||
self.alter_classes(ClassesOp::Prepend, "form-field form-field-radios");
|
self.alter_prop(PropsOp::prepend_classes("form-field form-field-radios"));
|
||||||
}
|
}
|
||||||
|
|
||||||
fn prepare(&self, cx: &mut Context) -> Result<Markup, ComponentError> {
|
fn prepare(&self, cx: &mut Context) -> Result<Markup, ComponentError> {
|
||||||
|
|
@ -136,7 +136,7 @@ impl Component for Field {
|
||||||
.unwrap_or_else(|| cx.required_id::<Self>(self.id(), 3));
|
.unwrap_or_else(|| cx.required_id::<Self>(self.id(), 3));
|
||||||
let container_id = self.id().unwrap_or_else(|| util::join!("edit-", &name));
|
let container_id = self.id().unwrap_or_else(|| util::join!("edit-", &name));
|
||||||
Ok(html! {
|
Ok(html! {
|
||||||
div id=(&container_id) class=[self.classes().get()] {
|
div id=(&container_id) (self.props()) {
|
||||||
@if let Some(label) = self.label().lookup(cx) {
|
@if let Some(label) = self.label().lookup(cx) {
|
||||||
label class="form-label" {
|
label class="form-label" {
|
||||||
(label)
|
(label)
|
||||||
|
|
@ -197,10 +197,10 @@ impl Field {
|
||||||
self
|
self
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Modifica la lista de clases CSS aplicadas al contenedor del grupo de opciones.
|
/// Modifica los atributos HTML o las clases CSS del contenedor del grupo de opciones.
|
||||||
#[builder_fn]
|
#[builder_fn]
|
||||||
pub fn with_classes(mut self, op: ClassesOp, classes: impl AsRef<str>) -> Self {
|
pub fn with_prop(mut self, op: PropsOp) -> Self {
|
||||||
self.classes.alter_classes(op, classes);
|
self.props.alter_prop(op);
|
||||||
self
|
self
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -8,7 +8,7 @@ use pagetop::prelude::*;
|
||||||
///
|
///
|
||||||
/// # Ejemplo
|
/// # Ejemplo
|
||||||
///
|
///
|
||||||
/// ```rust
|
/// ```rust,no_run
|
||||||
/// # use pagetop::prelude::*;
|
/// # use pagetop::prelude::*;
|
||||||
/// # use pagetop_bootsier::theme::*;
|
/// # use pagetop_bootsier::theme::*;
|
||||||
/// let volume = form::Range::new()
|
/// let volume = form::Range::new()
|
||||||
|
|
@ -33,8 +33,8 @@ use pagetop::prelude::*;
|
||||||
pub struct Range {
|
pub struct Range {
|
||||||
#[getters(skip)]
|
#[getters(skip)]
|
||||||
id: AttrId,
|
id: AttrId,
|
||||||
/// Devuelve las clases CSS del contenedor del control deslizante.
|
/// Devuelve los atributos HTML y clases CSS del contenedor del control deslizante.
|
||||||
classes: Classes,
|
props: Props,
|
||||||
/// Devuelve el nombre del campo.
|
/// Devuelve el nombre del campo.
|
||||||
name: AttrName,
|
name: AttrName,
|
||||||
/// Devuelve la etiqueta del campo.
|
/// Devuelve la etiqueta del campo.
|
||||||
|
|
@ -65,7 +65,7 @@ impl Component for Range {
|
||||||
}
|
}
|
||||||
|
|
||||||
fn setup(&mut self, _cx: &Context) {
|
fn setup(&mut self, _cx: &Context) {
|
||||||
self.alter_classes(ClassesOp::Prepend, "form-field form-field-range");
|
self.alter_prop(PropsOp::prepend_classes("form-field form-field-range"));
|
||||||
}
|
}
|
||||||
|
|
||||||
fn prepare(&self, cx: &mut Context) -> Result<Markup, ComponentError> {
|
fn prepare(&self, cx: &mut Context) -> Result<Markup, ComponentError> {
|
||||||
|
|
@ -74,7 +74,7 @@ impl Component for Range {
|
||||||
.or_else(|| self.name().get().map(|n| util::join!("edit-", n)));
|
.or_else(|| self.name().get().map(|n| util::join!("edit-", n)));
|
||||||
let range_id = container_id.as_deref().map(|id| util::join!(id, "-range"));
|
let range_id = container_id.as_deref().map(|id| util::join!(id, "-range"));
|
||||||
Ok(html! {
|
Ok(html! {
|
||||||
div id=[container_id.as_deref()] class=[self.classes().get()] {
|
div id=[container_id.as_deref()] (self.props()) {
|
||||||
@if let Some(label) = self.label().lookup(cx) {
|
@if let Some(label) = self.label().lookup(cx) {
|
||||||
label for=[range_id.as_deref()] class="form-label" { (label) }
|
label for=[range_id.as_deref()] class="form-label" { (label) }
|
||||||
}
|
}
|
||||||
|
|
@ -107,10 +107,10 @@ impl Range {
|
||||||
self
|
self
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Modifica la lista de clases CSS aplicadas al contenedor del control deslizante.
|
/// Modifica los atributos HTML o las clases CSS del contenedor del control deslizante.
|
||||||
#[builder_fn]
|
#[builder_fn]
|
||||||
pub fn with_classes(mut self, op: ClassesOp, classes: impl AsRef<str>) -> Self {
|
pub fn with_prop(mut self, op: PropsOp) -> Self {
|
||||||
self.classes.alter_classes(op, classes);
|
self.props.alter_prop(op);
|
||||||
self
|
self
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -18,7 +18,7 @@ use crate::theme::form;
|
||||||
///
|
///
|
||||||
/// # Ejemplo
|
/// # Ejemplo
|
||||||
///
|
///
|
||||||
/// ```rust
|
/// ```rust,no_run
|
||||||
/// # use pagetop::prelude::*;
|
/// # use pagetop::prelude::*;
|
||||||
/// # use pagetop_bootsier::theme::*;
|
/// # use pagetop_bootsier::theme::*;
|
||||||
/// let item = form::select::Item::new("es", L10n::n("Spanish")).with_selected(true);
|
/// let item = form::select::Item::new("es", L10n::n("Spanish")).with_selected(true);
|
||||||
|
|
@ -74,7 +74,7 @@ impl Item {
|
||||||
///
|
///
|
||||||
/// # Ejemplo
|
/// # Ejemplo
|
||||||
///
|
///
|
||||||
/// ```rust
|
/// ```rust,no_run
|
||||||
/// # use pagetop::prelude::*;
|
/// # use pagetop::prelude::*;
|
||||||
/// # use pagetop_bootsier::theme::*;
|
/// # use pagetop_bootsier::theme::*;
|
||||||
/// let group = form::select::Group::new(L10n::n("Europe"))
|
/// let group = form::select::Group::new(L10n::n("Europe"))
|
||||||
|
|
@ -147,7 +147,7 @@ pub enum Entry {
|
||||||
///
|
///
|
||||||
/// # Ejemplo
|
/// # Ejemplo
|
||||||
///
|
///
|
||||||
/// ```rust
|
/// ```rust,no_run
|
||||||
/// # use pagetop::prelude::*;
|
/// # use pagetop::prelude::*;
|
||||||
/// # use pagetop_bootsier::theme::*;
|
/// # use pagetop_bootsier::theme::*;
|
||||||
/// let idioma = form::select::Field::new()
|
/// let idioma = form::select::Field::new()
|
||||||
|
|
@ -193,8 +193,8 @@ pub enum Entry {
|
||||||
pub struct Field {
|
pub struct Field {
|
||||||
#[getters(skip)]
|
#[getters(skip)]
|
||||||
id: AttrId,
|
id: AttrId,
|
||||||
/// Devuelve las clases CSS del contenedor de la lista de selección.
|
/// Devuelve los atributos HTML y clases CSS del contenedor de la lista de selección.
|
||||||
classes: Classes,
|
props: Props,
|
||||||
/// Devuelve el nombre del campo.
|
/// Devuelve el nombre del campo.
|
||||||
name: AttrName,
|
name: AttrName,
|
||||||
/// Devuelve la etiqueta del campo.
|
/// Devuelve la etiqueta del campo.
|
||||||
|
|
@ -230,11 +230,11 @@ impl Component for Field {
|
||||||
|
|
||||||
fn setup(&mut self, _cx: &Context) {
|
fn setup(&mut self, _cx: &Context) {
|
||||||
if *self.floating_label() {
|
if *self.floating_label() {
|
||||||
self.multiple = false;
|
self.alter_multiple(false);
|
||||||
self.rows.alter_opt(None::<u16>);
|
self.alter_rows(None::<u16>);
|
||||||
self.alter_classes(ClassesOp::Prepend, "form-floating");
|
self.alter_prop(PropsOp::prepend_classes("form-floating"));
|
||||||
}
|
}
|
||||||
self.alter_classes(ClassesOp::Prepend, "form-field form-field-select");
|
self.alter_prop(PropsOp::prepend_classes("form-field form-field-select"));
|
||||||
}
|
}
|
||||||
|
|
||||||
fn prepare(&self, cx: &mut Context) -> Result<Markup, ComponentError> {
|
fn prepare(&self, cx: &mut Context) -> Result<Markup, ComponentError> {
|
||||||
|
|
@ -259,7 +259,7 @@ impl Component for Field {
|
||||||
None => html! {},
|
None => html! {},
|
||||||
};
|
};
|
||||||
Ok(html! {
|
Ok(html! {
|
||||||
div id=[container_id.as_deref()] class=[self.classes().get()] {
|
div id=[container_id.as_deref()] (self.props()) {
|
||||||
@if !*self.floating_label() {
|
@if !*self.floating_label() {
|
||||||
(label)
|
(label)
|
||||||
}
|
}
|
||||||
|
|
@ -325,10 +325,10 @@ impl Field {
|
||||||
self
|
self
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Modifica la lista de clases CSS aplicadas al contenedor de la lista de selección.
|
/// Modifica los atributos HTML o las clases CSS del contenedor de la lista de selección.
|
||||||
#[builder_fn]
|
#[builder_fn]
|
||||||
pub fn with_classes(mut self, op: ClassesOp, classes: impl AsRef<str>) -> Self {
|
pub fn with_prop(mut self, op: PropsOp) -> Self {
|
||||||
self.classes.alter_classes(op, classes);
|
self.props.alter_prop(op);
|
||||||
self
|
self
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -11,7 +11,7 @@ use crate::theme::form;
|
||||||
///
|
///
|
||||||
/// # Ejemplo
|
/// # Ejemplo
|
||||||
///
|
///
|
||||||
/// ```rust
|
/// ```rust,no_run
|
||||||
/// # use pagetop::prelude::*;
|
/// # use pagetop::prelude::*;
|
||||||
/// # use pagetop_bootsier::theme::*;
|
/// # use pagetop_bootsier::theme::*;
|
||||||
/// let descripcion = form::Textarea::new()
|
/// let descripcion = form::Textarea::new()
|
||||||
|
|
@ -36,8 +36,8 @@ use crate::theme::form;
|
||||||
pub struct Textarea {
|
pub struct Textarea {
|
||||||
#[getters(skip)]
|
#[getters(skip)]
|
||||||
id: AttrId,
|
id: AttrId,
|
||||||
/// Devuelve las clases CSS del contenedor del área de texto.
|
/// Devuelve los atributos HTML y clases CSS del contenedor del área de texto.
|
||||||
classes: Classes,
|
props: Props,
|
||||||
/// Devuelve el nombre del campo.
|
/// Devuelve el nombre del campo.
|
||||||
name: AttrName,
|
name: AttrName,
|
||||||
/// Devuelve el valor inicial del área de texto.
|
/// Devuelve el valor inicial del área de texto.
|
||||||
|
|
@ -79,10 +79,10 @@ impl Component for Textarea {
|
||||||
|
|
||||||
fn setup(&mut self, _cx: &Context) {
|
fn setup(&mut self, _cx: &Context) {
|
||||||
if *self.floating_label() {
|
if *self.floating_label() {
|
||||||
self.rows.alter_opt(None::<u16>);
|
self.alter_rows(None::<u16>);
|
||||||
self.alter_classes(ClassesOp::Prepend, "form-floating");
|
self.alter_prop(PropsOp::prepend_classes("form-floating"));
|
||||||
}
|
}
|
||||||
self.alter_classes(ClassesOp::Prepend, "form-field form-field-textarea");
|
self.alter_prop(PropsOp::prepend_classes("form-field form-field-textarea"));
|
||||||
}
|
}
|
||||||
|
|
||||||
fn prepare(&self, cx: &mut Context) -> Result<Markup, ComponentError> {
|
fn prepare(&self, cx: &mut Context) -> Result<Markup, ComponentError> {
|
||||||
|
|
@ -116,7 +116,7 @@ impl Component for Textarea {
|
||||||
None => html! {},
|
None => html! {},
|
||||||
};
|
};
|
||||||
Ok(html! {
|
Ok(html! {
|
||||||
div id=[container_id.as_deref()] class=[self.classes().get()] {
|
div id=[container_id.as_deref()] (self.props()) {
|
||||||
@if !*self.floating_label() {
|
@if !*self.floating_label() {
|
||||||
(label)
|
(label)
|
||||||
}
|
}
|
||||||
|
|
@ -159,10 +159,10 @@ impl Textarea {
|
||||||
self
|
self
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Modifica la lista de clases CSS aplicadas al contenedor del campo.
|
/// Modifica los atributos HTML o las clases CSS del contenedor del campo.
|
||||||
#[builder_fn]
|
#[builder_fn]
|
||||||
pub fn with_classes(mut self, op: ClassesOp, classes: impl AsRef<str>) -> Self {
|
pub fn with_prop(mut self, op: PropsOp) -> Self {
|
||||||
self.classes.alter_classes(op, classes);
|
self.props.alter_prop(op);
|
||||||
self
|
self
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -15,8 +15,8 @@ pub enum IconKind {
|
||||||
|
|
||||||
#[derive(AutoDefault, Clone, Debug, Getters)]
|
#[derive(AutoDefault, Clone, Debug, Getters)]
|
||||||
pub struct Icon {
|
pub struct Icon {
|
||||||
/// Devuelve las clases CSS asociadas al icono.
|
/// Devuelve los atributos HTML y clases CSS del icono.
|
||||||
classes: Classes,
|
props: Props,
|
||||||
icon_kind: IconKind,
|
icon_kind: IconKind,
|
||||||
aria_label: AttrL10n,
|
aria_label: AttrL10n,
|
||||||
}
|
}
|
||||||
|
|
@ -28,10 +28,10 @@ impl Component for Icon {
|
||||||
|
|
||||||
fn setup(&mut self, _cx: &Context) {
|
fn setup(&mut self, _cx: &Context) {
|
||||||
if !matches!(self.icon_kind(), IconKind::None) {
|
if !matches!(self.icon_kind(), IconKind::None) {
|
||||||
self.alter_classes(ClassesOp::Prepend, "icon");
|
self.alter_prop(PropsOp::prepend_classes("icon"));
|
||||||
}
|
}
|
||||||
if let IconKind::Font(font_size) = self.icon_kind() {
|
if let IconKind::Font(font_size) = self.icon_kind() {
|
||||||
self.alter_classes(ClassesOp::Add, font_size.as_str());
|
self.alter_prop(PropsOp::add_classes(font_size.as_str()));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -43,7 +43,7 @@ impl Component for Icon {
|
||||||
let has_label = aria_label.is_some();
|
let has_label = aria_label.is_some();
|
||||||
html! {
|
html! {
|
||||||
i
|
i
|
||||||
class=[self.classes().get()]
|
(self.props())
|
||||||
role=[has_label.then_some("img")]
|
role=[has_label.then_some("img")]
|
||||||
aria-label=[aria_label]
|
aria-label=[aria_label]
|
||||||
aria-hidden=[(!has_label).then_some("true")]
|
aria-hidden=[(!has_label).then_some("true")]
|
||||||
|
|
@ -60,7 +60,7 @@ impl Component for Icon {
|
||||||
viewBox=(viewbox)
|
viewBox=(viewbox)
|
||||||
fill="currentColor"
|
fill="currentColor"
|
||||||
focusable="false"
|
focusable="false"
|
||||||
class=[self.classes().get()]
|
(self.props())
|
||||||
role=[has_label.then_some("img")]
|
role=[has_label.then_some("img")]
|
||||||
aria-label=[aria_label]
|
aria-label=[aria_label]
|
||||||
aria-hidden=[(!has_label).then_some("true")]
|
aria-hidden=[(!has_label).then_some("true")]
|
||||||
|
|
@ -98,10 +98,10 @@ impl Icon {
|
||||||
|
|
||||||
// **< Icon BUILDER >***************************************************************************
|
// **< Icon BUILDER >***************************************************************************
|
||||||
|
|
||||||
/// Modifica la lista de clases CSS aplicadas al icono.
|
/// Modifica los atributos HTML o las clases CSS del icono.
|
||||||
#[builder_fn]
|
#[builder_fn]
|
||||||
pub fn with_classes(mut self, op: ClassesOp, classes: impl AsRef<str>) -> Self {
|
pub fn with_prop(mut self, op: PropsOp) -> Self {
|
||||||
self.classes.alter_value(op, classes);
|
self.props.alter_prop(op);
|
||||||
self
|
self
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -15,8 +15,8 @@ use crate::theme::*;
|
||||||
pub struct Image {
|
pub struct Image {
|
||||||
#[getters(skip)]
|
#[getters(skip)]
|
||||||
id: AttrId,
|
id: AttrId,
|
||||||
/// Devuelve las clases CSS asociadas a la imagen.
|
/// Devuelve los atributos HTML y clases CSS de la imagen.
|
||||||
classes: Classes,
|
props: Props,
|
||||||
/// Devuelve las dimensiones de la imagen.
|
/// Devuelve las dimensiones de la imagen.
|
||||||
size: image::Size,
|
size: image::Size,
|
||||||
/// Devuelve el origen de la imagen.
|
/// Devuelve el origen de la imagen.
|
||||||
|
|
@ -35,7 +35,7 @@ impl Component for Image {
|
||||||
}
|
}
|
||||||
|
|
||||||
fn setup(&mut self, _cx: &Context) {
|
fn setup(&mut self, _cx: &Context) {
|
||||||
self.alter_classes(ClassesOp::Prepend, self.source().to_class());
|
self.alter_prop(PropsOp::prepend_classes(self.source().to_class()));
|
||||||
}
|
}
|
||||||
|
|
||||||
fn prepare(&self, cx: &mut Context) -> Result<Markup, ComponentError> {
|
fn prepare(&self, cx: &mut Context) -> Result<Markup, ComponentError> {
|
||||||
|
|
@ -47,7 +47,7 @@ impl Component for Image {
|
||||||
return Ok(html! {
|
return Ok(html! {
|
||||||
span
|
span
|
||||||
id=[self.id()]
|
id=[self.id()]
|
||||||
class=[self.classes().get()]
|
(self.props())
|
||||||
style=[dimensions]
|
style=[dimensions]
|
||||||
role=[(!is_decorative).then_some("img")]
|
role=[(!is_decorative).then_some("img")]
|
||||||
aria-label=[(!is_decorative).then_some(alt_text)]
|
aria-label=[(!is_decorative).then_some(alt_text)]
|
||||||
|
|
@ -66,7 +66,7 @@ impl Component for Image {
|
||||||
src=[source]
|
src=[source]
|
||||||
alt=(alt_text)
|
alt=(alt_text)
|
||||||
id=[self.id()]
|
id=[self.id()]
|
||||||
class=[self.classes().get()]
|
(self.props())
|
||||||
style=[dimensions] {}
|
style=[dimensions] {}
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
@ -87,15 +87,15 @@ impl Image {
|
||||||
self
|
self
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Modifica la lista de clases CSS aplicadas a la imagen.
|
/// Modifica los atributos HTML o las clases CSS de la imagen.
|
||||||
///
|
///
|
||||||
/// También acepta clases predefinidas para:
|
/// También acepta clases predefinidas para:
|
||||||
///
|
///
|
||||||
/// - Establecer bordes ([`classes::Border`]).
|
/// - Establecer bordes ([`classes::Border`]).
|
||||||
/// - Redondear las esquinas ([`classes::Rounded`]).
|
/// - Redondear las esquinas ([`classes::Rounded`]).
|
||||||
#[builder_fn]
|
#[builder_fn]
|
||||||
pub fn with_classes(mut self, op: ClassesOp, classes: impl AsRef<str>) -> Self {
|
pub fn with_prop(mut self, op: PropsOp) -> Self {
|
||||||
self.classes.alter_classes(op, classes);
|
self.props.alter_prop(op);
|
||||||
self
|
self
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -12,7 +12,7 @@ use crate::theme::*;
|
||||||
///
|
///
|
||||||
/// # Ejemplo
|
/// # Ejemplo
|
||||||
///
|
///
|
||||||
/// ```rust
|
/// ```rust,no_run
|
||||||
/// use pagetop::prelude::*;
|
/// use pagetop::prelude::*;
|
||||||
/// use pagetop_bootsier::theme::*;
|
/// use pagetop_bootsier::theme::*;
|
||||||
///
|
///
|
||||||
|
|
@ -34,8 +34,8 @@ use crate::theme::*;
|
||||||
pub struct Nav {
|
pub struct Nav {
|
||||||
#[getters(skip)]
|
#[getters(skip)]
|
||||||
id: AttrId,
|
id: AttrId,
|
||||||
/// Devuelve las clases CSS asociadas al menú.
|
/// Devuelve los atributos HTML y clases CSS del menú.
|
||||||
classes: Classes,
|
props: Props,
|
||||||
/// Devuelve el estilo visual seleccionado.
|
/// Devuelve el estilo visual seleccionado.
|
||||||
nav_kind: nav::Kind,
|
nav_kind: nav::Kind,
|
||||||
/// Devuelve la distribución y orientación seleccionada.
|
/// Devuelve la distribución y orientación seleccionada.
|
||||||
|
|
@ -54,12 +54,12 @@ impl Component for Nav {
|
||||||
}
|
}
|
||||||
|
|
||||||
fn setup(&mut self, _cx: &Context) {
|
fn setup(&mut self, _cx: &Context) {
|
||||||
self.alter_classes(ClassesOp::Prepend, {
|
self.alter_prop(PropsOp::prepend_classes({
|
||||||
let mut classes = "nav".to_string();
|
let mut classes = "nav".to_string();
|
||||||
self.nav_kind().push_class(&mut classes);
|
self.nav_kind().push_class(&mut classes);
|
||||||
self.nav_layout().push_class(&mut classes);
|
self.nav_layout().push_class(&mut classes);
|
||||||
classes
|
classes
|
||||||
});
|
}));
|
||||||
}
|
}
|
||||||
|
|
||||||
fn prepare(&self, cx: &mut Context) -> Result<Markup, ComponentError> {
|
fn prepare(&self, cx: &mut Context) -> Result<Markup, ComponentError> {
|
||||||
|
|
@ -69,7 +69,7 @@ impl Component for Nav {
|
||||||
}
|
}
|
||||||
|
|
||||||
Ok(html! {
|
Ok(html! {
|
||||||
ul id=[self.id()] class=[self.classes().get()] {
|
ul id=[self.id()] (self.props()) {
|
||||||
(items)
|
(items)
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
@ -101,10 +101,10 @@ impl Nav {
|
||||||
self
|
self
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Modifica la lista de clases CSS aplicadas al menú.
|
/// Modifica los atributos HTML o las clases CSS del menú.
|
||||||
#[builder_fn]
|
#[builder_fn]
|
||||||
pub fn with_classes(mut self, op: ClassesOp, classes: impl AsRef<str>) -> Self {
|
pub fn with_prop(mut self, op: PropsOp) -> Self {
|
||||||
self.classes.alter_classes(op, classes);
|
self.props.alter_prop(op);
|
||||||
self
|
self
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -80,8 +80,8 @@ impl ItemKind {
|
||||||
pub struct Item {
|
pub struct Item {
|
||||||
#[getters(skip)]
|
#[getters(skip)]
|
||||||
id: AttrId,
|
id: AttrId,
|
||||||
/// Devuelve las clases CSS asociadas al elemento.
|
/// Devuelve los atributos HTML y clases CSS del elemento.
|
||||||
classes: Classes,
|
props: Props,
|
||||||
/// Devuelve el tipo de elemento representado.
|
/// Devuelve el tipo de elemento representado.
|
||||||
item_kind: ItemKind,
|
item_kind: ItemKind,
|
||||||
}
|
}
|
||||||
|
|
@ -96,7 +96,7 @@ impl Component for Item {
|
||||||
}
|
}
|
||||||
|
|
||||||
fn setup(&mut self, _cx: &Context) {
|
fn setup(&mut self, _cx: &Context) {
|
||||||
self.alter_classes(ClassesOp::Prepend, self.item_kind().to_class());
|
self.alter_prop(PropsOp::prepend_classes(self.item_kind().to_class()));
|
||||||
}
|
}
|
||||||
|
|
||||||
fn prepare(&self, cx: &mut Context) -> Result<Markup, ComponentError> {
|
fn prepare(&self, cx: &mut Context) -> Result<Markup, ComponentError> {
|
||||||
|
|
@ -104,7 +104,7 @@ impl Component for Item {
|
||||||
ItemKind::Void => html! {},
|
ItemKind::Void => html! {},
|
||||||
|
|
||||||
ItemKind::Label(label) => html! {
|
ItemKind::Label(label) => html! {
|
||||||
li id=[self.id()] class=[self.classes().get()] {
|
li id=[self.id()] (self.props()) {
|
||||||
span class="nav-link disabled" aria-disabled="true" {
|
span class="nav-link disabled" aria-disabled="true" {
|
||||||
(label.using(cx))
|
(label.using(cx))
|
||||||
}
|
}
|
||||||
|
|
@ -137,7 +137,7 @@ impl Component for Item {
|
||||||
let aria_disabled = (*disabled).then_some("true");
|
let aria_disabled = (*disabled).then_some("true");
|
||||||
|
|
||||||
html! {
|
html! {
|
||||||
li id=[self.id()] class=[self.classes().get()] {
|
li id=[self.id()] (self.props()) {
|
||||||
a
|
a
|
||||||
class=(classes)
|
class=(classes)
|
||||||
href=[href]
|
href=[href]
|
||||||
|
|
@ -153,7 +153,7 @@ impl Component for Item {
|
||||||
}
|
}
|
||||||
|
|
||||||
ItemKind::Html(html) => html! {
|
ItemKind::Html(html) => html! {
|
||||||
li id=[self.id()] class=[self.classes().get()] {
|
li id=[self.id()] (self.props()) {
|
||||||
(html.render(cx))
|
(html.render(cx))
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
@ -170,7 +170,7 @@ impl Component for Item {
|
||||||
.unwrap_or_else(|| "Dropdown".to_string())
|
.unwrap_or_else(|| "Dropdown".to_string())
|
||||||
});
|
});
|
||||||
html! {
|
html! {
|
||||||
li id=[self.id()] class=[self.classes().get()] {
|
li id=[self.id()] (self.props()) {
|
||||||
a
|
a
|
||||||
class="nav-link dropdown-toggle"
|
class="nav-link dropdown-toggle"
|
||||||
data-bs-toggle="dropdown"
|
data-bs-toggle="dropdown"
|
||||||
|
|
@ -290,10 +290,10 @@ impl Item {
|
||||||
self
|
self
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Modifica la lista de clases CSS aplicadas al elemento.
|
/// Modifica los atributos HTML o las clases CSS del elemento.
|
||||||
#[builder_fn]
|
#[builder_fn]
|
||||||
pub fn with_classes(mut self, op: ClassesOp, classes: impl AsRef<str>) -> Self {
|
pub fn with_prop(mut self, op: PropsOp) -> Self {
|
||||||
self.classes.alter_classes(op, classes);
|
self.props.alter_prop(op);
|
||||||
self
|
self
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -18,7 +18,7 @@ const TOGGLE_OFFCANVAS: &str = "offcanvas";
|
||||||
///
|
///
|
||||||
/// Barra **simple**, sólo con un menú horizontal:
|
/// Barra **simple**, sólo con un menú horizontal:
|
||||||
///
|
///
|
||||||
/// ```rust
|
/// ```rust,no_run
|
||||||
/// use pagetop::prelude::*;
|
/// use pagetop::prelude::*;
|
||||||
/// use pagetop_bootsier::theme::*;
|
/// use pagetop_bootsier::theme::*;
|
||||||
///
|
///
|
||||||
|
|
@ -33,7 +33,7 @@ const TOGGLE_OFFCANVAS: &str = "offcanvas";
|
||||||
///
|
///
|
||||||
/// Barra **colapsable**, con botón de despliegue y contenido en el desplegable cuando colapsa:
|
/// Barra **colapsable**, con botón de despliegue y contenido en el desplegable cuando colapsa:
|
||||||
///
|
///
|
||||||
/// ```rust
|
/// ```rust,no_run
|
||||||
/// # use pagetop::prelude::*;
|
/// # use pagetop::prelude::*;
|
||||||
/// # use pagetop_bootsier::theme::*;
|
/// # use pagetop_bootsier::theme::*;
|
||||||
/// let navbar = Navbar::simple_toggle()
|
/// let navbar = Navbar::simple_toggle()
|
||||||
|
|
@ -48,7 +48,7 @@ const TOGGLE_OFFCANVAS: &str = "offcanvas";
|
||||||
///
|
///
|
||||||
/// Barra con **marca de identidad a la izquierda** y menú a la derecha, típica de una cabecera:
|
/// Barra con **marca de identidad a la izquierda** y menú a la derecha, típica de una cabecera:
|
||||||
///
|
///
|
||||||
/// ```rust
|
/// ```rust,no_run
|
||||||
/// # use pagetop::prelude::*;
|
/// # use pagetop::prelude::*;
|
||||||
/// # use pagetop_bootsier::theme::*;
|
/// # use pagetop_bootsier::theme::*;
|
||||||
/// let brand = navbar::Brand::new()
|
/// let brand = navbar::Brand::new()
|
||||||
|
|
@ -75,7 +75,7 @@ const TOGGLE_OFFCANVAS: &str = "offcanvas";
|
||||||
///
|
///
|
||||||
/// Barra con **botón de despliegue a la izquierda** y **marca de identidad a la derecha**:
|
/// Barra con **botón de despliegue a la izquierda** y **marca de identidad a la derecha**:
|
||||||
///
|
///
|
||||||
/// ```rust
|
/// ```rust,no_run
|
||||||
/// # use pagetop::prelude::*;
|
/// # use pagetop::prelude::*;
|
||||||
/// # use pagetop_bootsier::theme::*;
|
/// # use pagetop_bootsier::theme::*;
|
||||||
/// let brand = navbar::Brand::new()
|
/// let brand = navbar::Brand::new()
|
||||||
|
|
@ -93,7 +93,7 @@ const TOGGLE_OFFCANVAS: &str = "offcanvas";
|
||||||
///
|
///
|
||||||
/// Barra con el **contenido en un *offcanvas***, ideal para dispositivos móviles o menús largos:
|
/// Barra con el **contenido en un *offcanvas***, ideal para dispositivos móviles o menús largos:
|
||||||
///
|
///
|
||||||
/// ```rust
|
/// ```rust,no_run
|
||||||
/// # use pagetop::prelude::*;
|
/// # use pagetop::prelude::*;
|
||||||
/// # use pagetop_bootsier::theme::*;
|
/// # use pagetop_bootsier::theme::*;
|
||||||
/// let oc = Offcanvas::new()
|
/// let oc = Offcanvas::new()
|
||||||
|
|
@ -118,7 +118,7 @@ const TOGGLE_OFFCANVAS: &str = "offcanvas";
|
||||||
///
|
///
|
||||||
/// Barra **fija arriba**:
|
/// Barra **fija arriba**:
|
||||||
///
|
///
|
||||||
/// ```rust
|
/// ```rust,no_run
|
||||||
/// # use pagetop::prelude::*;
|
/// # use pagetop::prelude::*;
|
||||||
/// # use pagetop_bootsier::theme::*;
|
/// # use pagetop_bootsier::theme::*;
|
||||||
/// let brand = navbar::Brand::new()
|
/// let brand = navbar::Brand::new()
|
||||||
|
|
@ -138,8 +138,8 @@ const TOGGLE_OFFCANVAS: &str = "offcanvas";
|
||||||
pub struct Navbar {
|
pub struct Navbar {
|
||||||
#[getters(skip)]
|
#[getters(skip)]
|
||||||
id: AttrId,
|
id: AttrId,
|
||||||
/// Devuelve las clases CSS asociadas a la barra de navegación.
|
/// Devuelve los atributos HTML y clases CSS de la barra de navegación.
|
||||||
classes: Classes,
|
props: Props,
|
||||||
/// Devuelve el punto de ruptura configurado.
|
/// Devuelve el punto de ruptura configurado.
|
||||||
expand: BreakPoint,
|
expand: BreakPoint,
|
||||||
/// Devuelve la disposición configurada para la barra de navegación.
|
/// Devuelve la disposición configurada para la barra de navegación.
|
||||||
|
|
@ -160,12 +160,12 @@ impl Component for Navbar {
|
||||||
}
|
}
|
||||||
|
|
||||||
fn setup(&mut self, _cx: &Context) {
|
fn setup(&mut self, _cx: &Context) {
|
||||||
self.alter_classes(ClassesOp::Prepend, {
|
self.alter_prop(PropsOp::prepend_classes({
|
||||||
let mut classes = "navbar".to_string();
|
let mut classes = "navbar".to_string();
|
||||||
self.expand().push_class(&mut classes, "navbar-expand", "");
|
self.expand().push_class(&mut classes, "navbar-expand", "");
|
||||||
self.position().push_class(&mut classes);
|
self.position().push_class(&mut classes);
|
||||||
classes
|
classes
|
||||||
});
|
}));
|
||||||
}
|
}
|
||||||
|
|
||||||
fn prepare(&self, cx: &mut Context) -> Result<Markup, ComponentError> {
|
fn prepare(&self, cx: &mut Context) -> Result<Markup, ComponentError> {
|
||||||
|
|
@ -202,7 +202,7 @@ impl Component for Navbar {
|
||||||
let id = cx.required_id::<Self>(self.id(), 1);
|
let id = cx.required_id::<Self>(self.id(), 1);
|
||||||
|
|
||||||
Ok(html! {
|
Ok(html! {
|
||||||
nav id=(&id) class=[self.classes().get()] {
|
nav id=(&id) (self.props()) {
|
||||||
div class="container-fluid" {
|
div class="container-fluid" {
|
||||||
@match self.layout() {
|
@match self.layout() {
|
||||||
// Barra más sencilla: sólo contenido.
|
// Barra más sencilla: sólo contenido.
|
||||||
|
|
@ -342,15 +342,15 @@ impl Navbar {
|
||||||
self
|
self
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Modifica la lista de clases CSS aplicadas a la barra de navegación.
|
/// Modifica los atributos HTML o las clases CSS de la barra de navegación.
|
||||||
///
|
///
|
||||||
/// También acepta clases predefinidas para:
|
/// También acepta clases predefinidas para:
|
||||||
///
|
///
|
||||||
/// - Modificar el color de fondo ([`classes::Background`]).
|
/// - Modificar el color de fondo ([`classes::Background`]).
|
||||||
/// - Definir la apariencia del texto ([`classes::Text`]).
|
/// - Definir la apariencia del texto ([`classes::Text`]).
|
||||||
#[builder_fn]
|
#[builder_fn]
|
||||||
pub fn with_classes(mut self, op: ClassesOp, classes: impl AsRef<str>) -> Self {
|
pub fn with_prop(mut self, op: PropsOp) -> Self {
|
||||||
self.classes.alter_classes(op, classes);
|
self.props.alter_prop(op);
|
||||||
self
|
self
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -41,7 +41,7 @@ impl Component for Item {
|
||||||
fn setup(&mut self, _cx: &Context) {
|
fn setup(&mut self, _cx: &Context) {
|
||||||
if let Self::Nav(nav) = self {
|
if let Self::Nav(nav) = self {
|
||||||
if let Some(mut nav) = nav.get() {
|
if let Some(mut nav) = nav.get() {
|
||||||
nav.alter_classes(ClassesOp::Prepend, "navbar-nav");
|
nav.alter_prop(PropsOp::prepend_classes("navbar-nav"));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -57,7 +57,7 @@ impl Component for Item {
|
||||||
return Ok(html! {});
|
return Ok(html! {});
|
||||||
}
|
}
|
||||||
html! {
|
html! {
|
||||||
ul id=[nav.id()] class=[nav.classes().get()] {
|
ul id=[nav.id()] (nav.props()) {
|
||||||
(items)
|
(items)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -23,7 +23,7 @@ use crate::theme::*;
|
||||||
///
|
///
|
||||||
/// # Ejemplo
|
/// # Ejemplo
|
||||||
///
|
///
|
||||||
/// ```rust
|
/// ```rust,no_run
|
||||||
/// use pagetop::prelude::*;
|
/// use pagetop::prelude::*;
|
||||||
/// use pagetop_bootsier::theme::*;
|
/// use pagetop_bootsier::theme::*;
|
||||||
///
|
///
|
||||||
|
|
@ -45,8 +45,8 @@ use crate::theme::*;
|
||||||
pub struct Offcanvas {
|
pub struct Offcanvas {
|
||||||
#[getters(skip)]
|
#[getters(skip)]
|
||||||
id: AttrId,
|
id: AttrId,
|
||||||
/// Devuelve las clases CSS asociadas al panel.
|
/// Devuelve los atributos HTML y clases CSS del panel.
|
||||||
classes: Classes,
|
props: Props,
|
||||||
/// Devuelve el título del panel.
|
/// Devuelve el título del panel.
|
||||||
title: L10n,
|
title: L10n,
|
||||||
/// Devuelve el punto de ruptura configurado para cambiar el comportamiento del panel.
|
/// Devuelve el punto de ruptura configurado para cambiar el comportamiento del panel.
|
||||||
|
|
@ -73,13 +73,13 @@ impl Component for Offcanvas {
|
||||||
}
|
}
|
||||||
|
|
||||||
fn setup(&mut self, _cx: &Context) {
|
fn setup(&mut self, _cx: &Context) {
|
||||||
self.alter_classes(ClassesOp::Prepend, {
|
self.alter_prop(PropsOp::prepend_classes({
|
||||||
let mut classes = "offcanvas".to_string();
|
let mut classes = "offcanvas".to_string();
|
||||||
self.breakpoint().push_class(&mut classes, "offcanvas", "");
|
self.breakpoint().push_class(&mut classes, "offcanvas", "");
|
||||||
self.placement().push_class(&mut classes);
|
self.placement().push_class(&mut classes);
|
||||||
self.visibility().push_class(&mut classes);
|
self.visibility().push_class(&mut classes);
|
||||||
classes
|
classes
|
||||||
});
|
}));
|
||||||
}
|
}
|
||||||
|
|
||||||
fn prepare(&self, cx: &mut Context) -> Result<Markup, ComponentError> {
|
fn prepare(&self, cx: &mut Context) -> Result<Markup, ComponentError> {
|
||||||
|
|
@ -97,10 +97,10 @@ impl Offcanvas {
|
||||||
self
|
self
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Modifica la lista de clases CSS aplicadas al panel.
|
/// Modifica los atributos HTML o las clases CSS del panel.
|
||||||
#[builder_fn]
|
#[builder_fn]
|
||||||
pub fn with_classes(mut self, op: ClassesOp, classes: impl AsRef<str>) -> Self {
|
pub fn with_prop(mut self, op: PropsOp) -> Self {
|
||||||
self.classes.alter_classes(op, classes);
|
self.props.alter_prop(op);
|
||||||
self
|
self
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -192,7 +192,7 @@ impl Offcanvas {
|
||||||
html! {
|
html! {
|
||||||
div
|
div
|
||||||
id=(&id)
|
id=(&id)
|
||||||
class=[self.classes().get()]
|
(self.props())
|
||||||
tabindex="-1"
|
tabindex="-1"
|
||||||
data-bs-scroll=[body_scroll]
|
data-bs-scroll=[body_scroll]
|
||||||
data-bs-backdrop=[backdrop]
|
data-bs-backdrop=[backdrop]
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue