react-lgpd-consent 0.2.2 → 0.2.4

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