Spaced Repetition Tool

Spaced Repetition Flashcard Tool

My Flashcard Deck

Question Answer Next Review Actions

Create a New Flashcard

Cards remaining: ${studyQueue.length - currentStudyCardIndex}

${card.front}
${card.back}
`; const flashcardEl = document.getElementById('currentFlashcard'); const revealBtn = document.getElementById('revealAnswerBtn'); const revealContainer = document.getElementById('revealButtonContainer'); const controls = document.getElementById('studyControls'); flashcardEl.addEventListener('click', () => { flashcardEl.classList.toggle('flipped'); }); revealBtn.addEventListener('click', () => { flashcardEl.classList.add('flipped'); revealContainer.style.display = 'none'; controls.style.display = 'block'; }); controls.addEventListener('click', (e) => { if (e.target.matches('button')) { const quality = parseInt(e.target.dataset.quality, 10); updateCard(card, quality); currentStudyCardIndex++; renderStudyCard(); } }); } // SM-2 Spaced Repetition Algorithm function updateCard(card, quality) { if (quality < 3) { // Incorrect card.interval = 0; // Reset progress } else { if (card.interval === 0) { card.interval = INTERVAL_NEW_CARD; } else { card.interval = Math.round(card.interval * card.easeFactor); } } // Update ease factor card.easeFactor = card.easeFactor + (0.1 - (5 - quality) * (0.08 + (5 - quality) * 0.02)); if (card.easeFactor < 1.3) card.easeFactor = 1.3; const now = new Date(); const daysToAdd = quality < 3 ? INTERVAL_AGAIN : card.interval; now.setDate(now.getDate() + daysToAdd); card.dueDate = now.toISOString(); // Find and update the card in the main array const originalCardIndex = flashcards.findIndex(c => c.id === card.id); if (originalCardIndex !== -1) { flashcards[originalCardIndex] = card; } saveCards(); } function downloadPDF() { if (flashcards.length === 0) { alert('No cards to download.'); return; } const { jsPDF } = window.jspdf; const doc = new jsPDF(); // --- PDF Header --- doc.setFillColor(37, 99, 235); doc.rect(0, 0, doc.internal.pageSize.getWidth(), 25, 'F'); doc.setTextColor(255, 255, 255); doc.setFont('helvetica', 'bold'); doc.setFontSize(16); doc.text('Flashcard Deck Report', doc.internal.pageSize.getWidth() / 2, 15, { align: 'center' }); // --- PDF Body --- const tableBody = flashcards.map(card => [card.front, card.back]); doc.autoTable({ startY: 35, head: [['Front (Question)', 'Back (Answer)']], body: tableBody, theme: 'grid', headStyles: { fillColor: [59, 130, 246], textColor: 255, fontStyle: 'bold', }, didDrawPage: function (data) { // --- PDF Footer --- doc.setFontSize(10); doc.setTextColor(150); doc.text(`Page ${doc.internal.getNumberOfPages()}`, doc.internal.pageSize.getWidth() / 2, doc.internal.pageSize.getHeight() - 10, { align: 'center' }); } }); doc.save('Flashcard-Deck.pdf'); } // --- Initial Load --- renderDashboard(); });
Scroll to Top