perf: make module loading synchronous, flip right panel layout

- Remove unnecessary async/await from loadModules (static imports)
- Move game controls to top of right panel
- Move preview header below controls, above preview
- Flip inset shadow to top of preview section
This commit is contained in:
2025-12-30 21:07:00 +01:00
parent 5905330dba
commit 31eb77c1a6
4 changed files with 21 additions and 21 deletions

View File

@@ -115,7 +115,7 @@ function toggleExpectedResult() {
// ================= LANGUAGE TOGGLE ================= // ================= LANGUAGE TOGGLE =================
async function toggleLanguage() { function toggleLanguage() {
const currentLang = getLanguage(); const currentLang = getLanguage();
const newLang = currentLang === "en" ? "de" : "en"; const newLang = currentLang === "en" ? "de" : "en";
@@ -130,7 +130,7 @@ async function toggleLanguage() {
const currentModuleId = engineState.module?.id; const currentModuleId = engineState.module?.id;
const currentLessonIndex = engineState.lessonIndex; const currentLessonIndex = engineState.lessonIndex;
const modules = await loadModules(newLang); const modules = loadModules(newLang);
lessonEngine.setModules(modules); lessonEngine.setModules(modules);
renderModuleList(elements.moduleList, modules, selectModule, selectLesson); renderModuleList(elements.moduleList, modules, selectModule, selectLesson);
@@ -261,9 +261,9 @@ function clearLoadingTimeout() {
} }
} }
async function initializeModules() { function initializeModules() {
try { try {
const modules = await loadModules(getLanguage()); const modules = loadModules(getLanguage());
lessonEngine.setModules(modules); lessonEngine.setModules(modules);
// Use the new renderModuleList function with both callbacks // Use the new renderModuleList function with both callbacks
@@ -684,7 +684,7 @@ function init() {
loadingTimeout = setTimeout(showLoadingFallback, 3000); loadingTimeout = setTimeout(showLoadingFallback, 3000);
// Load modules after editor is ready // Load modules after editor is ready
initializeModules().catch(console.error); initializeModules();
// Sidebar controls // Sidebar controls
elements.menuBtn.addEventListener("click", openSidebar); elements.menuBtn.addEventListener("click", openSidebar);

View File

@@ -86,9 +86,9 @@ const moduleStoreDE = [
/** /**
* Load all available modules for a given language * Load all available modules for a given language
* @param {string} language - Language code ('en' or 'de') * @param {string} language - Language code ('en' or 'de')
* @returns {Promise<Array>} Promise resolving to array of modules * @returns {Array} Array of modules
*/ */
export async function loadModules(language = "en") { export function loadModules(language = "en") {
const store = language === "de" ? moduleStoreDE : moduleStoreEN; const store = language === "de" ? moduleStoreDE : moduleStoreEN;
return store.map((module) => ({ return store.map((module) => ({
...module, ...module,

View File

@@ -60,18 +60,6 @@
<!-- Right Panel: Preview + Navigation --> <!-- Right Panel: Preview + Navigation -->
<div class="right-panel"> <div class="right-panel">
<div class="preview-section">
<div class="preview-wrapper">
<div class="preview-frame" id="preview-area"></div>
<div class="expected-overlay" id="expected-overlay">
<div class="expected-frame" id="preview-expected"></div>
</div>
</div>
<div class="preview-header">
<span class="preview-label" data-i18n="yourOutput">Your Output</span>
<button id="show-expected-btn" class="btn btn-small" data-i18n="showExpected">Show Expected</button>
</div>
</div>
<div class="game-controls"> <div class="game-controls">
<button id="prev-btn" class="btn" data-i18n="previous">Previous</button> <button id="prev-btn" class="btn" data-i18n="previous">Previous</button>
<span class="module-pill" id="module-pill"> <span class="module-pill" id="module-pill">
@@ -80,6 +68,18 @@
</span> </span>
<button id="next-btn" class="btn btn-primary" data-i18n="next">Next</button> <button id="next-btn" class="btn btn-primary" data-i18n="next">Next</button>
</div> </div>
<div class="preview-section">
<div class="preview-header">
<span class="preview-label" data-i18n="yourOutput">Your Output</span>
<button id="show-expected-btn" class="btn btn-small" data-i18n="showExpected">Show Expected</button>
</div>
<div class="preview-wrapper">
<div class="preview-frame" id="preview-area"></div>
<div class="expected-overlay" id="expected-overlay">
<div class="expected-frame" id="preview-expected"></div>
</div>
</div>
</div>
</div> </div>
</main> </main>

View File

@@ -496,7 +496,7 @@ code, kbd {
display: flex; display: flex;
flex-direction: column; flex-direction: column;
min-height: 0; min-height: 0;
box-shadow: inset 0 -40px 30px -30px rgba(0, 0, 0, 0.08); box-shadow: inset 0 40px 30px -30px rgba(0, 0, 0, 0.08);
} }
.preview-header { .preview-header {
@@ -607,7 +607,7 @@ code, kbd {
align-items: center; align-items: center;
padding: var(--spacing-md); padding: var(--spacing-md);
background: var(--panel-bg); background: var(--panel-bg);
border-top: 1px solid var(--border-color); border-bottom: 1px solid var(--border-color);
} }
/* ================= SIDEBAR ================= */ /* ================= SIDEBAR ================= */