diff --git a/docs/src/pages/demos/menus/FadeMenu.js b/docs/src/pages/demos/menus/FadeMenu.js index 3ed6a101389d55..0283739bf8fa1b 100644 --- a/docs/src/pages/demos/menus/FadeMenu.js +++ b/docs/src/pages/demos/menus/FadeMenu.js @@ -19,11 +19,12 @@ class FadeMenu extends React.Component { render() { const { anchorEl } = this.state; + const open = Boolean(anchorEl); return (
+ + Profile + My account + Logout + + + ); + }} + + ); +} + +export default RenderPropsMenu; diff --git a/docs/src/pages/demos/menus/menus.md b/docs/src/pages/demos/menus/menus.md index 03587b2745068d..a05a7a8310ff14 100644 --- a/docs/src/pages/demos/menus/menus.md +++ b/docs/src/pages/demos/menus/menus.md @@ -55,3 +55,10 @@ You can use the same list composition features with the `MenuItem` component: Use a different transition altogether. {{"demo": "pages/demos/menus/FadeMenu.js"}} + +## Render Props + +It is a [render props](https://reactjs.org/docs/render-props.html) demo that +keeps track of the local state for a single menu. + +{{"demo": "pages/demos/menus/RenderPropsMenu.js"}} diff --git a/docs/src/pages/utils/popover/MouseOverPopover.js b/docs/src/pages/utils/popover/MouseOverPopover.js index ba00447826b0d5..b4db4f395a66b6 100644 --- a/docs/src/pages/utils/popover/MouseOverPopover.js +++ b/docs/src/pages/utils/popover/MouseOverPopover.js @@ -21,7 +21,7 @@ class MouseOverPopover extends React.Component { }; handlePopoverOpen = event => { - this.setState({ anchorEl: event.target }); + this.setState({ anchorEl: event.currentTarget }); }; handlePopoverClose = () => { @@ -35,10 +35,16 @@ class MouseOverPopover extends React.Component { return (
- + Hover with a Popover. ({ + typography: { + margin: theme.spacing.unit * 2, + }, +}); + +function RenderPropsPopover(props) { + const { classes } = props; + + return ( + + {({ anchorEl, updateAnchorEl }) => { + const open = Boolean(anchorEl); + return ( + + + { + updateAnchorEl(null); + }} + anchorOrigin={{ + vertical: 'bottom', + horizontal: 'center', + }} + transformOrigin={{ + vertical: 'top', + horizontal: 'center', + }} + > + The content of the Popover. + + + ); + }} + + ); +} + +RenderPropsPopover.propTypes = { + classes: PropTypes.object.isRequired, +}; + +export default withStyles(styles)(RenderPropsPopover); diff --git a/docs/src/pages/utils/popover/SimplePopover.js b/docs/src/pages/utils/popover/SimplePopover.js index a960037475de94..20e0c73ac9a89e 100644 --- a/docs/src/pages/utils/popover/SimplePopover.js +++ b/docs/src/pages/utils/popover/SimplePopover.js @@ -31,14 +31,21 @@ class SimplePopover extends React.Component { render() { const { classes } = this.props; const { anchorEl } = this.state; + const open = Boolean(anchorEl); return (
- - + 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 @@ -62,7 +63,7 @@ class FakedReferencePopper extends React.Component { facilisis neque enim sed neque. Quisque accumsan metus vel maximus consequat. Suspendisse lacinia tellus a libero volutpat maximus. - + {({ TransitionProps }) => ( diff --git a/docs/src/pages/utils/popper/RenderPropsPopper.js b/docs/src/pages/utils/popper/RenderPropsPopper.js new file mode 100644 index 00000000000000..33ca8ead74ffb3 --- /dev/null +++ b/docs/src/pages/utils/popper/RenderPropsPopper.js @@ -0,0 +1,61 @@ +import React from 'react'; +import PropTypes from 'prop-types'; +import { withStyles } from '@material-ui/core/styles'; +import Popper from '@material-ui/core/Popper'; +import Typography from '@material-ui/core/Typography'; +import Button from '@material-ui/core/Button'; +import Fade from '@material-ui/core/Fade'; +import Paper from '@material-ui/core/Paper'; +import toRenderProps from 'recompose/toRenderProps'; +import withState from 'recompose/withState'; + +const WithState = toRenderProps(withState('anchorEl', 'updateAnchorEl', null)); + +const styles = theme => ({ + typography: { + padding: theme.spacing.unit * 2, + }, +}); + +function RenderPropsPopper(props) { + const { classes } = props; + + return ( + + {({ anchorEl, updateAnchorEl }) => { + const open = Boolean(anchorEl); + const id = open ? 'render-props-popper' : null; + return ( + + + + {({ TransitionProps }) => ( + + + + The content of the Popper. + + + + )} + + + ); + }} + + ); +} + +RenderPropsPopper.propTypes = { + classes: PropTypes.object.isRequired, +}; + +export default withStyles(styles)(RenderPropsPopper); diff --git a/docs/src/pages/utils/popper/ScrollPlayground.js b/docs/src/pages/utils/popper/ScrollPlayground.js index a134cffca71d0b..10ddd4d56deb55 100644 --- a/docs/src/pages/utils/popper/ScrollPlayground.js +++ b/docs/src/pages/utils/popper/ScrollPlayground.js @@ -175,6 +175,7 @@ class AnchorPlayground extends React.Component { > \`\`\` `; + const id = open ? 'scroll-playground' : null; return (
@@ -188,6 +189,7 @@ class AnchorPlayground extends React.Component { }} variant="contained" onClick={this.handleClickButton} + aria-describedby={id} > Toggle Popper @@ -196,6 +198,7 @@ class AnchorPlayground extends React.Component { modifiers.