@elastic/eui 114.3.0 → 115.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 (124) hide show
  1. package/es/components/basic_table/basic_table.js +3 -6
  2. package/es/components/basic_table/collapsed_item_actions.js +1 -3
  3. package/es/components/basic_table/default_item_action.js +0 -1
  4. package/es/components/basic_table/in_memory_table.js +3 -6
  5. package/es/components/color_picker/color_picker_swatch.js +1 -2
  6. package/es/components/datagrid/controls/display_selector.js +1 -2
  7. package/es/components/datagrid/controls/fullscreen_selector.js +1 -2
  8. package/es/components/datagrid/controls/keyboard_shortcuts.js +1 -2
  9. package/es/components/filter_group/filter_select_item.js +36 -17
  10. package/es/components/key_pad_menu/key_pad_menu_item.js +1 -2
  11. package/es/components/list_group/list_group_item.js +1 -2
  12. package/es/components/markdown_editor/markdown_editor.js +1 -1
  13. package/es/components/markdown_editor/markdown_editor_drop_zone.js +6 -3
  14. package/es/components/markdown_editor/markdown_editor_footer.js +1 -1
  15. package/es/components/markdown_editor/markdown_editor_toolbar.js +14 -10
  16. package/es/components/portal/portal.js +72 -117
  17. package/es/components/search_bar/filters/field_value_toggle_group_filter.js +42 -91
  18. package/es/components/selectable/selectable_list/selectable_list_item.js +1 -1
  19. package/es/components/table/table_header_cell.js +1 -2
  20. package/es/components/tool_tip/icon_tip.js +4 -8
  21. package/es/components/tool_tip/tool_tip.js +233 -261
  22. package/es/components/tool_tip/tool_tip.styles.js +10 -18
  23. package/es/components/tool_tip/tool_tip_anchor.js +3 -3
  24. package/es/components/tool_tip/tool_tip_manager.js +1 -0
  25. package/es/components/tool_tip/tool_tip_popover.js +7 -7
  26. package/es/test/rtl/component_helpers.d.ts +0 -3
  27. package/es/test/rtl/component_helpers.js +40 -62
  28. package/eui.d.ts +25 -96
  29. package/lib/components/basic_table/basic_table.js +3 -6
  30. package/lib/components/basic_table/collapsed_item_actions.js +1 -3
  31. package/lib/components/basic_table/default_item_action.js +0 -1
  32. package/lib/components/basic_table/in_memory_table.js +3 -6
  33. package/lib/components/color_picker/color_picker_swatch.js +1 -2
  34. package/lib/components/datagrid/controls/display_selector.js +1 -2
  35. package/lib/components/datagrid/controls/fullscreen_selector.js +1 -2
  36. package/lib/components/datagrid/controls/keyboard_shortcuts.js +1 -2
  37. package/lib/components/filter_group/filter_select_item.js +35 -16
  38. package/lib/components/key_pad_menu/key_pad_menu_item.js +1 -2
  39. package/lib/components/list_group/list_group_item.js +1 -2
  40. package/lib/components/markdown_editor/markdown_editor.js +1 -1
  41. package/lib/components/markdown_editor/markdown_editor_drop_zone.js +6 -3
  42. package/lib/components/markdown_editor/markdown_editor_footer.js +1 -1
  43. package/lib/components/markdown_editor/markdown_editor_toolbar.js +12 -10
  44. package/lib/components/portal/portal.js +73 -118
  45. package/lib/components/search_bar/filters/field_value_toggle_group_filter.js +44 -93
  46. package/lib/components/selectable/selectable_list/selectable_list_item.js +1 -1
  47. package/lib/components/table/table_header_cell.js +1 -2
  48. package/lib/components/tool_tip/icon_tip.js +4 -8
  49. package/lib/components/tool_tip/tool_tip.js +240 -266
  50. package/lib/components/tool_tip/tool_tip.styles.js +8 -16
  51. package/lib/components/tool_tip/tool_tip_anchor.js +2 -2
  52. package/lib/components/tool_tip/tool_tip_manager.js +1 -0
  53. package/lib/components/tool_tip/tool_tip_popover.js +6 -6
  54. package/lib/test/rtl/component_helpers.d.ts +0 -3
  55. package/lib/test/rtl/component_helpers.js +41 -63
  56. package/optimize/es/components/basic_table/collapsed_item_actions.js +1 -3
  57. package/optimize/es/components/basic_table/default_item_action.js +0 -1
  58. package/optimize/es/components/datagrid/controls/display_selector.js +1 -2
  59. package/optimize/es/components/datagrid/controls/fullscreen_selector.js +1 -2
  60. package/optimize/es/components/datagrid/controls/keyboard_shortcuts.js +1 -2
  61. package/optimize/es/components/filter_group/filter_select_item.js +36 -17
  62. package/optimize/es/components/key_pad_menu/key_pad_menu_item.js +1 -2
  63. package/optimize/es/components/list_group/list_group_item.js +1 -2
  64. package/optimize/es/components/markdown_editor/markdown_editor_drop_zone.js +5 -2
  65. package/optimize/es/components/markdown_editor/markdown_editor_toolbar.js +13 -9
  66. package/optimize/es/components/portal/portal.js +65 -91
  67. package/optimize/es/components/search_bar/filters/field_value_toggle_group_filter.js +43 -66
  68. package/optimize/es/components/selectable/selectable_list/selectable_list_item.js +1 -1
  69. package/optimize/es/components/tool_tip/icon_tip.js +3 -5
  70. package/optimize/es/components/tool_tip/tool_tip.js +227 -250
  71. package/optimize/es/components/tool_tip/tool_tip.styles.js +10 -18
  72. package/optimize/es/components/tool_tip/tool_tip_anchor.js +3 -3
  73. package/optimize/es/components/tool_tip/tool_tip_manager.js +1 -0
  74. package/optimize/es/components/tool_tip/tool_tip_popover.js +7 -7
  75. package/optimize/es/test/rtl/component_helpers.d.ts +0 -3
  76. package/optimize/es/test/rtl/component_helpers.js +40 -62
  77. package/optimize/lib/components/basic_table/collapsed_item_actions.js +1 -3
  78. package/optimize/lib/components/basic_table/default_item_action.js +0 -1
  79. package/optimize/lib/components/datagrid/controls/display_selector.js +1 -2
  80. package/optimize/lib/components/datagrid/controls/fullscreen_selector.js +1 -2
  81. package/optimize/lib/components/datagrid/controls/keyboard_shortcuts.js +1 -2
  82. package/optimize/lib/components/filter_group/filter_select_item.js +35 -16
  83. package/optimize/lib/components/key_pad_menu/key_pad_menu_item.js +1 -2
  84. package/optimize/lib/components/list_group/list_group_item.js +1 -2
  85. package/optimize/lib/components/markdown_editor/markdown_editor_drop_zone.js +5 -2
  86. package/optimize/lib/components/markdown_editor/markdown_editor_toolbar.js +13 -9
  87. package/optimize/lib/components/portal/portal.js +68 -93
  88. package/optimize/lib/components/search_bar/filters/field_value_toggle_group_filter.js +45 -69
  89. package/optimize/lib/components/selectable/selectable_list/selectable_list_item.js +1 -1
  90. package/optimize/lib/components/tool_tip/icon_tip.js +3 -5
  91. package/optimize/lib/components/tool_tip/tool_tip.js +229 -251
  92. package/optimize/lib/components/tool_tip/tool_tip.styles.js +8 -16
  93. package/optimize/lib/components/tool_tip/tool_tip_anchor.js +2 -2
  94. package/optimize/lib/components/tool_tip/tool_tip_manager.js +1 -0
  95. package/optimize/lib/components/tool_tip/tool_tip_popover.js +6 -6
  96. package/optimize/lib/test/rtl/component_helpers.d.ts +0 -3
  97. package/optimize/lib/test/rtl/component_helpers.js +41 -63
  98. package/package.json +2 -10
  99. package/test-env/components/basic_table/basic_table.js +3 -6
  100. package/test-env/components/basic_table/collapsed_item_actions.js +1 -3
  101. package/test-env/components/basic_table/default_item_action.js +0 -1
  102. package/test-env/components/basic_table/in_memory_table.js +3 -6
  103. package/test-env/components/color_picker/color_picker_swatch.js +1 -2
  104. package/test-env/components/datagrid/controls/display_selector.js +1 -2
  105. package/test-env/components/datagrid/controls/fullscreen_selector.js +1 -2
  106. package/test-env/components/datagrid/controls/keyboard_shortcuts.js +1 -2
  107. package/test-env/components/filter_group/filter_select_item.js +35 -16
  108. package/test-env/components/key_pad_menu/key_pad_menu_item.js +1 -2
  109. package/test-env/components/list_group/list_group_item.js +1 -2
  110. package/test-env/components/markdown_editor/markdown_editor.js +1 -1
  111. package/test-env/components/markdown_editor/markdown_editor_drop_zone.js +6 -3
  112. package/test-env/components/markdown_editor/markdown_editor_footer.js +1 -1
  113. package/test-env/components/markdown_editor/markdown_editor_toolbar.js +14 -10
  114. package/test-env/components/portal/portal.js +70 -113
  115. package/test-env/components/search_bar/filters/field_value_toggle_group_filter.js +44 -88
  116. package/test-env/components/selectable/selectable_list/selectable_list_item.js +1 -1
  117. package/test-env/components/table/table_header_cell.js +1 -2
  118. package/test-env/components/tool_tip/icon_tip.js +4 -8
  119. package/test-env/components/tool_tip/tool_tip.js +230 -256
  120. package/test-env/components/tool_tip/tool_tip.styles.js +8 -16
  121. package/test-env/components/tool_tip/tool_tip_anchor.js +2 -2
  122. package/test-env/components/tool_tip/tool_tip_manager.js +1 -0
  123. package/test-env/components/tool_tip/tool_tip_popover.js +6 -6
  124. package/test-env/test/rtl/component_helpers.js +41 -63
