import React, { ReactNode } from "react"; import { Paper, Group, Text, Button, ActionIcon, Stack } from "@mantine/core"; import LocalIcon from "@app/components/shared/LocalIcon"; type InfoBannerTone = "info" | "warning"; const toneStyles: Record< InfoBannerTone, { background: string; border: string; text: string; icon: string; buttonColor: string; } > = { info: { background: "var(--mantine-color-blue-0)", border: "var(--mantine-color-blue-2)", text: "var(--mantine-color-blue-9)", icon: "var(--mantine-color-blue-6)", buttonColor: "blue", }, warning: { background: "var(--mantine-color-orange-0)", border: "var(--mantine-color-orange-3)", text: "var(--mantine-color-orange-9)", icon: "var(--mantine-color-orange-7)", buttonColor: "orange", }, }; interface InfoBannerProps { icon: string; title?: ReactNode; message: ReactNode; buttonText?: string; buttonIcon?: string; onButtonClick?: () => void; onDismiss?: () => void; dismissible?: boolean; loading?: boolean; show?: boolean; tone?: InfoBannerTone; background?: string; borderColor?: string; textColor?: string; iconColor?: string; buttonColor?: string; buttonVariant?: "light" | "filled" | "white" | "outline" | "subtle"; minHeight?: number | string; closeIconColor?: string; } /** * Generic info banner component for displaying dismissible messages at the top of the app */ export const InfoBanner: React.FC = ({ icon, title, message, buttonText, buttonIcon = "check-circle-rounded", onButtonClick, onDismiss, dismissible = true, loading = false, show = true, tone = "info", background, borderColor, textColor, iconColor, buttonColor, buttonVariant = "light", minHeight = 56, closeIconColor, }) => { if (!show) { return null; } const toneStyle = toneStyles[tone] ?? toneStyles.info; const handleDismiss = () => { onDismiss?.(); }; return ( {title && ( {title} )} {message} {buttonText && onButtonClick && ( )} {dismissible && ( )} ); };