strapi-plugin-magic-sessionmanager 4.0.0 → 4.0.2

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.
Files changed (68) hide show
  1. package/README.md +2 -2
  2. package/admin/src/components/LicenseGuard.jsx +6 -6
  3. package/admin/src/components/OnlineUsersWidget.jsx +11 -7
  4. package/admin/src/components/SessionDetailModal.jsx +45 -41
  5. package/admin/src/components/SessionInfoCard.jsx +3 -3
  6. package/admin/src/components/SessionInfoPanel.jsx +31 -21
  7. package/admin/src/index.js +9 -0
  8. package/admin/src/pages/Analytics.jsx +2 -2
  9. package/admin/src/pages/HomePage.jsx +129 -165
  10. package/admin/src/pages/License.jsx +5 -5
  11. package/admin/src/pages/Settings.jsx +148 -144
  12. package/admin/src/pages/SettingsNew.jsx +21 -21
  13. package/admin/src/pages/UpgradePage.jsx +448 -0
  14. package/admin/src/pluginId.js +1 -0
  15. package/admin/src/translations/de.json +294 -15
  16. package/admin/src/translations/en.json +293 -14
  17. package/admin/src/translations/es.json +284 -18
  18. package/admin/src/translations/fr.json +284 -18
  19. package/admin/src/translations/pt.json +284 -18
  20. package/admin/src/utils/parseUserAgent.js +6 -6
  21. package/admin/src/utils/theme.js +85 -0
  22. package/dist/_chunks/{Analytics-mYu_uGwU.mjs → Analytics-DTE_zmRV.mjs} +4 -4
  23. package/dist/_chunks/{Analytics-ioaeEh-E.js → Analytics-lw_JaOVy.js} +4 -4
  24. package/dist/_chunks/{App-DdnUYWbC.js → App-DDKYCjKw.js} +221 -216
  25. package/dist/_chunks/{App-BXpIS12l.mjs → App-DJW1ZNl5.mjs} +221 -216
  26. package/dist/_chunks/{License-C03C2j9P.mjs → License-DaOFuImm.mjs} +6 -10
  27. package/dist/_chunks/{License-DZYrOgcx.js → License-Tk-6UfPl.js} +6 -10
  28. package/dist/_chunks/{OnlineUsersWidget-B8JS1xZu.js → OnlineUsersWidget-C1qTpsws.js} +11 -7
  29. package/dist/_chunks/{OnlineUsersWidget-ArMl0nen.mjs → OnlineUsersWidget-CADphbXG.mjs} +11 -7
  30. package/dist/_chunks/{Settings-0ocB3qHk.mjs → Settings-C9xvckgq.mjs} +200 -188
  31. package/dist/_chunks/{Settings-C6_CqpCC.js → Settings-DyEAuTNQ.js} +200 -188
  32. package/dist/_chunks/UpgradePage-Dssk8A0Z.js +354 -0
  33. package/dist/_chunks/UpgradePage-cINvE9zY.mjs +352 -0
  34. package/dist/_chunks/de-CDA1V0rF.mjs +292 -0
  35. package/dist/_chunks/de-I-Q-pWqu.js +292 -0
  36. package/dist/_chunks/en-Bd7_h-4e.js +292 -0
  37. package/dist/_chunks/en-DzmOCyzQ.mjs +292 -0
  38. package/dist/_chunks/es-BcAx18XG.js +277 -0
  39. package/dist/_chunks/es-Cx-SN6qV.mjs +277 -0
  40. package/dist/_chunks/fr-DCzYMuJ-.js +277 -0
  41. package/dist/_chunks/fr-DXlXE5Eo.mjs +277 -0
  42. package/dist/_chunks/{index-DC8Y0qxx.js → index-CWcvrfXc.js} +52 -49
  43. package/dist/_chunks/{index-DBRS3kt5.mjs → index-DQO9bNP7.mjs} +52 -49
  44. package/dist/_chunks/pt-21-MAb72.js +277 -0
  45. package/dist/_chunks/pt-zsdTSjba.mjs +277 -0
  46. package/dist/_chunks/{useLicense-qgGfMvse.js → useLicense-DtvJOszr.js} +1 -1
  47. package/dist/_chunks/{useLicense-DSLL9n3Y.mjs → useLicense-DxbD4Wf8.mjs} +1 -1
  48. package/dist/admin/index.js +1 -1
  49. package/dist/admin/index.mjs +1 -1
  50. package/dist/server/index.js +142 -33
  51. package/dist/server/index.mjs +142 -33
  52. package/package.json +1 -1
  53. package/server/src/bootstrap.js +76 -4
  54. package/server/src/controllers/session.js +59 -9
  55. package/server/src/middlewares/last-seen.js +5 -4
  56. package/server/src/routes/content-api.js +11 -2
  57. package/server/src/services/notifications.js +10 -10
  58. package/server/src/services/session.js +24 -4
  59. package/dist/_chunks/de-BxFx1pwE.js +0 -23
  60. package/dist/_chunks/de-CdO3s01z.mjs +0 -23
  61. package/dist/_chunks/en-CsPpPJL3.mjs +0 -23
  62. package/dist/_chunks/en-RqmpDHdS.js +0 -23
  63. package/dist/_chunks/es-CuLHazN1.js +0 -23
  64. package/dist/_chunks/es-Dkmjhy9c.mjs +0 -23
  65. package/dist/_chunks/fr-BAJp2yhI.js +0 -23
  66. package/dist/_chunks/fr-Bssg_3UF.mjs +0 -23
  67. package/dist/_chunks/pt-BAP9cKs3.js +0 -23
  68. package/dist/_chunks/pt-BVNoNcuY.mjs +0 -23