@@ -63,81 +63,59 @@ export var waitForEuiPopoverClose = /*#__PURE__*/function () {
63
63
  }();
64
64
 
65
65
  /**
66
- * Ensure the EuiToolTip being tested is open and visible before continuing
66
+ * jsdom does not track keyboard vs. mouse input modality, so `:focus-visible`
67
+ * always returns false. Call this before `fireEvent.focus()` on an element that
68
+ * should be treated as keyboard-focused.
69
+ *
70
+ * Returns a cleanup function, call it after test assertions to restore the spy.
67
71
  */
68
- export var waitForEuiToolTipVisible = /*#__PURE__*/function () {
69
- var _ref3 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee3() {
70
- return _regeneratorRuntime.wrap(function _callee3$(_context3) {
71
- while (1) switch (_context3.prev = _context3.next) {
72
- case 0:
73
- _context3.next = 2;
74
- return waitFor(function () {
75
- var tooltip = document.querySelector('.euiToolTipPopover');
76
- expect(tooltip).toBeVisible();
77
- }, {
78
- timeout: 3000
79
- } // Account for long delay on tooltips
80
- );
81
- case 2:
82
- return _context3.abrupt("return", _context3.sent);
83
- case 3:
84
- case "end":
85
- return _context3.stop();
86
- }
87
- }, _callee3);
88
- }));
89
- return function waitForEuiToolTipVisible() {
90
- return _ref3.apply(this, arguments);
72
+ export var simulateFocusVisible = function simulateFocusVisible(element) {
73
+ var originalMatches = Element.prototype.matches.bind(element);
74
+ var spy = jest.spyOn(element, 'matches').mockImplementation(function (selector) {
75
+ return selector === ':focus-visible' ? true : originalMatches(selector);
76
+ });
77
+ return function () {
78
+ return spy.mockRestore();
91
79
  };
92
- }();
93
- export var waitForEuiToolTipHidden = /*#__PURE__*/function () {
94
- var _ref4 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee4() {
95
- return _regeneratorRuntime.wrap(function _callee4$(_context4) {
96
- while (1) switch (_context4.prev = _context4.next) {
97
- case 0:
98
- _context4.next = 2;
99
- return waitFor(function () {
100
- var tooltip = document.querySelector('.euiToolTipPopover');
101
- expect(tooltip).toBeNull();
102
- });
103
- case 2:
104
- return _context4.abrupt("return", _context4.sent);
105
- case 3:
106
- case "end":
107
- return _context4.stop();
108
- }
109
- }, _callee4);
110
- }));
111
- return function waitForEuiToolTipHidden() {
112
- return _ref4.apply(this, arguments);
113
- };
114
- }();
80
+ };
81
+
82
+ /**
83
+ * Prefer this over `fireEvent.focus()` in tooltip tests. Plain `fireEvent.focus`
84
+ * does not set `:focus-visible` in jsdom and will not trigger the tooltip.
85
+ *
86
+ * Returns a cleanup function to restore the mock after assertions.
87
+ */
88
+ export var focusEuiToolTipTrigger = function focusEuiToolTipTrigger(element) {
89
+ var cleanup = simulateFocusVisible(element);
90
+ fireEvent.focus(element);
91
+ return cleanup;
92
+ };
115
93
 
