lucid-ui
Version:
A UI component library from AppNexus.
160 lines (140 loc) • 7.79 kB
JavaScript
import _map from "lodash/map";
import _isEmpty from "lodash/isEmpty";
import _keys from "lodash/keys";
import _get from "lodash/get";
import _noop from "lodash/noop";
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 ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; }
function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
function _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }
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; }
import React from 'react';
import PropTypes from 'react-peek/prop-types';
import MinusCircleIcon from '../Icon/MinusCircleIcon/MinusCircleIcon';
import SuccessIcon from '../Icon/SuccessIcon/SuccessIcon';
import CloseIcon from '../Icon/CloseIcon/CloseIcon';
import InfoIcon from '../Icon/InfoIcon/InfoIcon';
import WarningIcon from '../Icon/WarningIcon/WarningIcon';
import { lucidClassNames } from '../../util/style-helpers';
import { omitProps, getFirst } from '../../util/component-types';
var createElement = React.createElement;
var bool = PropTypes.bool,
func = PropTypes.func,
string = PropTypes.string,
node = PropTypes.node,
oneOf = PropTypes.oneOf;
var cx = lucidClassNames.bind('&-Selection');
function defaultIcon(kind, responsiveMode) {
return kind === 'default' ? null : kind === 'container' ? null : kind === 'success' ? /*#__PURE__*/React.createElement(SuccessIcon, {
className: cx('&-Icon', "&-Icon-is-".concat(responsiveMode))
}) : kind === 'danger' ? /*#__PURE__*/React.createElement(MinusCircleIcon, {
className: cx('&-Icon', "&-Icon-is-".concat(responsiveMode))
}) : kind === 'info' ? /*#__PURE__*/React.createElement(InfoIcon, {
className: cx('&-Icon', "&-Icon-is-".concat(responsiveMode))
}) : kind === 'warning' ? /*#__PURE__*/React.createElement(WarningIcon, {
className: cx('&-Icon', "&-Icon-is-".concat(responsiveMode))
}) : null;
}
var SelectionIcon = function SelectionIcon() {
return null;
};
SelectionIcon.peek = {
description: "\n Icon that is displayed within the Selection. Any of the lucid `*Icon` components should work.\n "
};
SelectionIcon.displayName = 'Selection.Icon';
SelectionIcon.propName = 'Icon';
var SelectionLabel = function SelectionLabel() {
return null;
};
SelectionLabel.peek = {
description: "\n Label for the Selection.\n "
};
SelectionLabel.displayName = 'Selection.Label';
SelectionLabel.propName = 'Label';
var defaultProps = {
isRemovable: true,
onRemove: _noop,
hasBackground: false,
isBold: false,
kind: 'default',
responsiveMode: 'large'
};
var Selection = function Selection(props) {
var className = props.className,
isRemovable = props.isRemovable,
children = props.children,
hasBackground = props.hasBackground,
isBold = props.isBold,
isFilled = props.isFilled,
isTop = props.isTop,
kind = props.kind,
onRemove = props.onRemove,
responsiveMode = props.responsiveMode,
passThroughs = _objectWithoutProperties(props, ["className", "isRemovable", "children", "hasBackground", "isBold", "isFilled", "isTop", "kind", "onRemove", "responsiveMode"]);
var isSmall = responsiveMode === 'small';
var labelProps = _get(getFirst(props, Selection.Label), 'props', {});
var iconElement = getFirst(props, Selection.Icon);
var iconChildren = _get(iconElement, 'props.children');
var icon = iconChildren ? createElement(iconChildren.type, _objectSpread(_objectSpread({}, iconChildren.props), {}, {
className: cx('&-Icon', iconChildren.props.className)
})) : defaultIcon(kind, responsiveMode);
return /*#__PURE__*/React.createElement("div", _extends({}, omitProps(passThroughs, undefined, _keys(Selection.propTypes)), {
className: cx('&', "&-is-".concat(responsiveMode), kind && "&-".concat(kind), {
'&-has-background': hasBackground,
'&-is-bold': isBold,
'&-is-filled': isFilled,
'&-is-top': isTop,
'&-no-title': _isEmpty(labelProps)
}, className)
}), icon, /*#__PURE__*/React.createElement("div", {
className: cx('&-content')
}, /*#__PURE__*/React.createElement("div", {
className: cx('&-label-container')
}, /*#__PURE__*/React.createElement("span", _extends({}, labelProps, {
className: cx('&-label', isSmall && '&-label-is-small')
})), isRemovable ? /*#__PURE__*/React.createElement(CloseIcon, {
isClickable: true,
size: !isSmall ? 8 : 16,
className: cx('&-close-button', isSmall && '&-close-button-is-small'),
onClick: function onClick(_ref) {
var event = _ref.event;
onRemove({
event: event,
props: props
});
}
}) : null), !_isEmpty(children) && /*#__PURE__*/React.createElement("div", {
className: cx('&-children-container')
}, _map(React.Children.toArray(children), function (child, i) {
if ( /*#__PURE__*/React.isValidElement(child) && child.type === Selection) {
return /*#__PURE__*/React.createElement(Selection, _extends({
key: _get(getFirst(child.props, Selection.Label), ['props', 'children'], {}) + i
}, child.props));
}
return child;
}))));
};
Selection.displayName = 'Selection';
Selection.Icon = SelectionIcon;
Selection.Label = SelectionLabel;
Selection.peek = {
description: "\n Used to indicate selections. Selection is very similar to `Tag` but is meant\n to be used in areas of the UI that have more space available to them.\n ",
categories: ['communication']
};
Selection.defaultProps = defaultProps;
Selection.propTypes = {
className: string,
kind: oneOf(['default', 'container', 'success', 'danger', 'info', 'warning']),
isTop: bool,
isFilled: bool,
isRemovable: bool,
hasBackground: bool,
isBold: bool,
onRemove: func,
Label: node,
Icon: node,
children: node,
responsiveMode: oneOf(['small', 'medium', 'large'])
};
export default Selection;