diff --git a/assets/css/basic.css b/assets/css/basic.css index 13e663cf..aa54408b 100644 --- a/assets/css/basic.css +++ b/assets/css/basic.css @@ -16,10 +16,6 @@ --val-color--text--muted: color-mix(in srgb, var(--val-color--text) 50%, var(--val-color--bg)); --val-color--border: #212529; --val-color--primary: #0d6efd; - --val-color--secondary: #6c757d; - --val-color--light: #dee2e6; - --val-color--info: #0dcaf0; - --val-color--warning: #ffc107; --val-color--danger: #dc3545; --val-color--switch-off: #adb5bd; } @@ -141,91 +137,6 @@ input:disabled + label { color: var(--val-color--text--muted); } -/* - * Messages component - */ - -.message { - padding: 0.75rem 1rem; - margin-bottom: 1rem; - border: 1px solid transparent; - border-radius: 0.375rem; -} - -.message-info { - color: color-mix(in srgb, var(--val-color--info) 40%, black); - background-color: color-mix(in srgb, var(--val-color--info) 15%, var(--val-color--bg)); - border-color: color-mix(in srgb, var(--val-color--info) 40%, var(--val-color--bg)); -} - -.message-warning { - color: color-mix(in srgb, var(--val-color--warning) 40%, black); - background-color: color-mix(in srgb, var(--val-color--warning) 15%, var(--val-color--bg)); - border-color: color-mix(in srgb, var(--val-color--warning) 40%, var(--val-color--bg)); -} - -.message-error { - color: color-mix(in srgb, var(--val-color--danger) 40%, black); - background-color: color-mix(in srgb, var(--val-color--danger) 15%, var(--val-color--bg)); - border-color: color-mix(in srgb, var(--val-color--danger) 40%, var(--val-color--bg)); -} - -/* - * Table component - */ - -.table-responsive { - overflow-x: auto; - -webkit-overflow-scrolling: touch; -} - -.table { - width: 100%; - border-collapse: collapse; - text-align: left; -} - -.table th, -.table td { - padding: 0.5rem 0.75rem; - border-bottom: 1px solid color-mix(in srgb, var(--val-color--border) 15%, var(--val-color--bg)); -} - -.table thead th { - border-bottom-width: 2px; - font-weight: 600; -} - -.table-sort { - color: inherit; - text-decoration: none; -} -.table-sort:hover { - text-decoration: underline; -} -.table-sort::after { - content: "\25BC"; - margin-left: 0.25rem; - font-size: 0.8em; - opacity: 0.15; -} -.table-sort-asc::after { - content: "\25B2"; - font-size: 0.8em; - opacity: 1; -} -.table-sort-desc::after { - content: "\25BC"; - font-size: 0.8em; - opacity: 1; -} - -.table-empty { - text-align: center; - font-style: italic; - color: var(--val-color--text--muted); -} - /* * Pager component */ diff --git a/src/base/component.rs b/src/base/component.rs index e2f290a6..687d2995 100644 --- a/src/base/component.rs +++ b/src/base/component.rs @@ -29,9 +29,6 @@ pub use html::Html; mod intro; pub use intro::{Intro, IntroOpening}; -mod messages; -pub use messages::Messages; - mod pager; pub use pager::{Pager, PagerAlign, PagerVisibility}; diff --git a/src/base/component/messages.rs b/src/base/component/messages.rs deleted file mode 100644 index 0522f4a8..00000000 --- a/src/base/component/messages.rs +++ /dev/null @@ -1,88 +0,0 @@ -use crate::prelude::*; - -/// Componente que muestra los **mensajes de usuario** acumulados en el contexto. -/// -/// No recibe ningún contenido de quien lo construye. Lo obtiene directamente del [`Context`] (ver -/// [`Context::push_message()`](Context::push_message)) en el momento de renderizarse (ver -/// [`Context::messages()`]). Si no hay ninguno acumulado, no se renderiza nada. -/// -/// # Clases CSS -/// -/// Cada nivel de severidad renderiza siempre las mismas clases fijas: `.message.message-info`, -/// `.message.message-warning` o `.message.message-error`. Será el tema activo quien decide el -/// aspecto visual de cada nivel, proporcionando las reglas CSS para esas clases. -/// -/// # Ejemplo -/// -/// ```rust,no_run -/// use pagetop::prelude::*; -/// -/// async fn save_settings(cx: &mut Context) { -/// cx.push_message(MessageLevel::Info, Lc::n("Settings saved.")); -/// } -/// -/// async fn homepage(request: HttpRequest) -> Result { -/// Page::new(request) -/// .with_child(Messages::new()) -/// // ... resto del contenido de la página ... -/// .render() -/// .await -/// } -/// ``` -#[derive(AutoDefault, Clone, Debug, Getters)] -pub struct Messages { - /// Devuelve identificador, clases CSS, atributos HTML y valores extra del componente. - props: Props, -} - -#[async_trait] -impl Component for Messages { - fn new() -> Self { - Self::default() - } - - fn id(&self) -> Option { - self.props.get_id() - } - - fn setup(&mut self, _cx: &Context) { - self.alter_prop(PropsOp::prepend_classes("messages")); - } - - async fn prepare(&self, cx: &mut Context) -> Result { - if !cx.has_messages() { - return Ok(html! {}); - } - Ok(html! { - div (self.props()) role="alert" { - @for message in cx.messages() { - div class=(match message.level() { - MessageLevel::Info => "message message-info", - MessageLevel::Warning => "message message-warning", - MessageLevel::Error => "message message-error", - }) { - (message.text().using(cx)) - } - } - } - }) - } -} - -impl Messages { - // **< Messages 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 - } -}