You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

192 lines
5.7 KiB

"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.ButtonCSS = void 0;
const styled_system_1 = require("styled-system");
const styled_components_1 = require("styled-components");
const utils_1 = require("../../utils");
const variantShared = {
color: 'white',
'border-color': 'transparent',
[`& .${utils_1.cssClass('Icon')} svg`]: {
fill: 'white',
},
'&:disabled': {
bg: 'grey40',
},
};
const buttonVariants = styled_system_1.variant({
variants: {
primary: Object.assign({ bg: 'primary100', '&:hover': {
bg: 'hoverBg',
}, className: utils_1.cssClass(['Button', 'Button_Primary']) }, variantShared),
danger: Object.assign({ bg: 'error', '&:hover': {
bg: 'errorDark',
borderColor: 'transparent',
}, className: utils_1.cssClass(['Button', 'Button_Danger']) }, variantShared),
success: Object.assign({ bg: 'success', '&:hover': {
bg: 'successDark',
borderColor: 'transparent',
}, className: utils_1.cssClass(['Button', 'Button_Success']) }, variantShared),
info: Object.assign({ bg: 'info', '&:hover': {
bg: 'infoDark',
borderColor: 'transparent',
}, className: utils_1.cssClass(['Button', 'Button_Info']) }, variantShared),
secondary: Object.assign({ bg: 'accent', className: utils_1.cssClass(['Button', 'Button_Secondary']) }, variantShared),
light: {
bg: 'white',
className: utils_1.cssClass(['Button', 'Button_Grey']),
color: 'grey80',
borderColor: 'grey40',
[`& .${utils_1.cssClass('Icon')} svg`]: {
fill: 'grey80',
},
'&:hover': {
borderColor: 'grey60',
bg: 'grey60',
},
},
text: {
bg: 'transparent',
borderColor: 'transparent',
'&:disabled': {
'border-color': 'transparent',
},
'&:hover': {
background: 'transparent',
color: 'hoverBg',
borderColor: 'transparent',
textDecoration: 'underline',
},
'&:focus': {
background: 'transparent',
borderColor: 'transparent',
},
'& svg': {
fill: 'primary100',
},
[`&:hover .${utils_1.cssClass('Icon')} svg`]: {
fill: 'hoverBg',
},
className: utils_1.cssClass(['Button', 'Button_Text']),
},
},
});
const sizeVariants = styled_system_1.variant({
prop: 'size',
variants: {
sm: {
fontSize: 'sm',
py: 'xs',
lineHeight: 'default',
px: 'lg',
[`& .${utils_1.cssClass('Icon')}`]: {
marginTop: '-1px',
marginBottom: '-1px',
},
},
// md alias default
md: {},
default: {},
lg: {
py: 'default',
px: 'x3',
lineHeight: 'lg',
},
icon: {
py: 'default',
px: 'default',
lineHeight: 'sm',
minWidth: '34px',
height: '34px',
[`& .${utils_1.cssClass('Icon')} svg`]: {
padding: 0,
margin: 0,
},
},
},
});
const setPointer = (props) => {
if (props.href || props.onClick) {
return 'cursor: pointer';
}
if (props.as === 'a' && !props.href && !props.onClick) {
return 'cursor: auto';
}
return '';
};
/**
* Button CSS Styles which can be reused in another button-like component with styled-components
*
* Usage:
* ```
* import { ButtonCSS } from '@adminjs/design-system'
* import { Link } from 'react-router-dom'
*
* const MyStyledLink = styled(Link)`
* ${ButtonCSS}
* `
* ```
* @memberof Button
* @alias ButtonCSS
*/
exports.ButtonCSS = styled_components_1.css `
-webkit-appearance: none;
-moz-appearance: none;
outline: 0;
display: inline-block;
font-family: ${({ theme }) => theme.font};
line-height: ${utils_1.themeGet('lineHeights', 'lg')};
vertical-align: middle;
border: 1px solid ${utils_1.themeGet('colors', 'primary100')};
color: ${utils_1.themeGet('colors', 'primary100')};
${(props) => setPointer(props)};
text-decoration: none;
padding: ${utils_1.themeGet('space', 'sm')} ${utils_1.themeGet('space', 'xxl')};
box-sizing: border-box;
& > .${utils_1.cssClass('Icon')} {
vertical-align: middle;
}
& > .${utils_1.cssClass('Icon')} svg {
margin: 0 ${utils_1.themeGet('space', 'md')} 0 0;
}
& .${utils_1.cssClass('Icon')} svg {
fill: ${utils_1.themeGet('colors', 'primary100')};
}
&:hover {
color: ${utils_1.themeGet('colors', 'white')};
background: ${utils_1.themeGet('colors', 'hoverBg')};
border-color: ${utils_1.themeGet('colors', 'hoverBg')};
& .${utils_1.cssClass('Icon')} svg {
fill: ${utils_1.themeGet('colors', 'white')};
}
}
&:focus {
border-color: ${utils_1.themeGet('colors', 'accent')};
${({ theme }) => `box-shadow: ${utils_1.focusShadowStyle(theme)}`};
}
&:disabled {
color: ${utils_1.themeGet('colors', 'grey60')};
border-color: ${utils_1.themeGet('colors', 'grey80')};
background: ${utils_1.themeGet('colors', 'white')};
cursor: default;
& .${utils_1.cssClass('Icon')} svg {
fill: ${utils_1.themeGet('colors', 'grey60')};
}
}
${({ rounded }) => (rounded ? 'border-radius: 9999px' : '')};
${styled_system_1.color};
${styled_system_1.space};
${styled_system_1.typography};
${buttonVariants};
${sizeVariants};
`;
exports.default = exports.ButtonCSS;