docs: publish public guides, screenshots and Git-synced portal documentation
Tests / test (push) Failing after 50s

This commit is contained in:
dh
2026-10-06 14:32:05 +00:00
parent 9fbc52ee47
commit faa905ab09
29 changed files with 1973 additions and 0 deletions
+47
View File
@@ -0,0 +1,47 @@
const menu = document.getElementById('docs-menu');
const mobile = matchMedia('(max-width:720px)');
const setMenu = () => { menu.open = !mobile.matches; };
setMenu();
mobile.addEventListener('change', setMenu);
const search = document.getElementById('doc-search');
const folders = [...menu.querySelectorAll('.nav-folder')];
let beforeSearch = null;
const normalize = value => value.toLowerCase().normalize('NFD').replace(/[\u0300-\u036f]/g, '');
search.addEventListener('input', () => {
const query = normalize(search.value.trim());
if (query && !beforeSearch) beforeSearch = new Map(folders.map(folder => [folder, folder.open]));
let count = 0;
for (const item of document.querySelectorAll('[data-search]')) {
item.hidden = !normalize(item.dataset.search).includes(query);
if (!item.hidden) count++;
}
for (const folder of folders) {
const matches = [...folder.querySelectorAll('[data-search]')].some(item => !item.hidden);
folder.parentElement.hidden = !matches;
if (query) folder.open = matches;
else if (beforeSearch) folder.open = beforeSearch.get(folder);
}
if (!query) beforeSearch = null;
for (const group of menu.querySelectorAll('section')) group.hidden = ![...group.querySelectorAll('[data-search]')].some(item => !item.hidden);
const result = document.getElementById('search-result');
result.hidden = !query;
result.textContent = count ? `${count} passende Themen` : 'Keine passenden Themen gefunden.';
});
async function syncStatus() {
const label = document.getElementById('sync-status');
try {
const response = await fetch('/docs-status.json', { cache:'no-store', credentials:'omit', signal:AbortSignal.timeout(8000) });
if (!response.ok) throw new Error();
const status = await response.json();
const date = new Date(status.lastSuccess);
if (!Number.isFinite(date.valueOf())) throw new Error();
const stale = !status.ok || Date.now() - date.valueOf() > 15 * 60 * 1000;
label.classList.toggle('warning', stale);
label.textContent = `${stale ? 'Git-Abgleich verzögert. Letzter erfolgreicher Abgleich' : 'Git zuletzt geprüft'}: ${date.toLocaleString('de-CH')}${status.drafts ? ' · neue Anleitungen noch nicht in Git veröffentlicht' : ''}.`;
} catch {
label.classList.add('warning');
label.textContent = 'Der aktuelle Git-Abgleichstatus ist nicht erreichbar. Quellstand dieser Seite siehe unten.';
}
}
syncStatus();
setInterval(() => { if (!document.hidden) syncStatus(); }, 60000);