DocSpace-client/web/ASC.Web.Components/src/components/button/index.js

348 lines
7.8 KiB
JavaScript
Raw Normal View History

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-07-01 07:01:57 +00:00
const activeCss = css`
background-color: ${(props) => (props.primary ? "#1F97CA" : "#ECEEF1")};
color: ${(props) => (props.primary ? "#ffffff" : "#333333")};
${(props) =>
!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-07-01 07:01:57 +00:00
const hoverCss = css`
background-color: ${(props) => (props.primary ? "#3DB8EC" : "#FFFFFF")};
color: ${(props) => (props.primary ? "#ffffff" : "#333333")};
2019-07-01 07:01:57 +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;
`}
`;
// 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
ButtonWrapper.propTypes = {
label: PropTypes.string,
primary: PropTypes.bool,
2020-09-24 11:11:34 +00:00
size: PropTypes.oneOf(["base", "medium", "big", "large"]),
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
onClick: PropTypes.func,
};
const StyledButton = styled(ButtonWrapper).attrs((props) => ({
2020-09-24 11:11:34 +00:00
disabled: props.isDisabled || props.isLoading ? "disabled" : "",
tabIndex: props.tabIndex,
}))`
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")};
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")};
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")};
color: ${(props) =>
2020-09-24 11:11:34 +00:00
(props.primary && "#FFFFFF") ||
(!props.isDisabled ? "#333333" : "#ECEEF1")};
background-color: ${(props) =>
2020-09-24 11:11:34 +00:00
!props.isDisabled || props.isLoading
? props.primary
? "#2DA7DB"
: "#FFFFFF"
: props.primary
? "#A6DCF2"
: "#FFFFFF"};
${(props) => props.scale && `width: 100%;`}
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
? "10px 24px 13px 24px"
: "10px 11px 13px 11px"
2020-09-24 11:11:34 +00:00
: props.label
? "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
? "7px 24px 9px 24px"
: "7px 10px 9px 10px"
2020-09-24 11:11:34 +00:00
: props.label
? "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
? "5px 24px 7px 24px"
: "5px 10px 7px 10px"
2020-09-24 11:11:34 +00:00
: props.label
? "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
? "4px 12px 5px 12px"
2020-09-24 11:11:34 +00:00
: "0px"
: props.icon
? props.label
? "2px 20px 5px 20px"
: "2px 5px 5px 5px"
2020-09-24 11:11:34 +00:00
: props.label
? "3px 12px 5px 12px"
2020-09-24 11:11:34 +00:00
: "0px"))};
${(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"};
font-family: "Open Sans", normal;
border: none;
margin: 0;
display: inline-block;
2019-07-01 07:01:57 +00:00
font-weight: 600;
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;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
-webkit-tap-highlight-color: rgba(0, 0, 0, 0);
${(props) =>
!props.primary &&
css`
2019-07-01 07:01:57 +00:00
border: 1px solid;
box-sizing: border-box;
border-color: ${(props) =>
2020-09-24 11:11:34 +00:00
!props.isDisabled && !props.isLoading ? "#D0D5DA" : "#ECEEF1"};
`}
2019-07-01 07:01:57 +00:00
${(props) =>
2020-09-24 11:11:34 +00:00
!props.isDisabled &&
!props.isLoading &&
(props.isHovered
? hoverCss
: css`
&:hover {
${hoverCss}
}
`)}
${(props) =>
2020-09-24 11:11:34 +00:00
!props.isDisabled &&
!props.isLoading &&
(props.isClicked
? activeCss
: css`
&:active {
${activeCss}
}
`)}
&:focus {
outline: none;
}
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 {
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
}
${(props) =>
2020-09-24 11:11:34 +00:00
props.label &&
css`
.btnIcon,
.loader {
padding-right: 4px;
}
`}
`;
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",
color: icon.props.color
? isHovered
2020-11-09 09:11:08 +00:00
? icon.props.hoveredcolor
: 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 = {
icon: PropTypes.node,
size: PropTypes.string,
primary: PropTypes.bool,
2019-07-02 08:04:54 +00:00
};
2019-07-02 08:04:54 +00:00
Icon.defaultProps = {
icon: null,
2019-07-02 08:04:54 +00:00
};
const Button = React.forwardRef((props, ref) => {
const { primary, size, isLoading, icon, label, isHovered } = props;
const iconProps = { primary, size, icon, isHovered };
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} />
)
) : (
""
)}
{label}
</StyledButton>
);
});
Button.propTypes = {
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"]),
scale: PropTypes.bool,
2019-07-02 08:04:54 +00:00
icon: PropTypes.node,
tabIndex: PropTypes.number,
className: PropTypes.string,
id: PropTypes.string,
style: PropTypes.oneOfType([PropTypes.object, PropTypes.array]),
2019-07-01 07:01:57 +00:00
isHovered: PropTypes.bool,
2019-07-01 07:01:57 +00:00
isClicked: PropTypes.bool,
isDisabled: PropTypes.bool,
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
onClick: PropTypes.func,
};
Button.defaultProps = {
2020-09-24 11:11:34 +00:00
label: "",
primary: false,
2020-09-24 11:11:34 +00:00
size: "base",
scale: false,
2019-07-02 08:04:54 +00:00
icon: null,
2019-07-01 07:01:57 +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,
isLoading: false,
};
Button.displayName = "Button";
export default Button;