From 00201b1202c5026f6b55c3e4df3aff94a89dc7d0 Mon Sep 17 00:00:00 2001 From: proddy Date: Sun, 21 Jun 2026 00:12:00 +0200 Subject: [PATCH] make pretty --- interface/src/components/toast/Toaster.tsx | 59 ++++++++++++++++++---- 1 file changed, 49 insertions(+), 10 deletions(-) diff --git a/interface/src/components/toast/Toaster.tsx b/interface/src/components/toast/Toaster.tsx index bd5c7623d..2639981ad 100644 --- a/interface/src/components/toast/Toaster.tsx +++ b/interface/src/components/toast/Toaster.tsx @@ -1,15 +1,32 @@ import { memo, useEffect, useRef, useState, useSyncExternalStore } from 'react'; +import CloseIcon from '@mui/icons-material/Close'; import Alert from '@mui/material/Alert'; import Grow from '@mui/material/Grow'; +import IconButton from '@mui/material/IconButton'; import LinearProgress from '@mui/material/LinearProgress'; import Stack from '@mui/material/Stack'; -import { type ToastItem, getSnapshot, removeToast, subscribe } from './toastStore'; +import { + type ToastItem, + type ToastSeverity, + getSnapshot, + removeToast, + subscribe +} from './toastStore'; const AUTO_CLOSE_MS = 3000; const TICK_MS = 50; +// Semantic accent colors users already expect: +// success → green, error → red, warning → amber, info → blue. +const ACCENT: Record = { + success: '#16a34a', + error: '#dc2626', + warning: '#f59e0b', + info: '#2563eb' +}; + // Single toast row: owns its auto-dismiss timer + countdown progress bar, pauses // while the window is unfocused (matching react-toastify's pauseOnFocusLoss). const ToastRow = memo(({ item }: { item: ToastItem }) => { @@ -37,38 +54,60 @@ const ToastRow = memo(({ item }: { item: ToastItem }) => { }; }, []); + const accent = ACCENT[item.severity]; + return ( removeToast(item.id)}> setOpen(false)} + action={ + { + e.stopPropagation(); + setOpen(false); + }} + sx={{ color: '#9ca3af', '&:hover': { color: '#374151' } }} + > + + + } sx={{ + position: 'relative', width: 'fit-content', + minWidth: 300, maxWidth: 360, - minHeight: 64, cursor: 'pointer', - border: '1px solid #177ac9', - boxShadow: 6, overflow: 'hidden', + borderRadius: '8px', + bgcolor: '#f3f4f6', + color: '#1f2937', + boxShadow: '0 4px 12px rgba(0, 0, 0, 0.18)', + borderLeft: `4px solid ${accent}`, alignItems: 'center', - '& .MuiAlert-icon': { py: 0 }, - '& .MuiAlert-message': { py: 0, textAlign: 'center', fontSize: '1rem' } + '& .MuiAlert-icon': { color: accent, alignItems: 'center' }, + // '& .MuiAlert-message': { + // py: '8px', + // color: '#1f2937' + // }, + '& .MuiAlert-action': { alignItems: 'center', pt: 0, mr: '-4px' } }} > {item.message}