feat: add module pill indicator and cross-module navigation

- Add module title pill above lesson title showing current category
- Enable next/prev buttons to cross module boundaries
- Automatically advance to next module when completing last lesson
- Go to last lesson of previous module when navigating back

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
2025-12-25 15:25:39 +01:00
parent d799ced207
commit 2f48917f3a
5 changed files with 83 additions and 6 deletions

View File

@@ -18,6 +18,7 @@ const elements = {
helpBtn: document.getElementById("help-btn"),
// Left panel
modulePill: document.getElementById("module-pill"),
lessonTitle: document.getElementById("lesson-title"),
lessonDescription: document.getElementById("lesson-description"),
taskInstruction: document.getElementById("task-instruction"),
@@ -266,6 +267,11 @@ function loadCurrentLesson() {
// Update UI based on mode
updateEditorForMode(mode);
// Update module pill with category name
if (elements.modulePill && engineState.module) {
elements.modulePill.textContent = engineState.module.title;
}
// Reset any success indicators
resetSuccessIndicators();
@@ -362,19 +368,39 @@ function updateNavigationButtons() {
}
function nextLesson() {
const prevModuleId = lessonEngine.getCurrentState().module?.id;
const success = lessonEngine.nextLesson();
if (success) {
const newModuleId = lessonEngine.getCurrentState().module?.id;
if (newModuleId !== prevModuleId) {
updateModuleHighlight(newModuleId);
}
loadCurrentLesson();
}
}
function prevLesson() {
const prevModuleId = lessonEngine.getCurrentState().module?.id;
const success = lessonEngine.previousLesson();
if (success) {
const newModuleId = lessonEngine.getCurrentState().module?.id;
if (newModuleId !== prevModuleId) {
updateModuleHighlight(newModuleId);
}
loadCurrentLesson();
}
}
function updateModuleHighlight(moduleId) {
const moduleItems = elements.moduleList.querySelectorAll(".module-header");
moduleItems.forEach((item) => {
item.classList.remove("active");
if (item.dataset.moduleId === moduleId) {
item.classList.add("active");
}
});
}
// ================= CODE EXECUTION =================
function resetCode() {