Spaces:
Running
Running
import React, { useState } from "react"; | |
import { | |
AppBar, | |
Toolbar, | |
Box, | |
Link as MuiLink, | |
ButtonBase, | |
Tooltip, | |
} from "@mui/material"; | |
import { alpha } from "@mui/material/styles"; | |
import OpenInNewIcon from "@mui/icons-material/OpenInNew"; | |
import LightModeOutlinedIcon from "@mui/icons-material/LightModeOutlined"; | |
import DarkModeOutlinedIcon from "@mui/icons-material/DarkModeOutlined"; | |
import { Link, useLocation } from "react-router-dom"; | |
const Navigation = ({ onToggleTheme, mode }) => { | |
const [hasChanged, setHasChanged] = useState(false); | |
const location = useLocation(); | |
const handleThemeToggle = () => { | |
setHasChanged(true); | |
onToggleTheme(); | |
}; | |
const iconStyle = { | |
fontSize: "1.125rem", | |
...(hasChanged && { | |
animation: "rotateIn 0.3s cubic-bezier(0.4, 0, 0.2, 1)", | |
"@keyframes rotateIn": { | |
"0%": { | |
opacity: 0, | |
transform: | |
mode === "light" | |
? "rotate(-90deg) scale(0.8)" | |
: "rotate(90deg) scale(0.8)", | |
}, | |
"100%": { | |
opacity: 1, | |
transform: "rotate(0) scale(1)", | |
}, | |
}, | |
}), | |
}; | |
const linkStyle = (isActive = false) => ({ | |
textDecoration: "none", | |
color: isActive ? "text.primary" : "text.secondary", | |
fontSize: "0.8125rem", | |
opacity: isActive ? 1 : 0.8, | |
display: "flex", | |
alignItems: "center", | |
gap: 0.5, | |
paddingBottom: "2px", | |
cursor: "pointer", | |
position: "relative", | |
"&:hover": { | |
opacity: 1, | |
color: "text.primary", | |
}, | |
"&::after": isActive | |
? { | |
content: '""', | |
position: "absolute", | |
bottom: "-4px", | |
left: "0", | |
width: "100%", | |
height: "2px", | |
backgroundColor: (theme) => | |
alpha( | |
theme.palette.text.primary, | |
theme.palette.mode === "dark" ? 0.3 : 0.2 | |
), | |
borderRadius: "2px", | |
} | |
: {}, | |
}); | |
const Separator = () => ( | |
<Box | |
sx={(theme) => ({ | |
width: "4px", | |
height: "4px", | |
borderRadius: "100%", | |
backgroundColor: alpha( | |
theme.palette.text.primary, | |
theme.palette.mode === "dark" ? 0.2 : 0.15 | |
), | |
})} | |
/> | |
); | |
return ( | |
<AppBar | |
position="static" | |
elevation={0} | |
sx={{ | |
backgroundColor: "transparent", | |
}} | |
> | |
<Toolbar sx={{ justifyContent: "center" }}> | |
<Box | |
sx={{ | |
display: "flex", | |
gap: 2.5, | |
alignItems: "center", | |
padding: "0.5rem 0", | |
}} | |
> | |
<Box sx={{ display: "flex", gap: 2.5, alignItems: "center" }}> | |
<Link | |
to="/" | |
style={{ textDecoration: "none" }} | |
sx={linkStyle(location.pathname === "/")} | |
> | |
<Box sx={linkStyle(location.pathname === "/")}>Explorer</Box> | |
</Link> | |
<Link | |
to="/submit" | |
style={{ textDecoration: "none" }} | |
sx={linkStyle(location.pathname === "/submit")} | |
> | |
<Box sx={linkStyle(location.pathname === "/submit")}> | |
How to submit | |
</Box> | |
</Link> | |
{/*<Separator /> | |
<MuiLink | |
href="https://huggingface.co/docs/leaderboards/open_llm_leaderboard/about" | |
target="_blank" | |
rel="noopener noreferrer" | |
sx={{ | |
...linkStyle(), | |
"& svg": { | |
fontSize: "0.75rem", | |
ml: 0.5, | |
opacity: 0.6, | |
transition: "opacity 0.2s ease-in-out", | |
}, | |
"&:hover svg": { | |
opacity: 0.8, | |
}, | |
}} | |
> | |
About | |
<OpenInNewIcon /> | |
</MuiLink> */} | |
</Box> | |
<Separator /> | |
<Tooltip | |
title={ | |
mode === "light" ? "Switch to dark mode" : "Switch to light mode" | |
} | |
> | |
<ButtonBase | |
onClick={handleThemeToggle} | |
sx={(theme) => ({ | |
color: "text.secondary", | |
borderRadius: "100%", | |
padding: 0, | |
width: "36px", | |
height: "36px", | |
display: "flex", | |
alignItems: "center", | |
justifyContent: "center", | |
transition: "all 0.2s ease-in-out", | |
"&:hover": { | |
color: "text.primary", | |
backgroundColor: alpha( | |
theme.palette.text.primary, | |
theme.palette.mode === "dark" ? 0.1 : 0.06 | |
), | |
}, | |
})} | |
> | |
{mode === "light" ? ( | |
<DarkModeOutlinedIcon sx={iconStyle} /> | |
) : ( | |
<LightModeOutlinedIcon sx={iconStyle} /> | |
)} | |
</ButtonBase> | |
</Tooltip> | |
</Box> | |
</Toolbar> | |
</AppBar> | |
); | |
}; | |
export default Navigation; | |