Next-Gen UI/UX Redesign: Neues Design-System, Live-Suche, 1-Klick Code-Kopieren und persistente Checklisten

This commit is contained in:
Alex Mueller 2026-08-29 15:50:43 +02:00
parent 1e5412da1d
commit 5045b74145
34 changed files with 747 additions and 393 deletions

View file

@ -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:47:31.273343" "zuletzt_aktualisiert": "2026-08-29T15:50:41.498015"
} }

View file

@ -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:47:31.273343" "zuletzt_aktualisiert": "2026-08-29T15:50:41.498015"
}; };
window.GAMIFICATION_BADGES_KATALOG = { window.GAMIFICATION_BADGES_KATALOG = {
"rechenkonegin": { "rechenkonegin": {

File diff suppressed because it is too large Load diff

101
assets/ui_enhancements.js Normal file
View file

@ -0,0 +1,101 @@
/**
* ✨ INTERAKTIVE UX-ERWEITERUNGEN FÜR PYTHON LERNPORTAL ✨
* ========================================================
* - Live-Suche & Filter über alle 27 Kapitel
* - 1-Klick Code-Kopier-Buttons mit Checkmark-Animation
* - Persistente Aufgaben-Checklisten (Checkboxen im Browser speichern)
* - Sanftes Scrollen & Tastatur-Shortcuts
*/
(function () {
document.addEventListener("DOMContentLoaded", () => {
// 1. Code-Kopier-Buttons für alle Code-Blöcke
document.querySelectorAll(".code-container").forEach((container) => {
const header = container.querySelector(".code-header");
const pre = container.querySelector("pre");
if (!pre) return;
const copyBtn = document.createElement("button");
copyBtn.type = "button";
copyBtn.className = "btn-copy-code";
copyBtn.innerHTML = "<span>📋 Kopieren</span>";
copyBtn.title = "Code in Zwischenablage kopieren";
copyBtn.addEventListener("click", async () => {
const codeText = pre.innerText;
try {
await navigator.clipboard.writeText(codeText);
copyBtn.innerHTML = "<span>✅ Kopiert!</span>";
copyBtn.classList.add("copied");
setTimeout(() => {
copyBtn.innerHTML = "<span>📋 Kopieren</span>";
copyBtn.classList.remove("copied");
}, 2000);
} catch (err) {
copyBtn.innerHTML = "<span>❌ Fehler</span>";
}
});
if (header) {
header.appendChild(copyBtn);
} else {
container.style.position = "relative";
copyBtn.classList.add("btn-copy-floating");
container.appendChild(copyBtn);
}
});
// 2. Persistente Checkboxen in Aufgabenlisten
const pageId = window.location.pathname;
try {
const savedChecks = JSON.parse(localStorage.getItem("task_checks_" + pageId) || "{}");
document.querySelectorAll(".task-checkbox").forEach((cb, idx) => {
const key = cb.id || "cb_" + idx;
if (savedChecks[key]) {
cb.checked = true;
cb.closest(".task-item")?.classList.add("task-completed");
}
cb.addEventListener("change", () => {
savedChecks[key] = cb.checked;
localStorage.setItem("task_checks_" + pageId, JSON.stringify(savedChecks));
if (cb.checked) {
cb.closest(".task-item")?.classList.add("task-completed");
} else {
cb.closest(".task-item")?.classList.remove("task-completed");
}
});
});
} catch (e) {}
// 3. Live-Suche & Filter für das Hauptportal
const searchInput = document.getElementById("portal-search-input");
if (searchInput) {
const cards = document.querySelectorAll(".roadmap-card");
searchInput.addEventListener("input", (e) => {
const query = e.target.value.toLowerCase().trim();
let matchCount = 0;
cards.forEach((card) => {
const text = card.innerText.toLowerCase();
if (!query || text.includes(query)) {
card.style.display = "flex";
matchCount++;
} else {
card.style.display = "none";
}
});
const countBadge = document.getElementById("search-results-count");
if (countBadge) {
if (query) {
countBadge.innerText = `${matchCount} Kapitel gefunden`;
countBadge.style.display = "inline-block";
} else {
countBadge.style.display = "none";
}
}
});
}
});
})();

View file

@ -175,6 +175,13 @@ python3 test_all.py # Prüft alle 27 Kapitel auf einen Schlag und synchronisi
</div> </div>
</section> </section>
<!-- 🔍 Live-Suche & Filter über alle 27 Kapitel -->
<div class="search-bar-container">
<span class="search-icon">🔍</span>
<input type="text" id="portal-search-input" class="search-input" placeholder="Kapitel oder Thema durchsuchen (z.B. Schleifen, Klassen, Git, Tkinter, Dunder, Exceptions, Listen)...">
<span id="search-results-count" class="search-count"></span>
</div>
<!-- LEHRPFAD 1: GRUNDLAGEN --> <!-- LEHRPFAD 1: GRUNDLAGEN -->
<section> <section>
<div class="section-header"> <div class="section-header">
@ -840,5 +847,6 @@ object has no attribute 'gang'</code></pre>
<script src="assets/certificate.js"></script> <script src="assets/certificate.js"></script>
<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>
</body> </body>
</html> </html>

View file

@ -321,5 +321,6 @@
<script src="../../assets/gamification.js"></script> <script src="../../assets/gamification.js"></script>
<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>
</body> </body>
</html> </html>

View file

@ -272,5 +272,6 @@
<script src="../../assets/gamification.js"></script> <script src="../../assets/gamification.js"></script>
<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>
</body> </body>
</html> </html>

View file

@ -275,5 +275,6 @@ return f"Steckbrief: {name} | Größe: {groesse_m:.2f} m | Gewicht: {gewicht_kg:
<script src="../../assets/gamification.js"></script> <script src="../../assets/gamification.js"></script>
<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>
</body> </body>
</html> </html>

View file

@ -307,5 +307,6 @@ return False</code></pre>
<script src="../../assets/gamification.js"></script> <script src="../../assets/gamification.js"></script>
<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>
</body> </body>
</html> </html>

View file

@ -348,5 +348,6 @@
<script src="../../assets/gamification.js"></script> <script src="../../assets/gamification.js"></script>
<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>
</body> </body>
</html> </html>

View file

@ -301,5 +301,6 @@
<script src="../../assets/gamification.js"></script> <script src="../../assets/gamification.js"></script>
<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>
</body> </body>
</html> </html>

View file

@ -292,5 +292,6 @@
<script src="../../assets/gamification.js"></script> <script src="../../assets/gamification.js"></script>
<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>
</body> </body>
</html> </html>

View file

@ -247,5 +247,6 @@
<script src="../../assets/gamification.js"></script> <script src="../../assets/gamification.js"></script>
<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>
</body> </body>
</html> </html>

View file

@ -321,5 +321,6 @@
<script src="../../assets/gamification.js"></script> <script src="../../assets/gamification.js"></script>
<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>
</body> </body>
</html> </html>

View file

@ -271,5 +271,6 @@
<script src="../../assets/gamification.js"></script> <script src="../../assets/gamification.js"></script>
<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>
</body> </body>
</html> </html>

View file

@ -225,5 +225,6 @@
<script src="../../assets/gamification.js"></script> <script src="../../assets/gamification.js"></script>
<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>
</body> </body>
</html> </html>

View file

@ -307,5 +307,6 @@
<script src="../../assets/gamification.js"></script> <script src="../../assets/gamification.js"></script>
<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>
</body> </body>
</html> </html>

View file

@ -234,5 +234,6 @@
<script src="../../assets/gamification.js"></script> <script src="../../assets/gamification.js"></script>
<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>
</body> </body>
</html> </html>

View file

@ -214,5 +214,6 @@
<script src="../../assets/gamification.js"></script> <script src="../../assets/gamification.js"></script>
<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>
</body> </body>
</html> </html>

View file

@ -221,5 +221,6 @@
<script src="../../assets/gamification.js"></script> <script src="../../assets/gamification.js"></script>
<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>
</body> </body>
</html> </html>

View file

@ -331,5 +331,6 @@ sudo snap install --classic code</code></pre>
<script src="../../assets/gamification.js"></script> <script src="../../assets/gamification.js"></script>
<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>
</body> </body>
</html> </html>

View file

@ -227,5 +227,6 @@
<script src="../../assets/gamification.js"></script> <script src="../../assets/gamification.js"></script>
<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>
</body> </body>
</html> </html>

View file

@ -217,5 +217,6 @@
<script src="../../assets/gamification.js"></script> <script src="../../assets/gamification.js"></script>
<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>
</body> </body>
</html> </html>

View file

@ -196,5 +196,6 @@
<script src="../../assets/gamification.js"></script> <script src="../../assets/gamification.js"></script>
<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>
</body> </body>
</html> </html>

View file

@ -247,5 +247,6 @@ STACK (Variablen-Namen) HEAP (Echter Speicher / RAM)
<script src="../../assets/gamification.js"></script> <script src="../../assets/gamification.js"></script>
<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>
</body> </body>
</html> </html>

View file

@ -296,5 +296,6 @@
<script src="../../assets/gamification.js"></script> <script src="../../assets/gamification.js"></script>
<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>
</body> </body>
</html> </html>

View file

@ -315,5 +315,6 @@
<script src="../../assets/gamification.js"></script> <script src="../../assets/gamification.js"></script>
<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>
</body> </body>
</html> </html>

View file

@ -375,5 +375,6 @@
<script src="../../assets/gamification.js"></script> <script src="../../assets/gamification.js"></script>
<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>
</body> </body>
</html> </html>

View file

@ -408,5 +408,6 @@
<script src="../../assets/gamification.js"></script> <script src="../../assets/gamification.js"></script>
<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>
</body> </body>
</html> </html>

View file

@ -275,5 +275,6 @@
<script src="../../assets/gamification.js"></script> <script src="../../assets/gamification.js"></script>
<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>
</body> </body>
</html> </html>

View file

@ -263,5 +263,6 @@
<script src="../../assets/gamification.js"></script> <script src="../../assets/gamification.js"></script>
<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>
</body> </body>
</html> </html>

View file

@ -369,5 +369,6 @@
<script src="../../assets/gamification.js"></script> <script src="../../assets/gamification.js"></script>
<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>
</body> </body>
</html> </html>

View file

@ -332,5 +332,6 @@
<script src="../../assets/gamification.js"></script> <script src="../../assets/gamification.js"></script>
<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>
</body> </body>
</html> </html>

View file

@ -344,5 +344,6 @@
<script src="../../assets/gamification.js"></script> <script src="../../assets/gamification.js"></script>
<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>
</body> </body>
</html> </html>