@atlaskit/dropdown-menu 10.1.8 → 11.0.2

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 (211) hide show
  1. package/CHANGELOG.md +148 -0
  2. package/__perf__/default.tsx +1 -1
  3. package/__perf__/dropdown-menu.tsx +216 -0
  4. package/codemods/11.0.0-lite-mode.tsx +39 -0
  5. package/codemods/__tests__/11.0.0-lite-mode.test.tsx +48 -0
  6. package/codemods/__tests__/convert-position.test.tsx +88 -0
  7. package/codemods/__tests__/convert-triggerType.test.tsx +100 -0
  8. package/codemods/__tests__/deprecate-items.test.tsx +108 -0
  9. package/codemods/__tests__/deprecate-onItemActivated.test.tsx +108 -0
  10. package/codemods/__tests__/deprecate-onPositioned.test.tsx +108 -0
  11. package/codemods/__tests__/deprecate-shouldFitContainer.tsx +108 -0
  12. package/codemods/__tests__/rename-imports.tsx +136 -0
  13. package/codemods/__tests__/replace-position-to-placement.test.tsx +84 -0
  14. package/codemods/__tests__/replace-shouldAllowMultipleLine.test.tsx +122 -0
  15. package/codemods/__tests__/update-component-callsites.tsx +66 -0
  16. package/codemods/migrates/convert-trigger-type.tsx +57 -0
  17. package/codemods/migrates/deprecate-items.tsx +9 -0
  18. package/codemods/migrates/deprecate-onItemActivated.tsx +9 -0
  19. package/codemods/migrates/deprecate-onPositioned.tsx +9 -0
  20. package/codemods/migrates/deprecate-shouldFitContainer.tsx +9 -0
  21. package/codemods/migrates/rename-imports.tsx +22 -0
  22. package/codemods/migrates/replace-position-to-placement.tsx +38 -0
  23. package/codemods/migrates/replace-shouldAllowMultiline.tsx +47 -0
  24. package/codemods/migrates/update-component-callsites.tsx +13 -0
  25. package/codemods/utils/convert-position.tsx +24 -0
  26. package/codemods/utils/create-rename-import.tsx +41 -0
  27. package/codemods/utils/create-update-callsite.tsx +32 -0
  28. package/dist/cjs/checkbox/dropdown-item-checkbox-group.js +31 -0
  29. package/dist/cjs/checkbox/dropdown-item-checkbox.js +108 -0
  30. package/dist/cjs/dropdown-menu-item-group.js +22 -0
  31. package/dist/cjs/dropdown-menu-item.js +67 -0
  32. package/dist/cjs/dropdown-menu.js +194 -0
  33. package/dist/cjs/index.js +21 -29
  34. package/dist/cjs/{components/item/DropdownItemRadio.js → internal/components/focus-manager.js} +40 -9
  35. package/dist/cjs/internal/components/menu-wrapper.js +68 -0
  36. package/dist/cjs/internal/context/checkbox-group-context.js +14 -0
  37. package/dist/cjs/internal/context/selection-store.js +76 -0
  38. package/dist/cjs/internal/hooks/use-checkbox-state.js +68 -0
  39. package/dist/cjs/internal/hooks/use-radio-state.js +84 -0
  40. package/dist/cjs/internal/hooks/use-register-item-with-focus-manager.js +29 -0
  41. package/dist/cjs/internal/utils/get-icon-colors.js +25 -0
  42. package/dist/cjs/internal/utils/handle-focus.js +58 -0
  43. package/dist/cjs/internal/utils/is-checkbox-item.js +11 -0
  44. package/dist/cjs/internal/utils/is-radio-item.js +11 -0
  45. package/dist/cjs/internal/utils/is-voice-over-supported.js +23 -0
  46. package/dist/cjs/internal/utils/reset-options-in-group.js +23 -0
  47. package/dist/cjs/radio/dropdown-item-radio-group.js +89 -0
  48. package/dist/cjs/radio/dropdown-item-radio.js +108 -0
  49. package/dist/cjs/version.json +1 -1
  50. package/dist/es2019/checkbox/dropdown-item-checkbox-group.js +21 -0
  51. package/dist/es2019/checkbox/dropdown-item-checkbox.js +67 -0
  52. package/dist/es2019/dropdown-menu-item-group.js +11 -0
  53. package/dist/es2019/dropdown-menu-item.js +49 -0
  54. package/dist/es2019/dropdown-menu.js +151 -0
  55. package/dist/es2019/index.js +7 -11
  56. package/dist/es2019/internal/components/focus-manager.js +40 -0
  57. package/dist/es2019/internal/components/menu-wrapper.js +44 -0
  58. package/dist/es2019/internal/context/checkbox-group-context.js +6 -0
  59. package/dist/es2019/internal/context/selection-store.js +54 -0
  60. package/dist/es2019/internal/hooks/use-checkbox-state.js +45 -0
  61. package/dist/es2019/internal/hooks/use-radio-state.js +56 -0
  62. package/dist/es2019/internal/hooks/use-register-item-with-focus-manager.js +19 -0
  63. package/dist/es2019/internal/utils/get-icon-colors.js +17 -0
  64. package/dist/es2019/internal/utils/handle-focus.js +48 -0
  65. package/dist/es2019/internal/utils/is-checkbox-item.js +4 -0
  66. package/dist/es2019/internal/utils/is-radio-item.js +4 -0
  67. package/dist/es2019/internal/utils/is-voice-over-supported.js +11 -0
  68. package/dist/es2019/internal/utils/reset-options-in-group.js +7 -0
  69. package/dist/es2019/radio/dropdown-item-radio-group.js +56 -0
  70. package/dist/es2019/radio/dropdown-item-radio.js +67 -0
  71. package/dist/es2019/version.json +1 -1
  72. package/dist/esm/checkbox/dropdown-item-checkbox-group.js +19 -0
  73. package/dist/esm/checkbox/dropdown-item-checkbox.js +81 -0
  74. package/dist/esm/dropdown-menu-item-group.js +11 -0
  75. package/dist/esm/dropdown-menu-item.js +52 -0
  76. package/dist/esm/dropdown-menu.js +168 -0
  77. package/dist/esm/index.js +7 -11
  78. package/dist/esm/internal/components/focus-manager.js +39 -0
  79. package/dist/esm/internal/components/menu-wrapper.js +45 -0
  80. package/dist/esm/internal/context/checkbox-group-context.js +6 -0
  81. package/dist/esm/internal/context/selection-store.js +58 -0
  82. package/dist/esm/internal/hooks/use-checkbox-state.js +55 -0
  83. package/dist/esm/internal/hooks/use-radio-state.js +70 -0
  84. package/dist/esm/internal/hooks/use-register-item-with-focus-manager.js +19 -0
  85. package/dist/esm/internal/utils/get-icon-colors.js +17 -0
  86. package/dist/esm/internal/utils/handle-focus.js +47 -0
  87. package/dist/esm/internal/utils/is-checkbox-item.js +4 -0
  88. package/dist/esm/internal/utils/is-radio-item.js +4 -0
  89. package/dist/esm/internal/utils/is-voice-over-supported.js +15 -0
  90. package/dist/esm/internal/utils/reset-options-in-group.js +13 -0
  91. package/dist/esm/radio/dropdown-item-radio-group.js +66 -0
  92. package/dist/esm/radio/dropdown-item-radio.js +81 -0
  93. package/dist/esm/version.json +1 -1
  94. package/dist/types/checkbox/dropdown-item-checkbox-group.d.ts +16 -0
  95. package/dist/types/checkbox/dropdown-item-checkbox.d.ts +13 -0
  96. package/dist/types/dropdown-menu-item-group.d.ts +11 -0
  97. package/dist/types/dropdown-menu-item.d.ts +13 -0
  98. package/dist/types/dropdown-menu.d.ts +13 -0
  99. package/dist/types/index.d.ts +8 -10
  100. package/dist/types/internal/components/focus-manager.d.ts +19 -0
  101. package/dist/types/internal/components/menu-wrapper.d.ts +11 -0
  102. package/dist/types/internal/context/checkbox-group-context.d.ts +5 -0
  103. package/dist/types/internal/context/selection-store.d.ts +27 -0
  104. package/dist/types/internal/hooks/use-checkbox-state.d.ts +14 -0
  105. package/dist/types/internal/hooks/use-radio-state.d.ts +9 -0
  106. package/dist/types/internal/hooks/use-register-item-with-focus-manager.d.ts +4 -0
  107. package/dist/types/internal/utils/get-icon-colors.d.ts +8 -0
  108. package/dist/types/internal/utils/handle-focus.d.ts +2 -0
  109. package/dist/types/internal/utils/is-checkbox-item.d.ts +1 -0
  110. package/dist/types/internal/utils/is-radio-item.d.ts +1 -0
  111. package/dist/types/internal/utils/is-voice-over-supported.d.ts +2 -0
  112. package/dist/types/internal/utils/reset-options-in-group.d.ts +4 -0
  113. package/dist/types/radio/dropdown-item-radio-group.d.ts +25 -0
  114. package/dist/types/radio/dropdown-item-radio.d.ts +13 -0
  115. package/dist/types/types.d.ts +254 -79
  116. package/package.json +39 -23
  117. package/dist/cjs/components/DropdownMenu.js +0 -230
  118. package/dist/cjs/components/DropdownMenuStateless.js +0 -523
  119. package/dist/cjs/components/context/DropdownItemClickManager.js +0 -72
  120. package/dist/cjs/components/context/DropdownItemFocusManager.js +0 -178
  121. package/dist/cjs/components/context/DropdownItemSelectionCache.js +0 -131
  122. package/dist/cjs/components/context/DropdownItemSelectionManager.js +0 -185
  123. package/dist/cjs/components/group/DropdownItemGroup.js +0 -61
  124. package/dist/cjs/components/group/DropdownItemGroupCheckbox.js +0 -16
  125. package/dist/cjs/components/group/DropdownItemGroupRadio.js +0 -16
  126. package/dist/cjs/components/group/ert-group-selection.js +0 -8
  127. package/dist/cjs/components/hoc/withItemSelectionManager.js +0 -66
  128. package/dist/cjs/components/hoc/withToggleInteraction.js +0 -175
  129. package/dist/cjs/components/item/DropdownItem.js +0 -19
  130. package/dist/cjs/components/item/DropdownItemCheckbox.js +0 -28
  131. package/dist/cjs/components/item/ert-item-checkbox.js +0 -8
  132. package/dist/cjs/components/item/ert-item-radio.js +0 -8
  133. package/dist/cjs/components/item/ert-item.js +0 -8
  134. package/dist/cjs/styled/WidthConstrainer.js +0 -21
  135. package/dist/cjs/util/contextNamespace.js +0 -19
  136. package/dist/cjs/util/getDisplayName.js +0 -14
  137. package/dist/cjs/util/keys.js +0 -18
  138. package/dist/cjs/util/safeContextCall.js +0 -27
  139. package/dist/cjs/util/supportsVoiceover.js +0 -17
  140. package/dist/es2019/components/DropdownMenu.js +0 -156
  141. package/dist/es2019/components/DropdownMenuStateless.js +0 -459
  142. package/dist/es2019/components/context/DropdownItemClickManager.js +0 -31
  143. package/dist/es2019/components/context/DropdownItemFocusManager.js +0 -134
  144. package/dist/es2019/components/context/DropdownItemSelectionCache.js +0 -68
  145. package/dist/es2019/components/context/DropdownItemSelectionManager.js +0 -140
  146. package/dist/es2019/components/group/DropdownItemGroup.js +0 -17
  147. package/dist/es2019/components/group/DropdownItemGroupCheckbox.js +0 -3
  148. package/dist/es2019/components/group/DropdownItemGroupRadio.js +0 -3
  149. package/dist/es2019/components/group/ert-group-selection.js +0 -1
  150. package/dist/es2019/components/hoc/withItemSelectionManager.js +0 -20
  151. package/dist/es2019/components/hoc/withToggleInteraction.js +0 -119
  152. package/dist/es2019/components/item/DropdownItem.js +0 -3
  153. package/dist/es2019/components/item/DropdownItemCheckbox.js +0 -5
  154. package/dist/es2019/components/item/DropdownItemRadio.js +0 -5
  155. package/dist/es2019/components/item/ert-item-checkbox.js +0 -1
  156. package/dist/es2019/components/item/ert-item-radio.js +0 -1
  157. package/dist/es2019/components/item/ert-item.js +0 -1
  158. package/dist/es2019/styled/WidthConstrainer.js +0 -6
  159. package/dist/es2019/util/contextNamespace.js +0 -6
  160. package/dist/es2019/util/getDisplayName.js +0 -4
  161. package/dist/es2019/util/keys.js +0 -6
  162. package/dist/es2019/util/safeContextCall.js +0 -10
  163. package/dist/es2019/util/supportsVoiceover.js +0 -5
  164. package/dist/esm/components/DropdownMenu.js +0 -215
  165. package/dist/esm/components/DropdownMenuStateless.js +0 -516
  166. package/dist/esm/components/context/DropdownItemClickManager.js +0 -59
  167. package/dist/esm/components/context/DropdownItemFocusManager.js +0 -164
  168. package/dist/esm/components/context/DropdownItemSelectionCache.js +0 -113
  169. package/dist/esm/components/context/DropdownItemSelectionManager.js +0 -174
  170. package/dist/esm/components/group/DropdownItemGroup.js +0 -43
  171. package/dist/esm/components/group/DropdownItemGroupCheckbox.js +0 -3
  172. package/dist/esm/components/group/DropdownItemGroupRadio.js +0 -3
  173. package/dist/esm/components/group/ert-group-selection.js +0 -1
  174. package/dist/esm/components/hoc/withItemSelectionManager.js +0 -47
  175. package/dist/esm/components/hoc/withToggleInteraction.js +0 -155
  176. package/dist/esm/components/item/DropdownItem.js +0 -3
  177. package/dist/esm/components/item/DropdownItemCheckbox.js +0 -7
  178. package/dist/esm/components/item/DropdownItemRadio.js +0 -7
  179. package/dist/esm/components/item/ert-item-checkbox.js +0 -1
  180. package/dist/esm/components/item/ert-item-radio.js +0 -1
  181. package/dist/esm/components/item/ert-item.js +0 -1
  182. package/dist/esm/styled/WidthConstrainer.js +0 -9
  183. package/dist/esm/util/contextNamespace.js +0 -8
  184. package/dist/esm/util/getDisplayName.js +0 -6
  185. package/dist/esm/util/keys.js +0 -6
  186. package/dist/esm/util/safeContextCall.js +0 -18
  187. package/dist/esm/util/supportsVoiceover.js +0 -9
  188. package/dist/types/components/DropdownMenu.d.ts +0 -36
  189. package/dist/types/components/DropdownMenuStateless.d.ts +0 -82
  190. package/dist/types/components/context/DropdownItemClickManager.d.ts +0 -19
  191. package/dist/types/components/context/DropdownItemFocusManager.d.ts +0 -35
  192. package/dist/types/components/context/DropdownItemSelectionCache.d.ts +0 -31
  193. package/dist/types/components/context/DropdownItemSelectionManager.d.ts +0 -34
  194. package/dist/types/components/group/DropdownItemGroup.d.ts +0 -12
  195. package/dist/types/components/group/DropdownItemGroupCheckbox.d.ts +0 -55
  196. package/dist/types/components/group/DropdownItemGroupRadio.d.ts +0 -55
  197. package/dist/types/components/group/ert-group-selection.d.ts +0 -6
  198. package/dist/types/components/hoc/withItemSelectionManager.d.ts +0 -63
  199. package/dist/types/components/hoc/withToggleInteraction.d.ts +0 -98
  200. package/dist/types/components/item/DropdownItem.d.ts +0 -65
  201. package/dist/types/components/item/DropdownItemCheckbox.d.ts +0 -80
  202. package/dist/types/components/item/DropdownItemRadio.d.ts +0 -80
  203. package/dist/types/components/item/ert-item-checkbox.d.ts +0 -2
  204. package/dist/types/components/item/ert-item-radio.d.ts +0 -2
  205. package/dist/types/components/item/ert-item.d.ts +0 -2
  206. package/dist/types/styled/WidthConstrainer.d.ts +0 -7
  207. package/dist/types/util/contextNamespace.d.ts +0 -4
  208. package/dist/types/util/getDisplayName.d.ts +0 -3
  209. package/dist/types/util/keys.d.ts +0 -6
  210. package/dist/types/util/safeContextCall.d.ts +0 -6
  211. package/dist/types/util/supportsVoiceover.d.ts +0 -2
