SWCore
SWCore / Componentes / LGPD / Cookies

LGPD / Cookies Componentes

O aviso de cookies que a LGPD (Lei 13.709/2018) pede de verdade: Estatísticas, Marketing e Preferências só rodam depois que a pessoa aceita — e ela pode aceitar por categoria, recusar e mudar de ideia depois.

O que é

Não é só um aviso bonito: ele segura os scripts de terceiros (Google Analytics, pixel do Facebook, chat…) até a pessoa aceitar a categoria deles. Você coloca uma linha <div sw-lgpd> na página e troca o <script> desses serviços para type="text/plain" com a categoria em data-sw-lgpd. O banner oferece "Aceitar todos", "Recusar todos" (com o mesmo peso, como a lei pede) e "Personalizar" (liga/desliga por categoria). Depois da escolha, um botãozinho redondo fica no canto para a pessoa mudar de ideia.

Precisa do JavaScript do SWCore. O navegador não executa um <script type="text/plain">; quando a pessoa aceita a categoria, o componente troca esse script por um de verdade e ele roda. A escolha fica guardada no navegador dela (com data e hora) e vale nas próximas visitas. A categoria Necessários sempre existe e não pode ser desligada. O visual acompanha o tema claro/escuro (menos o estilo drk, que é sempre escuro).

Quando usar

  • Todo site que usa Google Analytics, pixel de anúncio, chat ou vídeo incorporado — isto é, quase todo site público.
  • Loja e site de cliente: dá para mostrar "o que eu aceitei" (SW.Lgpd.accepted('marketing')) antes de disparar evento de conversão.
  • Site sem nenhum script de terceiros e sem cookie além do necessário não precisa do banner.

Comece aqui

  1. 1

    Coloque o SWCore na página.

    <link rel="stylesheet" href="https://swcore.sanweb.com.br/dist/2.1.0/swcore.min.css">
    
    <!-- fim do body -->
    <script src="https://swcore.sanweb.com.br/dist/2.1.0/swcore.min.js"></script>
  2. 2

    Coloque o banner uma vez na página, com o endereço da sua política de privacidade.

    <div sw-lgpd sw-lgpd-policy="/privacidade"></div>
  3. 3

    Troque o script de estatística/anúncio para type="text/plain" e diga a categoria. Ele só roda depois do "aceitar".

    <!-- ANTES: rodava para todo mundo -->
    <script>
      /* código do Google Analytics */
    </script>
    
    <!-- DEPOIS: só roda se a pessoa aceitar "Estatísticas" -->
    <script type="text/plain" data-sw-lgpd="analytics">
      /* código do Google Analytics */
    </script>

Todas as variações

Cada quadro abaixo é o componente de verdade, rodando. O código embaixo é exatamente o que está no quadro: copie e cole.

1. Posição do banner

O banner é um só por página e fica preso na tela, então estes quadros têm um botão que cria o banner nesta página com as mesmas opções do código embaixo. Aceite, recuse ou personalize para ver o resto do fluxo (o botão redondo que aparece depois reabre as preferências). Para sumir com tudo, use "Limpar demonstração" no fim da seção.

Padrão — cartão no canto de baixo, à esquerda <div sw-lgpd sw-lgpd-policy="/privacidade"></div>
sw-lgpd-pos="bar" — faixa de ponta a ponta embaixo <div sw-lgpd sw-lgpd-pos="bar" sw-lgpd-policy="/privacidade"></div>
sw-lgpd-pos="center" — cartão centralizado embaixo <div sw-lgpd sw-lgpd-pos="center" sw-lgpd-policy="/privacidade"></div>

2. Estilo

Palavras em sw-lgpd, combináveis entre si e com a posição. tint, drk e gls valem também para o painel de preferências; mini só encolhe o banner (a mensagem vira uma linha só, cortada com "…").

tint — levemente na cor primária <div sw-lgpd="tint" sw-lgpd-policy="/privacidade"></div>
drk — sempre escuro, nos dois temas <div sw-lgpd="drk" sw-lgpd-policy="/privacidade"></div>
gls — vidro fosco <div sw-lgpd="gls" sw-lgpd-policy="/privacidade"></div>
mini — compacto, uma linha <div sw-lgpd="mini" sw-lgpd-policy="/privacidade"></div>
mini drk + bar — combinados <div sw-lgpd="mini drk" sw-lgpd-pos="bar" sw-lgpd-policy="/privacidade"></div>
gls + center <div sw-lgpd="gls" sw-lgpd-pos="center" sw-lgpd-policy="/privacidade"></div>

