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 +335 -0
- package/LICENSE +21 -0
- package/README.md +713 -0
- package/dist/ilibras-widget.cjs +1415 -0
- package/dist/ilibras-widget.js +1396 -0
- package/dist/ilibras-widget.mjs +1394 -0
- package/index.d.ts +118 -0
- package/package.json +59 -0
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.
|