import React from 'react'; import { PaletteMode } from '@mui/material'; import { alpha, createTheme, Shadows, Theme, Components, } from '@mui/material/styles'; import { outlinedInputClasses } from '@mui/material/OutlinedInput'; import CheckBoxOutlineBlankRoundedIcon from '@mui/icons-material/CheckBoxOutlineBlankRounded'; import CheckRoundedIcon from '@mui/icons-material/CheckRounded'; import RemoveRoundedIcon from '@mui/icons-material/RemoveRounded'; declare module '@mui/material/Paper' { interface PaperPropsVariantOverrides { highlighted: true; } } declare module '@mui/material/styles/createPalette' { interface ColorRange { 50: string; 100: string; 200: string; 300: string; 400: string; 500: string; 600: string; 700: string; 800: string; 900: string; } interface PaletteColor extends ColorRange {} } const defaultTheme = createTheme(); const customShadows: Shadows = [...defaultTheme.shadows]; export const brand = { 50: 'hsl(210, 100%, 95%)', 100: 'hsl(210, 100%, 92%)', 200: 'hsl(210, 100%, 80%)', 300: 'hsl(210, 100%, 65%)', 400: 'hsl(210, 98%, 48%)', 500: 'hsl(210, 98%, 42%)', 600: 'hsl(210, 98%, 55%)', 700: 'hsl(210, 100%, 35%)', 800: 'hsl(210, 100%, 16%)', 900: 'hsl(210, 100%, 21%)', }; export const gray = { 50: 'hsl(220, 35%, 97%)', 100: 'hsl(220, 30%, 94%)', 200: 'hsl(220, 20%, 88%)', 300: 'hsl(220, 20%, 80%)', 400: 'hsl(220, 20%, 65%)', 500: 'hsl(220, 20%, 42%)', 600: 'hsl(220, 20%, 35%)', 700: 'hsl(220, 20%, 25%)', 800: 'hsl(220, 30%, 6%)', 900: 'hsl(220, 35%, 3%)', }; export const green = { 50: 'hsl(120, 80%, 98%)', 100: 'hsl(120, 75%, 94%)', 200: 'hsl(120, 75%, 87%)', 300: 'hsl(120, 61%, 77%)', 400: 'hsl(120, 44%, 53%)', 500: 'hsl(120, 59%, 30%)', 600: 'hsl(120, 70%, 25%)', 700: 'hsl(120, 75%, 16%)', 800: 'hsl(120, 84%, 10%)', 900: 'hsl(120, 87%, 6%)', }; export const orange = { 50: 'hsl(45, 100%, 97%)', 100: 'hsl(45, 92%, 90%)', 200: 'hsl(45, 94%, 80%)', 300: 'hsl(45, 90%, 65%)', 400: 'hsl(45, 90%, 40%)', 500: 'hsl(45, 90%, 35%)', 600: 'hsl(45, 91%, 25%)', 700: 'hsl(45, 94%, 20%)', 800: 'hsl(45, 95%, 16%)', 900: 'hsl(45, 93%, 12%)', }; export const red = { 50: 'hsl(0, 100%, 97%)', 100: 'hsl(0, 92%, 90%)', 200: 'hsl(0, 94%, 80%)', 300: 'hsl(0, 90%, 65%)', 400: 'hsl(0, 90%, 40%)', 500: 'hsl(0, 90%, 30%)', 600: 'hsl(0, 91%, 25%)', 700: 'hsl(0, 94%, 18%)', 800: 'hsl(0, 95%, 12%)', 900: 'hsl(0, 93%, 6%)', }; export const getDesignTokens = (mode: PaletteMode) => { customShadows[1] = mode === 'dark' ? 'hsla(220, 30%, 5%, 0.7) 0px 4px 16px 0px, hsla(220, 25%, 10%, 0.8) 0px 8px 16px -5px' : 'hsla(220, 30%, 5%, 0.07) 0px 4px 16px 0px, hsla(220, 25%, 10%, 0.07) 0px 8px 16px -5px'; customShadows[4] = '0px 5px 15px rgba(9, 11, 17, 0.05), 0px 15px 35px -5px rgba(19, 23, 32, 0.05)'; return { palette: { mode, primary: { light: brand[200], main: brand[400], dark: brand[700], contrastText: brand[50], ...(mode === 'dark' && { contrastText: brand[50], light: brand[300], main: brand[400], dark: brand[700], }), }, info: { light: brand[100], main: brand[300], dark: brand[600], contrastText: gray[50], ...(mode === 'dark' && { contrastText: brand[300], light: brand[500], main: brand[700], dark: brand[900], }), }, warning: { light: orange[300], main: orange[400], dark: orange[800], ...(mode === 'dark' && { light: orange[400], main: orange[500], dark: orange[700], }), }, error: { light: red[300], main: red[400], dark: red[800], ...(mode === 'dark' && { light: red[400], main: red[500], dark: red[700], }), }, success: { light: green[300], main: green[400], dark: green[800], ...(mode === 'dark' && { light: green[400], main: green[500], dark: green[700], }), }, grey: { ...gray, }, divider: mode === 'dark' ? alpha(gray[700], 0.6) : alpha(gray[300], 0.4), background: { default: 'hsl(0, 0%, 99%)', paper: 'hsl(220, 35%, 97%)', ...(mode === 'dark' && { default: gray[900], paper: 'hsl(220, 30%, 7%)', }), }, text: { primary: gray[800], secondary: gray[600], warning: orange[400], ...(mode === 'dark' && { primary: 'hsl(0, 0%, 100%)', secondary: gray[400], }), }, action: { hover: alpha(gray[200], 0.2), selected: `${alpha(gray[200], 0.3)}`, ...(mode === 'dark' && { hover: alpha(gray[600], 0.2), selected: alpha(gray[600], 0.3), }), }, }, typography: { h1: { fontSize: defaultTheme.typography.pxToRem(48), fontWeight: 600, lineHeight: 1.2, letterSpacing: -0.5, }, h2: { fontSize: defaultTheme.typography.pxToRem(36), fontWeight: 600, lineHeight: 1.2, }, h3: { fontSize: defaultTheme.typography.pxToRem(30), lineHeight: 1.2, }, h4: { fontSize: defaultTheme.typography.pxToRem(24), fontWeight: 600, lineHeight: 1.5, }, h5: { fontSize: defaultTheme.typography.pxToRem(20), fontWeight: 600, }, h6: { fontSize: defaultTheme.typography.pxToRem(18), fontWeight: 600, }, subtitle1: { fontSize: defaultTheme.typography.pxToRem(18), }, subtitle2: { fontSize: defaultTheme.typography.pxToRem(14), fontWeight: 500, }, body1: { fontSize: defaultTheme.typography.pxToRem(14), }, body2: { fontSize: defaultTheme.typography.pxToRem(14), fontWeight: 400, }, caption: { fontSize: defaultTheme.typography.pxToRem(12), fontWeight: 400, }, }, shape: { borderRadius: 8, }, shadows: customShadows, }; }; export const inputsCustomizations: Components = { MuiButtonBase: { defaultProps: { disableTouchRipple: true, disableRipple: true, }, styleOverrides: { root: ({ theme }) => ({ boxSizing: 'border-box', transition: 'all 100ms ease-in', '&:focus-visible': { outline: `2px solid ${alpha(theme.palette.primary.main, 0.5)}`, outlineOffset: '2px', }, }), }, }, MuiButton: { styleOverrides: { root: ({ theme }) => ({ boxShadow: 'none', borderRadius: theme.shape.borderRadius, textTransform: 'none', variants: [ { props: { size: 'small', }, style: { height: '2.25rem', padding: '8px 12px', }, }, { props: { size: 'medium', }, style: { height: '2.5rem', // 40px }, }, { props: { color: 'primary', variant: 'contained', }, style: { color: 'white', backgroundColor: gray[900], backgroundImage: `linear-gradient(to bottom, ${gray[700]}, ${gray[800]})`, boxShadow: `inset 0 1px 0 ${gray[600]}, inset 0 -1px 0 1px hsl(220, 0%, 0%)`, border: `1px solid ${gray[700]}`, '&:hover': { backgroundImage: 'none', backgroundColor: gray[700], boxShadow: 'none', }, '&:active': { backgroundColor: gray[800], }, ...theme.applyStyles('dark', { color: 'black', backgroundColor: gray[50], backgroundImage: `linear-gradient(to bottom, ${gray[100]}, ${gray[50]})`, boxShadow: 'inset 0 -1px 0 hsl(220, 30%, 80%)', border: `1px solid ${gray[50]}`, '&:hover': { backgroundImage: 'none', backgroundColor: gray[300], boxShadow: 'none', }, '&:active': { backgroundColor: gray[400], }, }), }, }, { props: { color: 'secondary', variant: 'contained', }, style: { color: 'white', backgroundColor: brand[300], backgroundImage: `linear-gradient(to bottom, ${alpha(brand[400], 0.8)}, ${brand[500]})`, boxShadow: `inset 0 2px 0 ${alpha(brand[200], 0.2)}, inset 0 -2px 0 ${alpha(brand[700], 0.4)}`, border: `1px solid ${brand[500]}`, '&:hover': { backgroundColor: brand[700], boxShadow: 'none', }, '&:active': { backgroundColor: brand[700], backgroundImage: 'none', }, }, }, { props: { variant: 'outlined', }, style: { color: theme.palette.text.primary, border: '1px solid', borderColor: gray[200], backgroundColor: alpha(gray[50], 0.3), '&:hover': { backgroundColor: gray[100], borderColor: gray[300], }, '&:active': { backgroundColor: gray[200], }, ...theme.applyStyles('dark', { backgroundColor: gray[800], borderColor: gray[700], '&:hover': { backgroundColor: gray[900], borderColor: gray[600], }, '&:active': { backgroundColor: gray[900], }, }), }, }, { props: { color: 'secondary', variant: 'outlined', }, style: { color: brand[700], border: '1px solid', borderColor: brand[200], backgroundColor: brand[50], '&:hover': { backgroundColor: brand[100], borderColor: brand[400], }, '&:active': { backgroundColor: alpha(brand[200], 0.7), }, ...theme.applyStyles('dark', { color: brand[50], border: '1px solid', borderColor: brand[900], backgroundColor: alpha(brand[900], 0.3), '&:hover': { borderColor: brand[700], backgroundColor: alpha(brand[900], 0.6), }, '&:active': { backgroundColor: alpha(brand[900], 0.5), }, }), }, }, { props: { variant: 'text', }, style: { color: gray[600], '&:hover': { backgroundColor: gray[100], }, '&:active': { backgroundColor: gray[200], }, ...theme.applyStyles('dark', { color: gray[50], '&:hover': { backgroundColor: gray[700], }, '&:active': { backgroundColor: alpha(gray[700], 0.7), }, }), }, }, { props: { color: 'secondary', variant: 'text', }, style: { color: brand[700], '&:hover': { backgroundColor: alpha(brand[100], 0.5), }, '&:active': { backgroundColor: alpha(brand[200], 0.7), }, ...theme.applyStyles('dark', { color: brand[100], '&:hover': { backgroundColor: alpha(brand[900], 0.5), }, '&:active': { backgroundColor: alpha(brand[900], 0.3), }, }), }, }, ], '& .MuiButton-loadingIndicator': { color: gray[400], ...theme.applyStyles('dark', { color: gray[600], }), }, }), }, }, MuiCheckbox: { defaultProps: { disableRipple: true, icon: ( ), checkedIcon: , indeterminateIcon: , }, styleOverrides: { root: ({ theme }) => ({ margin: 10, height: 16, width: 16, borderRadius: 5, border: '1px solid ', borderColor: alpha(gray[300], 0.8), boxShadow: '0 0 0 1.5px hsla(210, 0%, 0%, 0.04) inset', backgroundColor: alpha(gray[100], 0.4), transition: 'border-color, background-color, 120ms ease-in', '&:hover': { borderColor: brand[300], }, '&.Mui-focusVisible': { outline: `3px solid ${alpha(brand[500], 0.5)}`, outlineOffset: '2px', borderColor: brand[400], }, '&.Mui-checked': { color: 'white', backgroundColor: brand[500], borderColor: brand[500], boxShadow: `none`, '&:hover': { backgroundColor: brand[600], }, }, ...theme.applyStyles('dark', { borderColor: alpha(gray[700], 0.8), boxShadow: '0 0 0 1.5px hsl(210, 0%, 0%) inset', backgroundColor: alpha(gray[900], 0.8), '&:hover': { borderColor: brand[300], }, '&.Mui-focusVisible': { borderColor: brand[400], outline: `3px solid ${alpha(brand[500], 0.5)}`, outlineOffset: '2px', }, }), }), }, }, MuiInputLabel: { styleOverrides: { root: { transform: 'translate(4px, -16px) scale(0.75)', [`&.${outlinedInputClasses.focused}`]: { transform: 'translate(4px, -17px) scale(0.75)', }, }, }, }, MuiOutlinedInput: { styleOverrides: { input: { padding: 0, }, root: ({ theme }) => ({ padding: '8px 12px', color: theme.palette.text.primary, borderRadius: theme.shape.borderRadius, border: `1px solid ${theme.palette.divider}`, backgroundColor: theme.palette.background.default, transition: 'border 120ms ease-in', '&:hover': { borderColor: gray[400], }, [`&.${outlinedInputClasses.focused}`]: { outline: `3px solid ${alpha(brand[500], 0.5)}`, borderColor: brand[400], }, ...theme.applyStyles('dark', { '&:hover': { borderColor: gray[500], }, }), variants: [ { props: { size: 'small', }, style: { height: '2.25rem', }, }, { props: { size: 'medium', }, style: { height: '2.5rem', }, }, ], }), notchedOutline: { border: 'none', }, }, }, };