Thanks to visit codestin.com
Credit goes to github.com

Skip to content

[EuiSelectable] UI enhancements#9411

Draft
mgadewoll wants to merge 10 commits intoelastic:feat/selectable-ui-enhancementsfrom
mgadewoll:selectable/1051-ui-updates
Draft

[EuiSelectable] UI enhancements#9411
mgadewoll wants to merge 10 commits intoelastic:feat/selectable-ui-enhancementsfrom
mgadewoll:selectable/1051-ui-updates

Conversation

@mgadewoll
Copy link
Contributor

@mgadewoll mgadewoll commented Feb 25, 2026

Summary

Important

This PR merges into a feature branch: feat/selectable-ui-enhancements

This PR updates EuiSelectable (mainly through it's subcomponents EuiSelectableList and EuiSelectableListItem) by introducing design changes and smaller internal composition refactors.

Changes

  • Updated EuiSelectableList and EuiSelectableListItem styles (Figma, updated spacing)
    • Updated item padding
    • Updated item selection/hover states
    • Removed item borders
    • Ensures 32px item height
    • Removed list item spacing
    • Removed onFocusBadge by default
    • Updated group dividers (between groups instead of on the group label)
    • ℹ️ a decision was mode to not include a 8px padding on the EuiSelectable component itself (as shown in the figma file) but instead rely on implementation containers. This is less strict and requires enforcement through guidance but it results in an easier API because EuiSelectableSearch and EuiSelectableList are passed to the implementation as render prop arguments which can be placed in any kind of composition (code).
  • Updated EuiSelectableListItem to use EuiCheckboxControl for singleSelection=false (= multi selection)
  • Updated EuiSelectableList to use VariableSizeList instead of FixedSizeList from react-window
    • ℹ️ This allows to define different heights for the group labels to support a separator with spacing
  • Updated EuiSelectableList overflow scroll styles to use animation-timeline
    • ℹ️ This allows us to hide the overflow "soft edge" on unscrolled/fully-scrolled states (first/last items have sharp edges instead of blurred ones)
  • Updated EuiSelectableSearch's compressed default value to true
  • Removed paddingSize prop from EuiSelectableList and EuiSelectableListItem (πŸ”΄ breaking change)
    • ℹ️ design always expects the predefined padding and the intention by removing the prop is to be more strict

Why are we making this change?

πŸ’… UI modernization and consistency: This update is part of the larger initiative to unify selection list designs (https://github.com/elastic/platform-ux-team/issues/1050).

Screenshots #

description before after
single selection Screenshot 2026-03-03 at 11 48 25 Screenshot 2026-03-03 at 11 48 06
multi selection Screenshot 2026-03-03 at 11 47 09 Screenshot 2026-03-03 at 11 47 23
groups Screenshot 2026-03-03 at 11 50 11 Screenshot 2026-03-03 at 11 50 19
  • EuiSelectableListItem checked` states
state image
checked={undefined} Screenshot 2026-03-03 at 11 52 27
checked="on" Screenshot 2026-03-03 at 11 51 25
checked="off" Screenshot 2026-03-03 at 11 52 30
checked="mixed" Screenshot 2026-03-03 at 11 52 33
  • EuiSelectableListItem with custom content
Screenshot 2026-03-03 at 11 55 24

Impact to users

πŸ”΄ Breaking change: This PR removes paddingSize from EuiSelectableList and EuiSelectableListItem.

Kibana usages (10)
// With paddingSize: 'none' (2 usages)

Fleet Platform Selector
x-pack/platform/plugins/shared/fleet/public/components/platform_selector.tsx:
   listProps={{ paddingSize: 'none', onFocusBadge: false }}
   
Alert Message Variables Selector
src/platform/packages/shared/kbn-alerts-ui-shared/src/add_message_variables/index.tsx:
   listProps={{     rowHeight: 70,     showIcons: false,     paddingSize: 'none',     textWrap: 'wrap',   }}
   
   
// With paddingSize: 's' (8 usages)

Browse Integrations - Search and Filters Bar
x-pack/platform/plugins/shared/fleet/public/applications/integrations/sections/epm/screens/browse_integrations/components/search_and_filters_bar.tsx

Integration Status Filter
x-pack/platform/plugins/shared/fleet/public/applications/integrations/sections/epm/components/status_filter.tsx

Agent Logs - Dataset Filter
x-pack/platform/plugins/shared/fleet/public/applications/fleet/sections/agents/agent_details_page/components/agent_logs/filter_dataset.tsx

Agent Logs - Log Level Filter
x-pack/platform/plugins/shared/fleet/public/applications/fleet/sections/agents/agent_details_page/components/agent_logs/filter_log_level.tsx

Agent List - Tags Filter
x-pack/platform/plugins/shared/fleet/public/applications/fleet/sections/agents/agent_list_page/components/filter_bar/tags_filter.tsx

Agent List - Status Filter
x-pack/platform/plugins/shared/fleet/public/applications/fleet/sections/agents/agent_list_page/components/agent_status_filter.tsx

Agent List - Policy Filter
x-pack/platform/plugins/shared/fleet/public/applications/fleet/sections/agents/agent_list_page/components/filter_bar/agent_policy_filter.tsx

Classic Stream Flyout - Template Selector
x-pack/platform/packages/shared/kbn-classic-stream-flyout/src/components/create_classic_stream_flyout/steps/select_template/select_template_step.tsx
Cloud-UI usages (1)
autoops/src/apps/autoops/pages/NotificationsSettings/components/FilterModal/Fields/EventsSelection/EventsList.tsx

QA

  • verify that EuiSelectableListItem matches design specs for different values of singleSelection in combination with different values of checked (renders EuiCheckboxControl if singleSelection=false and icons when singleSelection=true)
  • verify there is no functional regression for multi selection EuiSelectableListItem (after updating to use EuiCheckboxControl)
  • verify that EuiSelectableList group labels work as expected and match design specs
  • verify that the updated overflow style for EuiSelectableList works as expected (hidden on top when unscrolled, hidden on bottom when scrolled to the end, hidden entirely when the container has no overflow)
  • verify that virtualized EuiSelectableList has no functional regression (after updating to use VariableSizeList)
  • verify that EuiSelectableSearch is by default rendered as compressed (32px height)
  • verify that there is no Accessibility regression (list items are correctly announced in the right position/order and disabled items and group labels are skipped)

General checklist

  • Browser QA
    • Checked in both light and dark modes
    • Checked in both MacOS and Windows high contrast modes
    • Checked in mobile
    • Checked in Chrome, Safari, Edge, and Firefox
    • Checked for accessibility including keyboard-only and screenreader modes
  • Docs site QA
  • Code quality checklist
  • Release checklist
    • A changelog entry exists and is marked appropriately
    • If applicable, added the breaking change issue label (and filled out the breaking change checklist)
    • If the changes unblock an issue in a different repo, smoke tested carefully (see Testing EUI features in Kibana ahead of time)
  • Designer checklist
    • If applicable, file an issue to update EUI's Figma library with any corresponding UI changes. (This is an internal repo, if you are external to Elastic, ask a maintainer to submit this request)

@mgadewoll mgadewoll self-assigned this Feb 25, 2026
@mgadewoll mgadewoll force-pushed the selectable/1051-ui-updates branch 2 times, most recently from fea8057 to 0745574 Compare February 27, 2026 08:56
@mgadewoll mgadewoll force-pushed the selectable/1051-ui-updates branch from 0745574 to fca37aa Compare March 3, 2026 09:47
@mgadewoll mgadewoll requested a review from ek-so March 3, 2026 10:46
Copy link
Contributor

@ek-so ek-so left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thank you Lene! Great job πŸ‘πŸ»
As discussed, we'll need to look if we can do smth about custom slot (in this example, description takes way too much height, maybe we could make container fit the height of whatever is passed). Otherwise, looks good.

@mgadewoll
Copy link
Contributor Author

Thank you Lene! Great job πŸ‘πŸ» As discussed, we'll need to look if we can do smth about custom slot (in this example, description takes way too much height, maybe we could make container fit the height of whatever is passed). Otherwise, looks good.

Thanks for the catch! πŸ™
I missed updating the required rowHeight prop for that docs example specifically. Updated in fb7a229.

@elasticmachine
Copy link
Collaborator

πŸ’š Build Succeeded

History

cc @mgadewoll

@elasticmachine
Copy link
Collaborator

πŸ’š Build Succeeded

History

cc @mgadewoll

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants