Tabs <l-tabs>
Tabs organize content into panels, showing one at a time. Progressive enhancement — plain HTML is enhanced with ARIA roles, keyboard navigation, and an animated indicator.
<l-tabs>Options
Enclosed variant
Add variant="enclosed" for a pill-shaped tablist with a sliding background indicator.
Code
<l-tabs variant="enclosed">
<div>
<button name="account">Account</button>
<button name="password">Password</button>
<button name="notifications">Notifications</button>
</div>
<div class="p-4 text-sm text-color-secondary">Make changes to your account here.</div>
<div class="p-4 text-sm text-color-secondary">Change your password here.</div>
<div class="p-4 text-sm text-color-secondary">Manage your notification preferences.</div>
</l-tabs>Line variant
Add variant="line" for a tablist with a sliding underline indicator.
Code
<l-tabs variant="line">
<div>
<button name="account">Account</button>
<button name="password">Password</button>
<button name="notifications">Notifications</button>
</div>
<div class="p-4 text-sm text-color-secondary">Make changes to your account here.</div>
<div class="p-4 text-sm text-color-secondary">Change your password here.</div>
<div class="p-4 text-sm text-color-secondary">Manage your notification preferences.</div>
</l-tabs>Full width
Add full-width to stretch tabs across the container.
Code
<l-tabs
variant="enclosed"
full-width
>
<div>
<button name="account">Account</button>
<button name="password">Password</button>
<button name="notifications">Notifications</button>
</div>
<div class="p-4 text-sm text-color-secondary">Make changes to your account here.</div>
<div class="p-4 text-sm text-color-secondary">Change your password here.</div>
<div class="p-4 text-sm text-color-secondary">Manage your notification preferences.</div>
</l-tabs>Default active tab
Set value="1" to activate a specific tab on load (0-based index).
Code
<l-tabs
variant="enclosed"
value="1"
>
<div>
<button name="account">Account</button>
<button name="password">Password</button>
<button name="notifications">Notifications</button>
</div>
<div class="p-4 text-sm text-color-secondary">Make changes to your account here.</div>
<div class="p-4 text-sm text-color-secondary">Change your password here.</div>
<div class="p-4 text-sm text-color-secondary">Manage your notification preferences.</div>
</l-tabs>Accessibility
Criteria
- Role
First child div gets
role="tablist", buttons getrole="tab", remaining divs getrole="tabpanel"WCAG4.1.2RGAA7.1- Linked controls
Each tab has
aria-controlspointing to its panel; each panel hasaria-labelledbypointing back to its tabWCAG1.3.1- Selection state
Active tab has
aria-selected="true"; inactive tabs havearia-selected="false"WCAG4.1.2- Focus management
Roving tabindex — active tab has
tabindex="0", otherstabindex="-1". Panels havetabindex="0"for keyboard accessWCAG2.1.1RGAA12.13- Hidden content
Inactive panels use the
hiddenattributeWCAG1.3.2- Motion
Indicator animation respects
prefers-reduced-motionWCAG2.3.3
Keyboard interactions
API reference
Importing
import 'luxen-ui/tabs';@import 'luxen-ui/css/tabs/enclosed';@import 'luxen-ui/css/tabs/line';Attributes & Properties
variant="enclosed"Attribute- Pill-shaped tablist with sliding background indicator
variant="line"Attribute- Tablist with sliding underline indicator
valueAttribute- Active tab index (0-based string). Default
"0" full-widthAttribute- Stretches tabs to fill the container width
orientation="horizontal"Attribute- Horizontal tab layout (default). Arrow Left/Right navigate
orientation="vertical"Attribute- Vertical tab layout. Arrow Up/Down navigate
Events
changeEvent- Fires when the active tab changes.
e.detail.index(number) ande.detail.name(buttonnameattribute ornull)
CSS custom properties
--_durationName- Indicator animation duration (default:
150ms,0mswith reduced motion) --_easingName- Indicator animation easing (default:
cubic-bezier(0.25, 0.1, 0.25, 1))