import React, { memo, CSSProperties } from 'react';
import styled from 'styled-components';
import styledMap from 'styled-map';
interface IButtonProps {
id?: string;
className?: string;
children?: JSX.Element | string;
style?: CSSProperties;
primary?: boolean;
secondary?: boolean;
tertiary?: boolean;
error?: boolean;
success?: boolean;
cancel?: boolean;
deactive?: boolean;
default?: boolean;
large?: boolean;
medium?: boolean;
loading?: boolean;
icon?: JSX.Element;
iconPath?: string;
to?: string;
type?: 'button' | 'submit' | 'reset';
onClick?: (event: React.SyntheticEvent) => void;
disable?: boolean;
off?: boolean;
}
function Button({
id,
className,
children,
style,
loading,
disable,
off,
iconPath,
icon,
to,
type,
onClick,
...styleProps
}: IButtonProps) {
const ButtonComponent = (
{icon ? icon : iconPath ? : null}
{!loading ? children : ''}
);
return ButtonComponent;
}
export default memo(Button);
interface IIconProps {
src: string;
}
const StyledButton = styled.button<{ off?: boolean }>`
cursor: ${styledMap`
disabled: unset;
off: unset;
default: pointer;
`};
display: flex;
flex-direction: row;
justify-content: flex-start;
align-items: center;
gap: 1em;
padding: 0.7em 1em;
font-family: inherit;
outline: none;
border: none;
border-radius: var(--SE-radius-8);
box-shadow: ${styledMap`
cancel: none;
default: 0 3px 6px 0 var(--SE-shadow-1);
`};
background-color: ${styledMap`
error: var(--error);
success: var(--success);
cancel: var(--SE-light-2);
deactive: var(--SE-shade-4);
secondary: var(--SE-color-secondary);
primary: var(--SE-color-primary);
tertiary: transparent;
default: var(--SE-shade-5);
`};
color: ${styledMap`
tertiary: var(--SE-shade-1);
cancel: var(--light-4);
default: var(--SE-light-1);
`};
height: ${styledMap`
large: 3em;
default: unset;
`};
font-size: ${styledMap`
default: 1em;
`};
filter: ${styledMap`
off: grayscale(1);
default: unset;
`};
`;
const Icon = styled.i`
display: inline-block;
height: 1em;
width: 1em;
background-image: url(${(props) => props.src});
background-repeat: no-repeat;
background-size: contain;
background-position: center;
`;
const Content = styled.span`
height: 1rem;
display: inline-flex;
justify-content: center;
align-items: center;
user-select: none;
flex-grow: 1;
`;