Trainings + Keynotes: Terminanfrage statt Kontakt-Band, Doppeltes raus

Beide Leistungsseiten enden jetzt mit der Terminanfrage: dasselbe Formular wie
auf der Startseite (an /api/contact), mit zwei freiwilligen Feldern –
Trainings: Wunschtermin/Zeitraum und Teamgröße, Keynotes: Datum und
Veranstaltung & Ort. Das Anliegen („Terminanfrage Training“ / „… Keynote“)
geht als `topic` mit und wird beim Hoster zum Mail-Betreff, die Felder als
`details` in die Mail. Der Knopf im Hero („Training anfragen“, „Keynote
anfragen“) springt dorthin statt ein Mailprogramm zu öffnen.

Entfallen, weil es schon auf der Seite stand:
- Trainings: „Typische Ziele“ (Spiegel der drei Bremsen), der Rahmen-Abschnitt
  (= Hero-Fakten), die Randspalte im Ablauf (wiederholte die Schritte), die FAQ
  zur Teilnehmerzahl; Subline ohne die Format-/Sprach-Wiederholung.
- Keynotes: die Unterbrechung „Mut zum Erfolg.“ (= H1 und Vortragstitel), die
  Speaker-Facts (= Hero-Fakten; „Technik“ steht jetzt dort), die FAQ „Auf
  Englisch?“; die Termine hängen direkt unter dem Vortrag.

Datenschutzerklärung Ziffer 2 und 5 (DE/EN): mehrere Formulare, die neuen
freiwilligen Felder. Ungenutzt und entfernt: TrainingsGoals, TrainingsRahmen,
TrainingsBand, FactsStrip, Interruption, `mailto` in site.ts.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
knsoandClaude Opus 5.5 committed 2026-10-02 13:07:00 +00:00
1 parent a37e48e4ef
commit f825e74222
20 files changed
+268 -400

No files matched your search

