lucid-ui
Version:
A UI component library from AppNexus.
283 lines (233 loc) • 12.4 kB
JavaScript
function _typeof(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); }
import _keys from "lodash/keys";
import _get from "lodash/get";
import _clamp from "lodash/clamp";
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 _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; }
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }
function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }
function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); if (superClass) _setPrototypeOf(subClass, superClass); }
function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); }
function _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = _getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; }
function _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === "object" || typeof call === "function")) { return call; } return _assertThisInitialized(self); }
function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; }
function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Date.prototype.toString.call(Reflect.construct(Date, [], function () {})); return true; } catch (e) { return false; } }
function _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); }
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; }
import React from 'react';
import PropTypes from 'react-peek/prop-types';
import { lucidClassNames } from '../../util/style-helpers';
import Overlay from '../Overlay/Overlay';
import GripperVerticalIcon from '../Icon/GripperVerticalIcon/GripperVerticalIcon';
import CloseIcon from '../Icon/CloseIcon/CloseIcon';
import DragCaptureZone from '../DragCaptureZone/DragCaptureZone';
import Button from '../Button/Button';
import { getFirst, omitProps } from '../../util/component-types';
var cx = lucidClassNames.bind('&-SidePanel');
var any = PropTypes.any,
bool = PropTypes.bool,
func = PropTypes.func,
oneOf = PropTypes.oneOf,
node = PropTypes.node,
number = PropTypes.number,
string = PropTypes.string,
oneOfType = PropTypes.oneOfType;
var SidePanelHeader = function SidePanelHeader(_props) {
return null;
};
SidePanelHeader.displayName = 'SidePanel.Header';
SidePanelHeader.propName = 'Header';
SidePanelHeader.peek = {
description: "\n\t\tDefines the Header content of SidePanel. If no content is defined, it will\n\t\tstill show the close button.\n\t"
};
SidePanelHeader.propTypes = {
children: node
};
var SidePanel = /*#__PURE__*/function (_React$Component) {
_inherits(SidePanel, _React$Component);
var _super = _createSuper(SidePanel);
function SidePanel() {
var _this;
_classCallCheck(this, SidePanel);
for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
args[_key] = arguments[_key];
}
_this = _super.call.apply(_super, [this].concat(args));
_defineProperty(_assertThisInitialized(_this), "state", {
isResizing: false,
width: _this.props.width,
startWidth: _this.props.width,
isExpanded: _this.props.isExpanded
});
_defineProperty(_assertThisInitialized(_this), "timerId", setTimeout(function () {
return;
}, 1));
_defineProperty(_assertThisInitialized(_this), "handleResizeStart", function () {
_this.setState({
isResizing: true
});
});
_defineProperty(_assertThisInitialized(_this), "handleResize", function (_ref) {
var dX = _ref.dX;
var startWidth = _this.state.startWidth;
var position = startWidth + dX * (_this.props.position === 'right' ? -1 : 1);
_this.setState({
width: _clamp(position, _this.props.minWidth, _this.props.maxWidth === Infinity ? window.innerWidth : _this.props.maxWidth)
});
});
_defineProperty(_assertThisInitialized(_this), "handleResizeEnd", function (_ref2, _ref3) {
var dX = _ref2.dX;
var event = _ref3.event;
var _this$state = _this.state,
startWidth = _this$state.startWidth,
width = _this$state.width;
_this.setState({
width: startWidth + dX * (_this.props.position === 'right' ? -1 : 1),
isResizing: false,
startWidth: width
});
_this.props.onResize(startWidth - dX, {
props: _this.props,
event: event
});
});
_defineProperty(_assertThisInitialized(_this), "handleCollapse", function (_ref4) {
var event = _ref4.event;
_this.props.onCollapse({
event: event,
props: _this.props
});
});
return _this;
}
_createClass(SidePanel, [{
key: "componentDidUpdate",
value: function componentDidUpdate(prevProps) {
var _this2 = this;
if (prevProps.isExpanded !== this.props.isExpanded) {
this.timerId = setTimeout(function () {
_this2.setState({
isExpanded: _this2.props.isExpanded
});
}, 1);
}
}
}, {
key: "componentWillUnmount",
value: function componentWillUnmount() {
var preventBodyScroll = this.props.preventBodyScroll;
if (this.timerId) {
clearTimeout(this.timerId);
}
if (preventBodyScroll) {
window.document.body.style.overflow = '';
}
}
}, {
key: "render",
value: function render() {
var _this$props = this.props,
children = _this$props.children,
className = _this$props.className,
isAnimated = _this$props.isAnimated,
isExpanded = _this$props.isExpanded,
isResizeDisabled = _this$props.isResizeDisabled,
position = _this$props.position,
preventBodyScroll = _this$props.preventBodyScroll,
topOffset = _this$props.topOffset,
passThroughs = _objectWithoutProperties(_this$props, ["children", "className", "isAnimated", "isExpanded", "isResizeDisabled", "position", "preventBodyScroll", "topOffset"]);
var headerEl = getFirst(this.props, SidePanel.Header);
var headerChildren = _get(headerEl, 'props.children');
if (preventBodyScroll) {
window.document.body.style.overflow = isExpanded ? 'hidden' : '';
}
return /*#__PURE__*/React.createElement(Overlay, _extends({
className: cx('&', {
'&-is-expanded': isExpanded && this.state.isExpanded,
'&-position-left': position === 'left',
'&-position-right': position === 'right',
'&-is-animated': isAnimated
}, className),
isShown: isExpanded || this.state.isExpanded,
onBackgroundClick: this.handleCollapse,
onEscape: this.handleCollapse,
isAnimated: isAnimated,
style: {
marginTop: topOffset
}
}, omitProps(passThroughs, undefined, _keys(SidePanel.propTypes), false)), /*#__PURE__*/React.createElement("div", {
className: cx('&-pane'),
style: {
width: this.state.width,
marginTop: topOffset
}
}, headerEl && /*#__PURE__*/React.createElement("div", {
className: cx('&-header')
}, /*#__PURE__*/React.createElement("div", {
className: cx('&-header-inner-wrapper')
}, /*#__PURE__*/React.createElement("div", {
className: cx('&-header-content')
}, headerChildren), /*#__PURE__*/React.createElement(Button, {
className: cx('&-header-closer-button'),
kind: "invisible",
onClick: this.handleCollapse,
hasOnlyIcon: true
}, /*#__PURE__*/React.createElement(CloseIcon, {
className: cx('&-header-closer'),
isClickable: true,
size: 14
})))), /*#__PURE__*/React.createElement("div", {
className: cx('&-body')
}, !isResizeDisabled && /*#__PURE__*/React.createElement(DragCaptureZone, {
className: cx('&-grabber'),
onDragStart: this.handleResizeStart,
onDrag: this.handleResize,
onDragEnd: this.handleResizeEnd
}, /*#__PURE__*/React.createElement(GripperVerticalIcon, {
width: "20"
})), /*#__PURE__*/React.createElement("div", {
className: cx('&-content')
}, children))));
}
}]);
return SidePanel;
}(React.Component);
_defineProperty(SidePanel, "displayName", 'SidePanel');
_defineProperty(SidePanel, "peek", {
description: "\n\t\t\tA fixed-positioned overlay positioned on the side of the screen at full\n\t\t\tscreen height. Supports variable widths resized by the user or defined as a\n\t\t\tprop. Animated collapse and expand with optional Header and closer.\n\t\t",
categories: ['layout']
});
_defineProperty(SidePanel, "propTypes", {
children: node,
className: string,
Header: any,
isAnimated: bool,
isExpanded: bool,
isResizeDisabled: bool,
onCollapse: func,
onResize: func,
position: oneOf(['left', 'right']),
preventBodyScroll: bool,
width: number,
minWidth: number,
maxWidth: number,
topOffset: oneOfType([number, string])
});
_defineProperty(SidePanel, "defaultProps", {
isAnimated: true,
isExpanded: true,
isResizeDisabled: false,
onCollapse: _noop,
onResize: _noop,
position: 'right',
preventBodyScroll: false,
topOffset: 0,
width: 240,
minWidth: -Infinity,
maxWidth: Infinity
});
_defineProperty(SidePanel, "Header", SidePanelHeader);
export default SidePanel;