Use filing cabinet for BugHunter archive
mindflux-ci / build (push) Successful in 22s

This commit is contained in:
AliceDarkest
2026-07-13 21:22:28 +02:00
parent 64234ad84c
commit abc9e0e96d
2 changed files with 4 additions and 4 deletions
File diff suppressed because one or more lines are too long
+3 -4
View File
@@ -13,10 +13,9 @@
if (!catalog.length) { error(new Error('Zurzeit sind keine Fallakten verfügbar.')); return; } if (!catalog.length) { error(new Error('Zurzeit sind keine Fallakten verfügbar.')); return; }
selectedCase = Math.max(0, Math.min(selectedCase, catalog.length - 1)); selectedCase = Math.max(0, Math.min(selectedCase, catalog.length - 1));
const selectedHunt = catalog[selectedCase]; const selectedHunt = catalog[selectedCase];
const deck = [selectedHunt, ...catalog.filter((_, i) => i !== selectedCase)]; view.innerHTML = `<section class="bh-hero"><span class="bh-stamp">VERTRAULICH</span><span class="bh-kicker">DEBUG-FALLAKTEN</span><h1>Welche Spur verfolgst du?</h1><p>Öffne eine Akte, lies die Beweise und sichere deinen Befund Schritt für Schritt. Jede Akte bleibt so lange offen, wie du sie brauchst.</p></section><section class="bh-archive"><div class="bh-archive-head"><div><span class="bh-kicker">AKTENSCHRANK · ${catalog.length} AKTEN</span><h2>Fallarchiv</h2></div><p>Wähle eine Schublade, um die Akte zu prüfen.</p></div><div class="bh-cabinet" aria-label="Fallakten"><div class="bh-cabinet-label">BUGHUNTER · ARCHIV</div>${catalog.map((hunt, i) => `<button class="bh-drawer ${i === selectedCase ? 'active' : ''}" data-select="${i}" ${i === selectedCase ? 'aria-pressed="true"' : 'aria-pressed="false"'}><span class="bh-drawer-handle"></span><span class="bh-case-no">${esc(hunt.examScope)} · ${esc(hunt.difficulty).toUpperCase()}</span><strong>${esc(hunt.title)}</strong><small>${hunt.bugCount} Bug${hunt.bugCount === 1 ? '' : 's'} · ${hunt.fileCount} ${hunt.fileCount === 1 ? 'Datei' : 'Dateien'}</small></button>`).join('')}</div><article class="bh-case-detail"><span class="bh-stamp">AUSGEWÄHLTE AKTE</span><span class="bh-kicker">${esc(selectedHunt.examScope)} · ${esc(selectedHunt.difficulty).toUpperCase()} · ${esc(selectedHunt.language)}</span><h2>${esc(selectedHunt.title)}</h2><p>${esc(selectedHunt.description)}</p><div class="bh-tags"><span>${selectedHunt.fileCount} ${selectedHunt.fileCount === 1 ? 'Datei' : 'Dateien'}</span><span>${selectedHunt.bugCount} Bug${selectedHunt.bugCount === 1 ? '' : 's'}</span></div><button class="bh-btn primary" data-start="${esc(selectedHunt.slug)}">AKTE ÖFFNEN</button></article></section>`;
view.innerHTML = `<section class="bh-hero"><span class="bh-stamp">VERTRAULICH</span><span class="bh-kicker">DEBUG-FALLAKTEN</span><h1>Welche Spur verfolgst du?</h1><p>Öffne eine Akte, lies die Beweise und sichere deinen Befund Schritt für Schritt. Jede Akte bleibt so lange offen, wie du sie brauchst.</p></section><section class="bh-archive"><div class="bh-archive-head"><div><span class="bh-kicker">FALLARCHIV · ${catalog.length} AKTEN</span><h2>${esc(selectedHunt.title)}</h2></div><p>Klicke eine Akte an, um sie nach vorn zu holen.</p></div><div class="bh-case-deck">${deck.map((h, stackIndex) => { const originalIndex = catalog.indexOf(h), active = originalIndex === selectedCase; return `<article class="bh-case ${active ? 'active' : ''}" style="--stack:${stackIndex};--tilt:${(stackIndex % 2 ? 1 : -1) * Math.min(stackIndex, 4) * .45}deg" data-select="${originalIndex}" tabindex="0" role="button" aria-label="${esc(h.title)} öffnen"><span class="bh-case-no">${esc(h.examScope)} · ${esc(h.difficulty).toUpperCase()}</span><h2>${esc(h.title)}</h2>${active ? `<p>${esc(h.description)}</p><div class="bh-tags"><span>${esc(h.language)}</span><span>${h.fileCount} ${h.fileCount === 1 ? 'Datei' : 'Dateien'}</span><span>${h.bugCount} Bug${h.bugCount === 1 ? '' : 's'}</span></div><button class="bh-btn primary" data-start="${esc(h.slug)}">AKTE ÖFFNEN</button>` : '<span class="bh-case-peek">Zum Öffnen nach vorn holen</span>'}</article>`; }).join('')}</div></section>`; view.querySelectorAll('[data-select]').forEach(drawer => drawer.addEventListener('click', () => { selectedCase = Number(drawer.dataset.select); renderCatalog(); }));
view.querySelectorAll('[data-select]').forEach(card => { const select = () => { selectedCase = Number(card.dataset.select); renderCatalog(); }; card.addEventListener('click', event => { if (!event.target.closest('[data-start]')) select(); }); card.addEventListener('keydown', event => { if (event.key === 'Enter' || event.key === ' ') { event.preventDefault(); select(); } }); }); view.querySelector('[data-start]')?.addEventListener('click', event => begin(event.currentTarget.dataset.start));
view.querySelector('[data-start]')?.addEventListener('click', event => { event.stopPropagation(); begin(event.currentTarget.dataset.start); });
} }
function begin(slug) { api('/session/' + encodeURIComponent(slug)).then(data => { if (!data.found) throw new Error('Fallakte nicht verfügbar.'); session = data; index = 0; handoff = null; answers = session.bugs.map(() => ({locate:null, classify:null, fix:null})); started = Date.now(); renderBriefing(); }).catch(error); } function begin(slug) { api('/session/' + encodeURIComponent(slug)).then(data => { if (!data.found) throw new Error('Fallakte nicht verfügbar.'); session = data; index = 0; handoff = null; answers = session.bugs.map(() => ({locate:null, classify:null, fix:null})); started = Date.now(); renderBriefing(); }).catch(error); }
function renderBriefing() { function renderBriefing() {