x-tabs is a tab system container that coordinates multiple x-tab triggers and their associated tab panels.
It manages:
- selected tab state
- keyboard navigation
- roving tabindex
- panel visibility
- tab selection events
x-tabs complements x-tab and provides the coordination layer for a full tab interface.
import { init } from "@vanelsas/baredom/x-tabs";
init();<x-tabs>
<x-tab value="overview" controls="panel-overview">Overview</x-tab>
<x-tab value="analytics" controls="panel-analytics">Analytics</x-tab>
<x-tab value="reports" controls="panel-reports">Reports</x-tab>
</x-tabs>
<section id="panel-overview">Overview content</section>
<section id="panel-analytics" hidden>Analytics content</section>
<section id="panel-reports" hidden>Reports content</section>x-tabs will automatically:
- select the first enabled tab
- manage keyboard navigation
- show the associated panel
| Attribute | Type | Default | Description |
|---|---|---|---|
value |
string | — | Controlled selected tab |
orientation |
horizontal | vertical | horizontal |
activation |
auto | manual | auto |
label |
string | — | Accessible label |
loop |
boolean | false | Enables keyboard wrap navigation |
| Property | Type | Description |
|---|---|---|
value |
string | Current selected tab value |
Example:
tabs.value = "analytics";Fired before the selected tab changes. Cancelable — call event.preventDefault() to block the tab switch (controlled mode).
tabs.addEventListener("value-change-request", event => {
console.log(event.detail.value); // proposed new tab
console.log(event.detail.previousValue); // current tab
event.preventDefault(); // block the switch
});Event detail:
{
value: string,
previousValue: string
}Fired when the selected tab changes.
tabs.addEventListener("value-change", event => {
console.log(event.detail.value);
});Event detail:
{
value: string
}Keyboard behavior follows the WAI-ARIA tab pattern.
| Key | Action |
|---|---|
| ArrowRight | Next tab |
| ArrowLeft | Previous tab |
| Key | Action |
|---|---|
| ArrowDown | Next tab |
| ArrowUp | Previous tab |
| Key | Action |
|---|---|
| Home | First enabled tab |
| End | Last enabled tab |
Selecting a tab occurs immediately during keyboard navigation.
Arrow keys move focus only. Selection occurs when pressing:
- Enter
- Space
Disabled tabs:
- cannot be selected
- are skipped during keyboard navigation
Panels are associated using the controls attribute on x-tab.
Example:
<x-tab value="analytics" controls="panel-analytics">The container will automatically:
- show the panel for the selected tab
- hide other panels using the
hiddenattribute
x-tabs is intentionally lightweight.
Most visual styling is handled by x-tab.
--x-tabs-gap| Part | Description |
|---|---|
base |
Internal container |
x-tabs coordinates the tablist pattern.
| Element | Role |
|---|---|
| internal base | tablist |
| x-tab | tab |
| associated panels | tabpanel (user supplied) |
The component:
- preserves DOM reading order
- does not override semantics of slotted content
- applies ARIA coordination only where necessary
x-tabs introduces minimal or no motion.
Any transitions respect:
prefers-reduced-motion
<x-tabs activation="auto">
<x-tab value="overview" controls="p1">Overview</x-tab>
<x-tab value="analytics" controls="p2">Analytics</x-tab>
<x-tab value="reports" controls="p3">Reports</x-tab>
</x-tabs>
<section id="p1">Overview content</section>
<section id="p2" hidden>Analytics content</section>
<section id="p3" hidden>Reports content</section>