Dark/Light Mode Implementierung mit MUI Theme

This commit is contained in:
mathusan
2025-05-31 17:46:55 +02:00
parent 1b1924b0b7
commit 6a91a7fc53
11 changed files with 3404 additions and 116 deletions

View File

@@ -15,25 +15,26 @@ import AdbIcon from '@mui/icons-material/Adb';
import { alpha, InputBase, styled } from '@mui/material';
import SearchIcon from '@mui/icons-material/Search';
import { useNavigate } from 'react-router-dom';
import {useTranslation} from 'react-i18next';
import { useTranslation } from 'react-i18next';
import './NavBar.css';
import ThemeToggle from '../../theme/ThemeToggle';
const Search = styled('div')(({ theme }) => ({
position: 'relative',
borderRadius: theme.shape.borderRadius,
backgroundColor: alpha(theme.palette.common.white, 0.15),
'&:hover': {
backgroundColor: alpha(theme.palette.common.white, 0.25),
backgroundColor: alpha(theme.palette.common.white, 0.25),
},
marginLeft: 0,
width: '100%',
[theme.breakpoints.up('sm')]: {
marginLeft: theme.spacing(1),
width: 'auto',
marginLeft: theme.spacing(1),
width: 'auto',
},
}));
const SearchIconWrapper = styled('div')(({ theme }) => ({
}));
const SearchIconWrapper = styled('div')(({ theme }) => ({
padding: theme.spacing(0, 2),
height: '100%',
position: 'absolute',
@@ -41,27 +42,25 @@ const Search = styled('div')(({ theme }) => ({
display: 'flex',
alignItems: 'center',
justifyContent: 'center',
}));
const StyledInputBase = styled(InputBase)(({ theme }) => ({
}));
const StyledInputBase = styled(InputBase)(({ theme }) => ({
color: 'white',
width: '100%',
'& .MuiInputBase-input': {
padding: theme.spacing(1, 1, 1, 0),
// vertical padding + font size from searchIcon
paddingLeft: `calc(1em + ${theme.spacing(4)})`,
transition: theme.transitions.create('width'),
[theme.breakpoints.up('sm')]: {
width: '12ch',
'&:focus': {
width: '20ch',
padding: theme.spacing(1, 1, 1, 0),
paddingLeft: `calc(1em + ${theme.spacing(4)})`,
transition: theme.transitions.create('width'),
[theme.breakpoints.up('sm')]: {
width: '12ch',
'&:focus': {
width: '20ch',
},
},
},
},
}));
}));
export default function NavBar() {
const { t } = useTranslation();
const navigate = useNavigate();
const [anchorElNav, setAnchorElNav] = React.useState<null | HTMLElement>(null);
@@ -76,6 +75,7 @@ export default function NavBar() {
const handleOpenNavMenu = (event: React.MouseEvent<HTMLElement>) => {
setAnchorElNav(event.currentTarget);
};
const handleOpenUserMenu = (event: React.MouseEvent<HTMLElement>) => {
setAnchorElUser(event.currentTarget);
};
@@ -157,6 +157,7 @@ export default function NavBar() {
))}
</Menu>
</Box>
<AdbIcon sx={{ display: { xs: 'flex', md: 'none' }, mr: 1 }} />
<Typography
variant="h5"
@@ -176,6 +177,7 @@ export default function NavBar() {
>
DPS
</Typography>
<Box sx={{ flexGrow: 1, display: { xs: 'none', md: 'flex' } }}>
{pages.map((page) => (
<Button
@@ -187,7 +189,9 @@ export default function NavBar() {
</Button>
))}
</Box>
<Box sx={{ flexGrow: 0 }}>
<Box sx={{ flexGrow: 0, display: 'flex', alignItems: 'center', gap: 1 }}>
<ThemeToggle />
<Tooltip title="Open settings">
<IconButton onClick={handleOpenUserMenu} sx={{ p: 0 }}>
<Avatar alt="Florian Speicher" src="/static/images/avatar/2.jpg" />
@@ -195,7 +199,7 @@ export default function NavBar() {
</Tooltip>
<Menu
sx={{ mt: '45px' }}
id="menu-appbar"
id="menu-appbar-user"
anchorEl={anchorElUser}
anchorOrigin={{
vertical: 'top',
@@ -220,4 +224,4 @@ export default function NavBar() {
</Container>
</AppBar>
);
}
}