@patternfly/react-core 6.0.0-prerelease.21 → 6.0.0-prerelease.23

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 (164) hide show
  1. package/CHANGELOG.md +12 -0
  2. package/components/package.json +1 -1
  3. package/deprecated/package.json +1 -1
  4. package/dist/dynamic/components/AboutModal/package.json +1 -1
  5. package/dist/dynamic/components/Accordion/package.json +1 -1
  6. package/dist/dynamic/components/ActionList/package.json +1 -1
  7. package/dist/dynamic/components/Alert/package.json +1 -1
  8. package/dist/dynamic/components/Avatar/package.json +1 -1
  9. package/dist/dynamic/components/BackToTop/package.json +1 -1
  10. package/dist/dynamic/components/Backdrop/package.json +1 -1
  11. package/dist/dynamic/components/BackgroundImage/package.json +1 -1
  12. package/dist/dynamic/components/Badge/package.json +1 -1
  13. package/dist/dynamic/components/Banner/package.json +1 -1
  14. package/dist/dynamic/components/Brand/package.json +1 -1
  15. package/dist/dynamic/components/Breadcrumb/package.json +1 -1
  16. package/dist/dynamic/components/Button/package.json +1 -1
  17. package/dist/dynamic/components/CalendarMonth/package.json +1 -1
  18. package/dist/dynamic/components/Card/package.json +1 -1
  19. package/dist/dynamic/components/Checkbox/package.json +1 -1
  20. package/dist/dynamic/components/ClipboardCopy/package.json +1 -1
  21. package/dist/dynamic/components/CodeBlock/package.json +1 -1
  22. package/dist/dynamic/components/Content/package.json +1 -1
  23. package/dist/dynamic/components/DataList/package.json +1 -1
  24. package/dist/dynamic/components/DatePicker/package.json +1 -1
  25. package/dist/dynamic/components/DescriptionList/package.json +1 -1
  26. package/dist/dynamic/components/Divider/package.json +1 -1
  27. package/dist/dynamic/components/Drawer/package.json +1 -1
  28. package/dist/dynamic/components/Dropdown/package.json +1 -1
  29. package/dist/dynamic/components/DualListSelector/package.json +1 -1
  30. package/dist/dynamic/components/EmptyState/package.json +1 -1
  31. package/dist/dynamic/components/ExpandableSection/package.json +1 -1
  32. package/dist/dynamic/components/FileUpload/package.json +1 -1
  33. package/dist/dynamic/components/Form/package.json +1 -1
  34. package/dist/dynamic/components/FormSelect/package.json +1 -1
  35. package/dist/dynamic/components/HelperText/package.json +1 -1
  36. package/dist/dynamic/components/Hint/package.json +1 -1
  37. package/dist/dynamic/components/Icon/package.json +1 -1
  38. package/dist/dynamic/components/InputGroup/package.json +1 -1
  39. package/dist/dynamic/components/JumpLinks/package.json +1 -1
  40. package/dist/dynamic/components/Label/package.json +1 -1
  41. package/dist/dynamic/components/List/package.json +1 -1
  42. package/dist/dynamic/components/LoginPage/package.json +1 -1
  43. package/dist/dynamic/components/Masthead/package.json +1 -1
  44. package/dist/dynamic/components/Menu/package.json +1 -1
  45. package/dist/dynamic/components/MenuToggle/package.json +1 -1
  46. package/dist/dynamic/components/Modal/package.json +1 -1
  47. package/dist/dynamic/components/MultipleFileUpload/package.json +1 -1
  48. package/dist/dynamic/components/Nav/package.json +1 -1
  49. package/dist/dynamic/components/NotificationBadge/package.json +1 -1
  50. package/dist/dynamic/components/NotificationDrawer/package.json +1 -1
  51. package/dist/dynamic/components/NumberInput/package.json +1 -1
  52. package/dist/dynamic/components/OverflowMenu/package.json +1 -1
  53. package/dist/dynamic/components/Page/package.json +1 -1
  54. package/dist/dynamic/components/Pagination/package.json +1 -1
  55. package/dist/dynamic/components/Panel/package.json +1 -1
  56. package/dist/dynamic/components/Popover/package.json +1 -1
  57. package/dist/dynamic/components/Progress/package.json +1 -1
  58. package/dist/dynamic/components/ProgressStepper/package.json +1 -1
  59. package/dist/dynamic/components/Radio/package.json +1 -1
  60. package/dist/dynamic/components/SearchInput/package.json +1 -1
  61. package/dist/dynamic/components/Select/package.json +1 -1
  62. package/dist/dynamic/components/Sidebar/package.json +1 -1
  63. package/dist/dynamic/components/SimpleList/package.json +1 -1
  64. package/dist/dynamic/components/Skeleton/package.json +1 -1
  65. package/dist/dynamic/components/SkipToContent/package.json +1 -1
  66. package/dist/dynamic/components/Slider/package.json +1 -1
  67. package/dist/dynamic/components/Spinner/package.json +1 -1
  68. package/dist/dynamic/components/Switch/package.json +1 -1
  69. package/dist/dynamic/components/Tabs/package.json +1 -1
  70. package/dist/dynamic/components/TextArea/package.json +1 -1
  71. package/dist/dynamic/components/TextInput/package.json +1 -1
  72. package/dist/dynamic/components/TextInputGroup/package.json +1 -1
  73. package/dist/dynamic/components/TimePicker/package.json +1 -1
  74. package/dist/dynamic/components/Timestamp/package.json +1 -1
  75. package/dist/dynamic/components/Title/package.json +1 -1
  76. package/dist/dynamic/components/ToggleGroup/package.json +1 -1
  77. package/dist/dynamic/components/Toolbar/package.json +1 -1
  78. package/dist/dynamic/components/Tooltip/package.json +1 -1
  79. package/dist/dynamic/components/TreeView/package.json +1 -1
  80. package/dist/dynamic/components/Truncate/package.json +1 -1
  81. package/dist/dynamic/components/Wizard/hooks/package.json +1 -1
  82. package/dist/dynamic/components/Wizard/package.json +1 -1
  83. package/dist/dynamic/deprecated/components/Chip/package.json +1 -1
  84. package/dist/dynamic/deprecated/components/DragDrop/package.json +1 -1
  85. package/dist/dynamic/deprecated/components/DualListSelector/package.json +1 -1
  86. package/dist/dynamic/deprecated/components/Modal/package.json +1 -1
  87. package/dist/dynamic/deprecated/components/Tile/package.json +1 -1
  88. package/dist/dynamic/deprecated/components/Wizard/package.json +1 -1
  89. package/dist/dynamic/deprecated/components/package.json +1 -1
  90. package/dist/dynamic/helpers/FocusTrap/FocusTrap/package.json +1 -1
  91. package/dist/dynamic/helpers/GenerateId/GenerateId/package.json +1 -1
  92. package/dist/dynamic/helpers/KeyboardHandler/package.json +1 -1
  93. package/dist/dynamic/helpers/OUIA/ouia/package.json +1 -1
  94. package/dist/dynamic/helpers/Popper/Popper/package.json +1 -1
  95. package/dist/dynamic/helpers/constants/package.json +1 -1
  96. package/dist/dynamic/helpers/datetimeUtils/package.json +1 -1
  97. package/dist/dynamic/helpers/fileUtils/package.json +1 -1
  98. package/dist/dynamic/helpers/htmlConstants/package.json +1 -1
  99. package/dist/dynamic/helpers/package.json +1 -1
  100. package/dist/dynamic/helpers/resizeObserver/package.json +1 -1
  101. package/dist/dynamic/helpers/typeUtils/package.json +1 -1
  102. package/dist/dynamic/helpers/useInterval/package.json +1 -1
  103. package/dist/dynamic/helpers/useIsomorphicLayout/package.json +1 -1
  104. package/dist/dynamic/helpers/useUnmountEffect/package.json +1 -1
  105. package/dist/dynamic/helpers/util/package.json +1 -1
  106. package/dist/dynamic/layouts/Bullseye/package.json +1 -1
  107. package/dist/dynamic/layouts/Flex/package.json +1 -1
  108. package/dist/dynamic/layouts/Gallery/package.json +1 -1
  109. package/dist/dynamic/layouts/Grid/package.json +1 -1
  110. package/dist/dynamic/layouts/Level/package.json +1 -1
  111. package/dist/dynamic/layouts/Split/package.json +1 -1
  112. package/dist/dynamic/layouts/Stack/package.json +1 -1
  113. package/dist/dynamic/styles/package.json +1 -1
  114. package/dist/esm/components/Dropdown/Dropdown.d.ts +4 -0
  115. package/dist/esm/components/Dropdown/Dropdown.d.ts.map +1 -1
  116. package/dist/esm/components/Dropdown/Dropdown.js +15 -5
  117. package/dist/esm/components/Dropdown/Dropdown.js.map +1 -1
  118. package/dist/esm/components/Menu/MenuContainer.d.ts +4 -0
  119. package/dist/esm/components/Menu/MenuContainer.d.ts.map +1 -1
  120. package/dist/esm/components/Menu/MenuContainer.js +4 -4
  121. package/dist/esm/components/Menu/MenuContainer.js.map +1 -1
  122. package/dist/esm/components/Pagination/PaginationOptionsMenu.d.ts +4 -0
  123. package/dist/esm/components/Pagination/PaginationOptionsMenu.d.ts.map +1 -1
  124. package/dist/esm/components/Pagination/PaginationOptionsMenu.js +4 -4
  125. package/dist/esm/components/Pagination/PaginationOptionsMenu.js.map +1 -1
  126. package/dist/esm/components/Select/Select.d.ts +4 -0
  127. package/dist/esm/components/Select/Select.d.ts.map +1 -1
  128. package/dist/esm/components/Select/Select.js +13 -4
  129. package/dist/esm/components/Select/Select.js.map +1 -1
  130. package/dist/esm/components/Tabs/OverflowTab.d.ts +4 -0
  131. package/dist/esm/components/Tabs/OverflowTab.d.ts.map +1 -1
  132. package/dist/esm/components/Tabs/OverflowTab.js +3 -3
  133. package/dist/esm/components/Tabs/OverflowTab.js.map +1 -1
  134. package/dist/js/components/Dropdown/Dropdown.d.ts +4 -0
  135. package/dist/js/components/Dropdown/Dropdown.d.ts.map +1 -1
  136. package/dist/js/components/Dropdown/Dropdown.js +15 -5
  137. package/dist/js/components/Dropdown/Dropdown.js.map +1 -1
  138. package/dist/js/components/Menu/MenuContainer.d.ts +4 -0
  139. package/dist/js/components/Menu/MenuContainer.d.ts.map +1 -1
  140. package/dist/js/components/Menu/MenuContainer.js +4 -4
  141. package/dist/js/components/Menu/MenuContainer.js.map +1 -1
  142. package/dist/js/components/Pagination/PaginationOptionsMenu.d.ts +4 -0
  143. package/dist/js/components/Pagination/PaginationOptionsMenu.d.ts.map +1 -1
  144. package/dist/js/components/Pagination/PaginationOptionsMenu.js +4 -4
  145. package/dist/js/components/Pagination/PaginationOptionsMenu.js.map +1 -1
  146. package/dist/js/components/Select/Select.d.ts +4 -0
  147. package/dist/js/components/Select/Select.d.ts.map +1 -1
  148. package/dist/js/components/Select/Select.js +13 -4
  149. package/dist/js/components/Select/Select.js.map +1 -1
  150. package/dist/js/components/Tabs/OverflowTab.d.ts +4 -0
  151. package/dist/js/components/Tabs/OverflowTab.d.ts.map +1 -1
  152. package/dist/js/components/Tabs/OverflowTab.js +3 -3
  153. package/dist/js/components/Tabs/OverflowTab.js.map +1 -1
  154. package/dist/umd/assets/{output-CWhO_0Db.css → output-DoqXbFTn.css} +16494 -16494
  155. package/dist/umd/react-core.min.js +1 -1
  156. package/helpers/package.json +1 -1
  157. package/layouts/package.json +1 -1
  158. package/next/package.json +1 -1
  159. package/package.json +2 -2
  160. package/src/components/Dropdown/Dropdown.tsx +20 -5
  161. package/src/components/Menu/MenuContainer.tsx +10 -4
  162. package/src/components/Pagination/PaginationOptionsMenu.tsx +10 -4
  163. package/src/components/Select/Select.tsx +19 -4
  164. package/src/components/Tabs/OverflowTab.tsx +8 -2