116
94
  /**
117
95
  * EuiComboBox
118
96
  */
119
97
 
120
98
  export var showEuiComboBoxOptions = /*#__PURE__*/function () {
121
- var _ref5 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee5() {
122
- return _regeneratorRuntime.wrap(function _callee5$(_context5) {
123
- while (1) switch (_context5.prev = _context5.next) {
99
+ var _ref3 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee3() {
100
+ return _regeneratorRuntime.wrap(function _callee3$(_context3) {
101
+ while (1) switch (_context3.prev = _context3.next) {
124
102
  case 0:
125
103
  fireEvent.click(screen.getByTestSubject('comboBoxToggleListButton'));
126
- _context5.next = 3;
104
+ _context3.next = 3;
127
105
  return waitForEuiPopoverOpen();
128
106
  case 3:
129
- _context5.next = 5;
107
+ _context3.next = 5;
130
108
  return waitFor(function () {
131
109
  expect(screen.getByRole('listbox')).toBeInTheDocument();
132
110
  });
133
111
  case 5:
134
112
  case "end":
135
- return _context5.stop();
113
+ return _context3.stop();
136
114
  }
137
- }, _callee5);
115
+ }, _callee3);
138
116
  }));
139
117
  return function showEuiComboBoxOptions() {
140
- return _ref5.apply(this, arguments);
118
+ return _ref3.apply(this, arguments);
141
119
  };
142
120
  }();
143
121
 
