States
| Data Attribute | Example |
|---|---|
| data-state="active" |
|
| data-disabled |
|
Variants
| Class | Example |
|---|---|
| .mdst-tabs |
|
| .mdst-tabs--pills |
|
| .mdst-tabs--compact |
|
| .mdst-tabs--vertical |
|
| .mdst-tabs--pills .mdst-tabs--compact |
|
Interactive Demo
This demo uses vanilla JS to toggle data-state attributes. The JavaScript below is
not part of modest-ui — it’s here to show how the CSS responds to state changes. Bring whatever JS you
want.
This is the overview panel. Click the tabs above to switch content.
Here are the features. Notice how the active underline and panel switch together.
Pricing information goes here. The JS is just toggling data attributes.
Demo source
const tabs = document.querySelector("#demo-tabs");
const buttons = tabs.querySelectorAll(".mdst-tab");
const panels = tabs.querySelectorAll(".mdst-tabs-panel");
buttons.forEach((btn, i) => {
btn.addEventListener("click", () => {
if (btn.hasAttribute("data-disabled")) return;
buttons.forEach(b => b.dataset.state = "inactive");
panels.forEach(p => p.dataset.state = "inactive");
btn.dataset.state = "active";
panels[i].dataset.state = "active";
});
});
Data Attribute Contract
<!-- On .mdst-tab (tab buttons) -->
data-state="active" Tab is selected
data-state="inactive" Tab is not selected
data-disabled Tab cannot be selected (boolean attribute)
data-disabled="true" Same as above (explicit value)
<!-- On .mdst-tabs-panel (content panels) -->
data-state="active" Panel is visible
data-state="inactive" Panel is hidden (display: none)
<!-- Your JS toggles these attributes to switch tabs.
modest-ui provides all the visual states. -->
Usage
<div class="mdst-tabs">
<div class="mdst-tabs-list" role="tablist">
<button class="mdst-tab" role="tab" data-state="active">Tab 1</button>
<button class="mdst-tab" role="tab" data-state="inactive">Tab 2</button>
<button class="mdst-tab" role="tab" data-state="inactive" data-disabled>Disabled</button>
</div>
<div class="mdst-tabs-panel" role="tabpanel" data-state="active">
<p>Tab 1 content</p>
</div>
<div class="mdst-tabs-panel" role="tabpanel" data-state="inactive">
<p>Tab 2 content</p>
</div>
</div>
<!-- Pills variant -->
<div class="mdst-tabs mdst-tabs--pills">...</div>
<!-- Vertical variant -->
<div class="mdst-tabs mdst-tabs--vertical">...</div>
<!-- Compact variant -->
<div class="mdst-tabs mdst-tabs--compact">...</div>