--- /dev/null
+<?php
+/**
+ * triathlon-coaching.com – Kontaktformular Backend
+ * POST /api/kontakt.php
+ *
+ * Erwartet JSON: { name, email, betreff, nachricht, hp }
+ * Antwortet mit JSON: { success: bool, message: string }
+ */
+
+declare(strict_types=1);
+
+// ── Konfiguration ────────────────────────────────────────────────
+const RECIPIENT = 'coaching@triathlon-coaching.com';
+const SENDER_DOMAIN = 'triathlon-coaching.com';
+const RATE_LIMIT = 3; // max. Absendungen pro IP/Stunde
+const RATE_DIR = '/var/tmp/ssg_ratelimit';
+
+const BETREFF_OPTIONS = [
+ 'Personal Coaching',
+ 'Standard-Trainingsplan',
+ 'Trainingscamp',
+ 'Allgemeine Anfrage',
+];
+
+// ── Helpers ──────────────────────────────────────────────────────
+
+function json_response(bool $success, string $message, int $httpCode = 200): never {
+ http_response_code($httpCode);
+ header('Content-Type: application/json; charset=utf-8');
+ echo json_encode(['success' => $success, 'message' => $message]);
+ exit;
+}
+
+function sanitize(string $input): string {
+ return trim(strip_tags($input));
+}
+
+// ── Nur POST erlauben ────────────────────────────────────────────
+if ($_SERVER['REQUEST_METHOD'] !== 'POST') {
+ json_response(false, 'Methode nicht erlaubt.', 405);
+}
+
+// ── JSON-Body einlesen ───────────────────────────────────────────
+$raw = file_get_contents('php://input');
+$data = json_decode($raw, true);
+
+if (!is_array($data)) {
+ json_response(false, 'Ungültiges Format.', 400);
+}
+
+// ── Honeypot (unsichtbares Feld – Bots füllen es aus) ───────────
+if (!empty($data['hp'])) {
+ // Stille Ablehnung – kein Hinweis für Bots
+ json_response(true, 'Nachricht gesendet.');
+}
+
+// ── Felder auslesen & bereinigen ─────────────────────────────────
+$name = sanitize((string)($data['name'] ?? ''));
+$email = sanitize((string)($data['email'] ?? ''));
+$betreff = sanitize((string)($data['betreff'] ?? ''));
+$nachricht = sanitize((string)($data['nachricht'] ?? ''));
+
+// ── Validierung ──────────────────────────────────────────────────
+$errors = [];
+
+if (mb_strlen($name) < 2) $errors[] = 'Bitte gib deinen Namen an.';
+if (!filter_var($email, FILTER_VALIDATE_EMAIL)) $errors[] = 'Bitte eine gültige E-Mail-Adresse angeben.';
+if (!in_array($betreff, BETREFF_OPTIONS, true)) $errors[] = 'Bitte ein Anliegen auswählen.';
+if (mb_strlen($nachricht) < 10) $errors[] = 'Die Nachricht ist zu kurz.';
+if (mb_strlen($nachricht) > 5000) $errors[] = 'Die Nachricht ist zu lang (max. 5000 Zeichen).';
+
+if (!empty($errors)) {
+ json_response(false, implode(' ', $errors), 422);
+}
+
+// ── Rate-Limit ───────────────────────────────────────────────────
+if (!is_dir(RATE_DIR)) {
+ mkdir(RATE_DIR, 0700, true);
+}
+
+$ip = preg_replace('/[^a-f0-9:.]/', '', $_SERVER['REMOTE_ADDR'] ?? '');
+$ratefile = RATE_DIR . '/' . hash('sha256', $ip) . '.json';
+$now = time();
+$window = 3600; // 1 Stunde
+
+$attempts = [];
+if (file_exists($ratefile)) {
+ $attempts = json_decode(file_get_contents($ratefile), true) ?? [];
+}
+// Alte Einträge entfernen
+$attempts = array_filter($attempts, fn(int $t) => ($now - $t) < $window);
+
+if (count($attempts) >= RATE_LIMIT) {
+ json_response(false, 'Zu viele Anfragen. Bitte versuche es später erneut.', 429);
+}
+
+$attempts[] = $now;
+file_put_contents($ratefile, json_encode(array_values($attempts)));
+
+// ── E-Mail an Coach ──────────────────────────────────────────────
+$subject = '[triathlon-coaching.com] ' . $betreff . ' – ' . $name;
+
+$body_coach = <<<TEXT
+Neue Kontaktanfrage über triathlon-coaching.com
+================================================
+
+Name: {$name}
+E-Mail: {$email}
+Anliegen: {$betreff}
+
+Nachricht:
+----------
+{$nachricht}
+
+--
+IP: {$ip}
+Zeitpunkt: {$now}
+TEXT;
+
+$headers_coach = "From: noreply@{$sender_domain}\r\n";
+$headers_coach .= "Reply-To: {$email}\r\n";
+$headers_coach .= "Content-Type: text/plain; charset=UTF-8\r\n";
+$headers_coach .= "X-Mailer: tricoach-ssg/1.0\r\n";
+
+$sender_domain = SENDER_DOMAIN;
+
+$sent = mail(RECIPIENT, $subject, $body_coach, $headers_coach);
+
+if (!$sent) {
+ error_log('[kontakt.php] mail() fehlgeschlagen für ' . $email);
+ json_response(false, 'Technischer Fehler beim Senden. Bitte versuche es später erneut.', 500);
+}
+
+// ── Kopie + Autoresponder an Absender ───────────────────────────
+$subject_copy = 'Deine Anfrage bei triathlon-coaching.com';
+
+$body_copy = <<<TEXT
+Hallo {$name},
+
+vielen Dank für deine Nachricht! Ich habe deine Anfrage erhalten und
+melde mich in der Regel innerhalb von 1–2 Werktagen bei dir.
+
+Zur Erinnerung – deine Nachricht:
+----------------------------------
+Anliegen: {$betreff}
+
+{$nachricht}
+----------------------------------
+
+Viele Grüße,
+Dein Triathlon-Coach
+
+--
+triathlon-coaching.com
+DTU-C-Trainer seit 2018
+TEXT;
+
+$headers_copy = "From: coaching@{$sender_domain}\r\n";
+$headers_copy .= "Reply-To: " . RECIPIENT . "\r\n";
+$headers_copy .= "Content-Type: text/plain; charset=UTF-8\r\n";
+$headers_copy .= "X-Mailer: tricoach-ssg/1.0\r\n";
+
+// Autoresponder – Fehler hier nicht kritisch, nur loggen
+if (!mail($email, $subject_copy, $body_copy, $headers_copy)) {
+ error_log('[kontakt.php] Autoresponder fehlgeschlagen für ' . $email);
+}
+
+// ── Erfolg ───────────────────────────────────────────────────────
+json_response(true, 'Deine Nachricht wurde gesendet. Du erhältst in Kürze eine Bestätigung per E-Mail.');
--- /dev/null
+# ============================================================
+# triathlon-coaching.com – SSG Konfiguration
+#
+# Konvention: /var/www/DOMAIN/SUBDOMAIN
+# Apache DocumentRoot: /var/www/triathlon-coaching/www
+# Alles andere liegt daneben – Apache-blind.
+#
+# Aufruf:
+# java -jar /var/www/triathlon-coaching/ssg/triathlon-coaching-ssg.jar \
+# /var/www/triathlon-coaching/ssg/config.yaml
+# ============================================================
+
+site:
+ name: "triathlon-coaching.com"
+ base_url: "https://www.triathlon-coaching.com"
+ language: "de"
+ copyright: "2026 triathlon-coaching.com"
+
+database:
+ host: "localhost"
+ port: 5432
+ name: "laktatnebel"
+ schema: "triathlon_coaching_com"
+ #user: "oleb"
+ user: "postgres"
+ #password: "wpj_9+L6ukX+SN2-"
+ password: "B9cr--ZvfF@5cMdu"
+
+paths:
+ # Apache DocumentRoot
+ output: "/var/www/triathlon-coaching.com/www"
+
+ # Originale – Apache sieht dieses Verzeichnis nicht
+ media_originals: "/home/oleb/triathlon-coaching.com/media"
+
+ # WebP-Derivate – liegt unter www/, also öffentlich erreichbar
+ media_output: "/var/www/triathlon-coaching.com/www/media"
+
+ # Freemarker-Templates – Apache sieht dieses Verzeichnis nicht
+ templates: "/home/oleb/triathlon-coaching.com/templates"
+
+ # CSS, JS, Fonts – werden 1:1 nach output/static/ kopiert
+ static: "/home/oleb/triathlon-coaching.com/templates/static"
+
+build:
+ clean_output: false
+ threads: 2
+
+ image_variants:
+ lg: 1920
+ md: 800
+ sm: 400
+
+ image_format: "png"
+ image_quality: 82
+
+blog:
+ nav_tag_coverage: 0.67 # Top-Tags die 2/3 der Vorkommen abdecken
--- /dev/null
+SET search_path TO triathlon_coaching_com;
+
+UPDATE page_content SET body =
+$$## Wer bin ich?
+
+Seit 1987 bin ich Läufer und seit 1997 Triathlet – zum großen Teil leistungssportlich. Zwischen 800m und Ironman habe ich keine Strecke ausgelassen. Ich spreche bei meinem Training viel aus Erfahrung und kenne sowohl die Einsamkeit der langen Radausfahrt als auch die Hektik auf der Tartanbahn.
+
+Kaum kürzer ist mein Interesse an der Trainingslehre und Sportwissenschaft. So begleitete mich über die Jahre als Athleten bald die Rolle des Trainers, Übungsleiters, Radguides, usw.
+
+Seit 2018 bin ich auch lizensierter DTU-C-Trainer.$$
+WHERE page_id = (SELECT id FROM pages WHERE slug = 'index');
\ No newline at end of file
--- /dev/null
+-- ============================================================
+-- triathlon-coaching SSG – Schema
+-- PostgreSQL, mandantenfähig via Schema-Trennung
+--
+-- Aufruf:
+-- psql -U postgres -d laktatnebel -v schema=triathlon_coaching_com -f schema.sql
+-- ============================================================
+
+CREATE SCHEMA IF NOT EXISTS :"schema";
+SET search_path TO :"schema";
+
+
+-- ============================================================
+-- ENUMs
+-- ============================================================
+
+CREATE TYPE media_type_enum AS ENUM (
+ 'image', 'pdf', 'download', 'video'
+);
+
+CREATE TYPE page_template_enum AS ENUM (
+ 'home',
+ 'blog-grid',
+ 'category-grid',
+ 'article',
+ 'content-page',
+ 'tool-grid',
+ 'contact',
+ 'legal'
+);
+
+CREATE TYPE content_status_enum AS ENUM (
+ 'draft', 'scheduled', 'published', 'archived'
+);
+
+CREATE TYPE build_status_enum AS ENUM (
+ 'running', 'success', 'partial', 'error'
+);
+
+
+-- ============================================================
+-- AUTHORS
+-- ============================================================
+CREATE TABLE authors (
+ id SERIAL PRIMARY KEY,
+ slug VARCHAR(100) NOT NULL UNIQUE,
+ name VARCHAR(255) NOT NULL,
+ bio TEXT,
+ email VARCHAR(255),
+ active BOOLEAN NOT NULL DEFAULT TRUE,
+ created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
+ updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW()
+);
+
+
+-- ============================================================
+-- MEDIA
+-- ============================================================
+CREATE TABLE media (
+ id SERIAL PRIMARY KEY,
+ path_original VARCHAR(500) NOT NULL UNIQUE,
+ path_webp_lg VARCHAR(500),
+ path_webp_md VARCHAR(500),
+ path_webp_sm VARCHAR(500),
+ filename VARCHAR(255) NOT NULL,
+ media_type media_type_enum NOT NULL DEFAULT 'image',
+ mime_type VARCHAR(100),
+ alt_text VARCHAR(500),
+ width_px INTEGER,
+ height_px INTEGER,
+ file_size_bytes BIGINT,
+ file_hash VARCHAR(64),
+ uploaded_by INTEGER REFERENCES authors(id) ON DELETE SET NULL,
+ uploaded_at TIMESTAMPTZ NOT NULL DEFAULT NOW()
+);
+
+CREATE INDEX idx_media_hash ON media(file_hash);
+
+
+-- ============================================================
+-- CATEGORIES
+-- ============================================================
+CREATE TABLE categories (
+ id SERIAL PRIMARY KEY,
+ slug VARCHAR(100) NOT NULL UNIQUE,
+ label VARCHAR(100) NOT NULL
+);
+
+
+-- ============================================================
+-- TAGS
+-- ============================================================
+CREATE TABLE tags (
+ id SERIAL PRIMARY KEY,
+ slug VARCHAR(100) NOT NULL UNIQUE,
+ label VARCHAR(100) NOT NULL
+);
+
+
+-- ============================================================
+-- PAGES
+-- ============================================================
+CREATE TABLE pages (
+ id SERIAL PRIMARY KEY,
+ slug VARCHAR(255) NOT NULL UNIQUE,
+ parent_id INTEGER REFERENCES pages(id) ON DELETE SET NULL,
+ template page_template_enum NOT NULL DEFAULT 'content-page',
+ sort_order SMALLINT NOT NULL DEFAULT 0,
+ in_sitemap BOOLEAN NOT NULL DEFAULT TRUE,
+ locked_category VARCHAR(100),
+ hero_media_id INTEGER REFERENCES media(id) ON DELETE SET NULL,
+ created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
+ updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW()
+);
+
+CREATE INDEX idx_pages_parent ON pages(parent_id);
+CREATE INDEX idx_pages_sort ON pages(parent_id, sort_order);
+
+
+-- ============================================================
+-- NAV_ITEMS
+-- ============================================================
+CREATE TABLE nav_items (
+ id SERIAL PRIMARY KEY,
+ parent_id INTEGER REFERENCES nav_items(id) ON DELETE CASCADE,
+ page_id INTEGER REFERENCES pages(id) ON DELETE CASCADE,
+ external_url VARCHAR(500),
+ label VARCHAR(100) NOT NULL,
+ sort_order SMALLINT NOT NULL DEFAULT 0,
+ open_new_tab BOOLEAN NOT NULL DEFAULT FALSE,
+ active BOOLEAN NOT NULL DEFAULT TRUE,
+
+ CONSTRAINT chk_nav_target CHECK (
+ (page_id IS NOT NULL AND external_url IS NULL) OR
+ (page_id IS NULL AND external_url IS NOT NULL)
+ )
+);
+
+CREATE INDEX idx_nav_parent ON nav_items(parent_id, sort_order);
+
+
+-- ============================================================
+-- PAGE_CONTENT
+-- ============================================================
+CREATE TABLE page_content (
+ id SERIAL PRIMARY KEY,
+ page_id INTEGER NOT NULL REFERENCES pages(id) ON DELETE CASCADE,
+ author_id INTEGER REFERENCES authors(id) ON DELETE SET NULL,
+ category_id INTEGER REFERENCES categories(id) ON DELETE SET NULL,
+ title VARCHAR(255) NOT NULL,
+ subtitle VARCHAR(500),
+ section_label VARCHAR(100),
+ excerpt TEXT,
+ body TEXT,
+ body_secondary TEXT NOT NULL DEFAULT '',
+ hero_media_id INTEGER REFERENCES media(id) ON DELETE SET NULL,
+ card_media_id INTEGER REFERENCES media(id) ON DELETE SET NULL,
+ meta_title VARCHAR(255),
+ meta_desc VARCHAR(320),
+ canonical_url VARCHAR(500),
+ status content_status_enum NOT NULL DEFAULT 'draft',
+ publish_at TIMESTAMPTZ,
+ unpublish_at TIMESTAMPTZ,
+ created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
+ updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW()
+);
+
+CREATE INDEX idx_content_page ON page_content(page_id);
+CREATE INDEX idx_content_status ON page_content(status);
+CREATE INDEX idx_content_publish ON page_content(publish_at) WHERE status = 'scheduled';
+CREATE INDEX idx_content_category ON page_content(category_id);
+
+
+-- ============================================================
+-- CONTENT_PAGES – n:m page_content ↔ categories
+-- Steuert auf welchen Seiten ein Artikel erscheint.
+-- Ein Artikel kann in Blog, Coaching UND Angebot stehen – oder nur in einem.
+-- ============================================================
+CREATE TABLE content_pages (
+ content_id INTEGER NOT NULL REFERENCES page_content(id) ON DELETE CASCADE,
+ category_id INTEGER NOT NULL REFERENCES categories(id) ON DELETE CASCADE,
+ PRIMARY KEY (content_id, category_id)
+);
+
+
+-- CONTENT_TAGS – n:m page_content ↔ tags
+-- ============================================================
+CREATE TABLE content_tags (
+ content_id INTEGER NOT NULL REFERENCES page_content(id) ON DELETE CASCADE,
+ tag_id INTEGER NOT NULL REFERENCES tags(id) ON DELETE CASCADE,
+ PRIMARY KEY (content_id, tag_id)
+);
+
+
+-- ============================================================
+-- CONTENT_MEDIA – n:m page_content ↔ media (Body-Bilder)
+-- ============================================================
+CREATE TABLE content_media (
+ content_id INTEGER NOT NULL REFERENCES page_content(id) ON DELETE CASCADE,
+ media_id INTEGER NOT NULL REFERENCES media(id) ON DELETE CASCADE,
+ position SMALLINT,
+ PRIMARY KEY (content_id, media_id)
+);
+
+
+-- ============================================================
+-- BUILD_LOG
+-- ============================================================
+CREATE TABLE build_log (
+ id SERIAL PRIMARY KEY,
+ triggered_by VARCHAR(100),
+ started_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
+ finished_at TIMESTAMPTZ,
+ status build_status_enum NOT NULL DEFAULT 'running',
+ pages_built INTEGER DEFAULT 0,
+ error_message TEXT
+);
--- /dev/null
+-- ============================================================
+-- triathlon-coaching SSG – Seed
+-- Aufruf nach schema.sql und views.sql:
+-- psql -U postgres -d laktatnebel -v schema=triathlon_coaching_com -f seed.sql
+-- ============================================================
+
+SET search_path TO :"schema";
+
+
+-- ============================================================
+-- CATEGORIES
+-- ============================================================
+INSERT INTO categories (slug, label) VALUES
+ ('blog', 'Blog'),
+ ('coaching', 'coaching'),
+ ('angebot', 'angebot'),
+ ('ueber-mich', 'Über mich'),
+ ('saisonplanung', 'Saisonplanung'),
+ ('camps', 'Camps');
+
+
+-- ============================================================
+-- TAGS
+-- ============================================================
+INSERT INTO tags (slug, label) VALUES
+ ('training', 'Training'),
+ ('ernaehrung', 'Ernährung'),
+ ('wettkampf', 'Wettkampf'),
+ ('regeneration', 'Regeneration'),
+ ('openwater-schwimmen', 'Openwater & Schwimmen'),
+ ('bike-equipment', 'Bike & Equipment'),
+ ('marathon-laufen', 'Marathon & Laufen'),
+ ('ironman-langdistanz', 'Ironman & Langdistanz'),
+ ('gesundheit', 'Gesundheit'),
+ ('raceday', 'Raceday'),
+ ('lauf', 'Lauf'),
+ ('running', 'Running'),
+ ('bike', 'Bike'),
+ ('lifestyle', 'Lifestyle'),
+ ('coaching', 'coaching'),
+ ('saisonplanung', 'Saisonplanung'),
+ ('equipment', 'Equipment');
+
+
+-- ============================================================
+-- AUTHORS
+-- ============================================================
+INSERT INTO authors (id, slug, name, bio, email) VALUES
+(1, 'coach', 'Triathlon-Coach',
+ 'Seit 1987 Läufer, seit 1997 Triathlet – leistungssportlich zwischen 800m und Ironman. Lizensierter DTU-C-Trainer seit 2018.',
+ NULL);
+
+SELECT setval(pg_get_serial_sequence('authors', 'id'), 1);
+
+
+-- ============================================================
+-- PAGES
+-- ============================================================
+INSERT INTO pages (id, slug, parent_id, template, sort_order, in_sitemap, locked_category) VALUES
+( 1, 'index', NULL, 'home', 0, TRUE, NULL),
+( 2, 'coaching', NULL, 'category-grid', 1, TRUE, 'coaching'),
+( 3, 'blog', NULL, 'blog-grid', 2, TRUE, NULL),
+( 4, 'camps', NULL, 'content-page', 3, TRUE, NULL),
+( 5, 'tools', NULL, 'tool-grid', 4, TRUE, NULL),
+( 6, 'kontakt', NULL, 'contact', 5, TRUE, NULL),
+( 7, 'impressum', NULL, 'legal', 6, FALSE, NULL),
+( 8, 'datenschutz', NULL, 'legal', 7, FALSE, NULL),
+( 9, 'agb', NULL, 'legal', 8, FALSE, NULL),
+(10, 'personal-coaching', 2, 'category-grid', 0, TRUE, 'angebot'),
+(11, 'standard-plaene', 2, 'content-page', 1, TRUE, NULL),
+(12, 'langdistanz', 11, 'content-page', 0, TRUE, NULL),
+(13, 'mitteldistanz', 11, 'content-page', 1, TRUE, NULL),
+(14, 'kurzdistanz', 11, 'content-page', 2, TRUE, NULL);
+
+SELECT setval(pg_get_serial_sequence('pages', 'id'), 14);
+
+
+-- ============================================================
+-- NAV_ITEMS
+-- ============================================================
+INSERT INTO nav_items (id, parent_id, label, page_id, external_url, sort_order, open_new_tab, active) VALUES
+-- Top-Level
+( 1, NULL, 'Über mich', 1, NULL, 0, FALSE, TRUE),
+( 2, NULL, 'Coaching', 2, NULL, 1, FALSE, TRUE),
+( 3, NULL, 'Blog', 3, NULL, 2, FALSE, TRUE),
+( 4, NULL, 'Camps', 4, NULL, 3, FALSE, TRUE),
+( 5, NULL, 'Tools & more', 5, NULL, 4, FALSE, TRUE),
+( 6, NULL, 'Kontakt', 6, NULL, 5, FALSE, TRUE),
+-- Coaching-Dropdown
+( 7, 2, 'Personal Coaching', 10, NULL, 0, FALSE, TRUE),
+( 8, 2, 'Standard-Pläne', 11, NULL, 1, FALSE, TRUE),
+-- Standard-Pläne Sub-Dropdown
+( 9, 8, 'Langdistanz & Ironman', 12, NULL, 0, FALSE, TRUE),
+(10, 8, 'Mitteldistanz & Ironman 70.3', 13, NULL, 1, FALSE, TRUE),
+(11, 8, 'Kurz- & olympische Distanz', 14, NULL, 2, FALSE, TRUE),
+-- Blog Tag-Links
+(12, 3, 'Training', NULL, '/blog?tag=training', 0, FALSE, TRUE),
+(13, 3, 'Ernährung', NULL, '/blog?tag=ernaehrung', 1, FALSE, TRUE),
+(14, 3, 'Wettkampf', NULL, '/blog?tag=wettkampf', 2, FALSE, TRUE),
+(15, 3, 'Regeneration', NULL, '/blog?tag=regeneration', 3, FALSE, TRUE),
+(16, 3, 'Openwater & Schwimmen', NULL, '/blog?tag=openwater-schwimmen',4, FALSE, TRUE),
+(17, 3, 'Bike & Equipment', NULL, '/blog?tag=bike-equipment', 5, FALSE, TRUE),
+(18, 3, 'Marathon & Laufen', NULL, '/blog?tag=marathon-laufen', 6, FALSE, TRUE),
+(19, 3, 'Ironman & Langdistanz', NULL, '/blog?tag=ironman-langdistanz',7, FALSE, TRUE),
+-- Tools-Dropdown
+(20, 5, 'Schwimmtraining & -pläne', NULL, 'https://swim.triathlon-coaching.com', 0, TRUE, TRUE),
+(21, 5, '#roadtokona', NULL, 'https://roadtokona.triathlon-coaching.com', 1, TRUE, TRUE);
+
+SELECT setval(pg_get_serial_sequence('nav_items', 'id'), 21);
+
+
+-- ============================================================
+-- PAGE_CONTENT – Seiten
+-- ============================================================
+INSERT INTO page_content (id, page_id, author_id, title, subtitle, section_label, excerpt, body, status) VALUES
+
+(1, 1, 1,
+ 'Erfahrung, die zählt.',
+ 'Coaching, das aus echter Wettkampferfahrung entsteht.',
+ 'Über mich',
+ 'Seit 1997 im Triathlon. Seit 2018 lizensierter DTU-C-Trainer.',
+$$## Wer bin ich?
+
+Seit 1987 bin ich Läufer und seit 1997 Triathlet – zum großen Teil leistungssportlich. Zwischen 800m und Ironman habe ich keine Strecke ausgelassen. Ich spreche bei meinem Training viel aus Erfahrung und kenne sowohl die Einsamkeit der langen Radausfahrt als auch die Hektik auf der Tartanbahn.
+
+Seit 2018 bin ich auch lizensierter DTU-C-Trainer.
+
+## Die ganze Wahrheit
+
+**1987 – Die ersten Schritte**
+Mit 14 Jahren die ersten Laufschuhe geschnürt. Nicht viel später der erste Volkslauf über 10 km.
+
+**1989 – Marathon mit 16**
+Berlin, erster Marathon: 3:10:51. Der Beginn einer langen Liebe zur langen Strecke.
+
+**1991 – Der Geruch von Tartan**
+Bestzeiten: 800m 1:58,3 · 3000m 8:42,4 · 5000m 15:25. Und: erster Volkstriathlon in Neuss.
+
+**1997 – Triathlet werden**
+Schwimmen: irgendwie. Rad: ein olles Rennrad. Laufen: davon hatte ich Ahnung.
+
+**1998 – Ironman Roth**
+Ironman Europe in Roth – seitdem darf ich mich Ironman nennen.
+
+**2018 – DTU-C-Trainer**
+Lizensierter Trainer des Deutschen Triathlon Union.$$,
+ 'published'),
+
+(2, 2, 1, 'Coaching', 'Das richtige Angebot für dein Ziel.', 'Angebot', NULL, '', 'published'),
+(3, 3, 1, 'Blog', 'Über Training, Taktik, Ernährung, Equipment und alles, was Triathleten bewegt.', 'Wissen & Erfahrung', NULL, '', 'published'),
+(4, 4, 1, 'Camps', NULL, 'Gemeinsam trainieren', NULL, '', 'published'),
+(5, 5, 1, 'Tools & more', 'Spezialisierte Plattformen rund um Schwimmtraining und Wettkampfvorbereitung.', 'Interaktiv & spezialisiert', NULL, '', 'published'),
+(6, 6, 1, 'Kontakt', 'Schreib mir – ich melde mich innerhalb von 1–2 Werktagen.', 'Kontakt', NULL, '', 'published'),
+(7, 7, 1, 'Impressum', NULL, NULL, NULL, '## Impressum', 'published'),
+(8, 8, 1, 'Datenschutz', NULL, NULL, NULL, '## Datenschutzerklärung', 'published'),
+(9, 9, 1, 'AGB', NULL, NULL, NULL, '## Allgemeine Geschäftsbedingungen', 'published'),
+(10, 10, 1, 'Personal Coaching', 'Was steckt drin, was kostet es – und was nicht.', 'Angebot', NULL, '', 'published'),
+(11, 11, 1, 'Standard-Pläne', 'Strukturierte Trainingspläne für alle Distanzen.', 'Angebot', NULL, '', 'published'),
+(12, 12, 1, 'Langdistanz & Ironman', NULL, 'Standard-Pläne', NULL, '', 'published'),
+(13, 13, 1, 'Mitteldistanz & Ironman 70.3', NULL, 'Standard-Pläne', NULL, '', 'published'),
+(14, 14, 1, 'Kurz- & olympische Distanz', NULL, 'Standard-Pläne', NULL, '', 'published');
+
+SELECT setval(pg_get_serial_sequence('page_content', 'id'), 14);
+
+
+-- ============================================================
+-- ARTIKEL
+-- ============================================================
+INSERT INTO pages (slug, parent_id, template, sort_order, in_sitemap) VALUES
+('blog/saisonplanung-wie-geht-man-vor', 3, 'article', 0, TRUE),
+('blog/ziele-setzen-aber-richtig', 3, 'article', 0, TRUE),
+('blog/wenn-du-krank-bist', 3, 'article', 0, TRUE),
+('blog/was-nicht-auf-strava-ist-ist-nicht-passiert', 3, 'article', 0, TRUE),
+('blog/gesundheit', 3, 'article', 0, TRUE),
+('blog/laufschuhe-kann-man-zu-viele-haben', 3, 'article', 0, TRUE),
+('blog/bahn-knigge-die-ungeschriebenen-gesetze-auf-der-bahn', 3, 'article', 0, TRUE),
+('blog/warm-up-vor-einem-laufwettkampf', 3, 'article', 0, TRUE),
+('blog/mittwochs-faengt-die-woche-an', 3, 'article', 0, TRUE);
+
+INSERT INTO page_content (page_id, author_id, category_id, title, excerpt, body, status)
+SELECT p.id, 1, c.id,
+ 'Saisonplanung – wie geht man vor?',
+ 'Wie plane ich meine Saison? Vom Ziel zurück in die Gegenwart – in mehrwöchigen Zyklen.',
+$$### Das Ziel bestimmt den Weg
+
+Thema eines anderen Blogs war die richtige Zieldefinition. Was ist ein gutes Ziel und wie setze ich mir ein gutes Ziel. Und irgendwann ist es dann da, das Ziel. Jetzt stehen wir da wie der sprichwörtliche Ochs vorm Berg und fragen uns: „Wie komme ich da hin?"
+
+### Fokus beibehalten
+
+Während der Bergsteiger vom Tal zum Berg plant, geht unser Marathoni den umgekehrten Weg und plant von seinem Marathon zurück Richtung Gegenwart – in mehrwöchigen Zyklen. Die Entlastungswochen und Testwettkämpfe werden zu diesem Zeitpunkt bestimmt.
+
+Ich gehe sogar soweit, dass ich potentielle Testwettkampftermine festlege und dann schaue, wie das Veranstaltungsangebot zu diesen Daten ist. So suche ich zum Datum das Rennen.
+
+### Das Ziel muss passen
+
+Aus dem Ziel und der aktuellen Form folgt ein Soll und Ist. Testwettkämpfe helfen dabei den Fortschritt sichtbar und messbar zu machen.
+
+Saisonplanung ist vor allem auch eine ehrliche Auseinandersetzung mit sich selbst:
+
+- „Was kann ich?"
+- „Was will ich?"
+- „Was bin ich bereit zu tun?"$$,
+ 'published'::content_status_enum
+FROM pages p, categories c
+WHERE p.slug = 'blog/saisonplanung-wie-geht-man-vor' AND c.slug = 'blog';
+
+INSERT INTO page_content (page_id, author_id, category_id, title, excerpt, body, status)
+SELECT p.id, 1, c.id,
+ 'Ziele setzen – aber richtig!',
+ 'SMART-Ziele für Triathleten: spezifisch, messbar, attraktiv, realistisch und terminiert.',
+$$### Aloha!
+
+Die meisten von Euch befinden sich in der Off-Season und machen sich Gedanken um die nächste Saison.
+
+Das Ziel sollte **„SMART"** sein: **spezifisch, messbar, attraktiv, realistisch und terminiert**.
+
+### Spezifisch
+
+Ein spezifisches Ziel ist eines, das **konkret präzisiert** wird. Zum Beispiel: „Ich will den Marathon unter 4 Stunden laufen."
+
+### Messbar
+
+Die Uhren sind unbestechlich. **Platzierungen dürfen ein Wunsch sein, aber kein Ziel**.
+
+### Attraktiv
+
+Ein **attraktives Ziel muss ein Kitzel sein, eine Challenge**.
+
+### Realistisch
+
+Die **Lebensumstände und das Alter** entscheiden mit, ob ein Ziel realistisch ist.
+
+### Terminiert
+
+**Sobald ein Wettkampf im Spiel ist, steht auch ein Datum im Kalender**.
+
+### In der Praxis
+
+Ziele aufschreiben und kritisch diskutieren. **Zwischenziele** sind auf dem langen Weg zur Vision unabdingbar.
+
+**Die Vision ist das Gipfelkreuz** – auf dem Weg dahin sind viele Schritte zu gehen.$$,
+ 'published'::content_status_enum
+FROM pages p, categories c
+WHERE p.slug = 'blog/ziele-setzen-aber-richtig' AND c.slug = 'blog';
+
+INSERT INTO page_content (page_id, author_id, category_id, title, excerpt, body, status)
+SELECT p.id, 1, c.id,
+ '… wenn Du krank bist …',
+ 'Mit Symptomen einer Erkrankung gilt: Trainingsverbot! Krankheitszeiten sind bei mir kostenfrei.',
+$$### … bist Du krank!
+
+Mit Wehwehchen oder Symptomen einer (Atemwegs-)Erkrankung gilt: **Trainingsverbot!**
+
+Es ist Keinem gedient wenn man sich mit Verletzungen oder Krankheiten durch die Saison schleppt. Lebensgefährlich wird es, wenn sich bakterielle Infektionen aufs Herz setzen.
+
+Aus diesem Grund sind **Krankheitszeiten** bei mir **kostenfrei**.
+
+Ich möchte nicht, dass Du den Gedanken entwickelst, durch das Gefühl „für nichts" zu bezahlen, zu früh wieder anfängst oder gar durchtrainierst. Zum Gesund werden brauchst Du die Zeit, die Du dafür brauchst – aber auf keinen Fall Druck.
+
+Gesundheit ist unbezahlbar.$$,
+ 'published'::content_status_enum
+FROM pages p, categories c
+WHERE p.slug = 'blog/wenn-du-krank-bist' AND c.slug = 'angebot';
+
+INSERT INTO page_content (page_id, author_id, category_id, title, excerpt, body, status)
+SELECT p.id, 1, c.id,
+ 'Was nicht auf Strava ist, ist nicht passiert?',
+ 'Warum ich nicht bei Strava bin – und warum Fokus wichtiger ist als Kudos.',
+$$### Warum ich nicht bei Strava bin.
+
+- Es geht Keinen was an, wann, wo, wie, was und wieviel ich trainiere.
+- Mir reichen die Daten auf Garmin & Trainingpeaks vollkommen aus.
+- Es gibt zu viele Rad-Segmente, die sind einfach nur krank.
+
+Das Wichtigste: Voller Fokus auf die Trainingseinheit statt Posing – Siege statt Segmente 😉$$,
+ 'published'::content_status_enum
+FROM pages p, categories c
+WHERE p.slug = 'blog/was-nicht-auf-strava-ist-ist-nicht-passiert' AND c.slug = 'blog';
+
+INSERT INTO page_content (page_id, author_id, category_id, title, excerpt, body, status)
+SELECT p.id, 1, c.id,
+ 'Gesundheit!',
+ 'Der Körper ist das Kapital. Gesundheit steht an allererster Stelle – vor jeder Trainingseinheit.',
+$$### Gesundheit ist A und O
+
+Grundsätzlich empfehle ich eine ärztliche Untersuchung vor der Aufnahme des Trainings; am besten eine offizielle Bescheinigung auf Deine Sporttauglichkeit.
+
+Selbst bei Profis gilt: Der Körper ist das Kapital und die Gesundheit steht an allererster Stelle. Das ist bei aller Lust, auch mal an die eigenen Grenzen zu gehen, die Präambel allen sportlichen Tuns.$$,
+ 'published'::content_status_enum
+FROM pages p, categories c
+WHERE p.slug = 'blog/gesundheit' AND c.slug = 'blog';
+
+INSERT INTO page_content (page_id, author_id, category_id, title, excerpt, body, status)
+SELECT p.id, 1, c.id,
+ 'Laufschuhe – Kann man zu viele haben?',
+ 'Best practices rund um Laufschuhe: Anzahl, Marken, Tempi und Wettkämpfe.',
+$$### Laufschuhe
+
+Laufschuhe sind die mit Abstand wichtigsten Ausrüstungsgegenstände beim Laufen.
+
+**Je mehr Du läufst, je mehr Schuhe solltest Du besitzen.** Faustregel: Minimum 3, pro Lauftag in der Woche 1 Paar.
+
+**Trenne Dich von alten Schätzchen.** Ist das Ding durchgelaufen – in die Tonne damit.
+
+**Mische die Marken.** Zu ähnliche Schuhe können zu Fehlstellungen führen.
+
+**Habe für verschiedene Tempi verschiedene Schuhe.** Langsam, mittel, schnell, sehr schnell.
+
+**Kaufe im Fachgeschäft.** Guckt der Versender zu, wenn Du den Schuh auf dem Laufband testest?
+
+**Im Trainingslager:** 2 Paar mitnehmen. 1 Paar ist zu wenig.$$,
+ 'published'::content_status_enum
+FROM pages p, categories c
+WHERE p.slug = 'blog/laufschuhe-kann-man-zu-viele-haben' AND c.slug = 'blog';
+
+INSERT INTO page_content (page_id, author_id, category_id, title, excerpt, body, status)
+SELECT p.id, 1, c.id,
+ 'Bahn-Knigge: Die ungeschriebenen Gesetze auf der Bahn',
+ 'Triathleten sind Gäste auf der Leichtathletikanlage. Diese Regeln solltest du kennen.',
+$$### Leichtathletik ist eine eigene Welt
+
+Auch wenn beim Triathlon Laufen dabei ist, sind Triathleten keine Läufer. Die Innenbahn ist exakt 400m lang – auf der finden unsere Tempoläufe statt.
+
+### Regeln:
+
+**Fairness:** Triathleten sind in der Regel zu Gast auf einer Leichtathletikanlage.
+
+**Wir laufen IMMER gegen den Uhrzeigersinn.**
+
+**Überholt wird rechts.** Wie auf einer deutschen Autobahn.
+
+**Mache Platz.** Wenn von hinten einer aufläuft, weichst Du nach links aus.
+
+**Keine Kopfhörer.** Man orientiert sich sehr viel durch Gehör.
+
+**Sei laut.** „Innen frei!" reicht völlig aus.
+
+**Trabpausen NIEMALS auf Bahn 1.**
+
+**NICHT Anhalten** – zumindest nicht auf der Innenbahn.$$,
+ 'published'::content_status_enum
+FROM pages p, categories c
+WHERE p.slug = 'blog/bahn-knigge-die-ungeschriebenen-gesetze-auf-der-bahn' AND c.slug = 'blog';
+
+INSERT INTO page_content (page_id, author_id, category_id, title, excerpt, body, status)
+SELECT p.id, 1, c.id,
+ 'Warm-Up vor einem Laufwettkampf',
+ 'Aufgewärmt heißt bereit zur unmittelbaren Leistungsabgabe. So geht das richtige Warm-Up.',
+$$### Warm-Up
+
+Aufgewärmt heißt, Muskeln und Stoffwechsel sind bereit zur unmittelbaren und hohen Leistungsabgabe.
+
+- 45-60 min vor dem Start: Einlaufen, erst ultra gemütlich, dann steigern.
+- 25 min vor dem Start: Kurz dynamisch dehnen.
+- 20 min vor dem Start: Lauf-ABC in leichte Steigerungen übergehen.
+- 10 min vor dem Start: Traben, 1-2 lockere Steigerungen.
+- 5 min vor dem Start: Jacke abgeben. Am Start leicht frieren ist okay!
+- 3 min vor dem Start: Ins Startfeld einreihen, in Bewegung bleiben.
+- Start: Vollgas! 🔥
+
+Als Faustregel: Je kürzer die Strecke, je wärmer muss ich sein.$$,
+ 'published'::content_status_enum
+FROM pages p, categories c
+WHERE p.slug = 'blog/warm-up-vor-einem-laufwettkampf' AND c.slug = 'blog';
+
+INSERT INTO page_content (page_id, author_id, category_id, title, excerpt, body, status)
+SELECT p.id, 1, c.id,
+ 'Mittwochs fängt die Woche an',
+ 'Warum ich nicht nach Kalenderwochen plane – sondern von Mittwoch bis Dienstag.',
+$$### Warum Mittwochs?
+
+Es ist ziemlich üblich, sich an die Kalenderwochen zu halten, was auch auf der Hand liegt.
+
+Davon weiche ich ab. Spätestens am Mittwoch hat man das Wochenende verkraftet, ob Samstag oder Sonntag ein Wettkampf war oder nicht.
+
+Deshalb hat es sich als praktisch und sinnvoll erwiesen, immer von **Mittwoch bis Dienstag** zu planen.$$,
+ 'published'::content_status_enum
+FROM pages p, categories c
+WHERE p.slug = 'blog/mittwochs-faengt-die-woche-an' AND c.slug = 'coaching';
+
+
+-- ============================================================
+-- CONTENT_TAGS für die Artikel
+-- ============================================================
+INSERT INTO content_tags (content_id, tag_id)
+SELECT pc.id, t.id FROM page_content pc
+JOIN pages p ON p.id = pc.page_id
+JOIN tags t ON t.slug IN ('saisonplanung', 'training')
+WHERE p.slug = 'blog/saisonplanung-wie-geht-man-vor';
+
+INSERT INTO content_tags (content_id, tag_id)
+SELECT pc.id, t.id FROM page_content pc
+JOIN pages p ON p.id = pc.page_id
+JOIN tags t ON t.slug IN ('training', 'coaching')
+WHERE p.slug = 'blog/ziele-setzen-aber-richtig';
+
+INSERT INTO content_tags (content_id, tag_id)
+SELECT pc.id, t.id FROM page_content pc
+JOIN pages p ON p.id = pc.page_id
+JOIN tags t ON t.slug IN ('gesundheit', 'coaching')
+WHERE p.slug = 'blog/wenn-du-krank-bist';
+
+INSERT INTO content_tags (content_id, tag_id)
+SELECT pc.id, t.id FROM page_content pc
+JOIN pages p ON p.id = pc.page_id
+JOIN tags t ON t.slug IN ('bike', 'lifestyle')
+WHERE p.slug = 'blog/was-nicht-auf-strava-ist-ist-nicht-passiert';
+
+INSERT INTO content_tags (content_id, tag_id)
+SELECT pc.id, t.id FROM page_content pc
+JOIN pages p ON p.id = pc.page_id
+JOIN tags t ON t.slug IN ('gesundheit', 'training')
+WHERE p.slug = 'blog/gesundheit';
+
+INSERT INTO content_tags (content_id, tag_id)
+SELECT pc.id, t.id FROM page_content pc
+JOIN pages p ON p.id = pc.page_id
+JOIN tags t ON t.slug IN ('equipment', 'lauf', 'running')
+WHERE p.slug = 'blog/laufschuhe-kann-man-zu-viele-haben';
+
+INSERT INTO content_tags (content_id, tag_id)
+SELECT pc.id, t.id FROM page_content pc
+JOIN pages p ON p.id = pc.page_id
+JOIN tags t ON t.slug IN ('lauf', 'running', 'training')
+WHERE p.slug = 'blog/bahn-knigge-die-ungeschriebenen-gesetze-auf-der-bahn';
+
+INSERT INTO content_tags (content_id, tag_id)
+SELECT pc.id, t.id FROM page_content pc
+JOIN pages p ON p.id = pc.page_id
+JOIN tags t ON t.slug IN ('raceday', 'running', 'wettkampf')
+WHERE p.slug = 'blog/warm-up-vor-einem-laufwettkampf';
+
+INSERT INTO content_tags (content_id, tag_id)
+SELECT pc.id, t.id FROM page_content pc
+JOIN pages p ON p.id = pc.page_id
+JOIN tags t ON t.slug IN ('coaching', 'training')
+WHERE p.slug = 'blog/mittwochs-faengt-die-woche-an';
+
+
+-- ============================================================
+-- CONTENT_PAGES – Artikel ↔ Seiten-Kategorien
+-- Bestimmt auf welchen Seiten ein Artikel erscheint.
+-- blog = erscheint auf /blog
+-- coaching = erscheint auf /coaching
+-- angebot = erscheint auf /personal-coaching
+-- ============================================================
+
+-- Hilfsfunktion: content_id aus page_slug holen
+-- blog (alle Artikel erscheinen mindestens auf Blog)
+INSERT INTO content_pages (content_id, category_id)
+SELECT pc.id, c.id FROM page_content pc
+JOIN pages p ON p.id = pc.page_id
+JOIN categories c ON c.slug = 'blog'
+WHERE p.slug IN (
+ 'blog/saisonplanung-wie-geht-man-vor',
+ 'blog/ziele-setzen-aber-richtig',
+ 'blog/was-nicht-auf-strava-ist-ist-nicht-passiert',
+ 'blog/gesundheit',
+ 'blog/laufschuhe-kann-man-zu-viele-haben',
+ 'blog/bahn-knigge-die-ungeschriebenen-gesetze-auf-der-bahn',
+ 'blog/warm-up-vor-einem-laufwettkampf',
+ 'blog/mittwochs-faengt-die-woche-an'
+);
+
+-- coaching (erscheint zusätzlich auf /coaching)
+INSERT INTO content_pages (content_id, category_id)
+SELECT pc.id, c.id FROM page_content pc
+JOIN pages p ON p.id = pc.page_id
+JOIN categories c ON c.slug = 'coaching'
+WHERE p.slug IN (
+ 'blog/gesundheit',
+ 'blog/mittwochs-faengt-die-woche-an',
+ 'blog/ziele-setzen-aber-richtig',
+ 'blog/saisonplanung-wie-geht-man-vor'
+);
+
+-- angebot (erscheint zusätzlich auf /personal-coaching, NICHT auf blog)
+INSERT INTO content_pages (content_id, category_id)
+SELECT pc.id, c.id FROM page_content pc
+JOIN pages p ON p.id = pc.page_id
+JOIN categories c ON c.slug = 'angebot'
+WHERE p.slug IN (
+ 'blog/wenn-du-krank-bist'
+);
+
+
+-- body_secondary für Startseite (Timeline)
+UPDATE page_content SET body_secondary = $TL$## 1987 – Die ersten Schritte
+
+Mit 14 Jahren die ersten Laufschuhe geschnürt – zusammen mit meinem Vater. Nicht viel später folgte der erste Volkslauf über 10 km.
+
+## 1989 – Marathon mit 16
+
+Berlin, erster Marathon: 3:10:51. Der Beginn einer langen Liebe zur langen Strecke – und zu Hawaii als großem Ziel.
+
+## 1991 – Der Geruch von Tartan
+
+Bahntraining, Wettkämpfe, Lauf-ABC. Bestzeiten die bis heute stehen: 800m 1:58,3 · 3000m 8:42,4 · 5000m 15:25. Und: erster Volkstriathlon in Neuss.
+
+## 1997 – Triathlet werden
+
+Qua selbstgefasstem Beschluß wurde ich Triathlet. Schwimmen: irgendwie. Rad: ein olles Rennrad. Laufen: davon hatte ich Ahnung.
+
+## 1998 – Ironman Roth
+
+Ironman Europe in Roth – seitdem darf ich mich Ironman nennen. NRW-Liga, Laktatmessungen, Trainingspläne in Excel.
+
+## 2018 – DTU-C-Trainer
+
+Lizensierter Trainer des Deutschen Triathlon Union – die offizielle Bestätigung eines langen Wegs aus Erfahrung, Leidenschaft und Sportwissenschaft.$TL$
+WHERE page_id = (SELECT id FROM pages WHERE slug = 'index');
--- /dev/null
+-- ============================================================
+-- triathlon-coaching SSG – Views
+-- Konsistent mit schema.sql
+--
+-- Aufruf:
+-- psql -U tricoach -d tricoach -v schema=tricoach -f views.sql
+-- ============================================================
+
+SET search_path TO :"schema";
+
+
+-- ============================================================
+-- v_published_content
+-- Alle publizierten Seiten vollständig aufgelöst.
+-- Der Generator macht nur SELECT * FROM v_published_content.
+-- ============================================================
+CREATE OR REPLACE VIEW v_published_content AS
+SELECT
+ p.id AS page_id,
+ p.slug,
+ p.template::TEXT AS template,
+ p.sort_order,
+ p.locked_category,
+
+ pc.id AS content_id,
+ pc.title,
+ pc.subtitle,
+ pc.section_label,
+ pc.excerpt,
+ pc.body,
+ pc.body_secondary,
+ pc.status::TEXT AS status,
+ pc.publish_at,
+ pc.unpublish_at,
+ pc.updated_at,
+ pc.meta_title,
+ pc.meta_desc,
+ pc.canonical_url,
+
+ a.name AS author_name,
+ a.slug AS author_slug,
+
+ hero.path_webp_lg AS hero_media_path,
+ hero.path_webp_md AS hero_media_path_md,
+ hero.alt_text AS hero_alt_text,
+
+ card.path_webp_sm AS card_media_path,
+ card.alt_text AS card_alt_text,
+
+ STRING_AGG(t.slug, ',' ORDER BY t.label) AS tag_slugs,
+ STRING_AGG(t.label, ',' ORDER BY t.label) AS tag_labels
+
+FROM pages p
+JOIN page_content pc ON pc.page_id = p.id
+LEFT JOIN authors a ON a.id = pc.author_id
+LEFT JOIN media hero ON hero.id = pc.hero_media_id
+LEFT JOIN media card ON card.id = pc.card_media_id
+LEFT JOIN content_tags ct ON ct.content_id = pc.id
+LEFT JOIN tags t ON t.id = ct.tag_id
+
+WHERE pc.status = 'published'
+ AND (pc.unpublish_at IS NULL OR pc.unpublish_at > NOW())
+
+GROUP BY
+ p.id, p.slug, p.template, p.sort_order, p.locked_category,
+ pc.id, pc.title, pc.subtitle, pc.section_label, pc.excerpt,
+ pc.body, pc.body_secondary, pc.status, pc.publish_at, pc.unpublish_at,
+ pc.meta_title, pc.meta_desc, pc.canonical_url,
+ a.name, a.slug,
+ hero.path_webp_lg, hero.path_webp_md, hero.alt_text,
+ card.path_webp_sm, card.alt_text;
+
+
+-- ============================================================
+-- v_scheduled_due
+-- Seiten deren publish_at jetzt fällig ist (Cronjob).
+-- ============================================================
+CREATE OR REPLACE VIEW v_scheduled_due AS
+SELECT *
+FROM v_published_content
+WHERE status = 'scheduled'
+ AND publish_at <= NOW();
+
+
+-- ============================================================
+-- v_nav_tree
+-- Navigation flat, URLs aufgelöst.
+-- Baumaufbau erfolgt im Java-Generator (buildNavTree).
+-- ============================================================
+CREATE OR REPLACE VIEW v_nav_tree AS
+SELECT
+ ni.id,
+ ni.parent_id,
+ ni.label,
+ ni.sort_order,
+ ni.open_new_tab,
+ CASE
+ WHEN ni.external_url IS NOT NULL THEN ni.external_url
+ WHEN p.slug = 'index' THEN '/'
+ ELSE '/' || p.slug
+ END AS url
+FROM nav_items ni
+LEFT JOIN pages p ON p.id = ni.page_id
+WHERE ni.active = TRUE
+ORDER BY ni.parent_id NULLS FIRST, ni.sort_order;
+
+
+-- ============================================================
+-- v_blog_cards
+-- Artikel-Vorschau für Blog-Grid und Related-Posts.
+-- ============================================================
+CREATE OR REPLACE VIEW v_blog_cards AS
+SELECT
+ vc.page_id,
+ vc.slug,
+ vc.title,
+ vc.section_label,
+ vc.excerpt,
+ vc.publish_at,
+ vc.updated_at,
+ vc.author_name,
+ vc.card_media_path,
+ vc.card_alt_text,
+ vc.tag_slugs,
+ vc.tag_labels,
+ vc.locked_category,
+ -- Komma-separierte Liste aller Kategorien des Artikels (für filterCards)
+ STRING_AGG(c.slug, ',' ORDER BY c.slug) AS category_slugs
+FROM v_published_content vc
+JOIN page_content pc ON pc.id = vc.content_id
+JOIN content_pages cp ON cp.content_id = pc.id
+JOIN categories c ON c.id = cp.category_id
+WHERE vc.template = 'article'
+GROUP BY
+ vc.page_id, vc.slug, vc.title, vc.section_label, vc.excerpt,
+ vc.publish_at, vc.updated_at, vc.author_name, vc.card_media_path,
+ vc.card_alt_text, vc.tag_slugs, vc.tag_labels, vc.locked_category
+ORDER BY vc.publish_at DESC NULLS LAST;
+
+
+-- ============================================================
+-- v_sitemap
+-- Alle Seiten für sitemap.xml.
+-- ============================================================
+CREATE OR REPLACE VIEW v_sitemap AS
+SELECT
+ p.slug,
+ CASE WHEN p.slug = 'index' THEN '/' ELSE '/' || p.slug END AS url_path,
+ pc.publish_at AS lastmod,
+ CASE p.template
+ WHEN 'home' THEN '1.0'
+ WHEN 'blog-grid' THEN '0.8'
+ WHEN 'article' THEN '0.7'
+ ELSE '0.5'
+ END AS priority
+FROM pages p
+JOIN page_content pc ON pc.page_id = p.id
+WHERE pc.status = 'published'
+ AND p.in_sitemap = TRUE
+ AND (pc.unpublish_at IS NULL OR pc.unpublish_at > NOW())
+ORDER BY priority DESC, pc.publish_at DESC;
+
+
+-- ============================================================
+-- v_build_status
+-- Letzte 10 Build-Runs – schneller Überblick per psql.
+-- ============================================================
+CREATE OR REPLACE VIEW v_build_status AS
+SELECT
+ id,
+ triggered_by,
+ started_at,
+ finished_at,
+ EXTRACT(EPOCH FROM (finished_at - started_at))::INT AS duration_seconds,
+ pages_built,
+ status,
+ error_message
+FROM build_log
+ORDER BY started_at DESC
+LIMIT 10;
--- /dev/null
+#!/bin/bash
+# ============================================================
+# build.sh – SSG auf dem Server ausführen
+# Liegt in: /var/www/triathlon-coaching/ssg/build.sh
+#
+# Aufruf:
+# ./ssg/build.sh
+# ./ssg/build.sh --dry-run
+#
+# Per SSH vom lokalen PC:
+# ssh deploy@triathlon-coaching.com \
+# 'cd /var/www/triathlon-coaching && ./ssg/build.sh'
+#
+# Cronjob (jede Minute, prüft scheduled posts):
+# * * * * * deploy cd /var/www/triathlon-coaching && \
+# ./ssg/build.sh >> /var/log/tricoach-build.log 2>&1
+# ============================================================
+
+set -euo pipefail
+
+BASE_DIR="$(cd "$(dirname "$0")/.." && pwd)"
+JAR="${BASE_DIR}/ssg/triathlon-coaching-ssg.jar"
+CONFIG="${BASE_DIR}/ssg/config.yaml"
+
+java -jar "${JAR}" "${CONFIG}" "$@"
--- /dev/null
+#!/bin/bash
+# ============================================================
+# deploy.sh – Build & Deploy auf den Server
+#
+# Lokal aufrufen:
+# ./deploy.sh
+# ./deploy.sh --dry-run
+#
+# Voraussetzung: SSH-Key für SERVER_USER@SERVER_HOST hinterlegt
+# ============================================================
+
+set -euo pipefail
+
+# ── Konfiguration ────────────────────────────────────────────
+SERVER_HOST="triathlon-coaching.com"
+SERVER_USER="deploy"
+REMOTE_WWW="/var/www/html"
+REMOTE_API="/var/www/html/api"
+REMOTE_JAR="/opt/ssg"
+JAR_NAME="ssg.jar"
+CONFIG_REMOTE="/opt/ssg/config.yaml"
+
+DRY_RUN=""
+if [[ "${1:-}" == "--dry-run" ]]; then
+ DRY_RUN="--dry-run"
+ echo "[dry-run] Kein Transfer, kein Remote-Build"
+fi
+
+# ── 1. Lokal bauen ───────────────────────────────────────────
+echo "→ Maven Build..."
+mvn package -q
+echo "✓ ${JAR_NAME} gebaut"
+
+# ── 2. JAR übertragen (nur wenn geändert) ───────────────────
+if [[ -z "$DRY_RUN" ]]; then
+ echo "→ JAR übertragen..."
+ rsync -az --checksum \
+ "target/${JAR_NAME}" \
+ "${SERVER_USER}@${SERVER_HOST}:${REMOTE_JAR}/${JAR_NAME}"
+ echo "✓ JAR übertragen"
+fi
+
+# ── 3. API-Verzeichnis übertragen (PHP-Files) ────────────────
+if [[ -z "$DRY_RUN" ]]; then
+ echo "→ API-Dateien übertragen..."
+ rsync -az --checksum --delete \
+ "api/" \
+ "${SERVER_USER}@${SERVER_HOST}:${REMOTE_API}/"
+ echo "✓ API übertragen"
+fi
+
+# ── 4. Remoter Build (SSG auf dem Server ausführen) ──────────
+if [[ -z "$DRY_RUN" ]]; then
+ echo "→ Remote-Build starten..."
+ ssh "${SERVER_USER}@${SERVER_HOST}" \
+ "java -jar ${REMOTE_JAR}/${JAR_NAME} ${CONFIG_REMOTE}"
+ echo "✓ Remote-Build abgeschlossen"
+else
+ echo "[dry-run] Würde ausführen: java -jar ${REMOTE_JAR}/${JAR_NAME} ${CONFIG_REMOTE}"
+fi
+
+echo ""
+echo "✓ Deploy abgeschlossen"
--- /dev/null
+# ============================================================
+# Apache VHost Konfiguration – triathlon-coaching.com
+# /etc/apache2/sites-available/triathlon-coaching.conf
+# ============================================================
+
+<VirtualHost *:80>
+ ServerName triathlon-coaching.com
+ ServerAlias www.triathlon-coaching.com
+ Redirect permanent / https://triathlon-coaching.com/
+</VirtualHost>
+
+<VirtualHost *:443>
+ ServerName triathlon-coaching.com
+ ServerAlias www.triathlon-coaching.com
+
+ DocumentRoot /var/www/html
+ DirectoryIndex index.html
+
+ # ── SSL ────────────────────────────────────────────────────
+ SSLEngine on
+ SSLCertificateFile /etc/letsencrypt/live/triathlon-coaching.com/fullchain.pem
+ SSLCertificateKeyFile /etc/letsencrypt/live/triathlon-coaching.com/privkey.pem
+
+ # ── Statische Seiten: Clean URLs ───────────────────────────
+ # /coaching → /coaching/index.html (bereits so generiert)
+ # Apache liefert index.html automatisch, kein Rewrite nötig.
+
+ # ── API-Verzeichnis: PHP erlaubt ───────────────────────────
+ <Directory /var/www/html/api>
+ Options -Indexes -ExecCGI
+ AllowOverride None
+ Require all granted
+
+ # Nur PHP-Dateien ausführen, alles andere sperren
+ <FilesMatch "\.php$">
+ SetHandler application/x-httpd-php
+ </FilesMatch>
+ <FilesMatch "^(?!.*\.php$)">
+ Require all denied
+ </FilesMatch>
+ </Directory>
+
+ # ── Hauptverzeichnis: kein PHP ─────────────────────────────
+ # PHP ist hier bewusst nicht aktiv – nur statische Dateien
+ <Directory /var/www/html>
+ Options -Indexes -ExecCGI
+ AllowOverride None
+ Require all granted
+
+ # PHP explizit deaktivieren (außer /api, s.o.)
+ <FilesMatch "\.php$">
+ Require all denied
+ </FilesMatch>
+ </Directory>
+
+ # ── Rate-Limit Verzeichnis: nie ausliefern ─────────────────
+ <Directory /var/tmp/ssg_ratelimit>
+ Require all denied
+ </Directory>
+
+ # ── Security Headers ───────────────────────────────────────
+ Header always set X-Frame-Options "DENY"
+ Header always set X-Content-Type-Options "nosniff"
+ Header always set Referrer-Policy "strict-origin-when-cross-origin"
+ Header always set Permissions-Policy "geolocation=(), microphone=(), camera=()"
+ Header always set Content-Security-Policy "default-src 'self'; script-src 'self' 'unsafe-inline'; style-src 'self' 'unsafe-inline' https://fonts.googleapis.com; font-src 'self' https://fonts.gstatic.com; img-src 'self' data:; connect-src 'self'"
+
+ # ── Caching für statische Assets ───────────────────────────
+ <FilesMatch "\.(css|js|webp|jpg|jpeg|png|svg|woff2)$">
+ Header set Cache-Control "public, max-age=31536000, immutable"
+ </FilesMatch>
+
+ <FilesMatch "\.html$">
+ Header set Cache-Control "public, max-age=300, must-revalidate"
+ </FilesMatch>
+
+ # ── Logging ────────────────────────────────────────────────
+ ErrorLog ${APACHE_LOG_DIR}/tricoach-error.log
+ CustomLog ${APACHE_LOG_DIR}/tricoach-access.log combined
+
+</VirtualHost>
--- /dev/null
+#!/bin/bash
+# ============================================================
+# upload-media.sh – Originale auf den Server übertragen
+#
+# Konvention: /var/www/DOMAIN/SUBDOMAIN
+# Originale landen in: /var/www/triathlon-coaching/media/
+# (Apache-blind, liegt neben der DocumentRoot www/)
+#
+# Aufruf:
+# ./upload-media.sh → alles übertragen
+# ./upload-media.sh images/2025/03/ → nur Unterordner
+# ./upload-media.sh --dry-run → nur anzeigen
+#
+# Nach dem Upload:
+# 1. DBeaver: INSERT INTO tricoach.media (path_original, filename, alt_text, ...)
+# path_original = relativer Pfad, z.B. 'images/2025/03/ironman-roth.jpg'
+# 2. Build: ssh deploy@triathlon-coaching.com 'cd /var/www/triathlon-coaching && ./ssg/build.sh'
+# ============================================================
+
+set -euo pipefail
+
+SERVER_HOST="triathlon-coaching.com"
+SERVER_USER="deploy"
+REMOTE_BASE="/var/www/triathlon-coaching"
+REMOTE_MEDIA="${REMOTE_BASE}/media"
+LOCAL_MEDIA="./media"
+
+# ── Argumente ────────────────────────────────────────────────
+DRY_RUN=""
+SUBDIR=""
+
+for arg in "$@"; do
+ case "$arg" in
+ --dry-run) DRY_RUN="--dry-run" ;;
+ -*) echo "Unbekannte Option: $arg"; exit 1 ;;
+ *) SUBDIR="${arg%/}/" ;; # trailing slash normalisieren
+ esac
+done
+
+SRC="${LOCAL_MEDIA}/${SUBDIR}"
+DST="${SERVER_USER}@${SERVER_HOST}:${REMOTE_MEDIA}/${SUBDIR}"
+
+# ── Prüfen ───────────────────────────────────────────────────
+if [[ ! -d "$SRC" ]]; then
+ echo "Fehler: Quellverzeichnis nicht gefunden: $SRC"
+ exit 1
+fi
+
+# ── Übertragen ───────────────────────────────────────────────
+echo "Quelle : ${SRC}"
+echo "Ziel : ${DST}"
+[[ -n "$DRY_RUN" ]] && echo "Modus : dry-run"
+echo ""
+
+rsync \
+ --archive \
+ --checksum \
+ --human-readable \
+ --progress \
+ --exclude=".DS_Store" \
+ --exclude="Thumbs.db" \
+ --exclude="*.tmp" \
+ --exclude="*.bak" \
+ ${DRY_RUN} \
+ "${SRC}" \
+ "${DST}"
+
+echo ""
+echo "✓ Übertragung abgeschlossen"
+
+if [[ -z "$DRY_RUN" ]]; then
+ echo ""
+ echo "Nächste Schritte:"
+ echo ""
+ echo " 1. DBeaver – Eintrag anlegen:"
+ echo " INSERT INTO tricoach.media (path_original, filename, media_type, alt_text)"
+ echo " VALUES ('images/2025/03/mein-bild.jpg', 'mein-bild.jpg', 'image', 'Beschreibung');"
+ echo ""
+ echo " 2. Build triggern:"
+ echo " ssh ${SERVER_USER}@${SERVER_HOST} \\"
+ echo " 'java -jar ${REMOTE_BASE}/ssg/triathlon-coaching-ssg.jar \\"
+ echo " ${REMOTE_BASE}/ssg/config.yaml'"
+fi
--- /dev/null
+/* =========================================================
+ blog-data.js
+ Alle Artikel-Ideen aus dem WordPress-Backend
+ Status: "idea" | "draft" | "published"
+ ========================================================= */
+
+const BLOG_POSTS = [
+ // Kategorie: Über mich
+ { id: 1, title: "Aloha auf triathlon-coaching.com!", category: "Über mich", tags: [], status: "published" },
+ { id: 2, title: "AthlektikTraining", category: "Über mich", tags: [], status: "idea" },
+ { id: 3, title: "Besser laufen!", category: "Über mich", tags: [], status: "idea" },
+ { id: 4, title: "Laufseminar", category: "Über mich", tags: [], status: "idea" },
+ { id: 5, title: "Raceday – und bloß nichts vergessen!", category: "Über mich", tags: [], status: "idea" },
+ { id: 6, title: "Saisonplanung – wie geht man vor?", category: "Über mich", tags: [], status: "idea" }, // auch Blog
+ { id: 7, title: "Team Coaching", category: "Über mich", tags: [], status: "idea" },
+ { id: 8, title: "Technik & Fahrtechnik auf dem Rennrad", category: "Über mich", tags: [], status: "idea" },
+ { id: 9, title: "Vertrauen & Kontrolle", category: "Über mich", tags: [], status: "idea" },
+ { id: 10, title: "Warum einen Coach?", category: "Über mich", tags: [], status: "idea" },
+ { id: 11, title: "Welche Rolle hast Du?", category: "Über mich", tags: [], status: "idea" },
+ { id: 12, title: "WettkampfBetreung", category: "Über mich", tags: [], status: "idea" },
+ { id: 13, title: "Wie funktioniert individuelles Coaching?", category: "Über mich", tags: [], status: "idea" },
+ { id: 14, title: "Wie ich mit Athleten und Athletinnen arbeite(te)", category: "Über mich", tags: [], status: "idea" },
+ { id: 15, title: "Wie legen wir los? Wie läuft das ab?", category: "Über mich", tags: [], status: "idea" },
+ { id: 16, title: "Zugseil – Training", category: "Über mich", tags: [], status: "idea" },
+
+ // Kategorie: Angebot / Coaching
+ { id: 17, title: "… wenn Du krank bist …", category: "Angebot", tags: ["Basics"], status: "idea" },
+ { id: 18, title: "Dein Trainingsplan", category: "Coaching", tags: [], status: "idea" },
+ { id: 19, title: "Fair Play beim Coaching", category: "Angebot", tags: [], status: "idea" },
+ { id: 20, title: "Grenzen: Wofür ich nicht da bin", category: "Coaching", tags: [], status: "idea" },
+ { id: 21, title: "Mein Coaching-Ansatz", category: "Coaching", tags: [], status: "idea" },
+ { id: 22, title: "Mittwochs fängt die Woche an", category: "Coaching", tags: [], status: "idea" },
+ { id: 23, title: "Standard-Trainingspläne / Saisonplanung", category: "Saisonplanung", tags: [], status: "idea" },
+ { id: 24, title: "Was kostet das?", category: "Angebot", tags: [], status: "idea" },
+ { id: 25, title: "Ziele setzen – aber richtig!", category: "Blog", tags: [], status: "idea" },
+
+ // Kategorie: Blog – Training / Athletik
+ { id: 26, title: "Kraft vs. Kraftausdauer vs. K3 vs. dicker Gang", category: "Blog", tags: ["Athletik", "Bike", "K3", "Running", "Training"], status: "idea" },
+ { id: 27, title: "Fettstoffwechsel, Fettverbrennung, FatMax", category: "Blog", tags: ["Athletik", "Regeneration", "Training"], status: "idea" },
+ { id: 28, title: "KraftTraining", category: "Blog", tags: ["Athletik", "Regeneration", "Training"], status: "idea" },
+ { id: 29, title: "Stretching", category: "Blog", tags: ["Athletik", "Regeneration", "Training"], status: "idea" },
+ { id: 30, title: "Stabi macht schnell", category: "Blog", tags: ["Training", "Athletik", "Wettkampf"], status: "idea" },
+
+ // Kategorie: Blog – Bike / Equipment
+ { id: 31, title: "Helau statt Hatschi – Die richtige Verkleidung im Winter", category: "Blog", tags: ["Bike", "Equipment", "Running", "Training"], status: "idea" },
+ { id: 32, title: "Aero-Gadgets – Spielzeug oder Gamechanger", category: "Blog", tags: ["Bike", "Equipment", "Triathlon", "Wettkampf"], status: "idea" },
+ { id: 33, title: "Bikefitting", category: "Blog", tags: ["Bike", "Equipment", "Triathlon", "Wettkampf"], status: "idea" },
+ { id: 34, title: "Kurbellänge – was bringt kurz?", category: "Blog", tags: ["Bike", "Equipment", "Triathlon", "Wettkampf"], status: "idea" },
+ { id: 35, title: "Rad-Equipment", category: "Blog", tags: ["Bike", "Equipment", "Triathlon", "Wettkampf"], status: "idea" },
+ { id: 36, title: "Rad-Equipment für IndoorBike", category: "Blog", tags: ["Bike", "Equipment", "Triathlon", "Wettkampf"], status: "idea" },
+ { id: 37, title: "Radpflege", category: "Blog", tags: ["Bike", "Equipment", "Triathlon", "Wettkampf"], status: "idea" },
+ { id: 38, title: "Wenn Aero Aua macht – Fitting und Fitness!", category: "Blog", tags: ["Bike", "Equipment", "Triathlon", "Wettkampf"], status: "idea" },
+ { id: 39, title: "Wie kaufe ich ein Rad?", category: "Blog", tags: ["Bike", "Equipment", "Triathlon", "Wettkampf"], status: "idea" },
+ { id: 40, title: "Kraftausdauer am Berg", category: "Blog", tags: ["Bike", "K3", "Kraftausdauer", "Training", "Triathlon"], status: "idea" },
+
+ // Kategorie: Blog – Taktik / Wettkampf
+ { id: 41, title: "Was nicht auf Strava ist, ist nicht passiert?", category: "Blog", tags: ["Bike", "Lauf", "Lifestyle", "Szene", "Training"], status: "idea" },
+ { id: 42, title: "Schnelligkeit / Ga2 / Schnelligkeitsausdauer", category: "Blog", tags: ["Marathon", "Running", "Training", "Triathlon"], status: "idea" },
+ { id: 43, title: "Wechsel 1", category: "Blog", tags: ["Openwater", "Schwimmen", "Taktik", "Triathlon", "Wettkampf"], status: "idea" },
+ { id: 44, title: "Wechsel 2", category: "Blog", tags: ["Running", "Taktik", "Triathlon", "Wettkampf"], status: "idea" },
+ { id: 45, title: "FTP – wie? Schon wieder Wahl?", category: "Blog", tags: ["Bike", "Tempo", "Training", "Triathlon"], status: "idea" },
+ { id: 46, title: "Fahrtechnik auf dem Rad", category: "Blog", tags: ["Bike", "Training", "Triathlon", "Wettkampf"], status: "idea" },
+ { id: 47, title: "Blick über den Tellerrand – Trondheim-Oslo", category: "Blog", tags: ["Bike", "Training", "Wettkampf"], status: "idea" },
+ { id: 48, title: "Kurventechnik ist ein Muss: Warum Radfahren im Triathlon mehr als nur Drücken ist", category: "Blog", tags: ["Bike"], status: "idea" },
+
+ // Kategorie: Blog – Gesundheit / Ernährung
+ { id: 49, title: "Gesundheit!", category: "Blog", tags: ["Coaching", "Gesundheit", "Training"], status: "idea" },
+ { id: 50, title: "Coach vs. Software vs. Literatur", category: "Blog", tags: ["Coaching", "Training", "Wettkampf"], status: "idea" },
+ { id: 51, title: "Laufschuhe – Kann man zu viele haben?", category: "Blog", tags: ["Lauf", "Running", "Equipment", "Marathon"], status: "idea" },
+ { id: 52, title: "Sinn und Unsinn von low carb", category: "Blog", tags: ["Ernährung", "Gesundheit", "Kohlenhydrate", "Training", "Wettkampf"], status: "idea" },
+ { id: 53, title: "Fettes Thema: Abnehmen, Hungern, Magersucht", category: "Blog", tags: ["Ernährung", "Gesundheit", "Training"], status: "idea" },
+ { id: 54, title: "Salz auf Deiner Haut (2) – Schweiß", category: "Blog", tags: ["Ernährung", "Gesundheit", "Marathon", "Training", "Triathlon"], status: "idea" },
+ { id: 55, title: "Alkohol", category: "Blog", tags: ["Ernährung", "Gesundheit", "Training"], status: "idea" },
+ { id: 56, title: "Alle Jahre wieder: Wagge vs. Weihnachtszeit", category: "Blog", tags: ["Ernährung", "Gesundheit", "Training"], status: "idea" },
+ { id: 57, title: "Blutspenden", category: "Blog", tags: ["Ernährung", "Gesundheit", "Training"], status: "idea" },
+ { id: 58, title: "Vegan & Sport ?", category: "Blog", tags: ["Ernährung", "Gesundheit", "Training"], status: "idea" },
+ { id: 59, title: "Das große Fressen – Sitte und Unsitte bei der Nudelparty", category: "Blog", tags: ["Ernährung", "Kohlenhydrate", "Training"], status: "idea" },
+ { id: 60, title: "Einmal volltanken, bitte: Ernährung vor dem Race", category: "Blog", tags: ["Ernährung", "Kohlenhydrate", "Training", "Triathlon", "Marathon"], status: "idea" },
+ { id: 61, title: "Ernährung beim Race", category: "Blog", tags: ["Ernährung", "Kohlenhydrate", "Training", "Triathlon", "Marathon"], status: "idea" },
+ { id: 62, title: "Kaffeeeee!", category: "Blog", tags: ["Ernährung", "Training", "Triathlon"], status: "idea" },
+ { id: 63, title: "Proteine – der Stoff aus dem die Power kommt", category: "Blog", tags: ["Ernährung", "Training", "Wettkampf"], status: "idea" },
+
+ // Kategorie: Blog – Gesundheit / Psyche
+ { id: 64, title: "Von Null auf Langdistanz – in 6 Wochen oder in 6 Jahren?", category: "Blog", tags: ["Gesundheit", "Ironman", "Regeneration"], status: "idea" },
+ { id: 65, title: "DNF is an Option (DNS auch)", category: "Blog", tags: ["Gesundheit", "Psyche", "Training", "Wettkampf"], status: "idea" },
+ { id: 66, title: "Krank, müde, erschöpft", category: "Blog", tags: ["Gesundheit", "Training", "Wettkampf"], status: "idea" },
+ { id: 67, title: "Verletzungen", category: "Blog", tags: ["Gesundheit", "Training", "Wettkampf"], status: "idea" },
+
+ // Kategorie: Blog – Ironman / Langdistanz / Regeneration
+ { id: 68, title: "Off-Season", category: "Blog", tags: ["Ironman", "Langdistanz", "Marathon", "Psyche", "Regeneration", "Training", "Triathlon"], status: "idea" },
+ { id: 69, title: "Sabbatical – vom Triathlon", category: "Blog", tags: ["Ironman", "Langdistanz", "Marathon", "Psyche", "Regeneration", "Training"], status: "idea" },
+ { id: 70, title: "Regeneration", category: "Blog", tags: ["Ironman", "Langdistanz", "Marathon", "Regeneration", "Training", "Triathlon", "Wettkampf"], status: "idea" },
+ { id: 71, title: "Regeneration nach der Langdistanz", category: "Blog", tags: ["Ironman", "Langdistanz", "Regeneration", "Training", "Triathlon"], status: "idea" },
+ { id: 72, title: "Marathon in der Langdistanz-Vorbereitung", category: "Blog", tags: ["Ironman", "Laufen", "Marathon", "Training", "Triathlon"], status: "idea" },
+ { id: 73, title: "Langes Wochenende – Belastung hochfahren oder nicht?", category: "Blog", tags: ["Ironman", "Marathon", "Running", "Training"], status: "idea" },
+
+ // Kategorie: Blog – Marathon / Laufen
+ { id: 74, title: "Bahn-Knigge: Die ungeschriebenen Gesetze auf der Bahn", category: "Blog", tags: ["Lauf", "Run", "Running", "Lifestyle"], status: "idea" },
+ { id: 75, title: "Alles Kopfsache! Mentale Stärke", category: "Blog", tags: ["Marathon", "Psyche", "Training", "Triathlon", "Wettkampf"], status: "idea" },
+ { id: 76, title: "Inneres Gleichgewicht", category: "Blog", tags: ["Marathon", "Psyche", "Training", "Triathlon"], status: "idea" },
+ { id: 77, title: "Salz auf Deiner Haut (3) – Tränen", category: "Blog", tags: ["Marathon", "Psyche", "Training", "Triathlon", "Wettkampf"], status: "idea" },
+ { id: 78, title: "Warm-Up vor einem Laufwettkampf", category: "Blog", tags: ["Raceday", "Running", "Marathon", "Training", "Taktik", "Wettkampf"], status: "idea" },
+ { id: 79, title: "Schon wieder Bahn: Wo ist was auf der Bahn?", category: "Blog", tags: ["Lauf", "Run", "Running", "Marathon", "Training"], status: "idea" },
+ { id: 80, title: "Körperhaltung beim Laufen", category: "Blog", tags: ["Marathon", "Running", "Training", "Triathlon", "Wettkampf"], status: "idea" },
+ { id: 81, title: "Lauf-ABC", category: "Blog", tags: ["Marathon", "Running", "Triathlon", "Wettkampf"], status: "idea" },
+ { id: 82, title: "Whiskey in a Jar? Rechnen mit Jack Daniels und anderen Formeln", category: "Blog", tags: ["Marathon", "Running"], status: "idea" },
+ { id: 83, title: "HIT!", category: "Blog", tags: ["Marathon", "Training", "Triathlon"], status: "idea" },
+ { id: 84, title: "Leistungsdiagnostik – lohnt sich das?", category: "Blog", tags: ["Training", "Triathlon"], status: "idea" },
+ { id: 85, title: "(Herbst-)Marathontraining für Triathleten", category: "Blog", tags: ["Marathon", "Training", "Triathlon", "Wettkampf"], status: "idea" },
+
+ // Kategorie: Blog – Openwater / Schwimmen
+ { id: 86, title: "Eine Frage der Ehre – Fairplay, Doping und böse Fouls", category: "Blog", tags: ["Marathon", "Training", "Triathlon", "Wettkampf"], status: "idea" },
+ { id: 87, title: "Amphibien erobern das Land – der Schwimmausstieg", category: "Blog", tags: ["Openwater", "Schwimmen", "Taktik", "Triathlon"], status: "idea" },
+ { id: 88, title: "Hilfe, ich kriege den Neo nicht aus!", category: "Blog", tags: ["Openwater", "Schwimmen", "Taktik", "Triathlon", "Wettkampf"], status: "idea" },
+ { id: 89, title: "Verhalten am Start", category: "Blog", tags: ["Openwater", "Schwimmen", "Taktik", "Triathlon", "Wettkampf"], status: "idea" },
+ { id: 90, title: "Blick über den Tellerrand – Openwater Swimming", category: "Blog", tags: ["Openwater", "Schwimmen", "Training", "Wettkampf"], status: "idea" },
+ { id: 91, title: "Salz auf Deiner Haut (1) – Schwimmen im Meer", category: "Blog", tags: ["Openwater", "Schwimmen", "Training", "Wettkampf"], status: "idea" },
+ { id: 92, title: "Der böse SWOLF", category: "Blog", tags: ["Schwimmen", "Triathlon", "Wettkampf"], status: "idea" },
+
+ // Kategorie: Blog – Taktik / Belastung
+ { id: 93, title: "Blockperiodisierung – wie geht das?", category: "Blog", tags: ["Regeneration", "Training"], status: "idea" },
+ { id: 94, title: "Blick über den Tellerrand – Ultralauf", category: "Blog", tags: ["Running", "Training", "Wettkampf"], status: "idea" },
+ { id: 95, title: "In Peace with Pace – der schmale Grat zwischen verballern und doch nur 95%", category: "Blog", tags: ["Taktik", "Training"], status: "idea" },
+ { id: 96, title: "Belastungssteuerung – Gefühl, Puls oder Watt?", category: "Blog", tags: ["Training", "Triathlon", "Wettkampf"], status: "idea" },
+ { id: 97, title: "Lang ist mehr als 2mal", category: "Blog", tags: ["Training", "Triathlon", "Wettkampf"], status: "idea" },
+ { id: 98, title: "Was tun in der zweiten Saisonhälfte?", category: "Blog", tags: ["Training", "Triathlon", "Wettkampf"], status: "idea" },
+ { id: 99, title: "Wattmessung", category: "Blog", tags: ["Training", "Triathlon", "Wettkampf"], status: "idea" },
+
+ // Kategorie: Blog – Camp / Raceday
+ { id: 100, title: "Camp – Pro & Contra", category: "Blog", tags: ["Training", "Wettkampf"], status: "idea" },
+ { id: 101, title: "Erste Hilfe", category: "Blog", tags: ["Training", "Wettkampf"], status: "idea" },
+ { id: 102, title: "Packliste Camp", category: "Blog", tags: ["Training", "Wettkampf"], status: "idea" },
+ { id: 103, title: "Was macht ein Camp zu einem guten Camp?", category: "Blog", tags: ["Training", "Wettkampf"], status: "idea" },
+ { id: 104, title: "Raceday – bloß nichts vergessen!", category: "Blog", tags: ["Triathlon", "Wettkampf"], status: "idea" },
+ { id: 105, title: "Packliste Raceday", category: "Blog", tags: ["Triathlon", "Wettkampf"], status: "idea" },
+];
+
+// Alle einzigartigen Kategorien
+const CATEGORIES = [...new Set(BLOG_POSTS.map(p => p.category))].sort();
+
+// Alle einzigartigen Tags (flach, sortiert)
+const ALL_TAGS = [...new Set(BLOG_POSTS.flatMap(p => p.tags))].sort();
+
+export { BLOG_POSTS, CATEGORIES, ALL_TAGS };
--- /dev/null
+/* =========================================================
+ blog.css — Blog-Übersicht, Artikel-Template
+ Ergänzt style.css (Mobile-First)
+ ========================================================= */
+
+/* =========================================================
+ PAGE HERO (Blog-Übersicht)
+ ========================================================= */
+.page-hero {
+ background: linear-gradient(135deg, var(--black) 0%, #0a1e22 60%, #00798a1a 100%);
+ padding: calc(var(--header-h) + var(--space-xl)) var(--space-md) 0;
+ border-bottom: 2px solid var(--color-primary);
+}
+.page-hero-inner { padding-bottom: var(--space-lg); }
+.page-hero-title {
+ font-family: var(--font-display);
+ font-weight: 800;
+ font-size: clamp(3rem, 10vw, 5.5rem);
+ line-height: 1;
+ color: var(--white);
+ margin-bottom: 0.3em;
+}
+.page-hero-sub {
+ font-size: 1rem;
+ color: rgba(255,255,255,0.6);
+ max-width: 500px;
+ margin: 0;
+}
+.page-hero-bar {
+ background: var(--color-primary);
+ color: var(--white);
+ font-family: var(--font-display);
+ font-weight: 700;
+ font-size: 0.85rem;
+ letter-spacing: 0.1em;
+ text-transform: uppercase;
+ padding: 0.6em var(--space-md);
+}
+.page-hero-bar span {
+ font-size: 1.15em;
+ color: var(--yellow);
+}
+
+/* =========================================================
+ FILTER BAR
+ ========================================================= */
+.filter-bar {
+ position: sticky;
+ top: var(--header-h);
+ z-index: 100;
+ background: var(--white);
+ border-bottom: 1px solid var(--gray-200);
+ box-shadow: 0 2px 12px rgba(0,0,0,0.06);
+}
+.filter-bar-inner {
+ display: flex;
+ flex-direction: column;
+ gap: var(--space-sm);
+ padding-block: var(--space-sm);
+}
+
+/* Search */
+.filter-search-wrap {
+ position: relative;
+ width: 100%;
+}
+.filter-search-icon {
+ position: absolute;
+ left: 0.85rem;
+ top: 50%;
+ transform: translateY(-50%);
+ color: var(--gray-500);
+ width: 18px;
+ pointer-events: none;
+}
+.filter-search {
+ width: 100%;
+ font-family: var(--font-body);
+ font-size: 0.95rem;
+ padding: 0.6em 1em 0.6em 2.5em;
+ border: 1.5px solid var(--gray-200);
+ border-radius: 100px;
+ background: var(--gray-100);
+ color: var(--color-text);
+ outline: none;
+ transition: border-color var(--transition), background var(--transition);
+ -webkit-appearance: none;
+}
+.filter-search:focus {
+ border-color: var(--teal);
+ background: var(--white);
+}
+.filter-search::placeholder { color: var(--gray-500); }
+
+/* Category pills */
+.filter-pills {
+ display: flex;
+ flex-wrap: wrap;
+ gap: 0.4em;
+}
+.pill {
+ font-family: var(--font-display);
+ font-weight: 700;
+ font-size: 0.78rem;
+ letter-spacing: 0.08em;
+ text-transform: uppercase;
+ padding: 0.4em 0.9em;
+ border-radius: 100px;
+ border: 1.5px solid var(--gray-200);
+ color: var(--gray-500);
+ background: transparent;
+ cursor: pointer;
+ transition: background var(--transition), color var(--transition), border-color var(--transition);
+ white-space: nowrap;
+}
+.pill:hover { border-color: var(--teal); color: var(--teal); }
+.pill.active {
+ background: var(--color-primary);
+ border-color: var(--color-primary);
+ color: var(--white);
+}
+
+/* Tag toggle */
+.filter-tags-toggle {
+ display: flex;
+ align-items: center;
+ gap: 0.4em;
+ font-family: var(--font-display);
+ font-weight: 700;
+ font-size: 0.78rem;
+ letter-spacing: 0.08em;
+ text-transform: uppercase;
+ color: var(--gray-500);
+ padding: 0.3em 0;
+ transition: color var(--transition);
+}
+.filter-tags-toggle svg { transition: transform var(--transition); }
+.filter-tags-toggle[aria-expanded="true"] svg { transform: rotate(180deg); }
+.filter-tags-toggle:hover { color: var(--deep); }
+
+.tag-cloud {
+ display: flex;
+ flex-wrap: wrap;
+ gap: 0.4em;
+ padding-top: 0.4em;
+}
+
+/* Tag chips */
+.tag {
+ display: inline-flex;
+ align-items: center;
+ font-family: var(--font-display);
+ font-weight: 600;
+ font-size: 0.72rem;
+ letter-spacing: 0.06em;
+ text-transform: uppercase;
+ padding: 0.25em 0.7em;
+ border-radius: 100px;
+ background: var(--ice);
+ color: var(--teal);
+ border: 1px solid var(--mint);
+ cursor: pointer;
+ text-decoration: none;
+ transition: background var(--transition), color var(--transition), border-color var(--transition);
+ white-space: nowrap;
+}
+.tag:hover, .tag.active {
+ background: var(--teal);
+ color: var(--white);
+ border-color: var(--teal);
+}
+.tag.active { background: var(--deep); border-color: var(--deep); }
+
+/* Meta / Reset */
+.filter-meta {
+ display: flex;
+ align-items: center;
+ gap: var(--space-sm);
+ flex-wrap: wrap;
+}
+.result-count {
+ font-family: var(--font-display);
+ font-size: 0.8rem;
+ font-weight: 700;
+ color: var(--gray-500);
+ letter-spacing: 0.05em;
+}
+.filter-reset {
+ font-family: var(--font-display);
+ font-size: 0.75rem;
+ font-weight: 700;
+ letter-spacing: 0.08em;
+ text-transform: uppercase;
+ color: var(--color-primary);
+ padding: 0.25em 0;
+ border-bottom: 1px dashed currentColor;
+ transition: opacity var(--transition);
+}
+.filter-reset:hover { opacity: 0.7; }
+
+@media (min-width: 768px) {
+ .filter-bar-inner {
+ flex-direction: row;
+ align-items: center;
+ flex-wrap: wrap;
+ gap: var(--space-sm) var(--space-md);
+ }
+ .filter-search-wrap { max-width: 280px; }
+ .filter-tags-wrap { flex: 1; }
+ .tag-cloud { padding-top: 0; }
+}
+
+/* =========================================================
+ BLOG GRID
+ ========================================================= */
+.blog-main {
+ padding-block: var(--space-xl);
+ min-height: 50vh;
+}
+
+.blog-grid {
+ display: grid;
+ grid-template-columns: 1fr;
+ gap: var(--space-md);
+}
+
+@media (min-width: 540px) {
+ .blog-grid { grid-template-columns: repeat(2, 1fr); }
+}
+@media (min-width: 900px) {
+ .blog-grid { grid-template-columns: repeat(3, 1fr); }
+}
+@media (min-width: 1100px) {
+ .blog-grid { grid-template-columns: repeat(4, 1fr); }
+}
+
+/* Blog Card */
+.blog-card {
+ background: var(--white);
+ border-radius: var(--radius-md);
+ border: 1.5px solid var(--gray-200);
+ overflow: hidden;
+ display: flex;
+ flex-direction: column;
+ transition: box-shadow var(--transition), transform var(--transition), border-color var(--transition);
+ animation: cardIn 0.35s ease both;
+}
+.blog-card:hover {
+ box-shadow: 0 8px 28px rgba(0,0,0,0.10);
+ transform: translateY(-3px);
+ border-color: var(--mint);
+}
+
+@keyframes cardIn {
+ from { opacity: 0; transform: translateY(12px); }
+ to { opacity: 1; transform: translateY(0); }
+}
+
+/* Status stripe at top */
+.blog-card-stripe {
+ height: 4px;
+ flex-shrink: 0;
+}
+.blog-card[data-status="published"] .blog-card-stripe { background: var(--deep); }
+.blog-card[data-status="draft"] .blog-card-stripe { background: var(--orange); }
+.blog-card[data-status="idea"] .blog-card-stripe { background: var(--gray-200); }
+
+.blog-card-body {
+ padding: var(--space-md);
+ flex: 1;
+ display: flex;
+ flex-direction: column;
+ gap: 0.6em;
+}
+
+.blog-card-cat {
+ font-family: var(--font-display);
+ font-size: 0.68rem;
+ font-weight: 700;
+ letter-spacing: 0.15em;
+ text-transform: uppercase;
+ color: var(--color-primary);
+}
+
+.blog-card-title {
+ font-family: var(--font-display);
+ font-weight: 700;
+ font-size: 1.05rem;
+ line-height: 1.2;
+ color: var(--black);
+ flex: 1;
+}
+
+.blog-card-tags {
+ display: flex;
+ flex-wrap: wrap;
+ gap: 0.3em;
+ margin-top: auto;
+}
+
+.blog-card-status {
+ display: inline-flex;
+ align-items: center;
+ gap: 0.35em;
+ font-family: var(--font-display);
+ font-size: 0.65rem;
+ font-weight: 700;
+ letter-spacing: 0.1em;
+ text-transform: uppercase;
+ color: var(--gray-500);
+ margin-top: 0.5em;
+ padding-top: 0.5em;
+ border-top: 1px solid var(--gray-200);
+}
+.blog-card-status::before {
+ content: '';
+ width: 7px; height: 7px;
+ border-radius: 50%;
+ flex-shrink: 0;
+}
+.blog-card[data-status="published"] .blog-card-status::before { background: var(--deep); }
+.blog-card[data-status="draft"] .blog-card-status::before { background: var(--orange); }
+.blog-card[data-status="idea"] .blog-card-status::before { background: var(--gray-200); border: 1px solid var(--gray-500); }
+
+.blog-card-link {
+ display: block;
+ text-decoration: none;
+ color: inherit;
+}
+
+/* No results */
+.no-results {
+ text-align: center;
+ padding: var(--space-2xl) var(--space-md);
+ font-family: var(--font-display);
+ font-size: 1.1rem;
+ color: var(--gray-500);
+}
+.no-results button {
+ color: var(--color-primary);
+ font-family: inherit;
+ font-size: inherit;
+ font-weight: 700;
+ text-decoration: underline;
+ margin-left: 0.5em;
+}
+
+/* =========================================================
+ POST HERO (Einzelartikel)
+ ========================================================= */
+.post-hero {
+ background: linear-gradient(135deg, var(--black) 0%, #0a1e22 100%);
+ padding-top: calc(var(--header-h) + var(--space-xl));
+ border-bottom: 2px solid var(--color-primary);
+}
+.post-hero-inner { padding-bottom: var(--space-lg); }
+
+.breadcrumb {
+ display: flex;
+ align-items: center;
+ flex-wrap: wrap;
+ gap: 0.35em;
+ font-size: 0.8rem;
+ color: rgba(255,255,255,0.4);
+ margin-bottom: var(--space-md);
+ font-family: var(--font-display);
+ font-weight: 600;
+ text-transform: uppercase;
+ letter-spacing: 0.05em;
+}
+.breadcrumb a { color: rgba(255,255,255,0.5); transition: color var(--transition); }
+.breadcrumb a:hover { color: var(--mint); }
+.breadcrumb span[aria-current] { color: var(--mint); }
+
+.post-meta {
+ display: flex;
+ align-items: center;
+ flex-wrap: wrap;
+ gap: 0.4em;
+ margin-bottom: var(--space-sm);
+ font-size: 0.82rem;
+}
+.post-cat {
+ font-family: var(--font-display);
+ font-weight: 700;
+ font-size: 0.72rem;
+ letter-spacing: 0.15em;
+ text-transform: uppercase;
+ background: var(--color-primary);
+ color: var(--white);
+ padding: 0.2em 0.6em;
+ border-radius: 3px;
+}
+.post-dot { color: rgba(255,255,255,0.3); }
+.post-date, .post-readtime { color: rgba(255,255,255,0.5); font-size: 0.82rem; }
+
+.post-title {
+ font-family: var(--font-display);
+ font-weight: 800;
+ font-size: clamp(2rem, 6vw, 3.8rem);
+ line-height: 1.05;
+ color: var(--white);
+ margin-bottom: var(--space-sm);
+}
+
+.post-intro {
+ font-size: 1.1rem;
+ color: rgba(255,255,255,0.65);
+ max-width: 680px;
+ line-height: 1.55;
+ margin-bottom: var(--space-md);
+}
+
+.post-tags { display: flex; flex-wrap: wrap; gap: 0.4em; }
+
+/* Hero image placeholder */
+.post-hero-image {
+ width: 100%;
+ max-height: 320px;
+ overflow: hidden;
+}
+.post-hero-img-placeholder {
+ width: 100%;
+ height: 220px;
+ background: linear-gradient(135deg, rgba(0,121,138,0.25), rgba(77,133,145,0.15));
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ font-family: var(--font-display);
+ font-size: 0.75rem;
+ letter-spacing: 0.15em;
+ text-transform: uppercase;
+ color: rgba(255,255,255,0.25);
+ border-top: 1px solid rgba(255,255,255,0.07);
+}
+
+/* =========================================================
+ POST LAYOUT (two-column on desktop)
+ ========================================================= */
+.post-layout {
+ display: grid;
+ grid-template-columns: 1fr;
+ gap: var(--space-xl);
+ padding-block: var(--space-xl);
+ align-items: start;
+}
+
+@media (min-width: 900px) {
+ .post-layout {
+ grid-template-columns: 220px 1fr;
+ }
+}
+
+/* TOC Sidebar */
+.post-toc {
+ display: none;
+}
+@media (min-width: 900px) {
+ .post-toc {
+ display: block;
+ position: sticky;
+ top: calc(var(--header-h) + 1.5rem);
+ }
+}
+.toc-inner {
+ background: var(--ice);
+ border-radius: var(--radius-md);
+ padding: var(--space-md);
+ border-left: 3px solid var(--teal);
+}
+.toc-title {
+ font-family: var(--font-display);
+ font-weight: 800;
+ font-size: 0.75rem;
+ letter-spacing: 0.2em;
+ text-transform: uppercase;
+ color: var(--teal);
+ margin-bottom: 0.8em;
+}
+.toc-list { counter-reset: toc; }
+.toc-list li {
+ counter-increment: toc;
+ padding: 0.3em 0;
+ border-bottom: 1px solid rgba(0,0,0,0.06);
+}
+.toc-list li:last-child { border-bottom: none; }
+.toc-list a {
+ font-size: 0.85rem;
+ color: var(--gray-500);
+ transition: color var(--transition);
+ line-height: 1.4;
+}
+.toc-list a:hover, .toc-list a.active { color: var(--deep); }
+
+/* Article body */
+.post-body {
+ max-width: 720px;
+ font-size: 1.02rem;
+ line-height: 1.75;
+ color: var(--gray-800);
+}
+.post-body h2 {
+ font-family: var(--font-display);
+ font-weight: 800;
+ font-size: clamp(1.5rem, 3vw, 2rem);
+ color: var(--black);
+ margin: 2em 0 0.5em;
+ padding-top: 0.5em;
+ border-top: 2px solid var(--ice);
+}
+.post-body h2:first-child { margin-top: 0; border-top: none; }
+.post-body h3 {
+ font-family: var(--font-display);
+ font-weight: 700;
+ font-size: 1.2rem;
+ color: var(--teal);
+ margin: 1.5em 0 0.4em;
+ text-transform: uppercase;
+ letter-spacing: 0.05em;
+}
+.post-body p { margin-bottom: 1.2em; }
+.post-body strong { font-weight: 600; color: var(--black); }
+.post-body a { color: var(--deep); text-decoration: underline; text-underline-offset: 3px; }
+.post-body a:hover { color: var(--color-primary); }
+.post-body ul, .post-body ol {
+ padding-left: 1.5em;
+ margin-bottom: 1.2em;
+}
+.post-body li { margin-bottom: 0.4em; }
+
+/* Callout box */
+.callout {
+ display: flex;
+ gap: var(--space-sm);
+ padding: var(--space-md);
+ border-radius: var(--radius-md);
+ margin: var(--space-lg) 0;
+}
+.callout-tip {
+ background: #e8f7f8;
+ border-left: 4px solid var(--teal);
+}
+.callout-warning {
+ background: #fff8e8;
+ border-left: 4px solid var(--yellow);
+}
+.callout-icon { font-size: 1.2rem; flex-shrink: 0; }
+.callout-text { font-size: 0.95rem; line-height: 1.55; }
+.callout-text strong { color: var(--deep); }
+
+/* Table */
+.table-wrap {
+ overflow-x: auto;
+ margin: var(--space-lg) 0;
+ border-radius: var(--radius-md);
+ border: 1px solid var(--gray-200);
+}
+table {
+ width: 100%;
+ border-collapse: collapse;
+ font-size: 0.92rem;
+}
+th {
+ background: var(--black);
+ color: var(--white);
+ font-family: var(--font-display);
+ font-weight: 700;
+ font-size: 0.75rem;
+ letter-spacing: 0.1em;
+ text-transform: uppercase;
+ padding: 0.75em 1em;
+ text-align: left;
+}
+td {
+ padding: 0.65em 1em;
+ border-bottom: 1px solid var(--gray-200);
+ color: var(--gray-800);
+}
+tr:last-child td { border-bottom: none; }
+tr:nth-child(even) td { background: var(--gray-100); }
+
+/* Blockquote */
+.post-quote {
+ border-left: 4px solid var(--color-primary);
+ margin: var(--space-lg) 0;
+ padding: var(--space-md) var(--space-md) var(--space-md) var(--space-lg);
+ background: var(--ice);
+ border-radius: 0 var(--radius-md) var(--radius-md) 0;
+}
+.post-quote p {
+ font-family: var(--font-display);
+ font-size: 1.2rem;
+ font-weight: 600;
+ line-height: 1.4;
+ color: var(--black);
+ font-style: italic;
+ margin: 0;
+}
+
+/* =========================================================
+ POST FOOTER BAR
+ ========================================================= */
+.post-footer-bar {
+ padding-block: var(--space-lg);
+ border-top: 1px solid var(--gray-200);
+ border-bottom: 1px solid var(--gray-200);
+ margin-bottom: var(--space-xl);
+ display: flex;
+ align-items: center;
+ flex-wrap: wrap;
+ gap: var(--space-sm);
+}
+.post-footer-label {
+ font-family: var(--font-display);
+ font-size: 0.72rem;
+ font-weight: 700;
+ letter-spacing: 0.12em;
+ text-transform: uppercase;
+ color: var(--gray-500);
+ margin-right: 0.25em;
+}
+
+/* =========================================================
+ RELATED POSTS
+ ========================================================= */
+.related-posts {
+ padding-bottom: var(--space-2xl);
+}
+.related-grid {
+ display: grid;
+ grid-template-columns: 1fr;
+ gap: var(--space-md);
+ margin-top: var(--space-lg);
+}
+@media (min-width: 600px) { .related-grid { grid-template-columns: repeat(2, 1fr); } }
+@media (min-width: 900px) { .related-grid { grid-template-columns: repeat(3, 1fr); } }
+
+/* =========================================================
+ POST CTA
+ ========================================================= */
+.post-cta {
+ background: var(--black);
+ padding: var(--space-xl) var(--space-md);
+ text-align: center;
+}
+.post-cta-label {
+ font-family: var(--font-display);
+ font-size: 0.75rem;
+ letter-spacing: 0.2em;
+ text-transform: uppercase;
+ color: var(--mint);
+ margin-bottom: 0.4em;
+}
+.post-cta h2 {
+ font-family: var(--font-display);
+ font-weight: 800;
+ font-size: clamp(1.8rem, 5vw, 3rem);
+ color: var(--white);
+ margin-bottom: var(--space-md);
+}
--- /dev/null
+/* =========================================================
+ triathlon-coaching.com — blog.js
+ Filter, Karten-Rendering, TOC
+ POSTS + TAG_LABELS + CONTEXT_PATH kommen aus blog-data.js
+ ========================================================= */
+(function () {
+ 'use strict';
+
+ const grid = document.getElementById('blog-grid');
+ const TAG_LABELS = window.TAG_LABELS || {};
+ const CONTEXT_PATH = window.CONTEXT_PATH || '';
+ const POSTS = window.BLOG_POSTS || [];
+ const LOCKED_CAT = grid ? (grid.dataset.lockedCat || '') : '';
+
+ let activeTag = null;
+ let searchQuery = '';
+
+ function tagLabel(slug) { return TAG_LABELS[slug] || slug; }
+
+ function esc(str) {
+ return String(str)
+ .replace(/&/g,'&').replace(/</g,'<')
+ .replace(/>/g,'>').replace(/"/g,'"');
+ }
+
+ function normalize(str) {
+ return str.toLowerCase()
+ .replace(/[äöü]/g, c => ({ä:'ae',ö:'oe',ü:'ue'}[c] || c));
+ }
+
+ // ── Filtern ───────────────────────────────────────────────
+ function filteredPosts() {
+ const q = normalize(searchQuery.trim());
+ return POSTS.filter(p => {
+ if (LOCKED_CAT && !(p.categories || []).includes(LOCKED_CAT)) return false;
+ if (activeTag && !p.tags.includes(activeTag)) return false;
+ if (q && !normalize(p.title + ' ' + p.tags.join(' ')).includes(q)) return false;
+ return true;
+ });
+ }
+
+ // ── Card rendern ──────────────────────────────────────────
+ function renderCard(post, delay) {
+ const href = post.slug === '#' ? '#' : CONTEXT_PATH + '/' + post.slug;
+ const tagsHtml = post.tags.slice(0, 3).map(function(t) {
+ var tagHref = CONTEXT_PATH + '/blog?tag=' + encodeURIComponent(t);
+ return '<a href="' + esc(tagHref) + '" class="tag' + (t === activeTag ? ' active' : '') + '" data-tag="' + esc(t) + '">' + esc(tagLabel(t)) + '</a>';
+ }).join('');
+
+ var dateHtml = post.date
+ ? '<time class="blog-card-date" datetime="' + esc(post.dateIso || '') + '">' + esc(post.date) + '</time>'
+ : '';
+
+ return '<article class="blog-card" role="listitem" style="animation-delay:' + delay + 'ms">'
+ + '<div class="blog-card-stripe"></div>'
+ + '<div class="blog-card-body">'
+ + '<span class="blog-card-cat">' + esc((post.categories || [])[0] || '') + '</span>'
+ + '<a href="' + esc(href) + '" class="blog-card-link">'
+ + '<h2 class="blog-card-title">' + esc(post.title) + '</h2>'
+ + '</a>'
+ + (post.excerpt ? '<p class="blog-card-excerpt">' + esc(post.excerpt) + '</p>' : '')
+ + (tagsHtml ? '<div class="blog-card-tags">' + tagsHtml + '</div>' : '')
+ + dateHtml
+ + '</div></article>';
+ }
+
+ // ── Grid rendern ──────────────────────────────────────────
+ function renderGrid() {
+ if (!grid) return;
+ const noRes = document.getElementById('no-results');
+ const resetBtn = document.getElementById('filter-reset');
+ const results = filteredPosts();
+
+ if (resetBtn) resetBtn.hidden = !(activeTag || searchQuery.trim());
+
+ if (!results.length) {
+ grid.innerHTML = '';
+ if (noRes) noRes.hidden = false;
+ return;
+ }
+ if (noRes) noRes.hidden = true;
+ grid.innerHTML = results.map(function(p, i) { return renderCard(p, Math.min(i * 30, 400)); }).join('');
+
+ grid.querySelectorAll('.tag[data-tag]').forEach(function(el) {
+ el.addEventListener('click', function(e) {
+ e.preventDefault(); e.stopPropagation();
+ activeTag = activeTag === el.dataset.tag ? null : el.dataset.tag;
+ syncTagCloud(); renderGrid();
+ });
+ });
+ }
+
+ // ── Tag-Cloud ─────────────────────────────────────────────
+ function buildTagCloud() {
+ const cloud = document.getElementById('tag-cloud');
+ if (!cloud) return;
+ const source = LOCKED_CAT ? POSTS.filter(function(p) { return p.category === LOCKED_CAT; }) : POSTS;
+ const allTags = [...new Set(source.flatMap(function(p) { return p.tags; }))].sort();
+ cloud.innerHTML = allTags.map(function(t) {
+ return '<button class="tag' + (t === activeTag ? ' active' : '') + '" data-tag="' + esc(t) + '">' + esc(tagLabel(t)) + '</button>';
+ }).join('');
+ cloud.querySelectorAll('.tag').forEach(function(btn) {
+ btn.addEventListener('click', function() {
+ activeTag = activeTag === btn.dataset.tag ? null : btn.dataset.tag;
+ syncTagCloud(); renderGrid();
+ });
+ });
+ }
+
+ function syncTagCloud() {
+ document.querySelectorAll('#tag-cloud .tag').forEach(function(btn) {
+ btn.classList.toggle('active', btn.dataset.tag === activeTag);
+ });
+ }
+
+ // ── Suche ─────────────────────────────────────────────────
+ function initSearch() {
+ const input = document.getElementById('blog-search');
+ if (!input) return;
+ var timer;
+ input.addEventListener('input', function() {
+ clearTimeout(timer);
+ timer = setTimeout(function() { searchQuery = input.value; renderGrid(); }, 180);
+ });
+ }
+
+ // ── Reset ─────────────────────────────────────────────────
+ function initReset() {
+ function doReset() {
+ activeTag = null; searchQuery = '';
+ var input = document.getElementById('blog-search');
+ if (input) input.value = '';
+ syncTagCloud(); renderGrid();
+ }
+ var r1 = document.getElementById('filter-reset');
+ var r2 = document.getElementById('no-results-reset');
+ if (r1) r1.addEventListener('click', doReset);
+ if (r2) r2.addEventListener('click', doReset);
+ }
+
+ // ── URL-Parameter ─────────────────────────────────────────
+ function applyUrlParams() {
+ var tag = new URLSearchParams(window.location.search).get('tag');
+ if (tag) { activeTag = tag; syncTagCloud(); }
+ }
+
+ // ── TOC (Artikel-Seiten) ──────────────────────────────────
+ function buildTOC() {
+ var body = document.getElementById('post-body');
+ var tocList = document.getElementById('toc-list');
+ if (!body || !tocList) return;
+ var headings = body.querySelectorAll('h2, h3');
+ headings.forEach(function(h, i) {
+ if (!h.id) h.id = 'section-' + i;
+ var li = document.createElement('li');
+ var a = document.createElement('a');
+ a.href = '#' + h.id;
+ a.textContent = h.textContent;
+ if (h.tagName === 'H3') a.style.paddingLeft = '0.75em';
+ li.appendChild(a); tocList.appendChild(li);
+ });
+ if ('IntersectionObserver' in window) {
+ var links = tocList.querySelectorAll('a');
+ var obs = new IntersectionObserver(function(entries) {
+ entries.forEach(function(e) {
+ if (e.isIntersecting) {
+ links.forEach(function(l) { l.classList.remove('active'); });
+ var active = tocList.querySelector('a[href="#' + e.target.id + '"]');
+ if (active) active.classList.add('active');
+ }
+ });
+ }, { rootMargin: '-20% 0px -70% 0px' });
+ headings.forEach(function(h) { obs.observe(h); });
+ }
+ }
+
+ // ── Init ──────────────────────────────────────────────────
+ function init() {
+ if (grid) {
+ buildTagCloud(); initSearch(); initReset(); applyUrlParams(); renderGrid();
+ }
+ buildTOC();
+ }
+
+ if (document.readyState === 'loading') {
+ document.addEventListener('DOMContentLoaded', init);
+ } else {
+ init();
+ }
+
+}());
--- /dev/null
+/* =========================================================
+ triathlon-coaching.com — main.js
+ Nur: Header, Navigation, Mobile-Menu
+ Blog-Filter, Cards, TOC → blog.js (nur auf Blog-Seiten)
+ ========================================================= */
+(function () {
+ 'use strict';
+
+ const toggle = document.querySelector('.nav-toggle');
+ const nav = document.querySelector('.main-nav');
+ const header = document.querySelector('.site-header');
+
+ // ── Mobile Nav Toggle ─────────────────────────────────────
+ if (toggle && nav) {
+ toggle.addEventListener('click', function () {
+ const isOpen = nav.classList.toggle('open');
+ toggle.setAttribute('aria-expanded', String(isOpen));
+ toggle.setAttribute('aria-label', isOpen ? 'Menü schließen' : 'Menü öffnen');
+ });
+
+ document.addEventListener('click', function (e) {
+ if (!header.contains(e.target)) {
+ nav.classList.remove('open');
+ toggle.setAttribute('aria-expanded', 'false');
+ }
+ });
+ }
+
+ // ── Dropdown-Toggle – setzt .open auf Button UND Dropdown ─
+ document.querySelectorAll('.dropdown-toggle').forEach(function (btn) {
+ btn.addEventListener('click', function (e) {
+ e.preventDefault();
+ e.stopPropagation();
+
+ const isOpen = btn.classList.toggle('open');
+ btn.setAttribute('aria-expanded', String(isOpen));
+
+ // Dropdown direkt nach dem Button öffnen
+ const dropdown = btn.nextElementSibling;
+ if (dropdown && (dropdown.classList.contains('dropdown') ||
+ dropdown.classList.contains('dropdown-2'))) {
+ dropdown.classList.toggle('open', isOpen);
+ }
+ });
+ });
+
+ // ── Sticky Header ─────────────────────────────────────────
+ if (header) {
+ window.addEventListener('scroll', function () {
+ header.classList.toggle('scrolled', window.scrollY > 10);
+ }, { passive: true });
+ }
+
+ // ── Smooth Scroll ─────────────────────────────────────────
+ document.querySelectorAll('a[href^="#"]').forEach(function (a) {
+ a.addEventListener('click', function (e) {
+ const target = document.querySelector(a.getAttribute('href'));
+ if (target) {
+ e.preventDefault();
+ target.scrollIntoView({ behavior: 'smooth', block: 'start' });
+ }
+ });
+ });
+
+}());
--- /dev/null
+/* =========================================================
+ triathlon-coaching.com — style.css (unified)
+ Mobile-First, Flat-File Ready
+ ========================================================= */
+
+/* ── CSS CUSTOM PROPERTIES ──────────────────────────────── */
+:root {
+ --red: #a60c24;
+ --orange: #e87002;
+ --yellow: #f5ad00;
+ --ice: #e2eff3;
+ --mint: #addad5;
+ --teal: #4d8591;
+ --deep: #00798a;
+ --black: #0d0d0d;
+ --white: #ffffff;
+ --gray-100: #f5f5f5;
+ --gray-200: #e8e8e8;
+ --gray-500: #6b6b6b;
+ --gray-800: #222222;
+
+ --color-primary: var(--red);
+ --color-accent: var(--orange);
+ --color-accent-2: var(--yellow);
+ --color-bg: var(--white);
+ --color-surface: var(--ice);
+ --color-text: var(--gray-800);
+ --color-muted: var(--gray-500);
+
+ --font-display: 'Barlow Condensed', sans-serif;
+ --font-body: 'Barlow', sans-serif;
+
+ --space-xs: 0.5rem;
+ --space-sm: 1rem;
+ --space-md: 1.5rem;
+ --space-lg: 2.5rem;
+ --space-xl: 4rem;
+ --space-2xl: 6rem;
+
+ --radius-sm: 4px;
+ --radius-md: 8px;
+ --radius-lg: 16px;
+
+ --transition: 0.25s ease;
+ --header-h: 64px;
+}
+
+/* ── RESET & BASE ────────────────────────────────────────── */
+*, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; }
+html { font-size: 16px; scroll-behavior: smooth; -webkit-text-size-adjust: 100%; }
+body { font-family: var(--font-body); color: var(--color-text); background: var(--color-bg); line-height: 1.65; overflow-x: hidden; }
+img, svg { display: block; max-width: 100%; }
+a { color: inherit; text-decoration: none; }
+ul { list-style: none; }
+button { background: none; border: none; cursor: pointer; font: inherit; }
+p { margin-bottom: 1em; }
+p:last-child { margin-bottom: 0; }
+
+.container { width: 100%; max-width: 1140px; margin-inline: auto; padding-inline: var(--space-md); }
+
+/* ── TYPOGRAPHY ──────────────────────────────────────────── */
+.section-label {
+ font-family: var(--font-display);
+ font-weight: 700;
+ font-size: 0.75rem;
+ letter-spacing: 0.2em;
+ text-transform: uppercase;
+ color: var(--color-primary);
+ margin-bottom: var(--space-xs);
+}
+.section-label.center { text-align: center; }
+.section-title {
+ font-family: var(--font-display);
+ font-weight: 800;
+ font-size: clamp(2rem, 5vw, 3rem);
+ line-height: 1.05;
+ color: var(--black);
+ margin-bottom: var(--space-md);
+}
+.section-title.center { text-align: center; }
+
+/* ── BUTTONS ─────────────────────────────────────────────── */
+.btn {
+ display: inline-flex;
+ align-items: center;
+ gap: 0.5em;
+ font-family: var(--font-display);
+ font-weight: 700;
+ font-size: 1rem;
+ letter-spacing: 0.05em;
+ text-transform: uppercase;
+ padding: 0.75em 1.75em;
+ border-radius: var(--radius-sm);
+ border: 2px solid transparent;
+ transition: background var(--transition), color var(--transition), border-color var(--transition), transform var(--transition);
+ white-space: nowrap;
+}
+.btn:active { transform: scale(0.97); }
+.btn-primary { background: var(--color-primary); color: var(--white); border-color: var(--color-primary); }
+.btn-primary:hover { background: #8a0a1e; border-color: #8a0a1e; }
+.btn-outline { background: transparent; color: var(--white); border-color: rgba(255,255,255,0.7); }
+.btn-outline:hover { background: rgba(255,255,255,0.1); border-color: var(--white); }
+.btn-outline-light { background: transparent; color: var(--white); border-color: var(--white); }
+.btn-outline-light:hover { background: var(--white); color: var(--black); }
+
+/* =========================================================
+ HEADER — Hamburger immer sichtbar
+ ========================================================= */
+.site-header {
+ position: fixed;
+ top: 0; left: 0; right: 0;
+ z-index: 1000;
+ height: var(--header-h);
+ background: rgba(13,13,13,0.96);
+ backdrop-filter: blur(8px);
+ -webkit-backdrop-filter: blur(8px);
+ border-bottom: 2px solid var(--color-primary);
+ transition: box-shadow var(--transition);
+}
+.site-header.scrolled { box-shadow: 0 2px 24px rgba(0,0,0,0.4); }
+
+.header-inner {
+ height: 100%;
+ max-width: 1140px;
+ margin-inline: auto;
+ padding-inline: var(--space-md);
+ display: flex;
+ align-items: center;
+ justify-content: space-between;
+ gap: var(--space-md);
+}
+
+/* Logo */
+.site-logo {
+ font-family: var(--font-display);
+ font-weight: 800;
+ font-size: clamp(1.1rem, 3vw, 1.4rem);
+ letter-spacing: -0.01em;
+ line-height: 1;
+ white-space: nowrap;
+}
+.logo-tri { color: var(--white); }
+.logo-dash { color: var(--color-primary); }
+.logo-coaching { color: var(--color-accent); }
+.logo-dot { color: var(--yellow); }
+.logo-com { color: var(--mint); }
+
+/* Hamburger — immer sichtbar, kein @media display:none */
+.nav-toggle {
+ display: flex;
+ flex-direction: column;
+ justify-content: space-between;
+ width: 28px;
+ height: 20px;
+ padding: 0;
+ flex-shrink: 0;
+}
+.nav-toggle span {
+ display: block;
+ height: 2px;
+ background: var(--white);
+ border-radius: 2px;
+ transition: transform var(--transition), opacity var(--transition);
+ transform-origin: center;
+}
+.nav-toggle[aria-expanded="true"] span:nth-child(1) { transform: translateY(9px) rotate(45deg); }
+.nav-toggle[aria-expanded="true"] span:nth-child(2) { opacity: 0; }
+.nav-toggle[aria-expanded="true"] span:nth-child(3) { transform: translateY(-9px) rotate(-45deg); }
+
+/* ── Slide-in Panel (alle Bildschirmgrößen) ─────────────── */
+.main-nav {
+ position: fixed;
+ top: var(--header-h);
+ left: 0; right: 0;
+ background: rgba(13,13,13,0.98);
+ backdrop-filter: blur(12px);
+ -webkit-backdrop-filter: blur(12px);
+ border-top: 1px solid rgba(255,255,255,0.08);
+ padding: var(--space-sm) 0 var(--space-lg);
+ transform: translateY(-110%);
+ opacity: 0;
+ visibility: hidden;
+ transition: transform 0.3s ease, opacity 0.3s ease, visibility 0.3s;
+ max-height: calc(100vh - var(--header-h));
+ overflow-y: auto;
+}
+
+/* Ab 700px: Seitenpanel rechts statt Vollbild */
+@media (min-width: 700px) {
+ .main-nav {
+ left: auto;
+ width: 300px;
+ border-left: 2px solid var(--color-primary);
+ border-top: none;
+ box-shadow: -8px 0 40px rgba(0,0,0,0.5);
+ }
+}
+
+.main-nav.open {
+ transform: translateY(0);
+ opacity: 1;
+ visibility: visible;
+}
+
+.nav-list { padding-inline: var(--space-md); }
+
+/* Nav-Item: Link + Toggle-Pfeil nebeneinander, kein Zeilenumbruch */
+.nav-item {
+ display: flex;
+ flex-wrap: wrap; /* nur Dropdown bricht in neue Zeile */
+ align-items: stretch;
+ border-bottom: 1px solid rgba(255,255,255,0.07);
+}
+
+.nav-item > a {
+ flex: 1; /* nimmt den verfügbaren Platz */
+ min-width: 0;
+ display: flex;
+ align-items: center;
+ color: rgba(255,255,255,0.85);
+ font-family: var(--font-display);
+ font-weight: 700;
+ font-size: 1.1rem;
+ letter-spacing: 0.05em;
+ text-transform: uppercase;
+ padding: 0.8em 0;
+ transition: color var(--transition);
+ white-space: nowrap;
+ overflow: hidden;
+ text-overflow: ellipsis;
+}
+.nav-item > a:hover,
+.nav-item.active > a { color: var(--color-accent); }
+
+/* Pfeil-Button: feste Breite, kein Umbruch */
+.dropdown-toggle {
+ flex: 0 0 2.5rem;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ color: rgba(255,255,255,0.35);
+ font-size: 0.6rem;
+ transition: transform var(--transition), color var(--transition);
+ padding: 0;
+ line-height: 1;
+}
+.dropdown-toggle.open {
+ transform: rotate(180deg);
+ color: var(--color-accent);
+}
+
+/* Dropdown: volle Breite unter dem Link-Toggle-Paar */
+.dropdown,
+.dropdown-2 {
+ display: none;
+ flex-basis: 100%;
+ padding-left: var(--space-md);
+ border-left: 2px solid var(--color-primary);
+ margin: 0 0 var(--space-xs) var(--space-xs);
+}
+.dropdown.open,
+.dropdown-2.open { display: block; }
+
+.dropdown li,
+.dropdown-2 li {
+ display: flex;
+ flex-wrap: wrap;
+ align-items: stretch;
+ border-bottom: 1px solid rgba(255,255,255,0.04);
+}
+.dropdown li:last-child,
+.dropdown-2 li:last-child { border-bottom: none; }
+
+.dropdown li > a,
+.dropdown-2 li > a {
+ flex: 1;
+ color: rgba(255,255,255,0.65);
+ font-family: var(--font-body);
+ font-size: 0.95rem;
+ padding: 0.55em 0;
+ transition: color var(--transition);
+}
+.dropdown li > a:hover,
+.dropdown-2 li > a:hover { color: var(--mint); }
+
+.dropdown-2 {
+ border-left-color: var(--teal);
+ margin-left: var(--space-sm);
+}
+
+/* =========================================================
+ HERO
+ ========================================================= */
+.hero {
+ position: relative;
+ min-height: 100svh;
+ display: flex;
+ align-items: center;
+ padding-top: var(--header-h);
+ overflow: hidden;
+}
+.hero-bg {
+ position: absolute;
+ inset: 0;
+ background: linear-gradient(135deg, #050a0b 0%, #0a1e22 40%, #00798a22 100%);
+}
+.hero-shapes { position: absolute; inset: 0; overflow: hidden; }
+.shape { position: absolute; border-radius: 50%; opacity: 0.12; animation: float 12s ease-in-out infinite; }
+.shape-1 { width: 60vw; height: 60vw; background: radial-gradient(circle, var(--deep), transparent 70%); top: -15%; right: -20%; animation-delay: 0s; }
+.shape-2 { width: 40vw; height: 40vw; background: radial-gradient(circle, var(--color-primary), transparent 70%); bottom: 10%; left: -10%; animation-delay: -4s; }
+.shape-3 { width: 25vw; height: 25vw; background: radial-gradient(circle, var(--orange), transparent 70%); top: 30%; left: 40%; animation-delay: -8s; opacity: 0.07; }
+
+@keyframes float {
+ 0%, 100% { transform: translate(0,0) scale(1); }
+ 33% { transform: translate(2%,3%) scale(1.04); }
+ 66% { transform: translate(-2%,-2%) scale(0.97); }
+}
+.hero-bg::after {
+ content: '';
+ position: absolute;
+ top: 0; bottom: 0; right: 0;
+ width: 35%;
+ background: linear-gradient(to bottom, var(--deep) 0%, var(--teal) 100%);
+ clip-path: polygon(20% 0%, 100% 0%, 100% 100%, 0% 100%);
+ opacity: 0.2;
+}
+.hero-overlay { position: absolute; inset: 0; background: linear-gradient(to bottom, rgba(0,0,0,0.1) 0%, rgba(0,0,0,0.5) 100%); }
+
+.hero-content {
+ position: relative;
+ z-index: 2;
+ padding: var(--space-xl) var(--space-md);
+ max-width: 700px;
+ margin-inline: auto;
+ animation: heroIn 0.9s cubic-bezier(0.16,1,0.3,1) both;
+}
+@keyframes heroIn { from { opacity: 0; transform: translateY(30px); } to { opacity: 1; transform: translateY(0); } }
+
+.hero-disciplines {
+ display: flex; align-items: center; gap: 0.5em; flex-wrap: wrap;
+ margin-bottom: var(--space-sm);
+ font-family: var(--font-display); font-weight: 600; font-size: 0.8rem;
+ letter-spacing: 0.2em; text-transform: uppercase; color: var(--mint);
+}
+.hero-disciplines .sep { color: var(--color-accent); opacity: 0.7; }
+.hero-title { font-family: var(--font-display); font-weight: 800; font-size: clamp(3.5rem, 12vw, 7rem); line-height: 0.95; color: var(--white); margin-bottom: var(--space-md); }
+.hero-title::after { content: ''; display: block; width: 80px; height: 4px; background: linear-gradient(to right, var(--color-primary), var(--color-accent)); margin-top: 0.4em; }
+.hero-sub { font-size: 1.05rem; color: rgba(255,255,255,0.75); line-height: 1.6; margin-bottom: var(--space-lg); max-width: 520px; }
+.hero-ctas { display: flex; flex-wrap: wrap; gap: var(--space-sm); }
+
+.hero-scroll-hint {
+ position: absolute; bottom: 2rem; left: 50%; transform: translateX(-50%); z-index: 2;
+ display: flex; flex-direction: column; align-items: center; gap: 0.5rem;
+ font-family: var(--font-display); font-size: 0.65rem; letter-spacing: 0.2em; text-transform: uppercase; color: rgba(255,255,255,0.4);
+}
+.scroll-line { width: 1px; height: 40px; background: linear-gradient(to bottom, rgba(255,255,255,0.4), transparent); animation: scrollLine 2s ease-in-out infinite; }
+@keyframes scrollLine { 0%, 100% { transform: scaleY(1); opacity: 1; } 50% { transform: scaleY(0.5); opacity: 0.4; } }
+
+/* =========================================================
+ INTRO STRIP
+ ========================================================= */
+.intro-strip { background: var(--black); display: flex; flex-wrap: wrap; justify-content: center; }
+.strip-item { display: flex; flex-direction: column; align-items: center; padding: var(--space-lg) var(--space-xl); text-align: center; flex: 1; min-width: 160px; }
+.strip-num { font-family: var(--font-display); font-weight: 800; font-size: clamp(2rem, 5vw, 2.8rem); color: var(--color-accent); line-height: 1; }
+.strip-label { font-size: 0.8rem; letter-spacing: 0.1em; text-transform: uppercase; color: rgba(255,255,255,0.5); margin-top: 0.3em; }
+.strip-divider { width: 1px; background: rgba(255,255,255,0.1); align-self: stretch; flex-shrink: 0; }
+@media (max-width: 480px) { .strip-divider { display: none; } }
+
+/* =========================================================
+ ABOUT SECTION
+ ========================================================= */
+.about-section { display: grid; grid-template-columns: 1fr; gap: var(--space-xl); padding-block: var(--space-2xl); }
+@media (min-width: 768px) { .about-section { grid-template-columns: 1fr 1.6fr; align-items: start; } }
+
+.about-image-wrap { position: relative; }
+.about-image-placeholder {
+ aspect-ratio: 3/4; background: var(--ice); border-radius: var(--radius-lg);
+ display: flex; align-items: center; justify-content: center;
+ overflow: hidden; border: 1px solid var(--gray-200);
+}
+.about-image-placeholder .img-inner { display: flex; flex-direction: column; align-items: center; gap: 1rem; color: var(--gray-500); }
+.about-image-placeholder svg { width: 80px; }
+.img-hint { font-family: var(--font-display); font-size: 0.8rem; letter-spacing: 0.15em; text-transform: uppercase; color: var(--teal); margin-bottom: 0; }
+.about-badge {
+ position: absolute; bottom: -1rem; right: -1rem;
+ background: var(--color-primary); color: var(--white);
+ font-family: var(--font-display); font-weight: 800; font-size: 0.8rem;
+ text-transform: uppercase; letter-spacing: 0.1em;
+ padding: 0.75em 1em; border-radius: var(--radius-md);
+ display: flex; flex-direction: column; align-items: center; gap: 0.1em; line-height: 1.2;
+ box-shadow: 0 4px 16px rgba(166,12,36,0.35);
+}
+.about-text-col p { color: var(--gray-500); margin-bottom: 1em; }
+.about-text-col h2 { margin-bottom: var(--space-md); }
+.about-text-col .btn { margin-top: var(--space-md); }
+
+/* =========================================================
+ TIMELINE
+ ========================================================= */
+.timeline-section { background: var(--ice); padding-block: var(--space-2xl); }
+.timeline { position: relative; margin-top: var(--space-xl); padding-left: var(--space-lg); }
+.timeline::before { content: ''; position: absolute; left: 0; top: 0; bottom: 0; width: 2px; background: linear-gradient(to bottom, var(--color-primary), var(--teal), var(--mint)); }
+.tl-item { position: relative; margin-bottom: var(--space-lg); display: grid; grid-template-columns: 60px 1fr; gap: var(--space-md); align-items: start; animation: fadeSlideIn 0.5s ease both; }
+@keyframes fadeSlideIn { from { opacity: 0; transform: translateX(-12px); } to { opacity: 1; transform: translateX(0); } }
+.tl-year { font-family: var(--font-display); font-weight: 800; font-size: 1rem; color: var(--color-primary); padding-top: 0.15em; text-align: right; position: relative; }
+.tl-dot { position: absolute; left: calc(-1 * var(--space-lg) - 5px); top: 0.4em; width: 12px; height: 12px; background: var(--white); border: 3px solid var(--color-primary); border-radius: 50%; }
+.tl-item:nth-child(even) .tl-dot { border-color: var(--teal); }
+.tl-card { background: var(--white); border-radius: var(--radius-md); padding: var(--space-md); border-left: 4px solid var(--color-primary); box-shadow: 0 2px 12px rgba(0,0,0,0.06); transition: box-shadow var(--transition), transform var(--transition); }
+.tl-card:hover { box-shadow: 0 6px 24px rgba(0,0,0,0.1); transform: translateY(-2px); }
+.tl-card.highlight { border-left-color: var(--color-accent); background: linear-gradient(135deg, #fff8f0, var(--white)); }
+.tl-card h3 { font-family: var(--font-display); font-weight: 700; font-size: 1.05rem; text-transform: uppercase; letter-spacing: 0.05em; margin-bottom: 0.4em; color: var(--black); }
+.tl-card p { font-size: 0.92rem; color: var(--gray-500); margin: 0; }
+@media (min-width: 768px) { .timeline { padding-left: 5rem; } .tl-item { grid-template-columns: 80px 1fr; } .tl-year { font-size: 1.15rem; } .tl-dot { left: calc(-5rem - 5px); } }
+
+/* =========================================================
+ CTA BANNER
+ ========================================================= */
+.cta-banner { background: linear-gradient(135deg, var(--color-primary) 0%, #7a0819 50%, var(--black) 100%); padding-block: var(--space-2xl); text-align: center; position: relative; overflow: hidden; }
+.cta-banner::before { content: ''; position: absolute; inset: 0; background: url("data:image/svg+xml,%3Csvg width='60' height='60' viewBox='0 0 60 60' xmlns='http://www.w3.org/2000/svg'%3E%3Cg fill='none' fill-rule='evenodd'%3E%3Cg fill='%23ffffff' fill-opacity='0.03'%3E%3Cpath d='M36 34v-4h-2v4h-4v2h4v4h2v-4h4v-2h-4zm0-30V0h-2v4h-4v2h4v4h2V6h4V4h-4zM6 34v-4H4v4H0v2h4v4h2v-4h4v-2H6zM6 4V0H4v4H0v2h4v4h2V6h4V4H6z'/%3E%3C/g%3E%3C/g%3E%3C/svg%3E"); }
+.cta-banner .container { position: relative; z-index: 1; }
+.cta-banner h2 { font-family: var(--font-display); font-weight: 800; font-size: clamp(1.8rem, 5vw, 3rem); color: var(--white); margin-bottom: 0.5em; line-height: 1.1; }
+.cta-banner p { font-size: 1.05rem; color: rgba(255,255,255,0.75); margin-bottom: var(--space-lg); }
+.cta-banner-btns { display: flex; flex-wrap: wrap; justify-content: center; gap: var(--space-sm); }
+
+/* =========================================================
+ FOOTER
+ ========================================================= */
+.site-footer { background: var(--black); padding-top: var(--space-xl); }
+.footer-inner { display: flex; flex-direction: column; gap: var(--space-lg); padding-bottom: var(--space-xl); border-bottom: 1px solid rgba(255,255,255,0.08); }
+@media (min-width: 600px) { .footer-inner { flex-direction: row; justify-content: space-between; align-items: flex-start; } }
+.footer-logo { display: block; margin-bottom: var(--space-sm); }
+.footer-brand p { font-size: 0.9rem; color: rgba(255,255,255,0.45); max-width: 240px; margin: 0; line-height: 1.5; }
+.footer-nav ul { display: flex; flex-direction: column; gap: 0.5em; }
+.footer-nav a { font-family: var(--font-display); font-size: 0.9rem; font-weight: 600; letter-spacing: 0.08em; text-transform: uppercase; color: rgba(255,255,255,0.5); transition: color var(--transition); }
+.footer-nav a:hover { color: var(--mint); }
+.footer-bottom { padding: var(--space-sm) var(--space-md); text-align: center; }
+.footer-bottom p { font-size: 0.8rem; color: rgba(255,255,255,0.25); margin: 0; }
+
+/* =========================================================
+ PAGE HERO (Blog / Coaching-Seiten)
+ ========================================================= */
+.page-hero {
+ background: linear-gradient(135deg, var(--black) 0%, #0a1e22 60%, #00798a1a 100%);
+ padding: calc(var(--header-h) + var(--space-xl)) var(--space-md) 0;
+ border-bottom: 2px solid var(--color-primary);
+}
+.page-hero-inner { padding-bottom: var(--space-lg); }
+.page-hero-title { font-family: var(--font-display); font-weight: 800; font-size: clamp(3rem, 10vw, 5.5rem); line-height: 1; color: var(--white); margin-bottom: 0.3em; }
+.page-hero-sub { font-size: 1rem; color: rgba(255,255,255,0.6); max-width: 500px; margin: 0; }
+.page-hero-bar { background: var(--color-primary); color: var(--white); font-family: var(--font-display); font-weight: 700; font-size: 0.85rem; letter-spacing: 0.1em; text-transform: uppercase; padding: 0.6em var(--space-md); }
+.page-hero-bar span { font-size: 1.15em; color: var(--yellow); }
+
+/* =========================================================
+ FILTER BAR
+ ========================================================= */
+.filter-bar { position: sticky; top: var(--header-h); z-index: 100; background: var(--white); border-bottom: 1px solid var(--gray-200); box-shadow: 0 2px 12px rgba(0,0,0,0.06); }
+.filter-bar-inner { display: flex; flex-direction: column; gap: var(--space-sm); padding-block: var(--space-sm); }
+
+.filter-search-wrap { position: relative; width: 100%; }
+.filter-search-icon { position: absolute; left: 0.85rem; top: 50%; transform: translateY(-50%); color: var(--gray-500); width: 18px; pointer-events: none; }
+.filter-search {
+ width: 100%; font-family: var(--font-body); font-size: 0.95rem;
+ padding: 0.6em 1em 0.6em 2.5em;
+ border: 1.5px solid var(--gray-200); border-radius: 100px;
+ background: var(--gray-100); color: var(--color-text); outline: none;
+ transition: border-color var(--transition), background var(--transition); -webkit-appearance: none;
+}
+.filter-search:focus { border-color: var(--teal); background: var(--white); }
+.filter-search::placeholder { color: var(--gray-500); }
+
+.filter-pills { display: flex; flex-wrap: wrap; gap: 0.4em; }
+.pill {
+ font-family: var(--font-display); font-weight: 700; font-size: 0.78rem;
+ letter-spacing: 0.08em; text-transform: uppercase;
+ padding: 0.4em 0.9em; border-radius: 100px;
+ border: 1.5px solid var(--gray-200); color: var(--gray-500); background: transparent;
+ cursor: pointer; transition: background var(--transition), color var(--transition), border-color var(--transition); white-space: nowrap;
+}
+.pill:hover { border-color: var(--teal); color: var(--teal); }
+.pill.active { background: var(--color-primary); border-color: var(--color-primary); color: var(--white); }
+
+.filter-tags-toggle {
+ display: flex; align-items: center; gap: 0.4em;
+ font-family: var(--font-display); font-weight: 700; font-size: 0.78rem;
+ letter-spacing: 0.08em; text-transform: uppercase; color: var(--gray-500); padding: 0.3em 0; transition: color var(--transition);
+}
+.filter-tags-toggle svg { transition: transform var(--transition); }
+.filter-tags-toggle[aria-expanded="true"] svg { transform: rotate(180deg); }
+.filter-tags-toggle:hover { color: var(--deep); }
+.tag-cloud { display: flex; flex-wrap: wrap; gap: 0.4em; padding-top: 0.4em; }
+
+.tag {
+ display: inline-flex; align-items: center;
+ font-family: var(--font-display); font-weight: 600; font-size: 0.72rem;
+ letter-spacing: 0.06em; text-transform: uppercase;
+ padding: 0.25em 0.7em; border-radius: 100px;
+ background: var(--ice); color: var(--teal); border: 1px solid var(--mint);
+ cursor: pointer; text-decoration: none;
+ transition: background var(--transition), color var(--transition), border-color var(--transition); white-space: nowrap;
+}
+.tag:hover { background: var(--teal); color: var(--white); border-color: var(--teal); }
+.tag.active { background: var(--deep); color: var(--white); border-color: var(--deep); }
+
+.filter-meta { display: flex; align-items: center; gap: var(--space-sm); flex-wrap: wrap; }
+.result-count { font-family: var(--font-display); font-size: 0.8rem; font-weight: 700; color: var(--gray-500); letter-spacing: 0.05em; }
+.filter-reset { font-family: var(--font-display); font-size: 0.75rem; font-weight: 700; letter-spacing: 0.08em; text-transform: uppercase; color: var(--color-primary); padding: 0.25em 0; border-bottom: 1px dashed currentColor; transition: opacity var(--transition); }
+.filter-reset:hover { opacity: 0.7; }
+
+@media (min-width: 768px) {
+ .filter-bar-inner { flex-direction: row; align-items: center; flex-wrap: wrap; gap: var(--space-sm) var(--space-md); }
+ .filter-search-wrap { max-width: 280px; }
+ .filter-tags-wrap { flex: 1; }
+ .tag-cloud { padding-top: 0; }
+}
+
+/* =========================================================
+ BLOG GRID
+ ========================================================= */
+.blog-main { padding-block: var(--space-xl); min-height: 50vh; }
+.blog-grid { display: grid; grid-template-columns: 1fr; gap: var(--space-md); }
+@media (min-width: 540px) { .blog-grid { grid-template-columns: repeat(2, 1fr); } }
+@media (min-width: 900px) { .blog-grid { grid-template-columns: repeat(3, 1fr); } }
+@media (min-width: 1100px) { .blog-grid { grid-template-columns: repeat(4, 1fr); } }
+
+.blog-card {
+ background: var(--white); border-radius: var(--radius-md); border: 1.5px solid var(--gray-200);
+ overflow: hidden; display: flex; flex-direction: column;
+ transition: box-shadow var(--transition), transform var(--transition), border-color var(--transition);
+ animation: cardIn 0.35s ease both;
+}
+.blog-card:hover { box-shadow: 0 8px 28px rgba(0,0,0,0.10); transform: translateY(-3px); border-color: var(--mint); }
+@keyframes cardIn { from { opacity: 0; transform: translateY(12px); } to { opacity: 1; transform: translateY(0); } }
+
+.blog-card-stripe { height: 4px; flex-shrink: 0; }
+.blog-card[data-status="published"] .blog-card-stripe { background: var(--deep); }
+.blog-card[data-status="draft"] .blog-card-stripe { background: var(--orange); }
+.blog-card[data-status="idea"] .blog-card-stripe { background: var(--gray-200); }
+
+.blog-card-body { padding: var(--space-md); flex: 1; display: flex; flex-direction: column; gap: 0.6em; }
+.blog-card-cat { font-family: var(--font-display); font-size: 0.68rem; font-weight: 700; letter-spacing: 0.15em; text-transform: uppercase; color: var(--color-primary); }
+.blog-card-title { font-family: var(--font-display); font-weight: 700; font-size: 1.05rem; line-height: 1.2; color: var(--black); flex: 1; }
+.blog-card-tags { display: flex; flex-wrap: wrap; gap: 0.3em; margin-top: auto; }
+.blog-card-status {
+ display: inline-flex; align-items: center; gap: 0.35em;
+ font-family: var(--font-display); font-size: 0.65rem; font-weight: 700; letter-spacing: 0.1em; text-transform: uppercase; color: var(--gray-500);
+ margin-top: 0.5em; padding-top: 0.5em; border-top: 1px solid var(--gray-200);
+}
+.blog-card-status::before { content: ''; width: 7px; height: 7px; border-radius: 50%; flex-shrink: 0; }
+.blog-card[data-status="published"] .blog-card-status::before { background: var(--deep); }
+.blog-card[data-status="draft"] .blog-card-status::before { background: var(--orange); }
+.blog-card[data-status="idea"] .blog-card-status::before { background: var(--gray-200); border: 1px solid var(--gray-500); }
+.blog-card-link { display: block; text-decoration: none; color: inherit; }
+
+.no-results { text-align: center; padding: var(--space-2xl) var(--space-md); font-family: var(--font-display); font-size: 1.1rem; color: var(--gray-500); }
+.no-results button { color: var(--color-primary); font-family: inherit; font-size: inherit; font-weight: 700; text-decoration: underline; margin-left: 0.5em; }
+
+/* =========================================================
+ POST HERO (Einzelartikel)
+ ========================================================= */
+.post-hero { background: linear-gradient(135deg, var(--black) 0%, #0a1e22 100%); padding-top: calc(var(--header-h) + var(--space-xl)); border-bottom: 2px solid var(--color-primary); }
+.post-hero-inner { padding-bottom: var(--space-lg); }
+
+.breadcrumb { display: flex; align-items: center; flex-wrap: wrap; gap: 0.35em; font-size: 0.8rem; color: rgba(255,255,255,0.4); margin-bottom: var(--space-md); font-family: var(--font-display); font-weight: 600; text-transform: uppercase; letter-spacing: 0.05em; }
+.breadcrumb a { color: rgba(255,255,255,0.5); transition: color var(--transition); }
+.breadcrumb a:hover { color: var(--mint); }
+.breadcrumb span[aria-current] { color: var(--mint); }
+
+.post-meta { display: flex; align-items: center; flex-wrap: wrap; gap: 0.4em; margin-bottom: var(--space-sm); }
+.post-cat { font-family: var(--font-display); font-weight: 700; font-size: 0.72rem; letter-spacing: 0.15em; text-transform: uppercase; background: var(--color-primary); color: var(--white); padding: 0.2em 0.6em; border-radius: 3px; }
+.post-dot { color: rgba(255,255,255,0.3); }
+.post-date, .post-readtime { color: rgba(255,255,255,0.5); font-size: 0.82rem; }
+.post-title { font-family: var(--font-display); font-weight: 800; font-size: clamp(2rem, 6vw, 3.8rem); line-height: 1.05; color: var(--white); margin-bottom: var(--space-sm); }
+.post-intro { font-size: 1.1rem; color: rgba(255,255,255,0.65); max-width: 680px; line-height: 1.55; margin-bottom: var(--space-md); }
+.post-tags { display: flex; flex-wrap: wrap; gap: 0.4em; }
+.post-hero-image { width: 100%; overflow: hidden; }
+.post-hero-img-placeholder { width: 100%; height: 220px; background: linear-gradient(135deg, rgba(0,121,138,0.25), rgba(77,133,145,0.15)); display: flex; align-items: center; justify-content: center; font-family: var(--font-display); font-size: 0.75rem; letter-spacing: 0.15em; text-transform: uppercase; color: rgba(255,255,255,0.25); border-top: 1px solid rgba(255,255,255,0.07); }
+
+/* =========================================================
+ POST LAYOUT
+ ========================================================= */
+.post-layout { display: grid; grid-template-columns: 1fr; gap: var(--space-xl); padding-block: var(--space-xl); align-items: start; }
+@media (min-width: 900px) { .post-layout { grid-template-columns: 220px 1fr; } }
+
+.post-toc { display: none; }
+@media (min-width: 900px) { .post-toc { display: block; position: sticky; top: calc(var(--header-h) + 1.5rem); } }
+.toc-inner { background: var(--ice); border-radius: var(--radius-md); padding: var(--space-md); border-left: 3px solid var(--teal); }
+.toc-title { font-family: var(--font-display); font-weight: 800; font-size: 0.75rem; letter-spacing: 0.2em; text-transform: uppercase; color: var(--teal); margin-bottom: 0.8em; }
+.toc-list li { padding: 0.3em 0; border-bottom: 1px solid rgba(0,0,0,0.06); }
+.toc-list li:last-child { border-bottom: none; }
+.toc-list a { font-size: 0.85rem; color: var(--gray-500); transition: color var(--transition); line-height: 1.4; display: block; }
+.toc-list a:hover, .toc-list a.active { color: var(--deep); }
+
+.post-body { max-width: 720px; font-size: 1.02rem; line-height: 1.75; color: var(--gray-800); }
+.post-body h2 { font-family: var(--font-display); font-weight: 800; font-size: clamp(1.5rem, 3vw, 2rem); color: var(--black); margin: 2em 0 0.5em; padding-top: 0.5em; border-top: 2px solid var(--ice); }
+.post-body h2:first-child { margin-top: 0; border-top: none; }
+.post-body h3 { font-family: var(--font-display); font-weight: 700; font-size: 1.2rem; color: var(--teal); margin: 1.5em 0 0.4em; text-transform: uppercase; letter-spacing: 0.05em; }
+.post-body p { margin-bottom: 1.2em; }
+.post-body strong { font-weight: 600; color: var(--black); }
+.post-body a { color: var(--deep); text-decoration: underline; text-underline-offset: 3px; }
+.post-body a:hover { color: var(--color-primary); }
+.post-body ul, .post-body ol { padding-left: 1.5em; margin-bottom: 1.2em; }
+.post-body li { margin-bottom: 0.4em; }
+
+.callout { display: flex; gap: var(--space-sm); padding: var(--space-md); border-radius: var(--radius-md); margin: var(--space-lg) 0; }
+.callout-tip { background: #e8f7f8; border-left: 4px solid var(--teal); }
+.callout-warning { background: #fff8e8; border-left: 4px solid var(--yellow); }
+.callout-icon { font-size: 1.2rem; flex-shrink: 0; }
+.callout-text { font-size: 0.95rem; line-height: 1.55; }
+.callout-text strong { color: var(--deep); }
+
+.table-wrap { overflow-x: auto; margin: var(--space-lg) 0; border-radius: var(--radius-md); border: 1px solid var(--gray-200); }
+table { width: 100%; border-collapse: collapse; font-size: 0.92rem; }
+th { background: var(--black); color: var(--white); font-family: var(--font-display); font-weight: 700; font-size: 0.75rem; letter-spacing: 0.1em; text-transform: uppercase; padding: 0.75em 1em; text-align: left; }
+td { padding: 0.65em 1em; border-bottom: 1px solid var(--gray-200); color: var(--gray-800); }
+tr:last-child td { border-bottom: none; }
+tr:nth-child(even) td { background: var(--gray-100); }
+
+.post-quote { border-left: 4px solid var(--color-primary); margin: var(--space-lg) 0; padding: var(--space-md) var(--space-md) var(--space-md) var(--space-lg); background: var(--ice); border-radius: 0 var(--radius-md) var(--radius-md) 0; }
+.post-quote p { font-family: var(--font-display); font-size: 1.2rem; font-weight: 600; line-height: 1.4; color: var(--black); font-style: italic; margin: 0; }
+
+.post-footer-bar { padding-block: var(--space-lg); border-top: 1px solid var(--gray-200); border-bottom: 1px solid var(--gray-200); margin-bottom: var(--space-xl); display: flex; align-items: center; flex-wrap: wrap; gap: var(--space-sm); }
+.post-footer-label { font-family: var(--font-display); font-size: 0.72rem; font-weight: 700; letter-spacing: 0.12em; text-transform: uppercase; color: var(--gray-500); margin-right: 0.25em; }
+
+.related-posts { padding-bottom: var(--space-2xl); }
+.related-grid { display: grid; grid-template-columns: 1fr; gap: var(--space-md); margin-top: var(--space-lg); }
+@media (min-width: 600px) { .related-grid { grid-template-columns: repeat(2, 1fr); } }
+@media (min-width: 900px) { .related-grid { grid-template-columns: repeat(3, 1fr); } }
+
+.post-cta { background: var(--black); padding: var(--space-xl) var(--space-md); text-align: center; }
+.post-cta-label { font-family: var(--font-display); font-size: 0.75rem; letter-spacing: 0.2em; text-transform: uppercase; color: var(--mint); margin-bottom: 0.4em; }
+.post-cta h2 { font-family: var(--font-display); font-weight: 800; font-size: clamp(1.8rem, 5vw, 3rem); color: var(--white); margin-bottom: var(--space-md); }
+
+/* =========================================================
+ ACCESSIBILITY & UTILS
+ ========================================================= */
+:focus-visible { outline: 3px solid var(--color-accent); outline-offset: 3px; border-radius: 2px; }
+.sr-only, .visually-hidden { position: absolute !important; width: 1px !important; height: 1px !important; overflow: hidden !important; clip: rect(0,0,0,0) !important; white-space: nowrap !important; }
+@media (prefers-reduced-motion: reduce) { *, *::before, *::after { animation-duration: 0.01ms !important; transition-duration: 0.01ms !important; } .scroll-line { animation: none; } }
--- /dev/null
+<#-- ============================================================
+ footer.ftlh – Site-Footer + schließende Tags
+ ============================================================ -->
+
+ <footer class="site-footer">
+ <div class="footer-inner container">
+ <div class="footer-brand">
+ <a href="${site.contextPath}/" class="site-logo footer-logo">
+ <span class="logo-tri">triathlon</span><span class="logo-dash">-</span><span class="logo-coaching">coaching</span><span class="logo-dot">.</span><span class="logo-com">com</span>
+ </a>
+ <p>Triathlon-Coaching aus Leidenschaft.<br/>DTU-C-Trainer seit 2018.</p>
+ </div>
+ <nav class="footer-nav" aria-label="Footer Navigation">
+ <ul>
+ <li><a href="${site.contextPath}/kontakt">Kontakt</a></li>
+ <li><a href="${site.contextPath}/impressum">Impressum</a></li>
+ <li><a href="${site.contextPath}/datenschutz">Datenschutz</a></li>
+ <li><a href="${site.contextPath}/agb">AGB</a></li>
+ </ul>
+ </nav>
+ </div>
+ <div class="footer-bottom">
+ <p>© ${site.copyright}</p>
+ </div>
+ </footer>
+
+ <script src="${site.contextPath}/main.js"></script>
+ <#if extraJs??>
+ <#-- blog-data.js immer vor blog.js laden -->
+ <script src="${site.contextPath}/blog-data.js"></script>
+ <#list extraJs as jsFile>
+ <script src="${site.contextPath}/${jsFile}"></script>
+ </#list>
+ </#if>
+
+</body>
+</html>
--- /dev/null
+<!DOCTYPE html>
+<html lang="${site.language}">
+<head>
+ <meta charset="UTF-8"/>
+ <meta name="viewport" content="width=device-width, initial-scale=1.0"/>
+
+ <#-- ── Title ───────────────────────────────────────────── -->
+ <title><#if page.metaTitle()??>${page.metaTitle()} – ${site.name}<#else>${page.title()} – ${site.name}</#if></title>
+
+ <#-- ── Meta Description ────────────────────────────────── -->
+ <#assign metaDesc = page.metaDesc()!page.excerpt()!''>
+ <#if metaDesc?has_content>
+ <meta name="description" content="${metaDesc?replace('"', '"')}"/>
+ </#if>
+
+ <#-- ── Canonical ───────────────────────────────────────── -->
+ <#assign canonicalUrl = page.canonicalUrl()!
+ (page.slug() == 'index')?then(site.baseUrl + '/', site.baseUrl + '/' + page.slug() + '/')>
+ <link rel="canonical" href="${canonicalUrl}"/>
+
+ <#-- ── Open Graph ──────────────────────────────────────── -->
+ <meta property="og:type" content="${(page.template() == 'article')?then('article', 'website')}"/>
+ <meta property="og:title" content="${(page.metaTitle()!page.title())?replace('"', '"')}"/>
+ <meta property="og:url" content="${canonicalUrl}"/>
+ <meta property="og:site_name" content="${site.name}"/>
+ <meta property="og:locale" content="de_DE"/>
+ <#if metaDesc?has_content>
+ <meta property="og:description" content="${metaDesc?replace('"', '"')}"/>
+ </#if>
+ <#if page.heroMediaPath()??>
+ <meta property="og:image" content="${site.baseUrl}/${page.heroMediaPath()}"/>
+ <#elseif page.cardMediaPath()??>
+ <meta property="og:image" content="${site.baseUrl}/${page.cardMediaPath()}"/>
+ </#if>
+ <#if page.template() == 'article'>
+ <#if page.publishAtIso()?has_content>
+ <meta property="article:published_time" content="${page.publishAtIso()}"/>
+ </#if>
+ <#if page.authorName()??>
+ <meta property="article:author" content="${page.authorName()}"/>
+ </#if>
+ <#list page.tags() as tag>
+ <meta property="article:tag" content="${tag.label()}"/>
+ </#list>
+ </#if>
+
+ <#-- ── Twitter Card ────────────────────────────────────── -->
+ <meta name="twitter:card" content="summary_large_image"/>
+ <meta name="twitter:title" content="${(page.metaTitle()!page.title())?replace('"', '"')}"/>
+ <#if metaDesc?has_content>
+ <meta name="twitter:description" content="${metaDesc?replace('"', '"')}"/>
+ </#if>
+
+ <#-- ── JSON-LD ──────────────────────────────────────────── -->
+ <#if page.template() == 'article'>
+ <script type="application/ld+json">
+ {
+ "@context": "https://schema.org",
+ "@type": "BlogPosting",
+ "headline": "${page.title()?js_string}",
+ "description": "${metaDesc?js_string}",
+ "url": "${canonicalUrl}",
+ <#if page.publishAtIso()?has_content>
+ "datePublished": "${page.publishAtIso()}",
+ </#if>
+ <#if page.heroMediaPath()??>
+ "image": "${site.baseUrl}/${page.heroMediaPath()}",
+ </#if>
+ "author": {
+ "@type": "Person",
+ "name": "${page.authorName()!'triathlon-coaching.com'}"
+ },
+ "publisher": {
+ "@type": "Organization",
+ "name": "${site.name}",
+ "url": "${site.baseUrl}"
+ }
+ }
+ </script>
+ <#elseif page.template() == 'home'>
+ <script type="application/ld+json">
+ {
+ "@context": "https://schema.org",
+ "@type": "Person",
+ "name": "${page.authorName()!'triathlon-coaching.com'}",
+ "url": "${site.baseUrl}",
+ "jobTitle": "Triathlon-Trainer",
+ "description": "${metaDesc?js_string}",
+ "sameAs": []
+ }
+ </script>
+ </#if>
+
+ <#-- ── Styles ───────────────────────────────────────────── -->
+ <link rel="stylesheet" href="${site.contextPath}/style.css"/>
+ <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=Barlow+Condensed:wght@400;600;700;800&family=Barlow:ital,wght@0,400;0,500;0,600;1,400&display=swap" rel="stylesheet"/>
+</head>
--- /dev/null
+<#-- ============================================================
+ header.ftlh – Site-Header mit Navigation
+ Erwartet: nav (List<NavItem>), page (PageView), site
+ ============================================================ -->
+<#include "../macros/nav.ftlh">
+<body<#if bodyCssClass??> class="${bodyCssClass}"</#if>>
+
+ <header class="site-header">
+ <div class="header-inner">
+ <a href="${site.contextPath}/" class="site-logo">
+ <span class="logo-tri">triathlon</span><span class="logo-dash">-</span><span class="logo-coaching">coaching</span><span class="logo-dot">.</span><span class="logo-com">com</span>
+ </a>
+ <button class="nav-toggle" aria-label="Menü öffnen" aria-expanded="false">
+ <span></span><span></span><span></span>
+ </button>
+ <nav class="main-nav" aria-label="Hauptnavigation">
+ <@renderNav items=nav currentSlug=page.slug()/>
+ </nav>
+ </div>
+ </header>
--- /dev/null
+<#-- ============================================================
+ card.ftlh – Blog-Card Makro
+ Parameter:
+ post – PageView oder BlogCard
+ delay – CSS animation-delay in ms
+ ============================================================ -->
+
+<#macro blogCard post delay=0>
+<article class="blog-card" role="listitem" style="animation-delay:${delay}ms">
+ <div class="blog-card-stripe"></div>
+ <#if post.cardMediaPath()??>
+ <a href="${site.contextPath}/${post.slug()}" class="blog-card-image-link" tabindex="-1" aria-hidden="true">
+ <img src="${post.cardMediaPath()}"
+ alt="${post.cardAltText()!''}"
+ class="blog-card-img"
+ loading="lazy"/>
+ </a>
+ </#if>
+ <div class="blog-card-body">
+ <#if post.sectionLabel()??>
+ <span class="blog-card-cat">${post.sectionLabel()}</span>
+ </#if>
+ <a href="${site.contextPath}/${post.slug()}" class="blog-card-link">
+ <h2 class="blog-card-title">${post.title()}</h2>
+ </a>
+ <#if post.excerpt()??>
+ <p class="blog-card-excerpt">${post.excerpt()}</p>
+ </#if>
+ <#if post.tags()?has_content>
+ <div class="blog-card-tags">
+ <#list post.tags() as tag>
+ <a href="${site.contextPath}/blog?tag=${tag.slug()}" class="tag" data-tag="${tag.slug()}">${tag.label()}</a>
+ </#list>
+ </div>
+ </#if>
+ <#if post.publishAtIso()?has_content>
+ <div class="blog-card-meta">
+ <time datetime="${post.publishAtIso()}">${post.publishAtFormatted()}</time>
+ </div>
+ </#if>
+ </div>
+</article>
+</#macro>
--- /dev/null
+<#-- ============================================================
+ nav.ftlh – Navigations-Makro
+ Variablen: nav (List<NavItem>), navTags (List<Tag>), site
+ navTags: vom Generator berechnete Top-Tags für Blog-Dropdown
+ ============================================================ -->
+
+<#macro renderNav items currentSlug>
+<ul class="nav-list">
+ <#list items as item>
+ <#assign isActive = (item.url() == "/" + currentSlug || item.url() == "/" + currentSlug + "/")>
+ <#assign isBlog = (item.url() == "/blog")>
+ <#-- Blog-Eintrag: Children aus navTags statt DB -->
+ <#assign hasChildren = isBlog?then(navTags?has_content, item.children()?has_content)>
+ <li class="nav-item<#if isActive> active</#if><#if hasChildren> has-dropdown</#if>">
+ <a href="${item.url()?starts_with('http')?then(item.url(), site.contextPath + item.url())}"<#if item.openNewTab()> target="_blank" rel="noopener"</#if>>${item.label()}</a>
+ <#if hasChildren>
+ <button class="dropdown-toggle" aria-label="Untermenü öffnen">▼</button>
+ <ul class="dropdown">
+ <#if isBlog>
+ <#-- Dynamische Tag-Links aus navTags -->
+ <#list navTags as tag>
+ <li><a href="${site.contextPath}/blog?tag=${tag.slug()}">${tag.label()}</a></li>
+ </#list>
+ <#else>
+ <#-- Normale DB-Children -->
+ <#list item.children() as child>
+ <#assign childHasChildren = child.children()?has_content>
+ <li<#if childHasChildren> class="has-dropdown-2"</#if>>
+ <a href="${child.url()?starts_with('http')?then(child.url(), site.contextPath + child.url())}"<#if child.openNewTab()> target="_blank" rel="noopener"</#if>>${child.label()}</a>
+ <#if childHasChildren>
+ <button class="dropdown-toggle">▼</button>
+ <ul class="dropdown-2">
+ <#list child.children() as grandchild>
+ <li><a href="${grandchild.url()?starts_with('http')?then(grandchild.url(), site.contextPath + grandchild.url())}"<#if grandchild.openNewTab()> target="_blank" rel="noopener"</#if>>${grandchild.label()}</a></li>
+ </#list>
+ </ul>
+ </#if>
+ </li>
+ </#list>
+ </#if>
+ </ul>
+ </#if>
+ </li>
+ </#list>
+</ul>
+</#macro>
--- /dev/null
+<#-- ============================================================
+ article.ftlh – Einzelner Blog-Artikel
+ ============================================================ -->
+<#include "../layouts/head.ftlh">
+<#include "../layouts/header.ftlh">
+<#include "../macros/card.ftlh">
+
+ <!-- ===== ARTICLE HERO ===== -->
+ <section class="page-hero article-hero">
+ <div class="page-hero-inner container">
+ <#if page.sectionLabel()??>
+ <div class="section-label">${page.sectionLabel()}</div>
+ </#if>
+ <h1 class="page-hero-title">${page.title()}</h1>
+ <#if page.subtitle()??>
+ <p class="page-hero-sub">${page.subtitle()}</p>
+ </#if>
+ <div class="article-meta">
+ <#if page.publishAtIso()?has_content>
+ <time datetime="${page.publishAtIso()}">${page.publishAtFormatted()}</time>
+ </#if>
+ <#if page.authorName()??>
+ <span class="article-author">von ${page.authorName()}</span>
+ </#if>
+ <#if page.tags()?has_content>
+ <div class="article-tags">
+ <#list page.tags() as tag>
+ <a href="${site.contextPath}/blog?tag=${tag.slug()}" class="tag">${tag.label()}</a>
+ </#list>
+ </div>
+ </#if>
+ </div>
+ </div>
+ <#if page.heroMediaPath()??>
+ <div class="article-hero-image">
+ <img src="${page.heroMediaPath()}" alt="${page.heroAltText()!''}" loading="eager"/>
+ </div>
+ </#if>
+ </section>
+
+ <!-- ===== ARTICLE LAYOUT ===== -->
+ <main id="content" class="article-main container">
+ <div class="article-layout">
+
+ <!-- Inhaltsverzeichnis (JS befüllt) -->
+ <aside class="article-toc" aria-label="Inhaltsverzeichnis">
+ <div class="toc-inner">
+ <p class="toc-title">Inhalt</p>
+ <ol id="toc-list" class="toc-list"></ol>
+ </div>
+ </aside>
+
+ <!-- Artikel-Body -->
+ <article class="article-body" id="post-body">
+ ${bodyHtml?no_esc}
+ </article>
+
+ </div>
+ </main>
+
+ <!-- ===== ÄHNLICHE ARTIKEL ===== -->
+ <#if related?has_content>
+ <section class="related-section">
+ <div class="related-inner container">
+ <div class="section-label">Ähnliche Artikel</div>
+ <div id="related-grid" class="blog-grid" role="list">
+ <#list related as post>
+ <@blogCard post=post delay=post?index * 60/>
+ </#list>
+ </div>
+ </div>
+ </section>
+ </#if>
+
+<#assign extraJs = ["blog.js"]/>
+<#include "../layouts/footer.ftlh">
--- /dev/null
+<#-- ============================================================
+ blog-grid.ftlh – Blog-Übersicht + category-locked Seiten
+ lockedCat == null → voller Blog: Suche, Pills, Tag-Cloud
+ lockedCat gesetzt → nur Cards, kein Filter-Kram
+ ============================================================ -->
+<#include "../layouts/head.ftlh">
+<#include "../layouts/header.ftlh">
+<#include "../macros/card.ftlh">
+
+ <!-- ===== PAGE HERO ===== -->
+ <section class="page-hero">
+ <div class="page-hero-inner container">
+ <#if page.sectionLabel()??>
+ <div class="section-label">${page.sectionLabel()}</div>
+ </#if>
+ <h1 class="page-hero-title">${page.title()}</h1>
+ <#if page.subtitle()??>
+ <p class="page-hero-sub">${page.subtitle()}</p>
+ </#if>
+ </div>
+ <#-- Suche nur auf dem vollen Blog, keine Artikel-Anzahl -->
+ <#if !lockedCat?has_content>
+ <div class="page-hero-bar">
+ <div class="filter-search-wrap">
+ <svg class="filter-search-icon" viewBox="0 0 20 20" fill="none" aria-hidden="true">
+ <circle cx="9" cy="9" r="6" stroke="currentColor" stroke-width="1.8"/>
+ <path d="M13.5 13.5L17 17" stroke="currentColor" stroke-width="1.8" stroke-linecap="round"/>
+ </svg>
+ <input type="search" id="blog-search" class="filter-search"
+ placeholder="Artikel suchen…" aria-label="Artikel suchen" autocomplete="off"/>
+ </div>
+ </div>
+ </#if>
+ </section>
+
+ <!-- ===== FILTER BAR – nur auf dem vollen Blog ===== -->
+ <#if !lockedCat?has_content>
+ <div class="filter-bar" id="filter-bar" role="search" aria-label="Artikel filtern">
+ <div class="filter-bar-inner container">
+ <#if allTags?has_content>
+ <div class="filter-tags-wrap">
+ <div id="tag-cloud" class="tag-cloud">
+ <#list allTags as tag>
+ <button class="tag" data-tag="${tag.slug()}">${tag.label()}</button>
+ </#list>
+ </div>
+ </div>
+ </#if>
+ <div class="filter-meta">
+ <button id="filter-reset" class="filter-reset" hidden>Filter zurücksetzen</button>
+ </div>
+ </div>
+ </div>
+ </#if>
+
+ <!-- ===== BLOG GRID ===== -->
+ <main id="content" class="blog-main container">
+ <div id="blog-grid" class="blog-grid" role="list"
+ data-locked-cat="${lockedCat!''}">
+ <#list cards as card>
+ <@blogCard post=card delay=card?index * 30/>
+ </#list>
+ </div>
+ <p id="no-results" class="no-results" hidden>
+ Keine Artikel gefunden.
+ <button id="no-results-reset">Filter zurücksetzen</button>
+ </p>
+ </main>
+
+<#assign extraJs = ["blog.js"]/>
+<#include "../layouts/footer.ftlh">
--- /dev/null
+<#-- ============================================================
+ category-grid.ftlh – Gefilterte Blog-Ansicht
+ Wie blog-grid, aber:
+ - Keine Kategorie-Pills
+ - Keine Tag-Cloud
+ - Suche bleibt erhalten
+ - JS filtert automatisch auf lockedCat
+ Für: coaching.html, personal-coaching.html
+ ============================================================ -->
+<#include "../layouts/head.ftlh">
+<#include "../layouts/header.ftlh">
+<#include "../macros/card.ftlh">
+
+ <!-- ===== PAGE HERO ===== -->
+ <section class="page-hero">
+ <div class="page-hero-inner container">
+ <#if page.sectionLabel()??>
+ <div class="section-label">${page.sectionLabel()}</div>
+ </#if>
+ <h1 class="page-hero-title">${page.title()}</h1>
+ <#if page.subtitle()??>
+ <p class="page-hero-sub">${page.subtitle()}</p>
+ </#if>
+ </div>
+ </section>
+
+ <!-- ===== BLOG GRID ===== -->
+ <main id="content" class="blog-main container">
+ <div id="blog-grid" class="blog-grid" role="list"
+ data-locked-cat="${lockedCat!''}">
+ <#list cards as card>
+ <@blogCard post=card delay=card?index * 30/>
+ </#list>
+ </div>
+ <p id="no-results" class="no-results" hidden>
+ Keine Artikel gefunden.
+ <button id="no-results-reset">Filter zurücksetzen</button>
+ </p>
+ </main>
+
+<#assign extraJs = ["blog.js"]/>
+<#include "../layouts/footer.ftlh">
--- /dev/null
+<#-- ============================================================
+ contact.ftlh – Kontaktseite
+ Layouts: head.ftlh → header.ftlh → [content] → footer.ftlh
+ ============================================================ -->
+<#include "../layouts/head.ftlh">
+<#include "../layouts/header.ftlh">
+
+ <!-- ===== PAGE HERO ===== -->
+ <section class="page-hero">
+ <div class="page-hero-inner container">
+ <#if page.sectionLabel()??>
+ <div class="section-label">${page.sectionLabel()}</div>
+ </#if>
+ <h1 class="page-hero-title">${page.title()}</h1>
+ <#if page.subtitle()??>
+ <p class="page-hero-sub">${page.subtitle()}</p>
+ </#if>
+ </div>
+ </section>
+
+ <!-- ===== INTRO TEXT (aus Markdown-Body) ===== -->
+ <#if bodyHtml?has_content>
+ <section class="contact-intro container">
+ ${bodyHtml}
+ </section>
+ </#if>
+
+ <!-- ===== KONTAKTFORMULAR ===== -->
+ <main id="content" class="contact-main container">
+ <div class="contact-form-wrap">
+
+ <div id="form-alert" class="form-alert" role="alert" aria-live="polite" hidden></div>
+
+ <form id="contact-form" class="contact-form" novalidate>
+
+ <!-- Honeypot -->
+ <div style="display:none" aria-hidden="true">
+ <label for="hp">Dieses Feld bitte leer lassen</label>
+ <input type="text" id="hp" name="hp" tabindex="-1" autocomplete="off"/>
+ </div>
+
+ <div class="form-row form-row--half">
+ <div class="form-group">
+ <label for="name" class="form-label">Name <span class="required" aria-hidden="true">*</span></label>
+ <input type="text" id="name" name="name" class="form-input"
+ placeholder="Dein Name" required autocomplete="name" maxlength="200"/>
+ <span class="form-error" id="name-error"></span>
+ </div>
+ <div class="form-group">
+ <label for="email" class="form-label">E-Mail <span class="required" aria-hidden="true">*</span></label>
+ <input type="email" id="email" name="email" class="form-input"
+ placeholder="deine@email.de" required autocomplete="email" maxlength="200"/>
+ <span class="form-error" id="email-error"></span>
+ </div>
+ </div>
+
+ <div class="form-group">
+ <label for="betreff" class="form-label">Anliegen <span class="required" aria-hidden="true">*</span></label>
+ <select id="betreff" name="betreff" class="form-select" required>
+ <option value="" disabled selected>Bitte wählen…</option>
+ <option value="Personal Coaching">Personal Coaching</option>
+ <option value="Standard-Trainingsplan">Standard-Trainingsplan</option>
+ <option value="Trainingscamp">Trainingscamp</option>
+ <option value="Allgemeine Anfrage">Allgemeine Anfrage</option>
+ </select>
+ <span class="form-error" id="betreff-error"></span>
+ </div>
+
+ <div class="form-group">
+ <label for="nachricht" class="form-label">Nachricht <span class="required" aria-hidden="true">*</span></label>
+ <textarea id="nachricht" name="nachricht" class="form-textarea"
+ placeholder="Deine Nachricht…" required rows="6" maxlength="5000"></textarea>
+ <span class="form-error" id="nachricht-error"></span>
+ <span class="form-charcount"><span id="char-count">0</span> / 5000</span>
+ </div>
+
+ <div class="form-footer">
+ <p class="form-privacy">
+ Mit dem Absenden stimmst du der Verarbeitung deiner Daten gemäß unserer
+ <a href="/datenschutz">Datenschutzerklärung</a> zu.
+ </p>
+ <button type="submit" id="submit-btn" class="btn btn-primary">
+ <span class="btn-label">Nachricht senden</span>
+ <span class="btn-spinner" hidden aria-hidden="true"></span>
+ </button>
+ </div>
+
+ </form>
+ </div>
+ </main>
+
+<#include "../layouts/footer.ftlh">
+
+<script>
+(function () {
+ 'use strict';
+
+ const form = document.getElementById('contact-form');
+ const alertBox = document.getElementById('form-alert');
+ const submitBtn = document.getElementById('submit-btn');
+ const btnLabel = submitBtn.querySelector('.btn-label');
+ const btnSpinner = submitBtn.querySelector('.btn-spinner');
+ const charCount = document.getElementById('char-count');
+
+ document.getElementById('nachricht').addEventListener('input', function () {
+ charCount.textContent = this.value.length;
+ });
+
+ function validate() {
+ let valid = true;
+ const fields = [
+ { id: 'name', min: 2, msg: 'Bitte gib deinen Namen an (mind. 2 Zeichen).' },
+ { id: 'email', email: true, msg: 'Bitte eine gültige E-Mail-Adresse eingeben.' },
+ { id: 'betreff', min: 1, msg: 'Bitte ein Anliegen auswählen.' },
+ { id: 'nachricht', min: 10, msg: 'Die Nachricht ist zu kurz (mind. 10 Zeichen).' },
+ ];
+ fields.forEach(({ id, min, email, msg }) => {
+ const el = document.getElementById(id);
+ const err = document.getElementById(id + '-error');
+ const val = el.value.trim();
+ const ok = email ? /^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(val) : val.length >= (min || 1);
+ el.classList.toggle('form-input--error', !ok);
+ err.textContent = ok ? '' : msg;
+ if (!ok) valid = false;
+ });
+ return valid;
+ }
+
+ form.addEventListener('submit', async function (e) {
+ e.preventDefault();
+ if (!validate()) return;
+
+ submitBtn.disabled = true;
+ btnLabel.hidden = true;
+ btnSpinner.hidden = false;
+ alertBox.hidden = true;
+ alertBox.className = 'form-alert';
+
+ const payload = {
+ name: document.getElementById('name').value.trim(),
+ email: document.getElementById('email').value.trim(),
+ betreff: document.getElementById('betreff').value,
+ nachricht: document.getElementById('nachricht').value.trim(),
+ hp: document.getElementById('hp').value,
+ };
+
+ try {
+ const res = await fetch('/api/kontakt.php', {
+ method: 'POST',
+ headers: { 'Content-Type': 'application/json' },
+ body: JSON.stringify(payload),
+ });
+ const json = await res.json();
+ alertBox.textContent = json.message;
+ alertBox.classList.add(json.success ? 'form-alert--success' : 'form-alert--error');
+ alertBox.hidden = false;
+ alertBox.scrollIntoView({ behavior: 'smooth', block: 'nearest' });
+ if (json.success) { form.reset(); charCount.textContent = '0'; }
+ } catch (err) {
+ alertBox.textContent = 'Verbindungsfehler. Bitte versuche es später erneut.';
+ alertBox.classList.add('form-alert--error');
+ alertBox.hidden = false;
+ } finally {
+ submitBtn.disabled = false;
+ btnLabel.hidden = false;
+ btnSpinner.hidden = true;
+ }
+ });
+
+ ['name', 'email', 'betreff', 'nachricht'].forEach(id => {
+ document.getElementById(id).addEventListener('blur', validate);
+ });
+
+}());
+</script>
--- /dev/null
+<#-- ============================================================
+ content-page.ftlh – Allgemeine Inhaltsseite
+ Für: coaching.html, standard-plaene.html, camps.html,
+ impressum.html, datenschutz.html, agb.html usw.
+ ============================================================ -->
+<#include "../layouts/head.ftlh">
+<#include "../layouts/header.ftlh">
+
+ <!-- ===== PAGE HERO ===== -->
+ <section class="page-hero">
+ <div class="page-hero-inner container">
+ <#if page.sectionLabel()??>
+ <div class="section-label">${page.sectionLabel()}</div>
+ </#if>
+ <h1 class="page-hero-title">${page.title()}</h1>
+ <#if page.subtitle()??>
+ <p class="page-hero-sub">${page.subtitle()}</p>
+ </#if>
+ </div>
+ </section>
+
+ <!-- ===== CONTENT ===== -->
+ <main id="content" class="main-content container">
+ <#if page.heroMediaPath()??>
+ <div class="content-hero-image">
+ <img src="${page.heroMediaPath()}"
+ alt="${page.heroAltText()!''}"
+ loading="eager"/>
+ </div>
+ </#if>
+ <div class="content-body">
+ ${bodyHtml?no_esc}
+ </div>
+ </main>
+
+<#include "../layouts/footer.ftlh">
--- /dev/null
+<#-- ============================================================
+ home.ftlh – Startseite
+ bodyHtml = Intro-Text (Wer bin ich?)
+ bodySecondaryHtml = Timeline (Die ganze Wahrheit)
+ ============================================================ -->
+<#include "../layouts/head.ftlh">
+<#include "../layouts/header.ftlh">
+
+ <!-- ===== HERO ===== -->
+ <section class="home-hero">
+ <div class="home-hero-inner container">
+ <p class="home-hero-sub">Schwimmen · Radfahren · Laufen</p>
+ <h1 class="home-hero-title">${page.title()}</h1>
+ <#if page.subtitle()??>
+ <p class="home-hero-lead">${page.subtitle()}</p>
+ </#if>
+ <div class="home-hero-cta">
+ <a href="${site.contextPath}/coaching" class="btn btn-primary">Coaching entdecken</a>
+ <a href="${site.contextPath}/kontakt" class="btn btn-outline">Kontakt aufnehmen</a>
+ </div>
+ </div>
+ <div class="home-hero-scroll" aria-hidden="true">Scroll</div>
+ </section>
+
+ <!-- ===== STATS BAR ===== -->
+ <div class="stats-bar">
+ <div class="stats-bar-inner container">
+ <div class="stat"><span class="stat-value">38+</span><span class="stat-label">Jahre Ausdauersport</span></div>
+ <div class="stat"><span class="stat-value">DTU-C</span><span class="stat-label">Lizensierter Trainer</span></div>
+ <div class="stat"><span class="stat-value">800m–</span><span class="stat-label">bis Ironman-Distanz</span></div>
+ </div>
+ </div>
+
+ <main id="content" class="main-content">
+
+ <!-- ===== ÜBER MICH ===== -->
+ <section class="about-section container">
+ <div class="about-text">
+ <div class="section-label">${page.sectionLabel()!''}</div>
+ ${bodyHtml?no_esc}
+ <a href="${site.contextPath}/coaching" class="btn btn-outline-light">Mein Coaching-Angebot</a>
+ </div>
+ <div class="about-image">
+ <#if page.heroMediaPath()??>
+ <img src="${page.heroMediaPath()}"
+ alt="${page.heroAltText()!''}"
+ class="about-photo"/>
+ <#else>
+ <div class="about-photo-placeholder">
+ <span>Ihr Foto hier</span>
+ <div class="dtu-badge">DTU<br/>C-Trainer</div>
+ </div>
+ </#if>
+ </div>
+ </section>
+
+ <!-- ===== TIMELINE ===== -->
+ <#if bodySecondaryHtml?has_content>
+ <section class="timeline-section">
+ <div class="timeline-inner container">
+ <div class="section-label">Mein Weg</div>
+ <h2 class="timeline-title">Die ganze Wahrheit</h2>
+ <div class="timeline">
+ <#-- Generator rendert ## JAHR – Titel als h2, Text als p.
+ CSS wandelt h2+p Paare in Timeline-Items um. -->
+ ${bodySecondaryHtml?no_esc}
+ </div>
+ </div>
+ </section>
+ </#if>
+
+ <!-- ===== CTA ===== -->
+ <section class="cta-section">
+ <div class="cta-inner container">
+ <h2 class="cta-title">Bereit für dein nächstes Rennen?</h2>
+ <p>Ob Personal Coaching oder Standard-Plan – ich finde das richtige Angebot für dein Ziel.</p>
+ <div class="cta-buttons">
+ <a href="${site.contextPath}/coaching" class="btn btn-primary">Coaching-Angebote</a>
+ <a href="${site.contextPath}/kontakt" class="btn btn-outline">Kontakt</a>
+ </div>
+ </div>
+ </section>
+
+ </main>
+
+<#include "../layouts/footer.ftlh">
--- /dev/null
+<#-- ============================================================
+ legal.ftlh – Rechtliche Seiten
+ Für: Impressum, Datenschutz, AGB
+ Schlicht, kein Hero-Bild, kein Schnickschnack.
+ ============================================================ -->
+<#include "../layouts/head.ftlh">
+<#include "../layouts/header.ftlh">
+
+ <!-- ===== PAGE HERO ===== -->
+ <section class="page-hero page-hero--plain">
+ <div class="page-hero-inner container">
+ <h1 class="page-hero-title">${page.title()}</h1>
+ <#if page.subtitle()??>
+ <p class="page-hero-sub">${page.subtitle()}</p>
+ </#if>
+ </div>
+ </section>
+
+ <!-- ===== CONTENT ===== -->
+ <main id="content" class="legal-main container">
+ <div class="legal-body">
+ ${bodyHtml?no_esc}
+ </div>
+ </main>
+
+<#include "../layouts/footer.ftlh">
--- /dev/null
+<#-- ============================================================
+ tool-grid.ftlh – Tools & more
+ Quelle: tools.html
+
+ Variablen:
+ page – PageView
+ bodyHtml – Markdown mit Tool-Beschreibungen
+ tools – List<ToolCard> (optional, alternativ aus bodyHtml)
+ ============================================================ -->
+<#include "../layouts/head.ftlh">
+<#include "../layouts/header.ftlh">
+
+ <!-- ===== PAGE HERO ===== -->
+ <section class="page-hero">
+ <div class="page-hero-inner container">
+ <#if page.sectionLabel()??>
+ <div class="section-label">${page.sectionLabel()}</div>
+ </#if>
+ <h1 class="page-hero-title">${page.title()}</h1>
+ <#if page.subtitle()??>
+ <p class="page-hero-sub">${page.subtitle()}</p>
+ </#if>
+ </div>
+ </section>
+
+ <!-- ===== TOOLS GRID ===== -->
+ <main id="content" class="main-content">
+ <div class="tools-grid container">
+
+ <!-- Tool 1: Schwimmtraining -->
+ <a href="https://swim.triathlon-coaching.com" class="tool-card" target="_blank" rel="noopener">
+ <div class="tool-card-icon" aria-hidden="true">
+ <svg viewBox="0 0 48 48" fill="none" xmlns="http://www.w3.org/2000/svg">
+ <path d="M6 30c3 0 5-2 8-2s5 2 8 2 5-2 8-2 5 2 8 2" stroke="currentColor" stroke-width="2.5" stroke-linecap="round"/>
+ <path d="M6 36c3 0 5-2 8-2s5 2 8 2 5-2 8-2 5 2 8 2" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" opacity=".5"/>
+ <circle cx="24" cy="16" r="4" stroke="currentColor" stroke-width="2.5"/>
+ <path d="M24 20v6M18 24l6 2 6-2" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round"/>
+ </svg>
+ </div>
+ <div class="tool-card-body">
+ <div class="tool-card-domain">swim.triathlon-coaching.com</div>
+ <h2 class="tool-card-title">Schwimmtraining & -pläne</h2>
+ <p class="tool-card-desc">Schwimmen ist für viele Triathleten die ungeliebte Disziplin – oft weil das Training zu wenig strukturiert ist. Hier gibt es Trainingspläne, Technik-Einheiten und interaktive Werkzeuge speziell für den Triathlonschwimmer: von der ersten Bahnlänge bis zum Freiwasserstart in Roth.</p>
+ <span class="tool-card-cta">Zur Plattform <span aria-hidden="true">→</span></span>
+ </div>
+ </a>
+
+ <!-- Tool 2: Road to Kona -->
+ <a href="https://roadtokona.triathlon-coaching.com" class="tool-card" target="_blank" rel="noopener">
+ <div class="tool-card-icon" aria-hidden="true">
+ <svg viewBox="0 0 48 48" fill="none" xmlns="http://www.w3.org/2000/svg">
+ <path d="M24 6l2.5 7.5H34l-6.5 4.5 2.5 7.5L24 21l-6 4.5 2.5-7.5L14 13.5h7.5L24 6z" stroke="currentColor" stroke-width="2.5" stroke-linejoin="round"/>
+ <path d="M16 36c0-4.4 3.6-8 8-8s8 3.6 8 8" stroke="currentColor" stroke-width="2.5" stroke-linecap="round"/>
+ <path d="M12 42h24" stroke="currentColor" stroke-width="2.5" stroke-linecap="round"/>
+ </svg>
+ </div>
+ <div class="tool-card-body">
+ <div class="tool-card-domain">roadtokona.triathlon-coaching.com</div>
+ <h2 class="tool-card-title">#roadtokona</h2>
+ <p class="tool-card-desc">Hawaii. Der Ironman World Championship. Das große Ziel vieler Langdistanzathleten. Diese Plattform begleitet den Weg dorthin – mit Qualifikationsrechnern, Saisonplanung, Renndaten und allem, was es braucht, um die schwarze Lavaküste nicht nur zu träumen.</p>
+ <span class="tool-card-cta">Zur Plattform <span aria-hidden="true">→</span></span>
+ </div>
+ </a>
+
+ </div>
+ </main>
+
+<#include "../layouts/footer.ftlh">
--- /dev/null
+<!DOCTYPE html>
+<html lang="de">
+<head>
+ <meta charset="UTF-8" />
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
+ <title>triathlon-coaching.com – Über mich</title>
+ <link rel="stylesheet" href="style.css" />
+ <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=Barlow+Condensed:wght@400;600;700;800&family=Barlow:ital,wght@0,400;0,500;0,600;1,400&display=swap" rel="stylesheet" />
+</head>
+<body>
+
+ <!-- ===== HEADER / NAV ===== -->
+ <header class="site-header">
+ <div class="header-inner">
+ <a href="index.html" class="site-logo">
+ <span class="logo-tri">triathlon</span><span class="logo-dash">-</span><span class="logo-coaching">coaching</span><span class="logo-dot">.</span><span class="logo-com">com</span>
+ </a>
+
+ <button class="nav-toggle" aria-label="Menü öffnen" aria-expanded="false">
+ <span></span><span></span><span></span>
+ </button>
+
+ <nav class="main-nav" aria-label="Hauptnavigation">
+ <ul class="nav-list">
+ <li class="nav-item active"><a href="index.html">Über mich</a></li>
+
+ <li class="nav-item has-dropdown">
+ <a href="coaching.html">Coaching</a>
+ <button class="dropdown-toggle" aria-label="Untermenü öffnen">▼</button>
+ <ul class="dropdown">
+ <li><a href="personal-coaching.html">Personal Coaching</a></li>
+ <li class="has-dropdown-2">
+ <a href="standard-plaene.html">Standard-Pläne</a>
+ <button class="dropdown-toggle" aria-label="Untermenü öffnen">►</button>
+ <ul class="dropdown-2">
+ <li><a href="langdistanz.html">Langdistanz & Ironman</a></li>
+ <li><a href="mitteldistanz.html">Mitteldistanz & Ironman 70.3</a></li>
+ <li><a href="kurzdistanz.html">Kurz- & olympische Distanz</a></li>
+ </ul>
+ </li>
+ </ul>
+ </li>
+
+ <li class="nav-item has-dropdown">
+ <a href="blog.html">Blog</a>
+ <button class="dropdown-toggle" aria-label="Untermenü öffnen">▼</button>
+ <ul class="dropdown">
+ <li><a href="blog.html?tag=Training">Training</a></li>
+ <li><a href="blog.html?tag=Ernährung">Ernährung</a></li>
+ <li><a href="blog.html?tag=Wettkampf">Wettkampf</a></li>
+ <li><a href="blog.html?tag=Regeneration">Regeneration</a></li>
+ <li><a href="blog.html?tag=Openwater">Openwater & Schwimmen</a></li>
+ <li><a href="blog.html?tag=Bike">Bike & Equipment</a></li>
+ <li><a href="blog.html?tag=Marathon">Marathon & Laufen</a></li>
+ <li><a href="blog.html?tag=Ironman">Ironman & Langdistanz</a></li>
+ </ul>
+ </li>
+
+ <li class="nav-item"><a href="camps.html">Camps</a></li>
+
+ <li class="nav-item has-dropdown">
+ <a href="tools.html">Tools & more</a>
+ <button class="dropdown-toggle" aria-label="Untermenü öffnen">▼</button>
+ <ul class="dropdown">
+ <li><a href="https://swim.triathlon-coaching.com">Schwimmtraining & -pläne</a></li>
+ <li><a href="https://roadtokona.triathlon-coaching.com">#roadtokona</a></li>
+ </ul>
+ </li>
+
+ <li class="nav-item"><a href="kontakt.html">Kontakt</a></li>
+ </ul>
+ </nav>
+ </div>
+ </header>
+
+ <!-- ===== HERO ===== -->
+ <section class="hero">
+ <div class="hero-bg">
+ <div class="hero-overlay"></div>
+ <div class="hero-shapes">
+ <div class="shape shape-1"></div>
+ <div class="shape shape-2"></div>
+ <div class="shape shape-3"></div>
+ </div>
+ </div>
+ <div class="hero-content">
+ <div class="hero-disciplines">
+ <span>Schwimmen</span>
+ <span class="sep">·</span>
+ <span>Radfahren</span>
+ <span class="sep">·</span>
+ <span>Laufen</span>
+ </div>
+ <h1 class="hero-title">Erfahrung,<br/>die zählt.</h1>
+ <p class="hero-sub">Seit 1997 im Triathlon. Seit 2018 lizensierter DTU-C-Trainer.<br/>Coaching, das aus echter Wettkampferfahrung entsteht.</p>
+ <div class="hero-ctas">
+ <a href="coaching.html" class="btn btn-primary">Coaching entdecken</a>
+ <a href="kontakt.html" class="btn btn-outline">Kontakt aufnehmen</a>
+ </div>
+ </div>
+ <div class="hero-scroll-hint" aria-hidden="true">
+ <span>Scroll</span>
+ <div class="scroll-line"></div>
+ </div>
+ </section>
+
+ <!-- ===== MAIN CONTENT ===== -->
+ <main id="content" class="main-content">
+
+ <!-- Intro strip -->
+ <div class="intro-strip">
+ <div class="strip-item">
+ <span class="strip-num">38+</span>
+ <span class="strip-label">Jahre Ausdauersport</span>
+ </div>
+ <div class="strip-divider"></div>
+ <div class="strip-item">
+ <span class="strip-num">DTU-C</span>
+ <span class="strip-label">Lizensierter Trainer</span>
+ </div>
+ <div class="strip-divider"></div>
+ <div class="strip-item">
+ <span class="strip-num">800m–</span>
+ <span class="strip-label">bis Ironman-Distanz</span>
+ </div>
+ </div>
+
+ <!-- About Section -->
+ <section class="about-section container">
+ <div class="about-image-col">
+ <div class="about-image-wrap">
+ <div class="about-image-placeholder">
+ <div class="img-inner">
+ <svg viewBox="0 0 120 120" xmlns="http://www.w3.org/2000/svg" aria-hidden="true">
+ <circle cx="60" cy="42" r="22" fill="#4d8591" opacity="0.6"/>
+ <ellipse cx="60" cy="95" rx="36" ry="22" fill="#4d8591" opacity="0.4"/>
+ </svg>
+ <p class="img-hint">Ihr Foto hier</p>
+ </div>
+ </div>
+ <div class="about-badge">
+ <span>DTU</span>
+ <span>C-Trainer</span>
+ </div>
+ </div>
+ </div>
+
+ <div class="about-text-col">
+ <div class="section-label">Über mich</div>
+ <h2 class="section-title">Wer bin ich?</h2>
+ <p>Seit 1987 bin ich Läufer und seit 1997 Triathlet – zum großen Teil leistungssportlich. Zwischen 800m und Ironman habe ich keine Strecke ausgelassen. Ich spreche bei meinem Training viel aus Erfahrung und kenne sowohl die Einsamkeit der langen Radausfahrt als auch die Hektik auf der Tartanbahn.</p>
+ <p>Kaum kürzer ist mein Interesse an der Trainingslehre und Sportwissenschaft. So begleitete mich über die Jahre als Athleten bald die Rolle des Trainers, Übungsleiters, Radguides, usw. Das hilft mir, meine langjährigen Erfahrungen und persönlichen Lektionen in meine Trainertätigkeit einfließen zu lassen.</p>
+ <p>Seit 2018 bin ich auch lizensierter DTU-C-Trainer.</p>
+ <a href="coaching.html" class="btn btn-primary">Mein Coaching-Angebot</a>
+ </div>
+ </section>
+
+ <!-- Timeline Section -->
+ <section class="timeline-section">
+ <div class="container">
+ <div class="section-label center">Mein Weg</div>
+ <h2 class="section-title center">Die ganze Wahrheit</h2>
+ <div class="timeline">
+
+ <div class="tl-item">
+ <div class="tl-year">1987</div>
+ <div class="tl-dot"></div>
+ <div class="tl-card">
+ <h3>Die ersten Schritte</h3>
+ <p>Mit 14 Jahren die ersten Laufschuhe geschnürt – zusammen mit meinem Vater. Nicht viel später folgte der erste Volkslauf über 10 km.</p>
+ </div>
+ </div>
+
+ <div class="tl-item">
+ <div class="tl-year">1989</div>
+ <div class="tl-dot"></div>
+ <div class="tl-card">
+ <h3>Marathon mit 16</h3>
+ <p>Berlin, erster Marathon: 3:10:51. Der Beginn einer langen Liebe zur langen Strecke – und zu Hawaii als großem Ziel.</p>
+ </div>
+ </div>
+
+ <div class="tl-item">
+ <div class="tl-year">1991</div>
+ <div class="tl-dot"></div>
+ <div class="tl-card">
+ <h3>Der Geruch von Tartan</h3>
+ <p>Bahntraining, Wettkämpfe, Lauf-ABC. Bestzeiten die bis heute stehen: 800m 1:58,3 · 3000m 8:42,4 · 5000m 15:25. Und: erster Volkstriathlon in Neuss.</p>
+ </div>
+ </div>
+
+ <div class="tl-item">
+ <div class="tl-year">1997</div>
+ <div class="tl-dot"></div>
+ <div class="tl-card">
+ <h3>Triathlet werden</h3>
+ <p>Qua selbstgefasstem Beschluß wurde ich Triathlet. Schwimmen: irgendwie. Rad: ein olles Rennrad. Laufen: davon hatte ich Ahnung.</p>
+ </div>
+ </div>
+
+ <div class="tl-item">
+ <div class="tl-year">1998</div>
+ <div class="tl-dot"></div>
+ <div class="tl-card">
+ <h3>Ironman Roth</h3>
+ <p>Ironman Europe in Roth – seitdem darf ich mich Ironman nennen. NRW-Liga, Laktatmessungen, Trainingspläne in Excel.</p>
+ </div>
+ </div>
+
+ <div class="tl-item">
+ <div class="tl-year">2018</div>
+ <div class="tl-dot"></div>
+ <div class="tl-card highlight">
+ <h3>DTU-C-Trainer</h3>
+ <p>Lizensierter Trainer des Deutschen Triathlon Union – die offizielle Bestätigung eines langen Wegs aus Erfahrung, Leidenschaft und Sportwissenschaft.</p>
+ </div>
+ </div>
+
+ </div>
+ </div>
+ </section>
+
+ <!-- CTA Banner -->
+ <section class="cta-banner">
+ <div class="container">
+ <h2>Bereit für dein nächstes Rennen?</h2>
+ <p>Ob Personal Coaching oder Standard-Plan – ich finde das richtige Angebot für dein Ziel.</p>
+ <div class="cta-banner-btns">
+ <a href="coaching.html" class="btn btn-primary">Coaching-Angebote</a>
+ <a href="kontakt.html" class="btn btn-outline-light">Kontakt</a>
+ </div>
+ </div>
+ </section>
+
+ </main>
+
+ <!-- ===== FOOTER ===== -->
+ <footer class="site-footer">
+ <div class="footer-inner container">
+ <div class="footer-brand">
+ <a href="index.html" class="site-logo footer-logo">
+ <span class="logo-tri">triathlon</span><span class="logo-dash">-</span><span class="logo-coaching">coaching</span><span class="logo-dot">.</span><span class="logo-com">com</span>
+ </a>
+ <p>Triathlon-Coaching aus Leidenschaft.<br/>DTU-C-Trainer seit 2018.</p>
+ </div>
+ <nav class="footer-nav" aria-label="Footer Navigation">
+ <ul>
+ <li><a href="kontakt.html">Kontakt</a></li>
+ <li><a href="impressum.html">Impressum</a></li>
+ <li><a href="datenschutz.html">Datenschutz</a></li>
+ <li><a href="agb.html">AGB</a></li>
+ </ul>
+ </nav>
+ </div>
+ <div class="footer-bottom">
+ <p>© 2025 triathlon-coaching.com</p>
+ </div>
+ </footer>
+
+ <script src="main.js"></script>
+</body>
+</html>
--- /dev/null
+/* =========================================================
+ blog-data.js
+ Alle Artikel-Ideen aus dem WordPress-Backend
+ Status: "idea" | "draft" | "published"
+ ========================================================= */
+
+const BLOG_POSTS = [
+ // Kategorie: Über mich
+ { id: 1, title: "Aloha auf triathlon-coaching.com!", category: "Über mich", tags: [], status: "published" },
+ { id: 2, title: "AthlektikTraining", category: "Über mich", tags: [], status: "idea" },
+ { id: 3, title: "Besser laufen!", category: "Über mich", tags: [], status: "idea" },
+ { id: 4, title: "Laufseminar", category: "Über mich", tags: [], status: "idea" },
+ { id: 5, title: "Raceday – und bloß nichts vergessen!", category: "Über mich", tags: [], status: "idea" },
+ { id: 6, title: "Saisonplanung – wie geht man vor?", category: "Über mich", tags: [], status: "idea" }, // auch Blog
+ { id: 7, title: "Team Coaching", category: "Über mich", tags: [], status: "idea" },
+ { id: 8, title: "Technik & Fahrtechnik auf dem Rennrad", category: "Über mich", tags: [], status: "idea" },
+ { id: 9, title: "Vertrauen & Kontrolle", category: "Über mich", tags: [], status: "idea" },
+ { id: 10, title: "Warum einen Coach?", category: "Über mich", tags: [], status: "idea" },
+ { id: 11, title: "Welche Rolle hast Du?", category: "Über mich", tags: [], status: "idea" },
+ { id: 12, title: "WettkampfBetreung", category: "Über mich", tags: [], status: "idea" },
+ { id: 13, title: "Wie funktioniert individuelles Coaching?", category: "Über mich", tags: [], status: "idea" },
+ { id: 14, title: "Wie ich mit Athleten und Athletinnen arbeite(te)", category: "Über mich", tags: [], status: "idea" },
+ { id: 15, title: "Wie legen wir los? Wie läuft das ab?", category: "Über mich", tags: [], status: "idea" },
+ { id: 16, title: "Zugseil – Training", category: "Über mich", tags: [], status: "idea" },
+
+ // Kategorie: Angebot / Coaching
+ { id: 17, title: "… wenn Du krank bist …", category: "Angebot", tags: ["Basics"], status: "idea" },
+ { id: 18, title: "Dein Trainingsplan", category: "Coaching", tags: [], status: "idea" },
+ { id: 19, title: "Fair Play beim Coaching", category: "Angebot", tags: [], status: "idea" },
+ { id: 20, title: "Grenzen: Wofür ich nicht da bin", category: "Coaching", tags: [], status: "idea" },
+ { id: 21, title: "Mein Coaching-Ansatz", category: "Coaching", tags: [], status: "idea" },
+ { id: 22, title: "Mittwochs fängt die Woche an", category: "Coaching", tags: [], status: "idea" },
+ { id: 23, title: "Standard-Trainingspläne / Saisonplanung", category: "Saisonplanung", tags: [], status: "idea" },
+ { id: 24, title: "Was kostet das?", category: "Angebot", tags: [], status: "idea" },
+ { id: 25, title: "Ziele setzen – aber richtig!", category: "Blog", tags: [], status: "idea" },
+
+ // Kategorie: Blog – Training / Athletik
+ { id: 26, title: "Kraft vs. Kraftausdauer vs. K3 vs. dicker Gang", category: "Blog", tags: ["Athletik", "Bike", "K3", "Running", "Training"], status: "idea" },
+ { id: 27, title: "Fettstoffwechsel, Fettverbrennung, FatMax", category: "Blog", tags: ["Athletik", "Regeneration", "Training"], status: "idea" },
+ { id: 28, title: "KraftTraining", category: "Blog", tags: ["Athletik", "Regeneration", "Training"], status: "idea" },
+ { id: 29, title: "Stretching", category: "Blog", tags: ["Athletik", "Regeneration", "Training"], status: "idea" },
+ { id: 30, title: "Stabi macht schnell", category: "Blog", tags: ["Training", "Athletik", "Wettkampf"], status: "idea" },
+
+ // Kategorie: Blog – Bike / Equipment
+ { id: 31, title: "Helau statt Hatschi – Die richtige Verkleidung im Winter", category: "Blog", tags: ["Bike", "Equipment", "Running", "Training"], status: "idea" },
+ { id: 32, title: "Aero-Gadgets – Spielzeug oder Gamechanger", category: "Blog", tags: ["Bike", "Equipment", "Triathlon", "Wettkampf"], status: "idea" },
+ { id: 33, title: "Bikefitting", category: "Blog", tags: ["Bike", "Equipment", "Triathlon", "Wettkampf"], status: "idea" },
+ { id: 34, title: "Kurbellänge – was bringt kurz?", category: "Blog", tags: ["Bike", "Equipment", "Triathlon", "Wettkampf"], status: "idea" },
+ { id: 35, title: "Rad-Equipment", category: "Blog", tags: ["Bike", "Equipment", "Triathlon", "Wettkampf"], status: "idea" },
+ { id: 36, title: "Rad-Equipment für IndoorBike", category: "Blog", tags: ["Bike", "Equipment", "Triathlon", "Wettkampf"], status: "idea" },
+ { id: 37, title: "Radpflege", category: "Blog", tags: ["Bike", "Equipment", "Triathlon", "Wettkampf"], status: "idea" },
+ { id: 38, title: "Wenn Aero Aua macht – Fitting und Fitness!", category: "Blog", tags: ["Bike", "Equipment", "Triathlon", "Wettkampf"], status: "idea" },
+ { id: 39, title: "Wie kaufe ich ein Rad?", category: "Blog", tags: ["Bike", "Equipment", "Triathlon", "Wettkampf"], status: "idea" },
+ { id: 40, title: "Kraftausdauer am Berg", category: "Blog", tags: ["Bike", "K3", "Kraftausdauer", "Training", "Triathlon"], status: "idea" },
+
+ // Kategorie: Blog – Taktik / Wettkampf
+ { id: 41, title: "Was nicht auf Strava ist, ist nicht passiert?", category: "Blog", tags: ["Bike", "Lauf", "Lifestyle", "Szene", "Training"], status: "idea" },
+ { id: 42, title: "Schnelligkeit / Ga2 / Schnelligkeitsausdauer", category: "Blog", tags: ["Marathon", "Running", "Training", "Triathlon"], status: "idea" },
+ { id: 43, title: "Wechsel 1", category: "Blog", tags: ["Openwater", "Schwimmen", "Taktik", "Triathlon", "Wettkampf"], status: "idea" },
+ { id: 44, title: "Wechsel 2", category: "Blog", tags: ["Running", "Taktik", "Triathlon", "Wettkampf"], status: "idea" },
+ { id: 45, title: "FTP – wie? Schon wieder Wahl?", category: "Blog", tags: ["Bike", "Tempo", "Training", "Triathlon"], status: "idea" },
+ { id: 46, title: "Fahrtechnik auf dem Rad", category: "Blog", tags: ["Bike", "Training", "Triathlon", "Wettkampf"], status: "idea" },
+ { id: 47, title: "Blick über den Tellerrand – Trondheim-Oslo", category: "Blog", tags: ["Bike", "Training", "Wettkampf"], status: "idea" },
+ { id: 48, title: "Kurventechnik ist ein Muss: Warum Radfahren im Triathlon mehr als nur Drücken ist", category: "Blog", tags: ["Bike"], status: "idea" },
+
+ // Kategorie: Blog – Gesundheit / Ernährung
+ { id: 49, title: "Gesundheit!", category: "Blog", tags: ["Coaching", "Gesundheit", "Training"], status: "idea" },
+ { id: 50, title: "Coach vs. Software vs. Literatur", category: "Blog", tags: ["Coaching", "Training", "Wettkampf"], status: "idea" },
+ { id: 51, title: "Laufschuhe – Kann man zu viele haben?", category: "Blog", tags: ["Lauf", "Running", "Equipment", "Marathon"], status: "idea" },
+ { id: 52, title: "Sinn und Unsinn von low carb", category: "Blog", tags: ["Ernährung", "Gesundheit", "Kohlenhydrate", "Training", "Wettkampf"], status: "idea" },
+ { id: 53, title: "Fettes Thema: Abnehmen, Hungern, Magersucht", category: "Blog", tags: ["Ernährung", "Gesundheit", "Training"], status: "idea" },
+ { id: 54, title: "Salz auf Deiner Haut (2) – Schweiß", category: "Blog", tags: ["Ernährung", "Gesundheit", "Marathon", "Training", "Triathlon"], status: "idea" },
+ { id: 55, title: "Alkohol", category: "Blog", tags: ["Ernährung", "Gesundheit", "Training"], status: "idea" },
+ { id: 56, title: "Alle Jahre wieder: Wagge vs. Weihnachtszeit", category: "Blog", tags: ["Ernährung", "Gesundheit", "Training"], status: "idea" },
+ { id: 57, title: "Blutspenden", category: "Blog", tags: ["Ernährung", "Gesundheit", "Training"], status: "idea" },
+ { id: 58, title: "Vegan & Sport ?", category: "Blog", tags: ["Ernährung", "Gesundheit", "Training"], status: "idea" },
+ { id: 59, title: "Das große Fressen – Sitte und Unsitte bei der Nudelparty", category: "Blog", tags: ["Ernährung", "Kohlenhydrate", "Training"], status: "idea" },
+ { id: 60, title: "Einmal volltanken, bitte: Ernährung vor dem Race", category: "Blog", tags: ["Ernährung", "Kohlenhydrate", "Training", "Triathlon", "Marathon"], status: "idea" },
+ { id: 61, title: "Ernährung beim Race", category: "Blog", tags: ["Ernährung", "Kohlenhydrate", "Training", "Triathlon", "Marathon"], status: "idea" },
+ { id: 62, title: "Kaffeeeee!", category: "Blog", tags: ["Ernährung", "Training", "Triathlon"], status: "idea" },
+ { id: 63, title: "Proteine – der Stoff aus dem die Power kommt", category: "Blog", tags: ["Ernährung", "Training", "Wettkampf"], status: "idea" },
+
+ // Kategorie: Blog – Gesundheit / Psyche
+ { id: 64, title: "Von Null auf Langdistanz – in 6 Wochen oder in 6 Jahren?", category: "Blog", tags: ["Gesundheit", "Ironman", "Regeneration"], status: "idea" },
+ { id: 65, title: "DNF is an Option (DNS auch)", category: "Blog", tags: ["Gesundheit", "Psyche", "Training", "Wettkampf"], status: "idea" },
+ { id: 66, title: "Krank, müde, erschöpft", category: "Blog", tags: ["Gesundheit", "Training", "Wettkampf"], status: "idea" },
+ { id: 67, title: "Verletzungen", category: "Blog", tags: ["Gesundheit", "Training", "Wettkampf"], status: "idea" },
+
+ // Kategorie: Blog – Ironman / Langdistanz / Regeneration
+ { id: 68, title: "Off-Season", category: "Blog", tags: ["Ironman", "Langdistanz", "Marathon", "Psyche", "Regeneration", "Training", "Triathlon"], status: "idea" },
+ { id: 69, title: "Sabbatical – vom Triathlon", category: "Blog", tags: ["Ironman", "Langdistanz", "Marathon", "Psyche", "Regeneration", "Training"], status: "idea" },
+ { id: 70, title: "Regeneration", category: "Blog", tags: ["Ironman", "Langdistanz", "Marathon", "Regeneration", "Training", "Triathlon", "Wettkampf"], status: "idea" },
+ { id: 71, title: "Regeneration nach der Langdistanz", category: "Blog", tags: ["Ironman", "Langdistanz", "Regeneration", "Training", "Triathlon"], status: "idea" },
+ { id: 72, title: "Marathon in der Langdistanz-Vorbereitung", category: "Blog", tags: ["Ironman", "Laufen", "Marathon", "Training", "Triathlon"], status: "idea" },
+ { id: 73, title: "Langes Wochenende – Belastung hochfahren oder nicht?", category: "Blog", tags: ["Ironman", "Marathon", "Running", "Training"], status: "idea" },
+
+ // Kategorie: Blog – Marathon / Laufen
+ { id: 74, title: "Bahn-Knigge: Die ungeschriebenen Gesetze auf der Bahn", category: "Blog", tags: ["Lauf", "Run", "Running", "Lifestyle"], status: "idea" },
+ { id: 75, title: "Alles Kopfsache! Mentale Stärke", category: "Blog", tags: ["Marathon", "Psyche", "Training", "Triathlon", "Wettkampf"], status: "idea" },
+ { id: 76, title: "Inneres Gleichgewicht", category: "Blog", tags: ["Marathon", "Psyche", "Training", "Triathlon"], status: "idea" },
+ { id: 77, title: "Salz auf Deiner Haut (3) – Tränen", category: "Blog", tags: ["Marathon", "Psyche", "Training", "Triathlon", "Wettkampf"], status: "idea" },
+ { id: 78, title: "Warm-Up vor einem Laufwettkampf", category: "Blog", tags: ["Raceday", "Running", "Marathon", "Training", "Taktik", "Wettkampf"], status: "idea" },
+ { id: 79, title: "Schon wieder Bahn: Wo ist was auf der Bahn?", category: "Blog", tags: ["Lauf", "Run", "Running", "Marathon", "Training"], status: "idea" },
+ { id: 80, title: "Körperhaltung beim Laufen", category: "Blog", tags: ["Marathon", "Running", "Training", "Triathlon", "Wettkampf"], status: "idea" },
+ { id: 81, title: "Lauf-ABC", category: "Blog", tags: ["Marathon", "Running", "Triathlon", "Wettkampf"], status: "idea" },
+ { id: 82, title: "Whiskey in a Jar? Rechnen mit Jack Daniels und anderen Formeln", category: "Blog", tags: ["Marathon", "Running"], status: "idea" },
+ { id: 83, title: "HIT!", category: "Blog", tags: ["Marathon", "Training", "Triathlon"], status: "idea" },
+ { id: 84, title: "Leistungsdiagnostik – lohnt sich das?", category: "Blog", tags: ["Training", "Triathlon"], status: "idea" },
+ { id: 85, title: "(Herbst-)Marathontraining für Triathleten", category: "Blog", tags: ["Marathon", "Training", "Triathlon", "Wettkampf"], status: "idea" },
+
+ // Kategorie: Blog – Openwater / Schwimmen
+ { id: 86, title: "Eine Frage der Ehre – Fairplay, Doping und böse Fouls", category: "Blog", tags: ["Marathon", "Training", "Triathlon", "Wettkampf"], status: "idea" },
+ { id: 87, title: "Amphibien erobern das Land – der Schwimmausstieg", category: "Blog", tags: ["Openwater", "Schwimmen", "Taktik", "Triathlon"], status: "idea" },
+ { id: 88, title: "Hilfe, ich kriege den Neo nicht aus!", category: "Blog", tags: ["Openwater", "Schwimmen", "Taktik", "Triathlon", "Wettkampf"], status: "idea" },
+ { id: 89, title: "Verhalten am Start", category: "Blog", tags: ["Openwater", "Schwimmen", "Taktik", "Triathlon", "Wettkampf"], status: "idea" },
+ { id: 90, title: "Blick über den Tellerrand – Openwater Swimming", category: "Blog", tags: ["Openwater", "Schwimmen", "Training", "Wettkampf"], status: "idea" },
+ { id: 91, title: "Salz auf Deiner Haut (1) – Schwimmen im Meer", category: "Blog", tags: ["Openwater", "Schwimmen", "Training", "Wettkampf"], status: "idea" },
+ { id: 92, title: "Der böse SWOLF", category: "Blog", tags: ["Schwimmen", "Triathlon", "Wettkampf"], status: "idea" },
+
+ // Kategorie: Blog – Taktik / Belastung
+ { id: 93, title: "Blockperiodisierung – wie geht das?", category: "Blog", tags: ["Regeneration", "Training"], status: "idea" },
+ { id: 94, title: "Blick über den Tellerrand – Ultralauf", category: "Blog", tags: ["Running", "Training", "Wettkampf"], status: "idea" },
+ { id: 95, title: "In Peace with Pace – der schmale Grat zwischen verballern und doch nur 95%", category: "Blog", tags: ["Taktik", "Training"], status: "idea" },
+ { id: 96, title: "Belastungssteuerung – Gefühl, Puls oder Watt?", category: "Blog", tags: ["Training", "Triathlon", "Wettkampf"], status: "idea" },
+ { id: 97, title: "Lang ist mehr als 2mal", category: "Blog", tags: ["Training", "Triathlon", "Wettkampf"], status: "idea" },
+ { id: 98, title: "Was tun in der zweiten Saisonhälfte?", category: "Blog", tags: ["Training", "Triathlon", "Wettkampf"], status: "idea" },
+ { id: 99, title: "Wattmessung", category: "Blog", tags: ["Training", "Triathlon", "Wettkampf"], status: "idea" },
+
+ // Kategorie: Blog – Camp / Raceday
+ { id: 100, title: "Camp – Pro & Contra", category: "Blog", tags: ["Training", "Wettkampf"], status: "idea" },
+ { id: 101, title: "Erste Hilfe", category: "Blog", tags: ["Training", "Wettkampf"], status: "idea" },
+ { id: 102, title: "Packliste Camp", category: "Blog", tags: ["Training", "Wettkampf"], status: "idea" },
+ { id: 103, title: "Was macht ein Camp zu einem guten Camp?", category: "Blog", tags: ["Training", "Wettkampf"], status: "idea" },
+ { id: 104, title: "Raceday – bloß nichts vergessen!", category: "Blog", tags: ["Triathlon", "Wettkampf"], status: "idea" },
+ { id: 105, title: "Packliste Raceday", category: "Blog", tags: ["Triathlon", "Wettkampf"], status: "idea" },
+];
+
+// Alle einzigartigen Kategorien
+const CATEGORIES = [...new Set(BLOG_POSTS.map(p => p.category))].sort();
+
+// Alle einzigartigen Tags (flach, sortiert)
+const ALL_TAGS = [...new Set(BLOG_POSTS.flatMap(p => p.tags))].sort();
+
+export { BLOG_POSTS, CATEGORIES, ALL_TAGS };
--- /dev/null
+<!DOCTYPE html>
+<html lang="de">
+<head>
+ <meta charset="UTF-8" />
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
+ <title>Artikeltitel – triathlon-coaching.com</title>
+ <link rel="stylesheet" href="style.css" />
+
+ <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=Barlow+Condensed:wght@400;600;700;800&family=Barlow:ital,wght@0,400;0,500;0,600;1,400&display=swap" rel="stylesheet" />
+</head>
+<body>
+
+ <!-- ===== HEADER ===== -->
+ <header class="site-header">
+ <div class="header-inner">
+ <a href="index.html" class="site-logo">
+ <span class="logo-tri">triathlon</span><span class="logo-dash">-</span><span class="logo-coaching">coaching</span><span class="logo-dot">.</span><span class="logo-com">com</span>
+ </a>
+ <button class="nav-toggle" aria-label="Menü öffnen" aria-expanded="false">
+ <span></span><span></span><span></span>
+ </button>
+ <nav class="main-nav" aria-label="Hauptnavigation">
+ <ul class="nav-list">
+ <li class="nav-item"><a href="index.html">Über mich</a></li>
+ <li class="nav-item has-dropdown">
+ <a href="coaching.html">Coaching</a>
+ <button class="dropdown-toggle">▼</button>
+ <ul class="dropdown">
+ <li><a href="personal-coaching.html">Personal Coaching</a></li>
+ <li class="has-dropdown-2">
+ <a href="standard-plaene.html">Standard-Pläne</a>
+ <button class="dropdown-toggle">►</button>
+ <ul class="dropdown-2">
+ <li><a href="langdistanz.html">Langdistanz & Ironman</a></li>
+ <li><a href="mitteldistanz.html">Mitteldistanz & Ironman 70.3</a></li>
+ <li><a href="kurzdistanz.html">Kurz- & olympische Distanz</a></li>
+ </ul>
+ </li>
+ </ul>
+ </li>
+ <li class="nav-item has-dropdown active">
+ <a href="blog.html">Blog</a>
+ <button class="dropdown-toggle">▼</button>
+ <ul class="dropdown">
+ <li><a href="blog.html?kat=Training">Training</a></li>
+ <li><a href="blog.html?kat=Ernährung">Ernährung</a></li>
+ <li><a href="blog.html?kat=Wettkampf">Wettkampf</a></li>
+ <li><a href="blog.html?kat=Regeneration">Regeneration</a></li>
+ <li><a href="blog.html?kat=Openwater">Openwater & Schwimmen</a></li>
+ <li><a href="blog.html?kat=Bike">Bike & Equipment</a></li>
+ <li><a href="blog.html?kat=Marathon">Marathon & Laufen</a></li>
+ <li><a href="blog.html?kat=Ironman">Ironman & Langdistanz</a></li>
+ </ul>
+ </li>
+ <li class="nav-item"><a href="kontakt.html">Kontakt</a></li>
+ </ul>
+ </nav>
+ </div>
+ </header>
+
+ <!-- ===== ARTICLE HERO ===== -->
+ <section class="post-hero">
+ <div class="post-hero-inner container">
+ <!-- Breadcrumb -->
+ <nav class="breadcrumb" aria-label="Breadcrumb">
+ <a href="index.html">Home</a>
+ <span aria-hidden="true">›</span>
+ <a href="blog.html">Blog</a>
+ <span aria-hidden="true">›</span>
+ <span aria-current="page">Artikeltitel</span>
+ </nav>
+
+ <!-- Meta -->
+ <div class="post-meta">
+ <span class="post-cat">Training</span>
+ <span class="post-dot" aria-hidden="true">·</span>
+ <time class="post-date" datetime="2025-01-15">15. Januar 2025</time>
+ <span class="post-dot" aria-hidden="true">·</span>
+ <span class="post-readtime">8 min Lesezeit</span>
+ </div>
+
+ <h1 class="post-title">Kraft vs. Kraftausdauer vs. K3 vs. dicker Gang</h1>
+ <p class="post-intro">Was steckt hinter diesen Begriffen, und welches Training ist wann sinnvoll für Triathleten?</p>
+
+ <!-- Tags -->
+ <div class="post-tags" aria-label="Schlagwörter">
+ <a href="blog.html?tag=Athletik" class="tag">Athletik</a>
+ <a href="blog.html?tag=Bike" class="tag">Bike</a>
+ <a href="blog.html?tag=Training" class="tag">Training</a>
+ </div>
+ </div>
+
+ <!-- Optional: Hero-Bild -->
+ <div class="post-hero-image" aria-hidden="true">
+ <div class="post-hero-img-placeholder">
+ <span>Artikelbild (optional)</span>
+ </div>
+ </div>
+ </section>
+
+ <!-- ===== ARTICLE LAYOUT ===== -->
+ <div class="post-layout container">
+
+ <!-- Sidebar: TOC (desktop) -->
+ <aside class="post-toc" aria-label="Inhaltsverzeichnis">
+ <div class="toc-inner">
+ <p class="toc-title">Inhalt</p>
+ <nav>
+ <ol class="toc-list" id="toc-list">
+ <!-- Filled by JS from h2/h3 in article -->
+ </ol>
+ </nav>
+ </div>
+ </aside>
+
+ <!-- Article body -->
+ <article class="post-body" id="post-body">
+
+ <h2>Was ist eigentlich Kraftausdauer?</h2>
+ <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris.</p>
+ <p>Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident.</p>
+
+ <!-- Callout box example -->
+ <div class="callout callout-tip">
+ <div class="callout-icon" aria-hidden="true">💡</div>
+ <div class="callout-text">
+ <strong>Tipp:</strong> Kraftausdauer am Berg lässt sich einfach in die normale Radausfahrt integrieren – einfach die nächste Steigung im großen Gang angehen.
+ </div>
+ </div>
+
+ <h2>K3 – was steckt dahinter?</h2>
+ <p>Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae.</p>
+
+ <h3>K3 im Trainingplan einbauen</h3>
+ <p>Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugit, sed quia consequuntur magni dolores eos qui ratione voluptatem sequi nesciunt.</p>
+
+ <!-- Table example -->
+ <div class="table-wrap">
+ <table>
+ <thead>
+ <tr>
+ <th>Methode</th>
+ <th>Intensität</th>
+ <th>Dauer</th>
+ <th>Ziel</th>
+ </tr>
+ </thead>
+ <tbody>
+ <tr><td>Kraft</td><td>90–100 % FTP</td><td>30–60 s</td><td>Maximalkraft</td></tr>
+ <tr><td>Kraftausdauer</td><td>75–85 % FTP</td><td>4–10 min</td><td>Muskelausdauer</td></tr>
+ <tr><td>K3</td><td>65–75 % FTP</td><td>10–20 min</td><td>aerobe Basis</td></tr>
+ <tr><td>Dicker Gang</td><td>55–65 % FTP</td><td>20–60 min</td><td>Grundlage & Technik</td></tr>
+ </tbody>
+ </table>
+ </div>
+
+ <h2>Der dicke Gang: Unterschätzt und überbewertet</h2>
+ <p>At vero eos et accusamus et iusto odio dignissimos ducimus qui blanditiis praesentium voluptatum deleniti atque corrupti quos dolores et quas molestias excepturi sint occaecati.</p>
+
+ <!-- Quote / Blockquote -->
+ <blockquote class="post-quote">
+ <p>Auf der Bahn sind 400m immer 400m. Keine Diskussion über die Strecke. Das schätze ich noch heute.</p>
+ </blockquote>
+
+ <h2>Fazit: Was wann für wen?</h2>
+ <p>Nam libero tempore, cum soluta nobis est eligendi optio cumque nihil impedit quo minus id quod maxime placeat facere possimus, omnis voluptas assumenda est.</p>
+
+ </article>
+
+ </div>
+
+ <!-- ===== POST FOOTER (Tags + Share + CTA) ===== -->
+ <div class="post-footer-bar container">
+ <div class="post-footer-tags">
+ <span class="post-footer-label">Schlagwörter:</span>
+ <a href="blog.html?tag=Athletik" class="tag">Athletik</a>
+ <a href="blog.html?tag=Bike" class="tag">Bike</a>
+ <a href="blog.html?tag=K3" class="tag">K3</a>
+ <a href="blog.html?tag=Training" class="tag">Training</a>
+ </div>
+ </div>
+
+ <!-- ===== RELATED POSTS ===== -->
+ <section class="related-posts container" aria-labelledby="related-title">
+ <h2 id="related-title" class="section-title">Weitere Artikel</h2>
+ <div class="related-grid" id="related-grid">
+ <!-- Filled by JS -->
+ </div>
+ </section>
+
+ <!-- ===== CTA ===== -->
+ <section class="post-cta">
+ <div class="container">
+ <p class="post-cta-label">Fragen zum Training?</p>
+ <h2>Ich helfe dir weiter.</h2>
+ <a href="kontakt.html" class="btn btn-primary">Kontakt aufnehmen</a>
+ </div>
+ </section>
+
+ <!-- ===== FOOTER ===== -->
+ <footer class="site-footer">
+ <div class="footer-inner container">
+ <div class="footer-brand">
+ <a href="index.html" class="site-logo footer-logo">
+ <span class="logo-tri">triathlon</span><span class="logo-dash">-</span><span class="logo-coaching">coaching</span><span class="logo-dot">.</span><span class="logo-com">com</span>
+ </a>
+ <p>Triathlon-Coaching aus Leidenschaft.<br/>DTU-C-Trainer seit 2018.</p>
+ </div>
+ <nav class="footer-nav">
+ <ul>
+ <li><a href="kontakt.html">Kontakt</a></li>
+ <li><a href="impressum.html">Impressum</a></li>
+ <li><a href="datenschutz.html">Datenschutz</a></li>
+ <li><a href="agb.html">AGB</a></li>
+ </ul>
+ </nav>
+ </div>
+ <div class="footer-bottom"><p>© 2025 triathlon-coaching.com</p></div>
+ </footer>
+
+ <script src="main.js"></script>
+
+</body>
+</html>
--- /dev/null
+<!DOCTYPE html>
+<html lang="de">
+<head>
+ <meta charset="UTF-8" />
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
+ <title>Blog – triathlon-coaching.com</title>
+ <link rel="stylesheet" href="style.css" />
+
+ <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=Barlow+Condensed:wght@400;600;700;800&family=Barlow:ital,wght@0,400;0,500;0,600;1,400&display=swap" rel="stylesheet" />
+</head>
+<body>
+
+ <!-- ===== HEADER / NAV ===== -->
+ <header class="site-header">
+ <div class="header-inner">
+ <a href="index.html" class="site-logo">
+ <span class="logo-tri">triathlon</span><span class="logo-dash">-</span><span class="logo-coaching">coaching</span><span class="logo-dot">.</span><span class="logo-com">com</span>
+ </a>
+ <button class="nav-toggle" aria-label="Menü öffnen" aria-expanded="false">
+ <span></span><span></span><span></span>
+ </button>
+ <nav class="main-nav" aria-label="Hauptnavigation">
+ <ul class="nav-list">
+ <li class="nav-item"><a href="index.html">Über mich</a></li>
+ <li class="nav-item has-dropdown">
+ <a href="coaching.html">Coaching</a>
+ <button class="dropdown-toggle" aria-label="Untermenü öffnen">▼</button>
+ <ul class="dropdown">
+ <li><a href="personal-coaching.html">Personal Coaching</a></li>
+ <li class="has-dropdown-2">
+ <a href="standard-plaene.html">Standard-Pläne</a>
+ <button class="dropdown-toggle">►</button>
+ <ul class="dropdown-2">
+ <li><a href="langdistanz.html">Langdistanz & Ironman</a></li>
+ <li><a href="mitteldistanz.html">Mitteldistanz & Ironman 70.3</a></li>
+ <li><a href="kurzdistanz.html">Kurz- & olympische Distanz</a></li>
+ </ul>
+ </li>
+ </ul>
+ </li>
+ <li class="nav-item has-dropdown active">
+ <a href="blog.html">Blog</a>
+ <button class="dropdown-toggle" aria-label="Untermenü öffnen">▼</button>
+ <ul class="dropdown">
+ <li><a href="blog.html?kat=Training">Training</a></li>
+ <li><a href="blog.html?kat=Ernährung">Ernährung</a></li>
+ <li><a href="blog.html?kat=Wettkampf">Wettkampf</a></li>
+ <li><a href="blog.html?kat=Regeneration">Regeneration</a></li>
+ <li><a href="blog.html?kat=Openwater">Openwater & Schwimmen</a></li>
+ <li><a href="blog.html?kat=Bike">Bike & Equipment</a></li>
+ <li><a href="blog.html?kat=Marathon">Marathon & Laufen</a></li>
+ <li><a href="blog.html?kat=Ironman">Ironman & Langdistanz</a></li>
+ </ul>
+ </li>
+ <li class="nav-item"><a href="camps.html">Camps</a></li>
+ <li class="nav-item has-dropdown">
+ <a href="tools.html">Tools & more</a>
+ <button class="dropdown-toggle" aria-label="Untermenü öffnen">▼</button>
+ <ul class="dropdown">
+ <li><a href="https://swim.triathlon-coaching.com">Schwimmtraining & -pläne</a></li>
+ <li><a href="https://roadtokona.triathlon-coaching.com">#roadtokona</a></li>
+ </ul>
+ </li>
+ <li class="nav-item"><a href="kontakt.html">Kontakt</a></li>
+ </ul>
+ </nav>
+ </div>
+ </header>
+
+ <!-- ===== PAGE HERO ===== -->
+ <section class="page-hero">
+ <div class="page-hero-inner container">
+ <div class="section-label">Wissen & Erfahrung</div>
+ <h1 class="page-hero-title">Blog</h1>
+ <p class="page-hero-sub">Über Training, Taktik, Ernährung, Equipment und alles, was Triathleten bewegt.</p>
+ </div>
+ <div class="page-hero-bar">
+ <span data-count="105">105</span> Artikel & Ideen
+ </div>
+ </section>
+
+ <!-- ===== FILTER BAR ===== -->
+ <div class="filter-bar" id="filter-bar" role="search" aria-label="Artikel filtern">
+ <div class="filter-bar-inner container">
+
+ <!-- Search -->
+ <div class="filter-search-wrap">
+ <svg class="filter-search-icon" viewBox="0 0 20 20" fill="none" aria-hidden="true">
+ <circle cx="9" cy="9" r="6" stroke="currentColor" stroke-width="1.8"/>
+ <path d="M13.5 13.5L17 17" stroke="currentColor" stroke-width="1.8" stroke-linecap="round"/>
+ </svg>
+ <input
+ type="search"
+ id="blog-search"
+ class="filter-search"
+ placeholder="Artikel suchen…"
+ aria-label="Artikel suchen"
+ autocomplete="off"
+ />
+ </div>
+
+ <!-- Category pills -->
+ <div class="filter-pills" role="group" aria-label="Kategorien">
+ <button class="pill active" data-filter="cat" data-value="all">Alle</button>
+ <button class="pill" data-filter="cat" data-value="Blog">Blog</button>
+ <button class="pill" data-filter="cat" data-value="Coaching">Coaching</button>
+ <button class="pill" data-filter="cat" data-value="Angebot">Angebot</button>
+ <button class="pill" data-filter="cat" data-value="Über mich">Über mich</button>
+ <button class="pill" data-filter="cat" data-value="Saisonplanung">Saisonplanung</button>
+ <button class="pill" data-filter="cat" data-value="Camps">Camps</button>
+ </div>
+
+ <!-- Tag filter (collapsible on mobile) -->
+ <div class="filter-tags-wrap">
+ <button class="filter-tags-toggle" aria-expanded="false" aria-controls="tag-cloud">
+ Tags filtern
+ <svg viewBox="0 0 12 12" fill="none" aria-hidden="true" width="12"><path d="M2 4l4 4 4-4" stroke="currentColor" stroke-width="1.5" stroke-linecap="round"/></svg>
+ </button>
+ <div id="tag-cloud" class="tag-cloud" hidden>
+ <!-- Filled by JS -->
+ </div>
+ </div>
+
+ <!-- Result count + Reset -->
+ <div class="filter-meta">
+ <span id="result-count" class="result-count"></span>
+ <button id="filter-reset" class="filter-reset" hidden>Filter zurücksetzen</button>
+ </div>
+
+ </div>
+ </div>
+
+ <!-- ===== BLOG GRID ===== -->
+ <main id="content" class="blog-main container">
+ <div id="blog-grid" class="blog-grid" role="list">
+ <!-- Cards rendered by JS -->
+ </div>
+ <p id="no-results" class="no-results" hidden>Keine Artikel gefunden. <button id="no-results-reset">Filter zurücksetzen</button></p>
+ </main>
+
+ <!-- ===== FOOTER ===== -->
+ <footer class="site-footer">
+ <div class="footer-inner container">
+ <div class="footer-brand">
+ <a href="index.html" class="site-logo footer-logo">
+ <span class="logo-tri">triathlon</span><span class="logo-dash">-</span><span class="logo-coaching">coaching</span><span class="logo-dot">.</span><span class="logo-com">com</span>
+ </a>
+ <p>Triathlon-Coaching aus Leidenschaft.<br/>DTU-C-Trainer seit 2018.</p>
+ </div>
+ <nav class="footer-nav" aria-label="Footer Navigation">
+ <ul>
+ <li><a href="kontakt.html">Kontakt</a></li>
+ <li><a href="impressum.html">Impressum</a></li>
+ <li><a href="datenschutz.html">Datenschutz</a></li>
+ <li><a href="agb.html">AGB</a></li>
+ </ul>
+ </nav>
+ </div>
+ <div class="footer-bottom">
+ <p>© 2025 triathlon-coaching.com</p>
+ </div>
+ </footer>
+
+ <script src="main.js"></script>
+
+</body>
+</html>
--- /dev/null
+<!DOCTYPE html>
+<html lang="de">
+<head>
+ <meta charset="UTF-8" />
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
+ <title>Camps – triathlon-coaching.com</title>
+ <link rel="stylesheet" href="style.css" />
+ <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=Barlow+Condensed:wght@400;600;700;800&family=Barlow:ital,wght@0,400;0,500;0,600;1,400&display=swap" rel="stylesheet" />
+</head>
+
+<!-- data-blog-category locks the JS grid to this category only -->
+<body data-blog-category="Camps">
+
+ <!-- ===== HEADER ===== -->
+ <header class="site-header">
+ <div class="header-inner">
+ <a href="index.html" class="site-logo">
+ <span class="logo-tri">triathlon</span><span class="logo-dash">-</span><span class="logo-coaching">coaching</span><span class="logo-dot">.</span><span class="logo-com">com</span>
+ </a>
+ <button class="nav-toggle" aria-label="Menü öffnen" aria-expanded="false">
+ <span></span><span></span><span></span>
+ </button>
+ <nav class="main-nav" aria-label="Hauptnavigation">
+ <ul class="nav-list">
+ <li class="nav-item"><a href="index.html">Über mich</a></li>
+ <li class="nav-item has-dropdown">
+ <a href="coaching.html">Coaching</a>
+ <button class="dropdown-toggle" aria-label="Untermenü öffnen">▼</button>
+ <ul class="dropdown">
+ <li><a href="personal-coaching.html">Personal Coaching</a></li>
+ <li class="has-dropdown-2">
+ <a href="standard-plaene.html">Standard-Pläne</a>
+ <button class="dropdown-toggle">▼</button>
+ <ul class="dropdown-2">
+ <li><a href="langdistanz.html">Langdistanz & Ironman</a></li>
+ <li><a href="mitteldistanz.html">Mitteldistanz & Ironman 70.3</a></li>
+ <li><a href="kurzdistanz.html">Kurz- & olympische Distanz</a></li>
+ </ul>
+ </li>
+ </ul>
+ </li>
+ <li class="nav-item has-dropdown">
+ <a href="blog.html">Blog</a>
+ <button class="dropdown-toggle" aria-label="Untermenü öffnen">▼</button>
+ <ul class="dropdown">
+ <li><a href="blog.html?tag=Training">Training</a></li>
+ <li><a href="blog.html?tag=Ernährung">Ernährung</a></li>
+ <li><a href="blog.html?tag=Wettkampf">Wettkampf</a></li>
+ <li><a href="blog.html?tag=Regeneration">Regeneration</a></li>
+ <li><a href="blog.html?tag=Openwater">Openwater & Schwimmen</a></li>
+ <li><a href="blog.html?tag=Bike">Bike & Equipment</a></li>
+ <li><a href="blog.html?tag=Marathon">Marathon & Laufen</a></li>
+ <li><a href="blog.html?tag=Ironman">Ironman & Langdistanz</a></li>
+ </ul>
+ </li>
+ <li class="nav-item active"><a href="camps.html">Camps</a></li>
+ <li class="nav-item has-dropdown">
+ <a href="tools.html">Tools & more</a>
+ <button class="dropdown-toggle" aria-label="Untermenü öffnen">▼</button>
+ <ul class="dropdown">
+ <li><a href="https://swim.triathlon-coaching.com">Schwimmtraining & -pläne</a></li>
+ <li><a href="https://roadtokona.triathlon-coaching.com">#roadtokona</a></li>
+ </ul>
+ </li>
+ <li class="nav-item"><a href="kontakt.html">Kontakt</a></li>
+ </ul>
+ </nav>
+ </div>
+ </header>
+
+ <!-- ===== PAGE HERO ===== -->
+ <section class="page-hero">
+ <div class="page-hero-inner container">
+ <div class="section-label">Trainingscamps</div>
+ <h1 class="page-hero-title">Camps</h1>
+ <p class="page-hero-sub">Gemeinsam trainieren, Technik verbessern, Watt machen – Infos zu Trainingslagern und Gruppenangeboten.</p>
+ </div>
+ <div class="page-hero-bar">
+ <span id="result-count"></span>
+ </div>
+ </section>
+
+ <!-- ===== FILTER BAR — nur Suche, keine Pills ===== -->
+ <div class="filter-bar" role="search" aria-label="Artikel suchen">
+ <div class="filter-bar-inner container">
+ <div class="filter-search-wrap">
+ <svg class="filter-search-icon" viewBox="0 0 20 20" fill="none" aria-hidden="true">
+ <circle cx="9" cy="9" r="6" stroke="currentColor" stroke-width="1.8"/>
+ <path d="M13.5 13.5L17 17" stroke="currentColor" stroke-width="1.8" stroke-linecap="round"/>
+ </svg>
+ <input type="search" id="blog-search" class="filter-search" placeholder="Artikel suchen…" aria-label="Artikel suchen" autocomplete="off" />
+ </div>
+ <div class="filter-meta">
+ <button id="filter-reset" class="filter-reset" hidden>Suche zurücksetzen</button>
+ </div>
+ </div>
+ </div>
+
+ <!-- ===== GRID ===== -->
+ <main id="content" class="blog-main container">
+ <div id="blog-grid" class="blog-grid" role="list"></div>
+ <p id="no-results" class="no-results" hidden>
+ Keine Artikel gefunden. <button id="no-results-reset">Zurücksetzen</button>
+ </p>
+ </main>
+
+ <!-- ===== FOOTER ===== -->
+ <footer class="site-footer">
+ <div class="footer-inner container">
+ <div class="footer-brand">
+ <a href="index.html" class="site-logo footer-logo">
+ <span class="logo-tri">triathlon</span><span class="logo-dash">-</span><span class="logo-coaching">coaching</span><span class="logo-dot">.</span><span class="logo-com">com</span>
+ </a>
+ <p>Triathlon-Coaching aus Leidenschaft.<br/>DTU-C-Trainer seit 2018.</p>
+ </div>
+ <nav class="footer-nav" aria-label="Footer Navigation">
+ <ul>
+ <li><a href="kontakt.html">Kontakt</a></li>
+ <li><a href="impressum.html">Impressum</a></li>
+ <li><a href="datenschutz.html">Datenschutz</a></li>
+ <li><a href="agb.html">AGB</a></li>
+ </ul>
+ </nav>
+ </div>
+ <div class="footer-bottom"><p>© 2025 triathlon-coaching.com</p></div>
+ </footer>
+
+ <script src="main.js"></script>
+</body>
+</html>
--- /dev/null
+<!DOCTYPE html>
+<html lang="de">
+<head>
+ <meta charset="UTF-8" />
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
+ <title>Coaching – triathlon-coaching.com</title>
+ <link rel="stylesheet" href="style.css" />
+ <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=Barlow+Condensed:wght@400;600;700;800&family=Barlow:ital,wght@0,400;0,500;0,600;1,400&display=swap" rel="stylesheet" />
+</head>
+
+<!-- data-blog-category locks the JS grid to this category only -->
+<body data-blog-category="Coaching">
+
+ <!-- ===== HEADER ===== -->
+ <header class="site-header">
+ <div class="header-inner">
+ <a href="index.html" class="site-logo">
+ <span class="logo-tri">triathlon</span><span class="logo-dash">-</span><span class="logo-coaching">coaching</span><span class="logo-dot">.</span><span class="logo-com">com</span>
+ </a>
+ <button class="nav-toggle" aria-label="Menü öffnen" aria-expanded="false">
+ <span></span><span></span><span></span>
+ </button>
+ <nav class="main-nav" aria-label="Hauptnavigation">
+ <ul class="nav-list">
+ <li class="nav-item"><a href="index.html">Über mich</a></li>
+ <li class="nav-item active has-dropdown">
+ <a href="coaching.html">Coaching</a>
+ <button class="dropdown-toggle" aria-label="Untermenü öffnen">▼</button>
+ <ul class="dropdown">
+ <li><a href="personal-coaching.html">Personal Coaching</a></li>
+ <li class="has-dropdown-2">
+ <a href="standard-plaene.html">Standard-Pläne</a>
+ <button class="dropdown-toggle">▼</button>
+ <ul class="dropdown-2">
+ <li><a href="langdistanz.html">Langdistanz & Ironman</a></li>
+ <li><a href="mitteldistanz.html">Mitteldistanz & Ironman 70.3</a></li>
+ <li><a href="kurzdistanz.html">Kurz- & olympische Distanz</a></li>
+ </ul>
+ </li>
+ </ul>
+ </li>
+ <li class="nav-item has-dropdown">
+ <a href="blog.html">Blog</a>
+ <button class="dropdown-toggle" aria-label="Untermenü öffnen">▼</button>
+ <ul class="dropdown">
+ <li><a href="blog.html?tag=Training">Training</a></li>
+ <li><a href="blog.html?tag=Ernährung">Ernährung</a></li>
+ <li><a href="blog.html?tag=Wettkampf">Wettkampf</a></li>
+ <li><a href="blog.html?tag=Regeneration">Regeneration</a></li>
+ <li><a href="blog.html?tag=Openwater">Openwater & Schwimmen</a></li>
+ <li><a href="blog.html?tag=Bike">Bike & Equipment</a></li>
+ <li><a href="blog.html?tag=Marathon">Marathon & Laufen</a></li>
+ <li><a href="blog.html?tag=Ironman">Ironman & Langdistanz</a></li>
+ </ul>
+ </li>
+ <li class="nav-item"><a href="camps.html">Camps</a></li>
+ <li class="nav-item has-dropdown">
+ <a href="tools.html">Tools & more</a>
+ <button class="dropdown-toggle" aria-label="Untermenü öffnen">▼</button>
+ <ul class="dropdown">
+ <li><a href="https://swim.triathlon-coaching.com">Schwimmtraining & -pläne</a></li>
+ <li><a href="https://roadtokona.triathlon-coaching.com">#roadtokona</a></li>
+ </ul>
+ </li>
+ <li class="nav-item"><a href="kontakt.html">Kontakt</a></li>
+ </ul>
+ </nav>
+ </div>
+ </header>
+
+ <!-- ===== PAGE HERO ===== -->
+ <section class="page-hero">
+ <div class="page-hero-inner container">
+ <div class="section-label">Zusammenarbeiten</div>
+ <h1 class="page-hero-title">Coaching</h1>
+ <p class="page-hero-sub">Alles rund um die Zusammenarbeit: Ansatz, Methoden, Ablauf und was dich erwartet.</p>
+ </div>
+ <div class="page-hero-bar">
+ <span id="result-count"></span>
+ </div>
+ </section>
+
+ <!-- ===== FILTER BAR — nur Suche, keine Pills ===== -->
+ <div class="filter-bar" role="search" aria-label="Artikel suchen">
+ <div class="filter-bar-inner container">
+ <div class="filter-search-wrap">
+ <svg class="filter-search-icon" viewBox="0 0 20 20" fill="none" aria-hidden="true">
+ <circle cx="9" cy="9" r="6" stroke="currentColor" stroke-width="1.8"/>
+ <path d="M13.5 13.5L17 17" stroke="currentColor" stroke-width="1.8" stroke-linecap="round"/>
+ </svg>
+ <input type="search" id="blog-search" class="filter-search" placeholder="Artikel suchen…" aria-label="Artikel suchen" autocomplete="off" />
+ </div>
+ <div class="filter-meta">
+ <button id="filter-reset" class="filter-reset" hidden>Suche zurücksetzen</button>
+ </div>
+ </div>
+ </div>
+
+ <!-- ===== GRID ===== -->
+ <main id="content" class="blog-main container">
+ <div id="blog-grid" class="blog-grid" role="list"></div>
+ <p id="no-results" class="no-results" hidden>
+ Keine Artikel gefunden. <button id="no-results-reset">Zurücksetzen</button>
+ </p>
+ </main>
+
+ <!-- ===== FOOTER ===== -->
+ <footer class="site-footer">
+ <div class="footer-inner container">
+ <div class="footer-brand">
+ <a href="index.html" class="site-logo footer-logo">
+ <span class="logo-tri">triathlon</span><span class="logo-dash">-</span><span class="logo-coaching">coaching</span><span class="logo-dot">.</span><span class="logo-com">com</span>
+ </a>
+ <p>Triathlon-Coaching aus Leidenschaft.<br/>DTU-C-Trainer seit 2018.</p>
+ </div>
+ <nav class="footer-nav" aria-label="Footer Navigation">
+ <ul>
+ <li><a href="kontakt.html">Kontakt</a></li>
+ <li><a href="impressum.html">Impressum</a></li>
+ <li><a href="datenschutz.html">Datenschutz</a></li>
+ <li><a href="agb.html">AGB</a></li>
+ </ul>
+ </nav>
+ </div>
+ <div class="footer-bottom"><p>© 2025 triathlon-coaching.com</p></div>
+ </footer>
+
+ <script src="main.js"></script>
+</body>
+</html>
--- /dev/null
+<!DOCTYPE html>
+<html lang="de">
+<head>
+ <meta charset="UTF-8" />
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
+ <title>triathlon-coaching.com – Über mich</title>
+ <link rel="stylesheet" href="style.css" />
+ <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=Barlow+Condensed:wght@400;600;700;800&family=Barlow:ital,wght@0,400;0,500;0,600;1,400&display=swap" rel="stylesheet" />
+</head>
+<body>
+
+ <!-- ===== HEADER / NAV ===== -->
+ <header class="site-header">
+ <div class="header-inner">
+ <a href="index.html" class="site-logo">
+ <span class="logo-tri">triathlon</span><span class="logo-dash">-</span><span class="logo-coaching">coaching</span><span class="logo-dot">.</span><span class="logo-com">com</span>
+ </a>
+
+ <button class="nav-toggle" aria-label="Menü öffnen" aria-expanded="false">
+ <span></span><span></span><span></span>
+ </button>
+
+ <nav class="main-nav" aria-label="Hauptnavigation">
+ <ul class="nav-list">
+ <li class="nav-item active"><a href="index.html">Über mich</a></li>
+
+ <li class="nav-item has-dropdown">
+ <a href="coaching.html">Coaching</a>
+ <button class="dropdown-toggle" aria-label="Untermenü öffnen">▼</button>
+ <ul class="dropdown">
+ <li><a href="personal-coaching.html">Personal Coaching</a></li>
+ <li class="has-dropdown-2">
+ <a href="standard-plaene.html">Standard-Pläne</a>
+ <button class="dropdown-toggle" aria-label="Untermenü öffnen">►</button>
+ <ul class="dropdown-2">
+ <li><a href="langdistanz.html">Langdistanz & Ironman</a></li>
+ <li><a href="mitteldistanz.html">Mitteldistanz & Ironman 70.3</a></li>
+ <li><a href="kurzdistanz.html">Kurz- & olympische Distanz</a></li>
+ </ul>
+ </li>
+ </ul>
+ </li>
+
+ <li class="nav-item has-dropdown">
+ <a href="blog.html">Blog</a>
+ <button class="dropdown-toggle" aria-label="Untermenü öffnen">▼</button>
+ <ul class="dropdown">
+ <li><a href="blog.html?tag=Training">Training</a></li>
+ <li><a href="blog.html?tag=Ernährung">Ernährung</a></li>
+ <li><a href="blog.html?tag=Wettkampf">Wettkampf</a></li>
+ <li><a href="blog.html?tag=Regeneration">Regeneration</a></li>
+ <li><a href="blog.html?tag=Openwater">Openwater & Schwimmen</a></li>
+ <li><a href="blog.html?tag=Bike">Bike & Equipment</a></li>
+ <li><a href="blog.html?tag=Marathon">Marathon & Laufen</a></li>
+ <li><a href="blog.html?tag=Ironman">Ironman & Langdistanz</a></li>
+ </ul>
+ </li>
+
+ <li class="nav-item"><a href="camps.html">Camps</a></li>
+
+ <li class="nav-item has-dropdown">
+ <a href="tools.html">Tools & more</a>
+ <button class="dropdown-toggle" aria-label="Untermenü öffnen">▼</button>
+ <ul class="dropdown">
+ <li><a href="https://swim.triathlon-coaching.com">Schwimmtraining & -pläne</a></li>
+ <li><a href="https://roadtokona.triathlon-coaching.com">#roadtokona</a></li>
+ </ul>
+ </li>
+
+ <li class="nav-item"><a href="kontakt.html">Kontakt</a></li>
+ </ul>
+ </nav>
+ </div>
+ </header>
+
+ <!-- ===== HERO ===== -->
+ <section class="hero">
+ <div class="hero-bg">
+ <div class="hero-overlay"></div>
+ <div class="hero-shapes">
+ <div class="shape shape-1"></div>
+ <div class="shape shape-2"></div>
+ <div class="shape shape-3"></div>
+ </div>
+ </div>
+ <div class="hero-content">
+ <div class="hero-disciplines">
+ <span>Schwimmen</span>
+ <span class="sep">·</span>
+ <span>Radfahren</span>
+ <span class="sep">·</span>
+ <span>Laufen</span>
+ </div>
+ <h1 class="hero-title">Erfahrung,<br/>die zählt.</h1>
+ <p class="hero-sub">Seit 1997 im Triathlon. Seit 2018 lizensierter DTU-C-Trainer.<br/>Coaching, das aus echter Wettkampferfahrung entsteht.</p>
+ <div class="hero-ctas">
+ <a href="coaching.html" class="btn btn-primary">Coaching entdecken</a>
+ <a href="kontakt.html" class="btn btn-outline">Kontakt aufnehmen</a>
+ </div>
+ </div>
+ <div class="hero-scroll-hint" aria-hidden="true">
+ <span>Scroll</span>
+ <div class="scroll-line"></div>
+ </div>
+ </section>
+
+ <!-- ===== MAIN CONTENT ===== -->
+ <main id="content" class="main-content">
+
+ <!-- Intro strip -->
+ <div class="intro-strip">
+ <div class="strip-item">
+ <span class="strip-num">38+</span>
+ <span class="strip-label">Jahre Ausdauersport</span>
+ </div>
+ <div class="strip-divider"></div>
+ <div class="strip-item">
+ <span class="strip-num">DTU-C</span>
+ <span class="strip-label">Lizensierter Trainer</span>
+ </div>
+ <div class="strip-divider"></div>
+ <div class="strip-item">
+ <span class="strip-num">800m–</span>
+ <span class="strip-label">bis Ironman-Distanz</span>
+ </div>
+ </div>
+
+ <!-- About Section -->
+ <section class="about-section container">
+ <div class="about-image-col">
+ <div class="about-image-wrap">
+ <div class="about-image-placeholder">
+ <div class="img-inner">
+ <svg viewBox="0 0 120 120" xmlns="http://www.w3.org/2000/svg" aria-hidden="true">
+ <circle cx="60" cy="42" r="22" fill="#4d8591" opacity="0.6"/>
+ <ellipse cx="60" cy="95" rx="36" ry="22" fill="#4d8591" opacity="0.4"/>
+ </svg>
+ <p class="img-hint">Ihr Foto hier</p>
+ </div>
+ </div>
+ <div class="about-badge">
+ <span>DTU</span>
+ <span>C-Trainer</span>
+ </div>
+ </div>
+ </div>
+
+ <div class="about-text-col">
+ <div class="section-label">Über mich</div>
+ <h2 class="section-title">Wer bin ich?</h2>
+ <p>Seit 1987 bin ich Läufer und seit 1997 Triathlet – zum großen Teil leistungssportlich. Zwischen 800m und Ironman habe ich keine Strecke ausgelassen. Ich spreche bei meinem Training viel aus Erfahrung und kenne sowohl die Einsamkeit der langen Radausfahrt als auch die Hektik auf der Tartanbahn.</p>
+ <p>Kaum kürzer ist mein Interesse an der Trainingslehre und Sportwissenschaft. So begleitete mich über die Jahre als Athleten bald die Rolle des Trainers, Übungsleiters, Radguides, usw. Das hilft mir, meine langjährigen Erfahrungen und persönlichen Lektionen in meine Trainertätigkeit einfließen zu lassen.</p>
+ <p>Seit 2018 bin ich auch lizensierter DTU-C-Trainer.</p>
+ <a href="coaching.html" class="btn btn-primary">Mein Coaching-Angebot</a>
+ </div>
+ </section>
+
+ <!-- Timeline Section -->
+ <section class="timeline-section">
+ <div class="container">
+ <div class="section-label center">Mein Weg</div>
+ <h2 class="section-title center">Die ganze Wahrheit</h2>
+ <div class="timeline">
+
+ <div class="tl-item">
+ <div class="tl-year">1987</div>
+ <div class="tl-dot"></div>
+ <div class="tl-card">
+ <h3>Die ersten Schritte</h3>
+ <p>Mit 14 Jahren die ersten Laufschuhe geschnürt – zusammen mit meinem Vater. Nicht viel später folgte der erste Volkslauf über 10 km.</p>
+ </div>
+ </div>
+
+ <div class="tl-item">
+ <div class="tl-year">1989</div>
+ <div class="tl-dot"></div>
+ <div class="tl-card">
+ <h3>Marathon mit 16</h3>
+ <p>Berlin, erster Marathon: 3:10:51. Der Beginn einer langen Liebe zur langen Strecke – und zu Hawaii als großem Ziel.</p>
+ </div>
+ </div>
+
+ <div class="tl-item">
+ <div class="tl-year">1991</div>
+ <div class="tl-dot"></div>
+ <div class="tl-card">
+ <h3>Der Geruch von Tartan</h3>
+ <p>Bahntraining, Wettkämpfe, Lauf-ABC. Bestzeiten die bis heute stehen: 800m 1:58,3 · 3000m 8:42,4 · 5000m 15:25. Und: erster Volkstriathlon in Neuss.</p>
+ </div>
+ </div>
+
+ <div class="tl-item">
+ <div class="tl-year">1997</div>
+ <div class="tl-dot"></div>
+ <div class="tl-card">
+ <h3>Triathlet werden</h3>
+ <p>Qua selbstgefasstem Beschluß wurde ich Triathlet. Schwimmen: irgendwie. Rad: ein olles Rennrad. Laufen: davon hatte ich Ahnung.</p>
+ </div>
+ </div>
+
+ <div class="tl-item">
+ <div class="tl-year">1998</div>
+ <div class="tl-dot"></div>
+ <div class="tl-card">
+ <h3>Ironman Roth</h3>
+ <p>Ironman Europe in Roth – seitdem darf ich mich Ironman nennen. NRW-Liga, Laktatmessungen, Trainingspläne in Excel.</p>
+ </div>
+ </div>
+
+ <div class="tl-item">
+ <div class="tl-year">2018</div>
+ <div class="tl-dot"></div>
+ <div class="tl-card highlight">
+ <h3>DTU-C-Trainer</h3>
+ <p>Lizensierter Trainer des Deutschen Triathlon Union – die offizielle Bestätigung eines langen Wegs aus Erfahrung, Leidenschaft und Sportwissenschaft.</p>
+ </div>
+ </div>
+
+ </div>
+ </div>
+ </section>
+
+ <!-- CTA Banner -->
+ <section class="cta-banner">
+ <div class="container">
+ <h2>Bereit für dein nächstes Rennen?</h2>
+ <p>Ob Personal Coaching oder Standard-Plan – ich finde das richtige Angebot für dein Ziel.</p>
+ <div class="cta-banner-btns">
+ <a href="coaching.html" class="btn btn-primary">Coaching-Angebote</a>
+ <a href="kontakt.html" class="btn btn-outline-light">Kontakt</a>
+ </div>
+ </div>
+ </section>
+
+ </main>
+
+ <!-- ===== FOOTER ===== -->
+ <footer class="site-footer">
+ <div class="footer-inner container">
+ <div class="footer-brand">
+ <a href="index.html" class="site-logo footer-logo">
+ <span class="logo-tri">triathlon</span><span class="logo-dash">-</span><span class="logo-coaching">coaching</span><span class="logo-dot">.</span><span class="logo-com">com</span>
+ </a>
+ <p>Triathlon-Coaching aus Leidenschaft.<br/>DTU-C-Trainer seit 2018.</p>
+ </div>
+ <nav class="footer-nav" aria-label="Footer Navigation">
+ <ul>
+ <li><a href="kontakt.html">Kontakt</a></li>
+ <li><a href="impressum.html">Impressum</a></li>
+ <li><a href="datenschutz.html">Datenschutz</a></li>
+ <li><a href="agb.html">AGB</a></li>
+ </ul>
+ </nav>
+ </div>
+ <div class="footer-bottom">
+ <p>© 2025 triathlon-coaching.com</p>
+ </div>
+ </footer>
+
+ <script src="main.js"></script>
+</body>
+</html>
--- /dev/null
+<!DOCTYPE html>
+<html lang="de">
+<head>
+ <meta charset="UTF-8" />
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
+ <title>triathlon-coaching.com – Über mich</title>
+ <link rel="stylesheet" href="style.css" />
+ <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=Barlow+Condensed:wght@400;600;700;800&family=Barlow:ital,wght@0,400;0,500;0,600;1,400&display=swap" rel="stylesheet" />
+</head>
+<body>
+
+ <!-- ===== HEADER / NAV ===== -->
+ <header class="site-header">
+ <div class="header-inner">
+ <a href="index.html" class="site-logo">
+ <span class="logo-tri">triathlon</span><span class="logo-dash">-</span><span class="logo-coaching">coaching</span><span class="logo-dot">.</span><span class="logo-com">com</span>
+ </a>
+
+ <button class="nav-toggle" aria-label="Menü öffnen" aria-expanded="false">
+ <span></span><span></span><span></span>
+ </button>
+
+ <nav class="main-nav" aria-label="Hauptnavigation">
+ <ul class="nav-list">
+ <li class="nav-item active"><a href="index.html">Über mich</a></li>
+
+ <li class="nav-item has-dropdown">
+ <a href="coaching.html">Coaching</a>
+ <button class="dropdown-toggle" aria-label="Untermenü öffnen">▼</button>
+ <ul class="dropdown">
+ <li><a href="personal-coaching.html">Personal Coaching</a></li>
+ <li class="has-dropdown-2">
+ <a href="standard-plaene.html">Standard-Pläne</a>
+ <button class="dropdown-toggle" aria-label="Untermenü öffnen">►</button>
+ <ul class="dropdown-2">
+ <li><a href="langdistanz.html">Langdistanz & Ironman</a></li>
+ <li><a href="mitteldistanz.html">Mitteldistanz & Ironman 70.3</a></li>
+ <li><a href="kurzdistanz.html">Kurz- & olympische Distanz</a></li>
+ </ul>
+ </li>
+ </ul>
+ </li>
+
+ <li class="nav-item has-dropdown">
+ <a href="blog.html">Blog</a>
+ <button class="dropdown-toggle" aria-label="Untermenü öffnen">▼</button>
+ <ul class="dropdown">
+ <li><a href="blog.html?tag=Training">Training</a></li>
+ <li><a href="blog.html?tag=Ernährung">Ernährung</a></li>
+ <li><a href="blog.html?tag=Wettkampf">Wettkampf</a></li>
+ <li><a href="blog.html?tag=Regeneration">Regeneration</a></li>
+ <li><a href="blog.html?tag=Openwater">Openwater & Schwimmen</a></li>
+ <li><a href="blog.html?tag=Bike">Bike & Equipment</a></li>
+ <li><a href="blog.html?tag=Marathon">Marathon & Laufen</a></li>
+ <li><a href="blog.html?tag=Ironman">Ironman & Langdistanz</a></li>
+ </ul>
+ </li>
+
+ <li class="nav-item"><a href="camps.html">Camps</a></li>
+
+ <li class="nav-item has-dropdown">
+ <a href="tools.html">Tools & more</a>
+ <button class="dropdown-toggle" aria-label="Untermenü öffnen">▼</button>
+ <ul class="dropdown">
+ <li><a href="https://swim.triathlon-coaching.com">Schwimmtraining & -pläne</a></li>
+ <li><a href="https://roadtokona.triathlon-coaching.com">#roadtokona</a></li>
+ </ul>
+ </li>
+
+ <li class="nav-item"><a href="kontakt.html">Kontakt</a></li>
+ </ul>
+ </nav>
+ </div>
+ </header>
+
+ <!-- ===== HERO ===== -->
+ <section class="hero">
+ <div class="hero-bg">
+ <div class="hero-overlay"></div>
+ <div class="hero-shapes">
+ <div class="shape shape-1"></div>
+ <div class="shape shape-2"></div>
+ <div class="shape shape-3"></div>
+ </div>
+ </div>
+ <div class="hero-content">
+ <div class="hero-disciplines">
+ <span>Schwimmen</span>
+ <span class="sep">·</span>
+ <span>Radfahren</span>
+ <span class="sep">·</span>
+ <span>Laufen</span>
+ </div>
+ <h1 class="hero-title">Erfahrung,<br/>die zählt.</h1>
+ <p class="hero-sub">Seit 1997 im Triathlon. Seit 2018 lizensierter DTU-C-Trainer.<br/>Coaching, das aus echter Wettkampferfahrung entsteht.</p>
+ <div class="hero-ctas">
+ <a href="coaching.html" class="btn btn-primary">Coaching entdecken</a>
+ <a href="kontakt.html" class="btn btn-outline">Kontakt aufnehmen</a>
+ </div>
+ </div>
+ <div class="hero-scroll-hint" aria-hidden="true">
+ <span>Scroll</span>
+ <div class="scroll-line"></div>
+ </div>
+ </section>
+
+ <!-- ===== MAIN CONTENT ===== -->
+ <main id="content" class="main-content">
+
+ <!-- Intro strip -->
+ <div class="intro-strip">
+ <div class="strip-item">
+ <span class="strip-num">38+</span>
+ <span class="strip-label">Jahre Ausdauersport</span>
+ </div>
+ <div class="strip-divider"></div>
+ <div class="strip-item">
+ <span class="strip-num">DTU-C</span>
+ <span class="strip-label">Lizensierter Trainer</span>
+ </div>
+ <div class="strip-divider"></div>
+ <div class="strip-item">
+ <span class="strip-num">800m–</span>
+ <span class="strip-label">bis Ironman-Distanz</span>
+ </div>
+ </div>
+
+ <!-- About Section -->
+ <section class="about-section container">
+ <div class="about-image-col">
+ <div class="about-image-wrap">
+ <div class="about-image-placeholder">
+ <div class="img-inner">
+ <svg viewBox="0 0 120 120" xmlns="http://www.w3.org/2000/svg" aria-hidden="true">
+ <circle cx="60" cy="42" r="22" fill="#4d8591" opacity="0.6"/>
+ <ellipse cx="60" cy="95" rx="36" ry="22" fill="#4d8591" opacity="0.4"/>
+ </svg>
+ <p class="img-hint">Ihr Foto hier</p>
+ </div>
+ </div>
+ <div class="about-badge">
+ <span>DTU</span>
+ <span>C-Trainer</span>
+ </div>
+ </div>
+ </div>
+
+ <div class="about-text-col">
+ <div class="section-label">Über mich</div>
+ <h2 class="section-title">Wer bin ich?</h2>
+ <p>Seit 1987 bin ich Läufer und seit 1997 Triathlet – zum großen Teil leistungssportlich. Zwischen 800m und Ironman habe ich keine Strecke ausgelassen. Ich spreche bei meinem Training viel aus Erfahrung und kenne sowohl die Einsamkeit der langen Radausfahrt als auch die Hektik auf der Tartanbahn.</p>
+ <p>Kaum kürzer ist mein Interesse an der Trainingslehre und Sportwissenschaft. So begleitete mich über die Jahre als Athleten bald die Rolle des Trainers, Übungsleiters, Radguides, usw. Das hilft mir, meine langjährigen Erfahrungen und persönlichen Lektionen in meine Trainertätigkeit einfließen zu lassen.</p>
+ <p>Seit 2018 bin ich auch lizensierter DTU-C-Trainer.</p>
+ <a href="coaching.html" class="btn btn-primary">Mein Coaching-Angebot</a>
+ </div>
+ </section>
+
+ <!-- Timeline Section -->
+ <section class="timeline-section">
+ <div class="container">
+ <div class="section-label center">Mein Weg</div>
+ <h2 class="section-title center">Die ganze Wahrheit</h2>
+ <div class="timeline">
+
+ <div class="tl-item">
+ <div class="tl-year">1987</div>
+ <div class="tl-dot"></div>
+ <div class="tl-card">
+ <h3>Die ersten Schritte</h3>
+ <p>Mit 14 Jahren die ersten Laufschuhe geschnürt – zusammen mit meinem Vater. Nicht viel später folgte der erste Volkslauf über 10 km.</p>
+ </div>
+ </div>
+
+ <div class="tl-item">
+ <div class="tl-year">1989</div>
+ <div class="tl-dot"></div>
+ <div class="tl-card">
+ <h3>Marathon mit 16</h3>
+ <p>Berlin, erster Marathon: 3:10:51. Der Beginn einer langen Liebe zur langen Strecke – und zu Hawaii als großem Ziel.</p>
+ </div>
+ </div>
+
+ <div class="tl-item">
+ <div class="tl-year">1991</div>
+ <div class="tl-dot"></div>
+ <div class="tl-card">
+ <h3>Der Geruch von Tartan</h3>
+ <p>Bahntraining, Wettkämpfe, Lauf-ABC. Bestzeiten die bis heute stehen: 800m 1:58,3 · 3000m 8:42,4 · 5000m 15:25. Und: erster Volkstriathlon in Neuss.</p>
+ </div>
+ </div>
+
+ <div class="tl-item">
+ <div class="tl-year">1997</div>
+ <div class="tl-dot"></div>
+ <div class="tl-card">
+ <h3>Triathlet werden</h3>
+ <p>Qua selbstgefasstem Beschluß wurde ich Triathlet. Schwimmen: irgendwie. Rad: ein olles Rennrad. Laufen: davon hatte ich Ahnung.</p>
+ </div>
+ </div>
+
+ <div class="tl-item">
+ <div class="tl-year">1998</div>
+ <div class="tl-dot"></div>
+ <div class="tl-card">
+ <h3>Ironman Roth</h3>
+ <p>Ironman Europe in Roth – seitdem darf ich mich Ironman nennen. NRW-Liga, Laktatmessungen, Trainingspläne in Excel.</p>
+ </div>
+ </div>
+
+ <div class="tl-item">
+ <div class="tl-year">2018</div>
+ <div class="tl-dot"></div>
+ <div class="tl-card highlight">
+ <h3>DTU-C-Trainer</h3>
+ <p>Lizensierter Trainer des Deutschen Triathlon Union – die offizielle Bestätigung eines langen Wegs aus Erfahrung, Leidenschaft und Sportwissenschaft.</p>
+ </div>
+ </div>
+
+ </div>
+ </div>
+ </section>
+
+ <!-- CTA Banner -->
+ <section class="cta-banner">
+ <div class="container">
+ <h2>Bereit für dein nächstes Rennen?</h2>
+ <p>Ob Personal Coaching oder Standard-Plan – ich finde das richtige Angebot für dein Ziel.</p>
+ <div class="cta-banner-btns">
+ <a href="coaching.html" class="btn btn-primary">Coaching-Angebote</a>
+ <a href="kontakt.html" class="btn btn-outline-light">Kontakt</a>
+ </div>
+ </div>
+ </section>
+
+ </main>
+
+ <!-- ===== FOOTER ===== -->
+ <footer class="site-footer">
+ <div class="footer-inner container">
+ <div class="footer-brand">
+ <a href="index.html" class="site-logo footer-logo">
+ <span class="logo-tri">triathlon</span><span class="logo-dash">-</span><span class="logo-coaching">coaching</span><span class="logo-dot">.</span><span class="logo-com">com</span>
+ </a>
+ <p>Triathlon-Coaching aus Leidenschaft.<br/>DTU-C-Trainer seit 2018.</p>
+ </div>
+ <nav class="footer-nav" aria-label="Footer Navigation">
+ <ul>
+ <li><a href="kontakt.html">Kontakt</a></li>
+ <li><a href="impressum.html">Impressum</a></li>
+ <li><a href="datenschutz.html">Datenschutz</a></li>
+ <li><a href="agb.html">AGB</a></li>
+ </ul>
+ </nav>
+ </div>
+ <div class="footer-bottom">
+ <p>© 2025 triathlon-coaching.com</p>
+ </div>
+ </footer>
+
+ <script src="main.js"></script>
+</body>
+</html>
--- /dev/null
+<!DOCTYPE html>
+<html lang="de">
+<head>
+ <meta charset="UTF-8" />
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
+ <title>triathlon-coaching.com – Über mich</title>
+ <link rel="stylesheet" href="style.css" />
+ <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=Barlow+Condensed:wght@400;600;700;800&family=Barlow:ital,wght@0,400;0,500;0,600;1,400&display=swap" rel="stylesheet" />
+</head>
+<body>
+
+ <!-- ===== HEADER / NAV ===== -->
+ <header class="site-header">
+ <div class="header-inner">
+ <a href="index.html" class="site-logo">
+ <span class="logo-tri">triathlon</span><span class="logo-dash">-</span><span class="logo-coaching">coaching</span><span class="logo-dot">.</span><span class="logo-com">com</span>
+ </a>
+
+ <button class="nav-toggle" aria-label="Menü öffnen" aria-expanded="false">
+ <span></span><span></span><span></span>
+ </button>
+
+ <nav class="main-nav" aria-label="Hauptnavigation">
+ <ul class="nav-list">
+ <li class="nav-item active"><a href="index.html">Über mich</a></li>
+
+ <li class="nav-item has-dropdown">
+ <a href="coaching.html">Coaching</a>
+ <button class="dropdown-toggle" aria-label="Untermenü öffnen">▼</button>
+ <ul class="dropdown">
+ <li><a href="personal-coaching.html">Personal Coaching</a></li>
+ <li class="has-dropdown-2">
+ <a href="standard-plaene.html">Standard-Pläne</a>
+ <button class="dropdown-toggle" aria-label="Untermenü öffnen">►</button>
+ <ul class="dropdown-2">
+ <li><a href="langdistanz.html">Langdistanz & Ironman</a></li>
+ <li><a href="mitteldistanz.html">Mitteldistanz & Ironman 70.3</a></li>
+ <li><a href="kurzdistanz.html">Kurz- & olympische Distanz</a></li>
+ </ul>
+ </li>
+ </ul>
+ </li>
+
+ <li class="nav-item has-dropdown">
+ <a href="blog.html">Blog</a>
+ <button class="dropdown-toggle" aria-label="Untermenü öffnen">▼</button>
+ <ul class="dropdown">
+ <li><a href="blog.html?tag=Training">Training</a></li>
+ <li><a href="blog.html?tag=Ernährung">Ernährung</a></li>
+ <li><a href="blog.html?tag=Wettkampf">Wettkampf</a></li>
+ <li><a href="blog.html?tag=Regeneration">Regeneration</a></li>
+ <li><a href="blog.html?tag=Openwater">Openwater & Schwimmen</a></li>
+ <li><a href="blog.html?tag=Bike">Bike & Equipment</a></li>
+ <li><a href="blog.html?tag=Marathon">Marathon & Laufen</a></li>
+ <li><a href="blog.html?tag=Ironman">Ironman & Langdistanz</a></li>
+ </ul>
+ </li>
+
+ <li class="nav-item"><a href="camps.html">Camps</a></li>
+
+ <li class="nav-item has-dropdown">
+ <a href="tools.html">Tools & more</a>
+ <button class="dropdown-toggle" aria-label="Untermenü öffnen">▼</button>
+ <ul class="dropdown">
+ <li><a href="https://swim.triathlon-coaching.com">Schwimmtraining & -pläne</a></li>
+ <li><a href="https://roadtokona.triathlon-coaching.com">#roadtokona</a></li>
+ </ul>
+ </li>
+
+ <li class="nav-item"><a href="kontakt.html">Kontakt</a></li>
+ </ul>
+ </nav>
+ </div>
+ </header>
+
+ <!-- ===== HERO ===== -->
+ <section class="hero">
+ <div class="hero-bg">
+ <div class="hero-overlay"></div>
+ <div class="hero-shapes">
+ <div class="shape shape-1"></div>
+ <div class="shape shape-2"></div>
+ <div class="shape shape-3"></div>
+ </div>
+ </div>
+ <div class="hero-content">
+ <div class="hero-disciplines">
+ <span>Schwimmen</span>
+ <span class="sep">·</span>
+ <span>Radfahren</span>
+ <span class="sep">·</span>
+ <span>Laufen</span>
+ </div>
+ <h1 class="hero-title">Erfahrung,<br/>die zählt.</h1>
+ <p class="hero-sub">Seit 1997 im Triathlon. Seit 2018 lizensierter DTU-C-Trainer.<br/>Coaching, das aus echter Wettkampferfahrung entsteht.</p>
+ <div class="hero-ctas">
+ <a href="coaching.html" class="btn btn-primary">Coaching entdecken</a>
+ <a href="kontakt.html" class="btn btn-outline">Kontakt aufnehmen</a>
+ </div>
+ </div>
+ <div class="hero-scroll-hint" aria-hidden="true">
+ <span>Scroll</span>
+ <div class="scroll-line"></div>
+ </div>
+ </section>
+
+ <!-- ===== MAIN CONTENT ===== -->
+ <main id="content" class="main-content">
+
+ <!-- Intro strip -->
+ <div class="intro-strip">
+ <div class="strip-item">
+ <span class="strip-num">38+</span>
+ <span class="strip-label">Jahre Ausdauersport</span>
+ </div>
+ <div class="strip-divider"></div>
+ <div class="strip-item">
+ <span class="strip-num">DTU-C</span>
+ <span class="strip-label">Lizensierter Trainer</span>
+ </div>
+ <div class="strip-divider"></div>
+ <div class="strip-item">
+ <span class="strip-num">800m–</span>
+ <span class="strip-label">bis Ironman-Distanz</span>
+ </div>
+ </div>
+
+ <!-- About Section -->
+ <section class="about-section container">
+ <div class="about-image-col">
+ <div class="about-image-wrap">
+ <div class="about-image-placeholder">
+ <div class="img-inner">
+ <svg viewBox="0 0 120 120" xmlns="http://www.w3.org/2000/svg" aria-hidden="true">
+ <circle cx="60" cy="42" r="22" fill="#4d8591" opacity="0.6"/>
+ <ellipse cx="60" cy="95" rx="36" ry="22" fill="#4d8591" opacity="0.4"/>
+ </svg>
+ <p class="img-hint">Ihr Foto hier</p>
+ </div>
+ </div>
+ <div class="about-badge">
+ <span>DTU</span>
+ <span>C-Trainer</span>
+ </div>
+ </div>
+ </div>
+
+ <div class="about-text-col">
+ <div class="section-label">Über mich</div>
+ <h2 class="section-title">Wer bin ich?</h2>
+ <p>Seit 1987 bin ich Läufer und seit 1997 Triathlet – zum großen Teil leistungssportlich. Zwischen 800m und Ironman habe ich keine Strecke ausgelassen. Ich spreche bei meinem Training viel aus Erfahrung und kenne sowohl die Einsamkeit der langen Radausfahrt als auch die Hektik auf der Tartanbahn.</p>
+ <p>Kaum kürzer ist mein Interesse an der Trainingslehre und Sportwissenschaft. So begleitete mich über die Jahre als Athleten bald die Rolle des Trainers, Übungsleiters, Radguides, usw. Das hilft mir, meine langjährigen Erfahrungen und persönlichen Lektionen in meine Trainertätigkeit einfließen zu lassen.</p>
+ <p>Seit 2018 bin ich auch lizensierter DTU-C-Trainer.</p>
+ <a href="coaching.html" class="btn btn-primary">Mein Coaching-Angebot</a>
+ </div>
+ </section>
+
+ <!-- Timeline Section -->
+ <section class="timeline-section">
+ <div class="container">
+ <div class="section-label center">Mein Weg</div>
+ <h2 class="section-title center">Die ganze Wahrheit</h2>
+ <div class="timeline">
+
+ <div class="tl-item">
+ <div class="tl-year">1987</div>
+ <div class="tl-dot"></div>
+ <div class="tl-card">
+ <h3>Die ersten Schritte</h3>
+ <p>Mit 14 Jahren die ersten Laufschuhe geschnürt – zusammen mit meinem Vater. Nicht viel später folgte der erste Volkslauf über 10 km.</p>
+ </div>
+ </div>
+
+ <div class="tl-item">
+ <div class="tl-year">1989</div>
+ <div class="tl-dot"></div>
+ <div class="tl-card">
+ <h3>Marathon mit 16</h3>
+ <p>Berlin, erster Marathon: 3:10:51. Der Beginn einer langen Liebe zur langen Strecke – und zu Hawaii als großem Ziel.</p>
+ </div>
+ </div>
+
+ <div class="tl-item">
+ <div class="tl-year">1991</div>
+ <div class="tl-dot"></div>
+ <div class="tl-card">
+ <h3>Der Geruch von Tartan</h3>
+ <p>Bahntraining, Wettkämpfe, Lauf-ABC. Bestzeiten die bis heute stehen: 800m 1:58,3 · 3000m 8:42,4 · 5000m 15:25. Und: erster Volkstriathlon in Neuss.</p>
+ </div>
+ </div>
+
+ <div class="tl-item">
+ <div class="tl-year">1997</div>
+ <div class="tl-dot"></div>
+ <div class="tl-card">
+ <h3>Triathlet werden</h3>
+ <p>Qua selbstgefasstem Beschluß wurde ich Triathlet. Schwimmen: irgendwie. Rad: ein olles Rennrad. Laufen: davon hatte ich Ahnung.</p>
+ </div>
+ </div>
+
+ <div class="tl-item">
+ <div class="tl-year">1998</div>
+ <div class="tl-dot"></div>
+ <div class="tl-card">
+ <h3>Ironman Roth</h3>
+ <p>Ironman Europe in Roth – seitdem darf ich mich Ironman nennen. NRW-Liga, Laktatmessungen, Trainingspläne in Excel.</p>
+ </div>
+ </div>
+
+ <div class="tl-item">
+ <div class="tl-year">2018</div>
+ <div class="tl-dot"></div>
+ <div class="tl-card highlight">
+ <h3>DTU-C-Trainer</h3>
+ <p>Lizensierter Trainer des Deutschen Triathlon Union – die offizielle Bestätigung eines langen Wegs aus Erfahrung, Leidenschaft und Sportwissenschaft.</p>
+ </div>
+ </div>
+
+ </div>
+ </div>
+ </section>
+
+ <!-- CTA Banner -->
+ <section class="cta-banner">
+ <div class="container">
+ <h2>Bereit für dein nächstes Rennen?</h2>
+ <p>Ob Personal Coaching oder Standard-Plan – ich finde das richtige Angebot für dein Ziel.</p>
+ <div class="cta-banner-btns">
+ <a href="coaching.html" class="btn btn-primary">Coaching-Angebote</a>
+ <a href="kontakt.html" class="btn btn-outline-light">Kontakt</a>
+ </div>
+ </div>
+ </section>
+
+ </main>
+
+ <!-- ===== FOOTER ===== -->
+ <footer class="site-footer">
+ <div class="footer-inner container">
+ <div class="footer-brand">
+ <a href="index.html" class="site-logo footer-logo">
+ <span class="logo-tri">triathlon</span><span class="logo-dash">-</span><span class="logo-coaching">coaching</span><span class="logo-dot">.</span><span class="logo-com">com</span>
+ </a>
+ <p>Triathlon-Coaching aus Leidenschaft.<br/>DTU-C-Trainer seit 2018.</p>
+ </div>
+ <nav class="footer-nav" aria-label="Footer Navigation">
+ <ul>
+ <li><a href="kontakt.html">Kontakt</a></li>
+ <li><a href="impressum.html">Impressum</a></li>
+ <li><a href="datenschutz.html">Datenschutz</a></li>
+ <li><a href="agb.html">AGB</a></li>
+ </ul>
+ </nav>
+ </div>
+ <div class="footer-bottom">
+ <p>© 2025 triathlon-coaching.com</p>
+ </div>
+ </footer>
+
+ <script src="main.js"></script>
+</body>
+</html>
--- /dev/null
+<!DOCTYPE html>
+<html lang="de">
+<head>
+ <meta charset="UTF-8" />
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
+ <title>triathlon-coaching.com – Über mich</title>
+ <link rel="stylesheet" href="style.css" />
+ <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=Barlow+Condensed:wght@400;600;700;800&family=Barlow:ital,wght@0,400;0,500;0,600;1,400&display=swap" rel="stylesheet" />
+</head>
+<body>
+
+ <!-- ===== HEADER / NAV ===== -->
+ <header class="site-header">
+ <div class="header-inner">
+ <a href="index.html" class="site-logo">
+ <span class="logo-tri">triathlon</span><span class="logo-dash">-</span><span class="logo-coaching">coaching</span><span class="logo-dot">.</span><span class="logo-com">com</span>
+ </a>
+
+ <button class="nav-toggle" aria-label="Menü öffnen" aria-expanded="false">
+ <span></span><span></span><span></span>
+ </button>
+
+ <nav class="main-nav" aria-label="Hauptnavigation">
+ <ul class="nav-list">
+ <li class="nav-item active"><a href="index.html">Über mich</a></li>
+
+ <li class="nav-item has-dropdown">
+ <a href="coaching.html">Coaching</a>
+ <button class="dropdown-toggle" aria-label="Untermenü öffnen">▼</button>
+ <ul class="dropdown">
+ <li><a href="personal-coaching.html">Personal Coaching</a></li>
+ <li class="has-dropdown-2">
+ <a href="standard-plaene.html">Standard-Pläne</a>
+ <button class="dropdown-toggle" aria-label="Untermenü öffnen">►</button>
+ <ul class="dropdown-2">
+ <li><a href="langdistanz.html">Langdistanz & Ironman</a></li>
+ <li><a href="mitteldistanz.html">Mitteldistanz & Ironman 70.3</a></li>
+ <li><a href="kurzdistanz.html">Kurz- & olympische Distanz</a></li>
+ </ul>
+ </li>
+ </ul>
+ </li>
+
+ <li class="nav-item has-dropdown">
+ <a href="blog.html">Blog</a>
+ <button class="dropdown-toggle" aria-label="Untermenü öffnen">▼</button>
+ <ul class="dropdown">
+ <li><a href="blog.html?tag=Training">Training</a></li>
+ <li><a href="blog.html?tag=Ernährung">Ernährung</a></li>
+ <li><a href="blog.html?tag=Wettkampf">Wettkampf</a></li>
+ <li><a href="blog.html?tag=Regeneration">Regeneration</a></li>
+ <li><a href="blog.html?tag=Openwater">Openwater & Schwimmen</a></li>
+ <li><a href="blog.html?tag=Bike">Bike & Equipment</a></li>
+ <li><a href="blog.html?tag=Marathon">Marathon & Laufen</a></li>
+ <li><a href="blog.html?tag=Ironman">Ironman & Langdistanz</a></li>
+ </ul>
+ </li>
+
+ <li class="nav-item"><a href="camps.html">Camps</a></li>
+
+ <li class="nav-item has-dropdown">
+ <a href="tools.html">Tools & more</a>
+ <button class="dropdown-toggle" aria-label="Untermenü öffnen">▼</button>
+ <ul class="dropdown">
+ <li><a href="https://swim.triathlon-coaching.com">Schwimmtraining & -pläne</a></li>
+ <li><a href="https://roadtokona.triathlon-coaching.com">#roadtokona</a></li>
+ </ul>
+ </li>
+
+ <li class="nav-item"><a href="kontakt.html">Kontakt</a></li>
+ </ul>
+ </nav>
+ </div>
+ </header>
+
+ <!-- ===== HERO ===== -->
+ <section class="hero">
+ <div class="hero-bg">
+ <div class="hero-overlay"></div>
+ <div class="hero-shapes">
+ <div class="shape shape-1"></div>
+ <div class="shape shape-2"></div>
+ <div class="shape shape-3"></div>
+ </div>
+ </div>
+ <div class="hero-content">
+ <div class="hero-disciplines">
+ <span>Schwimmen</span>
+ <span class="sep">·</span>
+ <span>Radfahren</span>
+ <span class="sep">·</span>
+ <span>Laufen</span>
+ </div>
+ <h1 class="hero-title">Erfahrung,<br/>die zählt.</h1>
+ <p class="hero-sub">Seit 1997 im Triathlon. Seit 2018 lizensierter DTU-C-Trainer.<br/>Coaching, das aus echter Wettkampferfahrung entsteht.</p>
+ <div class="hero-ctas">
+ <a href="coaching.html" class="btn btn-primary">Coaching entdecken</a>
+ <a href="kontakt.html" class="btn btn-outline">Kontakt aufnehmen</a>
+ </div>
+ </div>
+ <div class="hero-scroll-hint" aria-hidden="true">
+ <span>Scroll</span>
+ <div class="scroll-line"></div>
+ </div>
+ </section>
+
+ <!-- ===== MAIN CONTENT ===== -->
+ <main id="content" class="main-content">
+
+ <!-- Intro strip -->
+ <div class="intro-strip">
+ <div class="strip-item">
+ <span class="strip-num">38+</span>
+ <span class="strip-label">Jahre Ausdauersport</span>
+ </div>
+ <div class="strip-divider"></div>
+ <div class="strip-item">
+ <span class="strip-num">DTU-C</span>
+ <span class="strip-label">Lizensierter Trainer</span>
+ </div>
+ <div class="strip-divider"></div>
+ <div class="strip-item">
+ <span class="strip-num">800m–</span>
+ <span class="strip-label">bis Ironman-Distanz</span>
+ </div>
+ </div>
+
+ <!-- About Section -->
+ <section class="about-section container">
+ <div class="about-image-col">
+ <div class="about-image-wrap">
+ <div class="about-image-placeholder">
+ <div class="img-inner">
+ <svg viewBox="0 0 120 120" xmlns="http://www.w3.org/2000/svg" aria-hidden="true">
+ <circle cx="60" cy="42" r="22" fill="#4d8591" opacity="0.6"/>
+ <ellipse cx="60" cy="95" rx="36" ry="22" fill="#4d8591" opacity="0.4"/>
+ </svg>
+ <p class="img-hint">Ihr Foto hier</p>
+ </div>
+ </div>
+ <div class="about-badge">
+ <span>DTU</span>
+ <span>C-Trainer</span>
+ </div>
+ </div>
+ </div>
+
+ <div class="about-text-col">
+ <div class="section-label">Über mich</div>
+ <h2 class="section-title">Wer bin ich?</h2>
+ <p>Seit 1987 bin ich Läufer und seit 1997 Triathlet – zum großen Teil leistungssportlich. Zwischen 800m und Ironman habe ich keine Strecke ausgelassen. Ich spreche bei meinem Training viel aus Erfahrung und kenne sowohl die Einsamkeit der langen Radausfahrt als auch die Hektik auf der Tartanbahn.</p>
+ <p>Kaum kürzer ist mein Interesse an der Trainingslehre und Sportwissenschaft. So begleitete mich über die Jahre als Athleten bald die Rolle des Trainers, Übungsleiters, Radguides, usw. Das hilft mir, meine langjährigen Erfahrungen und persönlichen Lektionen in meine Trainertätigkeit einfließen zu lassen.</p>
+ <p>Seit 2018 bin ich auch lizensierter DTU-C-Trainer.</p>
+ <a href="coaching.html" class="btn btn-primary">Mein Coaching-Angebot</a>
+ </div>
+ </section>
+
+ <!-- Timeline Section -->
+ <section class="timeline-section">
+ <div class="container">
+ <div class="section-label center">Mein Weg</div>
+ <h2 class="section-title center">Die ganze Wahrheit</h2>
+ <div class="timeline">
+
+ <div class="tl-item">
+ <div class="tl-year">1987</div>
+ <div class="tl-dot"></div>
+ <div class="tl-card">
+ <h3>Die ersten Schritte</h3>
+ <p>Mit 14 Jahren die ersten Laufschuhe geschnürt – zusammen mit meinem Vater. Nicht viel später folgte der erste Volkslauf über 10 km.</p>
+ </div>
+ </div>
+
+ <div class="tl-item">
+ <div class="tl-year">1989</div>
+ <div class="tl-dot"></div>
+ <div class="tl-card">
+ <h3>Marathon mit 16</h3>
+ <p>Berlin, erster Marathon: 3:10:51. Der Beginn einer langen Liebe zur langen Strecke – und zu Hawaii als großem Ziel.</p>
+ </div>
+ </div>
+
+ <div class="tl-item">
+ <div class="tl-year">1991</div>
+ <div class="tl-dot"></div>
+ <div class="tl-card">
+ <h3>Der Geruch von Tartan</h3>
+ <p>Bahntraining, Wettkämpfe, Lauf-ABC. Bestzeiten die bis heute stehen: 800m 1:58,3 · 3000m 8:42,4 · 5000m 15:25. Und: erster Volkstriathlon in Neuss.</p>
+ </div>
+ </div>
+
+ <div class="tl-item">
+ <div class="tl-year">1997</div>
+ <div class="tl-dot"></div>
+ <div class="tl-card">
+ <h3>Triathlet werden</h3>
+ <p>Qua selbstgefasstem Beschluß wurde ich Triathlet. Schwimmen: irgendwie. Rad: ein olles Rennrad. Laufen: davon hatte ich Ahnung.</p>
+ </div>
+ </div>
+
+ <div class="tl-item">
+ <div class="tl-year">1998</div>
+ <div class="tl-dot"></div>
+ <div class="tl-card">
+ <h3>Ironman Roth</h3>
+ <p>Ironman Europe in Roth – seitdem darf ich mich Ironman nennen. NRW-Liga, Laktatmessungen, Trainingspläne in Excel.</p>
+ </div>
+ </div>
+
+ <div class="tl-item">
+ <div class="tl-year">2018</div>
+ <div class="tl-dot"></div>
+ <div class="tl-card highlight">
+ <h3>DTU-C-Trainer</h3>
+ <p>Lizensierter Trainer des Deutschen Triathlon Union – die offizielle Bestätigung eines langen Wegs aus Erfahrung, Leidenschaft und Sportwissenschaft.</p>
+ </div>
+ </div>
+
+ </div>
+ </div>
+ </section>
+
+ <!-- CTA Banner -->
+ <section class="cta-banner">
+ <div class="container">
+ <h2>Bereit für dein nächstes Rennen?</h2>
+ <p>Ob Personal Coaching oder Standard-Plan – ich finde das richtige Angebot für dein Ziel.</p>
+ <div class="cta-banner-btns">
+ <a href="coaching.html" class="btn btn-primary">Coaching-Angebote</a>
+ <a href="kontakt.html" class="btn btn-outline-light">Kontakt</a>
+ </div>
+ </div>
+ </section>
+
+ </main>
+
+ <!-- ===== FOOTER ===== -->
+ <footer class="site-footer">
+ <div class="footer-inner container">
+ <div class="footer-brand">
+ <a href="index.html" class="site-logo footer-logo">
+ <span class="logo-tri">triathlon</span><span class="logo-dash">-</span><span class="logo-coaching">coaching</span><span class="logo-dot">.</span><span class="logo-com">com</span>
+ </a>
+ <p>Triathlon-Coaching aus Leidenschaft.<br/>DTU-C-Trainer seit 2018.</p>
+ </div>
+ <nav class="footer-nav" aria-label="Footer Navigation">
+ <ul>
+ <li><a href="kontakt.html">Kontakt</a></li>
+ <li><a href="impressum.html">Impressum</a></li>
+ <li><a href="datenschutz.html">Datenschutz</a></li>
+ <li><a href="agb.html">AGB</a></li>
+ </ul>
+ </nav>
+ </div>
+ <div class="footer-bottom">
+ <p>© 2025 triathlon-coaching.com</p>
+ </div>
+ </footer>
+
+ <script src="main.js"></script>
+</body>
+</html>
--- /dev/null
+<!DOCTYPE html>
+<html lang="de">
+<head>
+ <meta charset="UTF-8" />
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
+ <title>triathlon-coaching.com – Über mich</title>
+ <link rel="stylesheet" href="style.css" />
+ <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=Barlow+Condensed:wght@400;600;700;800&family=Barlow:ital,wght@0,400;0,500;0,600;1,400&display=swap" rel="stylesheet" />
+</head>
+<body>
+
+ <!-- ===== HEADER / NAV ===== -->
+ <header class="site-header">
+ <div class="header-inner">
+ <a href="index.html" class="site-logo">
+ <span class="logo-tri">triathlon</span><span class="logo-dash">-</span><span class="logo-coaching">coaching</span><span class="logo-dot">.</span><span class="logo-com">com</span>
+ </a>
+
+ <button class="nav-toggle" aria-label="Menü öffnen" aria-expanded="false">
+ <span></span><span></span><span></span>
+ </button>
+
+ <nav class="main-nav" aria-label="Hauptnavigation">
+ <ul class="nav-list">
+ <li class="nav-item active"><a href="index.html">Über mich</a></li>
+
+ <li class="nav-item has-dropdown">
+ <a href="coaching.html">Coaching</a>
+ <button class="dropdown-toggle" aria-label="Untermenü öffnen">▼</button>
+ <ul class="dropdown">
+ <li><a href="personal-coaching.html">Personal Coaching</a></li>
+ <li class="has-dropdown-2">
+ <a href="standard-plaene.html">Standard-Pläne</a>
+ <button class="dropdown-toggle" aria-label="Untermenü öffnen">►</button>
+ <ul class="dropdown-2">
+ <li><a href="langdistanz.html">Langdistanz & Ironman</a></li>
+ <li><a href="mitteldistanz.html">Mitteldistanz & Ironman 70.3</a></li>
+ <li><a href="kurzdistanz.html">Kurz- & olympische Distanz</a></li>
+ </ul>
+ </li>
+ </ul>
+ </li>
+
+ <li class="nav-item has-dropdown">
+ <a href="blog.html">Blog</a>
+ <button class="dropdown-toggle" aria-label="Untermenü öffnen">▼</button>
+ <ul class="dropdown">
+ <li><a href="blog.html?tag=Training">Training</a></li>
+ <li><a href="blog.html?tag=Ernährung">Ernährung</a></li>
+ <li><a href="blog.html?tag=Wettkampf">Wettkampf</a></li>
+ <li><a href="blog.html?tag=Regeneration">Regeneration</a></li>
+ <li><a href="blog.html?tag=Openwater">Openwater & Schwimmen</a></li>
+ <li><a href="blog.html?tag=Bike">Bike & Equipment</a></li>
+ <li><a href="blog.html?tag=Marathon">Marathon & Laufen</a></li>
+ <li><a href="blog.html?tag=Ironman">Ironman & Langdistanz</a></li>
+ </ul>
+ </li>
+
+ <li class="nav-item"><a href="camps.html">Camps</a></li>
+
+ <li class="nav-item has-dropdown">
+ <a href="tools.html">Tools & more</a>
+ <button class="dropdown-toggle" aria-label="Untermenü öffnen">▼</button>
+ <ul class="dropdown">
+ <li><a href="https://swim.triathlon-coaching.com">Schwimmtraining & -pläne</a></li>
+ <li><a href="https://roadtokona.triathlon-coaching.com">#roadtokona</a></li>
+ </ul>
+ </li>
+
+ <li class="nav-item"><a href="kontakt.html">Kontakt</a></li>
+ </ul>
+ </nav>
+ </div>
+ </header>
+
+ <!-- ===== HERO ===== -->
+ <section class="hero">
+ <div class="hero-bg">
+ <div class="hero-overlay"></div>
+ <div class="hero-shapes">
+ <div class="shape shape-1"></div>
+ <div class="shape shape-2"></div>
+ <div class="shape shape-3"></div>
+ </div>
+ </div>
+ <div class="hero-content">
+ <div class="hero-disciplines">
+ <span>Schwimmen</span>
+ <span class="sep">·</span>
+ <span>Radfahren</span>
+ <span class="sep">·</span>
+ <span>Laufen</span>
+ </div>
+ <h1 class="hero-title">Erfahrung,<br/>die zählt.</h1>
+ <p class="hero-sub">Seit 1997 im Triathlon. Seit 2018 lizensierter DTU-C-Trainer.<br/>Coaching, das aus echter Wettkampferfahrung entsteht.</p>
+ <div class="hero-ctas">
+ <a href="coaching.html" class="btn btn-primary">Coaching entdecken</a>
+ <a href="kontakt.html" class="btn btn-outline">Kontakt aufnehmen</a>
+ </div>
+ </div>
+ <div class="hero-scroll-hint" aria-hidden="true">
+ <span>Scroll</span>
+ <div class="scroll-line"></div>
+ </div>
+ </section>
+
+ <!-- ===== MAIN CONTENT ===== -->
+ <main id="content" class="main-content">
+
+ <!-- Intro strip -->
+ <div class="intro-strip">
+ <div class="strip-item">
+ <span class="strip-num">38+</span>
+ <span class="strip-label">Jahre Ausdauersport</span>
+ </div>
+ <div class="strip-divider"></div>
+ <div class="strip-item">
+ <span class="strip-num">DTU-C</span>
+ <span class="strip-label">Lizensierter Trainer</span>
+ </div>
+ <div class="strip-divider"></div>
+ <div class="strip-item">
+ <span class="strip-num">800m–</span>
+ <span class="strip-label">bis Ironman-Distanz</span>
+ </div>
+ </div>
+
+ <!-- About Section -->
+ <section class="about-section container">
+ <div class="about-image-col">
+ <div class="about-image-wrap">
+ <div class="about-image-placeholder">
+ <div class="img-inner">
+ <svg viewBox="0 0 120 120" xmlns="http://www.w3.org/2000/svg" aria-hidden="true">
+ <circle cx="60" cy="42" r="22" fill="#4d8591" opacity="0.6"/>
+ <ellipse cx="60" cy="95" rx="36" ry="22" fill="#4d8591" opacity="0.4"/>
+ </svg>
+ <p class="img-hint">Ihr Foto hier</p>
+ </div>
+ </div>
+ <div class="about-badge">
+ <span>DTU</span>
+ <span>C-Trainer</span>
+ </div>
+ </div>
+ </div>
+
+ <div class="about-text-col">
+ <div class="section-label">Über mich</div>
+ <h2 class="section-title">Wer bin ich?</h2>
+ <p>Seit 1987 bin ich Läufer und seit 1997 Triathlet – zum großen Teil leistungssportlich. Zwischen 800m und Ironman habe ich keine Strecke ausgelassen. Ich spreche bei meinem Training viel aus Erfahrung und kenne sowohl die Einsamkeit der langen Radausfahrt als auch die Hektik auf der Tartanbahn.</p>
+ <p>Kaum kürzer ist mein Interesse an der Trainingslehre und Sportwissenschaft. So begleitete mich über die Jahre als Athleten bald die Rolle des Trainers, Übungsleiters, Radguides, usw. Das hilft mir, meine langjährigen Erfahrungen und persönlichen Lektionen in meine Trainertätigkeit einfließen zu lassen.</p>
+ <p>Seit 2018 bin ich auch lizensierter DTU-C-Trainer.</p>
+ <a href="coaching.html" class="btn btn-primary">Mein Coaching-Angebot</a>
+ </div>
+ </section>
+
+ <!-- Timeline Section -->
+ <section class="timeline-section">
+ <div class="container">
+ <div class="section-label center">Mein Weg</div>
+ <h2 class="section-title center">Die ganze Wahrheit</h2>
+ <div class="timeline">
+
+ <div class="tl-item">
+ <div class="tl-year">1987</div>
+ <div class="tl-dot"></div>
+ <div class="tl-card">
+ <h3>Die ersten Schritte</h3>
+ <p>Mit 14 Jahren die ersten Laufschuhe geschnürt – zusammen mit meinem Vater. Nicht viel später folgte der erste Volkslauf über 10 km.</p>
+ </div>
+ </div>
+
+ <div class="tl-item">
+ <div class="tl-year">1989</div>
+ <div class="tl-dot"></div>
+ <div class="tl-card">
+ <h3>Marathon mit 16</h3>
+ <p>Berlin, erster Marathon: 3:10:51. Der Beginn einer langen Liebe zur langen Strecke – und zu Hawaii als großem Ziel.</p>
+ </div>
+ </div>
+
+ <div class="tl-item">
+ <div class="tl-year">1991</div>
+ <div class="tl-dot"></div>
+ <div class="tl-card">
+ <h3>Der Geruch von Tartan</h3>
+ <p>Bahntraining, Wettkämpfe, Lauf-ABC. Bestzeiten die bis heute stehen: 800m 1:58,3 · 3000m 8:42,4 · 5000m 15:25. Und: erster Volkstriathlon in Neuss.</p>
+ </div>
+ </div>
+
+ <div class="tl-item">
+ <div class="tl-year">1997</div>
+ <div class="tl-dot"></div>
+ <div class="tl-card">
+ <h3>Triathlet werden</h3>
+ <p>Qua selbstgefasstem Beschluß wurde ich Triathlet. Schwimmen: irgendwie. Rad: ein olles Rennrad. Laufen: davon hatte ich Ahnung.</p>
+ </div>
+ </div>
+
+ <div class="tl-item">
+ <div class="tl-year">1998</div>
+ <div class="tl-dot"></div>
+ <div class="tl-card">
+ <h3>Ironman Roth</h3>
+ <p>Ironman Europe in Roth – seitdem darf ich mich Ironman nennen. NRW-Liga, Laktatmessungen, Trainingspläne in Excel.</p>
+ </div>
+ </div>
+
+ <div class="tl-item">
+ <div class="tl-year">2018</div>
+ <div class="tl-dot"></div>
+ <div class="tl-card highlight">
+ <h3>DTU-C-Trainer</h3>
+ <p>Lizensierter Trainer des Deutschen Triathlon Union – die offizielle Bestätigung eines langen Wegs aus Erfahrung, Leidenschaft und Sportwissenschaft.</p>
+ </div>
+ </div>
+
+ </div>
+ </div>
+ </section>
+
+ <!-- CTA Banner -->
+ <section class="cta-banner">
+ <div class="container">
+ <h2>Bereit für dein nächstes Rennen?</h2>
+ <p>Ob Personal Coaching oder Standard-Plan – ich finde das richtige Angebot für dein Ziel.</p>
+ <div class="cta-banner-btns">
+ <a href="coaching.html" class="btn btn-primary">Coaching-Angebote</a>
+ <a href="kontakt.html" class="btn btn-outline-light">Kontakt</a>
+ </div>
+ </div>
+ </section>
+
+ </main>
+
+ <!-- ===== FOOTER ===== -->
+ <footer class="site-footer">
+ <div class="footer-inner container">
+ <div class="footer-brand">
+ <a href="index.html" class="site-logo footer-logo">
+ <span class="logo-tri">triathlon</span><span class="logo-dash">-</span><span class="logo-coaching">coaching</span><span class="logo-dot">.</span><span class="logo-com">com</span>
+ </a>
+ <p>Triathlon-Coaching aus Leidenschaft.<br/>DTU-C-Trainer seit 2018.</p>
+ </div>
+ <nav class="footer-nav" aria-label="Footer Navigation">
+ <ul>
+ <li><a href="kontakt.html">Kontakt</a></li>
+ <li><a href="impressum.html">Impressum</a></li>
+ <li><a href="datenschutz.html">Datenschutz</a></li>
+ <li><a href="agb.html">AGB</a></li>
+ </ul>
+ </nav>
+ </div>
+ <div class="footer-bottom">
+ <p>© 2025 triathlon-coaching.com</p>
+ </div>
+ </footer>
+
+ <script src="main.js"></script>
+</body>
+</html>
--- /dev/null
+<!DOCTYPE html>
+<html lang="de">
+<head>
+ <meta charset="UTF-8" />
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
+ <title>triathlon-coaching.com – Über mich</title>
+ <link rel="stylesheet" href="style.css" />
+ <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=Barlow+Condensed:wght@400;600;700;800&family=Barlow:ital,wght@0,400;0,500;0,600;1,400&display=swap" rel="stylesheet" />
+</head>
+<body>
+
+ <!-- ===== HEADER / NAV ===== -->
+ <header class="site-header">
+ <div class="header-inner">
+ <a href="index.html" class="site-logo">
+ <span class="logo-tri">triathlon</span><span class="logo-dash">-</span><span class="logo-coaching">coaching</span><span class="logo-dot">.</span><span class="logo-com">com</span>
+ </a>
+
+ <button class="nav-toggle" aria-label="Menü öffnen" aria-expanded="false">
+ <span></span><span></span><span></span>
+ </button>
+
+ <nav class="main-nav" aria-label="Hauptnavigation">
+ <ul class="nav-list">
+ <li class="nav-item active"><a href="index.html">Über mich</a></li>
+
+ <li class="nav-item has-dropdown">
+ <a href="coaching.html">Coaching</a>
+ <button class="dropdown-toggle" aria-label="Untermenü öffnen">▼</button>
+ <ul class="dropdown">
+ <li><a href="personal-coaching.html">Personal Coaching</a></li>
+ <li class="has-dropdown-2">
+ <a href="standard-plaene.html">Standard-Pläne</a>
+ <button class="dropdown-toggle" aria-label="Untermenü öffnen">►</button>
+ <ul class="dropdown-2">
+ <li><a href="langdistanz.html">Langdistanz & Ironman</a></li>
+ <li><a href="mitteldistanz.html">Mitteldistanz & Ironman 70.3</a></li>
+ <li><a href="kurzdistanz.html">Kurz- & olympische Distanz</a></li>
+ </ul>
+ </li>
+ </ul>
+ </li>
+
+ <li class="nav-item has-dropdown">
+ <a href="blog.html">Blog</a>
+ <button class="dropdown-toggle" aria-label="Untermenü öffnen">▼</button>
+ <ul class="dropdown">
+ <li><a href="blog.html?tag=Training">Training</a></li>
+ <li><a href="blog.html?tag=Ernährung">Ernährung</a></li>
+ <li><a href="blog.html?tag=Wettkampf">Wettkampf</a></li>
+ <li><a href="blog.html?tag=Regeneration">Regeneration</a></li>
+ <li><a href="blog.html?tag=Openwater">Openwater & Schwimmen</a></li>
+ <li><a href="blog.html?tag=Bike">Bike & Equipment</a></li>
+ <li><a href="blog.html?tag=Marathon">Marathon & Laufen</a></li>
+ <li><a href="blog.html?tag=Ironman">Ironman & Langdistanz</a></li>
+ </ul>
+ </li>
+
+ <li class="nav-item"><a href="camps.html">Camps</a></li>
+
+ <li class="nav-item has-dropdown">
+ <a href="tools.html">Tools & more</a>
+ <button class="dropdown-toggle" aria-label="Untermenü öffnen">▼</button>
+ <ul class="dropdown">
+ <li><a href="https://swim.triathlon-coaching.com">Schwimmtraining & -pläne</a></li>
+ <li><a href="https://roadtokona.triathlon-coaching.com">#roadtokona</a></li>
+ </ul>
+ </li>
+
+ <li class="nav-item"><a href="kontakt.html">Kontakt</a></li>
+ </ul>
+ </nav>
+ </div>
+ </header>
+
+ <!-- ===== HERO ===== -->
+ <section class="hero">
+ <div class="hero-bg">
+ <div class="hero-overlay"></div>
+ <div class="hero-shapes">
+ <div class="shape shape-1"></div>
+ <div class="shape shape-2"></div>
+ <div class="shape shape-3"></div>
+ </div>
+ </div>
+ <div class="hero-content">
+ <div class="hero-disciplines">
+ <span>Schwimmen</span>
+ <span class="sep">·</span>
+ <span>Radfahren</span>
+ <span class="sep">·</span>
+ <span>Laufen</span>
+ </div>
+ <h1 class="hero-title">Erfahrung,<br/>die zählt.</h1>
+ <p class="hero-sub">Seit 1997 im Triathlon. Seit 2018 lizensierter DTU-C-Trainer.<br/>Coaching, das aus echter Wettkampferfahrung entsteht.</p>
+ <div class="hero-ctas">
+ <a href="coaching.html" class="btn btn-primary">Coaching entdecken</a>
+ <a href="kontakt.html" class="btn btn-outline">Kontakt aufnehmen</a>
+ </div>
+ </div>
+ <div class="hero-scroll-hint" aria-hidden="true">
+ <span>Scroll</span>
+ <div class="scroll-line"></div>
+ </div>
+ </section>
+
+ <!-- ===== MAIN CONTENT ===== -->
+ <main id="content" class="main-content">
+
+ <!-- Intro strip -->
+ <div class="intro-strip">
+ <div class="strip-item">
+ <span class="strip-num">38+</span>
+ <span class="strip-label">Jahre Ausdauersport</span>
+ </div>
+ <div class="strip-divider"></div>
+ <div class="strip-item">
+ <span class="strip-num">DTU-C</span>
+ <span class="strip-label">Lizensierter Trainer</span>
+ </div>
+ <div class="strip-divider"></div>
+ <div class="strip-item">
+ <span class="strip-num">800m–</span>
+ <span class="strip-label">bis Ironman-Distanz</span>
+ </div>
+ </div>
+
+ <!-- About Section -->
+ <section class="about-section container">
+ <div class="about-image-col">
+ <div class="about-image-wrap">
+ <div class="about-image-placeholder">
+ <div class="img-inner">
+ <svg viewBox="0 0 120 120" xmlns="http://www.w3.org/2000/svg" aria-hidden="true">
+ <circle cx="60" cy="42" r="22" fill="#4d8591" opacity="0.6"/>
+ <ellipse cx="60" cy="95" rx="36" ry="22" fill="#4d8591" opacity="0.4"/>
+ </svg>
+ <p class="img-hint">Ihr Foto hier</p>
+ </div>
+ </div>
+ <div class="about-badge">
+ <span>DTU</span>
+ <span>C-Trainer</span>
+ </div>
+ </div>
+ </div>
+
+ <div class="about-text-col">
+ <div class="section-label">Über mich</div>
+ <h2 class="section-title">Wer bin ich?</h2>
+ <p>Seit 1987 bin ich Läufer und seit 1997 Triathlet – zum großen Teil leistungssportlich. Zwischen 800m und Ironman habe ich keine Strecke ausgelassen. Ich spreche bei meinem Training viel aus Erfahrung und kenne sowohl die Einsamkeit der langen Radausfahrt als auch die Hektik auf der Tartanbahn.</p>
+ <p>Kaum kürzer ist mein Interesse an der Trainingslehre und Sportwissenschaft. So begleitete mich über die Jahre als Athleten bald die Rolle des Trainers, Übungsleiters, Radguides, usw. Das hilft mir, meine langjährigen Erfahrungen und persönlichen Lektionen in meine Trainertätigkeit einfließen zu lassen.</p>
+ <p>Seit 2018 bin ich auch lizensierter DTU-C-Trainer.</p>
+ <a href="coaching.html" class="btn btn-primary">Mein Coaching-Angebot</a>
+ </div>
+ </section>
+
+ <!-- Timeline Section -->
+ <section class="timeline-section">
+ <div class="container">
+ <div class="section-label center">Mein Weg</div>
+ <h2 class="section-title center">Die ganze Wahrheit</h2>
+ <div class="timeline">
+
+ <div class="tl-item">
+ <div class="tl-year">1987</div>
+ <div class="tl-dot"></div>
+ <div class="tl-card">
+ <h3>Die ersten Schritte</h3>
+ <p>Mit 14 Jahren die ersten Laufschuhe geschnürt – zusammen mit meinem Vater. Nicht viel später folgte der erste Volkslauf über 10 km.</p>
+ </div>
+ </div>
+
+ <div class="tl-item">
+ <div class="tl-year">1989</div>
+ <div class="tl-dot"></div>
+ <div class="tl-card">
+ <h3>Marathon mit 16</h3>
+ <p>Berlin, erster Marathon: 3:10:51. Der Beginn einer langen Liebe zur langen Strecke – und zu Hawaii als großem Ziel.</p>
+ </div>
+ </div>
+
+ <div class="tl-item">
+ <div class="tl-year">1991</div>
+ <div class="tl-dot"></div>
+ <div class="tl-card">
+ <h3>Der Geruch von Tartan</h3>
+ <p>Bahntraining, Wettkämpfe, Lauf-ABC. Bestzeiten die bis heute stehen: 800m 1:58,3 · 3000m 8:42,4 · 5000m 15:25. Und: erster Volkstriathlon in Neuss.</p>
+ </div>
+ </div>
+
+ <div class="tl-item">
+ <div class="tl-year">1997</div>
+ <div class="tl-dot"></div>
+ <div class="tl-card">
+ <h3>Triathlet werden</h3>
+ <p>Qua selbstgefasstem Beschluß wurde ich Triathlet. Schwimmen: irgendwie. Rad: ein olles Rennrad. Laufen: davon hatte ich Ahnung.</p>
+ </div>
+ </div>
+
+ <div class="tl-item">
+ <div class="tl-year">1998</div>
+ <div class="tl-dot"></div>
+ <div class="tl-card">
+ <h3>Ironman Roth</h3>
+ <p>Ironman Europe in Roth – seitdem darf ich mich Ironman nennen. NRW-Liga, Laktatmessungen, Trainingspläne in Excel.</p>
+ </div>
+ </div>
+
+ <div class="tl-item">
+ <div class="tl-year">2018</div>
+ <div class="tl-dot"></div>
+ <div class="tl-card highlight">
+ <h3>DTU-C-Trainer</h3>
+ <p>Lizensierter Trainer des Deutschen Triathlon Union – die offizielle Bestätigung eines langen Wegs aus Erfahrung, Leidenschaft und Sportwissenschaft.</p>
+ </div>
+ </div>
+
+ </div>
+ </div>
+ </section>
+
+ <!-- CTA Banner -->
+ <section class="cta-banner">
+ <div class="container">
+ <h2>Bereit für dein nächstes Rennen?</h2>
+ <p>Ob Personal Coaching oder Standard-Plan – ich finde das richtige Angebot für dein Ziel.</p>
+ <div class="cta-banner-btns">
+ <a href="coaching.html" class="btn btn-primary">Coaching-Angebote</a>
+ <a href="kontakt.html" class="btn btn-outline-light">Kontakt</a>
+ </div>
+ </div>
+ </section>
+
+ </main>
+
+ <!-- ===== FOOTER ===== -->
+ <footer class="site-footer">
+ <div class="footer-inner container">
+ <div class="footer-brand">
+ <a href="index.html" class="site-logo footer-logo">
+ <span class="logo-tri">triathlon</span><span class="logo-dash">-</span><span class="logo-coaching">coaching</span><span class="logo-dot">.</span><span class="logo-com">com</span>
+ </a>
+ <p>Triathlon-Coaching aus Leidenschaft.<br/>DTU-C-Trainer seit 2018.</p>
+ </div>
+ <nav class="footer-nav" aria-label="Footer Navigation">
+ <ul>
+ <li><a href="kontakt.html">Kontakt</a></li>
+ <li><a href="impressum.html">Impressum</a></li>
+ <li><a href="datenschutz.html">Datenschutz</a></li>
+ <li><a href="agb.html">AGB</a></li>
+ </ul>
+ </nav>
+ </div>
+ <div class="footer-bottom">
+ <p>© 2025 triathlon-coaching.com</p>
+ </div>
+ </footer>
+
+ <script src="main.js"></script>
+</body>
+</html>
--- /dev/null
+---
+title: "AGB - triathlon-coaching.com"
+slug: agb-triathlon-coaching-com
+excerpt: "Um dir ein optimales Erlebnis zu bieten, verwenden wir Technologien wie Cookies, um Geräteinformationen zu speichern und/oder darauf zuzugreifen. Wenn du"
+seo_title: "AGB - triathlon-coaching.com"
+seo_description: "Um dir ein optimales Erlebnis zu bieten, verwenden wir Technologien wie Cookies, um Geräteinformationen zu speichern und/oder darauf zuzugreifen. Wenn du"
+source: https://www.triathlon-coaching.com/?page_id=74
+---
+
+Um dir ein optimales Erlebnis zu bieten, verwenden wir Technologien wie Cookies, um Geräteinformationen zu speichern und/oder darauf zuzugreifen. Wenn du diesen Technologien zustimmst, können wir Daten wie das Surfverhalten oder eindeutige IDs auf dieser Website verarbeiten. Wenn du deine Zustimmung nicht erteilst oder zurückziehst, können bestimmte Merkmale und Funktionen beeinträchtigt werden.
+
+Die technische Speicherung oder der Zugang ist unbedingt erforderlich für den rechtmäßigen Zweck, die Nutzung eines bestimmten Dienstes zu ermöglichen, der vom Teilnehmer oder Nutzer ausdrücklich gewünscht wird, oder für den alleinigen Zweck, die Übertragung einer Nachricht über ein elektronisches Kommunikationsnetz durchzuführen.
+
+
+
+
+
+Die technische Speicherung oder der Zugriff ist für den rechtmäßigen Zweck der Speicherung von Präferenzen erforderlich, die nicht vom Abonnenten oder Benutzer angefordert wurden.
+
+
+
+
+
+Die technische Speicherung oder der Zugriff, der ausschließlich zu statistischen Zwecken erfolgt.
+Die technische Speicherung oder der Zugriff, der ausschließlich zu anonymen statistischen Zwecken verwendet wird. Ohne eine Vorladung, die freiwillige Zustimmung deines Internetdienstanbieters oder zusätzliche Aufzeichnungen von Dritten können die zu diesem Zweck gespeicherten oder abgerufenen Informationen allein in der Regel nicht dazu verwendet werden, dich zu identifizieren.
+
+
+
+
+
+Die technische Speicherung oder der Zugriff ist erforderlich, um Nutzerprofile zu erstellen, um Werbung zu versenden oder um den Nutzer auf einer Website oder über mehrere Websites hinweg zu ähnlichen Marketingzwecken zu verfolgen.
\ No newline at end of file
--- /dev/null
+---
+title: "Bahn-Knigge: Die ungeschriebenen Gesetze auf der Bahn - triathlon-coaching.com"
+slug: bahn-knigge-die-ungeschriebenen-gesetze-auf-der-bahn-triathlon-coaching-com
+excerpt: "### Leichtathletik ist eine eigene Welt Auch wenn beim Triathlon Laufen dabei ist, sind Triathleten keine Läufer. Das fängt damit an, dass lächerliche 😉 3000m"
+seo_title: "Bahn-Knigge: Die ungeschriebenen Gesetze auf der Bahn - triathlon-coaching.com"
+seo_description: "### Leichtathletik ist eine eigene Welt Auch wenn beim Triathlon Laufen dabei ist, sind Triathleten keine Läufer. Das fängt damit an, dass lächerliche 😉 3000m"
+source: https://www.triathlon-coaching.com/?p=782
+---
+
+### Leichtathletik ist eine eigene Welt
+
+Auch wenn beim Triathlon Laufen dabei ist, sind Triathleten keine Läufer.
+Das fängt damit an, dass lächerliche 😉 3000m schon eine Langstrecke sind und ein Sprinttriathlon im besten Fall weniger als eine Stunde dauert.
+
+In der Leichtathletik gibt es natürlich noch Sprung, Stoß und Wurf, aber das nur der Vollständigkeit halber.
+Alles andere ist irgendwie Laufen und findet auf der Bahn statt.
+
+Die Innenbahn einer Leichtathletikanlage ist exat 400 m lang, gemessen in 30 cm Abstand zur Innenkante. Und auf der finden unsere Tempoläufe statt, aber auch die der Leichtathletik-Abteilung.
+Wenn Du nicht gerade zu den Allerschnellsten im Triathlon gehörst, zeigt Dir ein Bahnläufer in der Regel die Hacken. 60 Sekunden / Runde ( 2:30er Schnitt) kommen vor und sind eine völlig andere Welt.
+
+Damit das sportlich fair und respektvoll sowie unfallfrei von statten geht gibt es diese ungeschriebenen
+
+### Regeln:
+
+###### Fairness:
+
+Triathleten sind in der Regel zu Gast auf einer Leichtahletikanlage. Oft findet dort auch Nachwuchstraining statt – als erwachsener Sportler bist Du Vorbild.
+
+###### Wir laufen IMMER gegen den Uhrzeigersinn.
+
+Wer das mal anders machen möchte: gerne, solange Du alleine bist. Sobald jemand dazustösst: Kehrt marsch!
+
+###### Überholt wird rechts.
+
+Wie auf einer deutschen Autobahn: Rechts der Sportwagen, Links der LKW.
+Und: Fahre solange links, bis im Rückspiegel was Schnelleres auftaucht, und wechsle dann eine Spur nach rechts.
+
+###### Mache Platz.
+
+######
+
+Wenn von hinten einer aufläuft, weichst Du nach links aus. Es reichen wenige Schritte auf Bahn 2, dann schlupft der Überholer durch.
+Warum? Das geht schneller als, wenn der Schnellere den langen Weg außen herum machen muß.
+
+###### Keine Kopfhörer.
+
+Man orientiert sich sehr viel duch Gehör. Du hörst, wenn von hintern der ICE anrauscht oder besser anschnauft.
+
+###### Sein laut.
+
+Wenn Du überholen möchtest: Mache Dich bemerkbar. „Innen frei!“ reicht völlig aus. Wenn Du das nicht mehr kannst, hört man Dich auch so – siehe oben.
+
+###### Trabpausen NIEMALS auf Bahn 1.
+
+Du kannst in den Innenraum auf den Rasen ausweichen, sofern der Platz frei ist und da keine Speere fliegen. Oder Du nimmst die Bahn 2 oder 3.
+Hierbei bitte darauf achten, den (Hürden-)Sprintern nicht vor die Füße zu laufen.
+
+###### NICHT Anhalten.
+
+Zumindest niemals auf der Innenbahn. Lieber ein paar Schritte auf Bahn 2 austrudeln.
+
+###### Wenn Du mit den Läufern trainierst:
+
+Insbesondere Bahnläufer sind Körperkontakt gewohnt; im Wettkampf wird auch schon mal der Ellebogen eingesetzt oder in die Hacken getreten.
+Das ist Triathleten in etwa so fremd, wie einem Beckenschwimmer, der beim Triathlon mitmacht und zum ersten Mal mit der Masse ins Wasser rennt.
\ No newline at end of file
--- /dev/null
+---
+title: "Privat: Coach vs. Software vs. Literatur"
+slug: privat-coach-vs-software-vs-literatur
+excerpt: "Natürlich geht alles auch ohne Coach. Die Unterschiede zwischen Selbstcoaching, Trainingsplänen und einem persönlichen Coach werden klar erläutert."
+seo_title: "Coach vs. Software vs. Literatur – Triathlon Coaching"
+seo_description: "Vor- und Nachteile eines Coaches, Selbstcoaching und fertiger Trainingspläne im Triathlontraining – eine Übersicht."
+source: "https://www.triathlon-coaching.com/?p=714"
+---
+
+# Privat: Coach vs. Software vs. Literatur
+
+## Ich brauche keinen Coach.
+
+Natürlich geht alles auch ohne Coach. Ganz ohne Frage.
+
+Einen Coach zu engagieren, hat nicht nur positive Aspekte. Erstens kostet er Geld und zweitens bedingt die Zusammenarbeit eine gewisse Öffnung der Privatsphäre. Wer das nicht möchte, greift besser zu einem Trainingsplan von der Stange. Oder coacht sich selbst.
+
+## Self-Coaching vs. Coach
+
+Wenn Du Dich selbst coachst – und da kann ich eigentlich schon aufhören zu schreiben.
+„Selbst“ und „Coaching“ ist ein Widerspruch in sich. Wie kannst Du denn einen neutralen Standpunkt Dir selbst gegenüber einnehmen?
+
+Der andere Aspekt ist, dass Selbstcoaching eine Menge Wissen voraussetzt. So wie Du Dir für Steuern, Handwerk usw. einen Dienstleister engagierst, so engagierst Du Dir einen Coach für Dein Training. Ja, Du könntest Deine Steuern auch selber machen …
+
+Mit einem Coach sparst Zeit und kaufst professionelles Know-How ein.
+
+## Trainingspläne vs. Coach
+
+Auch ich biete Pläne ohne Betreuung an, denn nicht jeder kann sich das leisten.
+
+Dennoch hat dieses Konzept Grenzen. Provokant gefragt:
+
+- Freitags hat Dein Verein Schwimmtraining. Dein Trainingsplan nicht.
+ *Wechselst Du den Verein?*
+- Dich interessiert der Zweck einer Trainingseinheit.
+ *Wie gut erklärt Dir das Dein Trainingsplan?*
+- Du hast eine Frage.
+ *Welche Telefonnummer hat Dein Trainingsplan?*
+- Mittwochs wird es immer lang im Job. Im Trainingsplan steht ein long run.
+ *Kannst Du ihn einfach auf Dienstag legen?*
+- Du bist gelaufen. Es lief nicht so toll.
+ *Welches Feedback gibt Dir Dein Trainingsplan?*
+- Dein Kind hat Geburtstag und Du möchtest Dein Training verschieben.
+ *Wie geht Dein Trainingsplan damit um?*
+- Mist! Du hast Dich erkältet.
+ *Ist das in Deinem Trainingsplan vorgesehen?*
+- Du bist tierisch gut drauf, denn Du schwimmst wie ein Fisch und läufst wie eine Schildkröte.
+ *Weiß Dein Trainingsplan das?*
+- Du hast Dich verletzt.
+ *Kennt Dein Trainingsplan eigentlich einen guten Physio?*
+- Du planst ein Trainingslager.
+ *Dein Plan auch?*
+- Sunday-Group-Ride. Geplant: Kurz, flach, locker.
+ Gemacht: 8000 Watt, 5 Ortschilder gewonnen und 3 Segmente geholt.
+ *Wie spontan baut Dein Trainingsplan einen Ruhetag ein?*
+- Endlich Race-Day!
+ *Dein Trainingsplan entwirft den Matchplan, steht am Streckenrand und feuert Dich an. Tut er nicht?*
+
+Ein Coach kann noch etwas ganz anderes:
+Loben und Kritisieren.
+Vertrauen und Zutrauen.
--- /dev/null
+---
+title: "Dein Trainingsplan - triathlon-coaching.com"
+slug: dein-trainingsplan-triathlon-coaching-com
+excerpt: "### Dein Trainingsplan Für die Trainingsplanung und -protokollierung verwende ich [Trainingpeaks](https://www.trainingpeaks.com) Damit stelle ich Deine"
+seo_title: "Dein Trainingsplan - triathlon-coaching.com"
+seo_description: "### Dein Trainingsplan Für die Trainingsplanung und -protokollierung verwende ich [Trainingpeaks](https://www.trainingpeaks.com) Damit stelle ich Deine"
+source: https://www.triathlon-coaching.com/?p=63
+---
+
+### Dein Trainingsplan
+
+Für die Trainingsplanung und -protokollierung verwende ich [Trainingpeaks](https://www.trainingpeaks.com)
+
+Damit stelle ich Deine Trainingspläne ganz individuell zusammen und Du im Browser oder App sehen, was auf dem Plan steht.
+
+Trainingpeaks hat eine sehr gute Konnektivität zu den wichtigsten Sportuhren, Tachos und Indoor-Trainern verbindet sich auch zu anderen Plattformen ganz gut.
+
+So kann ich fast in Echtzeit sehen, wie Du trainierst. Und mein Feedback dazu geben.
+Zettel, Tabellenkalkulationen und Email sind einfach nicht mehr zeitgemäß.
+
+Das ist selbst bei Profis, die das ganze Jahr überall auf der Welt ihre Zelte aufschlagen, völlig üblich und mit den heutigen technischen Möglichkeiten auch völlig problemlos.
+
+Üblicherweise gibt es eine grobe, längerfristige Planung mit der Periodisierung und den wichtigsten Terminen. Für die kommenden Wochen plane ich detailliert im Voraus. So kann ich anhand von Deinem Feedback und Deinen Trainingsresultaten passgenau das Training steuern.
\ No newline at end of file
--- /dev/null
+---
+title: "Disclaimer / Datenschutz - triathlon-coaching.com"
+slug: disclaimer-datenschutz-triathlon-coaching-com
+excerpt: "## ## Disclaimer / Haftung / Urheberrecht ## #### Haftung für Inhalte ## Als Diensteanbieter sind wir gemäß § 7 Abs.1 TMG für eigene Inhalte auf diesen Seiten"
+seo_title: "Disclaimer / Datenschutz - triathlon-coaching.com"
+seo_description: "## ## Disclaimer / Haftung / Urheberrecht ## #### Haftung für Inhalte ## Als Diensteanbieter sind wir gemäß § 7 Abs.1 TMG für eigene Inhalte auf diesen Seiten"
+source: https://www.triathlon-coaching.com/?page_id=76
+---
+
+##
+
+## Disclaimer / Haftung / Urheberrecht
+
+##
+
+#### Haftung für Inhalte
+
+##
+
+Als Diensteanbieter sind wir gemäß § 7 Abs.1 TMG für eigene Inhalte auf diesen Seiten nach den allgemeinen Gesetzen verantwortlich. Nach §§ 8 bis 10 TMG sind wir als Diensteanbieter jedoch nicht verpflichtet, übermittelte oder gespeicherte fremde Informationen zu überwachen oder nach Umständen zu forschen, die auf eine rechtswidrige Tätigkeit hinweisen. Verpflichtungen zur Entfernung oder Sperrung der Nutzung von Informationen nach den allgemeinen Gesetzen bleiben hiervon unberührt. Eine diesbezügliche Haftung ist jedoch erst ab dem Zeitpunkt der Kenntnis einer konkreten Rechtsverletzung möglich. Bei Bekanntwerden von entsprechenden Rechtsverletzungen werden wir diese Inhalte umgehend entfernen.
+
+##
+
+#### Haftung für Links
+
+##
+
+Unser Angebot enthält Links zu externen Webseiten Dritter, auf deren Inhalte wir keinen Einfluss haben. Deshalb können wir für diese fremden Inhalte auch keine Gewähr übernehmen. Für die Inhalte der verlinkten Seiten ist stets der jeweilige Anbieter oder Betreiber der Seiten verantwortlich. Die verlinkten Seiten wurden zum Zeitpunkt der Verlinkung auf mögliche Rechtsverstöße überprüft. Rechtswidrige Inhalte waren zum Zeitpunkt der Verlinkung nicht erkennbar. Eine permanente inhaltliche Kontrolle der verlinkten Seiten ist jedoch ohne konkrete Anhaltspunkte einer Rechtsverletzung nicht zumutbar. Bei Bekanntwerden von Rechtsverletzungen werden wir derartige Links umgehend entfernen.
+
+##
+
+#### Urheberrecht
+
+##
+
+Die durch die Seitenbetreiber erstellten Inhalte und Werke auf diesen Seiten unterliegen dem deutschen Urheberrecht. Die Vervielfältigung, Bearbeitung, Verbreitung und jede Art der Verwertung außerhalb der Grenzen des Urheberrechtes bedürfen der schriftlichen Zustimmung des jeweiligen Autors bzw. Erstellers. Downloads und Kopien dieser Seite sind nur für den privaten, nicht kommerziellen Gebrauch gestattet. Soweit die Inhalte auf dieser Seite nicht vom Betreiber erstellt wurden, werden die Urheberrechte Dritter beachtet. Insbesondere werden Inhalte Dritter als solche gekennzeichnet. Sollten Sie trotzdem auf eine Urheberrechtsverletzung aufmerksam werden, bitten wir um einen entsprechenden Hinweis. Bei Bekanntwerden von Rechtsverletzungen werden wir derartige Inhalte umgehend entfernen.
+
+##
+
+*Quellenangaben: [Disclaimer](http://www.e-recht24.de/muster-disclaimer.html) von eRecht24, dem Portal zum Internetrecht von Rechtsanwalt Sören Siebert, [eRecht24 Disclaimer](http://www.e-recht24.de/muster-disclaimer.html)*
+
+##
+
+## Datenschutz
+
+##
+
+### Datenschutzerklärung:
+
+##
+
+#### Datenschutzbeauftragter
+
+##
+
+Verantwortliche Stelle im Sinne der Datenschutzgesetze, insbesondere der EU-Datenschutzgrundverordnung (DSGVO), ist:
+
+##
+
+Ole B. Rosentreter
+
+##
+
+#### Ihre Betroffenenrechte
+
+##
+
+Unter den angegebenen Kontaktdaten unseres Datenschutzbeauftragten können Sie jederzeit folgende Rechte ausüben:
+
+##
+
+* Auskunft über Ihre bei uns gespeicherten Daten und deren Verarbeitung,
+* Berichtigung unrichtiger personenbezogener Daten,
+* Löschung Ihrer bei uns gespeicherten Daten,
+* Einschränkung der Datenverarbeitung, sofern wir Ihre Daten aufgrund gesetzlicher Pflichten noch nicht löschen dürfen,
+* Widerspruch gegen die Verarbeitung Ihrer Daten bei uns und
+* Datenübertragbarkeit, sofern Sie in die Datenverarbeitung eingewilligt haben oder einen Vertrag mit uns abgeschlossen haben.
+
+##
+
+Sofern Sie uns eine Einwilligung erteilt haben, können Sie diese jederzeit mit Wirkung für die Zukunft widerrufen.
+
+##
+
+Sie können sich jederzeit mit einer Beschwerde an die für Sie zuständige Aufsichtsbehörde wenden. Ihre zuständige Aufsichtsbehörde richtet sich nach dem Bundesland Ihres Wohnsitzes, Ihrer Arbeit oder der mutmaßlichen Verletzung. Eine Liste der Aufsichtsbehörden (für den nichtöffentlichen Bereich) mit Anschrift finden Sie unter:
+
+<https://www.bfdi.bund.de/DE/Infothek/Anschriften_Links/anschriften_links-node.html>
+
+.
+
+##
+
+#### Zwecke der Datenverarbeitung durch die verantwortliche Stelle und Dritte
+
+##
+
+Wir verarbeiten Ihre personenbezogenen Daten nur zu den in dieser Datenschutzerklärung genannten Zwecken. Eine Übermittlung Ihrer persönlichen Daten an Dritte zu anderen als den genannten Zwecken findet nicht statt. Wir geben Ihre persönlichen Daten nur an Dritte weiter, wenn:
+
+##
+
+* Sie Ihre ausdrückliche Einwilligung dazu erteilt haben,
+* die Verarbeitung zur Abwicklung eines Vertrags mit Ihnen erforderlich ist,
+* die Verarbeitung zur Erfüllung einer rechtlichen Verpflichtung erforderlich ist,
+
+##
+
+die Verarbeitung zur Wahrung berechtigter Interessen erforderlich ist und kein Grund zur Annahme besteht, dass Sie ein überwiegendes schutzwürdiges Interesse an der Nichtweitergabe Ihrer Daten haben.
+
+##
+
+#### Löschung bzw. Sperrung der Daten
+
+##
+
+Wir halten uns an die Grundsätze der Datenvermeidung und Datensparsamkeit. Wir speichern Ihre personenbezogenen Daten daher nur so lange, wie dies zur Erreichung der hier genannten Zwecke erforderlich ist oder wie es die vom Gesetzgeber vorgesehenen vielfältigen Speicherfristen vorsehen. Nach Fortfall des jeweiligen Zweckes bzw. Ablauf dieser Fristen werden die entsprechenden Daten routinemäßig und entsprechend den gesetzlichen Vorschriften gesperrt oder gelöscht.
+
+##
+
+#### Erfassung allgemeiner Informationen beim Besuch unserer Website
+
+##
+
+Wenn Sie auf unsere Website zugreifen, werden automatisch mittels eines Cookies Informationen allgemeiner Natur erfasst. Diese Informationen (Server-Logfiles) beinhalten etwa die Art des Webbrowsers, das verwendete Betriebssystem, den Domainnamen Ihres Internet-Service-Providers und ähnliches. Hierbei handelt es sich ausschließlich um Informationen, welche keine Rückschlüsse auf Ihre Person zulassen.
+
+##
+
+Diese Informationen sind technisch notwendig, um von Ihnen angeforderte Inhalte von Webseiten korrekt auszuliefern und fallen bei Nutzung des Internets zwingend an. Sie werden insbesondere zu folgenden Zwecken verarbeitet:
+
+##
+
+* Sicherstellung eines problemlosen Verbindungsaufbaus der Website,
+* Sicherstellung einer reibungslosen Nutzung unserer Website,
+* Auswertung der Systemsicherheit und -stabilität sowie
+* zu weiteren administrativen Zwecken.
+
+##
+
+Die Verarbeitung Ihrer personenbezogenen Daten basiert auf unserem berechtigten Interesse aus den vorgenannten Zwecken zur Datenerhebung. Wir verwenden Ihre Daten nicht, um Rückschlüsse auf Ihre Person zu ziehen. Empfänger der Daten sind nur die verantwortliche Stelle und ggf. Auftragsverarbeiter.
+
+##
+
+Anonyme Informationen dieser Art werden von uns ggfs. statistisch ausgewertet, um unseren Internetauftritt und die dahinterstehende Technik zu optimieren.
+
+##
+
+#### Cookies
+
+##
+
+Wie viele andere Webseiten verwenden wir auch so genannte Cookies. Cookies sind kleine Textdateien, die von einem Websiteserver auf Ihre Festplatte übertragen werden. Hierdurch erhalten wir automatisch bestimmte Daten wie z. B. IP-Adresse, verwendeter Browser, Betriebssystem und Ihre Verbindung zum Internet.
+
+##
+
+Cookies können nicht verwendet werden, um Programme zu starten oder Viren auf einen Computer zu übertragen. Anhand der in Cookies enthaltenen Informationen können wir Ihnen die Navigation erleichtern und die korrekte Anzeige unserer Webseiten ermöglichen.
+
+##
+
+In keinem Fall werden die von uns erfassten Daten an Dritte weitergegeben oder ohne Ihre Einwilligung eine Verknüpfung mit personenbezogenen Daten hergestellt.
+
+##
+
+Natürlich können Sie unsere Website grundsätzlich auch ohne Cookies betrachten. Internet-Browser sind regelmäßig so eingestellt, dass sie Cookies akzeptieren. Im Allgemeinen können Sie die Verwendung von Cookies jederzeit über die Einstellungen Ihres Browsers deaktivieren. Bitte verwenden Sie die Hilfefunktionen Ihres Internetbrowsers, um zu erfahren, wie Sie diese Einstellungen ändern können. Bitte beachten Sie, dass einzelne Funktionen unserer Website möglicherweise nicht funktionieren, wenn Sie die Verwendung von Cookies deaktiviert haben.
+
+##
+
+#### SSL-Verschlüsselung
+
+##
+
+Um die Sicherheit Ihrer Daten bei der Übertragung zu schützen, verwenden wir dem aktuellen Stand der Technik entsprechende Verschlüsselungsverfahren (z. B. SSL) über HTTPS.
+
+##
+
+#### Kontaktformular
+
+##
+
+Treten Sie bzgl. Fragen jeglicher Art per E-Mail oder Kontaktformular mit uns in Kontakt, erteilen Sie uns zum Zwecke der Kontaktaufnahme Ihre freiwillige Einwilligung. Hierfür ist die Angabe einer validen E-Mail-Adresse erforderlich. Diese dient der Zuordnung der Anfrage und der anschließenden Beantwortung derselben. Die Angabe weiterer Daten ist optional. Die von Ihnen gemachten Angaben werden zum Zwecke der Bearbeitung der Anfrage sowie für mögliche Anschlussfragen gespeichert. Nach Erledigung der von Ihnen gestellten Anfrage werden personenbezogene Daten automatisch gelöscht.
+
+##
+
+#### Verwendung von Google Maps
+
+##
+
+Diese Webseite verwendet Google Maps API, um geographische Informationen visuell darzustellen. Bei der Nutzung von Google Maps werden von Google auch Daten über die Nutzung der Kartenfunktionen durch Besucher erhoben, verarbeitet und genutzt. Nähere Informationen über die Datenverarbeitung durch Google können Sie
+
+[den Google-Datenschutzhinweisen](http://www.google.com/privacypolicy.html)
+
+ entnehmen. Dort können Sie im Datenschutzcenter auch Ihre persönlichen Datenschutz-Einstellungen verändern.
+
+##
+
+Ausführliche Anleitungen zur Verwaltung der eigenen Daten im Zusammenhang mit Google-Produkten
+
+[finden Sie hier](http://www.dataliberation.org/)
+
+.
+
+##
+
+#### Eingebettete YouTube-Videos
+
+##
+
+Auf einigen unserer Webseiten betten wir Youtube-Videos ein. Betreiber der entsprechenden Plugins ist die YouTube, LLC, 901 Cherry Ave., San Bruno, CA 94066, USA. Wenn Sie eine Seite mit dem YouTube-Plugin besuchen, wird eine Verbindung zu Servern von Youtube hergestellt. Dabei wird Youtube mitgeteilt, welche Seiten Sie besuchen. Wenn Sie in Ihrem Youtube-Account eingeloggt sind, kann Youtube Ihr Surfverhalten Ihnen persönlich zuzuordnen. Dies verhindern Sie, indem Sie sich vorher aus Ihrem Youtube-Account ausloggen.
+
+##
+
+Wird ein Youtube-Video gestartet, setzt der Anbieter Cookies ein, die Hinweise über das Nutzerverhalten sammeln.
+
+##
+
+Wer das Speichern von Cookies für das Google-Ad-Programm deaktiviert hat, wird auch beim Anschauen von Youtube-Videos mit keinen solchen Cookies rechnen müssen. Youtube legt aber auch in anderen Cookies nicht-personenbezogene Nutzungsinformationen ab. Möchten Sie dies verhindern, so müssen Sie das Speichern von Cookies im Browser blockieren.
+
+##
+
+Weitere Informationen zum Datenschutz bei Youtube finden Sie in der Datenschutzerklärung des Anbieters unter:
+
+<https://www.google.de/intl/de/policies/privacy/>
+
+##
+
+#### Social Plugins
+
+##
+
+Auf unseren Webseiten werden Social Plugins der unten aufgeführten Anbieter eingesetzt. Die Plugins können Sie daran erkennen, dass sie mit dem entsprechenden Logo gekennzeichnet sind.
+
+##
+
+Über diese Plugins werden unter Umständen Informationen, zu denen auch personenbezogene Daten gehören können, an den Dienstebetreiber gesendet und ggf. von diesem genutzt. Wir verhindern die unbewusste und ungewollte Erfassung und Übertragung von Daten an den Diensteanbieter durch eine 2-Klick-Lösung. Um ein gewünschtes Social Plugin zu aktivieren, muss dieses erst durch Klick auf den entsprechenden Schalter aktiviert werden. Erst durch diese Aktivierung des Plugins wird auch die Erfassung von Informationen und deren Übertragung an den Diensteanbieter ausgelöst. Wir erfassen selbst keine personenbezogenen Daten mittels der Social Plugins oder über deren Nutzung.
+
+##
+
+Wir haben keinen Einfluss darauf, welche Daten ein aktiviertes Plugin erfasst und wie diese durch den Anbieter verwendet werden. Derzeit muss davon ausgegangen werden, dass eine direkte Verbindung zu den Diensten des Anbieters ausgebaut wird sowie mindestens die IP-Adresse und gerätebezogene Informationen erfasst und genutzt werden. Ebenfalls besteht die Möglichkeit, dass die Diensteanbieter versuchen, Cookies auf dem verwendeten Rechner zu speichern. Welche konkreten Daten hierbei erfasst und wie diese genutzt werden, entnehmen Sie bitte den Datenschutzhinweisen des jeweiligen Diensteanbieters. Hinweis: Falls Sie zeitgleich bei Facebook angemeldet sind, kann Facebook Sie als Besucher einer bestimmten Seite identifizieren.
+
+##
+
+Wir haben auf unserer Website die Social-Media-Buttons folgender Unternehmen eingebunden:
+
+##
+
+#### Änderung unserer Datenschutzbestimmungen
+
+##
+
+Wir behalten uns vor, diese Datenschutzerklärung anzupassen, damit sie stets den aktuellen rechtlichen Anforderungen entspricht oder um Änderungen unserer Leistungen in der Datenschutzerklärung umzusetzen, z.B. bei der Einführung neuer Services. Für Ihren erneuten Besuch gilt dann die neue Datenschutzerklärung.
+
+##
+
+#### Fragen an den Datenschutzbeauftragten
+
+##
+
+Wenn Sie Fragen zum Datenschutz haben, schreiben Sie uns bitte eine E-Mail oder wenden Sie sich direkt an die für den Datenschutz verantwortliche Person in unserer Organisation:
+
+##
+
+Ole B. Rosentreter
+datenschutz@laktatnebel.de
+
+##
+
+Die Datenschutzerklärung wurde mit dem
+
+[Datenschutzerklärungs-Generator der activeMind AG erstellt](https://www.activemind.de/datenschutz/datenschutzhinweis-generator/)
+
+##
\ No newline at end of file
--- /dev/null
+---
+title: "Fair Play beim Coaching - triathlon-coaching.com"
+slug: fair-play-beim-coaching-triathlon-coaching-com
+excerpt: "### Fair Play? Ja klar! Es gibt Coaches, bei denen schließt man ein festes Abo ab. Das heißt Du zahlst auch dann weiter, wenn * [Du krank oder verletzt bist"
+seo_title: "Fair Play beim Coaching - triathlon-coaching.com"
+seo_description: "### Fair Play? Ja klar! Es gibt Coaches, bei denen schließt man ein festes Abo ab. Das heißt Du zahlst auch dann weiter, wenn * [Du krank oder verletzt bist"
+source: https://www.triathlon-coaching.com/?p=472
+---
+
+### Fair Play? Ja klar!
+
+Es gibt Coaches, bei denen schließt man ein festes Abo ab.
+Das heißt Du zahlst auch dann weiter, wenn
+
+* [Du krank oder verletzt bist und nicht trainieren kannst](https://www.triathlon-coaching.com/?p=475).
+* Du in der Off-Season bist.
+ Deine Saison endet beispielsweise am 10.10. Für was solltest Du weitere 3 Wochen im Oktober bezahlen?
+* die gemeinsam erarbeitete Planung nicht in das starre Kalendergerüst passt.
+* Du aus privaten oder beruflichen Gründen nicht trainieren kannst.
+ Du bist wahrscheinlich kein Profi. Bei allem Ehrhgeiz: Der Job geht vor und die Familie braucht Dich wahrscheinlich auch mal.
+
+Ich finde das nicht fair.
+Deshalb rechne ich wochenweise ab.
+
+Erstens kommunizieren wir miteinander, daher sind die Zeiten des Nicht-Tarinierens bekannt und besprochen.
+Zweitens sehe ich in [Trainingpeaks](https://trainingpeaks.com/), was Du letztendlich trainiert hast und wenn Dich Mittwoch eine Erkältung in den persönlichen Lockdown schickt, dann ist das eben so.
+
+Du bezahlst also nur die Wochen, in denen Du überwiegend trainierst.
\ No newline at end of file
--- /dev/null
+---
+title: "Gesundheit! - triathlon-coaching.com"
+slug: gesundheit-triathlon-coaching-com
+excerpt: "### Gesundheit ist A und O Grundsätzlich empfehle ich eine ärztliche Untersuchung vor der Aufnahme des Trainings; am besten eine offizielle Bescheinigung auf"
+seo_title: "Gesundheit! - triathlon-coaching.com"
+seo_description: "### Gesundheit ist A und O Grundsätzlich empfehle ich eine ärztliche Untersuchung vor der Aufnahme des Trainings; am besten eine offizielle Bescheinigung auf"
+source: https://www.triathlon-coaching.com/?p=65
+---
+
+### Gesundheit ist A und O
+
+Grundsätzlich empfehle ich eine ärztliche Untersuchung vor der Aufnahme des Trainings; am besten eine offizielle Bescheinigung auf Deine Sporttauglichkeit.
+
+Selbst bei Profis gilt: Der Körper ist das Kapital und die Gesundheit steht an allererster Stelle. Das ist bei aller Lust, auch mal an die eigenen Grenzen zu gehen, die Präambel allen sportlichen Tuns.
+
+Und [während des Trainings](https://www.triathlon-coaching.com/?p=475) gilt das erst recht.
\ No newline at end of file
--- /dev/null
+---
+title: "Grenzen: Wofür ich nicht da bin - triathlon-coaching.com"
+slug: grenzen-wofur-ich-nicht-da-bin-triathlon-coaching-com
+excerpt: "### Deine Motivation Eine Athletin hat mir mal abgesagt, weil sie keinen Tritt in Ihren Allerwertesten bräuchte. Zugegebenermaßen war ich schockiert. Denn ein"
+seo_title: "Grenzen: Wofür ich nicht da bin - triathlon-coaching.com"
+seo_description: "### Deine Motivation Eine Athletin hat mir mal abgesagt, weil sie keinen Tritt in Ihren Allerwertesten bräuchte. Zugegebenermaßen war ich schockiert. Denn ein"
+source: https://www.triathlon-coaching.com/?p=513
+---
+
+### Deine Motivation
+
+Eine Athletin hat mir mal abgesagt, weil sie keinen Tritt in Ihren Allerwertesten bräuchte.
+Zugegebenermaßen war ich schockiert.
+
+Denn ein Coaching hat keinen Anspruch, grundsätzliche Motivationsquelle zu sein.
+Das ist nicht mein Job.
+
+Für Deine Motivation bist Du zuständig.
+
+Als Dein Coach bin ich weder Dein Drill-Sergeant, noch Dein 6-a.m.-Double-Espresso-Barista.
+
+Trotzdem kann es sein, dass Du Dich dem Trainer unter Umständen mehr verpflichtet fühlst als Dir selbst.
+Du hast im Hinterkopf, dass der Trainer nachfragt, warum diese eine Einheit anders durchgeführt wurde oder gar ganz ausgefallen ist.
+
+Und ja, wenn Du mal durchhängst, bin ich auch für Dich da.
+
+Du musst wollen.
+
+Dein Wille
+Deine Ziele
+Deine Visionen
+
+… ich helfe Dir nur auf dem Weg dahin.
\ No newline at end of file
--- /dev/null
+---
+title: "Impressum - triathlon-coaching.com"
+slug: impressum-triathlon-coaching-com
+excerpt: "Um dir ein optimales Erlebnis zu bieten, verwenden wir Technologien wie Cookies, um Geräteinformationen zu speichern und/oder darauf zuzugreifen. Wenn du"
+seo_title: "Impressum - triathlon-coaching.com"
+seo_description: "Um dir ein optimales Erlebnis zu bieten, verwenden wir Technologien wie Cookies, um Geräteinformationen zu speichern und/oder darauf zuzugreifen. Wenn du"
+source: https://www.triathlon-coaching.com/?page_id=78
+---
+
+Um dir ein optimales Erlebnis zu bieten, verwenden wir Technologien wie Cookies, um Geräteinformationen zu speichern und/oder darauf zuzugreifen. Wenn du diesen Technologien zustimmst, können wir Daten wie das Surfverhalten oder eindeutige IDs auf dieser Website verarbeiten. Wenn du deine Zustimmung nicht erteilst oder zurückziehst, können bestimmte Merkmale und Funktionen beeinträchtigt werden.
+
+Die technische Speicherung oder der Zugang ist unbedingt erforderlich für den rechtmäßigen Zweck, die Nutzung eines bestimmten Dienstes zu ermöglichen, der vom Teilnehmer oder Nutzer ausdrücklich gewünscht wird, oder für den alleinigen Zweck, die Übertragung einer Nachricht über ein elektronisches Kommunikationsnetz durchzuführen.
+
+
+
+
+
+Die technische Speicherung oder der Zugriff ist für den rechtmäßigen Zweck der Speicherung von Präferenzen erforderlich, die nicht vom Abonnenten oder Benutzer angefordert wurden.
+
+
+
+
+
+Die technische Speicherung oder der Zugriff, der ausschließlich zu statistischen Zwecken erfolgt.
+Die technische Speicherung oder der Zugriff, der ausschließlich zu anonymen statistischen Zwecken verwendet wird. Ohne eine Vorladung, die freiwillige Zustimmung deines Internetdienstanbieters oder zusätzliche Aufzeichnungen von Dritten können die zu diesem Zweck gespeicherten oder abgerufenen Informationen allein in der Regel nicht dazu verwendet werden, dich zu identifizieren.
+
+
+
+
+
+Die technische Speicherung oder der Zugriff ist erforderlich, um Nutzerprofile zu erstellen, um Werbung zu versenden oder um den Nutzer auf einer Website oder über mehrere Websites hinweg zu ähnlichen Marketingzwecken zu verfolgen.
\ No newline at end of file
--- /dev/null
+---
+title: "Kurzdistanz-Pläne - triathlon-coaching.com"
+slug: kurzdistanz-plane-triathlon-coaching-com
+excerpt: "### Kurz-/ olympische Distanz #### finisher Du willst (mal) einen Triathlon finishen – nicht mehr und nicht weniger. Dein Ziel ist es schlicht und ergreifend"
+seo_title: "Kurzdistanz-Pläne - triathlon-coaching.com"
+seo_description: "### Kurz-/ olympische Distanz #### finisher Du willst (mal) einen Triathlon finishen – nicht mehr und nicht weniger. Dein Ziel ist es schlicht und ergreifend"
+source: https://www.triathlon-coaching.com/?page_id=599
+---
+
+### Kurz-/ olympische Distanz
+
+#### finisher
+
+Du willst (mal) einen Triathlon finishen – nicht mehr und nicht weniger. Dein Ziel ist es schlicht und ergreifend eine Kurzdistanz wie bei Olympia zu bewältigen und Dich Triathlet nennen dürfen. Auch Dein Motto ist olympisch: Dabei sein ist alles!
+Zielzeit bis 3:00 (m) / 3:20 (w)
+[Links zum Plan (Base1)](https://www.trainingpeaks.com/training-plans/triathlon/olympic/tp-519355/base-1-olympic-distance-finisher)
+
+#### good finisher
+
+Dein olypischer Triathlon ist für Dich Deine ganz persönliche Challenge und es irgendwie mit Hängen und Würgen zuschaffen ist nicht Dein Anspruch.
+Zielzeit unter 3:00 (m) / 3:20 (w)
+[Links zum Plan (Base1)](https://www.trainingpeaks.com/training-plans/triathlon/olympic/tp-519353/base-1-olympic-distance-good-finisher)
+
+#### advanced finisher
+
+Du bist solide unterwegs und brauchst für die 1,5-40-10 nicht mehr als 2:45 (Mann) bzw. 3:00 (Frau) Stunden. Du kannst kannst alle 3 Disziplinen, ohne in einer wirklich glänzen zu müssen, oder Du bist ein Spezialist in einer und nimmst den Rest einfach mal so mit.
+Zielzeit unter 2:45 (m) / 3:00 (w)
+[Links zum Plan (Base1)](https://www.trainingpeaks.com/training-plans/triathlon/olympic/tp-519354/base-1-olympic-distance-advanced-finisher)
+
+#### hero
+
+Du schaffst es Familie, Job, Verpflichtungen und Training unter einen Hut zu bringen. Der Sport ist nicht wirklich die allererste Priorität, aber Du weißt welche Key-Sessions Du dann wirklich machen musst.
+Du landest bei allen Rennen im soliden Mittelfeld, Du kannst das Rennen genießen, und lässt so einige hinter Dir und bist stolz auf Dich.
+Zielzeit unter 2:30 (m) / 2:45 (w)
+[Links zum Plan (Base1)](https://www.trainingpeaks.com/training-plans/triathlon/olympic/tp-519352/base-1-olympic-distance-hero)
+
+#### club hero
+
+Im Verein zählst Du zu den Guten in allen 3 Disziplinen, eine signifikante Schwäche hast Du nicht. Bei einem flachen „olympischen“ bist Du im Bereich 2:15 (Mann) oder 2:30 (Frau) Stunden unterwegs und zeigst damit den meisten die Hacken.
+Zielzeit ca 2:15 (m) / 2:30 (w)
+[Links zum Plan (Base1)](https://www.trainingpeaks.com/training-plans/triathlon/olympic/tp-519351/base-1-olympic-distance-club-hero)
+
+#### local hero
+
+In Deiner Gegend hat Dich Deine Konkurrenz auf dem Zettel. Du weißt, wo das Podium steht und wartest deshalb immer bis zur Siegerehrung. Dein Fokus ist die Kurzdistanz, Du startest vielleicht auch in einem Ligateam. Du willst hart und schnell racen, auch auf kürzeren Distanzen.
+Zielzeit unter 2:10 (m) / 2:25 (w)
+[Link zum Plan (Base1)](https://www.trainingpeaks.com/training-plans/triathlon/olympic/tp-519328/base-1-olympic-distance-local-hero)
\ No newline at end of file
--- /dev/null
+---
+title: "Langdistanz-Pläne - triathlon-coaching.com"
+slug: langdistanz-plane-triathlon-coaching-com
+excerpt: "### Langdistanz / Ironman #### finisher Du willst eine Langdistanz finishen – nicht mehr und nicht weniger. Dein Ziel ist der rote Teppich und die 4 magischen"
+seo_title: "Langdistanz-Pläne - triathlon-coaching.com"
+seo_description: "### Langdistanz / Ironman #### finisher Du willst eine Langdistanz finishen – nicht mehr und nicht weniger. Dein Ziel ist der rote Teppich und die 4 magischen"
+source: https://www.triathlon-coaching.com/?page_id=594
+---
+
+### Langdistanz / Ironman
+
+#### finisher
+
+Du willst eine Langdistanz finishen – nicht mehr und nicht weniger. Dein Ziel ist der rote Teppich und die 4 magischen Worte: You are an iron(wo)maaaaan!
+Gleich vorneweg: Dein Training ist auf Kante genäht, bei weniger Training wird es eng mit dem Finish.
+Zielzeit bis 13 :00 (m) / 14:00 (w)
+[Link zum Plan (Base 1)](https://www.trainingpeaks.com/training-plans/triathlon/ironman/tp-512198/base-1-full-distance-finisher)
+
+#### good finisher
+
+Dein Langdistanz-Finish ist soll safe über die Bühne gehen. Mit unter 13 Stunden ist es wahrscheinlich noch hell, wenn Du im Ziel bist.
+Zielzeit 12:00-13 :00 (m) / 13:00-14:00 (w)
+[Link zum Plan (Base 1)](https://www.trainingpeaks.com/training-plans/triathlon/ironman/tp-512197/base-1-full-distance-good-finisher)
+
+#### advanced finisher
+
+Du willst eine Langdistanz nicht nur irgendwie finishen, sondern souverän und ohne großes Wenn und Aber. Du bist nicht schnell, aber stabil unterwegs zu einem ungefährdeten Finish.
+Zielzeit ca. 11 30 (m) / 12 30 (w)
+[Link zum Plan (Base 1)](https://www.trainingpeaks.com/training-plans/triathlon/ironman/tp-512194/base-1-full-distance-advanced-finisher)
+
+#### hero
+
+Du schaffst es Familie, Job, Verpflichtungen und Training unter einen Hut zu bringen. Der Sport ist nicht wirklich die allererste Priorität, aber Du weißt welche Key-Sessions Du dann wirklich machen musst.
+Dein Langdistanz-Finish ist im soliden Mittelfeld, Du kannst das Rennen genießen und Du kannst stolz auf Dich sein. Für Dein Umfeld bist Du eben ein: Held!
+Zielzeit ca 11:00 (m) / 12 :00 (w)
+[Link zum Plan (Base 1)](https://www.trainingpeaks.com/training-plans/triathlon/ironman/tp-511774/base-1-full-distance-hero)
+
+#### club hero
+
+Im Verein zählst Du zu den Guten, gemeinsame Ausfahrten fährst Du fast komplett im Wind und Du kannst bei noch stärkeren fast mittrainieren. Für eine Langdistanz brauchst Du 10 (Mann) oder 11 (Frau) Stunden – plus minus.
+Zielzeit ca 10:00 (m) / 11 :00 (w)
+[Link zum Plan (Base 1)](https://www.trainingpeaks.com/training-plans/triathlon/ironman/tp-511434/base-1-full-distance-club-hero)
+
+#### local hero
+
+In Deiner Gegend hat Dich Deine Konkurrenz auf dem Zettel. Du weißt, wo das Podium steht und wartest deshalb immer bis zur Siegerehrung. Die Quali für Hawaii ist noch eine halbe Nummer zu groß oder mit Glück beim richtigen Rennen erreichbar.
+Zielzeit ca 9:15 (m) / 10:15 (w)
+[Link zum Plan (Base 1)](https://www.trainingpeaks.com/training-plans/triathlon/ironman/tp-511290/base-1-full-distance-local-hero)
+
+#### qualifier
+
+Als Qualifier kommst Du bereit, gesund und mit einer gewissen Grundfitness aus der Off-Season. Dein Ziel ist die
+Insel, also die Quali für Hawaii. Du bist willens, Dich vom ersten Moment an zu schinden und bestehst mental nur aus dem einen Ziel.
+Zielzeit unter 8:45 (m) / 9:30 (w)
+[Link zum Plan (Base 1)](https://www.trainingpeaks.com/training-plans/triathlon/ironman/tp-511274/base-1-full-distance-kona-qualifier)
\ No newline at end of file
--- /dev/null
+---
+title: "Laufschuhe - Kann man zu viele haben? - triathlon-coaching.com"
+slug: laufschuhe-kann-man-zu-viele-haben-triathlon-coaching-com
+excerpt: "### Laufschuhe Laufschuhe sind die mit Abstand wichtigsten Ausrüstungsgegenstände beim Laufen. Sie sollen den Fuß schützen und führen. Sie sollen die"
+seo_title: "Laufschuhe - Kann man zu viele haben? - triathlon-coaching.com"
+seo_description: "### Laufschuhe Laufschuhe sind die mit Abstand wichtigsten Ausrüstungsgegenstände beim Laufen. Sie sollen den Fuß schützen und führen. Sie sollen die"
+source: https://www.triathlon-coaching.com/?p=790
+---
+
+### Laufschuhe
+
+Laufschuhe sind die mit Abstand wichtigsten Ausrüstungsgegenstände beim Laufen.
+Sie sollen den Fuß schützen und führen. Sie sollen die Laufbewegung unterstützen und die Gelenke schonen. Ganz schön viele Aufgaben für ein paar Hundert Gramm Plastik.
+
+Und es gibt für verschiedene Aufgaben Spezialisierungen – von Spikes bis zum Trail.
+
+### Best practices:
+
+###### Je mehr Du läufst, je mehr Schuhe solltest Du besitzen.
+
+Faustregel: Minimum 3 und pro Lauftag in der Woche 1 Paar. Wenn 5 Mal pro Woche läufst, hast Du 5 Paar Schuhe; Spikes, „reine“ Wettkampfschuhe ausgenommen.
+
+###### Trenne Dich von alten Schätzchen.
+
+Persönliche Anmerkung: Ich kenne jemanden, der mir diesen Satz um die Ohren haut.
+Im Ernst: Ist das Ding durchgelaufen – dann in die Tonne damit.
+
+###### Mische die Marken.
+
+Laufschuhmarken haben alle ihre Eigenarten im Leisten oder im Aufbau der Sohlen. Die Hersteller machen sich allerhand Gedanken, wie sie den Schuh bauen und wenden ihre Erkenntnisse gerne auf mehrere Modelle an. Das ist ökonomisch sinnvoll, führt aber dazu, dass die Marken einen eigenen Charakter entwickeln, der sich nur langsam über mehrere Produktzyklen hinweg ändert.
+Wenn Du zu ähnliche Schuhe hast oder ein Marken-Fan bist, kann es zu Fehlstellungen führen. Manchmal verschwindet auch so manches Zipperlein, wenn Du den Schuh wechselst.
+
+###### Habe für verschiedene Lauftempi auch verschiedene Schuhe.
+
+Du hast verschiedene Lauftempi: Langsam, mittel, schnell, sehr schnell – das macht 1 Schuh zum „Rumschlappen“, 1 für mittel bis langsame Läufe, 1 für mittel bis schnelle Läufe, 1 für schnell bis All-out. Wenn Du auf der Bahn trainierst, empfiehlt sich einer, der auch auf einer nassen Bahn gut haftet, sofern man keine Spikes tragen möchte.
+
+###### Habe für verschiedene Wettkämpfe auch verschiedene Schuhe.
+
+Ein schneller 10km auf der Straße braucht einen leichten, schnellen Schlappen ohne großes Profil und Dämpfung ist weniger relevant.
+Ein 100km Lauf im Gelände stellt das andere Extrem dar. Ordentliches Profil, Dämpfung und Führung für einen müden Bewegungsapparat sind in diesem Fall wichtiger als Gewicht.
+
+###### Unterschiede zwischen Wettkampf- und Trainingsschuh gibt es nicht wirklich.
+
+Dem Schuh ist es egal, ob Du eine Startnummer trägst oder nicht.
+Und Du solltest einen Schuh niemals das erste Mal im Wettkampf laufen.
+Dennoch entsteht im Läuferleben dann doch das eine oder andere Paar, dass dann doch nur im Wettkampf gelaufen wird. Das ist einfach auch Kopfsache.
+
+###### Berücksichtige Dein Lauftempo.
+
+Ein ehrlicher Blick in den Spiegel bitte: Wenn 55 Minuten auf 10km für Dich schnell sind, ist das Tempo nicht schnell. Dann reichen die Trainingslaufschuhe auch für den Wettkampf, da sich Dein Wettkampf-Laufstil vom Training nicht groß unterscheidet. Schnrittlänge, Kniehub, Schrittfrequenz – all das ist eben Dauerlauf.
+
+###### Für Triathlon gibt es keine Sonderregeln. Eigentlich.
+
+Im Triathlon-Wettkampf ist das Lauftempo auf gleicher Strecke geringer. Sprich 10km auf der Straße sind langsamer als 10km bei einer olympischen Distanz.
+Ein schneller Einstieg mit Gummischnürbändern sollte möglich ist, wie relevant das bei einem 4-Stunden-Marathon ist, kann sich jeder selber überlegen. In einem Ligarennen ist das sicher relevant.
+
+###### Und …. Spikes?
+
+Man unterscheidet zwischen Bahn- und Crossspikes. Kann man haben, muß man aber nicht. Muss man haben, wenn man ernsthaft Bahnläufe macht.
+
+###### Kaufe im Fachgeschäft.
+
+Natürlich kann man sich im Versandhandel 10 Paar Schuhe kaufen und 9 zurückschicken. Die Sinnhaftigkeit dessen ist eine Sache, die andere Sache ist die:
+Guckt der Versender zu, wenn Du den Schuh auf dem Laufband testet?
+
+###### Im Trainingslager:
+
+2 Paar mitnehmen. 1 Paar ist zu wenig.
\ No newline at end of file
--- /dev/null
+---
+title: "Mein Coaching-Ansatz - triathlon-coaching.com"
+slug: mein-coaching-ansatz-triathlon-coaching-com
+excerpt: "### Maßgeschneidert statt von der Stange Das Internet und die einschlägigen Zeitschriften und Bücher sind voll mit Trainingsplänen. Und schlecht oder gar"
+seo_title: "Mein Coaching-Ansatz - triathlon-coaching.com"
+seo_description: "### Maßgeschneidert statt von der Stange Das Internet und die einschlägigen Zeitschriften und Bücher sind voll mit Trainingsplänen. Und schlecht oder gar"
+source: https://www.triathlon-coaching.com/?p=23
+---
+
+### Maßgeschneidert statt von der Stange
+
+Das Internet und die einschlägigen Zeitschriften und Bücher sind voll mit Trainingsplänen. Und schlecht oder gar falsch sind diese auch nicht. Und wenn man danach trainiert, wird man sich irgendwie auch verbessern.
+
+Aber ist dieser für Dich optimal? Passt er zu Deinen Stärken und Schwächen? Werden Deine Defizite aufgearbeitet?
+
+Ein Trainingsplan aus der Literatur geht immer von Bedingungen aus, die in der Realität nicht vorkommen. Geschäftstermine, Familienfeiern, Öffnungszeiten von Schwimmbädern, Urlaube, die keine Trainingslager sind – auf all das nimmt ein Trainingsplan aus der Zeitschrift keinerlei Rücksicht.
+Aber ich kann das einplanen und Dich beraten.
+
+Individuelles Training kann sich auf genau diese Rahmenbedingungen einstellen. So muss kein Training einfach ausfallen, was für Dich auch frustrierend ist, da Du damit auch um sein Ziel fürchtet. Der Plan richtet sich nach Dir und Deinen Freiräumen.
+
+Ein Trainingsplan ist wie ein Anzug. Es gibt welche von der Stange, die irgendwie schon passen, oder es gibt Maßanzüge.
+
+### Fragen und Feedback
+
+Ein Buch kannst Du nicht Fragen – Deinen Coach sehr wohl. Warum soll ich diese Einheit machen? Ist die wichtig? Wie ist diese Einheit gemeint? Kann ich Die Mittwochseinheit vorziehen? Selbstverständlich kann man sich das Wissen aneignen und die Fragen selber beantworten.
+Oder man hat jemand, der sich damit auskennt und man kann sich auf das Wesentliche konzentrieren: Arbeiten, Trainieren, Essen, Schlafen 😉
\ No newline at end of file
--- /dev/null
+---
+title: "Mitteldistanz-Pläne - triathlon-coaching.com"
+slug: mitteldistanz-plane-triathlon-coaching-com
+excerpt: "### Mitteldistanz / Ironman 70.3 #### finisher Du willst eine Mitteldistanz finishen – nicht mehr und nicht weniger. Dein Ziel ist es schlicht und ergreifend"
+seo_title: "Mitteldistanz-Pläne - triathlon-coaching.com"
+seo_description: "### Mitteldistanz / Ironman 70.3 #### finisher Du willst eine Mitteldistanz finishen – nicht mehr und nicht weniger. Dein Ziel ist es schlicht und ergreifend"
+source: https://www.triathlon-coaching.com/?page_id=598
+---
+
+### Mitteldistanz / Ironman 70.3
+
+#### finisher
+
+Du willst eine Mitteldistanz finishen – nicht mehr und nicht weniger. Dein Ziel ist es schlicht und ergreifend die doppelte Kurzdistanz zu bewältigen und Dein Siegerbierchen zu genießen. Zum Wohl!
+Zielzeit bis 6:00 (m) / 6:30 (w)
+
+1. [Link zum Plan (Base1)](https://www.trainingpeaks.com/training-plans/triathlon/half-ironman/tp-512297/base-1-half-distance-finisher)
+2. [Link zum Plan (Base 2)](https://www.trainingpeaks.com/training-plans/triathlon/half-ironman/tp-534712/base-2-1-half-distance-qualifier)
+
+#### good finisher
+
+Deine Mitteldistanz ist für Dich Deine ganz persönliche Challenge und es irgendwie mit Hängen und Würgen zuschaffen ist nicht Dein Anspruch.
+Zielzeit unter 6:00 (m) / 6:30 (w)
+[Links zum Plan (Base1)](https://www.trainingpeaks.com/training-plans/triathlon/half-ironman/tp-512298/base-1-half-distance-good-finisher)
+
+#### advanced finisher
+
+Du willst eine 70.3 / Mitteldistanz nicht nur irgendwie finishen, sondern souverän und ohne großes Wenn und Aber. Die Langdistanz ist Dir zu viel und auf der Kurzdistanz siehst Du gegen die schnellen Hirsche kein Land. Du bist nicht schnell, aber stabil unterwegs zu einem ungefährdeten Finish.
+Zielzeit ca 5:40 (m) / 6:10 (w)
+[Links zum Plan (Base1)](https://www.trainingpeaks.com/training-plans/triathlon/half-ironman/tp-512299/base-1-half-distance-advanced-finisher)
+
+#### hero
+
+Du schaffst es Familie, Job, Verpflichtungen und Training unter einen Hut zu bringen. Der Sport ist nicht wirklich die allererste Priorität, aber Du weißt welche Key-Sessions Du dann wirklich machen musst.
+Du landest bei allen Rennen im soliden Mittelfeld, Du kannst das Rennen genießen, und lässt so einige hinter Dir und bist stolz auf Dich.
+Zielzeit ca 5:15 (m) / 5:45 (w)
+[Links zum Plan (Base1)](https://www.trainingpeaks.com/training-plans/triathlon/half-ironman/tp-512300/base-1-half-distance-hero)
+
+#### club hero
+
+Im Verein zählst Du zu den Guten, gemeinsame Ausfahrten fährst Du fast komplett im Wind und Du kannst bei noch stärkeren fast mittrainieren. Bei einem 70.3 möchtest Du die 5:00 (Mann) oder 5:30 (Frau) Stunden unterbieten.
+Die Langdistanz ist aktuell kein Thema für Dich.
+Zielzeit ca 4:45 (m) / 5:15 (w)
+[Links zum Plan (Base1)](https://www.trainingpeaks.com/training-plans/triathlon/half-ironman/tp-511762/base-1-half-distance-club-hero)
+
+#### local hero
+
+In Deiner Gegend hat Dich Deine Konkurrenz auf dem Zettel. Du weißt, wo das Podium steht und wartest deshalb immer bis zur Siegerehrung. Die Langdistanz ist für Dich Nebensache, aber machbar, auch wenn es zum Ende hin härter werden dürfte.
+Zielzeit unter 4:30 (m) / 5:00 (w)
+[Link zum Plan (Base1)](https://www.trainingpeaks.com/training-plans/triathlon/half-ironman/tp-512295/base-1-half-distance-local-hero)
+
+#### qualifier
+
+Als Qualifier kommst Du gesund und mit einer gewissen Grundfitness aus der Off-Season. Dein Ziel ist eine WM (70.3, Challenge …). „Dabei sein ist alles“ ist nice, aber Du startest da nicht, um Zweiter zu werden 😉 Und dafür bsit Du bereit, Dich vom ersten Moment an immer einen Tick mehr zu schinden als die Konkurrenz. Leide im Training, damit die anderen im Wettkampf leiden. Die Langdistanz ist für Dich mit einer sehr guten Zeit machbar, aber nicht Dein Hauptfokus.
+Zielzeit unter 4:15 (m) / 4:45 (w)
+[Link zum Plan (Base1)](https://www.trainingpeaks.com/training-plans/triathlon/half-ironman/tp-512296/base-1-half-distance-championchip-qualifier)
+
+###
\ No newline at end of file
--- /dev/null
+---
+title: "Mittwochs fängt die Woche an - triathlon-coaching.com"
+slug: mittwochs-fangt-die-woche-an-triathlon-coaching-com
+excerpt: "### Warum Mittwochs? Es ist ziemlich üblich, sich an die Kalenderwochen zu halten, was auch auf der Hand liegt. Davon weiche ich ab. Warum? Spätestens am"
+seo_title: "Mittwochs fängt die Woche an - triathlon-coaching.com"
+seo_description: "### Warum Mittwochs? Es ist ziemlich üblich, sich an die Kalenderwochen zu halten, was auch auf der Hand liegt. Davon weiche ich ab. Warum? Spätestens am"
+source: https://www.triathlon-coaching.com/?p=470
+---
+
+### Warum Mittwochs?
+
+Es ist ziemlich üblich, sich an die Kalenderwochen zu halten, was auch auf der Hand liegt.
+
+Davon weiche ich ab. Warum?
+Spätestens am Mittwoch hat man das Wochenende verkraftet, ob Samstag oder Sonntag ein Wettkampf war oder nicht.
+
+Und deshalb hat es sich als praktisch und sinnvoll erwiesen immer von Mittwoch bis Dienstag zu planen.
\ No newline at end of file
--- /dev/null
+---
+title: "Saisonplanung - wie geht man vor? - triathlon-coaching.com"
+slug: saisonplanung-wie-geht-man-vor-triathlon-coaching-com
+excerpt: "### Das Ziel bestimmt den Weg Thema eines anderen Blogs war die richtige [Zieldefinition](https://www.triathlon-coaching.com/?p=36). Was ist ein gutes Ziel und"
+seo_title: "Saisonplanung - wie geht man vor? - triathlon-coaching.com"
+seo_description: "### Das Ziel bestimmt den Weg Thema eines anderen Blogs war die richtige [Zieldefinition](https://www.triathlon-coaching.com/?p=36). Was ist ein gutes Ziel und"
+source: https://www.triathlon-coaching.com/?p=28
+---
+
+### Das Ziel bestimmt den Weg
+
+Thema eines anderen Blogs war die richtige [Zieldefinition](https://www.triathlon-coaching.com/?p=36). Was ist ein gutes Ziel und wie setze ich mir ein gutes Ziel. Und irgendwann ist es dann da, das Ziel. Und nun? Jetzt stehen wir da wie der sprichwörtliche Ochs vorm Berg und fragen uns: „Wie komme ich da hin?“ Wie schaffe ich beispielsweise den Marathon in 3:30, also einen Schnitt von 5 min/km?
+
+Bergsteiger und Kletterer planen ihre Routen genau und wissen, welche Spalte und Vorsprünge der Eigernordwand begehbar sind, welche Seile und Ausrüstung sie brauchen und wie sie sich ernähren.
+
+Ein Ausdauersportler geht im Prinzip auch nicht anders vor. Dabei gibt es zwei Aspekte: Die zeitliche und die inhaltliche Ausprägung des Ziels.
+
+### Fokus beibehalten
+
+Ein Jahreshighlight in den Kalender einzutragen, ist die leichteste Übung. Und dann?
+
+Während der Bergsteiger vom Tal zum Berg plant, geht unser Marathoni den umgekehrten Weg und plant von seinem Marathon zurück Richtung Gegenwart. Und zwar in mehrwöchigen Zyklen. Die Entlastungswochen und Testwettkämpfe werden zu diesem Zeitpunkt bestimmt.
+
+Ich gehe sogar soweit, dass ich potentielle Testwettkampftermine festlege und dann schaue, wie das Veranstaltungsangebot zu diesen Daten ist. So suche ich zum Datum das Rennen anstelle zu überlegen, wie ich meine Lieblingsrennen, Traditionsveranstaltungen oder sonstige vom Umfeld mit Erwartungen überladenen Termine in die Periodisierung zu zwängen.
+
+Man darf schon die Wertigkeit des „38. Volkslauf um Meiers Kartoffelacker“ des Heimatvereins im Vergleich zum Marathon in Bestzeit kritisch hinterfragen. Die Konsequenzen des Nein-Sagens muss man allerdings aushalten können und wollen. Das darf jeder mit sich selbst ausmachen.
+
+### Das Ziel muss passen
+
+Der inhaltliche Aspekt ist anders. Aus dem Ziel und der aktuellen Form folgt ein Soll und Ist, unser 3:50-Marathoni muss sich im Klaren sein, dass er auch seine 10 km Zeit auf ca. 45 Minuten verbessern muss, will er denn den Marathon in 3:30 laufen. Über die gesamte Saison hinweg entwickeln sich nicht nur die Leistungen auf den anderen Strecken mit, sondern auch die Trainingstempi passen sich an bzw. werden angepasst. Testwettkämpfe helfen dabei den Fortschritt sichtbar und messbar zu machen. Abgesehen davon: Ist eine notwendige Steigerung unrealistisch, dann passt das Ziel nicht und muss korrigiert werden.
+
+Saisonplanung ist vor allem auch eine ehrliche Auseinandersetzung mit sich selbst:
+
+* „Was kann ich?“
+* „Was will ich?“
+* „Was bin ich bereit zu tun?“
\ No newline at end of file
--- /dev/null
+---
+title: "Standard-Pläne - triathlon-coaching.com"
+slug: standard-plane-triathlon-coaching-com
+excerpt: "### Training von der Stange Wenn Dir Personal Coaching aus welchen Gründen auch immer nicht zusagt, sollst Du nicht im Regen stehen. Du kannst bei"
+seo_title: "Standard-Pläne - triathlon-coaching.com"
+seo_description: "### Training von der Stange Wenn Dir Personal Coaching aus welchen Gründen auch immer nicht zusagt, sollst Du nicht im Regen stehen. Du kannst bei"
+source: https://www.triathlon-coaching.com/?page_id=583
+---
+
+### Training von der Stange
+
+Wenn Dir Personal Coaching aus welchen Gründen auch immer nicht zusagt, sollst Du nicht im Regen stehen.
+
+Du kannst bei Trainingpeaks unter [www.trainingpeaks.com/my-training-plans/triathlon-coaching.com](https://www.trainingpeaks.com/my-training-plans/triathlon-coaching.com) Pläne für verschiedene Leistungsstufen kaufen und in Deinen Trainingpeaks-Account laden. Den brauchst Du allerdings, jedoch ist die Premium-Version nicht notwendig.
+
+Es gibt für jede Distanz 7 Leistungsstufen und 3 Distanzen von Kurzdistanz (1,5-40-10), Mitteldistanz/70.3 und Langdistanz. [Einschätzen](https://www.triathlon-coaching.com/?p=36) musst Du Dich selbst.
+
+Die Saison wird in Trainingsphasen unterteilt:
+
+* Grundlagenphasen
+ + Base 1 (online)
+ + Base 2
+ + Base 3
+* Aufbauphasen
+* Tapering
+
+Somit gibt es für jede Stufe, Strecke und Phase einen Plan.
+
+Ein paar Anmerkungen:
+
+* Die Grundlagenphasen können wiederholt werden, es empfiehlt sich sogar. Auch die Aufbauphase Build 1 kann man zweimal ausführen. Build 2 möchtest Du nicht zweimal machen. 😉
+* Auch wenn die Pläne im 3:1-Rhythmus – 3 Belastungswochen, 1 Adaptions-(entlastungs)woche – aufgebaut sind, kannst Du 1 Woche rausnehmen, wenn es Dir aufgrund von Wettkämpfen besser passt.
+* Anstelle der Tests in der letzten Woche können auch Wettkämpfe eingebaut werden. Ansonsten bin ich ein Freund regelmäißger Überprüfung des Fortschritts.
+
+Grundsätzliche Fragen dürfen gestellt werden: [Schreibe mir eine Nachricht](https://www.triathlon-coaching.com/?page_id=80)
+
+Anmerkung zu den Zeiten: Die sind gedacht für die AK bis ca. AK 45, danach muss man naturgemäß altersbedinget Abstriche machen.
+Und es kann auch schneller oder langsamer werden, abhängig von Wetter, Streckenprofil, Trainingsalter, Talent, Material …
+
+### DiePläne
+
+[Langdistanz-Pläne](https://www.triathlon-coaching.com/?page_id=594)
+
+[Mitteldistanz-Pläne](https://www.triathlon-coaching.com/?page_id=598)
+
+[Kurzdistanz-Pläne](https://www.triathlon-coaching.com/?page_id=599)
\ No newline at end of file
--- /dev/null
+---
+title: "Über mich - triathlon-coaching.com"
+slug: uber-mich-triathlon-coaching-com
+excerpt: "Seit 1987 bin ich Läufer und seit 1997 Triathlet – zum großen Teil leistungssportlich. Zwischen 800m und Ironman habe ich keine Strecke ausgelassen. Anders"
+seo_title: "Über mich - triathlon-coaching.com"
+seo_description: "Seit 1987 bin ich Läufer und seit 1997 Triathlet – zum großen Teil leistungssportlich. Zwischen 800m und Ironman habe ich keine Strecke ausgelassen. Anders"
+source: https://www.triathlon-coaching.com/
+---
+
+Seit 1987 bin ich Läufer und seit 1997 Triathlet – zum großen Teil leistungssportlich. Zwischen 800m und Ironman habe ich keine Strecke ausgelassen. Anders ausgedrückt: Ich spreche bei meinem Training viel aus Erfahrung und kenne sowohl die Einsamkeit der langen Radausfahrt als auch die Hektik auf der Tartanbahn.
+
+Kaum kürzer ist mein Interesse an der Trainingslehre und Sportwissenschaft. So begleitete mich über die Jahre als Athleten bald die Rolle des Trainers, Übungsleiters, Radguides, usw. Das hilft mir, meine langjährigen Erfahrungen und persönlichen Lektionen in meine Trainertätigkeit einfließen zu lassen.
+
+Seit 2018 bin ich auch lizensierter DTU-C-Trainer.
+
+Wie fing es an? Schwimmen war ich beim DLRG und 1986 faszinierte mich die Fußball-WM in Mexiko so sehr, dass ich mit den Anderen den ganzen Sommer über den Bolzplatz rannte. Da wurde ich wohl auch recht fit. Zumindest so fit, dass in der Schule die 1000m schon mal in 3:30 gingen. Damit war ich vorne dabei. Ganz ohne Leichtathletikverein, ohne irgendein Training.
+
+1987, als 14-jähriger, schnürte ich das erste Mal meine Schuhe, um mit meinem Vater eine Runde zu drehen. Nicht viel später folgte der erste Volkslauf über 10km.
+
+#### Marathon mit 16 :-/
+
+Der Einfluß des örtlichen Laufvereins und Bücher wie der Manfred Steffnys Klassiker “Marathontraining” ließen mich gleich die langen Laufstrecken anstreben; mit 16 lief ich dann 1989 in Berlin meinen ersten Marathon in 3:10:51.
+Und ungefähr zu der Zeit erschien in der Sonntagsbeilage der FAZ eine Reportage über Dirk Aschmoneit, einer der ersten richtig guten deutschen Triathleten zusammen mit Wolfgang Dittrich und Jürgen Zäck. Und es hat mich fasziniert: Hawaii: Da muß ich hin!
+Fun fact: Die Ausgabe habe ich viele Jahre später in einem Antiquariat wiedergefunden und gekauft.
+
+Weitere Beschäftigung mit sportwissenschaftlichen Themen, Trainingslehre und dem Thema sportliche Entwicklung ließen die Erkennnis reifen, dass ich “untenrum” schneller werden muss, um auf der langen Strecke auch schnell zu sein.
+
+#### Der Geruch von Tartan
+
+Also wechselte ich zu einer guten, jungen Trainingsgruppe, um dann auf der Bahn zu trainieren und Wettkämpfe zu bestreiten. Und zu Lernen: Lauf-ABC, Athletiktraining, Taktiken, exaktes Paceing – auf der Bahn was ganz anderes als im Triathlon – aber als Erfahrung unendlich wertvoll. Bis heute.
+Und bis heute mag ich den Geruch von Tartan. Riecht nach ehrlichem Sport. Keine Diskussion über die Strecke: 400m sind 400m.
+
+Aus der Zeit kamen auch noch einige Bestzeiten, die auch über 30 Jahre später noch stehen: 800m: 1:58,3 – 3000m: 8:42,4 – 5000m: 15:25,68.
+Ach so: 1991 machte ich meinen ersten (Volks-)Triathlon in Neuss.
+
+Eine ganz andere wertvolle Erfahrung war etwas anderes: Ich habe einem Freund aus meiner damaligen Trainingsgruppe Traningspläne geschrieben. Und die funktionierten auch noch! Gefuchst hat es mich schon, dass Uwe dann auf 10000 schneller war als ich. Weiter wichtige Erkenntnis: Er hat halt konsequenter trainiert als ich. 😉
+
+#### Back to the Roads
+
+Mit dem Juniorenalter war dann die Straßenlaufdistanz für Meisterschaften im DLV wieder länger. Halbmarathon. Das ist zwar „nur“ 6km länger als die 15km, aber die Tücke liegt im Wort: Marathon. Die Strecken wurden wieder länger, neue Bestzeiten kamen dazu. 10000m:.31:49,98 – Halbmarathon 1:14:10 – Marathon: 2:46:23
+Ganz ehrlich ist das nicht wirklich flott und weit weg von richtig gut. Mit 1,88m ist man zu schwer für die Langstrecke und auf der Mittelstrecke sind 54,0 auf 400m ein zu stumpfes Schwert. So kam es wie es kommen musste: Nach Achillessehnenreizung Nummer X sagte ich mir: Bei der nächsten Verletzung wechsle ich zum Triathlon. Spoiler: Hat nicht lang gedauert…. 😉
+
+#### Schwimmen, Radfahren, Laufen – ja, aber wie?
+
+Wir schreiben das Jahr 1997. Qua selbstgefasstem Beschluß wurde ich Triathlet. Schön, Schwimmen im Sinne von mit viel Einsatz halbwegs zügig voran kommen konnte ich. Ein olles Rennrad – sogar mit Aufsatz (lang lebe der Syntace C2 Clip) – hatte ich. Gut, Laufen – davon hatte ich Ahnung.
+
+Laufliteratur gab es damals schon zur Genüge, das Internet war noch eher den Tech-Freaks vorbehalten, aber Triathlontraining wie wir es heute kennen war eigentlich noch nicht wirklich erfunden und Bücher entsprechend selten. So musste ich mir die ganz grundlegenden Dinge der Sportwissenschaften auf den Ausdauerdreikampf anwenden. Und ausprobieren. Und lernen. Vor allem beim Radfahren war ich anfangs völlig ahnungslos.
+
+#### Roth, Roth, Roth und NRW-Liga
+
+Seit dem Ironman Europe in Roth 1998 darf ich mich Ironman nennen. In dieser Zeit startete ich auch in der NRW-Liga, zu der Zeit noch ohne Windschattenfreigabe. Mein damaliger Verein wuchs und hatte bald auch Damen-, Senioren und Masters-Teams in der Liga. Und somit eine schöne Trainingsgruppe, die ich in die Geheimnisse des Laufens einweihen durfte 😉
+Zu dieser Zeit begann auch sowas wie Trainingssteuerung: Dank eines Laktatmessgerätes habe ich dann recht regelmäßig Laktattests durchgeführt und anhand der diagnostizierten Schwellen die Trainingsbereiche festgelegt und Trainingspläne geschrieben. Immerhin schon mit dem PC in Excel-Tabellen.
+
+#### Real life
+
+Irgendwann wurde es dann doch notwendig, beruflich Fuß zu fassen – ich bin hauptberuflich in der IT unterwegs – und die sonst üblichen Dinge zu tun: Haus bauen, Sohn (2x) zeugen, Baum pflanzen und dafür den Sport auf „hin und wieder Bewegung an frischer Luft“ zu reduzieren.
+
+Aber wie es so ist: Leidenschaften sterben nie und so bin ich dem Sport letztendlich treu geblieben. Und je mehr Erfahrung und Wissen man sammelt, je mehr kann man weitergeben.
\ No newline at end of file
--- /dev/null
+---
+title: "Warm-Up vor einem Laufwettkampf - triathlon-coaching.com"
+slug: warm-up-vor-einem-laufwettkampf-triathlon-coaching-com
+excerpt: "### Warm-Up Aufgewärmt heißt, Muskeln und Stoffwechsel sind bereit zur unmittelbaren und hohen Leistungsabgabe. Sich warm fühlen ist was anderes. Das tue ich"
+seo_title: "Warm-Up vor einem Laufwettkampf - triathlon-coaching.com"
+seo_description: "### Warm-Up Aufgewärmt heißt, Muskeln und Stoffwechsel sind bereit zur unmittelbaren und hohen Leistungsabgabe. Sich warm fühlen ist was anderes. Das tue ich"
+source: https://www.triathlon-coaching.com/?p=774
+---
+
+### Warm-Up
+
+Aufgewärmt heißt, Muskeln und Stoffwechsel sind bereit zur unmittelbaren und hohen Leistungsabgabe.
+Sich warm fühlen ist was anderes. Das tue ich auch morgens, wenn ich aus dem Bett komme. Aber wir wissen, dass wir dann nicht lossprinten können. Außer zur Kaffeemaschine 😉
+
+Und so gehts:
+
+* Startnummer abholen und anbringen.
+ Ich trage beim Einlaufen schon die Wettkampfkleidung unten drunter, dann ist das Offizelle schon erledigt.
+* 45-60 min vor dem Start:
+ Einlaufen, erst ultra gemütlich, dann steigern auf „schneller als Ga1“.
+* Spätestens nach dem Einlaufen:
+ Verdauung in Ordnung bringen. Je nachdem wie die Örtlichkeiten sind, solltest Du die (Warte-)Zeit dafür einplanen.
+* 25 min vor dem Start:
+ Kurz dynamisch dehnen (Indoor, sofern kalt draußen und möglich)
+* 20 min vor dem Start:
+ Lauf-ABC in leichte Steigerungen übergehen: Fußgelenkslauf, Skippings, Anfersen 1-2mal pro Übungen
+* 10 min vor dem Start:
+ Traben, Gelenke durchbewegen, 1-2 lockere (!!!) Steigerungen
+* 5 min vor dem Start:
+ Jacke / warme Oberbekleidung reinbringen / abgeben.
+ Am Start leicht frieren ist okay!
+* 3 min vor dem Start:
+ Ins Startfeld einreihen, rumtippeln, in Bewegung bleiben
+* Start:
+ Vollgas! 🔥🔥🔥🔥🔥
+
+Als Faustregel gilt:
+Je kürzer die Strecke, je höher ist das Tempo und je wärmer muß ich sein. Bei 800m läuft der Körper schon auf Hochtouren, bei 100km reicht eine leichte Mobilisation.
+
+Falsch wäre (bspw, aber schon häufig so beobachtet) 10 min traben, 15 min Schlange stehen vor dem Dixi, 20min Smalltalk mit 75 verschiedenen Menschen im Gebäude, rausgehen, feststellen, dass es kalt ist, noch ne Jacke/Mütze/Hose extra anziehen, loslaufen, nach 4 km tatsächlich warm sein, um den Preis viele Körner verschossen zu haben und dann merken, dass der Kreislauf durchdreht, weil die Thermoregulation abgedreht wurde durch zu viele Klamotten.
+
+### Im Ziel
+
+Anziehen, auslaufen und verpflegen, Stretching und nach Hause fahren.
+Oder wenn es zu ungemütlich ist, zu Hause 30min locker auf der Rolle ausfahren und dann Stretching, Essen , Dehnen, Kuchen essen.
\ No newline at end of file
--- /dev/null
+---
+title: "Warum einen Coach? - triathlon-coaching.com"
+slug: warum-einen-coach-triathlon-coaching-com
+excerpt: "### Ich brauche keinen Coach. Natürlich geht alles auch ohne Coach. Ganz ohne Frage. Einen Coach zu engagieren, hat nicht nur positive Aspekte. Erstens kostet"
+seo_title: "Warum einen Coach? - triathlon-coaching.com"
+seo_description: "### Ich brauche keinen Coach. Natürlich geht alles auch ohne Coach. Ganz ohne Frage. Einen Coach zu engagieren, hat nicht nur positive Aspekte. Erstens kostet"
+source: https://www.triathlon-coaching.com/?p=507
+---
+
+### Ich brauche keinen Coach.
+
+Natürlich geht alles auch ohne Coach. Ganz ohne Frage.
+
+Einen Coach zu engagieren, hat nicht nur positive Aspekte. Erstens kostet er Geld und zweitens bedingt die Zusammenarbeit eine gewisse Öffnung der Privatsphäre. Wer das nicht möchte, greift besser zu einem Trainingsplan von der Stange. Oder coacht sich selbst.
+
+### Self-Coaching vs. Coach
+
+Wenn Du Dich selbst coachst – und da kann ich eigentlich schon aufhören zu schreiben.
+„Selbst“ und „Coaching“ ist ein Widerspruch in sich. Wie kannst Du denn einen neutralen Standpunkt Dir selbt gegenüber einnehmen?
+
+Der andere Aspekt ist, dass Selbstcoaching eine Menge Wissen voraussetzt. So wie Du Dir für Steuern, Handwerk usw. einen Dienstleister engagierst, so engagierst Du Dir einen Coach für Dein Training. Ja, Du könnstes Deine Steuern auch selber machen …
+
+Mit einem Coach sparst Zeit und kaufst professionelles Know-How ein.
+
+### Trainingspläne vs. Coach
+
+Auch ich biete Pläne ohne Betreuung an, denn nicht jeder kann sich das leisten.
+
+Dennoch hat dieses Konzept Grenzen. Provokant gefragt:
+
+* Freitags hat Dein Verein Schwimmtraining. Dein Traingsplan nicht.
+ **Wechselst Du den Verein?**
+* Dich interessiert Der Zweck einer Trainingseinheit.
+ ***Wie gut erklärt Dir das Dein Trainingsplan?***
+* Du hast eine Frage.
+ ***Welche Telefonnummer hat Dein Trainingsplan?***
+* Mittwochs wird es immer lang im Job. Im Trainingsplan steht ein long run.
+ ***Kannst Du ihn einfach auf Dienstag legen?***
+* Du bist gelaufen. Es lief nicht so toll.
+ ***Welches Feedback gibt Dir Dein Traingsplan?***
+* Dein Kind hat Geburtstag und Du möchtest Dein Training verschieben.
+ **Wie geht Dein Trainingsplan damit um?**
+* Mist! Du hast Dich erkältet.
+ **Ist das in Deinem Trainingsplan vorgesehen?**
+* Du bist tierisch gut drauf, denn Du schwimmst wie ein Fisch und läufst wie eine Schildkröte.
+ **Weiß Dein Trainingsplan das?**
+* Du hast Dich verletzt.
+ **Kennt Dein Trainingsplan eigentlich einen guten Physio?**
+* Du planst ein Trainingslager.
+ **Dein Plan auch?**
+* Sunday-Group-Ride.
+ Geplant: Kurz, flach, locker.
+ Gemacht: 8000Watt, 5 Ortschilder gewonnen und 3 Segmente geholt.
+ **Wie spontan baut Dein Trainingsplan einen Ruhetag ein?**
+* Endlich Race-Day!
+ *Dein Trainingsplan entwirft den Matchplan, steht am Streckenrand und feuert Dich an. Tut er nicht?*
+
+Ein Coach kann noch etwas ganz anderes:
+Loben und Kritisieren.
+Vertrauen und Zutrauen.
\ No newline at end of file
--- /dev/null
+---
+title: "Was kostet das? - triathlon-coaching.com"
+slug: was-kostet-das-triathlon-coaching-com
+excerpt: "Um dir ein optimales Erlebnis zu bieten, verwenden wir Technologien wie Cookies, um Geräteinformationen zu speichern und/oder darauf zuzugreifen. Wenn du"
+seo_title: "Was kostet das? - triathlon-coaching.com"
+seo_description: "Um dir ein optimales Erlebnis zu bieten, verwenden wir Technologien wie Cookies, um Geräteinformationen zu speichern und/oder darauf zuzugreifen. Wenn du"
+source: https://www.triathlon-coaching.com/?p=67
+---
+
+Um dir ein optimales Erlebnis zu bieten, verwenden wir Technologien wie Cookies, um Geräteinformationen zu speichern und/oder darauf zuzugreifen. Wenn du diesen Technologien zustimmst, können wir Daten wie das Surfverhalten oder eindeutige IDs auf dieser Website verarbeiten. Wenn du deine Zustimmung nicht erteilst oder zurückziehst, können bestimmte Merkmale und Funktionen beeinträchtigt werden.
+
+Die technische Speicherung oder der Zugang ist unbedingt erforderlich für den rechtmäßigen Zweck, die Nutzung eines bestimmten Dienstes zu ermöglichen, der vom Teilnehmer oder Nutzer ausdrücklich gewünscht wird, oder für den alleinigen Zweck, die Übertragung einer Nachricht über ein elektronisches Kommunikationsnetz durchzuführen.
+
+
+
+
+
+Die technische Speicherung oder der Zugriff ist für den rechtmäßigen Zweck der Speicherung von Präferenzen erforderlich, die nicht vom Abonnenten oder Benutzer angefordert wurden.
+
+
+
+
+
+Die technische Speicherung oder der Zugriff, der ausschließlich zu statistischen Zwecken erfolgt.
+Die technische Speicherung oder der Zugriff, der ausschließlich zu anonymen statistischen Zwecken verwendet wird. Ohne eine Vorladung, die freiwillige Zustimmung deines Internetdienstanbieters oder zusätzliche Aufzeichnungen von Dritten können die zu diesem Zweck gespeicherten oder abgerufenen Informationen allein in der Regel nicht dazu verwendet werden, dich zu identifizieren.
+
+
+
+
+
+Die technische Speicherung oder der Zugriff ist erforderlich, um Nutzerprofile zu erstellen, um Werbung zu versenden oder um den Nutzer auf einer Website oder über mehrere Websites hinweg zu ähnlichen Marketingzwecken zu verfolgen.
\ No newline at end of file
--- /dev/null
+---
+title: "Was nicht auf Strava ist, ist nicht passiert? - triathlon-coaching.com"
+slug: was-nicht-auf-strava-ist-ist-nicht-passiert-triathlon-coaching-com
+excerpt: "Um dir ein optimales Erlebnis zu bieten, verwenden wir Technologien wie Cookies, um Geräteinformationen zu speichern und/oder darauf zuzugreifen. Wenn du"
+seo_title: "Was nicht auf Strava ist, ist nicht passiert? - triathlon-coaching.com"
+seo_description: "Um dir ein optimales Erlebnis zu bieten, verwenden wir Technologien wie Cookies, um Geräteinformationen zu speichern und/oder darauf zuzugreifen. Wenn du"
+source: https://www.triathlon-coaching.com/?p=508
+---
+
+Um dir ein optimales Erlebnis zu bieten, verwenden wir Technologien wie Cookies, um Geräteinformationen zu speichern und/oder darauf zuzugreifen. Wenn du diesen Technologien zustimmst, können wir Daten wie das Surfverhalten oder eindeutige IDs auf dieser Website verarbeiten. Wenn du deine Zustimmung nicht erteilst oder zurückziehst, können bestimmte Merkmale und Funktionen beeinträchtigt werden.
+
+Die technische Speicherung oder der Zugang ist unbedingt erforderlich für den rechtmäßigen Zweck, die Nutzung eines bestimmten Dienstes zu ermöglichen, der vom Teilnehmer oder Nutzer ausdrücklich gewünscht wird, oder für den alleinigen Zweck, die Übertragung einer Nachricht über ein elektronisches Kommunikationsnetz durchzuführen.
+
+
+
+
+
+Die technische Speicherung oder der Zugriff ist für den rechtmäßigen Zweck der Speicherung von Präferenzen erforderlich, die nicht vom Abonnenten oder Benutzer angefordert wurden.
+
+
+
+
+
+Die technische Speicherung oder der Zugriff, der ausschließlich zu statistischen Zwecken erfolgt.
+Die technische Speicherung oder der Zugriff, der ausschließlich zu anonymen statistischen Zwecken verwendet wird. Ohne eine Vorladung, die freiwillige Zustimmung deines Internetdienstanbieters oder zusätzliche Aufzeichnungen von Dritten können die zu diesem Zweck gespeicherten oder abgerufenen Informationen allein in der Regel nicht dazu verwendet werden, dich zu identifizieren.
+
+
+
+
+
+Die technische Speicherung oder der Zugriff ist erforderlich, um Nutzerprofile zu erstellen, um Werbung zu versenden oder um den Nutzer auf einer Website oder über mehrere Websites hinweg zu ähnlichen Marketingzwecken zu verfolgen.
\ No newline at end of file
--- /dev/null
+---
+title: "Welche Rolle hast Du? - triathlon-coaching.com"
+slug: welche-rolle-hast-du-triathlon-coaching-com
+excerpt: "### Können Coaches zaubern? Spoiler: Nein, Coaches können nicht zaubern. Kein Coach kann irgendwelche Tricks aus der Schublade ziehen wie ein Zauberer das"
+seo_title: "Welche Rolle hast Du? - triathlon-coaching.com"
+seo_description: "### Können Coaches zaubern? Spoiler: Nein, Coaches können nicht zaubern. Kein Coach kann irgendwelche Tricks aus der Schublade ziehen wie ein Zauberer das"
+source: https://www.triathlon-coaching.com/?p=537
+---
+
+### Können Coaches zaubern?
+
+Spoiler: Nein, Coaches können nicht zaubern.
+Kein Coach kann irgendwelche Tricks aus der Schublade ziehen wie ein Zauberer das Kaninchen aus dem Hut.
+
+Ich verstehe Coaching vor allem auch als Begleitung durch das Training.
+
+Eher ist der Coach ein Lotse auf der Brücke, der durch unbekannte Gewässer begleitet.
+Einer, der Wissen weitergibt und mit dem Du Dich weiterentwickeln kannst.
+
+Du bist quasi Schiff und Kapitän in Einem, als Lotse bin ich dafür zuständig, dass Du auf dem Weg bleibst und Du nicht auf Grund läufst.
+Du gibst das Ziel vor.
+
+Gezaubert wird im Zirkus 😉
+
+### Training ist Arbeit
+
+Der Erfolg kommt durch Fleiß, Disziplin und Kontinuität und dem Willen, besser zu werden.
+Du hast den Hauptpart. Du musst trainieren.
+
+Auch Deine [Zielsetzung](https://www.triathlon-coaching.com/?p=36) ist Deine Aufgabe.
+
+Du solltest Dir auch im Klaren sein, was Du bereit bist einzusetzen.
+
+### Wieviel Zeit kannst Du erübrigen?
+
+Bei allem Bemühen, effektiv zu trainieren, es gibt Grenzen des Machbaren:
+
+* Mit 3 Wochenstunden Training wird es schwierig mit der Langdistanz.
+ „Du bist der Coach, Du musst wissen wie das geht“. Nein, gegen gewisse Gesetzmäßigkeiten kann kein Coach der Welt etwas ausrichten.
+* Wer am Wochende dem Sonntagsbraten mit doppelt Kloß und Soß bei den Schwiegereltern Priorität gibt, darf das bei der Zielsetzung berücksichtigen.
+* Ob der Besuch von Rock am Ring oder im Park 4 Wochen vor dem Saisonhöhepunkt eine gute Idee ist, möchte ich bezweifeln.
+ Kann gut gehen. Muss aber nicht.
+
+Das sind keine Erfindungen 😉
+
+Je höher Dein Ziel ist, je mehr mehr wirst Du einbringen müssen….
\ No newline at end of file
--- /dev/null
+---
+title: "... wenn Du krank bist ... - triathlon-coaching.com"
+slug: wenn-du-krank-bist-triathlon-coaching-com
+excerpt: "### … bist Du krank! Mit Wehwehchen oder Symtomen einer (Atemwegs-)Erkrankung gilt: **Trainingverbot!** Natürlich kann man mit Schulterproblemen oft ein"
+seo_title: "... wenn Du krank bist ... - triathlon-coaching.com"
+seo_description: "### … bist Du krank! Mit Wehwehchen oder Symtomen einer (Atemwegs-)Erkrankung gilt: **Trainingverbot!** Natürlich kann man mit Schulterproblemen oft ein"
+source: https://www.triathlon-coaching.com/?p=475
+---
+
+### … bist Du krank!
+
+Mit Wehwehchen oder Symtomen einer (Atemwegs-)Erkrankung gilt: **Trainingverbot!**
+
+Natürlich kann man mit Schulterproblemen oft ein Lauftraining machen. In diesem Fall baue ich das Training um und die Schwimmsachen bleiben trocken.
+
+Aber es ist Keinem gedient – weder Dir noch mir – wenn man sich mit irgendwelchen Verletzungen oder Krankheiten durch die Saison schleppt und deswegen nicht den erwünschen Erfolg hat. Von langfristigen Schäden und chronisch werdenden Dingen ganz zu schweigen.
+
+Lebensgefährlich wird es, wenn sich bakterielle Infektionen aufs Herz setzen.
+
+Aus diesem Grund sind **Krankheitszeiten** bei mir **kostenfrei**.
+
+Ich möchte nicht, dass Du den Gedanken entwickelst, durch das Gefühl „für nichts“ zu bezahlen, zu früh wieder anfängst oder gar durchtrainierst. Zum Gesund werden brauchst Du die Zeit, die Du dafür brauchst, aber auf keinen Fall Druck.
+
+[Gesundheit](https://www.triathlon-coaching.com/?p=65) ist unbezahlbar.
\ No newline at end of file
--- /dev/null
+---
+title: "Wie funktioniert individuelles Coaching? - triathlon-coaching.com"
+slug: wie-funktioniert-individuelles-coaching-triathlon-coaching-com
+excerpt: "### Athlet und Trainer lernen sich kennen Am Anfang steht ein persönliches Kennenlernen, entweder per Telefon, Skype oder eben live. So können wir uns über"
+seo_title: "Wie funktioniert individuelles Coaching? - triathlon-coaching.com"
+seo_description: "### Athlet und Trainer lernen sich kennen Am Anfang steht ein persönliches Kennenlernen, entweder per Telefon, Skype oder eben live. So können wir uns über"
+source: https://www.triathlon-coaching.com/?p=51
+---
+
+### Athlet und Trainer lernen sich kennen
+
+Am Anfang steht ein persönliches Kennenlernen, entweder per Telefon, Skype oder eben live. So können wir uns über Deine Ziele austauschen. Du lernst mich und meine Philosophie kennen und ich Dein Umfeld, Deine Geschichte sowie Deinen sportlichen Werdegang. Auch Dein Equipment kann ich berücksichtigen – nicht jeder Athlet besitzt ein MTB, eine Rolle, einen Wattmesser oder ein Fitnessstudio in der Umgebung.
+
+### Wir setzen Ziele
+
+Wenn das passt, können wir zusammenarbeiten. Im nächsten Schritt folgt eine Bestandsaufnahme und dann werden Ziele gemeinsam definiert.
+
+Gemeinsam deswegen, da ich als Trainer darauf achte, dass ein Ziel weder zu hoch noch zu niedrig gesteckt ist. Da erlaube ich mir auch, Dich gegebenenfalls zu bremsen, denn der Sport soll unterm Strich bei aller Anstrengung und manchmal auch Quälerei Spaß machen, motivieren und eine Quelle für Lebensfreude sein.
+
+### Dialog schafft Fortschritte
+
+Coaching findet im Dialog statt. So erwarte ich im Gegenzug zu meinen Plänen Deine Mitarbeit. Auch um den Aufwand der Protokollierung gering zu halten, setze ich auf die Tools wie [Trainingpeaks](https://www.trainingpeaks.com/). Ganz ohne Trainingsdaten geht es nicht, denn nur so bin ich als Trainer in der Lage, Feedback zu geben, zu motivieren und zu optimieren.
+
+So können wir gemeinsam Fortschritt und Entwicklung messen und visualisieren und den Dialog zwischen Athlet und Trainer insbesondere bei einer Betreuung aus der Ferne unterstützen.
+
+Auch wenn die moderne Technik eine tolle Unterstützung darstellt – das persönliche Gespräch soll und wird sie nicht ersetzen! Für Fragen, Tipps und Rat bin ich für Dich jederzeit ansprechbar, ob per Mail, Zoom, WhatsApp oder Telefon.
\ No newline at end of file
--- /dev/null
+---
+title: "Wie ich mit Athleten und Athletinnen arbeite(te) - triathlon-coaching.com"
+slug: wie-ich-mit-athleten-und-athletinnen-arbeite-te-triathlon-coaching-com
+excerpt: "### Am Anfang stand das Papier Vor fast 30 Jahren fing ich an, Trainingspläne für andere, in der Regel befreundete Athleten zu schreiben. Die allerersten"
+seo_title: "Wie ich mit Athleten und Athletinnen arbeite(te) - triathlon-coaching.com"
+seo_description: "### Am Anfang stand das Papier Vor fast 30 Jahren fing ich an, Trainingspläne für andere, in der Regel befreundete Athleten zu schreiben. Die allerersten"
+source: https://www.triathlon-coaching.com/?p=50
+---
+
+### Am Anfang stand das Papier
+
+Vor fast 30 Jahren fing ich an, Trainingspläne für andere, in der Regel befreundete Athleten zu schreiben. Die allerersten Exemplare wurden per Hand geschrieben oder wesentlich leserlicher in einem Editor meines 286ers unter MS-DOS getippt.
+Mit den ersten Programmierkenntnissen und angewandter Mathematik versuchte ich mich an Algorithmen und hatte dabei die Vision und auch Illusion, aus einer Handvoll Parametern die ganze Komplexität des Training-Planens abzuleiten.
+Auch Tabellenkalkulationen reduzieren lediglich den Darstellungsaufwand, aber lichten nicht das Dickicht aus Abhängigkeiten und Regeln, die die Sportwissenschaft nun mal aufstellt.
+
+### Coach vor Computer
+
+Seitdem nutze ich Software zur Unterstützung bei der Planung. Und weil sie schöner schreibt, schneller übermittelt und besser darstellt, was ich mir ausgedacht habe.
+Die Individualität des Athleten ist jedoch nur mit Gefühl, Erfahrung, Zuhören und Verstehen zu erfassen.
+
+### Flexibilität
+
+Während ich diese Zeilen tippe, versinkt das Land im Schnee. Das ist ein gutes Beispiel: Wenn das Wetter nicht passt, kann ich als Mensch darauf reagieren. Bei einem Sturmtief wird eine lange Radeinheit umgeplant.
+Auch persönliche oder berufliche Dinge können unverhofft dazwischen kommen. Der spontane Einsatz beim Kunden kann auch die Schlüsseleinheit torpedieren. Weil die Regenerationszeit mit bedacht werden sollte, kann man nicht einfach das Training am folgend Tag nachholen.
+Auf all diese Vorkommnisse flexibel zu reagieren – das kann eine Software nicht leisten.
+
+### Big Data am Handgelenk
+
+Modernes Equipment liefert mittlerweile eine Flut an Daten. Puls, Pace, Power, Schrittlänge, Recht-Links-Balance – alles was messbar ist, wird gemessen.
+aber auf was kommt es an? Wie interpretiert man diese Zahlen? Auch hier hilft Dir ein Trainer, der die vermeintlichen Widersprüche auflöst oder einfach die Ruhe bewahrt, wenn bei plötzlich wärmerem Wetter der Puls bei gleicher Leistung einfach etwas höher liegt.
+Als Coach finde ich die Zahlen äußerst hilfreich, um zu erkennen, wie gut der Athlet die Einheit umgesetzt hat und um die Entwicklung des Trainings besser messen und damit steuern zu können.
\ No newline at end of file
--- /dev/null
+---
+title: "Wie legen wir los? Wie läuft das ab? - triathlon-coaching.com"
+slug: wie-legen-wir-los-wie-lauft-das-ab-triathlon-coaching-com
+excerpt: "### Unsere Zusammenarbeit Nach dem Erstgespräch und der Bestandsaufnahme erhältst Du laufend Deinen Plan in [Trainingpeaks](https://trainingpeaks.com/). Den"
+seo_title: "Wie legen wir los? Wie läuft das ab? - triathlon-coaching.com"
+seo_description: "### Unsere Zusammenarbeit Nach dem Erstgespräch und der Bestandsaufnahme erhältst Du laufend Deinen Plan in [Trainingpeaks](https://trainingpeaks.com/). Den"
+source: https://www.triathlon-coaching.com/?p=525
+---
+
+### Unsere Zusammenarbeit
+
+Nach dem Erstgespräch und der Bestandsaufnahme erhältst Du laufend Deinen Plan in [Trainingpeaks](https://trainingpeaks.com/).
+
+Den Account legst Du an und fügst mich als Coach hinzu. gerne helfe ich Dir dabei, z.B. per Zoom.
+
+Dann verbindest Du Trainingpeaks mit Deiner Sportuhr bzw. Pulsmesser.
+Ich persönlich bin Garmin-User und in dieser Welt recht vertraut und kann Dir helfen, Deine Gadgets mit Trainingpeaks zu verknüpfen.
+
+Die Uhr ist das Equipment, was Du tatsächlich brauchst.
+Wenn Du kein Powermeter und keine smarte Rolle hast, ist das kein Problem, …
+… aber ich begrüße es, wenn Du Dir Möglichkeiten zur Leistungsmessung zulegst 😉
+
+In der Regel weißt Du mit ausreichedem Vorlauf, wie Dein Trainingsprogramm aussieht.
+Morgens aufstehen und nicht wissen, was abends trainiert werden soll – dass gibt es bei mir nicht.
+
+Dank Pulsuhr / Tacho / Smartrainer erledigt sich die Protokollierung fast von selbst; Trainingpeaks bietet die Möglichkeit Deine Einheit zu kommentieren.
+Per Push-Nachricht werde ich benachrichtigt und kann dann sehen, was Du gemacht hast und leiste ggf. Feedback.
+So lernen wir voneinander und entwickeln ein gemeinsames Verständnis.
+
+Das Zusammenspiel zwischen Dir und mir spielt sich meist in ein paar Wochen ein, dann weiß jeder, wie der andere so tickt. Erfahrungsgemäß dauert das ein Weilchen.
+Deshalb: Fragen, Rat oder Unterstützung? Sprechstunden gibt es nur beim Arzt, mich fragst Du einfach. Egal wann, egal wie oft.
+
+### … und wenn nicht?
+
+Dann nicht! So einfach wie Du mich engagieren kannst, so [einfach](https://www.triathlon-coaching.com/?p=472) wirst Du mich auch wieder los; so etwas wie eine Kündigungsfrist oder restliche Vertragslaufzeit kenne ich nicht.
+
+Ob Du andere Ziele verfolgen möchtest und bei unserem Lieblingshobby kürzer treten musst, oder wenn wir einfach nicht zusammen passen: Ein Gespräch reicht.
+Das gilt auch für mich. Das Coaching muss auch mich mit Sinn erfüllen, Wenn Du dauernd doch was anderes machst, hat es keinen Zweck.
+
+Ach ja: Wer dopt, fliegt raus. Achtkantig.
\ No newline at end of file
--- /dev/null
+---
+title: "Ziele setzen - aber richtig! - triathlon-coaching.com"
+slug: ziele-setzen-aber-richtig-triathlon-coaching-com
+excerpt: "### Aloha! Für den Einen oder Anderen ist die Saison noch nicht zu Ende, ein später Marathon oder gar der Ironman Hawaii stehen noch auf dem Programm. Die"
+seo_title: "Ziele setzen - aber richtig! - triathlon-coaching.com"
+seo_description: "### Aloha! Für den Einen oder Anderen ist die Saison noch nicht zu Ende, ein später Marathon oder gar der Ironman Hawaii stehen noch auf dem Programm. Die"
+source: https://www.triathlon-coaching.com/?p=36
+---
+
+### Aloha!
+
+Für den Einen oder Anderen ist die Saison noch nicht zu Ende, ein später Marathon oder gar der Ironman Hawaii stehen noch auf dem Programm. Die meisten von Euch befinden sich in der Off-Season und machen sich Gedanken um die nächste Saison. Die Gedankenfetzen kreisen um „Ich würde ja gerne …“, „Lust hätte ich auf…“ oder sind schon einen Schritt weiter und ganz konkret „Ich bin gemeldet in … am“.
+
+Selbst die, die schon wissen, WO sie starten, wissen noch nicht unbedingt, WAS sie da erreichen wollen. Klar, das Ziel, also finishen. Ein DNF plant wahrscheinlich niemand. 😉
+
+### Letztendlich geht es darum, wie man sich welches Ziel setzt.
+
+Dabei geht es um folgende Fragen:
+
+* Gibt es einen Termin und Ort?
+* Was bin ich bereit zu investieren?
+* Wie sind meine Voraussetzungen?
+* Was ist meine Vision?
+* Welche Steigerungen traue ich mir zu bzw. sind nicht völlig utopisch.
+
+Termin und Ort – das ist am einfachsten zu klären. Diejenigen, die sich beispielsweise in Roth um 6 Uhr morgens in die Schlange stellen, um einen Startplatz zu ergattern, zeigen mit dem Finger schräg gegenüber auf den Festplatz mit dem Zielbogen und sagen: „Ich will da durchlaufen. Am …“ Und der Termin ist für sie präsenter als der eigene Geburtstag. Termin und Ort sind also in Stein gemeißelt. Für diejenigen, die im Herbst noch zwischen Wünschen und Ideen die richtige Inspiration suchen, kristallisiert sich irgendwann auch etwas konkretes, sprich ein Ort und ein Datum, heraus.
+
+Aber wenn man dann weiter fragt – „In welcher Zeit?“, geht das Gedruchse los. Die Antworten reichen von „Schaun mer mal“ über „Nur Finishen“ bis hin zu „Dem Frodo einen einschenken“. Der Leser mag schmunzeln, wenn er sich da vielleicht wiedererkennt.
+
+In den Köpfen diskutieren dann Engelchen und Teufelchen: „Sub 10 geht bestimmt.“ – „Mehr als 10 Stunden Training schaff ich nicht.“ – „Und im Januar fange ich einen neuen Job an.“ – „Ja, aber da sparst Du 1 Stunde Arbeitsweg pro Tag.“ – „Von 11:45 nach 10 ist zu viel auf einmal, ich Bleiente pack den Marathon nie unter 4, wie soll das gehen?“ – „Aber wenn Hawaii kein Traum bleiben soll ….“ – „Hey, werde mal nicht größenwahnsinnig, in der AK70 vielleicht, da brauchst keine Quali.“ – „Ich bin erst 25!“
+
+Die Abwägungen im Kopf sind vielfältig und so amüsant sich dieser Dialog hoffentlich liest, stecken da viele Aspekte einer richtigen, korrekten Zielsetzung drin.
+
+Die sollte eben „SMART“ sein. SMART steht dabei für die Anfangsbuchstaben von **„spezifisch“, „messbar“, „attraktiv“, „realistisch“ und „terminiert“** und definieren die Eigenschaften einer guten Zielsetzung.
+
+Jetzt atmen wir einmal durch und gucken uns das genauer an.
+
+### spezifisch, …
+
+Was ist denn „spezifisch“? Ein spezifisches Ziel ist eines, das **konkret präzisiert** wird. Also ziemlich genau das Gegenteil von „Schaun mer mal“. Hosen runter lassen ist angesagt. Zum Beispiel: „Ich will endlich den Marathon unter 4 Stunden laufen. „Das ist so einfach wie das Schreiben des Wunschzettels zu Weihnachten. Mach eine ganz konkrete Ansage! Keine Hemmungen, nicht zögern, sondern Zack und raus damit. Und am besten gleich aufschreiben. Ob man das gleich der ganzen Welt wissen lässt oder vielleicht nur dem Partner, bleibt jedem selbst überlassen.
+
+### … messbar, …
+
+Mit dem Ziel, den Marathon unter 4 Stunden zu laufen, ist sogleich ein **messbares Ziel** gesetzt. Die Uhren sind unbestechlich und somit gibt es für das Ziel die beiden Zustände „erreicht“ und „nicht erreicht“. Schwieriger sind Ziele, die von Einflussfaktoren abhängen, die außerhalb der eigenen Macht stehen. Platzierungen zu erreichen hört sich ganz konkret mess- und überprüfbar an, aber ob die Konkurrenz mitspielt, weiß man nicht. Die Leichtathletik-Ikone der 80er-Jahre, Harald Schmidt, wollte bestimmt Olympiasieger und Weltmeister über die 400m Hürden werden, leider war Edwin Moses immer schneller. Eine persönliche Bestzeit ist sicher keine schlechte Leistung, aber für das Ziel, den Titel, reichte es nicht. An diesem Beispiel wird deutlich, dass **Platzierungen ein Wunsch sein dürfen, aber kein Ziel sein sollten**.
+
+### … attraktiv, …
+
+„Nur Finishen“ ist übrigens auch ein messbares, nämlich ein Zeit-Ziel, denn es gibt den Zielschluss. Aber außer einem Newbie und Wenigtrainierer kauft keiner ein derart formuliertes Ziel ab. Warum? Jeder vermutet, dass da einer nicht die Wahrheit über seine eigentliche Zielsetzung erzählt, da die Herausforderung fehlt. Das Ziel erscheint einfach nicht **attraktiv**. Ein Finish ist unbestritten eine respektable Leistung, bitte nicht missverstehen, und schlicht die Mindestvoraussetzung für Weiteres, aber wenn der 1:10-Halbmarathoni beim Marathon sich nur die Finisher-Medaille abholen will, ist das einfach nicht glaubwürdig. Schon alleine deshalb, weil er sich ja um sein Anfangstempo Gedanken machen wird, welches er sich zutraut, es durchzuhalten. Ein **attraktives Ziel muss ein Kitzel sein, eine Challenge** und nichts, was man im Vorbeigehen erledigt. 2:30 wäre ein Beispiel für unseren Halbmarathoni. Das ist machbar, fällt ihm aber nicht in den Schoß.
+
+### … realistisch, …
+
+Und es ist realistisch. 2:21 ist bei dieser Zeit auf der Unterdistanz nicht möglich. Oder: Wenn der 9:00-local-hero vom Triathlonverein „den Frodo versenken“ will, wird er bestenfalls ausgelacht. Der sieht den Frodo höchstens in der Wechselzone – und zwar beim Rad-Check-In. Dieses Ziel nehmen wir weltweit höchstens einer Handvoll Athleten ab. Etwas Anderes ist es, wenn unser schon arg strapazierte Halbmarathoni 22 ist und die 2:20 in 3 Jahren knacken möchte. Das kann realistisch sein, vorausgesetzt, er schafft das Training und bleibt gesund. Er ist noch jung genug und noch steigerungsfähig und in 3 Jahren kann man eine Menge erreichen. Die **Lebensumstände und das Alter** sind auch ein Aspekt, der darüber entscheidet, ob ein Ziel realistisch ist. Die Vollzeit arbeitende und alleinerziehende Mutter von 3 Kindern, die Ambitionen auf eine baldige Hawaii-Quali hat, ist entweder gnadenlos talentiert, perfekt organisiert und die Kinder sind absolut problemlos oder sie ist auf dem besten Weg in die Frustration.
+
+### … und terminiert !
+
+„Terminiert“ ist der letzte Punkt der Zielerreichung. **Sobald ein Wettkampf im Spiel ist, steht auch ein Datum im Kalender**. Und dann kann es losgehen mit der Zielsetzung. Zum Beispiel: „Ich möchte 2020 beim Ostseeman unter 11 Stunden finishen.“ „Meine aktuelle Bestleistung ist bei 12 Stunden, ich habe einen 9-to-5-Job und bin gesund.“ Man kann jetzt noch über die Attraktivität des Ziels streiten, aber als Demonstration sollte das an dieser Stelle genügen.
+
+Das Setzen SMARTer Ziele geht auch **über den Sport hinaus**. „Ich möchte bis Weihnachten 10 Kilo abnehmen“. „Ich möchte zum Jahresende XY 1000 Euro ansparen.“. Beispiele für SMARTe Ziele finden sich überall.
+
+### Was heißt das konkret in der Praxis?
+
+Ziele aufschreiben und mit ein paar Vertrauten, dem Trainer, dem Partner **kritisch diskutieren und hinterfragen**. Als sinnvoll haben sich auch **Zwischenziele** erwiesen, denn die #roadtokona ist lang. Zwischenziele stellen auf dem Weg zur Vision eine hilfreiche **Erfolgs- und Fortschrittskontrolle** dar. Wer will denn schon vom Weg abkommen?
+
+Auch für die Motivation ist es förderlich und eigentlich unabdingbar, sich von **Zwischenziel zu Zwischenziel dem Traum anzunähern**. Denn sollte der Traum ein Traum bleiben, kann man sich dennoch über jede Menge anderer Erfolge freuen. [Harald Schmid](https://de.wikipedia.org/wiki/Harald_Schmid_(Leichtathlet)) (400m Hürden) ist bestimmt immer noch stolz wie Oskar über 5 mal EM-Gold und 13 nationale Titel – und völlig zu recht! Auch wenn Edwin Moses ihm die wichtigen Titel weggeschnappt hat.
+
+**Die Vision ist das Gipfelkreuz**, auf dem Weg dahin sind viele Schritte zu gehen.
\ No newline at end of file
--- /dev/null
+{
+ "coach-vs-software-literatur-traithlon-coaching-com": "### Natürlich geht alles auch ohne Coach. Unterschiede zwischen Selbstcoaching, Trainingsplänen und persönlichem Coach werden klar erläutert."
+ "saisonplanung-wie-geht-man-vor-triathlon-coaching-com": "### Das Ziel bestimmt den Weg Thema eines anderen Blogs war die richtige [Zieldefinition](https://www.triathlon-coaching.com/?p=36). Was ist ein gutes Ziel und",
+ "ziele-setzen-aber-richtig-triathlon-coaching-com": "### Aloha! Für den Einen oder Anderen ist die Saison noch nicht zu Ende, ein später Marathon oder gar der Ironman Hawaii stehen noch auf dem Programm. Die",
+ "fair-play-beim-coaching-triathlon-coaching-com": "### Fair Play? Ja klar! Es gibt Coaches, bei denen schließt man ein festes Abo ab. Das heißt Du zahlst auch dann weiter, wenn * [Du krank oder verletzt bist",
+ "wenn-du-krank-bist-triathlon-coaching-com": "### … bist Du krank! Mit Wehwehchen oder Symtomen einer (Atemwegs-)Erkrankung gilt: **Trainingverbot!** Natürlich kann man mit Schulterproblemen oft ein",
+ "was-kostet-das-triathlon-coaching-com": "Um dir ein optimales Erlebnis zu bieten, verwenden wir Technologien wie Cookies, um Geräteinformationen zu speichern und/oder darauf zuzugreifen. Wenn du",
+ "warum-einen-coach-triathlon-coaching-com": "### Ich brauche keinen Coach. Natürlich geht alles auch ohne Coach. Ganz ohne Frage. Einen Coach zu engagieren, hat nicht nur positive Aspekte. Erstens kostet",
+ "mein-coaching-ansatz-triathlon-coaching-com": "### Maßgeschneidert statt von der Stange Das Internet und die einschlägigen Zeitschriften und Bücher sind voll mit Trainingsplänen. Und schlecht oder gar",
+ "was-nicht-auf-strava-ist-ist-nicht-passiert-triathlon-coaching-com": "Um dir ein optimales Erlebnis zu bieten, verwenden wir Technologien wie Cookies, um Geräteinformationen zu speichern und/oder darauf zuzugreifen. Wenn du",
+ "grenzen-wofur-ich-nicht-da-bin-triathlon-coaching-com": "### Deine Motivation Eine Athletin hat mir mal abgesagt, weil sie keinen Tritt in Ihren Allerwertesten bräuchte. Zugegebenermaßen war ich schockiert. Denn ein",
+ "welche-rolle-hast-du-triathlon-coaching-com": "### Können Coaches zaubern? Spoiler: Nein, Coaches können nicht zaubern. Kein Coach kann irgendwelche Tricks aus der Schublade ziehen wie ein Zauberer das",
+ "wie-legen-wir-los-wie-lauft-das-ab-triathlon-coaching-com": "### Unsere Zusammenarbeit Nach dem Erstgespräch und der Bestandsaufnahme erhältst Du laufend Deinen Plan in [Trainingpeaks](https://trainingpeaks.com/). Den",
+ "gesundheit-triathlon-coaching-com": "### Gesundheit ist A und O Grundsätzlich empfehle ich eine ärztliche Untersuchung vor der Aufnahme des Trainings; am besten eine offizielle Bescheinigung auf",
+ "dein-trainingsplan-triathlon-coaching-com": "### Dein Trainingsplan Für die Trainingsplanung und -protokollierung verwende ich [Trainingpeaks](https://www.trainingpeaks.com) Damit stelle ich Deine",
+ "wie-funktioniert-individuelles-coaching-triathlon-coaching-com": "### Athlet und Trainer lernen sich kennen Am Anfang steht ein persönliches Kennenlernen, entweder per Telefon, Skype oder eben live. So können wir uns über",
+ "mittwochs-fangt-die-woche-an-triathlon-coaching-com": "### Warum Mittwochs? Es ist ziemlich üblich, sich an die Kalenderwochen zu halten, was auch auf der Hand liegt. Davon weiche ich ab. Warum? Spätestens am",
+ "wie-ich-mit-athleten-und-athletinnen-arbeite-te-triathlon-coaching-com": "### Am Anfang stand das Papier Vor fast 30 Jahren fing ich an, Trainingspläne für andere, in der Regel befreundete Athleten zu schreiben. Die allerersten",
+ "laufschuhe-kann-man-zu-viele-haben-triathlon-coaching-com": "### Laufschuhe Laufschuhe sind die mit Abstand wichtigsten Ausrüstungsgegenstände beim Laufen. Sie sollen den Fuß schützen und führen. Sie sollen die",
+ "bahn-knigge-die-ungeschriebenen-gesetze-auf-der-bahn-triathlon-coaching-com": "### Leichtathletik ist eine eigene Welt Auch wenn beim Triathlon Laufen dabei ist, sind Triathleten keine Läufer. Das fängt damit an, dass lächerliche 😉 3000m",
+ "warm-up-vor-einem-laufwettkampf-triathlon-coaching-com": "### Warm-Up Aufgewärmt heißt, Muskeln und Stoffwechsel sind bereit zur unmittelbaren und hohen Leistungsabgabe. Sich warm fühlen ist was anderes. Das tue ich",
+ "standard-plane-triathlon-coaching-com": "### Training von der Stange Wenn Dir Personal Coaching aus welchen Gründen auch immer nicht zusagt, sollst Du nicht im Regen stehen. Du kannst bei",
+ "langdistanz-plane-triathlon-coaching-com": "### Langdistanz / Ironman #### finisher Du willst eine Langdistanz finishen – nicht mehr und nicht weniger. Dein Ziel ist der rote Teppich und die 4 magischen",
+ "kurzdistanz-plane-triathlon-coaching-com": "### Kurz-/ olympische Distanz #### finisher Du willst (mal) einen Triathlon finishen – nicht mehr und nicht weniger. Dein Ziel ist es schlicht und ergreifend",
+ "mitteldistanz-plane-triathlon-coaching-com": "### Mitteldistanz / Ironman 70.3 #### finisher Du willst eine Mitteldistanz finishen – nicht mehr und nicht weniger. Dein Ziel ist es schlicht und ergreifend",
+ "uber-mich-triathlon-coaching-com": "Seit 1987 bin ich Läufer und seit 1997 Triathlet – zum großen Teil leistungssportlich. Zwischen 800m und Ironman habe ich keine Strecke ausgelassen. Anders",
+ "agb-triathlon-coaching-com": "Um dir ein optimales Erlebnis zu bieten, verwenden wir Technologien wie Cookies, um Geräteinformationen zu speichern und/oder darauf zuzugreifen. Wenn du",
+ "impressum-triathlon-coaching-com": "Um dir ein optimales Erlebnis zu bieten, verwenden wir Technologien wie Cookies, um Geräteinformationen zu speichern und/oder darauf zuzugreifen. Wenn du",
+ "disclaimer-datenschutz-triathlon-coaching-com": "## ## Disclaimer / Haftung / Urheberrecht ## #### Haftung für Inhalte ## Als Diensteanbieter sind wir gemäß § 7 Abs.1 TMG für eigene Inhalte auf diesen Seiten"
+}
--- /dev/null
+<!DOCTYPE html>
+<html lang="de">
+<head>
+ <meta charset="UTF-8" />
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
+ <title>triathlon-coaching.com – Über mich</title>
+ <link rel="stylesheet" href="style.css" />
+ <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=Barlow+Condensed:wght@400;600;700;800&family=Barlow:ital,wght@0,400;0,500;0,600;1,400&display=swap" rel="stylesheet" />
+</head>
+<body>
+
+ <!-- ===== HEADER / NAV ===== -->
+ <header class="site-header">
+ <div class="header-inner">
+ <a href="index.html" class="site-logo">
+ <span class="logo-tri">triathlon</span><span class="logo-dash">-</span><span class="logo-coaching">coaching</span><span class="logo-dot">.</span><span class="logo-com">com</span>
+ </a>
+
+ <button class="nav-toggle" aria-label="Menü öffnen" aria-expanded="false">
+ <span></span><span></span><span></span>
+ </button>
+
+ <nav class="main-nav" aria-label="Hauptnavigation">
+ <ul class="nav-list">
+ <li class="nav-item active"><a href="index.html">Über mich</a></li>
+
+ <li class="nav-item has-dropdown">
+ <a href="coaching.html">Coaching</a>
+ <button class="dropdown-toggle" aria-label="Untermenü öffnen">▼</button>
+ <ul class="dropdown">
+ <li><a href="personal-coaching.html">Personal Coaching</a></li>
+ <li class="has-dropdown-2">
+ <a href="standard-plaene.html">Standard-Pläne</a>
+ <button class="dropdown-toggle" aria-label="Untermenü öffnen">►</button>
+ <ul class="dropdown-2">
+ <li><a href="langdistanz.html">Langdistanz & Ironman</a></li>
+ <li><a href="mitteldistanz.html">Mitteldistanz & Ironman 70.3</a></li>
+ <li><a href="kurzdistanz.html">Kurz- & olympische Distanz</a></li>
+ </ul>
+ </li>
+ </ul>
+ </li>
+
+ <li class="nav-item has-dropdown">
+ <a href="blog.html">Blog</a>
+ <button class="dropdown-toggle" aria-label="Untermenü öffnen">▼</button>
+ <ul class="dropdown">
+ <li><a href="blog.html?tag=Training">Training</a></li>
+ <li><a href="blog.html?tag=Ernährung">Ernährung</a></li>
+ <li><a href="blog.html?tag=Wettkampf">Wettkampf</a></li>
+ <li><a href="blog.html?tag=Regeneration">Regeneration</a></li>
+ <li><a href="blog.html?tag=Openwater">Openwater & Schwimmen</a></li>
+ <li><a href="blog.html?tag=Bike">Bike & Equipment</a></li>
+ <li><a href="blog.html?tag=Marathon">Marathon & Laufen</a></li>
+ <li><a href="blog.html?tag=Ironman">Ironman & Langdistanz</a></li>
+ </ul>
+ </li>
+
+ <li class="nav-item"><a href="camps.html">Camps</a></li>
+
+ <li class="nav-item has-dropdown">
+ <a href="tools.html">Tools & more</a>
+ <button class="dropdown-toggle" aria-label="Untermenü öffnen">▼</button>
+ <ul class="dropdown">
+ <li><a href="https://swim.triathlon-coaching.com">Schwimmtraining & -pläne</a></li>
+ <li><a href="https://roadtokona.triathlon-coaching.com">#roadtokona</a></li>
+ </ul>
+ </li>
+
+ <li class="nav-item"><a href="kontakt.html">Kontakt</a></li>
+ </ul>
+ </nav>
+ </div>
+ </header>
+
+ <!-- ===== HERO ===== -->
+ <section class="hero">
+ <div class="hero-bg">
+ <div class="hero-overlay"></div>
+ <div class="hero-shapes">
+ <div class="shape shape-1"></div>
+ <div class="shape shape-2"></div>
+ <div class="shape shape-3"></div>
+ </div>
+ </div>
+ <div class="hero-content">
+ <div class="hero-disciplines">
+ <span>Schwimmen</span>
+ <span class="sep">·</span>
+ <span>Radfahren</span>
+ <span class="sep">·</span>
+ <span>Laufen</span>
+ </div>
+ <h1 class="hero-title">Erfahrung,<br/>die zählt.</h1>
+ <p class="hero-sub">Seit 1997 im Triathlon. Seit 2018 lizensierter DTU-C-Trainer.<br/>Coaching, das aus echter Wettkampferfahrung entsteht.</p>
+ <div class="hero-ctas">
+ <a href="coaching.html" class="btn btn-primary">Coaching entdecken</a>
+ <a href="kontakt.html" class="btn btn-outline">Kontakt aufnehmen</a>
+ </div>
+ </div>
+ <div class="hero-scroll-hint" aria-hidden="true">
+ <span>Scroll</span>
+ <div class="scroll-line"></div>
+ </div>
+ </section>
+
+ <!-- ===== MAIN CONTENT ===== -->
+ <main id="content" class="main-content">
+
+ <!-- Intro strip -->
+ <div class="intro-strip">
+ <div class="strip-item">
+ <span class="strip-num">38+</span>
+ <span class="strip-label">Jahre Ausdauersport</span>
+ </div>
+ <div class="strip-divider"></div>
+ <div class="strip-item">
+ <span class="strip-num">DTU-C</span>
+ <span class="strip-label">Lizensierter Trainer</span>
+ </div>
+ <div class="strip-divider"></div>
+ <div class="strip-item">
+ <span class="strip-num">800m–</span>
+ <span class="strip-label">bis Ironman-Distanz</span>
+ </div>
+ </div>
+
+ <!-- About Section -->
+ <section class="about-section container">
+ <div class="about-image-col">
+ <div class="about-image-wrap">
+ <div class="about-image-placeholder">
+ <div class="img-inner">
+ <svg viewBox="0 0 120 120" xmlns="http://www.w3.org/2000/svg" aria-hidden="true">
+ <circle cx="60" cy="42" r="22" fill="#4d8591" opacity="0.6"/>
+ <ellipse cx="60" cy="95" rx="36" ry="22" fill="#4d8591" opacity="0.4"/>
+ </svg>
+ <p class="img-hint">Ihr Foto hier</p>
+ </div>
+ </div>
+ <div class="about-badge">
+ <span>DTU</span>
+ <span>C-Trainer</span>
+ </div>
+ </div>
+ </div>
+
+ <div class="about-text-col">
+ <div class="section-label">Über mich</div>
+ <h2 class="section-title">Wer bin ich?</h2>
+ <p>Seit 1987 bin ich Läufer und seit 1997 Triathlet – zum großen Teil leistungssportlich. Zwischen 800m und Ironman habe ich keine Strecke ausgelassen. Ich spreche bei meinem Training viel aus Erfahrung und kenne sowohl die Einsamkeit der langen Radausfahrt als auch die Hektik auf der Tartanbahn.</p>
+ <p>Kaum kürzer ist mein Interesse an der Trainingslehre und Sportwissenschaft. So begleitete mich über die Jahre als Athleten bald die Rolle des Trainers, Übungsleiters, Radguides, usw. Das hilft mir, meine langjährigen Erfahrungen und persönlichen Lektionen in meine Trainertätigkeit einfließen zu lassen.</p>
+ <p>Seit 2018 bin ich auch lizensierter DTU-C-Trainer.</p>
+ <a href="coaching.html" class="btn btn-primary">Mein Coaching-Angebot</a>
+ </div>
+ </section>
+
+ <!-- Timeline Section -->
+ <section class="timeline-section">
+ <div class="container">
+ <div class="section-label center">Mein Weg</div>
+ <h2 class="section-title center">Die ganze Wahrheit</h2>
+ <div class="timeline">
+
+ <div class="tl-item">
+ <div class="tl-year">1987</div>
+ <div class="tl-dot"></div>
+ <div class="tl-card">
+ <h3>Die ersten Schritte</h3>
+ <p>Mit 14 Jahren die ersten Laufschuhe geschnürt – zusammen mit meinem Vater. Nicht viel später folgte der erste Volkslauf über 10 km.</p>
+ </div>
+ </div>
+
+ <div class="tl-item">
+ <div class="tl-year">1989</div>
+ <div class="tl-dot"></div>
+ <div class="tl-card">
+ <h3>Marathon mit 16</h3>
+ <p>Berlin, erster Marathon: 3:10:51. Der Beginn einer langen Liebe zur langen Strecke – und zu Hawaii als großem Ziel.</p>
+ </div>
+ </div>
+
+ <div class="tl-item">
+ <div class="tl-year">1991</div>
+ <div class="tl-dot"></div>
+ <div class="tl-card">
+ <h3>Der Geruch von Tartan</h3>
+ <p>Bahntraining, Wettkämpfe, Lauf-ABC. Bestzeiten die bis heute stehen: 800m 1:58,3 · 3000m 8:42,4 · 5000m 15:25. Und: erster Volkstriathlon in Neuss.</p>
+ </div>
+ </div>
+
+ <div class="tl-item">
+ <div class="tl-year">1997</div>
+ <div class="tl-dot"></div>
+ <div class="tl-card">
+ <h3>Triathlet werden</h3>
+ <p>Qua selbstgefasstem Beschluß wurde ich Triathlet. Schwimmen: irgendwie. Rad: ein olles Rennrad. Laufen: davon hatte ich Ahnung.</p>
+ </div>
+ </div>
+
+ <div class="tl-item">
+ <div class="tl-year">1998</div>
+ <div class="tl-dot"></div>
+ <div class="tl-card">
+ <h3>Ironman Roth</h3>
+ <p>Ironman Europe in Roth – seitdem darf ich mich Ironman nennen. NRW-Liga, Laktatmessungen, Trainingspläne in Excel.</p>
+ </div>
+ </div>
+
+ <div class="tl-item">
+ <div class="tl-year">2018</div>
+ <div class="tl-dot"></div>
+ <div class="tl-card highlight">
+ <h3>DTU-C-Trainer</h3>
+ <p>Lizensierter Trainer des Deutschen Triathlon Union – die offizielle Bestätigung eines langen Wegs aus Erfahrung, Leidenschaft und Sportwissenschaft.</p>
+ </div>
+ </div>
+
+ </div>
+ </div>
+ </section>
+
+ <!-- CTA Banner -->
+ <section class="cta-banner">
+ <div class="container">
+ <h2>Bereit für dein nächstes Rennen?</h2>
+ <p>Ob Personal Coaching oder Standard-Plan – ich finde das richtige Angebot für dein Ziel.</p>
+ <div class="cta-banner-btns">
+ <a href="coaching.html" class="btn btn-primary">Coaching-Angebote</a>
+ <a href="kontakt.html" class="btn btn-outline-light">Kontakt</a>
+ </div>
+ </div>
+ </section>
+
+ </main>
+
+ <!-- ===== FOOTER ===== -->
+ <footer class="site-footer">
+ <div class="footer-inner container">
+ <div class="footer-brand">
+ <a href="index.html" class="site-logo footer-logo">
+ <span class="logo-tri">triathlon</span><span class="logo-dash">-</span><span class="logo-coaching">coaching</span><span class="logo-dot">.</span><span class="logo-com">com</span>
+ </a>
+ <p>Triathlon-Coaching aus Leidenschaft.<br/>DTU-C-Trainer seit 2018.</p>
+ </div>
+ <nav class="footer-nav" aria-label="Footer Navigation">
+ <ul>
+ <li><a href="kontakt.html">Kontakt</a></li>
+ <li><a href="impressum.html">Impressum</a></li>
+ <li><a href="datenschutz.html">Datenschutz</a></li>
+ <li><a href="agb.html">AGB</a></li>
+ </ul>
+ </nav>
+ </div>
+ <div class="footer-bottom">
+ <p>© 2025 triathlon-coaching.com</p>
+ </div>
+ </footer>
+
+ <script src="main.js"></script>
+</body>
+</html>
--- /dev/null
+<!DOCTYPE html>
+<html lang="de">
+<head>
+ <meta charset="UTF-8" />
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
+ <title>Personal Coaching – triathlon-coaching.com</title>
+ <link rel="stylesheet" href="style.css" />
+ <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=Barlow+Condensed:wght@400;600;700;800&family=Barlow:ital,wght@0,400;0,500;0,600;1,400&display=swap" rel="stylesheet" />
+</head>
+
+<!-- data-blog-category locks the JS grid to this category only -->
+<body data-blog-category="Angebot">
+
+ <!-- ===== HEADER ===== -->
+ <header class="site-header">
+ <div class="header-inner">
+ <a href="index.html" class="site-logo">
+ <span class="logo-tri">triathlon</span><span class="logo-dash">-</span><span class="logo-coaching">coaching</span><span class="logo-dot">.</span><span class="logo-com">com</span>
+ </a>
+ <button class="nav-toggle" aria-label="Menü öffnen" aria-expanded="false">
+ <span></span><span></span><span></span>
+ </button>
+ <nav class="main-nav" aria-label="Hauptnavigation">
+ <ul class="nav-list">
+ <li class="nav-item"><a href="index.html">Über mich</a></li>
+ <li class="nav-item active has-dropdown">
+ <a href="coaching.html">Coaching</a>
+ <button class="dropdown-toggle" aria-label="Untermenü öffnen">▼</button>
+ <ul class="dropdown">
+ <li><a href="personal-coaching.html">Personal Coaching</a></li>
+ <li class="has-dropdown-2">
+ <a href="standard-plaene.html">Standard-Pläne</a>
+ <button class="dropdown-toggle">▼</button>
+ <ul class="dropdown-2">
+ <li><a href="langdistanz.html">Langdistanz & Ironman</a></li>
+ <li><a href="mitteldistanz.html">Mitteldistanz & Ironman 70.3</a></li>
+ <li><a href="kurzdistanz.html">Kurz- & olympische Distanz</a></li>
+ </ul>
+ </li>
+ </ul>
+ </li>
+ <li class="nav-item has-dropdown">
+ <a href="blog.html">Blog</a>
+ <button class="dropdown-toggle" aria-label="Untermenü öffnen">▼</button>
+ <ul class="dropdown">
+ <li><a href="blog.html?tag=Training">Training</a></li>
+ <li><a href="blog.html?tag=Ernährung">Ernährung</a></li>
+ <li><a href="blog.html?tag=Wettkampf">Wettkampf</a></li>
+ <li><a href="blog.html?tag=Regeneration">Regeneration</a></li>
+ <li><a href="blog.html?tag=Openwater">Openwater & Schwimmen</a></li>
+ <li><a href="blog.html?tag=Bike">Bike & Equipment</a></li>
+ <li><a href="blog.html?tag=Marathon">Marathon & Laufen</a></li>
+ <li><a href="blog.html?tag=Ironman">Ironman & Langdistanz</a></li>
+ </ul>
+ </li>
+ <li class="nav-item"><a href="camps.html">Camps</a></li>
+ <li class="nav-item has-dropdown">
+ <a href="tools.html">Tools & more</a>
+ <button class="dropdown-toggle" aria-label="Untermenü öffnen">▼</button>
+ <ul class="dropdown">
+ <li><a href="https://swim.triathlon-coaching.com">Schwimmtraining & -pläne</a></li>
+ <li><a href="https://roadtokona.triathlon-coaching.com">#roadtokona</a></li>
+ </ul>
+ </li>
+ <li class="nav-item"><a href="kontakt.html">Kontakt</a></li>
+ </ul>
+ </nav>
+ </div>
+ </header>
+
+ <!-- ===== PAGE HERO ===== -->
+ <section class="page-hero">
+ <div class="page-hero-inner container">
+ <div class="section-label">Angebot</div>
+ <h1 class="page-hero-title">Personal Coaching</h1>
+ <p class="page-hero-sub">Was steckt im Personal Coaching drin, was kostet es – und was nicht.</p>
+ </div>
+ <div class="page-hero-bar">
+ <span id="result-count"></span>
+ </div>
+ </section>
+
+ <!-- ===== FILTER BAR — nur Suche, keine Pills ===== -->
+ <div class="filter-bar" role="search" aria-label="Artikel suchen">
+ <div class="filter-bar-inner container">
+ <div class="filter-search-wrap">
+ <svg class="filter-search-icon" viewBox="0 0 20 20" fill="none" aria-hidden="true">
+ <circle cx="9" cy="9" r="6" stroke="currentColor" stroke-width="1.8"/>
+ <path d="M13.5 13.5L17 17" stroke="currentColor" stroke-width="1.8" stroke-linecap="round"/>
+ </svg>
+ <input type="search" id="blog-search" class="filter-search" placeholder="Artikel suchen…" aria-label="Artikel suchen" autocomplete="off" />
+ </div>
+ <div class="filter-meta">
+ <button id="filter-reset" class="filter-reset" hidden>Suche zurücksetzen</button>
+ </div>
+ </div>
+ </div>
+
+ <!-- ===== GRID ===== -->
+ <main id="content" class="blog-main container">
+ <div id="blog-grid" class="blog-grid" role="list"></div>
+ <p id="no-results" class="no-results" hidden>
+ Keine Artikel gefunden. <button id="no-results-reset">Zurücksetzen</button>
+ </p>
+ </main>
+
+ <!-- ===== FOOTER ===== -->
+ <footer class="site-footer">
+ <div class="footer-inner container">
+ <div class="footer-brand">
+ <a href="index.html" class="site-logo footer-logo">
+ <span class="logo-tri">triathlon</span><span class="logo-dash">-</span><span class="logo-coaching">coaching</span><span class="logo-dot">.</span><span class="logo-com">com</span>
+ </a>
+ <p>Triathlon-Coaching aus Leidenschaft.<br/>DTU-C-Trainer seit 2018.</p>
+ </div>
+ <nav class="footer-nav" aria-label="Footer Navigation">
+ <ul>
+ <li><a href="kontakt.html">Kontakt</a></li>
+ <li><a href="impressum.html">Impressum</a></li>
+ <li><a href="datenschutz.html">Datenschutz</a></li>
+ <li><a href="agb.html">AGB</a></li>
+ </ul>
+ </nav>
+ </div>
+ <div class="footer-bottom"><p>© 2025 triathlon-coaching.com</p></div>
+ </footer>
+
+ <script src="main.js"></script>
+</body>
+</html>
--- /dev/null
+<!DOCTYPE html>
+<html lang="de">
+<head>
+ <meta charset="UTF-8" />
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
+ <title>triathlon-coaching.com – Über mich</title>
+ <link rel="stylesheet" href="style.css" />
+ <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=Barlow+Condensed:wght@400;600;700;800&family=Barlow:ital,wght@0,400;0,500;0,600;1,400&display=swap" rel="stylesheet" />
+</head>
+<body>
+
+ <!-- ===== HEADER / NAV ===== -->
+ <header class="site-header">
+ <div class="header-inner">
+ <a href="index.html" class="site-logo">
+ <span class="logo-tri">triathlon</span><span class="logo-dash">-</span><span class="logo-coaching">coaching</span><span class="logo-dot">.</span><span class="logo-com">com</span>
+ </a>
+
+ <button class="nav-toggle" aria-label="Menü öffnen" aria-expanded="false">
+ <span></span><span></span><span></span>
+ </button>
+
+ <nav class="main-nav" aria-label="Hauptnavigation">
+ <ul class="nav-list">
+ <li class="nav-item active"><a href="index.html">Über mich</a></li>
+
+ <li class="nav-item has-dropdown">
+ <a href="coaching.html">Coaching</a>
+ <button class="dropdown-toggle" aria-label="Untermenü öffnen">▼</button>
+ <ul class="dropdown">
+ <li><a href="personal-coaching.html">Personal Coaching</a></li>
+ <li class="has-dropdown-2">
+ <a href="standard-plaene.html">Standard-Pläne</a>
+ <button class="dropdown-toggle" aria-label="Untermenü öffnen">►</button>
+ <ul class="dropdown-2">
+ <li><a href="langdistanz.html">Langdistanz & Ironman</a></li>
+ <li><a href="mitteldistanz.html">Mitteldistanz & Ironman 70.3</a></li>
+ <li><a href="kurzdistanz.html">Kurz- & olympische Distanz</a></li>
+ </ul>
+ </li>
+ </ul>
+ </li>
+
+ <li class="nav-item has-dropdown">
+ <a href="blog.html">Blog</a>
+ <button class="dropdown-toggle" aria-label="Untermenü öffnen">▼</button>
+ <ul class="dropdown">
+ <li><a href="blog.html?tag=Training">Training</a></li>
+ <li><a href="blog.html?tag=Ernährung">Ernährung</a></li>
+ <li><a href="blog.html?tag=Wettkampf">Wettkampf</a></li>
+ <li><a href="blog.html?tag=Regeneration">Regeneration</a></li>
+ <li><a href="blog.html?tag=Openwater">Openwater & Schwimmen</a></li>
+ <li><a href="blog.html?tag=Bike">Bike & Equipment</a></li>
+ <li><a href="blog.html?tag=Marathon">Marathon & Laufen</a></li>
+ <li><a href="blog.html?tag=Ironman">Ironman & Langdistanz</a></li>
+ </ul>
+ </li>
+
+ <li class="nav-item"><a href="camps.html">Camps</a></li>
+
+ <li class="nav-item has-dropdown">
+ <a href="tools.html">Tools & more</a>
+ <button class="dropdown-toggle" aria-label="Untermenü öffnen">▼</button>
+ <ul class="dropdown">
+ <li><a href="https://swim.triathlon-coaching.com">Schwimmtraining & -pläne</a></li>
+ <li><a href="https://roadtokona.triathlon-coaching.com">#roadtokona</a></li>
+ </ul>
+ </li>
+
+ <li class="nav-item"><a href="kontakt.html">Kontakt</a></li>
+ </ul>
+ </nav>
+ </div>
+ </header>
+
+ <!-- ===== HERO ===== -->
+ <section class="hero">
+ <div class="hero-bg">
+ <div class="hero-overlay"></div>
+ <div class="hero-shapes">
+ <div class="shape shape-1"></div>
+ <div class="shape shape-2"></div>
+ <div class="shape shape-3"></div>
+ </div>
+ </div>
+ <div class="hero-content">
+ <div class="hero-disciplines">
+ <span>Schwimmen</span>
+ <span class="sep">·</span>
+ <span>Radfahren</span>
+ <span class="sep">·</span>
+ <span>Laufen</span>
+ </div>
+ <h1 class="hero-title">Erfahrung,<br/>die zählt.</h1>
+ <p class="hero-sub">Seit 1997 im Triathlon. Seit 2018 lizensierter DTU-C-Trainer.<br/>Coaching, das aus echter Wettkampferfahrung entsteht.</p>
+ <div class="hero-ctas">
+ <a href="coaching.html" class="btn btn-primary">Coaching entdecken</a>
+ <a href="kontakt.html" class="btn btn-outline">Kontakt aufnehmen</a>
+ </div>
+ </div>
+ <div class="hero-scroll-hint" aria-hidden="true">
+ <span>Scroll</span>
+ <div class="scroll-line"></div>
+ </div>
+ </section>
+
+ <!-- ===== MAIN CONTENT ===== -->
+ <main id="content" class="main-content">
+
+ <!-- Intro strip -->
+ <div class="intro-strip">
+ <div class="strip-item">
+ <span class="strip-num">38+</span>
+ <span class="strip-label">Jahre Ausdauersport</span>
+ </div>
+ <div class="strip-divider"></div>
+ <div class="strip-item">
+ <span class="strip-num">DTU-C</span>
+ <span class="strip-label">Lizensierter Trainer</span>
+ </div>
+ <div class="strip-divider"></div>
+ <div class="strip-item">
+ <span class="strip-num">800m–</span>
+ <span class="strip-label">bis Ironman-Distanz</span>
+ </div>
+ </div>
+
+ <!-- About Section -->
+ <section class="about-section container">
+ <div class="about-image-col">
+ <div class="about-image-wrap">
+ <div class="about-image-placeholder">
+ <div class="img-inner">
+ <svg viewBox="0 0 120 120" xmlns="http://www.w3.org/2000/svg" aria-hidden="true">
+ <circle cx="60" cy="42" r="22" fill="#4d8591" opacity="0.6"/>
+ <ellipse cx="60" cy="95" rx="36" ry="22" fill="#4d8591" opacity="0.4"/>
+ </svg>
+ <p class="img-hint">Ihr Foto hier</p>
+ </div>
+ </div>
+ <div class="about-badge">
+ <span>DTU</span>
+ <span>C-Trainer</span>
+ </div>
+ </div>
+ </div>
+
+ <div class="about-text-col">
+ <div class="section-label">Über mich</div>
+ <h2 class="section-title">Wer bin ich?</h2>
+ <p>Seit 1987 bin ich Läufer und seit 1997 Triathlet – zum großen Teil leistungssportlich. Zwischen 800m und Ironman habe ich keine Strecke ausgelassen. Ich spreche bei meinem Training viel aus Erfahrung und kenne sowohl die Einsamkeit der langen Radausfahrt als auch die Hektik auf der Tartanbahn.</p>
+ <p>Kaum kürzer ist mein Interesse an der Trainingslehre und Sportwissenschaft. So begleitete mich über die Jahre als Athleten bald die Rolle des Trainers, Übungsleiters, Radguides, usw. Das hilft mir, meine langjährigen Erfahrungen und persönlichen Lektionen in meine Trainertätigkeit einfließen zu lassen.</p>
+ <p>Seit 2018 bin ich auch lizensierter DTU-C-Trainer.</p>
+ <a href="coaching.html" class="btn btn-primary">Mein Coaching-Angebot</a>
+ </div>
+ </section>
+
+ <!-- Timeline Section -->
+ <section class="timeline-section">
+ <div class="container">
+ <div class="section-label center">Mein Weg</div>
+ <h2 class="section-title center">Die ganze Wahrheit</h2>
+ <div class="timeline">
+
+ <div class="tl-item">
+ <div class="tl-year">1987</div>
+ <div class="tl-dot"></div>
+ <div class="tl-card">
+ <h3>Die ersten Schritte</h3>
+ <p>Mit 14 Jahren die ersten Laufschuhe geschnürt – zusammen mit meinem Vater. Nicht viel später folgte der erste Volkslauf über 10 km.</p>
+ </div>
+ </div>
+
+ <div class="tl-item">
+ <div class="tl-year">1989</div>
+ <div class="tl-dot"></div>
+ <div class="tl-card">
+ <h3>Marathon mit 16</h3>
+ <p>Berlin, erster Marathon: 3:10:51. Der Beginn einer langen Liebe zur langen Strecke – und zu Hawaii als großem Ziel.</p>
+ </div>
+ </div>
+
+ <div class="tl-item">
+ <div class="tl-year">1991</div>
+ <div class="tl-dot"></div>
+ <div class="tl-card">
+ <h3>Der Geruch von Tartan</h3>
+ <p>Bahntraining, Wettkämpfe, Lauf-ABC. Bestzeiten die bis heute stehen: 800m 1:58,3 · 3000m 8:42,4 · 5000m 15:25. Und: erster Volkstriathlon in Neuss.</p>
+ </div>
+ </div>
+
+ <div class="tl-item">
+ <div class="tl-year">1997</div>
+ <div class="tl-dot"></div>
+ <div class="tl-card">
+ <h3>Triathlet werden</h3>
+ <p>Qua selbstgefasstem Beschluß wurde ich Triathlet. Schwimmen: irgendwie. Rad: ein olles Rennrad. Laufen: davon hatte ich Ahnung.</p>
+ </div>
+ </div>
+
+ <div class="tl-item">
+ <div class="tl-year">1998</div>
+ <div class="tl-dot"></div>
+ <div class="tl-card">
+ <h3>Ironman Roth</h3>
+ <p>Ironman Europe in Roth – seitdem darf ich mich Ironman nennen. NRW-Liga, Laktatmessungen, Trainingspläne in Excel.</p>
+ </div>
+ </div>
+
+ <div class="tl-item">
+ <div class="tl-year">2018</div>
+ <div class="tl-dot"></div>
+ <div class="tl-card highlight">
+ <h3>DTU-C-Trainer</h3>
+ <p>Lizensierter Trainer des Deutschen Triathlon Union – die offizielle Bestätigung eines langen Wegs aus Erfahrung, Leidenschaft und Sportwissenschaft.</p>
+ </div>
+ </div>
+
+ </div>
+ </div>
+ </section>
+
+ <!-- CTA Banner -->
+ <section class="cta-banner">
+ <div class="container">
+ <h2>Bereit für dein nächstes Rennen?</h2>
+ <p>Ob Personal Coaching oder Standard-Plan – ich finde das richtige Angebot für dein Ziel.</p>
+ <div class="cta-banner-btns">
+ <a href="coaching.html" class="btn btn-primary">Coaching-Angebote</a>
+ <a href="kontakt.html" class="btn btn-outline-light">Kontakt</a>
+ </div>
+ </div>
+ </section>
+
+ </main>
+
+ <!-- ===== FOOTER ===== -->
+ <footer class="site-footer">
+ <div class="footer-inner container">
+ <div class="footer-brand">
+ <a href="index.html" class="site-logo footer-logo">
+ <span class="logo-tri">triathlon</span><span class="logo-dash">-</span><span class="logo-coaching">coaching</span><span class="logo-dot">.</span><span class="logo-com">com</span>
+ </a>
+ <p>Triathlon-Coaching aus Leidenschaft.<br/>DTU-C-Trainer seit 2018.</p>
+ </div>
+ <nav class="footer-nav" aria-label="Footer Navigation">
+ <ul>
+ <li><a href="kontakt.html">Kontakt</a></li>
+ <li><a href="impressum.html">Impressum</a></li>
+ <li><a href="datenschutz.html">Datenschutz</a></li>
+ <li><a href="agb.html">AGB</a></li>
+ </ul>
+ </nav>
+ </div>
+ <div class="footer-bottom">
+ <p>© 2025 triathlon-coaching.com</p>
+ </div>
+ </footer>
+
+ <script src="main.js"></script>
+</body>
+</html>
--- /dev/null
+<!DOCTYPE html>
+<html lang="de">
+<head>
+ <meta charset="UTF-8" />
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
+ <title>Tools & more – triathlon-coaching.com</title>
+ <link rel="stylesheet" href="style.css" />
+ <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=Barlow+Condensed:wght@400;600;700;800&family=Barlow:ital,wght@0,400;0,500;0,600;1,400&display=swap" rel="stylesheet" />
+</head>
+<body>
+
+ <!-- ===== HEADER ===== -->
+ <header class="site-header">
+ <div class="header-inner">
+ <a href="index.html" class="site-logo">
+ <span class="logo-tri">triathlon</span><span class="logo-dash">-</span><span class="logo-coaching">coaching</span><span class="logo-dot">.</span><span class="logo-com">com</span>
+ </a>
+ <button class="nav-toggle" aria-label="Menü öffnen" aria-expanded="false">
+ <span></span><span></span><span></span>
+ </button>
+ <nav class="main-nav" aria-label="Hauptnavigation">
+ <ul class="nav-list">
+ <li class="nav-item"><a href="index.html">Über mich</a></li>
+ <li class="nav-item has-dropdown">
+ <a href="coaching.html">Coaching</a>
+ <button class="dropdown-toggle" aria-label="Untermenü öffnen">▼</button>
+ <ul class="dropdown">
+ <li><a href="personal-coaching.html">Personal Coaching</a></li>
+ <li class="has-dropdown-2">
+ <a href="standard-plaene.html">Standard-Pläne</a>
+ <button class="dropdown-toggle">▼</button>
+ <ul class="dropdown-2">
+ <li><a href="langdistanz.html">Langdistanz & Ironman</a></li>
+ <li><a href="mitteldistanz.html">Mitteldistanz & Ironman 70.3</a></li>
+ <li><a href="kurzdistanz.html">Kurz- & olympische Distanz</a></li>
+ </ul>
+ </li>
+ </ul>
+ </li>
+ <li class="nav-item has-dropdown">
+ <a href="blog.html">Blog</a>
+ <button class="dropdown-toggle" aria-label="Untermenü öffnen">▼</button>
+ <ul class="dropdown">
+ <li><a href="blog.html?tag=Training">Training</a></li>
+ <li><a href="blog.html?tag=Ernährung">Ernährung</a></li>
+ <li><a href="blog.html?tag=Wettkampf">Wettkampf</a></li>
+ <li><a href="blog.html?tag=Regeneration">Regeneration</a></li>
+ <li><a href="blog.html?tag=Openwater">Openwater & Schwimmen</a></li>
+ <li><a href="blog.html?tag=Bike">Bike & Equipment</a></li>
+ <li><a href="blog.html?tag=Marathon">Marathon & Laufen</a></li>
+ <li><a href="blog.html?tag=Ironman">Ironman & Langdistanz</a></li>
+ </ul>
+ </li>
+ <li class="nav-item"><a href="camps.html">Camps</a></li>
+ <li class="nav-item active has-dropdown">
+ <a href="tools.html">Tools & more</a>
+ <button class="dropdown-toggle" aria-label="Untermenü öffnen">▼</button>
+ <ul class="dropdown">
+ <li><a href="https://swim.triathlon-coaching.com">Schwimmtraining & -pläne</a></li>
+ <li><a href="https://roadtokona.triathlon-coaching.com">#roadtokona</a></li>
+ </ul>
+ </li>
+ <li class="nav-item"><a href="kontakt.html">Kontakt</a></li>
+ </ul>
+ </nav>
+ </div>
+ </header>
+
+ <!-- ===== PAGE HERO ===== -->
+ <section class="page-hero">
+ <div class="page-hero-inner container">
+ <div class="section-label">Interaktiv & spezialisiert</div>
+ <h1 class="page-hero-title">Tools & more</h1>
+ <p class="page-hero-sub">Spezialisierte Plattformen rund um Schwimmtraining, Wettkampfvorbereitung und mehr – als eigene Subdomains, damit die Werkzeuge so gut werden können wie die Inhalte.</p>
+ </div>
+ <div class="page-hero-bar">
+ <span>2</span> Plattformen
+ </div>
+ </section>
+
+ <!-- ===== MAIN ===== -->
+ <main id="content" class="main-content">
+ <div class="tools-grid container">
+
+ <!-- Tool 1: Schwimmtraining -->
+ <a href="https://swim.triathlon-coaching.com" class="tool-card" target="_blank" rel="noopener">
+ <div class="tool-card-icon" aria-hidden="true">
+ <svg viewBox="0 0 48 48" fill="none" xmlns="http://www.w3.org/2000/svg">
+ <path d="M6 30c3 0 5-2 8-2s5 2 8 2 5-2 8-2 5 2 8 2" stroke="currentColor" stroke-width="2.5" stroke-linecap="round"/>
+ <path d="M6 36c3 0 5-2 8-2s5 2 8 2 5-2 8-2 5 2 8 2" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" opacity=".5"/>
+ <circle cx="24" cy="16" r="4" stroke="currentColor" stroke-width="2.5"/>
+ <path d="M24 20v6M18 24l6 2 6-2" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round"/>
+ </svg>
+ </div>
+ <div class="tool-card-body">
+ <div class="tool-card-domain">swim.triathlon-coaching.com</div>
+ <h2 class="tool-card-title">Schwimmtraining & -pläne</h2>
+ <p class="tool-card-desc">Schwimmen ist für viele Triathleten die ungeliebte Disziplin – oft weil das Training zu wenig strukturiert ist. Hier gibt es Trainingspläne, Technik-Einheiten und interaktive Werkzeuge speziell für den Triathlonschwimmer: von der ersten Bahnlänge bis zum Freiwasserstart in Roth.</p>
+ <span class="tool-card-cta">Zur Plattform <span aria-hidden="true">→</span></span>
+ </div>
+ </a>
+
+ <!-- Tool 2: Road to Kona -->
+ <a href="https://roadtokona.triathlon-coaching.com" class="tool-card" target="_blank" rel="noopener">
+ <div class="tool-card-icon" aria-hidden="true">
+ <svg viewBox="0 0 48 48" fill="none" xmlns="http://www.w3.org/2000/svg">
+ <path d="M24 6l2.5 7.5H34l-6.5 4.5 2.5 7.5L24 21l-6 4.5 2.5-7.5L14 13.5h7.5L24 6z" stroke="currentColor" stroke-width="2.5" stroke-linejoin="round"/>
+ <path d="M16 36c0-4.4 3.6-8 8-8s8 3.6 8 8" stroke="currentColor" stroke-width="2.5" stroke-linecap="round"/>
+ <path d="M12 42h24" stroke="currentColor" stroke-width="2.5" stroke-linecap="round"/>
+ </svg>
+ </div>
+ <div class="tool-card-body">
+ <div class="tool-card-domain">roadtokona.triathlon-coaching.com</div>
+ <h2 class="tool-card-title">#roadtokona</h2>
+ <p class="tool-card-desc">Hawaii. Der Ironman World Championship. Das große Ziel vieler Langdistanzathleten. Diese Plattform begleitet den Weg dorthin – mit Qualifikationsrechnern, Saisonplanung, Renndaten und allem, was es braucht, um die schwarze Lavaküste nicht nur zu träumen.</p>
+ <span class="tool-card-cta">Zur Plattform <span aria-hidden="true">→</span></span>
+ </div>
+ </a>
+
+ </div>
+ </main>
+
+ <!-- ===== FOOTER ===== -->
+ <footer class="site-footer">
+ <div class="footer-inner container">
+ <div class="footer-brand">
+ <a href="index.html" class="site-logo footer-logo">
+ <span class="logo-tri">triathlon</span><span class="logo-dash">-</span><span class="logo-coaching">coaching</span><span class="logo-dot">.</span><span class="logo-com">com</span>
+ </a>
+ <p>Triathlon-Coaching aus Leidenschaft.<br/>DTU-C-Trainer seit 2018.</p>
+ </div>
+ <nav class="footer-nav" aria-label="Footer Navigation">
+ <ul>
+ <li><a href="kontakt.html">Kontakt</a></li>
+ <li><a href="impressum.html">Impressum</a></li>
+ <li><a href="datenschutz.html">Datenschutz</a></li>
+ <li><a href="agb.html">AGB</a></li>
+ </ul>
+ </nav>
+ </div>
+ <div class="footer-bottom"><p>© 2025 triathlon-coaching.com</p></div>
+ </footer>
+
+ <script src="main.js"></script>
+</body>
+</html>