All work

UX/UI Design · Design system · TRR · With designers from other product teams

Setting one filter standard for TRR, so filtering works the same wherever people look

People use filters to narrow down job ads, activities and candidates across TRR’s services. Over time, each team had built filtering its own way, so the same task worked differently from one service to the next. Together with designers from other product teams, I designed one shared filter component, and the list and table actions around it, and set it as the standard in TRR’s design system. People learn it once and recognise it everywhere. Teams use one documented component instead of building their own.

My role
UX/UI designer, together with designers from other product teams
Company
TRR
Type
Design system component and pattern
Platform
Web, desktop and mobile
Delivered
Filter, list and table actions and datagrid, documented in Figma
Tools
Figma
Working prototypeTry it yourselfFilter job ads and activities with the same component, open More filters, select rows and try the mobile drawer. In Swedish, on desktop or mobile.

The short version

The problem

Filtering had grown up differently in each service. People had to relearn how to choose, see and clear filters every time they moved between services.

What we did

Designers from several product teams agreed on one filter component, with every state drawn out, plus the list and table actions that belong with it.

What it gives

For users, one way to filter everywhere. For teams, one documented standard in the design system instead of many local versions.

01

The problem

Filters are how people find what is relevant to them: job ads in their field, activities near them, candidates for an employer. At TRR, filtering had been built team by team over time. Each solution made sense on its own, but together they didn’t.

Relearning in every service

The same task, narrowing down a list, looked and behaved differently depending on where you were. People had to work out each version again.

Hard to see what was on

With different patterns, it could be unclear which filters were active, or how to get back to the full list.

Many versions to maintain

Each team designed, built and fixed its own filter, so an improvement in one service didn’t reach the others.

The goal

Set one filter standard for TRR: a component that works the same for users in every service, and that every team can use.

02

The design challenge

One component had to fit very different services. Some lists have a few filters, others many. Some are used on a phone, others mostly on a desktop at work. Some show cards, others are tables with selectable rows.

It also had to be agreed across teams. A standard nobody uses is not a standard, so the design had to answer each team’s needs well enough that they would choose it over their own version.

One pattern, many contexts

Simple enough to learn once, flexible enough to cover every service’s filters.

03

My role: designing the standard together

My role

I worked on the filter together with designers from other product teams at TRR. We compared how filtering worked in each service, agreed on the behaviour users should meet everywhere, and I designed the component and its states in Figma.

The work grew into a small family of shared patterns: the filter itself, the list and table actions that sit with it, and a datagrid for tables. Each one is documented in the design system as shared layout and functionality.

How we worked

We started from the services that already had filters and looked at what users met in each one. From there we agreed on one way to choose, show, clear and overflow filters, and drew every state so designers and developers wouldn’t have to guess.

From many versions to one standard

Look at how filtering works in each service → agree on shared behaviour with the other designers → design the component and its states → document it in the design system → teams use it in their services.

04

Key design decisions

Four decisions make up the standard. Each one is about what people need when they narrow down a list.

  1. One filter, one buttonEach filter is a button in a row above the list, and opens a small panel with its options. People see every filter at a glance and choose without leaving the page.
  2. Always show what is onAn active filter changes colour and shows how many options are chosen. One “Clear filters” link resets everything, so it is always easy to get back.
  3. Room for many filtersThe most used filters stay in the row. The rest go into “More filters”, a drawer with every filter grouped, so a long list never pushes the content down.
  4. A mobile drawer that shows the result firstOn a phone, one Filter button opens a drawer with each filter as a section. The button at the bottom says how many hits the choice gives, or “No hits”, before the user applies it.
05

The standard in use

The screens are in Swedish, from a working prototype built from the design in Figma. It shows the same filter component in two services, job ads and activities. The content is made up. Click an image to enlarge it.

Working prototypeTry it yourselfFilter job ads and activities with the same component, open More filters, select rows and try the mobile drawer. In Swedish, on desktop or mobile.

Choose

The filter row above the job ad list, with the occupational area filter open: a panel with a heading, a close button, checkboxes and a Clear link that is not yet active
1A panel per filter. Heading, options and Clear. Clear stays grey until there is something to clear.
The same panel with two options chosen. The filter button has turned teal with the number 2, and Clear filters has appeared in the row
2Results update straight away. The button shows the number of choices, and Clear filters appears in the row.

See and manage

