2020-09-24 11:11:34 +00:00
|
|
|
import React from "react";
|
|
|
|
import styled, { css } from "styled-components";
|
|
|
|
import PropTypes from "prop-types";
|
|
|
|
import Loader from "../loader";
|
2019-05-28 07:20:49 +00:00
|
|
|
|
2019-07-01 07:01:57 +00:00
|
|
|
const activeCss = css`
|
2020-10-16 13:16:01 +00:00
|
|
|
background-color: ${(props) => (props.primary ? "#1F97CA" : "#ECEEF1")};
|
|
|
|
color: ${(props) => (props.primary ? "#ffffff" : "#333333")};
|
2019-05-28 07:20:49 +00:00
|
|
|
|
2020-10-16 13:16:01 +00:00
|
|
|
${(props) =>
|
2019-05-28 07:20:49 +00:00
|
|
|
!props.primary &&
|
|
|
|
css`
|
2020-09-24 11:11:34 +00:00
|
|
|
border: 1px solid #2da7db;
|
2019-07-01 07:01:57 +00:00
|
|
|
box-sizing: border-box;
|
2019-05-28 07:20:49 +00:00
|
|
|
`}
|
|
|
|
`;
|
|
|
|
|
2019-07-01 07:01:57 +00:00
|
|
|
const hoverCss = css`
|
2020-10-16 13:16:01 +00:00
|
|
|
background-color: ${(props) => (props.primary ? "#3DB8EC" : "#FFFFFF")};
|
|
|
|
color: ${(props) => (props.primary ? "#ffffff" : "#333333")};
|
2019-07-01 07:01:57 +00:00
|
|
|
|
2020-10-16 13:16:01 +00:00
|
|
|
${(props) =>
|
2019-07-01 07:01:57 +00:00
|
|
|
!props.primary &&
|
|
|
|
css`
|
2020-09-24 11:11:34 +00:00
|
|
|
border: 1px solid #2da7db;
|
2019-07-01 07:01:57 +00:00
|
|
|
box-sizing: border-box;
|
|
|
|
`}
|
2019-05-28 07:20:49 +00:00
|
|
|
`;
|
|
|
|
|
2020-09-01 13:55:28 +00:00
|
|
|
// eslint-disable-next-line no-unused-vars, react/prop-types
|
2020-09-24 11:11:34 +00:00
|
|
|
const ButtonWrapper = ({
|
|
|
|
primary,
|
|
|
|
scale,
|
|
|
|
size,
|
|
|
|
isHovered,
|
|
|
|
isClicked,
|
|
|
|
isDisabled,
|
|
|
|
isLoading,
|
|
|
|
label,
|
|
|
|
innerRef,
|
|
|
|
minWidth,
|
|
|
|
...props
|
|
|
|
}) => <button ref={innerRef} type="button" {...props}></button>;
|
2019-07-01 07:01:57 +00:00
|
|
|
|
2019-09-09 12:26:40 +00:00
|
|
|
ButtonWrapper.propTypes = {
|
|
|
|
label: PropTypes.string,
|
|
|
|
primary: PropTypes.bool,
|
2020-09-24 11:11:34 +00:00
|
|
|
size: PropTypes.oneOf(["base", "medium", "big", "large"]),
|
2019-09-09 12:26:40 +00:00
|
|
|
scale: PropTypes.bool,
|
|
|
|
icon: PropTypes.node,
|
|
|
|
|
|
|
|
tabIndex: PropTypes.number,
|
|
|
|
|
|
|
|
isHovered: PropTypes.bool,
|
|
|
|
isClicked: PropTypes.bool,
|
|
|
|
isDisabled: PropTypes.bool,
|
|
|
|
isLoading: PropTypes.bool,
|
2020-09-24 11:14:47 +00:00
|
|
|
|
2020-10-16 13:16:01 +00:00
|
|
|
onClick: PropTypes.func,
|
2019-09-09 12:26:40 +00:00
|
|
|
};
|
|
|
|
|
2020-10-16 13:16:01 +00:00
|
|
|
const StyledButton = styled(ButtonWrapper).attrs((props) => ({
|
2020-09-24 11:11:34 +00:00
|
|
|
disabled: props.isDisabled || props.isLoading ? "disabled" : "",
|
2020-10-16 13:16:01 +00:00
|
|
|
tabIndex: props.tabIndex,
|
2019-05-28 07:20:49 +00:00
|
|
|
}))`
|
2020-10-16 13:16:01 +00:00
|
|
|
height: ${(props) =>
|
2020-09-24 11:11:34 +00:00
|
|
|
(props.size === "large" && "44px") ||
|
|
|
|
(props.size === "big" && "36px") ||
|
|
|
|
(props.size === "medium" && "32px") ||
|
|
|
|
(props.size === "base" && "24px")};
|
2019-05-28 07:20:49 +00:00
|
|
|
|
2020-10-16 13:16:01 +00:00
|
|
|
line-height: ${(props) =>
|
2020-09-24 11:11:34 +00:00
|
|
|
(props.size === "large" && "20px") ||
|
|
|
|
(props.size === "big" && "20px") ||
|
|
|
|
(props.size === "medium" && "18px") ||
|
|
|
|
(props.size === "base" && "15px")};
|
2019-05-28 07:20:49 +00:00
|
|
|
|
2020-10-16 13:16:01 +00:00
|
|
|
font-size: ${(props) =>
|
2020-09-24 11:11:34 +00:00
|
|
|
(props.size === "large" && "16px") ||
|
|
|
|
(props.size === "big" && "14px") ||
|
|
|
|
(props.size === "medium" && "13px") ||
|
|
|
|
(props.size === "base" && "12px")};
|
|
|
|
|
2020-10-16 13:16:01 +00:00
|
|
|
color: ${(props) =>
|
2020-09-24 11:11:34 +00:00
|
|
|
(props.primary && "#FFFFFF") ||
|
|
|
|
(!props.isDisabled ? "#333333" : "#ECEEF1")};
|
|
|
|
|
2020-10-16 13:16:01 +00:00
|
|
|
background-color: ${(props) =>
|
2020-09-24 11:11:34 +00:00
|
|
|
!props.isDisabled || props.isLoading
|
|
|
|
? props.primary
|
|
|
|
? "#2DA7DB"
|
|
|
|
: "#FFFFFF"
|
|
|
|
: props.primary
|
|
|
|
? "#A6DCF2"
|
|
|
|
: "#FFFFFF"};
|
2019-05-28 07:20:49 +00:00
|
|
|
|
2020-10-16 13:16:01 +00:00
|
|
|
${(props) => props.scale && `width: 100%;`}
|
2019-07-31 18:16:29 +00:00
|
|
|
|
2020-10-16 13:16:01 +00:00
|
|
|
padding: ${(props) =>
|
2020-09-24 11:11:34 +00:00
|
|
|
(props.size === "large" &&
|
|
|
|
(props.primary
|
|
|
|
? props.icon
|
|
|
|
? props.label
|
|
|
|
? "11px 24px 13px 24px"
|
|
|
|
: "11px 11px 13px 11px"
|
|
|
|
: props.label
|
2020-09-24 11:14:47 +00:00
|
|
|
? "12px 20px 12px 20px"
|
2020-09-24 11:11:34 +00:00
|
|
|
: "0px"
|
|
|
|
: props.icon
|
|
|
|
? props.label
|
2020-11-28 10:06:57 +00:00
|
|
|
? "10px 24px 13px 24px"
|
|
|
|
: "10px 11px 13px 11px"
|
2020-09-24 11:11:34 +00:00
|
|
|
: props.label
|
2020-11-28 10:06:57 +00:00
|
|
|
? "11px 20px 12px 20px"
|
2020-09-24 11:11:34 +00:00
|
|
|
: "0px")) ||
|
|
|
|
(props.size === "big" &&
|
|
|
|
(props.primary
|
|
|
|
? props.icon
|
|
|
|
? props.label
|
|
|
|
? "8px 24px 9px 24px"
|
|
|
|
: "8px 10px 9px 10px"
|
|
|
|
: props.label
|
2020-09-24 11:14:47 +00:00
|
|
|
? "8px 16px 8px 16px"
|
2020-09-24 11:11:34 +00:00
|
|
|
: "0px"
|
|
|
|
: props.icon
|
|
|
|
? props.label
|
2020-11-28 10:06:57 +00:00
|
|
|
? "7px 24px 9px 24px"
|
|
|
|
: "7px 10px 9px 10px"
|
2020-09-24 11:11:34 +00:00
|
|
|
: props.label
|
2020-11-28 10:06:57 +00:00
|
|
|
? "7px 16px 8px 16px"
|
2020-09-24 11:11:34 +00:00
|
|
|
: "0px")) ||
|
|
|
|
(props.size === "medium" &&
|
|
|
|
(props.primary
|
|
|
|
? props.icon
|
|
|
|
? props.label
|
|
|
|
? "6px 24px 7px 24px"
|
|
|
|
: "6px 10px 7px 10px"
|
|
|
|
: props.label
|
2020-09-24 11:14:47 +00:00
|
|
|
? "7px 16px 7px 16px"
|
2020-09-24 11:11:34 +00:00
|
|
|
: "0px"
|
|
|
|
: props.icon
|
|
|
|
? props.label
|
2020-11-28 10:06:57 +00:00
|
|
|
? "5px 24px 7px 24px"
|
|
|
|
: "5px 10px 7px 10px"
|
2020-09-24 11:11:34 +00:00
|
|
|
: props.label
|
2020-11-28 10:06:57 +00:00
|
|
|
? "6px 16px 7px 16px"
|
2020-09-24 11:11:34 +00:00
|
|
|
: "0px")) ||
|
|
|
|
(props.size === "base" &&
|
|
|
|
(props.primary
|
|
|
|
? props.icon
|
|
|
|
? props.label
|
|
|
|
? "3px 20px 5px 20px"
|
|
|
|
: "3px 5px 5px 5px"
|
|
|
|
: props.label
|
2020-10-28 09:52:18 +00:00
|
|
|
? "4px 12px 5px 12px"
|
2020-09-24 11:11:34 +00:00
|
|
|
: "0px"
|
|
|
|
: props.icon
|
|
|
|
? props.label
|
2020-11-28 10:06:57 +00:00
|
|
|
? "2px 20px 5px 20px"
|
|
|
|
: "2px 5px 5px 5px"
|
2020-09-24 11:11:34 +00:00
|
|
|
: props.label
|
2020-11-28 10:06:57 +00:00
|
|
|
? "3px 12px 5px 12px"
|
2020-09-24 11:11:34 +00:00
|
|
|
: "0px"))};
|
|
|
|
|
2020-10-16 13:16:01 +00:00
|
|
|
${(props) => (props.minwidth ? `min-width: ${props.minwidth};` : null)}
|
|
|
|
|
|
|
|
cursor: ${(props) =>
|
2020-09-24 11:11:34 +00:00
|
|
|
props.isDisabled || props.isLoading ? "default !important" : "pointer"};
|
2019-05-28 07:20:49 +00:00
|
|
|
|
2020-10-16 13:16:01 +00:00
|
|
|
font-family: "Open Sans", normal;
|
2019-05-28 07:20:49 +00:00
|
|
|
border: none;
|
|
|
|
margin: 0;
|
|
|
|
display: inline-block;
|
2019-07-01 07:01:57 +00:00
|
|
|
font-weight: 600;
|
2019-05-28 07:20:49 +00:00
|
|
|
text-align: center;
|
|
|
|
text-decoration: none;
|
|
|
|
vertical-align: middle;
|
|
|
|
border-radius: 3px;
|
|
|
|
-moz-border-radius: 3px;
|
|
|
|
-webkit-border-radius: 3px;
|
|
|
|
touch-callout: none;
|
|
|
|
-o-touch-callout: none;
|
|
|
|
-moz-touch-callout: none;
|
|
|
|
-webkit-touch-callout: none;
|
|
|
|
user-select: none;
|
|
|
|
-o-user-select: none;
|
|
|
|
-moz-user-select: none;
|
|
|
|
-webkit-user-select: none;
|
|
|
|
stroke: none;
|
2019-06-06 09:16:14 +00:00
|
|
|
overflow: hidden;
|
|
|
|
text-overflow: ellipsis;
|
|
|
|
white-space: nowrap;
|
2020-01-31 14:29:54 +00:00
|
|
|
-webkit-tap-highlight-color: rgba(0, 0, 0, 0);
|
2019-05-28 07:20:49 +00:00
|
|
|
|
2020-10-16 13:16:01 +00:00
|
|
|
${(props) =>
|
2019-05-28 07:20:49 +00:00
|
|
|
!props.primary &&
|
|
|
|
css`
|
2019-07-01 07:01:57 +00:00
|
|
|
border: 1px solid;
|
|
|
|
box-sizing: border-box;
|
2020-10-16 13:16:01 +00:00
|
|
|
border-color: ${(props) =>
|
2020-09-24 11:11:34 +00:00
|
|
|
!props.isDisabled && !props.isLoading ? "#D0D5DA" : "#ECEEF1"};
|
2019-05-28 07:20:49 +00:00
|
|
|
`}
|
2019-07-01 07:01:57 +00:00
|
|
|
|
2020-10-16 13:16:01 +00:00
|
|
|
${(props) =>
|
2020-09-24 11:11:34 +00:00
|
|
|
!props.isDisabled &&
|
|
|
|
!props.isLoading &&
|
|
|
|
(props.isHovered
|
|
|
|
? hoverCss
|
|
|
|
: css`
|
|
|
|
&:hover {
|
|
|
|
${hoverCss}
|
|
|
|
}
|
|
|
|
`)}
|
2019-05-28 07:20:49 +00:00
|
|
|
|
2020-10-16 13:16:01 +00:00
|
|
|
${(props) =>
|
2020-09-24 11:11:34 +00:00
|
|
|
!props.isDisabled &&
|
|
|
|
!props.isLoading &&
|
|
|
|
(props.isClicked
|
|
|
|
? activeCss
|
|
|
|
: css`
|
|
|
|
&:active {
|
|
|
|
${activeCss}
|
|
|
|
}
|
|
|
|
`)}
|
2019-05-28 07:20:49 +00:00
|
|
|
|
|
|
|
&:focus {
|
2020-10-16 13:16:01 +00:00
|
|
|
outline: none;
|
2019-05-28 07:20:49 +00:00
|
|
|
}
|
|
|
|
|
2019-07-02 08:04:54 +00:00
|
|
|
.btnIcon,
|
|
|
|
.loader {
|
|
|
|
display: inline-block;
|
2020-07-16 09:37:22 +00:00
|
|
|
vertical-align: text-top;
|
|
|
|
}
|
2020-07-16 09:31:18 +00:00
|
|
|
|
2020-07-16 09:37:22 +00:00
|
|
|
.loader {
|
2020-10-16 13:16:01 +00:00
|
|
|
vertical-align: ${(props) =>
|
2020-09-24 11:11:34 +00:00
|
|
|
props.size === "large" || props.size === "base"
|
|
|
|
? "middle"
|
|
|
|
: props.size === "medium"
|
|
|
|
? "text-bottom"
|
|
|
|
: "text-top"};
|
2019-07-02 08:04:54 +00:00
|
|
|
}
|
|
|
|
|
2020-10-16 13:16:01 +00:00
|
|
|
${(props) =>
|
2020-09-24 11:11:34 +00:00
|
|
|
props.label &&
|
|
|
|
css`
|
|
|
|
.btnIcon,
|
|
|
|
.loader {
|
|
|
|
padding-right: 4px;
|
|
|
|
}
|
|
|
|
`}
|
2019-06-06 09:16:14 +00:00
|
|
|
`;
|
|
|
|
|
2020-10-22 10:21:37 +00:00
|
|
|
const Icon = ({ size, primary, icon, isHovered }) => (
|
2019-07-02 08:04:54 +00:00
|
|
|
<div className="btnIcon">
|
2020-09-24 11:11:34 +00:00
|
|
|
{icon &&
|
|
|
|
React.cloneElement(icon, {
|
|
|
|
isfill: true,
|
|
|
|
size: size === "large" ? "large" : size === "big" ? "medium" : "small",
|
2020-10-28 09:52:18 +00:00
|
|
|
color: icon.props.color
|
|
|
|
? isHovered
|
2020-11-09 09:11:08 +00:00
|
|
|
? icon.props.hoveredcolor
|
2020-10-28 09:52:18 +00:00
|
|
|
: icon.props.color
|
|
|
|
: primary
|
|
|
|
? "#FFFFFF"
|
|
|
|
: "#333333",
|
2020-09-24 11:11:34 +00:00
|
|
|
})}
|
2019-07-02 08:04:54 +00:00
|
|
|
</div>
|
|
|
|
);
|
|
|
|
|
|
|
|
Icon.propTypes = {
|
2019-09-09 12:26:40 +00:00
|
|
|
icon: PropTypes.node,
|
|
|
|
size: PropTypes.string,
|
2020-10-16 13:16:01 +00:00
|
|
|
primary: PropTypes.bool,
|
2019-07-02 08:04:54 +00:00
|
|
|
};
|
2019-06-06 09:16:14 +00:00
|
|
|
|
2019-07-02 08:04:54 +00:00
|
|
|
Icon.defaultProps = {
|
2020-10-16 13:16:01 +00:00
|
|
|
icon: null,
|
2019-07-02 08:04:54 +00:00
|
|
|
};
|
2019-06-06 09:16:14 +00:00
|
|
|
|
2020-02-02 11:01:43 +00:00
|
|
|
const Button = React.forwardRef((props, ref) => {
|
2020-10-22 10:21:37 +00:00
|
|
|
const { primary, size, isLoading, icon, label, isHovered } = props;
|
|
|
|
const iconProps = { primary, size, icon, isHovered };
|
2020-02-02 11:01:43 +00:00
|
|
|
return (
|
2020-09-24 11:11:34 +00:00
|
|
|
<StyledButton innerRef={ref} {...props}>
|
|
|
|
{isLoading || icon ? (
|
|
|
|
isLoading ? (
|
|
|
|
<Loader
|
|
|
|
type="oval"
|
|
|
|
size={size === "large" ? "18px" : size === "big" ? "16px" : "14px"}
|
|
|
|
color={primary ? "#FFFFFF" : "#333333"}
|
|
|
|
className="loader"
|
|
|
|
/>
|
|
|
|
) : (
|
|
|
|
<Icon {...iconProps} />
|
|
|
|
)
|
|
|
|
) : (
|
|
|
|
""
|
|
|
|
)}
|
2020-02-02 11:01:43 +00:00
|
|
|
{label}
|
|
|
|
</StyledButton>
|
|
|
|
);
|
|
|
|
});
|
2019-05-28 07:20:49 +00:00
|
|
|
|
|
|
|
Button.propTypes = {
|
2019-06-06 09:16:14 +00:00
|
|
|
label: PropTypes.string,
|
2019-07-01 07:01:57 +00:00
|
|
|
primary: PropTypes.bool,
|
2020-09-24 11:11:34 +00:00
|
|
|
size: PropTypes.oneOf(["base", "medium", "big", "large"]),
|
2019-07-31 18:16:29 +00:00
|
|
|
scale: PropTypes.bool,
|
2019-07-02 08:04:54 +00:00
|
|
|
icon: PropTypes.node,
|
2019-06-06 09:16:14 +00:00
|
|
|
|
2019-05-28 07:20:49 +00:00
|
|
|
tabIndex: PropTypes.number,
|
2019-11-26 11:01:00 +00:00
|
|
|
className: PropTypes.string,
|
|
|
|
id: PropTypes.string,
|
|
|
|
style: PropTypes.oneOfType([PropTypes.object, PropTypes.array]),
|
2019-07-01 07:01:57 +00:00
|
|
|
|
2019-05-28 07:20:49 +00:00
|
|
|
isHovered: PropTypes.bool,
|
2019-07-01 07:01:57 +00:00
|
|
|
isClicked: PropTypes.bool,
|
2019-05-28 07:20:49 +00:00
|
|
|
isDisabled: PropTypes.bool,
|
2019-06-06 09:16:14 +00:00
|
|
|
isLoading: PropTypes.bool,
|
2019-07-01 07:01:57 +00:00
|
|
|
|
2020-08-06 11:47:16 +00:00
|
|
|
minwidth: PropTypes.string,
|
2020-07-29 08:32:57 +00:00
|
|
|
|
2020-10-16 13:16:01 +00:00
|
|
|
onClick: PropTypes.func,
|
2019-05-28 07:20:49 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
Button.defaultProps = {
|
2020-09-24 11:11:34 +00:00
|
|
|
label: "",
|
2019-05-28 07:20:49 +00:00
|
|
|
primary: false,
|
2020-09-24 11:11:34 +00:00
|
|
|
size: "base",
|
2019-07-31 18:16:29 +00:00
|
|
|
scale: false,
|
2019-07-02 08:04:54 +00:00
|
|
|
icon: null,
|
2019-07-01 07:01:57 +00:00
|
|
|
|
2019-06-06 09:16:14 +00:00
|
|
|
tabIndex: -1,
|
2020-09-24 11:11:34 +00:00
|
|
|
|
2020-08-06 11:47:16 +00:00
|
|
|
minwidth: null,
|
2019-07-01 07:01:57 +00:00
|
|
|
|
|
|
|
isHovered: false,
|
|
|
|
isClicked: false,
|
|
|
|
isDisabled: false,
|
2020-10-16 13:16:01 +00:00
|
|
|
isLoading: false,
|
2019-05-28 07:20:49 +00:00
|
|
|
};
|
|
|
|
|
2020-02-02 11:01:43 +00:00
|
|
|
Button.displayName = "Button";
|
|
|
|
|
2019-05-28 07:20:49 +00:00
|
|
|
export default Button;
|