[EuiToolTip] Remove delay and update animation#9626
[EuiToolTip] Remove delay and update animation#9626weronikaolejniczak merged 15 commits intoelastic:mainfrom
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 ![]()

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