|
import React, { useState } from "react"; |
|
import { |
|
Box, |
|
Typography, |
|
IconButton, |
|
Tooltip, |
|
Menu, |
|
MenuItem, |
|
useTheme, |
|
useMediaQuery, |
|
} from "@mui/material"; |
|
import OpenInNewIcon from "@mui/icons-material/OpenInNew"; |
|
import ShareIcon from "@mui/icons-material/Share"; |
|
import MenuIcon from "@mui/icons-material/Menu"; |
|
|
|
const Navigation = () => { |
|
const [anchorEl, setAnchorEl] = useState(null); |
|
const theme = useTheme(); |
|
const isMobile = useMediaQuery(theme.breakpoints.down("sm")); |
|
|
|
const handleShare = async () => { |
|
try { |
|
await navigator.share({ |
|
title: "YourBench Demo", |
|
text: "Check out this benchmark evaluation on YourBench!", |
|
url: window.location.href, |
|
}); |
|
} catch (err) { |
|
console.log("Error sharing:", err); |
|
} |
|
}; |
|
|
|
const handleMenuOpen = (event) => { |
|
setAnchorEl(event.currentTarget); |
|
}; |
|
|
|
const handleMenuClose = () => { |
|
setAnchorEl(null); |
|
}; |
|
|
|
const externalLinks = [ |
|
{ |
|
name: "GitHub", |
|
url: "https://github.com/huggingface/yourbench", |
|
}, |
|
{ |
|
name: "Advanced demo", |
|
url: "https://huggingface.co/spaces/yourbench/advanced", |
|
}, |
|
]; |
|
|
|
return ( |
|
<Box |
|
sx={{ |
|
position: "fixed", |
|
top: 24, |
|
left: 24, |
|
right: 24, |
|
margin: "auto", |
|
display: "flex", |
|
justifyContent: "space-between", |
|
alignItems: "center", |
|
zIndex: 1000, |
|
}} |
|
> |
|
{isMobile ? ( |
|
<> |
|
<IconButton |
|
onClick={handleMenuOpen} |
|
size="small" |
|
sx={{ |
|
color: "inherit", |
|
opacity: 0.7, |
|
"&:hover": { |
|
opacity: 1, |
|
}, |
|
}} |
|
> |
|
<MenuIcon /> |
|
</IconButton> |
|
<Menu |
|
anchorEl={anchorEl} |
|
open={Boolean(anchorEl)} |
|
onClose={handleMenuClose} |
|
PaperProps={{ |
|
sx: { |
|
mt: 1, |
|
minWidth: 200, |
|
borderRadius: 2, |
|
boxShadow: "0 4px 20px rgba(0, 0, 0, 0.1)", |
|
}, |
|
}} |
|
> |
|
{externalLinks.map((link) => ( |
|
<MenuItem |
|
key={link.name} |
|
onClick={handleMenuClose} |
|
sx={{ |
|
display: "flex", |
|
alignItems: "center", |
|
gap: 1, |
|
py: 1.5, |
|
px: 2, |
|
}} |
|
> |
|
<a |
|
href={link.url} |
|
target="_blank" |
|
rel="noopener noreferrer" |
|
style={{ |
|
textDecoration: "none", |
|
color: "inherit", |
|
display: "flex", |
|
alignItems: "center", |
|
gap: 0.5, |
|
width: "100%", |
|
}} |
|
> |
|
{link.name} |
|
<OpenInNewIcon sx={{ fontSize: "0.75rem", opacity: 0.6 }} /> |
|
</a> |
|
</MenuItem> |
|
))} |
|
</Menu> |
|
</> |
|
) : ( |
|
<Typography |
|
variant="body2" |
|
sx={{ |
|
display: "flex", |
|
gap: 2, |
|
alignItems: "center", |
|
}} |
|
> |
|
{externalLinks.map((link, index) => ( |
|
<React.Fragment key={link.name}> |
|
<a |
|
href={link.url} |
|
target="_blank" |
|
rel="noopener noreferrer" |
|
style={{ textDecoration: "none", color: "inherit" }} |
|
> |
|
{link.name} |
|
<OpenInNewIcon |
|
sx={{ fontSize: "0.75rem", ml: 0.5, opacity: 0.6 }} |
|
/> |
|
</a> |
|
{index < externalLinks.length - 1 && ( |
|
<Typography component="span" sx={{ opacity: 0.5 }}> |
|
• |
|
</Typography> |
|
)} |
|
</React.Fragment> |
|
))} |
|
</Typography> |
|
)} |
|
<Box sx={{ display: "flex", alignItems: "center" }}> |
|
<Tooltip title="Share"> |
|
<IconButton |
|
onClick={handleShare} |
|
size="small" |
|
sx={{ |
|
color: "inherit", |
|
opacity: 0.7, |
|
"&:hover": { |
|
opacity: 1, |
|
}, |
|
}} |
|
> |
|
<ShareIcon fontSize="small" /> |
|
</IconButton> |
|
</Tooltip> |
|
</Box> |
|
</Box> |
|
); |
|
}; |
|
|
|
export default Navigation; |
|
|