+
+ "If you want to use message, you need to wrap the component where you call related methods inside MessageProvider and use use_message to get the API."
+
+
+
+
+
+
+
+
+
+
+
+
+ }
+ "#,
+ "rust"
+ )
+ >
+
+ ""
+
+
+
+ }
+}
diff --git a/demo/src/pages/mod.rs b/demo/src/pages/mod.rs
index 6017702..79fba8a 100644
--- a/demo/src/pages/mod.rs
+++ b/demo/src/pages/mod.rs
@@ -15,6 +15,7 @@ mod image;
mod input;
mod input_number;
mod menu;
+mod message;
mod mobile;
mod modal;
mod nav_bar;
@@ -43,6 +44,7 @@ pub use image::*;
pub use input::*;
pub use input_number::*;
pub use menu::*;
+pub use message::*;
pub use mobile::*;
pub use modal::*;
pub use nav_bar::*;
diff --git a/src/icon/mod.rs b/src/icon/mod.rs
index 916b061..a1d28fb 100644
--- a/src/icon/mod.rs
+++ b/src/icon/mod.rs
@@ -1,6 +1,6 @@
// copy https://github.com/Carlosted/leptos-icons
// leptos updated version causes leptos_icons error
-pub use icondata::*;
+pub(crate) use icondata::*;
use leptos::*;
/// The Icon component.
diff --git a/src/lib.rs b/src/lib.rs
index 88e53b1..58082cf 100644
--- a/src/lib.rs
+++ b/src/lib.rs
@@ -16,6 +16,7 @@ mod input;
mod input_number;
mod layout;
mod menu;
+mod message;
pub mod mobile;
mod modal;
mod progress;
@@ -46,6 +47,7 @@ pub use input::*;
pub use input_number::*;
pub use layout::*;
pub use menu::*;
+pub use message::*;
pub use modal::*;
pub use progress::*;
pub use select::*;
diff --git a/src/message/message.css b/src/message/message.css
new file mode 100644
index 0000000..92047e1
--- /dev/null
+++ b/src/message/message.css
@@ -0,0 +1,44 @@
+.melt-message-container {
+ z-index: 6000;
+ position: fixed;
+ top: 12px;
+ left: 0;
+ right: 0;
+ height: 0;
+ overflow: visible;
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+}
+
+.melt-message-wrapper {
+ margin-bottom: 8px;
+}
+
+.melt-message {
+ box-sizing: border-box;
+ display: flex;
+ align-items: center;
+ flex-wrap: nowrap;
+ overflow: hidden;
+
+ padding: 10px 20px;
+ max-width: 75vh;
+ background: #fff;
+
+ font-size: 14px;
+ border-radius: 3px;
+ box-shadow: 0 3px 6px -4px rgba(0, 0, 0, 0.12),
+ 0 6px 16px 0 rgba(0, 0, 0, 0.08), 0 9px 28px 8px rgba(0, 0, 0, 0.05);
+}
+
+.melt-message__icon {
+ width: 20px;
+ height: 20px;
+ margin-right: 10px;
+ font-size: 20px;
+}
+
+.melt-message__content {
+ line-height: 1.6;
+}
diff --git a/src/message/message.rs b/src/message/message.rs
new file mode 100644
index 0000000..1abd940
--- /dev/null
+++ b/src/message/message.rs
@@ -0,0 +1,44 @@
+use crate::{theme::use_theme, Icon, Theme};
+use icondata::*;
+use leptos::*;
+
+#[derive(Default, Clone)]
+pub enum MessageVariant {
+ #[default]
+ Success,
+ Warning,
+ Error,
+}
+
+impl MessageVariant {
+ fn icon(&self) -> Icon {
+ match self {
+ MessageVariant::Success => icondata::Icon::Ai(AiCloseCircleFilled),
+ MessageVariant::Warning => icondata::Icon::Ai(AiExclamationCircleFilled),
+ MessageVariant::Error => icondata::Icon::Ai(AiCheckCircleFilled),
+ }
+ }
+ fn theme_color(&self, theme: &Theme) -> String {
+ match self {
+ MessageVariant::Success => theme.common.color_success.clone(),
+ MessageVariant::Warning => theme.common.color_warning.clone(),
+ MessageVariant::Error => theme.common.color_error.clone(),
+ }
+ }
+}
+
+#[component]
+pub(crate) fn Message(variant: MessageVariant, content: String) -> impl IntoView {
+ let theme = use_theme(Theme::light);
+ let style = theme.with_untracked(|theme| format!("color: {};", variant.theme_color(theme)));
+ view! {
+