|
import { createTheme, alpha } from "@mui/material/styles"; |
|
|
|
const getDesignTokens = (mode) => ({ |
|
typography: { |
|
fontFamily: [ |
|
"-apple-system", |
|
"BlinkMacSystemFont", |
|
'"Segoe UI"', |
|
"Roboto", |
|
'"Helvetica Neue"', |
|
"Arial", |
|
"sans-serif", |
|
].join(","), |
|
h1: { |
|
fontFamily: '"Source Sans Pro", sans-serif', |
|
}, |
|
h2: { |
|
fontFamily: '"Source Sans Pro", sans-serif', |
|
}, |
|
h3: { |
|
fontFamily: '"Source Sans Pro", sans-serif', |
|
}, |
|
h4: { |
|
fontFamily: '"Source Sans Pro", sans-serif', |
|
}, |
|
h5: { |
|
fontFamily: '"Source Sans Pro", sans-serif', |
|
}, |
|
h6: { |
|
fontFamily: '"Source Sans Pro", sans-serif', |
|
}, |
|
subtitle1: { |
|
fontFamily: '"Source Sans Pro", sans-serif', |
|
}, |
|
subtitle2: { |
|
fontFamily: '"Source Sans Pro", sans-serif', |
|
}, |
|
}, |
|
palette: { |
|
mode, |
|
primary: { |
|
main: "#4F86C6", |
|
light: mode === "light" ? "#7BA7D7" : "#6B97D7", |
|
dark: mode === "light" ? "#2B5C94" : "#3B6CA4", |
|
50: mode === "light" ? alpha("#4F86C6", 0.05) : alpha("#4F86C6", 0.15), |
|
100: mode === "light" ? alpha("#4F86C6", 0.1) : alpha("#4F86C6", 0.2), |
|
200: mode === "light" ? alpha("#4F86C6", 0.2) : alpha("#4F86C6", 0.3), |
|
contrastText: "#fff", |
|
}, |
|
background: { |
|
default: mode === "light" ? "#f8f9fa" : "#0a0a0a", |
|
paper: mode === "light" ? "#fff" : "#1a1a1a", |
|
subtle: mode === "light" ? "grey.100" : "grey.900", |
|
hover: mode === "light" ? "action.hover" : alpha("#fff", 0.08), |
|
tooltip: mode === "light" ? alpha("#212121", 0.9) : alpha("#fff", 0.9), |
|
}, |
|
text: { |
|
primary: mode === "light" ? "rgba(0, 0, 0, 0.87)" : "#fff", |
|
secondary: |
|
mode === "light" ? "rgba(0, 0, 0, 0.6)" : "rgba(255, 255, 255, 0.7)", |
|
disabled: |
|
mode === "light" ? "rgba(0, 0, 0, 0.38)" : "rgba(255, 255, 255, 0.5)", |
|
hint: |
|
mode === "light" ? "rgba(0, 0, 0, 0.38)" : "rgba(255, 255, 255, 0.5)", |
|
}, |
|
divider: |
|
mode === "light" ? "rgba(0, 0, 0, 0.12)" : "rgba(255, 255, 255, 0.12)", |
|
action: { |
|
active: |
|
mode === "light" ? "rgba(0, 0, 0, 0.54)" : "rgba(255, 255, 255, 0.7)", |
|
hover: |
|
mode === "light" ? "rgba(0, 0, 0, 0.04)" : "rgba(255, 255, 255, 0.08)", |
|
selected: |
|
mode === "light" ? "rgba(0, 0, 0, 0.08)" : "rgba(255, 255, 255, 0.16)", |
|
disabled: |
|
mode === "light" ? "rgba(0, 0, 0, 0.26)" : "rgba(255, 255, 255, 0.3)", |
|
disabledBackground: |
|
mode === "light" ? "rgba(0, 0, 0, 0.12)" : "rgba(255, 255, 255, 0.12)", |
|
}, |
|
}, |
|
shape: { |
|
borderRadius: 8, |
|
}, |
|
components: { |
|
MuiCssBaseline: { |
|
styleOverrides: { |
|
"html, body": { |
|
backgroundColor: "background.default", |
|
color: mode === "dark" ? "#fff" : "#000", |
|
}, |
|
body: { |
|
"& *::-webkit-scrollbar": { |
|
width: 8, |
|
height: 8, |
|
backgroundColor: "transparent", |
|
}, |
|
"& *::-webkit-scrollbar-thumb": { |
|
borderRadius: 8, |
|
backgroundColor: |
|
mode === "light" ? alpha("#000", 0.2) : alpha("#fff", 0.1), |
|
"&:hover": { |
|
backgroundColor: |
|
mode === "light" ? alpha("#000", 0.3) : alpha("#fff", 0.15), |
|
}, |
|
}, |
|
}, |
|
}, |
|
}, |
|
MuiButton: { |
|
styleOverrides: { |
|
root: { |
|
borderRadius: 8, |
|
}, |
|
}, |
|
}, |
|
MuiPaper: { |
|
defaultProps: { |
|
elevation: 0, |
|
}, |
|
styleOverrides: { |
|
root: { |
|
backgroundImage: "none", |
|
boxShadow: "none", |
|
border: "1px solid", |
|
borderColor: |
|
mode === "light" |
|
? "rgba(0, 0, 0, 0.12)!important" |
|
: "rgba(255, 255, 255, 0.25)!important", |
|
}, |
|
rounded: { |
|
borderRadius: 12, |
|
}, |
|
}, |
|
}, |
|
|
|
MuiTableCell: { |
|
styleOverrides: { |
|
root: { |
|
borderColor: (theme) => |
|
alpha( |
|
theme.palette.divider, |
|
theme.palette.mode === "dark" ? 0.1 : 0.2 |
|
), |
|
}, |
|
head: { |
|
backgroundColor: mode === "light" ? "grey.50" : "grey.900", |
|
color: "text.primary", |
|
fontWeight: 600, |
|
}, |
|
}, |
|
}, |
|
MuiTableRow: { |
|
styleOverrides: { |
|
root: { |
|
backgroundColor: "transparent", |
|
}, |
|
}, |
|
}, |
|
MuiTableContainer: { |
|
styleOverrides: { |
|
root: { |
|
backgroundColor: "background.paper", |
|
borderRadius: 8, |
|
border: "none", |
|
boxShadow: "none", |
|
}, |
|
}, |
|
}, |
|
MuiSlider: { |
|
styleOverrides: { |
|
root: { |
|
"& .MuiSlider-valueLabel": { |
|
backgroundColor: "background.paper", |
|
color: "text.primary", |
|
border: "1px solid", |
|
borderColor: "divider", |
|
boxShadow: |
|
mode === "light" |
|
? "0px 2px 4px rgba(0, 0, 0, 0.1)" |
|
: "0px 2px 4px rgba(0, 0, 0, 0.3)", |
|
}, |
|
}, |
|
thumb: { |
|
"&:hover": { |
|
boxShadow: (theme) => |
|
`0px 0px 0px 8px ${alpha( |
|
theme.palette.primary.main, |
|
mode === "light" ? 0.08 : 0.16 |
|
)}`, |
|
}, |
|
"&.Mui-active": { |
|
boxShadow: (theme) => |
|
`0px 0px 0px 12px ${alpha( |
|
theme.palette.primary.main, |
|
mode === "light" ? 0.08 : 0.16 |
|
)}`, |
|
}, |
|
}, |
|
track: { |
|
border: "none", |
|
}, |
|
rail: { |
|
opacity: mode === "light" ? 0.38 : 0.3, |
|
}, |
|
mark: { |
|
backgroundColor: mode === "light" ? "grey.400" : "grey.600", |
|
}, |
|
markLabel: { |
|
color: "text.secondary", |
|
}, |
|
}, |
|
}, |
|
MuiTextField: { |
|
styleOverrides: { |
|
root: { |
|
"& .MuiOutlinedInput-root": { |
|
borderRadius: 8, |
|
}, |
|
}, |
|
}, |
|
}, |
|
MuiChip: { |
|
styleOverrides: { |
|
root: { |
|
borderRadius: 8, |
|
}, |
|
outlinedInfo: { |
|
borderWidth: 2, |
|
fontWeight: 600, |
|
bgcolor: "info.100", |
|
borderColor: "info.400", |
|
color: "info.700", |
|
"& .MuiChip-label": { |
|
px: 1.2, |
|
}, |
|
"&:hover": { |
|
bgcolor: "info.200", |
|
}, |
|
}, |
|
outlinedWarning: { |
|
borderWidth: 2, |
|
fontWeight: 600, |
|
bgcolor: "warning.100", |
|
borderColor: "warning.400", |
|
color: "warning.700", |
|
"& .MuiChip-label": { |
|
px: 1.2, |
|
}, |
|
"&:hover": { |
|
bgcolor: "warning.200", |
|
}, |
|
}, |
|
outlinedSuccess: { |
|
borderWidth: 2, |
|
fontWeight: 600, |
|
bgcolor: "success.100", |
|
borderColor: "success.400", |
|
color: "success.700", |
|
"& .MuiChip-label": { |
|
px: 1.2, |
|
}, |
|
"&:hover": { |
|
bgcolor: "success.200", |
|
}, |
|
}, |
|
outlinedError: { |
|
borderWidth: 2, |
|
fontWeight: 600, |
|
bgcolor: "error.100", |
|
borderColor: "error.400", |
|
color: "error.700", |
|
"& .MuiChip-label": { |
|
px: 1.2, |
|
}, |
|
"&:hover": { |
|
bgcolor: "error.200", |
|
}, |
|
}, |
|
outlinedPrimary: { |
|
borderWidth: 2, |
|
fontWeight: 600, |
|
bgcolor: "primary.100", |
|
borderColor: "primary.400", |
|
color: "primary.700", |
|
"& .MuiChip-label": { |
|
px: 1.2, |
|
}, |
|
"&:hover": { |
|
bgcolor: "primary.200", |
|
}, |
|
}, |
|
outlinedSecondary: { |
|
borderWidth: 2, |
|
fontWeight: 600, |
|
bgcolor: "secondary.100", |
|
borderColor: "secondary.400", |
|
color: "secondary.700", |
|
"& .MuiChip-label": { |
|
px: 1.2, |
|
}, |
|
"&:hover": { |
|
bgcolor: "secondary.200", |
|
}, |
|
}, |
|
}, |
|
}, |
|
MuiIconButton: { |
|
styleOverrides: { |
|
root: { |
|
borderRadius: 8, |
|
padding: "8px", |
|
"&.MuiIconButton-sizeSmall": { |
|
padding: "4px", |
|
borderRadius: 6, |
|
}, |
|
}, |
|
}, |
|
}, |
|
MuiTooltip: { |
|
styleOverrides: { |
|
tooltip: { |
|
backgroundColor: |
|
mode === "light" ? alpha("#212121", 0.9) : alpha("#424242", 0.9), |
|
color: "#fff", |
|
fontSize: "0.875rem", |
|
padding: "8px 12px", |
|
maxWidth: 400, |
|
borderRadius: 8, |
|
lineHeight: 1.4, |
|
border: "1px solid", |
|
borderColor: |
|
mode === "light" ? alpha("#fff", 0.1) : alpha("#fff", 0.05), |
|
boxShadow: |
|
mode === "light" |
|
? "0 2px 8px rgba(0, 0, 0, 0.15)" |
|
: "0 2px 8px rgba(0, 0, 0, 0.5)", |
|
"& b": { |
|
fontWeight: 600, |
|
color: "inherit", |
|
}, |
|
"& a": { |
|
color: mode === "light" ? "#90caf9" : "#64b5f6", |
|
textDecoration: "none", |
|
"&:hover": { |
|
textDecoration: "underline", |
|
}, |
|
}, |
|
}, |
|
arrow: { |
|
color: |
|
mode === "light" ? alpha("#212121", 0.9) : alpha("#424242", 0.9), |
|
"&:before": { |
|
border: "1px solid", |
|
borderColor: |
|
mode === "light" ? alpha("#fff", 0.1) : alpha("#fff", 0.05), |
|
}, |
|
}, |
|
}, |
|
defaultProps: { |
|
arrow: true, |
|
enterDelay: 400, |
|
leaveDelay: 200, |
|
}, |
|
}, |
|
MuiAppBar: { |
|
styleOverrides: { |
|
root: { |
|
border: "none", |
|
borderBottom: "none", |
|
}, |
|
}, |
|
}, |
|
}, |
|
breakpoints: { |
|
values: { |
|
xs: 0, |
|
sm: 600, |
|
md: 900, |
|
lg: 1240, |
|
xl: 1536, |
|
}, |
|
}, |
|
}); |
|
|
|
const getTheme = (mode) => { |
|
const tokens = getDesignTokens(mode); |
|
return createTheme(tokens); |
|
}; |
|
|
|
export default getTheme; |
|
|