Lumeo

Consent Banner

GDPR-ready cookie / tracking consent primitive. Persists per-category choices in localStorage and exposes them via ConsentService for gating third-party scripts.

Installation

dotnet add package Lumeo

One-time app setup (AddLumeo(), CSS & JS) is covered in the installation guide.

Usage

@using Lumeo

<ConsentBanner />

When to use

  • Any site that loads analytics (Google Analytics, Cloudflare Web Analytics, Plausible, Umami) in the EU / UK / CA.
  • Any site that embeds third-party scripts users should opt into (YouTube embeds, Intercom, Hotjar).
  • SaaS apps that want to give end users a "Manage cookie preferences" link in the footer.

Analytics consent right now: denied.

The banner in the docs site already ran once (accepted/declined at first visit). Click below to re-open its preferences dialog — it's the same API a consumer would wire to a footer link.

No live preview here — the banner can only show once per browser. Copy the code into your own MainLayout.razor to see it slide in.

Drop the banner into your root layout. Default categories are `necessary` (locked) + `analytics`.

Consent preferences
Pick which categories you're okay with. You can change this later.
Strictly necessaryRequired

Session, theme preference, routing — required for the site to work.

Analytics

Cloudflare Web Analytics — anonymous aggregate page-view stats.

Marketing

Meta Pixel and LinkedIn Insight Tag for remarketing.

Third-party embeds

YouTube, Vimeo, Tweet embeds — set cookies when loaded.

Define your own buckets — one per third-party service you load.

Cookies & consent

We use a minimal set of cookies to run the site and optionally measure anonymous usage to improve it. You choose what's on.

Every string is a parameter. Pair with `ILumeoLocalizer` if you want them to follow the user's language.

API reference

Prop Type Default Description
CategoriesIReadOnlyList<ConsentCategory>[necessary, analytics]Buckets shown in the preferences dialog. Replace entirely to match your own site's third-party services.
PrivacyPolicyUrlstring?nullRendered as a link in the banner copy. Omit to hide the link.
Titlestring"Cookies & consent"Heading shown at the top of the banner.
Descriptionstringdefault blurbBody copy below the heading.
PrivacyPolicyLabelstring"Read the privacy policy"Link text for the privacy-policy anchor.
AcceptLabelstring"Accept all"Primary button label.
RejectLabelstring"Reject optional"Secondary button label. Rejection means every non-required category is stored as false.
CustomizeLabelstring"Customize"Opens the preferences dialog with per-category toggles.
PreferencesTitlestring"Consent preferences"Heading inside the preferences dialog.
PreferencesDescriptionstringdefaultBody copy inside the preferences dialog.
RequiredBadgestring"Required"Badge shown next to locked-on categories.
SaveLabel / CancelLabelstring"Save preferences" / "Cancel"Preferences dialog footer buttons.
AnimationClassstring"animate-slide-in-from-bottom"Tailwind animation class used for the banner entry.
Property Type Description
KeystringMachine-readable identifier (e.g. "analytics"). Used as the persistence key and the argument to ConsentService.HasConsent(key).
TitlestringShort label shown in the preferences dialog.
DescriptionstringOne-sentence explanation for the end user.
RequiredboolLocked-on toggle. Use for strictly-necessary cookies (session, theme preference).
Member Description
bool HasDecidedTrue once the user has answered the banner. While false, the banner shows.
bool HasConsent(string key)Did the user consent to this category? "necessary" always returns true; unknown keys return false.
Task EnsureLoadedAsync()Hydrate from localStorage. Called automatically by the banner on first render; safe to call yourself before the banner mounts.
Task AcceptAllAsync(IEnumerable<string>)Grant every non-necessary category. Persists to localStorage. Fires OnChange.
Task RejectAllAsync(IEnumerable<string>)Deny every non-necessary category. Persists and fires OnChange.
Task SetManyAsync(IReadOnlyDictionary<string, bool>)Commit a per-category map. Used by the preferences dialog's Save button.
Task ResetAsync()Clear the stored decision — banner re-appears on next render.
void RequestOpenPreferences()Ask any mounted <ConsentBanner> to pop its dialog. Wire a "Manage cookies" footer link to this.
event Action? OnChangeFires when any category value changes. Subscribe if you want to dynamically load / unload scripts.
event Action? OnRequestOpenPreferencesInternal coordination between RequestOpenPreferences and the banner.