Plateformes

Comment ajouter un bandeau cookies à une application SvelteKit

Dans SvelteKit, collez la balise dans src/app.html, le modèle de page qu’utilise chaque route, au-dessus du marqueur %sveltekit.head% pour qu’elle passe avant les scripts de SvelteKit. Marquez les balises de suivi dans le même fichier avec type="text/plain" et data-cq-category, et lisez l’événement cq:consent dans les composants qui chargent des contenus embarqués ou envoient des pages vues après une navigation côté client.
Publié le 21 octobre 2026 · Par l’équipe Cookiequiet

Étapes

Copier la baliseDans le tableau de bord Cookiequiet, ajoutez le site et copiez la balise avec votre clé de site, data-consent-mode="1" et data-auto-block="1".
La coller dans src/app.htmlOuvrez src/app.html et collez la balise dans le head, au-dessus de %sveltekit.head%. Vous pouvez lire la clé depuis une variable d’environnement PUBLIC_ avec %sveltekit.env.PUBLIC_COOKIEQUIET_SITE%.
Marquer vos balisesCollez les balises de mesure d’audience et de publicité sous la balise Cookiequiet dans app.html, avec type="text/plain" et data-cq-category réglé sur analytics ou marketing.
Conditionner les composantsCréez un petit store qui écoute l’événement cq:consent et ne rendez les contenus embarqués comme YouTube ou un widget de chat que lorsque leur catégorie est accordée.
Conditionner les pages vuesSi votre outil de mesure a besoin d’une page vue par route, envoyez-la depuis afterNavigate dans le +layout.svelte racine, seulement quand la mesure d’audience est accordée.
Ajouter le lien Préférences de cookiesDans le pied de page, ajoutez une ancre ordinaire avec href="#cq-preferences" et l’attribut data-cq-show-preferences.
Tester avec Tout refuserLancez l’application, ouvrez-la dans une fenêtre de navigation privée, cliquez sur Tout refuser et vérifiez qu’aucun cookie _ga ou _fbp n’est déposé. Acceptez tout, rechargez, naviguez et consultez le registre des consentements.

Où placer la balise dans SvelteKit ?

Le modèle de page de SvelteKit est src/app.html. Le marqueur %sveltekit.head% est remplacé par les éléments <link> et <script> dont l’application a besoin, plus le contenu des <svelte:head>. Placez la balise au-dessus, pour qu’elle figure dans le HTML de chaque route avant les scripts de SvelteKit :

html
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<script src="https://cookiequiet.com/cq.js" data-site="YOUR_SITE_KEY" data-consent-mode="1" data-auto-block="1" defer></script>
%sveltekit.head%
</head>
<body data-sveltekit-preload-data="hover">
<div style="display: contents">%sveltekit.body%</div>
</body>
</html>

Pour garder la clé hors du fichier, écrivez data-site="%sveltekit.env.PUBLIC_COOKIEQUIET_SITE%". SvelteKit remplace le marqueur au moment du rendu par une variable d’environnement publique, et par une chaîne vide si elle manque. Avec une Content Security Policy à base de nonce, ajoutez nonce="%sveltekit.nonce%" à la balise, et autorisez https://cookiequiet.com dans script-src et connect-src.

Ne chargez pas la balise avec <svelte:head> dans un layout. Ce contenu est placé par l’application parmi ses propres éléments du head, alors que app.html est le seul modèle qui place le script avant tout le reste sur chaque route.

Comment bloquer mes balises jusqu’au consentement ?

Balises marquées dans app.html. Collez-les sous la balise Cookiequiet et modifiez leur balise d’ouverture. Cookiequiet les exécute quand la catégorie est accordée, et d’emblée lors des visites suivantes où le choix enregistré l’inclut :

html
<script type="text/plain" data-cq-category="analytics" src="https://www.googletagmanager.com/gtag/js?id=G-XXXXXXX"></script>
<script type="text/plain" data-cq-category="analytics">
window.dataLayer = window.dataLayer || [];
function gtag(){dataLayer.push(arguments);}
gtag('js', new Date());
gtag('config', 'G-XXXXXXX');
</script>

Le code de base du pixel Meta reçoit data-cq-category="marketing", sans son image noscript ; le guide Meta Pixel explique pourquoi. Pour garder plutôt la balise Google en Consent Mode, voir le guide Google Analytics 4.

