react-aria
Advanced tools
Comparing version 0.5.0 to 0.6.0
## CHANGELOG | ||
### 0.6.0 | ||
Exports as `Tabs`, and `Overlays` now, can be imported individually if needed ( e.g. import `Tabs` from `react-aria/Tabs` ) | ||
All new props will be documented in README | ||
### 0.5.1 | ||
Fixed `Item` component to accept and use `value` prop | ||
Added `isOpen` prop to `Manager` so user can control `Popover` open/close state | ||
Ignore `input` when listening for taps | ||
### 0.5.0 | ||
@@ -3,0 +15,0 @@ Removed `Aria` prefix from each component name |
/*! | ||
* React Aria 0.5.0 | ||
* React Aria 0.6.0 | ||
* https://github.com/souporserious/react-aria | ||
@@ -8,10 +8,10 @@ * Copyright (c) 2016 React Aria Authors | ||
if(typeof exports === 'object' && typeof module === 'object') | ||
module.exports = factory(require("react"), require("react-dom"), require("focus-trap"), require("focus-group"), require("no-scroll"), require("teeny-tap")); | ||
module.exports = factory(require("react"), require("react-dom"), require("focus-trap"), require("no-scroll"), require("focus-group")); | ||
else if(typeof define === 'function' && define.amd) | ||
define(["react", "react-dom", "focus-trap", "focus-group", "no-scroll", "teeny-tap"], factory); | ||
define(["react", "react-dom", "focus-trap", "no-scroll", "focus-group"], factory); | ||
else if(typeof exports === 'object') | ||
exports["ReactARIA"] = factory(require("react"), require("react-dom"), require("focus-trap"), require("focus-group"), require("no-scroll"), require("teeny-tap")); | ||
exports["ReactARIA"] = factory(require("react"), require("react-dom"), require("focus-trap"), require("no-scroll"), require("focus-group")); | ||
else | ||
root["ReactARIA"] = factory(root["React"], root["ReactDOM"], root["focusTrap"], root["createFocusGroup"], root["noScroll"], root["createTapListener"]); | ||
})(this, function(__WEBPACK_EXTERNAL_MODULE_3__, __WEBPACK_EXTERNAL_MODULE_4__, __WEBPACK_EXTERNAL_MODULE_7__, __WEBPACK_EXTERNAL_MODULE_14__, __WEBPACK_EXTERNAL_MODULE_15__, __WEBPACK_EXTERNAL_MODULE_17__) { | ||
root["ReactARIA"] = factory(root["React"], root["ReactDOM"], root["focusTrap"], root["noScroll"], root["createFocusGroup"]); | ||
})(this, function(__WEBPACK_EXTERNAL_MODULE_3__, __WEBPACK_EXTERNAL_MODULE_4__, __WEBPACK_EXTERNAL_MODULE_7__, __WEBPACK_EXTERNAL_MODULE_8__, __WEBPACK_EXTERNAL_MODULE_10__) { | ||
return /******/ (function(modules) { // webpackBootstrap | ||
@@ -68,36 +68,17 @@ /******/ // The module cache | ||
}); | ||
exports.Manager = undefined; | ||
exports.Tabs = exports.Overlays = undefined; | ||
var _Menu = __webpack_require__(1); | ||
var _Overlays2 = __webpack_require__(1); | ||
Object.keys(_Menu).forEach(function (key) { | ||
if (key === "default" || key === "__esModule") return; | ||
Object.defineProperty(exports, key, { | ||
enumerable: true, | ||
get: function get() { | ||
return _Menu[key]; | ||
} | ||
}); | ||
}); | ||
var _Overlays = _interopRequireWildcard(_Overlays2); | ||
var _Tabs = __webpack_require__(9); | ||
var _Tabs2 = __webpack_require__(13); | ||
Object.keys(_Tabs).forEach(function (key) { | ||
if (key === "default" || key === "__esModule") return; | ||
Object.defineProperty(exports, key, { | ||
enumerable: true, | ||
get: function get() { | ||
return _Tabs[key]; | ||
} | ||
}); | ||
}); | ||
var _Tabs = _interopRequireWildcard(_Tabs2); | ||
var _Manager2 = __webpack_require__(13); | ||
function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } } | ||
var _Manager3 = _interopRequireDefault(_Manager2); | ||
exports.Overlays = _Overlays; | ||
exports.Tabs = _Tabs; | ||
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } | ||
exports.Manager = _Manager3.default; | ||
/***/ }, | ||
@@ -112,13 +93,13 @@ /* 1 */ | ||
}); | ||
exports.Item = exports.Popover = exports.Toggle = undefined; | ||
exports.Item = exports.Overlay = exports.Trigger = undefined; | ||
var _Toggle2 = __webpack_require__(2); | ||
var _Trigger2 = __webpack_require__(2); | ||
var _Toggle3 = _interopRequireDefault(_Toggle2); | ||
var _Trigger3 = _interopRequireDefault(_Trigger2); | ||
var _Popover2 = __webpack_require__(6); | ||
var _Overlay2 = __webpack_require__(6); | ||
var _Popover3 = _interopRequireDefault(_Popover2); | ||
var _Overlay3 = _interopRequireDefault(_Overlay2); | ||
var _Item2 = __webpack_require__(8); | ||
var _Item2 = __webpack_require__(12); | ||
@@ -129,4 +110,4 @@ var _Item3 = _interopRequireDefault(_Item2); | ||
exports.Toggle = _Toggle3.default; | ||
exports.Popover = _Popover3.default; | ||
exports.Trigger = _Trigger3.default; | ||
exports.Overlay = _Overlay3.default; | ||
exports.Item = _Item3.default; | ||
@@ -168,9 +149,11 @@ | ||
tag: _react.PropTypes.string, | ||
children: _react.PropTypes.oneOfType([_react.PropTypes.func, _react.PropTypes.node]).isRequired | ||
isOpen: _react.PropTypes.bool, | ||
toggleOn: _react.PropTypes.array, | ||
onToggle: _react.PropTypes.func | ||
}; | ||
var Toggle = function (_Component) { | ||
_inherits(Toggle, _Component); | ||
var Trigger = function (_Component) { | ||
_inherits(Trigger, _Component); | ||
function Toggle() { | ||
function Trigger() { | ||
var _ref; | ||
@@ -180,3 +163,3 @@ | ||
_classCallCheck(this, Toggle); | ||
_classCallCheck(this, Trigger); | ||
@@ -187,12 +170,15 @@ for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) { | ||
return _ret = (_temp = (_this = _possibleConstructorReturn(this, (_ref = Toggle.__proto__ || Object.getPrototypeOf(Toggle)).call.apply(_ref, [this].concat(args))), _this), _this._handleKeyDown = function (e) { | ||
if (['ArrowUp', 'ArrowDown', ' '].indexOf(e.key) > -1 || _this.props.tag !== 'button' && e.key === 'Enter') { | ||
if (!_this.context.ariaManager.isPopoverOpen) { | ||
_this.context.ariaManager.openPopover(); | ||
} else { | ||
_this.context.ariaManager.focusItem(0); | ||
} | ||
return _ret = (_temp = (_this = _possibleConstructorReturn(this, (_ref = Trigger.__proto__ || Object.getPrototypeOf(Trigger)).call.apply(_ref, [this].concat(args))), _this), _this._handleKeyDown = function (e) { | ||
var _this$props = _this.props; | ||
var tag = _this$props.tag; | ||
var onToggle = _this$props.onToggle; | ||
var onKeyDown = _this$props.onKeyDown; | ||
if (['ArrowUp', 'ArrowDown'].indexOf(e.key) > -1 || tag !== 'button' && ['Enter', ' '].indexOf(e.key) > -1) { | ||
_this._toggle(e); | ||
} | ||
if (_this.props.onKeyDown) { | ||
_this.props.onKeyDown(e); | ||
if (typeof onKeyDown === 'function') { | ||
onKeyDown(e); | ||
} | ||
@@ -202,24 +188,32 @@ }, _temp), _possibleConstructorReturn(_this, _ret); | ||
_createClass(Toggle, [{ | ||
key: 'componentDidMount', | ||
value: function componentDidMount() { | ||
this.context.ariaManager.setToggleNode((0, _reactDom.findDOMNode)(this)); | ||
_createClass(Trigger, [{ | ||
key: '_handleEvent', | ||
value: function _handleEvent(name, e) { | ||
var onEvent = this.props['on' + name]; | ||
this._toggle(e); | ||
if (typeof onEvent === 'function') { | ||
onEvent(e); | ||
} | ||
} | ||
}, { | ||
key: 'render', | ||
value: function render() { | ||
var _context$ariaManager = this.context.ariaManager; | ||
var type = _context$ariaManager.type; | ||
var uuid = _context$ariaManager.uuid; | ||
var isPopoverOpen = _context$ariaManager.isPopoverOpen; | ||
key: '_toggle', | ||
value: function _toggle(e) { | ||
e.preventDefault(); | ||
this.props.onToggle(); | ||
} | ||
}, { | ||
key: '_getProps', | ||
value: function _getProps() { | ||
var _props = this.props; | ||
var tag = _props.tag; | ||
var disabled = _props.disabled; | ||
var children = _props.children; | ||
var type = _props.type; | ||
var controls = _props.controls; | ||
var isOpen = _props.isOpen; | ||
var toggleOn = _props.toggleOn; | ||
var componentProps = { | ||
var props = { | ||
role: 'button', | ||
tabIndex: disabled ? '' : 0, | ||
'aria-haspopup': true, | ||
'aria-expanded': isPopoverOpen, | ||
'aria-disabled': disabled, | ||
@@ -229,12 +223,36 @@ onKeyDown: this._handleKeyDown | ||
if (type !== 'modal') { | ||
props['aria-haspopup'] = true; | ||
props['aria-expanded'] = isOpen; | ||
} | ||
if (type === 'popover') { | ||
componentProps['id'] = uuid; | ||
props['id'] = controls; | ||
} else if (type === 'tooltip') { | ||
props['aria-describedby'] = controls; | ||
} | ||
if (type === 'tooltip') { | ||
componentProps['aria-describedby'] = uuid; | ||
if (toggleOn.indexOf('click') > -1) { | ||
props.onClick = this._handleEvent.bind(this, 'click'); | ||
} | ||
if (toggleOn.indexOf('hover') > -1) { | ||
props.onMouseOver = this._handleEvent.bind(this, 'mouseOver'); | ||
props.onMouseOut = this._handleEvent.bind(this, 'mouseOut'); | ||
} | ||
if (toggleOn.indexOf('focus') > -1) { | ||
props.onFocus = this._handleEvent.bind(this, 'focus'); | ||
props.onBlur = this._handleEvent.bind(this, 'blur'); | ||
} | ||
var props = (0, _specialAssign2.default)(componentProps, this.props, checkedProps); | ||
return (0, _specialAssign2.default)(props, this.props, checkedProps); | ||
} | ||
}, { | ||
key: 'render', | ||
value: function render() { | ||
var _props2 = this.props; | ||
var tag = _props2.tag; | ||
var children = _props2.children; | ||
var props = this._getProps(); | ||
if (typeof children === 'function') { | ||
@@ -248,13 +266,11 @@ return children(props); | ||
return Toggle; | ||
return Trigger; | ||
}(_react.Component); | ||
Toggle.contextTypes = { | ||
ariaManager: _react.PropTypes.object.isRequired | ||
Trigger.propTypes = checkedProps; | ||
Trigger.defaultProps = { | ||
tag: 'button', | ||
toggleOn: ['click'] | ||
}; | ||
Toggle.propTypes = checkedProps; | ||
Toggle.defaultProps = { | ||
tag: 'button' | ||
}; | ||
exports.default = Toggle; | ||
exports.default = Trigger; | ||
module.exports = exports['default']; | ||
@@ -317,2 +333,14 @@ | ||
var _noScroll = __webpack_require__(8); | ||
var _noScroll2 = _interopRequireDefault(_noScroll); | ||
var _Members = __webpack_require__(9); | ||
var _Members2 = _interopRequireDefault(_Members); | ||
var _keys = __webpack_require__(11); | ||
var _keys2 = _interopRequireDefault(_keys); | ||
var _specialAssign = __webpack_require__(5); | ||
@@ -332,25 +360,66 @@ | ||
tag: _react.PropTypes.string, | ||
children: _react.PropTypes.oneOfType([_react.PropTypes.func, _react.PropTypes.node]).isRequired | ||
id: _react.PropTypes.string, | ||
type: _react.PropTypes.oneOf(['menu', 'popover', 'modal', 'tooltip', 'alert']), | ||
focusOnMount: _react.PropTypes.bool, | ||
trapFocus: _react.PropTypes.bool, | ||
initialFocus: _react.PropTypes.any, | ||
freezeScroll: _react.PropTypes.bool, | ||
closeOnEscapeKey: _react.PropTypes.bool, | ||
closeOnOutsideClick: _react.PropTypes.bool, | ||
onRequestClose: _react.PropTypes.func, | ||
onItemSelection: _react.PropTypes.func | ||
}; | ||
var Popover = function (_Component) { | ||
_inherits(Popover, _Component); | ||
var Overlay = function (_Component) { | ||
_inherits(Overlay, _Component); | ||
function Popover() { | ||
_classCallCheck(this, Popover); | ||
function Overlay() { | ||
var _ref; | ||
return _possibleConstructorReturn(this, (Popover.__proto__ || Object.getPrototypeOf(Popover)).apply(this, arguments)); | ||
var _temp, _this, _ret; | ||
_classCallCheck(this, Overlay); | ||
for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) { | ||
args[_key] = arguments[_key]; | ||
} | ||
return _ret = (_temp = (_this = _possibleConstructorReturn(this, (_ref = Overlay.__proto__ || Object.getPrototypeOf(Overlay)).call.apply(_ref, [this].concat(args))), _this), _this.members = new _Members2.default(_this.props), _this.focusItem = function (index) { | ||
_this.members.focus(index); | ||
}, _this._handleDocumentKeyDown = function (_ref2) { | ||
var keyCode = _ref2.keyCode; | ||
if (keyCode === _keys2.default.escape) { | ||
_this.props.onRequestClose(); | ||
} | ||
}, _this._handleDocumentClick = function (_ref3) { | ||
var target = _ref3.target; | ||
var node = (0, _reactDom.findDOMNode)(_this); | ||
if (node !== target && !node.contains(target)) { | ||
_this.props.onRequestClose(); | ||
} | ||
}, _temp), _possibleConstructorReturn(_this, _ret); | ||
} | ||
_createClass(Popover, [{ | ||
_createClass(Overlay, [{ | ||
key: 'getChildContext', | ||
value: function getChildContext() { | ||
return { | ||
overlayManager: { | ||
members: this.members, | ||
onItemSelection: this.props.onItemSelection | ||
} | ||
}; | ||
} | ||
}, { | ||
key: 'componentDidMount', | ||
value: function componentDidMount() { | ||
var _context$ariaManager = this.context.ariaManager; | ||
var trapFocus = _context$ariaManager.trapFocus; | ||
var initialFocus = _context$ariaManager.initialFocus; | ||
var onClickOutside = _context$ariaManager.onClickOutside; | ||
var _props = this.props; | ||
var trapFocus = _props.trapFocus; | ||
var initialFocus = _props.initialFocus; | ||
var freezeScroll = _props.freezeScroll; | ||
this._lastActiveElement = document.activeElement; | ||
this._setPopoverNode(); | ||
if (trapFocus) { | ||
@@ -363,2 +432,12 @@ this._focusTrap = (0, _focusTrap2.default)((0, _reactDom.findDOMNode)(this), { | ||
} | ||
if (freezeScroll) { | ||
_noScroll2.default.on(); | ||
} | ||
if (initialFocus === 'first') { | ||
this.members.focus(0); | ||
} | ||
this._registerEvents(); | ||
} | ||
@@ -368,49 +447,66 @@ }, { | ||
value: function componentWillUnmount() { | ||
if (this.context.ariaManager.trapFocus) { | ||
if (this.props.trapFocus) { | ||
this._focusTrap.deactivate(); | ||
} | ||
if (this.props.freezeScroll) { | ||
_noScroll2.default.off(); | ||
} | ||
if (this._lastActiveElement) { | ||
this._lastActiveElement.focus(); | ||
} | ||
this._unregisterEvents(); | ||
} | ||
}, { | ||
key: 'componentDidUpdate', | ||
value: function componentDidUpdate(lastProps, lastState, lastContext) { | ||
if (this.context.ariaManager.isPopoverOpen !== lastContext.ariaManager.isPopoverOpen) { | ||
this._setPopoverNode(); | ||
key: '_registerEvents', | ||
value: function _registerEvents() { | ||
document.addEventListener('keydown', this._handleDocumentKeyDown); | ||
if (this.props.closeOnOutsideClick) { | ||
document.addEventListener('click', this._handleDocumentClick); | ||
} | ||
} | ||
}, { | ||
key: '_setPopoverNode', | ||
value: function _setPopoverNode() { | ||
this.context.ariaManager.setPopoverNode((0, _reactDom.findDOMNode)(this)); | ||
key: '_unregisterEvents', | ||
value: function _unregisterEvents() { | ||
document.removeEventListener('keydown', this._handleDocumentKeyDown); | ||
if (this.props.closeOnOutsideClick) { | ||
document.removeEventListener('click', this._handleDocumentClick); | ||
} | ||
} | ||
}, { | ||
key: 'render', | ||
value: function render() { | ||
var _context$ariaManager2 = this.context.ariaManager; | ||
var type = _context$ariaManager2.type; | ||
var uuid = _context$ariaManager2.uuid; | ||
var isPopoverOpen = _context$ariaManager2.isPopoverOpen; | ||
var _props = this.props; | ||
var tag = _props.tag; | ||
var children = _props.children; | ||
key: '_getProps', | ||
value: function _getProps() { | ||
var _props2 = this.props; | ||
var type = _props2.type; | ||
var id = _props2.id; | ||
var componentProps = { | ||
'aria-hidden': !isPopoverOpen | ||
}; | ||
var props = {}; | ||
if (type === 'menu') { | ||
componentProps['role'] = 'menu'; | ||
props['role'] = 'menu'; | ||
} else if (type === 'modal') { | ||
componentProps['role'] = 'dialog'; | ||
props['role'] = 'dialog'; | ||
} else if (type === 'alert') { | ||
componentProps['role'] = 'alertdialog'; | ||
props['role'] = 'alertdialog'; | ||
} else if (type === 'tooltip') { | ||
componentProps['id'] = uuid; | ||
componentProps['role'] = 'tooltip'; | ||
props['id'] = id; | ||
props['role'] = 'tooltip'; | ||
} else if (type === 'popover') { | ||
props['aria-labelledby'] = id; | ||
} | ||
if (type === 'popover') { | ||
componentProps['aria-labelledby'] = uuid; | ||
} | ||
return (0, _specialAssign2.default)(props, this.props, checkedProps); | ||
} | ||
}, { | ||
key: 'render', | ||
value: function render() { | ||
var _props3 = this.props; | ||
var tag = _props3.tag; | ||
var children = _props3.children; | ||
var props = (0, _specialAssign2.default)(componentProps, this.props, checkedProps); | ||
var props = this._getProps(); | ||
@@ -425,13 +521,23 @@ if (typeof children === 'function') { | ||
return Popover; | ||
return Overlay; | ||
}(_react.Component); | ||
Popover.contextTypes = { | ||
ariaManager: _react.PropTypes.object.isRequired | ||
Overlay.childContextTypes = { | ||
overlayManager: _react.PropTypes.object | ||
}; | ||
Popover.propTypes = checkedProps; | ||
Popover.defaultProps = { | ||
tag: 'div' | ||
Overlay.propTypes = checkedProps; | ||
Overlay.defaultProps = { | ||
tag: 'div', | ||
type: 'popover', | ||
initialFocus: 'first', | ||
closeOnEscapeKey: true, | ||
closeOnOutsideClick: true, | ||
onRequestClose: function onRequestClose() { | ||
return null; | ||
}, | ||
onItemSelection: function onItemSelection() { | ||
return null; | ||
} | ||
}; | ||
exports.default = Popover; | ||
exports.default = Overlay; | ||
module.exports = exports['default']; | ||
@@ -447,2 +553,8 @@ | ||
/* 8 */ | ||
/***/ function(module, exports) { | ||
module.exports = __WEBPACK_EXTERNAL_MODULE_8__; | ||
/***/ }, | ||
/* 9 */ | ||
/***/ function(module, exports, __webpack_require__) { | ||
@@ -456,2 +568,130 @@ | ||
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 _focusGroup = __webpack_require__(10); | ||
var _focusGroup2 = _interopRequireDefault(_focusGroup); | ||
var _keys = __webpack_require__(11); | ||
var _keys2 = _interopRequireDefault(_keys); | ||
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"); } } | ||
var defaultOptions = { | ||
keybindings: { | ||
next: [{ keyCode: _keys2.default.arrowDown }, { keyCode: _keys2.default.arrowRight }], | ||
prev: [{ keyCode: _keys2.default.arrowUp }, { keyCode: _keys2.default.arrowLeft }], | ||
first: { keyCode: _keys2.default.home }, | ||
last: { keyCode: _keys2.default.end } | ||
}, | ||
wrap: true, | ||
stringSearch: true, | ||
stringSearchDelay: 600 | ||
}; | ||
var Members = function Members() { | ||
var _this = this; | ||
var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; | ||
_classCallCheck(this, Members); | ||
this.add = function (member) { | ||
var id = member.id; | ||
var index = member.index; | ||
var node = member.node; | ||
var text = member.text; | ||
if (index === undefined) { | ||
_this.collection.push(member); | ||
} else { | ||
_this.collection.splice(index, 0, member); | ||
} | ||
_this.focusGroup.addMember({ | ||
node: node, | ||
text: text || node.innerHTML | ||
}); | ||
// activate focus group if this was the first member added | ||
if (_this.collection.length === 1) { | ||
_this.focusGroup.activate(); | ||
} | ||
if (typeof _this.options.onAdd === 'function') { | ||
_this.options.onAdd(member); | ||
} | ||
}; | ||
this.remove = function (member) { | ||
var pos = _this.collection.indexOf(member); | ||
if (pos > -1) { | ||
_this.collection.splice(member, 1); | ||
_this.focusGroup.removeMember(member.node); | ||
} | ||
// deactivate focus group if this was the last member removed | ||
if (_this.collection.length <= 0) { | ||
_this.focusGroup.activate(); | ||
} | ||
if (typeof _this.options.onRemove === 'function') { | ||
_this.options.onRemove(member); | ||
} | ||
}; | ||
this.focus = function (index) { | ||
_this.focusGroup.focusNodeAtIndex(index); | ||
}; | ||
this.collection = []; | ||
this.options = _extends({}, defaultOptions, options); | ||
this.focusGroup = (0, _focusGroup2.default)(this.options); | ||
}; | ||
exports.default = Members; | ||
module.exports = exports['default']; | ||
/***/ }, | ||
/* 10 */ | ||
/***/ function(module, exports) { | ||
module.exports = __WEBPACK_EXTERNAL_MODULE_10__; | ||
/***/ }, | ||
/* 11 */ | ||
/***/ function(module, exports) { | ||
"use strict"; | ||
Object.defineProperty(exports, "__esModule", { | ||
value: true | ||
}); | ||
exports.default = { | ||
tab: 9, | ||
escape: 27, | ||
end: 35, | ||
home: 36, | ||
arrowLeft: 37, | ||
arrowUp: 38, | ||
arrowRight: 39, | ||
arrowDown: 40 | ||
}; | ||
module.exports = exports["default"]; | ||
/***/ }, | ||
/* 12 */ | ||
/***/ function(module, exports, __webpack_require__) { | ||
'use strict'; | ||
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; }; }(); | ||
@@ -480,4 +720,3 @@ | ||
var checkedProps = { | ||
tag: _react.PropTypes.string, | ||
children: _react.PropTypes.oneOfType([_react.PropTypes.func, _react.PropTypes.node]).isRequired | ||
tag: _react.PropTypes.string | ||
}; | ||
@@ -499,3 +738,12 @@ | ||
return _ret = (_temp = (_this = _possibleConstructorReturn(this, (_ref = Item.__proto__ || Object.getPrototypeOf(Item)).call.apply(_ref, [this].concat(args))), _this), _this._handleKeyDown = function (e) { | ||
return _ret = (_temp = (_this = _possibleConstructorReturn(this, (_ref = Item.__proto__ || Object.getPrototypeOf(Item)).call.apply(_ref, [this].concat(args))), _this), _this._handleClick = function (e) { | ||
var onClick = _this.props.onClick; | ||
_this._handleSelection(e); | ||
if (typeof onClick === 'function') { | ||
onClick(e); | ||
} | ||
}, _this._handleKeyDown = function (e) { | ||
var onKeyDown = _this.props.onKeyDown; | ||
@@ -505,7 +753,18 @@ | ||
if ([' ', 'Enter'].indexOf(e.key) > -1) { | ||
_this.context.ariaManager.onItemSelection(_this._member, e); | ||
e.preventDefault(); | ||
_this._handleSelection(e); | ||
} | ||
if (onKeyDown) { | ||
if (typeof onKeyDown === 'function') { | ||
onKeyDown(e); | ||
} | ||
}, _this._handleSelection = function (e) { | ||
var onSelect = _this.props.onSelect; | ||
_this.context.overlayManager.onItemSelection(_this._member, e); | ||
if (typeof onSelect === 'function') { | ||
onSelect(_this._member, e); | ||
} | ||
}, _temp), _possibleConstructorReturn(_this, _ret); | ||
@@ -522,3 +781,8 @@ } | ||
}; | ||
this.context.ariaManager.addMember(this._member); | ||
if (this.props.value) { | ||
this._member.value = this.props.value; | ||
} | ||
this.context.overlayManager.members.add(this._member); | ||
} | ||
@@ -528,3 +792,3 @@ }, { | ||
value: function componentWillUnmount() { | ||
this.context.ariaManager.removeMember(this._member); | ||
this.context.overlayManager.members.remove(this._member); | ||
} | ||
@@ -541,2 +805,3 @@ }, { | ||
tabIndex: -1, | ||
onClick: this._handleClick, | ||
onKeyDown: this._handleKeyDown | ||
@@ -557,3 +822,3 @@ }, this.props, checkedProps); | ||
Item.contextTypes = { | ||
ariaManager: _react.PropTypes.object.isRequired | ||
overlayManager: _react.PropTypes.object | ||
}; | ||
@@ -568,3 +833,3 @@ Item.propTypes = checkedProps; | ||
/***/ }, | ||
/* 9 */ | ||
/* 13 */ | ||
/***/ function(module, exports, __webpack_require__) { | ||
@@ -577,13 +842,17 @@ | ||
}); | ||
exports.TabPanel = exports.Tab = exports.TabList = undefined; | ||
exports.TabPanel = exports.Tab = exports.TabList = exports.Manager = undefined; | ||
var _TabList2 = __webpack_require__(10); | ||
var _Manager2 = __webpack_require__(14); | ||
var _Manager3 = _interopRequireDefault(_Manager2); | ||
var _TabList2 = __webpack_require__(15); | ||
var _TabList3 = _interopRequireDefault(_TabList2); | ||
var _Tab2 = __webpack_require__(11); | ||
var _Tab2 = __webpack_require__(16); | ||
var _Tab3 = _interopRequireDefault(_Tab2); | ||
var _TabPanel2 = __webpack_require__(12); | ||
var _TabPanel2 = __webpack_require__(17); | ||
@@ -594,2 +863,3 @@ var _TabPanel3 = _interopRequireDefault(_TabPanel2); | ||
exports.Manager = _Manager3.default; | ||
exports.TabList = _TabList3.default; | ||
@@ -600,3 +870,3 @@ exports.Tab = _Tab3.default; | ||
/***/ }, | ||
/* 10 */ | ||
/* 14 */ | ||
/***/ function(module, exports, __webpack_require__) { | ||
@@ -610,2 +880,4 @@ | ||
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; }; }(); | ||
@@ -617,2 +889,10 @@ | ||
var _reactDom = __webpack_require__(4); | ||
var _reactDom2 = _interopRequireDefault(_reactDom); | ||
var _Members = __webpack_require__(9); | ||
var _Members2 = _interopRequireDefault(_Members); | ||
var _specialAssign = __webpack_require__(5); | ||
@@ -632,2 +912,157 @@ | ||
tag: _react.PropTypes.string, | ||
activeTabId: _react.PropTypes.string, | ||
accordion: _react.PropTypes.bool, | ||
multiselect: _react.PropTypes.bool, | ||
onChange: _react.PropTypes.func | ||
}; | ||
var Manager = function (_Component) { | ||
_inherits(Manager, _Component); | ||
function Manager(props) { | ||
_classCallCheck(this, Manager); | ||
var _this = _possibleConstructorReturn(this, (Manager.__proto__ || Object.getPrototypeOf(Manager)).call(this, props)); | ||
_this._addMember = function (_ref) { | ||
var id = _ref.id; | ||
if (id === _this.props.activeTabId) { | ||
_this._activateTab(id, true, false); | ||
} | ||
}; | ||
_this._addPanel = function (panel) { | ||
var controlledBy = panel.controlledBy; | ||
_this._panels.push(panel); | ||
// set an active panel if there is one | ||
if (controlledBy === _this.props.activeTabId) { | ||
_this._activateTab(controlledBy, true, false); | ||
} | ||
}; | ||
_this._activateTab = function (id, forceActivate) { | ||
var emitEvent = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : true; | ||
// bail out if this is the same id | ||
if (id === _this.props.activeTabId && !forceActivate) return; | ||
var onChange = _this.props.onChange; | ||
if (emitEvent && typeof onChange === 'function') { | ||
onChange(id); | ||
} else { | ||
_this._setActiveStates(id); | ||
} | ||
}; | ||
_this._members = new _Members2.default(_extends({}, _this.props, { onAdd: _this._addMember })); | ||
_this._panels = []; | ||
return _this; | ||
} | ||
_createClass(Manager, [{ | ||
key: 'getChildContext', | ||
value: function getChildContext() { | ||
return { | ||
tabs: { | ||
accordion: this.props.accordion, | ||
multiselect: this.props.multiselect, | ||
members: this._members, | ||
addPanel: this._addPanel, | ||
activateTab: this._activateTab, | ||
focusTab: this.focusTab | ||
} | ||
}; | ||
} | ||
}, { | ||
key: '_setActiveStates', | ||
value: function _setActiveStates(id) { | ||
var _props = this.props; | ||
var accordion = _props.accordion; | ||
var multiselect = _props.multiselect; | ||
var collection = this._members.collection; | ||
for (var i = collection.length; i--;) { | ||
var tab = collection[i]; | ||
if (accordion) { | ||
if (tab.id === id) { | ||
tab.toggleActiveState(); | ||
} else if (!multiselect) { | ||
tab.setActiveState(false); | ||
} | ||
} else { | ||
tab.setActiveState(tab.id === id); | ||
} | ||
} | ||
for (var _i = this._panels.length; _i--;) { | ||
var panel = this._panels[_i]; | ||
if (accordion) { | ||
if (panel.controlledBy === id) { | ||
panel.toggleActiveState(); | ||
} else if (!multiselect) { | ||
panel.setActiveState(false); | ||
} | ||
} else { | ||
panel.setActiveState(panel.controlledBy === id); | ||
} | ||
} | ||
} | ||
}, { | ||
key: 'render', | ||
value: function render() { | ||
var props = (0, _specialAssign2.default)({}, this.props, checkedProps); | ||
return (0, _react.createElement)(this.props.tag, props); | ||
} | ||
}]); | ||
return Manager; | ||
}(_react.Component); | ||
Manager.childContextTypes = { | ||
tabs: _react.PropTypes.object | ||
}; | ||
Manager.propTypes = checkedProps; | ||
Manager.defaultProps = { | ||
tag: 'div' | ||
}; | ||
exports.default = Manager; | ||
module.exports = exports['default']; | ||
/***/ }, | ||
/* 15 */ | ||
/***/ function(module, exports, __webpack_require__) { | ||
'use strict'; | ||
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 _specialAssign = __webpack_require__(5); | ||
var _specialAssign2 = _interopRequireDefault(_specialAssign); | ||
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 checkedProps = { | ||
tag: _react.PropTypes.string, | ||
children: _react.PropTypes.oneOfType([_react.PropTypes.func, _react.PropTypes.node]).isRequired | ||
@@ -648,3 +1083,5 @@ }; | ||
value: function render() { | ||
var type = this.context.ariaManager.type; | ||
var _context$tabs = this.context.tabs; | ||
var accordion = _context$tabs.accordion; | ||
var multiselect = _context$tabs.multiselect; | ||
var _props = this.props; | ||
@@ -658,3 +1095,3 @@ var tag = _props.tag; | ||
if (type === 'accordion') { | ||
if (accordion && multiselect) { | ||
componentProps['aria-multiselectable'] = true; | ||
@@ -677,3 +1114,3 @@ } | ||
TabList.contextTypes = { | ||
ariaManager: _react.PropTypes.object.isRequired | ||
tabs: _react.PropTypes.object.isRequired | ||
}; | ||
@@ -688,3 +1125,3 @@ TabList.propTypes = checkedProps; | ||
/***/ }, | ||
/* 11 */ | ||
/* 16 */ | ||
/***/ function(module, exports, __webpack_require__) { | ||
@@ -721,6 +1158,5 @@ | ||
var checkedProps = { | ||
tag: _react.PropTypes.string, | ||
id: _react.PropTypes.oneOfType([_react.PropTypes.string, _react.PropTypes.number]).isRequired, | ||
isActive: _react.PropTypes.bool, | ||
children: _react.PropTypes.oneOfType([_react.PropTypes.func, _react.PropTypes.node]).isRequired | ||
tag: _react.PropTypes.string | ||
}; | ||
@@ -748,14 +1184,23 @@ | ||
_this.setState({ isActive: !_this.state.isActive }); | ||
}, _this._handleClick = function (e) { | ||
var onClick = _this.props.onClick; | ||
_this.context.tabs.activateTab(_this.props.id); | ||
if (typeof onClick === 'function') { | ||
onClick(e); | ||
} | ||
}, _this._handleKeyDown = function (e) { | ||
var _this$context$ariaMan = _this.context.ariaManager; | ||
var type = _this$context$ariaMan.type; | ||
var activateTab = _this$context$ariaMan.activateTab; | ||
var _this$props = _this.props; | ||
var id = _this$props.id; | ||
var tag = _this$props.tag; | ||
var onKeyDown = _this$props.onKeyDown; | ||
if (type === 'accordion' && [' ', 'Enter'].indexOf(e.key) > -1) { | ||
activateTab(id); | ||
if (tag !== 'button' && ['Enter', ' '].indexOf(e.key) > -1) { | ||
e.preventDefault(); | ||
_this.context.tabs.activateTab(id); | ||
} | ||
if (onKeyDown) { | ||
@@ -765,14 +1210,8 @@ onKeyDown(e); | ||
}, _this._handleFocus = function (e) { | ||
var _this$context$ariaMan2 = _this.context.ariaManager; | ||
var type = _this$context$ariaMan2.type; | ||
var activateTab = _this$context$ariaMan2.activateTab; | ||
var _this$props2 = _this.props; | ||
var id = _this$props2.id; | ||
var onFocus = _this$props2.onFocus; | ||
var onFocus = _this.props.onFocus; | ||
if (type === 'tabs') { | ||
activateTab(id); | ||
} | ||
if (onFocus) { | ||
_this.context.tabs.activateTab(_this.props.id); | ||
if (typeof onFocus === 'function') { | ||
onFocus(e); | ||
@@ -787,3 +1226,2 @@ } | ||
this._member = { | ||
type: 'tab', | ||
id: this.props.id, | ||
@@ -795,3 +1233,3 @@ node: (0, _reactDom.findDOMNode)(this), | ||
}; | ||
this.context.ariaManager.addMember(this._member); | ||
this.context.tabs.members.add(this._member); | ||
} | ||
@@ -801,3 +1239,3 @@ }, { | ||
value: function componentWillUnmount() { | ||
this.context.ariaManager.removeMember(this._member); | ||
this.context.tabs.members.remove(this._member); | ||
} | ||
@@ -807,3 +1245,3 @@ }, { | ||
value: function render() { | ||
var type = this.context.ariaManager.type; | ||
var accordion = this.context.tabs.accordion; | ||
var _props = this.props; | ||
@@ -819,12 +1257,14 @@ var tag = _props.tag; | ||
role: 'tab', | ||
tabIndex: type === 'accordion' ? 0 : isActive ? 0 : -1, | ||
tabIndex: accordion ? 0 : isActive ? 0 : -1, | ||
'aria-selected': isActive, | ||
'aria-controls': id + '-panel', | ||
'aria-disabled': disabled, | ||
onKeyDown: this._handleKeyDown, | ||
onFocus: this._handleFocus | ||
'aria-disabled': disabled | ||
}; | ||
if (type === 'accordion') { | ||
if (accordion) { | ||
componentProps['aria-expanded'] = isActive; | ||
componentProps['onClick'] = this._handleClick; | ||
componentProps['onKeyDown'] = this._handleKeyDown; | ||
} else { | ||
componentProps['onFocus'] = this._handleFocus; | ||
} | ||
@@ -846,3 +1286,3 @@ | ||
Tab.contextTypes = { | ||
ariaManager: _react.PropTypes.object.isRequired | ||
tabs: _react.PropTypes.object.isRequired | ||
}; | ||
@@ -857,3 +1297,3 @@ Tab.propTypes = checkedProps; | ||
/***/ }, | ||
/* 12 */ | ||
/* 17 */ | ||
/***/ function(module, exports, __webpack_require__) { | ||
@@ -892,6 +1332,5 @@ | ||
var checkedProps = { | ||
tag: _react.PropTypes.string, | ||
controlledBy: _react.PropTypes.oneOfType([_react.PropTypes.string, _react.PropTypes.number]).isRequired, | ||
isActive: _react.PropTypes.bool, | ||
children: _react.PropTypes.oneOfType([_react.PropTypes.func, _react.PropTypes.node]).isRequired | ||
tag: _react.PropTypes.string | ||
}; | ||
@@ -920,7 +1359,11 @@ | ||
}, _this._handleKeyDown = function (e) { | ||
var onKeyDown = _this.props.onKeyDown; | ||
if (e.ctrlKey && e.key === 'ArrowUp') { | ||
_this.context.ariaManager.focusTab(_this.props.controlledBy); | ||
_this.context.members.focus(_this.props.controlledBy); | ||
} | ||
if (_this.props.onKeyDown) { | ||
_this.props.onKeyDown(e); | ||
if (typeof onKeyDown === 'function') { | ||
onKeyDown(e); | ||
} | ||
@@ -933,3 +1376,3 @@ }, _temp), _possibleConstructorReturn(_this, _ret); | ||
value: function componentDidMount() { | ||
this.context.ariaManager.addPanel({ | ||
this.context.tabs.addPanel({ | ||
controlledBy: this.props.controlledBy, | ||
@@ -979,3 +1422,3 @@ node: (0, _reactDom.findDOMNode)(this), | ||
TabPanel.contextTypes = { | ||
ariaManager: _react.PropTypes.object.isRequired | ||
tabs: _react.PropTypes.object.isRequired | ||
}; | ||
@@ -989,529 +1432,2 @@ TabPanel.propTypes = checkedProps; | ||
/***/ }, | ||
/* 13 */ | ||
/***/ function(module, exports, __webpack_require__) { | ||
'use strict'; | ||
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 _focusGroup = __webpack_require__(14); | ||
var _focusGroup2 = _interopRequireDefault(_focusGroup); | ||
var _noScroll = __webpack_require__(15); | ||
var _noScroll2 = _interopRequireDefault(_noScroll); | ||
var _eventsHandler = __webpack_require__(16); | ||
var _eventsHandler2 = _interopRequireDefault(_eventsHandler); | ||
var _specialAssign = __webpack_require__(5); | ||
var _specialAssign2 = _interopRequireDefault(_specialAssign); | ||
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 isTarget = function isTarget(node, target) { | ||
return node === target || node.contains(target); | ||
}; | ||
var KEYS = { | ||
tab: 9, | ||
escape: 27, | ||
end: 35, | ||
home: 36, | ||
arrowLeft: 37, | ||
arrowUp: 38, | ||
arrowRight: 39, | ||
arrowDown: 40 | ||
}; | ||
var checkedProps = { | ||
type: _react.PropTypes.oneOf(['menu', 'popover', 'modal', 'tooltip', 'alert', 'tabs', 'accordion']).isRequired, | ||
tag: _react.PropTypes.string, | ||
trapFocus: _react.PropTypes.bool, | ||
freezeScroll: _react.PropTypes.bool, | ||
activeTabId: _react.PropTypes.oneOfType([_react.PropTypes.string, _react.PropTypes.number]), | ||
children: _react.PropTypes.oneOfType([_react.PropTypes.func, _react.PropTypes.node]).isRequired, | ||
keybindings: _react.PropTypes.shape({ | ||
next: _react.PropTypes.oneOfType([_react.PropTypes.object, _react.PropTypes.array]), | ||
prev: _react.PropTypes.oneOfType([_react.PropTypes.object, _react.PropTypes.array]), | ||
first: _react.PropTypes.oneOfType([_react.PropTypes.object, _react.PropTypes.array]), | ||
last: _react.PropTypes.oneOfType([_react.PropTypes.object, _react.PropTypes.array]) | ||
}), | ||
wrap: _react.PropTypes.bool, | ||
stringSearch: _react.PropTypes.bool, | ||
stringSearchDelay: _react.PropTypes.number, | ||
collapsible: _react.PropTypes.bool, | ||
openPopoverOn: _react.PropTypes.oneOf(['tap', 'hover']), | ||
closeOnOutsideClick: _react.PropTypes.bool, | ||
closeOnItemSelection: _react.PropTypes.bool, | ||
accordion: _react.PropTypes.bool, | ||
onPopoverOpen: _react.PropTypes.func, | ||
onPopoverClose: _react.PropTypes.func, | ||
onItemSelection: _react.PropTypes.func | ||
}; | ||
var Manager = function (_Component) { | ||
_inherits(Manager, _Component); | ||
function Manager(props) { | ||
_classCallCheck(this, Manager); | ||
var _this = _possibleConstructorReturn(this, (Manager.__proto__ || Object.getPrototypeOf(Manager)).call(this, props)); | ||
_this._onItemSelection = function (item, e) { | ||
var value = item.value || item.node.innerHTML; | ||
if (_this.props.closeOnItemSelection) { | ||
_this.closePopover(); | ||
} | ||
_this.props.onItemSelection(value, e); | ||
}; | ||
_this._setToggleNode = function (node) { | ||
_this._toggle = node; | ||
}; | ||
_this._setPopoverNode = function (node) { | ||
_this._popover = node; | ||
}; | ||
_this._addMember = function (member) { | ||
var activeTabId = _this.props.activeTabId; | ||
var id = member.id; | ||
var index = member.index; | ||
var node = member.node; | ||
var text = member.text; | ||
if (index === undefined) { | ||
_this._members.push(member); | ||
} else { | ||
_this._members.splice(index, 0, member); | ||
} | ||
_this._focusGroup.addMember({ | ||
node: node, | ||
text: text || node.innerHTML | ||
}); | ||
if (member.type === 'tab') { | ||
if (activeTabId === id) { | ||
_this._activateTab(activeTabId, true, false); | ||
} else { | ||
_this._handleFirstTabSelection(id); | ||
} | ||
} | ||
}; | ||
_this._removeMember = function (member) { | ||
var pos = _this._members.indexOf(member); | ||
if (pos > -1) { | ||
_this._members.splice(member, 1); | ||
_this._focusGroup.removeMember(member.node); | ||
} | ||
}; | ||
_this._focusItem = function (index) { | ||
_this._focusGroup.focusNodeAtIndex(index); | ||
}; | ||
_this.openPopover = function () { | ||
var focusFirstMember = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : true; | ||
var _this$props = _this.props; | ||
var freezeScroll = _this$props.freezeScroll; | ||
var onPopoverOpen = _this$props.onPopoverOpen; | ||
if (_this.state.isPopoverOpen) return; | ||
_this.setState({ isPopoverOpen: true }); | ||
if (freezeScroll) { | ||
_noScroll2.default.on(); | ||
} | ||
onPopoverOpen(); | ||
if (focusFirstMember) { | ||
setTimeout(function () { | ||
_this._focusItem(0); | ||
}, 60); | ||
} | ||
}; | ||
_this.closePopover = function () { | ||
var focusToggle = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : true; | ||
var _this$props2 = _this.props; | ||
var freezeScroll = _this$props2.freezeScroll; | ||
var onPopoverClose = _this$props2.onPopoverClose; | ||
if (!_this.state.isPopoverOpen) return; | ||
_this.setState({ isPopoverOpen: false }); | ||
if (freezeScroll) { | ||
_noScroll2.default.off(); | ||
} | ||
onPopoverClose(); | ||
if (focusToggle) { | ||
setTimeout(function () { | ||
_this._toggle.focus(); | ||
}, 60); | ||
} | ||
}; | ||
_this.togglePopover = function (focus) { | ||
if (!_this.state.isPopoverOpen) { | ||
_this.openPopover(focus); | ||
} else { | ||
_this.closePopover(focus); | ||
} | ||
}; | ||
_this._addPanel = function (panel) { | ||
var activeTabId = _this.props.activeTabId; | ||
var controlledBy = panel.controlledBy; | ||
_this._panels.push(panel); | ||
if (activeTabId === controlledBy) { | ||
_this._activateTab(activeTabId, true, false); | ||
} else { | ||
_this._handleFirstTabSelection(panel.controlledBy); | ||
} | ||
}; | ||
_this._focusTab = function (id) { | ||
var tabToFocus = _this._members.filter(function (tab) { | ||
return tab.id === id; | ||
}); | ||
if (tabToFocus) { | ||
tabToFocus.node.focus(); | ||
} | ||
}; | ||
_this._activateTab = function (id, forceActivate) { | ||
var shouldChange = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : true; | ||
var _this$props3 = _this.props; | ||
var type = _this$props3.type; | ||
var onChange = _this$props3.onChange; | ||
if (type === 'tabs') { | ||
if (id === _this._activeTabId && !forceActivate) { | ||
return; | ||
} else { | ||
_this._activeTabId = id; | ||
} | ||
} | ||
// shouldChange makes sure we don't fire callbacks when we don't need to | ||
if (shouldChange && typeof onChange === 'function') { | ||
onChange(id); | ||
// if onChange is being used we don't need to go any farther since the | ||
// user is now controlling state | ||
return; | ||
} | ||
for (var i = _this._members.length; i--;) { | ||
var tab = _this._members[i]; | ||
if (type === 'accordion') { | ||
if (tab.id === id) { | ||
tab.toggleActiveState(); | ||
} | ||
} else { | ||
tab.setActiveState(id === tab.id); | ||
} | ||
} | ||
for (var _i = _this._panels.length; _i--;) { | ||
var panel = _this._panels[_i]; | ||
if (type === 'accordion') { | ||
if (panel.controlledBy === id) { | ||
panel.toggleActiveState(); | ||
} | ||
} else { | ||
panel.setActiveState(id === panel.controlledBy); | ||
} | ||
} | ||
}; | ||
_this.state = { | ||
isPopoverOpen: false | ||
}; | ||
_this._focusGroup = (0, _focusGroup2.default)(props); | ||
_this._toggle = null; | ||
_this._popover = null; | ||
_this._members = []; | ||
_this._panels = []; | ||
_this._activeTabId = props.activeTabId; | ||
_this._uuid = 'RA' + Math.abs(~~(Math.random() * new Date())); | ||
return _this; | ||
} | ||
_createClass(Manager, [{ | ||
key: 'getChildContext', | ||
value: function getChildContext() { | ||
return { | ||
ariaManager: { | ||
uuid: this._uuid, | ||
type: this.props.type, | ||
trapFocus: this.props.trapFocus, | ||
initialFocus: this.props.initialFocus, | ||
isPopoverOpen: this.state.isPopoverOpen, | ||
onItemSelection: this._onItemSelection, | ||
setToggleNode: this._setToggleNode, | ||
setPopoverNode: this._setPopoverNode, | ||
addMember: this._addMember, | ||
addPanel: this._addPanel, | ||
removeMember: this._removeMember, | ||
activateTab: this._activateTab, | ||
focusItem: this._focusItem, | ||
openPopover: this.openPopover, | ||
closePopover: this.closePopover, | ||
togglePopover: this.togglePopover | ||
} | ||
}; | ||
} | ||
}, { | ||
key: 'componentWillMount', | ||
value: function componentWillMount() { | ||
this._focusGroup.activate(); | ||
_eventsHandler2.default.add(this); | ||
} | ||
}, { | ||
key: 'componentWillUnmount', | ||
value: function componentWillUnmount() { | ||
this._focusGroup.deactivate(); | ||
_eventsHandler2.default.remove(this); | ||
} | ||
}, { | ||
key: '_onTap', | ||
value: function _onTap(e) { | ||
if (this.props.openPopoverOn === 'tap') { | ||
this._handleTapOrHover(e); | ||
} | ||
} | ||
}, { | ||
key: '_onHover', | ||
value: function _onHover(e) { | ||
if (this.props.openPopoverOn === 'hover') { | ||
this._handleTapOrHover(e); | ||
} | ||
} | ||
}, { | ||
key: '_handleTapOrHover', | ||
value: function _handleTapOrHover(e) { | ||
var _props = this.props; | ||
var openPopoverOn = _props.openPopoverOn; | ||
var closeOnOutsideClick = _props.closeOnOutsideClick; | ||
var target = e.target; | ||
if (this._toggle) { | ||
var toggleDisabled = this._toggle.getAttribute('disabled'); | ||
if (isTarget(this._toggle, target) && toggleDisabled === null) { | ||
if (openPopoverOn === 'tap') { | ||
this.togglePopover(false); | ||
} else { | ||
this.openPopover(false); | ||
} | ||
return; | ||
} else if (closeOnOutsideClick && this._popover && !isTarget(this._popover, target)) { | ||
this.closePopover(false); | ||
return; | ||
} | ||
} | ||
for (var i = this._members.length; i--;) { | ||
var member = this._members[i]; | ||
if (member.node === target) { | ||
if (member.type === 'item') { | ||
this._onItemSelection(member, e); | ||
} else { | ||
this._activateTab(member.id); | ||
} | ||
return; | ||
} | ||
} | ||
} | ||
}, { | ||
key: '_onKeyDown', | ||
value: function _onKeyDown(_ref) { | ||
var keyCode = _ref.keyCode; | ||
if (this.state.isPopoverOpen) { | ||
if (!this.props.trapFocus && keyCode === KEYS.tab) { | ||
this.closePopover(false); | ||
} else if (keyCode === KEYS.escape) { | ||
this.closePopover(); | ||
} | ||
} | ||
} | ||
}, { | ||
key: '_handleFirstTabSelection', | ||
value: function _handleFirstTabSelection(id) { | ||
if (this.props.type === 'tabs' && !this._activeTabId || id === this._activeTabId) { | ||
this._activateTab(id, true, false); | ||
} | ||
} | ||
}, { | ||
key: 'render', | ||
value: function render() { | ||
var _props2 = this.props; | ||
var tag = _props2.tag; | ||
var children = _props2.children; | ||
var props = (0, _specialAssign2.default)({}, this.props, checkedProps); | ||
if (typeof children === 'function') { | ||
return children(this.state.isPopoverOpen); | ||
} | ||
return (0, _react.createElement)(tag, props, children); | ||
} | ||
}]); | ||
return Manager; | ||
}(_react.Component); | ||
Manager.childContextTypes = { | ||
ariaManager: _react.PropTypes.object.isRequired | ||
}; | ||
Manager.propTypes = checkedProps; | ||
Manager.defaultProps = { | ||
tag: 'div', | ||
trapFocus: false, | ||
freezeScroll: false, | ||
keybindings: { | ||
next: [{ keyCode: KEYS.arrowDown }, { keyCode: KEYS.arrowRight }], | ||
prev: [{ keyCode: KEYS.arrowUp }, { keyCode: KEYS.arrowLeft }], | ||
first: { keyCode: KEYS.home }, | ||
last: { keyCode: KEYS.end } | ||
}, | ||
wrap: true, | ||
stringSearch: true, | ||
stringSearchDelay: 600, | ||
collapsible: false, | ||
openPopoverOn: 'tap', | ||
closeOnOutsideClick: true, | ||
closeOnItemSelection: true, | ||
onPopoverOpen: function onPopoverOpen() { | ||
return null; | ||
}, | ||
onPopoverClose: function onPopoverClose() { | ||
return null; | ||
}, | ||
onItemSelection: function onItemSelection() { | ||
return null; | ||
} | ||
}; | ||
exports.default = Manager; | ||
module.exports = exports['default']; | ||
/***/ }, | ||
/* 14 */ | ||
/***/ function(module, exports) { | ||
module.exports = __WEBPACK_EXTERNAL_MODULE_14__; | ||
/***/ }, | ||
/* 15 */ | ||
/***/ function(module, exports) { | ||
module.exports = __WEBPACK_EXTERNAL_MODULE_15__; | ||
/***/ }, | ||
/* 16 */ | ||
/***/ function(module, exports, __webpack_require__) { | ||
'use strict'; | ||
Object.defineProperty(exports, "__esModule", { | ||
value: true | ||
}); | ||
var _teenyTap = __webpack_require__(17); | ||
var _teenyTap2 = _interopRequireDefault(_teenyTap); | ||
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } | ||
exports.default = { | ||
_queue: [], | ||
add: function add(component) { | ||
this._queue.push(component); | ||
// attach listeners if this was the first component added | ||
if (this._queue.length === 1) { | ||
this._attachListeners(); | ||
} | ||
}, | ||
remove: function remove(component) { | ||
var pos = this._queue.indexOf(component); | ||
if (pos > -1) { | ||
this._queue.splice(pos, 1); | ||
} | ||
// detach listeners if this was the last component removed | ||
if (this._queue.length <= 0) { | ||
this._detachListeners(); | ||
} | ||
}, | ||
_attachListeners: function _attachListeners() { | ||
this._tapListener = (0, _teenyTap2.default)(document.documentElement, this._documentEvent.bind(this, '_onTap')); | ||
document.addEventListener('mouseover', this._documentEvent.bind(this, '_onHover')); | ||
document.addEventListener('keydown', this._documentEvent.bind(this, '_onKeyDown')); | ||
}, | ||
_detachListeners: function _detachListeners() { | ||
this._tapListener.remove(); | ||
document.removeEventListener('mouseover', this._documentEvent); | ||
document.removeEventListener('keydown', this._documentEvent); | ||
}, | ||
_documentEvent: function _documentEvent(method, e) { | ||
for (var i = this._queue.length; i--;) { | ||
this._queue[i][method](e); | ||
} | ||
} | ||
}; | ||
module.exports = exports['default']; | ||
/***/ }, | ||
/* 17 */ | ||
/***/ function(module, exports) { | ||
module.exports = __WEBPACK_EXTERNAL_MODULE_17__; | ||
/***/ } | ||
@@ -1518,0 +1434,0 @@ /******/ ]) |
/*! | ||
* React Aria 0.5.0 | ||
* React Aria 0.6.0 | ||
* https://github.com/souporserious/react-aria | ||
* Copyright (c) 2016 React Aria Authors | ||
*/ | ||
!function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t(require("react"),require("react-dom"),require("focus-trap"),require("focus-group"),require("no-scroll"),require("teeny-tap")):"function"==typeof define&&define.amd?define(["react","react-dom","focus-trap","focus-group","no-scroll","teeny-tap"],t):"object"==typeof exports?exports.ReactARIA=t(require("react"),require("react-dom"),require("focus-trap"),require("focus-group"),require("no-scroll"),require("teeny-tap")):e.ReactARIA=t(e.React,e.ReactDOM,e.focusTrap,e.createFocusGroup,e.noScroll,e.createTapListener)}(this,function(e,t,o,n,r,i){return function(e){function t(n){if(o[n])return o[n].exports;var r=o[n]={exports:{},id:n,loaded:!1};return e[n].call(r.exports,r,r.exports,t),r.loaded=!0,r.exports}var o={};return t.m=e,t.c=o,t.p="dist/",t(0)}([function(e,t,o){"use strict";function n(e){return e&&e.__esModule?e:{"default":e}}Object.defineProperty(t,"__esModule",{value:!0}),t.Manager=void 0;var r=o(1);Object.keys(r).forEach(function(e){"default"!==e&&"__esModule"!==e&&Object.defineProperty(t,e,{enumerable:!0,get:function(){return r[e]}})});var i=o(9);Object.keys(i).forEach(function(e){"default"!==e&&"__esModule"!==e&&Object.defineProperty(t,e,{enumerable:!0,get:function(){return i[e]}})});var a=o(13),s=n(a);t.Manager=s["default"]},function(e,t,o){"use strict";function n(e){return e&&e.__esModule?e:{"default":e}}Object.defineProperty(t,"__esModule",{value:!0}),t.Item=t.Popover=t.Toggle=void 0;var r=o(2),i=n(r),a=o(6),s=n(a),p=o(8),u=n(p);t.Toggle=i["default"],t.Popover=s["default"],t.Item=u["default"]},function(e,t,o){"use strict";function n(e){return e&&e.__esModule?e:{"default":e}}function r(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function i(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function a(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}Object.defineProperty(t,"__esModule",{value:!0});var s=function(){function e(e,t){for(var o=0;o<t.length;o++){var n=t[o];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}return function(t,o,n){return o&&e(t.prototype,o),n&&e(t,n),t}}(),p=o(3),u=(n(p),o(4)),c=(n(u),o(5)),l=n(c),f={tag:p.PropTypes.string,children:p.PropTypes.oneOfType([p.PropTypes.func,p.PropTypes.node]).isRequired},d=function(e){function t(){var e,o,n,a;r(this,t);for(var s=arguments.length,p=Array(s),u=0;u<s;u++)p[u]=arguments[u];return o=n=i(this,(e=t.__proto__||Object.getPrototypeOf(t)).call.apply(e,[this].concat(p))),n._handleKeyDown=function(e){(["ArrowUp","ArrowDown"," "].indexOf(e.key)>-1||"button"!==n.props.tag&&"Enter"===e.key)&&(n.context.ariaManager.isPopoverOpen?n.context.ariaManager.focusItem(0):n.context.ariaManager.openPopover()),n.props.onKeyDown&&n.props.onKeyDown(e)},a=o,i(n,a)}return a(t,e),s(t,[{key:"componentDidMount",value:function(){this.context.ariaManager.setToggleNode((0,u.findDOMNode)(this))}},{key:"render",value:function(){var e=this.context.ariaManager,t=e.type,o=e.uuid,n=e.isPopoverOpen,r=this.props,i=r.tag,a=r.disabled,s=r.children,u={role:"button",tabIndex:a?"":0,"aria-haspopup":!0,"aria-expanded":n,"aria-disabled":a,onKeyDown:this._handleKeyDown};"popover"===t&&(u.id=o),"tooltip"===t&&(u["aria-describedby"]=o);var c=(0,l["default"])(u,this.props,f);return"function"==typeof s?s(c):(0,p.createElement)(i,c,s)}}]),t}(p.Component);d.contextTypes={ariaManager:p.PropTypes.object.isRequired},d.propTypes=f,d.defaultProps={tag:"button"},t["default"]=d,e.exports=t["default"]},function(t,o){t.exports=e},function(e,o){e.exports=t},function(e,t){"use strict";function o(e,t,o){for(var n in t)t.hasOwnProperty(n)&&!o[n]&&(e[n]=t[n]);return e}Object.defineProperty(t,"__esModule",{value:!0}),t["default"]=o,e.exports=t["default"]},function(e,t,o){"use strict";function n(e){return e&&e.__esModule?e:{"default":e}}function r(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function i(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function a(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}Object.defineProperty(t,"__esModule",{value:!0});var s=function(){function e(e,t){for(var o=0;o<t.length;o++){var n=t[o];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}return function(t,o,n){return o&&e(t.prototype,o),n&&e(t,n),t}}(),p=o(3),u=(n(p),o(4)),c=(n(u),o(7)),l=n(c),f=o(5),d=n(f),y={tag:p.PropTypes.string,children:p.PropTypes.oneOfType([p.PropTypes.func,p.PropTypes.node]).isRequired},v=function(e){function t(){return r(this,t),i(this,(t.__proto__||Object.getPrototypeOf(t)).apply(this,arguments))}return a(t,e),s(t,[{key:"componentDidMount",value:function(){var e=this.context.ariaManager,t=e.trapFocus,o=e.initialFocus;e.onClickOutside;this._setPopoverNode(),t&&(this._focusTrap=(0,l["default"])((0,u.findDOMNode)(this),{initialFocus:o,escapeDeactivates:!1,clickOutsideDeactivates:!0}).activate())}},{key:"componentWillUnmount",value:function(){this.context.ariaManager.trapFocus&&this._focusTrap.deactivate()}},{key:"componentDidUpdate",value:function(e,t,o){this.context.ariaManager.isPopoverOpen!==o.ariaManager.isPopoverOpen&&this._setPopoverNode()}},{key:"_setPopoverNode",value:function(){this.context.ariaManager.setPopoverNode((0,u.findDOMNode)(this))}},{key:"render",value:function(){var e=this.context.ariaManager,t=e.type,o=e.uuid,n=e.isPopoverOpen,r=this.props,i=r.tag,a=r.children,s={"aria-hidden":!n};"menu"===t?s.role="menu":"modal"===t?s.role="dialog":"alert"===t?s.role="alertdialog":"tooltip"===t&&(s.id=o,s.role="tooltip"),"popover"===t&&(s["aria-labelledby"]=o);var u=(0,d["default"])(s,this.props,y);return"function"==typeof a?a(u):(0,p.createElement)(i,u,a)}}]),t}(p.Component);v.contextTypes={ariaManager:p.PropTypes.object.isRequired},v.propTypes=y,v.defaultProps={tag:"div"},t["default"]=v,e.exports=t["default"]},function(e,t){e.exports=o},function(e,t,o){"use strict";function n(e){return e&&e.__esModule?e:{"default":e}}function r(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function i(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function a(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}Object.defineProperty(t,"__esModule",{value:!0});var s=function(){function e(e,t){for(var o=0;o<t.length;o++){var n=t[o];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}return function(t,o,n){return o&&e(t.prototype,o),n&&e(t,n),t}}(),p=o(3),u=(n(p),o(4)),c=(n(u),o(5)),l=n(c),f={tag:p.PropTypes.string,children:p.PropTypes.oneOfType([p.PropTypes.func,p.PropTypes.node]).isRequired},d=function(e){function t(){var e,o,n,a;r(this,t);for(var s=arguments.length,p=Array(s),u=0;u<s;u++)p[u]=arguments[u];return o=n=i(this,(e=t.__proto__||Object.getPrototypeOf(t)).call.apply(e,[this].concat(p))),n._handleKeyDown=function(e){var t=n.props.onKeyDown;[" ","Enter"].indexOf(e.key)>-1&&n.context.ariaManager.onItemSelection(n._member,e),t&&t(e)},a=o,i(n,a)}return a(t,e),s(t,[{key:"componentDidMount",value:function(){this._member={type:"item",node:(0,u.findDOMNode)(this),text:this.props.text},this.context.ariaManager.addMember(this._member)}},{key:"componentWillUnmount",value:function(){this.context.ariaManager.removeMember(this._member)}},{key:"render",value:function(){var e=this.props,t=e.tag,o=e.children,n=(0,l["default"])({role:"menuitem",tabIndex:-1,onKeyDown:this._handleKeyDown},this.props,f);return"function"==typeof o?o(n):(0,p.createElement)(t,n,o)}}]),t}(p.Component);d.contextTypes={ariaManager:p.PropTypes.object.isRequired},d.propTypes=f,d.defaultProps={tag:"div"},t["default"]=d,e.exports=t["default"]},function(e,t,o){"use strict";function n(e){return e&&e.__esModule?e:{"default":e}}Object.defineProperty(t,"__esModule",{value:!0}),t.TabPanel=t.Tab=t.TabList=void 0;var r=o(10),i=n(r),a=o(11),s=n(a),p=o(12),u=n(p);t.TabList=i["default"],t.Tab=s["default"],t.TabPanel=u["default"]},function(e,t,o){"use strict";function n(e){return e&&e.__esModule?e:{"default":e}}function r(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function i(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function a(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}Object.defineProperty(t,"__esModule",{value:!0});var s=function(){function e(e,t){for(var o=0;o<t.length;o++){var n=t[o];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}return function(t,o,n){return o&&e(t.prototype,o),n&&e(t,n),t}}(),p=o(3),u=(n(p),o(5)),c=n(u),l={tag:p.PropTypes.string,children:p.PropTypes.oneOfType([p.PropTypes.func,p.PropTypes.node]).isRequired},f=function(e){function t(){return r(this,t),i(this,(t.__proto__||Object.getPrototypeOf(t)).apply(this,arguments))}return a(t,e),s(t,[{key:"render",value:function(){var e=this.context.ariaManager.type,t=this.props,o=t.tag,n=t.children,r={role:"tablist"};"accordion"===e&&(r["aria-multiselectable"]=!0);var i=(0,c["default"])(r,this.props,l);return"function"==typeof n?n(i):(0,p.createElement)(o,i,n)}}]),t}(p.Component);f.contextTypes={ariaManager:p.PropTypes.object.isRequired},f.propTypes=l,f.defaultProps={tag:"div"},t["default"]=f,e.exports=t["default"]},function(e,t,o){"use strict";function n(e){return e&&e.__esModule?e:{"default":e}}function r(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function i(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function a(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}Object.defineProperty(t,"__esModule",{value:!0});var s=function(){function e(e,t){for(var o=0;o<t.length;o++){var n=t[o];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}return function(t,o,n){return o&&e(t.prototype,o),n&&e(t,n),t}}(),p=o(3),u=(n(p),o(4)),c=(n(u),o(5)),l=n(c),f={tag:p.PropTypes.string,id:p.PropTypes.oneOfType([p.PropTypes.string,p.PropTypes.number]).isRequired,isActive:p.PropTypes.bool,children:p.PropTypes.oneOfType([p.PropTypes.func,p.PropTypes.node]).isRequired},d=function(e){function t(){var e,o,n,a;r(this,t);for(var s=arguments.length,p=Array(s),u=0;u<s;u++)p[u]=arguments[u];return o=n=i(this,(e=t.__proto__||Object.getPrototypeOf(t)).call.apply(e,[this].concat(p))),n.state={isActive:!1},n._setActiveState=function(e){n.setState({isActive:e})},n._toggleActiveState=function(){n.setState({isActive:!n.state.isActive})},n._handleKeyDown=function(e){var t=n.context.ariaManager,o=t.type,r=t.activateTab,i=n.props,a=i.id,s=i.onKeyDown;"accordion"===o&&[" ","Enter"].indexOf(e.key)>-1&&r(a),s&&s(e)},n._handleFocus=function(e){var t=n.context.ariaManager,o=t.type,r=t.activateTab,i=n.props,a=i.id,s=i.onFocus;"tabs"===o&&r(a),s&&s(e)},a=o,i(n,a)}return a(t,e),s(t,[{key:"componentDidMount",value:function(){this._member={type:"tab",id:this.props.id,node:(0,u.findDOMNode)(this),text:this.props.text,setActiveState:this._setActiveState,toggleActiveState:this._toggleActiveState},this.context.ariaManager.addMember(this._member)}},{key:"componentWillUnmount",value:function(){this.context.ariaManager.removeMember(this._member)}},{key:"render",value:function(){var e=this.context.ariaManager.type,t=this.props,o=t.tag,n=t.id,r=t.disabled,i=t.children,a=void 0!==this.props.isActive?this.props.isActive:this.state.isActive,s={id:n,role:"tab",tabIndex:"accordion"===e?0:a?0:-1,"aria-selected":a,"aria-controls":n+"-panel","aria-disabled":r,onKeyDown:this._handleKeyDown,onFocus:this._handleFocus};"accordion"===e&&(s["aria-expanded"]=a);var u=(0,l["default"])(s,this.props,f);return"function"==typeof i?i(u,a):(0,p.createElement)(o,u,i)}}]),t}(p.Component);d.contextTypes={ariaManager:p.PropTypes.object.isRequired},d.propTypes=f,d.defaultProps={tag:"div"},t["default"]=d,e.exports=t["default"]},function(e,t,o){"use strict";function n(e){return e&&e.__esModule?e:{"default":e}}function r(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function i(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function a(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}Object.defineProperty(t,"__esModule",{value:!0});var s=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var o=arguments[t];for(var n in o)Object.prototype.hasOwnProperty.call(o,n)&&(e[n]=o[n])}return e},p=function(){function e(e,t){for(var o=0;o<t.length;o++){var n=t[o];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}return function(t,o,n){return o&&e(t.prototype,o),n&&e(t,n),t}}(),u=o(3),c=(n(u),o(4)),l=(n(c),o(5)),f=n(l),d={tag:u.PropTypes.string,controlledBy:u.PropTypes.oneOfType([u.PropTypes.string,u.PropTypes.number]).isRequired,isActive:u.PropTypes.bool,children:u.PropTypes.oneOfType([u.PropTypes.func,u.PropTypes.node]).isRequired},y=function(e){function t(){var e,o,n,a;r(this,t);for(var s=arguments.length,p=Array(s),u=0;u<s;u++)p[u]=arguments[u];return o=n=i(this,(e=t.__proto__||Object.getPrototypeOf(t)).call.apply(e,[this].concat(p))),n.state={isActive:!1},n._setActiveState=function(e){n.setState({isActive:e})},n._toggleActiveState=function(){n.setState({isActive:!n.state.isActive})},n._handleKeyDown=function(e){e.ctrlKey&&"ArrowUp"===e.key&&n.context.ariaManager.focusTab(n.props.controlledBy),n.props.onKeyDown&&n.props.onKeyDown(e)},a=o,i(n,a)}return a(t,e),p(t,[{key:"componentDidMount",value:function(){this.context.ariaManager.addPanel({controlledBy:this.props.controlledBy,node:(0,c.findDOMNode)(this),setActiveState:this._setActiveState,toggleActiveState:this._toggleActiveState})}},{key:"render",value:function(){var e=this.props,t=e.tag,o=e.controlledBy,n=(e.disabled,e.children),r=void 0!==this.props.isActive?this.props.isActive:this.state.isActive,i={id:o+"-panel",role:"tabpanel","aria-hidden":!r,"aria-labelledby":o,onKeyDown:this._handleKeyDown};r||(i.style=s({display:"none"},this.props.style));var a=(0,f["default"])(i,this.props,d);return"function"==typeof n?n(a,r):(0,u.createElement)(t,a,n)}}]),t}(u.Component);y.contextTypes={ariaManager:u.PropTypes.object.isRequired},y.propTypes=d,y.defaultProps={tag:"div"},t["default"]=y,e.exports=t["default"]},function(e,t,o){"use strict";function n(e){return e&&e.__esModule?e:{"default":e}}function r(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function i(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function a(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}Object.defineProperty(t,"__esModule",{value:!0});var s=function(){function e(e,t){for(var o=0;o<t.length;o++){var n=t[o];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}return function(t,o,n){return o&&e(t.prototype,o),n&&e(t,n),t}}(),p=o(3),u=(n(p),o(14)),c=n(u),l=o(15),f=n(l),d=o(16),y=n(d),v=o(5),h=n(v),b=function(e,t){return e===t||e.contains(t)},_={tab:9,escape:27,end:35,home:36,arrowLeft:37,arrowUp:38,arrowRight:39,arrowDown:40},P={type:p.PropTypes.oneOf(["menu","popover","modal","tooltip","alert","tabs","accordion"]).isRequired,tag:p.PropTypes.string,trapFocus:p.PropTypes.bool,freezeScroll:p.PropTypes.bool,activeTabId:p.PropTypes.oneOfType([p.PropTypes.string,p.PropTypes.number]),children:p.PropTypes.oneOfType([p.PropTypes.func,p.PropTypes.node]).isRequired,keybindings:p.PropTypes.shape({next:p.PropTypes.oneOfType([p.PropTypes.object,p.PropTypes.array]),prev:p.PropTypes.oneOfType([p.PropTypes.object,p.PropTypes.array]),first:p.PropTypes.oneOfType([p.PropTypes.object,p.PropTypes.array]),last:p.PropTypes.oneOfType([p.PropTypes.object,p.PropTypes.array])}),wrap:p.PropTypes.bool,stringSearch:p.PropTypes.bool,stringSearchDelay:p.PropTypes.number,collapsible:p.PropTypes.bool,openPopoverOn:p.PropTypes.oneOf(["tap","hover"]),closeOnOutsideClick:p.PropTypes.bool,closeOnItemSelection:p.PropTypes.bool,accordion:p.PropTypes.bool,onPopoverOpen:p.PropTypes.func,onPopoverClose:p.PropTypes.func,onItemSelection:p.PropTypes.func},m=function(e){function t(e){r(this,t);var o=i(this,(t.__proto__||Object.getPrototypeOf(t)).call(this,e));return o._onItemSelection=function(e,t){var n=e.value||e.node.innerHTML;o.props.closeOnItemSelection&&o.closePopover(),o.props.onItemSelection(n,t)},o._setToggleNode=function(e){o._toggle=e},o._setPopoverNode=function(e){o._popover=e},o._addMember=function(e){var t=o.props.activeTabId,n=e.id,r=e.index,i=e.node,a=e.text;void 0===r?o._members.push(e):o._members.splice(r,0,e),o._focusGroup.addMember({node:i,text:a||i.innerHTML}),"tab"===e.type&&(t===n?o._activateTab(t,!0,!1):o._handleFirstTabSelection(n))},o._removeMember=function(e){var t=o._members.indexOf(e);t>-1&&(o._members.splice(e,1),o._focusGroup.removeMember(e.node))},o._focusItem=function(e){o._focusGroup.focusNodeAtIndex(e)},o.openPopover=function(){var e=!(arguments.length>0&&void 0!==arguments[0])||arguments[0],t=o.props,n=t.freezeScroll,r=t.onPopoverOpen;o.state.isPopoverOpen||(o.setState({isPopoverOpen:!0}),n&&f["default"].on(),r(),e&&setTimeout(function(){o._focusItem(0)},60))},o.closePopover=function(){var e=!(arguments.length>0&&void 0!==arguments[0])||arguments[0],t=o.props,n=t.freezeScroll,r=t.onPopoverClose;o.state.isPopoverOpen&&(o.setState({isPopoverOpen:!1}),n&&f["default"].off(),r(),e&&setTimeout(function(){o._toggle.focus()},60))},o.togglePopover=function(e){o.state.isPopoverOpen?o.closePopover(e):o.openPopover(e)},o._addPanel=function(e){var t=o.props.activeTabId,n=e.controlledBy;o._panels.push(e),t===n?o._activateTab(t,!0,!1):o._handleFirstTabSelection(e.controlledBy)},o._focusTab=function(e){var t=o._members.filter(function(t){return t.id===e});t&&t.node.focus()},o._activateTab=function(e,t){var n=!(arguments.length>2&&void 0!==arguments[2])||arguments[2],r=o.props,i=r.type,a=r.onChange;if("tabs"===i){if(e===o._activeTabId&&!t)return;o._activeTabId=e}if(n&&"function"==typeof a)return void a(e);for(var s=o._members.length;s--;){var p=o._members[s];"accordion"===i?p.id===e&&p.toggleActiveState():p.setActiveState(e===p.id)}for(var u=o._panels.length;u--;){var c=o._panels[u];"accordion"===i?c.controlledBy===e&&c.toggleActiveState():c.setActiveState(e===c.controlledBy)}},o.state={isPopoverOpen:!1},o._focusGroup=(0,c["default"])(e),o._toggle=null,o._popover=null,o._members=[],o._panels=[],o._activeTabId=e.activeTabId,o._uuid="RA"+Math.abs(~~(Math.random()*new Date)),o}return a(t,e),s(t,[{key:"getChildContext",value:function(){return{ariaManager:{uuid:this._uuid,type:this.props.type,trapFocus:this.props.trapFocus,initialFocus:this.props.initialFocus,isPopoverOpen:this.state.isPopoverOpen,onItemSelection:this._onItemSelection,setToggleNode:this._setToggleNode,setPopoverNode:this._setPopoverNode,addMember:this._addMember,addPanel:this._addPanel,removeMember:this._removeMember,activateTab:this._activateTab,focusItem:this._focusItem,openPopover:this.openPopover,closePopover:this.closePopover,togglePopover:this.togglePopover}}}},{key:"componentWillMount",value:function(){this._focusGroup.activate(),y["default"].add(this)}},{key:"componentWillUnmount",value:function(){this._focusGroup.deactivate(),y["default"].remove(this)}},{key:"_onTap",value:function(e){"tap"===this.props.openPopoverOn&&this._handleTapOrHover(e)}},{key:"_onHover",value:function(e){"hover"===this.props.openPopoverOn&&this._handleTapOrHover(e)}},{key:"_handleTapOrHover",value:function(e){var t=this.props,o=t.openPopoverOn,n=t.closeOnOutsideClick,r=e.target;if(this._toggle){var i=this._toggle.getAttribute("disabled");if(b(this._toggle,r)&&null===i)return void("tap"===o?this.togglePopover(!1):this.openPopover(!1));if(n&&this._popover&&!b(this._popover,r))return void this.closePopover(!1)}for(var a=this._members.length;a--;){var s=this._members[a];if(s.node===r)return void("item"===s.type?this._onItemSelection(s,e):this._activateTab(s.id))}}},{key:"_onKeyDown",value:function(e){var t=e.keyCode;this.state.isPopoverOpen&&(this.props.trapFocus||t!==_.tab?t===_.escape&&this.closePopover():this.closePopover(!1))}},{key:"_handleFirstTabSelection",value:function(e){("tabs"===this.props.type&&!this._activeTabId||e===this._activeTabId)&&this._activateTab(e,!0,!1)}},{key:"render",value:function(){var e=this.props,t=e.tag,o=e.children,n=(0,h["default"])({},this.props,P);return"function"==typeof o?o(this.state.isPopoverOpen):(0,p.createElement)(t,n,o)}}]),t}(p.Component);m.childContextTypes={ariaManager:p.PropTypes.object.isRequired},m.propTypes=P,m.defaultProps={tag:"div",trapFocus:!1,freezeScroll:!1,keybindings:{next:[{keyCode:_.arrowDown},{keyCode:_.arrowRight}],prev:[{keyCode:_.arrowUp},{keyCode:_.arrowLeft}],first:{keyCode:_.home},last:{keyCode:_.end}},wrap:!0,stringSearch:!0,stringSearchDelay:600,collapsible:!1,openPopoverOn:"tap",closeOnOutsideClick:!0,closeOnItemSelection:!0,onPopoverOpen:function(){return null},onPopoverClose:function(){return null},onItemSelection:function(){return null}},t["default"]=m,e.exports=t["default"]},function(e,t){e.exports=n},function(e,t){e.exports=r},function(e,t,o){"use strict";function n(e){return e&&e.__esModule?e:{"default":e}}Object.defineProperty(t,"__esModule",{value:!0});var r=o(17),i=n(r);t["default"]={_queue:[],add:function(e){this._queue.push(e),1===this._queue.length&&this._attachListeners()},remove:function(e){var t=this._queue.indexOf(e);t>-1&&this._queue.splice(t,1),this._queue.length<=0&&this._detachListeners()},_attachListeners:function(){this._tapListener=(0,i["default"])(document.documentElement,this._documentEvent.bind(this,"_onTap")),document.addEventListener("mouseover",this._documentEvent.bind(this,"_onHover")),document.addEventListener("keydown",this._documentEvent.bind(this,"_onKeyDown"))},_detachListeners:function(){this._tapListener.remove(),document.removeEventListener("mouseover",this._documentEvent),document.removeEventListener("keydown",this._documentEvent)},_documentEvent:function(e,t){for(var o=this._queue.length;o--;)this._queue[o][e](t)}},e.exports=t["default"]},function(e,t){e.exports=i}])}); | ||
!function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t(require("react"),require("react-dom"),require("focus-trap"),require("no-scroll"),require("focus-group")):"function"==typeof define&&define.amd?define(["react","react-dom","focus-trap","no-scroll","focus-group"],t):"object"==typeof exports?exports.ReactARIA=t(require("react"),require("react-dom"),require("focus-trap"),require("no-scroll"),require("focus-group")):e.ReactARIA=t(e.React,e.ReactDOM,e.focusTrap,e.noScroll,e.createFocusGroup)}(this,function(e,t,o,n,r){return function(e){function t(n){if(o[n])return o[n].exports;var r=o[n]={exports:{},id:n,loaded:!1};return e[n].call(r.exports,r,r.exports,t),r.loaded=!0,r.exports}var o={};return t.m=e,t.c=o,t.p="dist/",t(0)}([function(e,t,o){"use strict";function n(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var o in e)Object.prototype.hasOwnProperty.call(e,o)&&(t[o]=e[o]);return t["default"]=e,t}Object.defineProperty(t,"__esModule",{value:!0}),t.Tabs=t.Overlays=void 0;var r=o(1),i=n(r),a=o(13),s=n(a);t.Overlays=i,t.Tabs=s},function(e,t,o){"use strict";function n(e){return e&&e.__esModule?e:{"default":e}}Object.defineProperty(t,"__esModule",{value:!0}),t.Item=t.Overlay=t.Trigger=void 0;var r=o(2),i=n(r),a=o(6),s=n(a),c=o(12),u=n(c);t.Trigger=i["default"],t.Overlay=s["default"],t.Item=u["default"]},function(e,t,o){"use strict";function n(e){return e&&e.__esModule?e:{"default":e}}function r(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function i(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function a(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}Object.defineProperty(t,"__esModule",{value:!0});var s=function(){function e(e,t){for(var o=0;o<t.length;o++){var n=t[o];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}return function(t,o,n){return o&&e(t.prototype,o),n&&e(t,n),t}}(),c=o(3),u=(n(c),o(4)),l=(n(u),o(5)),p=n(l),f={tag:c.PropTypes.string,isOpen:c.PropTypes.bool,toggleOn:c.PropTypes.array,onToggle:c.PropTypes.func},d=function(e){function t(){var e,o,n,a;r(this,t);for(var s=arguments.length,c=Array(s),u=0;u<s;u++)c[u]=arguments[u];return o=n=i(this,(e=t.__proto__||Object.getPrototypeOf(t)).call.apply(e,[this].concat(c))),n._handleKeyDown=function(e){var t=n.props,o=t.tag,r=(t.onToggle,t.onKeyDown);(["ArrowUp","ArrowDown"].indexOf(e.key)>-1||"button"!==o&&["Enter"," "].indexOf(e.key)>-1)&&n._toggle(e),"function"==typeof r&&r(e)},a=o,i(n,a)}return a(t,e),s(t,[{key:"_handleEvent",value:function(e,t){var o=this.props["on"+e];this._toggle(t),"function"==typeof o&&o(t)}},{key:"_toggle",value:function(e){e.preventDefault(),this.props.onToggle()}},{key:"_getProps",value:function(){var e=this.props,t=e.disabled,o=e.type,n=e.controls,r=e.isOpen,i=e.toggleOn,a={role:"button",tabIndex:t?"":0,"aria-disabled":t,onKeyDown:this._handleKeyDown};return"modal"!==o&&(a["aria-haspopup"]=!0,a["aria-expanded"]=r),"popover"===o?a.id=n:"tooltip"===o&&(a["aria-describedby"]=n),i.indexOf("click")>-1&&(a.onClick=this._handleEvent.bind(this,"click")),i.indexOf("hover")>-1&&(a.onMouseOver=this._handleEvent.bind(this,"mouseOver"),a.onMouseOut=this._handleEvent.bind(this,"mouseOut")),i.indexOf("focus")>-1&&(a.onFocus=this._handleEvent.bind(this,"focus"),a.onBlur=this._handleEvent.bind(this,"blur")),(0,p["default"])(a,this.props,f)}},{key:"render",value:function(){var e=this.props,t=e.tag,o=e.children,n=this._getProps();return"function"==typeof o?o(n):(0,c.createElement)(t,n,o)}}]),t}(c.Component);d.propTypes=f,d.defaultProps={tag:"button",toggleOn:["click"]},t["default"]=d,e.exports=t["default"]},function(t,o){t.exports=e},function(e,o){e.exports=t},function(e,t){"use strict";function o(e,t,o){for(var n in t)t.hasOwnProperty(n)&&!o[n]&&(e[n]=t[n]);return e}Object.defineProperty(t,"__esModule",{value:!0}),t["default"]=o,e.exports=t["default"]},function(e,t,o){"use strict";function n(e){return e&&e.__esModule?e:{"default":e}}function r(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function i(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function a(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}Object.defineProperty(t,"__esModule",{value:!0});var s=function(){function e(e,t){for(var o=0;o<t.length;o++){var n=t[o];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}return function(t,o,n){return o&&e(t.prototype,o),n&&e(t,n),t}}(),c=o(3),u=(n(c),o(4)),l=(n(u),o(7)),p=n(l),f=o(8),d=n(f),y=o(9),h=n(y),v=o(11),b=n(v),_=o(5),m=n(_),g={tag:c.PropTypes.string,id:c.PropTypes.string,type:c.PropTypes.oneOf(["menu","popover","modal","tooltip","alert"]),focusOnMount:c.PropTypes.bool,trapFocus:c.PropTypes.bool,initialFocus:c.PropTypes.any,freezeScroll:c.PropTypes.bool,closeOnEscapeKey:c.PropTypes.bool,closeOnOutsideClick:c.PropTypes.bool,onRequestClose:c.PropTypes.func,onItemSelection:c.PropTypes.func},O=function(e){function t(){var e,o,n,a;r(this,t);for(var s=arguments.length,c=Array(s),l=0;l<s;l++)c[l]=arguments[l];return o=n=i(this,(e=t.__proto__||Object.getPrototypeOf(t)).call.apply(e,[this].concat(c))),n.members=new h["default"](n.props),n.focusItem=function(e){n.members.focus(e)},n._handleDocumentKeyDown=function(e){var t=e.keyCode;t===b["default"].escape&&n.props.onRequestClose()},n._handleDocumentClick=function(e){var t=e.target,o=(0,u.findDOMNode)(n);o===t||o.contains(t)||n.props.onRequestClose()},a=o,i(n,a)}return a(t,e),s(t,[{key:"getChildContext",value:function(){return{overlayManager:{members:this.members,onItemSelection:this.props.onItemSelection}}}},{key:"componentDidMount",value:function(){var e=this.props,t=e.trapFocus,o=e.initialFocus,n=e.freezeScroll;this._lastActiveElement=document.activeElement,t&&(this._focusTrap=(0,p["default"])((0,u.findDOMNode)(this),{initialFocus:o,escapeDeactivates:!1,clickOutsideDeactivates:!0}).activate()),n&&d["default"].on(),"first"===o&&this.members.focus(0),this._registerEvents()}},{key:"componentWillUnmount",value:function(){this.props.trapFocus&&this._focusTrap.deactivate(),this.props.freezeScroll&&d["default"].off(),this._lastActiveElement&&this._lastActiveElement.focus(),this._unregisterEvents()}},{key:"_registerEvents",value:function(){document.addEventListener("keydown",this._handleDocumentKeyDown),this.props.closeOnOutsideClick&&document.addEventListener("click",this._handleDocumentClick)}},{key:"_unregisterEvents",value:function(){document.removeEventListener("keydown",this._handleDocumentKeyDown),this.props.closeOnOutsideClick&&document.removeEventListener("click",this._handleDocumentClick)}},{key:"_getProps",value:function(){var e=this.props,t=e.type,o=e.id,n={};return"menu"===t?n.role="menu":"modal"===t?n.role="dialog":"alert"===t?n.role="alertdialog":"tooltip"===t?(n.id=o,n.role="tooltip"):"popover"===t&&(n["aria-labelledby"]=o),(0,m["default"])(n,this.props,g)}},{key:"render",value:function(){var e=this.props,t=e.tag,o=e.children,n=this._getProps();return"function"==typeof o?o(n):(0,c.createElement)(t,n,o)}}]),t}(c.Component);O.childContextTypes={overlayManager:c.PropTypes.object},O.propTypes=g,O.defaultProps={tag:"div",type:"popover",initialFocus:"first",closeOnEscapeKey:!0,closeOnOutsideClick:!0,onRequestClose:function(){return null},onItemSelection:function(){return null}},t["default"]=O,e.exports=t["default"]},function(e,t){e.exports=o},function(e,t){e.exports=n},function(e,t,o){"use strict";function n(e){return e&&e.__esModule?e:{"default":e}}function r(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}Object.defineProperty(t,"__esModule",{value:!0});var i=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var o=arguments[t];for(var n in o)Object.prototype.hasOwnProperty.call(o,n)&&(e[n]=o[n])}return e},a=o(10),s=n(a),c=o(11),u=n(c),l={keybindings:{next:[{keyCode:u["default"].arrowDown},{keyCode:u["default"].arrowRight}],prev:[{keyCode:u["default"].arrowUp},{keyCode:u["default"].arrowLeft}],first:{keyCode:u["default"].home},last:{keyCode:u["default"].end}},wrap:!0,stringSearch:!0,stringSearchDelay:600},p=function f(){var e=this,t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};r(this,f),this.add=function(t){var o=(t.id,t.index),n=t.node,r=t.text;void 0===o?e.collection.push(t):e.collection.splice(o,0,t),e.focusGroup.addMember({node:n,text:r||n.innerHTML}),1===e.collection.length&&e.focusGroup.activate(),"function"==typeof e.options.onAdd&&e.options.onAdd(t)},this.remove=function(t){var o=e.collection.indexOf(t);o>-1&&(e.collection.splice(t,1),e.focusGroup.removeMember(t.node)),e.collection.length<=0&&e.focusGroup.activate(),"function"==typeof e.options.onRemove&&e.options.onRemove(t)},this.focus=function(t){e.focusGroup.focusNodeAtIndex(t)},this.collection=[],this.options=i({},l,t),this.focusGroup=(0,s["default"])(this.options)};t["default"]=p,e.exports=t["default"]},function(e,t){e.exports=r},function(e,t){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t["default"]={tab:9,escape:27,end:35,home:36,arrowLeft:37,arrowUp:38,arrowRight:39,arrowDown:40},e.exports=t["default"]},function(e,t,o){"use strict";function n(e){return e&&e.__esModule?e:{"default":e}}function r(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function i(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function a(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}Object.defineProperty(t,"__esModule",{value:!0});var s=function(){function e(e,t){for(var o=0;o<t.length;o++){var n=t[o];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}return function(t,o,n){return o&&e(t.prototype,o),n&&e(t,n),t}}(),c=o(3),u=(n(c),o(4)),l=(n(u),o(5)),p=n(l),f={tag:c.PropTypes.string},d=function(e){function t(){var e,o,n,a;r(this,t);for(var s=arguments.length,c=Array(s),u=0;u<s;u++)c[u]=arguments[u];return o=n=i(this,(e=t.__proto__||Object.getPrototypeOf(t)).call.apply(e,[this].concat(c))),n._handleClick=function(e){var t=n.props.onClick;n._handleSelection(e),"function"==typeof t&&t(e)},n._handleKeyDown=function(e){var t=n.props.onKeyDown;[" ","Enter"].indexOf(e.key)>-1&&(e.preventDefault(),n._handleSelection(e)),"function"==typeof t&&t(e)},n._handleSelection=function(e){var t=n.props.onSelect;n.context.overlayManager.onItemSelection(n._member,e),"function"==typeof t&&t(n._member,e)},a=o,i(n,a)}return a(t,e),s(t,[{key:"componentDidMount",value:function(){this._member={type:"item",node:(0,u.findDOMNode)(this),text:this.props.text},this.props.value&&(this._member.value=this.props.value),this.context.overlayManager.members.add(this._member)}},{key:"componentWillUnmount",value:function(){this.context.overlayManager.members.remove(this._member)}},{key:"render",value:function(){var e=this.props,t=e.tag,o=e.children,n=(0,p["default"])({role:"menuitem",tabIndex:-1,onClick:this._handleClick,onKeyDown:this._handleKeyDown},this.props,f);return"function"==typeof o?o(n):(0,c.createElement)(t,n,o)}}]),t}(c.Component);d.contextTypes={overlayManager:c.PropTypes.object},d.propTypes=f,d.defaultProps={tag:"div"},t["default"]=d,e.exports=t["default"]},function(e,t,o){"use strict";function n(e){return e&&e.__esModule?e:{"default":e}}Object.defineProperty(t,"__esModule",{value:!0}),t.TabPanel=t.Tab=t.TabList=t.Manager=void 0;var r=o(14),i=n(r),a=o(15),s=n(a),c=o(16),u=n(c),l=o(17),p=n(l);t.Manager=i["default"],t.TabList=s["default"],t.Tab=u["default"],t.TabPanel=p["default"]},function(e,t,o){"use strict";function n(e){return e&&e.__esModule?e:{"default":e}}function r(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function i(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function a(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}Object.defineProperty(t,"__esModule",{value:!0});var s=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var o=arguments[t];for(var n in o)Object.prototype.hasOwnProperty.call(o,n)&&(e[n]=o[n])}return e},c=function(){function e(e,t){for(var o=0;o<t.length;o++){var n=t[o];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}return function(t,o,n){return o&&e(t.prototype,o),n&&e(t,n),t}}(),u=o(3),l=(n(u),o(4)),p=(n(l),o(9)),f=n(p),d=o(5),y=n(d),h={tag:u.PropTypes.string,activeTabId:u.PropTypes.string,accordion:u.PropTypes.bool,multiselect:u.PropTypes.bool,onChange:u.PropTypes.func},v=function(e){function t(e){r(this,t);var o=i(this,(t.__proto__||Object.getPrototypeOf(t)).call(this,e));return o._addMember=function(e){var t=e.id;t===o.props.activeTabId&&o._activateTab(t,!0,!1)},o._addPanel=function(e){var t=e.controlledBy;o._panels.push(e),t===o.props.activeTabId&&o._activateTab(t,!0,!1)},o._activateTab=function(e,t){var n=!(arguments.length>2&&void 0!==arguments[2])||arguments[2];if(e!==o.props.activeTabId||t){var r=o.props.onChange;n&&"function"==typeof r?r(e):o._setActiveStates(e)}},o._members=new f["default"](s({},o.props,{onAdd:o._addMember})),o._panels=[],o}return a(t,e),c(t,[{key:"getChildContext",value:function(){return{tabs:{accordion:this.props.accordion,multiselect:this.props.multiselect,members:this._members,addPanel:this._addPanel,activateTab:this._activateTab,focusTab:this.focusTab}}}},{key:"_setActiveStates",value:function(e){for(var t=this.props,o=t.accordion,n=t.multiselect,r=this._members.collection,i=r.length;i--;){var a=r[i];o?a.id===e?a.toggleActiveState():n||a.setActiveState(!1):a.setActiveState(a.id===e)}for(var s=this._panels.length;s--;){var c=this._panels[s];o?c.controlledBy===e?c.toggleActiveState():n||c.setActiveState(!1):c.setActiveState(c.controlledBy===e)}}},{key:"render",value:function(){var e=(0,y["default"])({},this.props,h);return(0,u.createElement)(this.props.tag,e)}}]),t}(u.Component);v.childContextTypes={tabs:u.PropTypes.object},v.propTypes=h,v.defaultProps={tag:"div"},t["default"]=v,e.exports=t["default"]},function(e,t,o){"use strict";function n(e){return e&&e.__esModule?e:{"default":e}}function r(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function i(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function a(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}Object.defineProperty(t,"__esModule",{value:!0});var s=function(){function e(e,t){for(var o=0;o<t.length;o++){var n=t[o];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}return function(t,o,n){return o&&e(t.prototype,o),n&&e(t,n),t}}(),c=o(3),u=(n(c),o(5)),l=n(u),p={tag:c.PropTypes.string,children:c.PropTypes.oneOfType([c.PropTypes.func,c.PropTypes.node]).isRequired},f=function(e){function t(){return r(this,t),i(this,(t.__proto__||Object.getPrototypeOf(t)).apply(this,arguments))}return a(t,e),s(t,[{key:"render",value:function(){var e=this.context.tabs,t=e.accordion,o=e.multiselect,n=this.props,r=n.tag,i=n.children,a={role:"tablist"};t&&o&&(a["aria-multiselectable"]=!0);var s=(0,l["default"])(a,this.props,p);return"function"==typeof i?i(s):(0,c.createElement)(r,s,i)}}]),t}(c.Component);f.contextTypes={tabs:c.PropTypes.object.isRequired},f.propTypes=p,f.defaultProps={tag:"div"},t["default"]=f,e.exports=t["default"]},function(e,t,o){"use strict";function n(e){return e&&e.__esModule?e:{"default":e}}function r(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function i(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function a(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}Object.defineProperty(t,"__esModule",{value:!0});var s=function(){function e(e,t){for(var o=0;o<t.length;o++){var n=t[o];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}return function(t,o,n){return o&&e(t.prototype,o),n&&e(t,n),t}}(),c=o(3),u=(n(c),o(4)),l=(n(u),o(5)),p=n(l),f={id:c.PropTypes.oneOfType([c.PropTypes.string,c.PropTypes.number]).isRequired,isActive:c.PropTypes.bool,tag:c.PropTypes.string},d=function(e){function t(){var e,o,n,a;r(this,t);for(var s=arguments.length,c=Array(s),u=0;u<s;u++)c[u]=arguments[u];return o=n=i(this,(e=t.__proto__||Object.getPrototypeOf(t)).call.apply(e,[this].concat(c))),n.state={isActive:!1},n._setActiveState=function(e){n.setState({isActive:e})},n._toggleActiveState=function(){n.setState({isActive:!n.state.isActive})},n._handleClick=function(e){var t=n.props.onClick;n.context.tabs.activateTab(n.props.id),"function"==typeof t&&t(e)},n._handleKeyDown=function(e){var t=n.props,o=t.id,r=t.tag,i=t.onKeyDown;"button"!==r&&["Enter"," "].indexOf(e.key)>-1&&(e.preventDefault(),n.context.tabs.activateTab(o)),i&&i(e)},n._handleFocus=function(e){var t=n.props.onFocus;n.context.tabs.activateTab(n.props.id),"function"==typeof t&&t(e)},a=o,i(n,a)}return a(t,e),s(t,[{key:"componentDidMount",value:function(){this._member={id:this.props.id,node:(0,u.findDOMNode)(this),text:this.props.text,setActiveState:this._setActiveState,toggleActiveState:this._toggleActiveState},this.context.tabs.members.add(this._member)}},{key:"componentWillUnmount",value:function(){this.context.tabs.members.remove(this._member)}},{key:"render",value:function(){var e=this.context.tabs.accordion,t=this.props,o=t.tag,n=t.id,r=t.disabled,i=t.children,a=void 0!==this.props.isActive?this.props.isActive:this.state.isActive,s={id:n,role:"tab",tabIndex:e?0:a?0:-1,"aria-selected":a,"aria-controls":n+"-panel","aria-disabled":r};e?(s["aria-expanded"]=a,s.onClick=this._handleClick,s.onKeyDown=this._handleKeyDown):s.onFocus=this._handleFocus;var u=(0,p["default"])(s,this.props,f);return"function"==typeof i?i(u,a):(0,c.createElement)(o,u,i)}}]),t}(c.Component);d.contextTypes={tabs:c.PropTypes.object.isRequired},d.propTypes=f,d.defaultProps={tag:"div"},t["default"]=d,e.exports=t["default"]},function(e,t,o){"use strict";function n(e){return e&&e.__esModule?e:{"default":e}}function r(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function i(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function a(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}Object.defineProperty(t,"__esModule",{value:!0});var s=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var o=arguments[t];for(var n in o)Object.prototype.hasOwnProperty.call(o,n)&&(e[n]=o[n])}return e},c=function(){function e(e,t){for(var o=0;o<t.length;o++){var n=t[o];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}return function(t,o,n){return o&&e(t.prototype,o),n&&e(t,n),t}}(),u=o(3),l=(n(u),o(4)),p=(n(l),o(5)),f=n(p),d={controlledBy:u.PropTypes.oneOfType([u.PropTypes.string,u.PropTypes.number]).isRequired,isActive:u.PropTypes.bool,tag:u.PropTypes.string},y=function(e){function t(){var e,o,n,a;r(this,t);for(var s=arguments.length,c=Array(s),u=0;u<s;u++)c[u]=arguments[u];return o=n=i(this,(e=t.__proto__||Object.getPrototypeOf(t)).call.apply(e,[this].concat(c))),n.state={isActive:!1},n._setActiveState=function(e){n.setState({isActive:e})},n._toggleActiveState=function(){n.setState({isActive:!n.state.isActive})},n._handleKeyDown=function(e){var t=n.props.onKeyDown;e.ctrlKey&&"ArrowUp"===e.key&&n.context.members.focus(n.props.controlledBy),"function"==typeof t&&t(e)},a=o,i(n,a)}return a(t,e),c(t,[{key:"componentDidMount",value:function(){this.context.tabs.addPanel({controlledBy:this.props.controlledBy,node:(0,l.findDOMNode)(this),setActiveState:this._setActiveState,toggleActiveState:this._toggleActiveState})}},{key:"render",value:function(){var e=this.props,t=e.tag,o=e.controlledBy,n=(e.disabled,e.children),r=void 0!==this.props.isActive?this.props.isActive:this.state.isActive,i={id:o+"-panel",role:"tabpanel","aria-hidden":!r,"aria-labelledby":o,onKeyDown:this._handleKeyDown};r||(i.style=s({display:"none"},this.props.style));var a=(0,f["default"])(i,this.props,d);return"function"==typeof n?n(a,r):(0,u.createElement)(t,a,n)}}]),t}(u.Component);y.contextTypes={tabs:u.PropTypes.object.isRequired},y.propTypes=d,y.defaultProps={tag:"div"},t["default"]=y,e.exports=t["default"]}])}); |
@@ -55,2 +55,3 @@ 'use strict'; | ||
tag: _react.PropTypes.string, | ||
isOpen: _react.PropTypes.bool, | ||
trapFocus: _react.PropTypes.bool, | ||
@@ -272,3 +273,3 @@ freezeScroll: _react.PropTypes.bool, | ||
_this.state = { | ||
isPopoverOpen: false | ||
isPopoverOpen: props.isOpen | ||
}; | ||
@@ -317,2 +318,9 @@ | ||
}, { | ||
key: 'componentWillReceiveProps', | ||
value: function componentWillReceiveProps(nextProps) { | ||
if (this.props.isOpen !== nextProps.isOpen) { | ||
this.setState({ isPopoverOpen: nextProps.isOpen }); | ||
} | ||
} | ||
}, { | ||
key: 'componentWillUnmount', | ||
@@ -346,3 +354,3 @@ value: function componentWillUnmount() { | ||
if (this._toggle) { | ||
if (this._toggle && this._toggle.tagName !== 'INPUT') { | ||
var toggleDisabled = this._toggle.getAttribute('disabled'); | ||
@@ -421,2 +429,3 @@ | ||
tag: 'div', | ||
isOpen: false, | ||
trapFocus: false, | ||
@@ -423,0 +432,0 @@ freezeScroll: false, |
@@ -69,2 +69,7 @@ 'use strict'; | ||
}; | ||
if (this.props.value) { | ||
this._member.value = this.props.value; | ||
} | ||
this.context.ariaManager.addMember(this._member); | ||
@@ -71,0 +76,0 @@ } |
@@ -30,4 +30,3 @@ 'use strict'; | ||
var checkedProps = { | ||
tag: _react.PropTypes.string, | ||
children: _react.PropTypes.oneOfType([_react.PropTypes.func, _react.PropTypes.node]).isRequired | ||
tag: _react.PropTypes.string | ||
}; | ||
@@ -34,0 +33,0 @@ |
@@ -6,34 +6,15 @@ 'use strict'; | ||
}); | ||
exports.Manager = undefined; | ||
exports.Tabs = exports.Overlays = undefined; | ||
var _Menu = require('./Menu'); | ||
var _Overlays2 = require('./Overlays'); | ||
Object.keys(_Menu).forEach(function (key) { | ||
if (key === "default" || key === "__esModule") return; | ||
Object.defineProperty(exports, key, { | ||
enumerable: true, | ||
get: function get() { | ||
return _Menu[key]; | ||
} | ||
}); | ||
}); | ||
var _Overlays = _interopRequireWildcard(_Overlays2); | ||
var _Tabs = require('./Tabs'); | ||
var _Tabs2 = require('./Tabs'); | ||
Object.keys(_Tabs).forEach(function (key) { | ||
if (key === "default" || key === "__esModule") return; | ||
Object.defineProperty(exports, key, { | ||
enumerable: true, | ||
get: function get() { | ||
return _Tabs[key]; | ||
} | ||
}); | ||
}); | ||
var _Tabs = _interopRequireWildcard(_Tabs2); | ||
var _Manager2 = require('./Manager'); | ||
function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } } | ||
var _Manager3 = _interopRequireDefault(_Manager2); | ||
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } | ||
exports.Manager = _Manager3.default; | ||
exports.Overlays = _Overlays; | ||
exports.Tabs = _Tabs; |
@@ -6,4 +6,8 @@ 'use strict'; | ||
}); | ||
exports.TabPanel = exports.Tab = exports.TabList = undefined; | ||
exports.TabPanel = exports.Tab = exports.TabList = exports.Manager = undefined; | ||
var _Manager2 = require('./Manager'); | ||
var _Manager3 = _interopRequireDefault(_Manager2); | ||
var _TabList2 = require('./TabList'); | ||
@@ -23,4 +27,5 @@ | ||
exports.Manager = _Manager3.default; | ||
exports.TabList = _TabList3.default; | ||
exports.Tab = _Tab3.default; | ||
exports.TabPanel = _TabPanel3.default; |
@@ -17,3 +17,3 @@ 'use strict'; | ||
var _specialAssign = require('../special-assign'); | ||
var _specialAssign = require('../helpers/special-assign'); | ||
@@ -31,6 +31,5 @@ var _specialAssign2 = _interopRequireDefault(_specialAssign); | ||
var checkedProps = { | ||
tag: _react.PropTypes.string, | ||
id: _react.PropTypes.oneOfType([_react.PropTypes.string, _react.PropTypes.number]).isRequired, | ||
isActive: _react.PropTypes.bool, | ||
children: _react.PropTypes.oneOfType([_react.PropTypes.func, _react.PropTypes.node]).isRequired | ||
tag: _react.PropTypes.string | ||
}; | ||
@@ -58,14 +57,23 @@ | ||
_this.setState({ isActive: !_this.state.isActive }); | ||
}, _this._handleClick = function (e) { | ||
var onClick = _this.props.onClick; | ||
_this.context.tabs.activateTab(_this.props.id); | ||
if (typeof onClick === 'function') { | ||
onClick(e); | ||
} | ||
}, _this._handleKeyDown = function (e) { | ||
var _this$context$ariaMan = _this.context.ariaManager; | ||
var type = _this$context$ariaMan.type; | ||
var activateTab = _this$context$ariaMan.activateTab; | ||
var _this$props = _this.props; | ||
var id = _this$props.id; | ||
var tag = _this$props.tag; | ||
var onKeyDown = _this$props.onKeyDown; | ||
if (type === 'accordion' && [' ', 'Enter'].indexOf(e.key) > -1) { | ||
activateTab(id); | ||
if (tag !== 'button' && ['Enter', ' '].indexOf(e.key) > -1) { | ||
e.preventDefault(); | ||
_this.context.tabs.activateTab(id); | ||
} | ||
if (onKeyDown) { | ||
@@ -75,14 +83,8 @@ onKeyDown(e); | ||
}, _this._handleFocus = function (e) { | ||
var _this$context$ariaMan2 = _this.context.ariaManager; | ||
var type = _this$context$ariaMan2.type; | ||
var activateTab = _this$context$ariaMan2.activateTab; | ||
var _this$props2 = _this.props; | ||
var id = _this$props2.id; | ||
var onFocus = _this$props2.onFocus; | ||
var onFocus = _this.props.onFocus; | ||
if (type === 'tabs') { | ||
activateTab(id); | ||
} | ||
if (onFocus) { | ||
_this.context.tabs.activateTab(_this.props.id); | ||
if (typeof onFocus === 'function') { | ||
onFocus(e); | ||
@@ -97,3 +99,2 @@ } | ||
this._member = { | ||
type: 'tab', | ||
id: this.props.id, | ||
@@ -105,3 +106,3 @@ node: (0, _reactDom.findDOMNode)(this), | ||
}; | ||
this.context.ariaManager.addMember(this._member); | ||
this.context.tabs.members.add(this._member); | ||
} | ||
@@ -111,3 +112,3 @@ }, { | ||
value: function componentWillUnmount() { | ||
this.context.ariaManager.removeMember(this._member); | ||
this.context.tabs.members.remove(this._member); | ||
} | ||
@@ -117,3 +118,3 @@ }, { | ||
value: function render() { | ||
var type = this.context.ariaManager.type; | ||
var accordion = this.context.tabs.accordion; | ||
var _props = this.props; | ||
@@ -129,12 +130,14 @@ var tag = _props.tag; | ||
role: 'tab', | ||
tabIndex: type === 'accordion' ? 0 : isActive ? 0 : -1, | ||
tabIndex: accordion ? 0 : isActive ? 0 : -1, | ||
'aria-selected': isActive, | ||
'aria-controls': id + '-panel', | ||
'aria-disabled': disabled, | ||
onKeyDown: this._handleKeyDown, | ||
onFocus: this._handleFocus | ||
'aria-disabled': disabled | ||
}; | ||
if (type === 'accordion') { | ||
if (accordion) { | ||
componentProps['aria-expanded'] = isActive; | ||
componentProps['onClick'] = this._handleClick; | ||
componentProps['onKeyDown'] = this._handleKeyDown; | ||
} else { | ||
componentProps['onFocus'] = this._handleFocus; | ||
} | ||
@@ -156,3 +159,3 @@ | ||
Tab.contextTypes = { | ||
ariaManager: _react.PropTypes.object.isRequired | ||
tabs: _react.PropTypes.object.isRequired | ||
}; | ||
@@ -159,0 +162,0 @@ Tab.propTypes = checkedProps; |
@@ -13,3 +13,3 @@ 'use strict'; | ||
var _specialAssign = require('../special-assign'); | ||
var _specialAssign = require('../helpers/special-assign'); | ||
@@ -43,3 +43,5 @@ var _specialAssign2 = _interopRequireDefault(_specialAssign); | ||
value: function render() { | ||
var type = this.context.ariaManager.type; | ||
var _context$tabs = this.context.tabs; | ||
var accordion = _context$tabs.accordion; | ||
var multiselect = _context$tabs.multiselect; | ||
var _props = this.props; | ||
@@ -53,3 +55,3 @@ var tag = _props.tag; | ||
if (type === 'accordion') { | ||
if (accordion && multiselect) { | ||
componentProps['aria-multiselectable'] = true; | ||
@@ -72,3 +74,3 @@ } | ||
TabList.contextTypes = { | ||
ariaManager: _react.PropTypes.object.isRequired | ||
tabs: _react.PropTypes.object.isRequired | ||
}; | ||
@@ -75,0 +77,0 @@ TabList.propTypes = checkedProps; |
@@ -19,3 +19,3 @@ 'use strict'; | ||
var _specialAssign = require('../special-assign'); | ||
var _specialAssign = require('../helpers/special-assign'); | ||
@@ -33,6 +33,5 @@ var _specialAssign2 = _interopRequireDefault(_specialAssign); | ||
var checkedProps = { | ||
tag: _react.PropTypes.string, | ||
controlledBy: _react.PropTypes.oneOfType([_react.PropTypes.string, _react.PropTypes.number]).isRequired, | ||
isActive: _react.PropTypes.bool, | ||
children: _react.PropTypes.oneOfType([_react.PropTypes.func, _react.PropTypes.node]).isRequired | ||
tag: _react.PropTypes.string | ||
}; | ||
@@ -61,7 +60,11 @@ | ||
}, _this._handleKeyDown = function (e) { | ||
var onKeyDown = _this.props.onKeyDown; | ||
if (e.ctrlKey && e.key === 'ArrowUp') { | ||
_this.context.ariaManager.focusTab(_this.props.controlledBy); | ||
_this.context.members.focus(_this.props.controlledBy); | ||
} | ||
if (_this.props.onKeyDown) { | ||
_this.props.onKeyDown(e); | ||
if (typeof onKeyDown === 'function') { | ||
onKeyDown(e); | ||
} | ||
@@ -74,3 +77,3 @@ }, _temp), _possibleConstructorReturn(_this, _ret); | ||
value: function componentDidMount() { | ||
this.context.ariaManager.addPanel({ | ||
this.context.tabs.addPanel({ | ||
controlledBy: this.props.controlledBy, | ||
@@ -120,3 +123,3 @@ node: (0, _reactDom.findDOMNode)(this), | ||
TabPanel.contextTypes = { | ||
ariaManager: _react.PropTypes.object.isRequired | ||
tabs: _react.PropTypes.object.isRequired | ||
}; | ||
@@ -123,0 +126,0 @@ TabPanel.propTypes = checkedProps; |
{ | ||
"name": "react-aria", | ||
"version": "0.5.0", | ||
"version": "0.6.0", | ||
"description": "Utilities to help create React ARIA components.", | ||
@@ -53,4 +53,3 @@ "main": "lib/react-aria.js", | ||
"focus-trap": "^2.1.0", | ||
"no-scroll": "^2.0.0", | ||
"teeny-tap": "^0.2.0" | ||
"no-scroll": "^2.0.0" | ||
}, | ||
@@ -74,2 +73,3 @@ "devDependencies": { | ||
"react-a11y": "^0.3.3", | ||
"react-axe": "^2.1.0", | ||
"react-dom": "15.3.2", | ||
@@ -76,0 +76,0 @@ "react-hot-loader": "^1.3.1", |
117
README.md
@@ -6,6 +6,8 @@ ## React ARIA | ||
Utilities to help compose ARIA compliant components. | ||
Utility components to help compose ARIA components in React. Please feel free to file an issue or submit a PR if you feel these can be more ARIA compliant ❤️ | ||
## Usage | ||
`yarn add react-aria` | ||
`npm install react-aria --save` | ||
@@ -18,8 +20,8 @@ | ||
### Example | ||
### Building a select menu | ||
```js | ||
import { AriaManager, AriaToggle, AriaPopover, AriaItem } from 'react-aria' | ||
```jsx | ||
import { Overlays: { Trigger, Overlay, Item } } from 'react-aria' | ||
class Dropdown extends Component { | ||
class SelectMenu extends Component { | ||
state = { | ||
@@ -29,24 +31,34 @@ selection: null | ||
_handleSelection = (value, e) => { | ||
this.setState({ selection: value }) | ||
_handleSelection = (item, e) => { | ||
this.setState({ | ||
selection: item.value, | ||
isOpen: false | ||
}) | ||
} | ||
render() { | ||
const { isOpen } = this.state | ||
return ( | ||
<AriaManager onItemSelection={this._handleSelection}> | ||
{ isOpen => | ||
<div> | ||
<AriaToggle> | ||
{this.state.selection || 'Select A Dropdown Item'} | ||
</AriaToggle> | ||
{ isOpen && | ||
<AriaPopover role="menu"> | ||
<AriaItem>Apples</AriaItem> | ||
<AriaItem>Pears</AriaItem> | ||
<AriaItem>Oranges</AriaItem> | ||
</AriaPopover> | ||
} | ||
</div> | ||
<div> | ||
<Trigger | ||
controls="select-menu" | ||
type="menu" | ||
isOpen={isOpen} | ||
onToggle={() => this.setState({ isOpen: !isOpen })} | ||
> | ||
{this.state.selection || 'Select A Dropdown Item'} | ||
</Trigger> | ||
{ isOpen && | ||
<Overlay | ||
id="select-menu" | ||
type="menu" | ||
onItemSelection={this._handleSelection} | ||
onRequestClose={() => this.setState({ isOpen: false })} | ||
> | ||
<Item value="apples">Apples</Item> | ||
<Item value="pears">Pears</Item> | ||
<Item value="oranges">Oranges</Item> | ||
</Overlay> | ||
} | ||
</AriaManager> | ||
</div> | ||
) | ||
@@ -57,2 +69,63 @@ } | ||
### Building a set of tabs | ||
```jsx | ||
import { Tabs: { Manager, TabList, Tab, TabPanel } } from 'react-aria' | ||
class TabsDemo extends Component { | ||
state = { | ||
tabs: [{ | ||
id: 't1', | ||
title: 'Bacon 🐷', | ||
panel: <div>And eggs 🐔</div> | ||
}, { | ||
id: 't2', | ||
title: 'Zombiez 💀', | ||
panel: <div>Brainz</div> | ||
}, { | ||
id: 't3', | ||
title: 'Samuel 👨🏿', | ||
panel: <div>Samuel L Jackson</div> | ||
}], | ||
activeId: 't2' | ||
} | ||
render() { | ||
const { tabs, activeId } = this.state | ||
return ( | ||
<Manager | ||
activeTabId={activeId} | ||
onChange={id => this.setState({ activeId: id })} | ||
className="tab-set" | ||
> | ||
<TabList className="tab-list"> | ||
{tabs.map(({ id, title }) => | ||
<Tab | ||
key={id} | ||
id={id} | ||
isActive={id === activeId} | ||
className={`tab-list-item ${id === activeId ? 'is-active' : ''}`} | ||
> | ||
{title} | ||
</Tab> | ||
)} | ||
</TabList> | ||
<div className="tab-panels"> | ||
{tabs.map(({ id, panel }) => | ||
<TabPanel | ||
key={id} | ||
controlledBy={id} | ||
isActive={id === activeId} | ||
className="tab-panel" | ||
> | ||
{panel} | ||
</TabPanel> | ||
)} | ||
</div> | ||
</Manager> | ||
) | ||
} | ||
} | ||
``` | ||
## Running Locally | ||
@@ -59,0 +132,0 @@ |
246451
5
50
4880
150
27
- Removedteeny-tap@^0.2.0
- Removedteeny-tap@0.2.0(transitive)