// @ts-nocheck
// Legacy Button should not be use anymore
import { lighten } from 'polished';
import styled, { css } from 'styled-components';
import { spacing } from '../../spacing';
import { fontSize, fontWeight, white } from '../../style/theme';
import { Size } from '../constants';
import { Loader } from '../loader/Loader.component';
type Props = {
text?: string;
size?: Size;
/* We need to make sure the variant exist in the color-palette
Otherwise we will encounter the error: Passed an incorrect argument to a color function, please pass a string representation of a color. */
variant?:
| 'buttonPrimary'
| 'buttonSecondary'
| 'buttonDelete'
| 'backgroundLevel1';
// this variant is for the button in navbar and sidebar
outlined?: boolean;
inverted?: boolean;
disabled?: boolean;
icon?: JSX.Element;
href?: string;
title?: string;
type?: string;
isLoading?: boolean;
onClick?: (arg0: any) => void;
};
export const ButtonStyled = styled.button`
-webkit-appearance: none;
-moz-appearance: none;
position: relative;
display: inline-flex;
user-select: none;
vertical-align: middle;
align-items: center;
justify-content: center;
box-sizing: border-box;
text-decoration: none;
border: none;
text-decoration: none;
font-weight: ${fontWeight.base};
&:hover,
&:focus,
&:active {
outline: none;
cursor: pointer;
}
${(props) => {
switch (props.size) {
case 'smaller':
return css`
padding: 7px 14px;
font-size: ${fontSize.smaller};
border-radius: 4px;
height: 27px;
`;
case 'small':
return css`
padding: 8px 16px;
font-size: ${fontSize.small};
border-radius: 5px;
height: 30px;
`;
case 'large':
return css`
padding: 10px 20px;
font-size: ${fontSize.large};
border-radius: 7px;
height: 40px;
`;
case 'larger':
return css`
padding: 11px 22px;
font-size: ${fontSize.larger};
border-radius: 8px;
height: 48px;
`;
case 'base':
default:
return css`
padding: 12px 16px;
font-size: ${fontSize.base};
border-radius: 6px;
height: 32px;
`;
}
}}
${(props) => {
if (props.isLoading) {
return css`
> span {
display: flex;
.sc-loader {
margin: 0px ${spacing.r4};
svg {
fill: ${props.theme.textPrimary} !important;
}
}
}
`;
}
if (props.outlined) {
return css`
border-width: 1px;
border-style: solid;
border-color: ${props.theme.buttonSecondary};
// to be checked
background-color: ${props.theme.backgroundLevel1};
color: ${props.theme.textPrimary};
&:hover {
border-color: ${props.theme.infoPrimary};
color: ${props.theme.textPrimary};
}
`;
} else if (props.variant === 'buttonPrimary') {
return css`
background-color: ${props.theme.buttonPrimary};
border: 1px solid ${props.theme.buttonPrimary};
color: ${props.theme.textPrimary};
&:hover {
background-color: ${props.theme.highlight};
outline: none;
border: 1px solid ${props.theme.infoPrimary};
}
`;
} else if (props.variant === 'buttonSecondary') {
return css`
background-color: ${props.theme.buttonSecondary};
border: 1px solid ${props.theme.buttonSecondary};
color: ${props.theme.textPrimary};
&:hover {
background-color: ${props.theme.infoPrimary};
border: 1px solid ${props.theme.infoPrimary};
}
`;
} else if (props.variant === 'buttonDelete') {
return css`
background-color: ${props.theme.buttonDelete};
border: 1px solid ${props.theme.buttonDelete};
color: ${props.theme.statusCritical};
&:hover {
background-color: ${props.theme.statusCritical};
border: 1px solid ${props.theme.infoPrimary};
color: ${props.theme.textPrimary};
}
`;
} else if (props.variant === 'backgroundLevel1') {
return css`
background-color: ${props.theme.backgroundLevel1};
color: ${props.theme.textPrimary};
&:hover {
background-color: ${props.theme.highlight};
}
`;
} else {
return css`
background-color: ${props.theme.backgroundLevel1};
border: 1px solid ${props.theme.backgroundLevel1};
color: ${props.theme.statusCritical};
&:hover {
background-color: ${props.theme.backgroundLevel1};
border: 1px solid ${props.theme.infoPrimary};
color: ${props.theme.textPrimary};
}
`;
}
}}
${(props) => {
const brandLighter = lighten(0.2, props.theme[props.variant]).toString();
return css`
${props.disabled
? `
box-shadow: none;
pointer-events: none;
opacity: 0.3;
border-color: ${brandLighter};
color: ${white};
`
: null}
`;
}}
${(props) => {
const brandLighter = lighten(0.2, props.theme[props.variant]).toString();
const brandLight = lighten(0.1, props.theme[props.variant]).toString();
return css`
${!props.text && props.icon && props.inverted
? `
padding: 0;
height: auto;
border: none;
background-color: transparent;
color: ${props.disabled ? brandLight : props.theme[props.variant]};
&:hover{
background-color: transparent;
color: ${brandLight};
border: none;
}
&:active {
background-color: transparent;
color: ${brandLighter};
}
`
: null}
`;
}}
`;
export const ButtonIcon = styled.span`
${(props) =>
props.text &&
css`
padding-right: 8px;
display: inline-flex;
justify-content: center;
align-items: center;
`}
`;
export const ButtonText = styled.span`
display: inline-flex;
justify-content: center;
align-items: center;
`;
export const ButtonContent = styled.span`
position: relative;
`;
const Anchor = ButtonStyled.withComponent('a');
/**
* @deprecated
* Used only in Dropdown.component.tsx, can be removed after refactoring
* You should use ButtonV2 with
* @example import { Button } from '@scality/core-ui/dist/next';
*/
function Button({
text = '',
href = '',
icon = null,
size = 'base',
variant = 'buttonPrimary',
outlined = false,
disabled = false,
onClick,
title = '',
isLoading = false,
type = 'button',
inverted = false,
...rest
}: Props) {
return href && href.length ? (
{icon && (
{icon}
)}
{text}
) : (
{isLoading && }
{icon && (
{icon}
)}
{text}
);
}
export { Button };