///
import { responsiveVal } from '@graphcommerce/next-ui'
import { createTheme, CssBaseline, ThemeProvider } from '@material-ui/core'
import React from 'react'
import shadows from './shadows'
// Create a theme instance.
export const defaultTheme = createTheme({
palette: {
primary: {
main: '#FF4A55',
contrastText: '#000',
mutedText: `rgba(0,0,0,0.4)`,
dark: '#f33642',
},
secondary: {
main: '#006BFF',
light: '#006BFF12',
contrastText: '#FFF',
mutedText: `rgba(0,0,0,0.4)`,
},
background: {
default: '#fff',
highlight: '#f8f8f8',
},
divider: 'rgba(0, 0, 0, 0.08)',
success: {
main: '#01D26A',
mutedText: '#b8b8b8',
},
text: {
primary: '#000',
secondary: '#000',
disabled: 'rgba(0,0,0,0.4)',
},
},
breakpoints: {
values: {
xs: 0,
sm: 600,
md: 960,
lg: 1536,
xl: 1920,
},
},
shadows,
typography: {
fontFamily:
'-apple-system,BlinkMacSystemFont,Segoe UI,Helvetica,Arial,sans-serif,Apple Color Emoji,Segoe UI Emoji',
/**
* [The Material UI `h1`-`h6` typography
* values](https://material-ui.com/components/typography/#component) are an implementation of
* the [Material Design Headline type
* scale](https://material.io/design/typography/the-type-system.html#type-scale).
*
* Note: The typography values are referencing styles and have nothing to do with actual
* `
`-`` HTML elements (even though they are mapped 1:1 by default). One is
* completelt free to use different styles based on their requirements.
*
* There however are some problems with the way Material UI implementation: Material Design uses
* different typography headers for different breakpoints. For example, if we take a look at
* [Applying the type
* scale](https://material.io/design/typography/the-type-system.html#applying-the-type-scale) we
* see that the Headline 6 element is used in the `` location. This would need to be
* rendered as a h1 (or h2) style on a desktop.
*
* This results in the following variant to headline mapping for each breakpoint
*
* Variant/Breakpoint xs sm md lg xl
* h1 headline4 headline3 headline2 headline1
* h2 headline5 headline4 headline3 headline2 headline1
* h3 headline6 headline6 headline5 headline4 headline3
* h4 X X headline6 headline5 headline4
* h5 X X X headline6 headline5
* h6 X X X X headline6
*
* This effectively means that it's only safe to use h1 to h3 from this perspective.
*
* However, Material Design's type system offers `subtitle1` and `subtitle2` that can be used
* that should be used on combination with `body1` and `body2`.
*
* Since we aren't using the h4-h6 variants they can be repurposed for different usecases:
*/
h1: {
fontFamily: ['Public Sans', 'sans-serif'].join(', '),
fontSize: responsiveVal(36, 74),
fontWeight: 700,
// letterSpacing: '-0.0375em',
marginTop: '0.24em',
marginBottom: '0.58em',
lineHeight: 1.16,
},
h2: {
fontFamily: ['Public Sans', 'sans-serif'].join(', '),
fontSize: responsiveVal(28, 48),
fontWeight: 800,
// letterSpacing: '-0.0375em',
lineHeight: 1.42,
},
h3: {
fontFamily: ['Public Sans', 'sans-serif'].join(', '),
fontSize: responsiveVal(22, 30),
fontWeight: 700,
// letterSpacing: '-0.0375em',
lineHeight: 1.55,
},
h4: {
fontFamily: ['Public Sans', 'sans-serif'].join(', '),
fontWeight: 500,
fontSize: responsiveVal(18, 28),
// letterSpacing: '-0.0375em',
lineHeight: 1.55,
},
h5: {
fontFamily: ['Public Sans', 'sans-serif'].join(', '),
fontWeight: 700,
// letterSpacing: '-0.0375em',
fontSize: responsiveVal(17, 20),
lineHeight: 1.55,
},
h6: {
fontFamily: ['Public Sans', 'sans-serif'].join(', '),
fontSize: responsiveVal(17, 20),
fontWeight: 600,
// letterSpacing: '-0.0375em',
lineHeight: 1.8,
},
subtitle1: {
fontFamily: ['Public Sans', 'sans-serif'].join(', '),
fontSize: responsiveVal(16, 19, 1920),
fontWeight: 400,
// letterSpacing: '-0.0375em',
lineHeight: 1.7,
},
fontWeightBold: 600,
body1: {
// We're boosting the fontSize to be 17px at 1280
fontSize: responsiveVal(15, 18, 1920),
lineHeight: 1.7,
},
subtitle2: {
fontFamily: ['Public Sans', 'sans-serif'].join(', '),
fontSize: responsiveVal(14, 16),
fontWeight: 600,
lineHeight: 1.7,
},
body2: {
fontSize: responsiveVal(13, 15),
lineHeight: 1.7,
},
caption: {
fontSize: responsiveVal(11, 13),
},
button: {},
overline: {
fontSize: responsiveVal(12, 14),
color: `rgba(0, 0, 0, 0.3)`,
fontWeight: 500,
letterSpacing: 1,
lineHeight: 1.2,
textTransform: 'uppercase',
},
},
spacings: {
xxs: responsiveVal(10, 16),
xs: responsiveVal(12, 20),
sm: responsiveVal(14, 30),
md: responsiveVal(16, 50),
lg: responsiveVal(24, 80),
xl: responsiveVal(80, 160),
xxl: responsiveVal(100, 220),
},
page: {
horizontal: responsiveVal(10, 30),
vertical: responsiveVal(10, 30),
headerInnerHeight: {
xs: responsiveVal(21, 33),
sm: `56px`,
// 32px = height of logo
// + 2 x theme.spacings.xxs (top+bottom padding)
md: '72px', // `calc(40px + (${responsiveVal(10, 16)} * 2))`,
},
},
})
defaultTheme.overrides = {
MuiCssBaseline: {
'@global': {
body: {
overflowY: 'scroll',
},
'::selection': { background: '#ff4a557d' },
'::-moz-selection': { background: '#ff4a557d' },
'#__next': {
position: 'relative',
},
},
},
MuiContainer: {
root: {
paddingLeft: defaultTheme.page.horizontal,
paddingRight: defaultTheme.page.horizontal,
[defaultTheme.breakpoints.up('sm')]: {
paddingLeft: undefined,
paddingRight: undefined,
},
},
},
MuiButton: {
root: {
fontWeight: 400,
textTransform: 'none',
},
endIcon: {
marginLeft: 0,
},
contained: {
backgroundColor: '#fff',
boxShadow: defaultTheme.shadows[1],
'&:hover': { boxShadow: defaultTheme.shadows[1] },
'&:focus': { boxShadow: defaultTheme.shadows[1] },
},
containedPrimary: {
color: '#fff',
'& .MuiSvgIcon-root': { color: '#fff' },
},
containedSecondary: {
color: '#fff',
'& .MuiSvgIcon-root': { color: '#fff' },
},
containedSizeLarge: { padding: `15px ${responsiveVal(30, 60)}` },
iconSizeLarge: {
'& > *:first-child': { fontSize: 24 },
},
outlined: {
// todo: Button isn't rounded on all places, but should be on homepage?
borderRadius: 0,
},
},
MuiFab: {
root: {
backgroundColor: '#fff',
'&:hover': { backgroundColor: '#efefef' },
},
primary: {
color: '#fff',
'& .MuiSvgIcon-root': { color: '#fff' },
},
secondary: {
color: '#fff',
'& .MuiSvgIcon-root': { color: '#fff' },
},
extended: {
fontWeight: 400,
textTransform: 'none',
},
},
MuiInputLabel: {
root: {
'&$focused:not($error)': {
color: defaultTheme.palette.secondary.main,
},
},
},
MuiOutlinedInput: {
root: {
'&$focused $notchedOutline': {
borderColor: defaultTheme.palette.secondary.main,
},
},
},
MuiChip: {
root: {
boxShadow: defaultTheme.shadows[5],
backgroundColor: defaultTheme.palette.background.paper,
height: responsiveVal(28, 32),
borderRadius: responsiveVal(28 / 2, 32 / 2),
},
outlined: {
borderColor: defaultTheme.palette.divider,
boxShadow: 'unset',
},
},
MuiCheckbox: {
colorPrimary: {
color: '#EAEAEA',
'&$checked': {
color: defaultTheme.palette.primary.main,
},
},
},
MuiSwitch: {
root: {
padding: 7,
},
track: {
'$colorPrimary + &': {
backgroundColor: defaultTheme.palette.primary,
borderRadius: 30,
},
'$checked$colorPrimary + &': {
opacity: 1,
backgroundColor: defaultTheme.palette.primary,
borderRadius: 30,
},
},
thumb: {
backgroundColor: '#fff',
},
},
}
const ThemedProvider: React.FC = ({ children }) => (
{children}
)
export default ThemedProvider