| import { createTheme, alpha, Theme } from "@mui/material/styles"; |
|
|
| const getDesignTokens = (mode: 'light' | 'dark') => ({ |
| 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.15)" : "rgba(255, 255, 255, 0.18)", |
| 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: 6, |
| }, |
| 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: 6, |
| 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: 6, |
| textTransform: 'none', |
| fontWeight: 600, |
| }, |
| }, |
| }, |
| MuiPaper: { |
| defaultProps: { |
| elevation: 0, |
| }, |
| styleOverrides: { |
| root: { |
| backgroundImage: "none", |
| boxShadow: "none", |
| border: "1px solid", |
| borderColor: |
| mode === "light" |
| ? "rgba(0, 0, 0, 0.15)!important" |
| : "rgba(255, 255, 255, 0.18)!important", |
| }, |
| rounded: { |
| borderRadius: 10, |
| }, |
| }, |
| }, |
|
|
| MuiTableCell: { |
| styleOverrides: { |
| root: { |
| borderColor: (theme: 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: 6, |
| 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: Theme) => |
| `0px 0px 0px 8px ${alpha( |
| theme.palette.primary.main, |
| mode === "light" ? 0.08 : 0.16 |
| )}`, |
| }, |
| "&.Mui-active": { |
| boxShadow: (theme: 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: 6, |
| }, |
| }, |
| }, |
| }, |
| MuiChip: { |
| styleOverrides: { |
| root: { |
| borderRadius: 6, |
| fontWeight: 600, |
| }, |
| 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: 6, |
| padding: "8px", |
| "&.MuiIconButton-sizeSmall": { |
| padding: "4px", |
| borderRadius: 4, |
| }, |
| }, |
| }, |
| }, |
| 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: 6, |
| 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: 'light' | 'dark') => { |
| const tokens = getDesignTokens(mode); |
| return createTheme(tokens); |
| }; |
|
|
| |
| export const theme = getTheme('light'); |
|
|
| |
| export default getTheme; |
|
|