diff --git a/.gamification.json b/.gamification.json index ac99fce..4faab4e 100644 --- a/.gamification.json +++ b/.gamification.json @@ -10,5 +10,5 @@ "streak_tage": 1, "letzter_aktiver_tag": "2026-08-29", "historie": [], - "zuletzt_aktualisiert": "2026-08-29T15:47:31.273343" + "zuletzt_aktualisiert": "2026-08-29T15:50:41.498015" } \ No newline at end of file diff --git a/assets/gamification_data.js b/assets/gamification_data.js index 3040d76..8345274 100644 --- a/assets/gamification_data.js +++ b/assets/gamification_data.js @@ -11,7 +11,7 @@ window.GAMIFICATION_DATA = { "streak_tage": 1, "letzter_aktiver_tag": "2026-08-29", "historie": [], - "zuletzt_aktualisiert": "2026-08-29T15:47:31.273343" + "zuletzt_aktualisiert": "2026-08-29T15:50:41.498015" }; window.GAMIFICATION_BADGES_KATALOG = { "rechenkonegin": { diff --git a/assets/style.css b/assets/style.css index 0ce0128..9357b66 100644 --- a/assets/style.css +++ b/assets/style.css @@ -1,166 +1,423 @@ /* ========================================================================== - Modernes Design-System für Python OOP Lernportal + ✨ PYTHON LERNPORTAL – NEXT-GEN DESIGN SYSTEM & UI/UX FRAMEWORK ✨ + ========================================================================== + Inspiriert von führenden Plattformen (Vercel, Linear, Stripe, Brilliant). + Optimiert für Lesbarkeit, kognitive Entlastung und responsive Interaktion. ========================================================================== */ +@import url('https://fonts.googleapis.com/css2?family=Plus+Jakarta+Sans:wght@400;500;600;700;800&family=JetBrains+Mono:wght@400;500;600;700&display=swap'); + :root { - --primary: #6366f1; - --primary-hover: #4f46e5; + /* Farb-Tokens */ + --primary: #4f46e5; + --primary-hover: #4338ca; + --primary-gradient: linear-gradient(135deg, #4f46e5 0%, #7c3aed 100%); --primary-light: #eef2ff; - --secondary: #06b6d4; + --primary-glow: rgba(79, 70, 229, 0.25); + + --secondary: #0284c7; + --secondary-light: #f0f9ff; + + --emerald: #059669; + --emerald-light: #ecfdf5; + --emerald-gradient: linear-gradient(135deg, #059669 0%, #0d9488 100%); + + --purple: #7c3aed; + --purple-light: #f5f3ff; + --purple-gradient: linear-gradient(135deg, #7c3aed 0%, #c026d3 100%); + + --amber: #d97706; + --amber-light: #fffbeb; + --amber-gradient: linear-gradient(135deg, #d97706 0%, #f59e0b 100%); + + --danger: #e11d48; + --danger-light: #fff1f2; + --success: #10b981; --success-light: #ecfdf5; --warning: #f59e0b; --warning-light: #fffbeb; - --danger: #ef4444; - --danger-light: #fef2f2; - --purple: #8b5cf6; - --purple-light: #f5f3ff; + /* Neutrals & Surfaces */ --bg-main: #f8fafc; - --bg-card: #ffffff; - --bg-code: #1e293b; - --border-color: #e2e8f0; - --text-main: #1e293b; - --text-muted: #64748b; - --text-code: #f1f5f9; + --bg-surface: #ffffff; + --bg-subtle: #f1f5f9; + --bg-dark: #090d16; + --bg-card-dark: #0f172a; + --bg-code: #0b0f19; - --radius-sm: 6px; - --radius-md: 12px; - --radius-lg: 18px; - --shadow-sm: 0 1px 3px rgba(0,0,0,0.06), 0 1px 2px rgba(0,0,0,0.04); - --shadow-md: 0 4px 6px -1px rgba(0,0,0,0.08), 0 2px 4px -1px rgba(0,0,0,0.04); - --shadow-lg: 0 10px 15px -3px rgba(0,0,0,0.08), 0 4px 6px -2px rgba(0,0,0,0.04); - --font-sans: system-ui, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Helvetica, Arial, sans-serif; - --font-mono: 'Fira Code', 'JetBrains Mono', Consolas, Monaco, 'Courier New', monospace; + --border-subtle: #e2e8f0; + --border-focus: #cbd5e1; + --border-dark: rgba(255, 255, 255, 0.08); + + --text-main: #0f172a; + --text-body: #334155; + --text-muted: #64748b; + --text-code: #e2e8f0; + + /* Typography */ + --font-sans: 'Plus Jakarta Sans', system-ui, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif; + --font-mono: 'JetBrains Mono', 'Fira Code', Consolas, Monaco, monospace; + + /* Shadows & Depth */ + --shadow-xs: 0 1px 2px rgba(0, 0, 0, 0.04); + --shadow-sm: 0 1px 3px rgba(0, 0, 0, 0.06), 0 1px 2px rgba(0, 0, 0, 0.04); + --shadow-md: 0 4px 12px -1px rgba(0, 0, 0, 0.07), 0 2px 4px -1px rgba(0, 0, 0, 0.04); + --shadow-lg: 0 12px 24px -4px rgba(0, 0, 0, 0.08), 0 4px 8px -2px rgba(0, 0, 0, 0.04); + --shadow-xl: 0 20px 30px -6px rgba(0, 0, 0, 0.12), 0 8px 12px -4px rgba(0, 0, 0, 0.06); + + /* Radii */ + --radius-xs: 4px; + --radius-sm: 8px; + --radius-md: 14px; + --radius-lg: 20px; + --radius-full: 9999px; + + /* Animations */ + --transition-fast: 0.15s cubic-bezier(0.4, 0, 0.2, 1); + --transition-normal: 0.25s cubic-bezier(0.4, 0, 0.2, 1); + --transition-smooth: 0.35s cubic-bezier(0.16, 1, 0.3, 1); } -* { +/* ========================================================================== + Base & Reset + ========================================================================== */ + +*, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; } +html { + scroll-behavior: smooth; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} + body { font-family: var(--font-sans); background-color: var(--bg-main); - color: var(--text-main); - line-height: 1.65; + color: var(--text-body); + line-height: 1.7; font-size: 16px; - padding-bottom: 60px; + padding-bottom: 80px; } -/* Header & Navigation */ +/* ========================================================================== + Header & Hero + ========================================================================== */ + header { - background: linear-gradient(135deg, #4f46e5 0%, #7c3aed 100%); - color: white; - padding: 30px 20px; - box-shadow: var(--shadow-md); + background: linear-gradient(145deg, #090d16 0%, #171c2c 50%, #1e1b4b 100%); + color: #ffffff; + padding: 40px 20px 45px 20px; margin-bottom: 35px; + position: relative; + overflow: hidden; + box-shadow: var(--shadow-lg); + border-bottom: 1px solid rgba(255, 255, 255, 0.08); +} + +header::before { + content: ""; + position: absolute; + top: -40%; + right: -10%; + width: 500px; + height: 500px; + background: radial-gradient(circle, rgba(99, 102, 241, 0.25) 0%, rgba(124, 58, 237, 0) 70%); + border-radius: 50%; + pointer-events: none; } .header-container { - max-width: 900px; + max-width: 960px; margin: 0 auto; -} - -.nav-links { - display: flex; - gap: 15px; - margin-bottom: 15px; - font-size: 0.9rem; - flex-wrap: wrap; -} - -.nav-links a { - color: rgba(255, 255, 255, 0.85); - text-decoration: none; - background: rgba(255, 255, 255, 0.15); - padding: 4px 12px; - border-radius: 20px; - transition: all 0.2s; - display: inline-flex; - align-items: center; - gap: 6px; -} - -.nav-links a:hover { - background: rgba(255, 255, 255, 0.3); - color: white; - transform: translateY(-1px); + position: relative; + z-index: 2; } .header-badge { - display: inline-block; - background: rgba(255, 255, 255, 0.2); - padding: 4px 12px; - border-radius: 20px; - font-size: 0.85rem; - font-weight: 600; + display: inline-flex; + align-items: center; + gap: 6px; + background: rgba(255, 255, 255, 0.1); + backdrop-filter: blur(8px); + padding: 6px 14px; + border-radius: var(--radius-full); + font-size: 0.82rem; + font-weight: 700; text-transform: uppercase; - letter-spacing: 0.5px; - margin-bottom: 8px; + letter-spacing: 0.8px; + color: #c7d2fe; + border: 1px solid rgba(255, 255, 255, 0.15); + margin-bottom: 14px; } header h1 { - font-size: 2.1rem; + font-size: 2.3rem; font-weight: 800; - margin-bottom: 6px; - line-height: 1.25; + letter-spacing: -0.025em; + margin-bottom: 10px; + line-height: 1.2; + background: linear-gradient(135deg, #ffffff 30%, #c7d2fe 100%); + -webkit-background-clip: text; + -webkit-text-fill-color: transparent; } header p { - font-size: 1.1rem; - opacity: 0.9; + font-size: 1.12rem; + color: #94a3b8; + max-width: 750px; + line-height: 1.6; } -/* Main Container */ +/* Nav Links & Breadcrumbs */ +.nav-links { + display: flex; + gap: 10px; + margin-bottom: 20px; + font-size: 0.88rem; + flex-wrap: wrap; + align-items: center; +} + +.nav-links a { + color: #cbd5e1; + text-decoration: none; + background: rgba(255, 255, 255, 0.08); + backdrop-filter: blur(6px); + padding: 6px 14px; + border-radius: var(--radius-full); + transition: all var(--transition-fast); + display: inline-flex; + align-items: center; + gap: 6px; + border: 1px solid rgba(255, 255, 255, 0.08); + font-weight: 600; +} + +.nav-links a:hover { + background: rgba(255, 255, 255, 0.2); + color: #ffffff; + transform: translateY(-1px); + border-color: rgba(255, 255, 255, 0.25); +} + +/* ========================================================================== + Main Container & Cards + ========================================================================== */ + .container { - max-width: 900px; + max-width: 960px; margin: 0 auto; padding: 0 20px; } -/* Content Cards */ .card { - background: var(--bg-card); + background: var(--bg-surface); border-radius: var(--radius-md); - padding: 28px; - margin-bottom: 25px; - border: 1px solid var(--border-color); + padding: 30px; + margin-bottom: 28px; + border: 1px solid var(--border-subtle); box-shadow: var(--shadow-sm); + transition: box-shadow var(--transition-normal); +} + +.card:hover { + box-shadow: var(--shadow-md); } .card h2 { font-size: 1.45rem; - color: var(--primary); - margin-bottom: 16px; + font-weight: 800; + letter-spacing: -0.015em; + color: var(--text-main); + margin-bottom: 18px; display: flex; align-items: center; gap: 10px; - border-bottom: 2px solid var(--primary-light); - padding-bottom: 8px; + border-bottom: 2px solid var(--bg-subtle); + padding-bottom: 10px; } .card h3 { font-size: 1.2rem; - margin: 20px 0 10px 0; + font-weight: 700; + margin: 24px 0 12px 0; color: var(--text-main); } .card p { - margin-bottom: 14px; + margin-bottom: 16px; + color: var(--text-body); } -/* Didactic Callout Boxes */ +/* ========================================================================== + Live Search & Filter Bar + ========================================================================== */ + +.search-bar-container { + background: #ffffff; + border: 1px solid var(--border-subtle); + border-radius: var(--radius-md); + padding: 12px 18px; + margin-bottom: 30px; + display: flex; + align-items: center; + gap: 12px; + box-shadow: var(--shadow-sm); + transition: all var(--transition-fast); +} + +.search-bar-container:focus-within { + border-color: var(--primary); + box-shadow: 0 0 0 3px var(--primary-glow); +} + +.search-icon { + font-size: 1.2rem; + color: var(--text-muted); +} + +.search-input { + flex: 1; + border: none; + outline: none; + font-family: var(--font-sans); + font-size: 1rem; + color: var(--text-main); + background: transparent; +} + +.search-input::placeholder { + color: var(--text-muted); +} + +.search-count { + background: var(--primary-light); + color: var(--primary); + font-size: 0.8rem; + font-weight: 700; + padding: 3px 10px; + border-radius: var(--radius-full); + display: none; +} + +/* ========================================================================== + Roadmap Cards & Grids + ========================================================================== */ + +.roadmap-grid { + display: grid; + grid-template-columns: repeat(auto-fit, minmax(280px, 1fr)); + gap: 22px; + margin: 25px 0 40px 0; +} + +.roadmap-card { + background: var(--bg-surface); + border: 1px solid var(--border-subtle); + border-radius: var(--radius-md); + padding: 22px; + text-decoration: none; + color: var(--text-main); + display: flex; + flex-direction: column; + justify-content: space-between; + transition: all var(--transition-smooth); + box-shadow: var(--shadow-xs); + position: relative; + overflow: hidden; +} + +.roadmap-card:hover { + transform: translateY(-4px); + box-shadow: var(--shadow-lg); + border-color: var(--primary); +} + +.roadmap-number { + font-size: 0.78rem; + font-weight: 800; + text-transform: uppercase; + letter-spacing: 0.5px; + display: inline-flex; + padding: 3px 10px; + border-radius: var(--radius-full); + margin-bottom: 12px; +} + +.roadmap-title { + font-size: 1.18rem; + font-weight: 800; + margin-bottom: 8px; + color: var(--text-main); + line-height: 1.35; +} + +.roadmap-desc { + font-size: 0.92rem; + color: var(--text-muted); + margin-bottom: 16px; + flex: 1; + line-height: 1.5; +} + +.roadmap-footer { + font-size: 0.88rem; + font-weight: 700; + color: var(--primary); + display: flex; + align-items: center; + justify-content: space-between; + margin-top: 10px; +} + +.card-quick-links a { + transition: all var(--transition-fast); + text-decoration: none; +} + +.card-quick-links a:hover { + background: var(--primary) !important; + color: white !important; + transform: translateY(-1px); +} + +/* Track Badges */ +.track-badge { + display: inline-flex; + align-items: center; + gap: 6px; + padding: 4px 12px; + border-radius: var(--radius-full); + font-size: 0.8rem; + font-weight: 800; + text-transform: uppercase; + letter-spacing: 0.5px; +} + +.track-1-badge { background: var(--emerald-light); color: var(--emerald); } +.track-2-badge { background: var(--primary-light); color: var(--primary); } +.track-3-badge { background: var(--purple-light); color: var(--purple); } + +/* ========================================================================== + Didactic Callout Boxes + ========================================================================== */ + .box { border-radius: var(--radius-md); - padding: 18px 22px; - margin: 20px 0; + padding: 20px 24px; + margin: 22px 0; border-left: 5px solid; + position: relative; + box-shadow: var(--shadow-xs); } .box-title { - font-weight: 700; + font-weight: 800; font-size: 1.05rem; margin-bottom: 8px; display: flex; @@ -198,25 +455,29 @@ header p { color: #064e3b; } -/* Code Blocks */ +/* ========================================================================== + Code Blocks & Syntax Highlights + ========================================================================== */ + .code-container { background-color: var(--bg-code); border-radius: var(--radius-md); - margin: 18px 0; + margin: 20px 0; overflow: hidden; - box-shadow: var(--shadow-sm); + box-shadow: var(--shadow-md); + border: 1px solid rgba(255, 255, 255, 0.08); } .code-header { - background-color: #0f172a; + background-color: #060911; color: #94a3b8; - padding: 8px 16px; - font-size: 0.8rem; + padding: 10px 18px; + font-size: 0.82rem; font-family: var(--font-mono); display: flex; justify-content: space-between; align-items: center; - border-bottom: 1px solid rgba(255, 255, 255, 0.08); + border-bottom: 1px solid rgba(255, 255, 255, 0.06); } .code-dots { @@ -235,12 +496,12 @@ header p { pre { margin: 0; - padding: 16px; + padding: 18px 20px; overflow-x: auto; font-family: var(--font-mono); - font-size: 0.92rem; + font-size: 0.94rem; color: var(--text-code); - line-height: 1.55; + line-height: 1.6; } code { @@ -248,8 +509,9 @@ code { font-size: 0.9em; background-color: #f1f5f9; color: #e11d48; - padding: 2px 6px; - border-radius: var(--radius-sm); + padding: 2px 7px; + border-radius: var(--radius-xs); + font-weight: 500; } pre code { @@ -258,7 +520,33 @@ pre code { padding: 0; } -/* Code Syntax Highlights */ +/* Copy Button on Code Header */ +.btn-copy-code { + background: rgba(255, 255, 255, 0.1); + border: 1px solid rgba(255, 255, 255, 0.15); + color: #cbd5e1; + padding: 3px 10px; + border-radius: var(--radius-sm); + font-size: 0.75rem; + font-family: var(--font-sans); + font-weight: 600; + cursor: pointer; + transition: all var(--transition-fast); +} + +.btn-copy-code:hover { + background: var(--primary); + color: white; + border-color: var(--primary); +} + +.btn-copy-code.copied { + background: var(--success); + color: white; + border-color: var(--success); +} + +/* Syntax Highlights */ .kw { color: #f472b6; font-weight: bold; } .fn { color: #60a5fa; } .str { color: #a7f3d0; } @@ -267,89 +555,95 @@ pre code { .var { color: #cbd5e1; } .attr { color: #38bdf8; } -/* Keyboard Shortcut Badges */ +/* Keyboard Badges */ kbd { display: inline-block; - padding: 3px 7px; + padding: 3px 8px; font-family: var(--font-mono); - font-size: 0.85em; + font-size: 0.82em; font-weight: 700; color: #334155; - background-color: #f1f5f9; + background-color: #f8fafc; border: 1px solid #cbd5e1; border-bottom: 2px solid #94a3b8; border-radius: 4px; - box-shadow: 0 1px 1px rgba(0,0,0,0.1); + box-shadow: 0 1px 1px rgba(0,0,0,0.08); margin: 0 2px; } -/* Extension Cards */ -.extension-grid { - display: grid; - grid-template-columns: repeat(auto-fit, minmax(260px, 1fr)); - gap: 16px; - margin: 20px 0; +/* ========================================================================== + Interactive Task Checklists + ========================================================================== */ + +.task-list { + list-style: none; + margin: 18px 0; + display: flex; + flex-direction: column; + gap: 10px; } -.extension-card { - background: #ffffff; - border: 1px solid var(--border-color); - border-radius: var(--radius-md); - padding: 16px; +.task-item { display: flex; - gap: 14px; align-items: flex-start; - box-shadow: var(--shadow-sm); - transition: transform 0.2s, border-color 0.2s; + gap: 14px; + padding: 14px 18px; + background: #ffffff; + border: 1px solid var(--border-subtle); + border-radius: var(--radius-md); + transition: all var(--transition-fast); + box-shadow: var(--shadow-xs); } -.extension-card:hover { - transform: translateY(-2px); +.task-item:hover { border-color: var(--primary); + background: var(--primary-light); } -.extension-icon { - font-size: 1.8rem; - background: var(--primary-light); - width: 44px; - height: 44px; - display: flex; - align-items: center; - justify-content: center; - border-radius: var(--radius-sm); +.task-item.task-completed { + background: var(--emerald-light); + border-color: #a7f3d0; + opacity: 0.85; +} + +.task-item.task-completed .task-label { + text-decoration: line-through; + color: #065f46; +} + +.task-checkbox { + width: 20px; + height: 20px; + margin-top: 2px; + accent-color: var(--primary); + cursor: pointer; flex-shrink: 0; } -.extension-info h4 { - font-size: 1.05rem; - color: var(--text-main); - margin-bottom: 4px; +.task-label { + flex: 1; + font-size: 0.96rem; + line-height: 1.5; } -.extension-info p { - font-size: 0.88rem; - color: var(--text-muted); - margin-bottom: 0; - line-height: 1.4; -} - -/* Accordion / Details */ +/* Details & Accordions */ details { background: #f8fafc; - border: 1px solid var(--border-color); + border: 1px solid var(--border-subtle); border-radius: var(--radius-sm); - padding: 12px 16px; - margin: 12px 0; - transition: all 0.2s; + padding: 14px 18px; + margin: 14px 0; + transition: all var(--transition-fast); } details[open] { background: #ffffff; border-color: var(--primary); + box-shadow: var(--shadow-sm); } summary { - font-weight: 600; + font-weight: 700; cursor: pointer; color: var(--primary); user-select: none; @@ -363,161 +657,78 @@ summary:hover { } .details-content { - margin-top: 12px; - padding-top: 10px; - border-top: 1px solid var(--border-color); + margin-top: 14px; + padding-top: 12px; + border-top: 1px solid var(--border-subtle); } -/* Checklists & Tasks */ -.task-list { - list-style: none; - margin: 15px 0; -} - -.task-item { - display: flex; - align-items: flex-start; - gap: 12px; - padding: 10px 14px; - background: #ffffff; - border: 1px solid var(--border-color); - border-radius: var(--radius-sm); - margin-bottom: 8px; - transition: background 0.2s; -} - -.task-item:hover { - background: var(--primary-light); -} - -.task-checkbox { - width: 18px; - height: 18px; - margin-top: 3px; - accent-color: var(--primary); - cursor: pointer; -} - -.task-label { - flex: 1; -} - -/* Grid & Roadmap Cards */ -.roadmap-grid { - display: grid; - grid-template-columns: repeat(auto-fit, minmax(260px, 1fr)); - gap: 20px; - margin: 25px 0; -} - -.roadmap-card { - background: var(--bg-card); - border: 1px solid var(--border-color); - border-radius: var(--radius-md); - padding: 20px; - text-decoration: none; - color: var(--text-main); - display: flex; - flex-direction: column; - justify-content: space-between; - transition: all 0.25s ease; - box-shadow: var(--shadow-sm); -} - -.roadmap-card:hover { - transform: translateY(-4px); - box-shadow: var(--shadow-lg); - border-color: var(--primary); -} - -.roadmap-number { - font-size: 0.8rem; - font-weight: 700; - text-transform: uppercase; - color: var(--primary); - background: var(--primary-light); - display: inline-block; - padding: 2px 8px; - border-radius: 12px; - margin-bottom: 10px; - align-self: flex-start; -} - -.roadmap-title { - font-size: 1.2rem; - font-weight: 700; - margin-bottom: 8px; - color: var(--text-main); -} - -.roadmap-desc { - font-size: 0.92rem; - color: var(--text-muted); - margin-bottom: 14px; - flex: 1; -} - -.roadmap-footer { - font-size: 0.85rem; - font-weight: 600; - color: var(--primary); - display: flex; - align-items: center; - gap: 6px; -} - -/* Buttons & Links */ +/* Buttons */ .btn { display: inline-flex; align-items: center; gap: 8px; - padding: 10px 18px; + padding: 10px 20px; background: var(--primary); color: white; text-decoration: none; - font-weight: 600; + font-weight: 700; + font-size: 0.92rem; border-radius: var(--radius-sm); border: none; cursor: pointer; - transition: all 0.2s; + transition: all var(--transition-fast); box-shadow: var(--shadow-sm); } .btn:hover { background: var(--primary-hover); - transform: translateY(-1px); + transform: translateY(-2px); + box-shadow: var(--shadow-md); } .btn-secondary { - background: #f1f5f9; + background: #ffffff; color: var(--text-main); - border: 1px solid var(--border-color); + border: 1px solid var(--border-subtle); } .btn-secondary:hover { - background: #e2e8f0; + background: var(--bg-subtle); + border-color: var(--border-focus); } .footer-nav { display: flex; justify-content: space-between; - margin-top: 35px; - gap: 15px; + margin-top: 40px; + gap: 16px; flex-wrap: wrap; } /* ========================================================================== - GAMIFICATION HUD & TROPHY ROOM STYLES + GAMIFICATION HUD & BATTLE-PASS STYLES ========================================================================== */ .hud-card { - background: linear-gradient(135deg, #1e293b 0%, #0f172a 100%); + background: linear-gradient(145deg, #090d16 0%, #0f172a 100%); color: #f8fafc; - border-radius: var(--radius-md); - padding: 24px; - margin-bottom: 30px; - box-shadow: var(--shadow-md); + border-radius: var(--radius-lg); + padding: 28px; + margin-bottom: 35px; + box-shadow: var(--shadow-xl); border: 1px solid rgba(255, 255, 255, 0.1); + position: relative; + overflow: hidden; +} + +.hud-card::before { + content: ""; + position: absolute; + top: 0; + left: 0; + right: 0; + height: 4px; + background: linear-gradient(90deg, #6366f1 0%, #06b6d4 50%, #10b981 100%); } .hud-header { @@ -525,43 +736,43 @@ summary:hover { justify-content: space-between; align-items: center; flex-wrap: wrap; - gap: 15px; - margin-bottom: 18px; + gap: 16px; + margin-bottom: 20px; } .hud-user { display: flex; align-items: center; - gap: 14px; + gap: 16px; } .hud-avatar { - font-size: 2.2rem; + font-size: 2.4rem; background: rgba(99, 102, 241, 0.2); - border: 2px solid var(--primary); - width: 54px; - height: 54px; + border: 2px solid #818cf8; + width: 60px; + height: 60px; display: flex; align-items: center; justify-content: center; border-radius: 50%; - box-shadow: 0 0 15px rgba(99, 102, 241, 0.4); + box-shadow: 0 0 20px rgba(99, 102, 241, 0.5); } .hud-name { - font-size: 1.25rem; + font-size: 1.35rem; font-weight: 800; color: #ffffff; } .hud-title { - font-size: 0.92rem; + font-size: 0.95rem; color: #94a3b8; } .hud-rank { color: #fbbf24; - font-weight: 700; + font-weight: 800; } .hud-stats { @@ -571,55 +782,58 @@ summary:hover { } .hud-stat-box { - background: rgba(255, 255, 255, 0.07); + background: rgba(255, 255, 255, 0.06); border: 1px solid rgba(255, 255, 255, 0.1); - padding: 8px 14px; + padding: 10px 16px; border-radius: var(--radius-sm); display: flex; flex-direction: column; align-items: center; - min-width: 90px; + min-width: 95px; + backdrop-filter: blur(6px); } .hud-stat-value { - font-size: 1rem; + font-size: 1.15rem; font-weight: 800; color: #38bdf8; } .hud-stat-label { - font-size: 0.75rem; + font-size: 0.72rem; color: #94a3b8; text-transform: uppercase; - letter-spacing: 0.5px; + letter-spacing: 0.8px; + font-weight: 700; } .hud-progress-container { - margin: 15px 0; + margin: 18px 0; } .hud-progress-labels { display: flex; justify-content: space-between; - font-size: 0.85rem; + font-size: 0.88rem; color: #cbd5e1; - margin-bottom: 6px; + margin-bottom: 8px; + font-weight: 600; } .hud-progress-bar-bg { - background: rgba(255, 255, 255, 0.12); - height: 14px; - border-radius: 7px; + background: rgba(255, 255, 255, 0.1); + height: 16px; + border-radius: 8px; overflow: hidden; position: relative; } .hud-progress-bar-fill { - background: linear-gradient(90deg, #10b981 0%, #06b6d4 100%); + background: linear-gradient(90deg, #10b981 0%, #06b6d4 50%, #6366f1 100%); height: 100%; - border-radius: 7px; - transition: width 0.6s cubic-bezier(0.4, 0, 0.2, 1); - box-shadow: 0 0 10px rgba(16, 185, 129, 0.5); + border-radius: 8px; + transition: width 0.8s cubic-bezier(0.16, 1, 0.3, 1); + box-shadow: 0 0 15px rgba(16, 185, 129, 0.6); } .hud-footer { @@ -627,30 +841,31 @@ summary:hover { justify-content: space-between; align-items: center; flex-wrap: wrap; - gap: 10px; - margin-top: 15px; - padding-top: 15px; - border-top: 1px solid rgba(255, 255, 255, 0.1); + gap: 12px; + margin-top: 18px; + padding-top: 18px; + border-top: 1px solid rgba(255, 255, 255, 0.08); } .hud-btn { background: linear-gradient(135deg, #4f46e5 0%, #6366f1 100%); color: white; border: none; - padding: 8px 16px; + padding: 10px 18px; border-radius: var(--radius-sm); - font-weight: 700; - font-size: 0.88rem; + font-weight: 800; + font-size: 0.9rem; cursor: pointer; - transition: all 0.2s; + transition: all var(--transition-fast); display: inline-flex; align-items: center; gap: 8px; + box-shadow: 0 4px 15px rgba(79, 70, 229, 0.4); } .hud-btn:hover { - transform: translateY(-1px); - box-shadow: 0 4px 12px rgba(99, 102, 241, 0.4); + transform: translateY(-2px); + box-shadow: 0 6px 20px rgba(79, 70, 229, 0.6); } .hud-cli-tip { @@ -659,48 +874,48 @@ summary:hover { } .hud-cli-tip code { - background: rgba(0, 0, 0, 0.3); + background: rgba(0, 0, 0, 0.4); color: #38bdf8; border: 1px solid rgba(255, 255, 255, 0.1); } -/* Trophy Room Grid */ +/* Trophy Room */ .trophy-room { - margin-top: 20px; - padding-top: 15px; - border-top: 1px dashed rgba(255, 255, 255, 0.15); + margin-top: 22px; + padding-top: 18px; + border-top: 1px dashed rgba(255, 255, 255, 0.12); } .trophy-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(260px, 1fr)); - gap: 14px; - margin-top: 12px; + gap: 16px; + margin-top: 14px; } .trophy-card { - padding: 14px; - border-radius: var(--radius-sm); + padding: 16px; + border-radius: var(--radius-md); display: flex; - gap: 12px; + gap: 14px; align-items: flex-start; - transition: all 0.2s; + transition: all var(--transition-fast); } .trophy-unlocked { - background: rgba(16, 185, 129, 0.1); + background: rgba(16, 185, 129, 0.12); border: 1px solid #10b981; - box-shadow: 0 0 10px rgba(16, 185, 129, 0.15); + box-shadow: 0 0 15px rgba(16, 185, 129, 0.2); } .trophy-locked { - background: rgba(255, 255, 255, 0.04); - border: 1px solid rgba(255, 255, 255, 0.08); - opacity: 0.65; + background: rgba(255, 255, 255, 0.03); + border: 1px solid rgba(255, 255, 255, 0.06); + opacity: 0.6; } .trophy-icon { - font-size: 1.8rem; + font-size: 2rem; flex-shrink: 0; } @@ -709,70 +924,66 @@ summary:hover { } .trophy-title { - font-size: 0.95rem; - font-weight: 700; + font-size: 1rem; + font-weight: 800; color: #ffffff; - margin-bottom: 3px; + margin-bottom: 4px; } .trophy-desc { - font-size: 0.82rem; + font-size: 0.84rem; color: #94a3b8; - line-height: 1.35; + line-height: 1.4; margin-bottom: 6px; } .trophy-badge-status { font-size: 0.75rem; - font-weight: 700; + font-weight: 800; + text-transform: uppercase; } -.trophy-unlocked .trophy-badge-status { - color: #10b981; -} - -.trophy-locked .trophy-badge-status { - color: #64748b; -} +.trophy-unlocked .trophy-badge-status { color: #10b981; } +.trophy-locked .trophy-badge-status { color: #64748b; } /* ========================================================================== - PARSONS PUZZLES & PRIMM WIDGETS + Parsons Problems Widgets ========================================================================== */ .parsons-box { background: #ffffff; - border: 2px solid var(--primary-light); - border-radius: var(--radius-md); - padding: 20px; - margin: 25px 0; + border: 2px solid #e0e7ff; + border-radius: var(--radius-lg); + padding: 24px; + margin: 28px 0; box-shadow: var(--shadow-sm); } .parsons-header { - margin-bottom: 15px; + margin-bottom: 16px; } .parsons-title { display: flex; justify-content: space-between; align-items: center; - font-size: 1.15rem; + font-size: 1.2rem; font-weight: 800; color: var(--primary); margin-bottom: 6px; } .parsons-badge { - background: var(--warning-light); - color: #b45309; - padding: 3px 10px; - border-radius: 20px; - font-size: 0.8rem; - font-weight: 700; + background: var(--amber-light); + color: var(--amber); + padding: 4px 12px; + border-radius: var(--radius-full); + font-size: 0.82rem; + font-weight: 800; } .parsons-instruction { - font-size: 0.92rem; + font-size: 0.95rem; color: var(--text-muted); margin: 0; } @@ -780,30 +991,31 @@ summary:hover { .parsons-board { display: flex; flex-direction: column; - gap: 8px; - margin: 15px 0; + gap: 10px; + margin: 18px 0; } .parsons-line { display: flex; align-items: center; - gap: 12px; + gap: 14px; background: #f8fafc; - border: 1px solid var(--border-color); + border: 1px solid var(--border-subtle); border-radius: var(--radius-sm); - padding: 10px 14px; + padding: 12px 16px; cursor: grab; - transition: all 0.2s; + transition: all var(--transition-fast); } .parsons-line:hover { border-color: var(--primary); background: var(--primary-light); + transform: translateX(2px); } .parsons-handle { color: var(--text-muted); - font-size: 1.1rem; + font-size: 1.2rem; cursor: grab; user-select: none; } @@ -815,23 +1027,25 @@ summary:hover { .parsons-code code { background: transparent; color: var(--text-main); - font-size: 0.95rem; + font-size: 0.96rem; padding: 0; } .parsons-actions { display: flex; - gap: 4px; + gap: 6px; } .btn-parsons-move { background: #ffffff; - border: 1px solid var(--border-color); + border: 1px solid var(--border-subtle); border-radius: 4px; - padding: 2px 8px; - font-size: 0.75rem; + padding: 4px 10px; + font-size: 0.8rem; cursor: pointer; color: var(--text-muted); + font-weight: 700; + transition: all var(--transition-fast); } .btn-parsons-move:hover:not(:disabled) { @@ -841,19 +1055,19 @@ summary:hover { } .btn-parsons-move:disabled { - opacity: 0.3; + opacity: 0.25; cursor: not-allowed; } .parsons-controls { display: flex; - gap: 10px; - margin-top: 15px; + gap: 12px; + margin-top: 18px; flex-wrap: wrap; } /* ========================================================================== - OFFICIAL CERTIFICATE MODAL + Certificate Modal ========================================================================== */ .certificate-overlay { @@ -862,8 +1076,8 @@ summary:hover { left: 0; right: 0; bottom: 0; - background: rgba(15, 23, 42, 0.85); - backdrop-filter: blur(4px); + background: rgba(15, 23, 42, 0.88); + backdrop-filter: blur(8px); z-index: 9999; display: flex; align-items: center; @@ -873,85 +1087,87 @@ summary:hover { .certificate-container { background: #ffffff; - border-radius: var(--radius-md); - padding: 20px; - max-width: 750px; + border-radius: var(--radius-lg); + padding: 24px; + max-width: 780px; width: 100%; max-height: 90vh; overflow-y: auto; - box-shadow: 0 25px 50px -12px rgba(0, 0, 0, 0.25); + box-shadow: 0 25px 50px -12px rgba(0, 0, 0, 0.35); } .certificate-border { border: 6px double #d97706; border-radius: var(--radius-sm); - padding: 30px; + padding: 35px 25px; text-align: center; background: #fffdfa; } .certificate-badge { - font-size: 0.85rem; + font-size: 0.9rem; font-weight: 800; letter-spacing: 2px; color: #b45309; - margin-bottom: 10px; + margin-bottom: 12px; } .certificate-headline { - font-size: 2rem; + font-size: 2.2rem; color: #1e293b; margin-bottom: 8px; + font-weight: 800; } .certificate-sub { color: var(--text-muted); - font-size: 0.95rem; + font-size: 1rem; margin-bottom: 12px; } .certificate-student-name { - font-size: 1.8rem; + font-size: 2rem; font-weight: 800; color: var(--primary); text-decoration: underline; text-decoration-color: #fbbf24; - text-underline-offset: 6px; - margin: 15px 0; + text-underline-offset: 8px; + margin: 16px 0; } .certificate-text { color: var(--text-muted); - font-size: 0.95rem; + font-size: 1rem; } .certificate-track-title { - font-size: 1.35rem; + font-size: 1.45rem; color: #0f172a; - margin: 8px 0; + margin: 10px 0; + font-weight: 800; } .certificate-desc { - font-size: 0.88rem; + font-size: 0.92rem; color: #64748b; - max-width: 550px; - margin: 0 auto 20px auto; - line-height: 1.45; + max-width: 580px; + margin: 0 auto 24px auto; + line-height: 1.5; } .certificate-meta { display: flex; justify-content: space-around; - font-size: 0.9rem; + font-size: 0.95rem; color: #334155; - margin: 20px 0; - padding: 12px 0; + margin: 24px 0; + padding: 14px 0; border-top: 1px solid #e2e8f0; border-bottom: 1px solid #e2e8f0; } .certificate-seal { - font-size: 1rem; + font-size: 1.05rem; font-weight: 800; color: #b45309; letter-spacing: 1px; @@ -972,12 +1188,12 @@ summary:hover { } /* Responsive */ -@media (max-width: 600px) { - header h1 { font-size: 1.6rem; } - .card { padding: 18px; } +@media (max-width: 768px) { + header h1 { font-size: 1.8rem; } + .card { padding: 20px; } .footer-nav { flex-direction: column; } .footer-nav .btn { width: 100%; justify-content: center; } - .extension-grid { grid-template-columns: 1fr; } .hud-header { flex-direction: column; align-items: flex-start; } .hud-stats { width: 100%; justify-content: space-between; } + .roadmap-grid { grid-template-columns: 1fr; } } diff --git a/assets/ui_enhancements.js b/assets/ui_enhancements.js new file mode 100644 index 0000000..1384680 --- /dev/null +++ b/assets/ui_enhancements.js @@ -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 = "📋 Kopieren"; + copyBtn.title = "Code in Zwischenablage kopieren"; + + copyBtn.addEventListener("click", async () => { + const codeText = pre.innerText; + try { + await navigator.clipboard.writeText(codeText); + copyBtn.innerHTML = "✅ Kopiert!"; + copyBtn.classList.add("copied"); + setTimeout(() => { + copyBtn.innerHTML = "📋 Kopieren"; + copyBtn.classList.remove("copied"); + }, 2000); + } catch (err) { + copyBtn.innerHTML = "❌ Fehler"; + } + }); + + 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"; + } + } + }); + } + }); +})(); diff --git a/index.html b/index.html index 4100196..c930594 100644 --- a/index.html +++ b/index.html @@ -175,6 +175,13 @@ python3 test_all.py # Prüft alle 27 Kapitel auf einen Schlag und synchronisi + +
+ 🔍 + + +
+
@@ -840,5 +847,6 @@ object has no attribute 'gang' + diff --git a/lehrpfad_1_grundlagen/01_erste_schritte_taschenrechner/index.html b/lehrpfad_1_grundlagen/01_erste_schritte_taschenrechner/index.html index 916d95d..a82c7ea 100644 --- a/lehrpfad_1_grundlagen/01_erste_schritte_taschenrechner/index.html +++ b/lehrpfad_1_grundlagen/01_erste_schritte_taschenrechner/index.html @@ -321,5 +321,6 @@ + diff --git a/lehrpfad_1_grundlagen/02_variablen_und_datentypen/index.html b/lehrpfad_1_grundlagen/02_variablen_und_datentypen/index.html index c9f8ce9..5a8abdd 100644 --- a/lehrpfad_1_grundlagen/02_variablen_und_datentypen/index.html +++ b/lehrpfad_1_grundlagen/02_variablen_und_datentypen/index.html @@ -272,5 +272,6 @@ + diff --git a/lehrpfad_1_grundlagen/03_ein_und_ausgabe/index.html b/lehrpfad_1_grundlagen/03_ein_und_ausgabe/index.html index 34a4ec4..0b69d07 100644 --- a/lehrpfad_1_grundlagen/03_ein_und_ausgabe/index.html +++ b/lehrpfad_1_grundlagen/03_ein_und_ausgabe/index.html @@ -275,5 +275,6 @@ return f"Steckbrief: {name} | Größe: {groesse_m:.2f} m | Gewicht: {gewicht_kg: + diff --git a/lehrpfad_1_grundlagen/04_verzweigungen_und_bedingungen/index.html b/lehrpfad_1_grundlagen/04_verzweigungen_und_bedingungen/index.html index fee0d1b..d609105 100644 --- a/lehrpfad_1_grundlagen/04_verzweigungen_und_bedingungen/index.html +++ b/lehrpfad_1_grundlagen/04_verzweigungen_und_bedingungen/index.html @@ -307,5 +307,6 @@ return False + diff --git a/lehrpfad_1_grundlagen/05_schleifen_und_wiederholungen/index.html b/lehrpfad_1_grundlagen/05_schleifen_und_wiederholungen/index.html index 19df66b..990d0ca 100644 --- a/lehrpfad_1_grundlagen/05_schleifen_und_wiederholungen/index.html +++ b/lehrpfad_1_grundlagen/05_schleifen_und_wiederholungen/index.html @@ -348,5 +348,6 @@ + diff --git a/lehrpfad_1_grundlagen/06_funktionen_und_module/index.html b/lehrpfad_1_grundlagen/06_funktionen_und_module/index.html index ab99dc3..f7ff36e 100644 --- a/lehrpfad_1_grundlagen/06_funktionen_und_module/index.html +++ b/lehrpfad_1_grundlagen/06_funktionen_und_module/index.html @@ -301,5 +301,6 @@ + diff --git a/lehrpfad_1_grundlagen/07_listen_und_sequenzen/index.html b/lehrpfad_1_grundlagen/07_listen_und_sequenzen/index.html index b2997ad..d883315 100644 --- a/lehrpfad_1_grundlagen/07_listen_und_sequenzen/index.html +++ b/lehrpfad_1_grundlagen/07_listen_und_sequenzen/index.html @@ -292,5 +292,6 @@ + diff --git a/lehrpfad_1_grundlagen/08_textverarbeitung_und_strings/index.html b/lehrpfad_1_grundlagen/08_textverarbeitung_und_strings/index.html index 6dbe68b..686cafd 100644 --- a/lehrpfad_1_grundlagen/08_textverarbeitung_und_strings/index.html +++ b/lehrpfad_1_grundlagen/08_textverarbeitung_und_strings/index.html @@ -247,5 +247,6 @@ + diff --git a/lehrpfad_1_grundlagen/09_dictionaries_und_sets/index.html b/lehrpfad_1_grundlagen/09_dictionaries_und_sets/index.html index c881385..61d21e7 100644 --- a/lehrpfad_1_grundlagen/09_dictionaries_und_sets/index.html +++ b/lehrpfad_1_grundlagen/09_dictionaries_und_sets/index.html @@ -321,5 +321,6 @@ + diff --git a/lehrpfad_1_grundlagen/10_comprehensions_datum_algorithmen/index.html b/lehrpfad_1_grundlagen/10_comprehensions_datum_algorithmen/index.html index a2365a2..40fa635 100644 --- a/lehrpfad_1_grundlagen/10_comprehensions_datum_algorithmen/index.html +++ b/lehrpfad_1_grundlagen/10_comprehensions_datum_algorithmen/index.html @@ -271,5 +271,6 @@ + diff --git a/lehrpfad_2_oop_einstieg/00_fehlersuche_und_grundlagen/index.html b/lehrpfad_2_oop_einstieg/00_fehlersuche_und_grundlagen/index.html index 79a2b64..72719cd 100644 --- a/lehrpfad_2_oop_einstieg/00_fehlersuche_und_grundlagen/index.html +++ b/lehrpfad_2_oop_einstieg/00_fehlersuche_und_grundlagen/index.html @@ -225,5 +225,6 @@ + diff --git a/lehrpfad_2_oop_einstieg/01_einstieg_klassen/index.html b/lehrpfad_2_oop_einstieg/01_einstieg_klassen/index.html index fd77aa6..b9f02b8 100644 --- a/lehrpfad_2_oop_einstieg/01_einstieg_klassen/index.html +++ b/lehrpfad_2_oop_einstieg/01_einstieg_klassen/index.html @@ -307,5 +307,6 @@ + diff --git a/lehrpfad_2_oop_einstieg/02_init_und_self/index.html b/lehrpfad_2_oop_einstieg/02_init_und_self/index.html index 1697ad3..034339c 100644 --- a/lehrpfad_2_oop_einstieg/02_init_und_self/index.html +++ b/lehrpfad_2_oop_einstieg/02_init_und_self/index.html @@ -234,5 +234,6 @@ + diff --git a/lehrpfad_2_oop_einstieg/03_methoden_und_verhalten/index.html b/lehrpfad_2_oop_einstieg/03_methoden_und_verhalten/index.html index af24ff4..ec042b0 100644 --- a/lehrpfad_2_oop_einstieg/03_methoden_und_verhalten/index.html +++ b/lehrpfad_2_oop_einstieg/03_methoden_und_verhalten/index.html @@ -214,5 +214,6 @@ + diff --git a/lehrpfad_2_oop_einstieg/04_str_und_darstellung/index.html b/lehrpfad_2_oop_einstieg/04_str_und_darstellung/index.html index 87468d7..a7898c3 100644 --- a/lehrpfad_2_oop_einstieg/04_str_und_darstellung/index.html +++ b/lehrpfad_2_oop_einstieg/04_str_und_darstellung/index.html @@ -221,5 +221,6 @@ + diff --git a/lehrpfad_2_oop_einstieg/04b_umstieg_vscode/index.html b/lehrpfad_2_oop_einstieg/04b_umstieg_vscode/index.html index c5c8751..18c6f20 100644 --- a/lehrpfad_2_oop_einstieg/04b_umstieg_vscode/index.html +++ b/lehrpfad_2_oop_einstieg/04b_umstieg_vscode/index.html @@ -331,5 +331,6 @@ sudo snap install --classic code + diff --git a/lehrpfad_2_oop_einstieg/04c_git_und_versionskontrolle/index.html b/lehrpfad_2_oop_einstieg/04c_git_und_versionskontrolle/index.html index c5cebd4..5b53460 100644 --- a/lehrpfad_2_oop_einstieg/04c_git_und_versionskontrolle/index.html +++ b/lehrpfad_2_oop_einstieg/04c_git_und_versionskontrolle/index.html @@ -227,5 +227,6 @@ + diff --git a/lehrpfad_2_oop_einstieg/05_objekte_kombinieren/index.html b/lehrpfad_2_oop_einstieg/05_objekte_kombinieren/index.html index b178a81..95736bb 100644 --- a/lehrpfad_2_oop_einstieg/05_objekte_kombinieren/index.html +++ b/lehrpfad_2_oop_einstieg/05_objekte_kombinieren/index.html @@ -217,5 +217,6 @@ + diff --git a/lehrpfad_2_oop_einstieg/06_abschlussprojekt_tamagotchi/index.html b/lehrpfad_2_oop_einstieg/06_abschlussprojekt_tamagotchi/index.html index a355f5b..461357f 100644 --- a/lehrpfad_2_oop_einstieg/06_abschlussprojekt_tamagotchi/index.html +++ b/lehrpfad_2_oop_einstieg/06_abschlussprojekt_tamagotchi/index.html @@ -196,5 +196,6 @@ + diff --git a/lehrpfad_3_fortgeschrittenes_oop/07_referenzen_und_speicher/index.html b/lehrpfad_3_fortgeschrittenes_oop/07_referenzen_und_speicher/index.html index 799d449..0f8d7b0 100644 --- a/lehrpfad_3_fortgeschrittenes_oop/07_referenzen_und_speicher/index.html +++ b/lehrpfad_3_fortgeschrittenes_oop/07_referenzen_und_speicher/index.html @@ -247,5 +247,6 @@ STACK (Variablen-Namen) HEAP (Echter Speicher / RAM) + diff --git a/lehrpfad_3_fortgeschrittenes_oop/08_operator_overloading_dunder/index.html b/lehrpfad_3_fortgeschrittenes_oop/08_operator_overloading_dunder/index.html index acb991d..60d3aef 100644 --- a/lehrpfad_3_fortgeschrittenes_oop/08_operator_overloading_dunder/index.html +++ b/lehrpfad_3_fortgeschrittenes_oop/08_operator_overloading_dunder/index.html @@ -296,5 +296,6 @@ + diff --git a/lehrpfad_3_fortgeschrittenes_oop/09_eigene_unit_tests_schreiben/index.html b/lehrpfad_3_fortgeschrittenes_oop/09_eigene_unit_tests_schreiben/index.html index c696f70..d855ef0 100644 --- a/lehrpfad_3_fortgeschrittenes_oop/09_eigene_unit_tests_schreiben/index.html +++ b/lehrpfad_3_fortgeschrittenes_oop/09_eigene_unit_tests_schreiben/index.html @@ -315,5 +315,6 @@ + diff --git a/lehrpfad_3_fortgeschrittenes_oop/10_vererbung_und_super/index.html b/lehrpfad_3_fortgeschrittenes_oop/10_vererbung_und_super/index.html index 6653dba..400cf9e 100644 --- a/lehrpfad_3_fortgeschrittenes_oop/10_vererbung_und_super/index.html +++ b/lehrpfad_3_fortgeschrittenes_oop/10_vererbung_und_super/index.html @@ -375,5 +375,6 @@ + diff --git a/lehrpfad_3_fortgeschrittenes_oop/11_polymorphie_und_interfaces/index.html b/lehrpfad_3_fortgeschrittenes_oop/11_polymorphie_und_interfaces/index.html index 670f0c3..0ae8ed8 100644 --- a/lehrpfad_3_fortgeschrittenes_oop/11_polymorphie_und_interfaces/index.html +++ b/lehrpfad_3_fortgeschrittenes_oop/11_polymorphie_und_interfaces/index.html @@ -408,5 +408,6 @@ + diff --git a/lehrpfad_3_fortgeschrittenes_oop/12_exceptions_und_fehlerbehandlung/index.html b/lehrpfad_3_fortgeschrittenes_oop/12_exceptions_und_fehlerbehandlung/index.html index 84b91b3..3f8f8cf 100644 --- a/lehrpfad_3_fortgeschrittenes_oop/12_exceptions_und_fehlerbehandlung/index.html +++ b/lehrpfad_3_fortgeschrittenes_oop/12_exceptions_und_fehlerbehandlung/index.html @@ -275,5 +275,6 @@ + diff --git a/lehrpfad_3_fortgeschrittenes_oop/13_persistenz_json_und_csv/index.html b/lehrpfad_3_fortgeschrittenes_oop/13_persistenz_json_und_csv/index.html index c221d01..fcb5bf0 100644 --- a/lehrpfad_3_fortgeschrittenes_oop/13_persistenz_json_und_csv/index.html +++ b/lehrpfad_3_fortgeschrittenes_oop/13_persistenz_json_und_csv/index.html @@ -263,5 +263,6 @@ + diff --git a/lehrpfad_3_fortgeschrittenes_oop/14_gui_mit_tkinter/index.html b/lehrpfad_3_fortgeschrittenes_oop/14_gui_mit_tkinter/index.html index 8dabcf8..26f9b89 100644 --- a/lehrpfad_3_fortgeschrittenes_oop/14_gui_mit_tkinter/index.html +++ b/lehrpfad_3_fortgeschrittenes_oop/14_gui_mit_tkinter/index.html @@ -369,5 +369,6 @@ + diff --git a/lehrpfad_3_fortgeschrittenes_oop/15_parameter_und_container/index.html b/lehrpfad_3_fortgeschrittenes_oop/15_parameter_und_container/index.html index 2a3088b..10ad247 100644 --- a/lehrpfad_3_fortgeschrittenes_oop/15_parameter_und_container/index.html +++ b/lehrpfad_3_fortgeschrittenes_oop/15_parameter_und_container/index.html @@ -332,5 +332,6 @@ + diff --git a/lehrpfad_3_fortgeschrittenes_oop/16_master_abschlussprojekt/index.html b/lehrpfad_3_fortgeschrittenes_oop/16_master_abschlussprojekt/index.html index 31ad7f2..757e06e 100644 --- a/lehrpfad_3_fortgeschrittenes_oop/16_master_abschlussprojekt/index.html +++ b/lehrpfad_3_fortgeschrittenes_oop/16_master_abschlussprojekt/index.html @@ -344,5 +344,6 @@ +