UNPKG

@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.

255 lines (215 loc) 10.2 kB
"use strict"; var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray")); var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty")); var React = _interopRequireWildcard(require("react")); var _styledComponents = _interopRequireWildcard(require("styled-components")); var _defaultTheme = _interopRequireDefault(require("../defaultTheme")); var _FormLabel = _interopRequireDefault(require("../FormLabel")); var _InputField = require("../InputField"); var _Select = require("../Select"); var _FormFeedback = _interopRequireDefault(require("../FormFeedback")); var _consts = require("./consts"); var _rtl = require("../utils/rtl"); var _getSpacingToken = _interopRequireDefault(require("../common/getSpacingToken")); var _randomID = _interopRequireDefault(require("../utils/randomID")); var _formElementFocus = _interopRequireDefault(require("../InputField/helpers/formElementFocus")); var _mediaQuery = _interopRequireDefault(require("../utils/mediaQuery")); var getToken = function getToken(name) { return function (_ref) { var _TOKENS$height, _TOKENS$heightLine, _tokens; var theme = _ref.theme, size = _ref.size; var tokens = (_tokens = {}, (0, _defineProperty2.default)(_tokens, _consts.TOKENS.height, (_TOKENS$height = {}, (0, _defineProperty2.default)(_TOKENS$height, _consts.SIZE_OPTIONS.SMALL, theme.orbit.heightInputSmall), (0, _defineProperty2.default)(_TOKENS$height, _consts.SIZE_OPTIONS.NORMAL, theme.orbit.heightInputNormal), _TOKENS$height)), (0, _defineProperty2.default)(_tokens, _consts.TOKENS.heightLine, (_TOKENS$heightLine = {}, (0, _defineProperty2.default)(_TOKENS$heightLine, _consts.SIZE_OPTIONS.SMALL, "16px"), (0, _defineProperty2.default)(_TOKENS$heightLine, _consts.SIZE_OPTIONS.NORMAL, "24px"), _TOKENS$heightLine)), _tokens); return tokens[name][size]; }; }; var FakeGroup = (0, _styledComponents.default)(function (_ref2) { var children = _ref2.children, className = _ref2.className; return /*#__PURE__*/React.createElement("span", { className: className }, children); }).withConfig({ displayName: "InputGroup__FakeGroup", componentId: "cyuwoi-0" })(["width:100%;display:block;position:absolute;top:0;left:0;z-index:1;box-sizing:border-box;height:", ";box-shadow:", ";box-shadow:", ";", ";background-color:", ";font-size:", ";transition:box-shadow ", " ease-in-out;border-radius:6px;", ";&:hover{box-shadow:inset 0 0 0 ", ";}"], getToken(_consts.TOKENS.height), function (_ref3) { var theme = _ref3.theme; return "inset 0 0 0 ".concat(theme.orbit.borderWidthInput, " ").concat(theme.orbit.borderColorInput); }, function (_ref4) { var theme = _ref4.theme, error = _ref4.error; return error && "inset 0 0 0 ".concat(theme.orbit.borderWidthInput, " ").concat(theme.orbit.borderColorInputError); }, function (_ref5) { var active = _ref5.active; return active && _formElementFocus.default; }, function (_ref6) { var disabled = _ref6.disabled, theme = _ref6.theme; return disabled ? theme.orbit.backgroundInputDisabled : theme.orbit.backgroundInput; }, function (_ref7) { var theme = _ref7.theme; return theme.orbit.fontSizeInputNormal; }, function (_ref8) { var theme = _ref8.theme; return theme.orbit.durationFast; }, _mediaQuery.default.tablet((0, _styledComponents.css)(["border-radius:", ";"], function (_ref9) { var theme = _ref9.theme; return theme.orbit.borderRadiusNormal; })), function (_ref10) { var theme = _ref10.theme, error = _ref10.error; return "".concat(theme.orbit.borderWidthInput, " ").concat(error ? theme.orbit.borderColorInputErrorHover : theme.orbit.borderColorInputHover); }); // $FlowFixMe: https://github.com/flow-typed/flow-typed/issues/3653#issuecomment-568539198 FakeGroup.defaultProps = { theme: _defaultTheme.default }; var StyledChildren = _styledComponents.default.div.withConfig({ displayName: "InputGroup__StyledChildren", componentId: "cyuwoi-1" })(["display:flex;position:relative;"]); var StyledChild = _styledComponents.default.div.withConfig({ displayName: "InputGroup__StyledChild", componentId: "cyuwoi-2" })(["flex:", ";padding:", ";:last-child{padding:0;}"], function (_ref11) { var flex = _ref11.flex; return flex; }, function (_ref12) { var theme = _ref12.theme; return (0, _rtl.rtlSpacing)("0 ".concat(theme.orbit.spaceXSmall, " 0 0")); }); // $FlowFixMe: https://github.com/flow-typed/flow-typed/issues/3653#issuecomment-568539198 StyledChild.defaultProps = { theme: _defaultTheme.default }; var StyledInputGroup = (0, _styledComponents.default)(function (_ref13) { var children = _ref13.children, className = _ref13.className, dataTest = _ref13.dataTest, role = _ref13.role, ariaLabelledby = _ref13.ariaLabelledby; return /*#__PURE__*/React.createElement("div", { className: className, "data-test": dataTest, role: role, "aria-labelledby": ariaLabelledby }, children); }).withConfig({ displayName: "InputGroup__StyledInputGroup", componentId: "cyuwoi-3" })(["display:flex;width:100%;flex-direction:column;position:relative;margin-bottom:", ";", "{", "{box-shadow:none;background-color:transparent;display:none;align-items:center;justify-content:flex-end;}", "{background-color:transparent;> select{box-shadow:none;background-color:transparent;&:focus{box-shadow:none;}}}", ":after,", ":after{content:\" \";position:absolute;top:50%;transform:translateY(-50%);", ":0;height:", ";width:1px;background-color:", ";transition:background-color ", " ease-in-out;display:block;z-index:2;}&:last-of-type{", ":after,", ":after{content:none;}}}", " ", "{display:", ";}", ":focus ~ ", "{box-shadow:none;}"], _getSpacingToken.default, StyledChild, _InputField.FakeInput, _Select.SelectContainer, _InputField.InputContainer, _Select.SelectContainer, _rtl.right, getToken(_consts.TOKENS.heightLine), function (_ref14) { var theme = _ref14.theme, error = _ref14.error, active = _ref14.active; return error && !active ? theme.orbit.borderColorInputError : theme.orbit.borderColorInput; }, function (_ref15) { var theme = _ref15.theme; return theme.orbit.durationFast; }, _InputField.InputContainer, _Select.SelectContainer, StyledChild, _FormLabel.default, function (_ref16) { var label = _ref16.label; return label && "none"; }, _InputField.Input, _InputField.FakeInput); // $FlowFixMe: https://github.com/flow-typed/flow-typed/issues/3653#issuecomment-568539198 StyledInputGroup.defaultProps = { theme: _defaultTheme.default }; var findPropInChild = function findPropInChild(propToFind, children) { return React.Children.toArray(children).map(function (el) { if (el.props && typeof el.props[propToFind] !== "undefined") return el.props[propToFind]; return null; }).filter(function (el) { return el !== null && el !== ""; }); }; var InputGroup = function InputGroup(_ref17) { var children = _ref17.children, label = _ref17.label, _ref17$flex = _ref17.flex, flex = _ref17$flex === void 0 ? "0 1 auto" : _ref17$flex, _ref17$size = _ref17.size, size = _ref17$size === void 0 ? _consts.SIZE_OPTIONS.NORMAL : _ref17$size, help = _ref17.help, error = _ref17.error, dataTest = _ref17.dataTest, spaceAfter = _ref17.spaceAfter, onFocus = _ref17.onFocus, onBlur = _ref17.onBlur, onChange = _ref17.onChange; var _React$useState = React.useState(false), _React$useState2 = (0, _slicedToArray2.default)(_React$useState, 2), active = _React$useState2[0], setActive = _React$useState2[1]; var _React$useState3 = React.useState(false), _React$useState4 = (0, _slicedToArray2.default)(_React$useState3, 2), filled = _React$useState4[0], setFilled = _React$useState4[1]; var inputID = React.useMemo(function () { return (0, _randomID.default)("inputGroupID"); }, []); var isFilled = React.useCallback(function () { return setFilled(findPropInChild("value", children).length === React.Children.toArray(children).length); }, [children]); React.useEffect(function () { isFilled(); }, [isFilled]); var handleFocus = function handleFocus(ev) { setActive(true); if (onFocus) { onFocus(ev); } }; var handleBlur = function handleBlur(ev) { isFilled(); setActive(false); if (onBlur) { onBlur(ev); } }; var handleChange = function handleChange(ev) { isFilled(); if (onChange) { onChange(ev); } }; return /*#__PURE__*/React.createElement(StyledInputGroup, { label: label, error: error, active: active, size: size, dataTest: dataTest, spaceAfter: spaceAfter, role: "group", ariaLabelledby: label && inputID }, label && /*#__PURE__*/React.createElement(_FormLabel.default, { filled: filled, id: inputID }, label), /*#__PURE__*/React.createElement(StyledChildren, null, React.Children.map(children, function (item, key) { // either array, array with one length or string // if it's not defined, use the first or string var childFlex = Array.isArray(flex) && flex.length !== 1 ? flex[key] || flex[0] : flex; return /*#__PURE__*/React.createElement(StyledChild, { flex: childFlex }, /*#__PURE__*/React.cloneElement(item, { size: size, label: undefined, help: undefined, error: undefined, onChange: item.props.onChange != null ? item.props.onChange : handleChange, onBlur: item.props.onBlur != null ? item.props.onChange : handleBlur, onFocus: item.props.onFocus != null ? item.props.onFocus : handleFocus })); }), /*#__PURE__*/React.createElement(FakeGroup, { label: label, error: error, active: active, size: size })), /*#__PURE__*/React.createElement(_FormFeedback.default, { error: error, help: help })); }; var _default = InputGroup; exports.default = _default;