Kontaktformular und Pakete korrigiert

Kommentare ergänzt, Menüabstände angepasst und Paketbild aktualisiert.
Sprint2/rev
3015418 2026-09-29 21:44:20 +02:00
parent c592bff01a
commit 6ba39a9659
12 changed files with 43 additions and 8 deletions

View File

@ -78,6 +78,7 @@
flex-direction: column; flex-direction: column;
} }
/* ---------- Profilbild, Name und Rolle innerhalb einer Karte ---------- */
.berater-section .berater-image-wrapper { .berater-section .berater-image-wrapper {
background-color: var(--background); background-color: var(--background);
border-radius: 10px; border-radius: 10px;
@ -112,6 +113,7 @@
font-weight: 600; font-weight: 600;
} }
/* ---------- Biografie und ergänzende Angaben aus berater.json ---------- */
.berater-section .berater-bio-box { .berater-section .berater-bio-box {
/* Hintergrund entfernt, um sich nahtlos in die Karte einzufügen */ /* Hintergrund entfernt, um sich nahtlos in die Karte einzufügen */
background-color: transparent; background-color: transparent;

View File

@ -295,6 +295,7 @@
resize: vertical; resize: vertical;
} }
/* kontakt.js setzt die Zustandsklassen für ungültige Felder und Rückmeldungen. */
.kontakt-seite .field input.invalid, .kontakt-seite .field input.invalid,
.kontakt-seite .field select.invalid, .kontakt-seite .field select.invalid,
.kontakt-seite .field textarea.invalid { .kontakt-seite .field textarea.invalid {

View File

@ -84,6 +84,7 @@
position: relative; position: relative;
} }
/* Empfehlung kommt aus der JSON-Datei; die Auswahlklasse setzt leistungen.js beim Klick. */
.pakete .paket-karte--empfohlen { .pakete .paket-karte--empfohlen {
border-color: 1px solid rgba(248, 250, 252, 0.08); border-color: 1px solid rgba(248, 250, 252, 0.08);
box-shadow: 0 0 0 1px var(--accent-soft); box-shadow: 0 0 0 1px var(--accent-soft);
@ -125,6 +126,7 @@
display: block; display: block;
} }
/* ---------- Karteninhalt: Paketname, Preis, Beschreibung und Leistungen ---------- */
.pakete .paket-karte__body { .pakete .paket-karte__body {
padding: 1.75rem; padding: 1.75rem;
display: flex; display: flex;
@ -200,6 +202,7 @@
background: var(--accent); background: var(--accent);
} }
/* ---------- Paketauswahl und Tastaturfokus ---------- */
.pakete .paket-karte__cta { .pakete .paket-karte__cta {
font-family: var(--font-body); font-family: var(--font-body);
font-weight: 600; font-weight: 600;
@ -223,6 +226,7 @@
outline-offset: 2px; outline-offset: 2px;
} }
/* ---------- Spaltenwechsel: drei, zwei, dann eine; Empfehlung bleibt mobil zuerst ---------- */
@media (max-width: 860px) { @media (max-width: 860px) {
.pakete .pakete__grid { .pakete .pakete__grid {
grid-template-columns: repeat(2, minmax(0, 1fr)); grid-template-columns: repeat(2, minmax(0, 1fr));

View File

@ -1,5 +1,6 @@
/* Shahnam und Vincent: Gemeinsame Navigation für US 04-05. */ /* Shahnam und Vincent: Gemeinsame Navigation für US 04-05. */
:root { :root {
/* navigation.js ergänzt den tatsächlich gemessenen Abstand für Anker-Sprünge. */
--navigation-height: 99px; --navigation-height: 99px;
scroll-padding-top: calc(var(--navigation-offset, var(--navigation-height)) + 16px); scroll-padding-top: calc(var(--navigation-offset, var(--navigation-height)) + 16px);
} }
@ -32,6 +33,7 @@
box-sizing: border-box; box-sizing: border-box;
} }
/* ---------- Kopfzeile: Logo, Begleittext und Menü ---------- */
.site-navigation__bar { .site-navigation__bar {
display: flex; display: flex;
align-items: center; align-items: center;
@ -50,6 +52,7 @@
padding-block: 8px; padding-block: 8px;
} }
/* ---------- Navigationslinks und ihre Klickflächen ---------- */
.site-navigation__links ul { .site-navigation__links ul {
display: flex; display: flex;
align-items: center; align-items: center;
@ -63,6 +66,7 @@
.site-navigation .navigation-disabled { .site-navigation .navigation-disabled {
display: block; display: block;
padding-block: 10px; padding-block: 10px;
padding-inline: 14px;
color: var(--text-muted); color: var(--text-muted);
font-size: 19px; font-size: 19px;
font-weight: 250; font-weight: 250;
@ -94,6 +98,7 @@
cursor: default; cursor: default;
} }
/* ---------- Logo und Markenname ---------- */
.site-navigation .brand__logo { .site-navigation .brand__logo {
display: grid; display: grid;
place-items: center; place-items: center;
@ -140,6 +145,7 @@
line-height: 1.4; line-height: 1.4;
} }
/* ---------- Menüknopf und Hintergrund für die kompakte Ansicht ---------- */
.site-navigation .menu-toggle { .site-navigation .menu-toggle {
display: none; display: none;
flex-shrink: 0; flex-shrink: 0;
@ -220,6 +226,7 @@
} }
} }
/* Kleinere Kopfzeile und Schriftgrößen auf schmalen Bildschirmen. */
@media (max-width: 700px) { @media (max-width: 700px) {
:root { :root {
--navigation-height: 81px; --navigation-height: 81px;

View File

@ -15,6 +15,7 @@
background: var(--background); background: var(--background);
} }
/* ---------- Grundlayout: Der Hero nutzt die Fensterhöhe unter der Navigation ---------- */
.produktuebersicht, .produktuebersicht,
.produktuebersicht *, .produktuebersicht *,
.produktuebersicht::before, .produktuebersicht::before,
@ -48,6 +49,7 @@
flex: 1; flex: 1;
} }
/* ---------- Hero-Bild und dunkle Verläufe für lesbaren Text ---------- */
.produktuebersicht .hero { .produktuebersicht .hero {
position: relative; position: relative;
isolation: isolate; isolation: isolate;
@ -89,6 +91,7 @@
/* ---------- Überschrift, Einleitung und Ausrichtung im Hero ---------- */
.produktuebersicht .hero__inner { .produktuebersicht .hero__inner {
display: flex; display: flex;
flex-direction: column; flex-direction: column;
@ -146,6 +149,7 @@
line-height: 1.85; line-height: 1.85;
} }
/* ---------- Vorteile und ergänzender Slogan unter dem Haupttext ---------- */
.produktuebersicht .hero__details { .produktuebersicht .hero__details {
display: grid; display: grid;
grid-template-columns: minmax(0, 1fr) 250px; grid-template-columns: minmax(0, 1fr) 250px;
@ -209,6 +213,7 @@
letter-spacing: -0.025em; letter-spacing: -0.025em;
} }
/* Reservierte Styles für den derzeit nicht eingebundenen Produkt-Footer. */
.produktuebersicht .site-footer__inner { .produktuebersicht .site-footer__inner {
display: flex; display: flex;
align-items: center; align-items: center;
@ -239,6 +244,7 @@
background: var(--accent); background: var(--accent);
} }
/* ---------- Anpassungen für Tablet und Mobilgeräte ---------- */
@media (max-width: 1100px) { @media (max-width: 1100px) {
.produktuebersicht .hero::after { .produktuebersicht .hero::after {
background: background:

View File

@ -1,3 +1,4 @@
/* Gemeinsame Grundwerte für Übersichts- und Kontaktseite; Bereichsstile liegen in eigenen Dateien. */
:root { :root {
color-scheme: dark; color-scheme: dark;
font-family: system-ui, -apple-system, "Segoe UI", Arial, sans-serif; font-family: system-ui, -apple-system, "Segoe UI", Arial, sans-serif;

View File

@ -5,6 +5,7 @@
<meta charset="UTF-8"> <meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Kontakt | Ernährungsberatung für Triathleten | tri-hub</title> <title>Kontakt | Ernährungsberatung für Triathleten | tri-hub</title>
<!-- Gemeinsame Schriften und Navigation; kontakt.css ergänzt die Styles dieser Seite. -->
<link rel="preconnect" href="https://fonts.googleapis.com"> <link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin> <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link <link
@ -13,6 +14,7 @@
<link rel="stylesheet" href="../css/site.css"> <link rel="stylesheet" href="../css/site.css">
<link rel="stylesheet" href="../css/navigation.css"> <link rel="stylesheet" href="../css/navigation.css">
<link rel="stylesheet" href="../css/kontakt.css"> <link rel="stylesheet" href="../css/kontakt.css">
<!-- Gemeinsames Menü sowie Formularprüfung und Scroll-Reveal für die Kontaktseite. -->
<script src="../js/navigation.js" defer></script> <script src="../js/navigation.js" defer></script>
<script src="../js/kontakt.js" defer></script> <script src="../js/kontakt.js" defer></script>
</head> </head>
@ -95,6 +97,7 @@
<span class="kicker">Nachricht</span> <span class="kicker">Nachricht</span>
<h2>Schreib uns eine Nachricht</h2> <h2>Schreib uns eine Nachricht</h2>
<!-- kontakt.js prüft die Eingaben und öffnet zum Absenden das E-Mail-Programm. -->
<form id="kontakt-formular" novalidate> <form id="kontakt-formular" novalidate>
<div class="field"> <div class="field">
<label for="kf-name">Name *</label> <label for="kf-name">Name *</label>

Binary file not shown.

Before

Width:  |  Height:  |  Size: 324 KiB

After

Width:  |  Height:  |  Size: 187 KiB

View File

@ -5,6 +5,7 @@
<meta charset="UTF-8"> <meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Ernährungsberatung für Triathleten | tri-hub</title> <title>Ernährungsberatung für Triathleten | tri-hub</title>
<!-- Schriften und Styles: gemeinsame Grundlage zuerst, danach die einzelnen Bereiche. -->
<link rel="preconnect" href="https://fonts.googleapis.com"> <link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin> <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link <link
@ -16,6 +17,7 @@
<link rel="stylesheet" href="css/leistungen.css"> <link rel="stylesheet" href="css/leistungen.css">
<link rel="stylesheet" href="css/berater.css"> <link rel="stylesheet" href="css/berater.css">
<link rel="stylesheet" href="css/beratung.css"> <link rel="stylesheet" href="css/beratung.css">
<!-- Navigation und dynamische Inhalte werden nach dem Einlesen des HTML initialisiert. -->
<script src="js/navigation.js" defer></script> <script src="js/navigation.js" defer></script>
<script src="js/leistungen.js" defer></script> <script src="js/leistungen.js" defer></script>
<script src="js/berater.js" defer></script> <script src="js/berater.js" defer></script>
@ -35,6 +37,7 @@
<span class="brand__label">Triathlon als sportliches Zuhause ab 50</span> <span class="brand__label">Triathlon als sportliches Zuhause ab 50</span>
</div> </div>
</div> </div>
<!-- Ein gemeinsamer Linksatz für Desktop und Mobil; navigation.js steuert den Menüknopf. -->
<button class="menu-toggle" type="button" aria-controls="navigation-links" <button class="menu-toggle" type="button" aria-controls="navigation-links"
aria-expanded="false" aria-label="Menü öffnen">☰</button> aria-expanded="false" aria-label="Menü öffnen">☰</button>
<nav class="site-navigation__links" id="navigation-links" aria-label="Hauptnavigation"> <nav class="site-navigation__links" id="navigation-links" aria-label="Hauptnavigation">
@ -71,6 +74,7 @@
</p> </p>
</div> </div>
<!-- Vorteile der Beratung und ergänzender Slogan. -->
<div class="hero__details"> <div class="hero__details">
<ul class="benefits" aria-label="Vorteile der Ernährungsberatung"> <ul class="benefits" aria-label="Vorteile der Ernährungsberatung">
<li> <li>
@ -98,6 +102,7 @@
</section> </section>
<!-- Vincent: Leistungsübersicht --> <!-- Vincent: Leistungsübersicht -->
<!-- Titel, Einleitung und Karten werden durch leistungen.js aus json/pakete.json erzeugt. -->
<section id="leistungen" class="pakete"> <section id="leistungen" class="pakete">
<div class="pakete__intro"> <div class="pakete__intro">
<h2 class="pakete__titel"></h2> <h2 class="pakete__titel"></h2>
@ -128,6 +133,7 @@
was dich erwartet.</p> was dich erwartet.</p>
</div> </div>
<!-- Beratung im Überblick: Inhalte, Ablauf, Zielgruppe und weitere Informationen. -->
<div class="grid-2"> <div class="grid-2">
<div class="box reveal"> <div class="box reveal">
<h2>Was dich bei der Beratung erwartet</h2> <h2>Was dich bei der Beratung erwartet</h2>
@ -196,6 +202,7 @@
<div class="container" id="kontakt"> <div class="container" id="kontakt">
<!-- Einstieg zur separaten Kontaktseite mit Formular. -->
<div class="cta-band reveal"> <div class="cta-band reveal">
<h2>Bereit für deinen nächsten Schritt?</h2> <h2>Bereit für deinen nächsten Schritt?</h2>
<p>Vereinbare ein unverbindliches Kennenlerngespräch – wir schauen gemeinsam, ob die Beratung zu <p>Vereinbare ein unverbindliches Kennenlerngespräch – wir schauen gemeinsam, ob die Beratung zu
@ -207,6 +214,7 @@
</section> </section>
<!-- Seitenabschluss mit internen Links, Trihub-Angeboten und rechtlichen Informationen. -->
<footer class="site-footer"> <footer class="site-footer">
<div class="container"> <div class="container">
<div class="footer-grid"> <div class="footer-grid">

View File

@ -125,10 +125,13 @@
} }
} }
// Der Button bleibt unabhängig von der Eingabereihenfolge mit allen Feldern synchron.
form.addEventListener("input", updateSubmitState);
form.addEventListener("change", updateSubmitState);
// Live-Feedback: Nachricht wird bei 10+ Zeichen grün markiert. // Live-Feedback: Nachricht wird bei 10+ Zeichen grün markiert.
fields.message.addEventListener("input", function () { fields.message.addEventListener("input", function () {
validateMessage(); validateMessage();
updateSubmitState();
}); });
["name", "email", "subject"].forEach(function (key) { ["name", "email", "subject"].forEach(function (key) {

View File

@ -30,7 +30,7 @@ document.addEventListener("DOMContentLoaded", async () => {
// Platzhalter-Pfade für die drei generierten Bilder // Platzhalter-Pfade für die drei generierten Bilder
const bilderMap = { const bilderMap = {
"STARTER": "images/paket-starter.jpg", "STARTER": "images/paket-starter.jpg",
"STANDART": "images/paket-standard.jpg", "STANDARD": "images/paket-standard.jpg",
"PREMIUM": "images/paket-premium.jpg" "PREMIUM": "images/paket-premium.jpg"
}; };

View File

@ -20,7 +20,7 @@
"dataPaket": "Starter" "dataPaket": "Starter"
}, },
{ {
"name": "STANDART", "name": "STANDARD",
"preis": 149, "preis": 149,
"zeitraum": "Monat", "zeitraum": "Monat",
"beschreibung": "Laufende Begleitung für alle, die regelmäßig für Wettkämpfe trainieren.", "beschreibung": "Laufende Begleitung für alle, die regelmäßig für Wettkämpfe trainieren.",
@ -33,7 +33,7 @@
], ],
"badge": "Beliebteste Wahl", "badge": "Beliebteste Wahl",
"empfohlen": true, "empfohlen": true,
"dataPaket": "Ausdauer" "dataPaket": "STANDARD"
}, },
{ {
"name": "PREMIUM", "name": "PREMIUM",
@ -41,7 +41,7 @@
"zeitraum": "Monat", "zeitraum": "Monat",
"beschreibung": "Volle Betreuung für ambitionierte Athletinnen und Athleten.", "beschreibung": "Volle Betreuung für ambitionierte Athletinnen und Athleten.",
"leistungen": [ "leistungen": [
"Alles aus Ausdauer", "Alles aus STANDARD",
"Wöchentliche Beratungsgespräche", "Wöchentliche Beratungsgespräche",
"Individuelle Supplement-Empfehlung", "Individuelle Supplement-Empfehlung",
"Betreuung am Wettkampftag", "Betreuung am Wettkampftag",
@ -49,7 +49,7 @@
], ],
"badge": null, "badge": null,
"empfohlen": false, "empfohlen": false,
"dataPaket": "Wettkampf" "dataPaket": "PREMIUM"
} }
] ]
} }