Offentlig dokumentation af webkomponenterne consent-dialog, consent-guard, consent-missing og consent-validator.
Hovedkomponenten for PrivacyKit-samtykke UI og orkestrering.
| Attribut | Type | Standard / Påkrævet | Beskrivelse |
|---|---|---|---|
| variant | standard | panel | modern | modest | standard | Visuel variant af dialogen. |
| theme | standard | dark | teal | slate | light | vibrant | high-contrast | standard | Visuelt tema for dialogen. |
| expires-days | number | 180 | Levetid for cookien (dage). |
| version | number | 0 | Version af samtykkeskemaet til re-samtykke. |
| google-consent-mode | boolean | unset | Udsender Google Consent Mode v2-samtykkesignaler baseret på den besøgendes PrivacyKit-samtykkevalg. |
| locale | da | de | en | es | fi | fr | it | nl | no | pl | sv | fra browser | Tving en bestemt locale. |
| hide-summary-part-2 | boolean | unset | Skjuler dialogens opsummering del 2 (dialog-summary-part-2). |
| hide-necessary | boolean | unset | Skjuler kategorien Nødvendig. |
| hide-preferences | boolean | unset | Skjul kategorien Præferencer. |
| hide-analytics | boolean | unset | Skjul kategorien Analyse. |
| hide-marketing | boolean | unset | Skjul kategorien Markedsføring. |
| hide-readmore | boolean | unset | Skjuler den udvidelige "Læs mere"-sektion. |
| hide-privacykit-badge | boolean | unset | Skjuler PrivacyKit-mærket, der vises nederst i samtykkedialogboksens indhold. |
| hide-privacy-policy-link | boolean | unset | Skjuler standardlinket til privatlivspolitikken fuldstændigt. Brug `privacy-policy-url` i stedet for at holde linket synligt og omdirigere brugerne til din egen privatlivspolitikside. |
| privacy-policy-url | string | unset | URL som brugerne omdirigeres til, når de klikker på privatlivspolitiklinket. Når angivet, åbner linket denne URL i stedet for den indbyggede privatlivsdialog. |
| demo | boolean | unset | Demo-tilstand: deaktiverer automatisk åbning og begrænser funktioner. Ikke GDPR-kompatibel. |
| dismissible | boolean | false | Bestemmer om dialogen kan lukkes via backdrop/Escape, hvis der ikke er taget stilling. |
| show-fab | boolean | false | Aktiverer knappen til samtykkeindstillinger. Har ingen synlig effekt før en samtykkecookie findes. |
| fab-position | left | right | left | Fastgør knappen nederst til venstre eller nederst til højre i viewporten. |
| dialog-position | left | right | left | Styrer hvilken side af skærmen dialogen vises på. Gælder kun for varianterne modern og modest — standard og panel er altid centrerede. |
Eksempel
<consent-dialog theme="panel" variant="dark" expires-days="90"
version="1" locale="da" hide-marketing hide-privacy-policy-link dismissible>
</consent-dialog>Design tokens eksponerer stabile CSS-variabler til farver, spacing, typografi m.m., uden at du rører implementationen. Indbyggede temaer er drevet af det samme token-system, så du kan overskrive enkelte stilarter eller skabe et helt tilpasset udtryk.
| Design tokens | Beskrivelse |
|---|---|
| --pk-transparency | Gennemsigtighed for dialogfladen og dens indlejrede kort/akkordeoner, angivet i procent. 0 % (standard) er helt solid; værdien begrænses til maks. 50 %. |
| --pk-bg-color | Baggrundsflade for hele dialogskallet. Blandes med --pk-transparency for at give den endelige farve. |
| --pk-paper-color | Papirflade til kort, akkordeoner og paneler inde i dialogen. Blandes også med --pk-transparency. |
| --pk-text-color | Basisfarve til overskrifter og tekst. |
| --pk-text-color-on-primary | Tekstfarve, der bruges på elementer udfyldt med primærfarven, f.eks. solide knapper. |
| --pk-primary-color | Primær accent til CTA'er, fokus og links. |
| --pk-secondary-color | Sekundær accent, især til switches. |
| --pk-focus-ring-color | Farve på fokusomrids (outline) ved tastaturfokus. |
| --pk-font-family | Skrifttype for al tekst; falder tilbage til body-font. |
| --pk-spacing-unit | Afstandsenhed der styrer padding og gap. |
| --pk-control-border-color | Kantfarve til kontroller inde i dialogen — kort, akkordeoner, knapper og lignende elementer. |
| --pk-control-border-width | Kantbredde til kontroller inde i dialogen — kort, akkordeoner, knapper og lignende elementer. |
| --pk-control-border-radius | Hjørneradius for knapper, inputfelter og interaktive kontroller. |
| --pk-dialog-border-color | Kantfarve til selve dialogens ramme — konturen af det ydre panel og skillelinjerne i header/footer. |
| --pk-dialog-border-width | Kantbredde til selve dialogens ramme — konturen af det ydre panel og skillelinjerne i header/footer. |
| --pk-dialog-border-radius | Hjørneradius for den ydre beholder til samtykkedialogen. |
| --pk-dialog-max-height | Maksimal højde på samtykkedialogen; når indholdet overstiger denne grænse, ruller dialogens brødtekst. |
| --pk-dialog-shadow | Skyggeeffekt for samtykkedialogen. |
Eksempel
<consent-dialog theme="light" style="
--pk-bg-color: #faf7f2;
--pk-paper-color: #f7eede;
--pk-primary-color: #b08968;
--pk-font-family: 'Segoe UI', Tahoma, sans-serif;
--pk-control-border-radius: 10px;
--pk-dialog-border-radius: 20px;
--pk-dialog-max-height: 50vh;
--pk-dialog-shadow: 10px 20px rgba(0, 0, 0, 0.5);
">
</consent-dialog>Indsæt brugerdefineret indhold i specifikke dele af en komponent ved hjælp af navngivne HTML-slots — så får du fuld kontrol over indhold og styling uden at ændre selve komponenten.
| Slotnavn | Beskrivelse |
|---|---|
| dialog-logo-top | Valgfrit logo eller brandingbillede vist i overskriften på samtykkedialogboksen. |
| dialog-logo-right | Valgfrit logo eller brandingbillede vist øverst til højre i samtykkedialogboksen. |
| dialog-title | Erstatter titlen i dialogens header. |
| dialog-summary-part-1 | Tilføjer brugerdefineret tekst til det første introafsnit under dialogtitlen. |
| dialog-summary-part-2 | Tilføjer brugerdefineret tekst til det andet introafsnit, der forklarer samtykkevalg. |
| necessary-content | Erstatter beskrivelsen i kategorien Nødvendig. |
| preferences-content | Eget indhold i accordionen Præferencer. |
| analytics-content | Eget indhold i accordionen Analyse. |
| marketing-content | Eget indhold i accordionen Markedsføring. |
| read-more-title | Angiver titlen for sektionen "Læs mere". |
| read-more-content | Indhold, der vises når "Læs mere" åbnes. |
| privacy-policy-content | Erstatter standardteksten for privatlivspolitikken. Brug kun tekst godkendt af jeres egen juridiske rådgiver, da PrivacyKit ikke kan bekræfte GDPR-overholdelse efter tilpasning. |
Eksempel
<consent-dialog theme="standard" variant="standard" locale="da" version="1">
<img slot="dialog-logo-top" width="100px" src="/logo.png" alt="Virksomhedslogo" />
<div slot="dialog-title" class="din-klasse">
<h2>Vi bruger cookies</h2>
</div>
<span slot="marketing-content">
<b>Vi indsamler i øjeblikket ikke cookies til markedsføring.</b>
</span>
</consent-dialog>
PrivacyKit anvender automatisk en passende privatlivsprofil baseret på den besøgendes registrerede placering. Der kræves ingen yderligere konfiguration.
Besøgende, der befinder sig i Europa, præsenteres for GDPR/ePrivacy-samtykkemodellen. Analyse-, markedsførings- og andre ikke-væsentlige teknologier forbliver blokeret, indtil den besøgende har givet samtykke.
Besøgende uden for Europa præsenteres for CPRA-privatlivsmodellen. Samtykke gives automatisk, hvilket gør det muligt for webstedet at fungere uden en indledende samtykkedialog. Besøgende kan til enhver tid åbne PrivacyKit-dialogen for at gennemgå eller trække deres privatlivsvalg tilbage. Hvis samtykket trækkes tilbage, beder PrivacyKit om en sideopdatering for at sikre, at blokerede teknologier ikke længere køres.
PrivacyKit bestemmer automatisk, om den besøgende befinder sig i Europa. Der kræves ingen konfiguration.
<consent-dialog> leveres med indbyggede oversættelser til engelsk, norsk, tysk, polsk, spansk, fransk, italiensk, hollandsk, svensk, dansk og finsk — ingen oversættelsesfiler, du selv skal indlæse eller vedligeholde.
Som standard læser dialogboksen den besøgendes browsersprog og viser automatisk den tilsvarende oversættelse. Hvis browseren er indstillet til et sprog, PrivacyKit ikke understøtter, falder den tilbage til engelsk.
For at gennemtvinge et bestemt sprog uanset den besøgendes browserindstillinger skal du angive attributten locale — se tabellen ovenfor for den fulde liste over understøttede koder.
<consent-dialog locale="da"></consent-dialog>Når google-consent-mode er aktiveret, læser PrivacyKit den besøgendes samtykkevalg og signalerer dem til Google Tag Manager eller gtag ved hjælp af Google Consent Mode v2-protokollen. Dette sker automatisk ved sideindlæsning og hver gang den besøgende ændrer sit samtykke. Der kræves ingen yderligere konfiguration ud over at tilføje attributten.
PrivacyKit mapper sine tre samtykkekategorier til Googles syv Consent Mode v2-felter:
| GCM v2-felt | Mappet fra | Værdi |
|---|---|---|
| analytics_storage | Analyse | granted / denied |
| ad_storage | Marketing | granted / denied |
| ad_user_data | Marketing | granted / denied |
| ad_personalization | Marketing | granted / denied |
| functionality_storage | Præferencer | granted / denied |
| personalization_storage | Præferencer | granted / denied |
| security_storage | — | Always granted |
security_storage er altid granted, da det dækker sikkerhedskritisk browserlagring og ikke er underlagt valgfrit sporingssamtykke.
Når siden indlæses, sørger PrivacyKit for, at window.dataLayer og en gtag-funktion findes, med Googles standardsnippet, og bevarer dem, der allerede er på siden. Den sætter en standardværdi, hvor alt er afvist, i kø, derefter den besøgendes nuværende samtykke, og sætter en opdatering i kø ved hver ændring af samtykket:
gtag('consent', 'update', {
analytics_storage: 'granted' | 'denied',
ad_storage: 'granted' | 'denied',
ad_user_data: 'granted' | 'denied',
ad_personalization: 'granted' | 'denied',
functionality_storage: 'granted' | 'denied',
personalization_storage: 'granted' | 'denied',
security_storage: 'granted'
});dataLayer er en kø i sidens hukommelse; intet gemmes. Google Tag Manager og gtag.js behandler kommandoerne i køen i rækkefølge, når de indlæses, så samtykkestatussen gælder, før nogen Google-tag kører, også når Google indlæses senere.
Hvis din side har sit eget Google-snippet, skal det bevare en eksisterende dataLayer (window.dataLayer = window.dataLayer || [], som Googles snippets gør).
Fejlfindingstip: PrivacyKit logger sin Google Consent Mode v2-aktivitet til browserkonsollen, så du kan verificere adfærden direkte i DevTools:
[PrivacyKit] Google Consent Mode v2 enabled.
Vises én gang, når siden indlæses, hvis google-consent-mode er sat. Samtidig sættes standardværdien, hvor alt er afvist, i kø.
[PrivacyKit] Google Consent Mode v2 update queued.
En samtykkeopdatering blev sat i kø i dataLayer, når siden indlæses og ved hver ændring af samtykket. Google anvender den, når tags indlæses.
openConsentDialog(): void
onConsentDialogClosed(callback: () => void): () => void
openPrivacyPolicyDialog(): voidRenderer sit indhold, når det angivne samtykkeudtryk evalueres til sand.
| Attribut | Type | Standard / Påkrævet | Beskrivelse |
|---|---|---|---|
| consent | string | unset | Samtykkeudtryk, der skal være sandt før rendering. |
| source | string | unset | Hvor samtykket læses fra. Når den ikke er angivet, bruger guarden samtykke fra PrivacyKits samtykkedialog. "google-consent-mode" læser det samtykke, dit eksisterende samtykkebanner har indsamlet, via Google Consent Mode v2. Ukendte værdier holder guarden blokeret. |
| Udtryk | Påkrævet samtykke | Beskrivelse |
|---|---|---|
| Alle kategorier | Hvis consent-attributten udelades, skal alle kategorier accepteres, for at guard'en aktiveres. | |
| necessary | Ingen | Forhindrer falske positive resultater i Consent Validator for nødvendige ressourcer, der ikke automatisk genkendes af PrivacyKit. |
| preferences | Præferencer | |
| analytics | Analyse | |
| marketing | Marketing | |
| preferences+analytics | Præferencer OG Analyse | Til scripts, der kræver begge slags samtykke, f.eks. HubSpot-sporing. |
| preferences|analytics | Præferencer ELLER Analyse | Til containere, der tjekker samtykke pr. tag, f.eks. Google Tag Manager. |
| preferences+marketing | Præferencer OG Marketing | Til scripts, der kræver begge slags samtykke, f.eks. HubSpot-sporing. |
| preferences|marketing | Præferencer ELLER Marketing | Til containere, der tjekker samtykke pr. tag, f.eks. Google Tag Manager. |
| analytics+marketing | Analyse OG Marketing | Til scripts, der kræver begge slags samtykke, f.eks. HubSpot-sporing. |
| analytics|marketing | Analyse ELLER Marketing | Til containere, der tjekker samtykke pr. tag, f.eks. Google Tag Manager. |
Eksempel 1 – Beskyt scripts
<consent-guard consent="analytics">
<script type="text/plain" data-src="https://static.hotjar.com/c/hotjar-XXXXXXX.js?sv=6" data-async></script>
</consent-guard>
Eksempel 2 – Beskyt indlejret indhold
<consent-guard consent="analytics+marketing">
<iframe
title="YouTube video"
data-src="https://www.youtube.com/embed/abc123"
width="560"
height="315"
frameborder="0"
allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture"
allowfullscreen>
</iframe>
</consent-guard>
Vigtigt: Bemærk, at håndterede ressourcer i eksemplerne bruger data-src i stedet for src og type="text/plain" bruges for scripts. PrivacyKit aktiverer håndteret indhold, efter at samtykke er givet — ellers kan ressourcer indlæses med det samme og fremstå som hardkodet i Consent Validator.
En guard kan håndhæve det samtykke, dit eksisterende banner indsamler. Tilføj source="google-consent-mode" til <consent-guard>, så læser guarden samtykket fra dit banner i stedet for fra PrivacyKits samtykkedialog. Scripts og indlejret indhold i guarden indlæses først, når den besøgende har sagt ja.
window.dataLayer, ved hver sideindlæsning og hver gang valget ændres.Brug samtykket fra dit eksisterende banner
<!-- Dit eksisterende samtykkebanner, med Google Consent Mode v2 slået til. -->
<script src="https://cdn.your-consent-banner.com/banner.js"></script>
<!-- PrivacyKit -->
<script type="module" src="https://cdn.privacykit.eu/v1/privacykit.esm.js"></script>
<!-- Hotjar indlæses først, når den besøgende accepterer analyse i dit banner -->
<consent-guard consent="analytics" source="google-consent-mode">
<script type="text/plain" data-src="https://static.hotjar.com/c/hotjar-XXXXXXX.js?sv=6" data-async></script>
</consent-guard>
<!-- Indlejret indhold, der kræver samtykke til marketing -->
<consent-guard consent="marketing" source="google-consent-mode">
<iframe title="YouTube video" data-src="https://www.youtube.com/embed/abc123" width="560" height="315"></iframe>
</consent-guard>
Du kan bruge PrivacyKit med Google Tag Manager på to måder: streng, hvor Tag Manager venter på samtykke, eller fleksibel, hvor Tag Manager indlæses med det samme, og dens egne samtykkeindstillinger afgør, hvilke tags der udløses. I begge tilfælde tilføjer du google-consent-mode til <consent-dialog>, så taggene i Tag Manager ved, hvad den besøgende har valgt.
Intet fra Tag Manager indlæses, og intet sendes til Google, før den besøgende har givet samtykke. En tysk domstol (VG Hannover, 2025) har fastslået, at indlæsning af Google Tag Manager kræver samtykke, og streng tilstand følger den fortolkning. Indstil guardens samtykke efter, hvad containeren udløser: analytics eller marketing, hvis den udløser én slags tags, eller analytics|marketing, hvis den udløser tags af begge slags, så den indlæses, så snart den besøgende accepterer én af dem. Derefter håndterer Tag Manager samtykket for hvert tag.
<consent-dialog google-consent-mode></consent-dialog>
<consent-guard consent="analytics|marketing">
<script type="text/plain" data-src="https://www.googletagmanager.com/gtm.js?id=GTM-XXXXXXX" data-async></script>
</consent-guard>
Indlæs Tag Manager som normalt. Googles tags følger Consent Mode-signalerne fra dialogen. Andre tags i containeren, som Meta eller LinkedIn, skal have samtykkeindstillinger i Tag Manager. Consent Validator viser Tag Manager som ikke beskyttet af en guard. Det er tilsigtet: Validatoren rapporterer alt, der ikke ligger i en guard.
Fleksibel er også opsætningen for websites, der bevidst bruger Consent Mode Advanced. Når samtykke er afvist, sender Googles tags stadig data uden cookies, som sideadressen og enhedsoplysninger, så Google kan modellere konverteringer. PrivacyKit understøtter denne opsætning. Om den passer til dit website, er en beslutning for dig og din juridiske rådgiver.
Vis fallback-indhold, når en tilknyttet consent-guard blokerer.
| Attribut | Type | Standard / Påkrævet | Beskrivelse |
|---|---|---|---|
| for | string | påkrævet | ID for det relaterede <consent-guard>-element. |
Eksempel
<consent-guard id="analytics-guard" consent="analytics">
<script type="text/plain" data-src="https://example.com/analytics.js"></script>
</consent-guard>
<consent-missing for="analytics-guard">
Acceptér analyse-cookies for at fortsætte.
</consent-missing>
Consent Validator overvåger udgående anmodninger og validerer consent guard-dækning på dit websted og afslører uhåndterede trackers og regressioner introduceret af webstedsændringer. Inaktiv som standard forbliver den usynlig for besøgende og er sikker at inkludere i produktion.
| Attribut | Type | Standard / Påkrævet | Beskrivelse |
|---|---|---|---|
| debug | boolean | false | Aktiverer Consent Validator-panelet ved sideindlæsning. Kun til udviklingsmiljøer. |
| delay | number | 5000 | Netværksobservationsvindue (i millisekunder) inden Consent Validator begynder at validere slutpunktforbrug og consent guard-dækning. |
| ignore-first-party-subdomains | boolean | true | Når den er true, ignoreres forespørgsler til subdomæner af det nuværende domæne i stilhed. |
| fab-position | left | right | right | Styrer hvilken side af viewporten Consent Validator-FAB'en fastgøres til. |
Eksempel
<consent-validator debug delay="5000" ignore-first-party-subdomains="true" fab-position="left"></consent-validator>
Consent Validator forbliver skjult for besøgende, selv når den er inkluderet i produktionsbundtet. Den anbefalede måde at aktivere den på et live websted er at tilføje ?privacykit=validate til URL'en — det aktiverer validatoren kun for den pågældende browsersession uden at påvirke besøgsoplevelsen.
Slå til programmatisk:
window.PrivacyKit?.toggleConsentValidator();
Undgå flicker før webkomponenterne er færdigindlæste. Uden dette snippet kan slottet eller beskyttet HTML kort vises når:
consent-dialog kan blinke kort, hvis du bruger slottede elementer, og de renderes før komponentdefinitionen er indlæst.consent-guard kan blinke kort, hvis den bruges til betinget HTML, og indholdet renderes før komponenten aktiveres.consent-missing kan blinke kort, hvis den bruges som fallback, og den renderes før komponenten aktiveres.Tilføj styling i dit light DOM for at undgå blink.
consent-dialog:not(:defined) [slot] {
display: none;
}
consent-guard:not([active]) {
display: none;
}
consent-missing:not([active]) {
display: none;
}