diff options
Diffstat (limited to 'src/demo')
| -rw-r--r-- | src/demo/Button/Button.tsx | 18 | ||||
| -rw-r--r-- | src/demo/Header/Header.tsx | 81 | ||||
| -rw-r--r-- | src/demo/Window/Window.tsx | 62 | ||||
| -rw-r--r-- | src/demo/Window/WindowSurface.tsx | 44 | ||||
| -rw-r--r-- | src/demo/Window/types.ts | 11 | 
5 files changed, 216 insertions, 0 deletions
| diff --git a/src/demo/Button/Button.tsx b/src/demo/Button/Button.tsx new file mode 100644 index 0000000..6bc0f98 --- /dev/null +++ b/src/demo/Button/Button.tsx @@ -0,0 +1,18 @@ +import React from 'react'; +import { Button as MaterialButton } from '@material-ui/core'; + + +interface PropTypes { +  color: 'primary' | 'secondary'; +} + +const Button: React.FC<PropTypes> = ({ color, children }) => ( +  <MaterialButton +    variant="contained" +    color={color} +    children={children} +  /> +); + + +export default Button; diff --git a/src/demo/Header/Header.tsx b/src/demo/Header/Header.tsx new file mode 100644 index 0000000..58be989 --- /dev/null +++ b/src/demo/Header/Header.tsx @@ -0,0 +1,81 @@ +import React from 'react'; + +import { +  AppBar, +  Tabs, +  Tab, +  Typography, +  Toolbar, +} from '@material-ui/core'; + +import { makeStyles } from '@material-ui/core/styles'; + + +interface PropTypes { +  logo: { +    icon: React.ReactNode; +    title: string; +  }; +  contents: { +    [key: string]: React.ReactNode | null; +  }; +  page: string; +  setPage: (newPage: string) => void; +} + +const useStyles = makeStyles(theme => ({ +  root: { +    background: theme.palette.background.elevation2, +    color: theme.palette.text.primary, +    paddingLeft: theme.spacing(3), +  }, +  logo: { +    margin: theme.spacing(0, 3, 0, 1), +  }, +  tab: { +    '& .MuiTab-wrapper': { +      padding: theme.spacing(2), +      flexDirection: 'row', +      fontSize: '0.8125rem', +      '& svg': { +        marginRight: theme.spacing(1), +        marginBottom: '0 !important', +      }, +    }, +  }, +})); + + +const Header: React.FC<PropTypes> = ({ +  logo, contents, page, setPage, +}) => { +  const classes = useStyles(); + +  const handleChange = (event: React.ChangeEvent<{}>, newPage: string): void => { +    setPage(newPage); +  }; + +  return ( +    <AppBar position="sticky" className={classes.root}> +      <Toolbar> +        {logo.icon} +        <Typography variant="h5" className={classes.logo} color="primary"> +          {logo.title} +        </Typography> +        <Tabs onChange={handleChange} value={page}> +          {contents && Object.keys(contents).map((item: string) => ( +            <Tab +              label={item} +              icon={contents[item] as JSX.Element} +              value={item} +              className={classes.tab} +              key={item} +            /> +          ))} +        </Tabs> +      </Toolbar> +    </AppBar> +  ); +}; + +export default Header; diff --git a/src/demo/Window/Window.tsx b/src/demo/Window/Window.tsx new file mode 100644 index 0000000..beaa672 --- /dev/null +++ b/src/demo/Window/Window.tsx @@ -0,0 +1,62 @@ +import React from 'react'; + +import { Typography, Divider, makeStyles } from '@material-ui/core'; + +import WindowSurface from './WindowSurface'; +import { SurfaceSize, SurfacePosition } from './types'; + + +interface PropTypes { +  type: 'primary' | 'secondary' | 'mono'; +  name?: string; +} + + +const useStyles = makeStyles(theme => ({ +  header: { +    padding: theme.spacing(1, 0, 1, 2), +    background: theme.palette.background.elevation2, +  }, +})); + + +const Window: React.FC<PropTypes> = ({ type, name, children }) => { +  const classes = useStyles(); + +  const size: SurfaceSize = { +    height: '85vh', +  }; + +  const position: SurfacePosition = { +    bottom: '3vh', +  }; + +  if (type === 'primary') { +    size.width = '63vw'; +    position.left = '2vw'; +  } else if (type === 'secondary') { +    size.width = '31vw'; +    position.right = '2vw'; +  } else if (type === 'mono') { +    position.left = '2vw'; +    position.right = '2vw'; +  } + +  return ( +    <WindowSurface +      size={size} +      position={position} +    > +      {name +      && ( +      <div> +        <Typography variant="h5" className={classes.header}>{name}</Typography> +        <Divider /> +      </div> +      )} +      {children} +    </WindowSurface> +  ); +}; + +export default Window; diff --git a/src/demo/Window/WindowSurface.tsx b/src/demo/Window/WindowSurface.tsx new file mode 100644 index 0000000..1900901 --- /dev/null +++ b/src/demo/Window/WindowSurface.tsx @@ -0,0 +1,44 @@ +import React from 'react'; + +import { Paper, makeStyles } from '@material-ui/core'; + +import { SurfaceSize, SurfacePosition } from './types'; + + +interface PropTypes { +  size: SurfaceSize; +  position: SurfacePosition; +} + + +const useStyles = makeStyles(theme => ({ +  surface: { +    position: 'absolute', +    display: 'flex', +    flexDirection: 'column', +    overflowY: 'auto', +    scrollbarColor: `${theme.palette.secondary.dark} ${theme.palette.secondary.light}`, + +    '& a.MuiTypography-root': { +      color: theme.palette.primary.light, +    }, +  }, +})); + + +const WindowSurface: React.FC<PropTypes> = ({ size, position, children }) => { +  const classes = useStyles(); + +  return ( +    <Paper +      variant="outlined" +      style={{ ...size, ...position }} +      className={classes.surface} +    > +      {children} +    </Paper> +  ); +}; + + +export default WindowSurface; diff --git a/src/demo/Window/types.ts b/src/demo/Window/types.ts new file mode 100644 index 0000000..9e18fe3 --- /dev/null +++ b/src/demo/Window/types.ts @@ -0,0 +1,11 @@ +export interface SurfaceSize { +  height: string; +  width?: string; +} + +export interface SurfacePosition { +  bottom: string; +  left?: string; +  right?: string; +} + | 
