Tabs

CSS-only via radio inputs + :has() panel routing. Works without JavaScript; full ARIA needs JS with aria-controls.

Default (underline)

Minimal content-first CSS library.
npm install litura
See the README for all classes.
<div class="tabs" role="tablist">
  <div class="tabs__list">
    <input type="radio" name="x" id="t1" class="tabs__input" checked>
    <label for="t1" class="tabs__tab" role="tab">One</label>
    <input type="radio" name="x" id="t2" class="tabs__input">
    <label for="t2" class="tabs__tab" role="tab">Two</label>
  </div>
  <div class="tabs__panel" data-for="t1" role="tabpanel">…</div>
  <div class="tabs__panel" data-for="t2" role="tabpanel">…</div>
</div>

Pills

Daily view
Weekly view
Monthly view
<div class="tabs tabs--pills" role="tablist">…</div>

Vertical

Panel 1
Panel 2
Panel 3
<div class="tabs tabs--vertical">…</div>

Modifiers

ClassEffect
.tabsBase container.
.tabs--pillsRounded pills; selected fills with accent.
.tabs--verticalVertical list with right-side indicator.
.tabs__listContainer for input+label pairs.
.tabs__inputHidden radio input (one per tab).
.tabs__tabClickable label (rendered tab).
.tabs__panel[data-for="id"]Panel shown when matching input is :checked.

Note: The CSS routes panels for IDs t1t6 out of the box. For unique IDs, extend the :has selector in components/tabs.css.