Implementiere responsive linke Sidebar-Navigation für alle 27 Kapitel und das Hauptportal

This commit is contained in:
Alex Mueller 2026-08-29 15:54:05 +02:00
parent 5045b74145
commit 989ccb4f6d
34 changed files with 497 additions and 2 deletions

View file

@ -10,5 +10,5 @@
"streak_tage": 1,
"letzter_aktiver_tag": "2026-08-29",
"historie": [],
"zuletzt_aktualisiert": "2026-08-29T15:50:41.498015"
"zuletzt_aktualisiert": "2026-08-29T15:54:00.836247"
}

View file

@ -11,7 +11,7 @@ window.GAMIFICATION_DATA = {
"streak_tage": 1,
"letzter_aktiver_tag": "2026-08-29",
"historie": [],
"zuletzt_aktualisiert": "2026-08-29T15:50:41.498015"
"zuletzt_aktualisiert": "2026-08-29T15:54:00.836247"
};
window.GAMIFICATION_BADGES_KATALOG = {
"rechenkonegin": {

179
assets/sidebar.js Normal file
View file

@ -0,0 +1,179 @@
/**
* 🧭 NEXT-GEN SIDEBAR NAVIGATION & APP LAYOUT 🧭
* ===============================================
* Erzeugt eine moderne, responsive Sidebar auf der linken Seite
* für das Hauptportal und alle 27 Kapitel-Seiten.
*/
(function () {
const LEHRPFADE = [
{
id: "lehrpfad_1",
title: "🌱 Lehrpfad 1: Grundlagen",
badge: "G01–G10",
color: "#059669",
items: [
{ id: "01_erste_schritte_taschenrechner", num: "G01", icon: "🧮", title: "Taschenrechner", path: "lehrpfad_1_grundlagen/01_erste_schritte_taschenrechner/index.html" },
{ id: "02_variablen_und_datentypen", num: "G02", icon: "📦", title: "Variablen & Typen", path: "lehrpfad_1_grundlagen/02_variablen_und_datentypen/index.html" },
{ id: "03_ein_und_ausgabe", num: "G03", icon: "💬", title: "Ein- & Ausgabe", path: "lehrpfad_1_grundlagen/03_ein_und_ausgabe/index.html" },
{ id: "04_verzweigungen_und_bedingungen", num: "G04", icon: "🚦", title: "Bedingungen (if)", path: "lehrpfad_1_grundlagen/04_verzweigungen_und_bedingungen/index.html" },
{ id: "05_schleifen_und_wiederholungen", num: "G05", icon: "🎡", title: "Schleifen (for/while)", path: "lehrpfad_1_grundlagen/05_schleifen_und_wiederholungen/index.html" },
{ id: "06_funktionen_und_module", num: "G06", icon: "🪄", title: "Funktionen & Module", path: "lehrpfad_1_grundlagen/06_funktionen_und_module/index.html" },
{ id: "07_listen_und_sequenzen", num: "G07", icon: "📋", title: "Listen & Sequenzen", path: "lehrpfad_1_grundlagen/07_listen_und_sequenzen/index.html" },
{ id: "08_textverarbeitung_und_strings", num: "G08", icon: "🔤", title: "String-Methoden", path: "lehrpfad_1_grundlagen/08_textverarbeitung_und_strings/index.html" },
{ id: "09_dictionaries_und_sets", num: "G09", icon: "🗃️", title: "Dicts & Sets", path: "lehrpfad_1_grundlagen/09_dictionaries_und_sets/index.html" },
{ id: "10_comprehensions_datum_algorithmen", num: "G10", icon: "🚀", title: "Comprehensions", path: "lehrpfad_1_grundlagen/10_comprehensions_datum_algorithmen/index.html" },
]
},
{
id: "lehrpfad_2",
title: "🏗️ Lehrpfad 2: OOP Einstieg",
badge: "00–06",
color: "#4f46e5",
items: [
{ id: "00_fehlersuche_und_grundlagen", num: "00", icon: "🔍", title: "Fehlersuche & Debugging", path: "lehrpfad_2_oop_einstieg/00_fehlersuche_und_grundlagen/index.html" },
{ id: "01_einstieg_klassen", num: "01", icon: "🏗️", title: "Einstieg in Klassen", path: "lehrpfad_2_oop_einstieg/01_einstieg_klassen/index.html" },
{ id: "02_init_und_self", num: "02", icon: "⚙️", title: "Konstruktor & self", path: "lehrpfad_2_oop_einstieg/02_init_und_self/index.html" },
{ id: "03_methoden_und_verhalten", num: "03", icon: "🏎️", title: "Methoden & Verhalten", path: "lehrpfad_2_oop_einstieg/03_methoden_und_verhalten/index.html" },
{ id: "04_str_und_darstellung", num: "04", icon: "🧾", title: "__str__ Darstellung", path: "lehrpfad_2_oop_einstieg/04_str_und_darstellung/index.html" },
{ id: "04b_umstieg_vscode", num: "04b", icon: "💻", title: "VS Code Setup", path: "lehrpfad_2_oop_einstieg/04b_umstieg_vscode/index.html" },
{ id: "04c_git_und_versionskontrolle", num: "04c", icon: "🌿", title: "Git-Versionskontrolle", path: "lehrpfad_2_oop_einstieg/04c_git_und_versionskontrolle/index.html" },
{ id: "05_objekte_kombinieren", num: "05", icon: "🎵", title: "Objekte kombinieren", path: "lehrpfad_2_oop_einstieg/05_objekte_kombinieren/index.html" },
{ id: "06_abschlussprojekt_tamagotchi", num: "06", icon: "🥚", title: "Projekt: Tamagotchi", path: "lehrpfad_2_oop_einstieg/06_abschlussprojekt_tamagotchi/index.html" },
]
},
{
id: "lehrpfad_3",
title: "🚀 Lehrpfad 3: Fortgeschritten",
badge: "07–16",
color: "#7c3aed",
items: [
{ id: "07_referenzen_und_speicher", num: "07", icon: "🧠", title: "Referenzen & Speicher", path: "lehrpfad_3_fortgeschrittenes_oop/07_referenzen_und_speicher/index.html" },
{ id: "08_operator_overloading_dunder", num: "08", icon: "➕", title: "Operator Overloading", path: "lehrpfad_3_fortgeschrittenes_oop/08_operator_overloading_dunder/index.html" },
{ id: "09_eigene_unit_tests_schreiben", num: "09", icon: "🧪", title: "Unit Tests & TDD", path: "lehrpfad_3_fortgeschrittenes_oop/09_eigene_unit_tests_schreiben/index.html" },
{ id: "10_vererbung_und_super", num: "10", icon: "🧬", title: "Vererbung & super()", path: "lehrpfad_3_fortgeschrittenes_oop/10_vererbung_und_super/index.html" },
{ id: "11_polymorphie_und_interfaces", num: "11", icon: "🎭", title: "Polymorphie", path: "lehrpfad_3_fortgeschrittenes_oop/11_polymorphie_und_interfaces/index.html" },
{ id: "12_exceptions_und_fehlerbehandlung", num: "12", icon: "🛡️", title: "Exceptions & Fehler", path: "lehrpfad_3_fortgeschrittenes_oop/12_exceptions_und_fehlerbehandlung/index.html" },
{ id: "13_persistenz_json_und_csv", num: "13", icon: "💾", title: "Persistenz (JSON/CSV)", path: "lehrpfad_3_fortgeschrittenes_oop/13_persistenz_json_und_csv/index.html" },
{ id: "14_gui_mit_tkinter", num: "14", icon: "🖥️", title: "Desktop-GUIs (Tkinter)", path: "lehrpfad_3_fortgeschrittenes_oop/14_gui_mit_tkinter/index.html" },
{ id: "15_parameter_und_container", num: "15", icon: "🎒", title: "Container & *args", path: "lehrpfad_3_fortgeschrittenes_oop/15_parameter_und_container/index.html" },
{ id: "16_master_abschlussprojekt", num: "16", icon: "🏆", title: "Master-Abschlussprojekt", path: "lehrpfad_3_fortgeschrittenes_oop/16_master_abschlussprojekt/index.html" },
]
}
];
function detectRootPrefix() {
const p = window.location.pathname;
if (p.includes("/lehrpfad_1_grundlagen/") || p.includes("/lehrpfad_2_oop_einstieg/") || p.includes("/lehrpfad_3_fortgeschrittenes_oop/")) {
return "../../";
}
return "./";
}
function initSidebar() {
if (document.querySelector(".app-sidebar")) return;
const prefix = detectRootPrefix();
const currentPath = window.location.pathname;
const isRoot = prefix === "./";
// Gamification Data
const gData = window.GAMIFICATION_DATA || { xp: 0, level: 1, titel: "Code-Küken 🐣", geloeste_kapitel: [] };
const solvedSet = new Set(gData.geloeste_kapitel || []);
// 1. Erstelle Drawer-Toggle Button für Mobile
const toggleBtn = document.createElement("button");
toggleBtn.type = "button";
toggleBtn.className = "sidebar-mobile-toggle";
toggleBtn.innerHTML = "<span>☰ Menü</span>";
document.body.prepend(toggleBtn);
// 2. Erstelle Overlay für Mobile
const overlay = document.createElement("div");
overlay.className = "sidebar-overlay";
document.body.prepend(overlay);
// 3. Erstelle Sidebar Container
const sidebar = document.createElement("aside");
sidebar.className = "app-sidebar";
let tracksHtml = "";
LEHRPFADE.forEach(track => {
let itemsHtml = "";
track.items.forEach(item => {
const fullLink = prefix + item.path;
const isActive = currentPath.includes(item.id);
const isSolved = solvedSet.has(item.path.replace("/index.html", ""));
itemsHtml += `
<a href="${fullLink}" class="sidebar-item ${isActive ? 'active' : ''}">
<span class="sidebar-item-icon">${item.icon}</span>
<span class="sidebar-item-text">${item.num}. ${item.title}</span>
${isSolved ? '<span class="sidebar-solved-badge" title="Gelöst!">✅</span>' : ''}
</a>
`;
});
tracksHtml += `
<div class="sidebar-section">
<div class="sidebar-section-header">
<span>${track.title}</span>
<span class="sidebar-section-badge" style="background: ${track.color}22; color: ${track.color};">${track.badge}</span>
</div>
<div class="sidebar-nav-list">
${itemsHtml}
</div>
</div>
`;
});
sidebar.innerHTML = `
<div class="sidebar-brand">
<a href="${prefix}index.html" class="sidebar-brand-link">
<div class="sidebar-brand-logo">🐍</div>
<div>
<div class="sidebar-brand-title">Python Lernportal</div>
<div class="sidebar-brand-sub">Interaktiver Kurs</div>
</div>
</a>
</div>
<div class="sidebar-quick-nav">
<a href="${prefix}index.html#tutorial" class="sidebar-quick-link">📖 Anleitung & Workflow</a>
<a href="${prefix}index.html#python-live-playground" class="sidebar-quick-link">⚡ Live-Playground</a>
<a href="${prefix}index.html#error-interpreter-widget" class="sidebar-quick-link">🩺 Fehler-Dolmetscher</a>
<a href="${prefix}index.html#zertifikate" class="sidebar-quick-link">🏆 Zertifikate</a>
</div>
<div class="sidebar-content">
${tracksHtml}
</div>
<div class="sidebar-footer">
<div class="sidebar-user-card">
<div class="sidebar-user-avatar">🐣</div>
<div class="sidebar-user-info">
<div class="sidebar-user-name">Level ${gData.level || 1}</div>
<div class="sidebar-user-title">${gData.titel || "Code-Küken"}</div>
</div>
<div class="sidebar-user-xp">${gData.xp || 0} XP</div>
</div>
</div>
`;
document.body.prepend(sidebar);
// Toggle Events
toggleBtn.addEventListener("click", () => {
sidebar.classList.toggle("open");
overlay.classList.toggle("active");
});
overlay.addEventListener("click", () => {
sidebar.classList.remove("open");
overlay.classList.remove("active");
});
}
document.addEventListener("DOMContentLoaded", initSidebar);
})();

View file

@ -1197,3 +1197,289 @@ summary:hover {
.hud-stats { width: 100%; justify-content: space-between; }
.roadmap-grid { grid-template-columns: 1fr; }
}
/* ==========================================================================
APP LAYOUT & LEFT SIDEBAR NAVIGATION
========================================================================== */
body {
padding-left: 300px;
transition: padding-left var(--transition-smooth);
}
.app-sidebar {
width: 300px;
height: 100vh;
position: fixed;
top: 0;
left: 0;
background: #090d16;
color: #f8fafc;
border-right: 1px solid rgba(255, 255, 255, 0.08);
display: flex;
flex-direction: column;
z-index: 1000;
overflow: hidden;
box-shadow: var(--shadow-lg);
}
.sidebar-brand {
padding: 20px 22px;
border-bottom: 1px solid rgba(255, 255, 255, 0.08);
background: rgba(255, 255, 255, 0.02);
}
.sidebar-brand-link {
display: flex;
align-items: center;
gap: 12px;
text-decoration: none;
color: white;
}
.sidebar-brand-logo {
font-size: 1.8rem;
background: rgba(99, 102, 241, 0.2);
border: 1px solid rgba(99, 102, 241, 0.4);
width: 42px;
height: 42px;
border-radius: var(--radius-sm);
display: flex;
align-items: center;
justify-content: center;
}
.sidebar-brand-title {
font-size: 1.05rem;
font-weight: 800;
color: #ffffff;
letter-spacing: -0.01em;
}
.sidebar-brand-sub {
font-size: 0.75rem;
color: #94a3b8;
text-transform: uppercase;
letter-spacing: 0.5px;
}
.sidebar-quick-nav {
padding: 12px 16px;
display: flex;
flex-direction: column;
gap: 4px;
border-bottom: 1px solid rgba(255, 255, 255, 0.08);
background: rgba(0, 0, 0, 0.2);
}
.sidebar-quick-link {
color: #94a3b8;
text-decoration: none;
font-size: 0.82rem;
font-weight: 600;
padding: 6px 10px;
border-radius: var(--radius-sm);
transition: all var(--transition-fast);
}
.sidebar-quick-link:hover {
background: rgba(255, 255, 255, 0.08);
color: #ffffff;
}
.sidebar-content {
flex: 1;
overflow-y: auto;
padding: 16px 14px;
display: flex;
flex-direction: column;
gap: 20px;
}
.sidebar-content::-webkit-scrollbar {
width: 5px;
}
.sidebar-content::-webkit-scrollbar-thumb {
background: rgba(255, 255, 255, 0.15);
border-radius: 3px;
}
.sidebar-section {
display: flex;
flex-direction: column;
gap: 6px;
}
.sidebar-section-header {
display: flex;
justify-content: space-between;
align-items: center;
font-size: 0.78rem;
font-weight: 800;
color: #94a3b8;
text-transform: uppercase;
letter-spacing: 0.6px;
padding: 4px 8px;
}
.sidebar-section-badge {
padding: 2px 6px;
border-radius: var(--radius-full);
font-size: 0.7rem;
font-weight: 800;
}
.sidebar-nav-list {
display: flex;
flex-direction: column;
gap: 3px;
}
.sidebar-item {
display: flex;
align-items: center;
gap: 10px;
padding: 8px 12px;
border-radius: var(--radius-sm);
color: #cbd5e1;
text-decoration: none;
font-size: 0.86rem;
font-weight: 600;
transition: all var(--transition-fast);
border-left: 3px solid transparent;
}
.sidebar-item:hover {
background: rgba(255, 255, 255, 0.06);
color: #ffffff;
border-left-color: rgba(255, 255, 255, 0.3);
}
.sidebar-item.active {
background: rgba(99, 102, 241, 0.18);
color: #ffffff;
border-left-color: var(--primary);
font-weight: 700;
}
.sidebar-item-icon {
font-size: 1rem;
flex-shrink: 0;
}
.sidebar-item-text {
flex: 1;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
.sidebar-solved-badge {
font-size: 0.78rem;
}
.sidebar-footer {
padding: 14px 16px;
border-top: 1px solid rgba(255, 255, 255, 0.08);
background: rgba(0, 0, 0, 0.3);
}
.sidebar-user-card {
display: flex;
align-items: center;
gap: 10px;
}
.sidebar-user-avatar {
font-size: 1.4rem;
background: rgba(99, 102, 241, 0.2);
width: 36px;
height: 36px;
border-radius: 50%;
display: flex;
align-items: center;
justify-content: center;
border: 1px solid var(--primary);
}
.sidebar-user-info {
flex: 1;
}
.sidebar-user-name {
font-size: 0.85rem;
font-weight: 800;
color: white;
}
.sidebar-user-title {
font-size: 0.72rem;
color: #94a3b8;
}
.sidebar-user-xp {
font-size: 0.82rem;
font-weight: 800;
color: #38bdf8;
}
/* Mobile Drawer Toggle & Overlay */
.sidebar-mobile-toggle {
display: none;
position: fixed;
bottom: 20px;
left: 20px;
z-index: 1001;
background: var(--primary-gradient);
color: white;
border: none;
padding: 12px 20px;
border-radius: var(--radius-full);
font-size: 0.95rem;
font-weight: 800;
cursor: pointer;
box-shadow: var(--shadow-xl);
backdrop-filter: blur(8px);
}
.sidebar-overlay {
display: none;
position: fixed;
top: 0;
left: 0;
right: 0;
bottom: 0;
background: rgba(15, 23, 42, 0.7);
backdrop-filter: blur(4px);
z-index: 999;
opacity: 0;
transition: opacity var(--transition-normal);
}
.sidebar-overlay.active {
display: block;
opacity: 1;
}
@media (max-width: 1024px) {
body {
padding-left: 0;
}
.app-sidebar {
transform: translateX(-100%);
transition: transform var(--transition-smooth);
}
.app-sidebar.open {
transform: translateX(0);
}
.sidebar-mobile-toggle {
display: inline-flex;
align-items: center;
gap: 6px;
}
}

View file

@ -848,5 +848,6 @@ object has no attribute 'gang'</code></pre>
<script src="assets/parsons.js"></script>
<script src="assets/runner.js"></script>
<script src="assets/ui_enhancements.js"></script>
<script src="assets/sidebar.js"></script>
</body>
</html>

View file

@ -322,5 +322,6 @@
<script src="../../assets/parsons.js"></script>
<script src="../../assets/interpreter.js"></script>
<script src="../../assets/ui_enhancements.js"></script>
<script src="../../assets/sidebar.js"></script>
</body>
</html>

View file

@ -273,5 +273,6 @@
<script src="../../assets/parsons.js"></script>
<script src="../../assets/interpreter.js"></script>
<script src="../../assets/ui_enhancements.js"></script>
<script src="../../assets/sidebar.js"></script>
</body>
</html>

View file

@ -276,5 +276,6 @@ return f"Steckbrief: {name} | Größe: {groesse_m:.2f} m | Gewicht: {gewicht_kg:
<script src="../../assets/parsons.js"></script>
<script src="../../assets/interpreter.js"></script>
<script src="../../assets/ui_enhancements.js"></script>
<script src="../../assets/sidebar.js"></script>
</body>
</html>

View file

@ -308,5 +308,6 @@ return False</code></pre>
<script src="../../assets/parsons.js"></script>
<script src="../../assets/interpreter.js"></script>
<script src="../../assets/ui_enhancements.js"></script>
<script src="../../assets/sidebar.js"></script>
</body>
</html>

View file

@ -349,5 +349,6 @@
<script src="../../assets/parsons.js"></script>
<script src="../../assets/interpreter.js"></script>
<script src="../../assets/ui_enhancements.js"></script>
<script src="../../assets/sidebar.js"></script>
</body>
</html>

View file

@ -302,5 +302,6 @@
<script src="../../assets/parsons.js"></script>
<script src="../../assets/interpreter.js"></script>
<script src="../../assets/ui_enhancements.js"></script>
<script src="../../assets/sidebar.js"></script>
</body>
</html>

View file

@ -293,5 +293,6 @@
<script src="../../assets/parsons.js"></script>
<script src="../../assets/interpreter.js"></script>
<script src="../../assets/ui_enhancements.js"></script>
<script src="../../assets/sidebar.js"></script>
</body>
</html>

View file

@ -248,5 +248,6 @@
<script src="../../assets/parsons.js"></script>
<script src="../../assets/interpreter.js"></script>
<script src="../../assets/ui_enhancements.js"></script>
<script src="../../assets/sidebar.js"></script>
</body>
</html>

View file

@ -322,5 +322,6 @@
<script src="../../assets/parsons.js"></script>
<script src="../../assets/interpreter.js"></script>
<script src="../../assets/ui_enhancements.js"></script>
<script src="../../assets/sidebar.js"></script>
</body>
</html>

View file

@ -272,5 +272,6 @@
<script src="../../assets/parsons.js"></script>
<script src="../../assets/interpreter.js"></script>
<script src="../../assets/ui_enhancements.js"></script>
<script src="../../assets/sidebar.js"></script>
</body>
</html>

View file

@ -226,5 +226,6 @@
<script src="../../assets/parsons.js"></script>
<script src="../../assets/interpreter.js"></script>
<script src="../../assets/ui_enhancements.js"></script>
<script src="../../assets/sidebar.js"></script>
</body>
</html>

View file

@ -308,5 +308,6 @@
<script src="../../assets/parsons.js"></script>
<script src="../../assets/interpreter.js"></script>
<script src="../../assets/ui_enhancements.js"></script>
<script src="../../assets/sidebar.js"></script>
</body>
</html>

View file

@ -235,5 +235,6 @@
<script src="../../assets/parsons.js"></script>
<script src="../../assets/interpreter.js"></script>
<script src="../../assets/ui_enhancements.js"></script>
<script src="../../assets/sidebar.js"></script>
</body>
</html>

View file

@ -215,5 +215,6 @@
<script src="../../assets/parsons.js"></script>
<script src="../../assets/interpreter.js"></script>
<script src="../../assets/ui_enhancements.js"></script>
<script src="../../assets/sidebar.js"></script>
</body>
</html>

View file

@ -222,5 +222,6 @@
<script src="../../assets/parsons.js"></script>
<script src="../../assets/interpreter.js"></script>
<script src="../../assets/ui_enhancements.js"></script>
<script src="../../assets/sidebar.js"></script>
</body>
</html>

View file

@ -332,5 +332,6 @@ sudo snap install --classic code</code></pre>
<script src="../../assets/parsons.js"></script>
<script src="../../assets/interpreter.js"></script>
<script src="../../assets/ui_enhancements.js"></script>
<script src="../../assets/sidebar.js"></script>
</body>
</html>

View file

@ -228,5 +228,6 @@
<script src="../../assets/parsons.js"></script>
<script src="../../assets/interpreter.js"></script>
<script src="../../assets/ui_enhancements.js"></script>
<script src="../../assets/sidebar.js"></script>
</body>
</html>

View file

@ -218,5 +218,6 @@
<script src="../../assets/parsons.js"></script>
<script src="../../assets/interpreter.js"></script>
<script src="../../assets/ui_enhancements.js"></script>
<script src="../../assets/sidebar.js"></script>
</body>
</html>

View file

@ -197,5 +197,6 @@
<script src="../../assets/parsons.js"></script>
<script src="../../assets/interpreter.js"></script>
<script src="../../assets/ui_enhancements.js"></script>
<script src="../../assets/sidebar.js"></script>
</body>
</html>

View file

@ -248,5 +248,6 @@ STACK (Variablen-Namen) HEAP (Echter Speicher / RAM)
<script src="../../assets/parsons.js"></script>
<script src="../../assets/interpreter.js"></script>
<script src="../../assets/ui_enhancements.js"></script>
<script src="../../assets/sidebar.js"></script>
</body>
</html>

View file

@ -297,5 +297,6 @@
<script src="../../assets/parsons.js"></script>
<script src="../../assets/interpreter.js"></script>
<script src="../../assets/ui_enhancements.js"></script>
<script src="../../assets/sidebar.js"></script>
</body>
</html>

View file

@ -316,5 +316,6 @@
<script src="../../assets/parsons.js"></script>
<script src="../../assets/interpreter.js"></script>
<script src="../../assets/ui_enhancements.js"></script>
<script src="../../assets/sidebar.js"></script>
</body>
</html>

View file

@ -376,5 +376,6 @@
<script src="../../assets/parsons.js"></script>
<script src="../../assets/interpreter.js"></script>
<script src="../../assets/ui_enhancements.js"></script>
<script src="../../assets/sidebar.js"></script>
</body>
</html>

View file

@ -409,5 +409,6 @@
<script src="../../assets/parsons.js"></script>
<script src="../../assets/interpreter.js"></script>
<script src="../../assets/ui_enhancements.js"></script>
<script src="../../assets/sidebar.js"></script>
</body>
</html>

View file

@ -276,5 +276,6 @@
<script src="../../assets/parsons.js"></script>
<script src="../../assets/interpreter.js"></script>
<script src="../../assets/ui_enhancements.js"></script>
<script src="../../assets/sidebar.js"></script>
</body>
</html>

View file

@ -264,5 +264,6 @@
<script src="../../assets/parsons.js"></script>
<script src="../../assets/interpreter.js"></script>
<script src="../../assets/ui_enhancements.js"></script>
<script src="../../assets/sidebar.js"></script>
</body>
</html>

View file

@ -370,5 +370,6 @@
<script src="../../assets/parsons.js"></script>
<script src="../../assets/interpreter.js"></script>
<script src="../../assets/ui_enhancements.js"></script>
<script src="../../assets/sidebar.js"></script>
</body>
</html>

View file

@ -333,5 +333,6 @@
<script src="../../assets/parsons.js"></script>
<script src="../../assets/interpreter.js"></script>
<script src="../../assets/ui_enhancements.js"></script>
<script src="../../assets/sidebar.js"></script>
</body>
</html>

View file

@ -345,5 +345,6 @@
<script src="../../assets/parsons.js"></script>
<script src="../../assets/interpreter.js"></script>
<script src="../../assets/ui_enhancements.js"></script>
<script src="../../assets/sidebar.js"></script>
</body>
</html>