This tabs component works without JavaScript by using a combination of anchors, which point to the tabpanels, and CSS, that shows the correct tabpanel using :target
.
If JavaScript is enabled, the behavior will be enhanced and the anchors will be replaced using buttons. The implementation is roughly based on this Example of Tabs with Automative Activation on w3.org.
src/components/patterns/tabs
// src/components/patterns/tabs/schema.yaml
$schema: http://json-schema.org/draft-07/schema
$id: /patterns/tabs
additionalProperties: false
type: object
required:
- tabs
- content
properties:
heading:
type: string
format: html
description: patterns/heading
is_interactive:
$ref: /patterns/tabs/tabs-list#/properties/is_interactive
tabs:
$ref: /patterns/tabs/tabs-list#/properties/tabs
content:
type: array
items:
type: object
additionalProperties: false
required:
- content
- id
properties:
content:
type: string
format: html
description: patterns/*
id:
type: string
is_selected:
type: boolean
// src/components/patterns/tabs/mocks.yaml
$ref: patterns/tabs/tabs-list#interactive
content:
- content:
$tpl: patterns/rich-text
content: >-
<p><b>This is tab 1.</b> Aliquip quis culpa consequat officia officia
esse eu veniam minim deserunt sunt Lorem labore. Sunt incididunt veniam
aliquip exercitation cupidatat eu anim. Sit tempor ex nulla consequat
anim veniam qui aliquip nostrud. Est anim ex elit est culpa ut
consequat. Nisi minim anim id cupidatat nisi veniam do irure consectetur
irure et.</p><p>Eu reprehenderit ad aliqua do aliqua dolore amet sunt
excepteur ut ut deserunt aliquip consequat. Velit minim do officia
proident eiusmod aliquip id ut mollit. Ut amet labore nulla enim culpa
esse nisi consequat incididunt. Tempor consectetur dolore reprehenderit
eiusmod minim sint proident. Veniam laboris et nisi proident occaecat
ipsum.</p>
id: tab-1
is_selected: true
- content:
$tpl: patterns/rich-text
content: >-
<p><b>This is tab 2.</b> Aliquip quis culpa consequat officia officia
esse eu veniam minim deserunt sunt Lorem labore. Sunt incididunt veniam
aliquip exercitation cupidatat eu anim. Sit tempor ex nulla consequat
anim veniam qui aliquip nostrud. Est anim ex elit est culpa ut
consequat. Nisi minim anim id cupidatat nisi veniam do irure consectetur
irure et.</p>
id: tab-2
- content:
$tpl: patterns/rich-text
content: >-
<p><b>This is tab 3.</b> Aliquip quis culpa consequat officia officia
esse eu veniam minim deserunt sunt Lorem labore. Sunt incididunt veniam
aliquip exercitation cupidatat eu anim. Sit tempor ex nulla consequat
anim veniam qui aliquip nostrud. Est anim ex elit est culpa ut
consequat. Nisi minim anim id cupidatat nisi veniam do irure consectetur
irure et.</p><p>Eu reprehenderit ad aliqua do aliqua dolore amet sunt
excepteur ut ut deserunt aliquip consequat. Velit minim do officia
proident eiusmod aliquip id ut mollit. Ut amet labore nulla enim culpa
esse nisi consequat incididunt. Tempor consectetur dolore reprehenderit
eiusmod minim sint proident. Veniam laboris et nisi proident occaecat
ipsum.</p>
id: tab-3
$variants:
- $name: With heading
heading:
$tpl: patterns/heading
$ref: patterns/heading#h2
heading: Tabs
// src/components/patterns/tabs/tabs.twig
<div class="Tabs js-Tabs" data-js="false">
{% if heading %}
<div class="Tabs-heading">
{{ heading }}
</div>
{% endif %}
{% include "@patterns/tabs/tabs-list/tabs-list.twig" with {
is_interactive: is_interactive,
tabs: tabs,
} only %}
<div class="Tabs-tabpanels">
{% for item in content %}
<div class="Tabs-tabpanel" role="tabpanel" tabindex="0" id="{{ item.id }}" aria-labelledby="{{ item.id }}"{% if not item.is_selected %} hidden{% endif %}>
{{ item.content|raw }}
</div>
{% endfor %}
</div>
</div>
default mock data
$ref: patterns/tabs/tabs-list#interactive
content:
- content:
$tpl: patterns/rich-text
content: >-
<p><b>This is tab 1.</b> Aliquip quis culpa consequat officia officia
esse eu veniam minim deserunt sunt Lorem labore. Sunt incididunt veniam
aliquip exercitation cupidatat eu anim. Sit tempor ex nulla consequat
anim veniam qui aliquip nostrud. Est anim ex elit est culpa ut
consequat. Nisi minim anim id cupidatat nisi veniam do irure consectetur
irure et.</p><p>Eu reprehenderit ad aliqua do aliqua dolore amet sunt
excepteur ut ut deserunt aliquip consequat. Velit minim do officia
proident eiusmod aliquip id ut mollit. Ut amet labore nulla enim culpa
esse nisi consequat incididunt. Tempor consectetur dolore reprehenderit
eiusmod minim sint proident. Veniam laboris et nisi proident occaecat
ipsum.</p>
id: tab-1
is_selected: true
- content:
$tpl: patterns/rich-text
content: >-
<p><b>This is tab 2.</b> Aliquip quis culpa consequat officia officia
esse eu veniam minim deserunt sunt Lorem labore. Sunt incididunt veniam
aliquip exercitation cupidatat eu anim. Sit tempor ex nulla consequat
anim veniam qui aliquip nostrud. Est anim ex elit est culpa ut
consequat. Nisi minim anim id cupidatat nisi veniam do irure consectetur
irure et.</p>
id: tab-2
- content:
$tpl: patterns/rich-text
content: >-
<p><b>This is tab 3.</b> Aliquip quis culpa consequat officia officia
esse eu veniam minim deserunt sunt Lorem labore. Sunt incididunt veniam
aliquip exercitation cupidatat eu anim. Sit tempor ex nulla consequat
anim veniam qui aliquip nostrud. Est anim ex elit est culpa ut
consequat. Nisi minim anim id cupidatat nisi veniam do irure consectetur
irure et.</p><p>Eu reprehenderit ad aliqua do aliqua dolore amet sunt
excepteur ut ut deserunt aliquip consequat. Velit minim do officia
proident eiusmod aliquip id ut mollit. Ut amet labore nulla enim culpa
esse nisi consequat incididunt. Tempor consectetur dolore reprehenderit
eiusmod minim sint proident. Veniam laboris et nisi proident occaecat
ipsum.</p>
id: tab-3
This is tab 1. Aliquip quis culpa consequat officia officia esse eu veniam minim deserunt sunt Lorem labore. Sunt incididunt veniam aliquip exercitation cupidatat eu anim. Sit tempor ex nulla consequat anim veniam qui aliquip nostrud. Est anim ex elit est culpa ut consequat. Nisi minim anim id cupidatat nisi veniam do irure consectetur irure et.
Eu reprehenderit ad aliqua do aliqua dolore amet sunt excepteur ut ut deserunt aliquip consequat. Velit minim do officia proident eiusmod aliquip id ut mollit. Ut amet labore nulla enim culpa esse nisi consequat incididunt. Tempor consectetur dolore reprehenderit eiusmod minim sint proident. Veniam laboris et nisi proident occaecat ipsum.
This is tab 2. Aliquip quis culpa consequat officia officia esse eu veniam minim deserunt sunt Lorem labore. Sunt incididunt veniam aliquip exercitation cupidatat eu anim. Sit tempor ex nulla consequat anim veniam qui aliquip nostrud. Est anim ex elit est culpa ut consequat. Nisi minim anim id cupidatat nisi veniam do irure consectetur irure et.
This is tab 3. Aliquip quis culpa consequat officia officia esse eu veniam minim deserunt sunt Lorem labore. Sunt incididunt veniam aliquip exercitation cupidatat eu anim. Sit tempor ex nulla consequat anim veniam qui aliquip nostrud. Est anim ex elit est culpa ut consequat. Nisi minim anim id cupidatat nisi veniam do irure consectetur irure et.
Eu reprehenderit ad aliqua do aliqua dolore amet sunt excepteur ut ut deserunt aliquip consequat. Velit minim do officia proident eiusmod aliquip id ut mollit. Ut amet labore nulla enim culpa esse nisi consequat incididunt. Tempor consectetur dolore reprehenderit eiusmod minim sint proident. Veniam laboris et nisi proident occaecat ipsum.
With heading mock data
$ref: patterns/tabs/tabs-list#interactive
content:
- content:
$tpl: patterns/rich-text
content: >-
<p><b>This is tab 1.</b> Aliquip quis culpa consequat officia officia
esse eu veniam minim deserunt sunt Lorem labore. Sunt incididunt veniam
aliquip exercitation cupidatat eu anim. Sit tempor ex nulla consequat
anim veniam qui aliquip nostrud. Est anim ex elit est culpa ut
consequat. Nisi minim anim id cupidatat nisi veniam do irure consectetur
irure et.</p><p>Eu reprehenderit ad aliqua do aliqua dolore amet sunt
excepteur ut ut deserunt aliquip consequat. Velit minim do officia
proident eiusmod aliquip id ut mollit. Ut amet labore nulla enim culpa
esse nisi consequat incididunt. Tempor consectetur dolore reprehenderit
eiusmod minim sint proident. Veniam laboris et nisi proident occaecat
ipsum.</p>
id: tab-1
is_selected: true
- content:
$tpl: patterns/rich-text
content: >-
<p><b>This is tab 2.</b> Aliquip quis culpa consequat officia officia
esse eu veniam minim deserunt sunt Lorem labore. Sunt incididunt veniam
aliquip exercitation cupidatat eu anim. Sit tempor ex nulla consequat
anim veniam qui aliquip nostrud. Est anim ex elit est culpa ut
consequat. Nisi minim anim id cupidatat nisi veniam do irure consectetur
irure et.</p>
id: tab-2
- content:
$tpl: patterns/rich-text
content: >-
<p><b>This is tab 3.</b> Aliquip quis culpa consequat officia officia
esse eu veniam minim deserunt sunt Lorem labore. Sunt incididunt veniam
aliquip exercitation cupidatat eu anim. Sit tempor ex nulla consequat
anim veniam qui aliquip nostrud. Est anim ex elit est culpa ut
consequat. Nisi minim anim id cupidatat nisi veniam do irure consectetur
irure et.</p><p>Eu reprehenderit ad aliqua do aliqua dolore amet sunt
excepteur ut ut deserunt aliquip consequat. Velit minim do officia
proident eiusmod aliquip id ut mollit. Ut amet labore nulla enim culpa
esse nisi consequat incididunt. Tempor consectetur dolore reprehenderit
eiusmod minim sint proident. Veniam laboris et nisi proident occaecat
ipsum.</p>
id: tab-3
heading:
$tpl: patterns/heading
$ref: patterns/heading#h2
heading: Tabs
This is tab 1. Aliquip quis culpa consequat officia officia esse eu veniam minim deserunt sunt Lorem labore. Sunt incididunt veniam aliquip exercitation cupidatat eu anim. Sit tempor ex nulla consequat anim veniam qui aliquip nostrud. Est anim ex elit est culpa ut consequat. Nisi minim anim id cupidatat nisi veniam do irure consectetur irure et.
Eu reprehenderit ad aliqua do aliqua dolore amet sunt excepteur ut ut deserunt aliquip consequat. Velit minim do officia proident eiusmod aliquip id ut mollit. Ut amet labore nulla enim culpa esse nisi consequat incididunt. Tempor consectetur dolore reprehenderit eiusmod minim sint proident. Veniam laboris et nisi proident occaecat ipsum.
This is tab 2. Aliquip quis culpa consequat officia officia esse eu veniam minim deserunt sunt Lorem labore. Sunt incididunt veniam aliquip exercitation cupidatat eu anim. Sit tempor ex nulla consequat anim veniam qui aliquip nostrud. Est anim ex elit est culpa ut consequat. Nisi minim anim id cupidatat nisi veniam do irure consectetur irure et.
This is tab 3. Aliquip quis culpa consequat officia officia esse eu veniam minim deserunt sunt Lorem labore. Sunt incididunt veniam aliquip exercitation cupidatat eu anim. Sit tempor ex nulla consequat anim veniam qui aliquip nostrud. Est anim ex elit est culpa ut consequat. Nisi minim anim id cupidatat nisi veniam do irure consectetur irure et.
Eu reprehenderit ad aliqua do aliqua dolore amet sunt excepteur ut ut deserunt aliquip consequat. Velit minim do officia proident eiusmod aliquip id ut mollit. Ut amet labore nulla enim culpa esse nisi consequat incididunt. Tempor consectetur dolore reprehenderit eiusmod minim sint proident. Veniam laboris et nisi proident occaecat ipsum.