Mini HTML-Editor
Neu
Exportieren
Link-Graph
🎨 Galerie
Projekt-Code:
Öffnen
📋 Kein Projekt-Code eingegeben — Dateien werden im
öffentlichen Bereich
gespeichert und nach 24 Stunden automatisch gelöscht. Lege ein
neues Projekt
an um Dateien dauerhaft zu speichern.
Moritz1.html
Speichern
Öffnen
↩ Undo
↪ Redo
A−
A+
Einfügen ▾
🔗 Link
🖼 Bild
🎨 Farbcode
📋 Liste (ul/li)
🃏 Karte (div)
⚡ Javascript-Block
🔒 Schützen
<!DOCTYPE html> <html lang="de"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Trainingsplaner — Dein Wochenplan</title> <link rel="preconnect" href="https://fonts.googleapis.com"> <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin> <link href="https://fonts.googleapis.com/css2?family=Rajdhani:wght@500;600;700&family=IBM+Plex+Sans:wght@400;500;600&family=IBM+Plex+Mono:wght@500;600&display=swap" rel="stylesheet"> <style> :root{ --bg:#1b2027; --surface:#242b34; --surface-2:#2d3640; --text:#edf1f5; --text-dim:#90a0ac; --accent:#1be7c7; --accent-ink:#0d2420; --accent-2:#ffb23e; --border:rgba(255,255,255,0.08); --radius-lg:18px; --radius-md:12px; } *{box-sizing:border-box;} html,body{margin:0;padding:0;} body{ background: radial-gradient(circle at 12% -10%, rgba(27,231,199,0.10), transparent 45%), radial-gradient(circle at 110% 10%, rgba(255,178,62,0.08), transparent 40%), var(--bg); color:var(--text); font-family:'IBM Plex Sans', sans-serif; line-height:1.5; min-height:100vh; } .app{ max-width:880px; margin:0 auto; padding:48px 24px 64px; } /* ---------- Header ---------- */ .hero{ text-align:center; margin-bottom:36px; } .eyebrow{ display:inline-flex; align-items:center; gap:8px; font-family:'IBM Plex Mono', monospace; font-size:12px; letter-spacing:0.18em; color:var(--accent); text-transform:uppercase; margin-bottom:14px; } .eyebrow svg{display:block;} h1{ font-family:'Rajdhani', sans-serif; font-weight:700; font-size:clamp(32px, 5vw, 48px); letter-spacing:0.01em; margin:0 0 10px; } h1 .hl{color:var(--accent);} .sub{ color:var(--text-dim); font-size:16px; max-width:480px; margin:0 auto; } /* ---------- Panels ---------- */ .panel{ background:var(--surface); border:1px solid var(--border); border-radius:var(--radius-lg); padding:28px; margin-bottom:24px; } .field{margin-bottom:26px;} .field:last-of-type{margin-bottom:0;} .field > label{ display:block; font-family:'IBM Plex Mono', monospace; font-size:11px; letter-spacing:0.14em; text-transform:uppercase; color:var(--text-dim); margin-bottom:12px; } .pill-group{ display:flex; flex-wrap:wrap; gap:10px; } .pill{ appearance:none; border:1px solid var(--border); background:var(--surface-2); color:var(--text-dim); font-family:'IBM Plex Sans', sans-serif; font-size:14.5px; font-weight:500; padding:10px 18px; border-radius:999px; cursor:pointer; transition:background .15s ease, color .15s ease, border-color .15s ease, transform .1s ease; } .pill:hover{border-color:rgba(27,231,199,0.5); color:var(--text);} .pill:active{transform:scale(0.97);} .pill.active{ background:var(--accent); border-color:var(--accent); color:var(--accent-ink); font-weight:600; } .pill:focus-visible{outline:2px solid var(--accent); outline-offset:2px;} /* ---------- Days control ---------- */ .days-field{ display:grid; grid-template-columns:1fr 160px; gap:24px; align-items:center; } .days-control{display:flex; flex-direction:column; gap:14px;} .days-readout{ display:flex; align-items:baseline; gap:8px; font-family:'IBM Plex Mono', monospace; } .days-readout span{font-size:30px; font-weight:600; color:var(--accent);} .days-readout small{font-size:13px; color:var(--text-dim);} input[type="range"]{ -webkit-appearance:none; width:100%; height:6px; border-radius:999px; background:var(--surface-2); outline:none; } input[type="range"]::-webkit-slider-thumb{ -webkit-appearance:none; width:22px; height:22px; border-radius:50%; background:var(--accent); border:3px solid var(--bg); cursor:pointer; box-shadow:0 0 0 1px rgba(27,231,199,0.4); } input[type="range"]::-moz-range-thumb{ width:18px; height:18px; border-radius:50%; background:var(--accent); border:3px solid var(--bg); cursor:pointer; } input[type="range"]:focus-visible::-webkit-slider-thumb{outline:2px solid var(--accent); outline-offset:2px;} .ring-wrap{display:flex; justify-content:center;} svg.week-ring{ width:150px; height:150px; display:block; } .ring-label{font-family:'IBM Plex Mono', monospace; font-size:11px;} .ring-count{font-family:'Rajdhani', sans-serif; font-weight:700; font-size:34px;} .ring-count-label{font-family:'IBM Plex Sans', sans-serif; font-size:9px; letter-spacing:0.08em; text-transform:uppercase;} /* ---------- Button ---------- */ .btn-primary{ appearance:none; width:100%; border:none; border-radius:var(--radius-md); background:var(--accent); color:var(--accent-ink); font-family:'Rajdhani', sans-serif; font-size:18px; font-weight:700; letter-spacing:0.03em; text-transform:uppercase; padding:16px; margin-top:28px; cursor:pointer; transition:filter .15s ease, transform .1s ease; } .btn-primary:hover{filter:brightness(1.08);} .btn-primary:active{transform:scale(0.99);} .btn-primary:focus-visible{outline:2px solid var(--accent-2); outline-offset:3px;} .btn-shuffle{ appearance:none; border:1px dashed var(--border); background:transparent; color:var(--text-dim); font-family:'IBM Plex Sans', sans-serif; font-size:13.5px; font-weight:500; padding:9px 16px; border-radius:999px; cursor:pointer; margin-bottom:22px; transition:border-color .15s ease, color .15s ease; } .btn-shuffle:hover{border-color:var(--accent); color:var(--text);} .btn-shuffle:focus-visible{outline:2px solid var(--accent); outline-offset:2px;} /* ---------- Result ---------- */ .result{ opacity:0; transform:translateY(14px); transition:opacity .45s ease, transform .45s ease; } .result.show{opacity:1; transform:translateY(0);} .result-head{ display:flex; flex-wrap:wrap; gap:24px; align-items:center; justify-content:space-between; margin-bottom:22px; } .result-summary h2{ font-family:'Rajdhani', sans-serif; font-size:26px; font-weight:700; margin:0 0 6px; } .result-summary p{ color:var(--text-dim); font-size:14px; margin:0; } .result-summary p strong{color:var(--text); font-weight:600;} .tip-box{ border-left:3px solid var(--accent-2); background:rgba(255,178,62,0.06); border-radius:0 var(--radius-md) var(--radius-md) 0; padding:14px 18px; margin-bottom:24px; font-size:14px; color:var(--text); } .tip-box span{ display:block; font-family:'IBM Plex Mono', monospace; font-size:10.5px; letter-spacing:0.12em; text-transform:uppercase; color:var(--accent-2); margin-bottom:6px; } .days-grid{ display:grid; grid-template-columns:repeat(auto-fit, minmax(220px, 1fr)); gap:14px; } .day-card{ background:var(--surface-2); border:1px solid var(--border); border-radius:var(--radius-md); padding:18px; } .day-card.rest{ background:transparent; border:1px dashed var(--border); } .day-top{ display:flex; align-items:baseline; gap:10px; margin-bottom:14px; } .day-abbr{ font-family:'IBM Plex Mono', monospace; font-weight:600; font-size:24px; color:var(--accent); } .day-card.rest .day-abbr{color:var(--text-dim);} .day-full{ font-size:12px; color:var(--text-dim); text-transform:uppercase; letter-spacing:0.06em; } .day-title{ font-family:'Rajdhani', sans-serif; font-weight:600; font-size:18px; margin:0 0 6px; } .day-meta{ display:flex; align-items:center; gap:12px; margin-bottom:8px; font-family:'IBM Plex Mono', monospace; font-size:13px; color:var(--text-dim); } .intensity{display:flex; gap:3px;} .intensity .dot{ width:7px; height:7px; border-radius:50%; background:var(--border); } .intensity .dot.filled{background:var(--accent-2);} .day-desc{ font-size:13.5px; color:var(--text-dim); margin:0; } .day-card.rest .day-desc{font-style:italic;} .disclaimer{ margin-top:32px; font-size:12.5px; color:var(--text-dim); text-align:center; line-height:1.6; } @media (max-width:560px){ .app{padding:32px 16px 48px;} .panel{padding:20px;} .days-field{grid-template-columns:1fr; gap:18px;} .ring-wrap{justify-content:flex-start;} .result-head{flex-direction:column; align-items:flex-start;} } @media (prefers-reduced-motion:reduce){ .result{transition:none;} .pill, .btn-primary{transition:none;} } </style> </head> <body> <div class="app"> <header class="hero"> <span class="eyebrow"> <svg width="14" height="14" viewBox="0 0 24 24" fill="none"> <circle cx="12" cy="13" r="8" stroke="currentColor" stroke-width="2"/> <path d="M12 13V9" stroke="currentColor" stroke-width="2" stroke-linecap="round"/> <path d="M9 2h6" stroke="currentColor" stroke-width="2" stroke-linecap="round"/> </svg> Trainingsplaner </span> <h1>Plane deine <span class="hl">Trainingswoche</span></h1> <p class="sub">Sportart, Ziel und Tage angeben — du bekommst einen fertigen Wochenplan mit konkreten Einheiten.</p> </header> <section class="panel" id="inputPanel"> <div class="field"> <label>Sportart</label> <div class="pill-group" id="sportGroup"> <button class="pill" data-sport="laufen" type="button" aria-pressed="false">Laufen</button> <button class="pill" data-sport="rad" type="button" aria-pressed="false">Radfahren</button> <button class="pill" data-sport="schwimmen" type="button" aria-pressed="false">Schwimmen</button> <button class="pill" data-sport="kraft" type="button" aria-pressed="false">Krafttraining</button> <button class="pill" data-sport="allgemein" type="button" aria-pressed="false">Allgemein</button> </div> </div> <div class="field"> <label>Trainingsstand</label> <div class="pill-group" id="levelGroup"> <button class="pill" data-level="einsteiger" type="button" aria-pressed="false">Einsteiger</button> <button class="pill" data-level="fortgeschritten" type="button" aria-pressed="false">Fortgeschritten</button> <button class="pill" data-level="profi" type="button" aria-pressed="false">Profi</button> </div> </div> <div class="field"> <label>Ziel</label> <div class="pill-group" id="goalGroup"> <button class="pill" data-goal="wettkampf" type="button" aria-pressed="false">Wettkampf</button> <button class="pill" data-goal="fitness" type="button" aria-pressed="false">Fitness</button> <button class="pill" data-goal="abnehmen" type="button" aria-pressed="false">Abnehmen</button> <button class="pill" data-goal="muskelaufbau" type="button" aria-pressed="false">Muskelaufbau</button> </div> </div> <div class="field days-field"> <div class="days-control"> <label for="daysSlider" style="margin-bottom:0;">Trainingstage pro Woche</label> <div class="days-readout"><span id="daysValue">4</span><small>Tage / Woche</small></div> <input type="range" min="1" max="7" value="4" id="daysSlider" aria-label="Trainingstage pro Woche"> </div> <div class="ring-wrap"> <svg class="week-ring" id="previewRing" viewBox="0 0 200 200" role="img" aria-label="Vorschau der Trainingsverteilung über die Woche"></svg> </div> </div> <button class="btn-primary" id="generateBtn" type="button">Plan erstellen</button> </section> <section class="panel result" id="resultPanel" hidden> <div class="result-head"> <div class="result-summary"> <h2 id="resultTitle">Dein Wochenplan</h2> <p id="resultSubtitle"></p> </div> <svg class="week-ring" id="resultRing" viewBox="0 0 200 200" role="img" aria-label="Trainingsverteilung über die Woche"></svg> </div> <button class="btn-shuffle" id="shuffleBtn" type="button">🔀 Andere Einheiten vorschlagen</button> <div class="tip-box" id="tipBox"> <span>Coach-Tipp</span> <span id="tipText" style="font-family:'IBM Plex Sans', sans-serif; font-size:14px; text-transform:none; letter-spacing:normal; color:var(--text);"></span> </div> <div class="days-grid" id="daysGrid"></div> </section> <p class="disclaimer"> Dieser Plan ist ein automatisch erstellter Vorschlag zur Orientierung und ersetzt keine individuelle Beratung. Höre auf deinen Körper — bei Beschwerden, Vorerkrankungen oder als Trainingseinsteiger:in sprich vorher mit einer Ärztin/einem Arzt oder einer Trainerin/einem Trainer. </p> </div> <script> (function(){ /* ============ Daten ============ */ const WEEKDAYS = [ {abbr:'MO', full:'Montag'}, {abbr:'DI', full:'Dienstag'}, {abbr:'MI', full:'Mittwoch'}, {abbr:'DO', full:'Donnerstag'}, {abbr:'FR', full:'Freitag'}, {abbr:'SA', full:'Samstag'}, {abbr:'SO', full:'Sonntag'} ]; const DAY_PATTERNS = { 1:[2], 2:[1,4], 3:[0,2,4], 4:[0,1,3,5], 5:[0,1,2,4,5], 6:[0,1,2,3,4,5], 7:[0,1,2,3,4,5,6] }; const RING_COLORS = { accent:'#1be7c7', accent2:'#ffb23e', border:'#39424d', text:'#edf1f5', textDim:'#90a0ac' }; const SPORTS = { laufen:{ name:'Laufen', categories:{ easy:[ {title:'Lockerer Dauerlauf', desc:'Ruhiges Tempo, du könntest dich problemlos unterhalten — baut die aerobe Basis auf.', duration:40, intensity:1}, {title:'Lockerer Lauf mit Steigerungen', desc:'Entspanntes Grundtempo, am Ende 4–6 lockere Steigerungsläufe zur Auflockerung.', duration:35, intensity:1}, {title:'Naturlauf im Park', desc:'Ruhiges Tempo auf weichem Untergrund wie Wald oder Park, schont die Gelenke.', duration:40, intensity:1}, {title:'Atem-Fokus-Lauf', desc:'Sehr ruhiger Dauerlauf. Konzentration rein auf gleichmäßige, tiefe Nasenatmung.', duration:30, intensity:1}, {title:'Crosstrail-Light', desc:'Lockerer Grundlagenlauf durch hügeliges oder unebenes Gelände zur sensorischen Fußkräftigung.', duration:45, intensity:1}, {title:'Nüchternlauf', desc:'Sehr ruhiger, moderater Lauf am Morgen vor dem Frühstück zur Optimierung des Fettstoffwechsels.', duration:30, intensity:1} ], easy2:[ {title:'Regenerationslauf', desc:'Sehr lockeres Tempo zur aktiven Erholung zwischen harten Einheiten.', duration:30, intensity:1}, {title:'Spaziergang mit Lauf-Einlagen', desc:'Lockeres Gehen mit kurzen, sehr ruhigen Laufabschnitten zur aktiven Erholung.', duration:25, intensity:1}, {title:'Shake-out-Lauf', desc:'Sehr kurze, lockere Laufeinheit, um die Beine nach einer harten Einheit zu lockern.', duration:20, intensity:1}, {title:'Barfuß-Rasenrunden', desc:'Minimalistisches, extrem ruhiges Traben auf weichem Rasen (z.B. Sportplatz) zur Fußregeneration.', duration:15, intensity:1}, {title:'Super-Slow-Recovery', desc:'Extrem langsames Traben, bewusste Entlastung aller Muskelketten, Fokus auf lockere Armführung.', duration:25, intensity:1} ], long:[ {title:'Langer Lauf', desc:'Gleichmäßiges, ruhiges Tempo über eine deutlich längere Distanz als gewohnt.', duration:75, intensity:2}, {title:'Langer Lauf mit Tempowechseln', desc:'Grundsätzlich ruhiges Tempo, dabei mehrfach 3–5 Minuten zügiger eingestreut.', duration:75, intensity:2}, {title:'Long Run im Negative Split', desc:'Erste Hälfte bewusst ruhig, zweite Hälfte minimal zügiger laufen.', duration:80, intensity:2}, {title:'Progressiver langer Lauf', desc:'Alle 20 Minuten das Tempo minimal anziehen, sodass die letzten 10 Minuten nahe dem Race-Pace sind.', duration:85, intensity:2}, {title:'Zeithunger-Grundlagenlauf', desc:'Sehr langes, gleichmäßiges Abspulen im aeroben Wohlfühlbereich zur mentalen Abhärtung.', duration:90, intensity:2} ], intervals:[ {title:'Intervalltraining', desc:'Kurze, intensive Belastungen mit Trabpausen — steigert Tempo und Schwelle.', duration:45, intensity:3}, {title:'Hügelsprints', desc:'Kurze, intensive Sprints einen Hügel hinauf, Trabpause beim Zurückgehen.', duration:40, intensity:3}, {title:'Pyramiden-Intervalle', desc:'Belastungsdauer steigt und sinkt stufenweise (z. B. 1-2-3-2-1 Minuten) mit Trabpausen.', duration:45, intensity:3}, {title:'30-30 HIIT Intervalle', desc:'Wechsel aus 30 Sekunden maximalem Sprint und 30 Sekunden lockerem Traben im Dauerwechsel.', duration:35, intensity:3}, {title:'Laktat-Toleranz-Blöcke', desc:'3x 1000m im harten Renntempo mit jeweils 3 Minuten Gehpause zur vollständigen Erholung.', duration:40, intensity:3} ], tempo:[ {title:'Tempodauerlauf', desc:'Strecke im flotten, gleichbleibend anstrengenden Tempo nahe der Schwelle.', duration:35, intensity:2}, {title:'Fahrtspiel (Fartlek)', desc:'Spielerischer Wechsel zwischen schnellerem und lockerem Tempo nach Gefühl.', duration:40, intensity:2}, {title:'Cruise Intervals', desc:'Mehrere Abschnitte im flotten, aber kontrollierten Tempo mit kurzen Gehpausen.', duration:35, intensity:2}, {title:'Schwellen-Akkumulation', desc:'2x 15 Minuten knapp unter der anaeroben Schwelle mit 5 Minuten lockerem Traben dazwischen.', duration:45, intensity:2}, {title:'Wechselsprint-Fahrtspiel', desc:'Alle 3 Minuten für 45 Sekunden das Tempo drastisch verschärfen, danach direkt zurück ins normale GA1-Tempo.', duration:40, intensity:2} ], strength1:[ {title:'Lauf-Stabi & Beinkraft', desc:'Kniebeugen, Ausfallschritte und Rumpfübungen zur Verletzungsprävention.', duration:30, intensity:2}, {title:'Einbeinige Stabilität', desc:'Übungen wie einbeinige Kniebeugen und Standwaage für Balance und Kraft.', duration:25, intensity:2}, {title:'Rumpf- und Hüftkraft', desc:'Planks, Seitstütz und Hüftheben zur Stabilisierung des Laufstils.', duration:25, intensity:2}, {title:'Isometrisches Beinkraft-Protokoll', desc:'Wandsitz-Variationen und einbeiniges Halten zur Stärkung der Sehnenstrukturen.', duration:30, intensity:2}, {title:'Carioca & Plyos', desc:'Seitliche Laufkoordination kombiniert mit leichten Strecksprüngen für die Fußgelenkstabilität.', duration:25, intensity:2} ], strength2:[ {title:'Athletik & Sprungkraft', desc:'Plyometrische Übungen und Sprünge für mehr Laufökonomie.', duration:25, intensity:2}, {title:'Treppentraining', desc:'Sprünge und schnelle Schritte auf einer Treppe für Power und Reaktivkraft.', duration:25, intensity:2}, {title:'Koordinationsleiter', desc:'Schnelle Fußarbeit mit der Sprintleiter für Beinarbeit und Koordination.', duration:20, intensity:1}, {title:'Reaktivkraft-Zirkel', desc:'Wechselsprünge, Box-Jumps und Seilsprünge im schnellen Zirkeltakt.', duration:25, intensity:2}, {title:'Core-Rotationsstabilität', desc:'Fokus auf schräge Bauchmuskeln (Russian Twists, Woodchopper) zur Optimierung der Pendelbewegung beim Laufen.', duration:20, intensity:2} ], mobility:[ {title:'Mobility & Dehnen', desc:'Dynamisches Dehnen von Hüfte, Waden und Oberschenkel für freie Bewegung.', duration:20, intensity:1}, {title:'Foam-Rolling & Faszientraining', desc:'Selbstmassage mit der Rolle für Waden, Oberschenkel und Hüfte.', duration:15, intensity:1}, {title:'Yoga für Läufer:innen', desc:'Ruhige Yogaübungen für Hüfte, Rücken und Beinrückseite.', duration:25, intensity:1}, {title:'Hüftöffner-Flow', desc:'Spezifischer, dynamischer Bewegungsablauf zur Mobilisation des Hüftbeugers und Psoas.', duration:20, intensity:1}, {title:'Loaded Stretching', desc:'Sanftes Dehnen mit minimalen Zusatzgewichten zur Verbesserung der exzentrischen Range of Motion.', duration:15, intensity:1} ], technique:[ {title:'Lauf-ABC & Technik', desc:'Steigerungsläufe und Technikdrills für einen ökonomischeren Laufstil.', duration:30, intensity:1}, {title:'Lauf-Drills', desc:'Kniehebe-, Anfersen- und Skippingübungen für einen saubereren Laufstil.', duration:25, intensity:1}, {title:'Bergauf-Technik', desc:'Kurze Anstiege im ruhigen Tempo zur Schulung von Schrittfrequenz und Armeinsatz.', duration:30, intensity:1}, {title:'Frequenz-Overpacing', desc:'Drills mit extrem hoher Schrittfrequenz bei kürzerer Schrittlänge zur Nervensystem-Aktivierung.', duration:20, intensity:1}, {title:'Rhythmus-ABC', desc:'Wechselnde Rhythmus-Schritte (z.B. alle 3 Schritte Kniehub betonen) zur Schulung der Bewegungskoordination.', duration:25, intensity:1} ], race:[ {title:'Tempotest / Zeitfahren', desc:'Simuliere das Renntempo über einen Teil der Wettkampfdistanz.', duration:40, intensity:3}, {title:'Generalprobe im Wettkampftempo', desc:'Fahre einen Teil der Zieldistanz exakt im geplanten Rennpace.', duration:35, intensity:3}, {title:'Zeitfahren über Testdistanz', desc:'Laufe eine feste Strecke so schnell wie möglich, um deine Form zu prüfen.', duration:30, intensity:3}, {title:'Stufen-Belastungstest', desc:'Alle 1000m das Tempo steigern bis zum Maximum, um die aktuelle Herzfrequenz-Grenze auszuloten.', duration:40, intensity:3}, {title:'All-Out 5km Simulation', desc:'Nach gründlichem Warm-up eine exakte 5km-Distanz unter Wettkampfbedingungen auf Anschlag laufen.', duration:35, intensity:3} ] } }, rad:{ name:'Radfahren', categories:{ easy:[ {title:'Lockere Grundlagenfahrt', desc:'Niedrige Trittfrequenz, entspanntes Tempo zum Auffüllen der Ausdauerbasis.', duration:60, intensity:1}, {title:'Spinning bei niedrigem Gang', desc:'Hohe Trittfrequenz bei lockerem Widerstand, schont die Gelenke.', duration:50, intensity:1}, {title:'Flache Genussfahrt', desc:'Entspannte Fahrt auf flachem Terrain ganz ohne Zeitdruck.', duration:55, intensity:1}, {title:'Cadence-Activation', desc:'Lockeres Rollen mit Fokus auf extrem hoher, flüssiger Trittfrequenz (>95 U/Min).', duration:50, intensity:1}, {title:'Urbane Entdeckungsrunde', desc:'Ruhiges Cruisen über neue Routen, rein aerobe Belastung ohne Intensitätsspitzen.', duration:70, intensity:1} ], easy2:[ {title:'Recovery Ride', desc:'Ganz lockeres Spinnen zur aktiven Erholung, möglichst flaches Gelände.', duration:40, intensity:1}, {title:'Lockeres Rollen', desc:'Sehr ruhiges Fahren mit minimaler Anstrengung zur aktiven Erholung.', duration:30, intensity:1}, {title:'Cool-down-Fahrt', desc:'Kurze, lockere Ausfahrt, um die Beine nach einer harten Einheit zu lockern.', duration:25, intensity:1}, {title:'Regeneratives Beinausschütteln', desc:'Kombination aus super leichtem Pedalieren und kurzen Phasen des Rollenlassens mit Muskel-Lockern.', duration:30, intensity:1}, {title:'Kurbel-Rollen ohne Last', desc:'Fahrt auf der freien Rolle oder im kleinsten Gang ohne nennenswerten Widerstand.', duration:35, intensity:1} ], long:[ {title:'Lange Grundlagenfahrt', desc:'Längere Ausfahrt im gleichmäßigen Tempo, idealerweise mit Steigungen.', duration:120, intensity:2}, {title:'Lange Fahrt mit Anstiegen', desc:'Längere Ausfahrt mit mehreren moderaten Steigungen im gleichmäßigen Tempo.', duration:130, intensity:2}, {title:'Grundlagenfahrt mit Tempowechsel', desc:'Lange, ruhige Fahrt im Wechsel mit kurzen, etwas flotteren Abschnitten.', duration:110, intensity:2}, {title:'Overdistance-Ausdauerfahrt', desc:'Sehr lange Fahrt im strikten GA1-Bereich zur Optimierung des Fettstoffwechsels über die Zeitdauer.', duration:150, intensity:2}, {title:'Spike-Grundlage', desc:'Lange Fahrt, bei der alle 30 Minuten ein knackiger 20-Sekunden-Zielsprint eingebaut wird.', duration:120, intensity:2} ], intervals:[ {title:'Intervalle / Bergsprints', desc:'Kurze maximale Belastungen mit Erholungsphasen, z. B. am Anstieg.', duration:50, intensity:3}, {title:'Sprint-Intervalle in der Ebene', desc:'Kurze maximale Antritte mit langen lockeren Erholungsphasen.', duration:45, intensity:3}, {title:'Pyramiden-Belastungen', desc:'Stufenweise steigende und sinkende Belastungsdauer mit Erholung dazwischen.', duration:50, intensity:3}, {title:'VO2max-Sauerstoff-Blöcke', desc:'5x 3 Minuten maximale Belastung knapp unter der Kotzgrenze mit je 3 Minuten lockerer Kurbelpause.', duration:45, intensity:3}, {title:'Tabata-Antritte', desc:'2 Sätze à 4 Minuten mit dem Wechsel: 20s All-Out-Sprint im Stehen, 10s locker rollen.', duration:40, intensity:3} ], tempo:[ {title:'Tempofahrt', desc:'Konstant hohes Tempo im Schwellenbereich über eine festgelegte Strecke.', duration:45, intensity:2}, {title:'Schwellenintervalle', desc:'Mehrere Blöcke im hohen, aber kontrollierten Tempo mit kurzer Erholung.', duration:50, intensity:2}, {title:'Tempo-Wechselfahrt', desc:'Wechsel zwischen zügigem und moderatem Tempo nach Gefühl.', duration:45, intensity:2}, {title:'Sweet-Spot-Intervalle', desc:'2x 20 Minuten bei 90% der FTP (Schwellenleistung). Hart, aber über längere Zeit kontrollierbar.', duration:60, intensity:2}, {title:'Gegenwind-Simulation', desc:'Fahrt im dicken Gang bei niedrigerer Trittfrequenz gegen den Wind oder simuliert am Berg zur Kraftsteigerung.', duration:50, intensity:2} ], strength1:[ {title:'Beinkraft im Gym', desc:'Kniebeugen und einbeinige Übungen für mehr Kraft auf dem Pedal.', duration:35, intensity:2}, {title:'Einbeinige Beinkraft', desc:'Ausfallschritte und einbeinige Kniebeugen für muskuläre Balance.', duration:30, intensity:2}, {title:'Explosive Beinkraft', desc:'Sprungkniebeugen und schnelle Wiederholungen für mehr Antritt.', duration:30, intensity:2}, {title:'Kraftausdauer am Berg (SFR)', desc:'Niedrige Trittfrequenz (50-60 U/Min) im dicken Gang sitzend an einer langen Steigung.', duration:45, intensity:2}, {title:'Pistol-Squat-Progression', desc:'Einbeinige Kniebeugen (ggf. mit Festhalten) zur Beseitigung von Dysbalancen im Druckverhalten.', duration:25, intensity:2} ], strength2:[ {title:'Rumpf & Stabilität', desc:'Core-Training für eine stabile Position im Sattel.', duration:25, intensity:2}, {title:'Core-Zirkel', desc:'Planks, Seitstütz und Rotationsübungen im Zirkel ohne Pause.', duration:20, intensity:2}, {title:'Rücken- und Schulterkraft', desc:'Übungen gegen die typische Vorbeuge-Haltung auf dem Rad.', duration:25, intensity:1}, {title:'Anti-Rotations-Rumpftraining', desc:'Übungen mit Widerstandsbändern (Pallof Press), um Ausweichbewegungen im Becken zu minimieren.', duration:25, intensity:2}, {title:'Plank-Dynamic-Zirkel', desc:'Planks mit wechselndem Beinanheben und Side-Planks mit Becken-Dip.', duration:20, intensity:2} ], mobility:[ {title:'Mobility Hüfte & Rücken', desc:'Dehnübungen gegen die typische Sitzhaltung auf dem Rad.', duration:20, intensity:1}, {title:'Foam-Rolling Beine', desc:'Selbstmassage für Oberschenkel, Waden und Gesäß nach langen Fahrten.', duration:15, intensity:1}, {title:'Dehnen für die Hüftbeuger', desc:'Gezieltes Dehnen der durch das Sitzen verkürzten Hüftbeugemuskulatur.', duration:15, intensity:1}, {title:'Thorax- und Brustöffner', desc:'Gezielte Dehnübungen für Brustmuskeln und Brustwirbelsäule gegen den Rundrücken.', duration:20, intensity:1}, {title:'Gluteus-Release', desc:'Spezifische Triggerung und Dehnung der Gesäßmuskulatur zur Entlastung des unteren Rückens.', duration:15, intensity:1} ], technique:[ {title:'Trittfrequenz-Drills', desc:'Übungen für einen runden, effizienten Tritt bei wechselnder Kadenz.', duration:30, intensity:1}, {title:'Einbeintreten', desc:'Kurze Mind-Muscle-Phasen: Abschnitte, in denen nur ein Bein bewusst zieht und drückt.', duration:25, intensity:1}, {title:'Geschicklichkeit auf dem Rad', desc:'Langsame Fahrt, enge Kurven und Balanceübungen für besseres Bike-Handling.', duration:20, intensity:1}, {title:'Kurven-Anfahr-Drills', desc:'Gezieltes Anfahren von engen Kurven mit Fokus auf korrekte Pedalstellung (Außenpedal unten).', duration:30, intensity:1}, {title:'Sattel-Steh-Wechsel', desc:'Flüssiger, rhythnischer Wechsel zwischen 2 Min. Wiegetritt und 2 Min. Sitzen ohne Tempoverlust.', duration:35, intensity:1} ], race:[ {title:'Zeitfahr-Simulation', desc:'Fahre einen Streckenabschnitt im geplanten Wettkampftempo.', duration:45, intensity:3}, {title:'Renntempo-Testfahrt', desc:'Fahre eine feste Strecke im geplanten Wettkampftempo zur Standortbestimmung.', duration:40, intensity:3}, {title:'Generalprobe mit Belastungsspitzen', desc:'Simuliere Belastungsspitzen des Rennens mit kurzen harten Abschnitten.', duration:45, intensity:3}, {title:'FTP-Testprotokoll', desc:'Nach gründlichem Warm-up ein 20-minütiges, maximal konstantes All-Out Zeitfahren zur Ermittlung der Leistungsschwelle.', duration:50, intensity:3}, {title:'Kriteriums-Simulation', desc:'Simuliere Kurven-Antritte: Alle 45 Sekunden nach einer gedachten Kurve im Stehen voll beschleunigen.', duration:40, intensity:3} ] } }, schwimmen:{ name:'Schwimmen', categories:{ easy:[ {title:'Lockeres Einschwimmen', desc:'Ruhige Bahnen zum Techniküben und Aufwärmen.', duration:30, intensity:1}, {title:'Technikfokus-Einschwimmen', desc:'Ruhige Bahnen mit Fokus auf Wasserlage und Gleiten.', duration:25, intensity:1}, {title:'Mixed-Stil locker', desc:'Lockere Bahnen im Wechsel der Schwimmstile, ganz ohne Tempo.', duration:30, intensity:1}, {title:'Gefühlsschwimmen', desc:'Wechsel aus Bahnen mit geschlossener Faust und weit gespreizten Fingern zur Sensibilisierung des Wassergefühls.', duration:30, intensity:1}, {title:'Atemrhythmus-Varianz', desc:'Lockeres Kraulschwimmen im Wechsel von 3er-, 5er- und 7er-Atemzug.', duration:35, intensity:1} ], easy2:[ {title:'Ausschwimmen / Recovery', desc:'Lockere Bahnen mit Fokus auf Wasserlage statt Tempo.', duration:25, intensity:1}, {title:'Ausschwimmen mit Brett', desc:'Ruhiges Beinschlagschwimmen mit Brett zur aktiven Erholung.', duration:20, intensity:1}, {title:'Lockeres Rückenschwimmen', desc:'Entspannte Bahnen auf dem Rücken zur Erholung der Schultern.', duration:20, intensity:1}, {title:'Sculling-Erholung', desc:'Bahnen nur mit Vortrieb durch Scheibenbewegungen der Hände (Sculling) in Rücken- oder Bauchlage.', duration:25, intensity:1}, {title:'Rumpf-Rotationsbahnen', desc:'Sehr ruhiges Schwimmen in Seitenlage mit Fokus auf gestreckte Hüfte und minimalen Beinschlag.', duration:20, intensity:1} ], long:[ {title:'Lange Ausdauereinheit', desc:'Viele Bahnen im gleichmäßigen, ruhigen Tempo am Stück.', duration:55, intensity:2}, {title:'Lange Bahnen im Stilwechsel', desc:'Viele Bahnen im ruhigen Tempo mit gelegentlichem Stilwechsel.', duration:50, intensity:2}, {title:'Distanzschwimmen am Stück', desc:'Eine lange, durchgehende Distanz im gleichmäßigen Tempo.', duration:60, intensity:2}, {title:'Leitertraining (Umfang)', desc:'Intervallserie mit steigenden Distanzen: 100m - 200m - 300m - 400m - 300m - 200m - 100m ruhiges Tempo.', duration:65, intensity:2}, {title:'Aerobe Pyramide', desc:'Gleichmäßiger Ausdauerblock mit Fokus auf konstante Wendezeiten über eine lange Distanz.', duration:55, intensity:2} ], intervals:[ {title:'Intervall-Bahnen', desc:'Kurze, schnelle Bahnen mit Pausen am Beckenrand.', duration:40, intensity:3}, {title:'Kurzstreckensprints', desc:'Sehr kurze, schnelle Bahnen mit großzügiger Pause am Beckenrand.', duration:35, intensity:3}, {title:'Pyramiden-Bahnen', desc:'Steigende und sinkende Bahnenlänge im schnellen Tempo mit Pausen.', duration:40, intensity:3}, {title:'CSS (Critical Swim Speed) Blöcke', desc:'10x 100m im Schwellentempo mit exakt 15 Sekunden Pause zwischen den Bahnen.', duration:45, intensity:3}, {title:'Laktat-Spitzen (50m)', desc:'8x 50m maximaler Sprint, Start jeweils alle 90 Sekunden (Restzeit ist Pause).', duration:35, intensity:3} ], tempo:[ {title:'Tempo-Bahnen', desc:'Mittellange Strecken im konstant flotten Tempo.', duration:35, intensity:2}, {title:'Schwellen-Bahnen', desc:'Mittellange Bahnen knapp unterhalb der maximalen Anstrengung.', duration:35, intensity:2}, {title:'Negative-Split-Bahnen', desc:'Zweite Hälfte der Bahnenserie bewusst etwas schneller schwimmen.', duration:35, intensity:2}, {title:'Paddles-Tempo-Blöcke', desc:'4x 200m im zügigen Reisetempo mit Paddles und Pullbuoy für erhöhten Druck.', duration:40, intensity:2}, {title:'Frequenz-Steigerung', desc:'Jede 50m innerhalb eines 200m-Blocks die Schlagfrequenz kontinuierlich steigern.', duration:35, intensity:2} ], strength1:[ {title:'Land-Kraft Oberkörper', desc:'Klimmzüge und Zugübungen für mehr Kraft im Wasser.', duration:30, intensity:2}, {title:'Zugkraft mit Theraband', desc:'Zugbewegungen mit dem Band zur Simulation des Armzugs.', duration:25, intensity:2}, {title:'Rumpf- und Rückenkraft', desc:'Übungen für eine stabile Wasserlage und kraftvollen Armzug.', duration:25, intensity:2}, {title:'Dryland Core-Power', desc:'Deadbugs, Bird-Dogs und Planks an Land zur Verhinderung des "Absinkens" der Hüfte im Wasser.', duration:30, intensity:2}, {title:'Rotatoren-Schutz', desc:'Gezieltes Kräftigen der Innen- und Außenrotatoren der Schulter mit leichtem Zugband.', duration:20, intensity:1} ], strength2:[ {title:'Beinschlag-Kraft', desc:'Beinschlagserien mit Brett und Flossen für mehr Antrieb.', duration:25, intensity:2}, {title:'Beinschlag ohne Brett', desc:'Beinschlagserien ohne Hilfsmittel für mehr Ausdauer im Beinschlag.', duration:20, intensity:2}, {title:'Delfinkick-Serien', desc:'Wellenförmiger Beinschlag für Rumpfkraft und Antrieb.', duration:20, intensity:2}, {title:'Seitenlage-Kick', desc:'Beinschlagfokus komplett in der Seitenlage zur Stabilisierung der tieferen Core-Muskulatur.', duration:25, intensity:2}, {title:'Vertical Kicking', desc:'Aufrechtes Wassertreten im tiefen Becken nur über den Beinschlag (Hände aus dem Wasser).', duration:15, intensity:3} ], mobility:[ {title:'Schulter-Mobility', desc:'Beweglichkeit der Schultern für einen sauberen Armzug.', duration:15, intensity:1}, {title:'Trockenübungen Schulter', desc:'Mobilisierende Übungen außerhalb des Wassers für die Schultergelenke.', duration:15, intensity:1}, {title:'Rücken-Mobility', desc:'Sanfte Übungen zur Beweglichkeit der Wirbelsäule.', duration:15, intensity:1}, {title:'BWS-Extension', desc:'Überstreckung der Brustwirbelsäule auf der Schaumstoffrolle für bessere Überwasserphase.', duration:20, intensity:1}, {title:'Ankle Mobility', desc:'Dehnen des Fußrists zur Verbesserung des Winkels beim Beinschlag.', duration:15, intensity:1} ], technique:[ {title:'Technikbahnen', desc:'Drills für Wasserlage, Atmung und Zugtechnik.', duration:35, intensity:1}, {title:'Atemtechnik-Drills', desc:'Übungen zu Atemrhythmus und Kopfhaltung beim Schwimmen.', duration:30, intensity:1}, {title:'Start- und Wendetraining', desc:'Wiederholtes Üben von Start und Wende für mehr Tempo im Rennen.', duration:30, intensity:1}, {title:'Abschlag-Schwimmen (Catch-up)', desc:'Ein arm gleitet vorn, bis der andere ihn berührt. Schult den langen, sauberen Zug.', duration:35, intensity:1}, {title:'High-Elbow-Drill', desc:'Britisches Überwasser-Schleifen der Fingerspitzen dicht am Körper für den hohen Ellbogen.', duration:30, intensity:1} ], race:[ {title:'Wettkampf-Simulation', desc:'Schwimme die Zielstrecke im geplanten Renntempo.', duration:40, intensity:3}, {title:'Renntempo-Testserie', desc:'Mehrere Bahnen exakt im geplanten Wettkampftempo schwimmen.', duration:35, intensity:3}, {title:'Zeitfahren über Zielstrecke', desc:'Schwimme die Zieldistanz einmal komplett auf Zeit.', duration:40, intensity:3}, {title:'100m/200m All-Out Test', desc:'Maximale Ermittlung der persönlichen Bestzeit über die Kurzstrecke nach intensivem Warm-up.', duration:30, intensity:3}, {title:'Start-Sprint-Simulation', desc:'4x 25m aus dem maximalen Abstoß/Startblock auf Anschlag schwimmen, gefolgt von lockerem Übergang.', duration:35, intensity:3} ] } }, kraft:{ name:'Krafttraining', categories:{ easy:[ {title:'Ganzkörper — locker', desc:'Leichte Gewichte, viele Wiederholungen, Fokus auf Technik.', duration:40, intensity:1}, {title:'Bodyweight-Grundlagen', desc:'Liegestütz, Kniebeugen und Rumpfübungen nur mit dem eigenen Körpergewicht.', duration:30, intensity:1}, {title:'Zirkel mit leichten Gewichten', desc:'Lockerer Durchlauf der Grundübungen mit niedrigem Gewicht.', duration:35, intensity:1}, {title:'Kettlebell-Klassiker locker', desc:'Grundübungen (Swings, Goblet Squats) mit leichtem Gewicht zur Gelenksmobilisation.', duration:45, intensity:1}, {title:'Klassischer Gelenk-Zirkel', desc:'Übungen mit geringem Widerstand, hoher Fokus auf maximalen Bewegungsumfang (ROM).', duration:40, intensity:1} ], easy2:[ {title:'Ganzkörper — Wiederholung', desc:'Zweite lockere Ganzkörpereinheit zur Wiederholung der Bewegungsmuster.', duration:35, intensity:1}, {title:'Technik-Wiederholung', desc:'Grundübungen erneut mit Fokus auf saubere Ausführung statt Last.', duration:30, intensity:1}, {title:'Aktive Regeneration mit Band', desc:'Lockere Übungen mit dem Widerstandsband zur Durchblutungsförderung.', duration:25, intensity:1}, {title:'Mobility-Kraft-Hybrid', desc:'Fließende Bewegungswechsel zwischen Kraft-Haltepositionen (z.B. tiefe Hocke) und Dehnung.', duration:30, intensity:1}, {title:'Isometrischer Halte-Zirkel', desc:'Ausschließlich Halteübungen (Plank, Wandsitz, Glute Bridge) ohne Zusatzgewicht.', duration:35, intensity:1} ], long:[ {title:'Push-Pull-Legs komplett', desc:'Umfangreiche Einheit über alle großen Muskelgruppen.', duration:70, intensity:2}, {title:'Ganzkörper-Komplettrunde', desc:'Alle großen Muskelgruppen in einer langen, umfangreichen Einheit.', duration:70, intensity:2}, {title:'Oberkörper-Unterkörper-Split', desc:'Kombinierte Einheit aus Oberkörper- und Unterkörperübungen.', duration:65, intensity:2}, {title:'Hypertrophie-Volumeneinheit', desc:'Klassischer Muskelaufbau-Fokus: 4 Sätze à 10 Wdh. für alle großen Grundübungen mit moderat schweren Gewichten.', duration:75, intensity:2}, {title:'Cluster-Sätze Ganzkörper', desc:'Große Muskelgruppen mit kurzen Mini-Pausen innerhalb des Satzes trainieren, um hohes Volumen zu akkumulieren.', duration:80, intensity:2} ], intervals:[ {title:'Kraft-Zirkel', desc:'Übungen im Wechsel ohne lange Pausen für Kraft und Kondition.', duration:35, intensity:3}, {title:'EMOM-Workout', desc:'Jede Minute eine neue Übung, ohne lange Pausen — fordert Kraft und Kondition.', duration:30, intensity:3}, {title:'Tabata-Kraft', desc:'Kurze, maximale Belastungsblöcke im Wechsel mit kurzen Pausen.', duration:25, intensity:3}, {title:'CrossFit-Style AMRAP', desc:'"As Many Rounds As Possible" aus 10 Reps Kreuzheben, 10 Liegestütze, 10 Kniebeugen im Dauerzyklus.', duration:30, intensity:3}, {title:'Komplex-Zirkel (Hantel + Body)', desc:'Direkter Übergang von einer schweren Langhantelübung zu einer explosiven Eigengewichtsübung.', duration:35, intensity:3} ], tempo:[ {title:'Kraftausdauer-Sätze', desc:'Hohe Wiederholungszahlen mit kurzen Pausen.', duration:35, intensity:2}, {title:'Drop-Sätze', desc:'Sätze mit absteigendem Gewicht ohne Pause für maximale Ermüdung.', duration:35, intensity:2}, {title:'Supersätze', desc:'Zwei Übungen direkt hintereinander ohne Pause für mehr Reizdichte.', duration:35, intensity:2}, {title:'Konzentrische Explosivkraft', desc:'Gewicht extrem schnell und explosiv hochdrücken, betont langsam absenken (3 Sek.).', duration:40, intensity:2}, {title:'Cluster-Ausdauer', desc:'Sätze mit 20–25 Wiederholungen bei kurzen strategischen Atem-Pausen zur maximalen Laktat-Toleranz.', duration:35, intensity:2} ], strength1:[ {title:'Oberkörper — Kraft', desc:'Drücken, Rudern und Schulterarbeit mit höheren Lasten.', duration:45, intensity:2}, {title:'Push-Fokus', desc:'Bankdrücken, Schulterdrücken und Trizepsübungen mit höheren Lasten.', duration:45, intensity:2}, {title:'Pull-Fokus', desc:'Klimmzüge, Rudern und Bizepsübungen mit höheren Lasten.', duration:45, intensity:2}, {title:'Maximalkraft Oberkörper', desc:'Fokus auf schwere Grundübungen (Bankdrücken/Rudern) im Bereich von 3-5 Wiederholungen.', duration:50, intensity:3}, {title:'Überkopf- & Klimmzug-Power', desc:'Vertikale Druck- und Zugketten im schweren Lastbereich.', duration:45, intensity:2} ], strength2:[ {title:'Unterkörper — Kraft', desc:'Kniebeugen, Kreuzheben und Ausfallschritte mit höheren Lasten.', duration:45, intensity:2}, {title:'Quad-Fokus', desc:'Kniebeugen und Ausfallschritte mit Schwerpunkt auf der Oberschenkelvorderseite.', duration:45, intensity:2}, {title:'Posterior-Chain-Fokus', desc:'Kreuzheben und Hüftheben für Gesäß und hintere Oberschenkel.', duration:45, intensity:2}, {title:'Maximalkraft Unterkörper', desc:'Schwere Kniebeugen oder Hex-Bar-Kreuzheben zur Steigerung der neuronalen Rekrutierung.', duration:50, intensity:3}, {title:'Heavy Bulgarian Split Squats', desc:'Schwere einbeinige Kniebeugen mit Kurzhanteln zur Beseitigung von Beinkraft-Differenzen.', duration:45, intensity:2} ], mobility:[ {title:'Mobility & Core', desc:'Rumpfstabilität und Beweglichkeit der großen Gelenke.', duration:25, intensity:1}, {title:'Hüft- und Schultermobility', desc:'Gezielte Mobilisation der am meisten beanspruchten Gelenke.', duration:25, intensity:1}, {title:'Core-Stabilität', desc:'Planks und Rotationsübungen für einen stabilen Rumpf.', duration:20, intensity:1}, {title:'Loaded Mobility (Halos)', desc:'Bewegungstraining für die Schultern mit leichten Kettlebells über Kopf.', duration:25, intensity:1}, {title:'Deep Squat Hold Flow', desc:'Langes Verweilen in der tiefen Hocke kombiniert mit Wirbelsäulen-Aufrotation.', duration:20, intensity:1} ], technique:[ {title:'Technik, leichte Gewichte', desc:'Bewegungsqualität der Grundübungen mit reduziertem Gewicht verfeinern.', duration:30, intensity:1}, {title:'Tempo-Wiederholungen', desc:'Grundübungen bewusst langsam und kontrolliert ausführen.', duration:30, intensity:1}, {title:'Einseitiges Training', desc:'Einarmige und einbeinige Varianten für muskuläre Balance.', duration:25, intensity:1}, {title:'Olympisches Liften (Technik)', desc:'Trockenübungen und Phasen-Drills für Reißen und Umsetzen mit leerer Stange.', duration:35, intensity:1}, {title:'Pausierte Kniebeugen', desc:'Kniebeugen mit leerem/leichtem Gewicht, 3 Sekunden Halten am tiefsten Punkt zur Festigung der Form.', duration:30, intensity:1} ], race:[ {title:'Krafttest', desc:'Teste eine neue Bestleistung in einer ausgewählten Grundübung.', duration:40, intensity:3}, {title:'1-Wiederholungs-Test', desc:'Teste dein Maximalgewicht in einer ausgewählten Grundübung.', duration:35, intensity:3}, {title:'AMRAP-Test', desc:'So viele Wiederholungen wie möglich in fester Zeit bei einer Übung.', duration:25, intensity:3}, {title:'2-Minuten-Power-Bench-Pull', desc:'Maximaler Ausdauertest im vorgebeugten Rudern oder Bankziehen über exakt 120 Sekunden.', duration:30, intensity:3}, {title:'Velocity-Test', desc:'Ermittlung des Leistungsabfalls bei maximal explosiven Wiederholungen zur Bestimmung der Ermüdungsgrenze.', duration:35, intensity:3} ] } }, allgemein:{ name:'Allgemein', categories:{ easy:[ {title:'Lockeres Cardio', desc:'Leichtes Ausdauertraining nach Wahl — Gehen, Joggen oder Rad.', duration:35, intensity:1}, {title:'Spaziergang oder leichtes Joggen', desc:'Bewegung nach Wahl in ruhigem Tempo, Hauptsache regelmäßig.', duration:35, intensity:1}, {title:'Tanzen oder Wandern', desc:'Spaßbetonte Bewegung mit niedriger Intensität nach eigenem Geschmack.', duration:40, intensity:1}, {title:'Natur-Trail-Wandern', desc:'Zügiges Gehen in unebenem Gelände, schult Balance und lockert den Geist.', duration:50, intensity:1}, {title:'Seilspringen & Mobilisation', desc:'Sehr lockerer Mix aus entspanntem Seilspringen und Gelenkkreisen.', duration:30, intensity:1} ], easy2:[ {title:'Aktive Erholung', desc:'Bewegung mit niedriger Intensität, z. B. ein Spaziergang oder lockeres Radeln.', duration:25, intensity:1}, {title:'Lockeres Schwimmen oder Radeln', desc:'Sanfte Bewegung in einer anderen Sportart zur Abwechslung.', duration:25, intensity:1}, {title:'Dehnspaziergang', desc:'Spaziergang kombiniert mit kurzen Dehnpausen unterwegs.', duration:25, intensity:1}, {title:'Faszien-Flow & Release', desc:'Kombination aus sanften, fließenden Ganzkörper-Dehnungen und Atementspannung.', duration:30, intensity:1}, {title:'Reines Beinausschütteln', desc:'Sehr entspanntes, kurzes Bewegen ohne Widerstand oder Intensität.', duration:20, intensity:1} ], long:[ {title:'Lange Ausdauereinheit', desc:'Längere Cardio-Einheit im gleichmäßigen Tempo.', duration:60, intensity:2}, {title:'Lange Wanderung oder Radtour', desc:'Ausdauereinheit über eine längere Distanz im ruhigen Tempo.', duration:70, intensity:2}, {title:'Ausdauer-Mix', desc:'Längere Einheit, die mehrere Bewegungsformen kombiniert, z. B. Gehen und Joggen.', duration:60, intensity:2}, {title:'Multi-Cardio-Wechsel', desc:'30 Minuten Radfahren direkt gefolgt von 30 Minuten leichtem Laufen im aeroben Bereich.', duration:60, intensity:2}, {title:'Langstrecken-Marsch', desc:'Zügiges, ununterbrochenes Gehen über eine große Distanz zur Stärkung der Sehnen.', duration:80, intensity:1} ], intervals:[ {title:'Intervall- / Zirkeltraining', desc:'Wechsel aus kurzen intensiven und kurzen ruhigen Phasen.', duration:35, intensity:3}, {title:'HIIT-Workout', desc:'Kurze intensive Übungsblöcke im Wechsel mit kurzen Pausen.', duration:30, intensity:3}, {title:'Treppenintervalle', desc:'Schnelles Treppensteigen im Wechsel mit lockerem Gehen.', duration:30, intensity:3}, {title:'Agilitäts-Parcours', desc:'Schnelle Richtungswechsel, Side-Steps und kurze Sprints im fliegenden Intervallwechsel.', duration:35, intensity:3}, {title:'Burpee- & Rope-Wechsel', desc:'Harte Blöcke aus Ganzkörper-Burpees kombiniert mit kurzen Phasen des Seilspringens.', duration:30, intensity:3} ], tempo:[ {title:'Tempo-Workout', desc:'Konstant zügiges Tempo über die gesamte Einheit.', duration:30, intensity:2}, {title:'Zügiges Walking / Joggen', desc:'Konstant flottes Tempo über die gesamte Strecke.', duration:30, intensity:2}, {title:'Tempo-Zirkel', desc:'Mehrere Übungsstationen im zügigen Tempo ohne lange Pause.', duration:30, intensity:2}, {title:'Ruderergometer-Pyramide', desc:'Zügiges Rudern auf dem Ergometer mit stufenweise steigender Schlagfrequenz.', duration:35, intensity:2}, {title:'Zügiges Seilspring-Intervall', desc:'Konstant hohes Tempo beim Seilspringen über 3-Minuten-Blöcke.', duration:30, intensity:2} ], strength1:[ {title:'Ganzkörper-Kraft', desc:'Grundübungen mit Körpergewicht oder Gewichten.', duration:35, intensity:2}, {title:'Oberkörper-Grundübungen', desc:'Liegestütz, Rudern und Schulterübungen mit Körpergewicht oder Gewichten.', duration:30, intensity:2}, {title:'Unterkörper-Grundübungen', desc:'Kniebeugen und Ausfallschritte für Beinkraft.', duration:30, intensity:2}, {title:'Medizinball-Explosivkraft', desc:'Würfe, Slams und Rotationsstöße mit dem Medizinball gegen eine Wand oder den Boden.', duration:30, intensity:2}, {title:'TRX-Suspension-Ganzkörper', desc:'Stabilisierendes Schlingentraining für alle großen Muskelketten.', duration:35, intensity:2} ], strength2:[ {title:'Funktionelles Training', desc:'Übungen, die Kraft, Balance und Koordination kombiniert.', duration:30, intensity:2}, {title:'Zirkeltraining Ganzkörper', desc:'Mehrere Stationen im Wechsel für Kraft und Kondition.', duration:30, intensity:2}, {title:'Balance & Koordination', desc:'Übungen auf instabilem Untergrund für Gleichgewicht und Stabilität.', duration:25, intensity:1}, {title:'Animal Moves Zirkel', desc:'Funktionelles Workout über Tierbewegungen (Bear Crawl, Crab Walk) zur Optimierung der Gelenkkraft.', duration:30, intensity:2}, {title:'Propriozeptions-Zirkel', desc:'Einbeinige Halteübungen, blindes Balancieren und labile Rumpf-Planks.', duration:25, intensity:1} ], mobility:[ {title:'Beweglichkeit & Dehnen', desc:'Ganzkörper-Dehnprogramm für Regeneration und Gelenkfreiheit.', duration:20, intensity:1}, {title:'Yoga-Grundlagen', desc:'Ruhige Yogaübungen für Beweglichkeit und Entspannung.', duration:25, intensity:1}, {title:'Foam-Rolling & Dehnen', desc:'Selbstmassage und Dehnübungen für die am meisten beanspruchten Muskeln.', duration:15, intensity:1}, {title:'Pilates-Grundelemente', desc:'Kontrollierte Bewegungen zur Stärkung der tiefen Rumpf- und Beckenbodenmuskulatur.', duration:25, intensity:1}, {title:'Full-Body Release Flow', desc:'Sehr sanftes Ganzkörper-Stretching zur Absenkung des Muskeltonus.', duration:20, intensity:1} ], technique:[ {title:'Technik & Koordination', desc:'Koordinative Übungen passend zur gewählten Sportart.', duration:25, intensity:1}, {title:'Koordinationsleiter', desc:'Schnelle Fußarbeit für Koordination und Reaktionsfähigkeit.', duration:20, intensity:1}, {title:'Beweglichkeits-Drills', desc:'Dynamische Übungen zur Vorbereitung auf die jeweilige Sportart.', duration:20, intensity:1}, {title:'Dual-Tasking Drills', desc:'Koordinationsübungen unter kognitiver Zusatzaufgabe (z.B. Jonglieren auf einem Bein).', duration:25, intensity:1}, {title:'Reaktions-Ball-Fangen', desc:'Arbeit mit einem unberechenbar springenden Reaktionsball zur Verbesserung der Reflexe.', duration:20, intensity:1} ], race:[ {title:'Leistungstest', desc:'Teste deine aktuelle Form, z. B. mit einem Zeit- oder Wiederholungstest.', duration:30, intensity:3}, {title:'Fitness-Test', desc:'Teste z. B. Liegestütze, Plank-Zeit oder eine Laufstrecke auf Zeit.', duration:30, intensity:3}, {title:'Wettkampfsimulation', desc:'Simuliere die Belastung deines nächsten sportlichen Ziels.', duration:30, intensity:3}, {title:'12-Minuten Cooper-Test', desc:'Laufe in exakt 12 Minuten eine so lange Distanz wie möglich zur Bestimmung der VO2max.', duration:35, intensity:3}, {title:'Functional Fitness Challenge', desc:'Ein festes Set aus Kraft- und Cardioübungen auf Zeit abarbeiten (Benchmark-Test).', duration:30, intensity:3} ] } } }; const GOALS = { wettkampf:{ label:'Wettkampfvorbereitung', tip:'Fokus auf Renntempo, eine lange Einheit und gezielte Erholung — reduziere die letzten Tage vor dem Wettkampf bewusst.', order:['intervals','tempo','long','strength1','technique','race','easy','mobility'] }, fitness:{ label:'Fitness & Ausdauer', tip:'Ein gleichmäßiger Mix aus Ausdauer, Kraft und Beweglichkeit baut eine breite Grundlage auf, ohne zu übertreiben.', order:['easy','strength1','intervals','long','mobility','technique','easy2','tempo'] }, abnehmen:{ label:'Abnehmen', tip:'Regelmäßigkeit zählt mehr als Tempo: viele moderate Einheiten verbrennen über die Woche mehr Kalorien als wenige harte.', order:['easy','easy2','strength1','intervals','tempo','mobility','long','technique'] }, muskelaufbau:{ label:'Muskelaufbau', tip:'Genug Reiz für Wachstum, aber auch Pausen für Regeneration — Muskeln wachsen in der Erholung, nicht im Training.', order:['strength1','strength2','easy','long','mobility','technique','easy2','intervals'] } }; const REST_TIPS = [ 'Leichtes Dehnen oder ein Spaziergang unterstützt die Erholung.', 'Achte auf ausreichend Schlaf und genug Flüssigkeit.', 'Aktive Pause: lockeres Spazieren statt komplett still sitzen.', 'Heute zählt Regeneration genauso viel wie ein Training.' ]; /* ============ State ============ */ const state = { sport:'laufen', level:'fortgeschritten', goal:'fitness', days:4 }; /* ============ Helpers ============ */ function adjustForGoal(categoryKey, goalKey, base){ let duration = base.duration; let intensity = base.intensity; if(goalKey === 'wettkampf'){ duration = Math.round((duration * 1.1) / 5) * 5; if(['intervals','tempo','race'].includes(categoryKey)) intensity = Math.min(3, intensity + 1); } if(goalKey === 'abnehmen' && ['easy','easy2','long'].includes(categoryKey)){ duration += 10; } if(goalKey === 'muskelaufbau'){ if(['strength1','strength2','long'].includes(categoryKey)) duration += 10; if(['easy','easy2'].includes(categoryKey)) duration = Math.max(15, duration - 5); } return { duration, intensity }; } function buildCategoryOrder(goalKey, n){ let order = GOALS[goalKey].order.slice(0, n); if(order.includes('long') && order.length > 1){ order = order.filter(c => c !== 'long'); order.push('long'); } return order; } function intensityLabel(n){ return n === 1 ? 'Locker' : n === 2 ? 'Moderat' : 'Intensiv'; } function intensityDotsHTML(n){ let html = '<div class="intensity" role="img" aria-label="Intensität: ' + intensityLabel(n) + '">'; for(let i=1;i<=3;i++){ html += '<span class="dot' + (i<=n?' filled':'') + '"></span>'; } html += '</div>'; return html; } function pickVariant(variants){ return variants[Math.floor(Math.random() * variants.length)]; } function buildPlan(sportKey, goalKey, levelKey, n){ const days = DAY_PATTERNS[n]; const order = buildCategoryOrder(goalKey, n); const sport = SPORTS[sportKey]; const assignment = {}; days.forEach((dayIdx, i) => { const catKey = order[i]; const base = pickVariant(sport.categories[catKey]); let adjusted = adjustForGoal(catKey, goalKey, base); // Level-Skalierung für Haupteinheit if (levelKey === 'einsteiger') { adjusted.duration = Math.max(15, Math.round((adjusted.duration * 0.8) / 5) * 5); if (adjusted.intensity === 3) adjusted.intensity = 2; // Keine hochintensiven Belastungen für Einsteiger } else if (levelKey === 'profi') { adjusted.duration = Math.round((adjusted.duration * 1.15) / 5) * 5; } // Initialisiere den Tag mit der Primäreinheit assignment[dayIdx] = [ { title: base.title, desc: base.desc, duration: adjusted.duration, intensity: adjusted.intensity, label: levelKey === 'profi' ? 'Einheit 1 (Hauptschicht)' : '' } ]; // DYNAMIK FÜR MEHRERE EINHEITEN PRO TAG if (levelKey === 'fortgeschritten' && i === 0 && n >= 3) { // Fortgeschrittene bekommen ab 3 Trainingstagen an genau 1 Tag eine kurze Ergänzung const extraCat = Math.random() > 0.5 ? 'mobility' : 'technique'; const extraBase = pickVariant(sport.categories[extraCat]); assignment[dayIdx][0].label = 'Einheit 1'; assignment[dayIdx].push({ title: extraBase.title, desc: 'Ergänzende Technikeinheit zur optimalen Bewegungsökonomie.', duration: extraBase.duration, intensity: extraBase.intensity, label: 'Einheit 2' }); } else if (levelKey === 'profi') { // Profis trainieren zyklisch an mehreren Tagen doppelt (Zwei-Schicht-System) // Anzahl der Doppel-Tage steigt mit der Gesamtfrequenz let doubleDaysLimit = n <= 3 ? 1 : (n <= 5 ? 2 : 3); if (i < doubleDaysLimit) { let extraCat = 'mobility'; if (i === 0) extraCat = 'technique'; if (i === 1) extraCat = 'easy2'; if (i === 2) extraCat = 'strength1'; const extraBase = pickVariant(sport.categories[extraCat]); assignment[dayIdx].push({ title: extraBase.title, desc: 'Zweite Tageseinheit (Zubringer / Komplementärreiz): ' + extraBase.desc, duration: Math.round((extraBase.duration * 1.1) / 5) * 5, intensity: extraBase.intensity, label: 'Einheit 2 (Nebenschicht)' }); } } }); const week = []; for(let i=0;i<7;i++){ if(assignment[i]){ week.push({ type:'training', sessions: assignment[i] }); } else { week.push({ type:'rest', tip: REST_TIPS[i % REST_TIPS.length] }); } } return week; } /* ============ Ring rendering ============ */ function renderRing(svgEl, trainingIdxArr){ const angleStep = 360/7; const amberSet = new Set(trainingIdxArr.amber || []); const trainingSet = new Set(trainingIdxArr.training || trainingIdxArr); let html = ''; for(let i=0;i<7;i++){ const angle = i*angleStep; const isTraining = trainingSet.has(i); const isAmber = amberSet.has(i); const color = isTraining ? (isAmber ? RING_COLORS.accent2 : RING_COLORS.accent) : RING_COLORS.border; html += '<g transform="rotate(' + angle + ' 100 100)"><rect x="93" y="14" width="14" height="26" rx="6" fill="' + color + '"></rect></g>'; } const labels = ['M','D','M','D','F','S','S']; for(let i=0;i<7;i++){ const angle = i*angleStep; const rad = angle * Math.PI/180; const r = 52; const x = (100 + r*Math.sin(rad)).toFixed(1); const y = (100 - r*Math.cos(rad)).toFixed(1); const isTraining = trainingSet.has(i); html += '<text x="'+x+'" y="'+y+'" text-anchor="middle" dominant-baseline="middle" class="ring-label" fill="'+(isTraining?RING_COLORS.text:RING_COLORS.textDim)+'">'+labels[i]+'</text>'; } html += '<text x="100" y="96" text-anchor="middle" dominant-baseline="middle" class="ring-count" fill="' + RING_COLORS.text + '">' + trainingSet.size + '</text>'; html += '<text x="100" y="120" text-anchor="middle" dominant-baseline="middle" class="ring-count-label" fill="' + RING_COLORS.textDim + '">Tage / Woche</text>'; svgEl.innerHTML = html; } /* ============ UI wiring ============ */ const sportGroup = document.getElementById('sportGroup'); const levelGroup = document.getElementById('levelGroup'); const goalGroup = document.getElementById('goalGroup'); const daysSlider = document.getElementById('daysSlider'); const daysValue = document.getElementById('daysValue'); const previewRing = document.getElementById('previewRing'); const generateBtn = document.getElementById('generateBtn'); const shuffleBtn = document.getElementById('shuffleBtn'); const resultPanel = document.getElementById('resultPanel'); const resultTitle = document.getElementById('resultTitle'); const resultSubtitle = document.getElementById('resultSubtitle'); const resultRing = document.getElementById('resultRing'); const tipText = document.getElementById('tipText'); const daysGrid = document.getElementById('daysGrid'); function setActivePill(group, key, value){ group.querySelectorAll('.pill').forEach(btn => { const match = btn.dataset.sport === value || btn.dataset.level === value || btn.dataset.goal === value; btn.classList.toggle('active', match); btn.setAttribute('aria-pressed', match ? 'true' : 'false'); }); state[key] = value; } sportGroup.addEventListener('click', e => { const btn = e.target.closest('.pill'); if(!btn) return; setActivePill(sportGroup, 'sport', btn.dataset.sport); }); levelGroup.addEventListener('click', e => { const btn = e.target.closest('.pill'); if(!btn) return; setActivePill(levelGroup, 'level', btn.dataset.level); }); goalGroup.addEventListener('click', e => { const btn = e.target.closest('.pill'); if(!btn) return; setActivePill(goalGroup, 'goal', btn.dataset.goal); }); daysSlider.addEventListener('input', () => { state.days = parseInt(daysSlider.value, 10); daysValue.textContent = state.days; renderRing(previewRing, DAY_PATTERNS[state.days]); }); function renderPlan(){ const week = buildPlan(state.sport, state.goal, state.level, state.days); const levelLabels = { einsteiger: 'Einsteiger', fortgeschritten: 'Fortgeschritten', profi: 'Profi' }; resultTitle.textContent = SPORTS[state.sport].name + ' — Wochenplan'; resultSubtitle.innerHTML = 'Niveau: <strong>' + levelLabels[state.level] + '</strong> · Ziel: <strong>' + GOALS[state.goal].label + '</strong> · <strong>' + state.days + '</strong> Trainingstage/Woche'; tipText.textContent = GOALS[state.goal].tip; const trainingIdx = []; const amberIdx = []; week.forEach((d, i) => { if(d.type === 'training'){ trainingIdx.push(i); if(d.sessions.some(s => s.intensity === 3)) amberIdx.push(i); } }); renderRing(resultRing, { training: trainingIdx, amber: amberIdx }); daysGrid.innerHTML = week.map((d, i) => { const wd = WEEKDAYS[i]; if(d.type === 'training'){ // Verschachteltes Mapping für potenzielle Mehrfacheinheiten am selben Tag const sessionsHTML = d.sessions.map((s, idx) => { const labelHTML = s.label ? '<div style="font-family:\'IBM Plex Mono\', monospace; font-size:10.5px; color:var(--accent); text-transform:uppercase; letter-spacing:0.06em; margin-bottom:2px; font-weight:600;">' + s.label + '</div>' : ''; const isLast = idx === d.sessions.length - 1; const separatorStyle = isLast ? '' : 'border-bottom:1px dashed rgba(255,255,255,0.08); padding-bottom:14px; margin-bottom:14px;'; return '<div style="' + separatorStyle + '">' + labelHTML + '<p class="day-title" style="margin:2px 0 6px 0;">' + s.title + '</p>' + '<div class="day-meta"><span>' + s.duration + ' Min</span>' + intensityDotsHTML(s.intensity) + '<span>' + intensityLabel(s.intensity) + '</span></div>' + '<p class="day-desc">' + s.desc + '</p>' + '</div>'; }).join(''); return '<div class="day-card">' + '<div class="day-top"><span class="day-abbr">'+wd.abbr+'</span><span class="day-full">'+wd.full+'</span></div>' + sessionsHTML + '</div>'; } else { return '<div class="day-card rest">' + '<div class="day-top"><span class="day-abbr">'+wd.abbr+'</span><span class="day-full">'+wd.full+'</span></div>' + '<p class="day-title">Ruhetag</p>' + '<p class="day-desc">'+d.tip+'</p>' + '</div>'; } }).join(''); } generateBtn.addEventListener('click', () => { renderPlan(); resultPanel.hidden = false; requestAnimationFrame(() => requestAnimationFrame(() => { resultPanel.classList.add('show'); })); resultPanel.scrollIntoView({ behavior:'smooth', block:'start' }); }); shuffleBtn.addEventListener('click', () => { renderPlan(); }); /* ============ Init ============ */ setActivePill(sportGroup, 'sport', 'laufen'); setActivePill(levelGroup, 'level', 'fortgeschritten'); setActivePill(goalGroup, 'goal', 'fitness'); renderRing(previewRing, DAY_PATTERNS[state.days]); })(); </script> </body> </html>
⬛ Konsole
0
▲
Umbenennen…
Löschen…
Dateinamen kopieren
URL kopieren
Als <img> einfügen
⚙ Projekt-Eigenschaften
📝 Info
📱 PWA
Dein Edit-Code
🔒 geheim halten!
–
Nur mit diesem Code kannst du dein Projekt bearbeiten. Schreib ihn auf!
✓ Kopiert!
Projekt-Titel
Dein Name
Klasse
In der Galerie veröffentlichen
⚠ Deine Startseite muss
index.html
heißen.
Galerie-Code
Unter diesem Code ist dein Projekt in der Galerie sichtbar.
Mach dein Projekt zur
Progressive Web App
— dann können Nutzer es auf dem Handy installieren und offline nutzen.
App-Name (aus Projekt-Titel)
Icon-Farbe
✓ PWA aktiv —
manifest.json und service-worker.js wurden angelegt. index.html wurde aktualisiert.