diff --git a/src/App.tsx b/src/App.tsx index 5279e89bd76752473dd481d4087c9d71a3644806..85d6d601470498af53191f831d3af3b2403aa570 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -4,7 +4,7 @@ import { ClientContextProvider } from './context'; import ThemeProvider from './context/ThemeProvider'; import { UserStateProvider } from './context/UserContext'; import Routes from './Routes'; -import { darkTheme } from './theme'; +import darkTheme from './styles/darkTheme'; function App(): React.ReactElement { return ( diff --git a/src/components/Footer.tsx b/src/components/Footer.tsx index 23bc3e2fab51c1e4464a64ba5d630da394961d41..15df3a1c58b0bc71d9e11a0501e6eb8b8539b120 100644 --- a/src/components/Footer.tsx +++ b/src/components/Footer.tsx @@ -1,5 +1,222 @@ +import { + Box, + IconButton, + makeStyles, + Typography, + useMediaQuery, + useTheme, +} from '@material-ui/core'; +import FacebookIcon from '@material-ui/icons/Facebook'; +import MailIcon from '@material-ui/icons/Mail'; import React from 'react'; +import DevTeamIcon from './svg/DevTeamIcon'; +import SchdesignIcon from './svg/SchdesignIcon'; -const Footer: React.FC = () => <div>Footer</div>; +const useMobileStyles = makeStyles((theme) => ({ + footer: { + background: theme.footer.background, + padding: theme.spacing(1), + }, + contactText: { + color: theme.palette.primary.contrastText, + fontSize: '1.7rem', + fontWeight: 500, + marginBottom: theme.spacing(1), + marginTop: theme.spacing(1), + }, + social: { + color: theme.palette.secondary.main, + marginLeft: theme.spacing(3), + marginRight: theme.spacing(3), + marginBottom: theme.spacing(1), + marginTop: theme.spacing(1), + fontSize: '2rem', + }, + socialButton: { + margin: 0, + padding: 0, + }, + devteam: { + color: '#3051bf', + fontSize: '1.5rem', + paddingLeft: theme.spacing(1), + fontWeight: 500, + }, + schdesign: { + marginTop: '0.65rem', + }, + groups: { + marginTop: theme.spacing(1), + }, + groupButton: { + paddingTop: '0.1rem', + paddingBottom: '0.1rem', + }, +})); + +const useDesktopStyles = makeStyles((theme) => ({ + footer: { + paddingLeft: theme.spacing(2), + paddingRight: theme.spacing(2), + }, + contactText: { + fontSize: '1.8rem', + }, + devteam: { + fontSize: '1.7rem', + paddingLeft: theme.spacing(1), + }, + schdesignButton: { + paddingTop: '0.55rem', + }, + contact: { + marginRight: theme.spacing(3), + }, + social: { + fontSize: '1.5rem', + margin: '0', + marginRight: theme.spacing(1), + marginTop: theme.spacing(0.5), + marginBottom: theme.spacing(0.5), + }, + socialText: { + color: theme.palette.secondary.main, + }, +})); + +const Footer: React.FC = () => { + const mClasses = useMobileStyles(); + const dClasses = useDesktopStyles(); + const theme = useTheme(); + + const isSmallScreen = useMediaQuery(theme.breakpoints.down('xs')); + + const SmallScreen: React.FC = () => ( + <Box display="flex" justifyContent="center" flexDirection="column"> + <Typography align="center" className={mClasses.contactText}> + Kapcsolat + </Typography> + <Box display="flex" justifyContent="center"> + <IconButton + className={mClasses.socialButton} + onClick={(): void => { + window.open('https://www.facebook.com/groups/schbody/'); + }} + > + <FacebookIcon className={mClasses.social} /> + </IconButton> + <IconButton + className={mClasses.socialButton} + onClick={(): void => { + window.location.href = 'mailto:body@sch.bme.hu'; + }} + > + <MailIcon className={mClasses.social} /> + </IconButton> + </Box> + <Box display="flex" justifyContent="space-around" className={mClasses.groups}> + <IconButton + className={mClasses.groupButton} + onClick={(): void => { + window.open('https://kszk.bme.hu/'); + }} + > + <Box display="flex" justifyContent="center" alignItems="center"> + <DevTeamIcon width="1.8rem" height="1.8rem" /> + <Typography className={mClasses.devteam}>DevTeam</Typography> + </Box> + </IconButton> + <IconButton + className={mClasses.groupButton} + onClick={(): void => { + window.open('https://schdesign.hu/'); + }} + > + <Box className={mClasses.schdesign}> + <SchdesignIcon + width="7.5rem" + height="2.5rem" + color1={theme.palette.primary.contrastText} + /> + </Box> + </IconButton> + </Box> + </Box> + ); + + const LargeScreen: React.FC = () => ( + <Box display="flex" justifyContent="space-between"> + <Box + display="flex" + justifyContent="space-around" + alignItems="center" + className={mClasses.groups} + > + <IconButton + className={mClasses.groupButton} + onClick={(): void => { + window.open('https://kszk.bme.hu/'); + }} + > + <Box display="flex" justifyContent="center" alignItems="center"> + <DevTeamIcon width="2.25rem" height="2.25rem" /> + <Typography className={`${mClasses.devteam} ${dClasses.devteam}`}>DevTeam</Typography> + </Box> + </IconButton> + <IconButton + className={`${mClasses.groupButton} ${dClasses.schdesignButton}`} + onClick={(): void => { + window.open('https://schdesign.hu/'); + }} + > + <SchdesignIcon + width="8.75rem" + height="3.125rem" + color1={theme.palette.primary.contrastText} + /> + </IconButton> + </Box> + <Box + display="flex" + flexDirection="column" + alignItems="flex-start" + className={dClasses.contact} + > + <Typography align="center" className={`${mClasses.contactText} ${dClasses.contactText}`}> + Kapcsolat + </Typography> + <Box display="flex" flexDirection="column" alignItems="flex-start"> + <IconButton + className={mClasses.socialButton} + onClick={(): void => { + window.open('https://www.facebook.com/groups/schbody/'); + }} + > + <Box display="flex" alignItems="center" justifyContent="center"> + <FacebookIcon className={`${mClasses.social} ${dClasses.social}`} /> + <Typography className={dClasses.socialText}>Facebook</Typography> + </Box> + </IconButton> + + <IconButton + className={mClasses.socialButton} + onClick={(): void => { + window.location.href = 'mailto:body@sch.bme.hu'; + }} + > + <MailIcon className={`${mClasses.social} ${dClasses.social}`} /> + <Typography className={dClasses.socialText}>body@sch.bme.hu</Typography> + </IconButton> + </Box> + </Box> + </Box> + ); + + return ( + <Box component="footer" className={`${mClasses.footer} ${!isSmallScreen && dClasses.footer}`}> + {isSmallScreen ? <SmallScreen /> : <LargeScreen />} + </Box> + ); +}; export default Footer; diff --git a/src/components/svg/DevTeamIcon.tsx b/src/components/svg/DevTeamIcon.tsx new file mode 100644 index 0000000000000000000000000000000000000000..4aa9a8137d71b36646825c5a90e361153b4af2f2 --- /dev/null +++ b/src/components/svg/DevTeamIcon.tsx @@ -0,0 +1,44 @@ +import * as React from 'react'; + +interface IDevTeamIconProps extends React.SVGProps<SVGSVGElement> { + color1?: string; + color2?: string; +} + +const DevTeamIcon: React.FC<IDevTeamIconProps> = ({ + height = '1.5rem', + width = '1.5rem', + color1 = '#3051bf', + color2 = '#a806c9', + ...props +}) => { + return ( + <svg + xmlns="http://www.w3.org/2000/svg" + height={height} + width={width} + viewBox="0 0 1024 1024" + // eslint-disable-next-line react/jsx-props-no-spreading + {...props} + > + <title>devteam</title> + <g id="prefix__Layer_2" data-name="Layer 2"> + <path + id="prefix__path4536" + d="M550.27 281.1L433.38 631.8a577.52 577.52 0 0067 30.16l119.25-357.74z" + fill={color2} + /> + <path + d="M511.22 1023.85A511.83 511.83 0 11611.18 10c117.09 23.11 223.44 86 299.46 177 77.74 93 117.85 209 113 326.55 0 .86-.1 1.72-.19 2.58C1010.52 630 954 713.64 860.07 758.1c-71.2 33.68-160.89 43.27-259.39 27.72-89.68-14.17-180.26-48.58-254.93-96.91l-.41-.27L126 542.41a36.56 36.56 0 010-60.83l219.34-146.22 40.55 60.83L212.18 512l173.51 115.67c121.63 78.64 312.82 126 443.11 64.34 70.56-33.38 111.53-94.88 121.8-182.83 7.75-202.4-144-386-353.61-427.51-204.84-40.54-411.24 70.18-490.77 263.27s-11 417 163 532.53C442.85 992.73 675.38 969 822.15 821.06l51.9 51.49a510.56 510.56 0 01-362.83 151.3z" + fill={color1} + /> + <path + d="M678.34 688.64l-40.55-60.84L811.5 512 637.79 396.19l40.55-60.83 219.34 146.22a36.55 36.55 0 010 60.83z" + fill={color1} + /> + </g> + </svg> + ); +}; + +export default DevTeamIcon; diff --git a/src/components/svg/SchdesignIcon.tsx b/src/components/svg/SchdesignIcon.tsx new file mode 100644 index 0000000000000000000000000000000000000000..81ce7204c0f74b4bd70295a56e5294bdf3d390de --- /dev/null +++ b/src/components/svg/SchdesignIcon.tsx @@ -0,0 +1,46 @@ +import * as React from 'react'; + +interface ISchdesignIconProps extends React.SVGProps<SVGSVGElement> { + color1?: string; + color2?: string; +} + +const SchdesignIcon: React.FC<ISchdesignIconProps> = ({ + height = '2.5rem', + width = '6.25rem', + color1 = '#3d3d3d', + color2 = '#f8485e', + ...props +}) => { + return ( + <svg + xmlns="http://www.w3.org/2000/svg" + viewBox="0 0 1259.51 337.41" + height={height} + width={width} + // eslint-disable-next-line react/jsx-props-no-spreading + {...props} + > + <title>{'logoEszk\xF6z 2'}</title> + <g id="prefix__R\xE9teg_2" data-name="R\xE9teg 2"> + <g id="prefix__Layer_1" data-name="Layer 1"> + <path + d="M563 0v93.23l-.08-.06a70 70 0 00-113.35 52.55v4.77A69.6 69.6 0 00460 184.93a71 71 0 0010 12.68 70 70 0 0092.87 5.39h.13a68.51 68.51 0 006-5.37A70.46 70.46 0 00579 185a69.61 69.61 0 0010.51-36.2V78h.15V0zm-43.49 191.42a43.39 43.39 0 1143.36-44.87v2.98a43.39 43.39 0 01-43.36 41.89zM919.66 78.53h26.49V218.1h-26.49zM1249.08 111.15a70 70 0 00-129.59 34.35v5a69.86 69.86 0 0020.51 47.11 70.64 70.64 0 006.15 5.45v-52.83c0-.76-.06-1.52-.06-2.29s0-1.52.06-2.28a43.12 43.12 0 016.41-20.52 43.77 43.77 0 016.25-7.88 43.38 43.38 0 0161.32 0 43.78 43.78 0 016.27 7.93 43.06 43.06 0 016.43 21.28V218h26.67v-70.78a69.63 69.63 0 00-10.42-36.07zM745 134.63a70 70 0 00-138.73 11v4.9a70 70 0 00119.47 47.11L707 178.77a43.39 43.39 0 01-72-17.28h110a69.82 69.82 0 001.28-12.69v-1.45a70.06 70.06 0 00-1.28-12.72zm-110 0a43.4 43.4 0 0182.52 0zM1092.4 111.1a71 71 0 00-10.12-12.76 71.82 71.82 0 00-6.12-5.44 70 70 0 00-86.68 0 68.35 68.35 0 00-6.18 5.48A69.89 69.89 0 00963.21 140c-.2 1.8-.34 3.61-.4 5.45v4.89a69.67 69.67 0 0010.45 34.45 70.91 70.91 0 0010.07 12.67 70 70 0 0098.95 0 69.91 69.91 0 0020.55-48.83v-1.45a69.66 69.66 0 00-10.43-36.08zm-59.6 80.19a43.37 43.37 0 01-43.32-41.11q-.06-1.12-.06-2.28t.06-2.28a43.38 43.38 0 0186.68.79v2.98a43.29 43.29 0 01-6.49 21.4 43.9 43.9 0 01-6.22 7.82 43.26 43.26 0 01-30.65 12.68zM1102.83 267.38a69.89 69.89 0 01-20.55 49.55 69.77 69.77 0 01-49.48 20.48 69.71 69.71 0 01-43.32-15 70.83 70.83 0 01-6.15-5.45l6.15-6.16 12.68-12.71a43.37 43.37 0 0074-29.21v-1.49-1.49a43.25 43.25 0 00-12.71-29.21l12.71-12.69 6.12-6.13a70.65 70.65 0 0110.12 12.76 69.75 69.75 0 0110.43 36.75z" + fill={color2} + /> + <path + d="M276.15 197.63a70 70 0 01-119.47-47.11v-4.9a70 70 0 01119.47-47.11l-18.83 18.86a43.39 43.39 0 100 61.4zM412.31 98.48a68.9 68.9 0 00-6.14-5.48 70.06 70.06 0 00-86.67 0V0h-26.69v150.46a69.77 69.77 0 0020.52 47.12 70.51 70.51 0 006.14 5.45v-52.71q-.06-1.14-.06-2.28t.06-2.28a43.13 43.13 0 016.42-20.53 43.39 43.39 0 0180.25 20.88v71.99h26.69V148a69.83 69.83 0 00-20.52-49.52zM138.73 134.63h-110A43.39 43.39 0 0170 104.69a43.22 43.22 0 0130.65 12.68l18.83-18.86a70 70 0 00-92.8-5.46 68.35 68.35 0 00-6.18 5.48 70.33 70.33 0 00-10.07 12.7A69.83 69.83 0 000 145.62v4.9a70.69 70.69 0 001.24 11h110a43.39 43.39 0 01-71.91 17.29l-12.68 12.7-6.15 6.16a70 70 0 0099 0A69.79 69.79 0 00140 148.8v-1.45a71 71 0 00-1.27-12.72zM70 148.13l-.16.1.12-.12.07.07z" + fill={color1} + /> + <circle cx={932.35} cy={13.33} r={13.33} fill={color2} /> + <path + d="M901.72 134.63h-110a43.68 43.68 0 014.35-9.37 44.48 44.48 0 016.25-7.88 43.4 43.4 0 0161.32 0l18.82-18.86a70 70 0 00-92.8-5.46 68.23 68.23 0 00-6.17 5.48A69.66 69.66 0 00763 145.62v4.9a69.49 69.49 0 001.24 11h110a43.39 43.39 0 01-71.91 17.29l-12.68 12.7-6.15 6.16a70.76 70.76 0 006.15 5.46 70.06 70.06 0 0092.81-5.47 70.55 70.55 0 0010-12.64A69.79 69.79 0 00903 148.8v-1.45a70.06 70.06 0 00-1.28-12.72zM833 148.13l-.17.1.13-.12.06.07z" + fill={color2} + /> + </g> + </g> + </svg> + ); +}; + +export default SchdesignIcon; diff --git a/src/context/ThemeProvider.tsx b/src/context/ThemeProvider.tsx index a32c2249373bd7826f228c0c1251a6631e180453..49bdd30dbe98d2a3ea1e4d71e905e5403efcd952 100644 --- a/src/context/ThemeProvider.tsx +++ b/src/context/ThemeProvider.tsx @@ -6,17 +6,16 @@ import { } from '@material-ui/core/styles'; import React, { useMemo } from 'react'; import { ThemeProvider as SCThemeProvider } from 'styled-components'; -import { theme as defaultTheme } from '../theme'; +import lightTheme from '../styles/lightTheme'; export interface ThemeProviderProps { theme?: Theme; } const ThemeProvider: React.FC<ThemeProviderProps> = ({ theme: themeProp, children }) => { - const theme = useMemo( - () => (themeProp ? createMuiTheme(defaultTheme, themeProp) : defaultTheme), - [themeProp], - ); + const theme = useMemo(() => (themeProp ? createMuiTheme(lightTheme, themeProp) : lightTheme), [ + themeProp, + ]); return ( <StylesProvider injectFirst> <MUIThemeProvider theme={theme}> diff --git a/src/pages/Page.tsx b/src/pages/Page.tsx index 8ea7c411a8fe6d8eea45020929e8e2549e335ed3..c0e23b076a7b286fac1f120201c1aebd7a3dd1b5 100644 --- a/src/pages/Page.tsx +++ b/src/pages/Page.tsx @@ -1,32 +1,27 @@ -import { Theme, useMediaQuery } from '@material-ui/core'; +import { Box, makeStyles, Theme, useMediaQuery } from '@material-ui/core'; import React from 'react'; -import styled from 'styled-components'; import DrawerMenu from '../components/DrawerMenu'; import Footer from '../components/Footer'; import Header from '../components/Header'; import MobileHeader from '../components/MobileHeader'; import { useToggle } from '../hooks/useToggle'; -const Container = styled.div( - (props) => ` - height: 100%; - display: flex; - flex-direction: column; - justify-content: space-between; - - background-color: ${props.theme.palette.background.default}; -`, -); - -const MainContent = styled.div` - height: 100%; -`; +const useStyles = makeStyles((theme) => ({ + root: { + display: 'flex', + flexDirection: 'column', + minHeight: '100vh', + background: theme.palette.background.default, + }, +})); const Page: React.FC = ({ children }) => { const [openDrawer, { toggleOn, toggleOff }] = useToggle(false); const isMobile = useMediaQuery((theme: Theme) => theme.breakpoints.down('xs')); + const classes = useStyles(); + return ( - <Container> + <Box className={classes.root}> {isMobile ? ( <MobileHeader onMenuClick={toggleOn} /> ) : ( @@ -35,9 +30,11 @@ const Page: React.FC = ({ children }) => { {isMobile && ( <DrawerMenu open={openDrawer} toggleOpen={toggleOff} handleLogout={(): void => {}} /> )} - <MainContent>{children}</MainContent> + <Box flexGrow={1} flexShrink={0} flexBasis="auto"> + {children} + </Box> <Footer /> - </Container> + </Box> ); }; diff --git a/src/theme.ts b/src/styles/darkTheme.ts similarity index 58% rename from src/theme.ts rename to src/styles/darkTheme.ts index fa689322dcdba61fbc1417c69ebc8b9e7678585d..719abe9478baa6319bb395fdcc517b8f922cecd5 100644 --- a/src/theme.ts +++ b/src/styles/darkTheme.ts @@ -1,25 +1,9 @@ import { createMuiTheme } from '@material-ui/core'; -// eslint-disable-next-line import/prefer-default-export -export const theme = createMuiTheme({ - // TODO: Create default theme - /* palette: { - primary: {}, - secondary: {}, - error: {}, - success: {}, - info: {}, - warning: {}, - grey: {}, - - text: {}, - }, */ - typography: { - fontFamily: 'Roboto', +const darkTheme = createMuiTheme({ + footer: { + background: '#222222', }, -}); - -export const darkTheme = createMuiTheme({ palette: { primary: { main: '#1A6B97', @@ -36,6 +20,7 @@ export const darkTheme = createMuiTheme({ default: '#2A2A28', paper: '#202020', }, + divider: '#444444', /* success: {}, info: {}, @@ -49,3 +34,5 @@ export const darkTheme = createMuiTheme({ fontFamily: 'Roboto', }, }); + +export default darkTheme; diff --git a/src/styles/lightTheme.ts b/src/styles/lightTheme.ts new file mode 100644 index 0000000000000000000000000000000000000000..157b6cfeb25b2e724111ca3330fc735e65777f1f --- /dev/null +++ b/src/styles/lightTheme.ts @@ -0,0 +1,24 @@ +import { createMuiTheme } from '@material-ui/core'; + +const lightTheme = createMuiTheme({ + // TODO: Create default theme + /* palette: { + primary: {}, + secondary: {}, + error: {}, + success: {}, + info: {}, + warning: {}, + grey: {}, + + text: {}, + }, */ + footer: { + background: '#E0E0E0', + }, + typography: { + fontFamily: 'Roboto', + }, +}); + +export default lightTheme; diff --git a/src/styles/material-ui.d.ts b/src/styles/material-ui.d.ts new file mode 100644 index 0000000000000000000000000000000000000000..93c7b56235c73cd6cc11933e9de3347372a4b2a3 --- /dev/null +++ b/src/styles/material-ui.d.ts @@ -0,0 +1,10 @@ +import '@material-ui/core/styles/createMuiTheme'; + +declare module '@material-ui/core/styles/createMuiTheme' { + interface Theme { + footer: { + background: React.CSSProperties['background']; + }; + } + interface ThemeOptions extends Theme {} +} diff --git a/src/styled-components.d.ts b/src/styles/styled-components.d.ts similarity index 100% rename from src/styled-components.d.ts rename to src/styles/styled-components.d.ts