Skip to main content

orbital_base_components/overlay/inline/message_bar/
base.rs

1use leptos::prelude::*;
2
3use crate::overlay::FeedbackIntent;
4
5use super::intent_icon::message_bar_intent_icon;
6
7#[derive(Clone, Copy, Default, PartialEq, Eq)]
8pub enum MessageBarLayout {
9    #[default]
10    Singleline,
11    Multiline,
12}
13
14impl MessageBarLayout {
15    pub fn as_str(&self) -> &'static str {
16        match self {
17            Self::Singleline => "singleline",
18            Self::Multiline => "multiline",
19        }
20    }
21}
22
23#[component]
24pub fn BaseMessageBar(
25    #[prop(optional, into)] class: MaybeProp<String>,
26    #[prop(default = MessageBarLayout::Singleline)] layout: MessageBarLayout,
27    #[prop(optional, into)] intent: Signal<FeedbackIntent>,
28    children: Children,
29) -> impl IntoView {
30    view! {
31        <div
32            class=move || {
33                let mut parts = vec![
34                    "orbital-message-bar".to_string(),
35                    format!("orbital-message-bar--{}", intent.get().as_str()),
36                    format!("orbital-message-bar--{}", layout.as_str()),
37                ];
38                if let Some(extra) = class.get() {
39                    if !extra.is_empty() {
40                        parts.push(extra);
41                    }
42                }
43                parts.join(" ")
44            }
45            role="group"
46        >
47            <div class="orbital-message-bar__icon">
48                {move || message_bar_intent_icon(intent.get())}
49            </div>
50            {children()}
51        </div>
52    }
53}
54
55#[component]
56pub fn BaseMessageBarTitle(
57    #[prop(optional, into)] class: MaybeProp<String>,
58    children: Children,
59) -> impl IntoView {
60    view! {
61        <div class=move || format_class("orbital-message-bar-title", class.get())>
62            {children()}
63        </div>
64    }
65}
66
67#[component]
68pub fn BaseMessageBarBody(
69    #[prop(optional, into)] class: MaybeProp<String>,
70    children: Children,
71) -> impl IntoView {
72    view! {
73        <div class=move || format_class("orbital-message-bar-body", class.get())>
74            {children()}
75        </div>
76    }
77}
78
79#[component]
80pub fn BaseMessageBarActions(
81    #[prop(optional, into)] class: MaybeProp<String>,
82    children: Children,
83) -> impl IntoView {
84    view! {
85        <div class=move || format_class("orbital-message-bar-actions", class.get())>
86            {children()}
87        </div>
88    }
89}
90
91fn format_class(base: &str, extra: Option<String>) -> String {
92    match extra {
93        Some(extra) if !extra.is_empty() => format!("{base} {extra}"),
94        _ => base.to_string(),
95    }
96}