react-lgpd-consent 0.1.13 → 0.2.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/README.md CHANGED
@@ -0,0 +1,577 @@
1
+ # react-lgpd-consent 🍪
2
+
3
+ [![NPM Version](https://img.shields.io/npm/v/react-lgpd-consent?style=for-the-badge&color=blue)](https://www.npmjs.com/package/react-lgpd-consent)
4
+ [![License](https://img.shields.io/npm/l/react-lgpd-consent?style=for-the-badge)](https://github.com/lucianoedipo/react-lgpd-consent/blob/main/LICENSE)
5
+ [![TypeScript](https://img.shields.io/badge/TypeScript-Ready-blue?style=for-the-badge&logo=typescript)](https://## 🔧 API Completa
6
+
7
+ > **📖 Documentação Detalhada**: [API v0.2.0](./docs/API-v0.2.0.md) | [API v0.1.x (Legacy)](./docs/API-0.1.x.md)
8
+
9
+ ### Components.typescriptlang.org/)
10
+
11
+ [![React](https://img.shields.io/badge/React-18%2B-61DAFB?style=for-the-badge&logo=react)](https://reactjs.org/)
12
+ [![Material-UI](https://img.shields.io/badge/MUI-Ready-007FFF?style=for-the-badge&logo=mui)](https://mui.com/)
13
+
14
+ > **Biblioteca completa de consentimento de cookies para React e Next.js em conformidade com a LGPD**
15
+
16
+ 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.
17
+
18
+ ## ✨ Características Principais
19
+
20
+ - 🇧🇷 **Conformidade LGPD + ANPD**: 6 categorias baseadas no Guia Orientativo da ANPD
21
+ - 🍪 **Categorias Extensíveis**: Sistema dinâmico para categorias customizadas
22
+ - 🚀 **Integrações Nativas**: Google Analytics, Tag Manager, UserWay automatizados
23
+ - ⚡ **Client-Side First**: Arquitetura otimizada para SPA com zero-flash
24
+ - 🎨 **Material-UI Integration**: Componentes prontos e customizáveis com MUI
25
+ - ♿ **Acessibilidade**: Navegação por teclado e leitores de tela nativamente suportados
26
+ - 🌐 **Internacionalização**: Textos totalmente customizáveis (padrão pt-BR)
27
+ - 🚀 **TypeScript**: API completamente tipada para melhor DX
28
+ - 📦 **Zero Config**: Funciona out-of-the-box com configurações sensatas
29
+ - 🎯 **Granular Control**: Controle individual de 6+ categorias de cookies
30
+ - 🚫 **Banner Bloqueante**: Modo opcional para exigir interação antes de continuar
31
+ - 🎨 **Sistema de Temas**: Temas customizáveis para integração visual perfeita
32
+ - ⚡ **Carregamento Automático**: Scripts só executam após consentimento explícito
33
+ - 🔌 **Modal Automático**: Modal de preferências incluído automaticamente com lazy loading
34
+ - 🎛️ **Botão Flutuante**: Componente opcional para acesso fácil às preferências
35
+
36
+ ## 🚀 Instalação
37
+
38
+ ```bash
39
+ npm install react-lgpd-consent
40
+ # ou
41
+ yarn add react-lgpd-consent
42
+ # ou
43
+ pnpm add react-lgpd-consent
44
+ ```
45
+
46
+ ### Dependências
47
+
48
+ ```bash
49
+ npm install @mui/material js-cookie
50
+ ```
51
+
52
+ ## 🆕 Novidades v0.2.0 - Adequação ANPD Completa
53
+
54
+ ### 🍪 Categorias Baseadas no Guia da ANPD
55
+
56
+ A biblioteca agora inclui **6 categorias** baseadas no Guia Orientativo da ANPD:
57
+
58
+ - **`necessary`**: Cookies essenciais (sempre ativos)
59
+ - **`analytics`**: Análise e estatísticas de uso
60
+ - **`functional`**: Funcionalidades extras (preferências, idioma)
61
+ - **`marketing`**: Publicidade e marketing direcionado
62
+ - **`social`**: Integração com redes sociais
63
+ - **`personalization`**: Personalização de conteúdo
64
+
65
+ ### 🔧 Categorias Customizadas
66
+
67
+ ```tsx
68
+ const customCategories = [
69
+ {
70
+ id: 'governo',
71
+ name: 'Integração Governo',
72
+ description: 'Cookies para integração com sistemas governamentais.',
73
+ essential: false,
74
+ cookies: ['gov_session', 'cpf_hash']
75
+ },
76
+ {
77
+ id: 'acessibilidade',
78
+ name: 'Acessibilidade',
79
+ description: 'Ferramentas para melhorar acessibilidade.',
80
+ essential: false,
81
+ cookies: ['userway_*', 'voice_*']
82
+ }
83
+ ]
84
+
85
+ <ConsentProvider customCategories={customCategories}>
86
+ {/* Sua aplicação */}
87
+ </ConsentProvider>
88
+ ```
89
+
90
+ ### 🚀 Integrações Automáticas
91
+
92
+ ```tsx
93
+ import {
94
+ ConsentScriptLoader,
95
+ createGoogleAnalyticsIntegration,
96
+ createUserWayIntegration,
97
+ } from 'react-lgpd-consent'
98
+
99
+ const integrations = [
100
+ createGoogleAnalyticsIntegration({
101
+ measurementId: 'GA_MEASUREMENT_ID',
102
+ }),
103
+ createUserWayIntegration({
104
+ accountId: 'USERWAY_ACCOUNT_ID',
105
+ }),
106
+ ]
107
+
108
+ function App() {
109
+ return (
110
+ <ConsentProvider>
111
+ {/* Scripts carregam automaticamente quando categoria é aceita */}
112
+ <ConsentScriptLoader integrations={integrations} />
113
+
114
+ <CookieBanner policyLinkUrl="/privacy-policy" />
115
+ </ConsentProvider>
116
+ )
117
+ }
118
+ ```
119
+
120
+ ### 📝 Textos ANPD Expandidos
121
+
122
+ ```tsx
123
+ <ConsentProvider
124
+ texts={{
125
+ bannerMessage: 'Utilizamos cookies para melhorar sua experiência.',
126
+ // Textos ANPD opcionais
127
+ controllerInfo: 'Controlado por Empresa LTDA (CNPJ: 00.000.000/0001-00)',
128
+ dataTypes: 'Coletamos dados de navegação, preferências e interações.',
129
+ thirdPartySharing: 'Compartilhamos com: Google Analytics, Facebook Pixel',
130
+ userRights: 'Você tem direito a acesso, correção e exclusão dos dados.',
131
+ contactInfo: 'Contato DPO: dpo@empresa.com.br | (11) 9999-9999',
132
+ retentionPeriod: 'Dados armazenados por até 12 meses.',
133
+ lawfulBasis: 'Base legal: consentimento do titular dos dados.',
134
+ transferCountries: 'Dados podem ser transferidos para: EUA, Irlanda.',
135
+ }}
136
+ >
137
+ {/* Os textos são exibidos condicionalmente apenas se definidos */}
138
+ </ConsentProvider>
139
+ ```
140
+
141
+ ## � Exemplo Completo
142
+
143
+ ```tsx
144
+ import {
145
+ ConsentProvider,
146
+ CookieBanner,
147
+ FloatingPreferencesButton,
148
+ } from 'react-lgpd-consent'
149
+
150
+ function App() {
151
+ return (
152
+ <ConsentProvider>
153
+ <div>
154
+ <h1>Meu Site</h1>
155
+ <p>Conteúdo do site...</p>
156
+
157
+ {/* Banner de cookies - Modal incluído automaticamente! */}
158
+ <CookieBanner policyLinkUrl="/privacy-policy" blocking={true} />
159
+
160
+ {/* Botão flutuante opcional para acesso às preferências */}
161
+ <FloatingPreferencesButton position="bottom-right" />
162
+ </div>
163
+ </ConsentProvider>
164
+ )
165
+ }
166
+ ```
167
+
168
+ ## �📖 Uso Básico
169
+
170
+ ### 1. Setup do Provider
171
+
172
+ ```tsx
173
+ import { ConsentProvider } from 'react-lgpd-consent'
174
+
175
+ function App() {
176
+ return (
177
+ <ConsentProvider>
178
+ <YourApp />
179
+ </ConsentProvider>
180
+ )
181
+ }
182
+ ```
183
+
184
+ ### 2. Banner de Consentimento
185
+
186
+ ```tsx
187
+ import { CookieBanner } from 'react-lgpd-consent'
188
+
189
+ function Layout() {
190
+ return (
191
+ <>
192
+ <YourContent />
193
+ <CookieBanner
194
+ policyLinkUrl="/politica-privacidade"
195
+ blocking={true} // Padrão: bloqueia até decisão
196
+ />
197
+ {/* Modal de preferências incluído automaticamente! */}
198
+ </>
199
+ )
200
+ }
201
+ ```
202
+
203
+ ### 3. Uso do Hook
204
+
205
+ ```tsx
206
+ import { useConsent } from 'react-lgpd-consent'
207
+
208
+ function MyComponent() {
209
+ const { consented, preferences, acceptAll, openPreferences } = useConsent()
210
+
211
+ return (
212
+ <div>
213
+ <p>Consentimento: {consented ? 'Dado' : 'Pendente'}</p>
214
+ <button onClick={acceptAll}>Aceitar Todos</button>
215
+ <button onClick={openPreferences}>Gerenciar Preferências</button>
216
+ </div>
217
+ )
218
+ }
219
+ ```
220
+
221
+ > ✅ **O modal de preferências é incluído automaticamente pelo ConsentProvider!** Não é mais necessário renderizá-lo manualmente.
222
+
223
+ ````
224
+
225
+ ### 4. Carregamento Condicional de Scripts
226
+
227
+ ```tsx
228
+ import { ConsentGate, loadScript } from 'react-lgpd-consent'
229
+
230
+ function Analytics() {
231
+ return (
232
+ <ConsentGate category="analytics">
233
+ <GoogleAnalytics />
234
+ </ConsentGate>
235
+ )
236
+ }
237
+
238
+ // Ou carregando scripts que aguardam consentimento
239
+ function MyComponent() {
240
+ const { preferences, consented } = useConsent()
241
+
242
+ useEffect(() => {
243
+ if (consented && preferences.analytics) {
244
+ loadConditionalScript(
245
+ 'ga',
246
+ 'https://www.googletagmanager.com/gtag/js?id=GA_ID',
247
+ () => preferences.analytics, // Condição que aguarda
248
+ )
249
+ }
250
+ }, [preferences, consented])
251
+ }
252
+ ````
253
+
254
+ ## 🎨 Customização
255
+
256
+ ### Banner Bloqueante vs Não-bloqueante
257
+
258
+ ```tsx
259
+ // Banner bloqueante (padrão) - impede interação até decisão
260
+ <CookieBanner blocking={true} />
261
+
262
+ // Banner não-intrusivo - permite navegação
263
+ <CookieBanner blocking={false} />
264
+ ```
265
+
266
+ ### Tema Personalizado
267
+
268
+ ```tsx
269
+ import { ConsentProvider, defaultConsentTheme } from 'react-lgpd-consent'
270
+ import { createTheme } from '@mui/material/styles'
271
+
272
+ const meuTema = createTheme({
273
+ ...defaultConsentTheme,
274
+ palette: {
275
+ ...defaultConsentTheme.palette,
276
+ primary: {
277
+ main: '#1976d2', // Sua cor principal
278
+ },
279
+ },
280
+ })
281
+
282
+ <ConsentProvider theme={meuTema}>
283
+ <App />
284
+ </ConsentProvider>
285
+ ```
286
+
287
+ ### Textos Personalizados
288
+
289
+ ```tsx
290
+ <ConsentProvider
291
+ texts={{
292
+ bannerMessage: "Utilizamos cookies para melhorar sua experiência.",
293
+ acceptAll: "Aceitar Todos",
294
+ declineAll: "Recusar Opcionais",
295
+ preferences: "Configurar"
296
+ }}
297
+ >
298
+ ```
299
+
300
+ ### Configuração do Cookie
301
+
302
+ ```tsx
303
+ <ConsentProvider
304
+ cookie={{
305
+ name: 'meuSiteConsent',
306
+ maxAgeDays: 180,
307
+ sameSite: 'Strict'
308
+ }}
309
+ >
310
+ ```
311
+
312
+ ### Callbacks
313
+
314
+ ```tsx
315
+ <ConsentProvider
316
+ onConsentGiven={(state) => {
317
+ console.log('Consentimento dado:', state)
318
+ // Inicializar analytics, etc.
319
+ }}
320
+ onPreferencesSaved={(prefs) => {
321
+ console.log('Preferências salvas:', prefs)
322
+ }}
323
+ >
324
+ ```
325
+
326
+ ## � Banner Bloqueante
327
+
328
+ Para cenários onde é necessário bloquear o acesso até obter consentimento explícito:
329
+
330
+ ```tsx
331
+ <CookieBanner blocking />
332
+ ```
333
+
334
+ Com `blocking={true}`, o banner:
335
+
336
+ - Cria um overlay escuro sobre todo o conteúdo
337
+ - Impede interação com o resto da página
338
+ - É útil para casos críticos onde consentimento é obrigatório
339
+
340
+ ## 🎨 Sistema de Temas
341
+
342
+ ### Tema Personalizado
343
+
344
+ ```tsx
345
+ import { createTheme } from '@mui/material/styles'
346
+
347
+ const meuTema = createTheme({
348
+ palette: {
349
+ primary: { main: '#2196f3' },
350
+ secondary: { main: '#f50057' },
351
+ },
352
+ })
353
+
354
+ <ConsentProvider theme={meuTema}>
355
+ <App />
356
+ </ConsentProvider>
357
+ ```
358
+
359
+ ### Tema Padrão
360
+
361
+ O tema padrão do react-lgpd-consent está disponível para customização:
362
+
363
+ ```tsx
364
+ import { defaultConsentTheme } from 'react-lgpd-consent'
365
+
366
+ const temaCustomizado = createTheme({
367
+ ...defaultConsentTheme,
368
+ palette: {
369
+ ...defaultConsentTheme.palette,
370
+ primary: { main: '#your-color' },
371
+ },
372
+ })
373
+ ```
374
+
375
+ ## ⚡ Carregamento Inteligente de Scripts
376
+
377
+ ### Função loadScript
378
+
379
+ Scripts aguardam automaticamente o **consentimento finalizado** (banner fechado ou preferências salvas):
380
+
381
+ ```tsx
382
+ import { loadScript } from 'react-lgpd-consent'
383
+
384
+ // Carrega script apenas após consentimento para analytics
385
+ await loadScript(
386
+ 'gtag',
387
+ 'https://www.googletagmanager.com/gtag/js?id=GA_ID',
388
+ 'analytics', // Categoria obrigatória
389
+ )
390
+
391
+ // Script geral (sempre carrega após consentimento)
392
+ await loadScript('custom-script', 'https://example.com/script.js')
393
+ ```
394
+
395
+ ### Comportamento Inteligente
396
+
397
+ - **Aguarda decisão final**: Não executa durante mudanças no modal de preferências
398
+ - **Só executa após salvar**: Scripts só rodam quando o usuário finaliza as preferências
399
+ - **Baseado em categoria**: Respeita as permissões por categoria
400
+
401
+ ## 🎨 Personalização Total
402
+
403
+ ### Modal de Preferências Customizado
404
+
405
+ Substitua completamente o modal padrão com seu próprio componente:
406
+
407
+ ```tsx
408
+ import { ConsentProvider, useConsent } from 'react-lgpd-consent'
409
+ import MeuModalCustomizado from './MeuModalCustomizado'
410
+
411
+ function App() {
412
+ return (
413
+ <ConsentProvider
414
+ PreferencesModalComponent={MeuModalCustomizado}
415
+ preferencesModalProps={{ variant: 'custom' }}
416
+ >
417
+ <MeuApp />
418
+ </ConsentProvider>
419
+ )
420
+ }
421
+
422
+ // Seu componente customizado
423
+ function MeuModalCustomizado({ variant }) {
424
+ const { isModalOpen, closePreferences, setPreference } = useConsent()
425
+
426
+ return (
427
+ <MyCustomDialog open={isModalOpen} onClose={closePreferences}>
428
+ {/* Seu design personalizado aqui */}
429
+ </MyCustomDialog>
430
+ )
431
+ }
432
+ ```
433
+
434
+ ### Desabilitar Modal Automático
435
+
436
+ Para controle total, desabilite o modal automático:
437
+
438
+ ```tsx
439
+ <ConsentProvider disableAutomaticModal>
440
+ <MeuApp />
441
+ {/* Renderize seus componentes customizados onde quiser */}
442
+ <MeuModalTotalmenteCustomizado />
443
+ </ConsentProvider>
444
+ ```
445
+
446
+ ## �🔧 API Completa
447
+
448
+ ### Components
449
+
450
+ | Componente | Descrição | Props Principais |
451
+ | --------------------------- | ------------------------------------------------ | ---------------------------------------------------------------------------------------- |
452
+ | `ConsentProvider` | Provider principal do contexto | `initialState`, `texts`, `theme`, `hideBranding`, `PreferencesModalComponent`, callbacks |
453
+ | `CookieBanner` | Banner de consentimento | `policyLinkUrl`, `blocking`, `hideBranding`, `debug`, pass-through MUI props |
454
+ | `PreferencesModal` | Modal de preferências (incluído automaticamente) | `DialogProps`, `hideBranding` - **Opcional** |
455
+ | `FloatingPreferencesButton` | Botão flutuante para abrir preferências | `position`, `hideWhenConsented`, `tooltip`, `icon`, `FabProps` |
456
+ | `ConsentGate` | Renderização condicional por categoria | `category`, `children` |
457
+
458
+ ### Hook `useConsent()`
459
+
460
+ ```typescript
461
+ interface ConsentContextValue {
462
+ consented: boolean // usuário já consentiu?
463
+ preferences: ConsentPreferences // preferências atuais
464
+ isModalOpen: boolean // estado do modal de preferências
465
+ acceptAll(): void // aceitar todas as categorias
466
+ rejectAll(): void // recusar opcionais
467
+ setPreference(cat: Category, value: boolean): void // definir categoria específica
468
+ openPreferences(): void // abrir modal de preferências
469
+ closePreferences(): void // fechar modal
470
+ resetConsent(): void // resetar tudo
471
+ }
472
+ ```
473
+
474
+ ### Hook `useConsentTexts()`
475
+
476
+ ```typescript
477
+ // Acesso aos textos contextuais
478
+ const texts = useConsentTexts()
479
+ console.log(texts.banner.title) // "Política de Cookies"
480
+ ```
481
+
482
+ ### Utilitários
483
+
484
+ - `loadScript(id, src, category?, attrs?)` - Carrega scripts com consentimento inteligente
485
+ - `defaultConsentTheme` - Tema padrão do Material-UI
486
+ - Tipos TypeScript completos exportados## 🌐 SSR / Next.js
487
+
488
+ Para evitar flash de conteúdo em SSR:
489
+
490
+ ```tsx
491
+ // pages/_app.tsx (Next.js)
492
+ function MyApp({ Component, pageProps }) {
493
+ return (
494
+ <ConsentProvider
495
+ initialState={{
496
+ consented: false,
497
+ preferences: { analytics: false, marketing: false },
498
+ }}
499
+ >
500
+ <Component {...pageProps} />
501
+ </ConsentProvider>
502
+ )
503
+ }
504
+ ```
505
+
506
+ ## ♿ Acessibilidade
507
+
508
+ A biblioteca segue as melhores práticas de acessibilidade:
509
+
510
+ - ✅ Navegação por teclado (Tab, Enter, Escape)
511
+ - ✅ Leitores de tela (`aria-labelledby`, `aria-describedby`)
512
+ - ✅ Foco gerenciado automaticamente
513
+ - ✅ Contrastes adequados
514
+ - ✅ Estrutura semântica correta
515
+
516
+ ## 📚 Exemplos
517
+
518
+ Confira exemplos completos no repositório:
519
+
520
+ - [Básico com React](./examples/basic)
521
+ - [Next.js com SSR](./examples/nextjs)
522
+ - [Customização avançada](./examples/advanced)
523
+ - [Integração com analytics](./examples/analytics)
524
+
525
+ ## 🤝 Contribuição
526
+
527
+ Contribuições são bem-vindas! Por favor:
528
+
529
+ 1. Faça fork do projeto
530
+ 2. Crie uma branch para sua feature (`git checkout -b feature/AmazingFeature`)
531
+ 3. Commit suas mudanças (`git commit -m 'Add some AmazingFeature'`)
532
+ 4. Push para a branch (`git push origin feature/AmazingFeature`)
533
+ 5. Abra um Pull Request
534
+
535
+ ## 📄 Licença
536
+
537
+ Este projeto está licenciado sob a Licença MIT - veja o arquivo [LICENSE](LICENSE) para detalhes.
538
+
539
+ ## 🙋‍♀️ Suporte
540
+
541
+ - 📖 [Documentação](./docs)
542
+ - 🐛 [Issues](https://github.com/lucianoedipo/react-lgpd-consent/issues)
543
+ - 💬 [Discussões](https://github.com/lucianoedipo/react-lgpd-consent/discussions)
544
+
545
+ ## 🔮 Roadmap
546
+
547
+ ### v0.2.1 - Compliance Avançado (Próxima Release)
548
+
549
+ **Baseado em feedback de uso real em projetos governamentais:**
550
+
551
+ - 📋 **Sistema de Logs de Auditoria**: Rastreamento completo para prestação de contas
552
+ - 📜 **Templates Setoriais**: Textos pré-configurados (governo, saúde, educação)
553
+ - 🎨 **Presets Visuais**: Identidade visual por setor (acessibilidade WCAG AAA)
554
+ - 📊 **Dashboard para DPOs**: Relatórios automáticos de compliance
555
+ - 🔌 **Mais Integrações**: Microsoft Clarity, Hotjar, Intercom, LinkedIn
556
+
557
+ ### v0.3.0 - Multi-Regulamentação
558
+
559
+ - 🌍 **Suporte GDPR/CCPA**: Detecção automática por geolocalização
560
+ - 🏗️ **Sistema de Plugins**: Extensões de terceiros
561
+ - 🎭 **Temas Avançados**: Design system tokens
562
+
563
+ ### v0.4.0 - Enterprise
564
+
565
+ - 📈 **Analytics Avançadas**: Dashboards completos
566
+ - 🔄 **Sync Multi-Domínio**: Consentimento compartilhado
567
+ - 🛡️ **Segurança Empresarial**: Criptografia, audit logs remotos
568
+
569
+ [📋 Ver plano detalhado v0.2.1](./docs/v0.2.1-PLAN.md)
570
+
571
+ ---
572
+
573
+ <div align="center">
574
+
575
+ **Feito com ❤️ para a comunidade React brasileira**
576
+
577
+ </div>
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  PreferencesModal
3
- } from "./chunk-XIHO7M77.js";
3
+ } from "./chunk-JTPCDTOQ.js";
4
4
  export {
5
5
  PreferencesModal
6
6
  };