- 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>
33 lines
1.1 KiB
TypeScript
33 lines
1.1 KiB
TypeScript
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>
|
|
);
|
|
}
|