Implementiere responsive linke Sidebar-Navigation für alle 27 Kapitel und das Hauptportal
This commit is contained in:
parent
5045b74145
commit
989ccb4f6d
34 changed files with 497 additions and 2 deletions
|
|
@ -10,5 +10,5 @@
|
||||||
"streak_tage": 1,
|
"streak_tage": 1,
|
||||||
"letzter_aktiver_tag": "2026-08-29",
|
"letzter_aktiver_tag": "2026-08-29",
|
||||||
"historie": [],
|
"historie": [],
|
||||||
"zuletzt_aktualisiert": "2026-08-29T15:50:41.498015"
|
"zuletzt_aktualisiert": "2026-08-29T15:54:00.836247"
|
||||||
}
|
}
|
||||||
|
|
@ -11,7 +11,7 @@ window.GAMIFICATION_DATA = {
|
||||||
"streak_tage": 1,
|
"streak_tage": 1,
|
||||||
"letzter_aktiver_tag": "2026-08-29",
|
"letzter_aktiver_tag": "2026-08-29",
|
||||||
"historie": [],
|
"historie": [],
|
||||||
"zuletzt_aktualisiert": "2026-08-29T15:50:41.498015"
|
"zuletzt_aktualisiert": "2026-08-29T15:54:00.836247"
|
||||||
};
|
};
|
||||||
window.GAMIFICATION_BADGES_KATALOG = {
|
window.GAMIFICATION_BADGES_KATALOG = {
|
||||||
"rechenkonegin": {
|
"rechenkonegin": {
|
||||||
|
|
|
||||||
179
assets/sidebar.js
Normal file
179
assets/sidebar.js
Normal 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);
|
||||||
|
})();
|
||||||
286
assets/style.css
286
assets/style.css
|
|
@ -1197,3 +1197,289 @@ summary:hover {
|
||||||
.hud-stats { width: 100%; justify-content: space-between; }
|
.hud-stats { width: 100%; justify-content: space-between; }
|
||||||
.roadmap-grid { grid-template-columns: 1fr; }
|
.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;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -848,5 +848,6 @@ object has no attribute 'gang'</code></pre>
|
||||||
<script src="assets/parsons.js"></script>
|
<script src="assets/parsons.js"></script>
|
||||||
<script src="assets/runner.js"></script>
|
<script src="assets/runner.js"></script>
|
||||||
<script src="assets/ui_enhancements.js"></script>
|
<script src="assets/ui_enhancements.js"></script>
|
||||||
|
<script src="assets/sidebar.js"></script>
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
|
|
||||||
|
|
@ -322,5 +322,6 @@
|
||||||
<script src="../../assets/parsons.js"></script>
|
<script src="../../assets/parsons.js"></script>
|
||||||
<script src="../../assets/interpreter.js"></script>
|
<script src="../../assets/interpreter.js"></script>
|
||||||
<script src="../../assets/ui_enhancements.js"></script>
|
<script src="../../assets/ui_enhancements.js"></script>
|
||||||
|
<script src="../../assets/sidebar.js"></script>
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
|
|
||||||
|
|
@ -273,5 +273,6 @@
|
||||||
<script src="../../assets/parsons.js"></script>
|
<script src="../../assets/parsons.js"></script>
|
||||||
<script src="../../assets/interpreter.js"></script>
|
<script src="../../assets/interpreter.js"></script>
|
||||||
<script src="../../assets/ui_enhancements.js"></script>
|
<script src="../../assets/ui_enhancements.js"></script>
|
||||||
|
<script src="../../assets/sidebar.js"></script>
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
|
|
||||||
|
|
@ -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/parsons.js"></script>
|
||||||
<script src="../../assets/interpreter.js"></script>
|
<script src="../../assets/interpreter.js"></script>
|
||||||
<script src="../../assets/ui_enhancements.js"></script>
|
<script src="../../assets/ui_enhancements.js"></script>
|
||||||
|
<script src="../../assets/sidebar.js"></script>
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
|
|
||||||
|
|
@ -308,5 +308,6 @@ return False</code></pre>
|
||||||
<script src="../../assets/parsons.js"></script>
|
<script src="../../assets/parsons.js"></script>
|
||||||
<script src="../../assets/interpreter.js"></script>
|
<script src="../../assets/interpreter.js"></script>
|
||||||
<script src="../../assets/ui_enhancements.js"></script>
|
<script src="../../assets/ui_enhancements.js"></script>
|
||||||
|
<script src="../../assets/sidebar.js"></script>
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
|
|
||||||
|
|
@ -349,5 +349,6 @@
|
||||||
<script src="../../assets/parsons.js"></script>
|
<script src="../../assets/parsons.js"></script>
|
||||||
<script src="../../assets/interpreter.js"></script>
|
<script src="../../assets/interpreter.js"></script>
|
||||||
<script src="../../assets/ui_enhancements.js"></script>
|
<script src="../../assets/ui_enhancements.js"></script>
|
||||||
|
<script src="../../assets/sidebar.js"></script>
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
|
|
||||||
|
|
@ -302,5 +302,6 @@
|
||||||
<script src="../../assets/parsons.js"></script>
|
<script src="../../assets/parsons.js"></script>
|
||||||
<script src="../../assets/interpreter.js"></script>
|
<script src="../../assets/interpreter.js"></script>
|
||||||
<script src="../../assets/ui_enhancements.js"></script>
|
<script src="../../assets/ui_enhancements.js"></script>
|
||||||
|
<script src="../../assets/sidebar.js"></script>
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
|
|
||||||
|
|
@ -293,5 +293,6 @@
|
||||||
<script src="../../assets/parsons.js"></script>
|
<script src="../../assets/parsons.js"></script>
|
||||||
<script src="../../assets/interpreter.js"></script>
|
<script src="../../assets/interpreter.js"></script>
|
||||||
<script src="../../assets/ui_enhancements.js"></script>
|
<script src="../../assets/ui_enhancements.js"></script>
|
||||||
|
<script src="../../assets/sidebar.js"></script>
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
|
|
||||||
|
|
@ -248,5 +248,6 @@
|
||||||
<script src="../../assets/parsons.js"></script>
|
<script src="../../assets/parsons.js"></script>
|
||||||
<script src="../../assets/interpreter.js"></script>
|
<script src="../../assets/interpreter.js"></script>
|
||||||
<script src="../../assets/ui_enhancements.js"></script>
|
<script src="../../assets/ui_enhancements.js"></script>
|
||||||
|
<script src="../../assets/sidebar.js"></script>
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
|
|
||||||
|
|
@ -322,5 +322,6 @@
|
||||||
<script src="../../assets/parsons.js"></script>
|
<script src="../../assets/parsons.js"></script>
|
||||||
<script src="../../assets/interpreter.js"></script>
|
<script src="../../assets/interpreter.js"></script>
|
||||||
<script src="../../assets/ui_enhancements.js"></script>
|
<script src="../../assets/ui_enhancements.js"></script>
|
||||||
|
<script src="../../assets/sidebar.js"></script>
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
|
|
||||||
|
|
@ -272,5 +272,6 @@
|
||||||
<script src="../../assets/parsons.js"></script>
|
<script src="../../assets/parsons.js"></script>
|
||||||
<script src="../../assets/interpreter.js"></script>
|
<script src="../../assets/interpreter.js"></script>
|
||||||
<script src="../../assets/ui_enhancements.js"></script>
|
<script src="../../assets/ui_enhancements.js"></script>
|
||||||
|
<script src="../../assets/sidebar.js"></script>
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
|
|
||||||
|
|
@ -226,5 +226,6 @@
|
||||||
<script src="../../assets/parsons.js"></script>
|
<script src="../../assets/parsons.js"></script>
|
||||||
<script src="../../assets/interpreter.js"></script>
|
<script src="../../assets/interpreter.js"></script>
|
||||||
<script src="../../assets/ui_enhancements.js"></script>
|
<script src="../../assets/ui_enhancements.js"></script>
|
||||||
|
<script src="../../assets/sidebar.js"></script>
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
|
|
||||||
|
|
@ -308,5 +308,6 @@
|
||||||
<script src="../../assets/parsons.js"></script>
|
<script src="../../assets/parsons.js"></script>
|
||||||
<script src="../../assets/interpreter.js"></script>
|
<script src="../../assets/interpreter.js"></script>
|
||||||
<script src="../../assets/ui_enhancements.js"></script>
|
<script src="../../assets/ui_enhancements.js"></script>
|
||||||
|
<script src="../../assets/sidebar.js"></script>
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
|
|
||||||
|
|
@ -235,5 +235,6 @@
|
||||||
<script src="../../assets/parsons.js"></script>
|
<script src="../../assets/parsons.js"></script>
|
||||||
<script src="../../assets/interpreter.js"></script>
|
<script src="../../assets/interpreter.js"></script>
|
||||||
<script src="../../assets/ui_enhancements.js"></script>
|
<script src="../../assets/ui_enhancements.js"></script>
|
||||||
|
<script src="../../assets/sidebar.js"></script>
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
|
|
||||||
|
|
@ -215,5 +215,6 @@
|
||||||
<script src="../../assets/parsons.js"></script>
|
<script src="../../assets/parsons.js"></script>
|
||||||
<script src="../../assets/interpreter.js"></script>
|
<script src="../../assets/interpreter.js"></script>
|
||||||
<script src="../../assets/ui_enhancements.js"></script>
|
<script src="../../assets/ui_enhancements.js"></script>
|
||||||
|
<script src="../../assets/sidebar.js"></script>
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
|
|
||||||
|
|
@ -222,5 +222,6 @@
|
||||||
<script src="../../assets/parsons.js"></script>
|
<script src="../../assets/parsons.js"></script>
|
||||||
<script src="../../assets/interpreter.js"></script>
|
<script src="../../assets/interpreter.js"></script>
|
||||||
<script src="../../assets/ui_enhancements.js"></script>
|
<script src="../../assets/ui_enhancements.js"></script>
|
||||||
|
<script src="../../assets/sidebar.js"></script>
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
|
|
||||||
|
|
@ -332,5 +332,6 @@ sudo snap install --classic code</code></pre>
|
||||||
<script src="../../assets/parsons.js"></script>
|
<script src="../../assets/parsons.js"></script>
|
||||||
<script src="../../assets/interpreter.js"></script>
|
<script src="../../assets/interpreter.js"></script>
|
||||||
<script src="../../assets/ui_enhancements.js"></script>
|
<script src="../../assets/ui_enhancements.js"></script>
|
||||||
|
<script src="../../assets/sidebar.js"></script>
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
|
|
||||||
|
|
@ -228,5 +228,6 @@
|
||||||
<script src="../../assets/parsons.js"></script>
|
<script src="../../assets/parsons.js"></script>
|
||||||
<script src="../../assets/interpreter.js"></script>
|
<script src="../../assets/interpreter.js"></script>
|
||||||
<script src="../../assets/ui_enhancements.js"></script>
|
<script src="../../assets/ui_enhancements.js"></script>
|
||||||
|
<script src="../../assets/sidebar.js"></script>
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
|
|
||||||
|
|
@ -218,5 +218,6 @@
|
||||||
<script src="../../assets/parsons.js"></script>
|
<script src="../../assets/parsons.js"></script>
|
||||||
<script src="../../assets/interpreter.js"></script>
|
<script src="../../assets/interpreter.js"></script>
|
||||||
<script src="../../assets/ui_enhancements.js"></script>
|
<script src="../../assets/ui_enhancements.js"></script>
|
||||||
|
<script src="../../assets/sidebar.js"></script>
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
|
|
||||||
|
|
@ -197,5 +197,6 @@
|
||||||
<script src="../../assets/parsons.js"></script>
|
<script src="../../assets/parsons.js"></script>
|
||||||
<script src="../../assets/interpreter.js"></script>
|
<script src="../../assets/interpreter.js"></script>
|
||||||
<script src="../../assets/ui_enhancements.js"></script>
|
<script src="../../assets/ui_enhancements.js"></script>
|
||||||
|
<script src="../../assets/sidebar.js"></script>
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
|
|
||||||
|
|
@ -248,5 +248,6 @@ STACK (Variablen-Namen) HEAP (Echter Speicher / RAM)
|
||||||
<script src="../../assets/parsons.js"></script>
|
<script src="../../assets/parsons.js"></script>
|
||||||
<script src="../../assets/interpreter.js"></script>
|
<script src="../../assets/interpreter.js"></script>
|
||||||
<script src="../../assets/ui_enhancements.js"></script>
|
<script src="../../assets/ui_enhancements.js"></script>
|
||||||
|
<script src="../../assets/sidebar.js"></script>
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
|
|
||||||
|
|
@ -297,5 +297,6 @@
|
||||||
<script src="../../assets/parsons.js"></script>
|
<script src="../../assets/parsons.js"></script>
|
||||||
<script src="../../assets/interpreter.js"></script>
|
<script src="../../assets/interpreter.js"></script>
|
||||||
<script src="../../assets/ui_enhancements.js"></script>
|
<script src="../../assets/ui_enhancements.js"></script>
|
||||||
|
<script src="../../assets/sidebar.js"></script>
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
|
|
||||||
|
|
@ -316,5 +316,6 @@
|
||||||
<script src="../../assets/parsons.js"></script>
|
<script src="../../assets/parsons.js"></script>
|
||||||
<script src="../../assets/interpreter.js"></script>
|
<script src="../../assets/interpreter.js"></script>
|
||||||
<script src="../../assets/ui_enhancements.js"></script>
|
<script src="../../assets/ui_enhancements.js"></script>
|
||||||
|
<script src="../../assets/sidebar.js"></script>
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
|
|
||||||
|
|
@ -376,5 +376,6 @@
|
||||||
<script src="../../assets/parsons.js"></script>
|
<script src="../../assets/parsons.js"></script>
|
||||||
<script src="../../assets/interpreter.js"></script>
|
<script src="../../assets/interpreter.js"></script>
|
||||||
<script src="../../assets/ui_enhancements.js"></script>
|
<script src="../../assets/ui_enhancements.js"></script>
|
||||||
|
<script src="../../assets/sidebar.js"></script>
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
|
|
||||||
|
|
@ -409,5 +409,6 @@
|
||||||
<script src="../../assets/parsons.js"></script>
|
<script src="../../assets/parsons.js"></script>
|
||||||
<script src="../../assets/interpreter.js"></script>
|
<script src="../../assets/interpreter.js"></script>
|
||||||
<script src="../../assets/ui_enhancements.js"></script>
|
<script src="../../assets/ui_enhancements.js"></script>
|
||||||
|
<script src="../../assets/sidebar.js"></script>
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
|
|
||||||
|
|
@ -276,5 +276,6 @@
|
||||||
<script src="../../assets/parsons.js"></script>
|
<script src="../../assets/parsons.js"></script>
|
||||||
<script src="../../assets/interpreter.js"></script>
|
<script src="../../assets/interpreter.js"></script>
|
||||||
<script src="../../assets/ui_enhancements.js"></script>
|
<script src="../../assets/ui_enhancements.js"></script>
|
||||||
|
<script src="../../assets/sidebar.js"></script>
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
|
|
||||||
|
|
@ -264,5 +264,6 @@
|
||||||
<script src="../../assets/parsons.js"></script>
|
<script src="../../assets/parsons.js"></script>
|
||||||
<script src="../../assets/interpreter.js"></script>
|
<script src="../../assets/interpreter.js"></script>
|
||||||
<script src="../../assets/ui_enhancements.js"></script>
|
<script src="../../assets/ui_enhancements.js"></script>
|
||||||
|
<script src="../../assets/sidebar.js"></script>
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
|
|
||||||
|
|
@ -370,5 +370,6 @@
|
||||||
<script src="../../assets/parsons.js"></script>
|
<script src="../../assets/parsons.js"></script>
|
||||||
<script src="../../assets/interpreter.js"></script>
|
<script src="../../assets/interpreter.js"></script>
|
||||||
<script src="../../assets/ui_enhancements.js"></script>
|
<script src="../../assets/ui_enhancements.js"></script>
|
||||||
|
<script src="../../assets/sidebar.js"></script>
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
|
|
||||||
|
|
@ -333,5 +333,6 @@
|
||||||
<script src="../../assets/parsons.js"></script>
|
<script src="../../assets/parsons.js"></script>
|
||||||
<script src="../../assets/interpreter.js"></script>
|
<script src="../../assets/interpreter.js"></script>
|
||||||
<script src="../../assets/ui_enhancements.js"></script>
|
<script src="../../assets/ui_enhancements.js"></script>
|
||||||
|
<script src="../../assets/sidebar.js"></script>
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
|
|
||||||
|
|
@ -345,5 +345,6 @@
|
||||||
<script src="../../assets/parsons.js"></script>
|
<script src="../../assets/parsons.js"></script>
|
||||||
<script src="../../assets/interpreter.js"></script>
|
<script src="../../assets/interpreter.js"></script>
|
||||||
<script src="../../assets/ui_enhancements.js"></script>
|
<script src="../../assets/ui_enhancements.js"></script>
|
||||||
|
<script src="../../assets/sidebar.js"></script>
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue