Some checks failed
No response / noResponse (push) Has been cancelled
CI / Continuous releases (push) Has been cancelled
CI / test-dev (macos-latest) (push) Has been cancelled
CI / test-dev (ubuntu-latest) (push) Has been cancelled
CI / test-dev (windows-latest) (push) Has been cancelled
Maintenance / main (push) Has been cancelled
Scorecards supply-chain security / Scorecards analysis (push) Has been cancelled
CodeQL / Analyze (push) Has been cancelled
81 lines
2.5 KiB
JavaScript
81 lines
2.5 KiB
JavaScript
import * as React from 'react';
|
|
import Popper from '@mui/material/Popper';
|
|
import Typography from '@mui/material/Typography';
|
|
import Fade from '@mui/material/Fade';
|
|
import Paper from '@mui/material/Paper';
|
|
|
|
export default function VirtualElementPopper() {
|
|
const [open, setOpen] = React.useState(false);
|
|
const [anchorEl, setAnchorEl] = React.useState(null);
|
|
|
|
const previousAnchorElPosition = React.useRef(undefined);
|
|
|
|
React.useEffect(() => {
|
|
if (anchorEl) {
|
|
if (typeof anchorEl === 'object') {
|
|
previousAnchorElPosition.current = anchorEl.getBoundingClientRect();
|
|
} else {
|
|
previousAnchorElPosition.current = anchorEl().getBoundingClientRect();
|
|
}
|
|
}
|
|
}, [anchorEl]);
|
|
|
|
const handleClose = () => {
|
|
setOpen(false);
|
|
};
|
|
|
|
const handleMouseUp = () => {
|
|
const selection = window.getSelection();
|
|
|
|
// Resets when the selection has a length of 0
|
|
if (!selection || selection.anchorOffset === selection.focusOffset) {
|
|
handleClose();
|
|
return;
|
|
}
|
|
|
|
const getBoundingClientRect = () => {
|
|
if (selection.rangeCount === 0 && previousAnchorElPosition.current) {
|
|
setOpen(false);
|
|
return previousAnchorElPosition.current;
|
|
}
|
|
return selection.getRangeAt(0).getBoundingClientRect();
|
|
};
|
|
|
|
setOpen(true);
|
|
|
|
setAnchorEl({ getBoundingClientRect });
|
|
};
|
|
|
|
const id = open ? 'virtual-element-popper' : undefined;
|
|
|
|
return (
|
|
<div onMouseLeave={handleClose}>
|
|
<Typography aria-describedby={id} onMouseUp={handleMouseUp}>
|
|
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nullam ipsum purus,
|
|
bibendum sit amet vulputate eget, porta semper ligula. Donec bibendum
|
|
vulputate erat, ac fringilla mi finibus nec. Donec ac dolor sed dolor
|
|
porttitor blandit vel vel purus. Fusce vel malesuada ligula. Nam quis
|
|
vehicula ante, eu finibus est. Proin ullamcorper fermentum orci, quis finibus
|
|
massa. Nunc lobortis, massa ut rutrum ultrices, metus metus finibus ex, sit
|
|
amet facilisis neque enim sed neque. Quisque accumsan metus vel maximus
|
|
consequat. Suspendisse lacinia tellus a libero volutpat maximus.
|
|
</Typography>
|
|
<Popper
|
|
id={id}
|
|
open={open}
|
|
anchorEl={anchorEl}
|
|
transition
|
|
placement="bottom-start"
|
|
>
|
|
{({ TransitionProps }) => (
|
|
<Fade {...TransitionProps} timeout={350}>
|
|
<Paper>
|
|
<Typography sx={{ p: 2 }}>The content of the Popper.</Typography>
|
|
</Paper>
|
|
</Fade>
|
|
)}
|
|
</Popper>
|
|
</div>
|
|
);
|
|
}
|