diff --git a/frontend/index.html b/frontend/index.html
index 2d6e58b..2d00903 100644
--- a/frontend/index.html
+++ b/frontend/index.html
@@ -4,6 +4,9 @@
+
+
+
Feuerwehr Dashboard
diff --git a/frontend/src/components/dashboard/UserProfile.tsx b/frontend/src/components/dashboard/UserProfile.tsx
index 468089d..5799bec 100644
--- a/frontend/src/components/dashboard/UserProfile.tsx
+++ b/frontend/src/components/dashboard/UserProfile.tsx
@@ -23,28 +23,34 @@ const UserProfile: React.FC = ({ user }) => {
{initials.toUpperCase()}
-
- {getGreeting()}, {firstName}!
-
+
+
+ {getGreeting()}, {firstName}!
+
+
+ {new Date().toLocaleDateString('de-DE', { weekday: 'long', day: 'numeric', month: 'long' })}
+
+
);
diff --git a/frontend/src/components/dashboard/WidgetGroup.tsx b/frontend/src/components/dashboard/WidgetGroup.tsx
index e735f9b..82bedf6 100644
--- a/frontend/src/components/dashboard/WidgetGroup.tsx
+++ b/frontend/src/components/dashboard/WidgetGroup.tsx
@@ -17,24 +17,28 @@ function WidgetGroup({ title, children, gridColumn }: WidgetGroupProps) {
{title}
diff --git a/frontend/src/components/templates/DataTable.tsx b/frontend/src/components/templates/DataTable.tsx
index 215351c..523dbfe 100644
--- a/frontend/src/components/templates/DataTable.tsx
+++ b/frontend/src/components/templates/DataTable.tsx
@@ -129,8 +129,8 @@ export function DataTable({
return (
{showToolbar && (
-
- {title && {title}}
+
+ {title && {title}}
{searchEnabled && (
({
placeholder={searchPlaceholder}
value={search}
onChange={(e) => { setSearch(e.target.value); setPage(0); }}
- sx={{ maxWidth: 300 }}
+ sx={{ maxWidth: 280, '& .MuiOutlinedInput-root': { bgcolor: 'rgba(0,0,0,0.02)' } }}
InputProps={{
startAdornment: (
-
+
),
}}
diff --git a/frontend/src/components/templates/StatCard.tsx b/frontend/src/components/templates/StatCard.tsx
index 90cec9e..1e89772 100644
--- a/frontend/src/components/templates/StatCard.tsx
+++ b/frontend/src/components/templates/StatCard.tsx
@@ -30,29 +30,32 @@ export const StatCard: React.FC = ({
) : (
-
+
{title}
-
+
{value}
{trend && (
- = 0 ? 'success.main' : 'error.main'}
- >
- {trend.value >= 0 ? '↑' : '↓'} {Math.abs(trend.value)}%
- {trend.label && ` ${trend.label}`}
-
+ = 0 ? 'rgba(34,197,94,0.1)' : 'rgba(239,68,68,0.1)' }}>
+ = 0 ? 'success.main' : 'error.main'}
+ >
+ {trend.value >= 0 ? '↑' : '↓'} {Math.abs(trend.value)}%
+ {trend.label && ` ${trend.label}`}
+
+
)}
= ({
-
-
- {icon}
-
+
+
+ {icon && (
+ *': { fontSize: '1.1rem' } }}>
+ {icon}
+
+ )}
+
{title}
{action}
-
);
@@ -113,8 +120,7 @@ export const WidgetCard: React.FC = ({
{footer && (
<>
-
-
+
{footer}
>
diff --git a/frontend/src/theme/theme.ts b/frontend/src/theme/theme.ts
index 723f9e1..5619f52 100644
--- a/frontend/src/theme/theme.ts
+++ b/frontend/src/theme/theme.ts
@@ -24,24 +24,26 @@ const lightThemeOptions: ThemeOptions = {
primary: primaryRed,
secondary: secondaryBlue,
background: {
- default: '#f5f5f5',
+ default: '#f0f2f5',
paper: '#ffffff',
},
+ divider: 'rgba(0, 0, 0, 0.08)',
error: {
- main: '#f44336',
+ main: '#ef4444',
},
warning: {
- main: '#ff9800',
+ main: '#f59e0b',
},
info: {
- main: '#2196f3',
+ main: '#3b82f6',
},
success: {
- main: '#4caf50',
+ main: '#22c55e',
},
},
typography: {
fontFamily: [
+ 'Inter',
'-apple-system',
'BlinkMacSystemFont',
'"Segoe UI"',
@@ -51,28 +53,30 @@ const lightThemeOptions: ThemeOptions = {
'sans-serif',
].join(','),
h1: {
- fontSize: '2.5rem',
- fontWeight: 600,
+ fontSize: '2.25rem',
+ fontWeight: 700,
lineHeight: 1.2,
+ letterSpacing: '-0.02em',
},
h2: {
- fontSize: '2rem',
- fontWeight: 600,
+ fontSize: '1.875rem',
+ fontWeight: 700,
lineHeight: 1.3,
+ letterSpacing: '-0.01em',
},
h3: {
- fontSize: '1.75rem',
- fontWeight: 600,
+ fontSize: '1.5rem',
+ fontWeight: 700,
lineHeight: 1.4,
},
h4: {
- fontSize: '1.5rem',
- fontWeight: 600,
+ fontSize: '1.25rem',
+ fontWeight: 700,
lineHeight: 1.4,
},
h5: {
- fontSize: '1.25rem',
- fontWeight: 600,
+ fontSize: '1.125rem',
+ fontWeight: 700,
lineHeight: 1.5,
},
h6: {
@@ -80,34 +84,61 @@ const lightThemeOptions: ThemeOptions = {
fontWeight: 600,
lineHeight: 1.6,
},
- body1: {
- fontSize: '1rem',
+ subtitle1: {
+ fontSize: '0.9375rem',
+ fontWeight: 600,
lineHeight: 1.5,
},
+ body1: {
+ fontSize: '0.9375rem',
+ lineHeight: 1.6,
+ },
body2: {
- fontSize: '0.875rem',
- lineHeight: 1.43,
+ fontSize: '0.8125rem',
+ lineHeight: 1.5,
+ },
+ caption: {
+ fontSize: '0.6875rem',
+ fontWeight: 500,
+ lineHeight: 1.5,
+ letterSpacing: '0.04em',
},
button: {
textTransform: 'none',
- fontWeight: 500,
+ fontWeight: 600,
+ fontSize: '0.8125rem',
},
},
spacing: 8,
shape: {
- borderRadius: 8,
+ borderRadius: 10,
},
components: {
+ MuiCssBaseline: {
+ styleOverrides: {
+ body: {
+ WebkitFontSmoothing: 'antialiased',
+ MozOsxFontSmoothing: 'grayscale',
+ },
+ },
+ },
MuiButton: {
styleOverrides: {
root: {
borderRadius: 8,
- padding: '8px 16px',
+ padding: '8px 18px',
+ fontWeight: 600,
},
contained: {
boxShadow: 'none',
'&:hover': {
- boxShadow: '0 2px 4px rgba(0,0,0,0.2)',
+ boxShadow: '0 2px 8px rgba(0,0,0,0.15)',
+ },
+ },
+ outlined: {
+ borderWidth: 1.5,
+ '&:hover': {
+ borderWidth: 1.5,
},
},
},
@@ -115,11 +146,13 @@ const lightThemeOptions: ThemeOptions = {
MuiCard: {
styleOverrides: {
root: {
- borderRadius: 12,
- boxShadow: '0 1px 3px rgba(0,0,0,0.12), 0 1px 2px rgba(0,0,0,0.24)',
- transition: 'all 0.3s cubic-bezier(.25,.8,.25,1)',
+ borderRadius: 14,
+ border: '1px solid rgba(0, 0, 0, 0.06)',
+ boxShadow: '0 1px 2px rgba(0,0,0,0.04)',
+ transition: 'border-color 0.2s ease, box-shadow 0.2s ease',
'&:hover': {
- boxShadow: '0 4px 8px rgba(0,0,0,0.16), 0 3px 6px rgba(0,0,0,0.23)',
+ borderColor: 'rgba(0, 0, 0, 0.12)',
+ boxShadow: '0 2px 8px rgba(0,0,0,0.08)',
},
},
},
@@ -127,23 +160,39 @@ const lightThemeOptions: ThemeOptions = {
MuiPaper: {
styleOverrides: {
root: {
- borderRadius: 8,
+ borderRadius: 10,
+ },
+ elevation0: {
+ boxShadow: 'none',
},
elevation1: {
- boxShadow: '0 1px 3px rgba(0,0,0,0.12), 0 1px 2px rgba(0,0,0,0.24)',
+ border: '1px solid rgba(0, 0, 0, 0.06)',
+ boxShadow: '0 1px 2px rgba(0,0,0,0.04)',
},
elevation2: {
- boxShadow: '0 3px 6px rgba(0,0,0,0.15), 0 2px 4px rgba(0,0,0,0.12)',
+ boxShadow: '0 2px 8px rgba(0,0,0,0.08)',
},
elevation3: {
- boxShadow: '0 4px 8px rgba(0,0,0,0.16), 0 3px 6px rgba(0,0,0,0.23)',
+ boxShadow: '0 4px 16px rgba(0,0,0,0.1)',
},
},
},
MuiAppBar: {
styleOverrides: {
root: {
- boxShadow: '0 2px 4px rgba(0,0,0,0.1)',
+ boxShadow: '0 1px 0 rgba(0,0,0,0.06)',
+ },
+ },
+ },
+ MuiChip: {
+ styleOverrides: {
+ root: {
+ fontWeight: 500,
+ borderRadius: 6,
+ },
+ sizeSmall: {
+ height: 22,
+ fontSize: '0.6875rem',
},
},
},
@@ -157,6 +206,10 @@ const lightThemeOptions: ThemeOptions = {
MuiOutlinedInput: {
styleOverrides: {
root: {
+ borderRadius: 8,
+ '& .MuiOutlinedInput-notchedOutline': {
+ borderColor: 'rgba(0, 0, 0, 0.12)',
+ },
'& .MuiOutlinedInput-notchedOutline legend': {
fontSize: '0.75em',
},
@@ -168,9 +221,11 @@ const lightThemeOptions: ThemeOptions = {
root: {
'& .MuiTableCell-head': {
textTransform: 'uppercase',
- fontSize: '0.75rem',
+ fontSize: '0.6875rem',
fontWeight: 600,
- letterSpacing: '0.05em',
+ letterSpacing: '0.06em',
+ color: 'rgba(0, 0, 0, 0.5)',
+ borderBottom: '2px solid rgba(0, 0, 0, 0.06)',
},
},
},
@@ -179,15 +234,37 @@ const lightThemeOptions: ThemeOptions = {
styleOverrides: {
root: {
'&.MuiTableRow-hover:hover': {
- backgroundColor: 'rgba(0, 0, 0, 0.04)',
+ backgroundColor: 'rgba(0, 0, 0, 0.02)',
},
},
},
},
+ MuiTableCell: {
+ styleOverrides: {
+ root: {
+ borderBottom: '1px solid rgba(0, 0, 0, 0.04)',
+ },
+ },
+ },
MuiDialog: {
styleOverrides: {
paper: {
- borderRadius: 12,
+ borderRadius: 14,
+ },
+ },
+ },
+ MuiDivider: {
+ styleOverrides: {
+ root: {
+ borderColor: 'rgba(0, 0, 0, 0.06)',
+ },
+ },
+ },
+ MuiTooltip: {
+ styleOverrides: {
+ tooltip: {
+ borderRadius: 6,
+ fontSize: '0.75rem',
},
},
},
@@ -201,20 +278,21 @@ const darkThemeOptions: ThemeOptions = {
primary: primaryRed,
secondary: secondaryBlue,
background: {
- default: '#121212',
- paper: '#1e1e1e',
+ default: '#0f1117',
+ paper: '#1a1d27',
},
+ divider: 'rgba(255, 255, 255, 0.08)',
error: {
- main: '#f44336',
+ main: '#ef4444',
},
warning: {
- main: '#ff9800',
+ main: '#f59e0b',
},
info: {
- main: '#2196f3',
+ main: '#3b82f6',
},
success: {
- main: '#4caf50',
+ main: '#22c55e',
},
},
};