Legg til Fast-track-flashcards: 30 konsise kort + filter og dyplenke

Eget flashcard-sett (category: "fasttrack") som tester huskereglene,
skillene og eksamensfellene fra de fem Fast-track-modulene — kort og
konsist, uten ukesoverlappen.

- flashcards.json: 30 nye kort (7/5/7/7/4 per modul), alle med kort front
- flashcards.js: «Fast-track»-filter, categoryLabel, og fcInit(initialFilter)
- app.js: ruter #/flashcards/<filter> for dyplenke
- index.html: «Start flashcards →»-CTA på Fast-track-landingssiden
- style.css: stil for test-CTA

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-05-30 21:48:09 +02:00
parent 0f4370626c
commit 5b5a96d276
6 changed files with 285 additions and 5 deletions

View File

@@ -15,7 +15,7 @@ function parseRoute() {
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] === 'flashcards') return { name: 'flashcards', filter: parts[1] || null };
if (parts[0] === 'quiz') return { name: 'quiz' };
if (parts[0] === 'eksamen') return { name: 'eksamen' };
return { name: 'home' };
@@ -73,7 +73,7 @@ async function route() {
crumbCurrent.textContent = crumb;
// After DOM is in place, init relevant mode
if (r.name === 'flashcards') await SMF.fcInit();
if (r.name === 'flashcards') await SMF.fcInit(r.filter);
else if (r.name === 'quiz') await SMF.quizInit();
else if (r.name === 'eksamen') await SMF.examInit();

View File

@@ -87,6 +87,7 @@ function fcRender() {
function categoryLabel(cat) {
return {
fasttrack: 'Fast-track',
etikk: 'Etikk',
baerekraft: 'Bærekraft',
samfunn: 'Samfunnsansvar',
@@ -100,6 +101,7 @@ function fcRenderFilters() {
if (!container) return;
const filters = [
{ id: 'all', label: 'Alle' },
{ id: 'fasttrack', label: '» Fast-track' },
{ id: 'new', label: 'Nye' },
{ id: 'hard', label: 'Glemt' },
{ id: 'etikk', label: 'Etikk' },
@@ -144,8 +146,13 @@ function fcMark(level) {
fcNext();
}
async function fcInit() {
async function fcInit(initialFilter) {
await fcLoad();
// Dyplenke, f.eks. #/flashcards/fasttrack — sett startfilter hvis gyldig
if (initialFilter) {
const valid = ['all', 'fasttrack', 'new', 'hard', 'etikk', 'baerekraft', 'samfunn', 'verktoy', 'case'];
if (valid.includes(initialFilter)) fcState.filter = initialFilter;
}
fcState.cards = fcFilterCards(fcState.filter);
fcShuffle(fcState.cards);
fcState.index = 0;
@@ -177,7 +184,7 @@ async function fcInit() {
// Keyboard
const handler = (e) => {
if (location.hash !== '#/flashcards') {
if (!location.hash.startsWith('#/flashcards')) {
document.removeEventListener('keydown', handler);
return;
}