@@ -1,21 +1,287 @@
1
1
  {
2
- "plugin.name": "Gerenciador de Sessões",
3
- "plugin.description": "Rastreamento de login/logout e atividade de usuários",
4
- "settings.section": "Gerenciador de Sessões",
2
+ "plugin.name": "Session Manager",
3
+ "plugin.description": "Rastrear login/logout e atividade de sessões de usuários",
4
+
5
+ "settings.section": "Session Manager",
5
6
  "settings.sessions": "Sessões Ativas",
6
- "settings.emailTemplates.title": "Modelos de Email",
7
- "settings.emailTemplates.description": "Personalizar modelos de notificação por email com variáveis dinâmicas",
8
- "settings.emailTemplates.validate": "Validar",
9
- "settings.emailTemplates.loadDefault": "Carregar Modelo Padrão",
10
- "settings.emailTemplates.subject": "Assunto do Email",
11
- "settings.emailTemplates.htmlTemplate": "Modelo HTML",
12
- "settings.emailTemplates.textTemplate": "Modelo de Texto (Reserva)",
13
- "settings.emailTemplates.variables": "Variáveis Disponíveis (clique para copiar)",
14
- "settings.emailTemplates.validation.success": "Modelo válido! {count} variáveis encontradas.",
15
- "settings.emailTemplates.validation.warning": "Nenhuma variável encontrada no modelo. Adicione pelo menos uma variável.",
16
- "settings.emailTemplates.defaultLoaded": "Modelo padrão carregado!",
17
- "settings.emailTemplates.suspiciousLogin": "Login Suspeito",
18
- "settings.emailTemplates.newLocation": "Nova Localização",
19
- "settings.emailTemplates.vpnProxy": "VPN/Proxy"
7
+ "settings.upgrade": "Atualizar",
8
+ "settings.general": "Geral",
9
+ "settings.analytics": "Análises",
10
+ "settings.license": "Licença",
11
+
12
+ "widget.online-users.title": "Usuários Online",
13
+ "widget.stats.onlineNow": "Online agora",
14
+ "widget.stats.offline": "Offline",
15
+ "widget.stats.last15min": "Últimos 15 min",
16
+ "widget.stats.last30min": "Últimos 30 min",
17
+ "widget.stats.totalUsers": "Usuários totais",
18
+ "widget.stats.blocked": "Bloqueados",
19
+
20
+ "homepage.title": "Session Manager",
21
+ "homepage.subtitle": "Monitorar e gerenciar sessões de usuários em tempo real",
22
+ "homepage.stats.active": "Ativo",
23
+ "homepage.stats.idle": "Inativo",
24
+ "homepage.stats.loggedOut": "Desconectado",
25
+ "homepage.stats.terminated": "Encerrado",
26
+ "homepage.stats.total": "Total",
27
+ "homepage.export.csv": "Exportar CSV",
28
+ "homepage.export.json": "Exportar JSON",
29
+ "homepage.loading": "Carregando sessões...",
30
+ "homepage.allSessions": "Todas as Sessões",
31
+ "homepage.search.placeholder": "Buscar por usuário, endereço IP ou dispositivo...",
32
+ "homepage.filter.all": "Todas as Sessões",
33
+ "homepage.filter.active": "Ativas (menos de 15 min)",
34
+ "homepage.filter.idle": "Inativas (mais de 15 min)",
35
+ "homepage.filter.loggedout": "Desconectadas",
36
+ "homepage.filter.terminated": "Encerradas",
37
+ "homepage.entries.10": "10 entradas",
38
+ "homepage.entries.25": "25 entradas",
39
+ "homepage.entries.50": "50 entradas",
40
+ "homepage.entries.100": "100 entradas",
41
+ "homepage.showing": "Exibindo {count} de {total} sessões",
42
+ "homepage.showingFiltered": "Exibindo {count} de {total} sessões (filtrado por \"{query}\")",
43
+ "homepage.table.status": "Status",
44
+ "homepage.table.user": "Usuário",
45
+ "homepage.table.device": "Dispositivo",
46
+ "homepage.table.ipAddress": "Endereço IP",
47
+ "homepage.table.loginTime": "Hora de Login",
48
+ "homepage.table.lastActive": "Última Atividade",
49
+ "homepage.table.actions": "Ações",
50
+ "homepage.status.active": "Ativo",
51
+ "homepage.status.idle": "Inativo",
52
+ "homepage.status.loggedOut": "Desconectado",
53
+ "homepage.status.terminated": "Encerrado",
54
+ "homepage.user.unknown": "Desconhecido",
55
+ "homepage.time.minAgo": "há {minutes} min",
56
+ "homepage.actions.viewDetails": "Ver Detalhes",
57
+ "homepage.actions.terminate": "Encerrar (Logout)",
58
+ "homepage.actions.alreadyInactive": "Já inativo",
59
+ "homepage.actions.deletePermanently": "Excluir Permanentemente",
60
+ "homepage.empty.title": "Ainda não há sessões",
61
+ "homepage.empty.description": "As sessões aparecerão aqui quando os usuários fizerem login na sua aplicação",
62
+ "homepage.noResults.title": "Nenhuma sessão encontrada",
63
+ "homepage.noResults.description": "Tente ajustar sua consulta de busca ou filtros para encontrar sessões",
64
+ "homepage.confirm.terminate": "Tem certeza de que deseja encerrar esta sessão?\n\nIsso definirá isActive como false (o usuário será desconectado).",
65
+ "homepage.confirm.delete": "[AVISO] Isso EXCLUIRÁ PERMANENTEMENTE esta sessão do banco de dados!\n\nEsta ação não pode ser desfeita.\n\nTem certeza?",
66
+
67
+ "modal.title": "Detalhes da Sessão",
68
+ "modal.id": "ID: {id}",
69
+ "modal.status.online": "ONLINE",
70
+ "modal.status.offline": "OFFLINE",
71
+ "modal.section.user": "Usuário",
72
+ "modal.section.device": "Dispositivo",
73
+ "modal.section.timeline": "Linha do Tempo",
74
+ "modal.section.security": "Localização e Segurança",
75
+ "modal.section.technical": "Detalhes Técnicos",
76
+ "modal.user.username": "Nome de usuário",
77
+ "modal.user.email": "E-mail",
78
+ "modal.user.id": "ID do Usuário",
79
+ "modal.user.na": "N/D",
80
+ "modal.device.device": "Dispositivo",
81
+ "modal.device.browser": "Navegador",
82
+ "modal.device.os": "Sistema Operacional",
83
+ "modal.device.ip": "IP",
84
+ "modal.timeline.login": "Login",
85
+ "modal.timeline.lastActive": "Última Atividade",
86
+ "modal.timeline.idleTime": "Tempo Inativo",
87
+ "modal.timeline.logout": "Logout",
88
+ "modal.timeline.minutes": "{minutes} min",
89
+ "modal.security.loading": "Carregando dados de localização...",
90
+ "modal.security.country": "País",
91
+ "modal.security.city": "Cidade",
92
+ "modal.security.timezone": "Fuso horário",
93
+ "modal.security.score": "Segurança",
94
+ "modal.security.vpn": "VPN",
95
+ "modal.security.proxy": "Proxy",
96
+ "modal.security.vpnWarning": "[AVISO] Sim",
97
+ "modal.security.no": "Não",
98
+ "modal.premium.title": "Análise de Localização e Segurança",
99
+ "modal.premium.description": "Desbloqueie recursos premium para obter geolocalização IP, pontuação de segurança e detecção de VPN/Proxy para cada sessão",
100
+ "modal.premium.upgrade": "Atualizar para Premium",
101
+ "modal.technical.show": "Mostrar Detalhes",
102
+ "modal.technical.hide": "Ocultar Detalhes",
103
+ "modal.actions.close": "Fechar",
104
+ "modal.actions.terminate": "Encerrar Sessão",
105
+ "modal.confirm.terminate": "Tem certeza de que deseja encerrar esta sessão?",
106
+
107
+ "panel.title": "Info da Sessão",
108
+ "panel.loading": "Carregando...",
109
+ "panel.status.active": "ATIVO",
110
+ "panel.status.offline": "OFFLINE",
111
+ "panel.sessions.count": "{count} sessão(ões) ativa(s)",
112
+ "panel.sessions.title": "Sessões Ativas",
113
+ "panel.sessions.active": "Ativo",
114
+ "panel.sessions.activeNow": "Ativo agora",
115
+ "panel.sessions.activeAgo": "Ativo há {minutes} min",
116
+ "panel.sessions.more": "+{count} sessão(ões) adicional(is)",
117
+ "panel.blocked.title": "Usuário bloqueado",
118
+ "panel.blocked.description": "Autenticação desabilitada",
119
+ "panel.empty.title": "Sem sessões ativas",
120
+ "panel.empty.description": "O usuário ainda não fez login",
121
+ "panel.actions.title": "Ações",
122
+ "panel.actions.terminateAll": "Encerrar Todas as Sessões",
123
+ "panel.actions.blockUser": "Bloquear Usuário",
124
+ "panel.actions.unblockUser": "Desbloquear Usuário",
125
+
126
+ "settings.title": "Configurações do Session Manager",
127
+ "settings.subtitle": "Configurar rastreamento de sessões, segurança e notificações por e-mail",
128
+ "settings.save": "Salvar Alterações",
129
+ "settings.saving": "Salvando...",
130
+ "settings.noChanges": "Sem Alterações",
131
+ "settings.reset": "Redefinir",
132
+ "settings.license.title": "Status Atual da Licença",
133
+ "settings.license.premium": "Premium",
134
+ "settings.license.advanced": "Advanced",
135
+ "settings.license.enterprise": "Enterprise",
136
+
137
+ "settings.general.title": "Configurações Gerais",
138
+ "settings.general.description": "Configuração básica de rastreamento de sessões",
139
+ "settings.general.timeout.title": "TEMPO LIMITE DE SESSÃO",
140
+ "settings.general.timeout.inactivity": "Tempo Limite de Inatividade",
141
+ "settings.general.timeout.inactivityHint": "Sessões inativas por mais de {minutes} minutos serão marcadas como offline",
142
+ "settings.general.timeout.5min": "5 minutos (Muito rigoroso)",
143
+ "settings.general.timeout.10min": "10 minutos (Rigoroso)",
144
+ "settings.general.timeout.15min": "15 minutos (Recomendado)",
145
+ "settings.general.timeout.30min": "30 minutos (Moderado)",
146
+ "settings.general.timeout.1hour": "1 hora (Relaxado)",
147
+ "settings.general.timeout.2hours": "2 horas (Muito relaxado)",
148
+ "settings.general.rateLimit.title": "Limite de Taxa de Última Vista",
149
+ "settings.general.rateLimit.hint": "Evita gravações excessivas no banco de dados. Atualizações limitadas a uma vez a cada {seconds} segundos",
150
+ "settings.general.rateLimit.10sec": "10 segundos",
151
+ "settings.general.rateLimit.30sec": "30 segundos (Recomendado)",
152
+ "settings.general.rateLimit.1min": "1 minuto",
153
+ "settings.general.rateLimit.2min": "2 minutos",
154
+ "settings.general.rateLimit.5min": "5 minutos",
155
+ "settings.general.cleanup.title": "LIMPEZA E RETENÇÃO AUTOMÁTICAS",
156
+ "settings.general.cleanup.interval": "Intervalo de Limpeza",
157
+ "settings.general.cleanup.intervalHint": "Sessões inativas são automaticamente limpas a cada {minutes} minutos",
158
+ "settings.general.cleanup.15min": "15 minutos",
159
+ "settings.general.cleanup.30min": "30 minutos (Recomendado)",
160
+ "settings.general.cleanup.1hour": "1 hora",
161
+ "settings.general.cleanup.2hours": "2 horas",
162
+ "settings.general.retention.title": "Período de Retenção",
163
+ "settings.general.retention.hint": "Sessões antigas são excluídas após {days}",
164
+ "settings.general.retention.hintNever": "Sessões antigas nunca são excluídas",
165
+ "settings.general.retention.7days": "7 dias",
166
+ "settings.general.retention.30days": "30 dias",
167
+ "settings.general.retention.60days": "60 dias",
168
+ "settings.general.retention.90days": "90 dias (Recomendado)",
169
+ "settings.general.retention.180days": "180 dias",
170
+ "settings.general.retention.1year": "1 ano",
171
+ "settings.general.retention.forever": "Para sempre",
172
+ "settings.general.danger.title": "Zona de Perigo",
173
+ "settings.general.danger.description": "Limpar Todas Inativas: Exclui permanentemente todas as sessões inativas. Isso não pode ser desfeito.",
174
+ "settings.general.danger.cleanNow": "Limpar Agora",
175
+ "settings.general.danger.confirm": "[AVISO] Isso excluirá permanentemente TODAS as sessões inativas.\n\nContinuar?",
176
+
177
+ "settings.security.title": "Configurações de Segurança",
178
+ "settings.security.description": "Políticas de segurança e proteção contra ameaças",
179
+ "settings.security.options": "OPÇÕES DE SEGURANÇA",
180
+ "settings.security.encryption.title": "Gerador de Chave de Criptografia JWT",
181
+ "settings.security.encryption.description": "Gere uma chave de criptografia segura de 32 caracteres para armazenamento de tokens JWT. Esta chave é usada para criptografar tokens antes de salvá-los no banco de dados.",
182
+ "settings.security.encryption.important": "Importante",
183
+ "settings.security.encryption.envHint": "Adicione esta chave ao seu arquivo .env como SESSION_ENCRYPTION_KEY para produção.",
184
+ "settings.security.encryption.label": "Chave de Criptografia Gerada",
185
+ "settings.security.encryption.placeholder": "Clique em 'Gerar Chave' para criar uma chave segura",
186
+ "settings.security.encryption.show": "Mostrar",
187
+ "settings.security.encryption.hide": "Ocultar",
188
+ "settings.security.encryption.generate": "Gerar Chave",
189
+ "settings.security.encryption.copy": "Copiar para Área de Transferência",
190
+ "settings.security.encryption.copyEnv": "Copiar para .env",
191
+ "settings.security.encryption.envLabel": "Adicionar ao arquivo .env:",
192
+ "settings.security.blockSuspicious.title": "Bloquear Sessões Suspeitas",
193
+ "settings.security.blockSuspicious.description": "Bloquear automaticamente sessões de VPNs, proxies ou IPs de ameaças",
194
+ "settings.security.geolocation.title": "Geolocalização IP",
195
+ "settings.security.geolocation.description": "Obter dados de localização para cada sessão (Premium)",
196
+ "settings.security.scoring.title": "Pontuação de Segurança",
197
+ "settings.security.scoring.description": "Calcular pontuações de segurança e detectar ameaças (Premium)",
198
+ "settings.security.maxFailed.title": "Máx. Tentativas de Login Falhadas",
199
+ "settings.security.maxFailed.hint": "O usuário será bloqueado após {count} tentativas falhadas",
200
+
201
+ "settings.email.title": "Notificações por E-mail (Advanced)",
202
+ "settings.email.description": "Alertas por e-mail para eventos de segurança",
203
+ "settings.email.alerts.title": "ALERTAS POR E-MAIL",
204
+ "settings.email.alerts.subtitle": "Enviar alertas de segurança para usuários por e-mail",
205
+ "settings.email.enable.title": "Habilitar Alertas por E-mail",
206
+ "settings.email.enable.description": "Enviar alertas de segurança para logins suspeitos, novas localizações e uso de VPN/Proxy",
207
+ "settings.email.types.title": "TIPOS DE ALERTA",
208
+ "settings.email.types.suspicious": "Login Suspeito",
209
+ "settings.email.types.newLocation": "Nova Localização",
210
+ "settings.email.types.vpnProxy": "VPN/Proxy",
211
+ "settings.email.templates.title": "MODELOS DE E-MAIL",
212
+ "settings.email.templates.subtitle": "Personalizar modelos de notificação com variáveis dinâmicas",
213
+ "settings.email.templates.subject": "Assunto do E-mail",
214
+ "settings.email.templates.subjectPlaceholder": "Digite o assunto do e-mail...",
215
+ "settings.email.templates.variables": "Variáveis Disponíveis (clique para copiar)",
216
+ "settings.email.templates.html.title": "Modelo HTML",
217
+ "settings.email.templates.html.badge": "Modelo Principal",
218
+ "settings.email.templates.html.description": "Modelo HTML para notificações. Use variáveis como {{user.email}} para conteúdo dinâmico.",
219
+ "settings.email.templates.html.loadDefault": "Carregar Padrão",
220
+ "settings.email.templates.html.copy": "Copiar Modelo",
221
+ "settings.email.templates.html.validate": "Validar",
222
+ "settings.email.templates.html.info": "Info do Modelo",
223
+ "settings.email.templates.text.title": "Modelo de Texto",
224
+ "settings.email.templates.text.badge": "Alternativo",
225
+ "settings.email.templates.text.description": "Versão texto simples (sem HTML) como alternativa para clientes de e-mail antigos",
226
+ "settings.email.templates.text.loadDefault": "Carregar Padrão",
227
+ "settings.email.templates.text.copy": "Copiar Modelo",
228
+ "settings.email.templates.tab.suspicious": "Login Suspeito",
229
+ "settings.email.templates.tab.newLocation": "Nova Localização",
230
+ "settings.email.templates.tab.vpnProxy": "VPN/Proxy",
231
+
232
+ "settings.webhooks.title": "Integração de Webhooks (Advanced)",
233
+ "settings.webhooks.description": "Integração com Discord e Slack",
234
+ "settings.webhooks.enable.title": "Habilitar Webhooks",
235
+ "settings.webhooks.enable.description": "Enviar eventos de sessão para Discord, Slack ou endpoints personalizados",
236
+ "settings.webhooks.discord.title": "URL do Webhook do Discord",
237
+ "settings.webhooks.discord.placeholder": "https://discord.com/api/webhooks/123456789/abcdefghijklmnopqrstuvwxyz...",
238
+ "settings.webhooks.discord.hint": "Opcional: Postar alertas de sessão no seu canal do Discord",
239
+ "settings.webhooks.slack.title": "URL do Webhook do Slack",
240
+ "settings.webhooks.slack.placeholder": "https://hooks.slack.com/services/XXXX/XXXX/XXXX",
241
+ "settings.webhooks.slack.hint": "Opcional: Postar alertas de sessão no seu workspace do Slack",
242
+ "settings.webhooks.characters": "{count} caracteres",
243
+
244
+ "settings.footer.title": "Configurações Armazenadas no Banco de Dados",
245
+ "settings.footer.description": "Todas as configurações são armazenadas no seu banco de dados Strapi e compartilhadas entre todos os usuários administradores. As alterações entram em vigor imediatamente - não é necessário reiniciar o servidor! Modelos de e-mail, webhooks e opções de segurança são todos gerenciados a partir desta interface.",
246
+
247
+ "common.loading": "Carregando...",
248
+ "common.save": "Salvar",
249
+ "common.cancel": "Cancelar",
250
+ "common.close": "Fechar",
251
+ "common.delete": "Excluir",
252
+ "common.confirm": "Confirmar",
253
+ "common.yes": "Sim",
254
+ "common.no": "Não",
255
+ "common.on": "em",
256
+ "common.active": "ATIVO",
257
+ "common.inactive": "INATIVO",
258
+
259
+ "notifications.success.saved": "Configurações salvas com sucesso no banco de dados!",
260
+ "notifications.success.deleted": "Sessão excluída permanentemente",
261
+ "notifications.success.terminated": "Sessão encerrada com sucesso",
262
+ "notifications.success.terminatedAll": "Todas as sessões encerradas com sucesso",
263
+ "notifications.success.blocked": "Usuário bloqueado com sucesso",
264
+ "notifications.success.unblocked": "Usuário desbloqueado com sucesso",
265
+ "notifications.success.exported": "{count} sessões exportadas para {format}",
266
+ "notifications.success.cleaned": "{count} sessões inativas excluídas com sucesso!",
267
+ "notifications.success.keyCopied": "Chave de criptografia copiada para a área de transferência!",
268
+ "notifications.success.keyGenerated": "Chave de criptografia de 32 caracteres gerada!",
269
+ "notifications.success.envCopied": "Copiado no formato .env!",
270
+ "notifications.success.templateCopied": "Modelo copiado!",
271
+ "notifications.success.htmlCopied": "Modelo HTML copiado!",
272
+ "notifications.success.textCopied": "Modelo de texto copiado!",
273
+ "notifications.success.defaultLoaded": "Modelo padrão carregado!",
274
+ "notifications.success.variableCopied": "{variable} copiado!",
275
+ "notifications.success.validated": "Modelo válido! {found}/{total} variáveis encontradas.",
276
+ "notifications.warning.premiumRequired": "Licença Premium necessária para função de exportação",
277
+ "notifications.warning.noVariables": "[AVISO] Nenhuma variável encontrada. Adicione pelo menos uma variável.",
278
+ "notifications.warning.settingsLoad": "Não foi possível carregar as configurações do servidor. Usando valores padrão.",
279
+ "notifications.error.terminate": "Falha ao encerrar a sessão",
280
+ "notifications.error.terminateAll": "Falha ao encerrar as sessões",
281
+ "notifications.error.delete": "Falha ao excluir a sessão",
282
+ "notifications.error.block": "Falha ao atualizar o status do usuário",
283
+ "notifications.error.save": "Falha ao salvar as configurações no servidor",
284
+ "notifications.error.clean": "Falha ao excluir as sessões inativas",
285
+ "notifications.error.export": "Falha ao exportar as sessões",
286
+ "notifications.info.templateStats": "O modelo tem {lines} linhas e {chars} caracteres"
20
287
  }
