use std::time::Duration;
use autumn_web::{Markup, html};
use super::{Behavior, marker};
use crate::markup::{Attributes, common, millis};
#[derive(Debug, Clone, Default, PartialEq, Eq)]
#[must_use]
pub struct Dismiss {
after: Option<Duration>,
focus: Option<String>,
extra: Attributes,
}
impl Dismiss {
pub const fn new() -> Self {
Self {
after: None,
focus: None,
extra: Vec::new(),
}
}
pub const fn after(mut self, duration: Duration) -> Self {
self.after = Some(duration);
self
}
pub fn focus(mut self, selector: impl Into<String>) -> Self {
self.focus = Some(selector.into());
self
}
#[must_use]
pub fn attributes(&self) -> Attributes {
let mut attributes = vec![marker(Behavior::Dismiss)];
if let Some(after) = self.after {
attributes.push(("data-vanilla-dismiss-after", millis(after).to_string()));
}
if let Some(focus) = &self.focus {
attributes.push(("data-vanilla-dismiss-focus", focus.clone()));
}
attributes.extend(self.extra.iter().cloned());
attributes
}
#[must_use]
pub fn close_button(label: &str) -> Markup {
html! { button type="button" data-vanilla-dismiss-close { (label) } }
}
}
common!(Dismiss, wrap);