[EuiToolTip] Remove delay and update animation#9626
Conversation
|
This PR contains breaking changes. The opener of this pull request is asked to perform the following due diligence steps below, to assist EUI in our next Kibana upgrade:
|
Delay removal - Kibana impactTracks all Kibana usages affected by the removal of Migration: simply remove the Direct
|
| File | Notes |
|---|---|
src/core/packages/chrome/app-menu/core-chrome-app-menu-components/src/components/app_menu_item.tsx |
delay="long" |
src/core/packages/chrome/app-menu/core-chrome-app-menu-components/src/components/app_menu_action_button.tsx |
delay="long" |
src/core/packages/chrome/app-menu/core-chrome-app-menu-components/src/components/app_menu_popover.tsx |
delay="long" |
src/platform/packages/private/kbn-esql-editor/src/editor_footer/keyboard_shortcuts.tsx |
delay="long" |
src/platform/packages/private/kbn-esql-editor/src/editor_footer/tooltip_wrapper.tsx |
wrapper forwards delay — see wrapper section |
src/platform/packages/private/kbn-random-sampling/src/ui/slider_control/index.tsx |
delay="regular" |
src/platform/packages/shared/kbn-coloring/src/shared_components/coloring/color_ranges/color_ranges_item_buttons.tsx |
delay="regular" (×2) |
src/platform/packages/shared/kbn-coloring/src/shared_components/coloring/color_ranges/color_ranges_extra_actions.tsx |
delay="regular" (×3) |
src/platform/packages/shared/kbn-coloring/src/shared_components/coloring/tooltip_wrapper.tsx |
wrapper forwards delay — see wrapper section |
src/platform/packages/shared/kbn-cps-utils/components/project_picker.tsx |
delay="long" |
src/platform/packages/shared/kbn-data-grid-in-table-search/src/in_table_search_control.tsx |
delay="long" |
src/platform/packages/shared/kbn-unified-data-table/src/components/custom_control_columns/additional_row_control/row_control_column.tsx |
delay="long" |
src/platform/packages/shared/kbn-unified-data-table/src/components/custom_control_columns/additional_row_control/row_menu_control_column.tsx |
delay="long" |
src/platform/packages/shared/kbn-unified-data-table/src/components/data_table_expand_button.tsx |
delay="long" |
src/platform/packages/shared/kbn-unified-doc-viewer/src/components/field_name/field_name.tsx |
delay="long" (×2) |
src/platform/packages/shared/kbn-unified-field-list/src/components/field_stats/field_top_values_bucket.tsx |
delay="long" (×2) |
src/platform/packages/shared/kbn-user-profile-components/src/user_avatar_tip.tsx |
passes delay="regular" to UserToolTip wrapper |
src/platform/packages/shared/kbn-visualization-ui-components/components/color_picker.tsx |
delay="long" (×2) |
src/platform/packages/shared/kbn-visualization-utils/src/tooltip_wrapper.tsx |
wrapper forwards delay — see wrapper section |
src/platform/packages/shared/shared-ux/toolbar_selector/src/toolbar_selector.tsx |
delay="long" |
src/platform/plugins/private/links/public/components/tooltip_wrapper.tsx |
wrapper forwards delay — see wrapper section |
src/platform/plugins/private/presentation_panel/public/panel_component/panel_header/use_presentation_panel_header_actions.tsx |
delay="regular" |
src/platform/plugins/private/presentation_panel/public/panel_component/panel_header/presentation_panel_hover_actions.tsx |
delay="regular" (×2) |
src/platform/plugins/private/presentation_panel/public/panel_component/panel_header/presentation_panel_title.tsx |
delay="regular" |
src/platform/plugins/private/vis_default_editor/public/components/options/switch.tsx |
delay="long" |
src/platform/plugins/private/vis_default_editor/public/components/controls/switch.tsx |
delay="long" |
src/platform/plugins/private/vis_default_editor/public/components/options/legend_size_settings.tsx |
delay="regular" |
src/platform/plugins/private/vis_types/gauge/public/editor/components/gauge/style_panel.tsx |
delay="long" |
src/platform/plugins/private/vis_types/heatmap/public/editor/components/heatmap.tsx |
delay="long" |
src/platform/plugins/private/vis_types/xy/public/editor/components/options/metrics_axes/label_options.tsx |
delay="long" (×2) |
src/platform/plugins/shared/controls/public/controls/data_controls/range_slider/components/range_slider_control.tsx |
delay="long" |
src/platform/plugins/shared/controls/public/controls/data_controls/options_list_control/components/options_list_control.tsx |
delay="long" |
src/platform/plugins/shared/dashboard_markdown/public/components/markdown_editor.tsx |
tooltipProps={{ delay: 'regular', ... }} — passed via tooltipProps |
src/platform/plugins/shared/discover/public/application/main/components/layout/save_discover_table_button.tsx |
delay="long" |
src/platform/plugins/shared/discover/public/components/discover_grid_flyout/discover_grid_flyout_actions.tsx |
delay="long" |
src/platform/plugins/shared/saved_objects_management/public/services/columns/share_saved_objects_to_space_column.tsx |
delay="long" on EuiIconTip (×2) |
src/platform/plugins/shared/unified_doc_viewer/public/components/doc_viewer_table/get_pin_control.tsx |
delay="long" |
src/platform/plugins/shared/unified_search/public/filters_builder/filter_item/tooltip.tsx |
wrapper forwards delay — see wrapper section |
src/platform/plugins/shared/unified_search/public/query_string_input/add_filter_popover.tsx |
delay="long" |
src/platform/plugins/shared/unified_search/public/query_string_input/query_bar_menu.tsx |
delay="regular" |
src/platform/plugins/shared/workflows_management/public/widgets/workflow_yaml_editor/ui/keyboard_shortcuts_popover.tsx |
delay="long" |
x-pack/platform/packages/private/kbn-random-sampling/src/ui/slider_control/index.tsx |
delay="regular" |
x-pack/platform/plugins/private/remote_clusters/public/application/sections/remote_cluster_list/remote_cluster_table/remote_cluster_table.tsx |
delay="long" (×2) |
x-pack/platform/plugins/private/watcher/public/application/sections/watch_list_page/watch_list_page.tsx |
delay="long" (×2) |
x-pack/platform/plugins/shared/agent_builder/public/application/components/agents/list/agents_list.tsx |
delay="long" |
x-pack/platform/plugins/shared/cases/public/components/all_cases/extended_fields_column_cell.tsx |
delay="regular" |
x-pack/platform/plugins/shared/fleet/public/components/cloud_connector/components/integration_count_badge.tsx |
delay="long" |
x-pack/platform/plugins/shared/index_management/public/application/components/mappings_editor/components/document_fields/field_parameters/relations_parameter.tsx |
delay="long" |
x-pack/platform/plugins/shared/lens/public/datasources/form_based/operations/definitions/formula/editor/formula_editor.tsx |
delay="long" |
x-pack/platform/plugins/shared/lens/public/datasources/form_based/operations/definitions/ranges/range_editor.tsx |
delay="long" (×2) |
x-pack/platform/plugins/shared/lens/public/visualizations/gauge/dimension_editor.tsx |
delay="regular" |
x-pack/platform/plugins/shared/lens/public/visualizations/xy/xy_config_panel/shared/marker_decoration_settings.tsx |
delay="regular" |
x-pack/platform/plugins/shared/maps/public/connected_components/right_side_controls/layer_control/layer_control.tsx |
delay="long" (×4) |
x-pack/platform/plugins/shared/spaces/public/legacy_urls/components/legacy_url_conflict_internal.tsx |
delay="long" |
x-pack/solutions/observability/plugins/apm/public/components/app/settings/agent_explorer/agent_list/index.tsx |
delay="long" |
x-pack/solutions/observability/plugins/apm/public/components/app/transaction_details/waterfall_with_summary/waterfall_container/waterfall/accordion_waterfall.tsx |
delay="long" |
x-pack/solutions/observability/plugins/apm/public/components/shared/trace_waterfall/toggle_accordion_button.tsx |
delay="long" |
x-pack/solutions/observability/plugins/apm/public/components/shared/truncate_with_tooltip/index.tsx |
delay="long" |
x-pack/solutions/observability/plugins/infra/public/components/asset_details/components/expandable_content.tsx |
delay="long" |
x-pack/solutions/observability/plugins/infra/public/components/lens/lens_chart.tsx |
delay="regular" |
x-pack/solutions/observability/plugins/infra/public/components/logging/log_analysis_setup/create_job_button.tsx |
passes delay="regular" to MissingSetupPrivilegesToolTip wrapper |
x-pack/solutions/observability/plugins/infra/public/pages/logs/log_entry_categories/sections/top_categories/analyze_dataset_in_ml_action.tsx |
delay="long" |
x-pack/solutions/observability/plugins/infra/public/pages/metrics/hosts/components/chart/metric_chart_wrapper.tsx |
delay="regular" |
x-pack/solutions/observability/plugins/infra/public/pages/metrics/hosts/components/search_bar/limit_options.tsx |
delay="regular" |
x-pack/solutions/observability/plugins/infra/public/pages/metrics/hosts/components/table/entry_title.tsx |
delay="long" |
x-pack/solutions/observability/plugins/infra/public/pages/metrics/inventory_view/components/waffle/node.tsx |
delay="regular" |
x-pack/solutions/observability/plugins/infra/public/pages/metrics/inventory_view/components/waffle/waffle_time_controls.tsx |
delay="long" |
x-pack/solutions/security/plugins/security_solution/public/flyout/document_details/right/components/table_field_name_cell.tsx |
delay="long" |
x-pack/solutions/observability/plugins/uptime/public/legacy_uptime/components/monitor/synthetics/waterfall/components/middle_truncated_text.tsx |
delay="long" |
examples/user_profile_examples/public/tooltip_demo.tsx |
delay="regular" |
Wrapper components that accept and forward delay
These components extend EuiToolTipProps (or a subset) and pass all props through to EuiToolTip. The wrapper itself needs no change but all call sites passing delay to it do.
| Wrapper | Call sites with delay |
|---|---|
src/platform/plugins/shared/unified_search/public/filters_builder/filter_item/tooltip.tsx |
used inline with delay="long" in the same file |
src/platform/plugins/private/links/public/components/tooltip_wrapper.tsx |
delay="regular" at call sites |
src/platform/packages/shared/kbn-coloring/src/shared_components/coloring/tooltip_wrapper.tsx |
delay="long" at call sites |
src/platform/packages/shared/kbn-visualization-utils/src/tooltip_wrapper.tsx |
delay="long" at call sites |
src/platform/packages/private/kbn-esql-editor/src/editor_footer/tooltip_wrapper.tsx |
delay="regular" at call sites |
src/platform/packages/shared/kbn-user-profile-components/src/user_tooltip.tsx (UserToolTip) |
delay="regular" in user_avatar_tip.tsx and alerting_v2 episode cell |
x-pack/solutions/observability/plugins/infra/public/components/logging/log_analysis_setup/missing_setup_privileges_tooltip.tsx (MissingSetupPrivilegesToolTip) |
delay="regular" in create_job_button.tsx |
waitForEuiToolTipVisible / waitForEuiToolTipHidden test helpers
These can be replaced with direct synchronous assertions:
await waitForEuiToolTipVisible()→expect(queryByRole('tooltip')).toBeInTheDocument()await waitForEuiToolTipHidden()→expect(queryByRole('tooltip')).not.toBeInTheDocument()- Remove
asyncfrom the callback if it had no otherawaits.
| File |
|---|
src/platform/plugins/shared/discover/public/application/main/components/layout/cascaded_documents/blocks/use_table_header_components.test.tsx |
src/platform/packages/shared/kbn-user-profile-components/src/user_tooltip.test.tsx |
x-pack/platform/plugins/shared/ml/public/application/components/anomalies_table/anomaly_value_display.test.tsx |
x-pack/solutions/search/plugins/enterprise_search/public/applications/applications/components/search_applications/search_applications_create_button.test.tsx |
x-pack/solutions/security/plugins/security_solution/public/asset_inventory/components/risk_badge.test.tsx |
x-pack/solutions/security/plugins/security_solution/public/attack_discovery/pages/settings_flyout/hooks/use_schedule_view.test.tsx |
x-pack/solutions/security/plugins/security_solution/public/attack_discovery/pages/settings_flyout/schedule/common/status_badge/index.test.tsx |
x-pack/solutions/security/plugins/security_solution/public/attack_discovery/pages/settings_flyout/schedule/create_button/index.test.tsx |
x-pack/solutions/security/plugins/security_solution/public/attack_discovery/pages/settings_flyout/schedule/details_flyout/index.test.tsx |
x-pack/solutions/security/plugins/security_solution/public/attack_discovery/pages/settings_flyout/schedule/missing_privileges/index.test.tsx |
x-pack/solutions/security/plugins/security_solution/public/attack_discovery/pages/settings_flyout/schedule/schedules_table/columns/actions.test.tsx |
x-pack/solutions/security/plugins/security_solution/public/attack_discovery/pages/settings_flyout/schedule/schedules_table/columns/enable.test.tsx |
ToolTipDelay type
No usages found in Kibana, type was only used internally in EUI.
005d734 to
d3ecb4e
Compare
35138e8 to
19c48b1
Compare
There was a problem hiding this comment.
Pull request overview
This PR removes the old timeout-based tooltip delay API from EUI and shifts EuiToolTip to synchronous state updates plus an opacity-only CSS animation delay. It also updates affected consumers, tests, stories, and docs across the codebase to align with the new tooltip behavior and accessibility goals.
Changes:
- Removed
delay/ToolTipDelayfromEuiToolTipandEuiIconTip, and simplified tooltip show/hide state management. - Updated tooltip animation to opacity-only and adjusted tooltip manager / focus-driven consumers to work with synchronous visibility.
- Removed tooltip RTL wait helpers and updated tests, stories, docs, and changelog entries to reflect the breaking API change.
Reviewed changes
Copilot reviewed 42 out of 43 changed files in this pull request and generated 6 comments.
Show a summary per file
| File | Description |
|---|---|
packages/website/docs/components/display/tooltip.mdx |
Removed tooltip delay example from docs page. |
packages/eui/src/test/rtl/component_helpers.ts |
Removed tooltip-specific RTL wait helpers. |
packages/eui/src/test/rtl/component_helpers.d.ts |
Removed helper declarations from test typings. |
packages/eui/src/components/tool_tip/tool_tip.tsx |
Removed delay logic and made tooltip visibility synchronous. |
packages/eui/src/components/tool_tip/tool_tip.test.tsx |
Updated tooltip tests for synchronous DOM insertion. |
packages/eui/src/components/tool_tip/tool_tip.styles.ts |
Replaced directional animation with opacity-only animation and delay. |
packages/eui/src/components/tool_tip/tool_tip.stories.tsx |
Removed deprecated story args and kept VRT wait. |
packages/eui/src/components/tool_tip/tool_tip_manager.ts |
Prevented self-hide on duplicate registration. |
packages/eui/src/components/tool_tip/tool_tip_manager.test.ts |
Added regression test for duplicate registration. |
packages/eui/src/components/tool_tip/icon_tip.tsx |
Removed delay prop passthrough from icon tooltip wrapper. |
packages/eui/src/components/tool_tip/icon_tip.test.tsx |
Updated icon tooltip tests for synchronous behavior. |
packages/eui/src/components/tool_tip/icon_tip.stories.tsx |
Removed deprecated VRT delay override from icon tooltip story. |
packages/eui/src/components/table/table_header_cell.test.tsx |
Updated tooltip-related table header tests. |
packages/eui/src/components/selectable/selectable_list/selectable_list_item.test.tsx |
Updated selectable item tooltip tests. |
packages/eui/src/components/markdown_editor/markdown_editor_toolbar.tsx |
Removed delay prop from toolbar tooltips. |
packages/eui/src/components/list_group/list_group_item.tsx |
Removed long-delay tooltip usage in list group items. |
packages/eui/src/components/list_group/list_group_item.test.tsx |
Updated list group tooltip tests. |
packages/eui/src/components/key_pad_menu/key_pad_menu_item.tsx |
Removed delay-specific typing and prop usage. |
packages/eui/src/components/key_pad_menu/key_pad_menu_item.test.tsx |
Updated keypad tooltip tests. |
packages/eui/src/components/filter_group/filter_select_item.tsx |
Moved tooltip toggling out of render into lifecycle methods. |
packages/eui/src/components/filter_group/filter_select_item.test.tsx |
Updated focused-tooltip tests for lifecycle-driven behavior. |
packages/eui/src/components/date_picker/super_date_picker/super_update_button.test.tsx |
Updated tooltip-related super update button tests. |
packages/eui/src/components/datagrid/controls/keyboard_shortcuts.tsx |
Removed delay prop from data grid keyboard shortcut tooltip. |
packages/eui/src/components/datagrid/controls/fullscreen_selector.tsx |
Removed delay prop from fullscreen tooltip. |
packages/eui/src/components/datagrid/controls/display_selector.tsx |
Removed delay prop from display selector tooltip. |
packages/eui/src/components/copy/copy.test.tsx |
Updated copy tooltip tests for synchronous insertion. |
packages/eui/src/components/context_menu/context_menu_item.test.tsx |
Updated context menu tooltip tests. |
packages/eui/src/components/combo_box/combo_box.test.tsx |
Updated combo box tooltip tests. |
packages/eui/src/components/color_picker/saturation.test.tsx |
Updated saturation tooltip tests. |
packages/eui/src/components/color_picker/hue.test.tsx |
Updated hue tooltip tests. |
packages/eui/src/components/color_picker/color_picker_swatch.tsx |
Removed delay-specific swatch tooltip typing. |
packages/eui/src/components/color_picker/color_picker_swatch.test.tsx |
Updated swatch tooltip tests. |
packages/eui/src/components/collapsible_nav_beta/collapsible_nav_item/collapsed/collapsed_nav_button.test.tsx |
Updated collapsed nav tooltip tests. |
packages/eui/src/components/button/split_button/split_button.test.tsx |
Updated split button tooltip tests. |
packages/eui/src/components/button/split_button/split_button.stories.tsx |
Removed deprecated VRT delay override from split button story. |
packages/eui/src/components/button/button_group/button_group.test.tsx |
Updated button group tooltip tests. |
packages/eui/src/components/button/button_group/button_group.stories.tsx |
Removed deprecated VRT delay override from button group story. |
packages/eui/src/components/basic_table/table_types.ts |
Removed delay-specific tooltip typing from table API. |
packages/eui/src/components/basic_table/default_item_action.tsx |
Removed long-delay tooltip default from table actions. |
packages/eui/src/components/basic_table/default_item_action.test.tsx |
Updated default item action tooltip tests. |
packages/eui/src/components/basic_table/collapsed_item_actions.tsx |
Removed delay prop from collapsed table action tooltips. |
packages/eui/src/components/basic_table/collapsed_item_actions.test.tsx |
Updated collapsed action tooltip tests. |
packages/eui/changelogs/upcoming/9626.md |
Added breaking-change / behavior changelog entry for tooltip delay removal. |
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
|
Code changes look good. I like how clean the tooltip becomes, and the number of added to removed lines confirms that :D I'm going to QA the changes next |
BREAKING CHANGE: the `delay` prop and `ToolTipDelay` type have been removed from `EuiToolTip` and `EuiIconTip`. Tooltips now show and hide synchronously. Remove any `delay` prop usage.
BREAKING CHANGE: `waitForEuiToolTipVisible` and `waitForEuiToolTipHidden` RTL test helpers have been removed. These helpers used `waitFor` with long timeouts to account for the now-removed tooltip delay. Tooltip show/hide is now synchronous, so all assertions can be made directly without async waiting.
Moved tooltip visibility toggling from render() to componentDidMount and componentDidUpdate. The previous code triggered showToolTip/hideToolTip synchronously during render, causing a "Cannot update a component while rendering a different component" React warning. This was previously masked by the now-removed enqueueStateChange timeout wrapper.
dbfe37a to
cda062a
Compare
There was a problem hiding this comment.
Pull request overview
Copilot reviewed 44 out of 45 changed files in this pull request and generated 4 comments.
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
|
Did some final testing in Storybook and Kibana. Everything seems to be working correctly. @tkajtoch let me know if you find anything else! Let's aim to have this merged before tomorrow morning. Kapture.2026-05-04.at.18.50.14.mp4 |
💚 Build SucceededHistory
|
💚 Build Succeeded
History
|
tkajtoch
left a comment
There was a problem hiding this comment.
Thank you for fixing the issue! I retested the changes and can confirm everything works as expected now ![]()
## Dependency updates - `@elastic/eui` - v114.3.0 ⏩ v115.0.0 - `@elastic/eslint-plugin-eui` - v2.11.1 ⏩ v2.12.0 ## Package updates ### Summary > [!NOTE] > Please be mindful that as the Design System team we are not aware of your specific area pre-requisites and testing setups, and are realistically not capable of testing the entirety of Kibana. That being said, we want to do our best at migrating breaking changes. All tooltip usages were updated accordingly but there might be mistakes and bugs. That's why, **I would advise every reviewer to smoke-test their domain tooltips**. We'd also greatly appreciate your help with adjusting anything that may be wrong 🙏🏻 https://github.com/user-attachments/assets/2da29c89-aba1-40f9-ae3e-13790a34aedf - tooltips **no longer appear on programmatic focus return** (e.g. when closing flyouts, modals) - unless you're using the keyboard to navigate, - tooltips **do not persist on mouse click** which was annoying for the sighted users and tricky to handle in automated testing environments, - there's **no timeout-based delay** that's inconsistent across Kibana and makes the UI seem laggy, - we made the **animation simpler** and tooltip content **font-size smaller**, resulting in a better visual hierarchy, -VoiceOver no longer has problems with **announcing tooltip content** on trigger focus. These changes have been developed with [SC 1.4.13 Content on Hover or Focus](https://www.w3.org/TR/WCAG21/#content-on-hover-or-focus) in mind while providing the best possible UX. ### `@elastic/eui` [v115.0.0](https://github.com/elastic/eui/blob/main/packages/eui/changelogs/CHANGELOG_2026.md) - Updated `EuiToolTip` default font size from 14px to 12px ([#9627](elastic/eui#9627)) - Updated `EuiToolTip` show animation to opacity-only with a 150ms grace period delay, preventing visual flickering when quickly hovering over multiple tooltip triggers ([#9626](elastic/eui#9626)) - Updated `EuiToolTip` to respect input modality. Tooltip no longer persists on mouse-click focus or shows on programmatic focus return. ([#9624](elastic/eui#9624)) **Bug fixes** - Fixed `uiPlugins[].button` type to allow UI plugins to not have a toolbar button in `EuiMarkdownEditor` ([#9634](elastic/eui#9634)) - Fixed `EuiToolTip` self-hiding when the mouse moves over child elements within the trigger ([#9626](elastic/eui#9626)) **Breaking changes** - Removed `delay` prop and `ToolTipDelay` type from `EuiToolTip` and `EuiIconTip` ([#9626](elastic/eui#9626)) - Removed `waitForEuiToolTipVisible` and `waitForEuiToolTipHidden` RTL test helpers; tooltip show/hide is now synchronous so direct assertions can be used instead ([#9626](elastic/eui#9626)) **Accessibility** - Fixed invalid nested interactive elements in `EuiMarkdownEditor` by removing `role` from the drop zone wrapper. ([#9625](elastic/eui#9625)) ### `@elastic/eslint-plugin-eui` [v2.12.0](https://github.com/elastic/eui/blob/main/packages/eslint-plugin/changelogs/CHANGELOG_2026.md) - Added a new `prefer-tooltip-trigger-focus-test-utility` rule that flags `fireEvent.focus()` inside `it`/`test` blocks that also query for a tooltip. The rule auto-fixes to `focusEuiToolTipTrigger` from EUI's RTL test utilities. ([#9624](elastic/eui#9624)) --------- Co-authored-by: kibanamachine <42973632+kibanamachine@users.noreply.github.com>
## Dependency updates - `@elastic/eui` - v114.3.0 ⏩ v115.0.0 - `@elastic/eslint-plugin-eui` - v2.11.1 ⏩ v2.12.0 ## Package updates ### Summary > [!NOTE] > Please be mindful that as the Design System team we are not aware of your specific area pre-requisites and testing setups, and are realistically not capable of testing the entirety of Kibana. That being said, we want to do our best at migrating breaking changes. All tooltip usages were updated accordingly but there might be mistakes and bugs. That's why, **I would advise every reviewer to smoke-test their domain tooltips**. We'd also greatly appreciate your help with adjusting anything that may be wrong 🙏🏻 https://github.com/user-attachments/assets/2da29c89-aba1-40f9-ae3e-13790a34aedf - tooltips **no longer appear on programmatic focus return** (e.g. when closing flyouts, modals) - unless you're using the keyboard to navigate, - tooltips **do not persist on mouse click** which was annoying for the sighted users and tricky to handle in automated testing environments, - there's **no timeout-based delay** that's inconsistent across Kibana and makes the UI seem laggy, - we made the **animation simpler** and tooltip content **font-size smaller**, resulting in a better visual hierarchy, -VoiceOver no longer has problems with **announcing tooltip content** on trigger focus. These changes have been developed with [SC 1.4.13 Content on Hover or Focus](https://www.w3.org/TR/WCAG21/#content-on-hover-or-focus) in mind while providing the best possible UX. ### `@elastic/eui` [v115.0.0](https://github.com/elastic/eui/blob/main/packages/eui/changelogs/CHANGELOG_2026.md) - Updated `EuiToolTip` default font size from 14px to 12px ([#9627](elastic/eui#9627)) - Updated `EuiToolTip` show animation to opacity-only with a 150ms grace period delay, preventing visual flickering when quickly hovering over multiple tooltip triggers ([#9626](elastic/eui#9626)) - Updated `EuiToolTip` to respect input modality. Tooltip no longer persists on mouse-click focus or shows on programmatic focus return. ([#9624](elastic/eui#9624)) **Bug fixes** - Fixed `uiPlugins[].button` type to allow UI plugins to not have a toolbar button in `EuiMarkdownEditor` ([#9634](elastic/eui#9634)) - Fixed `EuiToolTip` self-hiding when the mouse moves over child elements within the trigger ([#9626](elastic/eui#9626)) **Breaking changes** - Removed `delay` prop and `ToolTipDelay` type from `EuiToolTip` and `EuiIconTip` ([#9626](elastic/eui#9626)) - Removed `waitForEuiToolTipVisible` and `waitForEuiToolTipHidden` RTL test helpers; tooltip show/hide is now synchronous so direct assertions can be used instead ([#9626](elastic/eui#9626)) **Accessibility** - Fixed invalid nested interactive elements in `EuiMarkdownEditor` by removing `role` from the drop zone wrapper. ([#9625](elastic/eui#9625)) ### `@elastic/eslint-plugin-eui` [v2.12.0](https://github.com/elastic/eui/blob/main/packages/eslint-plugin/changelogs/CHANGELOG_2026.md) - Added a new `prefer-tooltip-trigger-focus-test-utility` rule that flags `fireEvent.focus()` inside `it`/`test` blocks that also query for a tooltip. The rule auto-fixes to `focusEuiToolTipTrigger` from EUI's RTL test utilities. ([#9624](elastic/eui#9624)) --------- Co-authored-by: kibanamachine <42973632+kibanamachine@users.noreply.github.com>
## Dependency updates - `@elastic/eui` - v114.3.0 ⏩ v115.0.0 - `@elastic/eslint-plugin-eui` - v2.11.1 ⏩ v2.12.0 ## Package updates ### Summary > [!NOTE] > Please be mindful that as the Design System team we are not aware of your specific area pre-requisites and testing setups, and are realistically not capable of testing the entirety of Kibana. That being said, we want to do our best at migrating breaking changes. All tooltip usages were updated accordingly but there might be mistakes and bugs. That's why, **I would advise every reviewer to smoke-test their domain tooltips**. We'd also greatly appreciate your help with adjusting anything that may be wrong 🙏🏻 https://github.com/user-attachments/assets/2da29c89-aba1-40f9-ae3e-13790a34aedf - tooltips **no longer appear on programmatic focus return** (e.g. when closing flyouts, modals) - unless you're using the keyboard to navigate, - tooltips **do not persist on mouse click** which was annoying for the sighted users and tricky to handle in automated testing environments, - there's **no timeout-based delay** that's inconsistent across Kibana and makes the UI seem laggy, - we made the **animation simpler** and tooltip content **font-size smaller**, resulting in a better visual hierarchy, -VoiceOver no longer has problems with **announcing tooltip content** on trigger focus. These changes have been developed with [SC 1.4.13 Content on Hover or Focus](https://www.w3.org/TR/WCAG21/#content-on-hover-or-focus) in mind while providing the best possible UX. ### `@elastic/eui` [v115.0.0](https://github.com/elastic/eui/blob/main/packages/eui/changelogs/CHANGELOG_2026.md) - Updated `EuiToolTip` default font size from 14px to 12px ([elastic#9627](elastic/eui#9627)) - Updated `EuiToolTip` show animation to opacity-only with a 150ms grace period delay, preventing visual flickering when quickly hovering over multiple tooltip triggers ([elastic#9626](elastic/eui#9626)) - Updated `EuiToolTip` to respect input modality. Tooltip no longer persists on mouse-click focus or shows on programmatic focus return. ([elastic#9624](elastic/eui#9624)) **Bug fixes** - Fixed `uiPlugins[].button` type to allow UI plugins to not have a toolbar button in `EuiMarkdownEditor` ([elastic#9634](elastic/eui#9634)) - Fixed `EuiToolTip` self-hiding when the mouse moves over child elements within the trigger ([elastic#9626](elastic/eui#9626)) **Breaking changes** - Removed `delay` prop and `ToolTipDelay` type from `EuiToolTip` and `EuiIconTip` ([elastic#9626](elastic/eui#9626)) - Removed `waitForEuiToolTipVisible` and `waitForEuiToolTipHidden` RTL test helpers; tooltip show/hide is now synchronous so direct assertions can be used instead ([elastic#9626](elastic/eui#9626)) **Accessibility** - Fixed invalid nested interactive elements in `EuiMarkdownEditor` by removing `role` from the drop zone wrapper. ([elastic#9625](elastic/eui#9625)) ### `@elastic/eslint-plugin-eui` [v2.12.0](https://github.com/elastic/eui/blob/main/packages/eslint-plugin/changelogs/CHANGELOG_2026.md) - Added a new `prefer-tooltip-trigger-focus-test-utility` rule that flags `fireEvent.focus()` inside `it`/`test` blocks that also query for a tooltip. The rule auto-fixes to `focusEuiToolTipTrigger` from EUI's RTL test utilities. ([elastic#9624](elastic/eui#9624)) --------- Co-authored-by: kibanamachine <42973632+kibanamachine@users.noreply.github.com>