@@ -1 +1 @@
1
- {"name":"@patternfly/react-core-helpers","main":"../dist/js/helpers/index.js","module":"../dist/esm/helpers/index.js","typings":"../dist/esm/helpers/index.d.ts","version":"6.0.0-prerelease.20","private":true}
1
+ {"name":"@patternfly/react-core-helpers","main":"../dist/js/helpers/index.js","module":"../dist/esm/helpers/index.js","typings":"../dist/esm/helpers/index.d.ts","version":"6.0.0-prerelease.22","private":true}
@@ -1 +1 @@
1
- {"name":"@patternfly/react-core-layouts","main":"../dist/js/layouts/index.js","module":"../dist/esm/layouts/index.js","typings":"../dist/esm/layouts/index.d.ts","version":"6.0.0-prerelease.20","private":true}
1
+ {"name":"@patternfly/react-core-layouts","main":"../dist/js/layouts/index.js","module":"../dist/esm/layouts/index.js","typings":"../dist/esm/layouts/index.d.ts","version":"6.0.0-prerelease.22","private":true}
package/next/package.json CHANGED
@@ -1 +1 @@
1
- {"name":"@patternfly/react-core-next","main":"../dist/js/next/index.js","module":"../dist/esm/next/index.js","typings":"../dist/esm/next/index.d.ts","version":"6.0.0-prerelease.20","private":true}
1
+ {"name":"@patternfly/react-core-next","main":"../dist/js/next/index.js","module":"../dist/esm/next/index.js","typings":"../dist/esm/next/index.d.ts","version":"6.0.0-prerelease.22","private":true}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@patternfly/react-core",
3
- "version": "6.0.0-prerelease.21",
3
+ "version": "6.0.0-prerelease.23",
4
4
  "description": "This library provides a set of common React components for use with the PatternFly reference implementation.",
