Legg til Fast-track: kondensert læringsspor uten gjentakelse

Nytt studiemodus som samler hele pensum i 5 moduler etter
eksamensstrukturen, slik at hvert begrep læres én gang i stedet
for å gjentas på tvers av ukene. Hver modul har huskeregler,
konkrete eksempler og «eksamensfeller», med fremdriftsmåler
(lest-markering lagret i localStorage), modulkort og pager.

- notes/fast-track.md: innhold i 5 moduler med HTML-callouts
- data.js: FASTTRACK-moduler + getFastTrack()
- render.js: renderFastTrackHome/-Module + modul-ekstraktor
- app.js: ruter #/fast-track og #/fast-track/N
- index.html: templates, sidebar-lenke, forside-promo
- style.css: kort, callouts, fremdrift, promo

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-05-30 21:42:16 +02:00
parent 9a7a7b9ef1
commit 3f7f5d86b1
8 changed files with 764 additions and 2 deletions

View File

@@ -11,6 +11,9 @@ function parseRoute() {
const parts = hash.split('/').filter(Boolean);
if (parts[0] === 'uke' && parts[1]) return { name: 'uke', weekId: parseInt(parts[1], 10) };
if (parts[0] === 'tema' && parts[1]) return { name: 'tema', temaId: parts[1] };
if (parts[0] === 'fast-track') {
return parts[1] ? { name: 'fasttrack-module', moduleId: parseInt(parts[1], 10) } : { name: 'fasttrack' };
}
if (parts[0] === 'tldr') return { name: 'tldr' };
if (parts[0] === 'flashcards') return { name: 'flashcards' };
if (parts[0] === 'quiz') return { name: 'quiz' };
@@ -39,6 +42,15 @@ async function route() {
const t = SMF.getTheme(r.temaId);
crumb = t ? t.label : 'Tema';
break;
case 'fasttrack':
content = await SMF.renderFastTrackHome();
crumb = 'Fast-track';
break;
case 'fasttrack-module':
content = await SMF.renderFastTrackModule(r.moduleId);
const m = SMF.getFastTrack(r.moduleId);
crumb = m ? `Fast-track · ${m.title}` : 'Fast-track';
break;
case 'tldr':
content = await SMF.renderTldr();
crumb = 'tl;dr · i farta';
@@ -78,6 +90,8 @@ function updateActiveLinks(r) {
document.querySelector('.sidebar__link[data-route="home"]')?.classList.add('sidebar__link--active');
} else if (r.name === 'tldr') {
document.querySelector('.sidebar__link[data-route="tldr"]')?.classList.add('sidebar__link--active');
} else if (r.name === 'fasttrack' || r.name === 'fasttrack-module') {
document.querySelector('.sidebar__link[data-route="fasttrack"]')?.classList.add('sidebar__link--active');
} else if (r.name === 'flashcards') {
document.querySelector('.sidebar__link[data-route="flashcards"]')?.classList.add('sidebar__link--active');
} else if (r.name === 'quiz') {