Summary
delayprop fromEuiToolTipEuiToolTipanimation to work only on opacitywaitForEuiToolTipVisible,waitForEuiToolTipHiddenbecause tooltip is now synchronousdelay-related logic was removed, includingenqueueStateChangeandsetTimeout, now it's synchronoussetVisiblecalls,animation-delaywithfill-mode: bothacts as the new "delay" to avoid jarring flickering when hovering over multiple triggerstoolTipManager.registerTooltipnow bails if the same callback is already registered, it was an existing bug hidden by the delay ofmouseoverbubbling from child elementsrenderinEuiFilterSelectIemClassintocomponentDidMount/componentDidUpdate; tooltip didn't work after removing the delayAPI Changes
EuiToolTipdelayanimation-delay. It's consistent, not customizable. Migration: remove alldelayusagesEuiIconTipdelayToolTipDelaywaitForEuiToolTipVisiblewaitForEuiToolTipHiddenScreenshots
Kapture.2026-04-30.at.15.48.00.mp4
Kapture.2026-04-30.at.15.53.53.mp4
VoiceOver + Chrome
Kapture.2026-04-30.at.16.28.41.mp4
Kapture.2026-04-30.at.16.29.09.mp4
Impact Assessment
Note: Most PRs should be tested in Kibana to help gauge their Impact before merging.
Impact level: 🔴 High
Release Readiness
waitForEuiToolTipVisibleandwaitForEuiToolTipHiddenin tests,delayinEuiToolTipandEuiIconTipusages.Adoption plan (new features): {link to issue/doc or outline who will integrate this and where}QA instructions for reviewer
Open the tooltip demo in Storybook.
prefers-reduced-motion: reduce, tooltip appears instantly (no animation, no delay)Checklist before marking Ready for Review
light/dark modes, high contrast, mobile,Chrome/Safari/Edge/Firefox, keyboard-only, screen readerCodeSandbox andKibanaCypress, and VRTbreaking changelabel (if applicable)Reviewer checklist