5
5
  "main": "dist/js/index.js",
6
6
  "module": "dist/esm/index.js",
@@ -63,5 +63,5 @@
63
63
  "react": "^17 || ^18",
64
64
  "react-dom": "^17 || ^18"
65
65
  },
66
- "gitHead": "d36646de28fe6e9e231103b909e37051bd58ec5b"
66
+ "gitHead": "02e05796b8fa29e9f5a3f769bd1d47723ea7d926"
67
67
  }
@@ -71,6 +71,10 @@ export interface DropdownProps extends MenuProps, OUIAProps {
71
71
  maxMenuHeight?: string;
72
72
  /** @beta Flag indicating the first menu item should be focused after opening the dropdown. */
73
73
  shouldFocusFirstItemOnOpen?: boolean;
74
+ /** Flag indicating if scroll on focus of the first menu item should occur. */
75
+ shouldPreventScrollOnItemFocus?: boolean;
76
+ /** Time in ms to wait before firing the toggles' focus event. Defaults to 0 */
77
+ focusTimeoutDelay?: number;
74
78
  }
75
79
 
76
80
  const DropdownBase: React.FunctionComponent<DropdownProps> = ({
@@ -91,7 +95,9 @@ const DropdownBase: React.FunctionComponent<DropdownProps> = ({
91
95
  onOpenChangeKeys = ['Escape', 'Tab'],
92
96
  menuHeight,
93
97
  maxMenuHeight,
94
- shouldFocusFirstItemOnOpen = true,
98
+ shouldFocusFirstItemOnOpen = false,
99
+ shouldPreventScrollOnItemFocus = true,
100
+ focusTimeoutDelay = 0,
95
101
  ...props
96
102
  }: DropdownProps) => {
97
103
  const localMenuRef = React.useRef<HTMLDivElement>();
@@ -112,8 +118,8 @@ const DropdownBase: React.FunctionComponent<DropdownProps> = ({
112
118
  const firstElement = menuRef?.current?.querySelector(
113
119
  'li button:not(:disabled),li input:not(:disabled),li a:not([aria-disabled="true"])'
114
120
  );
115
- firstElement && (firstElement as HTMLElement).focus();
116
- }, 10);
121
+ firstElement && (firstElement as HTMLElement).focus({ preventScroll: shouldPreventScrollOnItemFocus });
122
+ }, focusTimeoutDelay);
117
123
  }
