Tabs Component Breakdown
Overview
The dd-tabs component provides a tabbed interface for organizing content into switchable panels. It supports desktop navigation and a mobile dropdown menu, with ARIA attributes for accessibility, making it suitable for FAQs, product details, or multi-section content without page reloads.
This component is ideal for content-heavy pages where space-saving is key. In WordPress, configure it via ACF repeater fields for tab items (e.g., label, content, links). In Drupal, use a Paragraph type with fields for tab titles and bodies, rendered with unique data-id for scoping multiple instances.
Basic Usage
Wrap tabs in a div with class dd-tabs and a unique data-id. Include navigation with menu items (ARIA roles) and content panels with aria-hidden and role="tabpanel".
Preview
tab panel 001
tab panel 002
tab panel 003
Code
<div class="dd-tabs" data-id="003">
<div class="dd-tabs__content dd-g">
<ul class="dd-tabs__menu dd-g" role="tablist">
<li class="dd-tabs__menu-item" role="presentation">
<a class="dd-tabs__menu-link -active" id="tab-001" role="tab" aria-selected="true" aria-controls="tabpanel-001">open tab 1</a>
</li>
<li class="dd-tabs__menu-item" role="presentation">
<a href="#tab-002" class="dd-tabs__menu-link" id="tab-002" role="tab" aria-selected="false" aria-controls="tabpanel-002">open tab 2</a>
</li>
<li class="dd-tabs__menu-item" role="presentation">
<a href="#tab-003" class="dd-tabs__menu-link" id="tab-003" role="tab" aria-selected="false" aria-controls="tabpanel-003">open tab 3</a>
</li>
</ul>
<div class="dd-tabs__items dd-g">
<div class="dd-tabs__item dd-u-1-1 -active" role="tabpanel" id="tabpanel-001" aria-hidden="false" aria-labelledby="tab-001">
<p>tab panel 001</p>
</div>
<div class="dd-tabs__item dd-u-1-1" role="tabpanel" id="tabpanel-002" aria-hidden="false" aria-labelledby="tab-002">
<p>tab panel 002</p>
</div>
<div class="dd-tabs__item dd-u-1-1" role="tabpanel" id="tabpanel-003" aria-hidden="false" aria-labelledby="tab-003">
<p>tab panel 003</p>
</div>
</div>
</div>
</div>
Use unique IDs for tabs and panels; JS handles switching and mobile toggle.
CSS Modifiers (from _dd_tabs.scss)
The SCSS file defines base styles for tabs, including responsive navigation (hidden menu on mobile), active states, and overflow handling. Key modifiers include:
- -active: Applied to active menu items and panels for visibility and styling.
- -horizontal: Adjusts for horizontal tab layouts if extended.
- -vertical: For vertical tab orientations (sidebar style).
- Utility classes like SAL data attributes (e.g., data-sal="fade") for panel animations.
Associated JavaScript (from dd_tabs.js)
The component includes a JS file handling mobile menu toggle and tab switching with ARIA updates. Key features:
- Toggles -active class on mobile menu open/close.
- Switches tabs on click, updating aria-selected, aria-hidden, and active classes, scoped by aria-controls.
- Updates mobile placeholder text to current tab label.
- Supports multiple tab groups on a page via aria-controls and panel ID.
Include the JS via your CMS: In WordPress, enqueue in functions.php; in Drupal, attach via libraries.yml.
For ACF/Paragraphs integration, generate unique aria-controls from fields.
Framework files
- source/js/components/_dd_tabs.js (javascript)
- source/scss/components/_dd_tabs.scss (styles)
Accessibility and Best Practices
Use ARIA roles (tablist, tab, tabpanel) and attributes (aria-selected, aria-controls, aria-labelledby, aria-hidden). Ensure keyboard navigation (focus on tabs, enter/space to activate). Test with screen readers for announcements. In CMS, require unique labels and validate content for empty panels.