react-aria-menubutton 7.0.3 → 8.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (43) hide show
  1. package/README.md +140 -122
  2. package/dist/index.d.ts +59 -0
  3. package/dist/react-aria-menubutton.cjs.js +1 -0
  4. package/dist/react-aria-menubutton.es.js +566 -0
  5. package/dist/react-aria-menubutton.umd.js +1 -0
  6. package/package.json +62 -57
  7. package/CHANGELOG.md +0 -176
  8. package/CODE_OF_CONDUCT.md +0 -22
  9. package/dist/Button.js +0 -140
  10. package/dist/ManagerContext.js +0 -7
  11. package/dist/Menu.js +0 -131
  12. package/dist/MenuItem.js +0 -96
  13. package/dist/Wrapper.js +0 -74
  14. package/dist/createManager.js +0 -163
  15. package/dist/externalStateControl.js +0 -32
  16. package/dist/index.js +0 -12
  17. package/dist/propTypes.js +0 -7
  18. package/dist/specialAssign.js +0 -11
  19. package/src/Button.js +0 -129
  20. package/src/ManagerContext.js +0 -5
  21. package/src/Menu.js +0 -118
  22. package/src/MenuItem.js +0 -84
  23. package/src/Wrapper.js +0 -62
  24. package/src/__tests__/Button.test.js +0 -169
  25. package/src/__tests__/Menu.test.js +0 -130
  26. package/src/__tests__/MenuItem.test.js +0 -106
  27. package/src/__tests__/__snapshots__/Button.test.js.snap +0 -41
  28. package/src/__tests__/__snapshots__/Menu.test.js.snap +0 -54
  29. package/src/__tests__/__snapshots__/MenuItem.test.js.snap +0 -37
  30. package/src/__tests__/createManager.test.js +0 -190
  31. package/src/__tests__/helpers/MockWrapper.js +0 -24
  32. package/src/__tests__/helpers/createMockKeyEvent.js +0 -7
  33. package/src/__tests__/helpers/createMockManager.js +0 -22
  34. package/src/__tests__/helpers/jest-setup.js +0 -5
  35. package/src/__tests__/helpers/raf.js +0 -3
  36. package/src/createManager.js +0 -173
  37. package/src/externalStateControl.js +0 -31
  38. package/src/index.js +0 -10
  39. package/src/propTypes.js +0 -8
  40. package/src/specialAssign.js +0 -9
  41. package/umd/ReactAriaMenuButton.js +0 -1
  42. package/webpack-demo.config.js +0 -14
  43. package/webpack-umd.config.js +0 -35
