selectly
Version:
Build custom, accessible, select menus for React.
1,377 lines (1,137 loc) • 183 kB
JavaScript
/*!
* Selectly 0.5.0
* https://github.com/souporserious/selectly
* Copyright (c) 2017 Selectly Authors
*/
(function webpackUniversalModuleDefinition(root, factory) {
if(typeof exports === 'object' && typeof module === 'object')
module.exports = factory(require("react-aria"), require("react"), require("react-dom"), require("react-measure"), require("tabbable"));
else if(typeof define === 'function' && define.amd)
define(["react-aria", "react", "react-dom", "react-measure", "tabbable"], factory);
else if(typeof exports === 'object')
exports["Selectly"] = factory(require("react-aria"), require("react"), require("react-dom"), require("react-measure"), require("tabbable"));
else
root["Selectly"] = factory(root["ReactARIA"], root["React"], root["ReactDOM"], root["Measure"], root["tabbable"]);
})(this, function(__WEBPACK_EXTERNAL_MODULE_1__, __WEBPACK_EXTERNAL_MODULE_3__, __WEBPACK_EXTERNAL_MODULE_4__, __WEBPACK_EXTERNAL_MODULE_13__, __WEBPACK_EXTERNAL_MODULE_16__) {
return /******/ (function(modules) { // webpackBootstrap
/******/ // The module cache
/******/ var installedModules = {};
/******/ // The require function
/******/ function __webpack_require__(moduleId) {
/******/ // Check if module is in cache
/******/ if(installedModules[moduleId])
/******/ return installedModules[moduleId].exports;
/******/ // Create a new module (and put it into the cache)
/******/ var module = installedModules[moduleId] = {
/******/ exports: {},
/******/ id: moduleId,
/******/ loaded: false
/******/ };
/******/ // Execute the module function
/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
/******/ // Flag the module as loaded
/******/ module.loaded = true;
/******/ // Return the exports of the module
/******/ return module.exports;
/******/ }
/******/ // expose the modules object (__webpack_modules__)
/******/ __webpack_require__.m = modules;
/******/ // expose the module cache
/******/ __webpack_require__.c = installedModules;
/******/ // __webpack_public_path__
/******/ __webpack_require__.p = "dist/";
/******/ // Load entry module and return exports
/******/ return __webpack_require__(0);
/******/ })
/************************************************************************/
/******/ ([
/* 0 */
/***/ function(module, exports, __webpack_require__) {
'use strict';
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.Option = exports.OptionList = exports.Trigger = exports.Select = exports.utils = undefined;
var _reactAria = __webpack_require__(1);
var _Select = __webpack_require__(2);
var _Select2 = _interopRequireDefault(_Select);
var _buildOptionsLookup = __webpack_require__(18);
var _buildOptionsLookup2 = _interopRequireDefault(_buildOptionsLookup);
var _getCurrentOptions = __webpack_require__(19);
var _getCurrentOptions2 = _interopRequireDefault(_getCurrentOptions);
var _getToggledValues = __webpack_require__(20);
var _getToggledValues2 = _interopRequireDefault(_getToggledValues);
var _getAllValues = __webpack_require__(21);
var _getAllValues2 = _interopRequireDefault(_getAllValues);
var _isOptionSelected = __webpack_require__(22);
var _isOptionSelected2 = _interopRequireDefault(_isOptionSelected);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
var OptionList = _reactAria.Select.OptionList,
Option = _reactAria.Select.Option;
var utils = exports.utils = {
buildOptionsLookup: _buildOptionsLookup2.default,
getCurrentOptions: _getCurrentOptions2.default,
getToggledValues: _getToggledValues2.default,
getAllValues: _getAllValues2.default,
isOptionSelected: _isOptionSelected2.default
};
exports.Select = _Select2.default;
exports.Trigger = _reactAria.Trigger;
exports.OptionList = OptionList;
exports.Option = Option;
/***/ },
/* 1 */
/***/ function(module, exports) {
module.exports = __WEBPACK_EXTERNAL_MODULE_1__;
/***/ },
/* 2 */
/***/ function(module, exports, __webpack_require__) {
'use strict';
Object.defineProperty(exports, "__esModule", {
value: true
});
var _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"]) _i["return"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError("Invalid attempt to destructure non-iterable instance"); } }; }();
var _createClass = 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); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
var _react = __webpack_require__(3);
var _react2 = _interopRequireDefault(_react);
var _reactDom = __webpack_require__(4);
var _reactDom2 = _interopRequireDefault(_reactDom);
var _reactAria = __webpack_require__(1);
var _reactPopper = __webpack_require__(5);
var _reactMeasure = __webpack_require__(13);
var _reactMeasure2 = _interopRequireDefault(_reactMeasure);
var _reactTravel = __webpack_require__(14);
var _reactTravel2 = _interopRequireDefault(_reactTravel);
var _tabbable = __webpack_require__(16);
var _tabbable2 = _interopRequireDefault(_tabbable);
var _childrenPropType = __webpack_require__(17);
var _childrenPropType2 = _interopRequireDefault(_childrenPropType);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
var SelectManager = _reactAria.Select.Manager;
var Select = function (_Component) {
_inherits(Select, _Component);
function Select() {
var _ref;
var _temp, _this, _ret;
_classCallCheck(this, Select);
for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) {
args[_key] = arguments[_key];
}
return _ret = (_temp = (_this = _possibleConstructorReturn(this, (_ref = Select.__proto__ || Object.getPrototypeOf(Select)).call.apply(_ref, [this].concat(args))), _this), _this.state = {
isOpen: false,
width: null,
currentOption: {}
}, _this._handleMeasure = function (_ref2) {
var width = _ref2.width;
if (_this.props.autoWidth) {
_this.setState({ width: width });
}
}, _this._handleTrigger = function (firstChild, event) {
_this.setState(function (state) {
return { isOpen: !state.isOpen };
});
if (typeof firstChild.props.onTrigger === 'function') {
firstChild.props.onTrigger(event);
}
}, _this._handleTriggerKeyDown = function (firstChild, event) {
// determine if we need to move focus to the options menu when pressing tab
// while the menu is open
if (event.key === 'Tab' && _this.state.isOpen) {
// without setTimeout it will focus the second tabbable item, need to figure
// out why this is happening
setTimeout(function () {
var tabbableChildren = (0, _tabbable2.default)((0, _reactDom.findDOMNode)(_this._optionsList));
if (tabbableChildren.length) {
tabbableChildren[0].focus();
} else {
_this.setOpen(false);
}
});
}
if (typeof firstChild.props.onKeyDown === 'function') {
firstChild.props.onKeyDown(event);
}
}, _temp), _possibleConstructorReturn(_this, _ret);
}
_createClass(Select, [{
key: 'componentWillReceiveProps',
value: function componentWillReceiveProps(nextProps) {
// if there is an incoming disabled prop we need to make sure the options get closed
if (this.props.disabled !== nextProps.disabled && nextProps.disabled === true) {
this.setOpen(false);
}
}
}, {
key: 'setOpen',
value: function setOpen(isOpen) {
var cb = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : function () {
return null;
};
this.setState({ isOpen: isOpen }, cb);
}
}, {
key: '_handleRequestClose',
value: function _handleRequestClose(secondChild) {
this.setOpen(false);
if (typeof secondChild.props.onRequestClose === 'function') {
secondChild.props.onRequestClose();
}
}
}, {
key: '_handleOptionSelection',
value: function _handleOptionSelection(secondChild, option, event) {
if (!this.props.multiple) {
this.setOpen(false);
}
// fire our own "onChange" when an option has been selected
this.props.onChange(option);
// store current option for initialFocus
this.setState({ currentOption: option });
if (typeof secondChild.props.onOptionSelection === 'function') {
secondChild.props.onOptionSelection(option, event);
}
}
}, {
key: 'render',
value: function render() {
var _this2 = this;
var _props = this.props,
autoWidth = _props.autoWidth,
renderOverlayTo = _props.renderOverlayTo,
placement = _props.placement,
children = _props.children;
var _state = this.state,
isOpen = _state.isOpen,
width = _state.width,
currentOption = _state.currentOption;
var _Children$toArray = _react.Children.toArray(children),
_Children$toArray2 = _slicedToArray(_Children$toArray, 2),
firstChild = _Children$toArray2[0],
secondChild = _Children$toArray2[1];
return _react2.default.createElement(
SelectManager,
null,
_react2.default.createElement(
_reactPopper.Manager,
null,
_react2.default.createElement(
_reactMeasure2.default,
{ onMeasure: this._handleMeasure },
_react2.default.createElement(
_reactPopper.Target,
{ component: false },
(0, _react.cloneElement)(firstChild, {
isOpen: isOpen,
keybindings: [' '],
onTrigger: this._handleTrigger.bind(this, firstChild),
onKeyDown: this._handleTriggerKeyDown.bind(this, firstChild)
})
)
),
isOpen && _react2.default.createElement(
_reactTravel2.default,
{ renderTo: renderOverlayTo },
_react2.default.createElement(
_reactPopper.Popper,
{
placement: placement,
style: { width: width ? width + 'px' : '' }
},
(0, _react.cloneElement)(secondChild, {
ref: function ref(c) {
return _this2._optionsList = c;
},
initialFocus: currentOption.index,
closeOnOutsideClick: true,
onOptionSelection: this._handleOptionSelection.bind(this, secondChild),
onRequestClose: this._handleRequestClose.bind(this, secondChild)
})
)
)
)
);
}
}, {
key: 'isOpen',
get: function get() {
return this.state.isOpen;
}
}]);
return Select;
}(_react.Component);
Select.propTypes = {
multiple: _react.PropTypes.bool,
disabled: _react.PropTypes.bool,
autoWidth: _react.PropTypes.bool,
placement: _react.PropTypes.any,
renderOverlayTo: _react.PropTypes.any,
onChange: _react.PropTypes.func,
children: _childrenPropType2.default
};
Select.defaultProps = {
multiple: false,
disabled: false,
autoWidth: true,
onChange: function onChange() {
return null;
}
};
exports.default = Select;
module.exports = exports['default'];
/***/ },
/* 3 */
/***/ function(module, exports) {
module.exports = __WEBPACK_EXTERNAL_MODULE_3__;
/***/ },
/* 4 */
/***/ function(module, exports) {
module.exports = __WEBPACK_EXTERNAL_MODULE_4__;
/***/ },
/* 5 */
/***/ function(module, exports, __webpack_require__) {
'use strict';
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.Arrow = exports.Popper = exports.Target = exports.Manager = undefined;
var _Manager2 = __webpack_require__(6);
var _Manager3 = _interopRequireDefault(_Manager2);
var _Target2 = __webpack_require__(7);
var _Target3 = _interopRequireDefault(_Target2);
var _Popper2 = __webpack_require__(8);
var _Popper3 = _interopRequireDefault(_Popper2);
var _Arrow2 = __webpack_require__(12);
var _Arrow3 = _interopRequireDefault(_Arrow2);
function _interopRequireDefault(obj) {
return obj && obj.__esModule ? obj : { default: obj };
}
exports.Manager = _Manager3.default;
exports.Target = _Target3.default;
exports.Popper = _Popper3.default;
exports.Arrow = _Arrow3.default;
/***/ },
/* 6 */
/***/ function(module, exports, __webpack_require__) {
'use strict';
var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; };
Object.defineProperty(exports, "__esModule", {
value: true
});
var _createClass = 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);
}
}return function (Constructor, protoProps, staticProps) {
if (protoProps) defineProperties(Constructor.prototype, protoProps);if (staticProps) defineProperties(Constructor, staticProps);return Constructor;
};
}();
var _react = __webpack_require__(3);
var _react2 = _interopRequireDefault(_react);
var _reactDom = __webpack_require__(4);
var _reactDom2 = _interopRequireDefault(_reactDom);
function _interopRequireDefault(obj) {
return obj && obj.__esModule ? obj : { default: obj };
}
function _objectWithoutProperties(obj, keys) {
var target = {};for (var i in obj) {
if (keys.indexOf(i) >= 0) continue;if (!Object.prototype.hasOwnProperty.call(obj, i)) continue;target[i] = obj[i];
}return target;
}
function _classCallCheck(instance, Constructor) {
if (!(instance instanceof Constructor)) {
throw new TypeError("Cannot call a class as a function");
}
}
function _possibleConstructorReturn(self, call) {
if (!self) {
throw new ReferenceError("this hasn't been initialised - super() hasn't been called");
}return call && ((typeof call === "undefined" ? "undefined" : _typeof(call)) === "object" || typeof call === "function") ? call : self;
}
function _inherits(subClass, superClass) {
if (typeof superClass !== "function" && superClass !== null) {
throw new TypeError("Super expression must either be null or a function, not " + (typeof superClass === "undefined" ? "undefined" : _typeof(superClass)));
}subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } });if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass;
}
var Manager = function (_Component) {
_inherits(Manager, _Component);
function Manager() {
var _ref;
var _temp, _this, _ret;
_classCallCheck(this, Manager);
for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) {
args[_key] = arguments[_key];
}
return _ret = (_temp = (_this = _possibleConstructorReturn(this, (_ref = Manager.__proto__ || Object.getPrototypeOf(Manager)).call.apply(_ref, [this].concat(args))), _this), _this._setTargetNode = function (node) {
_this._targetNode = node;
}, _this._getTargetNode = function () {
return _this._targetNode;
}, _temp), _possibleConstructorReturn(_this, _ret);
}
_createClass(Manager, [{
key: 'getChildContext',
value: function getChildContext() {
return {
popperManager: {
setTargetNode: this._setTargetNode,
getTargetNode: this._getTargetNode
}
};
}
}, {
key: 'render',
value: function render() {
var _props = this.props,
component = _props.component,
children = _props.children,
restProps = _objectWithoutProperties(_props, ['component', 'children']);
if (component) {
return (0, _react.createElement)(component, restProps, children);
} else {
return children;
}
}
}]);
return Manager;
}(_react.Component);
Manager.childContextTypes = {
popperManager: _react.PropTypes.object.isRequired
};
Manager.propTypes = {
component: _react.PropTypes.any
};
Manager.defaultProps = {
component: 'div'
};
exports.default = Manager;
/***/ },
/* 7 */
/***/ function(module, exports, __webpack_require__) {
'use strict';
var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; };
Object.defineProperty(exports, "__esModule", {
value: true
});
var _createClass = 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);
}
}return function (Constructor, protoProps, staticProps) {
if (protoProps) defineProperties(Constructor.prototype, protoProps);if (staticProps) defineProperties(Constructor, staticProps);return Constructor;
};
}();
var _react = __webpack_require__(3);
var _react2 = _interopRequireDefault(_react);
var _reactDom = __webpack_require__(4);
function _interopRequireDefault(obj) {
return obj && obj.__esModule ? obj : { default: obj };
}
function _objectWithoutProperties(obj, keys) {
var target = {};for (var i in obj) {
if (keys.indexOf(i) >= 0) continue;if (!Object.prototype.hasOwnProperty.call(obj, i)) continue;target[i] = obj[i];
}return target;
}
function _classCallCheck(instance, Constructor) {
if (!(instance instanceof Constructor)) {
throw new TypeError("Cannot call a class as a function");
}
}
function _possibleConstructorReturn(self, call) {
if (!self) {
throw new ReferenceError("this hasn't been initialised - super() hasn't been called");
}return call && ((typeof call === "undefined" ? "undefined" : _typeof(call)) === "object" || typeof call === "function") ? call : self;
}
function _inherits(subClass, superClass) {
if (typeof superClass !== "function" && superClass !== null) {
throw new TypeError("Super expression must either be null or a function, not " + (typeof superClass === "undefined" ? "undefined" : _typeof(superClass)));
}subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } });if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass;
}
var Target = function (_Component) {
_inherits(Target, _Component);
function Target() {
_classCallCheck(this, Target);
return _possibleConstructorReturn(this, (Target.__proto__ || Object.getPrototypeOf(Target)).apply(this, arguments));
}
_createClass(Target, [{
key: 'componentDidMount',
value: function componentDidMount() {
this.context.popperManager.setTargetNode((0, _reactDom.findDOMNode)(this));
}
}, {
key: 'render',
value: function render() {
var _props = this.props,
component = _props.component,
children = _props.children,
restProps = _objectWithoutProperties(_props, ['component', 'children']);
if (component) {
return (0, _react.createElement)(component, restProps, children);
} else {
return children;
}
}
}]);
return Target;
}(_react.Component);
Target.contextTypes = {
popperManager: _react.PropTypes.object.isRequired
};
Target.propTypes = {
component: _react.PropTypes.any
};
Target.defaultProps = {
component: 'div'
};
exports.default = Target;
/***/ },
/* 8 */
/***/ function(module, exports, __webpack_require__) {
'use strict';
var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; };
Object.defineProperty(exports, "__esModule", {
value: true
});
var _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;
};
var _createClass = 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);
}
}return function (Constructor, protoProps, staticProps) {
if (protoProps) defineProperties(Constructor.prototype, protoProps);if (staticProps) defineProperties(Constructor, staticProps);return Constructor;
};
}();
var _react = __webpack_require__(3);
var _react2 = _interopRequireDefault(_react);
var _reactDom = __webpack_require__(4);
var _reactDom2 = _interopRequireDefault(_reactDom);
var _popper = __webpack_require__(9);
var _popper2 = _interopRequireDefault(_popper);
var _lodash = __webpack_require__(10);
var _lodash2 = _interopRequireDefault(_lodash);
function _interopRequireDefault(obj) {
return obj && obj.__esModule ? obj : { default: obj };
}
function _objectWithoutProperties(obj, keys) {
var target = {};for (var i in obj) {
if (keys.indexOf(i) >= 0) continue;if (!Object.prototype.hasOwnProperty.call(obj, i)) continue;target[i] = obj[i];
}return target;
}
function _classCallCheck(instance, Constructor) {
if (!(instance instanceof Constructor)) {
throw new TypeError("Cannot call a class as a function");
}
}
function _possibleConstructorReturn(self, call) {
if (!self) {
throw new ReferenceError("this hasn't been initialised - super() hasn't been called");
}return call && ((typeof call === "undefined" ? "undefined" : _typeof(call)) === "object" || typeof call === "function") ? call : self;
}
function _inherits(subClass, superClass) {
if (typeof superClass !== "function" && superClass !== null) {
throw new TypeError("Super expression must either be null or a function, not " + (typeof superClass === "undefined" ? "undefined" : _typeof(superClass)));
}subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } });if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass;
}
var noop = function noop() {
return null;
};
var Popper = function (_Component) {
_inherits(Popper, _Component);
function Popper() {
var _ref;
var _temp, _this, _ret;
_classCallCheck(this, Popper);
for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) {
args[_key] = arguments[_key];
}
return _ret = (_temp = (_this = _possibleConstructorReturn(this, (_ref = Popper.__proto__ || Object.getPrototypeOf(Popper)).call.apply(_ref, [this].concat(args))), _this), _this.state = {}, _this._setArrowNode = function (node) {
_this._arrowNode = node;
}, _this._getTargetNode = function () {
return _this.context.popperManager.getTargetNode();
}, _this._updateStateModifier = {
enabled: true,
order: 900,
function: function _function(data) {
if (_this.state.data && !(0, _lodash2.default)(data.offsets, _this.state.data.offsets) || !_this.state.data) {
_this.setState({ data: data });
}
}
}, _this._getPopperStyle = function () {
var data = _this.state.data;
// If Popper isn't instantiated, hide the popperElement
// to avoid flash of unstyled content
if (!_this._popper || !data) {
return {
position: 'absolute',
pointerEvents: 'none',
opacity: 0
};
}
var _data$offsets$popper = data.offsets.popper,
top = _data$offsets$popper.top,
left = _data$offsets$popper.left,
position = _data$offsets$popper.position;
return _extends({
position: position,
top: 0,
left: 0,
transform: 'translate3d(' + Math.round(left) + 'px, ' + Math.round(top) + 'px, 0px)',
willChange: 'transform'
}, data.styles);
}, _this._getPopperPlacement = function () {
return !!_this.state.data ? _this.state.data.placement : undefined;
}, _this._getArrowStyle = function () {
if (!_this.state.data || !_this.state.data.offsets.arrow) {
return {};
} else {
var _this$state$data$offs = _this.state.data.offsets.arrow,
top = _this$state$data$offs.top,
left = _this$state$data$offs.left;
if (!left) {
return { top: +top };
} else {
return { left: +left };
}
}
}, _temp), _possibleConstructorReturn(_this, _ret);
}
_createClass(Popper, [{
key: 'getChildContext',
value: function getChildContext() {
return {
popper: {
setArrowNode: this._setArrowNode,
getArrowStyle: this._getArrowStyle
}
};
}
}, {
key: 'componentDidMount',
value: function componentDidMount() {
this._updatePopper();
}
}, {
key: 'componentDidUpdate',
value: function componentDidUpdate(lastProps) {
if (lastProps.placement !== this.props.placement || lastProps.eventsEnabled !== this.props.eventsEnabled) {
this._updatePopper();
}
}
}, {
key: 'componentWillUnmount',
value: function componentWillUnmount() {
this._destroyPopper();
}
}, {
key: '_updatePopper',
value: function _updatePopper() {
this._destroyPopper();
this._createPopper();
}
}, {
key: '_createPopper',
value: function _createPopper() {
var _props = this.props,
placement = _props.placement,
eventsEnabled = _props.eventsEnabled;
var modifiers = _extends({}, this.props.modifiers, {
applyStyle: { enabled: false },
updateState: this._updateStateModifier
});
if (this._arrowNode) {
modifiers.arrow = {
element: this._arrowNode
};
}
this._popper = new _popper2.default(this._getTargetNode(), (0, _reactDom.findDOMNode)(this), {
placement: placement,
eventsEnabled: eventsEnabled,
modifiers: modifiers
});
// schedule an update to make sure everything gets positioned correct
// after being instantiated
this._popper.scheduleUpdate();
}
}, {
key: '_destroyPopper',
value: function _destroyPopper() {
if (this._popper) {
this._popper.destroy();
}
}
}, {
key: '_getProps',
value: function _getProps() {
var _props2 = this.props,
component = _props2.component,
placement = _props2.placement,
eventsEnabled = _props2.eventsEnabled,
modifiers = _props2.modifiers,
style = _props2.style,
children = _props2.children,
restProps = _objectWithoutProperties(_props2, ['component', 'placement', 'eventsEnabled', 'modifiers', 'style', 'children']);
return _extends({
style: _extends({}, this._getPopperStyle(), style),
'data-placement': this._getPopperPlacement()
}, restProps);
}
}, {
key: 'render',
value: function render() {
var _props3 = this.props,
component = _props3.component,
children = _props3.children;
var props = this._getProps();
if (typeof children === 'function') {
return children(props);
} else {
return (0, _react.createElement)(component, props, children);
}
}
}]);
return Popper;
}(_react.Component);
Popper.contextTypes = {
popperManager: _react.PropTypes.object.isRequired
};
Popper.childContextTypes = {
popper: _react.PropTypes.object.isRequired
};
Popper.propTypes = {
component: _react.PropTypes.any,
placement: _react.PropTypes.oneOf(_popper2.default.placements),
eventsEnabled: _react.PropTypes.bool,
modifiers: _react.PropTypes.object
};
Popper.defaultProps = {
component: 'div',
placement: 'bottom',
eventsEnabled: true,
modifiers: {},
className: 'popper'
};
exports.default = Popper;
/***/ },
/* 9 */
/***/ function(module, exports, __webpack_require__) {
var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_RESULT__;'use strict';
var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; };
/**!
* @fileOverview Kickass library to create and place poppers near their reference elements.
* @version 1.0.8
* @license
* Copyright (c) 2016 Federico Zivolo and contributors
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in all
* copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE.
*/
(function (global, factory) {
( false ? 'undefined' : _typeof(exports)) === 'object' && typeof module !== 'undefined' ? module.exports = factory() : true ? !(__WEBPACK_AMD_DEFINE_FACTORY__ = (factory), __WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ? (__WEBPACK_AMD_DEFINE_FACTORY__.call(exports, __webpack_require__, exports, module)) : __WEBPACK_AMD_DEFINE_FACTORY__), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__)) : global.Popper = factory();
})(undefined, function () {
'use strict';
/**
* Returns the offset parent of the given element
* @method
* @memberof Popper.Utils
* @argument {Element} element
* @returns {Element} offset parent
*/
function getOffsetParent(element) {
// NOTE: 1 DOM access here
var offsetParent = element.offsetParent;
var nodeName = offsetParent && offsetParent.nodeName;
if (!nodeName || nodeName === 'BODY' || nodeName === 'HTML') {
return window.document.documentElement;
}
return offsetParent;
}
/**
* Get CSS computed property of the given element
* @method
* @memberof Popper.Utils
* @argument {Eement} element
* @argument {String} property
*/
function getStyleComputedProperty(element, property) {
if (element.nodeType !== 1) {
return [];
}
// NOTE: 1 DOM access here
var css = window.getComputedStyle(element, null);
return property ? css[property] : css;
}
/**
* Returns the parentNode or the host of the element
* @method
* @memberof Popper.Utils
* @argument {Element} element
* @returns {Element} parent
*/
function getParentNode(element) {
if (element.nodeName === 'HTML') {
return element;
}
return element.parentNode || element.host;
}
/**
* Returns the scrolling parent of the given element
* @method
* @memberof Popper.Utils
* @argument {Element} element
* @returns {Element} scroll parent
*/
function getScrollParent(element) {
// Return body, `getScroll` will take care to get the correct `scrollTop` from it
if (!element || ['HTML', 'BODY', '#document'].indexOf(element.nodeName) !== -1) {
return window.document.body;
}
// Firefox want us to check `-x` and `-y` variations as well
var _getStyleComputedProp = getStyleComputedProperty(element),
overflow = _getStyleComputedProp.overflow,
overflowX = _getStyleComputedProp.overflowX,
overflowY = _getStyleComputedProp.overflowY;
if (/(auto|scroll)/.test(overflow + overflowY + overflowX)) {
return element;
}
return getScrollParent(getParentNode(element));
}
/**
* Check if the given element is fixed or is inside a fixed parent
* @method
* @memberof Popper.Utils
* @argument {Element} element
* @argument {Element} customContainer
* @returns {Boolean} answer to "isFixed?"
*/
function isFixed(element) {
var nodeName = element.nodeName;
if (nodeName === 'BODY' || nodeName === 'HTML') {
return false;
}
if (getStyleComputedProperty(element, 'position') === 'fixed') {
return true;
}
return isFixed(getParentNode(element));
}
/**
* Helper used to get the position which will be applied to the popper
* @method
* @memberof Popper.Utils
* @param {HTMLElement} element - popper element
* @returns {String} position
*/
function getPosition(element) {
var container = getOffsetParent(element);
// Decide if the popper will be fixed
// If the reference element is inside a fixed context, the popper will be fixed as well to allow them to scroll together
var isParentFixed = isFixed(container);
return isParentFixed ? 'fixed' : 'absolute';
}
/*
* Helper to detect borders of a given element
* @method
* @memberof Popper.Utils
* @param {CSSStyleDeclaration} styles - result of `getStyleComputedProperty` on the given element
* @param {String} axis - `x` or `y`
* @return {Number} borders - the borders size of the given axis
*/
function getBordersSize(styles, axis) {
var sideA = axis === 'x' ? 'Left' : 'Top';
var sideB = sideA === 'Left' ? 'Right' : 'Bottom';
return Number(styles['border' + sideA + 'Width'].split('px')[0]) + Number(styles['border' + sideB + 'Width'].split('px')[0]);
}
/**
* Get bounding client rect of given element
* @method
* @memberof Popper.Utils
* @param {HTMLElement} element
* @return {Object} client rect
*/
function getBoundingClientRect(element) {
var isIE10 = navigator.appVersion.indexOf('MSIE 10') !== -1;
var rect = void 0;
// IE10 10 FIX: Please, don't ask, the element isn't
// considered in DOM in some circumstances...
// This isn't reproducible in IE10 compatibility mode of IE11
if (isIE10) {
try {
rect = element.getBoundingClientRect();
} catch (err) {
rect = {};
}
} else {
rect = element.getBoundingClientRect();
}
var result = {
left: rect.left,
top: rect.top,
right: rect.right,
bottom: rect.bottom,
width: rect.right - rect.left,
height: rect.bottom - rect.top
};
// IE10 FIX: `getBoundingClientRect`, when executed on `documentElement`
// will not take in account the `scrollTop` and `scrollLeft`
if (element.nodeName === 'HTML' && isIE10) {
var _window$document$docu = window.document.documentElement,
scrollTop = _window$document$docu.scrollTop,
scrollLeft = _window$document$docu.scrollLeft;
result.top -= scrollTop;
result.bottom -= scrollTop;
result.left -= scrollLeft;
result.right -= scrollLeft;
}
// subtract scrollbar size from sizes
var horizScrollbar = rect.width - (element.clientWidth || rect.right - rect.left);
var vertScrollbar = rect.height - (element.clientHeight || rect.bottom - rect.top);
// if an hypothetical scrollbar is detected, we must be sure it's not a `border`
// we make this check conditional for performance reasons
if (horizScrollbar || vertScrollbar) {
var styles = getStyleComputedProperty(element);
horizScrollbar -= getBordersSize(styles, 'x');
vertScrollbar -= getBordersSize(styles, 'y');
}
result.right -= horizScrollbar;
result.width -= horizScrollbar;
result.bottom -= vertScrollbar;
result.height -= vertScrollbar;
return result;
}
function getScroll(element) {
var side = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'top';
var upperSide = side === 'top' ? 'scrollTop' : 'scrollLeft';
var nodeName = element.nodeName;
if (nodeName === 'BODY' || nodeName === 'HTML') {
var html = window.document.documentElement;
var scrollingElement = window.document.scrollingElement || html;
return scrollingElement[upperSide];
}
return element[upperSide];
}
/*
* Sum or subtract the element scroll values (left and top) from a given rect object
* @method
* @memberof Popper.Utils
* @param {Object} rect - Rect object you want to change
* @param {HTMLElement} element - The element from the function reads the scroll values
* @param {Boolean} subtract - set to true if you want to subtract the scroll values
* @return {Object} rect - The modifier rect object
*/
function includeScroll(rect, element) {
var subtract = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;
var scrollTop = getScroll(element, 'top');
var scrollLeft = getScroll(element, 'left');
var modifier = subtract ? -1 : 1;
rect.top += scrollTop * modifier;
rect.bottom += scrollTop * modifier;
rect.left += scrollLeft * modifier;
rect.right += scrollLeft * modifier;
return rect;
}
/**
* Given an element and one of its parents, return the offset
* @method
* @memberof Popper.Utils
* @param {HTMLElement} element
* @param {HTMLElement} parent
* @return {Object} rect
*/
function getOffsetRectRelativeToCustomParent(element, parent) {
var fixed = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;
var transformed = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : false;
var scrollParent = getScrollParent(parent);
var elementRect = getBoundingClientRect(element);
var parentRect = getBoundingClientRect(parent);
var rect = {
top: elementRect.top - parentRect.top,
left: elementRect.left - parentRect.left,
bottom: elementRect.top - parentRect.top + elementRect.height,
right: elementRect.left - parentRect.left + elementRect.width,
width: elementRect.width,
height: elementRect.height
};
if (fixed && !transformed) {
rect = includeScroll(rect, scrollParent, true);
}
// When a popper doesn't have any positioned or scrollable parents, `offsetParent.contains(scrollParent)`
// will return a "false positive". This is happening because `getOffsetParent` returns `html` node,
// and `scrollParent` is the `body` node. Hence the additional check.
else if (getOffsetParent(element).contains(scrollParent) && scrollParent.nodeName !== 'BODY') {
rect = includeScroll(rect, parent);
}
// subtract borderTopWidth and borderTopWidth from final result
var styles = getStyleComputedProperty(parent);
var borderTopWidth = Number(styles.borderTopWidth.split('px')[0]);
var borderLeftWidth = Number(styles.borderLeftWidth.split('px')[0]);
rect.top -= borderTopWidth;
rect.bottom -= borderTopWidth;
rect.left -= borderLeftWidth;
rect.right -= borderLeftWidth;
return rect;
}
function getWindowSizes() {
var body = window.document.body;
var html = window.document.documentElement;
return {
height: Math.max(body.scrollHeight, body.offsetHeight, html.clientHeight, html.scrollHeight, html.offsetHeight),
width: Math.max(body.scrollWidth, body.offsetWidth, html.clientWidth, html.scrollWidth, html.offsetWidth)
};
}
/**
* Get the position of the given element, relative to its offset parent
* @method
* @memberof Popper.Utils
* @param {Element} element
* @return {Object} position - Coordinates of the element and its `scrollTop`
*/
function getOffsetRect(element) {
var elementRect = void 0;
if (element.nodeName === 'HTML') {
var _getWindowSizes = getWindowSizes(),
width = _getWindowSizes.width,
height = _getWindowSizes.height;
elementRect = {
width: width,
height: height,
left: 0,
top: 0
};
} else {
elementRect = {
width: element.offsetWidth,
height: element.offsetHeight,
left: element.offsetLeft,
top: element.offsetTop
};
}
elementRect.right = elementRect.left + elementRect.width;
elementRect.bottom = elementRect.top + elementRect.height;
// position
return elementRect;
}
function getOffsetRectRelativeToViewport(element) {
// Offset relative to offsetParent
var relativeOffset = getOffsetRect(element);
if (element.nodeName !== 'HTML') {
var offsetParent = getOffsetParent(element);
var parentOffset = getOffsetRectRelativeToViewport(offsetParent);
var offset = {
width: relativeOffset.offsetWidth,
height: relativeOffset.offsetHeight,
left: relativeOffset.left + parentOffset.left,
top: relativeOffset.top + parentOffset.top,
right: relativeOffset.right - parentOffset.right,
bottom: relativeOffset.bottom - parentOffset.bottom
};
return offset;
}
return relativeOffset;
}
function getTotalScroll(element) {
var side = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'top';
var scrollParent = getScrollParent(element);
var scroll = getScroll(scrollParent, side);
if (['BODY', 'HTML'].indexOf(scrollParent.nodeName) === -1) {
return scroll + getTotalScroll(getParentNode(scrollParent), side);
}
return scroll;
}
/**
* Computed the boundaries limits and return them
* @method
* @memberof Popper.Utils
* @param {Object} data - Object containing the property "offsets" generated by `_getOffsets`
* @param {Number} padding - Boundaries padding
* @param {Element} boundariesElement - Element used to define the boundaries
* @returns {Object} Coordinates of the boundaries
*/
function getBoundaries(popper, padding, boundariesElement) {
// NOTE: 1 DOM access here
var boundaries = { top: 0, left: 0 };
var offsetParent = getOffsetParent(popper);
// Handle viewport case
if (boundariesElement === 'viewport') {
var _getOffsetRectRelativ = getOffsetRectRelativeToViewport(offsetParent),
left = _getOffsetRectRelativ.left,
top = _getOffsetRectRelativ.top;
var _window$document$docu = window.document.documentElement,
width = _window$document$docu.clientWidth,
height = _window$document$docu.clientHeight;
if (getPosition(popper) === 'fixed') {
boundaries.right = width;
boundaries.bottom = height;
} else {
var scrollLeft = getTotalScroll(popper, 'left');
var scrollTop = getTotalScroll(popper, 'top');
boundaries = {
top: 0 - top,
right: width - left + scrollLeft,
bottom: height - top + scrollTop,
left: 0 - left
};
}
}
// Handle other cases based on DOM element used as boundaries
else {
var boundariesNode = void 0;
if (boundariesElement === 'scrollParent') {
boundariesNode = getScrollParent(getParentNode(popper));
} else if (boundariesElement === 'window') {
boundariesNode = window.document.body;
} else {
boundariesNode = boundariesElement;
}
// In case of BODY, we need a different computation
if (boundariesNode.nodeName === 'BODY') {
var _getWindowSizes = getWindowSizes(),
_height = _getWindowSizes.height,
_width = _getWindowSizes.width;
boundaries.right = _width;
boundaries.bottom = _height;
}
// for all the other DOM elements, this one is good
else {
boundaries = getOffsetRectRelativeToCustomParent(boundariesNode, offsetParent, isFixed(popper));
}
}
// Add paddings
boundaries.left += padding;
boundaries.top += padding;
boundaries.right -= padding;
boundaries.bottom -= padding;
return boundaries;
}
/**
* Utility used to transform the `auto` placement to the placement with more
* available space.
* @method
* @memberof Popper.Utils
* @argument {Object} data - The data object generated by update method
* @argum