first publish

This commit is contained in:
knso committed 2026-09-06 17:21:52 +02:00
commit b8e41b4d55
147 files changed
+19367

No files matched your search

+64
View File
@@ -0,0 +1,64 @@
/**
* English copy of the global chrome (header, overlay menu, masthead, footer, curtain).
* Mirrors the shape of src/content/chrome.ts exactly – the components take this object
* as a prop, so both languages render through the same code.
*/
import { site } from "@/lib/site";
import { routesByLang } from "@/lib/i18n";
import type { Chrome } from "@/content/chrome";
const r = routesByLang.en;
export const navEn = [
{ href: r.coaching, label: "Coaching & Assessments" },
{ href: r.trainings, label: "Training & Workshops" },
{ href: r.keynotes, label: "Keynotes & Speaking" },
] as const;
export const chromeEn: Chrome = {
masthead: {
role: "Keynote Speaker · Trainer · Coach",
center: "Sales Mentoring & Potential Development",
languages: "German & English",
},
wordmark: {
name: "Anelia Wolf",
sub: "Sales Mentoring & Potential Development",
ariaLabel: "Anelia Wolf – home",
},
skipLink: "Skip to content",
header: {
navAriaLabel: "Main navigation",
cta: {
label: "Request an intro call",
href: r.kontakt,
},
menu: { open: "Menu", openLabel: "Open menu", close: "Close menu", ariaLabel: "Main menu" },
},
menu: {
items: [
{ numeral: "01", label: navEn[0].label, href: navEn[0].href },
{ numeral: "02", label: navEn[1].label, href: navEn[1].href },
{ numeral: "03", label: navEn[2].label, href: navEn[2].href },
{ numeral: "04", label: "About Anelia", href: `${r.home}#ueber` },
{ numeral: "05", label: "Contact", href: r.kontakt },
],
linkedin: "LinkedIn",
},
footer: {
inhaltHeading: "Pages",
kontaktHeading: "Contact",
inhalt: [
...navEn.map((n) => ({ label: n.label, href: n.href })),
{ label: "About Anelia", href: `${r.home}#ueber` },
{ label: "Contact", href: r.kontakt },
],
linkedin: "LinkedIn",
hercareer: { label: "herCAREER Expo 2026", href: site.hercareer },
copyrightSuffix: "Sales Mentoring & Potential Development",
claim: site.claim,
},
curtain: {
fallbackLabel: site.name,
},
};
+159
View File
@@ -0,0 +1,159 @@
/**
* English copy of /en/services/coaching/. Same shape as src/content/coaching.ts.
* „du“ becomes a direct „you“; the placeholders stay the same so the launch guard
* (assertNoPlaceholders) catches both languages.
*/
import { routesByLang } from "@/lib/i18n";
import { assertNoPlaceholders, collectStrings, ph } from "@/lib/legal";
import type { CoachingContent } from "@/content/coaching";
const r = routesByLang.en;
export const specLabelsEn = { goal: "Goal", contents: "What it covers", audience: "Who it is for" } as const;
export const coachingEn: CoachingContent = {
meta: {
title: "Coaching & Assessments",
description:
"Personality and behaviour assessments plus one-to-one coaching: for assured presence, clear positioning and career change. Anelia Wolf, coach – in person or online, German and English.",
},
numeral: "01",
masthead: {
role: "Keynote Speaker · Trainer · Coach",
center: "Coaching & Assessments",
lang: "German & English",
},
eyebrow: "One-to-one coaching & personality assessments",
h1: { before: "Who you are – and who you could ", em: "be", after: "?" },
subline:
"Personality and behaviour assessments plus one-to-one coaching: for assured presence, clear positioning and a career change on your terms.",
cta: {
label: "Request an intro call",
href: r.kontakt,
},
facts: [
{ label: "Format", value: "One to one" },
{ label: "Place", value: "In person or online" },
{ label: "Language", value: "German / English" },
{ label: "Length", value: "by arrangement" },
],
folio: { next: { label: "Where you stand", href: "#ausgangslage" } },
situations: {
id: "ausgangslage",
eyebrow: "Starting point",
h2: { before: "Where you stand right now.", em: "", after: "" },
rows: [
{ numeral: "01", text: "You are strong at what you do – and come across smaller than you are." },
{ numeral: "02", text: "You want to say clearly what you stand for, and the words will not come." },
{ numeral: "03", text: "You are facing a change: new role, new team, new direction." },
{ numeral: "04", text: "Or it is something else entirely. Then we start exactly there." },
],
},
questions: {
id: "fragen",
eyebrow: "The three questions",
rows: [
{
q: "Who am I?",
a: "The behaviour assessment shows your profile: strengths, patterns, potential. Not as a label, but as something to work with.",
},
{
q: "Where do I stand?",
a: "In the debrief we work out how much of that is visible today – in how you show up, how you speak, where you sit.",
},
{
q: "Where am I going?",
a: "Coaching turns the answers into presence, positioning and decisions. Concretely, in your working week.",
},
],
alt: "Anelia Wolf in conversation",
},
blocks: {
id: "bausteine",
eyebrow: "What you get",
h2: { before: "Two building blocks.", em: "", after: "" },
items: [
{
title: "Personality & behaviour assessment",
goal: "Understand your profile: strengths, behavioural patterns, potential.",
contents: `Online questionnaire, written profile, debrief conversation ${ph("Dauer")} ${ph("Tool/Zertifizierung")}.`,
audience: "Individuals, application and career phases, and as a basis for team training.",
meta: `Online · DE/EN · ${ph("Dauer")}`,
},
{
title: "One-to-one coaching",
tracks: [
"Assured presence – speaking with conviction",
"Unlocking potential – clear positioning",
"Career direction – changing course",
],
meta: "In person or online · DE/EN · one to one",
},
],
},
rahmen: {
id: "rahmen",
eyebrow: "Practicalities",
rows: [
{ label: "Setting", value: "One to one" },
{ label: "Place", value: "in person or online" },
{ label: "Language", value: "German / English" },
{ label: "Length", value: ph("Platzhalter"), placeholder: true },
{ label: "Package", value: ph("Platzhalter"), placeholder: true },
{ label: "Preparation", value: "Intro call, questionnaire" },
],
},
ablauf: {
id: "ablauf",
eyebrow: "How it runs",
steps: [
{ numeral: "01", title: "Intro call", text: "" },
{ numeral: "02", title: "Assessment", text: "" },
{ numeral: "03", title: "Coaching sessions", text: "" },
{ numeral: "04", title: "Into your working week", text: "" },
],
marginalia: {
title: "What you take away",
items: [
{ value: "A written profile" },
{ value: "Clear positioning" },
{ value: "Next steps you take yourself" },
],
},
},
faq: {
id: "faq",
eyebrow: "FAQ",
items: [
{
q: "Who is the coaching for?",
a: "For specialists and leaders who want to come across with more authority or position themselves clearly – and for people changing direction professionally.",
},
{
q: "How many sessions do I need?",
a: "That depends on your goal. We agree the scope and rhythm individually in the intro call.",
},
{
q: "Can we do this online?",
a: "Yes. Assessment, debrief and coaching all work in person or online – in German or English.",
},
{
q: "What does the coaching cost?",
a: "On request. You get a concrete quote for your setting in the intro call.",
},
],
},
band: {
h2: { before: "Start with a conversation.", em: "", after: "" },
cta: { label: "Request an intro call", href: r.kontakt },
},
};
assertNoPlaceholders("src/content/en/coaching.ts", collectStrings(coachingEn));
+239
View File
@@ -0,0 +1,239 @@
/**
* English copy of the home page. Same shape as src/content/home.ts – the section
* components take these objects as props, so both languages share one code path.
*
* Tone: the German version says „du“. English keeps that directness with a plain
* „you“ – warm, never chummy. Brand terms stay as Anelia uses them herself on her
* English herCAREER profile: „WOLF Principle“, „Courage to Succeed!“.
*/
import { site } from "@/lib/site";
import { routesByLang } from "@/lib/i18n";
import { assertNoPlaceholders, collectStrings, ph } from "@/lib/legal";
import type { HomeContent } from "@/content/home";
const r = routesByLang.en;
export const homeEn: HomeContent = {
hero: {
id: "hero",
masthead: {
role: "Keynote Speaker · Trainer · Coach",
center: "Sales Mentoring & Potential Development",
lang: "German & English",
},
h1: { before: "Who you are decides how you ", em: "land", after: "." },
subline:
"Welcome. Whether as a speaker at your company event, in one-to-one coaching or as a trainer for your team – I am glad to hear what you need.",
cta: {
label: "Request an intro call",
href: r.kontakt,
suffix: "( 30 min · free )",
},
folio: { current: "01", total: "06", next: { label: "Positioning", href: "#positionierung" } },
alt: "Anelia Wolf, keynote speaker, trainer and coach",
caption: `Anelia Wolf · Photo: ${ph("Name der Fotografin")}`,
},
/* ---------- 01 Positioning (ivory) ---------- */
positioning: {
id: "positionierung",
numeral: "01",
eyebrow: "Positioning",
h2: { before: "Three questions. One principle.", em: "", after: "" },
paragraph:
"I ask these three questions of everyone I work with – in coaching, in training, before every keynote. The answers are the beginning. After that it is about presence: speaking with authority, standing for something clear, selling more because of it.",
rows: [
{ numeral: "01", question: "Who are you?", answer: "Personality & behaviour assessment" },
{ numeral: "02", question: "Where do you stand?", answer: "Positioning in coaching" },
{ numeral: "03", question: "Where are you going?", answer: "Put to work in training, coaching or a keynote" },
],
folio: { current: "02", total: "06" },
},
/* ---------- 02 Services (ivory) ---------- */
services: {
id: "leistungen",
numeral: "02",
eyebrow: "Services",
h2: { before: "Coaching. Training. Stage.", em: "", after: "" },
rows: [
{
numeral: "01",
title: "Coaching & Assessments",
oneLiner: "Who you are – and who you could be.",
keywords: ["Personality & behaviour assessment", "One-to-one coaching", "Positioning & career change"],
link: { label: "See coaching", href: r.coaching },
},
{
numeral: "02",
title: "Training & Workshops",
oneLiner: "Sales with personality – for teams and their leaders.",
keywords: ["B2B sales training", "New and existing customers", "Leadership & team dynamics"],
link: { label: "See training", href: r.trainings },
},
{
numeral: "03",
title: "Keynotes & Speaking",
oneLiner: "Courage to succeed. The WOLF Principle on stage.",
keywords: ["Company events & conferences", "20–60 minutes", "German & English"],
link: { label: "See keynotes", href: r.keynotes },
},
],
folio: { current: "03", total: "06" },
},
/* ---------- 03 The WOLF Principle (ink, the single pin) ---------- */
principle: {
id: "prinzip",
numeral: "03",
eyebrow: "The WOLF Principle",
opLabels: { "+": "plus ", "=": "equals " },
lines: [
{ text: "Strong personality" },
{ op: "+", text: "Assured presence" },
{ op: "=", text: "Maximum ", em: "success", goldEm: true },
],
link: { label: "The WOLF Principle on stage", href: r.keynotes },
folio: { current: "04", total: "06" },
},
/* ---------- 04 About Anelia (ivory) ---------- */
about: {
id: "ueber",
numeral: "04",
eyebrow: "About Anelia",
h2: { before: "I am out selling myself. Every week.", em: "", after: "" },
paragraphs: [
"My father was a trader. I saw early on how a conversation changes a decision – and that people buy from people. Later came training as a dental technician, running a department, then sales and store management in the premium segment.",
"Today I work in B2B field sales: cold calling, new business, key accounts. Alongside that I work with people and teams as a coach, trainer and keynote speaker – in German and English. What I pass on, I did myself the week before.",
],
twins: "And at home two sixteen-year-old twins put my negotiating to the test daily.",
werdegang: [
{ keyword: "Roots", text: "Sales conversations in my father's business" },
{ keyword: "Precision", text: "Dental technician, department manager" },
{ keyword: "Premium", text: "Sales & store management in the premium segment" },
{ keyword: "B2B", text: "Field sales: cold calling, new business, key accounts" },
{ keyword: "Stage", text: "Keynote speaker, trainer & coach · herCAREER Expo 2026" },
],
caption: `Anelia Wolf · Photo: ${ph("Name der Fotografin")}`,
alt: "Anelia Wolf, portrait",
marginalia: [
{ value: "Trainer for personality, presence & sales" },
{ value: "LinkedIn", href: site.linkedin, external: true },
{ value: "German · English" },
],
folio: { current: "05", total: "06" },
},
/* ---------- 05 Who I work with + dates (ivory, dates on bone) ---------- */
audience: {
id: "fuer-wen",
numeral: "05",
eyebrow: "Who for",
h2: { before: "Who I work with.", em: "", after: "" },
columns: [
{
label: "Companies",
title: "Sales teams & their leaders",
lines: [
"New business that becomes predictable",
"Existing customers that grow instead of drifting away",
"Leadership and team dynamics in sales",
],
link: { label: "See training", href: r.trainings },
},
{
label: "Individuals",
title: "Specialists, leaders, women changing direction",
lines: [
"Speak with authority and convince",
"Know what you stand for – and say it",
"Change direction without bending yourself out of shape",
],
link: { label: "See coaching", href: r.coaching },
},
{
label: "Event hosts",
title: "Company events, conferences, career formats",
lines: [
"A keynote on the WOLF Principle, 20 to 60 minutes",
"German or English, live or online",
"An impulse that stays with the room",
],
link: { label: "See keynotes", href: r.keynotes },
},
],
termine: {
id: "termine",
heading: "Dates",
rows: [
{
date: "23 Oct 2026 · 10:30",
format: "Keynote",
title: "The WOLF Principle – Courage to Succeed!",
venue: "herCAREER Expo, MOC Munich, Auditorium 2",
href: site.hercareer,
},
{
date: "22–23 Oct 2026",
format: "Exhibitor",
title: "Trainer for personality, presence & sales",
venue: "herCAREER Expo, Hall 3, Stand P.10.2",
href: site.hercareer,
},
],
},
folio: { current: "06", total: "06" },
},
termine: {
id: "termine",
heading: "Dates",
rows: [
{
date: "23 Oct 2026 · 10:30",
format: "Keynote",
title: "The WOLF Principle – Courage to Succeed!",
venue: "herCAREER Expo, MOC Munich, Auditorium 2",
href: site.hercareer,
},
{
date: "22–23 Oct 2026",
format: "Exhibitor",
title: "Trainer for personality, presence & sales",
venue: "herCAREER Expo, Hall 3, Stand P.10.2",
href: site.hercareer,
},
],
},
/* ---------- 06 Contact (ink) + colophon ---------- */
contact: {
id: "kontakt",
numeral: "06",
eyebrow: "Contact",
h2: { before: "Let's ", em: "talk", after: "." },
form: {
fields: {
name: "Name",
email: "Email",
company: "Company",
message: "Your message",
},
submit: "Send enquiry",
subject: "Enquiry via anelia-wolf.com",
note: "Sending opens your own email programme with the message ready to go. No data is passed to third parties.",
opened: "Your email programme should have opened. If it did not, write to me directly at the address on the right.",
privacy: "Privacy",
},
links: {
write: { label: "Write to me", value: site.email, href: `mailto:${site.email}` },
call: { label: "Call", value: site.phoneDisplay, href: site.phoneHref },
connect: { label: "Connect", value: "LinkedIn", href: site.linkedin, external: true },
},
signoff: "Unlock Your Potential — Next Level",
colophon: { name: "ANELIA WOLF", sub: "SALES MENTORING & POTENTIAL DEVELOPMENT" },
},
};
assertNoPlaceholders("src/content/en/home.ts", collectStrings(homeEn));
+146
View File
@@ -0,0 +1,146 @@
/**
* English copy of /en/services/keynotes/. Same shape as src/content/keynotes.ts.
* The talk title follows Anelia's own English herCAREER listing:
* „The WOLF Principle – Courage to Succeed!“.
*/
import { mailto } from "@/lib/site";
import { assertNoPlaceholders, collectStrings, ph } from "@/lib/legal";
import type { KeynotesContent } from "@/content/keynotes";
import { homeEn } from "./home";
export const talkLabelsEn = { message: "Core message", audience: "Who it is for" } as const;
export const keynotesEn: KeynotesContent = {
meta: {
title: "Keynotes & Speaking",
description:
"Keynotes on the WOLF Principle for company events, kick-offs and conferences. An impulse that stays with the room – in German or English, live or online. Anelia Wolf, keynote speaker.",
},
numeral: "03",
masthead: {
role: "Keynote Speaker · Trainer · Coach",
center: "Keynotes & Speaking",
lang: "German & English",
},
eyebrow: "Keynotes on the WOLF Principle · German & English",
h1: { before: "Courage to ", em: "succeed", after: "." },
h1GoldEm: true,
subline:
"Keynotes on the WOLF Principle for company events, kick-offs and conferences. An impulse that stays with the room – in German or English, live or online.",
cta: { label: "Request a keynote", href: mailto.keynote },
secondary: { label: "Speaker profile (PDF)", href: "/speaker-profil.pdf", external: true },
facts: [
{ label: "Length", value: "20–60 minutes" },
{ label: "Format", value: "Live, online, hybrid" },
{ label: "Language", value: "German / English" },
{ label: "Travel", value: "Germany-wide, Europe on request" },
],
alt: "Anelia Wolf on stage",
caption: `Anelia Wolf · Photo: ${ph("Name der Fotografin")}`,
folio: { next: { label: "The talk", href: "#vortrag" } },
talk: {
id: "vortrag",
eyebrow: "Signature talk",
h2: { before: "The talk.", em: "", after: "" },
rows: [
{
numeral: "01",
title: "The WOLF Principle – Courage to Succeed!",
message:
"Strong personality, assured presence, maximum success: how you recognise your potential and use it with confidence – in life and in business.",
audience: "Employees, sales teams, leaders, career audiences",
meta: "20–60 min · DE/EN · live & online",
},
],
},
interruption: {
id: "mut",
text: "Courage to succeed.",
mono: "Keynote · herCAREER Expo 2026 · 23 Oct · 10:30 · Auditorium 2",
},
occasions: {
id: "anlaesse",
eyebrow: "Occasions",
h2: { before: "Three stages.", em: "", after: "" },
columns: [
{
title: "Company events & kick‑offs",
lines: ["Start of the year", "Sales kick‑off", "Leadership circle"],
},
{
title: "Sales conferences & congresses",
lines: ["Sales conference", "Industry congress", "Trade fair appearance"],
},
{
title: "Career events & women's networks",
lines: ["Careers fair", "Women's network", "University event"],
},
],
},
takeaways: {
id: "publikum",
eyebrow: "What your audience takes away",
h2: { before: "What stays.", em: "", after: "" },
rows: [
{ text: "Clarity about who you are and what you stand for." },
{ text: "A concrete way to show up with authority – in the customer conversation and in the team." },
{ text: "The courage to make the next decision yourself." },
],
},
speakerFacts: {
id: "speaker-facts",
items: [
{ label: "Languages", value: "DE / EN" },
{ label: "Length", value: "20–60 min" },
{ label: "Format", value: "live, online, hybrid" },
{ label: "Tech", value: "Headset, slides optional" },
{ label: "Travel", value: "Germany-wide, Europe on request" },
{ label: "Enquiry", value: "no obligation" },
],
},
termine: homeEn.termine,
veranstalter: {
id: "veranstalter",
eyebrow: "For event hosts",
h2: { before: "Everything you need up front.", em: "", after: "" },
speakerPdf: { label: "Speaker profile (PDF)", text: "Short bio, topics, photos, tech", href: "/speaker-profil.pdf" },
},
faq: {
id: "faq",
eyebrow: "FAQ",
items: [
{
q: "How far ahead should I ask?",
a: "As early as you can – dates go in the order enquiries arrive. Ask without obligation and I will check availability.",
},
{
q: "Can it be combined with a workshop?",
a: "Yes. The keynote works alongside a workshop or training – on the same day or as a follow-up.",
},
{
q: "In English?",
a: "Yes. I speak in German or English – live, online or hybrid.",
},
{
q: "Is there video or are there references?",
a: "On request. Get in touch and I will send you material on the talk.",
},
],
},
band: {
h2: { before: "Bring the WOLF Principle to your stage.", em: "", after: "" },
cta: { label: "Request a keynote", href: mailto.keynote },
micro: "No obligation · reply in German or English",
},
};
assertNoPlaceholders("src/content/en/keynotes.ts", collectStrings(keynotesEn));
+285
View File
@@ -0,0 +1,285 @@
/**
* English imprint & privacy notice – the same shape as src/content/legal.ts.
*
* WICHTIG: Die deutsche Fassung ist die verbindliche. Diese Übersetzung ist eine
* Lesehilfe für englischsprachige Besucherinnen und Besucher; im Zweifel gilt der
* deutsche Text (§ 5 DDG verlangt die Angaben ohnehin in deutscher Sprache, und eine
* Datenschutzerklärung muss in der Sprache verfügbar sein, in der die Website
* angeboten wird). Deshalb steht in beiden Seiten der Hinweis „binding version“ ganz
* oben und verlinkt auf die deutsche Seite.
*
* Zwei Sorten Absatz wie im deutschen Original:
* – Pflichtangabe (String): muss vor dem Launch gefüllt sein, sonst bricht der Build ab.
* – `opt("…")`: entfällt beim Launch-Flip vollständig, solange der Platzhalter steht.
* Die Platzhalter sind hier englisch beschriftet – sie stehen im englischen Satz und
* werden vom selben Build-Guard erfasst. Wer die deutsche Seite füllt, füllt diese mit.
*/
import { assertNoPlaceholders, ph } from "@/lib/legal";
import { flags, site } from "@/lib/site";
import { routesByLang } from "@/lib/i18n";
import type { LegalPage, LegalParagraph, OptionalParagraph } from "@/content/legal";
const opt = (text: string): OptionalParagraph => ({ text, optional: true });
const address = [ph("Street and house number"), `${ph("Postcode")} ${ph("Town")}`] as const;
/** Steht als erster Absatz auf beiden Seiten – ohne ihn wäre unklar, welche Fassung gilt. */
const bindingNote = (german: string): LegalParagraph =>
`This is a translation for convenience. The German version at ${site.url}${german} is the legally binding one.`;
export const impressumEn: LegalPage = {
meta: {
title: "Imprint",
description: "Imprint – information pursuant to Section 5 DDG. Anelia Wolf, keynote speaker, trainer and coach.",
},
masthead: { center: "Imprint" },
h1: "Imprint",
stand: "As at: September 2026",
sections: [
{
h2: "Binding version",
paragraphs: [bindingNote(routesByLang.de.impressum)],
},
{
h2: "Information pursuant to Section 5 DDG",
paragraphs: [
site.name,
opt(
ph(
"Optional: business name, e.g. “Anelia Wolf – Sales Mentoring & Potential Development” – only if it is actually used",
),
),
address[0],
address[1],
"Germany",
],
},
{
h2: "Contact",
paragraphs: [`Phone: ${site.phoneDisplay}`, `Email: ${site.email}`],
},
{
h2: "VAT identification number",
paragraphs: [
/* Beide Absätze streichbar: liegt keine Nummer vor, entfällt der ganze Abschnitt –
LegalPage rendert eine Sektion ohne Absätze nicht. */
opt(
`VAT identification number pursuant to Section 27a of the German Value Added Tax Act: ${ph("DE XXXXXXXXX – or economic identification number pursuant to Section 139c AO – or delete this section")}`,
),
opt(
ph(
"Optional, small-business rule only: “No VAT is charged pursuant to Section 19 of the German Value Added Tax Act.”",
),
),
],
},
{
h2: "Professional indemnity insurance",
paragraphs: [
opt(
`Professional indemnity insurance: ${ph("name and address of the insurer")}, geographical scope: ${ph("e.g. Germany / Europe")} ${ph("– or delete this section if there is no such insurance")}`,
),
],
},
{
h2: "Professional activity",
paragraphs: [
"Keynote speaker, trainer and coach (personality and behaviour assessments, one-to-one coaching, training and workshops, keynotes). These are not regulated professions; there is no chamber membership.",
],
},
{
h2: "Responsible for the content pursuant to Section 18 (2) MStV",
paragraphs: [`${site.name}, ${address[0]}, ${address[1]}`],
},
{
h2: "Consumer dispute resolution",
paragraphs: [
"I am neither willing nor obliged to take part in dispute resolution proceedings before a consumer arbitration board within the meaning of the German Consumer Dispute Resolution Act (VSBG).",
],
},
{
h2: "Liability for content",
paragraphs: [
"The content of this website has been compiled with the greatest possible care. I do not, however, warrant that it is accurate, complete or up to date. As a service provider I am responsible for my own content on these pages under the general laws.",
],
},
{
h2: "Liability for links",
paragraphs: [
"This website contains links to external third-party websites over whose content I have no influence. Responsibility for that external content always lies with the respective provider or operator of those pages. The linked pages were checked for possible legal infringements at the time of linking; no unlawful content was apparent at that time. I will remove such links immediately if I become aware of any infringement.",
],
},
{
h2: "Copyright",
paragraphs: [
/* Wie im deutschen Original: nur Urheberrecht. „WOLF-Prinzip“ ist nicht als Marke
eingetragen; Markenschutz zu behaupten wäre eine abmahnfähige Schutzrechtsberühmung. */
"The content, texts, photographs and graphics published on this website, and the logo, are protected by German copyright law. Reproduction, adaptation, distribution and any kind of exploitation beyond the limits of copyright require the written consent of Anelia Wolf. The designation “The WOLF Principle” is used by Anelia Wolf in the course of business.",
],
},
{
h2: "Image credits",
paragraphs: [
`Portrait photographs: ${ph("photographer's name, website if applicable")}`,
opt(`Logo and design: ${ph("designer / agency")}`),
opt(`Website: ${ph("agency, optional")}`),
],
},
],
};
export const datenschutzEn: LegalPage = {
meta: {
title: "Privacy",
description: "Privacy notice – no cookies, no tracking, no third parties. Anelia Wolf.",
},
masthead: { center: "Privacy" },
h1: "Privacy notice",
stand: "As at: September 2026",
sections: [
{
h2: "Binding version",
paragraphs: [bindingNote(routesByLang.de.datenschutz)],
},
{
h2: "1. Controller",
paragraphs: [
"The controller within the meaning of the General Data Protection Regulation (GDPR) and other data protection provisions is:",
site.name,
address[0],
address[1],
`Phone: ${site.phoneDisplay}`,
`Email: ${site.email}`,
"No data protection officer has been appointed, because the statutory conditions for a duty to appoint one (Art. 37 GDPR, Section 38 BDSG) are not met.",
],
},
{
h2: "2. Overview: what this website does – and what it does not",
paragraphs: [
"This website serves solely to provide information about my services. It",
"– sets no cookies and stores no information on your device (no local storage, no session storage),",
"– uses no analytics, tracking or marketing services (no Google Analytics, no pixels, no fingerprinting),",
"– embeds no third-party content (no external fonts, no videos, no maps, no social media plugins),",
"– does not send the contact form itself: it assembles an email from what you enter and hands it to your own email programme. Until you send that message there, no data is transmitted to me or to anyone else,",
"– contains no newsletter.",
"All fonts, scripts and images are delivered from the server of the hosting provider named below. A cookie banner is therefore not required.",
"Personal data is processed in two cases only: when the pages are technically retrieved (server log files, section 3) and when you contact me by email or telephone (section 4).",
],
},
{
h2: "3. Hosting and server log files",
paragraphs: [
"This website is hosted by:",
`${ph("hosting provider: company, address, country")} (the “host”).`,
"When you call up this website, your browser automatically transmits data to the host's server, which is stored in what are known as server log files:",
"– IP address of the requesting device,",
"– date and time of access,",
"– page or file requested and volume of data transferred,",
"– HTTP status code,",
"– referrer URL (the page visited before, if your browser transmits it),",
"– browser type and version and operating system.",
"This data is not merged with other data sources and is not analysed in order to identify individuals.",
"Purpose: technical operation, stability and security of the website (e.g. defence against attacks, error analysis).",
"Legal basis: Art. 6 (1) (f) GDPR – legitimate interest in the secure and functional operation of the website.",
`Storage period: the log files are deleted after ${ph("number of days – ask the host; 7 to 14 days is usual")} days, unless a security-relevant incident requires longer retention.`,
"Recipients: the host processes this data on my behalf. A data processing agreement pursuant to Art. 28 GDPR is in place with the host.",
/* Wie im deutschen Original: eigener Absatz statt Platzhalter im Satz – sonst stünde
nach dem Launch-Flip eine unrichtige Pflichtangabe zur Drittlandübermittlung da. */
...(flags.hostOutsideEu
? [
`The host is based in ${ph("country")}. The transfer of personal data there is based on ${ph("the European Commission's adequacy decision on the EU-US Data Privacy Framework, under which the provider is certified (Art. 45 GDPR) / the European Commission's standard contractual clauses (Art. 46 (2) (c) GDPR)")}. I will provide a copy of the safeguards on request.`,
]
: []),
],
},
{
h2: "4. Contact by email or telephone",
paragraphs: [
`If you contact me by email (${site.email}) or by telephone (${site.phoneDisplay}), I process the data you provide (e.g. name, email address, telephone number, company, the content of your enquiry) in order to answer your enquiry and – if you wish – to prepare a quote or arrange an intro call.`,
"Legal basis: Art. 6 (1) (b) GDPR where your enquiry is aimed at entering into or performing a contract (coaching, assessment, training, keynote); otherwise Art. 6 (1) (f) GDPR – legitimate interest in answering enquiries.",
`Storage period: I delete your enquiry once it has been dealt with conclusively and no further communication is to be expected, and at the latest after ${ph("e.g. 12")} months. Where messages are subject to statutory retention obligations (business letters: 6 years; accounting records and invoices: 8 years under Section 147 AO and Section 257 HGB), they are deleted only after those periods have expired.`,
`Recipients: for email and calendar I use ${ph("email/office provider: company, address, country")}. A data processing agreement pursuant to Art. 28 GDPR is in place with that provider.`,
...(flags.hostOutsideEu
? [
`The provider is based in ${ph("country")}. The transfer of personal data there is based on ${ph("an adequacy decision or standard contractual clauses – as in section 3")}. I will provide a copy of the safeguards on request.`,
]
: []),
"Your data is not passed on to any other third parties.",
],
},
{
h2: "5. External links",
paragraphs: [
"This website contains links to external websites (e.g. LinkedIn, herCAREER). Simply clicking a link transmits no data from this website to the operator of the target page; from the moment you open the target page, only that provider's privacy policy applies. Social media plugins, share buttons and tracking pixels belonging to those providers are not embedded on this website.",
"LinkedIn is operated by LinkedIn Ireland Unlimited Company, Wilton Place, Dublin 2, Ireland. Privacy policy: https://www.linkedin.com/legal/privacy-policy",
],
},
{
h2: "6. Fonts",
paragraphs: [
"The fonts used on this website (Playfair Display, Source Sans 3, DM Mono) are stored locally on the web server and are delivered from there only. No connection is made to servers operated by Google (Google Fonts) or any other font provider; your IP address is therefore not transmitted to any third party.",
],
},
{
h2: "7. Encryption",
paragraphs: [
"This website uses TLS/SSL encryption (recognisable by “https://” and the padlock symbol in your browser's address bar). Data transferred between your browser and the server cannot therefore be read by third parties.",
],
},
{
h2: "8. Your rights as a data subject",
paragraphs: [
"You have the following rights in respect of the personal data concerning you:",
"– right of access (Art. 15 GDPR),",
"– right to rectification (Art. 16 GDPR),",
"– right to erasure (Art. 17 GDPR),",
"– right to restriction of processing (Art. 18 GDPR),",
"– right to data portability (Art. 20 GDPR),",
"– right to withdraw consent with effect for the future (Art. 7 (3) GDPR).",
],
},
{
h2: "Right to object (Art. 21 GDPR)",
paragraphs: [
"You have the right to object at any time, on grounds relating to your particular situation, to the processing of personal data concerning you which is carried out on the basis of Art. 6 (1) (f) GDPR. I will then no longer process that personal data unless I can demonstrate compelling legitimate grounds for the processing which override your interests, rights and freedoms, or the processing serves to establish, exercise or defend legal claims.",
`An informal email to ${site.email} is enough to exercise your rights.`,
],
},
{
h2: "Right to lodge a complaint with a supervisory authority (Art. 77 GDPR)",
paragraphs: [
"Without prejudice to any other remedy, you have the right to lodge a complaint with a data protection supervisory authority, in particular in the Member State of your residence, place of work or the place of the alleged infringement. The authority responsible for me is:",
ph("supervisory authority of the federal state in which Anelia Wolf is based – name, address, website"),
"An overview of all German state authorities: https://www.bfdi.bund.de/DE/Service/Anschriften/Laender/Laender-node.html",
],
},
{
h2: "9. Obligation to provide data, automated decision-making",
paragraphs: [
"You are under no statutory or contractual obligation to provide your personal data. Without your contact details, however, I cannot answer an enquiry. Automated decision-making, including profiling (Art. 22 GDPR), does not take place.",
],
},
{
h2: "10. Changes to this privacy notice",
paragraphs: [
"I update this privacy notice whenever the website or the legal situation changes – for example if a server-side contact form, a newsletter, online appointment booking or embedded video is introduced. The version published on this page at the time applies.",
],
},
],
};
export const legalPagesEn = { impressum: impressumEn, datenschutz: datenschutzEn } as const;
/* Derselbe Build-Guard wie in der deutschen Fassung – sonst ginge die englische Seite
mit „[…]“ live, während die deutsche geprüft wurde. */
assertNoPlaceholders(
"src/content/en/legal.ts",
Object.values(legalPagesEn).flatMap((page) => [
page.h1,
page.stand,
...page.sections.flatMap((section) => [
section.h2,
...section.paragraphs.filter((paragraph): paragraph is string => typeof paragraph === "string"),
]),
]),
);
+20
View File
@@ -0,0 +1,20 @@
/**
* English copy of the 404 page.
*
* Hinweis für später: Ein statischer Export kennt nur EINE 404-Datei. Sie liegt
* deutsch unter `out/404.html`. Diese englische Fassung wird erst gebraucht, wenn
* der Hoster für `/en/*` eine eigene Fehlerseite ausliefern kann.
*/
import { routesByLang } from "@/lib/i18n";
import type { NotFoundContent } from "@/content/not-found";
export const notFoundEn: NotFoundContent = {
meta: {
title: "Page not found",
description: "This page does not exist – or does not exist any more.",
},
markTitle: "Anelia Wolf – monogram",
h1: { before: "This trail ends ", em: "here", after: "." },
text: "The page you are looking for does not exist – or does not exist any more. Perhaps there is a typo, perhaps the link is out of date.",
link: { label: "Back to the start page", href: routesByLang.en.home },
};
+154
View File
@@ -0,0 +1,154 @@
/**
* English copy of /en/services/trainings/. Same shape as src/content/trainings.ts.
* The B2B nouns stay concrete – this page has to read like an offer, not a brochure.
*/
import { mailto } from "@/lib/site";
import { assertNoPlaceholders, collectStrings, ph } from "@/lib/legal";
import type { TrainingsContent } from "@/content/trainings";
export const trainingsEn: TrainingsContent = {
meta: {
title: "Training & Workshops",
description:
"B2B sales training and leadership workshops that hold up in the working week, not just in the seminar room. In house, online, in German or English. Anelia Wolf, trainer.",
},
numeral: "02",
masthead: {
role: "Keynote Speaker · Trainer · Coach",
center: "Training & Workshops",
lang: "German & English",
},
eyebrow: "For companies & teams",
h1: { before: "Sales with ", em: "personality", after: "." },
subline:
"B2B sales training and leadership workshops that hold up in the working week, not just in the seminar room. In house, online, in German or English.",
cta: { label: "Request training", href: mailto.training, micro: "No obligation" },
facts: [
{ label: "Format", value: "In house or online" },
{ label: "Length", value: "1–2 days or a series" },
{ label: "Language", value: "German / English" },
{ label: "Group size", value: ph("Platzhalter"), placeholder: true },
],
folio: { next: { label: "Three brakes", href: "#ausgangslage" } },
situations: {
id: "ausgangslage",
eyebrow: "Starting point",
h2: { before: "Three brakes.", em: "", after: "" },
rows: [
{ numeral: "01", text: "New business has stalled – and nobody enjoys calling cold." },
{ numeral: "02", text: "Existing customers are looked after, but never grown." },
{ numeral: "03", text: "Leadership and team dynamics slow sales down instead of carrying it." },
],
},
modules: {
id: "module",
eyebrow: "What you get",
h2: { before: "Three modules.", em: "", after: "" },
items: [
{
title: "B2B sales training",
goal: "Conversations that end in a decision.",
contents: ["Needs analysis", "Objections", "Talking price", "Behaviour types in the customer conversation"],
audience: "Field sales, inside sales, key account",
meta: "1–2 days in house · DE/EN",
},
{
title: "Growth: new business & key accounts",
goal: "Cold outreach that becomes predictable; accounts that grow.",
contents: ["An outreach routine", "First contact", "Following up", "Growing the account", "The numbers"],
audience: "Sales teams and the people leading them",
meta: `Training series ${ph("Platzhalter")} · DE/EN`,
},
{
title: "Leadership & team dynamics",
goal: "Leadership that makes sales teams stronger.",
contents: ["Behaviour profiles in the team", "Roles", "Feedback", "Conflict", "Setting targets"],
audience: "Sales leadership, team leads, management",
meta: "One-day workshop · on site · DE/EN",
},
],
},
how: {
id: "arbeitsweise",
eyebrow: "How I work",
paragraphs: [
"Practice, not slides: I am in B2B field sales myself. Whatever we train, I did the week before.",
"Assessment as the foundation: behaviour profiles show how a team ticks – and how it speaks to customers.",
"Transfer, not seminar: every training ends with concrete commitments for the next 30 days.",
],
},
goals: {
id: "ziele",
eyebrow: "Typical goals",
rows: [
{ text: "More qualified first conversations" },
{ text: "Key accounts grown systematically" },
{ text: "Clearer leadership inside the sales team" },
],
},
rahmen: {
id: "rahmen",
eyebrow: "Practicalities",
rows: [
{ label: "Format", value: "In-house workshop 1–2 days / training series / online" },
{ label: "Language", value: "DE/EN" },
{ label: "Group size", value: ph("Platzhalter"), placeholder: true },
{ label: "Preparation", value: "Scoping call, behaviour assessments optional" },
],
},
ablauf: {
id: "ablauf",
eyebrow: "How it runs",
steps: [
{ numeral: "01", title: "Scoping call", text: "" },
{ numeral: "02", title: "Concept", text: "" },
{ numeral: "03", title: "Training", text: "" },
{ numeral: "04", title: "Follow-up after 30 days", text: "" },
],
marginalia: {
title: "What you take away",
items: [
{ value: "A concept on one page" },
{ value: "Commitments for 30 days" },
{ value: "A follow-up conversation" },
],
},
},
faq: {
id: "faq",
eyebrow: "FAQ",
items: [
{
q: "In house or external?",
a: "In house at your company, or online. An external venue is possible on request.",
},
{
q: "How many participants?",
a: "We agree the group size in the scoping call – small enough that everyone gets to speak.",
},
{
q: "Also for leaders without a sales role?",
a: "Yes. The Leadership & team dynamics module is aimed at sales leadership, team leads and management – a sales role of your own is not a requirement.",
},
{
q: "What does a training day cost?",
a: "On request. After the scoping call you get a quote for the format, length and group size.",
},
],
},
band: {
h2: { before: "Let's talk about your team.", em: "", after: "" },
cta: { label: "Request training", href: mailto.training },
micro: "No obligation",
},
};
assertNoPlaceholders("src/content/en/trainings.ts", collectStrings(trainingsEn));