Skip to main content

dioxus_bootstrap_css/
input_group.rs

1use dioxus::prelude::*;
2
3use crate::types::Size;
4
5/// Bootstrap InputGroup component.
6///
7/// # Bootstrap HTML → Dioxus
8///
9/// | HTML | Dioxus |
10/// |---|---|
11/// | `<div class="input-group">` | `InputGroup { ... }` |
12/// | `<div class="input-group input-group-sm">` | `InputGroup { size: Size::Sm, ... }` |
13/// | `<span class="input-group-text">@</span>` | `InputGroupText { "@" }` |
14///
15/// ```rust,no_run
16/// # use dioxus::prelude::*;
17/// # use dioxus_bootstrap_css::prelude::*;
18/// # fn _doctest() -> Element {
19/// rsx! {
20///     InputGroup {
21///         InputGroupText { "@" }
22///         Input { placeholder: "Username" }
23///     }
24///     InputGroup {
25///         Input { placeholder: "Search..." }
26///         InputGroupText {
27///             Button { color: Color::Primary, Icon { name: "search" } }
28///         }
29///     }
30/// }
31/// # }
32/// ```
33#[derive(Clone, PartialEq, Props)]
34pub struct InputGroupProps {
35    /// Input group size.
36    #[props(default)]
37    pub size: Size,
38    /// Additional CSS classes.
39    #[props(default)]
40    pub class: String,
41    /// Child elements (inputs, InputGroupText, buttons).
42    pub children: Element,
43}
44
45#[component]
46pub fn InputGroup(props: InputGroupProps) -> Element {
47    let size_class = match props.size {
48        Size::Md => String::new(),
49        s => format!(" input-group-{s}"),
50    };
51
52    let full_class = if props.class.is_empty() {
53        format!("input-group{size_class}")
54    } else {
55        format!("input-group{size_class} {}", props.class)
56    };
57
58    rsx! {
59        div { class: "{full_class}", {props.children} }
60    }
61}
62
63/// Text addon for InputGroup.
64#[derive(Clone, PartialEq, Props)]
65pub struct InputGroupTextProps {
66    /// Additional CSS classes.
67    #[props(default)]
68    pub class: String,
69    /// Child elements.
70    pub children: Element,
71}
72
73#[component]
74pub fn InputGroupText(props: InputGroupTextProps) -> Element {
75    let full_class = if props.class.is_empty() {
76        "input-group-text".to_string()
77    } else {
78        format!("input-group-text {}", props.class)
79    };
80
81    rsx! {
82        span { class: "{full_class}", {props.children} }
83    }
84}