@@ -146,16 +124,16 @@ export var showEuiComboBoxOptions = /*#__PURE__*/function () {
146
124
  */
147
125
 
148
126
  export var waitForEuiContextMenuPanelTransition = /*#__PURE__*/function () {
149
- var _ref6 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee6() {
127
+ var _ref4 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee4() {
150
128
  var getPanels;
151
- return _regeneratorRuntime.wrap(function _callee6$(_context6) {
152
- while (1) switch (_context6.prev = _context6.next) {
129
+ return _regeneratorRuntime.wrap(function _callee4$(_context4) {
130
+ while (1) switch (_context4.prev = _context4.next) {
153
131
  case 0:
154
132
  // Used document instead of container or screen due to context menus living in portals
155
133
  getPanels = function getPanels() {
156
134
  return document.querySelectorAll('.euiContextMenuPanel');
157
135
  }; // 2 panels will appear for the transition animation
158
- _context6.next = 3;
136
+ _context4.next = 3;
159
137
  return waitFor(function () {
160
138
  expect(getPanels().length).toEqual(2);
161
139
  });
@@ -170,11 +148,11 @@ export var waitForEuiContextMenuPanelTransition = /*#__PURE__*/function () {
170
148
  expect(getPanels().length).toEqual(1);
171
149
  case 6:
172
150
  case "end":
173
- return _context6.stop();
151
+ return _context4.stop();
174
152
  }
175
- }, _callee6);
153
+ }, _callee4);
176
154
  }));
177
155
  return function waitForEuiContextMenuPanelTransition() {
178
- return _ref6.apply(this, arguments);
156
+ return _ref4.apply(this, arguments);
179
157
  };
180
158
  }();
@@ -89,7 +89,6 @@ var CollapsedItemActions = exports.CollapsedItemActions = function CollapsedItem
89
89
  },
90
90
  toolTipContent: toolTipContent,
91
91
  toolTipProps: {
92
- delay: 'long',
93
92
  // Avoid screen-readers announcing the same text twice
94
93
  disableScreenReaderOutput: typeof buttonContent === 'string' && buttonContent === toolTipContent
95
94
  }
@@ -113,8 +112,7 @@ var CollapsedItemActions = exports.CollapsedItemActions = function CollapsedItem
113
112
  "data-test-subj": "euiCollapsedItemActionsButton"
114
113
  });
115
114
  var withTooltip = !actionsDisabled && (0, _react2.jsx)(_tool_tip.EuiToolTip, {
116
- content: allActionsTooltip,
117
- delay: "long"
115
+ content: allActionsTooltip
118
116
  }, popoverButton);
