Compare commits

..

No commits in common. "main" and "feature_US01-01" have entirely different histories.

8 changed files with 20 additions and 776 deletions

Binary file not shown.

Before

Width:  |  Height:  |  Size: 157 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 118 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 131 KiB

View File

@ -1,142 +1,9 @@
/* =========================================================
US01-03: Ablauf sehen
Branch: feature_US01-03
US01-03: Ablauf sehen (+ Kontaktangaben)
Branch: feature/US01-03-ablauf
Nur Selektoren unter #ablauf verwenden.
Farben/Schriften über var(--th-...) aus base.css.
Vorlage: Prototyp (Programmablauf)
========================================================= */
#ablauf {
--abl-mint: #56d9b1;
--abl-line: rgb(255 255 255 / 0.11);
}
/* ---------- Überschrift ---------- */
#ablauf .ablauf-heading {
display: flex;
align-items: flex-end;
justify-content: space-between;
gap: 3.5rem;
margin-bottom: 2.75rem;
}
#ablauf .ablauf-eyebrow {
margin: 0;
font-size: 0.875rem;
font-weight: 650;
letter-spacing: 0.12em;
text-transform: uppercase;
color: var(--abl-mint);
}
#ablauf h2 {
margin: 0.9rem 0 0;
font-size: clamp(2.2rem, 3.4vw, 2.8rem);
font-weight: 400;
line-height: 1.12;
letter-spacing: -0.03em;
}
#ablauf .ablauf-heading > p {
max-width: 24rem;
margin: 0;
color: var(--th-text-muted);
}
/* ---------- Schritte ---------- */
#ablauf .steps {
display: grid;
grid-template-columns: repeat(4, 1fr);
gap: 2rem;
margin: 0;
padding: 0;
list-style: none;
}
#ablauf .step-number {
display: block;
margin-bottom: 1.4rem;
padding: 0.5rem 0 1.1rem;
border-bottom: 1px solid var(--abl-line);
font-family: var(--th-font-display);
font-size: 2rem;
line-height: 1;
color: var(--abl-mint);
position: relative;
}
/* grüner Fortschrittsstrich unter der Nummer zeigt die Reihenfolge */
#ablauf .step-number::after {
content: "";
position: absolute;
left: 0;
bottom: -1px;
width: 2.5rem;
height: 2px;
background: var(--th-accent);
}
#ablauf .step h3 {
margin: 0 0 0.75rem;
font-family: var(--th-font-body);
font-size: 1.25rem;
font-weight: 600;
line-height: 1.3;
}
#ablauf .step p {
margin: 0;
color: var(--th-text-muted);
}
/* ---------- Abschluss ---------- */
#ablauf .process-end {
display: flex;
align-items: center;
justify-content: space-between;
gap: 1.5rem;
margin-top: 2.75rem;
padding-top: 1.9rem;
border-top: 1px solid var(--abl-line);
}
#ablauf .process-end p {
margin: 0;
font-family: var(--th-font-display);
font-size: 1.45rem;
font-style: italic;
color: #d3d7e1;
}
#ablauf .process-link {
display: inline-flex;
align-items: center;
gap: 0.75rem;
min-height: 2.75rem;
font-size: 1.125rem;
font-weight: 600;
color: var(--th-text-soft);
white-space: nowrap;
}
#ablauf .process-link:hover {
color: var(--abl-mint);
}
/* ---------- Tablet: 2 × 2 ---------- */
@media (max-width: 1100px) {
#ablauf .ablauf-heading { gap: 2rem; }
#ablauf .steps { grid-template-columns: repeat(2, 1fr); gap: 2rem 1.75rem; }
}
/* ---------- Mobil: untereinander ---------- */
@media (max-width: 760px) {
#ablauf .ablauf-heading { display: block; margin-bottom: 2rem; }
#ablauf .ablauf-heading > p { max-width: none; margin-top: 1.25rem; }
#ablauf .process-end { display: block; }
#ablauf .process-link { margin-top: 1rem; }
}
@media (max-width: 560px) {
#ablauf .steps { grid-template-columns: 1fr; gap: 1.75rem; }
}

