react-lgpd-consent 0.2.4 → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/COMPLIANCE.md +73 -287
- package/README.md +86 -667
- package/dist/{PreferencesModal-SOVV24DU.js → PreferencesModal-XCTM6WJN.js} +1 -1
- package/dist/{chunk-UKKWGQN7.js → chunk-R3IKVZBC.js} +506 -272
- package/dist/index.cjs +737 -655
- package/dist/index.d.cts +141 -125
- package/dist/index.d.ts +141 -125
- package/dist/index.js +7 -182
- package/package.json +12 -1
package/README.md
CHANGED
|
@@ -1,752 +1,171 @@
|
|
|
1
1
|
# react-lgpd-consent 🍪
|
|
2
2
|
|
|
3
|
-
[](
|
|
3
|
+
[](https://www.npmjs.com/package/react-lgpd-consent)
|
|
4
|
+
[](https://bundlephobia.com/package/react-lgpd-consent)
|
|
5
|
+
[](https://www.npmjs.com/package/react-lgpd-consent)
|
|
6
|
+
[](https://www.typescriptlang.org/)
|
|
7
|
+
[](https://github.com/lucianoedipo/react-lgpd-consent/blob/main/LICENSE)
|
|
8
|
+
|
|
9
|
+
> **Biblioteca completa de consentimento de cookies para React, em conformidade com a LGPD.**
|
|
4
10
|
|
|
5
|
-
|
|
11
|
+
Solução moderna, acessível e personalizável para gerenciar o consentimento de cookies em aplicações React, com suporte a SSR, Material-UI, e um sistema inteligente de orientações para desenvolvedores.
|
|
6
12
|
|
|
7
|
-
|
|
8
|
-
- 🎯 **UI Dinâmica**: Componentes se adaptam à configuração do projeto
|
|
9
|
-
- 🛡️ **Compliance por Design**: Previne problemas de conformidade LGPD
|
|
10
|
-
- 🔧 **Hooks Avançados**: `useCategories()` e `useCategoryStatus()` para controle total
|
|
13
|
+
## ✨ Características Principais
|
|
11
14
|
|
|
12
|
-
**
|
|
15
|
+
- 🇧🇷 **Conformidade com a LGPD**: Desenvolvido seguindo as diretrizes da ANPD.
|
|
16
|
+
- 🧠 **Orientações para Desenvolvedores**: Avisos e sugestões automáticas no console para garantir uma configuração adequada.
|
|
17
|
+
- 🎯 **UI Dinâmica e Inteligente**: Os componentes se adaptam automaticamente às categorias de cookies que você realmente utiliza.
|
|
18
|
+
- 🛡️ **Minimização de Dados**: O cookie de consentimento armazena apenas as informações estritamente necessárias.
|
|
19
|
+
- 🚀 **Integrações Nativas**: Carregue scripts como Google Analytics e GTM automaticamente após o consentimento.
|
|
20
|
+
- ⏰ **Auditoria**: O cookie armazena metadados essenciais como data do consentimento, versão e origem.
|
|
21
|
+
- 🎨 **Customizável**: Personalize textos, tema (Material-UI) e componentes.
|
|
22
|
+
- ♿ **Acessibilidade**: Suporte para navegação por teclado e leitores de tela.
|
|
23
|
+
- 📦 **Leve e Otimizado**: Performance em foco, com tree-shaking.
|
|
24
|
+
- ✨ **Renderização Automática de UI**: O `ConsentProvider` agora gerencia a exibição do banner e do botão flutuante por padrão.
|
|
25
|
+
- 🎨 **Componentes UI Sobrescrevíveis**: Forneça seus próprios componentes de UI com tipagem clara para total personalização.
|
|
13
26
|
|
|
14
|
-
|
|
27
|
+
## 🚀 Instalação
|
|
15
28
|
|
|
16
|
-
```
|
|
17
|
-
|
|
18
|
-
{/* Sua aplicação */}
|
|
19
|
-
</ConsentProvider>
|
|
29
|
+
```bash
|
|
30
|
+
npm install react-lgpd-consent
|
|
20
31
|
```
|
|
21
32
|
|
|
22
|
-
|
|
33
|
+
Você também precisará das dependências `peer`, caso ainda não as tenha:
|
|
23
34
|
|
|
35
|
+
```bash
|
|
36
|
+
npm install react react-dom @mui/material js-cookie
|
|
37
|
+
```
|
|
24
38
|
|
|
25
|
-
## 📖 Uso Básico
|
|
39
|
+
## 📖 Uso Básico
|
|
26
40
|
|
|
27
|
-
|
|
41
|
+
O exemplo abaixo mostra como implementar um banner de consentimento funcional com o mínimo de configuração.
|
|
28
42
|
|
|
29
|
-
|
|
30
|
-
|
|
43
|
+
```tsx
|
|
44
|
+
// Em seu componente principal, como App.tsx
|
|
45
|
+
import { ConsentProvider } from 'react-lgpd-consent'
|
|
31
46
|
|
|
32
47
|
function App() {
|
|
33
48
|
return (
|
|
34
49
|
<ConsentProvider
|
|
35
|
-
//
|
|
50
|
+
// 1. Especifique as categorias que seu site utiliza
|
|
36
51
|
categories={{
|
|
37
|
-
enabledCategories: ['analytics'],
|
|
52
|
+
enabledCategories: ['analytics', 'marketing'],
|
|
38
53
|
}}
|
|
39
|
-
|
|
40
|
-
// � Textos ANPD para compliance (opcionais)
|
|
54
|
+
// 2. (Opcional) Adicione textos para total transparência
|
|
41
55
|
texts={{
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
dataTypes: "Coletamos: dados de navegação para análise estatística",
|
|
45
|
-
userRights: "Direitos: acessar, corrigir, excluir dados (dpo@empresa.com)"
|
|
56
|
+
controllerInfo: 'Controlado por: Sua Empresa LTDA',
|
|
57
|
+
userRights: 'Você tem o direito de acessar e corrigir seus dados.',
|
|
46
58
|
}}
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
onConsentGiven={(state) => console.log('Consentimento registrado:', state)}
|
|
59
|
+
// 3. (Opcional) Adicione callbacks para auditoria
|
|
60
|
+
onConsentGiven={(state) => console.log('Consentimento dado:', state)}
|
|
50
61
|
>
|
|
51
|
-
|
|
52
|
-
<
|
|
62
|
+
{/* O resto da sua aplicação */}
|
|
63
|
+
<h1>Meu Site</h1>
|
|
64
|
+
<p>Bem-vindo ao meu site.</p>
|
|
65
|
+
|
|
66
|
+
{/* O ConsentProvider agora renderiza automaticamente o banner e o botão flutuante */}
|
|
67
|
+
{/* Você pode sobrescrevê-los usando as props CookieBannerComponent e FloatingPreferencesButtonComponent */}
|
|
53
68
|
</ConsentProvider>
|
|
54
69
|
)
|
|
55
70
|
}
|
|
56
|
-
```eact-lgpd-consent?style=for-the-badge)](https://github.com/lucianoedipo/react-lgpd-consent/blob/main/LICENSE)
|
|
57
|
-
[](https://www.typescriptlang.org/)
|
|
58
|
-
[](https://reactjs.org/)
|
|
59
|
-
[](https://mui.com/)
|
|
60
|
-
[](https://bundlephobia.com/package/react-lgpd-consent)
|
|
61
|
-
[](https://www.npmjs.com/package/react-lgpd-consent)
|
|
62
|
-
|
|
63
|
-
[](https://reactjs.org/)
|
|
64
|
-
[](https://mui.com/)
|
|
65
|
-
|
|
66
|
-
> **Biblioteca completa de consentimento de cookies para React e Next.js em conformidade com a LGPD**
|
|
67
|
-
|
|
68
|
-
Solução moderna, acessível e personalizável para gerenciar consentimento de cookies em aplicações React, com suporte completo a SSR, Material-UI e TypeScript.
|
|
69
|
-
|
|
70
|
-
## ✨ Características Principais
|
|
71
|
-
|
|
72
|
-
- 🇧🇷 **Conformidade LGPD + ANPD**: Cookie otimizado conforme Guia Orientativo da ANPD
|
|
73
|
-
- 🍪 **Categorias Configuráveis**: Sistema dinâmico - apenas categorias necessárias ao projeto
|
|
74
|
-
- 🛡️ **Princípio da Minimização**: Cookie contém apenas dados essenciais para compliance
|
|
75
|
-
- 🚀 **Integrações Nativas**: Google Analytics, Tag Manager, UserWay automatizados
|
|
76
|
-
- ⏰ **Auditoria Completa**: Timestamps e rastreabilidade para prestação de contas
|
|
77
|
-
- ⚡ **Client-Side First**: Arquitetura otimizada para SPA com zero-flash
|
|
78
|
-
- 🎨 **Material-UI Integration**: Componentes prontos e customizáveis com MUI
|
|
79
|
-
- ♿ **Acessibilidade**: Navegação por teclado e leitores de tela nativamente suportados
|
|
80
|
-
- 🌐 **Internacionalização**: Textos totalmente customizáveis (padrão pt-BR)
|
|
81
|
-
- 🚀 **TypeScript**: API completamente tipada para melhor DX
|
|
82
|
-
- 📦 **Zero Config**: Funciona out-of-the-box com configurações sensatas
|
|
83
|
-
- 🎯 **Granular Control**: Controle individual por categoria ativa
|
|
84
|
-
- 🚫 **Banner Bloqueante**: Modo opcional para exigir interação antes de continuar
|
|
85
|
-
- 🎨 **Sistema de Temas**: Temas customizáveis para integração visual perfeita
|
|
86
|
-
- ⚡ **Carregamento Automático**: Scripts só executam após consentimento explícito
|
|
87
|
-
- 🔌 **Modal Automático**: Modal de preferências incluído automaticamente com lazy loading
|
|
88
|
-
- 🎛️ **Botão Flutuante**: Componente opcional para acesso fácil às preferências
|
|
89
|
-
|
|
90
|
-
## 🚀 Instalação
|
|
91
|
-
|
|
92
|
-
```bash
|
|
93
|
-
npm install react-lgpd-consent
|
|
94
|
-
# ou
|
|
95
|
-
yarn add react-lgpd-consent
|
|
96
|
-
# ou
|
|
97
|
-
pnpm add react-lgpd-consent
|
|
98
|
-
````
|
|
99
|
-
|
|
100
|
-
### Dependências
|
|
101
71
|
|
|
102
|
-
|
|
103
|
-
npm install @mui/material js-cookie
|
|
104
|
-
```
|
|
105
|
-
|
|
106
|
-
## 🆕 Novidades v0.2.0 - Adequação ANPD Completa
|
|
107
|
-
|
|
108
|
-
### 🍪 Categorias Baseadas no Guia da ANPD
|
|
109
|
-
|
|
110
|
-
A biblioteca agora inclui **6 categorias** baseadas no Guia Orientativo da ANPD:
|
|
111
|
-
|
|
112
|
-
- **`necessary`**: Cookies essenciais (sempre ativos)
|
|
113
|
-
- **`analytics`**: Análise e estatísticas de uso
|
|
114
|
-
- **`functional`**: Funcionalidades extras (preferências, idioma)
|
|
115
|
-
- **`marketing`**: Publicidade e marketing direcionado
|
|
116
|
-
- **`social`**: Integração com redes sociais
|
|
117
|
-
- **`personalization`**: Personalização de conteúdo
|
|
118
|
-
|
|
119
|
-
### 🛡️ Conformidade LGPD Rigorosa (v0.2.1)
|
|
120
|
-
|
|
121
|
-
**Princípio da Minimização**: Cookie contém apenas categorias realmente utilizadas:
|
|
122
|
-
|
|
123
|
-
```tsx
|
|
124
|
-
<ConsentProvider
|
|
125
|
-
categories={{
|
|
126
|
-
enabledCategories: ['analytics'], // Apenas analytics + necessary
|
|
127
|
-
customCategories: [{
|
|
128
|
-
id: 'governo',
|
|
129
|
-
name: 'Integração Governamental',
|
|
130
|
-
description: 'Cookies para sistemas gov.br',
|
|
131
|
-
essential: false
|
|
132
|
-
}]
|
|
133
|
-
}}
|
|
134
|
-
blocking={true} // Banner bloqueia até decisão explícita
|
|
135
|
-
>
|
|
136
|
-
```
|
|
137
|
-
|
|
138
|
-
**Cookie resultante** (apenas dados essenciais):
|
|
139
|
-
|
|
140
|
-
```json
|
|
141
|
-
{
|
|
142
|
-
"version": "1.0",
|
|
143
|
-
"consented": true,
|
|
144
|
-
"preferences": { "necessary": true, "analytics": false, "governo": true },
|
|
145
|
-
"consentDate": "2025-08-12T14:30:00.000Z",
|
|
146
|
-
"lastUpdate": "2025-08-12T14:30:00.000Z",
|
|
147
|
-
"source": "banner"
|
|
148
|
-
}
|
|
72
|
+
export default App
|
|
149
73
|
```
|
|
150
74
|
|
|
151
|
-
|
|
75
|
+
## 🔧 API e Funcionalidades
|
|
152
76
|
|
|
153
|
-
###
|
|
77
|
+
### Configuração Consciente
|
|
154
78
|
|
|
155
|
-
A
|
|
79
|
+
A prop `categories` no `ConsentProvider` é o ponto central da biblioteca. Ela força o desenvolvedor a declarar quais categorias de cookies são utilizadas, em linha com o princípio de minimização de dados da LGPD.
|
|
156
80
|
|
|
157
81
|
```tsx
|
|
158
|
-
// ⚠️ Sem configuração - usa padrão e avisa
|
|
159
|
-
<ConsentProvider>
|
|
160
|
-
<App />
|
|
161
|
-
</ConsentProvider>
|
|
162
|
-
// Console: "Usando padrão: necessary + analytics. Especificar para produção."
|
|
163
|
-
|
|
164
|
-
// ✅ Configuração explícita - recomendado
|
|
165
82
|
<ConsentProvider
|
|
166
83
|
categories={{
|
|
167
|
-
|
|
168
|
-
|
|
84
|
+
// Habilita as categorias padrão 'analytics' e 'functional'
|
|
85
|
+
enabledCategories: ['analytics', 'functional'],
|
|
169
86
|
}}
|
|
170
87
|
>
|
|
171
|
-
|
|
172
|
-
</ConsentProvider>
|
|
173
|
-
```
|
|
174
|
-
|
|
175
|
-
**Console de desenvolvimento** mostra automaticamente:
|
|
176
|
-
|
|
177
|
-
- 🟨 **Avisos**: Configuração faltante ou inconsistente
|
|
178
|
-
- 💡 **Sugestões**: Melhorias para compliance
|
|
179
|
-
- 🔧 **Tabela de categorias ativas**: Para UI customizada
|
|
180
|
-
|
|
181
|
-
> 📋 **[Sistema de Orientações Completo](./docs/ORIENTACOES-DESENVOLVIMENTO.md)**
|
|
182
|
-
|
|
183
|
-
### 🔧 Categorias Customizadas (API Legacy)
|
|
184
|
-
|
|
185
|
-
```tsx
|
|
186
|
-
// LEGACY: ainda suportado, mas deprecated
|
|
187
|
-
const customCategories = [
|
|
188
|
-
{
|
|
189
|
-
id: 'governo',
|
|
190
|
-
name: 'Integração Governo',
|
|
191
|
-
description: 'Cookies para integração com sistemas governamentais.',
|
|
192
|
-
essential: false,
|
|
193
|
-
cookies: ['gov_session', 'cpf_hash']
|
|
194
|
-
}
|
|
195
|
-
]
|
|
196
|
-
|
|
197
|
-
<ConsentProvider customCategories={customCategories}>
|
|
198
|
-
{/* Sua aplicação */}
|
|
88
|
+
{/*...*/}
|
|
199
89
|
</ConsentProvider>
|
|
200
90
|
```
|
|
201
91
|
|
|
202
|
-
###
|
|
203
|
-
|
|
204
|
-
Os componentes agora **renderizam automaticamente** baseado na configuração:
|
|
205
|
-
|
|
206
|
-
```tsx
|
|
207
|
-
import { useCategories, useCategoryStatus } from 'react-lgpd-consent'
|
|
208
|
-
|
|
209
|
-
// ✅ Modal customizado que se adapta às categorias ativas
|
|
210
|
-
function CustomPreferencesModal() {
|
|
211
|
-
const { toggleableCategories } = useCategories()
|
|
212
|
-
const { preferences, setPreferences } = useConsent()
|
|
213
|
-
|
|
214
|
-
return (
|
|
215
|
-
<dialog>
|
|
216
|
-
{/* Renderiza APENAS categorias configuradas no projeto */}
|
|
217
|
-
{toggleableCategories.map((category) => (
|
|
218
|
-
<label key={category.id}>
|
|
219
|
-
<input
|
|
220
|
-
type="checkbox"
|
|
221
|
-
checked={preferences[category.id] ?? false} // ✅ Controlado
|
|
222
|
-
onChange={(e) =>
|
|
223
|
-
setPreferences({
|
|
224
|
-
...preferences,
|
|
225
|
-
[category.id]: e.target.checked,
|
|
226
|
-
})
|
|
227
|
-
}
|
|
228
|
-
/>
|
|
229
|
-
<strong>{category.name}</strong>
|
|
230
|
-
<p>{category.description}</p>
|
|
231
|
-
</label>
|
|
232
|
-
))}
|
|
233
|
-
</dialog>
|
|
234
|
-
)
|
|
235
|
-
}
|
|
236
|
-
|
|
237
|
-
// ✅ Feature condicional baseada em configuração
|
|
238
|
-
function AnalyticsDashboard() {
|
|
239
|
-
const analytics = useCategoryStatus('analytics')
|
|
240
|
-
|
|
241
|
-
if (!analytics.isActive) {
|
|
242
|
-
return null // Categoria não configurada - não renderiza
|
|
243
|
-
}
|
|
244
|
-
|
|
245
|
-
return <div>Dashboard só aparece se analytics estiver configurado!</div>
|
|
246
|
-
}
|
|
247
|
-
```
|
|
248
|
-
|
|
249
|
-
**Benefícios:**
|
|
92
|
+
### Carregamento de Scripts (`ConsentScriptLoader`)
|
|
250
93
|
|
|
251
|
-
|
|
252
|
-
- ✅ **Performance**: Não renderiza categorias não utilizadas
|
|
253
|
-
- ✅ **Manutenibilidade**: Mudou configuração? UI atualiza automaticamente
|
|
254
|
-
- ✅ **Orientação**: Console avisa sobre inconsistências
|
|
255
|
-
|
|
256
|
-
### 🚀 Integrações Automáticas
|
|
94
|
+
Evite carregar scripts de rastreamento antes do consentimento. O `ConsentScriptLoader` faz isso automaticamente.
|
|
257
95
|
|
|
258
96
|
```tsx
|
|
259
97
|
import {
|
|
98
|
+
ConsentProvider,
|
|
260
99
|
ConsentScriptLoader,
|
|
261
100
|
createGoogleAnalyticsIntegration,
|
|
262
|
-
createUserWayIntegration,
|
|
263
101
|
} from 'react-lgpd-consent'
|
|
264
102
|
|
|
265
103
|
const integrations = [
|
|
266
104
|
createGoogleAnalyticsIntegration({
|
|
267
|
-
measurementId: '
|
|
268
|
-
}),
|
|
269
|
-
createUserWayIntegration({
|
|
270
|
-
accountId: 'USERWAY_ACCOUNT_ID',
|
|
105
|
+
measurementId: 'G-XXXXXXXXXX',
|
|
271
106
|
}),
|
|
272
107
|
]
|
|
273
108
|
|
|
274
109
|
function App() {
|
|
275
110
|
return (
|
|
276
|
-
<ConsentProvider>
|
|
277
|
-
{/*
|
|
111
|
+
<ConsentProvider categories={{ enabledCategories: ['analytics'] }}>
|
|
112
|
+
{/* Este componente carrega os scripts para você quando o consentimento é dado */}
|
|
278
113
|
<ConsentScriptLoader integrations={integrations} />
|
|
279
114
|
|
|
280
|
-
|
|
281
|
-
</ConsentProvider>
|
|
282
|
-
)
|
|
283
|
-
}
|
|
284
|
-
```
|
|
285
|
-
|
|
286
|
-
### 📝 Textos ANPD Expandidos
|
|
287
|
-
|
|
288
|
-
```tsx
|
|
289
|
-
<ConsentProvider
|
|
290
|
-
texts={{
|
|
291
|
-
bannerMessage: 'Utilizamos cookies para melhorar sua experiência.',
|
|
292
|
-
// Textos ANPD opcionais
|
|
293
|
-
controllerInfo: 'Controlado por Empresa LTDA (CNPJ: 00.000.000/0001-00)',
|
|
294
|
-
dataTypes: 'Coletamos dados de navegação, preferências e interações.',
|
|
295
|
-
thirdPartySharing: 'Compartilhamos com: Google Analytics, Facebook Pixel',
|
|
296
|
-
userRights: 'Você tem direito a acesso, correção e exclusão dos dados.',
|
|
297
|
-
contactInfo: 'Contato DPO: dpo@empresa.com.br | (11) 9999-9999',
|
|
298
|
-
retentionPeriod: 'Dados armazenados por até 12 meses.',
|
|
299
|
-
lawfulBasis: 'Base legal: consentimento do titular dos dados.',
|
|
300
|
-
transferCountries: 'Dados podem ser transferidos para: EUA, Irlanda.',
|
|
301
|
-
}}
|
|
302
|
-
>
|
|
303
|
-
{/* Os textos são exibidos condicionalmente apenas se definidos */}
|
|
304
|
-
</ConsentProvider>
|
|
305
|
-
```
|
|
306
|
-
|
|
307
|
-
## � Exemplo Completo
|
|
308
|
-
|
|
309
|
-
```tsx
|
|
310
|
-
import {
|
|
311
|
-
ConsentProvider,
|
|
312
|
-
CookieBanner,
|
|
313
|
-
FloatingPreferencesButton,
|
|
314
|
-
} from 'react-lgpd-consent'
|
|
315
|
-
|
|
316
|
-
function App() {
|
|
317
|
-
return (
|
|
318
|
-
<ConsentProvider>
|
|
319
|
-
<div>
|
|
320
|
-
<h1>Meu Site</h1>
|
|
321
|
-
<p>Conteúdo do site...</p>
|
|
322
|
-
|
|
323
|
-
{/* Banner de cookies - Modal incluído automaticamente! */}
|
|
324
|
-
<CookieBanner policyLinkUrl="/privacy-policy" blocking={true} />
|
|
325
|
-
|
|
326
|
-
{/* Botão flutuante opcional para acesso às preferências */}
|
|
327
|
-
<FloatingPreferencesButton position="bottom-right" />
|
|
328
|
-
</div>
|
|
329
|
-
</ConsentProvider>
|
|
330
|
-
)
|
|
331
|
-
}
|
|
332
|
-
```
|
|
333
|
-
|
|
334
|
-
## �📖 Uso Básico
|
|
335
|
-
|
|
336
|
-
### 1. Setup do Provider
|
|
337
|
-
|
|
338
|
-
```tsx
|
|
339
|
-
import { ConsentProvider } from 'react-lgpd-consent'
|
|
340
|
-
|
|
341
|
-
function App() {
|
|
342
|
-
return (
|
|
343
|
-
<ConsentProvider>
|
|
344
|
-
<YourApp />
|
|
115
|
+
{/* ... resto do app */}
|
|
345
116
|
</ConsentProvider>
|
|
346
117
|
)
|
|
347
118
|
}
|
|
348
119
|
```
|
|
349
120
|
|
|
350
|
-
###
|
|
351
|
-
|
|
352
|
-
```tsx
|
|
353
|
-
import { CookieBanner } from 'react-lgpd-consent'
|
|
354
|
-
|
|
355
|
-
function Layout() {
|
|
356
|
-
return (
|
|
357
|
-
<>
|
|
358
|
-
<YourContent />
|
|
359
|
-
<CookieBanner
|
|
360
|
-
policyLinkUrl="/politica-privacidade"
|
|
361
|
-
blocking={true} // Padrão: bloqueia até decisão
|
|
362
|
-
/>
|
|
363
|
-
{/* Modal de preferências incluído automaticamente! */}
|
|
364
|
-
</>
|
|
365
|
-
)
|
|
366
|
-
}
|
|
367
|
-
```
|
|
121
|
+
### Renderização Condicional (`ConsentGate`)
|
|
368
122
|
|
|
369
|
-
|
|
123
|
+
Renderize componentes ou partes da sua UI apenas se o usuário consentiu com uma categoria específica.
|
|
370
124
|
|
|
371
125
|
```tsx
|
|
372
|
-
import {
|
|
373
|
-
|
|
374
|
-
function MyComponent() {
|
|
375
|
-
const { consented, preferences, acceptAll, openPreferences } = useConsent()
|
|
126
|
+
import { ConsentGate } from 'react-lgpd-consent'
|
|
376
127
|
|
|
128
|
+
function MarketingPixel() {
|
|
377
129
|
return (
|
|
378
|
-
<
|
|
379
|
-
|
|
380
|
-
<
|
|
381
|
-
<button onClick={openPreferences}>Gerenciar Preferências</button>
|
|
382
|
-
</div>
|
|
383
|
-
)
|
|
384
|
-
}
|
|
385
|
-
```
|
|
386
|
-
|
|
387
|
-
> ✅ **O modal de preferências é incluído automaticamente pelo ConsentProvider!** Não é mais necessário renderizá-lo manualmente.
|
|
388
|
-
|
|
389
|
-
````
|
|
390
|
-
|
|
391
|
-
### 4. Carregamento Condicional de Scripts
|
|
392
|
-
|
|
393
|
-
```tsx
|
|
394
|
-
import { ConsentGate, loadScript } from 'react-lgpd-consent'
|
|
395
|
-
|
|
396
|
-
function Analytics() {
|
|
397
|
-
return (
|
|
398
|
-
<ConsentGate category="analytics">
|
|
399
|
-
<GoogleAnalytics />
|
|
130
|
+
<ConsentGate category="marketing">
|
|
131
|
+
{/* Este componente só será renderizado se o usuário aceitar cookies de marketing */}
|
|
132
|
+
<img src="/pixel.gif" alt="Marketing Pixel" />
|
|
400
133
|
</ConsentGate>
|
|
401
134
|
)
|
|
402
135
|
}
|
|
403
|
-
|
|
404
|
-
// Ou carregando scripts que aguardam consentimento
|
|
405
|
-
function MyComponent() {
|
|
406
|
-
const { preferences, consented } = useConsent()
|
|
407
|
-
|
|
408
|
-
useEffect(() => {
|
|
409
|
-
if (consented && preferences.analytics) {
|
|
410
|
-
loadConditionalScript(
|
|
411
|
-
'ga',
|
|
412
|
-
'https://www.googletagmanager.com/gtag/js?id=GA_ID',
|
|
413
|
-
() => preferences.analytics, // Condição que aguarda
|
|
414
|
-
)
|
|
415
|
-
}
|
|
416
|
-
}, [preferences, consented])
|
|
417
|
-
}
|
|
418
|
-
````
|
|
419
|
-
|
|
420
|
-
## 🎨 Customização
|
|
421
|
-
|
|
422
|
-
### Banner Bloqueante vs Não-bloqueante
|
|
423
|
-
|
|
424
|
-
```tsx
|
|
425
|
-
// Banner bloqueante (padrão) - impede interação até decisão
|
|
426
|
-
<CookieBanner blocking={true} />
|
|
427
|
-
|
|
428
|
-
// Banner não-intrusivo - permite navegação
|
|
429
|
-
<CookieBanner blocking={false} />
|
|
430
|
-
```
|
|
431
|
-
|
|
432
|
-
### Tema Personalizado
|
|
433
|
-
|
|
434
|
-
```tsx
|
|
435
|
-
import { ConsentProvider, defaultConsentTheme } from 'react-lgpd-consent'
|
|
436
|
-
import { createTheme } from '@mui/material/styles'
|
|
437
|
-
|
|
438
|
-
const meuTema = createTheme({
|
|
439
|
-
...defaultConsentTheme,
|
|
440
|
-
palette: {
|
|
441
|
-
...defaultConsentTheme.palette,
|
|
442
|
-
primary: {
|
|
443
|
-
main: '#1976d2', // Sua cor principal
|
|
444
|
-
},
|
|
445
|
-
},
|
|
446
|
-
})
|
|
447
|
-
|
|
448
|
-
<ConsentProvider theme={meuTema}>
|
|
449
|
-
<App />
|
|
450
|
-
</ConsentProvider>
|
|
451
|
-
```
|
|
452
|
-
|
|
453
|
-
### Textos Personalizados
|
|
454
|
-
|
|
455
|
-
```tsx
|
|
456
|
-
<ConsentProvider
|
|
457
|
-
texts={{
|
|
458
|
-
bannerMessage: "Utilizamos cookies para melhorar sua experiência.",
|
|
459
|
-
acceptAll: "Aceitar Todos",
|
|
460
|
-
declineAll: "Recusar Opcionais",
|
|
461
|
-
preferences: "Configurar"
|
|
462
|
-
}}
|
|
463
|
-
>
|
|
464
|
-
```
|
|
465
|
-
|
|
466
|
-
### Configuração do Cookie
|
|
467
|
-
|
|
468
|
-
```tsx
|
|
469
|
-
<ConsentProvider
|
|
470
|
-
cookie={{
|
|
471
|
-
name: 'meuSiteConsent',
|
|
472
|
-
maxAgeDays: 180,
|
|
473
|
-
sameSite: 'Strict'
|
|
474
|
-
}}
|
|
475
|
-
>
|
|
476
|
-
```
|
|
477
|
-
|
|
478
|
-
### Callbacks
|
|
479
|
-
|
|
480
|
-
```tsx
|
|
481
|
-
<ConsentProvider
|
|
482
|
-
onConsentGiven={(state) => {
|
|
483
|
-
console.log('Consentimento dado:', state)
|
|
484
|
-
// Inicializar analytics, etc.
|
|
485
|
-
}}
|
|
486
|
-
onPreferencesSaved={(prefs) => {
|
|
487
|
-
console.log('Preferências salvas:', prefs)
|
|
488
|
-
}}
|
|
489
|
-
>
|
|
490
|
-
```
|
|
491
|
-
|
|
492
|
-
## � Banner Bloqueante
|
|
493
|
-
|
|
494
|
-
Para cenários onde é necessário bloquear o acesso até obter consentimento explícito:
|
|
495
|
-
|
|
496
|
-
```tsx
|
|
497
|
-
<CookieBanner blocking />
|
|
498
|
-
```
|
|
499
|
-
|
|
500
|
-
Com `blocking={true}`, o banner:
|
|
501
|
-
|
|
502
|
-
- Cria um overlay escuro sobre todo o conteúdo
|
|
503
|
-
- Impede interação com o resto da página
|
|
504
|
-
- É útil para casos críticos onde consentimento é obrigatório
|
|
505
|
-
|
|
506
|
-
## 🎨 Sistema de Temas
|
|
507
|
-
|
|
508
|
-
### Tema Personalizado
|
|
509
|
-
|
|
510
|
-
```tsx
|
|
511
|
-
import { createTheme } from '@mui/material/styles'
|
|
512
|
-
|
|
513
|
-
const meuTema = createTheme({
|
|
514
|
-
palette: {
|
|
515
|
-
primary: { main: '#2196f3' },
|
|
516
|
-
secondary: { main: '#f50057' },
|
|
517
|
-
},
|
|
518
|
-
})
|
|
519
|
-
|
|
520
|
-
<ConsentProvider theme={meuTema}>
|
|
521
|
-
<App />
|
|
522
|
-
</ConsentProvider>
|
|
523
|
-
```
|
|
524
|
-
|
|
525
|
-
### Tema Padrão
|
|
526
|
-
|
|
527
|
-
O tema padrão do react-lgpd-consent está disponível para customização:
|
|
528
|
-
|
|
529
|
-
```tsx
|
|
530
|
-
import { defaultConsentTheme } from 'react-lgpd-consent'
|
|
531
|
-
|
|
532
|
-
const temaCustomizado = createTheme({
|
|
533
|
-
...defaultConsentTheme,
|
|
534
|
-
palette: {
|
|
535
|
-
...defaultConsentTheme.palette,
|
|
536
|
-
primary: { main: '#your-color' },
|
|
537
|
-
},
|
|
538
|
-
})
|
|
539
136
|
```
|
|
540
137
|
|
|
541
|
-
|
|
138
|
+
### API e Funcionalidades
|
|
542
139
|
|
|
543
|
-
|
|
140
|
+
A versão `v0.3.0` simplifica a API e melhora a experiência do desenvolvedor.
|
|
544
141
|
|
|
545
|
-
|
|
142
|
+
- **Componentes UI Sobrescrevíveis com Tipagem Clara**: Agora você pode fornecer seus próprios componentes para o banner, modal e botão flutuante, com props tipadas para garantir a compatibilidade. Consulte `CustomCookieBannerProps`, `CustomPreferencesModalProps` e `CustomFloatingPreferencesButtonProps` para detalhes.
|
|
143
|
+
- **Controle Simplificado do Modal**: A prop `disableAutomaticModal` foi removida. A visibilidade do modal é controlada internamente.
|
|
144
|
+
- **Remoção de Hooks Internos**: O hook `useConsentComponentProps` foi removido para simplificar a API. Use `useConsent()` e `useConsentTexts()` diretamente.
|
|
546
145
|
|
|
547
|
-
|
|
548
|
-
import { loadScript } from 'react-lgpd-consent'
|
|
146
|
+
### Hooks
|
|
549
147
|
|
|
550
|
-
|
|
551
|
-
await loadScript(
|
|
552
|
-
'gtag',
|
|
553
|
-
'https://www.googletagmanager.com/gtag/js?id=GA_ID',
|
|
554
|
-
'analytics', // Categoria obrigatória
|
|
555
|
-
)
|
|
148
|
+
A biblioteca exporta hooks para controle total e criação de UIs customizadas:
|
|
556
149
|
|
|
557
|
-
|
|
558
|
-
|
|
559
|
-
|
|
150
|
+
- `useConsent()`: O hook principal para interagir com o estado de consentimento.
|
|
151
|
+
- `useCategories()`: Retorna a lista de todas as categorias ativas no projeto.
|
|
152
|
+
- `useCategoryStatus('id')`: Verifica se uma categoria específica está ativa e configurada.
|
|
560
153
|
|
|
561
|
-
|
|
154
|
+
## 🛡️ Conformidade e LGPD
|
|
562
155
|
|
|
563
|
-
|
|
564
|
-
- **Só executa após salvar**: Scripts só rodam quando o usuário finaliza as preferências
|
|
565
|
-
- **Baseado em categoria**: Respeita as permissões por categoria
|
|
156
|
+
Esta biblioteca foi projetada para auxiliar na conformidade com a LGPD, implementando princípios como:
|
|
566
157
|
|
|
567
|
-
|
|
158
|
+
- **Consentimento Granular**: O usuário pode escolher quais categorias aceitar.
|
|
159
|
+
- **Minimização de Dados**: Apenas as categorias declaradas são gerenciadas e armazenadas no cookie.
|
|
160
|
+
- **Transparência**: O sistema de textos e o cookie de auditoria fornecem informações claras.
|
|
161
|
+
- **Facilidade de Revogação**: O usuário pode alterar suas preferências a qualquer momento.
|
|
568
162
|
|
|
569
|
-
|
|
163
|
+
Para mais detalhes, consulte o nosso **[Guia de Conformidade](docs/CONFORMIDADE-LGPD.md)**.
|
|
570
164
|
|
|
571
|
-
|
|
165
|
+
## 🤝 Contribuições
|
|
572
166
|
|
|
573
|
-
|
|
574
|
-
import { ConsentProvider, useConsent } from 'react-lgpd-consent'
|
|
575
|
-
import MeuModalCustomizado from './MeuModalCustomizado'
|
|
576
|
-
|
|
577
|
-
function App() {
|
|
578
|
-
return (
|
|
579
|
-
<ConsentProvider
|
|
580
|
-
PreferencesModalComponent={MeuModalCustomizado}
|
|
581
|
-
preferencesModalProps={{ variant: 'custom' }}
|
|
582
|
-
>
|
|
583
|
-
<MeuApp />
|
|
584
|
-
</ConsentProvider>
|
|
585
|
-
)
|
|
586
|
-
}
|
|
587
|
-
|
|
588
|
-
// Seu componente customizado
|
|
589
|
-
function MeuModalCustomizado({ variant }) {
|
|
590
|
-
const { isModalOpen, closePreferences, setPreference } = useConsent()
|
|
591
|
-
|
|
592
|
-
return (
|
|
593
|
-
<MyCustomDialog open={isModalOpen} onClose={closePreferences}>
|
|
594
|
-
{/* Seu design personalizado aqui */}
|
|
595
|
-
</MyCustomDialog>
|
|
596
|
-
)
|
|
597
|
-
}
|
|
598
|
-
```
|
|
599
|
-
|
|
600
|
-
### Desabilitar Modal Automático
|
|
601
|
-
|
|
602
|
-
Para controle total, desabilite o modal automático:
|
|
603
|
-
|
|
604
|
-
```tsx
|
|
605
|
-
<ConsentProvider disableAutomaticModal>
|
|
606
|
-
<MeuApp />
|
|
607
|
-
{/* Renderize seus componentes customizados onde quiser */}
|
|
608
|
-
<MeuModalTotalmenteCustomizado />
|
|
609
|
-
</ConsentProvider>
|
|
610
|
-
```
|
|
611
|
-
|
|
612
|
-
## �🔧 API Completa
|
|
613
|
-
|
|
614
|
-
### Components
|
|
615
|
-
|
|
616
|
-
| Componente | Descrição | Props Principais |
|
|
617
|
-
| --------------------------- | ------------------------------------------------ | ---------------------------------------------------------------------------------------- |
|
|
618
|
-
| `ConsentProvider` | Provider principal do contexto | `initialState`, `texts`, `theme`, `hideBranding`, `PreferencesModalComponent`, `disableDeveloperGuidance`, callbacks |
|
|
619
|
-
| `CookieBanner` | Banner de consentimento | `policyLinkUrl`, `blocking`, `hideBranding`, `debug`, pass-through MUI props |
|
|
620
|
-
| `PreferencesModal` | Modal de preferências (incluído automaticamente) | `DialogProps`, `hideBranding` - **Opcional** |
|
|
621
|
-
| `FloatingPreferencesButton` | Botão flutuante para abrir preferências | `position`, `hideWhenConsented`, `tooltip`, `icon`, `FabProps` |
|
|
622
|
-
| `ConsentGate` | Renderização condicional por categoria | `category`, `children` |
|
|
623
|
-
|
|
624
|
-
### Hook `useConsent()`
|
|
625
|
-
|
|
626
|
-
```typescript
|
|
627
|
-
interface ConsentContextValue {
|
|
628
|
-
consented: boolean // usuário já consentiu?
|
|
629
|
-
preferences: ConsentPreferences // preferências atuais
|
|
630
|
-
isModalOpen: boolean // estado do modal de preferências
|
|
631
|
-
acceptAll(): void // aceitar todas as categorias
|
|
632
|
-
rejectAll(): void // recusar opcionais
|
|
633
|
-
setPreference(cat: Category, value: boolean): void // definir categoria específica
|
|
634
|
-
openPreferences(): void // abrir modal de preferências
|
|
635
|
-
closePreferences(): void // fechar modal
|
|
636
|
-
resetConsent(): void // resetar tudo
|
|
637
|
-
}
|
|
638
|
-
```
|
|
639
|
-
|
|
640
|
-
### Hook `useConsentTexts()`
|
|
641
|
-
|
|
642
|
-
```typescript
|
|
643
|
-
// Acesso aos textos contextuais
|
|
644
|
-
const texts = useConsentTexts()
|
|
645
|
-
console.log(texts.banner.title) // "Política de Cookies"
|
|
646
|
-
```
|
|
647
|
-
|
|
648
|
-
### Utilitários
|
|
649
|
-
|
|
650
|
-
- `loadScript(id, src, category?, attrs?)` - Carrega scripts com consentimento inteligente
|
|
651
|
-
- `defaultConsentTheme` - Tema padrão do Material-UI
|
|
652
|
-
- Tipos TypeScript completos exportados## 🌐 SSR / Next.js
|
|
653
|
-
|
|
654
|
-
Para evitar flash de conteúdo em SSR:
|
|
655
|
-
|
|
656
|
-
```tsx
|
|
657
|
-
// pages/_app.tsx (Next.js)
|
|
658
|
-
function MyApp({ Component, pageProps }) {
|
|
659
|
-
return (
|
|
660
|
-
<ConsentProvider
|
|
661
|
-
initialState={{
|
|
662
|
-
consented: false,
|
|
663
|
-
preferences: { analytics: false, marketing: false },
|
|
664
|
-
}}
|
|
665
|
-
>
|
|
666
|
-
<Component {...pageProps} />
|
|
667
|
-
</ConsentProvider>
|
|
668
|
-
)
|
|
669
|
-
}
|
|
670
|
-
```
|
|
671
|
-
|
|
672
|
-
## ♿ Acessibilidade
|
|
673
|
-
|
|
674
|
-
A biblioteca segue as melhores práticas de acessibilidade:
|
|
675
|
-
|
|
676
|
-
- ✅ Navegação por teclado (Tab, Enter, Escape)
|
|
677
|
-
- ✅ Leitores de tela (`aria-labelledby`, `aria-describedby`)
|
|
678
|
-
- ✅ Foco gerenciado automaticamente
|
|
679
|
-
- ✅ Contrastes adequados
|
|
680
|
-
- ✅ Estrutura semântica correta
|
|
681
|
-
|
|
682
|
-
## 📚 Exemplos
|
|
683
|
-
|
|
684
|
-
Confira exemplos completos no repositório:
|
|
685
|
-
|
|
686
|
-
- [Básico com React](./examples/basic)
|
|
687
|
-
- [Next.js com SSR](./examples/nextjs)
|
|
688
|
-
- [Customização avançada](./examples/advanced)
|
|
689
|
-
- [Integração com analytics](./examples/analytics)
|
|
690
|
-
|
|
691
|
-
## 🤝 Contribuição
|
|
692
|
-
|
|
693
|
-
Contribuições são bem-vindas! Por favor:
|
|
694
|
-
|
|
695
|
-
1. Faça fork do projeto
|
|
696
|
-
2. Crie uma branch para sua feature (`git checkout -b feature/AmazingFeature`)
|
|
697
|
-
3. Commit suas mudanças (`git commit -m 'Add some AmazingFeature'`)
|
|
698
|
-
4. Push para a branch (`git push origin feature/AmazingFeature`)
|
|
699
|
-
5. Abra um Pull Request
|
|
167
|
+
Contribuições são bem-vindas! Sinta-se à vontade para abrir uma _issue_ ou um _pull request_.
|
|
700
168
|
|
|
701
169
|
## 📄 Licença
|
|
702
170
|
|
|
703
|
-
Este projeto está
|
|
704
|
-
|
|
705
|
-
## 🙋♀️ Suporte
|
|
706
|
-
|
|
707
|
-
- 📖 [Documentação](./docs)
|
|
708
|
-
- 🐛 [Issues](https://github.com/lucianoedipo/react-lgpd-consent/issues)
|
|
709
|
-
- 💬 [Discussões](https://github.com/lucianoedipo/react-lgpd-consent/discussions)
|
|
710
|
-
|
|
711
|
-
## 🔮 Roadmap
|
|
712
|
-
|
|
713
|
-
### ✅ v0.2.2 - Sistema de Orientações (Lançado!)
|
|
714
|
-
|
|
715
|
-
**Implementado: Sistema inteligente de orientação para desenvolvedores**
|
|
716
|
-
|
|
717
|
-
- ✅ **Console de Desenvolvimento**: Avisos automáticos e orientações
|
|
718
|
-
- ✅ **UI Dinâmica**: Componentes se adaptam à configuração do projeto
|
|
719
|
-
- ✅ **Hooks Avançados**: `useCategories()` e `useCategoryStatus()`
|
|
720
|
-
- ✅ **Validação Automática**: Prevenção de bugs de configuração vs UI
|
|
721
|
-
|
|
722
|
-
### v0.2.3 - Compliance Avançado (Próxima Release)
|
|
723
|
-
|
|
724
|
-
**Baseado em feedback de uso real em projetos governamentais:**
|
|
725
|
-
|
|
726
|
-
- 📋 **Sistema de Logs de Auditoria**: Rastreamento completo para prestação de contas
|
|
727
|
-
- 📜 **Templates Setoriais**: Textos pré-configurados (governo, saúde, educação)
|
|
728
|
-
- 🎨 **Presets Visuais**: Identidade visual por setor (acessibilidade WCAG AAA)
|
|
729
|
-
- 📊 **Dashboard para DPOs**: Relatórios automáticos de compliance
|
|
730
|
-
- 🔌 **Mais Integrações**: Microsoft Clarity, Hotjar, Intercom, LinkedIn
|
|
731
|
-
|
|
732
|
-
### v0.3.0 - Multi-Regulamentação
|
|
733
|
-
|
|
734
|
-
- 🌍 **Suporte GDPR/CCPA**: Detecção automática por geolocalização
|
|
735
|
-
- 🏗️ **Sistema de Plugins**: Extensões de terceiros
|
|
736
|
-
- 🎭 **Temas Avançados**: Design system tokens
|
|
737
|
-
|
|
738
|
-
### v0.4.0 - Enterprise
|
|
739
|
-
|
|
740
|
-
- 📈 **Analytics Avançadas**: Dashboards completos
|
|
741
|
-
- 🔄 **Sync Multi-Domínio**: Consentimento compartilhado
|
|
742
|
-
- 🛡️ **Segurança Empresarial**: Criptografia, audit logs remotos
|
|
743
|
-
|
|
744
|
-
> 📋 **Implementado na v0.2.2**: Sistema de orientações para developers e UI dinâmica
|
|
745
|
-
|
|
746
|
-
---
|
|
747
|
-
|
|
748
|
-
<div align="center">
|
|
749
|
-
|
|
750
|
-
**Feito com ❤️ para a comunidade React brasileira**
|
|
751
|
-
|
|
752
|
-
</div>
|
|
171
|
+
Este projeto está sob a licença MIT. Veja o arquivo [LICENSE](LICENSE) para mais detalhes.
|