react-lgpd-consent 0.1.11 → 0.1.13

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,487 +0,0 @@
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
- [![TypeScrip```
6
-
7
- ## 🎛️ Botão Flutuante de Preferências
8
-
9
- Para facilitar o acesso às configurações após consentimento inicial:
10
-
11
- ```tsx
12
- import { FloatingPreferencesButton } from 'react-lgpd-consent'
13
-
14
- function App() {
15
- return (
16
- <ConsentProvider>
17
- <MeuApp />
18
- <CookieBanner />
19
-
20
- {/* Botão flutuante opcional */}
21
- <FloatingPreferencesButton
22
- position="bottom-right"
23
- hideWhenConsented={false}
24
- tooltip="Configurar Cookies"
25
- />
26
- </ConsentProvider>
27
- )
28
- }
29
- ```
30
-
31
- ### Posições Disponíveis
32
-
33
- - `bottom-left` | `bottom-right` (padrão)
34
- - `top-left` | `top-right`
35
-
36
- ## 🔧 API Completahttps://img.shields.io/badge/TypeScript-Ready-blue?style=for-the-badge&logo=typescript)](https://www.typescriptlang.org/)
37
-
38
- [![React](https://img.shields.io/badge/React-18%2B-61DAFB?style=for-the-badge&logo=react)](https://reactjs.org/)
39
- [![Material-UI](https://img.shields.io/badge/MUI-Ready-007FFF?style=for-the-badge&logo=mui)](https://mui.com/)
40
-
41
- > **Biblioteca completa de consentimento de cookies para React e Next.js em conformidade com a LGPD**
42
-
43
- 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.
44
-
45
- ## ✨ Características Principais
46
-
47
- - 🇧🇷 **Conformidade LGPD**: Respeita totalmente a legislação brasileira de proteção de dados
48
- - ⚡ **SSR/Next.js Ready**: Suporte nativo a Server-Side Rendering sem flash de conteúdo
49
- - 🎨 **Material-UI Integration**: Componentes prontos e customizáveis com MUI
50
- - ♿ **Acessibilidade**: Navegação por teclado e leitores de tela nativamente suportados
51
- - 🌐 **Internacionalização**: Textos totalmente customizáveis (padrão pt-BR)
52
- - 🚀 **TypeScript**: API completamente tipada para melhor DX
53
- - 📦 **Zero Config**: Funciona out-of-the-box com configurações sensatas
54
- - 🎯 **Granular Control**: Controle individual de categorias (analytics, marketing, etc.)
55
- - 🚫 **Banner Bloqueante**: Modo opcional para exigir interação antes de continuar
56
- - 🎨 **Sistema de Temas**: Temas customizáveis para integração visual perfeita
57
- - ⚡ **Carregamento Condicional**: Scripts só executam após consentimento explícito
58
- - 🔌 **Modal Automático**: Modal de preferências incluído automaticamente com lazy loading
59
- - 🎛️ **Botão Flutuante**: Componente opcional para acesso fácil às preferências
60
-
61
- ## 🚀 Instalação
62
-
63
- ```bash
64
- npm install react-lgpd-consent
65
- # ou
66
- yarn add react-lgpd-consent
67
- # ou
68
- pnpm add react-lgpd-consent
69
- ```
70
-
71
- ### Dependências
72
-
73
- ```bash
74
- npm install @mui/material js-cookie
75
- ```
76
-
77
- ## � Exemplo Completo
78
-
79
- ```tsx
80
- import {
81
- ConsentProvider,
82
- CookieBanner,
83
- FloatingPreferencesButton,
84
- } from 'react-lgpd-consent'
85
-
86
- function App() {
87
- return (
88
- <ConsentProvider>
89
- <div>
90
- <h1>Meu Site</h1>
91
- <p>Conteúdo do site...</p>
92
-
93
- {/* Banner de cookies - Modal incluído automaticamente! */}
94
- <CookieBanner policyLinkUrl="/privacy-policy" blocking={true} />
95
-
96
- {/* Botão flutuante opcional para acesso às preferências */}
97
- <FloatingPreferencesButton position="bottom-right" />
98
- </div>
99
- </ConsentProvider>
100
- )
101
- }
102
- ```
103
-
104
- ## �📖 Uso Básico
105
-
106
- ### 1. Setup do Provider
107
-
108
- ```tsx
109
- import { ConsentProvider } from 'react-lgpd-consent'
110
-
111
- function App() {
112
- return (
113
- <ConsentProvider>
114
- <YourApp />
115
- </ConsentProvider>
116
- )
117
- }
118
- ```
119
-
120
- ### 2. Banner de Consentimento
121
-
122
- ```tsx
123
- import { CookieBanner } from 'react-lgpd-consent'
124
-
125
- function Layout() {
126
- return (
127
- <>
128
- <YourContent />
129
- <CookieBanner
130
- policyLinkUrl="/politica-privacidade"
131
- blocking={true} // Padrão: bloqueia até decisão
132
- />
133
- {/* Modal de preferências incluído automaticamente! */}
134
- </>
135
- )
136
- }
137
- ```
138
-
139
- ### 3. Uso do Hook
140
-
141
- ```tsx
142
- import { useConsent } from 'react-lgpd-consent'
143
-
144
- function MyComponent() {
145
- const { consented, preferences, acceptAll, openPreferences } = useConsent()
146
-
147
- return (
148
- <div>
149
- <p>Consentimento: {consented ? 'Dado' : 'Pendente'}</p>
150
- <button onClick={acceptAll}>Aceitar Todos</button>
151
- <button onClick={openPreferences}>Gerenciar Preferências</button>
152
- </div>
153
- )
154
- }
155
- ```
156
-
157
- > ✅ **O modal de preferências é incluído automaticamente pelo ConsentProvider!** Não é mais necessário renderizá-lo manualmente.
158
-
159
- ````
160
-
161
- ### 4. Carregamento Condicional de Scripts
162
-
163
- ```tsx
164
- import { ConsentGate, loadScript } from 'react-lgpd-consent'
165
-
166
- function Analytics() {
167
- return (
168
- <ConsentGate category="analytics">
169
- <GoogleAnalytics />
170
- </ConsentGate>
171
- )
172
- }
173
-
174
- // Ou carregando scripts que aguardam consentimento
175
- function MyComponent() {
176
- const { preferences, consented } = useConsent()
177
-
178
- useEffect(() => {
179
- if (consented && preferences.analytics) {
180
- loadConditionalScript(
181
- 'ga',
182
- 'https://www.googletagmanager.com/gtag/js?id=GA_ID',
183
- () => preferences.analytics, // Condição que aguarda
184
- )
185
- }
186
- }, [preferences, consented])
187
- }
188
- ````
189
-
190
- ## 🎨 Customização
191
-
192
- ### Banner Bloqueante vs Não-bloqueante
193
-
194
- ```tsx
195
- // Banner bloqueante (padrão) - impede interação até decisão
196
- <CookieBanner blocking={true} />
197
-
198
- // Banner não-intrusivo - permite navegação
199
- <CookieBanner blocking={false} />
200
- ```
201
-
202
- ### Tema Personalizado
203
-
204
- ```tsx
205
- import { ConsentProvider, defaultConsentTheme } from 'react-lgpd-consent'
206
- import { createTheme } from '@mui/material/styles'
207
-
208
- const meuTema = createTheme({
209
- ...defaultConsentTheme,
210
- palette: {
211
- ...defaultConsentTheme.palette,
212
- primary: {
213
- main: '#1976d2', // Sua cor principal
214
- },
215
- },
216
- })
217
-
218
- <ConsentProvider theme={meuTema}>
219
- <App />
220
- </ConsentProvider>
221
- ```
222
-
223
- ### Textos Personalizados
224
-
225
- ```tsx
226
- <ConsentProvider
227
- texts={{
228
- bannerMessage: "Utilizamos cookies para melhorar sua experiência.",
229
- acceptAll: "Aceitar Todos",
230
- declineAll: "Recusar Opcionais",
231
- preferences: "Configurar"
232
- }}
233
- >
234
- ```
235
-
236
- ### Configuração do Cookie
237
-
238
- ```tsx
239
- <ConsentProvider
240
- cookie={{
241
- name: 'meuSiteConsent',
242
- maxAgeDays: 180,
243
- sameSite: 'Strict'
244
- }}
245
- >
246
- ```
247
-
248
- ### Callbacks
249
-
250
- ```tsx
251
- <ConsentProvider
252
- onConsentGiven={(state) => {
253
- console.log('Consentimento dado:', state)
254
- // Inicializar analytics, etc.
255
- }}
256
- onPreferencesSaved={(prefs) => {
257
- console.log('Preferências salvas:', prefs)
258
- }}
259
- >
260
- ```
261
-
262
- ## � Banner Bloqueante
263
-
264
- Para cenários onde é necessário bloquear o acesso até obter consentimento explícito:
265
-
266
- ```tsx
267
- <CookieBanner blocking />
268
- ```
269
-
270
- Com `blocking={true}`, o banner:
271
-
272
- - Cria um overlay escuro sobre todo o conteúdo
273
- - Impede interação com o resto da página
274
- - É útil para casos críticos onde consentimento é obrigatório
275
-
276
- ## 🎨 Sistema de Temas
277
-
278
- ### Tema Personalizado
279
-
280
- ```tsx
281
- import { createTheme } from '@mui/material/styles'
282
-
283
- const meuTema = createTheme({
284
- palette: {
285
- primary: { main: '#2196f3' },
286
- secondary: { main: '#f50057' },
287
- },
288
- })
289
-
290
- <ConsentProvider theme={meuTema}>
291
- <App />
292
- </ConsentProvider>
293
- ```
294
-
295
- ### Tema Padrão
296
-
297
- O tema padrão do react-lgpd-consent está disponível para customização:
298
-
299
- ```tsx
300
- import { defaultConsentTheme } from 'react-lgpd-consent'
301
-
302
- const temaCustomizado = createTheme({
303
- ...defaultConsentTheme,
304
- palette: {
305
- ...defaultConsentTheme.palette,
306
- primary: { main: '#your-color' },
307
- },
308
- })
309
- ```
310
-
311
- ## ⚡ Carregamento Inteligente de Scripts
312
-
313
- ### Função loadScript
314
-
315
- Scripts aguardam automaticamente o **consentimento finalizado** (banner fechado ou preferências salvas):
316
-
317
- ```tsx
318
- import { loadScript } from 'react-lgpd-consent'
319
-
320
- // Carrega script apenas após consentimento para analytics
321
- await loadScript(
322
- 'gtag',
323
- 'https://www.googletagmanager.com/gtag/js?id=GA_ID',
324
- 'analytics', // Categoria obrigatória
325
- )
326
-
327
- // Script geral (sempre carrega após consentimento)
328
- await loadScript('custom-script', 'https://example.com/script.js')
329
- ```
330
-
331
- ### Comportamento Inteligente
332
-
333
- - **Aguarda decisão final**: Não executa durante mudanças no modal de preferências
334
- - **Só executa após salvar**: Scripts só rodam quando o usuário finaliza as preferências
335
- - **Baseado em categoria**: Respeita as permissões por categoria
336
-
337
- ## 🎨 Personalização Total
338
-
339
- ### Modal de Preferências Customizado
340
-
341
- Substitua completamente o modal padrão com seu próprio componente:
342
-
343
- ```tsx
344
- import { ConsentProvider, useConsent } from 'react-lgpd-consent'
345
- import MeuModalCustomizado from './MeuModalCustomizado'
346
-
347
- function App() {
348
- return (
349
- <ConsentProvider
350
- PreferencesModalComponent={MeuModalCustomizado}
351
- preferencesModalProps={{ variant: 'custom' }}
352
- >
353
- <MeuApp />
354
- </ConsentProvider>
355
- )
356
- }
357
-
358
- // Seu componente customizado
359
- function MeuModalCustomizado({ variant }) {
360
- const { isModalOpen, closePreferences, setPreference } = useConsent()
361
-
362
- return (
363
- <MyCustomDialog open={isModalOpen} onClose={closePreferences}>
364
- {/* Seu design personalizado aqui */}
365
- </MyCustomDialog>
366
- )
367
- }
368
- ```
369
-
370
- ### Desabilitar Modal Automático
371
-
372
- Para controle total, desabilite o modal automático:
373
-
374
- ```tsx
375
- <ConsentProvider disableAutomaticModal>
376
- <MeuApp />
377
- {/* Renderize seus componentes customizados onde quiser */}
378
- <MeuModalTotalmenteCustomizado />
379
- </ConsentProvider>
380
- ```
381
-
382
- ## �🔧 API Completa
383
-
384
- ### Components
385
-
386
- | Componente | Descrição | Props Principais |
387
- | --------------------------- | ------------------------------------------------ | ---------------------------------------------------------------------------------------- |
388
- | `ConsentProvider` | Provider principal do contexto | `initialState`, `texts`, `theme`, `hideBranding`, `PreferencesModalComponent`, callbacks |
389
- | `CookieBanner` | Banner de consentimento | `policyLinkUrl`, `blocking`, `hideBranding`, `debug`, pass-through MUI props |
390
- | `PreferencesModal` | Modal de preferências (incluído automaticamente) | `DialogProps`, `hideBranding` - **Opcional** |
391
- | `FloatingPreferencesButton` | Botão flutuante para abrir preferências | `position`, `hideWhenConsented`, `tooltip`, `icon`, `FabProps` |
392
- | `ConsentGate` | Renderização condicional por categoria | `category`, `children` |
393
-
394
- ### Hook `useConsent()`
395
-
396
- ```typescript
397
- interface ConsentContextValue {
398
- consented: boolean // usuário já consentiu?
399
- preferences: ConsentPreferences // preferências atuais
400
- isModalOpen: boolean // estado do modal de preferências
401
- acceptAll(): void // aceitar todas as categorias
402
- rejectAll(): void // recusar opcionais
403
- setPreference(cat: Category, value: boolean): void // definir categoria específica
404
- openPreferences(): void // abrir modal de preferências
405
- closePreferences(): void // fechar modal
406
- resetConsent(): void // resetar tudo
407
- }
408
- ```
409
-
410
- ### Hook `useConsentTexts()`
411
-
412
- ```typescript
413
- // Acesso aos textos contextuais
414
- const texts = useConsentTexts()
415
- console.log(texts.banner.title) // "Política de Cookies"
416
- ```
417
-
418
- ### Utilitários
419
-
420
- - `loadScript(id, src, category?, attrs?)` - Carrega scripts com consentimento inteligente
421
- - `defaultConsentTheme` - Tema padrão do Material-UI
422
- - Tipos TypeScript completos exportados## 🌐 SSR / Next.js
423
-
424
- Para evitar flash de conteúdo em SSR:
425
-
426
- ```tsx
427
- // pages/_app.tsx (Next.js)
428
- function MyApp({ Component, pageProps }) {
429
- return (
430
- <ConsentProvider
431
- initialState={{
432
- consented: false,
433
- preferences: { analytics: false, marketing: false },
434
- }}
435
- >
436
- <Component {...pageProps} />
437
- </ConsentProvider>
438
- )
439
- }
440
- ```
441
-
442
- ## ♿ Acessibilidade
443
-
444
- A biblioteca segue as melhores práticas de acessibilidade:
445
-
446
- - ✅ Navegação por teclado (Tab, Enter, Escape)
447
- - ✅ Leitores de tela (`aria-labelledby`, `aria-describedby`)
448
- - ✅ Foco gerenciado automaticamente
449
- - ✅ Contrastes adequados
450
- - ✅ Estrutura semântica correta
451
-
452
- ## 📚 Exemplos
453
-
454
- Confira exemplos completos no repositório:
455
-
456
- - [Básico com React](./examples/basic)
457
- - [Next.js com SSR](./examples/nextjs)
458
- - [Customização avançada](./examples/advanced)
459
- - [Integração com analytics](./examples/analytics)
460
-
461
- ## 🤝 Contribuição
462
-
463
- Contribuições são bem-vindas! Por favor:
464
-
465
- 1. Faça fork do projeto
466
- 2. Crie uma branch para sua feature (`git checkout -b feature/AmazingFeature`)
467
- 3. Commit suas mudanças (`git commit -m 'Add some AmazingFeature'`)
468
- 4. Push para a branch (`git push origin feature/AmazingFeature`)
469
- 5. Abra um Pull Request
470
-
471
- ## 📄 Licença
472
-
473
- Este projeto está licenciado sob a Licença MIT - veja o arquivo [LICENSE](LICENSE) para detalhes.
474
-
475
- ## 🙋‍♀️ Suporte
476
-
477
- - 📖 [Documentação](./docs)
478
- - 🐛 [Issues](https://github.com/lucianoedipo/react-lgpd-consent/issues)
479
- - 💬 [Discussões](https://github.com/lucianoedipo/react-lgpd-consent/discussions)
480
-
481
- ---
482
-
483
- <div align="center">
484
-
485
- **Feito com ❤️ para a comunidade React brasileira**
486
-
487
- </div>
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  PreferencesModal
3
- } from "./chunk-LRMSFSP2.js";
3
+ } from "./chunk-XIHO7M77.js";
4
4
  export {
5
5
  PreferencesModal
6
6
  };
@@ -55,12 +55,10 @@ var defaultConsentTheme = createTheme({
55
55
  palette: {
56
56
  primary: {
57
57
  main: "#1976d2",
58
- // Azul institucional
59
58
  contrastText: "#ffffff"
60
59
  },
61
60
  secondary: {
62
61
  main: "#dc004e",
63
- // Rosa/vermelho para ações importantes
64
62
  contrastText: "#ffffff"
65
63
  },
66
64
  background: {
@@ -84,7 +82,6 @@ var defaultConsentTheme = createTheme({
84
82
  button: {
85
83
  fontWeight: 500,
86
84
  textTransform: "none"
87
- // Manter capitalização original
88
85
  }
89
86
  },
90
87
  components: {
@@ -123,7 +120,7 @@ var defaultConsentTheme = createTheme({
123
120
  // src/context/ConsentContext.tsx
124
121
  import { jsx, jsxs } from "react/jsx-runtime";
125
122
  var PreferencesModal = React.lazy(
126
- () => import("./PreferencesModal-IHXZDNYT.js").then((m) => ({
123
+ () => import("./PreferencesModal-2V2W3262.js").then((m) => ({
127
124
  default: m.PreferencesModal
128
125
  }))
129
126
  );
@@ -228,7 +225,7 @@ function ConsentProvider({
228
225
  const [state, dispatch] = React.useReducer(reducer, boot);
229
226
  const [isHydrated, setIsHydrated] = React.useState(false);
230
227
  React.useEffect(() => {
231
- if (typeof window !== "undefined" && !initialState) {
228
+ if (!initialState) {
232
229
  const saved = readConsentCookie(cookie.name);
233
230
  if (saved?.consented) {
234
231
  console.log("\u{1F680} Immediate hydration: Cookie found", saved);
@@ -371,7 +368,7 @@ function Branding({ variant, hidden = false }) {
371
368
  /* @__PURE__ */ jsx2(
372
369
  Link,
373
370
  {
374
- href: "https://ledipo.eti.br",
371
+ href: "https://www.ledipo.eti.br",
375
372
  target: "_blank",
376
373
  rel: "noopener noreferrer",
377
374
  sx: (theme) => ({
package/dist/index.cjs CHANGED
@@ -81,12 +81,10 @@ var init_theme = __esm({
81
81
  palette: {
82
82
  primary: {
83
83
  main: "#1976d2",
84
- // Azul institucional
85
84
  contrastText: "#ffffff"
86
85
  },
87
86
  secondary: {
88
87
  main: "#dc004e",
89
- // Rosa/vermelho para ações importantes
90
88
  contrastText: "#ffffff"
91
89
  },
92
90
  background: {
@@ -110,7 +108,6 @@ var init_theme = __esm({
110
108
  button: {
111
109
  fontWeight: 500,
112
110
  textTransform: "none"
113
- // Manter capitalização original
114
111
  }
115
112
  },
116
113
  components: {
@@ -165,7 +162,7 @@ function Branding({ variant, hidden = false }) {
165
162
  /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
166
163
  import_Link.default,
167
164
  {
168
- href: "https://ledipo.eti.br",
165
+ href: "https://www.ledipo.eti.br",
169
166
  target: "_blank",
170
167
  rel: "noopener noreferrer",
171
168
  sx: (theme) => ({
@@ -403,7 +400,7 @@ function ConsentProvider({
403
400
  const [state, dispatch] = React.useReducer(reducer, boot);
404
401
  const [isHydrated, setIsHydrated] = React.useState(false);
405
402
  React.useEffect(() => {
406
- if (typeof window !== "undefined" && !initialState) {
403
+ if (!initialState) {
407
404
  const saved = readConsentCookie(cookie.name);
408
405
  if (saved?.consented) {
409
406
  console.log("\u{1F680} Immediate hydration: Cookie found", saved);
@@ -671,16 +668,16 @@ function CookieBanner({
671
668
  init_PreferencesModal();
672
669
 
673
670
  // src/components/FloatingPreferencesButton.tsx
671
+ var import_CookieOutlined = __toESM(require("@mui/icons-material/CookieOutlined"), 1);
674
672
  var import_Fab = __toESM(require("@mui/material/Fab"), 1);
675
673
  var import_Tooltip = __toESM(require("@mui/material/Tooltip"), 1);
676
- var import_Settings = __toESM(require("@mui/icons-material/Settings"), 1);
677
674
  var import_styles3 = require("@mui/material/styles");
678
675
  init_useConsent();
679
676
  var import_jsx_runtime5 = require("react/jsx-runtime");
680
677
  function FloatingPreferencesButton({
681
678
  position = "bottom-right",
682
679
  offset = 24,
683
- icon = /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(import_Settings.default, {}),
680
+ icon = /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(import_CookieOutlined.default, {}),
684
681
  tooltip,
685
682
  FabProps,
686
683
  hideWhenConsented = false
@@ -695,7 +692,6 @@ function FloatingPreferencesButton({
695
692
  const styles = {
696
693
  position: "fixed",
697
694
  zIndex: 1200
698
- // Abaixo do modal mas acima do conteúdo
699
695
  };
700
696
  switch (position) {
701
697
  case "bottom-left":
package/dist/index.d.cts CHANGED
@@ -6,6 +6,16 @@ import { FabProps } from '@mui/material/Fab';
6
6
  import * as React$1 from 'react';
7
7
  import * as _mui_material_styles from '@mui/material/styles';
8
8
 
9
+ /**
10
+ * Props para o componente CookieBanner.
11
+ *
12
+ * @property policyLinkUrl URL da política de privacidade (opcional).
13
+ * @property debug Força exibição do banner para QA/debug (opcional).
14
+ * @property blocking Se true, bloqueia interação até decisão do usuário (default: true).
15
+ * @property hideBranding Se true, oculta o branding "fornecido por LÉdipO.eti.br" (opcional).
16
+ * @property SnackbarProps Props adicionais para o componente MUI Snackbar (opcional).
17
+ * @property PaperProps Props adicionais para o componente MUI Paper (opcional).
18
+ */
9
19
  interface CookieBannerProps {
10
20
  policyLinkUrl?: string;
11
21
  debug?: boolean;
@@ -14,29 +24,79 @@ interface CookieBannerProps {
14
24
  SnackbarProps?: Partial<SnackbarProps>;
15
25
  PaperProps?: Partial<PaperProps>;
16
26
  }
27
+ /**
28
+ * Banner de consentimento de cookies conforme LGPD.
29
+ *
30
+ * Exibe mensagem informativa, botões de ação e link para política de privacidade.
31
+ * Compatível com modo bloqueante (overlay) e não bloqueante (Snackbar).
32
+ *
33
+ * - Textos em pt-BR, customizáveis via contexto.
34
+ * - Acessível e responsivo.
35
+ * - Branding opcional.
36
+ *
37
+ * @param props Propriedades do banner de consentimento.
38
+ */
17
39
  declare function CookieBanner({ policyLinkUrl, debug, blocking, // Por padrão, bloqueia até decisão
18
40
  hideBranding, SnackbarProps, PaperProps, }: Readonly<CookieBannerProps>): react_jsx_runtime.JSX.Element | null;
19
41
 
42
+ /**
43
+ * Props para o componente PreferencesModal.
44
+ *
45
+ * @property DialogProps Props opcionais para customizar o Dialog do Material-UI.
46
+ * @property hideBranding Se true, oculta o branding "fornecido por LÉdipO.eti.br".
47
+ */
20
48
  interface PreferencesModalProps {
21
49
  DialogProps?: Partial<DialogProps>;
22
50
  hideBranding?: boolean;
23
51
  }
52
+ /**
53
+ * Modal de preferências de cookies.
54
+ *
55
+ * Permite ao usuário ajustar suas preferências de consentimento para cookies analíticos e de marketing.
56
+ * Utiliza Material-UI Dialog, switches para cada categoria e textos customizáveis via contexto.
57
+ * Acessível, responsivo e compatível com SSR.
58
+ *
59
+ * @param props Props do modal, incluindo customização do Dialog e opção de ocultar branding.
60
+ */
24
61
  declare function PreferencesModal({ DialogProps, hideBranding, }: Readonly<PreferencesModalProps>): react_jsx_runtime.JSX.Element;
25
62
 
63
+ /**
64
+ * Props para o componente FloatingPreferencesButton.
65
+ *
66
+ * Permite configurar posição, ícone, tooltip, e comportamento de exibição do botão flutuante
67
+ * para abrir o modal de preferências de cookies LGPD.
68
+ *
69
+ * Todos os campos são opcionais e possuem valores padrão.
70
+ */
26
71
  interface FloatingPreferencesButtonProps {
27
72
  /** Posição do botão flutuante. Padrão: 'bottom-right' */
28
73
  position?: 'bottom-left' | 'bottom-right' | 'top-left' | 'top-right';
29
74
  /** Offset da borda em pixels. Padrão: 24 */
30
75
  offset?: number;
31
- /** Ícone customizado. Padrão: SettingsIcon */
76
+ /** Ícone customizado. Padrão: CookieOutlined */
32
77
  icon?: React.ReactNode;
33
- /** Tooltip customizado */
78
+ /** Tooltip customizado exibido ao passar o mouse */
34
79
  tooltip?: string;
35
- /** Props do Fab do MUI */
80
+ /** Props adicionais para o Fab do MUI */
36
81
  FabProps?: Partial<FabProps>;
37
82
  /** Se deve esconder quando consentimento já foi dado. Padrão: false */
38
83
  hideWhenConsented?: boolean;
39
84
  }
85
+ /**
86
+ * Botão flutuante para abrir o modal de preferências de cookies.
87
+ *
88
+ * Permite ao usuário acessar rapidamente as configurações de consentimento LGPD.
89
+ * Pode ser posicionado em qualquer canto da tela e customizado via props.
90
+ *
91
+ * @param position Posição do botão na tela. Padrão: 'bottom-right'.
92
+ * @param offset Distância da borda em pixels. Padrão: 24.
93
+ * @param icon Ícone customizado para o botão. Padrão: CookieOutlined.
94
+ * @param tooltip Texto do tooltip exibido ao passar o mouse. Padrão: 'Gerenciar Preferências de Cookies'.
95
+ * @param FabProps Props adicionais para o componente Fab do MUI.
96
+ * @param hideWhenConsented Se verdadeiro, esconde o botão após consentimento. Padrão: false.
97
+ *
98
+ * @returns JSX.Element | null
99
+ */
40
100
  declare function FloatingPreferencesButton({ position, offset, icon, tooltip, FabProps, hideWhenConsented, }: Readonly<FloatingPreferencesButtonProps>): react_jsx_runtime.JSX.Element | null;
41
101
 
42
102
  /**
@@ -62,6 +122,25 @@ interface ConsentState {
62
122
  }
63
123
  /**
64
124
  * Textos utilizados na interface de consentimento.
125
+ *
126
+ * @remarks
127
+ * Esta interface define todos os textos exibidos na UI do banner e modal de consentimento.
128
+ * Os campos opcionais permitem adequação à ANPD e customização conforme necessidade do projeto.
129
+ *
130
+ * @property bannerMessage - Mensagem principal exibida no banner de consentimento.
131
+ * @property acceptAll - Texto do botão para aceitar todos os cookies.
132
+ * @property declineAll - Texto do botão para recusar todos os cookies.
133
+ * @property preferences - Texto do botão para abrir preferências.
134
+ * @property policyLink - (Opcional) Link para política de privacidade.
135
+ * @property modalTitle - Título do modal de preferências.
136
+ * @property modalIntro - Texto introdutório do modal.
137
+ * @property save - Texto do botão para salvar preferências.
138
+ * @property necessaryAlwaysOn - Texto explicativo para cookies necessários.
139
+ * @property controllerInfo - (Opcional) Informação sobre o controlador dos dados.
140
+ * @property dataTypes - (Opcional) Tipos de dados coletados.
141
+ * @property thirdPartySharing - (Opcional) Compartilhamento com terceiros.
142
+ * @property userRights - (Opcional) Direitos do titular dos dados.
143
+ * @property contactInfo - (Opcional) Informações de contato do DPO.
65
144
  */
66
145
  interface ConsentTexts {
67
146
  bannerMessage: string;
@@ -142,8 +221,44 @@ interface ConsentContextValue {
142
221
  resetConsent: () => void;
143
222
  }
144
223
 
224
+ /**
225
+ * Provider principal do contexto de consentimento LGPD.
226
+ *
227
+ * Gerencia o estado global de consentimento de cookies, preferências do usuário,
228
+ * textos customizáveis e integração com SSR. Permite customização do modal de preferências,
229
+ * callbacks externos e opções de cookie.
230
+ *
231
+ * @param props Propriedades do ConsentProvider (ver ConsentProviderProps)
232
+ * @returns JSX.Element
233
+ *
234
+ * @example
235
+ * <ConsentProvider>
236
+ * <App />
237
+ * </ConsentProvider>
238
+ */
145
239
  declare function ConsentProvider({ initialState, texts: textsProp, theme, PreferencesModalComponent, preferencesModalProps, disableAutomaticModal, hideBranding, onConsentGiven, onPreferencesSaved, cookie: cookieOpts, children, }: Readonly<ConsentProviderProps>): react_jsx_runtime.JSX.Element;
146
240
 
241
+ /**
242
+ * Hook principal para acessar e manipular o estado de consentimento de cookies.
243
+ *
244
+ * Retorna o estado atual do consentimento, preferências do usuário e métodos para
245
+ * aceitar, recusar, modificar ou resetar consentimentos. Ideal para integração
246
+ * com componentes customizados ou lógica de negócio.
247
+ *
248
+ * @returns {ConsentContextValue} Estado e ações do consentimento.
249
+ *
250
+ * @example
251
+ * const {
252
+ * consented,
253
+ * preferences,
254
+ * acceptAll,
255
+ * rejectAll,
256
+ * setPreference,
257
+ * openPreferences,
258
+ * closePreferences,
259
+ * resetConsent,
260
+ * } = useConsent();
261
+ */
147
262
  declare function useConsent(): ConsentContextValue;
148
263
  /**
149
264
  * Hook para acessar textos customizados do ConsentProvider.
@@ -162,14 +277,27 @@ declare function ConsentGate(props: Readonly<{
162
277
  }>): react_jsx_runtime.JSX.Element | null;
163
278
 
164
279
  /**
165
- * Carrega um script dinamicamente após consentimento finalizado.
166
- * Aguarda que o usuário tome uma decisão definitiva (banner fechado ou preferências salvas).
280
+ * Carrega dinamicamente um script externo após o consentimento do usuário ser finalizado.
281
+ *
282
+ * Aguarda até que o usuário tome uma decisão definitiva (banner fechado ou preferências salvas)
283
+ * antes de inserir o script na página. Permite restringir o carregamento por categoria de consentimento.
284
+ *
285
+ * @param id - Identificador único do elemento script a ser criado.
286
+ * @param src - URL do script externo.
287
+ * @param category - Categoria de consentimento exigida para o script ('analytics', 'marketing' ou null).
288
+ * @param attrs - Atributos adicionais a serem aplicados ao elemento script.
289
+ * @returns Promise que resolve quando o script é carregado ou rejeita se o consentimento não for dado.
167
290
  */
168
291
  declare function loadScript(id: string, src: string, category?: 'analytics' | 'marketing' | null, attrs?: Record<string, string>): Promise<void>;
169
292
 
170
293
  /**
171
- * Tema padrão para os componentes de consentimento.
172
- * Baseado no design system da ANPD/governo brasileiro.
294
+ * Tema padrão utilizado pelos componentes de consentimento da biblioteca.
295
+ *
296
+ * Inclui configurações de cores, tipografia e estilos para componentes Material-UI,
297
+ * garantindo aparência consistente e acessível conforme guidelines LGPD.
298
+ *
299
+ * @remarks
300
+ * Pode ser sobrescrito via ThemeProvider externo se necessário.
173
301
  */
174
302
  declare const defaultConsentTheme: _mui_material_styles.Theme;
175
303
 
package/dist/index.d.ts CHANGED
@@ -6,6 +6,16 @@ import { FabProps } from '@mui/material/Fab';
6
6
  import * as React$1 from 'react';
7
7
  import * as _mui_material_styles from '@mui/material/styles';
8
8
 
9
+ /**
10
+ * Props para o componente CookieBanner.
11
+ *
12
+ * @property policyLinkUrl URL da política de privacidade (opcional).
13
+ * @property debug Força exibição do banner para QA/debug (opcional).
14
+ * @property blocking Se true, bloqueia interação até decisão do usuário (default: true).
15
+ * @property hideBranding Se true, oculta o branding "fornecido por LÉdipO.eti.br" (opcional).
16
+ * @property SnackbarProps Props adicionais para o componente MUI Snackbar (opcional).
17
+ * @property PaperProps Props adicionais para o componente MUI Paper (opcional).
18
+ */
9
19
  interface CookieBannerProps {
10
20
  policyLinkUrl?: string;
11
21
  debug?: boolean;
@@ -14,29 +24,79 @@ interface CookieBannerProps {
14
24
  SnackbarProps?: Partial<SnackbarProps>;
15
25
  PaperProps?: Partial<PaperProps>;
16
26
  }
27
+ /**
28
+ * Banner de consentimento de cookies conforme LGPD.
29
+ *
30
+ * Exibe mensagem informativa, botões de ação e link para política de privacidade.
31
+ * Compatível com modo bloqueante (overlay) e não bloqueante (Snackbar).
32
+ *
33
+ * - Textos em pt-BR, customizáveis via contexto.
34
+ * - Acessível e responsivo.
35
+ * - Branding opcional.
36
+ *
37
+ * @param props Propriedades do banner de consentimento.
38
+ */
17
39
  declare function CookieBanner({ policyLinkUrl, debug, blocking, // Por padrão, bloqueia até decisão
18
40
  hideBranding, SnackbarProps, PaperProps, }: Readonly<CookieBannerProps>): react_jsx_runtime.JSX.Element | null;
19
41
 
42
+ /**
43
+ * Props para o componente PreferencesModal.
44
+ *
45
+ * @property DialogProps Props opcionais para customizar o Dialog do Material-UI.
46
+ * @property hideBranding Se true, oculta o branding "fornecido por LÉdipO.eti.br".
47
+ */
20
48
  interface PreferencesModalProps {
21
49
  DialogProps?: Partial<DialogProps>;
22
50
  hideBranding?: boolean;
23
51
  }
52
+ /**
53
+ * Modal de preferências de cookies.
54
+ *
55
+ * Permite ao usuário ajustar suas preferências de consentimento para cookies analíticos e de marketing.
56
+ * Utiliza Material-UI Dialog, switches para cada categoria e textos customizáveis via contexto.
57
+ * Acessível, responsivo e compatível com SSR.
58
+ *
59
+ * @param props Props do modal, incluindo customização do Dialog e opção de ocultar branding.
60
+ */
24
61
  declare function PreferencesModal({ DialogProps, hideBranding, }: Readonly<PreferencesModalProps>): react_jsx_runtime.JSX.Element;
25
62
 
63
+ /**
64
+ * Props para o componente FloatingPreferencesButton.
65
+ *
66
+ * Permite configurar posição, ícone, tooltip, e comportamento de exibição do botão flutuante
67
+ * para abrir o modal de preferências de cookies LGPD.
68
+ *
69
+ * Todos os campos são opcionais e possuem valores padrão.
70
+ */
26
71
  interface FloatingPreferencesButtonProps {
27
72
  /** Posição do botão flutuante. Padrão: 'bottom-right' */
28
73
  position?: 'bottom-left' | 'bottom-right' | 'top-left' | 'top-right';
29
74
  /** Offset da borda em pixels. Padrão: 24 */
30
75
  offset?: number;
31
- /** Ícone customizado. Padrão: SettingsIcon */
76
+ /** Ícone customizado. Padrão: CookieOutlined */
32
77
  icon?: React.ReactNode;
33
- /** Tooltip customizado */
78
+ /** Tooltip customizado exibido ao passar o mouse */
34
79
  tooltip?: string;
35
- /** Props do Fab do MUI */
80
+ /** Props adicionais para o Fab do MUI */
36
81
  FabProps?: Partial<FabProps>;
37
82
  /** Se deve esconder quando consentimento já foi dado. Padrão: false */
38
83
  hideWhenConsented?: boolean;
39
84
  }
85
+ /**
86
+ * Botão flutuante para abrir o modal de preferências de cookies.
87
+ *
88
+ * Permite ao usuário acessar rapidamente as configurações de consentimento LGPD.
89
+ * Pode ser posicionado em qualquer canto da tela e customizado via props.
90
+ *
91
+ * @param position Posição do botão na tela. Padrão: 'bottom-right'.
92
+ * @param offset Distância da borda em pixels. Padrão: 24.
93
+ * @param icon Ícone customizado para o botão. Padrão: CookieOutlined.
94
+ * @param tooltip Texto do tooltip exibido ao passar o mouse. Padrão: 'Gerenciar Preferências de Cookies'.
95
+ * @param FabProps Props adicionais para o componente Fab do MUI.
96
+ * @param hideWhenConsented Se verdadeiro, esconde o botão após consentimento. Padrão: false.
97
+ *
98
+ * @returns JSX.Element | null
99
+ */
40
100
  declare function FloatingPreferencesButton({ position, offset, icon, tooltip, FabProps, hideWhenConsented, }: Readonly<FloatingPreferencesButtonProps>): react_jsx_runtime.JSX.Element | null;
41
101
 
42
102
  /**
@@ -62,6 +122,25 @@ interface ConsentState {
62
122
  }
63
123
  /**
64
124
  * Textos utilizados na interface de consentimento.
125
+ *
126
+ * @remarks
127
+ * Esta interface define todos os textos exibidos na UI do banner e modal de consentimento.
128
+ * Os campos opcionais permitem adequação à ANPD e customização conforme necessidade do projeto.
129
+ *
130
+ * @property bannerMessage - Mensagem principal exibida no banner de consentimento.
131
+ * @property acceptAll - Texto do botão para aceitar todos os cookies.
132
+ * @property declineAll - Texto do botão para recusar todos os cookies.
133
+ * @property preferences - Texto do botão para abrir preferências.
134
+ * @property policyLink - (Opcional) Link para política de privacidade.
135
+ * @property modalTitle - Título do modal de preferências.
136
+ * @property modalIntro - Texto introdutório do modal.
137
+ * @property save - Texto do botão para salvar preferências.
138
+ * @property necessaryAlwaysOn - Texto explicativo para cookies necessários.
139
+ * @property controllerInfo - (Opcional) Informação sobre o controlador dos dados.
140
+ * @property dataTypes - (Opcional) Tipos de dados coletados.
141
+ * @property thirdPartySharing - (Opcional) Compartilhamento com terceiros.
142
+ * @property userRights - (Opcional) Direitos do titular dos dados.
143
+ * @property contactInfo - (Opcional) Informações de contato do DPO.
65
144
  */
66
145
  interface ConsentTexts {
67
146
  bannerMessage: string;
@@ -142,8 +221,44 @@ interface ConsentContextValue {
142
221
  resetConsent: () => void;
143
222
  }
144
223
 
224
+ /**
225
+ * Provider principal do contexto de consentimento LGPD.
226
+ *
227
+ * Gerencia o estado global de consentimento de cookies, preferências do usuário,
228
+ * textos customizáveis e integração com SSR. Permite customização do modal de preferências,
229
+ * callbacks externos e opções de cookie.
230
+ *
231
+ * @param props Propriedades do ConsentProvider (ver ConsentProviderProps)
232
+ * @returns JSX.Element
233
+ *
234
+ * @example
235
+ * <ConsentProvider>
236
+ * <App />
237
+ * </ConsentProvider>
238
+ */
145
239
  declare function ConsentProvider({ initialState, texts: textsProp, theme, PreferencesModalComponent, preferencesModalProps, disableAutomaticModal, hideBranding, onConsentGiven, onPreferencesSaved, cookie: cookieOpts, children, }: Readonly<ConsentProviderProps>): react_jsx_runtime.JSX.Element;
146
240
 
241
+ /**
242
+ * Hook principal para acessar e manipular o estado de consentimento de cookies.
243
+ *
244
+ * Retorna o estado atual do consentimento, preferências do usuário e métodos para
245
+ * aceitar, recusar, modificar ou resetar consentimentos. Ideal para integração
246
+ * com componentes customizados ou lógica de negócio.
247
+ *
248
+ * @returns {ConsentContextValue} Estado e ações do consentimento.
249
+ *
250
+ * @example
251
+ * const {
252
+ * consented,
253
+ * preferences,
254
+ * acceptAll,
255
+ * rejectAll,
256
+ * setPreference,
257
+ * openPreferences,
258
+ * closePreferences,
259
+ * resetConsent,
260
+ * } = useConsent();
261
+ */
147
262
  declare function useConsent(): ConsentContextValue;
148
263
  /**
149
264
  * Hook para acessar textos customizados do ConsentProvider.
@@ -162,14 +277,27 @@ declare function ConsentGate(props: Readonly<{
162
277
  }>): react_jsx_runtime.JSX.Element | null;
163
278
 
164
279
  /**
165
- * Carrega um script dinamicamente após consentimento finalizado.
166
- * Aguarda que o usuário tome uma decisão definitiva (banner fechado ou preferências salvas).
280
+ * Carrega dinamicamente um script externo após o consentimento do usuário ser finalizado.
281
+ *
282
+ * Aguarda até que o usuário tome uma decisão definitiva (banner fechado ou preferências salvas)
283
+ * antes de inserir o script na página. Permite restringir o carregamento por categoria de consentimento.
284
+ *
285
+ * @param id - Identificador único do elemento script a ser criado.
286
+ * @param src - URL do script externo.
287
+ * @param category - Categoria de consentimento exigida para o script ('analytics', 'marketing' ou null).
288
+ * @param attrs - Atributos adicionais a serem aplicados ao elemento script.
289
+ * @returns Promise que resolve quando o script é carregado ou rejeita se o consentimento não for dado.
167
290
  */
168
291
  declare function loadScript(id: string, src: string, category?: 'analytics' | 'marketing' | null, attrs?: Record<string, string>): Promise<void>;
169
292
 
170
293
  /**
171
- * Tema padrão para os componentes de consentimento.
172
- * Baseado no design system da ANPD/governo brasileiro.
294
+ * Tema padrão utilizado pelos componentes de consentimento da biblioteca.
295
+ *
296
+ * Inclui configurações de cores, tipografia e estilos para componentes Material-UI,
297
+ * garantindo aparência consistente e acessível conforme guidelines LGPD.
298
+ *
299
+ * @remarks
300
+ * Pode ser sobrescrito via ThemeProvider externo se necessário.
173
301
  */
174
302
  declare const defaultConsentTheme: _mui_material_styles.Theme;
175
303
 
package/dist/index.js CHANGED
@@ -6,7 +6,7 @@ import {
6
6
  useConsent,
7
7
  useConsentHydration,
8
8
  useConsentTexts
9
- } from "./chunk-LRMSFSP2.js";
9
+ } from "./chunk-XIHO7M77.js";
10
10
 
11
11
  // src/components/CookieBanner.tsx
12
12
  import Button from "@mui/material/Button";
@@ -115,15 +115,15 @@ function CookieBanner({
115
115
  }
116
116
 
117
117
  // src/components/FloatingPreferencesButton.tsx
118
+ import CookieOutlined from "@mui/icons-material/CookieOutlined";
118
119
  import Fab from "@mui/material/Fab";
119
120
  import Tooltip from "@mui/material/Tooltip";
120
- import SettingsIcon from "@mui/icons-material/Settings";
121
121
  import { useTheme } from "@mui/material/styles";
122
122
  import { jsx as jsx2 } from "react/jsx-runtime";
123
123
  function FloatingPreferencesButton({
124
124
  position = "bottom-right",
125
125
  offset = 24,
126
- icon = /* @__PURE__ */ jsx2(SettingsIcon, {}),
126
+ icon = /* @__PURE__ */ jsx2(CookieOutlined, {}),
127
127
  tooltip,
128
128
  FabProps,
129
129
  hideWhenConsented = false
@@ -138,7 +138,6 @@ function FloatingPreferencesButton({
138
138
  const styles = {
139
139
  position: "fixed",
140
140
  zIndex: 1200
141
- // Abaixo do modal mas acima do conteúdo
142
141
  };
143
142
  switch (position) {
144
143
  case "bottom-left":
package/package.json CHANGED
@@ -1,17 +1,17 @@
1
1
  {
2
2
  "name": "react-lgpd-consent",
3
- "version": "0.1.11",
4
- "description": "Biblioteca de consentimento de cookies (LGPD) para React e Next.js, com contexto, banner e modal personalizáveis usando MUI.",
3
+ "version": "0.1.13",
4
+ "description": "Biblioteca de consentimento de cookies (LGPD) para React client-side, com contexto, banner e modal personalizáveis usando MUI.",
5
5
  "keywords": [
6
6
  "lgpd",
7
7
  "cookie",
8
8
  "consent",
9
9
  "react",
10
- "nextjs",
10
+ "client-side",
11
+ "spa",
11
12
  "material-ui",
12
13
  "mui",
13
14
  "typescript",
14
- "ssr",
15
15
  "js-cookie",
16
16
  "consentimento",
17
17
  "privacidade",