@@ -1,190 +0,0 @@
1
- /* globals Promise */
2
-
3
- var createManager = require('../createManager');
4
- var createMockKeyEvent = require('./helpers/createMockKeyEvent');
5
-
6
- var mockNode = document.createElement('button');
7
- var nodeOne = document.createElement('button');
8
- nodeOne.focus = jest.fn();
9
- var nodeTwo = document.createElement('button');
10
- nodeTwo.focus = jest.fn();
11
- document.body.appendChild(nodeOne);
12
- document.body.appendChild(nodeTwo);
13
-
14
- function createManagerWithMockedElements(options) {
15
- var manager = createManager(options);
16
- manager.focusGroup.addMember({
17
- node: nodeOne,
18
- text: 'first'
19
- });
20
- manager.focusGroup.addMember({
21
- node: nodeTwo,
22
- text: 'second'
23
- });
24
- manager.button = {
25
- ref: { current: mockNode },
26
- setState: jest.fn()
27
- };
28
- manager.menu = {
29
- setState: jest.fn()
30
- };
31
- manager.focusItem = jest.fn();
32
- return manager;
33
- }
34
-
35
- describe('createManager', function() {
36
- it('initalizes', function() {
37
- var manager = createManagerWithMockedElements();
38
- expect(manager.isOpen).toBe(false);
39
- expect(manager.options.closeOnSelection).toBeTruthy();
40
- expect(manager.options.closeOnBlur).toBeTruthy();
41
- });
42
-
43
- it('Manager#update', function() {
44
- var manager = createManagerWithMockedElements({
45
- onMenuToggle: jest.fn()
46
- });
47
- manager.update();
48
- expect(manager.menu.setState).toHaveBeenCalledTimes(1);
49
- expect(manager.menu.setState.mock.calls[0]).toEqual([
50
- { isOpen: manager.isOpen }
51
- ]);
52
- expect(manager.button.setState).toHaveBeenCalledTimes(1);
53
- expect(manager.button.setState.mock.calls[0]).toEqual([
54
- { menuOpen: manager.isOpen }
55
- ]);
56
- expect(manager.options.onMenuToggle).toHaveBeenCalledTimes(1);
57
- expect(manager.options.onMenuToggle.mock.calls[0]).toEqual([
58
- { isOpen: manager.isOpen }
59
- ]);
60
- });
61
-
62
- it('Manager#openMenu without focusing in menu', function() {
63
- var manager = createManagerWithMockedElements();
64
- manager.openMenu({ focusMenu: false });
65
- expect(manager.isOpen).toBe(true);
66
- expect(manager.menu.setState).toHaveBeenCalledTimes(1);
67
- expect(manager.menu.setState.mock.calls[0]).toEqual([{ isOpen: true }]);
68
- expect(manager.button.setState).toHaveBeenCalledTimes(1);
69
- expect(manager.button.setState.mock.calls[0]).toEqual([{ menuOpen: true }]);
70
-
71
- return new Promise(function(resolve) {
72
- setTimeout(function() {
73
- expect(manager.focusItem).toHaveBeenCalledTimes(0);
74
- resolve();
75
- }, 0);
76
- });
77
- });
78
-
79
- it('Manager#openMenu focusing in menu', function() {
80
- var manager = createManagerWithMockedElements();
81
- manager.openMenu();
82
- expect(manager.isOpen).toBe(true);
83
- expect(manager.menu.setState).toHaveBeenCalledTimes(1);
84
- expect(manager.menu.setState.mock.calls[0]).toEqual([{ isOpen: true }]);
85
- expect(manager.button.setState).toHaveBeenCalledTimes(1);
86
- expect(manager.button.setState.mock.calls[0]).toEqual([{ menuOpen: true }]);
87
-
88
- return new Promise(function(resolve) {
89
- setTimeout(function() {
90
- expect(manager.focusItem).toHaveBeenCalledTimes(1);
91
- expect(manager.focusItem.mock.calls[0]).toEqual([0]);
92
- resolve();
93
- }, 0);
94
- });
95
- });
96
-
97
- it('Manager#closeMenu focusing on button', function() {
98
- mockNode.focus = jest.fn();
99
-
100
- var manager = createManagerWithMockedElements();
101
- manager.isOpen = true;
102
- manager.closeMenu({ focusButton: true });
103
-
104
- expect(manager.isOpen).toBe(false);
105
- expect(manager.menu.setState).toHaveBeenCalledTimes(1);
106
- expect(manager.menu.setState.mock.calls[0]).toEqual([{ isOpen: false }]);
107
- expect(manager.button.setState).toHaveBeenCalledTimes(1);
108
- expect(manager.button.setState.mock.calls[0]).toEqual([
109
- { menuOpen: false }
110
- ]);
111
- expect(mockNode.focus).toHaveBeenCalledTimes(1);
112
- });
113
-
114
- it('Manager#closeMenu without focusing on button', function() {
115
- mockNode.focus = jest.fn();
116
-
117
- var manager = createManagerWithMockedElements();
118
- manager.isOpen = true;
119
- manager.closeMenu({ focusButton: false });
120
-
121
- expect(mockNode.focus).not.toHaveBeenCalled();
122
- });
123
-
124
- it('Manager#toggleMenu when closed', function() {
125
- var manager = createManagerWithMockedElements();
126
- manager.openMenu = jest.fn();
127
- manager.closeMenu = jest.fn();
128
- manager.toggleMenu();
129
- expect(manager.openMenu).toHaveBeenCalledTimes(1);
130
- expect(manager.closeMenu).not.toHaveBeenCalled();
131
- });
132
-
133
- it('Manager#toggleMenu when open', function() {
134
- var manager = createManagerWithMockedElements();
135
- manager.isOpen = true;
136
- manager.openMenu = jest.fn();
137
- manager.closeMenu = jest.fn();
138
- manager.toggleMenu();
139
- expect(manager.openMenu).not.toHaveBeenCalled();
140
- expect(manager.closeMenu).toHaveBeenCalledTimes(1);
141
- });
142
-
143
- it('Manager#handleSelection A', function() {
144
- var mockOnSelection = jest.fn();
145
- var manager = createManagerWithMockedElements({
146
- onSelection: mockOnSelection
147
- });
148
- manager.closeMenu = jest.fn();
149
- manager.handleSelection('foo', { bar: 1 });
150
- expect(manager.closeMenu).toHaveBeenCalledTimes(1);
151
- expect(manager.closeMenu.mock.calls[0]).toEqual([{ focusButton: true }]);
152
- expect(mockOnSelection).toHaveBeenCalledTimes(1);
153
- expect(mockOnSelection.mock.calls[0]).toEqual(['foo', { bar: 1 }]);
154
- });
155
-
156
- it('Manager#handleSelection B', function() {
157
- var mockOnSelection = jest.fn();
158
- var manager = createManagerWithMockedElements({
159
- onSelection: mockOnSelection,
160
- closeOnSelection: false
161
- });
162
- manager.closeMenu = jest.fn();
163
- manager.handleSelection('foo', { bar: 1 });
164
- expect(manager.closeMenu).not.toHaveBeenCalled();
165
- expect(mockOnSelection).toHaveBeenCalledTimes(1);
166
- expect(mockOnSelection.mock.calls[0]).toEqual(['foo', { bar: 1 }]);
167
- });
168
-
169
- it('Manager#handleMenuKey on closed menu', function() {
170
- var escapeEvent = createMockKeyEvent('Escape');
171
- var manager = createManagerWithMockedElements();
172
- manager.closeMenu = jest.fn();
173
-
174
- manager.handleMenuKey(escapeEvent);
175
- expect(escapeEvent.preventDefault).not.toHaveBeenCalled();
176
- expect(manager.closeMenu).not.toHaveBeenCalled();
177
- });
178
-
179
- it('Manager#handleMenuKey on open menu', function() {
180
- var escapeEvent = createMockKeyEvent('Escape');
181
- var manager = createManagerWithMockedElements();
182
- manager.isOpen = true;
183
- manager.closeMenu = jest.fn();
184
-
185
- manager.handleMenuKey(escapeEvent);
186
- expect(escapeEvent.preventDefault).toHaveBeenCalledTimes(1);
187
- expect(manager.closeMenu).toHaveBeenCalledTimes(1);
188
- expect(manager.closeMenu.mock.calls[0]).toEqual([{ focusButton: true }]);
189
- });
190
- });
@@ -1,24 +0,0 @@
1
- const React = require('react');
2
- const PropTypes = require('prop-types');
3
- const ManagerContext = require('../../ManagerContext');
4
-
5
- class MockWrapper extends React.Component {
6
- static propTypes = {
7
- mockManager: PropTypes.object.isRequired,
8
- };
9
-
10
- constructor(props) {
11
- super(props);
12
- this.manager = this.props.mockManager;
13
- }
14
-
15
- render() {
16
- return React.createElement(
17
- ManagerContext.Provider,
18
- { value: this.props.mockManager },
19
- React.createElement('div', null, this.props.children)
20
- );
21
- }
22
- }
23
-
24
- module.exports = MockWrapper;
@@ -1,7 +0,0 @@
1
- module.exports = function(key, keyCode) {
2
- return {
3
- key: key,
4
- keyCode: keyCode,
5
- preventDefault: jest.fn(),
6
- };
7
- };
@@ -1,22 +0,0 @@
1
- module.exports = function() {
2
- return {
3
- isOpen: false,
4
- toggleMenu: jest.fn(),
5
- handleMenuKey: jest.fn(),
6
- moveFocusDown: jest.fn(),
7
- openMenu: jest.fn(),
8
- handleKeyDown: jest.fn(),
9
- handleClick: jest.fn(),
10
- handleSelection: jest.fn(),
11
- handleButtonNonArrowKey: jest.fn(),
12
- focusItem: jest.fn(),
13
- menuItems: [1, 2],
14
- clearItems: jest.fn(),
15
- currentFocus: -1,
16
- addItem: jest.fn(),
17
- options: {
18
- closeOnBlur: true,
19
- closeOnSelection: true
20
- }
21
- };
22
- }
@@ -1,5 +0,0 @@
1
- import './raf';
2
- import Enzyme from 'enzyme';
3
- import Adapter from 'enzyme-adapter-react-16';
4
-
5
- Enzyme.configure({ adapter: new Adapter() });
@@ -1,3 +0,0 @@
1
- global.requestAnimationFrame = (callback) => {
2
- setTimeout(callback, 0);
3
- };
@@ -1,173 +0,0 @@
1
- const createFocusGroup = require('focus-group');
2
- const externalStateControl = require('./externalStateControl');
3
-
4
- const focusGroupOptions = {
5
- wrap: true,
6
- stringSearch: true
7
- };
8
-
9
- const protoManager = {
10
- init(options) {
11
- this.updateOptions(options);
12
-
13
- this.handleBlur = handleBlur.bind(this);
14
- this.handleSelection = handleSelection.bind(this);
15
- this.handleMenuKey = handleMenuKey.bind(this);
16
-
17
- // "With focus on the drop-down menu, the Up and Down Arrow
18
- // keys move focus within the menu items, "wrapping" at the top and bottom."
19
- // "Typing a letter (printable character) key moves focus to the next
20
- // instance of a visible node whose title begins with that printable letter."
21
- //
22
- // All of the above is handled by focus-group.
23
- this.focusGroup = createFocusGroup(focusGroupOptions);
24
-
25
- // These component references are added when the relevant components mount
26
- this.button = null;
27
- this.menu = null;
28
-
29
- // State trackers
30
- this.isOpen = false;
31
- },
32
-
33
- updateOptions(options) {
34
- const oldOptions = this.options;
35
-
36
- this.options = options || this.options || {};
37
-
38
- if (typeof this.options.closeOnSelection === 'undefined') {
39
- this.options.closeOnSelection = true;
40
- }
41
-
42
- if (typeof this.options.closeOnBlur === 'undefined') {
43
- this.options.closeOnBlur = true;
44
- }
45
-
46
- if (this.options.id) {
47
- externalStateControl.registerManager(this.options.id, this);
48
- }
49
-
50
- if (oldOptions && oldOptions.id && oldOptions.id !== this.options.id) {
51
- externalStateControl.unregisterManager(this.options.id, this);
52
- }
53
-
54
- },
55
-
56
- focusItem(index) {
57
- this.focusGroup.focusNodeAtIndex(index);
58
- },
59
-
60
- addItem(item) {
61
- this.focusGroup.addMember(item);
62
- },
63
-
64
- clearItems() {
65
- this.focusGroup.clearMembers();
66
- },
67
-
68
- handleButtonNonArrowKey(event) {
69
- this.focusGroup._handleUnboundKey(event);
70
- },
71
-
72
- destroy() {
73
- this.button = null;
74
- this.menu = null;
75
- this.focusGroup.deactivate();
76
- clearTimeout(this.blurTimer);
77
- clearTimeout(this.moveFocusTimer);
78
- },
79
-
80
- update() {
81
- this.menu.setState({ isOpen: this.isOpen });
82
- this.button.setState({ menuOpen: this.isOpen });
83
- this.options.onMenuToggle &&
84
- this.options.onMenuToggle({ isOpen: this.isOpen });
85
- },
86
-
87
- openMenu(openOptions) {
88
- if (this.isOpen) return;
89
- openOptions = openOptions || {};
90
- if (openOptions.focusMenu === undefined) {
91
- openOptions.focusMenu = true;
92
- }
93
- this.isOpen = true;
94
- this.update();
95
- this.focusGroup.activate();
96
- if (openOptions.focusMenu) {
97
- const self = this;
98
- this.moveFocusTimer = setTimeout(function() {
99
- self.focusItem(0);
100
- }, 0);
101
- }
102
- },
103
-
104
- closeMenu(closeOptions) {
105
- if (!this.isOpen) return;
106
- closeOptions = closeOptions || {};
107
- this.isOpen = false;
108
- this.update();
109
- if (closeOptions.focusButton) {
110
- this.button.ref.current.focus();
111
- }
112
- },
113
-
114
- toggleMenu(closeOptions, openOptions) {
115
- closeOptions = closeOptions || {};
116
- openOptions = openOptions || {};
117
- if (this.isOpen) {
118
- this.closeMenu(closeOptions);
119
- } else {
120
- this.openMenu(openOptions);
121
- }
122
- }
123
- };
124
-
125
- function handleBlur() {
126
- const self = this;
127
- self.blurTimer = setTimeout(function() {
128
- if (!self.button) return;
129
- const buttonNode = self.button.ref.current;
130
- if (!buttonNode) return;
131
- const activeEl = buttonNode.ownerDocument.activeElement;
132
- if (buttonNode && activeEl === buttonNode) return;
133
- const menuNode = self.menu.ref.current;
134
- if (menuNode === activeEl) {
135
- self.focusItem(0);
136
- return;
137
- }
138
- if (menuNode && menuNode.contains(activeEl)) return;
139
- if (self.isOpen) self.closeMenu({ focusButton: false });
140
- }, 0);
141
- }
142
-
143
- function handleSelection(value, event) {
144
- if (this.options.closeOnSelection) this.closeMenu({ focusButton: true });
145
- if (this.options.onSelection) this.options.onSelection(value, event);
146
- }
147
-
148
- function handleMenuKey(event) {
149
- if (this.isOpen) {
150
- switch (event.key) {
151
- // With focus on the drop-down menu, pressing Escape closes
152
- // the menu and returns focus to the button.
153
- case 'Escape':
154
- event.preventDefault();
155
- this.closeMenu({ focusButton: true });
156
- break;
157
- case 'Home':
158
- event.preventDefault();
159
- this.focusGroup.moveFocusToFirst();
160
- break;
161
- case 'End':
162
- event.preventDefault();
163
- this.focusGroup.moveFocusToLast();
164
- break;
165
- }
166
- }
167
- }
168
-
169
- module.exports = function(options) {
170
- const newManager = Object.create(protoManager);
171
- newManager.init(options);
172
- return newManager;
173
- };
@@ -1,31 +0,0 @@
1
- const registeredManagers = {};
2
-
3
- const errorCommon =
4
- 'a menu outside a mounted Wrapper with an id, or a menu that does not exist';
5
-
6
- function registerManager(menuId, manager) {
7
- registeredManagers[menuId] = manager;
8
- }
9
-
10
- function unregisterManager(menuId) {
11
- delete registeredManagers[menuId];
12
- }
13
-
14
- function openMenu(menuId, openOptions) {
15
- const manager = registeredManagers[menuId];
16
- if (!manager) throw new Error('Cannot open ' + errorCommon);
17
- manager.openMenu(openOptions);
18
- }
19
-
20
- function closeMenu(menuId, closeOptions) {
21
- const manager = registeredManagers[menuId];
22
- if (!manager) throw new Error('Cannot close ' + errorCommon);
23
- manager.closeMenu(closeOptions);
24
- }
25
-
26
- module.exports = {
27
- registerManager: registerManager,
28
- unregisterManager: unregisterManager,
29
- openMenu: openMenu,
30
- closeMenu: closeMenu
31
- };
package/src/index.js DELETED
@@ -1,10 +0,0 @@
1
- const externalStateControl = require('./externalStateControl');
2
-
3
- module.exports = {
4
- Wrapper: require('./Wrapper'),
5
- Button: require('./Button'),
6
- Menu: require('./Menu'),
7
- MenuItem: require('./MenuItem'),
8
- openMenu: externalStateControl.openMenu,
9
- closeMenu: externalStateControl.closeMenu
10
- };
package/src/propTypes.js DELETED
@@ -1,8 +0,0 @@
1
- const PropTypes = require("prop-types");
2
-
3
- module.exports = {
4
- refType: PropTypes.oneOfType([
5
- PropTypes.func,
6
- PropTypes.shape({ current: PropTypes.elementType })
7
- ])
8
- };
@@ -1,9 +0,0 @@
1
- module.exports = function(a, b, reserved) {
2
- reserved = reserved || {};
3
- // This will get id, className, style, etc.
4
- for (var x in b) {
5
- if (!b.hasOwnProperty(x)) continue;
6
- if (reserved[x]) continue;
7
- a[x] = b[x];
8
- }
9
- };
@@ -1 +0,0 @@
1
- !function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t(require("react")):"function"==typeof define&&define.amd?define(["react"],t):"object"==typeof exports?exports.ReactAriaMenuButton=t(require("react")):e.ReactAriaMenuButton=t(e.React)}(window,function(e){return function(e){var t={};function n(r){if(t[r])return t[r].exports;var o=t[r]={i:r,l:!1,exports:{}};return e[r].call(o.exports,o,o.exports,n),o.l=!0,o.exports}return n.m=e,n.c=t,n.d=function(e,t,r){n.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:r})},n.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},n.t=function(e,t){if(1&t&&(e=n(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var r=Object.create(null);if(n.r(r),Object.defineProperty(r,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var o in e)n.d(r,o,function(t){return e[t]}.bind(null,o));return r},n.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return n.d(t,"a",t),t},n.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},n.p="",n(n.s=17)}([function(e,t,n){e.exports=n(15)()},function(t,n){t.exports=e},function(e,t,n){"use strict";e.exports=function(e,t,n){for(var r in n=n||{},t)t.hasOwnProperty(r)&&(n[r]||(e[r]=t[r]))}},function(e,t,n){"use strict";var r=n(0);e.exports={refType:r.oneOfType([r.func,r.shape({current:r.elementType})])}},function(e,t,n){"use strict";var r=n(1).createContext();e.exports=r},function(e,t,n){"use strict";var r={},o="a menu outside a mounted Wrapper with an id, or a menu that does not exist";e.exports={registerManager:function(e,t){r[e]=t},unregisterManager:function(e){delete r[e]},openMenu:function(e,t){var n=r[e];if(!n)throw new Error("Cannot open "+o);n.openMenu(t)},closeMenu:function(e,t){var n=r[e];if(!n)throw new Error("Cannot close "+o);n.closeMenu(t)}}},function(e,t,n){"use strict";function r(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}var o=n(1),i=n(0),s=n(4),a=n(3).refType,u=n(2),c={ambManager:i.object.isRequired,children:i.node.isRequired,forwardedRef:a,tag:i.string,text:i.string,value:i.any},f=function(e){function t(){var n,i;!function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,t);for(var s=arguments.length,a=Array(s),u=0;u<s;u++)a[u]=arguments[u];return n=i=r(this,e.call.apply(e,[this].concat(a))),i.ref=o.createRef(),i.handleKeyDown=function(e){"Enter"!==e.key&&" "!==e.key||"a"===i.props.tag&&i.props.href||(e.preventDefault(),i.selectItem(e))},i.selectItem=function(e){var t=void 0!==i.props.value?i.props.value:i.props.children;i.props.ambManager.handleSelection(t,e)},i.setRef=function(e){i.ref.current=e,"function"==typeof i.props.forwardedRef?i.props.forwardedRef(e):i.props.forwardedRef&&(i.props.forwardedRef.current=e)},r(i,n)}return function(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)}(t,e),t.prototype.componentDidMount=function(){this.props.ambManager.addItem({node:this.ref.current,text:this.props.text})},t.prototype.render=function(){var e={onClick:this.selectItem,onKeyDown:this.handleKeyDown,role:"menuitem",tabIndex:"-1",ref:this.setRef};return u(e,this.props,c),o.createElement(this.props.tag,e,this.props.children)},t}(o.Component);f.propTypes=c,f.defaultProps={tag:"div"},e.exports=o.forwardRef(function(e,t){return o.createElement(s.Consumer,null,function(n){var r={ambManager:n,forwardedRef:t};return u(r,e,{ambManager:c.ambManager,children:c.children,forwardedRef:c.forwardedRef}),o.createElement(f,r,e.children)})})},function(e,t){e.exports=function(e,t,n){var r=0,o=0,i=!1,s=!1,a=!1;function u(e){a||t(e)}function c(t){a=!0,i||(i=!0,e.addEventListener("touchmove",f,n),e.addEventListener("touchend",p,n),e.addEventListener("touchcancel",l,n),s=!1,r=t.touches[0].clientX,o=t.touches[0].clientY)}function f(e){s||Math.abs(e.touches[0].clientX-r)<=10&&Math.abs(e.touches[0].clientY-o)<=10||(s=!0)}function p(e){i=!1,d(),s||t(e)}function l(){i=!1,s=!1,r=0,o=0}function d(){e.removeEventListener("touchmove",f,n),e.removeEventListener("touchend",p,n),e.removeEventListener("touchcancel",l,n)}return e.addEventListener("click",u,n),e.addEventListener("touchstart",c,n),{remove:function(){e.removeEventListener("click",u,n),e.removeEventListener("touchstart",c,n),d()}}}},function(e,t,n){"use strict";function r(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}var o=n(1),i=n(0),s=n(7),a=n(4),u=n(3).refType,c=n(2),f={ambManager:i.object.isRequired,children:i.oneOfType([i.func,i.node]).isRequired,forwardedRef:u,tag:i.string},p=function(e){function t(){var n,i;!function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,t);for(var a=arguments.length,u=Array(a),c=0;c<a;c++)u[c]=arguments[c];return n=i=r(this,e.call.apply(e,[this].concat(u))),i.ref=o.createRef(),i.addTapListener=function(){var e=i.ref.current;if(e){var t=e.ownerDocument;t&&(i.tapListener=s(t.documentElement,i.handleTap))}},i.handleTap=function(e){i.ref.current.contains(e.target)||i.props.ambManager.button.ref.current.contains(e.target)||i.props.ambManager.closeMenu()},i.setRef=function(e){i.ref.current=e,"function"==typeof i.props.forwardedRef?i.props.forwardedRef(e):i.props.forwardedRef&&(i.props.forwardedRef.current=e)},r(i,n)}return function(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)}(t,e),t.prototype.componentDidMount=function(){this.props.ambManager.menu=this},t.prototype.componentDidUpdate=function(){var e=this.props.ambManager;e.options.closeOnBlur&&(e.isOpen&&!this.tapListener?this.addTapListener():!e.isOpen&&this.tapListener&&(this.tapListener.remove(),delete this.tapListener),e.isOpen||e.clearItems())},t.prototype.componentWillUnmount=function(){this.tapListener&&this.tapListener.remove(),this.props.ambManager.destroy()},t.prototype.render=function(){var e=this.props,t=this.props.ambManager,n="function"==typeof e.children?e.children({isOpen:t.isOpen}):!!t.isOpen&&e.children;if(!n)return!1;var r={onKeyDown:t.handleMenuKey,role:"menu",tabIndex:-1};return t.options.closeOnBlur&&(r.onBlur=t.handleBlur),c(r,e,f),c(r,{ref:this.setRef}),o.createElement(e.tag,r,n)},t}(o.Component);p.propTypes=f,p.defaultProps={tag:"div"},e.exports=o.forwardRef(function(e,t){return o.createElement(a.Consumer,null,function(n){var r={ambManager:n,forwardedRef:t};return c(r,e,{ambManager:f.ambManager,children:f.children,forwardedRef:f.forwardedRef}),o.createElement(p,r,e.children)})})},function(e,t,n){"use strict";function r(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}var o=n(1),i=n(0),s=n(4),a=n(3).refType,u=n(2),c={ambManager:i.object.isRequired,children:i.node.isRequired,disabled:i.bool,forwardedRef:a,tag:i.string},f=function(e){function t(){var n,i;!function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,t);for(var s=arguments.length,a=Array(s),u=0;u<s;u++)a[u]=arguments[u];return n=i=r(this,e.call.apply(e,[this].concat(a))),i.ref=o.createRef(),i.handleKeyDown=function(e){if(!i.props.disabled){var t=i.props.ambManager;switch(e.key){case"ArrowDown":e.preventDefault(),t.isOpen?t.focusItem(0):t.openMenu();break;case"Enter":case" ":e.preventDefault(),t.toggleMenu();break;case"Escape":t.handleMenuKey(e);break;default:t.handleButtonNonArrowKey(e)}}},i.handleClick=function(){i.props.disabled||i.props.ambManager.toggleMenu({},{focusMenu:!1})},i.setRef=function(e){i.ref.current=e,"function"==typeof i.props.forwardedRef?i.props.forwardedRef(e):i.props.forwardedRef&&(i.props.forwardedRef.current=e)},r(i,n)}return function(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)}(t,e),t.prototype.componentDidMount=function(){this.props.ambManager.button=this},t.prototype.componentWillUnmount=function(){this.props.ambManager.destroy()},t.prototype.render=function(){var e=this.props,t=this.props.ambManager,n={role:"button",tabIndex:e.disabled?"":"0","aria-haspopup":!0,"aria-expanded":t.isOpen,"aria-disabled":e.disabled,onKeyDown:this.handleKeyDown,onClick:this.handleClick},r={};return u(r,c),["button","fieldset","input","optgroup","option","select","textarea"].indexOf(e.tag)>=0&&delete r.disabled,t.options.closeOnBlur&&(n.onBlur=t.handleBlur),u(n,e,r),u(n,{ref:this.setRef}),o.createElement(e.tag,n,e.children)},t}(o.Component);f.propTypes=c,f.defaultProps={tag:"span"},e.exports=o.forwardRef(function(e,t){return o.createElement(s.Consumer,null,function(n){var r={ambManager:n,forwardedRef:t};return u(r,e,{ambManager:c.ambManager,children:c.children,forwardedRef:c.forwardedRef}),o.createElement(f,r,e.children)})})},function(e,t){function n(e){var t,n,r=(e=e||{}).keybindings||{};for(t in this._settings={keybindings:{next:r.next||{keyCode:40},prev:r.prev||{keyCode:38},first:r.first,last:r.last},wrap:e.wrap,stringSearch:e.stringSearch,stringSearchDelay:800},this._keybindingsLookup=[],this._settings.keybindings)(n=this._settings.keybindings[t])&&[].concat(n).forEach(function(e){e.metaKey=e.metaKey||!1,e.ctrlKey=e.ctrlKey||!1,e.altKey=e.altKey||!1,e.shiftKey=e.shiftKey||!1,this._keybindingsLookup.push({action:t,eventMatcher:e})}.bind(this));this._searchString="",this._members=[],e.members&&this.setMembers(e.members),this._boundHandleKeydownEvent=this._handleKeydownEvent.bind(this)}function r(e){e&&e.focus&&(e.focus(),"input"===e.tagName.toLowerCase()&&e.select())}n.prototype.activate=function(){return document.addEventListener("keydown",this._boundHandleKeydownEvent,!0),this},n.prototype.deactivate=function(){return document.removeEventListener("keydown",this._boundHandleKeydownEvent,!0),this._clearSearchStringRefreshTimer(),this},n.prototype._handleKeydownEvent=function(e){if(-1!==this._getActiveElementIndex()){var t=!1;this._keybindingsLookup.forEach(function(n){if(function(e,t){for(var n in e)if(void 0!==t[n]&&e[n]!==t[n])return!1;return!0}(n.eventMatcher,e))switch(t=!0,e.preventDefault(),n.action){case"next":this.moveFocusForward();break;case"prev":this.moveFocusBack();break;case"first":this.moveFocusToFirst();break;case"last":this.moveFocusToLast();break;default:return}}.bind(this)),t||this._handleUnboundKey(e)}},n.prototype.moveFocusForward=function(){var e,t=this._getActiveElementIndex();return e=t<this._members.length-1?t+1:this._settings.wrap?0:t,this.focusNodeAtIndex(e),e},n.prototype.moveFocusBack=function(){var e,t=this._getActiveElementIndex();return e=t>0?t-1:this._settings.wrap?this._members.length-1:t,this.focusNodeAtIndex(e),e},n.prototype.moveFocusToFirst=function(){this.focusNodeAtIndex(0)},n.prototype.moveFocusToLast=function(){this.focusNodeAtIndex(this._members.length-1)},n.prototype._handleUnboundKey=function(e){if(this._settings.stringSearch){if(""!==this._searchString&&(" "===e.key||32===e.keyCode))return e.preventDefault(),-1;if(!function(e){return e>=65&&e<=90}(e.keyCode))return-1;if(e.ctrlKey||e.metaKey||e.altKey)return-1;e.preventDefault(),this._addToSearchString(String.fromCharCode(e.keyCode)),this._runStringSearch()}},n.prototype._clearSearchString=function(){this._searchString=""},n.prototype._addToSearchString=function(e){this._searchString+=e.toLowerCase()},n.prototype._startSearchStringRefreshTimer=function(){var e=this;this._clearSearchStringRefreshTimer(),this._stringSearchTimer=setTimeout(function(){e._clearSearchString()},this._settings.stringSearchDelay)},n.prototype._clearSearchStringRefreshTimer=function(){clearTimeout(this._stringSearchTimer)},n.prototype._runStringSearch=function(){this._startSearchStringRefreshTimer(),this.moveFocusByString(this._searchString)},n.prototype.moveFocusByString=function(e){for(var t,n=0,o=this._members.length;n<o;n++)if((t=this._members[n]).text&&0===t.text.indexOf(e))return r(t.node)},n.prototype._findIndexOfNode=function(e){for(var t=0,n=this._members.length;t<n;t++)if(this._members[t].node===e)return t;return-1},n.prototype._getActiveElementIndex=function(){return this._findIndexOfNode(document.activeElement)},n.prototype.focusNodeAtIndex=function(e){var t=this._members[e];return t&&r(t.node),this},n.prototype.addMember=function(e,t){var n=e.node||e,r=e.text||n.getAttribute("data-focus-group-text")||n.textContent||"";this._checkNode(n);var o={node:n,text:r.replace(/[\W_]/g,"").toLowerCase()};return null!==t&&void 0!==t?this._members.splice(t,0,o):this._members.push(o),this},n.prototype.removeMember=function(e){var t="number"==typeof e?e:this._findIndexOfNode(e);if(-1!==t)return this._members.splice(t,1),this},n.prototype.clearMembers=function(){return this._members=[],this},n.prototype.setMembers=function(e){this.clearMembers();for(var t=0,n=e.length;t<n;t++)this.addMember(e[t]);return this},n.prototype.getMembers=function(){return this._members},n.prototype._checkNode=function(e){if(!e.nodeType||e.nodeType!==window.Node.ELEMENT_NODE)throw new Error("focus-group: only DOM nodes allowed");return e},e.exports=function(e){return new n(e)}},function(e,t,n){"use strict";var r=n(10),o=n(5),i={wrap:!0,stringSearch:!0},s={init:function(e){this.updateOptions(e),this.handleBlur=function(){var e=this;e.blurTimer=setTimeout(function(){if(e.button){var t=e.button.ref.current;if(t){var n=t.ownerDocument.activeElement;if(!t||n!==t){var r=e.menu.ref.current;r!==n?r&&r.contains(n)||e.isOpen&&e.closeMenu({focusButton:!1}):e.focusItem(0)}}}},0)}.bind(this),this.handleSelection=function(e,t){this.options.closeOnSelection&&this.closeMenu({focusButton:!0});this.options.onSelection&&this.options.onSelection(e,t)}.bind(this),this.handleMenuKey=function(e){if(this.isOpen)switch(e.key){case"Escape":e.preventDefault(),this.closeMenu({focusButton:!0});break;case"Home":e.preventDefault(),this.focusGroup.moveFocusToFirst();break;case"End":e.preventDefault(),this.focusGroup.moveFocusToLast()}}.bind(this),this.focusGroup=r(i),this.button=null,this.menu=null,this.isOpen=!1},updateOptions:function(e){var t=this.options;this.options=e||this.options||{},void 0===this.options.closeOnSelection&&(this.options.closeOnSelection=!0),void 0===this.options.closeOnBlur&&(this.options.closeOnBlur=!0),this.options.id&&o.registerManager(this.options.id,this),t&&t.id&&t.id!==this.options.id&&o.unregisterManager(this.options.id,this)},focusItem:function(e){this.focusGroup.focusNodeAtIndex(e)},addItem:function(e){this.focusGroup.addMember(e)},clearItems:function(){this.focusGroup.clearMembers()},handleButtonNonArrowKey:function(e){this.focusGroup._handleUnboundKey(e)},destroy:function(){this.button=null,this.menu=null,this.focusGroup.deactivate(),clearTimeout(this.blurTimer),clearTimeout(this.moveFocusTimer)},update:function(){this.menu.setState({isOpen:this.isOpen}),this.button.setState({menuOpen:this.isOpen}),this.options.onMenuToggle&&this.options.onMenuToggle({isOpen:this.isOpen})},openMenu:function(e){if(!this.isOpen&&(void 0===(e=e||{}).focusMenu&&(e.focusMenu=!0),this.isOpen=!0,this.update(),this.focusGroup.activate(),e.focusMenu)){var t=this;this.moveFocusTimer=setTimeout(function(){t.focusItem(0)},0)}},closeMenu:function(e){this.isOpen&&(e=e||{},this.isOpen=!1,this.update(),e.focusButton&&this.button.ref.current.focus())},toggleMenu:function(e,t){e=e||{},t=t||{},this.isOpen?this.closeMenu(e):this.openMenu(t)}};e.exports=function(e){var t=Object.create(s);return t.init(e),t}},function(e,t,n){"use strict";e.exports="SECRET_DO_NOT_PASS_THIS_OR_YOU_WILL_BE_FIRED"},function(e,t,n){"use strict";var r=function(e){};e.exports=function(e,t,n,o,i,s,a,u){if(r(t),!e){var c;if(void 0===t)c=new Error("Minified exception occurred; use the non-minified dev environment for the full error message and additional helpful warnings.");else{var f=[n,o,i,s,a,u],p=0;(c=new Error(t.replace(/%s/g,function(){return f[p++]}))).name="Invariant Violation"}throw c.framesToPop=1,c}}},function(e,t,n){"use strict";function r(e){return function(){return e}}var o=function(){};o.thatReturns=r,o.thatReturnsFalse=r(!1),o.thatReturnsTrue=r(!0),o.thatReturnsNull=r(null),o.thatReturnsThis=function(){return this},o.thatReturnsArgument=function(e){return e},e.exports=o},function(e,t,n){"use strict";var r=n(14),o=n(13),i=n(12);e.exports=function(){function e(e,t,n,r,s,a){a!==i&&o(!1,"Calling PropTypes validators directly is not supported by the `prop-types` package. Use PropTypes.checkPropTypes() to call them. Read more at http://fb.me/use-check-prop-types")}function t(){return e}e.isRequired=e;var n={array:e,bool:e,func:e,number:e,object:e,string:e,symbol:e,any:e,arrayOf:t,element:e,instanceOf:t,node:e,objectOf:t,oneOf:t,oneOfType:t,shape:t,exact:t};return n.checkPropTypes=r,n.PropTypes=n,n}},function(e,t,n){"use strict";var r=n(1),o=n(0),i=n(11),s=n(4),a=n(3).refType,u=n(2),c={children:o.node.isRequired,forwardedRef:a,onMenuToggle:o.func,onSelection:o.func,closeOnSelection:o.bool,closeOnBlur:o.bool,tag:o.string},f=function(e){return{onMenuToggle:e.onMenuToggle,onSelection:e.onSelection,closeOnSelection:e.closeOnSelection,closeOnBlur:e.closeOnBlur,id:e.id}},p=function(e){function t(n){!function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,t);var r=function(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}(this,e.call(this,n));return r.manager=i(f(n)),r}return function(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)}(t,e),t.prototype.componentDidUpdate=function(){this.manager.updateOptions(f(this.props))},t.prototype.render=function(){var e={};return u(e,this.props,c),r.createElement(s.Provider,{value:this.manager},r.createElement(this.props.tag,e,this.props.children))},t}(r.Component);p.propTypes=c,p.defaultProps={tag:"div"},e.exports=r.forwardRef(function(e,t){var n={forwardedRef:t};return u(n,e,{children:c.children,forwardedRef:c.forwardedRef}),u(n,{forwardedRef:t}),r.createElement(p,n,e.children)})},function(e,t,n){"use strict";var r=n(5);e.exports={Wrapper:n(16),Button:n(9),Menu:n(8),MenuItem:n(6),openMenu:r.openMenu,closeMenu:r.closeMenu}}])});
@@ -1,14 +0,0 @@
1
- const path = require("path");
2
-
3
- module.exports = {
4
- entry: {
5
- demo: "./demo/js/index.js"
6
- },
7
- output: {
8
- path: path.join(__dirname, "demo"),
9
- filename: "demo-bundle.js"
10
- },
11
- module: {
12
- rules: [{ test: /\.js$/, exclude: /node_modules/, loader: "babel-loader" }]
13
- }
14
- };
@@ -1,35 +0,0 @@
1
- const path = require("path");
2
-
3
- const filename = process.env.MINIFY
4
- ? "ReactAriaMenuButton.min.js"
5
- : "ReactAriaMenuButton.js";
6
-
7
- module.exports = {
8
- entry: {
9
- AriaMenuButton: "./src/index.js"
10
- },
11
- output: {
12
- library: "ReactAriaMenuButton",
13
- libraryTarget: "umd",
14
- path: path.join(__dirname, "umd"),
15
- filename: filename
16
- },
17
- externals: [
18
- {
19
- react: {
20
- root: "React",
21
- commonjs2: "react",
22
- commonjs: "react",
23
- amd: "react"
24
- }
25
- },
26
- ],
27
- module: {
28
- rules: [{ test: /\.js$/, exclude: /node_modules/, loader: "babel-loader" }]
29
- },
30
- node: {
31
- Buffer: false,
32
- process: false,
33
- setImmediate: false
34
- }
35
- };