Files
dgtlmoon e9e8c8d218
Build and push containers / metadata (push) Has been cancelled
Build and push containers / build-push-containers (push) Has been cancelled
Publish Python 🐍distribution 📦 to PyPI and TestPyPI / Build distribution 📦 (push) Has been cancelled
ChangeDetection.io Container Build Test / Build linux/amd64 (alpine) (push) Has been cancelled
ChangeDetection.io Container Build Test / Build linux/arm64 (alpine) (push) Has been cancelled
ChangeDetection.io Container Build Test / Build linux/amd64 (main) (push) Has been cancelled
ChangeDetection.io Container Build Test / Build linux/arm/v7 (main) (push) Has been cancelled
ChangeDetection.io Container Build Test / Build linux/arm/v8 (main) (push) Has been cancelled
ChangeDetection.io Container Build Test / Build linux/arm64 (main) (push) Has been cancelled
ChangeDetection.io App Test / lint-code (push) Has been cancelled
ChangeDetection.io App Test / lint-translations (push) Has been cancelled
Publish Python 🐍distribution 📦 to PyPI and TestPyPI / Test the built package works basically. (push) Has been cancelled
Publish Python 🐍distribution 📦 to PyPI and TestPyPI / Publish Python 🐍 distribution 📦 to PyPI (push) Has been cancelled
ChangeDetection.io App Test / test-application-3-10 (push) Has been cancelled
ChangeDetection.io App Test / test-application-3-11 (push) Has been cancelled
ChangeDetection.io App Test / test-application-3-12 (push) Has been cancelled
ChangeDetection.io App Test / test-application-3-13 (push) Has been cancelled
ChangeDetection.io App Test / test-application-3-14 (push) Has been cancelled
LLM / AI Change detection rules and Summaries
2026-04-24 15:21:09 +02:00

80 lines
2.3 KiB
JavaScript

/**
* sub-tabs.js — Vertical sub-tab switcher.
*
* Finds every .stab-shell on the page and wires up tab switching.
* The shell needs an id= attribute for localStorage persistence.
*
* HTML contract (generated by _stab.html macros):
* .stab-shell#some-id
* .stab-nav
* button.stab-btn[data-stab="foo"]
* .stab-body
* .stab-pane[data-stab="foo"]
*
* Any element inside the shell with data-stab-goto="tab-id" triggers
* navigation to that pane when clicked (for CTA buttons etc.).
*/
(function () {
'use strict';
function initShell(shell) {
var shellId = shell.id;
var storageKey = shellId ? 'stab:' + shellId : null;
var btns = Array.prototype.slice.call(shell.querySelectorAll('.stab-nav .stab-btn'));
var panes = Array.prototype.slice.call(shell.querySelectorAll('.stab-body .stab-pane'));
if (!btns.length || !panes.length) return;
var validIds = btns.map(function (b) { return b.dataset.stab; });
function activate(tabId) {
if (validIds.indexOf(tabId) === -1) return;
btns.forEach(function (b) {
b.classList.toggle('active', b.dataset.stab === tabId);
});
panes.forEach(function (p) {
p.classList.toggle('active', p.dataset.stab === tabId);
});
if (storageKey) {
try { localStorage.setItem(storageKey, tabId); } catch (e) {}
}
}
// Nav button clicks
btns.forEach(function (btn) {
btn.addEventListener('click', function () { activate(btn.dataset.stab); });
});
// data-stab-goto navigation from CTA buttons anywhere inside the shell
shell.addEventListener('click', function (e) {
var el = e.target.closest('[data-stab-goto]');
if (el && shell.contains(el)) {
e.preventDefault();
activate(el.dataset.stabGoto);
}
});
// Restore persisted tab or fall back to first tab
var stored = null;
if (storageKey) {
try { stored = localStorage.getItem(storageKey); } catch (e) {}
}
activate(stored && validIds.indexOf(stored) !== -1 ? stored : validIds[0]);
}
function initAll() {
var shells = document.querySelectorAll('.stab-shell');
shells.forEach(function (shell) { initShell(shell); });
}
if (document.readyState === 'loading') {
document.addEventListener('DOMContentLoaded', initAll);
} else {
initAll();
}
}());