@geezee/react-ui
Version:
Modern and minimalist React UI library.
183 lines (171 loc) • 15.6 kB
JavaScript
import _extends from "@babel/runtime/helpers/esm/extends";
import _toConsumableArray from "@babel/runtime/helpers/esm/toConsumableArray";
import _slicedToArray from "@babel/runtime/helpers/esm/slicedToArray";
import _objectWithoutProperties from "@babel/runtime/helpers/esm/objectWithoutProperties";
import _JSXStyle from "styled-jsx/style";
import React, { useMemo, useRef, useState, useCallback, forwardRef, useImperativeHandle } from 'react';
import useTheme from '../styles/use-theme';
import useClickAway from '../utils/use-click-away';
import { pickChildByProps } from '../utils/collections';
import SelectIcon from './select-icon';
import SelectMultipleValue from './select-multiple-value';
import Grid from '../grid';
import { SelectContext } from './select-context';
import { getSizes, getSelectColors } from './styles';
import Ellipsis from '../shared/ellipsis';
import useMergedState from '../utils/use-merged-state';
import Dropdown from '../shared/dropdown';
var defaultProps = {
disabled: false,
size: 'medium',
icon: SelectIcon,
pure: false,
multiple: false,
width: 'initial',
className: '',
variant: 'line',
disableMatchWidth: false
};
var Select = forwardRef(function (_ref, ref) {
var children = _ref.children,
size = _ref.size,
disabled = _ref.disabled,
defaultValue = _ref.defaultValue,
value = _ref.value,
Icon = _ref.icon,
onChange = _ref.onChange,
pure = _ref.pure,
multiple = _ref.multiple,
placeholder = _ref.placeholder,
width = _ref.width,
variant = _ref.variant,
className = _ref.className,
dropdownClassName = _ref.dropdownClassName,
dropdownStyle = _ref.dropdownStyle,
disableMatchWidth = _ref.disableMatchWidth,
props = _objectWithoutProperties(_ref, ["children", "size", "disabled", "defaultValue", "value", "icon", "onChange", "pure", "multiple", "placeholder", "width", "variant", "className", "dropdownClassName", "dropdownStyle", "disableMatchWidth"]);
var theme = useTheme();
var domRef = useRef(null);
var _useState = useState(false),
_useState2 = _slicedToArray(_useState, 2),
visible = _useState2[0],
setVisible = _useState2[1];
var _useMergedState = useMergedState(defaultValue, {
value: value,
onChange: onChange,
postState: function postState() {
var value = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '';
if (!multiple) return value;
if (Array.isArray(value)) return value;
return typeof value === 'undefined' || value === '' ? [] : [value];
}
}),
_useMergedState2 = _slicedToArray(_useMergedState, 2),
mergedValue = _useMergedState2[0],
setMergedValue = _useMergedState2[1];
var isEmpty = useMemo(function () {
if (!Array.isArray(mergedValue)) {
return !mergedValue;
}
return mergedValue.length === 0;
}, [mergedValue]);
var sizes = useMemo(function () {
return getSizes(theme, size);
}, [theme, size]);
var colors = useMemo(function () {
return getSelectColors(disabled, theme.palette, variant);
}, [disabled, theme.palette, variant]);
var updateValue = function updateValue(next) {
var setNewValue = function setNewValue() {
if (!Array.isArray(mergedValue)) return next;
if (!mergedValue.includes(next)) return [].concat(_toConsumableArray(mergedValue), [next]);
return mergedValue.filter(function (item) {
return item !== next;
});
};
var newValue = setNewValue();
setMergedValue(newValue);
if (!multiple) {
setVisible(false);
}
};
useImperativeHandle(ref, function () {
return {
setValue: function setValue() {
var value = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '';
setMergedValue(value);
},
getValue: function getValue() {
return mergedValue;
}
};
});
var initialValue = useMemo(function () {
return {
value: mergedValue,
variant: variant,
updateValue: updateValue,
size: size,
disableAll: disabled
};
}, [size, disabled, variant, mergedValue, updateValue]);
var clickHandler = function clickHandler(event) {
event.stopPropagation();
event.nativeEvent.stopImmediatePropagation();
event.preventDefault();
if (disabled) return;
setVisible(!visible);
};
var clickawayHandler = useCallback(function () {
return setVisible(false);
}, []);
useClickAway(domRef, clickawayHandler);
var selectedChild = useMemo(function () {
var _pickChildByProps = pickChildByProps(children, 'value', mergedValue),
_pickChildByProps2 = _slicedToArray(_pickChildByProps, 2),
optionChildren = _pickChildByProps2[1];
return React.Children.map(optionChildren, function (child) {
if (!React.isValidElement(child)) return null;
var el = React.cloneElement(child, {
preventAllEvents: true
});
if (!multiple) return el;
return /*#__PURE__*/React.createElement(SelectMultipleValue, {
size: sizes.fontSize,
disabled: disabled
}, el);
});
}, [mergedValue, children, multiple]);
return /*#__PURE__*/React.createElement(SelectContext.Provider, {
value: initialValue
}, /*#__PURE__*/React.createElement("div", _extends({
ref: domRef,
onClick: clickHandler
}, props, {
className: _JSXStyle.dynamic([["2795178518", [disabled ? 'not-allowed' : 'pointer', width, theme.expressiveness.L1, theme.expressiveness.cLineStyle1, colors.border, theme.expressiveness.R2, theme.layout.gapHalf, theme.layout.gap, sizes.height, colors.bgColor, theme.expressiveness.R2, theme.expressiveness.D2, theme.palette.cNeutral8, theme.layout.gapHalf, sizes.height, theme.layout.gapQuarter, sizes.fontSize, theme.layout.gapQuarter, theme.layout.gapHalf, colors.hoverBorder, colors.hoverBgColor, colors.hoverColor, colors.placeholderColor, sizes.fontSize, sizes.fontSize, colors.color, sizes.fontSize, theme.expressiveness.L1, theme.expressiveness.cLineStyle1, colors.placeholderColor, theme.layout.gapHalf, sizes.fontSize, visible ? '180' : '0', colors.color]]]) + " " + (props && props.className != null && props.className || "select ".concat(multiple ? 'multiple' : '', " ").concat(variant || 'line', " ").concat(className))
}), isEmpty && /*#__PURE__*/React.createElement("span", {
className: _JSXStyle.dynamic([["2795178518", [disabled ? 'not-allowed' : 'pointer', width, theme.expressiveness.L1, theme.expressiveness.cLineStyle1, colors.border, theme.expressiveness.R2, theme.layout.gapHalf, theme.layout.gap, sizes.height, colors.bgColor, theme.expressiveness.R2, theme.expressiveness.D2, theme.palette.cNeutral8, theme.layout.gapHalf, sizes.height, theme.layout.gapQuarter, sizes.fontSize, theme.layout.gapQuarter, theme.layout.gapHalf, colors.hoverBorder, colors.hoverBgColor, colors.hoverColor, colors.placeholderColor, sizes.fontSize, sizes.fontSize, colors.color, sizes.fontSize, theme.expressiveness.L1, theme.expressiveness.cLineStyle1, colors.placeholderColor, theme.layout.gapHalf, sizes.fontSize, visible ? '180' : '0', colors.color]]]) + " " + "value placeholder"
}, /*#__PURE__*/React.createElement(Ellipsis, {
height: sizes.height
}, placeholder)), mergedValue && !multiple && /*#__PURE__*/React.createElement("span", {
className: _JSXStyle.dynamic([["2795178518", [disabled ? 'not-allowed' : 'pointer', width, theme.expressiveness.L1, theme.expressiveness.cLineStyle1, colors.border, theme.expressiveness.R2, theme.layout.gapHalf, theme.layout.gap, sizes.height, colors.bgColor, theme.expressiveness.R2, theme.expressiveness.D2, theme.palette.cNeutral8, theme.layout.gapHalf, sizes.height, theme.layout.gapQuarter, sizes.fontSize, theme.layout.gapQuarter, theme.layout.gapHalf, colors.hoverBorder, colors.hoverBgColor, colors.hoverColor, colors.placeholderColor, sizes.fontSize, sizes.fontSize, colors.color, sizes.fontSize, theme.expressiveness.L1, theme.expressiveness.cLineStyle1, colors.placeholderColor, theme.layout.gapHalf, sizes.fontSize, visible ? '180' : '0', colors.color]]]) + " " + "value"
}, selectedChild), mergedValue && multiple && /*#__PURE__*/React.createElement(Grid.Container, {
gap: 0.5
}, selectedChild), /*#__PURE__*/React.createElement(Dropdown, {
parent: domRef,
visible: visible,
disableMatchWidth: disableMatchWidth
}, /*#__PURE__*/React.createElement("div", {
style: dropdownStyle,
className: _JSXStyle.dynamic([["2795178518", [disabled ? 'not-allowed' : 'pointer', width, theme.expressiveness.L1, theme.expressiveness.cLineStyle1, colors.border, theme.expressiveness.R2, theme.layout.gapHalf, theme.layout.gap, sizes.height, colors.bgColor, theme.expressiveness.R2, theme.expressiveness.D2, theme.palette.cNeutral8, theme.layout.gapHalf, sizes.height, theme.layout.gapQuarter, sizes.fontSize, theme.layout.gapQuarter, theme.layout.gapHalf, colors.hoverBorder, colors.hoverBgColor, colors.hoverColor, colors.placeholderColor, sizes.fontSize, sizes.fontSize, colors.color, sizes.fontSize, theme.expressiveness.L1, theme.expressiveness.cLineStyle1, colors.placeholderColor, theme.layout.gapHalf, sizes.fontSize, visible ? '180' : '0', colors.color]]]) + " " + "select-dropdown ".concat(dropdownClassName)
}, children)), !pure && /*#__PURE__*/React.createElement("div", {
className: _JSXStyle.dynamic([["2795178518", [disabled ? 'not-allowed' : 'pointer', width, theme.expressiveness.L1, theme.expressiveness.cLineStyle1, colors.border, theme.expressiveness.R2, theme.layout.gapHalf, theme.layout.gap, sizes.height, colors.bgColor, theme.expressiveness.R2, theme.expressiveness.D2, theme.palette.cNeutral8, theme.layout.gapHalf, sizes.height, theme.layout.gapQuarter, sizes.fontSize, theme.layout.gapQuarter, theme.layout.gapHalf, colors.hoverBorder, colors.hoverBgColor, colors.hoverColor, colors.placeholderColor, sizes.fontSize, sizes.fontSize, colors.color, sizes.fontSize, theme.expressiveness.L1, theme.expressiveness.cLineStyle1, colors.placeholderColor, theme.layout.gapHalf, sizes.fontSize, visible ? '180' : '0', colors.color]]]) + " " + "icon"
}, /*#__PURE__*/React.createElement(Icon, {
className: _JSXStyle.dynamic([["2795178518", [disabled ? 'not-allowed' : 'pointer', width, theme.expressiveness.L1, theme.expressiveness.cLineStyle1, colors.border, theme.expressiveness.R2, theme.layout.gapHalf, theme.layout.gap, sizes.height, colors.bgColor, theme.expressiveness.R2, theme.expressiveness.D2, theme.palette.cNeutral8, theme.layout.gapHalf, sizes.height, theme.layout.gapQuarter, sizes.fontSize, theme.layout.gapQuarter, theme.layout.gapHalf, colors.hoverBorder, colors.hoverBgColor, colors.hoverColor, colors.placeholderColor, sizes.fontSize, sizes.fontSize, colors.color, sizes.fontSize, theme.expressiveness.L1, theme.expressiveness.cLineStyle1, colors.placeholderColor, theme.layout.gapHalf, sizes.fontSize, visible ? '180' : '0', colors.color]]])
})), /*#__PURE__*/React.createElement(_JSXStyle, {
id: "2795178518",
dynamic: [disabled ? 'not-allowed' : 'pointer', width, theme.expressiveness.L1, theme.expressiveness.cLineStyle1, colors.border, theme.expressiveness.R2, theme.layout.gapHalf, theme.layout.gap, sizes.height, colors.bgColor, theme.expressiveness.R2, theme.expressiveness.D2, theme.palette.cNeutral8, theme.layout.gapHalf, sizes.height, theme.layout.gapQuarter, sizes.fontSize, theme.layout.gapQuarter, theme.layout.gapHalf, colors.hoverBorder, colors.hoverBgColor, colors.hoverColor, colors.placeholderColor, sizes.fontSize, sizes.fontSize, colors.color, sizes.fontSize, theme.expressiveness.L1, theme.expressiveness.cLineStyle1, colors.placeholderColor, theme.layout.gapHalf, sizes.fontSize, visible ? '180' : '0', colors.color]
}, ".select.__jsx-style-dynamic-selector{display:-webkit-inline-box;display:-webkit-inline-flex;display:-ms-inline-flexbox;display:inline-flex;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;white-space:nowrap;position:relative;cursor:".concat(disabled ? 'not-allowed' : 'pointer', ";max-width:80vw;width:").concat(width, ";overflow:hidden;-webkit-transition:border 0.2s ease 0s,color 0.2s ease-out 0s,box-shadow 0.2s ease 0s;transition:border 0.2s ease 0s,color 0.2s ease-out 0s,box-shadow 0.2s ease 0s;border:").concat(theme.expressiveness.L1, " ").concat(theme.expressiveness.cLineStyle1, " ").concat(colors.border, ";border-radius:").concat(theme.expressiveness.R2, ";padding:0 calc(").concat(theme.layout.gapHalf, " * 1.5) 0 ").concat(theme.layout.gap, ";height:").concat(sizes.height, ";background-color:").concat(colors.bgColor, ";}.select-dropdown.__jsx-style-dynamic-selector{border-radius:").concat(theme.expressiveness.R2, ";box-shadow:").concat(theme.expressiveness.D2, ";background-color:").concat(theme.palette.cNeutral8, ";max-height:15rem;overflow-y:auto;overflow-anchor:none;padding:").concat(theme.layout.gapHalf, " 0;}.multiple.__jsx-style-dynamic-selector{height:auto;min-height:").concat(sizes.height, ";padding:").concat(theme.layout.gapQuarter, " calc(").concat(sizes.fontSize, " * 2) ").concat(theme.layout.gapQuarter, " ").concat(theme.layout.gapHalf, ";}.select.__jsx-style-dynamic-selector:hover{border-color:").concat(colors.hoverBorder, ";background-color:").concat(colors.hoverBgColor, ";}.select.__jsx-style-dynamic-selector:hover .icon.__jsx-style-dynamic-selector,.select.__jsx-style-dynamic-selector:hover .value.__jsx-style-dynamic-selector{color:").concat(colors.hoverColor, ";}.select.__jsx-style-dynamic-selector:hover .placeholder.__jsx-style-dynamic-selector{color:").concat(colors.placeholderColor, ";}.value.__jsx-style-dynamic-selector{display:-webkit-inline-box;display:-webkit-inline-flex;display:-ms-inline-flexbox;display:inline-flex;-webkit-flex:1;-ms-flex:1;flex:1;height:100%;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;line-height:1;font-weight:500;padding:0;margin-right:calc(").concat(sizes.fontSize, " * 1.5);font-size:").concat(sizes.fontSize, ";color:").concat(colors.color, ";width:calc(100% - ").concat(sizes.fontSize, " * 1.5);}.value.__jsx-style-dynamic-selector svg,.multiple.__jsx-style-dynamic-selector svg{display:none;}.value.__jsx-style-dynamic-selector .option,.multiple.__jsx-style-dynamic-selector .option{border:").concat(theme.expressiveness.L1, " ").concat(theme.expressiveness.cLineStyle1, " transparent;}.value.__jsx-style-dynamic-selector>div,.value.__jsx-style-dynamic-selector>div:hover{border-radius:0;background-color:transparent;padding:0;margin:0;color:inherit;}.placeholder.__jsx-style-dynamic-selector{color:").concat(colors.placeholderColor, ";}.icon.__jsx-style-dynamic-selector{position:absolute;right:calc(").concat(theme.layout.gapHalf, " * 1.5);font-size:").concat(sizes.fontSize, ";top:50%;bottom:0;-webkit-transform:translateY(-50%) rotate(").concat(visible ? '180' : '0', "deg);-ms-transform:translateY(-50%) rotate(").concat(visible ? '180' : '0', "deg);transform:translateY(-50%) rotate(").concat(visible ? '180' : '0', "deg);pointer-events:none;-webkit-transition:-webkit-transform 200ms ease;-webkit-transition:transform 200ms ease;transition:transform 200ms ease;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;color:").concat(colors.color, ";}"))));
});
Select.defaultProps = defaultProps;
export default Select;