From 1b09059467353e0a46c5db6f88a58874cea1d313 Mon Sep 17 00:00:00 2001 From: Matt Date: Tue, 7 Apr 2026 21:11:47 -0400 Subject: [PATCH] feat: add cookie consent banner for GDPR compliance MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Slides up on first visit, remembers choice in localStorage. Accept → grants analytics_storage, Decline → keeps denied. Returning visitors get their previous choice restored silently. Co-Authored-By: Claude Opus 4.6 (1M context) --- src/app/(frontend)/[locale]/layout.tsx | 2 + src/components/analytics/CookieConsent.tsx | 79 ++++++++++++++++++++++ src/styles/globals.css | 5 ++ 3 files changed, 86 insertions(+) create mode 100644 src/components/analytics/CookieConsent.tsx diff --git a/src/app/(frontend)/[locale]/layout.tsx b/src/app/(frontend)/[locale]/layout.tsx index 50c53f4..54dc8db 100644 --- a/src/app/(frontend)/[locale]/layout.tsx +++ b/src/app/(frontend)/[locale]/layout.tsx @@ -7,6 +7,7 @@ import { routing } from '@/i18n/routing' import Nav from '@/components/layout/Nav' import Footer from '@/components/layout/Footer' import GoogleAnalytics from '@/components/analytics/GoogleAnalytics' +import CookieConsent from '@/components/analytics/CookieConsent' import '@/styles/globals.css' const BASE_URL = 'https://letsbe.biz' @@ -107,6 +108,7 @@ export default async function LocaleLayout({ children, params }: Props) {