feat(newsletter, checkout): add consent links, unify trust-note styling, optimize images

Every email-signup form (Home/newsletter Newsletter section, /newsletter
hero, /challenge, the Newsletter overlay) now links "Datenschutzerklärung"
to /datenschutz next to its consent checkbox, opened in a new tab so a
partially filled form isn't lost. Checkout gets an equivalent AGB +
Datenschutzerklärung note under the order button, and the Versand
modal's Widerrufsbelehrung link also opens in a new tab.

Unified the "Keine Werbung. Jederzeit abbestellbar." trust note (icon +
#888 copy) across all newsletter forms, matching /challenge's existing
style instead of each form having its own wording/color.

Also converted the remaining raw <img> tags in these files to next/image
per the no-img-element lint rule (bandwidth/LCP).
This commit is contained in:
Marco
2026-07-21 11:15:44 +00:00
parent a72aea1070
commit cc9da6ac6d
6 changed files with 159 additions and 30 deletions
+17 -4
View File
@@ -293,7 +293,9 @@ export function CheckoutContent({
<span className="flex-1 text-body-sm text-text-primary">{method.title}</span>
<span className="flex items-center gap-2 shrink-0">
{method.icons.map((icon, i) => (
<img key={i} alt="" src={icon} className="h-5 w-auto" />
<div key={i} className="relative h-5 w-8 shrink-0">
<Image src={icon} alt="" fill sizes="32px" className="object-contain" />
</div>
))}
</span>
</label>
@@ -307,8 +309,19 @@ export function CheckoutContent({
Jetzt kaufen (zahlungspflichtig)
</Link>
<p className="text-label text-text-muted text-center w-full">
Mit dem Kauf akzeptierst du unsere{" "}
<Link href="/agb" target="_blank" rel="noopener noreferrer" className="underline hover:text-brand">
AGB
</Link>{" "}
und die{" "}
<Link href="/datenschutz" target="_blank" rel="noopener noreferrer" className="underline hover:text-brand">
Datenschutzerklärung
</Link>.
</p>
<div className="flex gap-2 items-center justify-center w-full">
<img alt="" src="/icon-lock.svg" className="w-3.5 h-4" />
<Image alt="" src="/icon-lock.svg" width={14} height={16} className="w-3.5 h-4" />
<span className="text-body-sm text-text-muted">Sichere SSL-Verschlüsselung</span>
</div>
</Reveal>
@@ -398,7 +411,7 @@ export function CheckoutContent({
<div className="flex flex-col gap-4 items-start w-full">
{trustBadges.map((b) => (
<div key={b.id} className="flex gap-3 items-start w-full">
<img alt="" src={b.icon} className="size-5 shrink-0 object-contain mt-0.5" />
<Image alt="" src={b.icon} width={20} height={20} className="size-5 shrink-0 object-contain mt-0.5" />
<div className="flex-1 flex flex-col gap-0.5">
<p className="text-body-sm font-semibold text-text-primary">{b.title}</p>
<p className="text-label text-text-muted">{b.description}</p>
@@ -412,7 +425,7 @@ export function CheckoutContent({
which puts the divider under the icon — the two aren't meant
to be identical, see project notes on this pattern). */}
<div className="bg-bg-muted flex gap-5 items-start p-6 rounded-md w-full">
<img alt="" src="/icon-envelope-hint.png" className="h-8 w-10 shrink-0 object-contain" />
<Image alt="" src="/icon-envelope-hint.png" width={40} height={32} className="h-8 w-10 shrink-0 object-contain" />
<div className="flex flex-col gap-2 items-start flex-1 min-w-0 text-text-primary">
{/* Conditional on the (unchecked-by-default) consent
checkbox above, not stated as a given — a pre-ticked