Scripts créés en JavaScript. Les gestionnaires de balises et les widgets qui injectent des traceurs à l’exécution sont retenus par le bloqueur automatique (activé par data-auto-block="1") quand le traceur fait partie des quelque 80 qu’il connaît, jusqu’à ce que la catégorie soit accordée.

Comment les composants connaissent-ils le choix du visiteur ?

Cookiequiet émet un événement cq:consent sur window chaque fois qu’il applique un choix : un choix enregistré au chargement de la page, un nouveau choix après un clic, et toutes les catégories d’un coup dans les régions où le ciblage géographique n’affiche pas le bandeau. event.detail.categories liste les catégories accordées. Un store l’enveloppe :

js
// src/lib/consent.js
import { readable } from "svelte/store";
import { browser } from "$app/environment";
​
export const consent = readable([], (set) => {
if (!browser) return;
const stored = window.Cookiequiet && window.Cookiequiet.get();
if (stored) set(stored.c);
const onConsent = (e) => set(e.detail.categories);
window.addEventListener("cq:consent", onConsent);
return () => window.removeEventListener("cq:consent", onConsent);
});

Dans un composant, ne rendez le contenu embarqué que lorsque la catégorie figure dans la liste :

svelte
<script>
import { consent } from "$lib/consent";
</script>
​
{#if $consent.includes("marketing")}
<iframe src="https://www.youtube-nocookie.com/embed/VIDEO_ID" title="Video"></iframe>
{:else}
<button onclick={() => window.Cookiequiet.showPreferences()}>Allow videos</button>
{/if}

Et la navigation côté client ?

SvelteKit navigue sans rechargement complet après la première page. La balise s’exécute une fois par chargement complet, le choix reste appliqué et le bandeau ne réapparaît pas. Les scripts marqués sont activés au chargement et après chaque choix : gardez-les donc dans app.html, pas dans les composants de route. Si votre outil de mesure a besoin d’une page vue par route, afterNavigate de $app/navigation, appelé dans le +layout.svelte racine, s’exécute au montage et après chaque navigation : lisez-y get(consent) (get vient de svelte/store) et n’envoyez la page vue que lorsqu’il inclut analytics.

Comment ajouter le lien Préférences de cookies ?

html
<a href="#cq-preferences" data-cq-show-preferences>Cookie preferences</a>

Cookiequiet écoute les clics sur ce lien partout dans la page et ouvre le centre de préférences.

Comment tester ?

  1. Lancez vite dev ou construisez puis prévisualisez, et ouvrez l’application dans une fenêtre de navigation privée.
  2. Affichez le code source de la page : le script Cookiequiet vient avant les scripts de SvelteKit.
  3. Cliquez sur Tout refuser. Les cookies sont cq_consent et vos cookies de session, rien de Google ni de Meta.
  4. Effacez les cookies, cliquez sur Tout accepter, rechargez, naviguez entre les routes : les balises s’exécutent et le choix tient.
  5. Consultez le registre des consentements dans le tableau de bord.

Les pages prérendues et les adaptateurs (adapter-static, adapter-node, adapter-vercel) utilisent tous le même modèle, rien ne change donc d’un adaptateur à l’autre. Cookiequiet est gratuit pour un site, ciblage géographique compris ; Starter coûte 3 € par site et par mois, et les pages vues sont illimitées dans toutes les offres.

Questions

Le contenu de svelte:head est géré par l’application et placé avec ses propres éléments du head. Le script de consentement doit se trouver avant les balises qu’il contrôle sur chaque page, ce que garantit app.html, puisque c’est le modèle de chaque route.
Oui. Le bandeau est un script client et app.html est aussi le modèle des pages prérendues. La clé de site peut venir d’une variable d’environnement PUBLIC_ via %sveltekit.env.PUBLIC_COOKIEQUIET_SITE%.
Écoutez l’événement cq:consent sur window, dont detail.categories liste les catégories accordées, et partez de window.Cookiequiet.get() pour un choix enregistré. Un store readable qui enveloppe les deux est montré plus haut.
Non. Le script d’app.html s’exécute une fois par chargement complet de page et garde le choix appliqué pendant que SvelteKit change de route.

Mettez un bandeau discret sur votre site dès aujourd’hui

Gratuit pour un site avec toutes les fonctions essentielles, sans carte ni période d’essai qui expire. Passez un site en Starter pour €3 par mois pour le mettre à vos couleurs par IA sans la mention Cookiequiet, ou en Pro pour €9 pour le concevoir avec l’agent IA.