Case study
Why it works this way
In a data-heavy product, the biggest enemy is ambiguity: the filters meant to bring clarity end up hidden in menus or taking over the screen. This pattern came from four products with the same problem: a data archival tool, a document management system, a CRM and a micro-video learning platform. The goal was one filtering pattern for all of them that puts attention back on the data.
What went wrong
Watching people use the data tables across those products showed the same frustrations each time.
01People lost track of what was applied
Filters lived behind one button. Applying one showed a count, so seeing what was actually on meant opening the menu again, and losing sight of the table.
Before Filters 3Which three?After Status2 itemsQueueIntakeCreated Date1 week ago02Sorting disappeared on wide tables
Tables scroll sideways. Once the sorted column's header left the screen, nobody could tell how the rows were ordered without scrolling back to find it.
Before PagesSourceAssignee→Sorted by… a column scrolled out of viewAfter Sort: Created DateNewest first03Every filter weighed the same
The date range a report depends on sat in the same long, scrolling list as filters almost nobody used, so people hunted for the one they needed most.
Before AssigneeBatch IDCreated DateDocument IDFax NumberQueue…After Created DateStatusMore Filters04Controls competed with the data
Titles, search and filters each took their own row, pushing the content people came for further down the screen.
Before Three rows before the data startsAfter DocumentsStatusOpenMore Filters
Principles
The aim was for filtering to feel less like a rigid set of controls and more like a conversation with the data.
Context is always on
Every applied filter becomes a chip in the toolbar, with its value, ready to remove. The active sort gets a chip too, so it’s visible however far the table scrolls.
Two tiers, not one list
The one to three filters a screen depends on stay up front. Everything else waits in a searchable More Filters menu, and shows as a chip once it’s used.
The data takes centre stage
Title, search and filters share a single toolbar row, giving the space back to the content and making the workspace calmer.
The craft
A system feels good to use because of its details. These came from the original work; this build adds a few more.
- Humanised dates
- “1 week ago” and “1 month ago” are one click away instead of a calendar every time. They’re stored as words, not dates, so a shared link stays relative.
- Apply, for heavy tables
- Refreshing a large table on every tick makes the interface feel frantic. Apply keeps it calm; instant mode is there for small, fast data.
- Predictable ordering
- Selected options come to the top the next time a list opens, so reviewing choices is easy. While it’s open, nothing moves under the cursor.
- One control to add and remove
- The + of an empty chip turns into the × that clears it. Removing applies at once; Escape or clicking away throws unapplied edits away.
- Keyboard first
- Every popover works from the keyboard, focus always returns to the chip, and nothing animates for people who ask for reduced motion.
- Yours to change
- It installs as source, and every size and colour is a CSS variable, so it can match any product’s design system.
Process
The original pattern was prototyped in v0 before the Figma handoff.
Show the feel
A working prototype carried the micro-interactions that static screens can’t.
Faster buy-in
Stakeholders could use it, not just look at it, which made approval quick.
A clearer handoff
Developers had a live reference next to the Figma specs.
This open-source version takes the same pattern further: built against a written spec, tested rule by rule, and packaged so any team can install it.
Outcome
One modular filtering pattern became the source of truth for every data table: clarity without clutter, and control without complexity.
Making the interface quieter and more predictable lets the data speak for itself. A filter is the start of a conversation with the data; the job of the design is to keep that conversation clear.