Background
Surfaced during the multi-angle review of the nuxt/ui → b24ui sync plan (.sync/PLAN.md). These are pre-existing test-suite gaps, independent of the sync pipeline, so they are split out here. They also matter for the pipeline: the planned sync relies on the test suite to catch incomplete ports, so closing these strengthens that safety net.
Scope
1. Missing accessibility (axe) tests
The component test suite uses vitest-axe (it('passes accessibility tests')) for ~92 of ~98 component specs. The following components have no axe case:
Advice
Countdown
ProsePrompt
ScrollArea
TableWrapper
Theme
(Advice/Countdown are b24ui-specific and won't be synced from upstream, but the a11y gap is still worth closing.)
Action: add an axe case to each of the six specs.
2. Prop-coverage utility
There is currently no check that every prop of a component is exercised by a renderEach snapshot case. This is the main blind spot the sync pipeline is exposed to: a prop can exist in the types (so typecheck passes) without being rendered/implemented, and no snapshot changes.
Action: add a small utility/test that, for a given component, compares the declared props against the keys exercised in its spec's renderEach cases and reports uncovered props. Wire it into CI for changed components.
3. Behavioral tests for interaction-heavy components
~25% of components have behavioral tests (events/keyboard/focus); the rest are snapshot-only. Snapshots don't catch behavior regressions (e.g. keyboard navigation, focus trap).
Action (initial set):
Accordion — keyboard navigation
Select / SelectMenu — selection events, filtering
Modal — focus trap / dismiss behavior
Priority
- §1 a11y — P2 (small, mechanical)
- §2 prop-coverage — P2 (high leverage for the sync pipeline)
- §3 behavioral — P3 (incremental)
Reference
- Review context:
.sync/PLAN.md "Quality requirements for every ported PR"
Background
Surfaced during the multi-angle review of the nuxt/ui → b24ui sync plan (
.sync/PLAN.md). These are pre-existing test-suite gaps, independent of the sync pipeline, so they are split out here. They also matter for the pipeline: the planned sync relies on the test suite to catch incomplete ports, so closing these strengthens that safety net.Scope
1. Missing accessibility (
axe) testsThe component test suite uses
vitest-axe(it('passes accessibility tests')) for ~92 of ~98 component specs. The following components have no axe case:AdviceCountdownProsePromptScrollAreaTableWrapperTheme(
Advice/Countdownare b24ui-specific and won't be synced from upstream, but the a11y gap is still worth closing.)Action: add an
axecase to each of the six specs.2. Prop-coverage utility
There is currently no check that every prop of a component is exercised by a
renderEachsnapshot case. This is the main blind spot the sync pipeline is exposed to: a prop can exist in the types (sotypecheckpasses) without being rendered/implemented, and no snapshot changes.Action: add a small utility/test that, for a given component, compares the declared props against the keys exercised in its spec's
renderEachcases and reports uncovered props. Wire it into CI for changed components.3. Behavioral tests for interaction-heavy components
~25% of components have behavioral tests (events/keyboard/focus); the rest are snapshot-only. Snapshots don't catch behavior regressions (e.g. keyboard navigation, focus trap).
Action (initial set):
Accordion— keyboard navigationSelect/SelectMenu— selection events, filteringModal— focus trap / dismiss behaviorPriority
Reference
.sync/PLAN.md"Quality requirements for every ported PR"