Add mobile swipe gallery, shared ProductCard, dynamic Datenschutz address, GSC verification

- ProductGallery: touch swipe (left/right) now navigates slides on mobile,
  previously click-only.
- New shared ProductCard component used by ProductGrid/RelatedProducts/
  MerklisteGrid — product title is now the card's link (replaces the
  separate "Mehr erfahren" line), consistent aspect ratio across all
  three grids, more compact cards.
- Datenschutz: name/address/email now come from company-settings via a
  new VerantwortlicherBlock, same single-source pattern as Impressum's
  AnbieterAngaben — no more hand-typed address to keep in sync.
- layout.tsx: render googleSearchConsoleVerification via Next's native
  verification.google metadata field.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
Marco
2026-08-02 05:38:55 +00:00
parent 23f8efcc2b
commit 9617478b0d
10 changed files with 283 additions and 265 deletions
+5
View File
@@ -1133,6 +1133,7 @@ export type SeoSettings = {
titleTemplate: string | null;
defaultDescription: string | null;
defaultOgImage: string | null;
googleSearchConsoleVerification: string | null;
};
// Fallback matches the values hardcoded in app/layout.tsx before this field
@@ -1145,6 +1146,7 @@ const SEO_SETTINGS_FALLBACK: SeoSettings = {
defaultDescription:
"Kleine Impulse, praktische Werkzeuge und ehrliche Gedanken für mehr Klarheit im Alltag weil du auch noch ein Leben hast.",
defaultOgImage: "/og-image.png",
googleSearchConsoleVerification: null,
};
// Same ISR-cached, public-catalog-freshness fetch as getKleinunternehmer()
@@ -1166,6 +1168,7 @@ export async function getSeoSettings(): Promise<SeoSettings> {
seoTitleTemplate?: string | null;
seoDefaultDescription?: string | null;
seoDefaultOgImage?: { url?: string } | number | null;
googleSearchConsoleVerification?: string | null;
}[];
} = await res.json();
const doc = data.docs?.[0];
@@ -1176,6 +1179,8 @@ export async function getSeoSettings(): Promise<SeoSettings> {
defaultDescription: doc.seoDefaultDescription || SEO_SETTINGS_FALLBACK.defaultDescription,
defaultOgImage:
(typeof doc.seoDefaultOgImage === "object" && doc.seoDefaultOgImage?.url) || SEO_SETTINGS_FALLBACK.defaultOgImage,
googleSearchConsoleVerification:
doc.googleSearchConsoleVerification || SEO_SETTINGS_FALLBACK.googleSearchConsoleVerification,
};
}