import * as React from 'react'; import { styled } from '@mui/material/styles'; import FormControlLabel from '@mui/material/FormControlLabel'; import Grid from '@mui/material/Grid'; import Typography from '@mui/material/Typography'; import Box from '@mui/material/Box'; import Button from '@mui/material/Button'; import MuiPopper from '@mui/material/Popper'; import Paper from '@mui/material/Paper'; import DialogActions from '@mui/material/DialogActions'; import DialogContent from '@mui/material/DialogContent'; import DialogContentText from '@mui/material/DialogContentText'; import DialogTitle from '@mui/material/DialogTitle'; import Switch from '@mui/material/Switch'; import TextField from '@mui/material/TextField'; import FormGroup from '@mui/material/FormGroup'; import { HighlightedCode } from '@mui/docs/HighlightedCode'; const Popper = styled(MuiPopper, { shouldForwardProp: (prop) => prop !== 'arrow', })(({ theme }) => ({ zIndex: 1, '& > div': { position: 'relative', }, '&[data-popper-placement*="bottom"]': { '& .MuiPopper-arrow': { top: 0, left: 0, marginTop: '-0.9em', width: '3em', height: '1em', '&::before': { borderWidth: '0 1em 1em 1em', borderColor: `transparent transparent ${theme.palette.background.paper} transparent`, }, }, }, '&[data-popper-placement*="top"]': { '& .MuiPopper-arrow': { bottom: 0, left: 0, marginBottom: '-0.9em', width: '3em', height: '1em', '&::before': { borderWidth: '1em 1em 0 1em', borderColor: `${theme.palette.background.paper} transparent transparent transparent`, }, }, }, '&[data-popper-placement*="right"]': { '& .MuiPopper-arrow': { left: 0, marginLeft: '-0.9em', height: '3em', width: '1em', '&::before': { borderWidth: '1em 1em 1em 0', borderColor: `transparent ${theme.palette.background.paper} transparent transparent`, }, }, }, '&[data-popper-placement*="left"]': { '& .MuiPopper-arrow': { right: 0, marginRight: '-0.9em', height: '3em', width: '1em', '&::before': { borderWidth: '1em 0 1em 1em', borderColor: `transparent transparent transparent ${theme.palette.background.paper}`, }, }, }, variants: [ { props: ({ arrow }) => arrow, style: { '&[data-popper-placement*="bottom"]': { '& > div': { marginTop: 2, }, }, }, }, { props: ({ arrow }) => !arrow, style: { '&[data-popper-placement*="bottom"]': { '& > div': { marginTop: 0, }, }, }, }, { props: ({ arrow }) => arrow, style: { '&[data-popper-placement*="top"]': { '& > div': { marginBottom: 2, }, }, }, }, { props: ({ arrow }) => !arrow, style: { '&[data-popper-placement*="top"]': { '& > div': { marginBottom: 0, }, }, }, }, { props: ({ arrow }) => arrow, style: { '&[data-popper-placement*="right"]': { '& > div': { marginLeft: 2, }, }, }, }, { props: ({ arrow }) => !arrow, style: { '&[data-popper-placement*="right"]': { '& > div': { marginLeft: 0, }, }, }, }, { props: ({ arrow }) => arrow, style: { '&[data-popper-placement*="left"]': { '& > div': { marginRight: 2, }, }, }, }, { props: ({ arrow }) => !arrow, style: { '&[data-popper-placement*="left"]': { '& > div': { marginRight: 0, }, }, }, }, ], })); const Arrow = styled('div')({ position: 'absolute', fontSize: 7, width: '3em', height: '3em', '&::before': { content: '""', margin: 'auto', display: 'block', width: 0, height: 0, borderStyle: 'solid', }, }); export default function ScrollPlayground() { const anchorRef = React.useRef(null); const [open, setOpen] = React.useState(false); const [placement, setPlacement] = React.useState('bottom'); const [disablePortal, setDisablePortal] = React.useState(false); const [flip, setFlip] = React.useState({ enabled: true, altBoundary: true, rootBoundary: 'document', }); const [preventOverflow, setPreventOverflow] = React.useState({ enabled: true, altAxis: true, altBoundary: true, tether: true, rootBoundary: 'document', }); const [arrow, setArrow] = React.useState(false); const [arrowRef, setArrowRef] = React.useState(null); const handleClickButton = () => { setOpen((prevOpen) => !prevOpen); }; const centerScroll = (element) => { if (!element) { return; } const container = element.parentElement; container.scrollTop = element.clientHeight / 4; container.scrollLeft = element.clientWidth / 4; }; const jsx = ` `; const id = open ? 'scroll-playground' : null; return (
Scroll around this container to experiment with flip and preventOverflow modifiers.
{arrow ? ( ) : null} {"Use Google's location service?"} Let Google help apps determine location.
Appearance { setPlacement(event.target.value); }} variant="standard" slotProps={{ select: { native: true, inputProps: { 'aria-labelledby': 'scroll-playground-placement-label', }, }, inputLabel: { id: 'scroll-playground-placement-label', }, }} > { setDisablePortal(event.target.checked); }} value="disablePortal" /> } label="Disable portal" /> (the children stay within their parent DOM hierarchy) Modifiers (options from Popper.js) Prevent Overflow { setPreventOverflow((old) => ({ ...old, enabled: event.target.checked, })); }} value="arrow" /> } label="Enable" /> { setPreventOverflow((old) => ({ ...old, altAxis: event.target.checked, })); }} value="alt-axis" /> } label="Alt axis" /> { setPreventOverflow((old) => ({ ...old, altBoundary: event.target.checked, })); }} value="alt-boundary" /> } label="Alt Boundary" /> { setPreventOverflow((old) => ({ ...old, tether: event.target.checked, })); }} value="tether" /> } label="Tether" /> { setPreventOverflow((old) => ({ ...old, rootBoundary: event.target.value, })); }} variant="standard" slotProps={{ select: { native: true, inputProps: { 'aria-labelledby': 'scroll-playground-prevent-overflow-root-boundary', }, }, inputLabel: { id: 'scroll-playground-prevent-overflow-root-boundary', }, }} > Flip { setFlip((old) => ({ ...old, enabled: event.target.checked, })); }} value="enabled" /> } label="Enable" /> { setFlip((old) => ({ ...old, altBoundary: event.target.checked, })); }} value="alt-boundary" /> } label="Alt Boundary" /> { setFlip((old) => ({ ...old, rootBoundary: event.target.value, })); }} variant="standard" slotProps={{ select: { native: true, inputProps: { 'aria-labelledby': 'scroll-playground-flip-root-boundary', }, }, inputLabel: { id: 'scroll-playground-flip-root-boundary', }, }} > Arrow { setArrow(event.target.checked); }} value="arrow" /> } label="Enable" />
); }