+25 -40
View File
@@ -1,10 +1,15 @@
/**
* /leistungen/keynotes/ – Keynotes & Speaking (Spec §7.4). Copy 1:1, Du-Form.
* Entschlackt am 02.10.2026: Die typografische Unterbrechung („Mut zum Erfolg.“ – stand
* schon als H1 und im Vortragstitel), die Speaker-Facts (wiederholten die Hero-Fakten;
* nur „Technik“ war neu und steht jetzt dort) und die FAQ „Auf Englisch?“ sind
* entfallen. Die Termine hängen unter dem Vortrag. Statt des Kontakt-Bands mit
* mailto-Knopf schließt die Seite mit der Terminanfrage (Formular).
* Zweiter Vortrag („Unlock your Sales-DNA“) bleibt weg (flags.showSecondTalk: false).
* Speaker-Profil-Zeile nur mit flags.showSpeakerPdf bzw. vorhandener Datei (assets.getSpeakerPdf()).
* FAQ-Antworten: kurz, aus den Spec-Fakten abgeleitet (Spec A.8).
*/
import { mailto } from "@/lib/site";
import { routes } from "@/lib/site";
import type { Widen } from "./widen";
import { assertNoPlaceholders, collectStrings, ph } from "@/lib/legal";
import type { ColumnItem, Cta, FactItem, FaqItem, GoalRow, Headline } from "./home";
@@ -39,8 +44,9 @@ export const keynotes = {
h1: { before: "Mut zum ", em: "Erfolg", after: "." } satisfies Headline,
h1GoldEm: true,
subline:
"Keynotes nach dem WOLF-Prinzip für Firmen-Events, Kick-offs und Kongresse. Ein Impuls, der nachwirkt – auf Deutsch oder Englisch, live oder online.",
cta: { label: "Keynote anfragen", href: mailto.keynote } satisfies Cta,
"Keynotes nach dem WOLF-Prinzip für Firmen-Events, Kick-offs und Kongresse. Ein Impuls, der nachwirkt.",
/* Springt zur Terminanfrage am Fuß der Seite (vorher: mailto). */
cta: { label: "Keynote anfragen", href: `${routes.keynotes}#terminanfrage` } satisfies Cta,
/** Nur rendern, wenn die PDF-Datei existiert (assets.getSpeakerPdf()). */
secondary: { label: "Speaker-Profil (PDF)", href: "/speaker-profil.pdf", external: true },
facts: [
@@ -48,6 +54,7 @@ export const keynotes = {
{ label: "Format", value: "Live, online, hybrid" },
{ label: "Sprache", value: "Deutsch / Englisch" },
{ label: "Ort", value: "Deutschlandweit, Europa auf Anfrage" },
{ label: "Technik", value: "Headset, Präsentation optional" },
] satisfies readonly FactItem[],
alt: "Anelia Wolf auf der Bühne",
caption: `Anelia Wolf · Foto: ${ph("Name der Fotografin")}`,
@@ -70,17 +77,6 @@ export const keynotes = {
] satisfies readonly TalkRow[],
},
/* Spec §7.4 wörtlich. Die vorherige Fassung („Ein Impuls, der nachwirkt.“) stand nicht
in Abschnitt A und brach zugleich Spec §0 Kritik #4: der Satz darf EINMAL pro
Keynote-Seite vorkommen und stand dann in Subline, Meta-Description und in der
Unterbrechung – die eine große typografische Pause wiederholte, was 400 px darüber
schon zu lesen war. */
interruption: {
id: "mut",
text: "Mut zum Erfolg.",
mono: "Keynote · herCAREER Expo 2026 · 23.10. · 10:30 · Auditorium 2",
},
occasions: {
id: "anlaesse",
eyebrow: "Anlässe",
@@ -113,26 +109,10 @@ export const keynotes = {
] satisfies readonly GoalRow[],
},
speakerFacts: {
id: "speaker-facts",
items: [
{ label: "Sprachen", value: "DE / EN" },
{ label: "Dauer", value: "20–60 Min." },
{ label: "Format", value: "live, online, hybrid" },
{ label: "Technik", value: "Headset, Präsentation optional" },
{ label: "Reise", value: "deutschlandweit, Europa auf Anfrage" },
{ label: "Anfrage", value: "unverbindlich" },
] satisfies readonly FactItem[],
},
termine,
veranstalter: {
id: "veranstalter",
eyebrow: "Für Veranstalter",
h2: { before: "Alles Wichtige vorab.", em: "", after: "" } satisfies Headline,
speakerPdf: { label: "Speaker-Profil (PDF)", text: "Kurzvita, Themen, Fotos, Technik", href: "/speaker-profil.pdf" },
},
/** Zeile unter dem Vortrag – nur, wenn die PDF-Datei geliefert wurde (assets.getSpeakerPdf()). */
speakerPdf: { label: "Speaker-Profil (PDF)", text: "Kurzvita, Themen, Fotos, Technik", href: "/speaker-profil.pdf" },
faq: {
id: "faq",
@@ -146,10 +126,6 @@ export const keynotes = {
q: "Auch als Workshop nach der Keynote?",
a: "Ja. Die Keynote lässt sich mit einem Workshop oder Training kombinieren – am selben Tag oder als Folgetermin.",
},
{
q: "Auf Englisch?",
a: "Ja. Keynotes halte ich auf Deutsch oder Englisch – live, online oder hybrid.",
},
{
q: "Gibt es Video oder Referenzen?",
a: "Auf Anfrage. Sprich mich an, dann schicke ich dir Unterlagen zum Vortrag.",
@@ -157,10 +133,19 @@ export const keynotes = {
] satisfies readonly FaqItem[],
},
band: {
h2: { before: "Hol das WOLF-Prinzip auf deine Bühne.", em: "", after: "" } satisfies Headline,
cta: { label: "Keynote anfragen", href: mailto.keynote } satisfies Cta,
micro: "Unverbindlich · Antwort auf Deutsch oder Englisch",
/**
* Terminanfrage (ink) – das Formular der Startseite mit zwei freiwilligen Feldern.
* `topic` wird zum Mail-Betreff; `mailLabel` beschriftet die Felder in der Mail.
*/
anfrage: {
id: "terminanfrage",
eyebrow: "Terminanfrage",
h2: { before: "Lass uns einen ", em: "Termin", after: " finden." } satisfies Headline,
topic: "Terminanfrage Keynote",
fields: [
{ name: "datum", label: "Datum der Veranstaltung", mailLabel: "Datum" },
{ name: "veranstaltung", label: "Veranstaltung & Ort", mailLabel: "Veranstaltung & Ort" },
],
},
} as const;