Key elements
- Persistent Selection: Selections stay active across filters, searches, and pages unless the user explicitly clears them
- Additive Selection via Filtered Header Checkbox: When filtered view is active and header checkbox is indeterminate, clicking it selects all filtered items and adds them to the existing global selection.
- Bulk action bar: Always visible when selection exists, even when selected items are outside the current view.
- Explicit Count and Visibility Clarity: Clearly show “N selected of X,” and inform the user when some items are hidden.
- Empty View with Active Selection: If a filtered view shows 0 results, but some items are selected, keep the selection bar visible and actionable.
Behaviour
Select all
When a user clicks the main checkbox in the unfiltered list, all items in the full dataset are selected. If they then apply a filter, the checkbox switches to the indeterminate state to reflect that some—but not all—of the filtered items are selected. At this point, clicking the checkbox again will select all items matching the current filter, replacing the previous selection with the filtered scope. This approach allows users to start broad and then narrow down their selection intentionally without unexpected side effects. It ensures that the checkbox always represents the scope of what is currently visible and gives users control over adjusting their selection as filters change.
Example: Page size 10, 3 checked rows → header state becomes indeterminate; click the box → all 10 items become selected.

Always show the scope of selection, even when items are hidden
When users can select items across a changing or scrollable view (like filtering, searching, or paginated content), always keep the current selection visible and understandable. Clearly communicate how many items are selected out of the total relevant set. If some selected items are outside the current view (e.g., filtered out or on another page), show that explicitly—through a badge, counter, or secondary text. The selection summary should remain visible regardless of scroll or context changes, so users are always aware of what their next action will apply to. This prevents surprises and builds trust when working with large or dynamic content sets.
Example: A user selects 10 visible items. After applying a filter, those 10 files disappear from view, but the selection count remains visible.

Never clear the selection automatically
Once an item is selected, it stays there until the user does something explicit:
- Navigates away from the view, dialog or page
- Use clear or cancel during the flow
- Do the action on top of the selection which will close the dialog (Bulk action bar or select popover)
Changing the search text or flipping a filter just changes what is rendered; it must not reset the set.
No other implicit event (e.g. changing workspace, applying filters, remove items) should wipe the selection. The user must actively choose “Clear selection” (or navigate away).
Example: Designers call this “preserve user work.” If you’ve ever tagged a dozen emails in Gmail, type a new search, and they vanish from the list but are still tagged, you’ve experienced this rule.
Empty View with Active Selection
If the filtered result = 0, but selection still contains items, the bulk bar must still appear and be actionable. Don’t hide the selection just because the current view is empty. It’s still valid.