orbital_base_components/overlay/inline/message_bar/
base.rs1use 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}