Objective
Make m3-tabs a complete, resilient implementation of the ARIA tabs pattern and reconcile its documented API with runtime behavior.
Evidence
packages/m3-tabs/src/m3-tabs.ts handles clicks only; ArrowLeft/Right, Home/End, orientation, and activation policy are absent.
- Tabs have
role=tab and roving tabindex but no tabpanel aria-controls/aria-labelledby relationship.
activeTab is not clamped when tabs are removed/disabled.
- Indicator measurement does not react to resize, font loading, or content layout changes.
- README documents variants/properties/event detail that do not match the implementation.
Scope
Implement keyboard focus/activation, tabpanel linkage, disabled/dynamic recovery, orientation, resize observation, and a single typed/documented event contract. Reconcile README and demo examples.
Acceptance criteria
Verification
Cross-browser keyboard tests plus automated accessibility checks.
Dependencies
Blocked by #5 and #6.
Autonomous execution contract
Keep behavior and documentation in the same PR; do not add visual variants unless the intended API is explicitly preserved.
Objective
Make
m3-tabsa complete, resilient implementation of the ARIA tabs pattern and reconcile its documented API with runtime behavior.Evidence
packages/m3-tabs/src/m3-tabs.tshandles clicks only; ArrowLeft/Right, Home/End, orientation, and activation policy are absent.role=taband roving tabindex but no tabpanelaria-controls/aria-labelledbyrelationship.activeTabis not clamped when tabs are removed/disabled.Scope
Implement keyboard focus/activation, tabpanel linkage, disabled/dynamic recovery, orientation, resize observation, and a single typed/documented event contract. Reconcile README and demo examples.
Acceptance criteria
Verification
Cross-browser keyboard tests plus automated accessibility checks.
Dependencies
Blocked by #5 and #6.
Autonomous execution contract
Keep behavior and documentation in the same PR; do not add visual variants unless the intended API is explicitly preserved.