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.

  1. 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 ago
  2. 02Sorting 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 view
    After
    Sort: Created DateNewest first
  3. 03Every 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 Filters
  4. 04Controls 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 starts
    After
    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.