Skip to content

Commit b8121f9

Browse files
committed
Add content menu for smaller screens
1 parent c60eda0 commit b8121f9

29 files changed

+227
-19
lines changed
Lines changed: 105 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,105 @@
1+
import React, { useState, useRef } from 'react';
2+
import PropTypes from 'prop-types';
3+
import { makeStyles } from '@material-ui/core/styles';
4+
import { useRouter } from 'next/router';
5+
6+
import Button from '@material-ui/core/Button';
7+
import ClickAwayListener from '@material-ui/core/ClickAwayListener';
8+
import Grow from '@material-ui/core/Grow';
9+
import Paper from '@material-ui/core/Paper';
10+
import Popper from '@material-ui/core/Popper';
11+
import MenuItem from '@material-ui/core/MenuItem';
12+
import MenuList from '@material-ui/core/MenuList';
13+
14+
import Grid from '@material-ui/core/Grid';
15+
import Hidden from '@material-ui/core/Hidden';
16+
17+
import { headerToId } from './list-of-contents';
18+
19+
const reqSource = require.context('!raw-loader!@docs/pages', true, /\.md/);
20+
21+
const itemStyles = makeStyles(() => ({
22+
a: {
23+
textDecoration: 'none',
24+
color: 'inherit'
25+
}
26+
}));
27+
28+
const Item = ({ text, setOpen }) => {
29+
const router = useRouter();
30+
const labelText = text.replace(/#/g, '');
31+
const styles = itemStyles();
32+
33+
return (
34+
<MenuItem onClick={() => setOpen(false)} component="a" className={styles.a} href={`${router.pathname}#${headerToId(text)}`} title={labelText}>
35+
{labelText}
36+
</MenuItem>
37+
);
38+
};
39+
40+
Item.propTypes = {
41+
text: PropTypes.string.isRequired,
42+
setOpen: PropTypes.func.isRequired
43+
};
44+
45+
const contentStyles = makeStyles(() => ({
46+
button: {
47+
paddingLeft: 0,
48+
marginTop: '-24px'
49+
}
50+
}));
51+
52+
const ListOfContents = ({ file }) => {
53+
const [open, setOpen] = useState(false);
54+
const styles = contentStyles();
55+
const anchorRef = useRef(null);
56+
57+
const handleListKeyDown = (event) => {
58+
if (event.key === 'Tab') {
59+
event.preventDefault();
60+
setOpen(false);
61+
}
62+
};
63+
64+
const text = reqSource(`./${file}.md`).default;
65+
66+
const regex = /^#+ .*/gm;
67+
const found = text.match(regex) || [];
68+
69+
return (
70+
<Grid item xs={12} md={false}>
71+
<Hidden implementation="css" mdUp>
72+
<Button
73+
ref={anchorRef}
74+
className={styles.button}
75+
aria-controls={open ? 'menu-list-grow' : undefined}
76+
aria-haspopup="true"
77+
onClick={() => setOpen((prevOpen) => !prevOpen)}
78+
>
79+
Show content
80+
</Button>
81+
<Popper open={open} role={undefined} transition disablePortal anchorEl={anchorRef.current}>
82+
{({ TransitionProps }) => (
83+
<Grow {...TransitionProps} style={{ transformOrigin: 'center top' }}>
84+
<Paper>
85+
<ClickAwayListener onClickAway={() => setOpen(false)}>
86+
<MenuList autoFocusItem={open} id="menu-list-grow" onKeyDown={handleListKeyDown}>
87+
{found.map((text) => (
88+
<Item key={text} text={text} setOpen={setOpen} />
89+
))}
90+
</MenuList>
91+
</ClickAwayListener>
92+
</Paper>
93+
</Grow>
94+
)}
95+
</Popper>
96+
</Hidden>
97+
</Grid>
98+
);
99+
};
100+
101+
ListOfContents.propTypes = {
102+
file: PropTypes.string.isRequired
103+
};
104+
105+
export default ListOfContents;

packages/react-renderer-demo/src/helpers/list-of-contents.js

Lines changed: 21 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import ListItemText from '@material-ui/core/ListItemText';
88
import Typography from '@material-ui/core/Typography';
99
import { useRouter } from 'next/router';
1010
import StickyBox from 'react-sticky-box';
11+
import Hidden from '@material-ui/core/Hidden';
1112

1213
const reqSource = require.context('!raw-loader!@docs/pages', true, /\.md/);
1314

@@ -113,24 +114,26 @@ const ListOfContents = ({ file }) => {
113114
const regex = /^#+ .*/gm;
114115
const found = text.match(regex) || [];
115116
return (
116-
<StickyBox offsetTop={96} offsetBottom={20}>
117-
<div className={classes.fixedContainer}>
118-
<Typography className={classes.contentHeader} component="h3">
119-
Content
120-
</Typography>
121-
<List dense>
122-
{found.map((text) => (
123-
<ListItem
124-
onClick={() => setActive(headerToId(text))}
125-
className={clsx(classes.listItem, { [classes.listItemActive]: headerToId(text) === activeItem })}
126-
key={text}
127-
>
128-
<ListItemText className={classes.listItemText} primary={<ListHeader text={text} />} />
129-
</ListItem>
130-
))}
131-
</List>
132-
</div>
133-
</StickyBox>
117+
<Hidden implementation="css" smDown>
118+
<StickyBox offsetTop={96} offsetBottom={20}>
119+
<div className={classes.fixedContainer}>
120+
<Typography className={classes.contentHeader} component="h3">
121+
Content
122+
</Typography>
123+
<List dense>
124+
{found.map((text) => (
125+
<ListItem
126+
onClick={() => setActive(headerToId(text))}
127+
className={clsx(classes.listItem, { [classes.listItemActive]: headerToId(text) === activeItem })}
128+
key={text}
129+
>
130+
<ListItemText className={classes.listItemText} primary={<ListHeader text={text} />} />
131+
</ListItem>
132+
))}
133+
</List>
134+
</div>
135+
</StickyBox>
136+
</Hidden>
134137
);
135138
};
136139

packages/react-renderer-demo/src/next.config.js

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,8 @@ module.exports = withBundleAnalyzer(
6363
'@docs/examples': path.resolve(__dirname, './examples'),
6464
'@docs/list-of-contents': path.resolve(__dirname, './helpers/list-of-contents'),
6565
'@docs/code-example': path.resolve(__dirname, './components/code-example'),
66-
'@docs/hooks': path.resolve(__dirname, './hooks')
66+
'@docs/hooks': path.resolve(__dirname, './hooks'),
67+
'@docs/list-of-contents-select': path.resolve(__dirname, './helpers/list-of-contents-select')
6768
};
6869

6970
config.optimization.minimizer = [

packages/react-renderer-demo/src/pages/mappers/blueprint-component-mapper.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,10 @@
11
import Grid from '@material-ui/core/Grid'
22
import ListOfContents from '@docs/list-of-contents';
3+
import ListOfContentsMobile from '@docs/list-of-contents-select';
34

45
<Grid container item>
6+
7+
<ListOfContentsMobile file="mappers/blueprint-component-mapper" />
58
<Grid item xs={12} md={10}>
69

710
# BlueprintJS

packages/react-renderer-demo/src/pages/mappers/mui-component-mapper.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,10 @@
11
import Grid from '@material-ui/core/Grid'
22
import ListOfContents from '@docs/list-of-contents';
3+
import ListOfContentsMobile from '@docs/list-of-contents-select';
34

45
<Grid container item>
6+
7+
<ListOfContentsMobile file="mappers/mui-component-mapper" />
58
<Grid item xs={12} md={10}>
69

710
# MaterialUI mapper

packages/react-renderer-demo/src/pages/mappers/pf3-component-mapper.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,10 @@
11
import Grid from '@material-ui/core/Grid'
22
import ListOfContents from '@docs/list-of-contents';
3+
import ListOfContentsMobile from '@docs/list-of-contents-select';
34

45
<Grid container item>
6+
7+
<ListOfContentsMobile file="mappers/pf3-component-mapper" />
58
<Grid item xs={12} md={10}>
69

710
# PatternFly 3 mapper

packages/react-renderer-demo/src/pages/mappers/pf4-component-mapper.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,10 @@
11
import Grid from '@material-ui/core/Grid'
22
import ListOfContents from '@docs/list-of-contents';
3+
import ListOfContentsMobile from '@docs/list-of-contents-select';
34

45
<Grid container item>
6+
7+
<ListOfContentsMobile file="mappers/pf4-component-mapper" />
58
<Grid item xs={12} md={10}>
69

710
# PatternFly 4 mapper

packages/react-renderer-demo/src/pages/mappers/suir-component-mapper.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,10 @@
11
import Grid from '@material-ui/core/Grid'
22
import ListOfContents from '@docs/list-of-contents';
3+
import ListOfContentsMobile from '@docs/list-of-contents-select';
34

45
<Grid container item>
6+
7+
<ListOfContentsMobile file="mappers/suir-component-mapper" />
58
<Grid item xs={12} md={10}>
69

710
# Semantic UI react

packages/react-renderer-demo/src/pages/migration-guide.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,11 @@ import Link from '@material-ui/core/Link';
44

55
import ListOfContents from '@docs/list-of-contents';
66

7+
import ListOfContentsMobile from '@docs/list-of-contents-select';
8+
79
<Grid container item>
10+
11+
<ListOfContentsMobile file="migration-guide" />
812
<Grid item xs={12} md={10}>
913

1014
# Migration guide to version 2

packages/react-renderer-demo/src/pages/renderer/action-mapper.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,12 @@ import ListOfContents from '@docs/list-of-contents';
33
import CodeExample from '@docs/code-example';
44

55

6+
import ListOfContentsMobile from '@docs/list-of-contents-select';
7+
68
<Grid container item>
9+
10+
<ListOfContentsMobile file="renderer/action-mapper" />
11+
712
<Grid item xs={12} md={10}>
813

914
# Action Mapper

0 commit comments

Comments
 (0)