119
117
  return (0, _react2.jsx)(_popover.EuiPopover, {
120
118
  className: className,
@@ -41,7 +41,6 @@ var DefaultItemAction = exports.DefaultItemAction = function DefaultItemAction(_
41
41
  var tooltipContent = (0, _action_types.callWithItemIfFunction)(item)(action.description);
42
42
  var tooltipProps = {
43
43
  content: tooltipContent,
44
- delay: 'long',
45
44
  // Avoid screen-readers announcing the same text twice
46
45
  disableScreenReaderOutput: typeof actionContent === 'string' && actionContent === tooltipContent
47
46
  };
@@ -361,8 +361,7 @@ var useDataGridDisplaySelector = exports.useDataGridDisplaySelector = function u
361
361
  },
362
362
  panelClassName: "euiDataGrid__displayPopoverPanel",
363
363
  button: (0, _react2.jsx)(_tool_tip.EuiToolTip, {
364
- content: buttonLabel,
365
- delay: "long"
364
+ content: buttonLabel
366
365
  }, (0, _react2.jsx)(_button.EuiButtonIcon, {
367
366
  size: "xs",
368
367
  iconType: "controls",
@@ -42,8 +42,7 @@ var useDataGridFullScreenSelector = exports.useDataGridFullScreenSelector = func
42
42
  fullScreenButtonActive = _useEuiI18n2[1];
43
43
  var fullScreenSelector = (0, _react.useMemo)(function () {
44
44
  return (0, _react2.jsx)(_tool_tip.EuiToolTip, {
45
- content: isFullScreen ? (0, _react2.jsx)(_react.default.Fragment, null, fullScreenButtonActive, " (", (0, _react2.jsx)("kbd", null, "esc"), ")") : fullScreenButton,
46
- delay: "long"
45
+ content: isFullScreen ? (0, _react2.jsx)(_react.default.Fragment, null, fullScreenButtonActive, " (", (0, _react2.jsx)("kbd", null, "esc"), ")") : fullScreenButton
47
46
  }, (0, _react2.jsx)(_button.EuiButtonIcon, {
48
47
  size: "xs",
49
48
  iconType: isFullScreen ? 'fullScreenExit' : 'fullScreen',
@@ -45,8 +45,7 @@ var useDataGridKeyboardShortcuts = exports.useDataGridKeyboardShortcuts = functi
45
45
  anchorPosition: "downRight",
46
46
  panelPaddingSize: "none",
47
47
  button: (0, _react2.jsx)(_tool_tip.EuiToolTip, {
48
- content: title,
49
- delay: "long"
48
+ content: title
50
49
  }, (0, _react2.jsx)(_button.EuiButtonIcon, {
51
50
  size: "xs",
52
51
  iconType: "keyboard",
@@ -95,6 +95,18 @@ var EuiFilterSelectItemClass = exports.EuiFilterSelectItemClass = /*#__PURE__*/f
95
95
  }
96
96
  (0, _inherits2.default)(EuiFilterSelectItemClass, _Component);
97
97
  return (0, _createClass2.default)(EuiFilterSelectItemClass, [{
98
+ key: "componentDidMount",
99
+ value: function componentDidMount() {
100
+ var _this$props2 = this.props,
101
+ isFocused = _this$props2.isFocused,
102
+ toolTipContent = _this$props2.toolTipContent,
103
+ disabled = _this$props2.disabled,
104
+ children = _this$props2.children;
105
+ if ( /*#__PURE__*/(0, _react.isValidElement)(children) && !disabled && toolTipContent) {
106
+ this.toggleToolTip(isFocused !== null && isFocused !== void 0 ? isFocused : false);
107
+ }
108
+ }
109
+ }, {
98
110
  key: "componentDidUpdate",
99
111
  value: function componentDidUpdate(prevProps) {
100
112
  if (this.props.isFocused && !prevProps.isFocused) {
@@ -103,31 +115,39 @@ var EuiFilterSelectItemClass = exports.EuiFilterSelectItemClass = /*#__PURE__*/f
103
115
  block: 'nearest'
104
116
  });
105
117
  }
118
+ var _this$props3 = this.props,
119
+ isFocused = _this$props3.isFocused,
120
+ toolTipContent = _this$props3.toolTipContent,
121
+ disabled = _this$props3.disabled,
122
+ children = _this$props3.children;
123
+ if ( /*#__PURE__*/(0, _react.isValidElement)(children) && !disabled && toolTipContent && isFocused !== prevProps.isFocused) {
124
+ this.toggleToolTip(isFocused !== null && isFocused !== void 0 ? isFocused : false);
125
+ }
106
126
  }
107
127
  }, {
108
128
  key: "render",
109
129
  value: function render() {
110
- var _this$props2 = this.props,
111
- theme = _this$props2.theme,
112
- children = _this$props2.children,
113
- className = _this$props2.className,
114
- disabled = _this$props2.disabled,
115
- checked = _this$props2.checked,
116
- isFocused = _this$props2.isFocused,
117
- showIcons = _this$props2.showIcons,
118
- toolTipContent = _this$props2.toolTipContent,
119
- toolTipProps = _this$props2.toolTipProps,
120
- style = _this$props2.style,
121
- truncateContent = _this$props2.truncateContent,
122
- forwardRef = _this$props2.forwardRef,
123
- rest = (0, _objectWithoutProperties2.default)(_this$props2, _excluded);
130
+ var _this$props4 = this.props,
131
+ theme = _this$props4.theme,
132
+ children = _this$props4.children,
133
+ className = _this$props4.className,
134
+ disabled = _this$props4.disabled,
135
+ checked = _this$props4.checked,
136
+ isFocused = _this$props4.isFocused,
137
+ showIcons = _this$props4.showIcons,
138
+ toolTipContent = _this$props4.toolTipContent,
139
+ toolTipProps = _this$props4.toolTipProps,
140
+ style = _this$props4.style,
141
+ truncateContent = _this$props4.truncateContent,
142
+ forwardRef = _this$props4.forwardRef,
143
+ rest = (0, _objectWithoutProperties2.default)(_this$props4, _excluded);
124
144
  var styles = (0, _filter_select_item.euiFilterSelectItemStyles)(theme);
125
145
  var cssStyles = [styles.euiFilterSelectItem, isFocused && styles.isFocused];
126
146
  var classes = (0, _classnames.default)('euiFilterSelectItem', className);
127
147
  var hasToolTip =
128
148
  // we're using isValidElement here as EuiToolTipAnchor uses
129
149
  // cloneElement to enhance the element with required attributes
130
- /*#__PURE__*/_react.default.isValidElement(children) && !disabled && toolTipContent;
150
+ /*#__PURE__*/(0, _react.isValidElement)(children) && !disabled && toolTipContent;
131
151
  var anchorProps = undefined;
132
152
  if (hasToolTip) {
133
153
  var _toolTipProps$anchorP, _toolTipProps$anchorP2;
@@ -137,7 +157,6 @@ var EuiFilterSelectItemClass = exports.EuiFilterSelectItemClass = /*#__PURE__*/f
137
157
  }) : {
138
158
  style: style
139
159
  };
140
- this.toggleToolTip(isFocused !== null && isFocused !== void 0 ? isFocused : false);
141
160
  }
142
161
  var iconNode;
143
162
  if (showIcons) {
@@ -135,7 +135,6 @@ var EuiKeyPadMenuItem = exports.EuiKeyPadMenuItem = function EuiKeyPadMenuItem(_
135
135
  }, label)));
136
136
  return betaBadgeLabel ? (0, _react2.jsx)(_tool_tip.EuiToolTip, (0, _extends2.default)({}, betaBadgeTooltipProps, {
137
137
  title: betaBadgeLabel,
138
- content: betaBadgeTooltipContent,
139
- delay: "long"
138
+ content: betaBadgeTooltipContent
140
139
  }), button) : button;
141
140
  };
@@ -177,8 +177,7 @@ var EuiListGroupItem = exports.EuiListGroupItem = function EuiListGroupItem(_ref
177
177
  style: style
178
178
  }, (0, _react2.jsx)(_tool_tip.EuiToolTip, (0, _extends2.default)({
179
179
  content: toolTipText !== null && toolTipText !== void 0 ? toolTipText : label,
180
- position: "right",
181
- delay: "long"
180
+ position: "right"
182
181
  }, toolTipProps, {
183
182
  anchorClassName: anchorClasses,
184
183
  anchorProps: anchorPropsAndCss
@@ -171,8 +171,11 @@ var EuiMarkdownEditorDropZone = exports.EuiMarkdownEditorDropZone = function Eui
171
171
  getInputProps = _useDropzone.getInputProps,
172
172
  open = _useDropzone.open;
173
173
  var rootProps = _objectSpread({}, getRootProps());
174
- if (readOnly) rootProps.role = undefined; // Unset the default `role="button"` attribute which sets a misleading pointer icon
175
-
174
+ /* Unset the default `role="button"` attribute to prevent invalid nested interactive elements.
175
+ The dropzone has `noClick=true` and `noKeyboard=true` set via `useDropzone`.
176
+ Keyboard drop interactions expect the drop zone element to have `role="button` but we're supporting
177
+ adding files via a standalone footer button instead." */
178
+ rootProps.role = undefined;
176
179
  return (0, _react2.jsx)("div", (0, _extends2.default)({}, rootProps, {
177
180
  css: cssStyles,
178
181
  className: classes
@@ -27,6 +27,11 @@ function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e;
27
27
  * Side Public License, v 1.
28
28
  */
29
29
 
30
+ /**
31
+ * A helper type to ensure the `button` property is defined
32
+ * on an ` EuiMarkdownEditorUiPlugin ` object.
33
+ */
34
+
30
35
  var boldItalicButtons = [{
31
36
  id: 'mdBold',
32
37
  label: 'Bold',
@@ -101,7 +106,7 @@ var EuiMarkdownEditorToolbar = exports.EuiMarkdownEditorToolbar = /*#__PURE__*/(
101
106
  markdownActions = _ref2.markdownActions,
102
107
  viewMode = _ref2.viewMode,
103
108
  onClickPreview = _ref2.onClickPreview,
104
- uiPlugins = _ref2.uiPlugins,
109
+ _uiPlugins = _ref2.uiPlugins,
105
110
  selectedNode = _ref2.selectedNode,
106
111
  right = _ref2.right;
107
112
  var _useContext = (0, _react.useContext)(_markdown_context.EuiMarkdownContext),
@@ -115,6 +120,9 @@ var EuiMarkdownEditorToolbar = exports.EuiMarkdownEditorToolbar = /*#__PURE__*/(
115
120
  var isPreviewing = viewMode === _markdown_modes.MODE_VIEWING;
116
121
  var isEditable = !isPreviewing && !readOnly;
117
122
  var styles = (0, _services.useEuiMemoizedStyles)(_markdown_editor_toolbar.euiMarkdownEditorToolbarStyles);
123
+ var uiPlugins = _uiPlugins.filter(function (uiPlugin) {
124
+ return !!uiPlugin.button;
125
+ });
118
126
  return (0, _react2.jsx)("div", {
119
127
  ref: ref,
120
128
  css: styles.euiMarkdownEditorToolbar,
@@ -126,8 +134,7 @@ var EuiMarkdownEditorToolbar = exports.EuiMarkdownEditorToolbar = /*#__PURE__*/(
126
134
  }, boldItalicButtons.map(function (item) {
127
135
  return (0, _react2.jsx)(_tool_tip.EuiToolTip, {
128
136
  key: item.id,
129
- content: item.label,
130
- delay: "long"
137
+ content: item.label
131
138
  }, (0, _react2.jsx)(EuiMarkdownEditorToolbarButton, {
132
139
  selectedNode: selectedNode,
133
140
  handleMdButtonClick: handleMdButtonClick,
@@ -143,8 +150,7 @@ var EuiMarkdownEditorToolbar = exports.EuiMarkdownEditorToolbar = /*#__PURE__*/(
143
150
  }), listButtons.map(function (item) {
144
151
  return (0, _react2.jsx)(_tool_tip.EuiToolTip, {
145
152
  key: item.id,
146
- content: item.label,
147
- delay: "long"
153
+ content: item.label
148
154
  }, (0, _react2.jsx)(EuiMarkdownEditorToolbarButton, {
149
155
  selectedNode: selectedNode,
150
156
  handleMdButtonClick: handleMdButtonClick,
@@ -160,8 +166,7 @@ var EuiMarkdownEditorToolbar = exports.EuiMarkdownEditorToolbar = /*#__PURE__*/(
160
166
  }), quoteCodeLinkButtons.map(function (item) {
161
167
  return (0, _react2.jsx)(_tool_tip.EuiToolTip, {
162
168
  key: item.id,
163
- content: item.label,
164
- delay: "long"
169
+ content: item.label
165
170
  }, (0, _react2.jsx)(EuiMarkdownEditorToolbarButton, {
166
171
  selectedNode: selectedNode,
167
172
  handleMdButtonClick: handleMdButtonClick,
@@ -179,8 +184,7 @@ var EuiMarkdownEditorToolbar = exports.EuiMarkdownEditorToolbar = /*#__PURE__*/(
179
184
  button = _ref3.button;
180
185
  return (0, _react2.jsx)(_tool_tip.EuiToolTip, {
181
186
  key: name,
182
- content: button.label,
183
- delay: "long"
187
+ content: button.label
184
188
  }, (0, _react2.jsx)(EuiMarkdownEditorToolbarButton, {
185
189
  selectedNode: selectedNode,
186
190
  handleMdButtonClick: handleMdButtonClick,
@@ -1,118 +1,93 @@
1
1
  "use strict";
2
2
 
3
3
  var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
- var _typeof = require("@babel/runtime/helpers/typeof");
5
4
  Object.defineProperty(exports, "__esModule", {
6
5
  value: true
7
6
  });
8
- exports.EuiPortalClass = exports.EuiPortal = void 0;
9
- var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck"));
10
- var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass"));
11
- var _possibleConstructorReturn2 = _interopRequireDefault(require("@babel/runtime/helpers/possibleConstructorReturn"));
12
- var _getPrototypeOf2 = _interopRequireDefault(require("@babel/runtime/helpers/getPrototypeOf"));
13
- var _inherits2 = _interopRequireDefault(require("@babel/runtime/helpers/inherits"));
14
- var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
15
- var _react = _interopRequireWildcard(require("react"));
7
+ exports.EuiPortal = void 0;
8
+ var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
9
+ var _react = require("react");
16
10
  var _reactDom = require("react-dom");
17
11
  var _services = require("../../services");
18
12
  var _component_defaults = require("../provider/component_defaults");
19
- var _react2 = require("@emotion/react");
20
- function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(e) { return e ? t : r; })(e); }
21
- function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != _typeof(e) && "function" != typeof e) return { default: e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && {}.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n.default = e, t && t.set(e, n), n; }
22
- function _callSuper(t, o, e) { return o = (0, _getPrototypeOf2.default)(o), (0, _possibleConstructorReturn2.default)(t, _isNativeReflectConstruct() ? Reflect.construct(o, e || [], (0, _getPrototypeOf2.default)(t).constructor) : o.apply(t, e)); }
23
- function _isNativeReflectConstruct() { try { var t = !Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); } catch (t) {} return (_isNativeReflectConstruct = function _isNativeReflectConstruct() { return !!t; })(); } /*
13
+ /*
24
14
  * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
25
15
  * or more contributor license agreements. Licensed under the Elastic License
26
16
  * 2.0 and the Server Side Public License, v 1; you may not use this file except
27
17
  * in compliance with, at your election, the Elastic License 2.0 or the Server
28
18
  * Side Public License, v 1.
29
- */ /**
30
- * NOTE: We can't test this component because Enzyme doesn't support rendering
31
- * into portals.
32
19
  */
20
+
21
+ var usePortalEffect = typeof document === 'undefined' ? _react.useEffect : _react.useLayoutEffect;
33
22
  var INSERT_POSITIONS = ['after', 'before'];
34
23
  var insertPositions = {
35
24
  after: 'afterend',
36
25
  before: 'beforebegin'
37
26
  };
38
- var EuiPortal = exports.EuiPortal = function EuiPortal(props) {
39
- var propsWithDefaults = (0, _component_defaults.usePropsWithComponentDefaults)('EuiPortal', props);
40
- return (0, _react2.jsx)(EuiPortalClass, propsWithDefaults);
41
- };
42
- var EuiPortalClass = exports.EuiPortalClass = /*#__PURE__*/function (_Component) {
43
- function EuiPortalClass(props) {
44
- var _this;
45
- (0, _classCallCheck2.default)(this, EuiPortalClass);
46
- _this = _callSuper(this, EuiPortalClass, [props]);
47
- _this.state = {
48
- portalNode: null
49
- };
50
- return _this;
51
- }
52
- (0, _inherits2.default)(EuiPortalClass, _Component);
53
- return (0, _createClass2.default)(EuiPortalClass, [{
54
- key: "componentDidMount",
55
- value: function componentDidMount() {
56
- var insert = this.props.insert;
57
- var portalNode = document.createElement('div');
58
- portalNode.dataset.euiportal = 'true';
59
- if (insert == null) {
60
- // no insertion defined, append to body
61
- document.body.appendChild(portalNode);
62
- } else {
63
- // inserting before or after an element
64
- var sibling = insert.sibling,
65
- position = insert.position;
66
- sibling.insertAdjacentElement(insertPositions[position], portalNode);
67
- }
68
- this.setThemeColor(portalNode);
69
- this.updatePortalRef(portalNode);
27
+ var EuiPortal = exports.EuiPortal = /*#__PURE__*/(0, _react.memo)(function (_props) {
28
+ var props = (0, _component_defaults.usePropsWithComponentDefaults)('EuiPortal', _props);
29
+ var children = props.children,
30
+ insert = props.insert,
31
+ setPortalRef = props.portalRef;
32
+ var portalRef = (0, _react.useRef)(setPortalRef);
33
+ var _useContext = (0, _react.useContext)(_services.EuiNestedThemeContext),
34
+ hasDifferentColorFromGlobalTheme = _useContext.hasDifferentColorFromGlobalTheme,
35
+ colorClassName = _useContext.colorClassName;
36
+ var _useState = (0, _react.useState)(null),
37
+ _useState2 = (0, _slicedToArray2.default)(_useState, 2),
38
+ portalNode = _useState2[0],
39
+ setPortalNode = _useState2[1];
70
40
 
71
- // Update state with portalNode to intentionally trigger component rerender
72
- // and call createPortal with correct root element in render()
73
- this.setState({
74
- portalNode: portalNode
75
- });
76
- }
77
- }, {
78
- key: "componentWillUnmount",
79
- value: function componentWillUnmount() {
80
- var portalNode = this.state.portalNode;
81
- if (portalNode !== null && portalNode !== void 0 && portalNode.parentNode) {
82
- portalNode.parentNode.removeChild(portalNode);
83
- }
84
- this.updatePortalRef(null);
41
+ // Set the inherited color of the portal based on the wrapping EuiThemeProvider
42
+ var setThemeColor = function setThemeColor(portalNode) {
43
+ if (hasDifferentColorFromGlobalTheme && insert == null) {
44
+ portalNode.classList.add(colorClassName);
85
45
  }
46
+ };
47
+ var updatePortalRef = function updatePortalRef(ref) {
48
+ var _portalRef$current;
49
+ (_portalRef$current = portalRef.current) === null || _portalRef$current === void 0 || _portalRef$current.call(portalRef, ref);
50
+ };
51
+ (0, _react.useEffect)(function () {
52
+ portalRef.current = setPortalRef;
53
+ }, [setPortalRef]);
86
54
 
87
- // Set the inherited color of the portal based on the wrapping EuiThemeProvider
88
- }, {
89
- key: "setThemeColor",
90
- value: function setThemeColor(portalNode) {
91
- if (this.context) {
92
- var _this$context = this.context,
93
- hasDifferentColorFromGlobalTheme = _this$context.hasDifferentColorFromGlobalTheme,
94
- colorClassName = _this$context.colorClassName;
95
- if (hasDifferentColorFromGlobalTheme && this.props.insert == null) {
96
- portalNode.classList.add(colorClassName);
97
- }
98
- }
55
+ /* Uses `useLayoutEffect` on client-side instead of `useEffect` to ensure the portal
56
+ node is created and inserted into the DOM synchronously. This matches the same timing
57
+ as the previous class component `componentDidMount` behavior.
58
+ Using `useEffect` would add an additional render cycle that would break expected
59
+ behavior of e.g. `@hello-pangea/dnd` which handles keyboard focus and doesn't expect
60
+ a rerender. This falls back to `useEffect` for SSR to avoid console errors. `useEffect` will
61
+ be a no-op, same as `componentDidMount` */
62
+ usePortalEffect(function () {
63
+ var node = document.createElement('div');
64
+ node.dataset.euiportal = 'true';
65
+ if (insert == null) {
66
+ // no insertion defined, append to body
67
+ document.body.appendChild(node);
68
+ } else {
69
+ // inserting before or after an element
70
+ var sibling = insert.sibling,
71
+ position = insert.position;
72
+ sibling.insertAdjacentElement(insertPositions[position], node);
99
73
  }
100
- }, {
101
- key: "updatePortalRef",
102
- value: function updatePortalRef(ref) {
103
- if (this.props.portalRef) {
104
- this.props.portalRef(ref);
105
- }
106
- }
107
- }, {
108
- key: "render",
109
- value: function render() {
110
- var portalNode = this.state.portalNode;
111
- if (!portalNode) {
112
- return null;
74
+ setThemeColor(node);
75
+ updatePortalRef(node);
76
+
77
+ // Update state with portalNode to intentionally trigger component rerender
78
+ // and call createPortal with the correct root element
79
+ setPortalNode(node);
80
+ return function () {
81
+ if (node !== null && node !== void 0 && node.parentNode) {
82
+ node.parentNode.removeChild(node);
113
83
  }
114
- return /*#__PURE__*/(0, _reactDom.createPortal)(this.props.children, portalNode);
115
- }
116
- }]);
117
- }(_react.Component);
118
- (0, _defineProperty2.default)(EuiPortalClass, "contextType", _services.EuiNestedThemeContext);
84
+ updatePortalRef(null);
85
+ };
86
+ // eslint-disable-next-line react-hooks/exhaustive-deps -- on mount only
87
+ }, []);
88
+ if (!portalNode) {
89
+ return null;
90
+ }
91
+ return /*#__PURE__*/(0, _reactDom.createPortal)(children, portalNode);
92
+ });
93
+ EuiPortal.displayName = 'EuiPortal';