react-lgpd-consent 0.5.2 → 0.5.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/API.md +576 -0
- package/CHANGELOG.md +155 -1
- package/INTEGRACOES.md +393 -0
- package/QUICKSTART.en.md +7 -0
- package/QUICKSTART.md +97 -11
- package/README.en.md +67 -396
- package/README.md +71 -788
- package/package.json +7 -4
package/CHANGELOG.md
CHANGED
|
@@ -2,7 +2,147 @@
|
|
|
2
2
|
|
|
3
3
|
Todas as mudanças notáveis neste projeto serão documentadas neste arquivo.
|
|
4
4
|
|
|
5
|
-
|
|
5
|
+
# Changelog
|
|
6
|
+
|
|
7
|
+
Todas as mudanças notáveis neste projeto serão documentadas neste arquivo.
|
|
8
|
+
|
|
9
|
+
O formato é baseado em [Keep a Changelog](https://keepachangelog.com/pt-BR/1.0.0/),
|
|
10
|
+
e este projeto adere ao [Semantic Versioning](https://semver.org/lang/pt-BR/).
|
|
11
|
+
|
|
12
|
+
## [0.5.0] - 2025-10-25
|
|
13
|
+
|
|
14
|
+
### 🏗️ Arquitetura Modular - MAJOR REFACTOR
|
|
15
|
+
|
|
16
|
+
Esta versão introduz uma **arquitetura modular** que separa a lógica de consentimento (core) dos componentes UI (mui).
|
|
17
|
+
|
|
18
|
+
### ✨ Added
|
|
19
|
+
|
|
20
|
+
- **Três pacotes independentes**:
|
|
21
|
+
- `@react-lgpd-consent/core` (86 KB ESM) - Lógica headless sem dependências de UI
|
|
22
|
+
- `@react-lgpd-consent/mui` (18 KB ESM) - Componentes UI completos usando Material-UI
|
|
23
|
+
- `react-lgpd-consent` (104 KB ESM) - Pacote agregador mantido para compatibilidade
|
|
24
|
+
|
|
25
|
+
- **Tree-shaking eficiente**: Instale apenas o que você precisa
|
|
26
|
+
- Core isolado permite uso com qualquer biblioteca de UI
|
|
27
|
+
- MUI opcional como peer dependency
|
|
28
|
+
|
|
29
|
+
- **Workspace PNPM**: Monorepo organizado com builds independentes
|
|
30
|
+
- **Guia de migração completo**: [MIGRATION.md](../../MIGRATION.md) documentando todos os cenários
|
|
31
|
+
- **Scripts de publicação**: Suporte para publicar pacotes independentemente
|
|
32
|
+
|
|
33
|
+
### ⚠️ Breaking Changes
|
|
34
|
+
|
|
35
|
+
- **Removida prop `theme` do `ConsentProvider`**
|
|
36
|
+
- **Antes**: `<ConsentProvider theme={createTheme({...})} />`
|
|
37
|
+
- **Depois**: Use `<ThemeProvider>` do Material-UI diretamente
|
|
38
|
+
- **Razão**: Separação de responsabilidades - tema do MUI gerenciado pelo MUI
|
|
39
|
+
- **Migração**: Ver [MIGRATION.md](../../MIGRATION.md) seção "Breaking Changes"
|
|
40
|
+
|
|
41
|
+
### 🔄 Changed
|
|
42
|
+
|
|
43
|
+
- Estrutura de pacotes reorganizada em monorepo
|
|
44
|
+
- Imports atualizados para usar workspace dependencies
|
|
45
|
+
- TypeScript paths configurados para resolução de módulos
|
|
46
|
+
- Jest configurado para resolver tsconfig corretamente
|
|
47
|
+
- Stories refatoradas para usar `ThemeProvider` explicitamente
|
|
48
|
+
|
|
49
|
+
### 📦 Package Structure
|
|
50
|
+
|
|
51
|
+
```
|
|
52
|
+
packages/
|
|
53
|
+
├── core/ # @react-lgpd-consent/core
|
|
54
|
+
│ ├── src/
|
|
55
|
+
│ │ ├── context/ # ConsentProvider, CategoriesContext
|
|
56
|
+
│ │ ├── hooks/ # useConsent, useCategories
|
|
57
|
+
│ │ ├── utils/ # scriptIntegrations, logger
|
|
58
|
+
│ │ └── types/ # TypeScript definitions
|
|
59
|
+
│ └── package.json
|
|
60
|
+
│
|
|
61
|
+
├── mui/ # @react-lgpd-consent/mui
|
|
62
|
+
│ ├── src/
|
|
63
|
+
│ │ ├── components/ # CookieBanner, PreferencesModal, etc.
|
|
64
|
+
│ │ └── index.ts # Re-exports core + UI components
|
|
65
|
+
│ └── package.json
|
|
66
|
+
│
|
|
67
|
+
└── react-lgpd-consent/ # Aggregator (compatibilidade)
|
|
68
|
+
└── package.json # Re-exports @react-lgpd-consent/mui
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
### 📊 Bundle Sizes
|
|
72
|
+
|
|
73
|
+
| Pacote | ESM | CJS | DTS | Dependências |
|
|
74
|
+
|--------|-----|-----|-----|--------------|
|
|
75
|
+
| `@react-lgpd-consent/core` | 86.04 KB | 89.12 KB | 125.82 KB | React, js-cookie, zod |
|
|
76
|
+
| `@react-lgpd-consent/mui` | 17.69 KB | 20.95 KB | 11.78 KB | core + @mui/material (peer) |
|
|
77
|
+
| `react-lgpd-consent` | 104 KB* | 110 KB* | 138 KB* | mui (workspace) |
|
|
78
|
+
|
|
79
|
+
\* Bundle final = core + mui (~104 KB total)
|
|
80
|
+
|
|
81
|
+
### 🎯 Migration Paths
|
|
82
|
+
|
|
83
|
+
1. **Uso de componentes UI** (maioria dos usuários):
|
|
84
|
+
```bash
|
|
85
|
+
# Opção A: Pacote agregador (zero mudanças)
|
|
86
|
+
npm install react-lgpd-consent@0.5.0
|
|
87
|
+
|
|
88
|
+
# Opção B: Pacote MUI direto (recomendado)
|
|
89
|
+
npm install @react-lgpd-consent/mui
|
|
90
|
+
```
|
|
91
|
+
|
|
92
|
+
2. **Headless/UI customizada**:
|
|
93
|
+
```bash
|
|
94
|
+
npm uninstall react-lgpd-consent @mui/material
|
|
95
|
+
npm install @react-lgpd-consent/core
|
|
96
|
+
```
|
|
97
|
+
|
|
98
|
+
3. **NextJS App Router**:
|
|
99
|
+
```tsx
|
|
100
|
+
// Separação clara client/server
|
|
101
|
+
'use client'
|
|
102
|
+
import { ConsentProvider } from '@react-lgpd-consent/mui'
|
|
103
|
+
```
|
|
104
|
+
|
|
105
|
+
### ✅ Maintained (Sem Breaking Changes)
|
|
106
|
+
|
|
107
|
+
- Todas as APIs públicas do `useConsent`
|
|
108
|
+
- Props de `ConsentProvider` (exceto `theme`)
|
|
109
|
+
- Componentes `CookieBanner`, `PreferencesModal`, `FloatingPreferencesButton`
|
|
110
|
+
- Sistema de textos e templates (`TEXT_TEMPLATES`, `resolveTexts`)
|
|
111
|
+
- Sistema de design tokens (`designTokens`)
|
|
112
|
+
- Integrações (Google Analytics, GTM, UserWay, etc.)
|
|
113
|
+
- SSR/NextJS support
|
|
114
|
+
- TypeScript types completos
|
|
115
|
+
|
|
116
|
+
### 🔧 Fixed
|
|
117
|
+
|
|
118
|
+
- Jest configuração: tsconfig path resolution
|
|
119
|
+
- Stories: uso correto de ThemeProvider
|
|
120
|
+
- Type-check: todos os pacotes passam sem erros
|
|
121
|
+
- Tests: 207 testes passando em todos os pacotes
|
|
122
|
+
|
|
123
|
+
### 📚 Documentation
|
|
124
|
+
|
|
125
|
+
- Novo [MIGRATION.md](../../MIGRATION.md) com:
|
|
126
|
+
- 3 cenários de migração detalhados
|
|
127
|
+
- Comparativo de bundles
|
|
128
|
+
- Troubleshooting completo
|
|
129
|
+
- Exemplos antes/depois
|
|
130
|
+
- README atualizado com:
|
|
131
|
+
- 3 opções de instalação
|
|
132
|
+
- Comparativo de pacotes
|
|
133
|
+
- Guia de escolha
|
|
134
|
+
- READMEs específicos para core e mui packages
|
|
135
|
+
|
|
136
|
+
### 🚀 Development
|
|
137
|
+
|
|
138
|
+
- PNPM workspaces configurados
|
|
139
|
+
- Scripts: `build:core`, `build:mui`, `build:main`
|
|
140
|
+
- Scripts: `publish:core`, `publish:mui`, `publish:main`, `publish:all`
|
|
141
|
+
- Type-check executado em todos os pacotes
|
|
142
|
+
- Tests executados em todos os pacotes
|
|
143
|
+
- Node >= 20.0.0 requerido
|
|
144
|
+
|
|
145
|
+
---
|
|
6
146
|
|
|
7
147
|
## [0.4.5] - 2025-10-25 — DataLayer Events e CI/CD
|
|
8
148
|
|
|
@@ -875,3 +1015,17 @@ A v0.2.1 introduz um **sistema inteligente de orientações** que guia desenvolv
|
|
|
875
1015
|
### 🧩 Sem breaking changes
|
|
876
1016
|
|
|
877
1017
|
- Alterações são compatíveis; padrões seguros preservados.
|
|
1018
|
+
## [0.5.0] - 25/10/2025 — Modularização inicial do workspace
|
|
1019
|
+
|
|
1020
|
+
### 🧱 Estrutura modular
|
|
1021
|
+
- Repositório convertido em workspace PNPM com três pacotes: `@react-lgpd-consent/core`, `@react-lgpd-consent/mui` e `react-lgpd-consent`.
|
|
1022
|
+
- Pacote agregador passa a construir entradas adicionais (`core` e `mui`) expondo subpath exports oficiais.
|
|
1023
|
+
|
|
1024
|
+
### 🎨 Camada MUI dedicada
|
|
1025
|
+
- Publicação inicial de `@react-lgpd-consent/mui` como _proxy_ dos componentes padrão.
|
|
1026
|
+
- Metadados de peer dependencies ajustados para reforçar que Material-UI é opcional (requerido apenas para a camada visual).
|
|
1027
|
+
|
|
1028
|
+
### 🧰 Ferramentas & DX
|
|
1029
|
+
- Scripts de lint/test/build convertidos para `pnpm --filter react-lgpd-consent <comando>`.
|
|
1030
|
+
- Jest e TypeDoc atualizados para apontar para `packages/core` e `packages/react-lgpd-consent`.
|
|
1031
|
+
- Documentação (README, QUICKSTART, DEVELOPMENT) revisada para explicar a nova arquitetura e o processo de migração gradual.
|
package/INTEGRACOES.md
ADDED
|
@@ -0,0 +1,393 @@
|
|
|
1
|
+
# Guia de Integrações
|
|
2
|
+
|
|
3
|
+
## 🚀 Visão Geral
|
|
4
|
+
|
|
5
|
+
A biblioteca oferece integrações nativas para as ferramentas mais comuns, eliminando a necessidade de código manual para o carregamento condicional de scripts de terceiros. As categorias usadas pelas integrações são sempre lidas da prop `categories` do `ConsentProvider` (fonte única de verdade).
|
|
6
|
+
|
|
7
|
+
O componente `ConsentScriptLoader` gerencia o carregamento desses scripts automaticamente, disparando-os apenas quando o usuário concede consentimento para a categoria correspondente.
|
|
8
|
+
|
|
9
|
+
## 🎯 Integrações Nativas Disponíveis
|
|
10
|
+
|
|
11
|
+
A biblioteca oferece integrações nativas para as ferramentas mais comuns, eliminando a necessidade de código manual para o carregamento condicional de scripts de terceiros.
|
|
12
|
+
|
|
13
|
+
O componente `ConsentScriptLoader` gerencia o carregamento desses scripts automaticamente, disparando-os apenas quando o usuário concede consentimento para a categoria correspondente.
|
|
14
|
+
|
|
15
|
+
### 1. Google Analytics 4 (GA4)
|
|
16
|
+
|
|
17
|
+
- **Categoria**: `analytics`
|
|
18
|
+
- **Função**: `createGoogleAnalyticsIntegration(config)`
|
|
19
|
+
- **Descrição**: Integração completa com o Google Analytics 4. Suporta `measurementId` e configurações adicionais para o `gtag`.
|
|
20
|
+
|
|
21
|
+
```tsx
|
|
22
|
+
import { createGoogleAnalyticsIntegration, ConsentScriptLoader } from 'react-lgpd-consent'
|
|
23
|
+
|
|
24
|
+
const integrations = [
|
|
25
|
+
createGoogleAnalyticsIntegration({
|
|
26
|
+
measurementId: 'G-XXXXXXXXXX',
|
|
27
|
+
config: { anonymize_ip: true },
|
|
28
|
+
})
|
|
29
|
+
]
|
|
30
|
+
|
|
31
|
+
<ConsentScriptLoader integrations={integrations} />
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
### 2. Google Tag Manager (GTM)
|
|
35
|
+
|
|
36
|
+
- **Categoria**: `analytics`
|
|
37
|
+
- **Função**: `createGoogleTagManagerIntegration(config)`
|
|
38
|
+
- **Descrição**: Carrega o container do Google Tag Manager. Suporta `gtmId` e `dataLayerName`.
|
|
39
|
+
|
|
40
|
+
```tsx
|
|
41
|
+
import { createGoogleTagManagerIntegration } from 'react-lgpd-consent'
|
|
42
|
+
|
|
43
|
+
const integrations = [
|
|
44
|
+
createGoogleTagManagerIntegration({ gtmId: 'GTM-XXXXXXX' })
|
|
45
|
+
]
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
### 3. Facebook Pixel
|
|
49
|
+
|
|
50
|
+
- **Categoria**: `marketing`
|
|
51
|
+
- **Função**: `createFacebookPixelIntegration(config)`
|
|
52
|
+
- **Descrição**: Integração com o Facebook Pixel. Suporta `pixelId` e `autoTrack` para `PageView`.
|
|
53
|
+
|
|
54
|
+
```tsx
|
|
55
|
+
import { createFacebookPixelIntegration } from 'react-lgpd-consent'
|
|
56
|
+
|
|
57
|
+
const integrations = [
|
|
58
|
+
createFacebookPixelIntegration({ pixelId: 'YOUR_PIXEL_ID', autoTrack: true })
|
|
59
|
+
]
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
### 4. Hotjar
|
|
63
|
+
|
|
64
|
+
- **Categoria**: `analytics`
|
|
65
|
+
- **Função**: `createHotjarIntegration(config)`
|
|
66
|
+
- **Descrição**: Carrega o script do Hotjar para análise de comportamento. Suporta `siteId`, `version` e modo `debug`.
|
|
67
|
+
|
|
68
|
+
```tsx
|
|
69
|
+
import { createHotjarIntegration } from 'react-lgpd-consent'
|
|
70
|
+
|
|
71
|
+
const integrations = [createHotjarIntegration({ siteId: '123456', version: 6 })]
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
### 5. Mixpanel
|
|
75
|
+
|
|
76
|
+
- **Categoria**: `analytics`
|
|
77
|
+
- **Função**: `createMixpanelIntegration(config)`
|
|
78
|
+
- **Descrição**: Integração com o Mixpanel para análise de produtos. Suporta `token` e configurações customizadas.
|
|
79
|
+
|
|
80
|
+
```tsx
|
|
81
|
+
import { createMixpanelIntegration } from 'react-lgpd-consent'
|
|
82
|
+
|
|
83
|
+
const integrations = [createMixpanelIntegration({ token: 'YOUR_TOKEN' })]
|
|
84
|
+
```
|
|
85
|
+
|
|
86
|
+
### 6. Microsoft Clarity
|
|
87
|
+
|
|
88
|
+
- **Categoria**: `analytics`
|
|
89
|
+
- **Função**: `createClarityIntegration(config)`
|
|
90
|
+
- **Descrição**: Integração com o Microsoft Clarity. Suporta `projectId`.
|
|
91
|
+
|
|
92
|
+
```tsx
|
|
93
|
+
import { createClarityIntegration } from 'react-lgpd-consent'
|
|
94
|
+
|
|
95
|
+
const integrations = [createClarityIntegration({ projectId: 'abcdef' })]
|
|
96
|
+
```
|
|
97
|
+
|
|
98
|
+
### 7. Intercom
|
|
99
|
+
|
|
100
|
+
- **Categoria**: `functional`
|
|
101
|
+
- **Função**: `createIntercomIntegration(config)`
|
|
102
|
+
- **Descrição**: Adiciona o widget de chat do Intercom. Suporta `app_id`.
|
|
103
|
+
|
|
104
|
+
```tsx
|
|
105
|
+
import { createIntercomIntegration } from 'react-lgpd-consent'
|
|
106
|
+
|
|
107
|
+
const integrations = [createIntercomIntegration({ app_id: 'your_app_id' })]
|
|
108
|
+
```
|
|
109
|
+
|
|
110
|
+
### 8. Zendesk Chat
|
|
111
|
+
|
|
112
|
+
- **Categoria**: `functional`
|
|
113
|
+
- **Função**: `createZendeskChatIntegration(config)`
|
|
114
|
+
- **Descrição**: Adiciona o widget do Zendesk Chat. Suporta `key`.
|
|
115
|
+
|
|
116
|
+
```tsx
|
|
117
|
+
import { createZendeskChatIntegration } from 'react-lgpd-consent'
|
|
118
|
+
|
|
119
|
+
const integrations = [createZendeskChatIntegration({ key: 'your_zendesk_key' })]
|
|
120
|
+
```
|
|
121
|
+
|
|
122
|
+
### 9. UserWay (Acessibilidade)
|
|
123
|
+
|
|
124
|
+
- **Categoria**: `functional`
|
|
125
|
+
- **Função**: `createUserWayIntegration(config)`
|
|
126
|
+
- **Descrição**: Adiciona o widget de acessibilidade do UserWay. Suporta `accountId`.
|
|
127
|
+
|
|
128
|
+
```tsx
|
|
129
|
+
import { createUserWayIntegration } from 'react-lgpd-consent'
|
|
130
|
+
|
|
131
|
+
const integrations = [createUserWayIntegration({ accountId: 'USERWAY_ACCOUNT_ID' })]
|
|
132
|
+
```
|
|
133
|
+
|
|
134
|
+
---
|
|
135
|
+
|
|
136
|
+
## 🧠 Helpers e Templates (v0.4.1)
|
|
137
|
+
|
|
138
|
+
Para simplificar a configuração de múltiplas integrações, a biblioteca oferece templates e funções de ajuda.
|
|
139
|
+
|
|
140
|
+
- `suggestCategoryForScript(name: string)`: Sugere a categoria LGPD apropriada para um nome de script conhecido.
|
|
141
|
+
- `createECommerceIntegrations`, `createSaaSIntegrations`, `createCorporateIntegrations`: Templates de negócio que agrupam as integrações mais comuns para cada setor.
|
|
142
|
+
- `INTEGRATION_TEMPLATES`: Constante com presets de IDs e categorias para cada template.
|
|
143
|
+
|
|
144
|
+
### Exemplo de Template (E-commerce)
|
|
145
|
+
|
|
146
|
+
```tsx
|
|
147
|
+
import { ConsentProvider, ConsentScriptLoader, createECommerceIntegrations } from 'react-lgpd-consent'
|
|
148
|
+
|
|
149
|
+
function App() {
|
|
150
|
+
const integrations = createECommerceIntegrations({
|
|
151
|
+
googleAnalytics: { measurementId: 'G-XXXX' },
|
|
152
|
+
facebookPixel: { pixelId: '1234567890' },
|
|
153
|
+
hotjar: { siteId: '999999' },
|
|
154
|
+
})
|
|
155
|
+
|
|
156
|
+
return (
|
|
157
|
+
<ConsentProvider categories={{ enabledCategories: ['analytics', 'marketing', 'functional'] }}>
|
|
158
|
+
<ConsentScriptLoader integrations={integrations} />
|
|
159
|
+
{/* Seu app */}
|
|
160
|
+
</ConsentProvider>
|
|
161
|
+
)
|
|
162
|
+
}
|
|
163
|
+
```
|
|
164
|
+
|
|
165
|
+
---
|
|
166
|
+
|
|
167
|
+
## 🔎 Descoberta Automática de Cookies (Experimental v0.4.1)
|
|
168
|
+
|
|
169
|
+
A biblioteca inclui funcionalidades experimentais para facilitar a auditoria e o mapeamento de cookies.
|
|
170
|
+
|
|
171
|
+
- **Detecção em Runtime**: Em modo de desenvolvimento, a biblioteca escaneia e loga os cookies encontrados no console.
|
|
172
|
+
- **Categorização Automática**: A função `categorizeDiscoveredCookies` usa heurísticas para sugerir a categoria de um cookie.
|
|
173
|
+
- **Uso Programático**:
|
|
174
|
+
|
|
175
|
+
```ts
|
|
176
|
+
import { discoverRuntimeCookies, categorizeDiscoveredCookies } from 'react-lgpd-consent'
|
|
177
|
+
|
|
178
|
+
// 1. Descobre cookies em tempo de execução
|
|
179
|
+
const discovered = discoverRuntimeCookies()
|
|
180
|
+
|
|
181
|
+
// 2. Categoriza e registra no catálogo de cookies do modal
|
|
182
|
+
categorizeDiscoveredCookies(discovered, true)
|
|
183
|
+
```
|
|
184
|
+
|
|
185
|
+
---
|
|
186
|
+
|
|
187
|
+
## 🧱 Nota SSR/Next.js (App Router)
|
|
188
|
+
|
|
189
|
+
Para evitar hydration mismatch e vazamento de scripts:
|
|
190
|
+
- Coloque o `ConsentProvider` dentro de um Client Component e carregue-o com `dynamic(..., { ssr: false })` a partir do `RootLayout` (Server Component).
|
|
191
|
+
- Use o `ConsentScriptLoader` para carregar GTM/GA4 somente após consentimento e inicialize o Consent Mode v2 com `gtag('consent','default', denied)` antes de qualquer script.
|
|
192
|
+
- Consulte a seção “SSR/Next.js (App Router) — Padrões seguros” em `QUICKSTART.md` para ordem dos provedores/estilos (MUI/Emotion) e checklist SSR.
|
|
193
|
+
|
|
194
|
+
---
|
|
195
|
+
|
|
196
|
+
## 🎨 Criando Integrações Customizadas
|
|
197
|
+
|
|
198
|
+
Se precisar de uma integração que não é oferecida nativamente, você pode criar a sua implementando a interface `ScriptIntegration`.
|
|
199
|
+
|
|
200
|
+
```typescript
|
|
201
|
+
interface ScriptIntegration {
|
|
202
|
+
id: string // ID único para o script
|
|
203
|
+
category: string // Categoria de consentimento que habilita o script
|
|
204
|
+
src: string // URL do script
|
|
205
|
+
init?: () => void // Função opcional para executar após o carregamento
|
|
206
|
+
attrs?: Record<string, string> // Atributos HTML para a tag <script>
|
|
207
|
+
}
|
|
208
|
+
```
|
|
209
|
+
|
|
210
|
+
---
|
|
211
|
+
|
|
212
|
+
## 📊 Eventos DataLayer (Google Tag Manager)
|
|
213
|
+
|
|
214
|
+
A partir da versão **0.4.5**, a biblioteca dispara automaticamente eventos padronizados no `dataLayer` para facilitar rastreamento, auditoria LGPD e integrações com o Google Tag Manager.
|
|
215
|
+
|
|
216
|
+
### Eventos Disponíveis
|
|
217
|
+
|
|
218
|
+
#### 1. `consent_initialized`
|
|
219
|
+
|
|
220
|
+
Disparado quando o sistema de consentimento é inicializado (após hidratação).
|
|
221
|
+
|
|
222
|
+
**Payload:**
|
|
223
|
+
```typescript
|
|
224
|
+
{
|
|
225
|
+
event: 'consent_initialized',
|
|
226
|
+
consent_version: '0.4.5',
|
|
227
|
+
timestamp: '2025-10-25T13:52:33.729Z',
|
|
228
|
+
categories: {
|
|
229
|
+
necessary: true,
|
|
230
|
+
analytics: false,
|
|
231
|
+
marketing: false
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
```
|
|
235
|
+
|
|
236
|
+
**Exemplo de uso no GTM:**
|
|
237
|
+
- **Tipo de acionador**: Evento personalizado
|
|
238
|
+
- **Nome do evento**: `consent_initialized`
|
|
239
|
+
- **Variáveis**: `{{categories.analytics}}`, `{{categories.marketing}}`, etc.
|
|
240
|
+
|
|
241
|
+
#### 2. `consent_updated`
|
|
242
|
+
|
|
243
|
+
Disparado sempre que o usuário atualiza suas preferências de consentimento.
|
|
244
|
+
|
|
245
|
+
**Payload:**
|
|
246
|
+
```typescript
|
|
247
|
+
{
|
|
248
|
+
event: 'consent_updated',
|
|
249
|
+
consent_version: '0.4.5',
|
|
250
|
+
timestamp: '2025-10-25T13:52:33.729Z',
|
|
251
|
+
origin: 'modal', // 'banner' | 'modal' | 'reset' | 'programmatic'
|
|
252
|
+
categories: {
|
|
253
|
+
necessary: true,
|
|
254
|
+
analytics: true,
|
|
255
|
+
marketing: false
|
|
256
|
+
},
|
|
257
|
+
changed_categories: ['analytics']
|
|
258
|
+
}
|
|
259
|
+
```
|
|
260
|
+
|
|
261
|
+
**Exemplo de uso no GTM:**
|
|
262
|
+
- **Tipo de acionador**: Evento personalizado
|
|
263
|
+
- **Nome do evento**: `consent_updated`
|
|
264
|
+
- **Condição**: `{{changed_categories}}` contém `analytics`
|
|
265
|
+
- **Ação**: Disparar Google Analytics 4
|
|
266
|
+
|
|
267
|
+
### Configuração no Google Tag Manager
|
|
268
|
+
|
|
269
|
+
#### Passo 1: Criar Variáveis de DataLayer
|
|
270
|
+
|
|
271
|
+
No GTM, crie as seguintes variáveis de camada de dados:
|
|
272
|
+
|
|
273
|
+
1. **DLV - Consent Categories**
|
|
274
|
+
- Tipo: Variável da camada de dados
|
|
275
|
+
- Nome: `categories`
|
|
276
|
+
|
|
277
|
+
2. **DLV - Consent Origin**
|
|
278
|
+
- Tipo: Variável da camada de dados
|
|
279
|
+
- Nome: `origin`
|
|
280
|
+
|
|
281
|
+
3. **DLV - Changed Categories**
|
|
282
|
+
- Tipo: Variável da camada de dados
|
|
283
|
+
- Nome: `changed_categories`
|
|
284
|
+
|
|
285
|
+
#### Passo 2: Criar Acionadores
|
|
286
|
+
|
|
287
|
+
1. **Acionador: Consent Initialized**
|
|
288
|
+
- Tipo: Evento personalizado
|
|
289
|
+
- Nome do evento: `consent_initialized`
|
|
290
|
+
|
|
291
|
+
2. **Acionador: Consent Updated - Analytics Accepted**
|
|
292
|
+
- Tipo: Evento personalizado
|
|
293
|
+
- Nome do evento: `consent_updated`
|
|
294
|
+
- Este acionador é acionado em: Alguns eventos personalizados
|
|
295
|
+
- Condição: `{{DLV - Consent Categories}}.analytics` igual a `true`
|
|
296
|
+
|
|
297
|
+
#### Passo 3: Criar Tags
|
|
298
|
+
|
|
299
|
+
1. **Tag: Google Analytics 4 (condicionada ao consentimento)**
|
|
300
|
+
- Tipo: Google Analytics: Configuração do GA4
|
|
301
|
+
- ID de medição: `G-XXXXXXXXXX`
|
|
302
|
+
- Acionador: `Consent Updated - Analytics Accepted`
|
|
303
|
+
|
|
304
|
+
### Exemplo: Auditoria LGPD
|
|
305
|
+
|
|
306
|
+
Crie uma tag para registrar mudanças de consentimento em um sistema de auditoria:
|
|
307
|
+
|
|
308
|
+
```javascript
|
|
309
|
+
// Tag HTML customizada no GTM
|
|
310
|
+
<script>
|
|
311
|
+
(function() {
|
|
312
|
+
var auditData = {
|
|
313
|
+
timestamp: {{DLV - timestamp}},
|
|
314
|
+
origin: {{DLV - Consent Origin}},
|
|
315
|
+
categories: {{DLV - Consent Categories}},
|
|
316
|
+
changed: {{DLV - Changed Categories}}
|
|
317
|
+
};
|
|
318
|
+
|
|
319
|
+
// Enviar para seu sistema de auditoria
|
|
320
|
+
fetch('/api/consent-audit', {
|
|
321
|
+
method: 'POST',
|
|
322
|
+
headers: { 'Content-Type': 'application/json' },
|
|
323
|
+
body: JSON.stringify(auditData)
|
|
324
|
+
});
|
|
325
|
+
})();
|
|
326
|
+
</script>
|
|
327
|
+
```
|
|
328
|
+
|
|
329
|
+
### API Programática
|
|
330
|
+
|
|
331
|
+
Para casos avançados, você pode disparar eventos manualmente:
|
|
332
|
+
|
|
333
|
+
```typescript
|
|
334
|
+
import { pushConsentUpdatedEvent } from 'react-lgpd-consent'
|
|
335
|
+
|
|
336
|
+
// Disparar evento após mudança programática
|
|
337
|
+
const handleCustomUpdate = () => {
|
|
338
|
+
const newPreferences = {
|
|
339
|
+
necessary: true,
|
|
340
|
+
analytics: true,
|
|
341
|
+
marketing: false
|
|
342
|
+
}
|
|
343
|
+
|
|
344
|
+
pushConsentUpdatedEvent(newPreferences, 'programmatic')
|
|
345
|
+
}
|
|
346
|
+
```
|
|
347
|
+
|
|
348
|
+
### Tipos TypeScript
|
|
349
|
+
|
|
350
|
+
```typescript
|
|
351
|
+
import type {
|
|
352
|
+
ConsentEvent,
|
|
353
|
+
ConsentEventOrigin,
|
|
354
|
+
ConsentInitializedEvent,
|
|
355
|
+
ConsentUpdatedEvent
|
|
356
|
+
} from 'react-lgpd-consent'
|
|
357
|
+
|
|
358
|
+
// Origem da ação
|
|
359
|
+
type ConsentEventOrigin = 'banner' | 'modal' | 'reset' | 'programmatic'
|
|
360
|
+
|
|
361
|
+
// Evento de inicialização
|
|
362
|
+
interface ConsentInitializedEvent {
|
|
363
|
+
event: 'consent_initialized'
|
|
364
|
+
consent_version: string
|
|
365
|
+
timestamp: string
|
|
366
|
+
categories: Record<string, boolean>
|
|
367
|
+
}
|
|
368
|
+
|
|
369
|
+
// Evento de atualização
|
|
370
|
+
interface ConsentUpdatedEvent {
|
|
371
|
+
event: 'consent_updated'
|
|
372
|
+
consent_version: string
|
|
373
|
+
timestamp: string
|
|
374
|
+
origin: ConsentEventOrigin
|
|
375
|
+
categories: Record<string, boolean>
|
|
376
|
+
changed_categories: string[]
|
|
377
|
+
}
|
|
378
|
+
```
|
|
379
|
+
|
|
380
|
+
---
|
|
381
|
+
|
|
382
|
+
## 📊 Categorias Recomendadas
|
|
383
|
+
|
|
384
|
+
| Ferramenta | Categoria Recomendada | Justificativa |
|
|
385
|
+
| ------------------ | --------------------- | -------------------------------- |
|
|
386
|
+
| Google Analytics | `analytics` | Coleta estatísticas de uso |
|
|
387
|
+
| Google Tag Manager | `analytics` | Container de tags analíticas |
|
|
388
|
+
| Facebook Pixel | `marketing` | Publicidade direcionada |
|
|
389
|
+
| Hotjar/FullStory | `analytics` | Análise comportamental |
|
|
390
|
+
| UserWay/AccessiBe | `functional` | Funcionalidade de acessibilidade |
|
|
391
|
+
| Live Chat | `functional` | Funcionalidade de suporte |
|
|
392
|
+
| YouTube/Vimeo | `social` | Conteúdo de redes sociais |
|
|
393
|
+
|
package/QUICKSTART.en.md
CHANGED
|
@@ -16,6 +16,13 @@ yarn add react-lgpd-consent
|
|
|
16
16
|
npm install @mui/material @mui/icons-material @emotion/react @emotion/styled
|
|
17
17
|
```
|
|
18
18
|
|
|
19
|
+
> ℹ️ **Modularization (v0.5.0+)**
|
|
20
|
+
>
|
|
21
|
+
> - `react-lgpd-consent` remains the main npm package.
|
|
22
|
+
> - `@react-lgpd-consent/core` exposes contexts, hooks and utilities only.
|
|
23
|
+
> - `@react-lgpd-consent/mui` ships the Material-UI layer (currently a proxy).
|
|
24
|
+
> - Subpath imports (`react-lgpd-consent/core`, `react-lgpd-consent/mui`) are available for advanced setups.
|
|
25
|
+
|
|
19
26
|
## 🎯 Basic Usage (30 seconds)
|
|
20
27
|
|
|
21
28
|
```tsx
|