View File

@ -1,381 +0,0 @@
/* =========================================================
US01-02: Angebote und Pakete (+ Verweis auf Coaching-Rabatte)
Branch: feature_US01-02
Nur Selektoren unter #angebote verwenden.
Farben/Schriften über var(--th-...) aus base.css.
Vorlage: Prototyp (Angebotsbereich + Detaildialog)
========================================================= */
#angebote {
--ang-mint: #56d9b1;
--ang-line: rgb(255 255 255 / 0.11);
background: linear-gradient(135deg, #161625, #11111e);
border-block: 1px solid var(--ang-line);
}
/* ---------- Überschrift ---------- */
#angebote .angebote-heading {
display: flex;
align-items: flex-end;
justify-content: space-between;
gap: 3.5rem;
margin-bottom: 1.5rem;
}
#angebote .angebote-eyebrow {
margin: 0;
font-size: 0.875rem;
font-weight: 650;
letter-spacing: 0.12em;
text-transform: uppercase;
color: var(--ang-mint);
}
#angebote h2 {
margin: 0.9rem 0 0;
font-size: clamp(2.2rem, 3.4vw, 2.8rem);
font-weight: 400;
line-height: 1.12;
letter-spacing: -0.03em;
}
#angebote .angebote-heading > p {
max-width: 24rem;
margin: 0;
color: var(--th-text-muted);
}
#angebote .concept-note {
display: flex;
gap: 0.5rem;
margin: 0 0 2rem;
font-size: 1rem;
color: var(--th-text-muted);
}
/* ---------- Paketkarten ---------- */
#angebote .package-grid {
display: grid;
grid-template-columns: repeat(3, minmax(0, 1fr)); /* minmax(0,…) verhindert Überlaufen */
gap: 1.5rem;
}
#angebote .package {
display: flex;
flex-direction: column;
padding: 0.75rem;
border: 1px solid var(--ang-line);
border-radius: 18px;
background: linear-gradient(140deg, #202032, #181827);
transition: border-color 0.2s;
}
#angebote .package:hover,
#angebote .package.featured {
border-color: rgb(16 185 129 / 0.45);
}
#angebote .package-image {
position: relative;
overflow: hidden;
border-radius: 10px;
}
#angebote .package-image img {
width: 100%;
aspect-ratio: 1.65;
object-fit: cover;
transition: transform 0.4s;
}
#angebote .package:hover img {
transform: scale(1.03);
}
#angebote .package-badge {
position: absolute;
left: 0.75rem;
bottom: 0.75rem;
padding: 0.45rem 0.75rem;
border-radius: 5px;
background: var(--th-accent);
color: #06261a;
font-size: 0.75rem;
font-weight: 750;
letter-spacing: 0.08em;
text-transform: uppercase;
}
#angebote .package-body {
display: flex;
flex-direction: column;
flex: 1;
padding: 1.5rem 0.9rem 0.9rem;
}
#angebote .package-label {
margin: 0;
font-size: 0.875rem;
font-weight: 650;
letter-spacing: 0.12em;
text-transform: uppercase;
color: var(--ang-mint);
}
#angebote .package-body h3 {
margin: 0.8rem 0 1rem;
font-size: 1.9rem;
font-weight: 400;
line-height: 1.15;
}
#angebote .package-text {
margin: 0;
color: var(--th-text-muted);
}
#angebote .package-body ul {
flex: 1;
margin: 1.25rem 0 0;
padding: 1.25rem 0 1.5rem;
list-style: none;
border-top: 1px solid var(--ang-line);
}
#angebote .package-body li {
position: relative;
padding: 0.3rem 0 0.3rem 1.5rem;
}
#angebote .package-body li::before {
content: "✓";
position: absolute;
left: 0;
color: var(--ang-mint);
}
/* ---------- Buttons ---------- */
#angebote .package-button,
#angebote .dialog-done {
display: inline-flex;
align-items: center;
justify-content: space-between;
width: 100%;
min-height: 3.25rem;
padding: 0.9rem 1rem;
border: 1px solid rgb(255 255 255 / 0.15);
border-radius: 7px;
background: transparent;
color: var(--th-text-soft);
font-size: 1.0625rem;
font-weight: 650;
cursor: pointer;
transition: background 0.2s, border-color 0.2s;
}
#angebote .package-button:hover {
border-color: var(--th-accent);
background: rgb(16 185 129 / 0.08);
}
#angebote .package-button.is-primary,
#angebote .dialog-done {
border-color: transparent;
background: var(--th-accent);
color: #071b16;
}
#angebote .package-button.is-primary:hover,
#angebote .dialog-done:hover {
background: #37c99b;
}
/* ---------- Coaching-Rabatt ---------- */
#angebote .coaching-banner {
display: flex;
align-items: center;
gap: 1.5rem;
margin-top: 1.75rem;
padding: 1.6rem 1.9rem;
border: 1px solid rgb(16 185 129 / 0.19);
border-radius: 12px;
background: rgb(16 185 129 / 0.04);
}
#angebote .bonus-symbol {
padding-right: 1.5rem;
border-right: 1px solid rgb(16 185 129 / 0.25);
font-family: var(--th-font-display);
font-size: 2.2rem;
color: var(--ang-mint);
}
#angebote .coaching-banner h3 {
margin: 0 0 0.3rem;
font-family: var(--th-font-body);
font-size: 1.2rem;
font-weight: 600;
}
#angebote .coaching-banner p {
margin: 0;
color: var(--th-text-muted);
}
#angebote .bonus-button {
margin-left: auto;
min-height: 2.75rem;
border: 0;
background: none;
color: var(--ang-mint);
font-size: 1.0625rem;
font-weight: 600;
white-space: nowrap;
cursor: pointer;
}
/* ---------- Dialog ---------- */
#angebote dialog {
margin: auto; /* Kunden-CSS setzt margin:0 → Dialog wieder zentrieren */
width: min(680px, calc(100% - 2rem));
max-height: 90dvh;
padding: 0;
border: 1px solid rgb(255 255 255 / 0.15);
border-radius: 20px;
background: #171726;
color: var(--th-text-soft);
box-shadow: 0 30px 100px rgb(0 0 0 / 0.55);
}
#angebote dialog::backdrop {
background: rgb(5 5 11 / 0.8);
backdrop-filter: blur(6px);
}
#angebote .dialog-inner {
position: relative;
padding: 2.5rem;
}
#angebote .close-dialog {
position: absolute;
top: 0.75rem;
right: 1rem;
width: 2.75rem;
height: 2.75rem;
border: 0;
background: transparent;
color: var(--th-text-muted);
font-size: 1.9rem;
cursor: pointer;
}
#angebote .dialog-inner h2 {
margin: 0.8rem 2.2rem 1.1rem 0;
font-size: 2.2rem;
}
#angebote #dialog-description {
margin: 0;
color: var(--th-text-muted);
}
#angebote .dialog-inner h3 {
margin: 1.6rem 0 0.75rem;
font-family: var(--th-font-body);
font-size: 1.2rem;
font-weight: 600;
}
#angebote #dialog-features {
margin: 0;
padding-left: 1.25rem;
}
#angebote #dialog-features li {
padding: 0.25rem 0;
}
#angebote .dialog-hint {
margin: 0.75rem 0 0;
font-size: 1rem;
color: var(--th-text-muted);
}
#angebote .discount-box {
margin: 1.6rem 0;
padding: 1.4rem;
border: 1px solid rgb(16 185 129 / 0.27);
border-radius: 12px;
background: rgb(16 185 129 / 0.035);
}
#angebote .discount-box h3 {
margin-top: 0.4rem;
}
#angebote .discount-box label {
display: block;
margin-bottom: 0.5rem;
}
#angebote .discount-box select {
width: 100%;
padding: 0.75rem;
border: 1px solid rgb(255 255 255 / 0.25);
border-radius: 7px;
background: #11111f;
color: var(--th-text-soft);
font-size: 1.0625rem;
}
#angebote #discount-result {
margin: 0;
padding: 1rem 0 0;
color: var(--ang-mint);
}
#angebote #discount-result strong {
font-size: 1.6rem;
}
#angebote .discount-box a {
display: inline-block;
margin-top: 0.9rem;
color: var(--ang-mint);
}
#angebote select:focus-visible {
outline: 3px solid var(--th-accent);
outline-offset: 3px;
}
/* ---------- Tablet ---------- */
@media (max-width: 1100px) {
#angebote .angebote-heading { gap: 2rem; }
#angebote .package-body h3 { font-size: 1.7rem; }
#angebote .coaching-banner { flex-wrap: wrap; }
#angebote .bonus-button { margin-left: 0; }
}
/* ---------- schmale Tablets: 2 Karten nebeneinander ---------- */
@media (max-width: 1000px) {
#angebote .package-grid { grid-template-columns: repeat(2, minmax(0, 1fr)); }
}
/* ---------- Mobil ---------- */
@media (max-width: 760px) {
#angebote .angebote-heading { display: block; }
#angebote .angebote-heading > p { max-width: none; margin-top: 1.25rem; }
#angebote .package-grid { grid-template-columns: 1fr; }
#angebote .package-image img { aspect-ratio: 1.8; }
#angebote .coaching-banner { padding: 1.4rem; gap: 1rem; }
#angebote .coaching-banner > div:nth-child(2) { flex: 1; min-width: 12rem; }
#angebote .bonus-symbol { display: none; }
#angebote .dialog-inner { padding: 2rem 1.4rem; }
#angebote .dialog-inner h2 { font-size: 1.9rem; }
}
@media (prefers-reduced-motion: reduce) {
#angebote .package img { transition: none; }
}

