ilibras-widget 1.4.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/CHANGELOG.md ADDED
@@ -0,0 +1,335 @@
1
+ # 📝 Changelog - iLibras Widget
2
+
3
+ Todas as mudanças notáveis neste projeto serão documentadas neste arquivo.
4
+
5
+ ---
6
+
7
+ ## [1.4.0] - 2026-09-16
8
+
9
+ ### 📦 O widget virou pacote npm
10
+
11
+ ```bash
12
+ npm i ilibras-widget
13
+ ```
14
+
15
+ ```js
16
+ import ILibrasWidget from 'ilibras-widget';
17
+ new ILibrasWidget({ token: 'SEU_TOKEN' });
18
+ ```
19
+
20
+ Três formatos saem da mesma fonte (`src/`): ESM para bundler, CJS para
21
+ `require`, e a build de `<script>` — que continua publicada no mesmo endereço
22
+ de sempre, `ilibras-widget.js` na raiz. Nenhum site instalado precisa mudar
23
+ nada.
24
+
25
+ Publicar no npm também dá uma CDN de graça:
26
+
27
+ ```html
28
+ <script src="https://cdn.jsdelivr.net/npm/ilibras-widget@1/dist/ilibras-widget.js"></script>
29
+ ```
30
+
31
+ ### 🖼️ Estilo e logo agora vão dentro do JavaScript
32
+
33
+ Era um `<link>` para um CSS irmão e um `<img>` para um SVG irmão, ambos
34
+ resolvidos procurando a própria `<script src>` na página. Sob um bundler essa
35
+ tag não existe: o caminho caía na URL do site do cliente, dava 404, e o widget
36
+ aparecia cru — sem nada no console que explicasse por quê.
37
+
38
+ **Isso corrige um problema que já existia.** As instruções de instalação nunca
39
+ mencionaram `ilibras-LOGO.svg` — mandavam baixar só o JS e o CSS. Quem seguiu o
40
+ README ao pé da letra estava com a logo do botão quebrada desde sempre.
41
+
42
+ O `<style>` é acrescentado ao fim do `<head>`, na mesma posição de cascata do
43
+ `<link>` de antes: quem sobrescreve o visual pelo CSS do próprio site segue
44
+ sobrescrevendo igual.
45
+
46
+ ### 🔤 Tipos TypeScript inclusos
47
+
48
+ Sem instalar `@types`. Cobrem a configuração inteira, os métodos públicos e os
49
+ tipos de falha.
50
+
51
+ ### 🧪 Testes
52
+
53
+ `npm test` guarda o que mais provavelmente quebra num pacote embarcável: o
54
+ widget chegar ao site do cliente sem estilo ou sem logo, o import criar widget
55
+ sozinho, ou a build de `<script>` perder o global que o WordPress usa.
56
+
57
+ ### 🔁 Compatibilidade
58
+
59
+ Nada quebra. O `ilibras-widget.js` da raiz tem o mesmo endereço, o mesmo global
60
+ e o mesmo comportamento — só que agora se basta. O `ilibras-widget.css` continua
61
+ no repositório para quem ainda o referencia, mas não é mais necessário.
62
+
63
+ ---
64
+
65
+ ## [1.3.0] - 2026-09-16
66
+
67
+ ### ✨ Agendamento direto pelo widget
68
+
69
+ - Novo botão no formulário: **Agendar uma conversa**. Quem clica não entra na
70
+ espera ao vivo — cai direto no calendário do iLibras, escolhe dia e horário e
71
+ recebe confirmação e lembretes por e-mail.
72
+
73
+ O cadastro é o mesmo dos dois lados; o que muda é o campo `modo` enviado
74
+ (`fila` ou `agendamento`) e, por consequência, o link que o iLibras devolve.
75
+
76
+ - Quem entra por este botão não passa pela fila ao vivo em momento nenhum: o
77
+ iLibras já cria o atendimento fora dela. Se a pessoa desistir e voltar para a
78
+ fila pela própria página, entra no fim — e a página avisa isso antes.
79
+
80
+ O aviso de saída da fila só existe para quem já estava esperando e clica em
81
+ agendar lá. Pelo widget não há aviso: a escolha foi feita antes de existir
82
+ fila para perder.
83
+
84
+ - Duas opções novas: `agendamento` (liga e desliga o botão, padrão `true`) e
85
+ `scheduleButtonText` (o texto dele).
86
+
87
+ Desligue com `agendamento: false` no site que só atende ao vivo: um botão que
88
+ leva a uma agenda que ninguém cobre é pior do que não ter o botão.
89
+
90
+ ### 🔁 Compatibilidade
91
+
92
+ Nenhuma quebra. Widget já instalado que não for atualizado continua enviando o
93
+ cadastro sem `modo`, e o iLibras trata a ausência como `fila` — exatamente o
94
+ comportamento anterior.
95
+
96
+ **Requer o iLibras com suporte a `modo` no endpoint do widget.** Sem ele o
97
+ campo é ignorado e o botão de agendar leva à fila, como antes.
98
+
99
+ ---
100
+
101
+ ## [1.2.0] - 2026-09-11
102
+
103
+ Adequações de segurança e acessibilidade. Nenhuma quebra de contrato com a API:
104
+ integrações existentes continuam funcionando sem alteração.
105
+
106
+ ### ♿ Acessibilidade
107
+
108
+ - O gatilho flutuante virou `<button>`. Era um `<div>`, ou seja, inalcançável
109
+ por teclado — quem não usa mouse não conseguia abrir o widget.
110
+ - O modal virou diálogo de verdade: `role="dialog"`, `aria-modal`, rótulo pelo
111
+ título, foco levado ao primeiro campo ao abrir, `Tab` preso dentro da janela,
112
+ `Esc` para fechar e foco devolvido a quem abriu.
113
+ - Erros deixaram de usar `alert()`. Agora aparecem junto do campo que os
114
+ causou, com `aria-invalid`, `aria-describedby` e ícone além da cor, e o foco
115
+ vai para o primeiro campo inválido.
116
+ - Estado do envio anunciado por região `aria-live`; falhas de serviço por
117
+ `role="alert"`.
118
+ - Contraste do placeholder e dos textos de apoio ajustado para 4.5:1 (AA).
119
+ - Suporte a `prefers-reduced-motion` e a `forced-colors` (alto contraste).
120
+ - `lang="pt-BR"` no container, para o leitor de tela usar a voz certa em site
121
+ de outro idioma.
122
+
123
+ ### 🛡️ Indisponibilidade do serviço
124
+
125
+ - Toda requisição tem prazo (`timeoutMs`, 15s por padrão) e é abortada ao
126
+ estourá-lo. Antes, uma API que aceitava a conexão e não respondia deixava a
127
+ pessoa no "Aguarde..." indefinidamente.
128
+ - Falha de rede e erro 5xx ganham uma retentativa com espera; `422` e `429`
129
+ não são repetidos.
130
+ - Mensagens distintas por causa: sem internet, servidor fora, demora, limite de
131
+ uso, token inválido, dados inválidos.
132
+ - Nova opção `fallback`: canais alternativos (telefone, e-mail, link) mostrados
133
+ quando o serviço não responde.
134
+ - Erros de validação vindos da API voltam para os campos certos.
135
+
136
+ ### ✅ Validação
137
+
138
+ - Nome: 3 a 120 caracteres, só letras e sinais de nome, exige sobrenome.
139
+ - Telefone: DDD conferido contra a lista nacional, 9º dígito de celular e
140
+ prefixo de fixo validados.
141
+ - CPF: inalterado (algoritmo dos dígitos verificadores).
142
+
143
+ ### 🤖 Proteção contra automação
144
+
145
+ - Campo-armadilha invisível (`site_url`) e marca de tempo de abertura
146
+ (`iniciado_em`) enviados junto com o cadastro, para o servidor separar quem
147
+ digitou de quem disparou um POST.
148
+ - Trava contra envio duplo enquanto uma requisição está em andamento.
149
+
150
+ ### 🐛 Correções
151
+
152
+ - A logo e a folha de estilo passam a ser resolvidas a partir do endereço do
153
+ próprio script. Eram caminhos relativos à página do cliente, então só
154
+ carregavam quando o widget ficava na raiz do site.
155
+ - Textos de configuração (`title`, `message`, `buttonText`) passam a ser
156
+ escapados antes de ir para o HTML.
157
+ - Se o bloqueador de pop-up impedir a nova aba, a navegação acontece na aba
158
+ atual em vez de o atendimento se perder.
159
+
160
+ ---
161
+
162
+ ## [1.1.0] - 2026-02-18
163
+
164
+ ### 🚀 Mudanças Importantes
165
+
166
+ #### Formato de Envio de Dados
167
+ - **BREAKING CHANGE:** Alterado de `JSON` para `FormData`
168
+ - Os dados agora são enviados como `multipart/form-data` em vez de `application/json`
169
+ - Compatível com APIs PHP que usam `$_POST`
170
+
171
+ **Antes:**
172
+ ```javascript
173
+ Content-Type: application/json
174
+ body: JSON.stringify({nome, cpf, telefone, token})
175
+ ```
176
+
177
+ **Agora:**
178
+ ```javascript
179
+ Content-Type: multipart/form-data
180
+ body: FormData com campos: nome, cpf, telefone, token
181
+ ```
182
+
183
+ #### Formato de Resposta da API
184
+ - **NOVO:** Suporte ao campo `link_fila` (prioridade máxima)
185
+ - Mantém compatibilidade com `link`, `url`, `redirect`
186
+
187
+ **Resposta Esperada:**
188
+ ```json
189
+ {
190
+ "status": "OK",
191
+ "link_fila": "https://sistema.ilibras.com.br/acesso.php?token=...",
192
+ "codigo": "...",
193
+ "id_atendimento": "717",
194
+ "id_surdo": 417
195
+ }
196
+ ```
197
+
198
+ #### Comportamento de Redirecionamento
199
+ - **MUDANÇA:** Redirecionamento agora abre em **nova aba**
200
+ - Usa `window.open(url, '_blank')` em vez de `window.location.href`
201
+ - Modal do widget fecha automaticamente após envio bem-sucedido
202
+ - Usuário permanece na página original
203
+
204
+ ### 🐛 Correções
205
+
206
+ #### Content Security Policy (CSP)
207
+ - Adicionada solução para CSP via Nginx
208
+ - Documentação atualizada com configuração de servidor
209
+ - Suporte a múltiplos ambientes (Apache + Nginx)
210
+
211
+ **Configuração Nginx:**
212
+ ```nginx
213
+ add_header Content-Security-Policy "connect-src 'self' wss://backend.smart2doc.com.br:6000 https://sistema.ilibras.com.br;";
214
+ ```
215
+
216
+ #### Estilos do Botão Close
217
+ - Corrigido problema de cor do botão de fechar em sites com CSS global
218
+ - Adicionado `!important` para forçar cor branca
219
+ - Adicionado `pointer-events: none` em SVGs
220
+
221
+ ### 📚 Documentação
222
+
223
+ - ✅ Atualizado README.md com novo formato de requisição/resposta
224
+ - ✅ Atualizado WORDPRESS.md com soluções de CSP específicas
225
+ - ✅ Documentado comportamento de nova aba
226
+ - ✅ Adicionados exemplos práticos de integração
227
+
228
+ ---
229
+
230
+ ## [1.0.0] - 2025-XX-XX
231
+
232
+ ### ✨ Lançamento Inicial
233
+
234
+ #### Funcionalidades
235
+ - Widget flutuante similar ao WhatsApp
236
+ - Formulário com validação de CPF e Telefone
237
+ - Máscaras de entrada automáticas
238
+ - Tema azul (#4A90E2)
239
+ - Posicionamento configurável (4 posições)
240
+ - Envio via POST para API
241
+ - Validação de token obrigatório
242
+ - Suporte a WordPress
243
+ - Responsivo e acessível
244
+
245
+ #### Campos do Formulário
246
+ - Nome completo
247
+ - CPF (com validação de dígitos verificadores)
248
+ - Telefone (10-11 dígitos)
249
+ - Checkbox de consentimento
250
+
251
+ #### Configurações
252
+ - `position`: Posição do widget na tela
253
+ - `primaryColor`: Cor principal do tema
254
+ - `title`: Título do modal
255
+ - `message`: Mensagem de boas-vindas
256
+ - `buttonText`: Texto do botão de envio
257
+ - `token`: Token de autenticação (obrigatório)
258
+ - `zIndex`: Controle de sobreposição
259
+
260
+ ---
261
+
262
+ ## 🔮 Próximas Atualizações (Roadmap)
263
+
264
+ ### Em Desenvolvimento
265
+ - [ ] Modo escuro automático
266
+ - [ ] Suporte a múltiplos idiomas
267
+ - [ ] Analytics integrado
268
+ - [ ] Callbacks personalizados
269
+ - [ ] Temas pré-definidos
270
+
271
+ ### Considerando
272
+ - [ ] Suporte a anexos
273
+ - [ ] Chat em tempo real
274
+ - [ ] Histórico de conversas
275
+ - [ ] Notificações push
276
+
277
+ ---
278
+
279
+ ## 📋 Notas de Migração
280
+
281
+ ### Migração de 1.0.0 para 1.1.0
282
+
283
+ Se você já usa o widget versão 1.0.0, siga estas etapas:
284
+
285
+ 1. **Atualizar arquivos:**
286
+ - Baixe `ilibras-widget.js` e `ilibras-widget.css` mais recentes
287
+ - Substitua os arquivos antigos
288
+
289
+ 2. **Verificar API:**
290
+ - Certifique-se que sua API aceita `FormData` (multipart/form-data)
291
+ - Campos disponíveis: `$_POST['nome']`, `$_POST['cpf']`, `$_POST['telefone']`, `$_POST['token']`
292
+
293
+ 3. **Atualizar resposta da API (opcional):**
294
+ - Adicione campo `link_fila` na resposta JSON
295
+ - Mantenha `link`, `url` ou `redirect` para compatibilidade
296
+
297
+ 4. **Configurar CSP (se necessário):**
298
+ - Se tiver erro de CSP, adicione `https://sistema.ilibras.com.br` nos domínios permitidos
299
+ - Veja [WORDPRESS.md](WORDPRESS.md) para soluções específicas
300
+
301
+ 5. **Testar:**
302
+ - Limpe cache do navegador
303
+ - Teste envio de formulário
304
+ - Verifique se abre em nova aba
305
+ - Confirme que modal fecha após envio
306
+
307
+ ---
308
+
309
+ ## 🤝 Contribuindo
310
+
311
+ Encontrou um bug? Tem uma sugestão?
312
+
313
+ 1. Abra uma issue descrevendo o problema/sugestão
314
+ 2. Se possível, envie um PR com a correção
315
+ 3. Documente qualquer mudança no comportamento
316
+
317
+ ---
318
+
319
+ ## 📞 Suporte
320
+
321
+ Para dúvidas sobre:
322
+ - **Integração**: Consulte [README.md](README.md)
323
+ - **WordPress**: Consulte [WORDPRESS.md](WORDPRESS.md)
324
+ - **Token**: Consulte [TOKEN.md](TOKEN.md)
325
+ - **CSP**: Entre em contato com suporte técnico
326
+
327
+ ---
328
+
329
+ **Legenda:**
330
+ - ✨ Nova funcionalidade
331
+ - 🐛 Correção de bug
332
+ - 🚀 Melhoria de performance
333
+ - 📚 Documentação
334
+ - ⚠️ Breaking change
335
+ - 🔒 Segurança
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 iLibras
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.