21
-
@@ -7,7 +7,7 @@ export const parseUserAgent = (userAgent) => {
7
7
  if (!userAgent) {
8
8
  return {
9
9
  device: 'Unknown',
10
- deviceIcon: '',
10
+ deviceIcon: 'question',
11
11
  browser: 'Unknown',
12
12
  os: 'Unknown',
13
13
  };
@@ -17,14 +17,14 @@ export const parseUserAgent = (userAgent) => {
17
17
 
18
18
  // Device detection
19
19
  let device = 'Desktop';
20
- let deviceIcon = '💻';
20
+ let deviceIcon = 'desktop';
21
21
 
22
22
  if (/(tablet|ipad|playbook|silk)|(android(?!.*mobi))/i.test(userAgent)) {
23
23
  device = 'Tablet';
24
- deviceIcon = '📱';
24
+ deviceIcon = 'tablet';
25
25
  } else if (/Mobile|Android|iP(hone|od)|IEMobile|BlackBerry|Kindle|Silk-Accelerated|(hpw|web)OS|Opera M(obi|ini)/.test(userAgent)) {
26
26
  device = 'Mobile';
27
- deviceIcon = '📱';
27
+ deviceIcon = 'mobile';
28
28
  }
29
29
 
30
30
  // Browser detection
@@ -45,11 +45,11 @@ export const parseUserAgent = (userAgent) => {
45
45
  device = 'API Client';
46
46
  } else if (ua.includes('postman')) {
47
47
  browser = 'Postman';
48
- deviceIcon = '📮';
48
+ deviceIcon = 'code';
49
49
  device = 'API Client';
50
50
  } else if (ua.includes('insomnia')) {
51
51
  browser = 'Insomnia';
52
- deviceIcon = '🌙';
52
+ deviceIcon = 'code';
53
53
  device = 'API Client';
54
54
  }
55
55
 
@@ -0,0 +1,85 @@
1
+ /**
2
+ * Theme Utilities for Dark Mode Support
3
+ *
4
+ * IMPORTANT: For Dark Mode to work properly, use props.theme in styled-components:
5
+ *
6
+ * Example:
7
+ * background: ${props => props.theme.colors.neutral0};
8
+ * color: ${props => props.theme.colors.neutral800};
9
+ * border: 1px solid ${props => props.theme.colors.neutral200};
10
+ *
11
+ * Strapi's ThemeProvider automatically switches these values between Light and Dark mode.
12
+ *
13
+ * Use the static `theme` object below ONLY for:
14
+ * - Gradients (which don't change between light/dark)
15
+ * - Shadows
16
+ * - Spacing
17
+ * - Border radius
18
+ * - Transitions
19
+ */
20
+
21
+ // Static design tokens (for non-theme-dependent values)
22
+ export const theme = {
23
+ colors: {
24
+ primary: {
25
+ 50: '#F0F9FF',
26
+ 100: '#E0F2FE',
27
+ 200: '#BAE6FD',
28
+ 500: '#0EA5E9',
29
+ 600: '#0284C7',
30
+ 700: '#0369A1',
31
+ },
32
+ secondary: {
33
+ 50: '#FAF5FF',
34
+ 100: '#F3E8FF',
35
+ 500: '#A855F7',
36
+ 600: '#9333EA',
37
+ },
38
+ success: {
39
+ 50: '#F0FDF4',
40
+ 100: '#DCFCE7',
41
+ 500: '#22C55E',
42
+ 600: '#16A34A',
43
+ 700: '#15803D',
44
+ },
45
+ warning: {
46
+ 50: '#FFFBEB',
47
+ 100: '#FEF3C7',
48
+ 500: '#F59E0B',
49
+ 600: '#D97706',
50
+ },
51
+ danger: {
52
+ 50: '#FEF2F2',
53
+ 100: '#FEE2E2',
54
+ 500: '#EF4444',
55
+ 600: '#DC2626',
56
+ },
57
+ },
58
+ shadows: {
59
+ sm: '0 1px 3px 0 rgba(0, 0, 0, 0.1), 0 1px 2px -1px rgba(0, 0, 0, 0.1)',
60
+ md: '0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -2px rgba(0, 0, 0, 0.1)',
61
+ lg: '0 10px 15px -3px rgba(0, 0, 0, 0.1), 0 4px 6px -4px rgba(0, 0, 0, 0.1)',
62
+ xl: '0 20px 25px -5px rgba(0, 0, 0, 0.1), 0 8px 10px -6px rgba(0, 0, 0, 0.1)',
63
+ },
64
+ transitions: {
65
+ fast: '150ms cubic-bezier(0.4, 0, 0.2, 1)',
66
+ normal: '300ms cubic-bezier(0.4, 0, 0.2, 1)',
67
+ slow: '500ms cubic-bezier(0.4, 0, 0.2, 1)',
68
+ },
69
+ spacing: {
70
+ xs: '4px',
71
+ sm: '8px',
72
+ md: '16px',
73
+ lg: '24px',
74
+ xl: '32px',
75
+ '2xl': '48px',
76
+ },
77
+ borderRadius: {
78
+ sm: '6px',
79
+ md: '8px',
80
+ lg: '12px',
81
+ xl: '16px',
82
+ }
83
+ };
84
+
85
+ export default theme;
@@ -4,8 +4,8 @@ import { useFetchClient } from "@strapi/strapi/admin";
4
4
  import styled, { css, keyframes } from "styled-components";
5
5
  import { Loader, Typography, Box, Flex, Badge } from "@strapi/design-system";
6
6
  import { ChartBubble, Crown, User, Clock, Monitor } from "@strapi/icons";
7
- import { a as pluginId } from "./index-DBRS3kt5.mjs";
8
- import { u as useLicense } from "./useLicense-DSLL9n3Y.mjs";
7
+ import { a as pluginId } from "./index-DQO9bNP7.mjs";
8
+ import { u as useLicense } from "./useLicense-DxbD4Wf8.mjs";
9
9
  const theme = {
10
10
  colors: {
11
11
  primary: { 100: "#E0F2FE", 500: "#0EA5E9", 600: "#0284C7" },
@@ -424,7 +424,7 @@ const AnalyticsPage = () => {
424
424
  display: "block",
425
425
  textShadow: "0 2px 4px rgba(0, 0, 0, 0.1)"
426
426
  },
427
- children: "📊 Analytics Dashboard"
427
+ children: "Analytics Dashboard"
428
428
  }
429
429
  ),
430
430
  /* @__PURE__ */ jsx(
@@ -467,7 +467,7 @@ const AnalyticsPage = () => {
467
467
  e.currentTarget.style.transform = "translateY(0) scale(1)";
468
468
  e.currentTarget.style.boxShadow = "0 6px 16px rgba(245, 158, 11, 0.4)";
469
469
  },
470
- children: "Upgrade to Premium"
470
+ children: "Upgrade to Premium"
471
471
  }
472
472
  )
473
473
  ] })
