Key insights
- Give every chip three distinct visual states — idle (surface + border, tappable but not chosen), active (filled + check, clearly selected), and disabled (dimmed, no results behind it). If active looks like idle, the filter feels broken.
- Make the combination logic legible: OR within a group widens the net (more colors = more matches), AND across groups narrows it (adding a size filters the set down).
- Update the result count on the same frame as the tap. If the number doesn't move, users read it as 'nothing happened' and tap twice.
- Always ship a single clear-all reset. Stacked filters trap users, and one tap back to zero is the escape hatch — pair it with a live count so the reset is legible.
- When chips outrun the screen, keep them in one horizontal scrolling row with a right-edge fade that hints at more. Wrapping into a multi-row wall buries the results below the fold.
- Pin active filters in a sticky summary bar on top so users can always see why the list shrank.
Do / Don't
- Do: Update the result count instantly on every tap, same frame as the state change
- Do: Give each chip clearly distinct idle, active, and disabled states
- Do: Offer a single clear-all reset paired with a live result count
- Don't: Let active chips look identical to idle ones — the filter reads as broken
- Don't: Wrap overflowing chips into a multi-row wall that pushes results off-screen
- Don't: Leave the count unchanged after a tap — users assume it failed and tap again