style(ui): redesign error pages and job table empty/loading state
CI and Deploy / test (push) Successful in 2m22s
CI and Deploy / deploy (push) Successful in 44s

No mockup exists for 404/500 pages, so these follow the visual
language already established elsewhere this session: floating-shadow
card, big bold status number (matching the dashboard stat tiles'
bold-number treatment) instead of a small overline.

JobTable's first-run empty state gets an icon chip matching the
landing page's feature-card icon treatment (rounded square, tinted
primary background) instead of plain text -- the filtered "no results"
one-liner stays as-is, that's a different, correctly minimal case.
Main table Paper wrapper gets the same floating-shadow treatment as
every other card this session.

ViewStateNotice (the shared loading/error component used across the
app) reviewed and left untouched -- it's an MUI Alert used as an inline
banner, which is the correct pattern; it was never a "fake card" to
begin with.
This commit is contained in:
cesnimda
2026-07-13 14:22:07 +02:00
parent 42ba306362
commit 5219237613
3 changed files with 46 additions and 6 deletions
+26 -2
View File
@@ -39,6 +39,7 @@ import RestoreFromTrashOutlinedIcon from "@mui/icons-material/RestoreFromTrashOu
import MoreHorizIcon from "@mui/icons-material/MoreHoriz";
import ViewColumnIcon from "@mui/icons-material/ViewColumn";
import SearchIcon from "@mui/icons-material/Search";
import WorkOutlineIcon from "@mui/icons-material/WorkOutline";
import { api } from "../api";
import ViewStateNotice from "./ViewStateNotice";
@@ -115,7 +116,22 @@ function EmptyJobsState({ firstTime, onOpenSettings, t }: { firstTime: boolean;
return <Typography sx={{ py: 2, textAlign: "center", color: "text.secondary" }}>{t("jobTableNoJobsFound")}</Typography>;
}
return (
<Box sx={{ py: 4, textAlign: "center" }}>
<Box sx={{ py: 5, textAlign: "center" }}>
<Box
sx={{
width: 56,
height: 56,
mx: "auto",
mb: 2,
borderRadius: 3,
display: "grid",
placeItems: "center",
bgcolor: (theme) => alpha(theme.palette.primary.main, 0.12),
color: "primary.main",
}}
>
<WorkOutlineIcon fontSize="medium" />
</Box>
<Typography sx={{ fontWeight: 800, mb: 0.5 }}>{t("jobTableEmptyFirstTimeTitle")}</Typography>
<Typography sx={{ color: "text.secondary", mb: 1.5, maxWidth: 440, mx: "auto" }}>{t("jobTableEmptyFirstTimeBody")}</Typography>
<Button variant="text" onClick={onOpenSettings}>{t("jobTableEmptyFirstTimeBookmarklet")}</Button>
@@ -514,7 +530,15 @@ export default function JobTable({ refreshToken, pageSize, onPageSizeChange, col
/>
) : null}
<Paper sx={{ mt: 2, overflow: "hidden" }}>
<Paper
sx={{
mt: 2,
overflow: "hidden",
borderRadius: 4,
border: "none",
boxShadow: "0px 1px 2px 0px rgba(15,23,42,0.04), 0px 8px 24px -12px rgba(15,23,42,0.12)",
}}
>
{isMobile ? (
<Stack spacing={1.25} sx={{ p: 1.25 }}>
<Box sx={{ display: "flex", alignItems: "center", justifyContent: "space-between", gap: 1, px: 0.5 }}>
+9 -2
View File
@@ -8,9 +8,16 @@ export default function NotFoundPage() {
const { t } = useI18n();
return (
<Paper sx={{ p: { xs: 3, md: 5 }, borderRadius: 4 }}>
<Paper
sx={{
p: { xs: 4, md: 6 },
borderRadius: 4,
border: "none",
boxShadow: "0px 1px 2px 0px rgba(15,23,42,0.04), 0px 8px 24px -12px rgba(15,23,42,0.12)",
}}
>
<Box sx={{ display: "grid", gap: 1.5, maxWidth: 560 }}>
<Typography variant="overline" sx={{ color: "text.secondary", letterSpacing: 1.6 }}>
<Typography sx={{ fontWeight: 900, fontSize: { xs: 48, md: 64 }, lineHeight: 1, letterSpacing: "-0.02em", color: "primary.main" }}>
404
</Typography>
<Typography variant="h4" sx={{ fontWeight: 800 }}>
+11 -2
View File
@@ -16,9 +16,18 @@ export default function RouteErrorPage() {
return (
<Box sx={{ minHeight: "100vh", display: "grid", placeItems: "center", p: 3 }}>
<Paper sx={{ p: { xs: 3, md: 5 }, borderRadius: 4, width: "100%", maxWidth: 640 }}>
<Paper
sx={{
p: { xs: 4, md: 6 },
borderRadius: 4,
border: "none",
boxShadow: "0px 1px 2px 0px rgba(15,23,42,0.04), 0px 8px 24px -12px rgba(15,23,42,0.12)",
width: "100%",
maxWidth: 640,
}}
>
<Box sx={{ display: "grid", gap: 1.5 }}>
<Typography variant="overline" sx={{ color: "text.secondary", letterSpacing: 1.6 }}>
<Typography sx={{ fontWeight: 900, fontSize: { xs: 48, md: 64 }, lineHeight: 1, letterSpacing: "-0.02em", color: "error.main" }}>
{error?.status || 500}
</Typography>
<Typography variant="h4" sx={{ fontWeight: 800 }}>