@streetscape.gl/monochrome
Version:
A toolkit of React components for streetscape.gl
454 lines (387 loc) • 16.5 kB
JavaScript
"use strict";
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports["default"] = exports.TRIGGERS = exports.POSITIONS = void 0;
var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck"));
var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass"));
var _assertThisInitialized2 = _interopRequireDefault(require("@babel/runtime/helpers/assertThisInitialized"));
var _inherits2 = _interopRequireDefault(require("@babel/runtime/helpers/inherits"));
var _possibleConstructorReturn2 = _interopRequireDefault(require("@babel/runtime/helpers/possibleConstructorReturn"));
var _getPrototypeOf2 = _interopRequireDefault(require("@babel/runtime/helpers/getPrototypeOf"));
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
var _react = _interopRequireDefault(require("react"));
var _propTypes = _interopRequireDefault(require("prop-types"));
var _popper = _interopRequireDefault(require("popper.js"));
var _styled = _interopRequireDefault(require("@emotion/styled"));
var _theme = require("../theme");
var _utils = require("./utils");
function _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = (0, _getPrototypeOf2["default"])(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = (0, _getPrototypeOf2["default"])(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return (0, _possibleConstructorReturn2["default"])(this, result); }; }
function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } }
function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); 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 = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { (0, _defineProperty2["default"])(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
var isBrowser = typeof document !== 'undefined' && Boolean(document.createElement);
var POSITIONS = {
TOP: 'top',
RIGHT: 'right',
BOTTOM: 'bottom',
LEFT: 'left',
AUTO: 'auto'
};
exports.POSITIONS = POSITIONS;
var TRIGGERS = {
CLICK: 'click',
HOVER: 'hover'
};
exports.TRIGGERS = TRIGGERS;
var DEFAULT_ARROW_SIZE = 6;
var DEFAULT_BORDER_WIDTH = 1;
var PopoverComponent = _styled["default"].div(function (props) {
return _objectSpread({
display: 'inline-flex'
}, (0, _theme.evaluateStyle)(props.userStyle, props));
});
var PopoverTarget = _styled["default"].div(function (props) {
return _objectSpread({}, (0, _theme.evaluateStyle)(props.userStyle, props));
});
var PopoverContent = _styled["default"].div(function (props) {
return _objectSpread({}, (0, _theme.evaluateStyle)(props.userStyle, props));
});
var PopoverBody = _styled["default"].div(function (props) {
var style = null;
if (props.position && props.position !== POSITIONS.AUTO && props.arrowSize) {
style = (0, _defineProperty2["default"])({}, "margin".concat((0, _utils.capitalize)((0, _utils.getOppositePosition)(props.position))), props.arrowSize);
}
return _objectSpread(_objectSpread(_objectSpread(_objectSpread({}, props.theme.__reset__), style), {}, {
position: 'absolute',
top: 0,
left: 0,
zIndex: 99,
background: props.background || props.theme.background,
borderStyle: 'solid',
borderWidth: props.borderWidth,
borderColor: props.borderColor || props.theme.controlColorPrimary,
boxShadow: props.theme.shadow,
fontFamily: props.theme.fontFamily,
fontSize: props.theme.fontSize,
fontWeight: 'normal'
}, props.popperStyles), (0, _theme.evaluateStyle)(props.userStyle, props));
});
var OuterArrow = _styled["default"].div(function (props) {
var position = props.position,
arrowSize = props.arrowSize,
popperOffsets = props.popperOffsets;
if (!arrowSize) {
return null;
}
var arrowOffsets = popperOffsets.arrow || {};
var style = (0, _defineProperty2["default"])({
borderColor: props.borderColor || props.theme.controlColorPrimary
}, (0, _utils.getOppositePosition)(position), -arrowSize);
if (arrowOffsets.top) {
style.top = arrowOffsets.top;
}
if (arrowOffsets.left) {
style.left = arrowOffsets.left;
}
return Object.assign(style, (0, _theme.evaluateStyle)(props.userStyle, props), (0, _utils.generateTriangleStyles)(position, arrowSize));
});
var InnerArrow = _styled["default"].div(function (props) {
var position = props.position,
arrowSize = props.arrowSize;
if (!arrowSize) {
return null;
}
var isVertical = position === POSITIONS.TOP || position === POSITIONS.BOTTOM;
var style = {
borderColor: props.background || props.theme.background
};
if (isVertical) {
style.left = -arrowSize;
style.top = position === POSITIONS.TOP ? -arrowSize : 0;
style.marginTop = (position === POSITIONS.TOP ? -1 : 1) * props.borderWidth;
} else {
style.top = -arrowSize;
style.left = position === POSITIONS.LEFT ? -arrowSize : 0;
style.marginLeft = (position === POSITIONS.LEFT ? -1 : 1) * props.borderWidth;
}
return Object.assign(style, (0, _theme.evaluateStyle)(props.userStyle, props), (0, _utils.generateTriangleStyles)(position, arrowSize));
});
var POSITIONS_PROP_TYPE = _propTypes["default"].oneOf([POSITIONS.TOP, POSITIONS.RIGHT, POSITIONS.BOTTOM, POSITIONS.LEFT, POSITIONS.AUTO]);
var Popover = function (_React$Component) {
(0, _inherits2["default"])(Popover, _React$Component);
var _super = _createSuper(Popover);
function Popover(props) {
var _this;
(0, _classCallCheck2["default"])(this, Popover);
_this = _super.call(this, props);
(0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "_handleTargetClick", function () {
_this._togglePopover();
});
(0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "_handleTargetMouseEnter", function () {
clearTimeout(_this.hideTimer);
_this._showPopover();
});
(0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "_handleTargetMouseLeave", function () {
_this._hidePopoverWithDelay();
});
(0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "_handlePopoverMouseEnter", function () {
clearTimeout(_this.hideTimer);
});
(0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "_handlePopoverMouseLeave", function () {
_this._hidePopoverWithDelay();
});
(0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "_handleKeyPress", function (evt) {
if (evt.key === 'Escape') {
_this._hidePopover();
}
});
(0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "_handlePopperUpdate", function (data) {
_this.setState({
popperOffsets: data.offsets,
popperPlacement: data.placement,
popperStyles: data.styles
});
return data;
});
(0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "_hidePopover", function () {
_this.setState(_this._getDefaultState(_this.props));
_this._destroyPopover();
});
(0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "_handleDocumentClick", function (evt) {
if (!_this.$popper || (0, _utils.nodeHasParent)(evt.target, _this.$popper) || (0, _utils.nodeHasParent)(evt.target, _this.$target)) {
return;
}
_this._hidePopover();
});
_this.state = _this._getDefaultState(props);
return _this;
}
(0, _createClass2["default"])(Popover, [{
key: "componentDidUpdate",
value: function componentDidUpdate(prevProps, prevState) {
if (this.state.isVisible && !prevState.isVisible) {
var PopperClass = this.props.popperClass;
this.popper = new PopperClass(this.$target, this.$popper, {
placement: this.state.popperPlacement,
modifiers: {
arrow: {
element: this.$arrow,
enabled: true
},
applyStyle: {
enabled: false
},
applyReactStyle: {
enabled: true,
fn: this._handlePopperUpdate,
order: 900
}
}
});
if (this.props.trigger === TRIGGERS.CLICK) {
this._addClickEvents();
}
}
}
}, {
key: "componentWillUnmount",
value: function componentWillUnmount() {
this._destroyPopover();
this._removeClickEvents();
}
}, {
key: "_getDefaultState",
value: function _getDefaultState(props) {
return {
isVisible: false,
popperOffsets: {},
popperPlacement: (0, _utils.positionsToPopperPlacement)(props.position, props.arrowPosition),
popperStyles: {}
};
}
}, {
key: "_showPopover",
value: function _showPopover() {
this.setState({
isVisible: true
});
}
}, {
key: "_hidePopoverWithDelay",
value: function _hidePopoverWithDelay() {
var onMouseOutDelay = this.props.onMouseOutDelay;
if (onMouseOutDelay) {
this.hideTimer = setTimeout(this._hidePopover, onMouseOutDelay);
return;
}
this._hidePopover();
}
}, {
key: "_addClickEvents",
value: function _addClickEvents() {
if (!isBrowser) {
return;
}
document.addEventListener('mousedown', this._handleDocumentClick);
document.addEventListener('keyup', this._handleKeyPress);
}
}, {
key: "_removeClickEvents",
value: function _removeClickEvents() {
if (!isBrowser) {
return;
}
document.removeEventListener('mousedown', this._handleDocumentClick);
document.removeEventListener('keyup', this._handleKeyPress);
}
}, {
key: "_togglePopover",
value: function _togglePopover() {
var isVisible = !this.state.isVisible;
this.setState({
isVisible: isVisible
});
if (!isVisible) {
this._destroyPopover();
}
}
}, {
key: "_destroyPopover",
value: function _destroyPopover() {
if (this.popper) {
this.popper.destroy();
delete this.popper;
}
if (this.props.trigger === TRIGGERS.CLICK) {
this._removeClickEvents();
}
}
}, {
key: "_renderTarget",
value: function _renderTarget(styleProps) {
var _this2 = this;
var _this$props = this.props,
trigger = _this$props.trigger,
style = _this$props.style;
var interactionProps = {};
if (trigger === TRIGGERS.HOVER) {
interactionProps.onMouseEnter = this._handleTargetMouseEnter;
interactionProps.onMouseLeave = this._handleTargetMouseLeave;
} else if (trigger === TRIGGERS.CLICK) {
interactionProps.onClick = this._handleTargetClick;
}
return _react["default"].createElement(PopoverTarget, (0, _extends2["default"])({}, interactionProps, {
userStyle: style.target
}, styleProps, {
ref: function ref(el) {
_this2.$target = el;
}
}), this.props.children);
}
}, {
key: "_renderArrow",
value: function _renderArrow(styleProps) {
var _this3 = this;
var style = this.props.style;
return _react["default"].createElement(OuterArrow, (0, _extends2["default"])({
userStyle: style.arrowBorder
}, styleProps, {
ref: function ref(el) {
_this3.$arrow = el;
}
}), _react["default"].createElement(InnerArrow, (0, _extends2["default"])({
userStyle: style.arrow
}, styleProps)));
}
}, {
key: "_renderBody",
value: function _renderBody(styleProps) {
var _this4 = this;
var _this$props2 = this.props,
className = _this$props2.className,
style = _this$props2.style,
trigger = _this$props2.trigger;
var interactionProps = {};
if (trigger === TRIGGERS.HOVER) {
interactionProps.onMouseEnter = this._handlePopoverMouseEnter;
interactionProps.onMouseLeave = this._handlePopoverMouseLeave;
}
return _react["default"].createElement(PopoverBody, (0, _extends2["default"])({
className: className
}, interactionProps, {
userStyle: style.body
}, styleProps, {
ref: function ref(el) {
_this4.$popper = el;
}
}), this._renderContent(styleProps), this._renderArrow(styleProps));
}
}, {
key: "_renderContent",
value: function _renderContent(styleProps) {
var content = typeof this.props.content === 'function' ? this.props.content() : this.props.content;
return _react["default"].createElement(PopoverContent, (0, _extends2["default"])({
userStyle: this.props.style.content
}, styleProps), content);
}
}, {
key: "render",
value: function render() {
var _this$props3 = this.props,
theme = _this$props3.theme,
style = _this$props3.style;
var _this$state = this.state,
isVisible = _this$state.isVisible,
popperPlacement = _this$state.popperPlacement,
popperStyles = _this$state.popperStyles,
popperOffsets = _this$state.popperOffsets;
var _popperPlacement$spli = popperPlacement.split('-'),
_popperPlacement$spli2 = (0, _slicedToArray2["default"])(_popperPlacement$spli, 1),
position = _popperPlacement$spli2[0];
var arrowPosition = position === POSITIONS.AUTO ? POSITIONS.TOP : position;
var styleProps = {
theme: theme,
arrowSize: 'arrowSize' in style ? style.arrowSize : DEFAULT_ARROW_SIZE,
background: style.background,
borderWidth: 'borderWidth' in style ? style.borderWidth : DEFAULT_BORDER_WIDTH,
borderColor: style.borderColor,
position: position,
arrowPosition: arrowPosition,
popperStyles: popperStyles,
popperOffsets: popperOffsets,
isActive: isVisible
};
return _react["default"].createElement(PopoverComponent, (0, _extends2["default"])({
userStyle: style.popover
}, styleProps), this._renderTarget(styleProps), isVisible && this._renderBody(styleProps));
}
}]);
return Popover;
}(_react["default"].Component);
(0, _defineProperty2["default"])(Popover, "propTypes", {
className: _propTypes["default"].string,
style: _propTypes["default"].object,
content: _propTypes["default"].oneOfType([_propTypes["default"].node, _propTypes["default"].func]).isRequired,
position: POSITIONS_PROP_TYPE,
arrowPosition: POSITIONS_PROP_TYPE,
onMouseOutDelay: _propTypes["default"].number,
trigger: _propTypes["default"].oneOf([TRIGGERS.HOVER, TRIGGERS.CLICK]),
popperClass: _propTypes["default"].func
});
(0, _defineProperty2["default"])(Popover, "defaultProps", {
className: '',
style: {},
trigger: TRIGGERS.CLICK,
onMouseOutDelay: 0,
popperClass: _popper["default"]
});
var ThemedPopover = (0, _theme.withTheme)(Popover);
Object.assign(ThemedPopover, POSITIONS);
Object.assign(ThemedPopover, TRIGGERS);
var _default = ThemedPopover;
exports["default"] = _default;
//# sourceMappingURL=popover.js.map