Skip to content
  • No data uploaded
  • Instant results

Tailwind CSS Cookie Consent Banner for React — Glassmorphism

A production-ready glassmorphism cookie consent banner: a GDPR-style cookie banner with equally prominent “Accept all” and “Reject all”, granular analytics/marketing toggles (off by default), stored consent and Google Consent Mode v2 signals. Pick your brand color, toggle dark mode and corner radius — the live preview and the React code update instantly in your browser.

Live component editor

Library
Framework
Style
Theme
Corner radius
Live preview
import { useState } from 'react';

const CONSENT_KEY = 'cookie-consent-v1'; // bump the version to re-ask after policy changes

function readConsent() {
  try {
    return JSON.parse(localStorage.getItem(CONSENT_KEY));
  } catch {
    return null; // storage blocked / SSR → treat as "not decided"
  }
}

function saveConsent(choice) {
  const record = { necessary: true, ...choice, timestamp: new Date().toISOString() };
  try {
    localStorage.setItem(CONSENT_KEY, JSON.stringify(record));
  } catch {}
  // Google Consent Mode v2: only grant what the user chose.
  window.gtag?.('consent', 'update', {
    analytics_storage: choice.analytics ? 'granted' : 'denied',
    ad_storage: choice.marketing ? 'granted' : 'denied',
    ad_user_data: choice.marketing ? 'granted' : 'denied',
    ad_personalization: choice.marketing ? 'granted' : 'denied'
  });
  // Load optional scripts by listening for this event.
  document.dispatchEvent(new CustomEvent('cookie-consent', { detail: record }));
}

function acceptAll() {
  saveConsent({ analytics: true, marketing: true });
}

function rejectAll() {
  saveConsent({ analytics: false, marketing: false });
}

function savePreferences() {
  saveConsent({
    analytics: Boolean(document.getElementById('cc-analytics')?.checked),
    marketing: Boolean(document.getElementById('cc-marketing')?.checked)
  });
}

export default function CookieConsent() {
  const [banner, setBanner] = useState(() => !readConsent());
  const [prefs, setPrefs] = useState(false);

  return (
    <div>
      <div hidden={!banner}>
        <div className="fixed inset-x-0 bottom-0 z-50 p-4" role="region" aria-label="Cookie consent">
          <div className="max-w-4xl mx-auto p-6 bg-white/60 backdrop-blur-xl border border-white/60 shadow-2xl rounded-xl">
            <h2 className="text-lg font-semibold text-slate-900">We value your privacy</h2>
            <p className="mt-2 text-sm text-slate-500">We use essential cookies to run this site. With your permission we also use analytics and marketing cookies. You can change your choice at any time. <a href="#" className="font-medium text-[#4f46e5] hover:underline">Cookie policy</a></p>
            <div hidden={!prefs}>
              <div className="mt-4 flex flex-col gap-3">
                <label className="flex items-start gap-3 text-sm text-slate-700">
                  <input type="checkbox" className="h-4 w-4 accent-[#4f46e5] mt-1" defaultChecked disabled />
                  <span><strong>Strictly necessary</strong> — security, load balancing, your consent choice. Always on.</span>
                </label>
                <label className="flex items-start gap-3 text-sm text-slate-700">
                  <input id="cc-analytics" type="checkbox" className="h-4 w-4 accent-[#4f46e5] mt-1" />
                  <span><strong>Analytics</strong> — anonymous usage statistics that help us improve.</span>
                </label>
                <label className="flex items-start gap-3 text-sm text-slate-700">
                  <input id="cc-marketing" type="checkbox" className="h-4 w-4 accent-[#4f46e5] mt-1" />
                  <span><strong>Marketing</strong> — personalised ads and campaign measurement.</span>
                </label>
              </div>
            </div>
            <div className="mt-5 flex flex-wrap items-center gap-2">
              <button type="button" className="inline-flex items-center justify-center px-4 py-2.5 text-sm font-semibold rounded-lg bg-[#4f46e5] hover:bg-[#433cc3] text-white shadow-sm transition-colors focus:outline-none focus:ring-2 focus:ring-[#4f46e5] focus:ring-offset-2 focus:ring-offset-white" onClick={(e) => { rejectAll(e); setBanner(false); }}>Reject all</button>
              <button type="button" className="inline-flex items-center justify-center px-4 py-2.5 text-sm font-semibold rounded-lg bg-[#4f46e5] hover:bg-[#433cc3] text-white shadow-sm transition-colors focus:outline-none focus:ring-2 focus:ring-[#4f46e5] focus:ring-offset-2 focus:ring-offset-white" onClick={(e) => { acceptAll(e); setBanner(false); }}>Accept all</button>
              <button type="button" className="inline-flex items-center justify-center px-3 py-2 text-sm font-semibold rounded-lg transition-colors text-slate-700 hover:bg-slate-900/5" onClick={() => setPrefs((v) => !v)} aria-expanded={prefs}>Customize</button>
              <div hidden={!prefs}>
                <button type="button" className="inline-flex items-center justify-center px-4 py-2.5 text-sm font-semibold rounded-lg border transition-colors border-white/80 bg-white/40 text-slate-800 hover:bg-white/70 focus:outline-none focus:ring-2 focus:ring-[#4f46e5] focus:ring-offset-2 focus:ring-offset-white" onClick={(e) => { savePreferences(e); setBanner(false); }}>Save preferences</button>
              </div>
            </div>
          </div>
        </div>
      </div>
      <div hidden={banner}>
        <button type="button" className="fixed bottom-0 left-0 m-4 inline-flex items-center justify-center px-4 py-2.5 text-sm font-semibold rounded-lg border transition-colors border-white/80 bg-white/40 text-slate-800 hover:bg-white/70 focus:outline-none focus:ring-2 focus:ring-[#4f46e5] focus:ring-offset-2 focus:ring-offset-white" onClick={() => setBanner(true)}>Cookie settings</button>
      </div>
    </div>
  );
}
All components →

