site-ui/src/js/04-tabs-block.js (46 lines of code) (raw):

;(function () { 'use strict' var hash = window.location.hash find('.tabset').forEach(function (tabset) { var active var tabs = tabset.querySelector('.tabs') if (tabs) { var first find('li', tabs).forEach(function (tab, idx) { var id = (tab.querySelector('a[id]') || tab).id if (!id) return var pane = getPane(id, tabset) if (!idx) first = { tab: tab, pane: pane } if (!active && hash === '#' + id && (active = true)) { tab.classList.add('is-active') if (pane) pane.classList.add('is-active') } else if (!idx) { tab.classList.remove('is-active') if (pane) pane.classList.remove('is-active') } tab.addEventListener('click', activateTab.bind({ tabset: tabset, tab: tab, pane: pane })) }) if (!active && first) { first.tab.classList.add('is-active') if (first.pane) first.pane.classList.add('is-active') } } tabset.classList.remove('is-loading') }) function activateTab (e) { var tab = this.tab var pane = this.pane find('.tabs li, .tab-pane', this.tabset).forEach(function (it) { it === tab || it === pane ? it.classList.add('is-active') : it.classList.remove('is-active') }) e.preventDefault() } function find (selector, from) { return Array.prototype.slice.call((from || document).querySelectorAll(selector)) } function getPane (id, tabset) { return find('.tab-pane', tabset).find(function (it) { return it.getAttribute('aria-labelledby') === id }) } })()