Multi-select combo filtering on /lab
Opened by keeb · 4/13/2026· Shipped 4/16/2026
Problem
The /lab left rail filters are currently single-select — clicking a filter activates it exclusively, replacing whatever was previously selected. There is no way to narrow issues by multiple dimensions at once (e.g., "show me all open, triaged bugs").
Proposed solution
Make the filter rail support multi-select with AND semantics:
- Clicking a filter toggles its selected state (not exclusive).
- Multiple selected filters combine as AND (intersection, not union).
- Clicking an already-selected filter deselects it.
Example:
- Start with no filters active.
- Click "open" → filter = { status: open }.
- Click "triaged" → filter = { status: open AND triaged }. (Or however multi-value status is modelled — see alternatives.)
- Click "bug" → filter = { status: open AND triaged, type: bug }.
- Click "open" again → filter = { status: triaged, type: bug }. (open is deselected; the remaining selections stay.)
Selected state should be visually distinct (already the case for single-select — reuse the active styling).
Alternatives
- OR within a category, AND across categories. Example: selecting both "open" and "triaged" under Status would match issues whose status is open OR triaged; selecting "bug" under Type would AND those with the type filter. This matches the common GitHub/Jira/Linear pattern and is more ergonomic when a category has mutually exclusive values (status can only be one thing at a time — selecting two statuses must be OR).
- Strict AND across everything. Simpler but limits usefulness for mutually-exclusive dimensions.
- Chips / filter pills above the list showing active filters with × buttons, in addition to the rail toggle behaviour. Reinforces what's active and provides a second way to deselect.
Context
Surfaced during triage of #99 (text sizing normalization) while looking at /lab rail UX. Currently only single-select is implemented in islands/lab/LabShell.tsx. Also worth a separate pass on URL state so the filter combination is deep-linkable — the rail already has deep-linkable filters per DEFAULT_LAB_FILTER / lib/lab-filter-slug.ts, so multi-select will need a URL encoding decision (comma-separated values, repeated params, etc.)
Shipped
No activity in this phase yet.