View File

@ -0,0 +1,9 @@
/* =========================================================
US01-02: Vorteile auf einen Blick
Branch: feature/US01-02-vorteile
Nur Selektoren unter #vorteile verwenden.
Farben/Schriften über var(--th-...) aus base.css.
========================================================= */
#vorteile {
}

View File

@ -19,7 +19,7 @@
<!-- Ein Stylesheet pro User Story – jede Datei gehört genau einem Feature-Branch -->
<link rel="stylesheet" href="css/sections/hero.css"> <!-- US01-01 -->
<link rel="stylesheet" href="css/sections/angebote.css"> <!-- US01-02 -->
<link rel="stylesheet" href="css/sections/vorteile.css"> <!-- US01-02 -->
<link rel="stylesheet" href="css/sections/ablauf.css"> <!-- US01-03 -->
</head>
<body>
@ -52,7 +52,7 @@
</p>
<div class="hero-actions">
<a class="hero-button" href="#angebote">Mehr erfahren <span aria-hidden="true">↓</span></a>
<a class="hero-button" href="#vorteile">Mehr erfahren <span aria-hidden="true">↓</span></a>
<a class="hero-link" href="#ablauf">So funktioniert’s <span aria-hidden="true">→</span></a>
</div>
@ -100,171 +100,25 @@
<!-- ========== /US01-01 ========== -->
<!-- ========== US01-02: Angebote und Pakete ==========
Branch: feature_US01-02 · Styles: css/sections/angebote.css · Script: js/angebote.js
<!-- ========== US01-02: Vorteile auf einen Blick ==========
Branch: feature/US01-02-vorteile · Styles: css/sections/vorteile.css
Nur innerhalb dieser <section> arbeiten. -->
<section id="angebote" aria-labelledby="angebote-title">
<div class="container">
<div class="angebote-heading">
<div>
<p class="angebote-eyebrow">Deine Ernährung. Deine Begleitung.</p>
<h2 id="angebote-title">So viel Unterstützung,<br>wie du brauchst.</h2>
</div>
<p>Ein klarer Einstieg oder eine enge Begleitung: Wähle den Rahmen, der sich für dich richtig anfühlt.</p>
</div>
<p class="concept-note"><span aria-hidden="true">ⓘ</span> Angebotskonzept · Leistungen zur Abstimmung. Preise und Laufzeiten sind noch offen.</p>
<div class="package-grid">
<article class="package">
<div class="package-image">
<img src="assets/images/angebote/starter.webp" width="700" height="420" alt="Gemeinsame Planung am See für den sportlichen Einstieg" loading="lazy">
</div>
<div class="package-body">
<p class="package-label">Starter</p>
<h3>Dein erster<br>guter Schritt.</h3>
<p class="package-text">Für Einsteiger und Wiedereinsteiger, die ihre Ernährung verstehen und gezielt verändern möchten.</p>
<ul>
<li>Persönliche Bestandsaufnahme</li>
<li>Analyse deiner Essgewohnheiten</li>
<li>Konkrete Empfehlungen für den Alltag</li>
</ul>
<button type="button" class="package-button" data-package="starter">Starter entdecken <span aria-hidden="true">↗</span></button>
</div>
</article>
<article class="package featured">
<div class="package-image">
<img src="assets/images/angebote/standard.webp" width="700" height="420" alt="Sportler und Coach besprechen gemeinsam einen Plan am Fahrrad" loading="lazy">
<span class="package-badge">Mit individuellem Plan</span>
</div>
<div class="package-body">
<p class="package-label">Standard</p>
<h3>Aus guten Vorsätzen<br>wird dein Plan.</h3>
<p class="package-text">Für alle, die Ernährung und Training aufeinander abstimmen und neue Routinen festigen möchten.</p>
<ul>
<li>Alles aus Starter</li>
<li>Individueller Ernährungsrahmen</li>
<li>Feedback und gemeinsame Anpassung</li>
</ul>
<button type="button" class="package-button is-primary" data-package="standard">Standard entdecken <span aria-hidden="true">↗</span></button>
</div>
</article>
<article class="package">
<div class="package-image">
<img src="assets/images/angebote/premium.webp" width="700" height="420" alt="Persönliches Coachinggespräch auf einer Bank neben einem Triathlonrad" loading="lazy">
</div>
<div class="package-body">
<p class="package-label">Premium</p>
<h3>Dein Ziel.<br>Ganz persönlich.</h3>
<p class="package-text">Für ambitionierte Ziele und alle, die sich eine besonders enge, individuelle Begleitung wünschen.</p>
<ul>
<li>Alles aus Standard</li>
<li>Verpflegungsstrategie für Wettkämpfe</li>
<li>Engmaschige Begleitung und Anpassung</li>
</ul>
<button type="button" class="package-button" data-package="premium">Premium entdecken <span aria-hidden="true">↗</span></button>
</div>
</article>
</div>
<!-- Verweis auf Rabatte aus dem Coaching 1zu1 -->
<div class="coaching-banner">
<div class="bonus-symbol" aria-hidden="true">%</div>
<div>
<h3>Schon im Coaching 1zu1? Dein Vorteil kommt mit.</h3>
<p>Mit deinem Coaching-Paket sparst du bei der Ernährungsberatung: Starter 3&nbsp;%, Standard 5&nbsp;%, Premium 10&nbsp;%.</p>
</div>
<button type="button" class="bonus-button" data-package="bonus">Rabatte ansehen <span aria-hidden="true">↗</span></button>
</div>
</div>
<!-- Detaildialog (öffnet nur per Klick, kein Pop-up beim Laden) -->
<dialog id="package-dialog" aria-labelledby="dialog-title">
<div class="dialog-inner">
<button type="button" class="close-dialog" aria-label="Details schließen">×</button>
<p id="dialog-eyebrow" class="angebote-eyebrow"></p>
<h2 id="dialog-title"></h2>
<p id="dialog-description"></p>
<div id="detail-section">
<h3>Deine Begleitung im Überblick</h3>
<ul id="dialog-features"></ul>
<p class="dialog-hint">Konzeptvorschlag: Leistungsumfang, Kontaktfrequenz, Laufzeit und Preis werden noch abgestimmt.</p>
</div>
<div class="discount-box">
<p class="angebote-eyebrow">Dein Coaching-Vorteil</p>
<h3>Du bist schon im Coaching 1zu1?</h3>
<label for="coaching-select">Dein bestehendes Coaching-Paket</label>
<select id="coaching-select">
<option value="0">Noch kein Coaching 1zu1</option>
<option value="3">Starter-Coaching</option>
<option value="5">Standard-Coaching</option>
<option value="10">Premium-Coaching (24 oder 52 Wochen)</option>
</select>
<p id="discount-result" aria-live="polite"></p>
<p class="dialog-hint">Der Rabatt richtet sich nach deinem bestehenden Coaching 1zu1, unabhängig vom gewählten Ernährungsangebot.</p>
<a href="https://tri-hub.de/coaching-1zu1" target="_blank" rel="noopener">Coaching 1zu1 bei TriHub ansehen ↗</a>
</div>
<button type="button" class="dialog-done">Zurück zu den Angeboten</button>
</div>
</dialog>
<section id="vorteile" aria-labelledby="vorteile-title">
<!-- US01-02: Inhalt hier einfügen -->
</section>
<!-- ========== /US01-02 ========== -->
<!-- ========== US01-03: Ablauf sehen ==========
Branch: feature_US01-03 · Styles: css/sections/ablauf.css
<!-- ========== US01-03: Ablauf sehen (+ Kontaktangaben) ==========
Branch: feature/US01-03-ablauf · Styles: css/sections/ablauf.css
Nur innerhalb dieser <section> arbeiten. -->
<section id="ablauf" aria-labelledby="ablauf-title">
<div class="container">
<div class="ablauf-heading">
<div>
<p class="ablauf-eyebrow">So läuft’s ab</p>
<h2 id="ablauf-title">Vom ersten Gespräch<br>zu deiner eigenen Routine.</h2>
</div>
<p>Du musst nicht schon alles wissen. Wir beginnen bei dir und gehen Schritt für Schritt weiter.</p>
</div>
<ol class="steps">
<li class="step">
<span class="step-number" aria-hidden="true">01</span>
<h3><span class="sr-only">Schritt 1: </span>Dich kennenlernen</h3>
<p>Wir besprechen deine Ziele, deinen Alltag und deine sportliche Ausgangslage.</p>
</li>
<li class="step">
<span class="step-number" aria-hidden="true">02</span>
<h3><span class="sr-only">Schritt 2: </span>Gewohnheiten verstehen</h3>
<p>Ein Ernährungsprotokoll macht sichtbar, was bereits passt und wo du ansetzen kannst.</p>
</li>
<li class="step">
<span class="step-number" aria-hidden="true">03</span>
<h3><span class="sr-only">Schritt 3: </span>Deinen Weg planen</h3>
<p>Du erhältst konkrete Empfehlungen – je nach Paket ergänzt um einen individuellen Ernährungsrahmen.</p>
</li>
<li class="step">
<span class="step-number" aria-hidden="true">04</span>
<h3><span class="sr-only">Schritt 4: </span>Umsetzen &amp; anpassen</h3>
<p>Du erprobst die Empfehlungen. In Standard und Premium begleiten Feedback und Anpassungen deinen Weg.</p>
</li>
</ol>
<div class="process-end">
<p>Der beste Plan ist der, der in dein Leben passt.</p>
<a class="process-link" href="#angebote">Dein Angebot entdecken <span aria-hidden="true">↑</span></a>
</div>
</div>
<!-- US01-03: Inhalt hier einfügen -->
</section>
<!-- ========== /US01-03 ========== -->
</main>
<script src="js/main.js" defer></script>
<script src="js/angebote.js" defer></script> <!-- US01-02 -->
</body>
</html>

