Summary
The research filter panel exposes nested interactive controls: each filter row is a focusable button-like wrapper around a checkbox primitive. This leads to unnamed checkbox findings in Lighthouse and a confusing accessibility tree.
Reproduction
- Run the website locally with
WEBSITE_PORT=3000 CALCULATOR_PORT=3001 bun run dev.
- Open
http://localhost:3000/us/research.
- Run Lighthouse accessibility or inspect the filter controls with an accessibility tree viewer.
- Filter options under Type / Topic / Location / Author are reported as unnamed controls.
Expected
Each filter option should expose a single, clearly labeled control.
Actual
The row wrapper is interactive (role="button", tabIndex=0) and also contains a Radix checkbox root, so there are nested semantics and the checkbox itself is not correctly labeled in practice.
Relevant code
website/src/app/[countryId]/research/ResearchClient.tsx (CheckboxRow)
website/src/components/ui/checkbox.tsx
Suggested direction
Replace the wrapper-with-checkbox pattern with either:
- a native
<label> + one checkbox, or
- one custom control with explicit checked semantics
But not both at once.
Summary
The research filter panel exposes nested interactive controls: each filter row is a focusable button-like wrapper around a checkbox primitive. This leads to unnamed checkbox findings in Lighthouse and a confusing accessibility tree.
Reproduction
WEBSITE_PORT=3000 CALCULATOR_PORT=3001 bun run dev.http://localhost:3000/us/research.Expected
Each filter option should expose a single, clearly labeled control.
Actual
The row wrapper is interactive (
role="button",tabIndex=0) and also contains a Radix checkbox root, so there are nested semantics and the checkbox itself is not correctly labeled in practice.Relevant code
website/src/app/[countryId]/research/ResearchClient.tsx(CheckboxRow)website/src/components/ui/checkbox.tsxSuggested direction
Replace the wrapper-with-checkbox pattern with either:
<label>+ one checkbox, orBut not both at once.