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>
159 lines
6.8 KiB
TypeScript
159 lines
6.8 KiB
TypeScript
/**
|
||
* /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 { 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";
|
||
import { termine } from "./home";
|
||
|
||
export interface TalkRow {
|
||
numeral: string;
|
||
title: string;
|
||
message: string;
|
||
audience: string;
|
||
meta: string;
|
||
}
|
||
|
||
/** Labels der Vortrags-Zeile (Kernbotschaft / Für wen). */
|
||
export const talkLabels = { message: "Kernbotschaft", audience: "Für wen" } as const;
|
||
|
||
export const keynotes = {
|
||
meta: {
|
||
title: "Keynotes & Speaking",
|
||
description:
|
||
"Keynotes nach dem WOLF-Prinzip für Firmen-Events, Kick-offs und Kongresse. Ein Impuls, der nachwirkt – auf Deutsch oder Englisch, live oder online. Anelia Wolf, Keynote Speakerin.",
|
||
},
|
||
numeral: "03",
|
||
masthead: {
|
||
role: "Keynote Speakerin · Trainerin · Coach",
|
||
center: "Keynotes & Speaking",
|
||
lang: "Deutsch & Englisch",
|
||
},
|
||
/* No-break space before the separator: at 390 px this label wraps and a line must never open with „·“. */
|
||
eyebrow: "Keynotes nach dem WOLF-Prinzip · Deutsch & Englisch",
|
||
/** Das kursive Wort darf hier zusätzlich `.gold-text` tragen (das eine Gradient-Wort der Seite). */
|
||
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.",
|
||
/* 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: [
|
||
{ label: "Dauer", value: "20–60 Minuten" },
|
||
{ 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")}`,
|
||
folio: { next: { label: "Der Vortrag", href: "#vortrag" } },
|
||
|
||
talk: {
|
||
id: "vortrag",
|
||
eyebrow: "Signature Talk",
|
||
h2: { before: "Der Vortrag.", em: "", after: "" } satisfies Headline,
|
||
rows: [
|
||
{
|
||
numeral: "01",
|
||
/* U+2011 (non-breaking hyphen) keeps „WOLF-Prinzip“ on one line. */
|
||
title: "Das WOLF‑Prinzip – Mut zum Erfolg!",
|
||
message:
|
||
"Starke Persönlichkeit, souveräne Wirkung, maximaler Erfolg: wie du dein Potenzial erkennst und selbstbewusst einsetzt – im Leben und im Business.",
|
||
audience: "Mitarbeitende, Vertriebsteams, Führungskräfte, Karriere-Publikum",
|
||
meta: "20–60 Min. · DE/EN · live & online",
|
||
},
|
||
] satisfies readonly TalkRow[],
|
||
},
|
||
|
||
occasions: {
|
||
id: "anlaesse",
|
||
eyebrow: "Anlässe",
|
||
h2: { before: "Drei Bühnen.", em: "", after: "" } satisfies Headline,
|
||
/* U+2011 (geschützter Trennstrich) hält „Kick-offs“ und „Hochschul-Event“ in einer Zeile. */
|
||
columns: [
|
||
{
|
||
title: "Firmen-Events & Kick‑offs",
|
||
lines: ["Jahresauftakt", "Vertriebs-Kick‑off", "Führungskreis"],
|
||
},
|
||
{
|
||
title: "Vertriebstagungen & Kongresse",
|
||
lines: ["Vertriebstagung", "Branchenkongress", "Messeauftritt"],
|
||
},
|
||
{
|
||
title: "Karriere-Events & Frauennetzwerke",
|
||
lines: ["Karrieremesse", "Frauennetzwerk", "Hochschul‑Event"],
|
||
},
|
||
] satisfies readonly ColumnItem[],
|
||
},
|
||
|
||
takeaways: {
|
||
id: "publikum",
|
||
eyebrow: "Was dein Publikum mitnimmt",
|
||
h2: { before: "Was bleibt.", em: "", after: "" } satisfies Headline,
|
||
rows: [
|
||
{ text: "Klarheit darüber, wer man ist und wofür man steht." },
|
||
{ text: "Ein konkretes Vorgehen für souveränes Auftreten – im Kundengespräch wie im Team." },
|
||
{ text: "Den Mut, die nächste Entscheidung selbst zu treffen." },
|
||
] satisfies readonly GoalRow[],
|
||
},
|
||
|
||
termine,
|
||
|
||
/** 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",
|
||
eyebrow: "FAQ",
|
||
items: [
|
||
{
|
||
q: "Wie lange im Voraus anfragen?",
|
||
a: "So früh wie möglich – Termine vergebe ich nach Eingang der Anfrage. Frag unverbindlich an, dann prüfe ich die Verfügbarkeit.",
|
||
},
|
||
{
|
||
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: "Gibt es Video oder Referenzen?",
|
||
a: "Auf Anfrage. Sprich mich an, dann schicke ich dir Unterlagen zum Vortrag.",
|
||
},
|
||
] satisfies readonly FaqItem[],
|
||
},
|
||
|
||
/**
|
||
* 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;
|
||
|
||
|
||
/* Build-Guard: der Launch-Flip (`flags.showPlaceholders: false`) darf keine sichtbaren
|
||
„[…]“ übrig lassen. Der Scan läuft über das ganze Objekt, damit die Liste nicht
|
||
auseinanderläuft – offene Punkte stehen in CONTENT_TODO (src/lib/legal.ts). */
|
||
assertNoPlaceholders("src/content/keynotes.ts", collectStrings(keynotes));
|
||
/** Struktur, nicht Wortlaut – die englische Fassung erfüllt denselben Typ. */
|
||
export type KeynotesContent = Widen<typeof keynotes>;
|