@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.
246 lines (235 loc) • 9.5 kB
JavaScript
import _defineProperty from "@babel/runtime/helpers/esm/defineProperty";
import React, { useCallback } from "react";
import styled, { css } from "styled-components";
import convertHexToRgba from "@kiwicom/orbit-design-tokens/lib/convertHexToRgba";
import defaultTheme from "../defaultTheme";
import TOKENS from "./consts";
import Check from "../icons/Check";
import { StyledText } from "../Text";
import { rtlSpacing } from "../utils/rtl";
import getFieldDataState from "../common/getFieldDataState";
import cloneWithTooltip from "../utils/cloneWithTooltip";
import media from "../utils/mediaQuery";
var getToken = function getToken(name) {
return function (_ref) {
var _tokens;
var theme = _ref.theme,
hasError = _ref.hasError,
disabled = _ref.disabled,
checked = _ref.checked;
var resolveBorderColor = function resolveBorderColor() {
if (disabled) {
return theme.orbit.paletteInkLighter;
}
if (checked) {
return theme.orbit.paletteBlueNormal;
}
if (hasError && !disabled && !checked) {
return theme.orbit.borderColorCheckboxRadioError;
}
return theme.orbit.borderColorCheckboxRadio;
};
var getBackground = function getBackground() {
if (disabled && checked) {
return theme.orbit.paletteInkLighter;
}
if (disabled && !checked) {
return theme.orbit.paletteCloudNormal;
}
return checked ? theme.orbit.paletteBlueNormal : theme.orbit.backgroundInput;
};
var tokens = (_tokens = {}, _defineProperty(_tokens, TOKENS.background, getBackground()), _defineProperty(_tokens, TOKENS.borderColor, resolveBorderColor()), _defineProperty(_tokens, TOKENS.iconColor, disabled ? theme.orbit.paletteCloudNormal : theme.orbit.colorIconCheckboxRadio), _tokens);
return tokens[name];
};
};
var IconContainer = styled.div.withConfig({
displayName: "Checkbox__IconContainer",
componentId: "sc-1x6twh3-0"
})(["position:relative;box-sizing:border-box;flex:0 0 auto;display:flex;align-items:center;justify-content:center;background-color:", ";height:", ";width:", ";border-radius:", ";transform:scale(1);transition:all ", " ease-in-out;& > svg{visibility:hidden;display:flex;align-items:center;justify-content:center;width:16px;height:16px;}&:hover{background-color:", ";}", ""], getToken(TOKENS.background), function (_ref2) {
var theme = _ref2.theme;
return theme.orbit.heightCheckbox;
}, function (_ref3) {
var theme = _ref3.theme;
return theme.orbit.widthCheckbox;
}, function (_ref4) {
var theme = _ref4.theme;
return theme.orbit.borderRadiusLarge;
}, function (_ref5) {
var theme = _ref5.theme;
return theme.orbit.durationFast;
}, function (_ref6) {
var theme = _ref6.theme,
checked = _ref6.checked;
return checked ? theme.orbit.paletteBlueDark : theme.orbit.backgroundInput;
}, media.tablet(css(["border-radius:", ";"], function (_ref7) {
var theme = _ref7.theme;
return theme.orbit.borderRadiusNormal;
})));
IconContainer.defaultProps = {
theme: defaultTheme
};
var TextContainer = styled.div.withConfig({
displayName: "Checkbox__TextContainer",
componentId: "sc-1x6twh3-1"
})(["display:flex;flex-direction:column;margin:", ";flex:1;"], function (_ref8) {
var theme = _ref8.theme;
return rtlSpacing("0 0 0 ".concat(theme.orbit.spaceXSmall));
});
TextContainer.defaultProps = {
theme: defaultTheme
};
var Info = styled.span.withConfig({
displayName: "Checkbox__Info",
componentId: "sc-1x6twh3-2"
})(["font-size:", ";color:", ";line-height:", ";"], function (_ref9) {
var theme = _ref9.theme;
return theme.orbit.fontSizeFormFeedback;
}, function (_ref10) {
var theme = _ref10.theme;
return theme.orbit.colorInfoCheckBoxRadio;
}, function (_ref11) {
var theme = _ref11.theme;
return theme.orbit.lineHeightTextSmall;
});
Info.defaultProps = {
theme: defaultTheme
};
var LabelText = styled.span.withConfig({
displayName: "Checkbox__LabelText",
componentId: "sc-1x6twh3-3"
})(["font-family:", ";font-weight:", ";font-size:", ";color:", ";line-height:", ";", "{font-weight:", ";font-size:", ";color:", ";line-height:", ";}"], function (_ref12) {
var theme = _ref12.theme;
return theme.orbit.fontFamily;
}, function (_ref13) {
var theme = _ref13.theme;
return theme.orbit.fontWeightNormal;
}, function (_ref14) {
var theme = _ref14.theme;
return theme.orbit.fontSizeFormLabel;
}, function (_ref15) {
var theme = _ref15.theme;
return theme.orbit.colorFormLabel;
}, function (_ref16) {
var theme = _ref16.theme;
return theme.orbit.heightCheckbox;
}, StyledText, function (_ref17) {
var theme = _ref17.theme;
return theme.orbit.fontWeightNormal;
}, function (_ref18) {
var theme = _ref18.theme;
return theme.orbit.fontSizeFormLabel;
}, function (_ref19) {
var theme = _ref19.theme;
return theme.orbit.colorFormLabel;
}, function (_ref20) {
var theme = _ref20.theme;
return theme.orbit.heightCheckbox;
});
LabelText.defaultProps = {
theme: defaultTheme
};
var Input = styled.input.withConfig({
displayName: "Checkbox__Input",
componentId: "sc-1x6twh3-4"
})(["opacity:0;z-index:-1;position:absolute;&:checked ~ ", " > ", "{font-weight:", ";& > ", "{font-weight:", ";}}&:checked + ", " > svg{visibility:visible;}&:focus + ", "{border:", ";box-shadow:0 0 0 3px ", ";}"], TextContainer, LabelText, function (_ref21) {
var theme = _ref21.theme;
return theme.orbit.fontWeightMedium;
}, StyledText, function (_ref22) {
var theme = _ref22.theme;
return theme.orbit.fontWeightMedium;
}, IconContainer, IconContainer, function (_ref23) {
var theme = _ref23.theme,
error = _ref23.error;
return "1px ".concat(theme.orbit.borderStyleInput, " ").concat(error ? theme.orbit.paletteRedNormal : theme.orbit.borderColorCheckboxRadioFocus);
}, function (_ref24) {
var theme = _ref24.theme,
error = _ref24.error;
return convertHexToRgba(error ? theme.orbit.paletteRedNormal : theme.orbit.borderColorInputFocus, 15);
});
Input.defaultProps = {
theme: defaultTheme
};
export var Label = styled(function (_ref25) {
var className = _ref25.className,
children = _ref25.children,
dataTest = _ref25.dataTest;
return /*#__PURE__*/React.createElement("label", {
className: className,
"data-test": dataTest
}, children);
}).withConfig({
displayName: "Checkbox__Label",
componentId: "sc-1x6twh3-5"
})(["font-family:", ";display:flex;width:100%;flex-direction:row;align-items:self-start;opacity:", ";cursor:", ";position:relative;", "{color:", ";border:2px solid ", ";}&:hover ", "{border-color:", ";box-shadow:none;}&:active ", "{border-color:", ";transform:", ";}", ";"], function (_ref26) {
var theme = _ref26.theme;
return theme.orbit.fontFamily;
}, function (_ref27) {
var disabled = _ref27.disabled,
theme = _ref27.theme;
return disabled ? theme.orbit.opacityCheckboxDisabled : "1";
}, function (_ref28) {
var disabled = _ref28.disabled;
return disabled ? "not-allowed" : "pointer";
}, IconContainer, getToken(TOKENS.iconColor), getToken(TOKENS.borderColor), IconContainer, function (_ref29) {
var disabled = _ref29.disabled,
theme = _ref29.theme,
checked = _ref29.checked;
return !disabled && checked ? theme.orbit.paletteBlueDark : theme.orbit.paletteBlueLightActive;
}, IconContainer, function (_ref30) {
var disabled = _ref30.disabled,
theme = _ref30.theme;
return disabled ? getToken(TOKENS.borderColor) : theme.orbit.paletteBlueNormal;
}, function (_ref31) {
var disabled = _ref31.disabled,
theme = _ref31.theme;
return !disabled && "scale(".concat(theme.orbit.modifierScaleCheckboxRadioActive, ")");
}, media.largeMobile(css(["", "{border-width:1px;}"], IconContainer)));
Label.defaultProps = {
theme: defaultTheme
};
var Checkbox = /*#__PURE__*/React.forwardRef(function (props, ref) {
var label = props.label,
value = props.value,
_props$hasError = props.hasError,
hasError = _props$hasError === void 0 ? false : _props$hasError,
_props$disabled = props.disabled,
disabled = _props$disabled === void 0 ? false : _props$disabled,
_props$checked = props.checked,
checked = _props$checked === void 0 ? false : _props$checked,
name = props.name,
onChange = props.onChange,
dataTest = props.dataTest,
info = props.info,
readOnly = props.readOnly,
tabIndex = props.tabIndex,
tooltip = props.tooltip;
var preventOnClick = useCallback(function (ev) {
ev.preventDefault();
}, []);
return /*#__PURE__*/React.createElement(Label, {
disabled: disabled,
hasError: hasError,
checked: checked
}, /*#__PURE__*/React.createElement(Input, {
"data-test": dataTest,
"data-state": getFieldDataState(!!hasError),
value: value,
type: "checkbox",
disabled: disabled,
name: name,
tabIndex: tabIndex,
checked: checked,
onChange: onChange,
ref: ref,
readOnly: readOnly,
error: hasError
}), cloneWithTooltip(tooltip, /*#__PURE__*/React.createElement(IconContainer, {
disabled: disabled,
checked: checked,
onClick: readOnly ? preventOnClick : null
}, /*#__PURE__*/React.createElement(Check, {
customColor: "white"
}))), (label || info) && /*#__PURE__*/React.createElement(TextContainer, null, label && /*#__PURE__*/React.createElement(LabelText, null, label), info && /*#__PURE__*/React.createElement(Info, null, info)));
});
Checkbox.displayName = "Checkbox";
export default Checkbox;