Follow-up from PR #155 (ARIA correctness).
The form error wiring in that PR gives every error <p> an id and points the control at it with aria-describedby. Several of those ids are hardcoded string literals — title-error, slug-error, and siblings in ProjectEdit, ProjectBuzzNew, TagEditModal, etc. When a screen and a modal that both use one of those ids are mounted at the same time (e.g. ProjectEdit with PostHelpWantedModal open), the ids collide and aria-describedby can resolve to the wrong element.
Derive the ids from useId() (as SearchBox and TagPicker already do) so each mounted form instance owns unique ids. Consider a tiny helper so the ${id}-error convention stays in one place.
🤖 Generated with Claude Code
https://claude.ai/code/session_01RdRwHvDupRLV8GuJpYKzEr
Follow-up from PR #155 (ARIA correctness).
The form error wiring in that PR gives every error
<p>an id and points the control at it witharia-describedby. Several of those ids are hardcoded string literals —title-error,slug-error, and siblings in ProjectEdit, ProjectBuzzNew, TagEditModal, etc. When a screen and a modal that both use one of those ids are mounted at the same time (e.g. ProjectEdit with PostHelpWantedModal open), the ids collide andaria-describedbycan resolve to the wrong element.Derive the ids from
useId()(as SearchBox and TagPicker already do) so each mounted form instance owns unique ids. Consider a tiny helper so the${id}-errorconvention stays in one place.🤖 Generated with Claude Code
https://claude.ai/code/session_01RdRwHvDupRLV8GuJpYKzEr