@vtex/styleguide
Version:
> VTEX Styleguide React components ([Docs](https://vtex.github.io/styleguide))
190 lines (152 loc) • 6.5 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
var _classnames = require("classnames");
var _classnames2 = _interopRequireDefault(_classnames);
var _propTypes = require("prop-types");
var _propTypes2 = _interopRequireDefault(_propTypes);
var _react = require("react");
var _react2 = _interopRequireDefault(_react);
var _Search = require("../../icon/Search");
var _Search2 = _interopRequireDefault(_Search);
var _Clear = require("../../icon/Clear");
var _Clear2 = _interopRequireDefault(_Clear);
var _Input = require("../../Input/Input.css");
var _Input2 = _interopRequireDefault(_Input);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
function _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }
function _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }
var propTypes = {
/** Determine if the input's bottom corners should be rounded or not */
roundedBottom: _propTypes2.default.bool,
/* Input props */
/** Input value */
value: _propTypes2.default.string,
/** Clear event handler */
onClear: _propTypes2.default.func,
/** Change event handler */
onChange: _propTypes2.default.func,
/** Search event handler. Called on enter or when clicking the search button */
onSearch: _propTypes2.default.func,
/** Focus event handler */
onFocus: _propTypes2.default.func,
/** Blur event handler */
onBlur: _propTypes2.default.func,
/** Determine if the input and the button should be disabled */
disabled: _propTypes2.default.bool,
/** Determine the search bar size */
size: _propTypes2.default.oneOf(['small', 'regular', 'large']),
/** Determine if the input and button should be styled with error borders */
error: _propTypes2.default.bool,
/** Prefix element */
prefix: _propTypes2.default.node,
/** Suffix element */
suffix: _propTypes2.default.node
};
var defaultProps = {
roundedBottom: true
};
var SearchInput = function SearchInput(props) {
var _classNames;
var onClear = props.onClear,
onSearch = props.onSearch,
roundedBottom = props.roundedBottom,
value = props.value,
onChange = props.onChange,
onFocus = props.onFocus,
onBlur = props.onBlur,
disabled = props.disabled,
_props$size = props.size,
size = _props$size === void 0 ? 'regular' : _props$size,
error = props.error,
prefix = props.prefix,
suffix = props.suffix,
inputProps = _objectWithoutPropertiesLoose(props, ["onClear", "onSearch", "roundedBottom", "value", "onChange", "onFocus", "onBlur", "disabled", "size", "error", "prefix", "suffix"]);
var _useState = (0, _react.useState)(false),
focused = _useState[0],
setFocused = _useState[1];
var handleChange = function handleChange(e) {
onChange && onChange(e.target.value);
};
var handleClear = function handleClear() {
onClear && onClear();
};
var handleFocus = function handleFocus(e) {
setFocused(true);
onFocus && onFocus(e);
};
var handleBlur = function handleBlur(e) {
setFocused(false);
onBlur && onBlur(e);
};
var regularSize = size !== 'small' && size !== 'large';
var activeClass = (0, _classnames2.default)({
'b--muted-2': focused && !error,
'b--muted-4 hover-b--muted-3': !focused && !error,
'b--danger hover-b--danger': error,
'br--top': !roundedBottom,
'bg-disabled c-disabled': disabled,
'bg-base c-on-base': !disabled
});
var buttonClasses = (0, _classnames2.default)(activeClass, 'bg-base br2 br--right w3 bw1 ba pa0 bl-0', {
'c-link pointer': !disabled,
'c-disabled': disabled
});
var showClearIcon = onClear && value;
var prefixClasses = (0, _classnames2.default)('br2 br-0 br--left pl5', {
pr3: size !== 'large',
pr4: size === 'large'
});
var suffixClasses = (0, _classnames2.default)('br2 br-0 br--right pr5', {
pl3: size !== 'large',
pl4: size === 'large'
});
var prefixAndSuffixClasses = (0, _classnames2.default)('c-muted-2 fw5 flex items-center', {
't-body': size !== 'small',
't-small': size === 'small'
});
var inputGroupClasses = (0, _classnames2.default)('flex flex-row items-stretch overflow-hidden bw1 br2 b--solid', activeClass, (_classNames = {
'br--left': onSearch
}, _classNames["h-" + size] = !regularSize, _classNames['h-regular'] = regularSize, _classNames));
var inputClasses = (0, _classnames2.default)('ma0 border-box w-100 bn outline-0', _Input2.default.noAppearance, activeClass, {
pr5: !showClearIcon && !suffix,
pl5: !prefix
});
var clearIconClasses = (0, _classnames2.default)('c-muted-3 fw5 flex items-center pl3 t-body h-100 pointer', {
pr5: !suffix,
pr3: suffix
});
return _react2.default.createElement("div", {
className: "flex flex-row"
}, _react2.default.createElement("label", {
className: "relative w-100"
}, _react2.default.createElement("div", {
className: inputGroupClasses
}, prefix && _react2.default.createElement("span", {
className: prefixAndSuffixClasses + " " + prefixClasses
}, prefix), _react2.default.createElement("input", _extends({
className: inputClasses,
value: value,
onFocus: handleFocus,
onBlur: handleBlur,
onChange: handleChange,
disabled: disabled
}, inputProps)), showClearIcon && _react2.default.createElement("span", {
className: clearIconClasses,
onClick: handleClear
}, _react2.default.createElement(_Clear2.default, null)), suffix && _react2.default.createElement("span", {
className: prefixAndSuffixClasses + " " + suffixClasses
}, suffix))), onSearch && _react2.default.createElement("button", {
className: buttonClasses,
disabled: disabled,
onClick: function onClick() {
return onSearch(value);
}
}, _react2.default.createElement(_Search2.default, {
size: 16
})));
};
SearchInput.propTypes = propTypes;
SearchInput.defaultProps = defaultProps;
exports.default = SearchInput;