cra-template-pdr
Version:
Great CRA template with typescript
131 lines (111 loc) • 2.6 kB
text/typescript
import styled from "styled-components";
interface ButtonStyledProps {
size?: 'sm' | 'md' | 'lg'
color?: 'default' | 'primary' | 'secondary' | 'danger'
variant?: 'outline' | 'text'
fontSize?: string
disableShadow?: boolean
}
interface sizeButtonProps {
sm: string
md: string
lg: string
}
const iconSize: sizeButtonProps = {
sm: "14px",
md: "18px",
lg: "20px"
}
const sizeButton: sizeButtonProps = {
sm: "6px 12px",
md: "8px 16px",
lg: "11px 22px"
}
interface colorButtonProps {
default: string
primary: string
secondary: string
danger: string
}
const colorButton: colorButtonProps = {
default: `
background-color: #E0E0E0;
color: #3F3F3F;
&:hover, &:focus {
background: #AEAEAE;
}
`,
primary: `
background-color: #2962FF;
color: #FFFFFF;
&:hover, &:focus {
background: #0039CB;
}
`,
secondary: `
background-color: #455A64;
color: #FFFFFF;
&:hover, &:focus {
background: #1C313A;
}
`,
danger: `
background-color: #D32F2F;
color: #FFFFFF;
&:hover, &:focus {
background: #9A0007;
}
`
}
interface variantButtonProps {
outline: string
text: string
}
const variantButton:variantButtonProps ={
outline: `
border: 1px solid #3D5AFE;
color: #3D5AFE;
background-color: transparent;
&:hover, &:focus {
background: rgba(41, 98, 255, 0.1);
}`,
text: `
background-color: transparent;
color: #3D5AFE;
&:hover, &:focus {
background: rgba(41, 98, 255, 0.1);
}
`
}
export const ButtonStyled = styled.button<ButtonStyledProps>`
display: flex;
align-items: center;
gap: 10px;
font-size: ${({fontSize}) => fontSize || "1.4rem"};
line-height: 2rem;
color: #3F3F3F;
font-weight: 500;
border-radius: 6px;
box-shadow: 0px 2px 3px rgba(51, 51, 51, 0.2);
cursor: pointer;
padding: ${({size}) => size ? sizeButton[size] : sizeButton['md'] };
${({color}) => color ? colorButton[color] : colorButton['default']}
${({variant}) => variant && variantButton[variant]}
${({disableShadow}) => disableShadow && `
box-shadow: unset;
`}
&:disabled {
background: #E0E0E0;
color: #9E9E9E;
box-shadow: unset;
border: none;
cursor: not-allowed;
${({variant}) => variant === 'text' && `
background-color: transparent;
`}
}
svg {
width: ${({size}) => size ? iconSize[size] : iconSize['md'] };
height: ${({size}) => size ? iconSize[size] : iconSize['md'] };
}
`