118
124
 
119
125
  prevIsOpen.current = isOpen;
@@ -151,7 +157,16 @@ const DropdownBase: React.FunctionComponent<DropdownProps> = ({
151
157
  window.removeEventListener('keydown', handleMenuKeys);
152
158
  window.removeEventListener('click', handleClick);
153
159
  };
154
- }, [isOpen, menuRef, toggleRef, onOpenChange, onOpenChangeKeys]);
160
+ }, [
161
+ isOpen,
162
+ menuRef,
163
+ toggleRef,
164
+ onOpenChange,
165
+ onOpenChangeKeys,
166
+ shouldPreventScrollOnItemFocus,
167
+ shouldFocusFirstItemOnOpen,
168
+ focusTimeoutDelay
169
+ ]);
155
170
 
156
171
  const scrollable = maxMenuHeight !== undefined || menuHeight !== undefined || isScrollable;
157
172
 
@@ -161,7 +176,7 @@ const DropdownBase: React.FunctionComponent<DropdownProps> = ({
161
176
  ref={menuRef}
162
177
  onSelect={(event, value) => {
163
178
  onSelect && onSelect(event, value);
164
- shouldFocusToggleOnSelect && toggleRef.current.focus();
179
+ shouldFocusToggleOnSelect && toggleRef.current?.focus();
165
180
  }}
166
181
  isPlain={isPlain}
167
182
  isScrollable={scrollable}
@@ -39,6 +39,10 @@ export interface MenuContainerProps {
39
39
  popperProps?: MenuPopperProps;
40
40
  /** @beta Flag indicating the first menu item should be focused after opening the dropdown. */
41
41
  shouldFocusFirstItemOnOpen?: boolean;
42
+ /** Flag indicating if scroll on focus of the first menu item should occur. */
43
+ shouldPreventScrollOnItemFocus?: boolean;
44
+ /** Time in ms to wait before firing the toggles' focus event. Defaults to 0 */
45
+ focusTimeoutDelay?: number;
42
46
  }
43
47
 
44
48
  /**
@@ -54,7 +58,9 @@ export const MenuContainer: React.FunctionComponent<MenuContainerProps> = ({
54
58
  zIndex = 9999,
55
59
  popperProps,
56
60
  onOpenChangeKeys = ['Escape', 'Tab'],
57
- shouldFocusFirstItemOnOpen = true
61
+ shouldFocusFirstItemOnOpen = true,
62
+ shouldPreventScrollOnItemFocus = true,
63
+ focusTimeoutDelay = 0
58
64
  }: MenuContainerProps) => {
59
65
  const prevIsOpen = React.useRef<boolean>(isOpen);
60
66
  React.useEffect(() => {
@@ -64,8 +70,8 @@ export const MenuContainer: React.FunctionComponent<MenuContainerProps> = ({
64
70
  const firstElement = menuRef?.current?.querySelector(
65
71
  'li button:not(:disabled),li input:not(:disabled),li a:not([aria-disabled="true"])'
66
72
  );
67
- firstElement && (firstElement as HTMLElement).focus();
68
- }, 10);
73
+ firstElement && (firstElement as HTMLElement).focus({ preventScroll: shouldPreventScrollOnItemFocus });
74
+ }, focusTimeoutDelay);
69
75
  }
70
76
 
71
77
  prevIsOpen.current = isOpen;
@@ -102,7 +108,7 @@ export const MenuContainer: React.FunctionComponent<MenuContainerProps> = ({
102
108
  window.removeEventListener('keydown', handleMenuKeys);
103
109
  window.removeEventListener('click', handleClick);
104
110
  };
105
- }, [isOpen, menuRef, onOpenChange, onOpenChangeKeys, toggleRef]);
111
+ }, [focusTimeoutDelay, isOpen, menuRef, onOpenChange, onOpenChangeKeys, shouldPreventScrollOnItemFocus, toggleRef]);
106
112
 
107
113
  return (
108
114
  <Popper
@@ -57,6 +57,10 @@ export interface PaginationOptionsMenuProps extends React.HTMLProps<HTMLDivEleme
57
57
  containerRef?: React.RefObject<HTMLDivElement>;
58
58
  /** @beta The container to append the pagination options menu to. Overrides the containerRef prop. */
59
59
  appendTo?: HTMLElement | (() => HTMLElement) | 'inline';
60
+ /** Flag indicating if scroll on focus of the first menu item should occur. */
61
+ shouldPreventScrollOnItemFocus?: boolean;
62
+ /** Time in ms to wait before firing the toggles' focus event. Defaults to 0 */
63
+ focusTimeoutDelay?: number;
60
64
  }
61
65
 
62
66
  export const PaginationOptionsMenu: React.FunctionComponent<PaginationOptionsMenuProps> = ({
@@ -81,7 +85,9 @@ export const PaginationOptionsMenu: React.FunctionComponent<PaginationOptionsMen
81
85
  toggleTemplate,
82
86
  onPerPageSelect = () => null as any,
83
87
  containerRef,
84
- appendTo
88
+ appendTo,
89
+ shouldPreventScrollOnItemFocus = true,
90
+ focusTimeoutDelay = 0
85
91
  }: PaginationOptionsMenuProps) => {
86
92
  const [isOpen, setIsOpen] = React.useState(false);
87
93
  const toggleRef = React.useRef<HTMLButtonElement>(null);
@@ -134,8 +140,8 @@ export const PaginationOptionsMenu: React.FunctionComponent<PaginationOptionsMen
134
140
  if (isOpen && toggleRef.current?.contains(event.target as Node)) {
135
141
  setTimeout(() => {
136
142
  const firstElement = menuRef?.current?.querySelector('li button:not(:disabled)');
137
- firstElement && (firstElement as HTMLElement).focus();
138
- }, 0);
143
+ firstElement && (firstElement as HTMLElement).focus({ preventScroll: shouldPreventScrollOnItemFocus });
144
+ }, focusTimeoutDelay);
139
145
  }