3. Categorias e texto

Ofereça só as categorias que o seu site usa (sw-lgpd-cats, separadas por vírgula; as possíveis são analytics, marketing e preferencias). O texto do aviso troca com sw-lgpd-msg. Estes botões abrem direto o painel "Personalizar".

Padrão — as 3 categorias + Necessários <div sw-lgpd></div>
sw-lgpd-cats="analytics" — só estatísticas <div sw-lgpd sw-lgpd-cats="analytics"></div>
sw-lgpd-msg — seu próprio texto <div sw-lgpd sw-lgpd-msg="Usamos cookies para medir as visitas e melhorar a loja. Você escolhe."></div>
Limpar demonstração (tira banner e botão desta página) SW.Lgpd.destroy();

Tabela de opções

PalavraO que fazExemplo
O banner (uma <div> por página)
sw-lgpdLiga o componente. Pode ficar em qualquer lugar da página; ele some depois de ler as opções.<div sw-lgpd></div>
sw-lgpd-policyEndereço da sua política de privacidade — vira link no aviso e no painel. Apelido: sw-lgpd-link.sw-lgpd-policy="/privacidade"
sw-lgpd-modalAbre a política numa janela por cima (sem sair da página) em vez de nova aba.sw-lgpd-modal
sw-lgpd-msgTexto do aviso. Sem ele, vem um texto padrão em português.sw-lgpd-msg="Usamos cookies…"
sw-lgpd-catsCategorias oferecidas. Padrão: analytics,marketing,preferencias. Necessários sempre aparece.sw-lgpd-cats="analytics,marketing"
sw-lgpd-reloadSe a pessoa tirar uma permissão depois, recarrega a página para parar os scripts que já rodaram.sw-lgpd-reload
Posição — sw-lgpd-pos
(nenhuma)Cartão no canto de baixo, à esquerda.
barFaixa de ponta a ponta, embaixo.sw-lgpd-pos="bar"
centerCartão centralizado, embaixo.sw-lgpd-pos="center"
Estilo — palavras em sw-lgpd
tintFundo levemente na cor primária.sw-lgpd="tint"
drkEscuro, em qualquer tema.sw-lgpd="drk"
glsVidro fosco.sw-lgpd="gls"
miniBanner compacto (só o banner; o painel continua completo).sw-lgpd="mini drk"
Categorias (valor de data-sw-lgpd no script)
necessariosSempre ativa. Para script essencial que você também quer marcar.data-sw-lgpd="necessarios"
analytics"Estatísticas": Google Analytics, Hotjar, Clarity…data-sw-lgpd="analytics"
marketing"Marketing": pixel do Facebook/Meta, Google Ads, TikTok…data-sw-lgpd="marketing"
preferencias"Preferências": lembrar idioma, região, layout.data-sw-lgpd="preferencias"
Nos seus scripts
type="text/plain"Segura o script: o navegador não executa.<script type="text/plain" data-sw-lgpd="analytics">
data-sw-lgpdA categoria que libera o script.data-sw-lgpd="marketing"
data-sw-lgpd-srcPara script externo: o endereço vai aqui (não em src).data-sw-lgpd-src="https://…/pixel.js"
Em qualquer link ou botão
sw-lgpd-openReabre o painel de preferências (ex.: link no rodapé "Preferências de cookies").<a href="#" sw-lgpd-open>Cookies</a>

Receitas prontas — usos reais

Situações que aparecem em quase todo site. Copie a que servir.

Google Analytics 4 só depois do aceite Referência
<div sw-lgpd sw-lgpd-policy="/privacidade" sw-lgpd-cats="analytics"></div>

<!-- o carregador do GA: endereço em data-sw-lgpd-src, não em src -->
<script type="text/plain" data-sw-lgpd="analytics"
        data-sw-lgpd-src="https://www.googletagmanager.com/gtag/js?id=G-XXXXXXX" async></script>