The filter row with two active filters, each teal with a count, followed by More filters and Clear filters, above three job ads
3Active at a glance. Teal and a count for each active filter, one link to clear them all.
The More filters drawer on the right with every filter grouped under a heading, a Clear link and a button showing the number of job ads
4More filters. Every filter in one drawer, grouped. The button says how many hits there are.

Act on the list

The list with two of three job ads selected: the select-all box shows a partial state, and actions to save, copy links and email appear next to “2 selected of 3”
5List actions. Select all, a partial state, and actions that appear only when something is selected. Sorting, rows per page and paging sit on the right.
The activities service with the same filter row, the format filter active and the category filter open
6The same component elsewhere. Activities use exactly the same filter, so nothing new to learn.

On mobile

The mobile filter drawer with each filter as a closed section and a disabled Clear all link
One Filter button. Each filter is a section.
The mobile drawer with the occupational area section open, one option chosen, a count next to each option and a button saying Visa 23 träffar
Counts and a live result. The button says how many hits the choice gives.
The job ad list on a phone after filtering, with the Filter button showing one active filter
Back to the list. The Filter button shows what is active.
06

The component and its states

The filter component documented in Figma: rows for filter group, active filter, filter overflow, filter dialog, selected filter options and active filters, and below them the popover in default, selected and scroll states and the More filters drawer in default and selected states
The filter in TRR’s design system. Every state drawn out, under the heading “Gemensam layout och funktionalitet”, shared layout and functionality.

States designers and developers can rely on

  1. Filter groupThe row of filter buttons, the starting point in every service.
  2. Active filterTeal with a count, so what is on is never hidden.
  3. Filter overflowWhen there are more filters than fit, the rest go into More filters.
  4. Popover: default, selected and scrollOptions with a Clear link that wakes up when something is chosen. Long lists scroll inside the panel, with subheadings.
  5. Drawer: default and selectedMore filters with every filter grouped, for services with many filters.
  6. Mobile drawer: default, open and selectedSections that open one at a time, counts for each option, Clear all and a button that shows the number of hits.
The mobile filter drawer documented in Figma in three states: default, filter open and selected, with counts and a button showing 147 hits
Mobile, in three states. Default, open and selected, with the hit count in the button.

The patterns around the filter

Filtering rarely comes alone. The same work defined the list and table actions that sit above a list, and a datagrid for tables, so the whole area around a list behaves the same way.

  • Select all with three states: none, all and some selected.
  • Actions that appear only when something is selected.
  • Sorting, rows per page and paging in the same place on every list.
  • A datagrid for tables, with column settings, filters and selectable rows.
List and table actions documented in Figma: select all in default, all selected and partial states, actions visible, sorting, rows per page and pagination, and three list examples
List and table actions. The same select, act, sort and page pattern on every list.
07

Value for users and teams

For the users

Learn it once

Filtering works the same in every service, so what people learn in one place they can use in the next.

Always know what is on

Active filters are visible and countable, and one link brings back the full list.

No dead ends on mobile

The button shows how many hits a choice gives before it is applied, and says so when there are none.

For the design system and the teams

One component instead of many

Teams use the shared filter instead of designing and building their own version.

Every state already decided

Designers and developers don’t have to guess how the filter behaves when it is empty, full, active or on a phone.

Improve once, improve everywhere

A fix or improvement to the component reaches every service that uses it.

Why it matters

Consistency is not about looking the same. It is about people not having to think about how to filter, so they can focus on finding a job, an activity or a candidate.

08

UI design: what and why

The filter sits on top of busy lists, so it had to be quiet until it is used, and clear once it is.

  1. Built on TRR’s design systemPurple for actions, teal for chosen states, Open Sans for text and the existing checkbox and button components.
  2. Teal means chosenSelected checkboxes, active filter buttons and selected rows all use the same teal, so “chosen” looks the same everywhere.
  3. Small buttons, one rowCompact buttons keep the filters to one row above the list, so the content starts high on the page.
  4. Clear is quiet until it is neededClear is grey and inactive with nothing chosen, and turns purple when there is something to clear.
  5. Counts as small badgesA round teal badge shows the number of choices on a filter button and a mobile section, without adding text.

What I took with me

A design system component is only a standard when teams choose it. Working on it together with the designers who would use it made it fit their services, and made it theirs as much as mine.

The most user-centred part of a component is often invisible: that it behaves the same every time. People notice inconsistency much more than consistency, and removing it lets them focus on what they came to do.