Implements the EU-compliant cookie consent banner with: - modal + banner variants, CNIL equal-prominence Reject/Accept buttons - granular category toggles (essential non-toggleable) - __consent_state cookie management (SameSite=Lax, Secure, 1-yr, _v:1) - render-prop overrides: renderHeader, renderCategoryRow, renderActions - useConsent() integration when ConsentProvider is present - CookieConsentBannerLoader SSR-safe wrapper - RTL behavioral tests: Reject All, Save Selected, ESC=Reject, focus-trap - Storybook stories for modal, banner, render-prop, and a11y tab demo - jsdom configured with HTTPS origin for Secure cookie testing Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
27 lines
659 B
TypeScript
27 lines
659 B
TypeScript
"use client";
|
|
|
|
import { useState, useEffect, type ComponentPropsWithoutRef } from "react";
|
|
import { CookieConsentBanner } from "./cookie-consent-banner";
|
|
|
|
export type CookieConsentBannerLoaderProps = ComponentPropsWithoutRef<
|
|
typeof CookieConsentBanner
|
|
>;
|
|
|
|
/**
|
|
* SSR-safe wrapper that renders null on the server and mounts
|
|
* <CookieConsentBanner> client-side only (after hydration).
|
|
*/
|
|
export function CookieConsentBannerLoader(
|
|
props: CookieConsentBannerLoaderProps,
|
|
) {
|
|
const [mounted, setMounted] = useState(false);
|
|
|
|
useEffect(() => {
|
|
setMounted(true);
|
|
}, []);
|
|
|
|
if (!mounted) return null;
|
|
|
|
return <CookieConsentBanner {...props} />;
|
|
}
|