View File

@ -1,105 +0,0 @@
// US01-02: Paketdetails und Coaching-Rabatt im Dialog (Vorlage: Prototyp)
'use strict';
(() => {
const section = document.querySelector('#angebote');
if (!section) return;
const packages = {
starter: {
name: 'Starter',
title: 'Dein erster guter Schritt.',
description: 'Du möchtest wissen, wo du stehst und was du konkret verändern kannst? Starter schafft eine persönliche Grundlage für deinen Einstieg.',
features: [
'Gemeinsames Erstgespräch zu Zielen, Training, Alltag und Vorlieben.',
'Auswertung eines Ernährungsprotokolls mit Blick auf deine bisherigen Gewohnheiten.',
'Persönliche Handlungsempfehlungen für Essen und Trinken im Alltag und rund um dein Training.',
'Abschlussgespräch zur Einordnung deiner nächsten Schritte.'
]
},
standard: {
name: 'Standard',
title: 'Aus guten Vorsätzen wird dein Plan.',
description: 'Du möchtest aus einzelnen Empfehlungen eine verlässliche Routine machen? Standard verbindet die Bestandsaufnahme mit einem individuellen Plan und persönlichem Feedback.',
features: [
'Alle vorgeschlagenen Leistungen aus Starter.',
'Ein individueller Ernährungsrahmen für Trainings- und Ruhetage.',
'Praktische Mahlzeitenideen, abgestimmt auf deine Vorlieben und deinen Alltag.',
'Feedbackgespräche, um Erfahrungen zu besprechen und den Plan gemeinsam anzupassen.'
]
},
premium: {
name: 'Premium',
title: 'Dein Ziel. Ganz persönlich.',
description: 'Du möchtest deine Ernährung gezielt auf sportliche Herausforderungen abstimmen? Premium sieht eine besonders enge Begleitung bis in die Wettkampfvorbereitung vor.',
features: [
'Alle vorgeschlagenen Leistungen aus Standard.',
'Eine individuelle Strategie für Essen und Trinken vor, während und nach Wettkämpfen.',
'Erprobung der Verpflegung im Training und Anpassung an deine Erfahrungen.',
'Engmaschiger persönlicher Austausch und laufende Anpassungen an deine Trainingsphasen.'
]
}
};
const dialog = section.querySelector('#package-dialog');
const select = section.querySelector('#coaching-select');
const result = section.querySelector('#discount-result');
let trigger = null;
function updateDiscount() {
const rate = Number(select.value);
result.replaceChildren();
if (rate) {
const strong = document.createElement('strong');
strong.textContent = `${rate} % Rabatt`;
result.append(strong, document.createTextNode(' auf deine Ernährungsberatung.'));
} else {
result.textContent = 'Mit Coaching 1zu1: Starter 3 %, Standard 5 %, Premium 10 % Rabatt.';
}
}
function openDetails(key, button) {
trigger = button;
const data = packages[key];
section.querySelector('#dialog-eyebrow').textContent =
data ? `Ernährungsberatung · ${data.name}` : 'Coaching 1zu1 · Bonusregelung';
section.querySelector('#dialog-title').textContent =
data ? data.title : 'Dein Coaching zahlt sich aus.';
section.querySelector('#dialog-description').textContent = data
? data.description
: 'Dein bestehendes Coaching-Paket bringt dir einen Preisvorteil bei der Ernährungsberatung. Wähle es aus und sieh deinen Rabatt.';
section.querySelector('#detail-section').hidden = !data;
const list = section.querySelector('#dialog-features');
list.replaceChildren();
if (data) {
data.features.forEach((text) => {
const li = document.createElement('li');
li.textContent = text;
list.append(li);
});
}
updateDiscount();
dialog.showModal();
}
section.querySelectorAll('[data-package]').forEach((button) => {
button.addEventListener('click', () => openDetails(button.dataset.package, button));
});
select.addEventListener('change', updateDiscount);
section.querySelectorAll('.close-dialog, .dialog-done').forEach((button) => {
button.addEventListener('click', () => dialog.close());
});
// Klick auf den abgedunkelten Hintergrund schließt den Dialog
dialog.addEventListener('click', (event) => {
if (event.target === dialog) dialog.close();
});
// Fokus zurück auf den auslösenden Button (Barrierefreiheit)
dialog.addEventListener('close', () => trigger?.focus());
})();