@@ -0,0 +1,84 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+
5
+ Object.defineProperty(exports, "__esModule", {
6
+ value: true
7
+ });
8
+ exports.default = void 0;
9
+
10
+ var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
11
+
12
+ var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
13
+
14
+ var _react = require("react");
15
+
16
+ var _dropdownItemRadioGroup = require("../../radio/dropdown-item-radio-group");
17
+
18
+ var _selectionStore = require("../context/selection-store");
19
+
20
+ var _resetOptionsInGroup = _interopRequireDefault(require("../utils/reset-options-in-group"));
21
+
22
+ function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
23
+
24
+ function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { (0, _defineProperty2.default)(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
25
+
26
+ function useRadioState(_ref) {
27
+ var id = _ref.id,
28
+ isSelected = _ref.isSelected,
29
+ defaultSelected = _ref.defaultSelected;
30
+
31
+ var _useContext = (0, _react.useContext)(_selectionStore.SelectionStoreContext),
32
+ setGroupState = _useContext.setGroupState,
33
+ getGroupState = _useContext.getGroupState;
34
+
35
+ var _useContext2 = (0, _react.useContext)(_dropdownItemRadioGroup.RadioGroupContext),
36
+ group = _useContext2.id,
37
+ radioGroupState = _useContext2.radioGroupState,
38
+ selectRadioItem = _useContext2.selectRadioItem;
39
+
40
+ var persistedIsSelected = radioGroupState[id];
41
+
42
+ var _useState = (0, _react.useState)(function () {
43
+ return persistedIsSelected !== undefined ? persistedIsSelected : defaultSelected || false;
44
+ }),
45
+ _useState2 = (0, _slicedToArray2.default)(_useState, 2),
46
+ localIsSelected = _useState2[0],
47
+ setLocalIsSelected = _useState2[1];
48
+
49
+ var setLocalState = (0, _react.useCallback)(function (newValue) {
50
+ if (!persistedIsSelected) {
51
+ var nextValue = newValue(persistedIsSelected);
52
+ selectRadioItem(id, nextValue);
53
+ setLocalIsSelected(nextValue);
54
+ }
55
+ }, [persistedIsSelected, id, selectRadioItem]);
56
+ /**
57
+ * - radio state changes any time a radio child is changed
58
+ * - when it changes we want all radio buttons to update their local state
59
+ * - it takes the value from radio group state and applies it locally if it exists which it will only exist, if it is selected
60
+ */
61
+
62
+ (0, _react.useEffect)(function () {
63
+ setLocalIsSelected(function () {
64
+ var existing = radioGroupState[id];
65
+ return existing !== undefined ? existing : defaultSelected || false;
66
+ });
67
+ }, [radioGroupState, group, id, defaultSelected]);
68
+
69
+ if (typeof isSelected === 'boolean') {
70
+ return [isSelected, function () {
71
+ return false;
72
+ }];
73
+ }
74
+
75
+ if (persistedIsSelected === undefined) {
76
+ var existing = getGroupState(group);
77
+ setGroupState(group, _objectSpread(_objectSpread({}, (0, _resetOptionsInGroup.default)(existing || {})), {}, (0, _defineProperty2.default)({}, id, defaultSelected || false)));
78
+ }
79
+
80
+ return [localIsSelected, setLocalState];
81
+ }
82
+
83
+ var _default = useRadioState;
84
+ exports.default = _default;
@@ -0,0 +1,29 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.default = void 0;
7
+
8
+ var _react = require("react");
9
+
10
+ var _focusManager = require("../components/focus-manager");
11
+
12
+ // This function is called whenever a MenuItem mounts.
13
+ // The refs stored in the context are used to programatically
14
+ // control focus on a user navigates using the keyboard.
15
+ function useRegisterItemWithFocusManager() {
16
+ var _useContext = (0, _react.useContext)(_focusManager.FocusManagerContext),
17
+ registerRef = _useContext.registerRef;
18
+
19
+ var itemRef = (0, _react.useRef)(null);
20
+ (0, _react.useEffect)(function () {
21
+ if (itemRef.current !== null) {
22
+ registerRef(itemRef.current);
23
+ }
24
+ }, [registerRef]);
25
+ return itemRef;
26
+ }
27
+
28
+ var _default = useRegisterItemWithFocusManager;
29
+ exports.default = _default;
@@ -0,0 +1,25 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.default = void 0;
7
+
8
+ var _colors = require("@atlaskit/theme/colors");
9
+
10
+ var getIconColors = function getIconColors(isSelected) {
11
+ if (isSelected) {
12
+ return {
13
+ primary: "var(--ds-background-boldBrand-resting, ".concat(_colors.B400, ")"),
14
+ secondary: "var(--ds-background-default, ".concat(_colors.N40, ")")
15
+ };
16
+ }
17
+
18
+ return {
19
+ primary: "var(--ds-border-neutral, ".concat(_colors.N40, ")"),
20
+ secondary: "var(--ds-UNSAFE_util-transparent, ".concat(_colors.N40, ")")
21
+ };
22
+ };
23
+
24
+ var _default = getIconColors;
25
+ exports.default = _default;
@@ -0,0 +1,58 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+
5
+ Object.defineProperty(exports, "__esModule", {
6
+ value: true
7
+ });
8
+ exports.default = handleFocus;
9
+
10
+ var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
11
+
12
+ var _keycodes = require("@atlaskit/ds-lib/keycodes");
13
+
14
+ var _actionMap;
15
+
16
+ var actionMap = (_actionMap = {}, (0, _defineProperty2.default)(_actionMap, _keycodes.KEY_DOWN, 'next'), (0, _defineProperty2.default)(_actionMap, _keycodes.KEY_UP, 'prev'), (0, _defineProperty2.default)(_actionMap, _keycodes.KEY_HOME, 'first'), (0, _defineProperty2.default)(_actionMap, _keycodes.KEY_END, 'last'), _actionMap);
17
+
18
+ function handleFocus(refs) {
19
+ return function (e) {
20
+ var currentFocusedIdx = refs.findIndex(function (el) {
21
+ var _document$activeEleme;
22
+
23
+ return (_document$activeEleme = document.activeElement) === null || _document$activeEleme === void 0 ? void 0 : _document$activeEleme.isSameNode(el);
24
+ });
25
+ var action = actionMap[e.key];
26
+
27
+ switch (action) {
28
+ case 'next':
29
+ if (currentFocusedIdx < refs.length - 1) {
30
+ e.preventDefault();
31
+ refs[currentFocusedIdx + 1].focus();
32
+ }
33
+
34
+ break;
35
+
36
+ case 'prev':
37
+ if (currentFocusedIdx > 0) {
38
+ e.preventDefault();
39
+ refs[currentFocusedIdx - 1].focus();
40
+ }
41
+
42
+ break;
43
+
44
+ case 'first':
45
+ e.preventDefault();
46
+ refs[0].focus();
47
+ break;
48
+
49
+ case 'last':
50
+ e.preventDefault();
51
+ refs[refs.length - 1].focus();
52
+ break;
53
+
54
+ default:
55
+ return;
56
+ }
57
+ };
58
+ }
@@ -0,0 +1,11 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.default = isCheckboxItem;
7
+
8
+ function isCheckboxItem(element) {
9
+ var role = element.getAttribute('role');
10
+ return role === 'checkbox' || role === 'menuitemcheckbox';
11
+ }
@@ -0,0 +1,11 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.default = isCheckboxItem;
7
+
8
+ function isCheckboxItem(element) {
9
+ var role = element.getAttribute('role');
10
+ return role === 'radio' || role === 'menuitemradio';
11
+ }
@@ -0,0 +1,23 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.default = void 0;
7
+
8
+ var canUseDOM = function canUseDOM() {
9
+ return Boolean(typeof window !== 'undefined' && window.document && window.document.createElement);
10
+ };
11
+ /*
12
+ * Making sure we can fallback to browsers doesn't support voice over -
13
+ * we would using menuitemcheckbox / menuitemradio for these that supports voice over, and
14
+ * will fallback to checkbox / radio for these doesn't
15
+ */
16
+
17
+
18
+ var isVoiceOverSupported = function isVoiceOverSupported() {
19
+ return /Mac OS X/.test(canUseDOM() ? navigator.userAgent : '');
20
+ };
21
+
22
+ var _default = isVoiceOverSupported;
23
+ exports.default = _default;
@@ -0,0 +1,23 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+
5
+ Object.defineProperty(exports, "__esModule", {
6
+ value: true
7
+ });
8
+ exports.default = void 0;
9
+
10
+ var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
11
+
12
+ function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
13
+
14
+ function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { (0, _defineProperty2.default)(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
15
+
16
+ var resetOptionsInGroup = function resetOptionsInGroup(group) {
17
+ return Object.keys(group || {}).reduce(function (accumulator, current) {
18
+ return _objectSpread(_objectSpread({}, accumulator), {}, (0, _defineProperty2.default)({}, current, typeof group[current] === 'undefined' ? undefined : false));
19
+ }, {});
20
+ };
21
+
22
+ var _default = resetOptionsInGroup;
23
+ exports.default = _default;
@@ -0,0 +1,89 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+
5
+ var _typeof = require("@babel/runtime/helpers/typeof");
6
+
7
+ Object.defineProperty(exports, "__esModule", {
8
+ value: true
9
+ });
10
+ exports.default = exports.RadioGroupContext = void 0;
11
+
12
+ var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
13
+
14
+ var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
15
+
16
+ var _react = _interopRequireWildcard(require("react"));
17
+
18
+ var _noop = _interopRequireDefault(require("@atlaskit/ds-lib/noop"));
19
+
20
+ var _section = _interopRequireDefault(require("@atlaskit/menu/section"));
21
+
22
+ var _selectionStore = require("../internal/context/selection-store");
23
+
24
+ var _resetOptionsInGroup = _interopRequireDefault(require("../internal/utils/reset-options-in-group"));
25
+
26
+ function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
27
+
28
+ function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || _typeof(obj) !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
29
+
30
+ function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
31
+
32
+ function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { (0, _defineProperty2.default)(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
33
+
34
+ /**
35
+ * __Radio group context__
36
+ * Context provider that wraps each DropdownItemRadioGroup
37
+ */
38
+ var RadioGroupContext = /*#__PURE__*/(0, _react.createContext)({
39
+ id: '',
40
+ radioGroupState: {},
41
+ selectRadioItem: _noop.default
42
+ });
43
+ /**
44
+ * __Dropdown item radio group__
45
+ * Store which manages the selection state for each DropdownItemRadio
46
+ * across mount and unmounts.
47
+ *
48
+ */
49
+
50
+ exports.RadioGroupContext = RadioGroupContext;
51
+
52
+ var DropdownItemRadioGroup = function DropdownItemRadioGroup(props) {
53
+ var children = props.children,
54
+ id = props.id;
55
+
56
+ var _useContext = (0, _react.useContext)(_selectionStore.SelectionStoreContext),
57
+ setGroupState = _useContext.setGroupState,
58
+ getGroupState = _useContext.getGroupState;
59
+ /**
60
+ * - initially `radioGroupState` is from selection store, so it's safe to update without re-rendering
61
+ * - we flush a render by updating this local radio group state
62
+ */
63
+
64
+
65
+ var _useState = (0, _react.useState)(function () {
66
+ return getGroupState(id);
67
+ }),
68
+ _useState2 = (0, _slicedToArray2.default)(_useState, 2),
69
+ radioGroupState = _useState2[0],
70
+ setRadioGroupState = _useState2[1];
71
+
72
+ var selectRadioItem = function selectRadioItem(childId, value) {
73
+ var newValue = _objectSpread(_objectSpread({}, (0, _resetOptionsInGroup.default)(getGroupState(id))), {}, (0, _defineProperty2.default)({}, childId, value));
74
+
75
+ setRadioGroupState(newValue);
76
+ setGroupState(id, newValue);
77
+ };
78
+
79
+ return /*#__PURE__*/_react.default.createElement(RadioGroupContext.Provider, {
80
+ value: {
81
+ id: id,
82
+ radioGroupState: radioGroupState,
83
+ selectRadioItem: selectRadioItem
84
+ }
85
+ }, /*#__PURE__*/_react.default.createElement(_section.default, props, children));
86
+ };
87
+
88
+ var _default = DropdownItemRadioGroup;
89
+ exports.default = _default;
@@ -0,0 +1,108 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+
5
+ var _typeof = require("@babel/runtime/helpers/typeof");
6
+
7
+ Object.defineProperty(exports, "__esModule", {
8
+ value: true
9
+ });
10
+ exports.default = void 0;
11
+
12
+ var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
13
+
14
+ var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
15
+
16
+ var _objectWithoutProperties2 = _interopRequireDefault(require("@babel/runtime/helpers/objectWithoutProperties"));
17
+
18
+ var _react = _interopRequireWildcard(require("react"));
19
+
20
+ var _noop = _interopRequireDefault(require("@atlaskit/ds-lib/noop"));
21
+
22
+ var _radio = _interopRequireDefault(require("@atlaskit/icon/glyph/radio"));
23
+
24
+ var _buttonItem = _interopRequireDefault(require("@atlaskit/menu/button-item"));
25
+
26
+ var _useRadioState3 = _interopRequireDefault(require("../internal/hooks/use-radio-state"));
27
+
28
+ var _useRegisterItemWithFocusManager = _interopRequireDefault(require("../internal/hooks/use-register-item-with-focus-manager"));
29
+
30
+ var _getIconColors = _interopRequireDefault(require("../internal/utils/get-icon-colors"));
31
+
32
+ var _isVoiceOverSupported = _interopRequireDefault(require("../internal/utils/is-voice-over-supported"));
33
+
34
+ var _excluded = ["id", "isSelected", "defaultSelected", "onClick", "shouldTitleWrap", "shouldDescriptionWrap"];
35
+
36
+ function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
37
+
38
+ function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || _typeof(obj) !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
39
+
40
+ /**
41
+ * __Dropdown item radio__
42
+ *
43
+ * A dropdown item radio displays groups that have a single selection.
44
+ *
45
+ * - [Examples](https://atlassian.design/components/dropdown-menu/dropdown-item-radio/examples)
46
+ * - [Code](https://atlassian.design/components/dropdown-menu/dropdown-item-radio/code)
47
+ * - [Usage](https://atlassian.design/components/dropdown-menu/dropdown-item-radio/usage)
48
+ */
49
+ var DropdownItemRadio = function DropdownItemRadio(props) {
50
+ var id = props.id,
51
+ isSelected = props.isSelected,
52
+ defaultSelected = props.defaultSelected,
53
+ _props$onClick = props.onClick,
54
+ providedOnClick = _props$onClick === void 0 ? _noop.default : _props$onClick,
55
+ _props$shouldTitleWra = props.shouldTitleWrap,
56
+ shouldTitleWrap = _props$shouldTitleWra === void 0 ? true : _props$shouldTitleWra,
57
+ _props$shouldDescript = props.shouldDescriptionWrap,
58
+ shouldDescriptionWrap = _props$shouldDescript === void 0 ? true : _props$shouldDescript,
59
+ rest = (0, _objectWithoutProperties2.default)(props, _excluded);
60
+
61
+ if (process.env.NODE_ENV !== 'production' && typeof isSelected !== 'undefined' && typeof defaultSelected !== 'undefined') {
62
+ // eslint-disable-next-line no-console
63
+ console.warn("[DropdownItemRadio] You've used both `defaultSelected` and `isSelected` props. This is dangerous and can lead to unexpected results. Use one or the other depending if you want to control the components state yourself.");
64
+ }
65
+
66
+ var _useRadioState = (0, _useRadioState3.default)({
67
+ id: id,
68
+ isSelected: isSelected,
69
+ defaultSelected: defaultSelected
70
+ }),
71
+ _useRadioState2 = (0, _slicedToArray2.default)(_useRadioState, 2),
72
+ selected = _useRadioState2[0],
73
+ setSelected = _useRadioState2[1];
74
+
75
+ var _useState = (0, _react.useState)((0, _getIconColors.default)(defaultSelected)),
76
+ _useState2 = (0, _slicedToArray2.default)(_useState, 2),
77
+ iconColors = _useState2[0],
78
+ setIconColors = _useState2[1];
79
+
80
+ var onClickHandler = (0, _react.useCallback)(function (event) {
81
+ setSelected(function (selected) {
82
+ return !selected;
83
+ });
84
+ providedOnClick(event);
85
+ }, [providedOnClick, setSelected]);
86
+ (0, _react.useEffect)(function () {
87
+ setIconColors((0, _getIconColors.default)(selected));
88
+ }, [selected]);
89
+ var itemRef = (0, _useRegisterItemWithFocusManager.default)();
90
+ return /*#__PURE__*/_react.default.createElement(_buttonItem.default, (0, _extends2.default)({
91
+ id: id,
92
+ onClick: onClickHandler,
93
+ role: (0, _isVoiceOverSupported.default)() ? 'radio' : 'menuitemradio',
94
+ "aria-checked": selected,
95
+ shouldTitleWrap: shouldTitleWrap,
96
+ shouldDescriptionWrap: shouldDescriptionWrap,
97
+ iconBefore: /*#__PURE__*/_react.default.createElement(_radio.default, {
98
+ label: "",
99
+ size: "medium",
100
+ primaryColor: iconColors.primary,
101
+ secondaryColor: iconColors.secondary
102
+ }),
103
+ ref: itemRef
104
+ }, rest));
105
+ };
106
+
107
+ var _default = DropdownItemRadio;
108
+ exports.default = _default;
@@ -1,5 +1,5 @@
1
1
  {
2
2
  "name": "@atlaskit/dropdown-menu",
3
- "version": "10.1.8",
3
+ "version": "11.0.2",
4
4
  "sideEffects": false
5
5
  }
@@ -0,0 +1,21 @@
1
+ import React from 'react';
2
+ import Section from '@atlaskit/menu/section';
3
+ import { CheckboxGroupContext } from '../internal/context/checkbox-group-context';
4
+
5
+ /**
6
+ * __Dropdown item checkbox group__
7
+ *
8
+ * A wrapping element for dropdown menu checkbox items.
9
+ *
10
+ */
11
+ const DropdownItemCheckboxGroup = props => {
12
+ const {
13
+ children,
14
+ id
15
+ } = props;
16
+ return /*#__PURE__*/React.createElement(CheckboxGroupContext.Provider, {
17
+ value: id
18
+ }, /*#__PURE__*/React.createElement(Section, props, children));
19
+ };
20
+
21
+ export default DropdownItemCheckboxGroup;
@@ -0,0 +1,67 @@
1
+ import _extends from "@babel/runtime/helpers/extends";
2
+ import React, { useCallback, useEffect, useState } from 'react';
3
+ import noop from '@atlaskit/ds-lib/noop';
4
+ import CheckboxIcon from '@atlaskit/icon/glyph/checkbox';
5
+ import ButtonItem from '@atlaskit/menu/button-item';
6
+ import useCheckboxState from '../internal/hooks/use-checkbox-state';
7
+ import useRegisterItemWithFocusManager from '../internal/hooks/use-register-item-with-focus-manager';
8
+ import getIconColors from '../internal/utils/get-icon-colors';
9
+ import isVoiceOverSupported from '../internal/utils/is-voice-over-supported';
10
+
11
+ /**
12
+ * __Dropdown item checkbox__
13
+ *
14
+ * A dropdown item checkbox creates groups that have multiple selections.
15
+ *
16
+ * - [Examples](https://atlassian.design/components/dropdown-menu/dropdown-item-checkbox/examples)
17
+ * - [Code](https://atlassian.design/components/dropdown-menu/dropdown-item-checkbox/code)
18
+ * - [Usage](https://atlassian.design/components/dropdown-menu/dropdown-item-checkbox/usage)
19
+ */
20
+ const DropdownItemCheckbox = props => {
21
+ const {
22
+ id,
23
+ isSelected,
24
+ defaultSelected,
25
+ onClick: providedOnClick = noop,
26
+ shouldTitleWrap = true,
27
+ shouldDescriptionWrap = true,
28
+ ...rest
29
+ } = props;
30
+
31
+ if (process.env.NODE_ENV !== 'production' && typeof isSelected !== 'undefined' && typeof defaultSelected !== 'undefined') {
32
+ // eslint-disable-next-line no-console
33
+ console.warn("[DropdownItemCheckbox] You've used both `defaultSelected` and `isSelected` props. This is dangerous and can lead to unexpected results. Use one or the other depending if you want to control the components state yourself.");
34
+ }
35
+
36
+ const [selected, setSelected] = useCheckboxState({
37
+ id,
38
+ isSelected,
39
+ defaultSelected
40
+ });
41
+ const [iconColors, setIconColors] = useState(getIconColors(defaultSelected));
42
+ const onClickHandler = useCallback(event => {
43
+ setSelected(selected => !selected);
44
+ providedOnClick(event);
45
+ }, [providedOnClick, setSelected]);
46
+ useEffect(() => {
47
+ setIconColors(getIconColors(selected));
48
+ }, [selected]);
49
+ const itemRef = useRegisterItemWithFocusManager();
50
+ return /*#__PURE__*/React.createElement(ButtonItem, _extends({
51
+ id: id,
52
+ onClick: onClickHandler,
53
+ role: isVoiceOverSupported() ? 'checkbox' : 'menuitemcheckbox',
54
+ "aria-checked": selected,
55
+ shouldTitleWrap: shouldTitleWrap,
56
+ shouldDescriptionWrap: shouldDescriptionWrap,
57
+ iconBefore: /*#__PURE__*/React.createElement(CheckboxIcon, {
58
+ label: "",
59
+ size: "medium",
60
+ primaryColor: iconColors.primary,
61
+ secondaryColor: iconColors.secondary
62
+ }),
63
+ ref: itemRef
64
+ }, rest));
65
+ };
66
+
67
+ export default DropdownItemCheckbox;
@@ -0,0 +1,11 @@
1
+ /**
2
+ * __Section__
3
+ *
4
+ * A dropdown item group includes all the actions or items in a dropdown menu.
5
+ *
6
+ * - [Examples](https://atlassian.design/components/dropdown-menu/dropdown-item-group/examples)
7
+ * - [Code](https://atlassian.design/components/dropdown-menu/dropdown-item-group/code)
8
+ * - [Usage](https://atlassian.design/components/dropdown-menu/dropdown-item-group/usage)
9
+ */
10
+ import Section from '@atlaskit/menu/section';
11
+ export default Section;
@@ -0,0 +1,49 @@
1
+ import _extends from "@babel/runtime/helpers/extends";
2
+ import React from 'react';
3
+ import ButtonItem from '@atlaskit/menu/button-item';
4
+ import LinkItem from '@atlaskit/menu/link-item';
5
+ import useRegisterItemWithFocusManager from './internal/hooks/use-register-item-with-focus-manager';
6
+
7
+ /**
8
+ * __Dropdown menu item__
9
+ *
10
+ * A dropdown item populates the dropdown menu with items. Every item should be inside a dropdown item group.
11
+ *
12
+ * - [Examples](https://atlassian.design/components/dropdown-item/examples)
13
+ * - [Code](https://atlassian.design/components/dropdown-item/code)
14
+ * - [Usage](https://atlassian.design/components/dropdown-item/usage)
15
+ */
16
+ const DropdownMenuItem = props => {
17
+ const {
18
+ elemBefore,
19
+ elemAfter,
20
+ href,
21
+ shouldTitleWrap = true,
22
+ shouldDescriptionWrap = true,
23
+ ...rest
24
+ } = props;
25
+ const itemRef = useRegisterItemWithFocusManager();
26
+
27
+ if (href) {
28
+ return /*#__PURE__*/React.createElement(LinkItem, _extends({
29
+ href: href,
30
+ iconBefore: elemBefore,
31
+ iconAfter: elemAfter,
32
+ role: "menuitem",
33
+ ref: itemRef,
34
+ shouldTitleWrap: shouldTitleWrap,
35
+ shouldDescriptionWrap: shouldDescriptionWrap
36
+ }, rest));
37
+ } else {
38
+ return /*#__PURE__*/React.createElement(ButtonItem, _extends({
39
+ role: "menuitem",
40
+ iconBefore: elemBefore,
41
+ iconAfter: elemAfter,
42
+ ref: itemRef,
43
+ shouldTitleWrap: shouldTitleWrap,
44
+ shouldDescriptionWrap: shouldDescriptionWrap
45
+ }, rest));
46
+ }
47
+ };
48
+
49
+ export default DropdownMenuItem;