diff --git a/apps/demo/src/Views/Ui/components/Message.tsx b/apps/demo/src/Views/Ui/components/Message.tsx
index 33da4da45..18b473d1b 100644
--- a/apps/demo/src/Views/Ui/components/Message.tsx
+++ b/apps/demo/src/Views/Ui/components/Message.tsx
@@ -1,16 +1,56 @@
import { useTranslation } from "@dzangolab/react-i18n";
-import { Button, Message, Page } from "@dzangolab/react-ui";
+import { Button, Message, Page, TDataTable } from "@dzangolab/react-ui";
import { useNavigate } from "react-router-dom";
-import { Section } from "../../../components/Demo";
+import { CodeBlock, Section } from "../../../components/Demo";
export const MessageDemo = () => {
const [t] = useTranslation("ui");
const navigate = useNavigate();
+ const propertiesData = [
+ {
+ default: "false",
+ description: t("message.propertiesDescription.enableClose"),
+ prop: "enableClose",
+ type: "boolean",
+ },
+ {
+ default: "-",
+ description: t("message.propertiesDescription.icon"),
+ prop: "icon",
+ type: "string | ReactNode",
+ },
+ {
+ default: "-",
+ description: t("message.propertiesDescription.message"),
+ prop: "message",
+ type: "string | string[] | ReactNode",
+ },
+ {
+ default: "-",
+ description: t("message.propertiesDescription.onClose"),
+ prop: "onClose",
+ type: "() => void",
+ },
+ {
+ default: "info",
+ description: t("message.propertiesDescription.severity"),
+ prop: "severity",
+ type: `"info" | "success" | "warning" | "danger"`,
+ },
+ {
+ default: "true",
+ description: t("message.propertiesDescription.showIcon"),
+ prop: "showIcon",
+ type: "boolean",
+ },
+ ];
+
return (
{
/>
}
>
-
+
+ {t("common.usage", { component: "Message" })}
+
+
+
+
+
+
+ {t("message.contents.content1")}} />
+
+
+
+
+
+
+
+
+
+
}
+ enableClose={true}
+ icon={}
+ message={t("message.contents.content4")}
+ />
+
+
+
+
+
+
diff --git a/apps/demo/src/locales/en/ui.json b/apps/demo/src/locales/en/ui.json
index a48a6369f..4eade75d1 100644
--- a/apps/demo/src/locales/en/ui.json
+++ b/apps/demo/src/locales/en/ui.json
@@ -5,6 +5,14 @@
"common": {
"usage": "To use the {{component}} component, simply import it into your React file:"
},
+ "propertiesTable": {
+ "header": {
+ "default": "Default",
+ "description": "Description",
+ "properties": "Properties",
+ "type": "Type"
+ }
+ },
"headers": {
"buttons": "Buttons",
"data": "Data",
@@ -215,7 +223,39 @@
}
},
"message": {
- "title": "Message"
+ "contents": {
+ "content1": "Season Sale: Enjoy massive discounts with up to 50% off on a wide range of selected items — from fashion to electronics, don’t miss out on these limited-time offers!",
+ "content2": "New features just launched! Check them out!",
+ "content3": "New Year, New You: Start fresh with our services!",
+ "content4": "We value your feedback: take our quick survey!",
+ "content5": "Warning: Limited time only! Sale ends soon!",
+ "danger": "Danger message",
+ "info": "Info message",
+ "success": "Success message",
+ "warning": "Warning message"
+ },
+ "subtitle": "The Message component displays contextual messages with optional icons and a closable action. It supports custom slots, making it flexible for various use cases.",
+ "propertiesDescription": {
+ "enableClose": "Displays a close icon if true, allowing the message to be dismissed.",
+ "icon": "Icon to display alongside the message.",
+ "message": "The message text to display in the component.",
+ "onClose": "Function to be called when the message is closed.",
+ "severity": "Defines the styling severity of the message. Defaults to 'info'.",
+ "showIcon": "Show default icon based on severity or custom icon if provided."
+ },
+ "title": "Message",
+ "usage": {
+ "arrayMessage": "Array of message",
+ "basic": "Basic",
+ "customMessage": "Custom message",
+ "enableClose": "Enable close",
+ "hideIcon": "Hide default icon",
+ "icons": {
+ "customIcon": "Custom icon",
+ "icon": "Icon"
+ },
+ "severity": "Severity"
+ }
},
"modal": {
"title": "Modal",
diff --git a/apps/demo/src/locales/fr/ui.json b/apps/demo/src/locales/fr/ui.json
index d7ef338f8..07f597644 100644
--- a/apps/demo/src/locales/fr/ui.json
+++ b/apps/demo/src/locales/fr/ui.json
@@ -5,6 +5,14 @@
"common": {
"usage": "To use the {{component}} component, simply import it into your React file (fr):"
},
+ "propertiesTable": {
+ "header": {
+ "default": "Default (fr)",
+ "description": "Description (fr)",
+ "properties": "Properties (fr)",
+ "type": "Type (fr)"
+ }
+ },
"headers": {
"buttons": "Buttons (fr)",
"data": "Data (fr)",
@@ -215,7 +223,39 @@
}
},
"message": {
- "title": "Message (fr)"
+ "contents": {
+ "content1": "Season Sale: Enjoy massive discounts with up to 50% off on a wide range of selected items — from fashion to electronics, don’t miss out on these limited-time offers! (fr)",
+ "content2": "New features just launched! Check them out! (fr)",
+ "content3": "New Year, New You: Start fresh with our services! (fr)",
+ "content4": "We value your feedback: take our quick survey! (fr)",
+ "content5": "Warning: Limited time only! Sale ends soon! (fr)",
+ "danger": "Danger message (fr)",
+ "info": "Info message (fr)",
+ "success": "Success message (fr)",
+ "warning": "Warning message (fr)"
+ },
+ "subtitle": "The Message component displays contextual messages with optional icons and a closable action. It supports custom slots, making it flexible for various use cases. (fr)",
+ "propertiesDescription": {
+ "enableClose": "Displays a close icon if true, allowing the message to be dismissed. (fr)",
+ "icon": "Icon to display alongside the message. (fr)",
+ "message": "The message text to display in the component. (fr)",
+ "onClose": "Function to be called when the message is closed. (fr)",
+ "severity": "Defines the styling severity of the message. Defaults to 'info'. (fr)",
+ "showIcon": "Show default icon based on severity or custom icon if provided. (fr)"
+ },
+ "title": "Message (fr)",
+ "usage": {
+ "arrayMessage": "Array of message (fr)",
+ "basic": "Basic (fr)",
+ "customMessage": "Custom message (fr)",
+ "enableClose": "Enable close (fr)",
+ "hideIcon": "Hide default icon (fr)",
+ "icons": {
+ "customIcon": "Custom icon (fr)",
+ "icon": "Icon (fr)"
+ },
+ "severity": "Severity (fr)"
+ }
},
"modal": {
"title": "Modal (fr)",
diff --git a/packages/ui/src/Message/index.tsx b/packages/ui/src/Message/index.tsx
index d8a173c0a..01373e6e0 100644
--- a/packages/ui/src/Message/index.tsx
+++ b/packages/ui/src/Message/index.tsx
@@ -1,23 +1,84 @@
-import { ReactNode } from "react";
+import { ReactNode, useState } from "react";
type MessageProperties = {
- message: string;
- icon?: string | ReactNode;
+ enableClose?: boolean;
+ icon?: ReactNode;
+ message: string[] | ReactNode;
+ onClose?: () => void;
+ severity?: "info" | "success" | "warning" | "danger";
+ showIcon?: boolean;
};
-const Message = ({ message, icon }: MessageProperties) => {
+const Message = ({
+ onClose,
+ enableClose = false,
+ message,
+ icon,
+ severity = "info",
+ showIcon = true,
+}: MessageProperties) => {
+ const [showMessage, setShowMessage] = useState(true);
+
+ const defaultSeverityIcons = {
+ info: "pi pi-info-circle",
+ success: "pi pi-check-circle",
+ warning: "pi pi-exclamation-triangle",
+ danger: "pi pi-times-circle",
+ };
+
+ const handleClose = () => {
+ setShowMessage(false);
+
+ if (onClose) {
+ onClose();
+ }
+ };
+
+ if (!showMessage) {
+ return null;
+ }
+
const renderIcon = () => {
return (
- {typeof icon === "string" ? : icon}
+ {!icon ? (
+
+ ) : typeof icon === "string" ? (
+
+ ) : (
+ icon
+ )}
);
};
+ const renderMessageContent = () => {
+ if (typeof message === "string") {
+ return {message};
+ }
+
+ if (Array.isArray(message)) {
+ return (
+
+ {message.map((message_, index) => (
+ - {message_}
+ ))}
+
+ );
+ }
+
+ return message;
+ };
+
return (
-
- {renderIcon()}
-
{message}
+
+ {showIcon && renderIcon()}
+
{renderMessageContent()}
+ {enableClose && (
+
+
+
+ )}
);
};
diff --git a/packages/ui/src/assets/css/dropdown-menu.css b/packages/ui/src/assets/css/dropdown-menu.css
index a00ef3c72..28908f339 100644
--- a/packages/ui/src/assets/css/dropdown-menu.css
+++ b/packages/ui/src/assets/css/dropdown-menu.css
@@ -41,7 +41,6 @@ ul.dropdown-menu-list {
min-width: 160px;
overflow: hidden;
padding-inline-start: 0;
- width: max-content;
}
ul.dropdown-menu-list li {
diff --git a/packages/ui/src/assets/css/message.css b/packages/ui/src/assets/css/message.css
index 331b791b6..2a9d68bf2 100644
--- a/packages/ui/src/assets/css/message.css
+++ b/packages/ui/src/assets/css/message.css
@@ -1,7 +1,51 @@
-.message{
- padding: 1rem;
- background-color: var(--blue-100);
- border-radius: 0.5rem;
- border: 1px solid var(--blue-800);
- color: solid var(--blue-800);
+.message {
+ background-color: color-mix(in srgb, var(--_background-color) 10%, #fff);
+ border-radius: 0.5rem;
+ border: 1px solid var(--_border-color);
+ color: var(--_color);
+ display: flex;
+ gap: 1rem;
+ padding: .5rem 1rem;
+}
+
+.message .message-content {
+ flex: 1;
+}
+
+.message-content ul {
+ display: flex;
+ flex-direction: column;
+ gap: 0.5rem;
+ list-style-type: disc;
+ margin: 0 1rem;
+ padding: 0;
+}
+
+.message .close-message {
+ color: var(--color);
+ cursor: pointer;
+}
+
+.message.danger {
+ --_background-color: var(--dz-danger-color);
+ --_border-color: var(--dz-danger-color);
+ --_color: var(--dz-danger-color);
+}
+
+.message.info {
+ --_background-color: var(--dz-primary-color);
+ --_border-color: var(--dz-primary-color);
+ --_color: var(--dz-primary-color);
+}
+
+.message.success {
+ --_background-color: var(--dz-success-color);
+ --_border-color: var(--dz-success-color);
+ --_color: var(--dz-success-color);
+}
+
+.message.warning {
+ --_background-color: var(--dz-warning-color);
+ --_border-color: var(--dz-warning-color);
+ --_color: var(--dz-warning-color);
}