Kontaktformular verschickt wirklich
Abschnitt 06 uebergab die Eingaben bisher dem Mailprogramm der Besucherin. Jetzt geht der Inhalt per fetch an /api/contact beim Hoster; von dort stellt der Dienst site-mail die Nachricht ueber das Postfach info@anelia-wolf.com (Strato) zu - kein Formulardienst eines Dritten. Faellt der Endpunkt aus, bietet das Formular weiterhin den mailto-Weg an, damit keine Anfrage verloren geht. Ein unsichtbares Honeypot-Feld haelt automatisierte Sendungen ab. Die Datenschutzerklaerung zieht mit: neue Ziffer 5 (Kontaktformular) in beiden Sprachen, Ziffer 2 nennt jetzt drei statt zwei Verarbeitungsfaelle, die Folgeziffern sind neu durchnummeriert. README und HANDOVER beschreiben den Weg ebenfalls. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
@@ -31,7 +31,10 @@ Diese Regeln sind nicht kosmetisch – die Datenschutzerklärung sagt sie zu:
|
|||||||
`next/font` zur Build-Zeit selbst gehostet.
|
`next/font` zur Build-Zeit selbst gehostet.
|
||||||
- **kein Storage**: kein localStorage, kein sessionStorage, keine Cookies –
|
- **kein Storage**: kein localStorage, kein sessionStorage, keine Cookies –
|
||||||
deshalb auch kein Cookie-Banner.
|
deshalb auch kein Cookie-Banner.
|
||||||
- **kein Kontaktformular**, kein Newsletter. Kontakt läuft über `mailto:` und Telefon.
|
- **Kontaktformular mit Serverversand**, kein Newsletter. Abschnitt 06 sendet an
|
||||||
|
`/api/contact` beim Hoster, der die Nachricht über das Postfach
|
||||||
|
`info@anelia-wolf.com` zustellt (kein Formulardienst eines Dritten). Alle
|
||||||
|
übrigen Kontaktwege laufen weiter über `mailto:` und Telefon.
|
||||||
|
|
||||||
Wer eine dieser Zusagen ändert, muss `src/content/legal.ts` (Ziffer 2, 3 und 6)
|
Wer eine dieser Zusagen ändert, muss `src/content/legal.ts` (Ziffer 2, 3 und 6)
|
||||||
mit ändern.
|
mit ändern.
|
||||||
|
|||||||
@@ -50,9 +50,12 @@ Datenschutzerklärung sagt sie ausdrücklich zu:
|
|||||||
(`out/_next/static/media/*.woff2`).
|
(`out/_next/static/media/*.woff2`).
|
||||||
- **kein Storage**: kein localStorage, kein sessionStorage, keine Cookies.
|
- **kein Storage**: kein localStorage, kein sessionStorage, keine Cookies.
|
||||||
Deshalb ist auch kein Cookie-Banner nötig und keiner eingebaut.
|
Deshalb ist auch kein Cookie-Banner nötig und keiner eingebaut.
|
||||||
- **kein Server hinter dem Kontaktformular**, kein Newsletter. Das Formular in
|
- **Kontaktformular mit Serverversand**, kein Newsletter. Das Formular in
|
||||||
Abschnitt 06 setzt aus den Eingaben eine `mailto:`-Nachricht zusammen und
|
Abschnitt 06 schickt seine Eingaben per `fetch` an `/api/contact`. Diesen
|
||||||
übergibt sie dem E-Mail-Programm der Besucherin – es sendet selbst nichts.
|
Endpunkt bedient der Hoster (Dienst `site-mail`); er stellt die Nachricht per
|
||||||
|
SMTP über das Postfach `info@anelia-wolf.com` zu und legt nichts ab. Ist der
|
||||||
|
Dienst nicht erreichbar, bietet das Formular den alten `mailto:`-Weg an.
|
||||||
|
Beschrieben in Ziffer 5 der Datenschutzerklärung.
|
||||||
|
|
||||||
> Wer eine dieser Zusagen ändert (z. B. ein Analytics-Tool einbaut), **muss**
|
> Wer eine dieser Zusagen ändert (z. B. ein Analytics-Tool einbaut), **muss**
|
||||||
> `src/content/legal.ts` (Ziffer 2, 3 und 6 der Datenschutzerklärung) mit ändern
|
> `src/content/legal.ts` (Ziffer 2, 3 und 6 der Datenschutzerklärung) mit ändern
|
||||||
|
|||||||
@@ -10,18 +10,24 @@ import { TextLink } from "@/components/ui/TextLink";
|
|||||||
/**
|
/**
|
||||||
* Kontaktformular der Startseite (Sektion 06).
|
* Kontaktformular der Startseite (Sektion 06).
|
||||||
*
|
*
|
||||||
* **Es gibt keinen Server.** Die Website ist ein statischer Export und sagt in der
|
* Die Website ist ein statischer Export, hat also selbst keinen Server. Das
|
||||||
* Datenschutzerklärung zu, dass sie keine Drittanbieter einbindet und keine Daten
|
* Formular schickt seine Eingaben deshalb an `/api/contact` – einen kleinen
|
||||||
* überträgt. Ein Formular, das irgendwohin „postet“, würde dieses Versprechen brechen
|
* Dienst beim Hoster, der die Nachricht über das Postfach von Anelia Wolf
|
||||||
* (und einen Auftragsverarbeitungsvertrag nötig machen). Deshalb baut das Formular aus
|
* (Strato) zustellt. Es ist kein Formulardienst eines Dritten im Spiel: die
|
||||||
* den Eingaben eine fertige E-Mail und übergibt sie dem Mailprogramm der Besucherin.
|
* Daten gehen an den Hoster (Auftragsverarbeiter) und von dort ins eigene
|
||||||
* Die Daten verlassen den Rechner erst, wenn sie dort auf „Senden“ drückt.
|
* Postfach. Genau so steht es in `src/content/legal.ts`, Ziffern 2 und 4 –
|
||||||
|
* ändert sich der Weg, muss der Text mitwandern.
|
||||||
*
|
*
|
||||||
* Soll später doch ein echtes Formular her (Eingaben landen direkt im Postfach, ohne
|
* Klappt der Versand nicht (Dienst offline, kein Netz), bleibt die Nachricht im
|
||||||
* Mailprogramm), braucht es einen Endpunkt beim Hoster oder einen Formulardienst. Dann
|
* Formular stehen und es erscheint ein Link, der sie ins eigene Mailprogramm
|
||||||
* sind zwei Dinge Pflicht: ein Auftragsverarbeitungsvertrag und ein neuer Absatz in
|
* übergibt. Eine Anfrage soll nicht daran scheitern, dass ein Server hustet.
|
||||||
* `src/content/legal.ts`. Der Umbau beträfe nur `submit()` hier in dieser Datei.
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
/** Endpunkt beim Hoster – gleiche Domain, deshalb ohne CORS-Vorspiel. */
|
||||||
|
const ENDPOINT = "/api/contact";
|
||||||
|
|
||||||
|
type Status = "idle" | "sending" | "sent" | "error";
|
||||||
|
|
||||||
export function ContactForm({
|
export function ContactForm({
|
||||||
className,
|
className,
|
||||||
content: form = contactDe.form,
|
content: form = contactDe.form,
|
||||||
@@ -34,34 +40,68 @@ export function ContactForm({
|
|||||||
content?: HomeContent["contact"]["form"];
|
content?: HomeContent["contact"]["form"];
|
||||||
}) {
|
}) {
|
||||||
const uid = useId();
|
const uid = useId();
|
||||||
const [sent, setSent] = useState(false);
|
const [status, setStatus] = useState<Status>("idle");
|
||||||
|
const [mailtoHref, setMailtoHref] = useState("");
|
||||||
|
|
||||||
const field = (name: string) => `${uid}-${name}`;
|
const field = (name: string) => `${uid}-${name}`;
|
||||||
|
|
||||||
const submit = (event: FormEvent<HTMLFormElement>) => {
|
const submit = async (event: FormEvent<HTMLFormElement>) => {
|
||||||
event.preventDefault();
|
event.preventDefault();
|
||||||
const data = new FormData(event.currentTarget);
|
if (status === "sending") return;
|
||||||
|
|
||||||
|
const formEl = event.currentTarget;
|
||||||
|
const data = new FormData(formEl);
|
||||||
const value = (key: string) => String(data.get(key) ?? "").trim();
|
const value = (key: string) => String(data.get(key) ?? "").trim();
|
||||||
|
|
||||||
|
const payload = {
|
||||||
|
name: value("name"),
|
||||||
|
email: value("email"),
|
||||||
|
company: value("company"),
|
||||||
|
message: value("message"),
|
||||||
|
page: typeof window === "undefined" ? "" : window.location.pathname,
|
||||||
|
// Honeypot: Menschen sehen das Feld nicht, Bots füllen es aus.
|
||||||
|
website: value("website"),
|
||||||
|
};
|
||||||
|
|
||||||
|
setStatus("sending");
|
||||||
|
try {
|
||||||
|
const response = await fetch(ENDPOINT, {
|
||||||
|
method: "POST",
|
||||||
|
headers: { "Content-Type": "application/json" },
|
||||||
|
body: JSON.stringify(payload),
|
||||||
|
});
|
||||||
|
if (!response.ok) throw new Error(`HTTP ${response.status}`);
|
||||||
|
formEl.reset();
|
||||||
|
setStatus("sent");
|
||||||
|
} catch {
|
||||||
|
// Rückfallweg: dieselbe Nachricht ans eigene Mailprogramm übergeben.
|
||||||
const body = [
|
const body = [
|
||||||
`${form.fields.name}: ${value("name")}`,
|
`${form.fields.name}: ${payload.name}`,
|
||||||
`${form.fields.email}: ${value("email")}`,
|
`${form.fields.email}: ${payload.email}`,
|
||||||
value("company") ? `${form.fields.company}: ${value("company")}` : null,
|
payload.company ? `${form.fields.company}: ${payload.company}` : null,
|
||||||
"",
|
"",
|
||||||
value("message"),
|
payload.message,
|
||||||
]
|
]
|
||||||
.filter((line) => line !== null)
|
.filter((line) => line !== null)
|
||||||
.join("\r\n");
|
.join("\r\n");
|
||||||
|
setMailtoHref(
|
||||||
const url = `mailto:${site.email}?subject=${encodeURIComponent(form.subject)}&body=${encodeURIComponent(body)}`;
|
`mailto:${site.email}?subject=${encodeURIComponent(form.subject)}&body=${encodeURIComponent(body)}`,
|
||||||
setSent(true);
|
);
|
||||||
window.location.href = url;
|
setStatus("error");
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
const label = "mb-2 block font-mono text-[11px] uppercase tracking-[0.16em] text-fg-muted";
|
const label = "mb-2 block font-mono text-[11px] uppercase tracking-[0.16em] text-fg-muted";
|
||||||
const input =
|
const input =
|
||||||
"w-full border-0 border-b border-line bg-transparent pb-3 font-sans text-[1.0625rem] text-fg outline-none transition-colors duration-300 placeholder:text-transparent focus:border-accent";
|
"w-full border-0 border-b border-line bg-transparent pb-3 font-sans text-[1.0625rem] text-fg outline-none transition-colors duration-300 placeholder:text-transparent focus:border-accent";
|
||||||
|
|
||||||
|
const note = {
|
||||||
|
idle: form.note,
|
||||||
|
sending: form.sending,
|
||||||
|
sent: form.sent,
|
||||||
|
error: form.error,
|
||||||
|
}[status];
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<form onSubmit={submit} noValidate={false} className={cn("flex flex-col gap-8", className)}>
|
<form onSubmit={submit} noValidate={false} className={cn("flex flex-col gap-8", className)}>
|
||||||
<div className="grid grid-cols-1 gap-8 sm:grid-cols-2">
|
<div className="grid grid-cols-1 gap-8 sm:grid-cols-2">
|
||||||
@@ -93,13 +133,34 @@ export function ContactForm({
|
|||||||
<textarea id={field("message")} name="message" required rows={5} className={cn(input, "resize-y")} />
|
<textarea id={field("message")} name="message" required rows={5} className={cn(input, "resize-y")} />
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
{/* Honeypot – für Menschen unsichtbar und nicht fokussierbar, deshalb
|
||||||
|
aria-hidden und tabIndex -1. Ausgefüllt = automatisierter Versand. */}
|
||||||
|
<div className="absolute left-[-9999px] top-auto h-px w-px overflow-hidden" aria-hidden="true">
|
||||||
|
<label htmlFor={field("website")}>Website</label>
|
||||||
|
<input id={field("website")} name="website" type="text" tabIndex={-1} autoComplete="off" />
|
||||||
|
</div>
|
||||||
|
|
||||||
<div className="flex flex-col gap-4">
|
<div className="flex flex-col gap-4">
|
||||||
<button type="submit" className={cn(BUTTON_BASE, BUTTON_PRIMARY, "self-start")} aria-describedby={field("note")}>
|
<button
|
||||||
<span className="relative z-10">{form.submit}</span>
|
type="submit"
|
||||||
|
disabled={status === "sending"}
|
||||||
|
className={cn(BUTTON_BASE, BUTTON_PRIMARY, "self-start disabled:opacity-60")}
|
||||||
|
aria-describedby={field("note")}
|
||||||
|
>
|
||||||
|
<span className="relative z-10">{status === "sending" ? form.submitBusy : form.submit}</span>
|
||||||
</button>
|
</button>
|
||||||
<p id={field("note")} className="max-w-[52ch] font-mono text-[11px] leading-relaxed tracking-[0.04em] text-fg-muted">
|
<p
|
||||||
{sent ? form.opened : form.note}{" "}
|
id={field("note")}
|
||||||
|
role={status === "sent" || status === "error" ? "status" : undefined}
|
||||||
|
aria-live="polite"
|
||||||
|
className="max-w-[52ch] font-mono text-[11px] leading-relaxed tracking-[0.04em] text-fg-muted"
|
||||||
|
>
|
||||||
|
{note}{" "}
|
||||||
|
{status === "error" && mailtoHref ? (
|
||||||
|
<TextLink href={mailtoHref} label={form.errorLink} className="!text-[11px] !tracking-[0.1em]" />
|
||||||
|
) : (
|
||||||
<TextLink href={privacyHref} label={form.privacy} className="!text-[11px] !tracking-[0.1em]" />
|
<TextLink href={privacyHref} label={form.privacy} className="!text-[11px] !tracking-[0.1em]" />
|
||||||
|
)}
|
||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
</form>
|
</form>
|
||||||
|
|||||||
@@ -222,8 +222,12 @@ export const homeEn: HomeContent = {
|
|||||||
},
|
},
|
||||||
submit: "Send enquiry",
|
submit: "Send enquiry",
|
||||||
subject: "Enquiry via anelia-wolf.com",
|
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.",
|
note: "Your message goes straight to my inbox. No form service, nothing 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.",
|
submitBusy: "Sending …",
|
||||||
|
sending: "Sending your message …",
|
||||||
|
sent: "Thank you – your message has arrived. I will come back to you shortly.",
|
||||||
|
error: "That did not work just now. Please send it to me by email instead:",
|
||||||
|
errorLink: "Open email",
|
||||||
privacy: "Privacy",
|
privacy: "Privacy",
|
||||||
},
|
},
|
||||||
links: {
|
links: {
|
||||||
|
|||||||
@@ -160,10 +160,10 @@ export const datenschutzEn: LegalPage = {
|
|||||||
"– sets no cookies and stores no information on your device (no local storage, no session storage),",
|
"– 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),",
|
"– 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),",
|
"– 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,",
|
"– sends the contact form via the hosting provider's server directly to my email inbox (section 5); no third-party form service is involved,",
|
||||||
"– contains no newsletter.",
|
"– 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.",
|
"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).",
|
"Personal data is processed in three cases only: when the pages are technically retrieved (server log files, section 3), when you contact me by email or telephone (section 4) and when you submit the contact form (section 5).",
|
||||||
],
|
],
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@@ -208,26 +208,38 @@ export const datenschutzEn: LegalPage = {
|
|||||||
],
|
],
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
h2: "5. External links",
|
h2: "5. Contact form",
|
||||||
|
paragraphs: [
|
||||||
|
"When you submit the contact form on the home page, the data you enter (name, email address, optionally your company and the content of your message) is transmitted in encrypted form to the hosting provider's server (section 3) and delivered from there as an email to my inbox. The email also records the time of sending and the page from which the form was submitted. No third-party form service is involved, and no cookies are set.",
|
||||||
|
"Purpose: receiving and answering your enquiry.",
|
||||||
|
"Legal basis: Art. 6 (1) (b) GDPR where your enquiry is aimed at entering into or performing a contract; otherwise Art. 6 (1) (f) GDPR – legitimate interest in answering enquiries.",
|
||||||
|
"Storage period: the hosting provider's server does not store the form data permanently; it delivers it immediately as an email. The periods set out in section 4 then apply to that email.",
|
||||||
|
"Recipients: the hosting provider (section 3) and my email provider (section 4), each as a processor pursuant to Art. 28 GDPR. Your data is not passed on to any other third parties.",
|
||||||
|
"To guard against automated messages the form contains a field that is invisible to you and is filled in only by programmes; in addition the server limits the number of submissions per IP address within a short period. Your IP address is processed in memory only for that purpose, is not stored and is not included in the email.",
|
||||||
|
"Providing your data is voluntary. Without your name, email address and message I cannot answer your enquiry; you are welcome to reach me directly by email or telephone instead (section 4).",
|
||||||
|
],
|
||||||
|
},
|
||||||
|
{
|
||||||
|
h2: "6. External links",
|
||||||
paragraphs: [
|
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.",
|
"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",
|
"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",
|
h2: "7. Fonts",
|
||||||
paragraphs: [
|
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.",
|
"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",
|
h2: "8. Encryption",
|
||||||
paragraphs: [
|
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.",
|
"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",
|
h2: "9. Your rights as a data subject",
|
||||||
paragraphs: [
|
paragraphs: [
|
||||||
"You have the following rights in respect of the personal data concerning you:",
|
"You have the following rights in respect of the personal data concerning you:",
|
||||||
"– right of access (Art. 15 GDPR),",
|
"– right of access (Art. 15 GDPR),",
|
||||||
@@ -254,15 +266,15 @@ export const datenschutzEn: LegalPage = {
|
|||||||
],
|
],
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
h2: "9. Obligation to provide data, automated decision-making",
|
h2: "10. Obligation to provide data, automated decision-making",
|
||||||
paragraphs: [
|
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.",
|
"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",
|
h2: "11. Changes to this privacy notice",
|
||||||
paragraphs: [
|
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.",
|
"I update this privacy notice whenever the website or the legal situation changes – for example if a newsletter, online appointment booking or embedded video is introduced. The version published on this page at the time applies.",
|
||||||
],
|
],
|
||||||
},
|
},
|
||||||
],
|
],
|
||||||
|
|||||||
@@ -291,9 +291,14 @@ export const contact = {
|
|||||||
message: "Deine Nachricht",
|
message: "Deine Nachricht",
|
||||||
},
|
},
|
||||||
submit: "Anfrage senden",
|
submit: "Anfrage senden",
|
||||||
|
/** Nur noch für den Rückfallweg: Betreff der Mail, wenn der Versand scheitert. */
|
||||||
subject: "Anfrage über anelia-wolf.com",
|
subject: "Anfrage über anelia-wolf.com",
|
||||||
note: "Beim Absenden öffnet sich dein E-Mail-Programm mit der fertigen Nachricht. Es werden keine Daten an Dritte übertragen.",
|
note: "Deine Nachricht geht direkt in mein Postfach. Kein Formulardienst, keine Weitergabe an Dritte.",
|
||||||
opened: "Dein E-Mail-Programm sollte sich geöffnet haben. Falls nicht, schreib mir direkt an die Adresse rechts.",
|
submitBusy: "Wird gesendet …",
|
||||||
|
sending: "Deine Nachricht wird gesendet …",
|
||||||
|
sent: "Danke – deine Nachricht ist angekommen. Ich melde mich zeitnah bei dir.",
|
||||||
|
error: "Das hat gerade nicht geklappt. Schick sie mir bitte direkt per E-Mail:",
|
||||||
|
errorLink: "E-Mail öffnen",
|
||||||
privacy: "Datenschutz",
|
privacy: "Datenschutz",
|
||||||
},
|
},
|
||||||
/** Drei große Links – von <ContactLinks/> gerendert. */
|
/** Drei große Links – von <ContactLinks/> gerendert. */
|
||||||
|
|||||||
@@ -165,10 +165,10 @@ export const datenschutz: LegalPage = {
|
|||||||
"– setzt keine Cookies und speichert keine Informationen in Ihrem Endgerät (kein Local Storage, kein Session Storage),",
|
"– setzt keine Cookies und speichert keine Informationen in Ihrem Endgerät (kein Local Storage, kein Session Storage),",
|
||||||
"– verwendet keine Analyse-, Tracking- oder Marketing-Dienste (kein Google Analytics, keine Pixel, kein Fingerprinting),",
|
"– verwendet keine Analyse-, Tracking- oder Marketing-Dienste (kein Google Analytics, keine Pixel, kein Fingerprinting),",
|
||||||
"– bindet keine Inhalte von Drittanbietern ein (keine externen Schriftarten, keine Videos, keine Karten, keine Social-Media-Plugins),",
|
"– bindet keine Inhalte von Drittanbietern ein (keine externen Schriftarten, keine Videos, keine Karten, keine Social-Media-Plugins),",
|
||||||
"– verschickt das Kontaktformular nicht selbst: Es setzt aus Ihren Eingaben eine E-Mail zusammen und übergibt sie Ihrem eigenen E-Mail-Programm. Solange Sie die Nachricht dort nicht absenden, werden keine Daten an mich oder an Dritte übertragen,",
|
"– verschickt das Kontaktformular über den Server des Hosters unmittelbar an mein E-Mail-Postfach (Ziffer 5); ein Formularanbieter eines Dritten ist nicht eingebunden,",
|
||||||
"– enthält keinen Newsletter.",
|
"– enthält keinen Newsletter.",
|
||||||
"Alle Schriftarten, Skripte und Bilder werden vom Server des unten genannten Hosting-Anbieters ausgeliefert. Ein Cookie-Banner ist deshalb nicht erforderlich.",
|
"Alle Schriftarten, Skripte und Bilder werden vom Server des unten genannten Hosting-Anbieters ausgeliefert. Ein Cookie-Banner ist deshalb nicht erforderlich.",
|
||||||
"Personenbezogene Daten werden nur in zwei Fällen verarbeitet: beim technischen Abruf der Seiten (Server-Logfiles, Ziffer 3) und wenn Sie mich per E-Mail oder Telefon kontaktieren (Ziffer 4).",
|
"Personenbezogene Daten werden nur in drei Fällen verarbeitet: beim technischen Abruf der Seiten (Server-Logfiles, Ziffer 3), wenn Sie mich per E-Mail oder Telefon kontaktieren (Ziffer 4) und wenn Sie das Kontaktformular absenden (Ziffer 5).",
|
||||||
],
|
],
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@@ -216,26 +216,38 @@ export const datenschutz: LegalPage = {
|
|||||||
],
|
],
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
h2: "5. Externe Links",
|
h2: "5. Kontaktformular",
|
||||||
|
paragraphs: [
|
||||||
|
"Wenn Sie das Kontaktformular auf der Startseite absenden, werden die von Ihnen eingegebenen Daten (Name, E-Mail-Adresse, freiwillig Ihre Firma sowie der Inhalt Ihrer Nachricht) verschlüsselt an den Server des Hosters (Ziffer 3) übertragen und von dort als E-Mail an mein Postfach zugestellt. In der E-Mail werden zusätzlich der Zeitpunkt des Absendens und die Unterseite vermerkt, von der aus Sie das Formular abgeschickt haben. Ein Formularanbieter eines Dritten ist nicht eingebunden; Cookies werden dabei nicht gesetzt.",
|
||||||
|
"Zweck: Entgegennahme und Beantwortung Ihrer Anfrage.",
|
||||||
|
"Rechtsgrundlage: Art. 6 Abs. 1 lit. b DSGVO, soweit Ihre Anfrage auf den Abschluss oder die Durchführung eines Vertrags gerichtet ist; im Übrigen Art. 6 Abs. 1 lit. f DSGVO – berechtigtes Interesse an der Beantwortung von Anfragen.",
|
||||||
|
"Speicherdauer: Der Server des Hosters legt die Formulardaten nicht dauerhaft ab, sondern stellt sie unmittelbar als E-Mail zu. Für diese E-Mail gelten anschließend dieselben Fristen wie in Ziffer 4.",
|
||||||
|
"Empfänger: der Hoster (Ziffer 3) und mein E-Mail-Anbieter (Ziffer 4), jeweils als Auftragsverarbeiter nach Art. 28 DSGVO. Eine Weitergabe an sonstige Dritte erfolgt nicht.",
|
||||||
|
"Zum Schutz vor automatisiert versendeten Nachrichten enthält das Formular ein für Sie unsichtbares Feld, das nur von Programmen ausgefüllt wird; außerdem begrenzt der Server die Zahl der Sendungen je IP-Adresse innerhalb kurzer Zeit. Ihre IP-Adresse wird dafür nur flüchtig im Arbeitsspeicher verarbeitet, nicht gespeichert und nicht in die E-Mail übernommen.",
|
||||||
|
"Die Angabe Ihrer Daten ist freiwillig. Ohne Name, E-Mail-Adresse und Nachricht kann ich Ihre Anfrage jedoch nicht beantworten; Sie können mich stattdessen jederzeit direkt per E-Mail oder Telefon erreichen (Ziffer 4).",
|
||||||
|
],
|
||||||
|
},
|
||||||
|
{
|
||||||
|
h2: "6. Externe Links",
|
||||||
paragraphs: [
|
paragraphs: [
|
||||||
"Diese Website enthält Links zu externen Websites (z. B. LinkedIn, herCAREER). Beim bloßen Anklicken eines Links werden von dieser Website keine Daten an den Betreiber der Zielseite übertragen; ab dem Aufruf der Zielseite gelten ausschließlich die Datenschutzbestimmungen des jeweiligen Anbieters. Social-Media-Plugins, Share-Buttons oder Tracking-Pixel dieser Anbieter sind auf dieser Website nicht eingebunden.",
|
"Diese Website enthält Links zu externen Websites (z. B. LinkedIn, herCAREER). Beim bloßen Anklicken eines Links werden von dieser Website keine Daten an den Betreiber der Zielseite übertragen; ab dem Aufruf der Zielseite gelten ausschließlich die Datenschutzbestimmungen des jeweiligen Anbieters. Social-Media-Plugins, Share-Buttons oder Tracking-Pixel dieser Anbieter sind auf dieser Website nicht eingebunden.",
|
||||||
"LinkedIn wird betrieben von der LinkedIn Ireland Unlimited Company, Wilton Place, Dublin 2, Irland. Datenschutzerklärung: https://www.linkedin.com/legal/privacy-policy",
|
"LinkedIn wird betrieben von der LinkedIn Ireland Unlimited Company, Wilton Place, Dublin 2, Irland. Datenschutzerklärung: https://www.linkedin.com/legal/privacy-policy",
|
||||||
],
|
],
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
h2: "6. Schriftarten",
|
h2: "7. Schriftarten",
|
||||||
paragraphs: [
|
paragraphs: [
|
||||||
"Die auf dieser Website verwendeten Schriftarten (Playfair Display, Source Sans 3, DM Mono) sind lokal auf dem Webserver gespeichert und werden ausschließlich von dort ausgeliefert. Es findet keine Verbindung zu Servern von Google (Google Fonts) oder anderen Schriftanbietern statt; Ihre IP-Adresse wird dadurch nicht an Dritte übermittelt.",
|
"Die auf dieser Website verwendeten Schriftarten (Playfair Display, Source Sans 3, DM Mono) sind lokal auf dem Webserver gespeichert und werden ausschließlich von dort ausgeliefert. Es findet keine Verbindung zu Servern von Google (Google Fonts) oder anderen Schriftanbietern statt; Ihre IP-Adresse wird dadurch nicht an Dritte übermittelt.",
|
||||||
],
|
],
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
h2: "7. Verschlüsselung",
|
h2: "8. Verschlüsselung",
|
||||||
paragraphs: [
|
paragraphs: [
|
||||||
"Diese Website nutzt eine TLS-/SSL-Verschlüsselung (erkennbar an „https://“ und dem Schloss-Symbol in der Adresszeile Ihres Browsers). Daten, die zwischen Ihrem Browser und dem Server übertragen werden, können dadurch nicht von Dritten mitgelesen werden.",
|
"Diese Website nutzt eine TLS-/SSL-Verschlüsselung (erkennbar an „https://“ und dem Schloss-Symbol in der Adresszeile Ihres Browsers). Daten, die zwischen Ihrem Browser und dem Server übertragen werden, können dadurch nicht von Dritten mitgelesen werden.",
|
||||||
],
|
],
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
h2: "8. Ihre Rechte als betroffene Person",
|
h2: "9. Ihre Rechte als betroffene Person",
|
||||||
paragraphs: [
|
paragraphs: [
|
||||||
"Sie haben mir gegenüber folgende Rechte hinsichtlich der Sie betreffenden personenbezogenen Daten:",
|
"Sie haben mir gegenüber folgende Rechte hinsichtlich der Sie betreffenden personenbezogenen Daten:",
|
||||||
"– Recht auf Auskunft (Art. 15 DSGVO),",
|
"– Recht auf Auskunft (Art. 15 DSGVO),",
|
||||||
@@ -262,15 +274,15 @@ export const datenschutz: LegalPage = {
|
|||||||
],
|
],
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
h2: "9. Pflicht zur Bereitstellung, automatisierte Entscheidungen",
|
h2: "10. Pflicht zur Bereitstellung, automatisierte Entscheidungen",
|
||||||
paragraphs: [
|
paragraphs: [
|
||||||
"Die Bereitstellung Ihrer personenbezogenen Daten ist weder gesetzlich noch vertraglich vorgeschrieben. Ohne Ihre Kontaktdaten kann ich eine Anfrage jedoch nicht beantworten. Eine automatisierte Entscheidungsfindung einschließlich Profiling (Art. 22 DSGVO) findet nicht statt.",
|
"Die Bereitstellung Ihrer personenbezogenen Daten ist weder gesetzlich noch vertraglich vorgeschrieben. Ohne Ihre Kontaktdaten kann ich eine Anfrage jedoch nicht beantworten. Eine automatisierte Entscheidungsfindung einschließlich Profiling (Art. 22 DSGVO) findet nicht statt.",
|
||||||
],
|
],
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
h2: "10. Änderungen dieser Datenschutzerklärung",
|
h2: "11. Änderungen dieser Datenschutzerklärung",
|
||||||
paragraphs: [
|
paragraphs: [
|
||||||
"Ich passe diese Datenschutzerklärung an, sobald sich die Website oder die Rechtslage ändert – etwa bei Einführung eines Kontaktformulars, eines Newsletters, einer Online-Terminbuchung oder von Video-Einbettungen. Es gilt die jeweils auf dieser Seite veröffentlichte Fassung.",
|
"Ich passe diese Datenschutzerklärung an, sobald sich die Website oder die Rechtslage ändert – etwa bei Einführung eines Newsletters, einer Online-Terminbuchung oder von Video-Einbettungen. Es gilt die jeweils auf dieser Seite veröffentlichte Fassung.",
|
||||||
],
|
],
|
||||||
},
|
},
|
||||||
],
|
],
|
||||||
|
|||||||
Reference in New Issue
Block a user