Files
Anelia-Wolf/src/content/keynotes.ts
T
knsoandClaude Opus 5.5 f825e74222 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>
2026-10-02 13:07:00 +00:00

159 lines
6.8 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
/**
* /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>;