Files
nebula.js/packages/ui/theme/create.js
Tobias Åström 0d19f698ad feat: give charts access to the nebula instance through useEmbed (#650)
* feat: experimental expose embed

* feat: expose embed for legacy supernovas

* feat: expose registered types
2021-08-24 08:54:47 +02:00

125 lines
2.9 KiB
JavaScript

import { createTheme } from '@material-ui/core/styles';
import base from './definitions/base';
import light from './definitions/light';
import dark from './definitions/dark';
const cache = {};
const overrides = (theme) => ({
MuiTypography: {
root: {
color: theme.palette.text.primary,
},
},
MuiIconButton: {
root: {
padding: 7,
borderRadius: 2,
border: '1px solid transparent',
// should ideally use $focusVisible, but that messes up focus in all other places where Iconbutton is used (Checkbox, Switch etc)
'&:focus': {
borderColor: theme.palette.custom.focusBorder,
boxShadow: `0 0 0 2px ${theme.palette.custom.focusOutline}`,
},
},
},
MuiOutlinedInput: {
root: {
backgroundColor: theme.palette.custom.inputBackground,
'&:hover $notchedOutline': {
borderColor: theme.palette.btn.border,
},
'&$focused $notchedOutline': {
borderColor: theme.palette.custom.focusBorder,
borderWidth: 2,
},
},
},
MuiButton: {
outlined: {
padding: '3px 11px',
'&$focusVisible': {
borderColor: theme.palette.custom.focusBorder,
boxShadow: `0 0 0 2px ${theme.palette.custom.focusOutline}`,
},
},
contained: {
color: theme.palette.text.primary,
padding: '3px 11px',
border: `1px solid ${theme.palette.btn.border}`,
backgroundColor: theme.palette.btn.normal,
boxShadow: 'none',
'&$focusVisible': {
borderColor: theme.palette.custom.focusBorder,
boxShadow: `0 0 0 2px ${theme.palette.custom.focusOutline}`,
},
'&:hover': {
backgroundColor: theme.palette.btn.hover,
borderColor: theme.palette.btn.borderHover,
boxShadow: 'none',
'&$disabled': {
backgroundColor: theme.palette.btn.disabled,
},
},
'&:active': {
boxShadow: 'none',
backgroundColor: theme.palette.btn.active,
},
'&$disabled': {
backgroundColor: theme.palette.btn.disabled,
},
},
},
MuiExpansionPanelSummary: {
content: {
margin: '8px 0',
},
},
});
export default function create(definition) {
let def = light;
let name = '';
if (typeof definition === 'string') {
name = definition;
if (definition !== 'light' && definition !== 'dark') {
console.warn(`Invalid theme: '${definition}'`);
} else if (definition === 'dark') {
def = dark;
}
}
const key = JSON.stringify(def);
if (cache[key]) {
return cache[key];
}
const withDefaults = {
palette: {
type: def.type,
...base.palette,
...def.palette,
},
typography: {
...base.typography,
},
shadows: base.shadows,
props: {
...base.props,
},
shape: {
...base.shape,
},
};
cache[key] = createTheme({
...withDefaults,
overrides: overrides(withDefaults),
});
cache[key].name = name;
return cache[key];
}