140
146
 
141
147
  // If the event is not on the toggle, close the menu
@@ -155,7 +161,7 @@ export const PaginationOptionsMenu: React.FunctionComponent<PaginationOptionsMen
155
161
  window.removeEventListener('keydown', handleMenuKeys);
156
162
  window.removeEventListener('click', handleClick);
157
163
  };
158
- }, [isOpen, menuRef]);
164
+ }, [focusTimeoutDelay, isOpen, menuRef, shouldPreventScrollOnItemFocus]);
159
165
 
160
166
  const renderItems = () =>
161
167
  perPageOptions.map(({ value, title }) => (
@@ -78,6 +78,10 @@ export interface SelectProps extends MenuProps, OUIAProps {
78
78
  maxMenuHeight?: string;
79
79
  /** Indicates if the select menu should be scrollable */
80
80
  isScrollable?: boolean;
81
+ /** Flag indicating if scroll on focus of the first menu item should occur. */
82
+ shouldPreventScrollOnItemFocus?: boolean;
83
+ /** Time in ms to wait before firing the toggles' focus event. Defaults to 0 */
84
+ focusTimeoutDelay?: number;
81
85
  }
82
86
 
83
87
  const SelectBase: React.FunctionComponent<SelectProps & OUIAProps> = ({
@@ -88,7 +92,7 @@ const SelectBase: React.FunctionComponent<SelectProps & OUIAProps> = ({
88
92
  selected,
89
93
  toggle,
90
94
  shouldFocusToggleOnSelect = false,
91
- shouldFocusFirstItemOnOpen = true,
95
+ shouldFocusFirstItemOnOpen = false,
92
96
  onOpenChange,
93
97
  onOpenChangeKeys = ['Escape', 'Tab'],
94
98
  isPlain,
@@ -99,6 +103,8 @@ const SelectBase: React.FunctionComponent<SelectProps & OUIAProps> = ({
99
103
  menuHeight,
100
104
  maxMenuHeight,
101
105
  isScrollable,
106
+ shouldPreventScrollOnItemFocus = true,
107
+ focusTimeoutDelay = 0,
102
108
  ...props
103
109
  }: SelectProps & OUIAProps) => {
104
110
  const localMenuRef = React.useRef<HTMLDivElement>();
@@ -116,8 +122,8 @@ const SelectBase: React.FunctionComponent<SelectProps & OUIAProps> = ({
116
122
  if (prevIsOpen.current === false && isOpen === true && shouldFocusFirstItemOnOpen) {
117
123
  setTimeout(() => {
118
124
  const firstElement = menuRef?.current?.querySelector('li button:not(:disabled),li input:not(:disabled)');
119
- firstElement && (firstElement as HTMLElement).focus();
120
- }, 10);
125
+ firstElement && (firstElement as HTMLElement).focus({ preventScroll: shouldPreventScrollOnItemFocus });
126
+ }, focusTimeoutDelay);
121
127
  }
122
128
 
123
129
  prevIsOpen.current = isOpen;
@@ -156,7 +162,16 @@ const SelectBase: React.FunctionComponent<SelectProps & OUIAProps> = ({
156
162
  window.removeEventListener('keydown', handleMenuKeys);
157
163
  window.removeEventListener('click', handleClick);
158
164
  };
159
- }, [isOpen, menuRef, toggleRef, onOpenChange, onOpenChangeKeys]);
165
+ }, [
166
+ isOpen,
167
+ menuRef,
168
+ toggleRef,
169
+ onOpenChange,
170
+ onOpenChangeKeys,
171
+ shouldPreventScrollOnItemFocus,
172
+ shouldFocusFirstItemOnOpen,
173
+ focusTimeoutDelay
174
+ ]);
160
175
 
161
176
  const menu = (
162
177
  <Menu
@@ -21,6 +21,10 @@ export interface OverflowTabProps extends React.HTMLProps<HTMLLIElement> {
21
21
  toggleAriaLabel?: string;
22
22
  /** z-index of the overflow tab */
23
23
  zIndex?: number;
24
+ /** Flag indicating if scroll on focus of the first menu item should occur. */
25
+ shouldPreventScrollOnItemFocus?: boolean;
26
+ /** Time in ms to wait before firing the toggles' focus event. Defaults to 0 */
27
+ focusTimeoutDelay?: number;
24
28
  }
25
29
 
26
30
  export const OverflowTab: React.FunctionComponent<OverflowTabProps> = ({
@@ -30,6 +34,8 @@ export const OverflowTab: React.FunctionComponent<OverflowTabProps> = ({
30
34
  defaultTitleText = 'More',
31
35
  toggleAriaLabel,
32
36
  zIndex = 9999,
37
+ shouldPreventScrollOnItemFocus = true,
38
+ focusTimeoutDelay = 0,
33
39
  ...props
34
40
  }: OverflowTabProps) => {
35
41
  const menuRef = React.useRef<HTMLDivElement>();
@@ -78,9 +84,9 @@ export const OverflowTab: React.FunctionComponent<OverflowTabProps> = ({
78
84
  setTimeout(() => {
79
85
  if (menuRef?.current) {
80
86
  const firstElement = menuRef.current.querySelector('li > button,input:not(:disabled)');
81
- firstElement && (firstElement as HTMLElement).focus();
87
+ firstElement && (firstElement as HTMLElement).focus({ preventScroll: shouldPreventScrollOnItemFocus });
82
88
  }
83
- }, 0);
89
+ }, focusTimeoutDelay);
84
90
  };
85
91
 
86
92
  const overflowTab = (