ironhtml_bootstrap/
close_button.rs

1//! Bootstrap close button component.
2//!
3//! Provides type-safe Bootstrap close buttons matching the
4//! [Bootstrap close button documentation](https://getbootstrap.com/docs/5.3/components/close-button/).
5
6use ironhtml::typed::Element;
7use ironhtml_elements::Button;
8
9/// Create a Bootstrap close button.
10///
11/// ## Example
12///
13/// ```rust
14/// use ironhtml_bootstrap::close_button::close_button;
15///
16/// let btn = close_button();
17/// assert!(btn.render().contains("btn-close"));
18/// ```
19#[must_use]
20pub fn close_button() -> Element<Button> {
21    Element::<Button>::new()
22        .attr("type", "button")
23        .class("btn-close")
24        .attr("aria-label", "Close")
25}
26
27/// Create a disabled close button.
28#[must_use]
29pub fn close_button_disabled() -> Element<Button> {
30    Element::<Button>::new()
31        .attr("type", "button")
32        .class("btn-close")
33        .attr("aria-label", "Close")
34        .bool_attr("disabled")
35}
36
37/// Create a white (inverted) close button for dark backgrounds.
38#[must_use]
39pub fn close_button_white() -> Element<Button> {
40    Element::<Button>::new()
41        .attr("type", "button")
42        .class("btn-close btn-close-white")
43        .attr("aria-label", "Close")
44}
45
46/// Create a close button that dismisses an alert.
47#[must_use]
48pub fn close_button_dismiss_alert() -> Element<Button> {
49    Element::<Button>::new()
50        .attr("type", "button")
51        .class("btn-close")
52        .attr("data-bs-dismiss", "alert")
53        .attr("aria-label", "Close")
54}
55
56/// Create a close button that dismisses a modal.
57#[must_use]
58pub fn close_button_dismiss_modal() -> Element<Button> {
59    Element::<Button>::new()
60        .attr("type", "button")
61        .class("btn-close")
62        .attr("data-bs-dismiss", "modal")
63        .attr("aria-label", "Close")
64}
65
66/// Create a close button that dismisses an offcanvas.
67#[must_use]
68pub fn close_button_dismiss_offcanvas() -> Element<Button> {
69    Element::<Button>::new()
70        .attr("type", "button")
71        .class("btn-close")
72        .attr("data-bs-dismiss", "offcanvas")
73        .attr("aria-label", "Close")
74}
75
76/// Create a close button that dismisses a toast.
77#[must_use]
78pub fn close_button_dismiss_toast() -> Element<Button> {
79    Element::<Button>::new()
80        .attr("type", "button")
81        .class("btn-close")
82        .attr("data-bs-dismiss", "toast")
83        .attr("aria-label", "Close")
84}
85
86#[cfg(test)]
87mod tests {
88    use super::*;
89
90    #[test]
91    fn test_close_button() {
92        let btn = close_button();
93        let html = btn.render();
94        assert!(html.contains("btn-close"));
95        assert!(html.contains(r#"aria-label="Close"#));
96    }
97
98    #[test]
99    fn test_close_button_disabled() {
100        let btn = close_button_disabled();
101        assert!(btn.render().contains("disabled"));
102    }
103
104    #[test]
105    fn test_close_button_white() {
106        let btn = close_button_white();
107        assert!(btn.render().contains("btn-close-white"));
108    }
109
110    #[test]
111    fn test_close_button_dismiss() {
112        let btn = close_button_dismiss_modal();
113        assert!(btn.render().contains(r#"data-bs-dismiss="modal"#));
114    }
115}