Free Tailwind CSS Cookie Consent Banner for React — Glassmorphism by pGento

Install Tailwind CSS for React

Create a React project with Vite, then add Tailwind CSS v3:

npm create vite@latest my-app -- --template react
cd my-app
npm install
npm install -D tailwindcss@3 postcss autoprefixer
npx tailwindcss init -p

Set content: ['./index.html', './src/**/*.{js,jsx}'] in tailwind.config.js, and add to src/index.css:

@tailwind base;
@tailwind components;
@tailwind utilities;

The brand color is applied with arbitrary values such as bg-[#4f46e5], so no theme configuration is needed.

Use the cookie consent banner in React

// App.jsx
import CookieConsent from './CookieConsent';

export default function App() {
  return <CookieConsent />;
}

Making the banner actually compliant

  • Block before consent: load analytics/marketing tags only after the cookie-consent event reports the matching category (or set Google Consent Mode v2 defaults to denied before tags load).
  • Equal choice: keep “Reject all” on the first layer with the same visual weight as “Accept all”.
  • Withdrawal: keep the “Cookie settings” button (or a footer link) available on every page.
  • Record: the stored choice includes a timestamp; bump CONSENT_KEY when your purposes change to re-ask.

This is an implementation pattern, not legal advice — have your privacy counsel review the wording and categories for your jurisdictions.

Accessibility & customization

The banner is a labelled region (role="region" with aria-label) rather than a blocking modal, preference toggles are native checkboxes with labels, and the always-available “Cookie settings” button lets keyboard users reopen it.

Every color, radius and dark-mode choice is baked into plain utility classes, so the copied code has no runtime dependency on this site. The glass style relies on backdrop-filter, supported in all current browsers; place it over a colorful background for the best effect.

Compatibility

ItemDetails
CSS frameworkTailwind CSS v3.4+
LibraryReact 18+ (function component)
Interactive statebanner, prefs
Dark modeYes — toggle in the editor
StyleGlassmorphism (backdrop blur)

Frequently asked questions

How do I install this Tailwind cookie consent banner in React?
Create a React project, install Tailwind CSS as shown in the installation section, then paste the generated code.
Can I change the color of the cookie consent banner?
Yes. Use the brand color picker or type any hex code — the preview and code update instantly, and the color is written directly into the classes you copy.
Does the cookie consent banner support dark mode?
Yes. Toggle “Dark mode” in the editor to generate a dark palette version of the same component.
Is the cookie consent banner accessible?
The banner is a labelled region (role="region" with aria-label) rather than a blocking modal, preference toggles are native checkboxes with labels, and the always-available “Cookie settings” button lets keyboard users reopen it.
Is this component free for commercial use?
Yes. The generated code is yours to use in personal and commercial projects without attribution.
Tailwind CSS Cookie Consent Banner for React — Glassmorphism

Embed this tool on your site

Paste this code into any web page. It stays free, fast and ad-free inside your site.

Print or save as PDF

Prints just this tool and its result. Choose “Save as PDF” as the printer to get a file. Branding is stored only in this browser.