@kiwicom/orbit-components
Version:
Orbit-components is a React component library which provides developers with the easiest possible way of building Kiwi.com’s products.
150 lines • 6.76 kB
JavaScript
import _extends from "@babel/runtime/helpers/esm/extends";
import * as React from "react";
import styled, { css } from "styled-components";
import defaultTheme from "../../defaultTheme";
import Loading, { StyledSpinner } from "../../Loading";
import getSpacingToken from "../../common/getSpacingToken";
import ButtonPrimitiveContent from "./components/ButtonPrimitiveContent";
import ButtonPrimitiveIconContainer, { StyledButtonPrimitiveIconContainer } from "./components/ButtonPrimitiveIconContainer";
import ButtonPrimitiveContentChildren from "./components/ButtonPrimitiveContentChildren";
import mq from "../../utils/mediaQuery";
import createRel from "./common/createRel";
import onKeyDown from "../../utils/handleKeyDown";
const iconContainerColor = (color, important = true) => css(["", "{color:", " ", ";}"], StyledButtonPrimitiveIconContainer, color, important && "!important");
export const StyledButtonPrimitive = styled( /*#__PURE__*/React.forwardRef(({
asComponent = "button",
id,
dataTest,
submit,
disabled,
ariaControls,
ariaExpanded,
ariaLabelledby,
ariaCurrent,
title,
className,
rel,
href,
external,
tabIndex,
onClick,
role,
download,
...props
}, ref) => {
const isButtonWithHref = asComponent === "button" && href;
const Component = isButtonWithHref ? "a" : asComponent;
const buttonType = submit ? "submit" : "button";
const handleKeyDown = ev => asComponent === "div" ? onKeyDown(onClick)(ev) : undefined;
return /*#__PURE__*/React.createElement(Component, {
ref: ref,
id: id,
"data-test": dataTest,
"aria-controls": ariaControls,
"aria-current": ariaCurrent,
"aria-expanded": ariaExpanded,
"aria-label": title,
"aria-labelledby": ariaLabelledby,
type: !isButtonWithHref ? buttonType : undefined,
className: className,
disabled: disabled,
onKeyDown: handleKeyDown,
href: !disabled ? href : null,
target: !disabled && href && external ? "_blank" : undefined,
rel: createRel({
external,
href,
rel
}),
tabIndex: tabIndex,
onClick: !disabled ? onClick : null,
role: role,
download: download
}, props.children);
})).withConfig({
displayName: "ButtonPrimitive__StyledButtonPrimitive",
componentId: "sc-j8pavp-0"
})(["", ";"], ({
foreground,
disabled,
fullWidth,
href,
theme,
asComponent,
circled,
padding,
background,
fontWeight,
fontSize,
height,
width,
onlyIcon,
icons,
foregroundHover,
foregroundActive,
foregroundFocus,
backgroundHover,
backgroundActive,
backgroundFocus,
boxShadow,
boxShadowHover,
boxShadowFocus,
boxShadowActive,
underlined
}) => css(["height:", ";position:relative;display:", ";justify-content:space-between;align-items:center;box-sizing:border-box;appearance:none !important;text-align:center;text-decoration:", ";flex:", ";max-width:100%;background:", ";color:", "!important;border:0;outline:", ";padding:", ";border-radius:", ";font-family:", ";font-weight:", ";font-size:", ";cursor:", ";transition:all ", " ease-in-out !important;opacity:", ";margin-bottom:", ";width:", ";box-shadow:", ";& > *{vertical-align:middle;}", " ", ";", "{width:", ";height:", ";}&:hover{", ";}:focus{box-shadow:", ";background:", ";color:", "!important;text-decoration:none;", ";}:focus:not(:focus-visible){box-shadow:none;background:", ";color:", "!important;text-decoration:none;", ";}:-moz-focusring,:focus-visible{box-shadow:", ";background:", ";color:", "!important;text-decoration:none;", ";}&:hover:focus{background:", ";}&:active,&:active:focus{", ";}"], height, href || asComponent === "a" ? "inline-flex" : "flex", underlined ? "underline" : "none", fullWidth ? "1 1 auto" : "0 0 auto", background, foreground, boxShadowFocus && "0", padding, circled ? height : "6px", theme.orbit.fontFamily, fontWeight || theme.orbit.fontWeightMedium, fontSize, disabled ? "not-allowed" : "pointer", theme.orbit.durationFast, disabled && theme.orbit.opacityButtonDisabled, getSpacingToken, fullWidth ? "100%" : width || onlyIcon && height || "auto", boxShadow, mq.tablet(css(["border-radius:", ";"], circled ? height : theme.orbit.borderRadiusNormal)), icons && icons.foreground && iconContainerColor(icons.foreground, false), StyledSpinner, icons && icons.width, icons && icons.height, !disabled && css(["background:", ";color:", "!important;box-shadow:", ";text-decoration:none;", ";"], backgroundHover, foregroundHover, boxShadowHover, icons && icons.foregroundHover && iconContainerColor(icons.foregroundHover)), boxShadowFocus, backgroundFocus, foregroundFocus, icons && icons.foregroundFocus && iconContainerColor(icons.foregroundFocus), background, foregroundFocus, icons && icons.foregroundFocus && iconContainerColor(icons.foregroundFocus), boxShadowFocus, backgroundFocus, foregroundFocus, icons && icons.foregroundFocus && iconContainerColor(icons.foregroundFocus), backgroundHover, !disabled && css(["background:", ";box-shadow:", ";color:", "!important;text-decoration:none;", ";"], backgroundActive, boxShadowActive, foregroundActive, icons && icons.foregroundActive && iconContainerColor(icons.foregroundActive))));
StyledButtonPrimitive.defaultProps = {
theme: defaultTheme
};
const ButtonPrimitive = /*#__PURE__*/React.forwardRef((props, ref) => {
const {
loading,
disabled,
children,
iconLeft,
iconRight,
// Need to setup null values so the object exits by default
icons = {
width: null,
height: null,
leftMargin: null,
rightMargin: null
},
contentAlign = "center",
contentWidth,
fullWidth,
centered
} = props;
const {
width,
height,
leftMargin,
rightMargin
} = icons;
const isDisabled = loading || disabled;
const onlyIcon = Boolean(iconLeft && !children);
return /*#__PURE__*/React.createElement(StyledButtonPrimitive, _extends({
ref: ref,
onlyIcon: onlyIcon
}, props, {
disabled: isDisabled
}), loading && /*#__PURE__*/React.createElement(Loading, {
type: "buttonLoader"
}), /*#__PURE__*/React.createElement(ButtonPrimitiveContent, {
loading: loading,
contentAlign: contentAlign
}, iconLeft && /*#__PURE__*/React.createElement(ButtonPrimitiveIconContainer, {
width: width,
height: height,
margin: leftMargin
}, iconLeft), children && /*#__PURE__*/React.createElement(ButtonPrimitiveContentChildren, {
hasIcon: Boolean(iconLeft || iconRight),
contentWidth: contentWidth,
centered: fullWidth && centered
}, children), iconRight && /*#__PURE__*/React.createElement(ButtonPrimitiveIconContainer, {
width: width,
height: height,
margin: rightMargin
}, iconRight)));
});
ButtonPrimitive.displayName = "ButtonPrimitive";
export default ButtonPrimitive;