Quick answer
TL;DR
| The problem | Filter rows and sort rows look alike but need different trigger vocabularies, different value shapes, and different page-level restrictions |
| What we did | Built them as two components sharing an interaction pattern, not one component sharing logic |
| My role | Kept the two components organized together and structurally consistent as the codebase was reorganized around them |
| Outcome | Neither builder inherited constraints that only made sense for the other |
| Trade-off | Some duplicated shape in exchange for not forcing one abstraction to serve two different jobs |
| Team | Built and maintained as shared codebase work |
The situation
Why we didn't build one shared row component
What I did
The result
FAQ
Part of the Product Recommendations admin builder case study series →