- Customer accounts now require email verification (hashed, single-use, time-limited tokens) before they can request/confirm bookings, with resend flows on login/account/booking widget and rate limiting. - Admins get a private, rotatable iCalendar (ICS) subscription feed of their confirmed bookings and public events, timezone-correct for Europe/Berlin including DST, never exposing meeting passwords. - Adds a full SEO layer: per-page canonical/OG/Twitter metadata with CMS-editable overrides and content-derived fallbacks, a dynamic sitemap.xml and robots.txt driven by real published content, JSON-LD (Organization/LocalBusiness, WebSite, WebPage, BreadcrumbList, Service, Event, BlogPosting) that never fabricates data, and a CMS-managed redirect table for changed slugs. - Global ANOUMA-naming audit: the brand name is never used to label personal account/calendar areas anywhere in the app, CMS, or emails. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
90 lines
3.3 KiB
TypeScript
90 lines
3.3 KiB
TypeScript
import type { Metadata } from "next";
|
|
import { PageHeader } from "@/components/PageHeader";
|
|
import { Section } from "@/components/Section";
|
|
import { PlaceholderNote } from "@/components/PlaceholderNote";
|
|
import { getContactGlobal } from "@/lib/payload/globals";
|
|
import { getSiteUrl } from "@/lib/seo/config";
|
|
|
|
export const dynamic = "force-dynamic";
|
|
|
|
export async function generateMetadata(): Promise<Metadata> {
|
|
const siteUrl = await getSiteUrl();
|
|
return {
|
|
title: "Impressum",
|
|
description: "Impressum von Anouma gemäß § 5 TMG.",
|
|
// noindex, but still crawlable — legal boilerplate deliberately kept
|
|
// out of search results without cutting off the internal links on it.
|
|
robots: { index: false, follow: true },
|
|
alternates: { canonical: `${siteUrl}/impressum` },
|
|
};
|
|
}
|
|
|
|
export default async function ImpressumPage() {
|
|
const contact = await getContactGlobal();
|
|
return (
|
|
<>
|
|
<PageHeader title="Impressum" crumbs={[{ title: "Impressum" }]} />
|
|
<Section tone="plain">
|
|
<div className="mx-auto max-w-2xl space-y-8">
|
|
<PlaceholderNote>
|
|
Dieses Impressum enthält noch Platzhalterangaben. Bitte vor Veröffentlichung durch die
|
|
vollständigen, rechtsverbindlichen Angaben gemäß § 5 TMG ersetzen (und im Zweifel
|
|
rechtlich prüfen lassen).
|
|
</PlaceholderNote>
|
|
|
|
<div>
|
|
<h2 className="font-serif text-2xl font-medium text-anouma-plum">Angaben gemäß § 5 TMG</h2>
|
|
<p className="mt-4 leading-relaxed text-anouma-plum">
|
|
[Platzhalter — Vor- und Nachname]
|
|
<br />
|
|
[Platzhalter — Straße und Hausnummer]
|
|
<br />
|
|
[Platzhalter — PLZ und Ort]
|
|
</p>
|
|
</div>
|
|
|
|
<div>
|
|
<h2 className="font-serif text-2xl font-medium text-anouma-plum">Kontakt</h2>
|
|
<p className="mt-4 leading-relaxed text-anouma-plum">
|
|
{contact.phone && (
|
|
<>
|
|
Telefon: {contact.phone}
|
|
<br />
|
|
</>
|
|
)}
|
|
E-Mail: {contact.email}
|
|
</p>
|
|
</div>
|
|
|
|
<div>
|
|
<h2 className="font-serif text-2xl font-medium text-anouma-plum">
|
|
Umsatzsteuer-Identifikationsnummer
|
|
</h2>
|
|
<p className="mt-4 leading-relaxed text-anouma-plum">
|
|
[Platzhalter — sofern vorhanden, gemäß § 27 a Umsatzsteuergesetz]
|
|
</p>
|
|
</div>
|
|
|
|
<div>
|
|
<h2 className="font-serif text-2xl font-medium text-anouma-plum">
|
|
Verantwortlich für den Inhalt nach § 55 Abs. 2 RStV
|
|
</h2>
|
|
<p className="mt-4 leading-relaxed text-anouma-plum">
|
|
[Platzhalter — Vor- und Nachname, Anschrift wie oben]
|
|
</p>
|
|
</div>
|
|
|
|
<div>
|
|
<h2 className="font-serif text-2xl font-medium text-anouma-plum">Haftungshinweis</h2>
|
|
<p className="mt-4 leading-relaxed text-anouma-plum">
|
|
Trotz sorgfältiger inhaltlicher Kontrolle übernehmen wir keine Haftung für die Inhalte
|
|
externer Links. Für den Inhalt der verlinkten Seiten sind ausschließlich deren
|
|
Betreiber verantwortlich.
|
|
</p>
|
|
</div>
|
|
</div>
|
|
</Section>
|
|
</>
|
|
);
|
|
}
|