Add legal pages, ToS acceptance, and alpha banner

- Journal: Impressum (§5 TMG), Terms of Service, GDPR privacy page
- Registration flow: required ToS checkbox, termsAcceptedAt persisted
- Alpha banner on Journal (always visible); alpha badge on Planner hero
- Footer with legal links + GitHub on both apps
- Reduce PII: sendDefaultPii=false, Sentry init only after login (Journal)
- Drop Sentry from Planner (no login, no consent possible)
- Drop localStorage caching from i18n client detection
- Sync SSR i18n resources each request so locale edits HMR without restart

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
Ullrich Schäfer 2026-04-18 00:08:48 +02:00
parent 6c1cd23358
commit cc0f44258a
No known key found for this signature in database
GPG key ID: A32FF691A0F752D9
24 changed files with 773 additions and 206 deletions

View file

@ -0,0 +1,10 @@
import { useTranslation } from "react-i18next";
export function AlphaBanner() {
const { t } = useTranslation("journal");
return (
<div className="bg-amber-50 border-b border-amber-200 px-4 py-2 text-sm text-amber-900">
<p>{t("alpha.message")}</p>
</div>
);
}

View file

@ -0,0 +1,33 @@
import { useTranslation } from "react-i18next";
export function Footer() {
const { t } = useTranslation("journal");
return (
<footer className="mt-16 border-t border-gray-200 bg-white">
<div className="mx-auto max-w-7xl px-4 py-6 text-sm text-gray-500">
<nav className="flex flex-wrap items-center gap-x-6 gap-y-2">
<a href="/legal/imprint" className="hover:text-gray-700">
{t("footer.imprint")}
</a>
<a href="/legal/privacy" className="hover:text-gray-700">
{t("footer.privacy")}
</a>
<a href="/legal/terms" className="hover:text-gray-700">
{t("footer.terms")}
</a>
<a
href="https://github.com/trails-cool/trails"
className="hover:text-gray-700"
target="_blank"
rel="noopener noreferrer"
>
{t("footer.source")}
</a>
<span className="ml-auto text-xs text-gray-400">
{t("footer.alpha")}
</span>
</nav>
</div>
</footer>
);
}