From 1be3d888885e175b92c7664efb284f708951bc36 Mon Sep 17 00:00:00 2001 From: Manuel Cillero Date: Sat, 29 Aug 2026 19:25:58 +0200 Subject: [PATCH] =?UTF-8?q?=E2=99=BB=EF=B8=8F=20Migra=20#[builder=5Ffn]=20?= =?UTF-8?q?a=20#[builder=5Fimpl]?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Sustituye las ~400 anotaciones `#[builder_fn]` método a método por un único `#[builder_impl]` por `impl`/`trait`, en 74 ficheros de pagetop y sus extensiones (admin, bootsier, menu, user). --- .../src/component/admin_frame.rs | 3 +-- .../src/component/config_form.rs | 4 +++- extensions/pagetop-admin/src/settings.rs | 8 +++---- .../pagetop-bootsier/src/theme/bs/badge.rs | 4 ++-- .../pagetop-bootsier/src/theme/bs/button.rs | 8 ++----- .../src/theme/bs/container.rs | 4 ++-- .../pagetop-bootsier/src/theme/bs/dropdown.rs | 12 ++-------- .../src/theme/bs/form/input.rs | 4 ++-- .../src/theme/bs/form/select.rs | 4 ++-- .../src/theme/bs/form/textarea.rs | 4 ++-- .../pagetop-bootsier/src/theme/bs/icon.rs | 5 +---- .../pagetop-bootsier/src/theme/bs/nav.rs | 4 ++-- .../src/theme/bs/navbar/component.rs | 6 ++--- .../src/theme/bs/offcanvas/component.rs | 10 +-------- .../src/theme/bs/sidebar/item.rs | 4 +--- .../src/theme/bs/sidebar/section.rs | 2 +- .../pagetop-menu/src/component/menu_block.rs | 5 +---- .../src/component/menu_breadcrumb.rs | 2 +- .../component/admin/admin_password_form.rs | 4 +--- .../src/component/admin/role_form.rs | 9 +------- .../component/admin/role_permissions_form.rs | 5 +---- .../src/component/admin/role_table.rs | 9 +------- .../src/component/admin/user_form.rs | 13 +---------- .../src/component/admin/user_roles_form.rs | 5 +---- .../src/component/admin/user_table.rs | 9 +------- .../pagetop-user/src/component/login_form.rs | 3 +-- .../src/component/password_confirm.rs | 3 +-- .../component/password_reset_confirm_form.rs | 2 +- .../src/component/password_reset_form.rs | 2 +- .../src/component/register_form.rs | 2 +- src/base/component/badge.rs | 5 +---- src/base/component/block.rs | 5 +---- src/base/component/brand.rs | 6 +---- src/base/component/breadcrumb/component.rs | 4 +--- src/base/component/breadcrumb/crumb.rs | 3 +-- src/base/component/button/component.rs | 13 +---------- src/base/component/button/set.rs | 4 +--- src/base/component/container.rs | 4 +--- src/base/component/dialog.rs | 6 +---- src/base/component/dropdown/component.rs | 8 +------ src/base/component/dropdown/item.rs | 3 +-- src/base/component/form/check.rs | 12 ++-------- src/base/component/form/checkbox.rs | 12 +--------- src/base/component/form/component.rs | 7 +----- src/base/component/form/fieldset.rs | 7 +----- src/base/component/form/hidden.rs | 3 +-- src/base/component/form/input.rs | 17 +------------- src/base/component/form/number.rs | 14 +----------- src/base/component/form/radio.rs | 13 ++--------- src/base/component/form/range.rs | 12 +--------- src/base/component/form/select.rs | 20 +++-------------- src/base/component/form/textarea.rs | 16 +------------- src/base/component/html.rs | 2 +- src/base/component/image/component.rs | 6 +---- src/base/component/intro.rs | 6 +---- src/base/component/messages.rs | 3 +-- src/base/component/nav/component.rs | 5 +---- src/base/component/nav/item.rs | 4 +--- src/base/component/navbar/component.rs | 5 +---- src/base/component/pager.rs | 14 +----------- src/base/component/poweredby.rs | 2 +- src/base/component/table/cell.rs | 6 +---- src/base/component/table/column.rs | 6 +---- src/base/component/table/component.rs | 6 +---- src/base/component/table/props.rs | 4 +--- src/base/component/table/row.rs | 4 +--- src/core/component.rs | 3 +-- src/core/component/children.rs | 8 +++---- src/core/component/context.rs | 22 +++---------------- src/core/theme/regions.rs | 4 ++-- src/html/attr.rs | 6 ++--- src/html/props.rs | 7 +++--- src/html/route_path.rs | 5 ++--- src/response/page.rs | 17 +++----------- 74 files changed, 104 insertions(+), 394 deletions(-) diff --git a/extensions/pagetop-admin/src/component/admin_frame.rs b/extensions/pagetop-admin/src/component/admin_frame.rs index 8a63ed23..cbdfd371 100644 --- a/extensions/pagetop-admin/src/component/admin_frame.rs +++ b/extensions/pagetop-admin/src/component/admin_frame.rs @@ -68,16 +68,15 @@ impl Component for AdminFrame { } } +#[builder_impl] impl AdminFrame { /// Establece el título de la página. - #[builder_fn] pub fn with_title(mut self, title: Lc) -> Self { self.title = title; self } /// Añade un componente hijo al contenido de la página. - #[builder_fn] pub fn with_child(mut self, op: impl Into) -> Self { self.children.alter_child(op.into()); self diff --git a/extensions/pagetop-admin/src/component/config_form.rs b/extensions/pagetop-admin/src/component/config_form.rs index 304fb621..d8ea0da0 100644 --- a/extensions/pagetop-admin/src/component/config_form.rs +++ b/extensions/pagetop-admin/src/component/config_form.rs @@ -201,8 +201,10 @@ impl Component for ConfigForm { } } +#[builder_impl] impl ConfigForm { /// Crea el componente con el [`SettingsSchema`] dado. + #[builder_skip] pub fn with_schema(schema: SettingsSchema) -> Self { ConfigForm { schema: Some(schema), @@ -210,7 +212,6 @@ impl ConfigForm { } } - #[builder_fn] pub fn with_action_path(mut self, v: impl Into>) -> Self { if let Some(v) = v.into() { self.action_path = Some(v); @@ -218,6 +219,7 @@ impl ConfigForm { self } + #[builder_skip] pub(crate) fn with_saved(mut self, saved: bool, error: bool) -> Self { self.saved = saved; self.error = error; diff --git a/extensions/pagetop-admin/src/settings.rs b/extensions/pagetop-admin/src/settings.rs index 0eb3028a..e2e38ee7 100644 --- a/extensions/pagetop-admin/src/settings.rs +++ b/extensions/pagetop-admin/src/settings.rs @@ -3,7 +3,7 @@ //! Proporciona una API async para leer y escribir valores JSON en la tabla `settings`. use pagetop::datetime::Utc; -use pagetop::{Getters, builder_fn}; +use pagetop::{Getters, builder_impl}; use pagetop_seaorm::db::{ ActiveModelTrait, ActiveValue, ColumnTrait, EntityTrait, QueryFilter, dbconn, }; @@ -128,6 +128,7 @@ pub struct SettingField { default_value: Option, } +#[builder_impl] impl SettingField { /// Crea un campo de texto con nombre y etiqueta. pub fn text(name: impl Into, label: impl Into) -> Self { @@ -185,21 +186,18 @@ impl SettingField { } /// Establece si el campo es obligatorio. - #[builder_fn] pub fn with_required(mut self, required: bool) -> Self { self.required = required; self } /// Añade texto de ayuda bajo el campo. - #[builder_fn] pub fn with_help(mut self, text: impl Into) -> Self { self.help_text = Some(text.into()); self } /// Establece el valor por defecto (como valor JSON serializado). - #[builder_fn] pub fn with_default(mut self, value: &T) -> Self { self.default_value = serde_json::to_string(value).ok(); self @@ -215,6 +213,7 @@ pub struct SettingsSchema { fields: Vec, } +#[builder_impl] impl SettingsSchema { /// Crea un nuevo esquema vacío para el `scope` dado. pub fn new(scope: impl Into) -> Self { @@ -225,7 +224,6 @@ impl SettingsSchema { } /// Añade un campo al esquema. - #[builder_fn] pub fn with_field(mut self, field: SettingField) -> Self { self.fields.push(field); self diff --git a/extensions/pagetop-bootsier/src/theme/bs/badge.rs b/extensions/pagetop-bootsier/src/theme/bs/badge.rs index bd3a40dc..ab058de7 100644 --- a/extensions/pagetop-bootsier/src/theme/bs/badge.rs +++ b/extensions/pagetop-bootsier/src/theme/bs/badge.rs @@ -18,15 +18,15 @@ const EXTRA_COLOR: &str = "bootsier.badge.color"; /// /// let badge = bs::Badge::labeled(Lc::n("Beta")).with_color(BootsierColors::Dark); /// ``` +#[builder_impl] pub trait BadgeBootsier { /// Fuerza un color de la paleta de Bootsier, ignorando el que le correspondería a la `Intent` /// del badge. `None` restablece el comportamiento por defecto (color derivado de la `Intent`). - #[builder_fn] fn with_color(self, color: impl Into>) -> Self; } +#[builder_impl] impl BadgeBootsier for Badge { - #[builder_fn] fn with_color(mut self, color: impl Into>) -> Self { match color.into() { Some(color) => self.alter_prop(PropsOp::set_extra(EXTRA_COLOR, color)), diff --git a/extensions/pagetop-bootsier/src/theme/bs/button.rs b/extensions/pagetop-bootsier/src/theme/bs/button.rs index 6581f95a..56ac3adb 100644 --- a/extensions/pagetop-bootsier/src/theme/bs/button.rs +++ b/extensions/pagetop-bootsier/src/theme/bs/button.rs @@ -33,36 +33,32 @@ const EXTRA_COLOR: &str = "bootsier.button.color"; /// .with_style(button::Style::Solid(Intent::Neutral)) /// .with_color(BootsierColors::Light); /// ``` +#[builder_impl] pub trait ButtonBootsier { /// Marca el botón como activo (`.active`, `aria-pressed="true"`). - #[builder_fn] fn with_active(self, active: bool) -> Self; /// Expande el botón al ancho completo de su contenedor (`w-100`). - #[builder_fn] fn with_full_width(self, full_width: bool) -> Self; /// Fuerza un color de la paleta de Bootsier, ignorando el que le correspondería a la `Intent` /// del botón. `None` restablece el comportamiento por defecto (color derivado de la `Intent`). /// Sin efecto si el estilo del botón es [`Style::Link`] o [`Style::None`]. - #[builder_fn] fn with_color(self, color: impl Into>) -> Self; } +#[builder_impl] impl ButtonBootsier for Button { - #[builder_fn] fn with_active(mut self, active: bool) -> Self { self.alter_prop(PropsOp::set_extra(EXTRA_ACTIVE, active)); self } - #[builder_fn] fn with_full_width(mut self, full_width: bool) -> Self { self.alter_prop(PropsOp::set_extra(EXTRA_FULL_WIDTH, full_width)); self } - #[builder_fn] fn with_color(mut self, color: impl Into>) -> Self { match color.into() { Some(color) => self.alter_prop(PropsOp::set_extra(EXTRA_COLOR, color)), diff --git a/extensions/pagetop-bootsier/src/theme/bs/container.rs b/extensions/pagetop-bootsier/src/theme/bs/container.rs index e86b5679..67526ab8 100644 --- a/extensions/pagetop-bootsier/src/theme/bs/container.rs +++ b/extensions/pagetop-bootsier/src/theme/bs/container.rs @@ -32,18 +32,18 @@ const EXTRA_WIDTH: &str = "bootsier.container.width"; /// .with_prop(PropsOp::add_classes(class::Border::with(ScaleSize::One))) /// .with_prop(PropsOp::add_classes(class::Rounded::new())); /// ``` +#[builder_impl] pub trait ContainerBootsier { /// Establece el comportamiento del ancho para el contenedor. /// /// Determina si el contenedor aplica los anchos máximos predefinidos para cada punto de /// ruptura, o si ocupa siempre el 100% del ancho disponible, o lo hace hasta un ancho máximo /// explícito. Ver [`Width`] para las variantes disponibles. - #[builder_fn] fn with_width(self, width: Width) -> Self; } +#[builder_impl] impl ContainerBootsier for Container { - #[builder_fn] fn with_width(mut self, width: Width) -> Self { self.alter_prop(PropsOp::set_extra(EXTRA_WIDTH, width)); self diff --git a/extensions/pagetop-bootsier/src/theme/bs/dropdown.rs b/extensions/pagetop-bootsier/src/theme/bs/dropdown.rs index bbb08461..338a45fd 100644 --- a/extensions/pagetop-bootsier/src/theme/bs/dropdown.rs +++ b/extensions/pagetop-bootsier/src/theme/bs/dropdown.rs @@ -44,54 +44,46 @@ const EXTRA_MENU_POSITION: &str = "bootsier.dropdown.menu_position"; /// .with_item(bs::dropdown::Item::header(Lc::n("User session"))) /// .with_item(bs::dropdown::Item::button(Lc::n("Sign out"))); /// ``` +#[builder_impl] pub trait DropdownBootsier { /// Indica si el botón del menú está integrado en un grupo de botones. - #[builder_fn] fn with_button_grouped(self, grouped: bool) -> Self; /// Establece la política de cierre automático del menú desplegable. - #[builder_fn] fn with_auto_close(self, auto_close: AutoClose) -> Self; /// Establece la dirección de despliegue del menú. - #[builder_fn] fn with_direction(self, direction: Direction) -> Self; /// Configura la alineación horizontal (con posible comportamiento *responsive* adicional). - #[builder_fn] fn with_menu_align(self, align: MenuAlign) -> Self; /// Configura la posición del menú. - #[builder_fn] fn with_menu_position(self, position: MenuPosition) -> Self; } +#[builder_impl] impl DropdownBootsier for Dropdown { - #[builder_fn] fn with_button_grouped(mut self, grouped: bool) -> Self { self.alter_prop(PropsOp::set_extra(EXTRA_BUTTON_GROUPED, grouped)); self } - #[builder_fn] fn with_auto_close(mut self, auto_close: AutoClose) -> Self { self.alter_prop(PropsOp::set_extra(EXTRA_AUTO_CLOSE, auto_close)); self } - #[builder_fn] fn with_direction(mut self, direction: Direction) -> Self { self.alter_prop(PropsOp::set_extra(EXTRA_DIRECTION, direction)); self } - #[builder_fn] fn with_menu_align(mut self, align: MenuAlign) -> Self { self.alter_prop(PropsOp::set_extra(EXTRA_MENU_ALIGN, align)); self } - #[builder_fn] fn with_menu_position(mut self, position: MenuPosition) -> Self { self.alter_prop(PropsOp::set_extra(EXTRA_MENU_POSITION, position)); self diff --git a/extensions/pagetop-bootsier/src/theme/bs/form/input.rs b/extensions/pagetop-bootsier/src/theme/bs/form/input.rs index 6de0698e..524b2fa4 100644 --- a/extensions/pagetop-bootsier/src/theme/bs/form/input.rs +++ b/extensions/pagetop-bootsier/src/theme/bs/form/input.rs @@ -22,18 +22,18 @@ const EXTRA_FLOATING_LABEL: &str = "bootsier.form.input.floating_label"; /// .with_placeholder(Lc::n("Enter your name")) /// .with_floating_label(true); /// ``` +#[builder_impl] pub trait InputBootsier { /// Establece si la etiqueta se muestra flotante sobre el campo. /// /// Cuando está activo, la etiqueta se superpone al campo y asciende al enfocarlo o cuando tiene /// contenido. Requiere que el campo tenga un atributo `placeholder` definido; si no se /// especifica, se fuerza `placeholder=""` antes del renderizado. - #[builder_fn] fn with_floating_label(self, floating: bool) -> Self; } +#[builder_impl] impl InputBootsier for Field { - #[builder_fn] fn with_floating_label(mut self, floating: bool) -> Self { self.alter_prop(PropsOp::set_extra(EXTRA_FLOATING_LABEL, floating)); self diff --git a/extensions/pagetop-bootsier/src/theme/bs/form/select.rs b/extensions/pagetop-bootsier/src/theme/bs/form/select.rs index 4759c4f8..7132ca26 100644 --- a/extensions/pagetop-bootsier/src/theme/bs/form/select.rs +++ b/extensions/pagetop-bootsier/src/theme/bs/form/select.rs @@ -24,6 +24,7 @@ const EXTRA_FLOATING_LABEL: &str = "bootsier.form.select.floating_label"; /// .with_item(bs::form::select::Item::new("es", Lc::n("Spanish"))) /// .with_item(bs::form::select::Item::new("en", Lc::n("English"))); /// ``` +#[builder_impl] pub trait SelectBootsier { /// Establece si la etiqueta se muestra flotante sobre el campo. /// @@ -33,12 +34,11 @@ pub trait SelectBootsier { /// Si se usa la etiqueta flotante, se anulan los valores establecidos con /// [`with_multiple()`](form::select::Field::with_multiple) y /// [`with_rows()`](form::select::Field::with_rows) antes del renderizado. - #[builder_fn] fn with_floating_label(self, floating: bool) -> Self; } +#[builder_impl] impl SelectBootsier for Field { - #[builder_fn] fn with_floating_label(mut self, floating: bool) -> Self { self.alter_prop(PropsOp::set_extra(EXTRA_FLOATING_LABEL, floating)); self diff --git a/extensions/pagetop-bootsier/src/theme/bs/form/textarea.rs b/extensions/pagetop-bootsier/src/theme/bs/form/textarea.rs index 264a6d59..8d5573a8 100644 --- a/extensions/pagetop-bootsier/src/theme/bs/form/textarea.rs +++ b/extensions/pagetop-bootsier/src/theme/bs/form/textarea.rs @@ -22,6 +22,7 @@ const EXTRA_FLOATING_LABEL: &str = "bootsier.form.textarea.floating_label"; /// .with_placeholder(Lc::n("Write here...")) /// .with_floating_label(true); /// ``` +#[builder_impl] pub trait TextareaBootsier { /// Establece si la etiqueta se muestra flotante sobre el campo. /// @@ -31,12 +32,11 @@ pub trait TextareaBootsier { /// /// Si se usa la etiqueta flotante, se anula el valor establecido con /// [`with_rows()`](form::Textarea::with_rows) antes del renderizado. - #[builder_fn] fn with_floating_label(self, floating: bool) -> Self; } +#[builder_impl] impl TextareaBootsier for Textarea { - #[builder_fn] fn with_floating_label(mut self, floating: bool) -> Self { self.alter_prop(PropsOp::set_extra(EXTRA_FLOATING_LABEL, floating)); self diff --git a/extensions/pagetop-bootsier/src/theme/bs/icon.rs b/extensions/pagetop-bootsier/src/theme/bs/icon.rs index 4fe0f8ec..ea4bb430 100644 --- a/extensions/pagetop-bootsier/src/theme/bs/icon.rs +++ b/extensions/pagetop-bootsier/src/theme/bs/icon.rs @@ -78,6 +78,7 @@ impl Component for Icon { } } +#[builder_impl] impl Icon { pub fn font() -> Self { Self::default().with_icon_kind(IconKind::Font(FontSize::default())) @@ -104,26 +105,22 @@ impl Icon { // **< Icon BUILDER >*************************************************************************** /// Establece el identificador único del componente; igual a `with_prop(PropsOp::set_id(id))`. - #[builder_fn] pub fn with_id(mut self, id: impl Into) -> Self { self.props.alter_id(id); self } /// Modifica identificador, clases CSS, atributos HTML o valores extra del componente. - #[builder_fn] pub fn with_prop(mut self, op: PropsOp) -> Self { self.props.alter_prop(op); self } - #[builder_fn] pub fn with_icon_kind(mut self, icon_kind: IconKind) -> Self { self.icon_kind = icon_kind; self } - #[builder_fn] pub fn with_aria_label(mut self, label: Lc) -> Self { self.aria_label.alter_value(label); self diff --git a/extensions/pagetop-bootsier/src/theme/bs/nav.rs b/extensions/pagetop-bootsier/src/theme/bs/nav.rs index 13a9f3d3..ba2079ef 100644 --- a/extensions/pagetop-bootsier/src/theme/bs/nav.rs +++ b/extensions/pagetop-bootsier/src/theme/bs/nav.rs @@ -46,14 +46,14 @@ pub(crate) const EXTRA_IN_NAVBAR: &str = "bootsier.nav.in_navbar"; /// )) /// .with_item(bs::nav::Item::link_disabled(Lc::n("Disabled"), "#")); /// ``` +#[builder_impl] pub trait NavBootsier { /// Cambia el estilo del menú (*Tabs*, *Pills*, *Underline* o *Default*). - #[builder_fn] fn with_kind(self, kind: Kind) -> Self; } +#[builder_impl] impl NavBootsier for Nav { - #[builder_fn] fn with_kind(mut self, kind: Kind) -> Self { self.alter_prop(PropsOp::set_extra(EXTRA_KIND, kind)); self diff --git a/extensions/pagetop-bootsier/src/theme/bs/navbar/component.rs b/extensions/pagetop-bootsier/src/theme/bs/navbar/component.rs index 26a651fe..82a0bff6 100644 --- a/extensions/pagetop-bootsier/src/theme/bs/navbar/component.rs +++ b/extensions/pagetop-bootsier/src/theme/bs/navbar/component.rs @@ -140,6 +140,7 @@ const EXTRA_EXPAND: &str = "bootsier.navbar.expand"; /// .with_item(bs::nav::Item::link(Lc::n("Stock"), "/stock")) /// )); /// ``` +#[builder_impl] pub trait NavbarBootsier { /// Crea una barra de navegación cuyo contenido se muestra en un **offcanvas**. fn offcanvas(oc: bs::Offcanvas) -> Self; @@ -151,14 +152,13 @@ pub trait NavbarBootsier { fn offcanvas_brand_right(brand: Brand, oc: bs::Offcanvas) -> Self; /// Define a partir de qué punto de ruptura la barra de navegación deja de colapsar. - #[builder_fn] fn with_expand(self, bp: BreakPoint) -> Self; /// Define dónde se mostrará la barra de navegación dentro del documento. - #[builder_fn] fn with_position(self, position: bs::navbar::Position) -> Self; } +#[builder_impl] impl NavbarBootsier for Navbar { fn offcanvas(oc: bs::Offcanvas) -> Self { let mut navbar = Self::new(); @@ -187,13 +187,11 @@ impl NavbarBootsier for Navbar { navbar } - #[builder_fn] fn with_expand(mut self, bp: BreakPoint) -> Self { self.alter_prop(PropsOp::set_extra(EXTRA_EXPAND, bp)); self } - #[builder_fn] fn with_position(mut self, position: bs::navbar::Position) -> Self { self.alter_prop(PropsOp::set_extra(EXTRA_POSITION, position)); self diff --git a/extensions/pagetop-bootsier/src/theme/bs/offcanvas/component.rs b/extensions/pagetop-bootsier/src/theme/bs/offcanvas/component.rs index 207f756f..1dcabe91 100644 --- a/extensions/pagetop-bootsier/src/theme/bs/offcanvas/component.rs +++ b/extensions/pagetop-bootsier/src/theme/bs/offcanvas/component.rs @@ -90,25 +90,23 @@ impl Component for Offcanvas { } } +#[builder_impl] impl Offcanvas { // **< Offcanvas BUILDER >********************************************************************** /// Establece el identificador único del componente; igual a `with_prop(PropsOp::set_id(id))`. - #[builder_fn] pub fn with_id(mut self, id: impl Into) -> Self { self.props.alter_id(id); self } /// Modifica identificador, clases CSS, atributos HTML o valores extra del componente. - #[builder_fn] pub fn with_prop(mut self, op: PropsOp) -> Self { self.props.alter_prop(op); self } /// Establece el título del encabezado. - #[builder_fn] pub fn with_title(mut self, title: Lc) -> Self { self.title = title; self @@ -123,7 +121,6 @@ impl Offcanvas { /// Por ejemplo, con `BreakPoint::Lg`, será *offcanvas* en móviles y tabletas, y visible /// directamente en pantallas grandes. Por defecto usa `BreakPoint::None` para que sea /// *offcanvas* siempre. - #[builder_fn] pub fn with_breakpoint(mut self, bp: BreakPoint) -> Self { self.breakpoint = bp; self @@ -131,28 +128,24 @@ impl Offcanvas { /// Ajusta la capa de fondo del panel para definir su comportamiento al hacer clic fuera del /// panel. - #[builder_fn] pub fn with_backdrop(mut self, backdrop: bs::offcanvas::Backdrop) -> Self { self.backdrop = backdrop; self } /// Permite o bloquea el desplazamiento de la página principal mientras el panel está abierto. - #[builder_fn] pub fn with_body_scroll(mut self, scrolling: bs::offcanvas::BodyScroll) -> Self { self.body_scroll = scrolling; self } /// Indica desde qué borde de la ventana entra y se ancla el panel. - #[builder_fn] pub fn with_placement(mut self, placement: bs::offcanvas::Placement) -> Self { self.placement = placement; self } /// Fija el estado inicial del panel (oculto o visible al cargar). - #[builder_fn] pub fn with_visibility(mut self, visibility: bs::offcanvas::Visibility) -> Self { self.visibility = visibility; self @@ -160,7 +153,6 @@ impl Offcanvas { /// Añade un nuevo componente al panel o modifica la lista de componentes (`children`) con una /// operación [`ChildOp`]. - #[builder_fn] pub fn with_child(mut self, op: impl Into) -> Self { self.children.alter_child(op.into()); self diff --git a/extensions/pagetop-bootsier/src/theme/bs/sidebar/item.rs b/extensions/pagetop-bootsier/src/theme/bs/sidebar/item.rs index 2305fdd0..49b34932 100644 --- a/extensions/pagetop-bootsier/src/theme/bs/sidebar/item.rs +++ b/extensions/pagetop-bootsier/src/theme/bs/sidebar/item.rs @@ -65,6 +65,7 @@ impl Component for Item { } } +#[builder_impl] impl Item { /// Crea un ítem de navegación con etiqueta, ruta e icono. /// @@ -82,21 +83,18 @@ impl Item { // **< Item BUILDER >*************************************************************************** /// Establece el texto localizable del ítem. - #[builder_fn] pub fn with_label(mut self, label: Lc) -> Self { self.label = label; self } /// Establece la ruta de destino del ítem. - #[builder_fn] pub fn with_route(mut self, route: impl Into>) -> Self { self.route = route.into(); self } /// Establece el nombre del icono de Bootstrap Icons (sin el prefijo `bi-`). - #[builder_fn] pub fn with_icon(mut self, icon: impl Into) -> Self { self.icon = icon.into(); self diff --git a/extensions/pagetop-bootsier/src/theme/bs/sidebar/section.rs b/extensions/pagetop-bootsier/src/theme/bs/sidebar/section.rs index 16fbb793..d4d7805f 100644 --- a/extensions/pagetop-bootsier/src/theme/bs/sidebar/section.rs +++ b/extensions/pagetop-bootsier/src/theme/bs/sidebar/section.rs @@ -40,6 +40,7 @@ impl Component for Section { } } +#[builder_impl] impl Section { /// Crea un encabezado de sección con el título indicado. pub fn titled(title: Lc) -> Self { @@ -49,7 +50,6 @@ impl Section { // **< Section BUILDER >************************************************************************ /// Establece el título localizable de la sección. - #[builder_fn] pub fn with_title(mut self, title: Lc) -> Self { self.title = title; self diff --git a/extensions/pagetop-menu/src/component/menu_block.rs b/extensions/pagetop-menu/src/component/menu_block.rs index afcd79b4..2bd24030 100644 --- a/extensions/pagetop-menu/src/component/menu_block.rs +++ b/extensions/pagetop-menu/src/component/menu_block.rs @@ -107,6 +107,7 @@ impl Component for MenuBlock { } } +#[builder_impl] impl MenuBlock { /// Crea un `MenuBlock` para el menú con el `machine_name` dado. pub fn with(menu_name: impl Into) -> Self { @@ -115,7 +116,6 @@ impl MenuBlock { block } - #[builder_fn] pub fn with_show_title(mut self, v: impl Into>) -> Self { if let Some(v) = v.into() { self.show_title = v; @@ -125,13 +125,11 @@ impl MenuBlock { /// Establece la profundidad máxima de nodos a incluir. El efectivo nunca supera `2`, por muy /// alto que sea el valor indicado (ver "Limitaciones conocidas" en [`MenuBlock`]). - #[builder_fn] pub fn with_max_depth(mut self, v: impl Into>) -> Self { self.max_depth = v.into(); self } - #[builder_fn] pub fn with_include_disabled(mut self, v: impl Into>) -> Self { if let Some(v) = v.into() { self.include_disabled = v; @@ -139,7 +137,6 @@ impl MenuBlock { self } - #[builder_fn] pub fn with_hide_when_empty(mut self, v: impl Into>) -> Self { if let Some(v) = v.into() { self.hide_when_empty = v; diff --git a/extensions/pagetop-menu/src/component/menu_breadcrumb.rs b/extensions/pagetop-menu/src/component/menu_breadcrumb.rs index 9d9d95e2..c049883c 100644 --- a/extensions/pagetop-menu/src/component/menu_breadcrumb.rs +++ b/extensions/pagetop-menu/src/component/menu_breadcrumb.rs @@ -73,6 +73,7 @@ impl Component for MenuBreadcrumb { } } +#[builder_impl] impl MenuBreadcrumb { /// Crea un `MenuBreadcrumb` para el menú con el `machine_name` dado. pub fn with(menu_name: impl Into) -> Self { @@ -81,7 +82,6 @@ impl MenuBreadcrumb { bc } - #[builder_fn] pub fn with_include_current(mut self, v: impl Into>) -> Self { if let Some(v) = v.into() { self.include_current = v; diff --git a/extensions/pagetop-user/src/component/admin/admin_password_form.rs b/extensions/pagetop-user/src/component/admin/admin_password_form.rs index 85befebf..3c418660 100644 --- a/extensions/pagetop-user/src/component/admin/admin_password_form.rs +++ b/extensions/pagetop-user/src/component/admin/admin_password_form.rs @@ -43,22 +43,20 @@ impl Component for AdminPasswordForm { } } +#[builder_impl] impl AdminPasswordForm { // **< AdminPasswordForm BUILDER >************************************************************** - #[builder_fn] pub(crate) fn with_user_id(mut self, user_id: i32) -> Self { self.user_id = user_id; self } - #[builder_fn] pub(crate) fn with_error(mut self, error: impl Into>) -> Self { self.error = error.into(); self } - #[builder_fn] pub(crate) fn with_waypoint(mut self, waypoint: impl Into) -> Self { self.waypoint = waypoint.into(); self diff --git a/extensions/pagetop-user/src/component/admin/role_form.rs b/extensions/pagetop-user/src/component/admin/role_form.rs index d8efba69..5bbfea89 100644 --- a/extensions/pagetop-user/src/component/admin/role_form.rs +++ b/extensions/pagetop-user/src/component/admin/role_form.rs @@ -98,52 +98,45 @@ impl Component for RoleForm { } } +#[builder_impl] impl RoleForm { // **< RoleForm BUILDER >*********************************************************************** - #[builder_fn] pub(crate) fn with_mode(mut self, mode: RoleFormMode) -> Self { self.mode = mode; self } - #[builder_fn] pub(crate) fn with_error(mut self, error: impl Into>) -> Self { self.error = error.into(); self } - #[builder_fn] pub(crate) fn with_role_id(mut self, role_id: impl Into>) -> Self { self.role_id = role_id.into(); self } - #[builder_fn] pub(crate) fn with_waypoint(mut self, waypoint: impl Into) -> Self { self.waypoint = waypoint.into(); self } - #[builder_fn] pub(crate) fn with_machine_name(mut self, machine_name: impl Into) -> Self { self.machine_name = machine_name.into(); self } - #[builder_fn] pub(crate) fn with_label(mut self, label: impl Into) -> Self { self.label = label.into(); self } - #[builder_fn] pub(crate) fn with_description(mut self, description: impl Into) -> Self { self.description = description.into(); self } - #[builder_fn] pub(crate) fn with_weight(mut self, weight: i32) -> Self { self.weight = weight; self diff --git a/extensions/pagetop-user/src/component/admin/role_permissions_form.rs b/extensions/pagetop-user/src/component/admin/role_permissions_form.rs index 9263588e..ad1b237c 100644 --- a/extensions/pagetop-user/src/component/admin/role_permissions_form.rs +++ b/extensions/pagetop-user/src/component/admin/role_permissions_form.rs @@ -61,28 +61,25 @@ impl Component for RolePermissionsForm { } } +#[builder_impl] impl RolePermissionsForm { // **< RolePermissionsForm BUILDER >************************************************************ - #[builder_fn] pub(crate) fn with_role_id(mut self, role_id: i32) -> Self { self.role_id = role_id; self } - #[builder_fn] pub(crate) fn with_error(mut self, error: impl Into>) -> Self { self.error = error.into(); self } - #[builder_fn] pub(crate) fn with_groups(mut self, groups: PermissionGroups) -> Self { self.groups = groups; self } - #[builder_fn] pub(crate) fn with_waypoint(mut self, waypoint: impl Into) -> Self { self.waypoint = waypoint.into(); self diff --git a/extensions/pagetop-user/src/component/admin/role_table.rs b/extensions/pagetop-user/src/component/admin/role_table.rs index 9c28ead8..8bd97db0 100644 --- a/extensions/pagetop-user/src/component/admin/role_table.rs +++ b/extensions/pagetop-user/src/component/admin/role_table.rs @@ -128,52 +128,45 @@ impl Component for RoleTable { } } +#[builder_impl] impl RoleTable { // **< RoleTable BUILDER >********************************************************************** - #[builder_fn] pub(crate) fn with_prop(mut self, op: PropsOp) -> Self { self.props.alter_prop(op); self } - #[builder_fn] pub(crate) fn with_items(mut self, items: Vec) -> Self { self.items = items; self } - #[builder_fn] pub(crate) fn with_message(mut self, message: impl Into>) -> Self { self.message = message.into(); self } - #[builder_fn] pub(crate) fn with_sort(mut self, sort: RoleSortField) -> Self { self.sort = sort; self } - #[builder_fn] pub(crate) fn with_dir(mut self, dir: SortDir) -> Self { self.dir = dir; self } - #[builder_fn] pub(crate) fn with_page(mut self, page: u64) -> Self { self.page = page; self } - #[builder_fn] pub(crate) fn with_per_page(mut self, per_page: u64) -> Self { self.per_page = per_page; self } - #[builder_fn] pub(crate) fn with_total(mut self, total: u64) -> Self { self.total = total; self diff --git a/extensions/pagetop-user/src/component/admin/user_form.rs b/extensions/pagetop-user/src/component/admin/user_form.rs index 4ee68fcd..ecaf8217 100644 --- a/extensions/pagetop-user/src/component/admin/user_form.rs +++ b/extensions/pagetop-user/src/component/admin/user_form.rs @@ -121,76 +121,65 @@ impl Component for UserForm { } } +#[builder_impl] impl UserForm { // **< UserForm BUILDER >*********************************************************************** - #[builder_fn] pub(crate) fn with_mode(mut self, mode: UserFormMode) -> Self { self.mode = mode; self } - #[builder_fn] pub(crate) fn with_error(mut self, error: impl Into>) -> Self { self.error = error.into(); self } - #[builder_fn] pub(crate) fn with_user_id(mut self, user_id: impl Into>) -> Self { self.user_id = user_id.into(); self } - #[builder_fn] pub(crate) fn with_waypoint(mut self, waypoint: impl Into) -> Self { self.waypoint = waypoint.into(); self } - #[builder_fn] pub(crate) fn with_username(mut self, username: impl Into) -> Self { self.username = username.into(); self } - #[builder_fn] pub(crate) fn with_email(mut self, email: impl Into) -> Self { self.email = email.into(); self } - #[builder_fn] pub(crate) fn with_display_name(mut self, display_name: impl Into) -> Self { self.display_name = display_name.into(); self } - #[builder_fn] pub(crate) fn with_language(mut self, language: impl Into) -> Self { self.language = language.into(); self } - #[builder_fn] pub(crate) fn with_timezone(mut self, timezone: impl Into) -> Self { self.timezone = timezone.into(); self } - #[builder_fn] pub(crate) fn with_roles(mut self, roles: Vec<(i32, String, bool)>) -> Self { self.roles = roles; self } - #[builder_fn] pub(crate) fn with_allow_admin_field(mut self, allow_admin_field: bool) -> Self { self.allow_admin_field = allow_admin_field; self } - #[builder_fn] pub(crate) fn with_is_admin(mut self, is_admin: bool) -> Self { self.is_admin = is_admin; self diff --git a/extensions/pagetop-user/src/component/admin/user_roles_form.rs b/extensions/pagetop-user/src/component/admin/user_roles_form.rs index cbf9e779..927c07b0 100644 --- a/extensions/pagetop-user/src/component/admin/user_roles_form.rs +++ b/extensions/pagetop-user/src/component/admin/user_roles_form.rs @@ -43,28 +43,25 @@ impl Component for UserRolesForm { } } +#[builder_impl] impl UserRolesForm { // **< UserRolesForm BUILDER >****************************************************************** - #[builder_fn] pub(crate) fn with_user_id(mut self, user_id: i32) -> Self { self.user_id = user_id; self } - #[builder_fn] pub(crate) fn with_error(mut self, error: impl Into>) -> Self { self.error = error.into(); self } - #[builder_fn] pub(crate) fn with_roles(mut self, roles: Vec<(i32, String, bool)>) -> Self { self.roles = roles; self } - #[builder_fn] pub(crate) fn with_waypoint(mut self, waypoint: impl Into) -> Self { self.waypoint = waypoint.into(); self diff --git a/extensions/pagetop-user/src/component/admin/user_table.rs b/extensions/pagetop-user/src/component/admin/user_table.rs index d8b67b17..b32315eb 100644 --- a/extensions/pagetop-user/src/component/admin/user_table.rs +++ b/extensions/pagetop-user/src/component/admin/user_table.rs @@ -100,52 +100,45 @@ impl Component for UserTable { } } +#[builder_impl] impl UserTable { // **< UserTable BUILDER >********************************************************************** - #[builder_fn] pub(crate) fn with_prop(mut self, op: PropsOp) -> Self { self.props.alter_prop(op); self } - #[builder_fn] pub(crate) fn with_items(mut self, items: Vec) -> Self { self.items = items; self } - #[builder_fn] pub(crate) fn with_sort(mut self, sort: UserSortField) -> Self { self.sort = sort; self } - #[builder_fn] pub(crate) fn with_dir(mut self, dir: SortDir) -> Self { self.dir = dir; self } - #[builder_fn] pub(crate) fn with_query(mut self, query: impl Into>) -> Self { self.query = query.into(); self } - #[builder_fn] pub(crate) fn with_page(mut self, page: u64) -> Self { self.page = page; self } - #[builder_fn] pub(crate) fn with_per_page(mut self, per_page: u64) -> Self { self.per_page = per_page; self } - #[builder_fn] pub(crate) fn with_total(mut self, total: u64) -> Self { self.total = total; self diff --git a/extensions/pagetop-user/src/component/login_form.rs b/extensions/pagetop-user/src/component/login_form.rs index 7012331a..ec582d0b 100644 --- a/extensions/pagetop-user/src/component/login_form.rs +++ b/extensions/pagetop-user/src/component/login_form.rs @@ -97,14 +97,13 @@ fn links(allow_registration: bool) -> Html { }) } +#[builder_impl] impl LoginForm { - #[builder_fn] pub fn with_error(mut self, error: impl Into>) -> Self { self.error = error.into(); self } - #[builder_fn] pub fn with_waypoint(mut self, waypoint: impl Into) -> Self { self.waypoint = waypoint.into(); self diff --git a/extensions/pagetop-user/src/component/password_confirm.rs b/extensions/pagetop-user/src/component/password_confirm.rs index 93c445b1..480b2ca1 100644 --- a/extensions/pagetop-user/src/component/password_confirm.rs +++ b/extensions/pagetop-user/src/component/password_confirm.rs @@ -48,18 +48,17 @@ impl Component for PasswordConfirm { } } +#[builder_impl] impl PasswordConfirm { // **< PasswordConfirm BUILDER >******************************************************************** /// Establece la etiqueta del campo de contraseña (por defecto, "field-password"). - #[builder_fn] pub(crate) fn with_password_label(mut self, label: Lc) -> Self { self.password_label = label; self } /// Establece la etiqueta del campo de confirmación (por defecto, "field-confirm-password"). - #[builder_fn] pub(crate) fn with_confirm_label(mut self, label: Lc) -> Self { self.confirm_label = label; self diff --git a/extensions/pagetop-user/src/component/password_reset_confirm_form.rs b/extensions/pagetop-user/src/component/password_reset_confirm_form.rs index dc185c07..172af055 100644 --- a/extensions/pagetop-user/src/component/password_reset_confirm_form.rs +++ b/extensions/pagetop-user/src/component/password_reset_confirm_form.rs @@ -44,8 +44,8 @@ impl Component for PasswordResetConfirmForm { } } +#[builder_impl] impl PasswordResetConfirmForm { - #[builder_fn] pub fn with_error(mut self, error: impl Into>) -> Self { self.error = error.into(); self diff --git a/extensions/pagetop-user/src/component/password_reset_form.rs b/extensions/pagetop-user/src/component/password_reset_form.rs index 5e0bdb29..89bb3361 100644 --- a/extensions/pagetop-user/src/component/password_reset_form.rs +++ b/extensions/pagetop-user/src/component/password_reset_form.rs @@ -49,8 +49,8 @@ fn back_to_login() -> Html { }) } +#[builder_impl] impl PasswordResetForm { - #[builder_fn] pub fn with_error(mut self, error: impl Into>) -> Self { self.error = error.into(); self diff --git a/extensions/pagetop-user/src/component/register_form.rs b/extensions/pagetop-user/src/component/register_form.rs index 66ac153b..5eec2871 100644 --- a/extensions/pagetop-user/src/component/register_form.rs +++ b/extensions/pagetop-user/src/component/register_form.rs @@ -45,8 +45,8 @@ impl Component for RegisterForm { } } +#[builder_impl] impl RegisterForm { - #[builder_fn] pub fn with_error(mut self, error: impl Into>) -> Self { self.error = error.into(); self diff --git a/src/base/component/badge.rs b/src/base/component/badge.rs index 1a7c45a0..3aee8b06 100644 --- a/src/base/component/badge.rs +++ b/src/base/component/badge.rs @@ -49,6 +49,7 @@ impl Component for Badge { } } +#[builder_impl] impl Badge { /// Crea un badge predeterminado (`Intent::default()`) con la etiqueta indicada. pub fn labeled(label: Lc) -> Self { @@ -115,28 +116,24 @@ impl Badge { // **< Badge BUILDER >************************************************************************** /// Establece el identificador único del componente; igual a `with_prop(PropsOp::set_id(id))`. - #[builder_fn] pub fn with_id(mut self, id: impl Into) -> Self { self.props.alter_id(id); self } /// Modifica identificador, clases CSS, atributos HTML o valores extra del componente. - #[builder_fn] pub fn with_prop(mut self, op: PropsOp) -> Self { self.props.alter_prop(op); self } /// Establece la etiqueta del badge. - #[builder_fn] pub fn with_label(mut self, label: Lc) -> Self { self.label = label; self } /// Establece la intención semántica del badge. - #[builder_fn] pub fn with_intent(mut self, intent: Intent) -> Self { self.intent = intent; self diff --git a/src/base/component/block.rs b/src/base/component/block.rs index 2bf350df..2f01f01e 100644 --- a/src/base/component/block.rs +++ b/src/base/component/block.rs @@ -50,25 +50,23 @@ impl Component for Block { } } +#[builder_impl] impl Block { // **< Block BUILDER >************************************************************************** /// Establece el identificador único del componente; igual a `with_prop(PropsOp::set_id(id))`. - #[builder_fn] pub fn with_id(mut self, id: impl Into) -> Self { self.props.alter_id(id); self } /// Modifica identificador, clases CSS, atributos HTML o valores extra del componente. - #[builder_fn] pub fn with_prop(mut self, op: PropsOp) -> Self { self.props.alter_prop(op); self } /// Establece el título del bloque. - #[builder_fn] pub fn with_title(mut self, title: Lc) -> Self { self.title = title; self @@ -76,7 +74,6 @@ impl Block { /// Añade un nuevo componente al bloque o modifica la lista de componentes (`children`) con una /// operación [`ChildOp`]. - #[builder_fn] pub fn with_child(mut self, op: impl Into) -> Self { self.children.alter_child(op.into()); self diff --git a/src/base/component/brand.rs b/src/base/component/brand.rs index a1113ef3..913a24e1 100644 --- a/src/base/component/brand.rs +++ b/src/base/component/brand.rs @@ -77,39 +77,35 @@ impl Component for Brand { } } +#[builder_impl] impl Brand { // **< Brand BUILDER >************************************************************************** /// Establece el identificador único del componente; igual a `with_prop(PropsOp::set_id(id))`. - #[builder_fn] pub fn with_id(mut self, id: impl Into) -> Self { self.props.alter_id(id); self } /// Modifica identificador, clases CSS, atributos HTML o valores extra del componente. - #[builder_fn] pub fn with_prop(mut self, op: PropsOp) -> Self { self.props.alter_prop(op); self } /// Asigna o quita la imagen de marca. Si se pasa `None`, no se mostrará. - #[builder_fn] pub fn with_image(mut self, image: impl Into>) -> Self { self.image.alter_component(image); self } /// Establece el título de la identidad de marca. - #[builder_fn] pub fn with_title(mut self, title: Lc) -> Self { self.title = title; self } /// Define la ruta de destino. Si es `None`, la marca no será un enlace. - #[builder_fn] pub fn with_route(mut self, route: impl Into>) -> Self { self.route = route.into(); self diff --git a/src/base/component/breadcrumb/component.rs b/src/base/component/breadcrumb/component.rs index dca96e18..ce3bfa9e 100644 --- a/src/base/component/breadcrumb/component.rs +++ b/src/base/component/breadcrumb/component.rs @@ -67,25 +67,23 @@ impl Component for Breadcrumb { } } +#[builder_impl] impl Breadcrumb { // **< Breadcrumb BUILDER >********************************************************************* /// Establece el identificador único del componente; igual a `with_prop(PropsOp::set_id(id))`. - #[builder_fn] pub fn with_id(mut self, id: impl Into) -> Self { self.props.alter_id(id); self } /// Modifica identificador, clases CSS, atributos HTML o valores extra del componente. - #[builder_fn] pub fn with_prop(mut self, op: PropsOp) -> Self { self.props.alter_prop(op); self } /// Añade un nuevo elemento al final del breadcrumb. - #[builder_fn] pub fn with_crumb(mut self, crumb: breadcrumb::Crumb) -> Self { self.crumbs.push(crumb); self diff --git a/src/base/component/breadcrumb/crumb.rs b/src/base/component/breadcrumb/crumb.rs index b29ce92b..0352a76f 100644 --- a/src/base/component/breadcrumb/crumb.rs +++ b/src/base/component/breadcrumb/crumb.rs @@ -31,6 +31,7 @@ pub struct Crumb { is_current: bool, } +#[builder_impl] impl Crumb { /// Crea un elemento enlazado a la ruta indicada. pub fn new(label: Lc, route: impl Into) -> Self { @@ -66,14 +67,12 @@ impl Crumb { // **< Crumb BUILDER >************************************************************************** /// Establece el identificador único del elemento. - #[builder_fn] pub fn with_id(mut self, id: impl Into) -> Self { self.props.alter_id(id); self } /// Modifica identificador, clases CSS o atributos HTML del elemento. - #[builder_fn] pub fn with_prop(mut self, op: PropsOp) -> Self { self.props.alter_prop(op); self diff --git a/src/base/component/button/component.rs b/src/base/component/button/component.rs index 34a1bb1f..805881d5 100644 --- a/src/base/component/button/component.rs +++ b/src/base/component/button/component.rs @@ -131,6 +131,7 @@ impl Component for Button { } } +#[builder_impl] impl Button { /// Crea un botón de **envío** (`type="submit"`). /// @@ -186,35 +187,30 @@ impl Button { // **< Button BUILDER >************************************************************************* /// Establece el identificador único del componente; igual a `with_prop(PropsOp::set_id(id))`. - #[builder_fn] pub fn with_id(mut self, id: impl Into) -> Self { self.props.alter_id(id); self } /// Modifica identificador, clases CSS, atributos HTML o valores extra del componente. - #[builder_fn] pub fn with_prop(mut self, op: PropsOp) -> Self { self.props.alter_prop(op); self } /// Establece el comportamiento del botón al activarse. - #[builder_fn] pub fn with_kind(mut self, kind: button::Kind) -> Self { self.kind = kind; self } /// Establece el tamaño visual del botón (usa [`button::Size::None`] para quitarlo). - #[builder_fn] pub fn with_size(mut self, size: button::Size) -> Self { self.size = size; self } /// Establece el estilo visual del botón (usa [`button::Style::None`] para quitarlo). - #[builder_fn] pub fn with_style(mut self, style: button::Style) -> Self { self.style = style; self @@ -224,7 +220,6 @@ impl Button { /// /// Cuando el formulario tiene varios botones de envío, el navegador incluye en el envío el par /// `name=value` sólo del botón que activó el formulario. Permite identificar cuál fue pulsado. - #[builder_fn] pub fn with_name(mut self, name: impl AsRef) -> Self { self.name.alter_name(name); self @@ -234,21 +229,18 @@ impl Button { /// /// Es el dato que el navegador transmite al servidor junto con el `name` cuando este botón /// activa el envío. Útil para distinguir entre varios botones de envío en un mismo formulario. - #[builder_fn] pub fn with_value(mut self, value: impl AsRef) -> Self { self.value.alter_str(value); self } /// Establece la etiqueta visible del botón (usa [`Lc::none()`] para quitarla). - #[builder_fn] pub fn with_label(mut self, label: Lc) -> Self { self.label = label; self } /// Establece el texto emergente del botón (usa [`Lc::none()`] para quitarlo). - #[builder_fn] pub fn with_title(mut self, title: Lc) -> Self { self.title = title; self @@ -257,21 +249,18 @@ impl Button { /// Establece la ruta de destino y convierte el botón en enlace de navegación (``). /// Puedes usar un [`Route`] vacío (por defecto) para que vuelva a renderizarse como `