<!-- a configuração do GA -->
<script type="text/plain" data-sw-lgpd="analytics">
  window.dataLayer = window.dataLayer || [];
  function gtag(){ dataLayer.push(arguments); }
  gtag('js', new Date());
  gtag('config', 'G-XXXXXXX');
</script>
Pixel de anúncio (marketing) + link no rodapé Referência
<div sw-lgpd="tint" sw-lgpd-pos="bar" sw-lgpd-policy="/privacidade" sw-lgpd-reload></div>

<script type="text/plain" data-sw-lgpd="marketing">
  /* código do pixel do Meta / Google Ads */
</script>

<footer>
  <a href="/privacidade">Política de privacidade</a>
  <a href="#" sw-lgpd-open>Preferências de cookies</a>
</footer>
Perguntar no seu código o que a pessoa aceitou Ao vivo

Crie um banner acima, escolha, e pergunte aqui.

// antes de disparar um evento de conversão
if (SW.Lgpd.accepted('marketing')) {
  fbq('track', 'Purchase');
}

// tudo de uma vez: { necessarios: true, analytics: false, marketing: true, … }
console.log(SW.Lgpd.consent());

// quando a pessoa escolher ou mudar de ideia
document.addEventListener('sw:lgpd:change', (e) => {
  console.log(e.detail.categories, e.detail.changed, e.detail.firstTime);
});

Eventos

sw:lgpd:change
Disparado no document quando a pessoa escolhe ou muda de ideia, e também ao abrir a página se já existe uma escolha guardada. Traz e.detail.categories (o que está aceito), e.detail.changed (o que mudou) e e.detail.firstTime (true na primeira escolha).

API (JavaScript)

SW.Lgpd.accepted("analytics")
true/false: a pessoa aceitou essa categoria?
SW.Lgpd.consent()
Todas as categorias e se estão aceitas.
SW.Lgpd.open()
Abre o painel de preferências (é o que sw-lgpd-open faz).
SW.Lgpd.acceptAll() / SW.Lgpd.rejectAll()
Aceita tudo / recusa tudo (menos Necessários), como os botões do banner.
SW.Lgpd.reset()
Apaga a escolha guardada e mostra o banner de novo.
SW.Lgpd.init({ policy, msg, pos, mods, cats, policyModal, reload })
Cria o banner pelo JavaScript em vez da <div sw-lgpd>. mods e cats são listas: { pos: 'bar', mods: ['drk'], cats: ['analytics'] }.
SW.Lgpd.destroy()
Tira banner, painel e botão da tela (não apaga a escolha guardada). Útil para recriar com outras opções.

Precisa de quê

  • swcore.min.css e swcore.min.js.
  • Uma página de política de privacidade no seu site (o link do banner aponta para ela).
  • Marcar você mesmo cada script de terceiros com type="text/plain" e data-sw-lgpd.

Cuidados — erros comuns

  • Deixar o script do Analytics sem type="text/plain": ele roda antes do aceite, e o banner vira enfeite. Todo script de terceiros precisa da marcação.
  • Script externo com src="…" e type="text/plain": não é liberado do jeito certo. Coloque o endereço em data-sw-lgpd-src.
  • Escrever a categoria em português ou com erro (data-sw-lgpd="estatisticas"): o script nunca roda. As categorias são analytics, marketing, preferencias, necessarios.
  • Link "Preferências de cookies" (sw-lgpd-open) numa página sem <div sw-lgpd>: o painel abre com as categorias padrão, mas sem o banner os scripts marcados daquela página só são liberados depois de uma nova escolha. Coloque a <div sw-lgpd> em todas as páginas.
  • Duas <div sw-lgpd> na mesma página: só a primeira vale.

O que ele não faz

  • Não bloqueia sozinho o que você não marcou: iframes (YouTube, mapas) e scripts comuns rodam normalmente.
  • Script que já rodou não "desliga" quando a pessoa tira a permissão — por isso existe sw-lgpd-reload.
  • A escolha fica no navegador da pessoa: em outro aparelho, ou depois de limpar os dados, o banner volta. Não guarda nada no seu servidor.
  • Scripts marcados que forem adicionados à página depois da escolha só são liberados na próxima escolha ou na próxima visita.
  • Os nomes e descrições das categorias e o texto dos botões são fixos, em português.