277 lines
7.5 KiB
JavaScript
277 lines
7.5 KiB
JavaScript
/* eslint-disable prefer-destructuring */
|
|
/**
|
|
=========================================================
|
|
* Material Dashboard 2 PRO React - v2.0.0
|
|
=========================================================
|
|
|
|
* Product Page: https://www.creative-tim.com/product/material-dashboard-pro-react
|
|
* Copyright 2021 Creative Tim (https://www.creative-tim.com)
|
|
|
|
Coded by www.creative-tim.com
|
|
|
|
=========================================================
|
|
|
|
* The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
|
|
*/
|
|
|
|
// @mui material components
|
|
import Button from '@mui/material/Button';
|
|
import { styled } from '@mui/material/styles';
|
|
|
|
export default styled(Button)(({ theme, ownerState }) => {
|
|
const { palette, functions, borders, boxShadows } = theme;
|
|
const { color, variant, size, circular, iconOnly, darkMode } = ownerState;
|
|
|
|
const { white, text, transparent, gradients, grey } = palette;
|
|
const { boxShadow, linearGradient, pxToRem, rgba } = functions;
|
|
const { borderRadius } = borders;
|
|
const { colored } = boxShadows;
|
|
|
|
// styles for the button with variant="contained"
|
|
const containedStyles = () => {
|
|
// background color value
|
|
const backgroundValue = palette[color] ? palette[color].main : white.main;
|
|
|
|
// backgroundColor value when button is focused
|
|
const focusedBackgroundValue = palette[color] ? palette[color].focus : white.focus;
|
|
|
|
// boxShadow value
|
|
const boxShadowValue = colored[color]
|
|
? `${boxShadow([0, 3], [3, 0], palette[color].main, 0.15)}, ${boxShadow(
|
|
[0, 3],
|
|
[1, -2],
|
|
palette[color].main,
|
|
0.2
|
|
)}, ${boxShadow([0, 1], [5, 0], palette[color].main, 0.15)}`
|
|
: 'none';
|
|
|
|
// boxShadow value when button is hovered
|
|
const hoveredBoxShadowValue = colored[color]
|
|
? `${boxShadow([0, 14], [26, -12], palette[color].main, 0.4)}, ${boxShadow(
|
|
[0, 4],
|
|
[23, 0],
|
|
palette[color].main,
|
|
0.15
|
|
)}, ${boxShadow([0, 8], [10, -5], palette[color].main, 0.2)}`
|
|
: 'none';
|
|
|
|
// color value
|
|
let colorValue = white.main;
|
|
|
|
if (!darkMode && (color === 'white' || color === 'light' || !palette[color])) {
|
|
colorValue = text.main;
|
|
} else if (darkMode && (color === 'white' || color === 'light' || !palette[color])) {
|
|
colorValue = grey[600];
|
|
}
|
|
|
|
// color value when button is focused
|
|
let focusedColorValue = white.main;
|
|
|
|
if (color === 'white') {
|
|
focusedColorValue = text.main;
|
|
} else if (color === 'primary' || color === 'error' || color === 'dark') {
|
|
focusedColorValue = white.main;
|
|
}
|
|
|
|
return {
|
|
background: backgroundValue,
|
|
color: colorValue,
|
|
boxShadow: boxShadowValue,
|
|
|
|
'&:hover': {
|
|
backgroundColor: backgroundValue,
|
|
boxShadow: hoveredBoxShadowValue
|
|
},
|
|
|
|
'&:focus:not(:hover)': {
|
|
backgroundColor: focusedBackgroundValue,
|
|
boxShadow: palette[color]
|
|
? boxShadow([0, 0], [0, 3.2], palette[color].main, 0.5)
|
|
: boxShadow([0, 0], [0, 3.2], white.main, 0.5)
|
|
},
|
|
|
|
'&:disabled': {
|
|
backgroundColor: backgroundValue,
|
|
color: focusedColorValue
|
|
}
|
|
};
|
|
};
|
|
|
|
// styles for the button with variant="outlined"
|
|
const outliedStyles = () => {
|
|
// background color value
|
|
const backgroundValue = color === 'white' ? rgba(white.main, 0.1) : transparent.main;
|
|
|
|
// color value
|
|
const colorValue = palette[color] ? palette[color].main : white.main;
|
|
|
|
// boxShadow value
|
|
const boxShadowValue = palette[color]
|
|
? boxShadow([0, 0], [0, 3.2], palette[color].main, 0.5)
|
|
: boxShadow([0, 0], [0, 3.2], white.main, 0.5);
|
|
|
|
// border color value
|
|
let borderColorValue = palette[color] ? palette[color].main : rgba(white.main, 0.75);
|
|
|
|
if (color === 'white') {
|
|
borderColorValue = rgba(white.main, 0.75);
|
|
}
|
|
|
|
return {
|
|
background: backgroundValue,
|
|
color: colorValue,
|
|
borderColor: borderColorValue,
|
|
|
|
'&:hover': {
|
|
background: transparent.main,
|
|
borderColor: colorValue
|
|
},
|
|
|
|
'&:focus:not(:hover)': {
|
|
background: transparent.main,
|
|
boxShadow: boxShadowValue
|
|
},
|
|
|
|
'&:active:not(:hover)': {
|
|
backgroundColor: colorValue,
|
|
color: white.main,
|
|
opacity: 0.85
|
|
},
|
|
|
|
'&:disabled': {
|
|
color: colorValue,
|
|
borderColor: colorValue
|
|
}
|
|
};
|
|
};
|
|
|
|
// styles for the button with variant="gradient"
|
|
const gradientStyles = () => {
|
|
// background value
|
|
const backgroundValue =
|
|
color === 'white' || !gradients[color]
|
|
? white.main
|
|
: linearGradient(gradients[color].main, gradients[color].state);
|
|
|
|
// boxShadow value
|
|
const boxShadowValue = colored[color]
|
|
? `${boxShadow([0, 3], [3, 0], palette[color].main, 0.15)}, ${boxShadow(
|
|
[0, 3],
|
|
[1, -2],
|
|
palette[color].main,
|
|
0.2
|
|
)}, ${boxShadow([0, 1], [5, 0], palette[color].main, 0.15)}`
|
|
: 'none';
|
|
|
|
// boxShadow value when button is hovered
|
|
const hoveredBoxShadowValue = colored[color]
|
|
? `${boxShadow([0, 14], [26, -12], palette[color].main, 0.4)}, ${boxShadow(
|
|
[0, 4],
|
|
[23, 0],
|
|
palette[color].main,
|
|
0.15
|
|
)}, ${boxShadow([0, 8], [10, -5], palette[color].main, 0.2)}`
|
|
: 'none';
|
|
|
|
// color value
|
|
let colorValue = white.main;
|
|
|
|
if (color === 'white') {
|
|
colorValue = text.main;
|
|
} else if (color === 'light') {
|
|
colorValue = gradients.dark.state;
|
|
}
|
|
|
|
return {
|
|
background: backgroundValue,
|
|
color: colorValue,
|
|
boxShadow: boxShadowValue,
|
|
|
|
'&:hover': {
|
|
boxShadow: hoveredBoxShadowValue
|
|
},
|
|
|
|
'&:focus:not(:hover)': {
|
|
boxShadow: boxShadowValue
|
|
},
|
|
|
|
'&:disabled': {
|
|
background: backgroundValue,
|
|
color: colorValue
|
|
}
|
|
};
|
|
};
|
|
|
|
// styles for the button with variant="text"
|
|
const textStyles = () => {
|
|
// color value
|
|
const colorValue = palette[color] ? palette[color].main : white.main;
|
|
|
|
// color value when button is focused
|
|
const focusedColorValue = palette[color] ? palette[color].focus : white.focus;
|
|
|
|
return {
|
|
color: colorValue,
|
|
|
|
'&:hover': {
|
|
color: focusedColorValue
|
|
},
|
|
|
|
'&:focus:not(:hover)': {
|
|
color: focusedColorValue
|
|
}
|
|
};
|
|
};
|
|
|
|
// styles for the button with circular={true}
|
|
const circularStyles = () => ({
|
|
borderRadius: borderRadius.section
|
|
});
|
|
|
|
// styles for the button with iconOnly={true}
|
|
const iconOnlyStyles = () => {
|
|
// width, height, minWidth and minHeight values
|
|
let sizeValue = pxToRem(38);
|
|
|
|
if (size === 'small') {
|
|
sizeValue = pxToRem(25.4);
|
|
} else if (size === 'large') {
|
|
sizeValue = pxToRem(52);
|
|
}
|
|
|
|
// padding value
|
|
let paddingValue = `${pxToRem(11)} ${pxToRem(11)} ${pxToRem(10)}`;
|
|
|
|
if (size === 'small') {
|
|
paddingValue = pxToRem(4.5);
|
|
} else if (size === 'large') {
|
|
paddingValue = pxToRem(16);
|
|
}
|
|
|
|
return {
|
|
width: sizeValue,
|
|
minWidth: sizeValue,
|
|
height: sizeValue,
|
|
minHeight: sizeValue,
|
|
padding: paddingValue,
|
|
|
|
'& .material-icons': {
|
|
marginTop: 0
|
|
},
|
|
|
|
'&:hover, &:focus, &:active': {
|
|
transform: 'none'
|
|
}
|
|
};
|
|
};
|
|
|
|
return {
|
|
...(variant === 'contained' && containedStyles()),
|
|
...(variant === 'outlined' && outliedStyles()),
|
|
...(variant === 'gradient' && gradientStyles()),
|
|
...(variant === 'text' && textStyles()),
|
|
...(circular && circularStyles()),
|
|
...(iconOnly && iconOnlyStyles())
|
|
};
|
|
});
|