@@ -6,8 +6,8 @@ const admin = require("@strapi/strapi/admin");
6
6
  const styled = require("styled-components");
7
7
  const designSystem = require("@strapi/design-system");
8
8
  const icons = require("@strapi/icons");
9
- const index = require("./index-DC8Y0qxx.js");
10
- const useLicense = require("./useLicense-qgGfMvse.js");
9
+ const index = require("./index-CWcvrfXc.js");
10
+ const useLicense = require("./useLicense-DtvJOszr.js");
11
11
  const _interopDefault = (e) => e && e.__esModule ? e : { default: e };
12
12
  const styled__default = /* @__PURE__ */ _interopDefault(styled);
13
13
  const theme = {
@@ -428,7 +428,7 @@ const AnalyticsPage = () => {
428
428
  display: "block",
429
429
  textShadow: "0 2px 4px rgba(0, 0, 0, 0.1)"
430
430
  },
431
- children: "📊 Analytics Dashboard"
431
+ children: "Analytics Dashboard"
432
432
  }
433
433
  ),
434
434
  /* @__PURE__ */ jsxRuntime.jsx(
@@ -471,7 +471,7 @@ const AnalyticsPage = () => {
471
471
  e.currentTarget.style.transform = "translateY(0) scale(1)";
472
472
  e.currentTarget.style.boxShadow = "0 6px 16px rgba(245, 158, 11, 0.4)";
473
473
  },
474
- children: "Upgrade to Premium"
474
+ children: "Upgrade to Premium"
475
475
  }
476
476
  )
477
477
  ] })