@bravophone/webphone 0.1.2 → 0.2.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.
Files changed (84) hide show
  1. package/README.md +49 -3
  2. package/dist/bravophone.mjs +358 -287
  3. package/dist/bravophone.umd.js +43 -7
  4. package/host/_locales/pt_BR/messages.json +1430 -0
  5. package/host/allowed-origins.json +8 -0
  6. package/host/css/bravophoneContactDialer.css +385 -0
  7. package/host/css/dark-theme.css +116 -0
  8. package/host/favicon.ico +0 -0
  9. package/host/fonts/Audiowide-Regular.ttf +0 -0
  10. package/host/fonts/Seguiemj.ttf +0 -0
  11. package/host/images/answer-gray.png +0 -0
  12. package/host/images/answer.png +0 -0
  13. package/host/images/auto-answer-off.png +0 -0
  14. package/host/images/auto-answer-on.png +0 -0
  15. package/host/images/avatar.png +0 -0
  16. package/host/images/bravophone-logo.svg +39 -0
  17. package/host/images/bravotech_Bravotech_logo.png +0 -0
  18. package/host/images/circle-green.png +0 -0
  19. package/host/images/circle-orange.png +0 -0
  20. package/host/images/circle-red.png +0 -0
  21. package/host/images/dialer-button-down.png +0 -0
  22. package/host/images/dialer-button.png +0 -0
  23. package/host/images/gateways/activecampaign.png +0 -0
  24. package/host/images/gateways/agendor.png +0 -0
  25. package/host/images/gateways/appfacilita.png +0 -0
  26. package/host/images/gateways/call-in.png +0 -0
  27. package/host/images/gateways/click-to-call.png +0 -0
  28. package/host/images/gateways/clickup.png +0 -0
  29. package/host/images/gateways/exactsales.png +0 -0
  30. package/host/images/gateways/go-high-lvl.png +0 -0
  31. package/host/images/gateways/groner.png +0 -0
  32. package/host/images/gateways/hubspot.png +0 -0
  33. package/host/images/gateways/kommo.png +0 -0
  34. package/host/images/gateways/moskit.png +0 -0
  35. package/host/images/gateways/nectar.png +0 -0
  36. package/host/images/gateways/pipedrive.png +0 -0
  37. package/host/images/gateways/pipefy.png +0 -0
  38. package/host/images/gateways/piperun.png +0 -0
  39. package/host/images/gateways/ploomes.png +0 -0
  40. package/host/images/gateways/rdstation-crm.png +0 -0
  41. package/host/images/gateways/salesforce.png +0 -0
  42. package/host/images/gateways/sharpspring.png +0 -0
  43. package/host/images/gateways/sunhub.png +0 -0
  44. package/host/images/gateways/vendfly.png +0 -0
  45. package/host/images/gateways/zendesk.png +0 -0
  46. package/host/images/gateways/zoho.png +0 -0
  47. package/host/images/hangup.png +0 -0
  48. package/host/images/hold.png +0 -0
  49. package/host/images/icons/logo-128-christmas-celebration.png +0 -0
  50. package/host/images/icons/logo-128.png +0 -0
  51. package/host/images/icons/logo-16-christmas-celebration.png +0 -0
  52. package/host/images/icons/logo-16.png +0 -0
  53. package/host/images/icons/logo-24-christmas-celebration.png +0 -0
  54. package/host/images/icons/logo-24.png +0 -0
  55. package/host/images/icons/logo-32-christmas-celebration.png +0 -0
  56. package/host/images/icons/logo-32.png +0 -0
  57. package/host/images/icons/logo-48-christmas-celebration.png +0 -0
  58. package/host/images/icons/logo-48.png +0 -0
  59. package/host/images/loading.gif +0 -0
  60. package/host/images/logo-bravotech-white.png +0 -0
  61. package/host/images/logo-bravotech.png +0 -0
  62. package/host/images/logo-inline-christmas-celebration.png +0 -0
  63. package/host/images/logo-inline.png +0 -0
  64. package/host/images/mic-off.png +0 -0
  65. package/host/images/mic-on.png +0 -0
  66. package/host/images/play.png +0 -0
  67. package/host/images/transfer.png +0 -0
  68. package/host/index.html +34 -0
  69. package/host/js/bravophone-noise-suppressor.js +418 -0
  70. package/host/js/bravophone-route-selector.js +1099 -0
  71. package/host/js/libwebphone.js +20 -0
  72. package/host/js/noise/LICENSE-web-noise-suppressor.txt +21 -0
  73. package/host/js/noise/rnnoise-worklet.js +13 -0
  74. package/host/js/noise/rnnoise.wasm +0 -0
  75. package/host/js/noise/rnnoise_simd.wasm +0 -0
  76. package/host/mock-webphone.js +195 -0
  77. package/host/mock.html +54 -0
  78. package/host/popup.js +23 -0
  79. package/host/shim/chrome-shim.js +287 -0
  80. package/host/shim/guest-bridge.js +353 -0
  81. package/host/shim/messages.js +13 -0
  82. package/host/styles/theme-fixes.css +92 -0
  83. package/package.json +4 -2
  84. package/types/index.d.ts +21 -1
@@ -0,0 +1,13 @@
1
+ /* Gerado por scripts/sync-from-extension.mjs — não edite.
2
+ * Fonte: _locales/ da extensão. Alimenta chrome.i18n.getMessage no shim.
3
+ */
4
+ window.__bpLocales = {"pt_BR":{"CALL_REJECTED":{"description":"","message":"Ligação rejeitada"},"EXCHANGE_ROUTING_ERROR":{"description":"","message":"Erro no roteamento da ligação"},"FACILITY_REJECTED":{"description":"","message":"Ligação rejeitada"},"INCOMPATIBLE_DESTINATION":{"description":"","message":"Destino incompatível"},"INTERWORKING":{"description":"","message":"Ligação encerrada"},"INVALID_NUMBER_FORMAT":{"description":"","message":"Formato de número inválido"},"NORMAL_CIRCUIT_CONGESTION":{"description":"","message":"Congestionamento na operadora"},"NORMAL_CLEARING":{"description":"","message":"Atendida"},"NORMAL_UNSPECIFIED":{"description":"","message":"Atendida"},"NO_ANSWER":{"description":"","message":"Não atende"},"NO_ROUTE_DESTINATION":{"description":"","message":"Erro no roteamento da ligação"},"NO_USER_RESPONSE":{"description":"","message":"Sem resposta"},"NUMBER_CHANGED":{"description":"","message":"Número mudou"},"ORIGINATOR_CANCEL":{"description":"","message":"Cancelamento da ligação"},"OUTGOING_CALL_BARRED":{"description":"","message":"Ligação barrada"},"RECOVERY_ON_TIMER_EXPIRE":{"description":"","message":"Tempo expirado"},"SUBSCRIBER_ABSENT":{"description":"","message":"Número fora de área"},"UNALLOCATED_NUMBER":{"description":"","message":"Número não encontrado"},"USER_BUSY":{"description":"","message":"Ocupado"},"accessPortal":{"description":"","message":"Acessar Portal BravoPhone"},"activecampaign":{"description":"","message":"ActiveCampaign CRM"},"addedAt":{"description":"","message":"Adicionado às"},"agendor":{"description":"","message":"Agendor CRM"},"bravophoneSlogan":{"description":"Slogan da empresa BravoPhone","message":"Conexão de voz em qualquer lugar"},"areYouSure":{"description":"","message":"Você tem certeza?"},"balanceRefresh":{"description":"Tooltip do botão de atualizar o saldo","message":"Atualizar saldo"},"balanceStatusEmpty":{"description":"Aviso de saldo zerado ou negativo","message":"Sem saldo — recarregue para fazer chamadas."},"balanceStatusLow":{"description":"Aviso de saldo baixo (entre 0 e 10 reais)","message":"Saldo baixo — considere recarregar para evitar interrupções."},"balanceSuccess":{"description":"Mensagem de sucesso ao consultar o saldo","message":"Saldo atualizado com sucesso"},"callActionCommands":{"description":"Rótulo do botão que abre os atalhos da ligação","message":"Comandos"},"callActionHold":{"description":"Rótulo do botão de hold","message":"Espera"},"callActionKeypad":{"description":"Rótulo do botão de DTMF/keypad","message":"Teclado"},"callActionMute":{"description":"Rótulo do botão de mute na CallScreen","message":"Mudo"},"callActionMuted":{"description":"Rótulo quando mute está ativo","message":"Sem áudio"},"callActionResume":{"description":"Rótulo quando call está em hold (retomar)","message":"Retomar"},"callActionTransfer":{"description":"Rótulo do botão de transfer","message":"Transferir"},"callDtmfPlaceholder":{"description":"Placeholder do display de DTMF quando vazio","message":"Digite os números"},"callDtmfTitle":{"description":"Título do overlay de DTMF","message":"Teclado DTMF"},"callSourceClickToCall":{"description":"Origem da chamada via click-to-call","message":"Click to call"},"callSourceIncoming":{"description":"Origem da chamada quando entrante","message":"Chamada recebida"},"callSourceManual":{"description":"Origem da chamada quando discado manualmente","message":"Discagem manual"},"callStatusDialing":{"description":"Status no topo da CallScreen quando discando","message":"Chamando…"},"callStatusInCall":{"description":"Status no topo da CallScreen quando atendido","message":"Em chamada"},"callStatusOnHold":{"description":"Status no topo da CallScreen quando em hold","message":"Em espera"},"callStatusRinging":{"description":"Status no topo da CallScreen para chamada entrante","message":"Recebendo chamada"},"clearContacts":{"description":"","message":"Apagar todos contatos"},"clicktocall":{"description":"","message":"Click to Call"},"clickup":{"description":"","message":"Clickup CRM"},"collapse":{"description":"","message":"Recolher"},"collapseAll":{"description":"","message":"Recolher Todos"},"config":{"description":"Texto para configurações do webphone","message":"Configurações"},"connectivityStatusFast":{"description":"Informar o usuário que sua internet está muito boa","message":"Sinal de internet normal<br />Tudo certo para as chamadas telefônicas"},"connectivityStatusOff":{"description":"Informar o usuário que está sem internet","message":"Verifique sua Internet<br />Você não conseguirá efetuar/receber chamadas<br /><a href='https://speedtest.bravophone.com/' target='_blank' rel='noopener' style='text-decoration: underline;'>Clique Aqui para Diagnóstico de Rede</a>"},"connectivityStatusSlow":{"description":"Informar o usuário que sua internet está muito lenta","message":"Sua internet está apresentando lentidão<br />Considere reiniciar seu modem / registrar chamado operadora<br /><a href='https://speedtest.bravophone.com/' target='_blank' rel='noopener' style='text-decoration: underline;'>Clique Aqui para Diagnóstico de Rede</a>"},"connectivityStatusWarning":{"description":"Informar o usuário que sua internet está com lentidão","message":"Sua internet está apresentando lentidão<br />Considere reiniciar seu modem / registrar chamado operadora<br /><a href='https://speedtest.bravophone.com/' target='_blank' rel='noopener' style='text-decoration: underline;'>Clique Aqui para Diagnóstico de Rede</a>"},"contacts":{"description":"","message":"Contatos"},"contactsTabEmpty":{"description":"Mensagem quando a aba Contatos está vazia","message":"Nenhum contato do CRM. Clique no discador flutuante de um deal para abrir os contatos aqui."},"contactsTabEntityActivity":{"description":"Nome curto do tipo de entidade (tooltip do ícone)","message":"Atividade"},"contactsTabEntityCampaign":{"description":"Nome curto do tipo de entidade (tooltip do ícone)","message":"Campanha"},"contactsTabEntityCard":{"description":"Nome curto do tipo de entidade (tooltip do ícone)","message":"Cartão"},"contactsTabEntityContact":{"description":"Nome curto do tipo de entidade (tooltip do ícone)","message":"Contato"},"contactsTabEntityDeal":{"description":"Nome curto do tipo de entidade (tooltip do ícone)","message":"Negócio"},"contactsTabEntityFlow":{"description":"Nome curto do tipo de entidade (tooltip do ícone)","message":"Fluxo"},"contactsTabEntityLead":{"description":"Nome curto do tipo de entidade (tooltip do ícone)","message":"Lead"},"contactsTabEntityOrganization":{"description":"Nome curto do tipo de entidade (tooltip do ícone)","message":"Organização"},"contactsTabEntityTask":{"description":"Nome curto do tipo de entidade (tooltip do ícone)","message":"Tarefa"},"contactsTabEntityTicket":{"description":"Nome curto do tipo de entidade (tooltip do ícone)","message":"Ticket"},"contactsTabHeaderPlural":{"description":"Cabeçalho plural da aba Contatos","message":"CONTATOS"},"contactsTabHeaderSingular":{"description":"Cabeçalho singular da aba Contatos","message":"CONTATO"},"contactsTabHeaderSource":{"description":"Sufixo do cabeçalho da aba Contatos indicando origem","message":"SINCRONIZADO DO CRM"},"contactsTabNoResults":{"description":"Mensagem quando a busca não retorna resultados","message":"Nenhum contato encontrado para sua busca."},"contactsTabNumberPlural":{"description":"Plural da contagem de números de um contato","message":"números"},"contactsTabNumberSingular":{"description":"Singular da contagem de números de um contato","message":"número"},"contactsTabOpenActivity":{"description":"Botão para abrir a atividade no CRM","message":"Abrir atividade"},"contactsTabOpenCampaign":{"description":"Botão para abrir a campanha no CRM (Salesforce)","message":"Abrir campanha"},"contactsTabOpenCard":{"description":"Botão para abrir o cartão no CRM (Pipefy)","message":"Abrir cartão"},"contactsTabOpenContact":{"description":"Botão para abrir o contato/pessoa no CRM","message":"Abrir contato"},"contactsTabOpenCrm":{"description":"Botão para abrir o contato na origem (genérico)","message":"Abrir contato no CRM"},"contactsTabOpenDeal":{"description":"Botão para abrir o negócio/deal do contato no CRM","message":"Abrir negócio"},"contactsTabOpenFlow":{"description":"Botão para abrir o fluxo no CRM (Groner)","message":"Abrir fluxo"},"contactsTabOpenLead":{"description":"Botão para abrir o lead do contato no CRM","message":"Abrir lead"},"contactsTabOpenOrganization":{"description":"Botão para abrir a organização no CRM","message":"Abrir organização"},"contactsTabOpenTask":{"description":"Botão para abrir a tarefa no CRM (Sunhub, ClickUp)","message":"Abrir tarefa"},"contactsTabOpenTicket":{"description":"Botão para abrir o ticket no CRM (Zendesk, HubSpot)","message":"Abrir ticket"},"contactsTabSearchPlaceholder":{"description":"Placeholder do input de busca na aba Contatos","message":"Buscar contatos do CRM"},"dialerBackspace":{"description":"Tooltip do botão de backspace do dialer","message":"Apagar último"},"dialerPlaceholder":{"description":"Placeholder do display do dialer","message":"Digite um número"},"dialerTab":{"description":"","message":"Discador"},"errorTooManyRequests":{"description":"","message":"Você excedeu o limite de requisições por minuto, por favor tente daqui alguns segundos"},"exactsales":{"description":"","message":"Exact Sales CRM"},"extDescription":{"description":"Descrição da Extensão","message":"Ligue com um clique. O Bravophone integra telefonia, CRM e aplicações para acelerar atendimentos e aumentar produtividade."},"extName":{"description":"Nome da Extensão","message":"Bravophone"},"extOptionsClickToCallLabel":{"description":"Ativar/Desativar a função de click to call","message":"Click-To-Call"},"extOptionsDebugLabel":{"description":"Ativar/Desativar os LOGs da aplicação","message":"Modo Desenvolvedor"},"extOptionsSipTraceLabel":{"description":"Ativar/Desativar os LOGs do SIP","message":"SIP Trace"},"globalCancel":{"description":"Rótulo genérico de botão de cancelar","message":"Cancelar"},"globalClear":{"description":"Texto para a ação de limpar","message":"Limpar"},"globalClose":{"description":"Texto para a ação de fechar","message":"Fechar"},"gohighlevel":{"description":"","message":"Go High Level"},"groner":{"description":"","message":"Groner"},"hangupCause":{"description":"","message":"Classificação da Chamada"},"historyActiveCall":{"description":"Indicador exibido quando a chamada ainda está ativa (ended_at é null)","message":"Em andamento"},"historyAnswered":{"description":"Rótulo exibido quando a chamada foi atendida","message":"Atendida"},"historyEmpty":{"description":"Mensagem quando o histórico está vazio para o filtro de data atual","message":"Nenhuma chamada encontrada no período selecionado"},"historyFilterLast3Days":{"description":"Chip de filtro Últimos 3 dias","message":"Últimos 3 dias"},"historyFilterToday":{"description":"Chip de filtro Hoje","message":"Hoje"},"historyFilterYesterday":{"description":"Chip de filtro Ontem","message":"Ontem"},"historyGroupOlder":{"description":"Grupo de chamadas mais antigas","message":"Anteriores"},"historyGroupToday":{"description":"Grupo de chamadas de hoje","message":"Hoje"},"historyGroupYesterday":{"description":"Grupo de chamadas de ontem","message":"Ontem"},"historyLoadError":{"description":"Toast de erro ao falhar ao buscar o histórico","message":"Não foi possível carregar o histórico"},"historyNotAnswered":{"description":"Rótulo exibido quando a chamada não foi atendida","message":"Não atendida"},"historyPortalLink":{"description":"Link no rodapé que abre o histórico de chamadas no portal BravoPhone","message":"Ver histórico completo no portal"},"historyRefresh":{"description":"Botão para recarregar o histórico com o filtro selecionado","message":"Atualizar"},"historyRefreshing":{"description":"Texto do botão Atualizar enquanto carrega","message":"Atualizando..."},"historySearchPlaceholder":{"description":"Placeholder do input de busca da aba histórico","message":"Buscar por nome ou número"},"homeIntegrationLabel":{"description":"Texto para o label integração","message":"Integrações ativas"},"homeIntegrationNone":{"description":"Texto para quando não existe integração","message":"Nenhuma"},"homeReloadExtensionSuccess":{"description":"","message":"Ramal atualizado com sucesso!"},"homeUpdateIntegrationSuccess":{"description":"Mensagem de sucesso após o usuário clicar para atualizar as integrações","message":"Integrações atualizadas com sucesso!"},"hubspot":{"description":"","message":"HubSpot CRM"},"information":{"description":"Texto para indicar mais informações sobre","message":"Informações"},"kommo":{"description":"","message":"Kommo"},"lastCallStatus":{"description":"","message":"Buscar a última chamada de hoje"},"lastCallStatusNotFound":{"description":"","message":"Não possui chamadas hoje"},"lastContacts":{"description":"","message":"Últimos Contatos"},"loginAction":{"description":"Texto para a ação de logar","message":"Entrar"},"loginAuthenticating":{"description":"Estado de loading do botão Entrar","message":"Autenticando…"},"loginCreateAccount":{"description":"Link no rodapé do login que abre a página de criar conta no portal","message":"Criar conta"},"loginEmailLabel":{"description":"Rótulo do campo de email no login","message":"Email"},"loginEmailPlaceholder":{"description":"Placeholder do campo de email no login","message":"seu.email@empresa.com"},"loginErrorBlockedEmail":{"description":"Mensagem de erro quando o email informado ainda não foi confirmado ou está bloqueado","message":"Seu email não foi confirmado ou está bloqueado, verifique sua caixa de entrada ou spam para confirmação ou entre em contato com o Administrador de sua Organização"},"loginErrorEmailNotFound":{"description":"Mensagem de erro quando o email é valido porém ainda não foi registrado","message":"O email informado não foi encontrado em nosso sistema, verifique e tente novamente"},"loginErrorFailedLogin":{"description":"Mensagem de erro quando há uma falha no login, seja por email ou senha incorretos","message":"O email e/ou senha estão incorretos, verifique e tente novamente"},"loginErrorInvalidEmail":{"description":"Mensagem de erro quando o email não é valido","message":"O email informado não é válido, verifique e tente novamente"},"loginErrorMissingEmail":{"description":"Mensagem de erro quando o email está ausente","message":"Favor informar um email"},"loginErrorMissingEmailOrPassword":{"description":"Mensagem de erro quando o email, ou senha, ou ambos estão ausentes","message":"Favor informar email e senha"},"loginGreetings":{"description":"Frase inicial de boas vindas ao usuário","message":"Bem vindo"},"loginGreetingsUnknowUser":{"description":"Frase final de boas vindas quando não conhecemos o usuário ainda","message":"Não nos conhecemos ainda :)"},"loginOfflineMessage":{"description":"Aviso no login quando o navegador está offline","message":"Sem conexão. Verifique sua internet."},"loginPasswordForgotten":{"description":"Ação para recuperar a senha quando esquecida","message":"Esqueceu a senha?"},"loginPasswordHide":{"description":"Ação para ocultar a senha","message":"Ocultar a senha"},"loginPasswordLabel":{"description":"Rótulo do campo de senha no login","message":"Senha"},"loginPasswordRecoveryAction":{"description":"Ação para redefinir a senha","message":"Redefinir"},"loginPasswordRecoveryHint":{"description":"Descrição/instrução no modal de redefinição de senha","message":"Informe o e-mail da sua conta e enviaremos as instruções para redefinir a senha."},"loginPasswordRecoverySuccess":{"description":"Mensagem de sucesso ao redefinir a senha","message":"Email enviado com sucesso! Porfavor, verifique sua caixa de entrada ou spam"},"loginPasswordRecoveryTitle":{"description":"Título do modal de redefinição de senha","message":"Redefinição de senha"},"loginPasswordShow":{"description":"Ação para exibir a senha","message":"Exibir a senha"},"loginPortal":{"description":"Link no rodapé do login que abre o portal BravoPhone","message":"Portal BRAVOPHONE"},"loginSubtitle":{"description":"Subtítulo da tela de login","message":"Acesse seu webphone BRAVOPHONE"},"loginSupport":{"description":"Link no rodapé do login que abre o WhatsApp de suporte","message":"Suporte"},"logout":{"description":"Texto para deslogar","message":"Sair"},"logoutConfirmAction":{"description":"Rótulo do botão destrutivo de confirmar logout","message":"Sair"},"logoutConfirmMessage":{"description":"Mensagem do modal de confirmação de logout","message":"Você precisará fazer login novamente para usar o webphone."},"logoutConfirmTitle":{"description":"Título do modal de confirmação de logout","message":"Sair da conta?"},"mainErrorExpiredToken":{"description":"Mensagem de erro quando o token expirou","message":"Seu acesso expirou, porfavor informe seu email e senha novamente"},"messageAudioContextError":{"description":"Aviso ao usuário quando o acesso ao recurso de audio estiver indisponivel","message":"Problemas na placa de áudio. Verifique suas configurações"},"messageClickHere":{"description":"Texto para usar em links","message":"clique aqui"},"messageClipboardDenied":{"description":"Aviso ao usuário quando o clipboard estiver bloqueado","message":"O acesso a sua área de transferências está bloqueado, para remover esse bloqueio e conseguir colar aqui seus números copiados"},"messageExtensionInvalidConfig":{"description":"Mensagem de erro quando ramal está configurado erroneamente","message":"Parece que seu ramal configurado está enfrentando dificuldades ao registrar. Para acessar o vídeo explicativo"},"messageExtensionMissingConfig":{"description":"Mensagem de erro quando ramal não está configurado","message":"Você não possui um ramal configurado, acesse nosso portal e configure seu Ramal. Para acessar nosso portal,"},"messageMicrophoneDenied":{"description":"Aviso ao usuário quando o microfone estiver bloqueado","message":"O acesso ao seu microfone está bloqueado, para remover esse bloqueio e conseguir realizar chamadas"},"messageSupport":{"description":"Mensagem de erro genérica","message":"Ocorreu uma falha inesperada, para entrar em contato com nosso suporte"},"messageUpdateExtensionClickHere":{"description":"Link para acessar o painel da extensão","message":"Clique aqui para atualizar"},"messageUpdateExtensionDescription":{"description":"Aviso ao usuário quando o acesso ao recurso de audio estiver indisponivel","message":"Atenção! Ative o \"Modo do desenvolvedor\" para habilitar o botão \"Atualizar\""},"messageUpdateExtensionTitle":{"description":"Aviso ao usuário quando sua versão for defasada","message":"Temos uma nova versão disponível!"},"moskit":{"description":"","message":"Moskit CRM"},"nectar":{"description":"","message":"Nectar CRM"},"networkActionContactSupport":{"description":"Botão CTA quando a conexão está ruim","message":"Falar com o Suporte"},"networkImpact_offline":{"description":"Impacto nas vendas para offline","message":"Sem conexão, nenhuma chamada será feita ou recebida. Restabeleça sua internet ou acione o suporte."},"networkImpact_slow":{"description":"Impacto nas vendas para slow","message":"A qualidade das chamadas está comprometida — risco real de quedas e mal-entendidos. Acione o suporte para mitigar perdas em vendas."},"networkImpact_warning":{"description":"Impacto nas vendas para warning","message":"Algumas chamadas podem apresentar pequenas falhas. Se persistir, fale com nosso suporte para evitar perdas em vendas."},"networkMetricJitter":{"description":"Rótulo da métrica de jitter (variação de latência entre pings)","message":"Jitter"},"networkMetricLatency":{"description":"Rótulo da métrica de latência","message":"Latência"},"networkMetricLoss":{"description":"Rótulo da métrica de perda de pacotes","message":"Perda"},"networkPanelImpact":{"description":"Cabeçalho da seção de impacto","message":"Impacto nas suas vendas"},"networkPanelMetrics":{"description":"Cabeçalho da seção de métricas no painel de rede","message":"Métricas em tempo real"},"networkPanelSubtitle":{"description":"Subtítulo do painel de rede","message":"Qualidade da internet em tempo real"},"networkPanelTitle":{"description":"Título da coluna lateral de rede","message":"Sua conexão"},"networkPanelUpdateInterval":{"description":"Rótulo informando a frequência de atualização das métricas","message":"Atualizado a cada 15 segundos"},"networkResourceDiagnostic":{"description":"Título do recurso de speedtest","message":"Diagnosticar minha rede"},"networkResourceDiagnosticUrl":{"description":"Subtítulo (URL) do recurso de speedtest","message":"speedtest.bravophone.com"},"networkResourceImpact":{"description":"Título do recurso de artigo de ajuda sobre internet","message":"Como a internet afeta as chamadas"},"networkResourceImpactSubtitle":{"description":"Subtítulo do recurso de artigo de ajuda","message":"Central de ajuda"},"networkResourceStatus":{"description":"Título do recurso de status page","message":"Status dos serviços BRAVOPHONE"},"networkResourceStatusUrl":{"description":"Subtítulo (URL) do recurso de status page","message":"status.bravophone.com"},"networkResourcesTitle":{"description":"Cabeçalho da seção de links úteis no painel de rede","message":"Recursos"},"networkStateDesc_good":{"description":"Descrição do estado boa","message":"Sinal da sua internet está normal."},"networkStateDesc_offline":{"description":"Descrição do estado offline","message":"Ligações indisponíveis. Restabeleça sua internet ou acione o suporte."},"networkStateDesc_slow":{"description":"Descrição do estado slow","message":"Não recomendada para ligações — cortes e eco podem ocorrer."},"networkStateDesc_warning":{"description":"Descrição do estado warning","message":"Possíveis falhas nas ligações. Considere reiniciar seu modem ou entrar em contato com a operadora."},"networkStateLabel_good":{"description":"Rótulo do estado boa","message":"Conexão boa"},"networkStateLabel_offline":{"description":"Rótulo do estado offline no hero do painel de rede","message":"Sem internet"},"networkStateLabel_slow":{"description":"Rótulo do estado slow no hero do painel de rede","message":"Internet ruim"},"networkStateLabel_warning":{"description":"Rótulo do estado warning no hero do painel de rede","message":"Internet instável"},"networkSuppressAutoOpenLabel":{"description":"Checkbox que silencia a abertura automática do painel de rede (reseta ao fechar o webphone)","message":"Não abrir este painel automaticamente quando a internet estiver ruim"},"no":{"description":"","message":"Não"},"openExternalLink":{"description":"","message":"Abrir Contato"},"pipedrive":{"description":"","message":"Pipedrive CRM"},"pipedriveActivity":{"description":"","message":"Atividades"},"pipedriveDeal":{"description":"","message":"Negócio"},"pipedriveLead":{"description":"","message":"Lead"},"pipedriveOrganization":{"description":"","message":"Organização"},"pipedrivePerson":{"description":"","message":"Pessoa"},"pipefy":{"description":"","message":"Pipefy CRM"},"piperun":{"description":"","message":"Piperun CRM"},"ploomes":{"description":"","message":"Ploomes CRM"},"presenceOffline":{"description":"Status do webphone não registrado","message":"Offline"},"presenceOnline":{"description":"Status do webphone registrado","message":"Online"},"presenceRefresh":{"description":"Tooltip do botão de refresh da presence","message":"Atualizar status"},"rdstationcrm":{"description":"","message":"RD Station CRM"},"recentsClearAll":{"description":"Botão para limpar todos os itens dos últimos contatos","message":"Limpar"},"recentsClearAllTooltip":{"description":"Tooltip do botão de limpar todos os últimos contatos","message":"Limpar todos os contatos recentes"},"recentsClearConfirmAction":{"description":"Rótulo do botão de confirmar a limpeza dos últimos contatos","message":"Limpar tudo"},"recentsClearConfirmMessage":{"description":"Mensagem do modal de confirmação ao limpar todos os últimos contatos","message":"Tem certeza que deseja limpar toda a lista de últimos contatos? Esta ação não pode ser desfeita."},"recentsClearConfirmTitle":{"description":"Título do modal de confirmação ao limpar todos os últimos contatos","message":"Limpar últimos contatos?"},"recentsCommercial":{"description":"Rótulo do atalho WhatsApp Comercial no rodapé do painel","message":"Comercial"},"recentsCommercialSub":{"description":"Subtexto do atalho Comercial no recents-side-panel","message":"Falar com vendas"},"recentsEmpty":{"description":"Mensagem quando a lista de últimos contatos está vazia","message":"Nenhum contato recente"},"recentsExpiresIn":{"description":"Prefixo do tempo restante antes de uma chamada sair da lista de Recentes (seguido de algo como \"3h\" ou \"45min\")","message":"Expira em"},"recentsRemoveConfirmAction":{"description":"Rótulo do botão de confirmar a remoção de um contato","message":"Remover"},"recentsRemoveConfirmMessage":{"description":"Mensagem do modal de confirmação ao remover um contato dos últimos","message":"Tem certeza que deseja remover {name} da lista de últimos contatos?"},"recentsRemoveConfirmTitle":{"description":"Título do modal de confirmação ao remover um contato dos últimos","message":"Remover contato?"},"recentsRemoveItem":{"description":"Tooltip do botão de remover um item dos últimos contatos","message":"Remover da lista"},"recentsSubtitle":{"description":"Subtítulo da coluna lateral de últimos contatos","message":"Clique para ligar"},"recentsSupport":{"description":"Rótulo do atalho WhatsApp Suporte no rodapé do painel","message":"Suporte"},"recentsOpenDeal":{"description":"Botão para abrir o negócio do Pipedrive vinculado a uma chamada","message":"Abrir negócio"},"recentsTitle":{"description":"Título da coluna lateral de últimos contatos","message":"Recentes"},"recentsTransferred":{"description":"Rótulo de status quando a chamada foi transferida para outro ramal","message":"Transferida"},"remove":{"description":"","message":"Remover"},"routeSelectorLabel":{"description":"Rótulo do seletor de origem do número no discador","message":"Origem da chamada"},"routeSelectorPhone":{"description":"Tipo de rota de saída sem host wavoip","message":"Telefonia convencional"},"routeSelectorWhatsapp":{"description":"Tipo de rota de saída com host *.wavoip.com","message":"WhatsApp"},"salesforce":{"description":"","message":"Salesforce CRM"},"settingsAudioDeviceFallback":{"description":"Texto fallback quando o device não tem label","message":"Padrão do sistema"},"settingsAudioMic":{"description":"Rótulo do select de microfone","message":"Microfone"},"settingsAudioSpeaker":{"description":"Rótulo do select de alto-falantes","message":"Alto-falantes"},"settingsBalance":{"description":"Rótulo do saldo nos ajustes","message":"Saldo disponível"},"settingsDiagnostic":{"description":"Link para diagnóstico de rede","message":"Diagnóstico de rede"},"settingsDialerCrmHint":{"description":"Hint da seção Discador no CRM","message":"Aparência do widget quando integrado em outro sistema"},"settingsDialerCrmRefreshNotice":{"description":"Aviso da seção Discador no CRM indicando que mudanças exigem refresh da página","message":"Para aplicar alterações é preciso atualizar a página do CRM."},"settingsDialerMode":{"description":"Rótulo do segmented de modo","message":"Modo de discagem"},"settingsDialerModeFirst":{"description":"Modo discar primeiro número","message":"Discar 1º número"},"settingsDialerModeManual":{"description":"Modo manual","message":"Manual"},"settingsDialerPosition":{"description":"Rótulo do picker de posição","message":"Posicionamento"},"settingsDialerPositionBL":{"description":"Posição inferior esquerda","message":"Inf. esq."},"settingsDialerPositionBR":{"description":"Posição inferior direita","message":"Inf. dir."},"settingsDialerPositionTL":{"description":"Posição superior esquerda","message":"Sup. esq."},"settingsDialerPositionTR":{"description":"Posição superior direita","message":"Sup. dir."},"settingsDialerSize":{"description":"Rótulo do segmented de tamanho","message":"Tamanho"},"settingsDialerSizeLarge":{"description":"Tamanho grande","message":"Grande"},"settingsDialerSizeMedium":{"description":"Tamanho médio","message":"Médio"},"settingsDialerSizeSmall":{"description":"Tamanho pequeno","message":"Pequeno"},"settingsDialingCountry":{"description":"Rótulo do select de país padrão","message":"País padrão"},"settingsInformationsDescription":{"description":"Descrição do botão de informações","message":"Status, integrações e detalhes técnicos"},"settingsIntegrationsEmpty":{"description":"Mensagem quando não há integrações","message":"Nenhuma integração ativa"},"settingsIntegrationsRefresh":{"description":"Botão para atualizar lista de integrações","message":"Atualizar"},"settingsIntegrationsRefreshing":{"description":"Estado do botão durante o refresh","message":"Atualizando…"},"settingsRamal":{"description":"Rótulo do usuário (ramal)","message":"Usuário"},"settingsSectionAccount":{"description":"Título da seção de conta nos ajustes","message":"Conta"},"settingsSectionAdvanced":{"description":"Título da seção avançada nos ajustes","message":"Avançado"},"settingsSectionAudio":{"description":"Título da seção de áudio","message":"Áudio"},"settingsSectionDialerCrm":{"description":"Título da seção do discador no CRM","message":"Discador no CRM"},"settingsSectionDialing":{"description":"Título da seção de discagem","message":"Discagem"},"settingsSectionIntegrations":{"description":"Título da seção de integrações ativas","message":"Integrações ativas"},"settingsSectionSupport":{"description":"Título da seção de suporte nos ajustes","message":"Suporte"},"settingsSupportCommercial":{"description":"Linha de WhatsApp Comercial","message":"WhatsApp Comercial"},"settingsSupportCommercialSub":{"description":"Subtexto de WhatsApp Comercial","message":"Falar com vendas"},"settingsSupportHelpCenter":{"description":"Linha de Central de ajuda","message":"Central de ajuda"},"settingsSupportPortal":{"description":"Linha de Portal BRAVOPHONE","message":"Portal BRAVOPHONE"},"settingsSupportStatus":{"description":"Linha de Status dos serviços","message":"Status dos serviços"},"settingsSupportSupport":{"description":"Linha de WhatsApp Suporte","message":"WhatsApp Suporte"},"settingsSupportSupportSub":{"description":"Subtexto de WhatsApp Suporte (sem o número de telefone)","message":"Falar com o suporte"},"settingsVolumeMaster":{"description":"Volume geral","message":"Geral"},"settingsVolumeRemote":{"description":"Volume da chamada (áudio remoto)","message":"Chamada"},"settingsVolumeRinger":{"description":"Volume do toque","message":"Toque"},"settingsVolumeTones":{"description":"Volume do teclado DTMF","message":"Teclado"},"settingsWebphoneConfigDescription":{"description":"Descrição do botão de configurações do webphone","message":"Áudio, dispositivos e país padrão"},"sharpspring":{"description":"","message":"SharpSpring CRM"},"showContactPhones":{"description":"","message":"Exibir Telefones"},"sunhub":{"description":"","message":"SunHub CRM"},"tabComingSoon":{"description":"Texto exibido em abas ainda não disponíveis","message":"Em breve"},"tabContacts":{"description":"Aba de contatos do CRM","message":"Contatos"},"tabHistory":{"description":"Aba do histórico de chamadas","message":"Histórico"},"tabKeypad":{"description":"Aba do teclado de discagem","message":"Teclado"},"tabSettings":{"description":"Aba de configurações","message":"Ajustes"},"tabTeam":{"description":"Aba dos usuários do mesmo domínio","message":"Equipe"},"talkToCommercialTeam":{"description":"","message":"WhatsApp Comercial"},"talkToSupportTeam":{"description":"","message":"WhatsApp Suporte"},"transferAvailable":{"description":"Rótulo do ramal disponível para transferência","message":"Disponível"},"transferBadgePrefix":{"description":"Prefixo do badge de transferência em andamento (seguido de \"Nome · ramal\")","message":"Transferindo para"},"transferCallingPrefix":{"description":"Prefixo mostrado enquanto o ramal de destino da transferência está tocando (seguido do nome da pessoa)","message":"Chamando"},"transferCancel":{"description":"Título do botão para descartar/cancelar o badge de transferência","message":"Cancelar"},"transferDeclinedPrefix":{"description":"Prefixo da mensagem de transferência não aceita (seguido do número do ramal)","message":"Ramal"},"transferDeclinedSuffix":{"description":"Sufixo da mensagem de transferência não aceita (precedido de \"Ramal <número>\")","message":"não aceitou a chamada"},"transferEmpty":{"description":"Mensagem quando não há ramais disponíveis para transferência","message":"Nenhum ramal disponível"},"transferInCall":{"description":"Rótulo do ramal que está registrado mas já em outra ligação, na lista de transferência","message":"Em ligação"},"transferInCallToastSuffix":{"description":"Sufixo do aviso ao tentar transferir para um ramal que já está em ligação (precedido de \"Nome (ramal X)\")","message":"está em ligação no momento"},"transferLoading":{"description":"Mensagem de carregamento da lista de ramais para transferência","message":"Carregando ramais…"},"transferOffline":{"description":"Rótulo do ramal indisponível (offline) na lista de transferência","message":"Offline"},"transferOfflineToastSuffix":{"description":"Sufixo do aviso ao tentar transferir para um ramal offline (precedido de \"Nome (ramal X)\")","message":"está offline no momento"},"transferPanelSubtitle":{"description":"Subtítulo do painel de transferência de chamada","message":"Selecione um ramal disponível"},"transferPanelTitle":{"description":"Título do painel de transferência de chamada","message":"Transferir chamada"},"updateExtension":{"description":"","message":"Clique para atualizar seu Ramal"},"vendfly":{"description":"","message":"Vendfly CRM"},"webphoneAutoAnswerTooltipForDisabled":{"description":"Texto para o tooltip do botão de auto answer disabled","message":"Auto-atendimento está desabilitado"},"webphoneAutoAnswerTooltipForEnabled":{"description":"Texto para o tooltip do botão de auto answer enabled","message":"Auto-atendimento está habilitado"},"webphoneCallAnswer":{"description":"Tooltip para o botão de atender a chamada","message":"Atender Chamada"},"webphoneCallHangup":{"description":"Tooltip para o botão de desligar a chamada","message":"Desligar Chamada"},"webphoneCallMake":{"description":"Tooltip para o botão de fazer uma chamada","message":"Ligar"},"webphoneCallMicOff":{"description":"Tooltip para o botão de desmutar a chamada","message":"Desativar Mudo"},"webphoneCallMicOn":{"description":"Tooltip para o botão de mutar a chamada","message":"Ativar Mudo"},"webphoneCallOnHold":{"description":"Tooltip para o botão colocar em hold a chamada","message":"Colocar em Espera"},"webphoneCallResume":{"description":"Tooltip para o botão de tirar do hold a chamada","message":"Resgatar Chamada"},"webphoneCallTransfer":{"description":"Tooltip para o botão para transferir a chamada","message":"Transferir Chamada"},"webphoneClickToCallInvalidNumber":{"description":"Mensagem de erro quando o usuário informa um número inválido","message":"Telefone inválido, porfavor verifique se o mesmo possui DDD (2 dígitos) + Número (8 ou 9 dígitos) e tente novamente"},"webphoneClickToCallOffline":{"description":"Mensagem de erro quando o usuário informa um número inválido","message":"Você está OFFLINE, para realizar chamadas primeiro mude seu status para ONLINE"},"webphoneConfigAudioContextMaster":{"description":"Texto para controle do volume geral","message":"Geral"},"webphoneConfigAudioContextRemote":{"description":"Texto para controle do volume da chamada","message":"Chamada"},"webphoneConfigAudioContextRinger":{"description":"Texto para controle do volume do toque","message":"Toque"},"webphoneConfigAudioContextTones":{"description":"Texto para controle do volume dos tones do teclado","message":"Teclado"},"webphoneConfigDefaultCountry":{"description":"Texto para país padrão","message":"País padrão"},"webphoneConfigDialerButton":{"description":"","message":"Botão do Discador"},"webphoneConfigDialerButtonPosition":{"description":"","message":"Posicionamento"},"webphoneConfigDialerButtonSize":{"description":"","message":"Tamanho"},"webphoneConfigDialerMode":{"description":"","message":"Modo Discagem"},"webphoneConfigDialerModeFirstNumber":{"description":"","message":"Discar primeiro número"},"webphoneConfigDialerModeManual":{"description":"","message":"Manual"},"webphoneConfigDialerModeProgressive":{"description":"","message":"Progressivo (em desenvolvimento)"},"webphoneConfigHideConnectivityStatusSlowMessage":{"description":"","message":"Sinal de internet"},"webphoneConfigHideConnectivityStatusSlowMessageFalse":{"description":"","message":"Exibir alerta de lentidão"},"webphoneConfigHideConnectivityStatusSlowMessageTrue":{"description":"","message":"Ocultar alerta de lentidão"},"webphoneConfigMediaDeviceInput":{"description":"Texto para dispositivos de entrada","message":"Microfone"},"webphoneConfigMediaDeviceOutput":{"description":"Texto para dispositivos de saída","message":"Alto-falantes"},"webphoneConfigTab":{"description":"","message":"Webphone"},"webphoneEmptyNumber":{"description":"Texto para informar ao usuário para digitar um numero","message":"Digite um número"},"webphoneIntegrationsRefresh":{"description":"Label para ação de atualizar as integrações","message":"Clique para atualizar as integrações"},"webphoneInvalidNumber":{"description":"Texto para informar que o número é invalido","message":"Número inválido"},"webphoneMediaDevicesDefault":{"description":"Texto para dispositivo padrão","message":"Dispositivo padrão"},"webphoneNumberExtension":{"description":"Texto para informar que o número é ramal","message":"Ramal"},"webphoneNumberFacility":{"description":"Texto para informar que o número é uma facilidade","message":"Facilidade"},"webphoneNumberFixedLine":{"description":"Texto para informar que o número é um fixo","message":"Fixo"},"webphoneNumberFixedLineOrMobile":{"description":"Texto para informar que o número é um fixo","message":"Fixo ou Celular"},"webphoneNumberInternational":{"description":"Texto para informar que o número é internacional","message":"Internacional"},"webphoneNumberMobile":{"description":"Texto para informar que o número é um celular","message":"Celular"},"webphoneNumberTollFree":{"description":"Texto para informar que o número é serviço gratuito","message":"Serviço Gratuito"},"webphoneNumberTooLong":{"description":"Texto para informar que o número excedeu o permitido","message":"Número muito grande"},"webphoneNumberUnknown":{"description":"Texto para informar que o número é desconhecido","message":"Desconhecido"},"webphoneOptionsTitle":{"description":"Título da janela de configurações da extensão","message":"Configurações"},"webphoneStatusMicrophoneWarning":{"description":"Aviso ao usuário para permitir o acesso ao microfone","message":"Não esqueça de permitir o acesso ao seu microfone quando for solicitado"},"webphoneStatusTooltipForOffline":{"description":"Texto para o tooltip do botão de status offline","message":"Você está Offline"},"webphoneStatusTooltipForOnline":{"description":"Texto para o tooltip do botão de status online","message":"Você está Online"},"webphoneUserRegistered":{"description":"Aviso ao usuário quando estiver online e disponível","message":"Você está ONLINE"},"webphoneValidNumber":{"description":"Texto para informar que o número é valido","message":"Número válido"},"yes":{"description":"","message":"Sim"},"zendesk":{"description":"","message":"Zendesk"},"zoho":{"description":"","message":"Zoho CRM"}}};
5
+ (function () {
6
+ var want = (navigator.language || 'pt-BR').replace('-', '_');
7
+ var have = Object.keys(window.__bpLocales);
8
+ var pick = have.indexOf(want) !== -1 ? want
9
+ : have.filter(function (l) { return l.split('_')[0] === want.split('_')[0] })[0]
10
+ || have[0];
11
+ window.__bpMessages = window.__bpLocales[pick];
12
+ window.__bpLocale = pick.replace('_', '-');
13
+ })();
@@ -0,0 +1,92 @@
1
+ /* theme-fixes.css — complementa o dark-theme.css da extensão.
2
+ *
3
+ * POR QUE ESTE ARQUIVO EXISTE (e não é uma edição do dark-theme.css):
4
+ * o dark-theme.css vem da extensão e é reescrito a cada `npm run sync`.
5
+ * Qualquer correção feita lá seria perdida no próximo sync. Este arquivo é
6
+ * nosso, carrega depois, e sobrevive.
7
+ *
8
+ * O QUE ELE CORRIGE: o dark-theme.css é uma allowlist de classes Tailwind
9
+ * escrita à mão. Toda classe que ficou de fora manteve a cor original do
10
+ * Tailwind — feita para fundo branco — e sumiu sobre o fundo escuro.
11
+ * As classes abaixo foram encontradas por `npm run audit:theme`, que cruza o
12
+ * que o bundle usa com o que o tema cobre e mede o contraste WCAG.
13
+ *
14
+ * Estas correções valem igualmente para a extensão: portá-las para o
15
+ * css/dark-theme.css de lá conserta o mesmo bug no produto original.
16
+ */
17
+
18
+ /* ---------------------------------------------------------------------------
19
+ * TEXTO INVISÍVEL — contraste medido contra #171b28 (--bp-panel)
20
+ * ------------------------------------------------------------------------- */
21
+
22
+ /* 1.03:1 — literalmente ilegível. Aparece em títulos de modal. */
23
+ #app .text-gray-900 { color: var(--bp-text) !important; }
24
+
25
+ /* 1.22:1 — idem. Usado em textos de confirmação, como o modal de sair. */
26
+ #app .text-black { color: var(--bp-text) !important; }
27
+
28
+ /* 2.56:1 — 10 ocorrências, o campeão: cabeçalhos de collapse nas
29
+ configurações. Vira accent para acompanhar text-blue-500/600, que o
30
+ dark-theme.css já converte em verde — manter azul aqui deixaria dois
31
+ tratamentos diferentes para a mesma cor de origem. */
32
+ #app .text-blue-700 { color: var(--bp-accent) !important; }
33
+
34
+ /* Mesma família, fora da allowlist original. */
35
+ #app .text-blue-800,
36
+ #app .text-blue-900 { color: var(--bp-accent) !important; }
37
+ #app .text-green-700,
38
+ #app .text-green-800 { color: var(--bp-accent) !important; }
39
+ #app .text-red-700,
40
+ #app .text-red-800 { color: var(--bp-danger) !important; }
41
+ #app .text-amber-600,
42
+ #app .text-amber-800 { color: #f5b342 !important; }
43
+ #app .text-gray-950 { color: var(--bp-text) !important; }
44
+ #app .text-slate-600,
45
+ #app .text-slate-700,
46
+ #app .text-slate-800,
47
+ #app .text-slate-900 { color: var(--bp-text) !important; }
48
+
49
+ /* ---------------------------------------------------------------------------
50
+ * FUNDOS CLAROS NÃO CONVERTIDOS
51
+ * O texto herda a cor clara do tema, então um fundo claro deixado para trás
52
+ * produz claro-sobre-claro.
53
+ * ------------------------------------------------------------------------- */
54
+
55
+ /* Superfície neutra: vira painel, como bg-gray-50/100 já fazem. */
56
+ #app .bg-slate-100,
57
+ #app .bg-slate-50 { background-color: var(--bp-panel-alt) !important; }
58
+ #app .bg-gray-25 { background-color: var(--bp-panel-alt) !important; }
59
+
60
+ /* Badges e indicadores coloridos: aqui o fundo claro é intencional (um pill
61
+ amarelo, um ponto verde). A correção não é escurecer o fundo — é garantir
62
+ texto escuro em cima dele. */
63
+ #app .bg-yellow-400,
64
+ #app .bg-yellow-300,
65
+ #app .bg-green-400,
66
+ #app .bg-green-300,
67
+ #app .bg-amber-400 { color: var(--bp-bg) !important; }
68
+
69
+ /* ---------------------------------------------------------------------------
70
+ * BORDAS — não causam invisibilidade, mas as claras "brilham" no escuro
71
+ * ------------------------------------------------------------------------- */
72
+ #app .border-gray-300,
73
+ #app .border-gray-400,
74
+ #app .border-slate-200,
75
+ #app .border-slate-300 { border-color: var(--bp-border) !important; }
76
+
77
+ /* ---------------------------------------------------------------------------
78
+ * FORA DE #app — modais e dropdowns em <Teleport to="body">
79
+ *
80
+ * Todo o dark-theme.css é prefixado com `#app`. Um modal teleportado para o
81
+ * body escapa desse prefixo e fica sem tema nenhum. Repetimos aqui o essencial
82
+ * sem o prefixo, restrito às classes que só aparecem em overlay.
83
+ * ------------------------------------------------------------------------- */
84
+ body > .fixed .bg-white,
85
+ body > [class*="modal"] .bg-white { background-color: var(--bp-panel) !important; }
86
+ body > .fixed .text-gray-900,
87
+ body > .fixed .text-gray-800,
88
+ body > .fixed .text-black,
89
+ body > [class*="modal"] .text-gray-900,
90
+ body > [class*="modal"] .text-black { color: var(--bp-text) !important; }
91
+ body > .fixed .text-gray-600,
92
+ body > .fixed .text-gray-500 { color: var(--bp-text-dim) !important; }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@bravophone/webphone",
3
- "version": "0.1.2",
3
+ "version": "0.2.0",
4
4
  "description": "Webphone BRAVOPHONE embutível em qualquer página web. Renderiza uma janela flutuante arrastável com todas as funcionalidades do softphone.",
5
5
  "main": "./dist/bravophone.umd.js",
6
6
  "module": "./dist/bravophone.mjs",
@@ -17,6 +17,7 @@
17
17
  "files": [
18
18
  "dist/*.js",
19
19
  "dist/*.mjs",
20
+ "host",
20
21
  "types",
21
22
  "README.md"
22
23
  ],
@@ -29,7 +30,8 @@
29
30
  "test": "node scripts/smoke-shim.mjs && node scripts/smoke-geometry.mjs && node scripts/smoke-launcher.mjs && node scripts/smoke-package.mjs",
30
31
  "start": "node scripts/dev-server.mjs",
31
32
  "audit:theme": "node scripts/audit-theme.mjs",
32
- "prepublishOnly": "npm run build && npm test"
33
+ "prepublishOnly": "npm run build && npm test",
34
+ "prepare:host": "node scripts/sync-from-extension.mjs --cdn"
33
35
  },
34
36
  "keywords": [
35
37
  "webphone",
package/types/index.d.ts CHANGED
@@ -1,8 +1,28 @@
1
1
  export type LauncherIcon = 'phone-waves' | 'waveform' | 'headset' | 'chat-phone'
2
2
 
3
3
  export interface BravophoneOptions {
4
- /** Origem do webphone hospedado. Padrão: https://webphone.bravophone.com/embed/ */
4
+ /** Origem do webphone hospedado. usado com `mode: 'hosted'`. */
5
5
  hostUrl?: string
6
+ /**
7
+ * Como o webphone é carregado. Padrão: `'hosted'`.
8
+ *
9
+ * - `'hosted'`: o iframe navega para `hostUrl`. Todos os requests saem de uma
10
+ * origem fixa, então o CORS dos backends não cresce com o número de
11
+ * clientes. É um iframe de terceiro, sujeito a bloqueadores e a storage
12
+ * particionado.
13
+ * - `'srcdoc'`: o iframe roda na origem do próprio site e busca o webphone no
14
+ * CDN. Não é iframe de terceiro e não há partição de storage — mas a origem
15
+ * do integrador precisa estar na allowlist de CORS dos backends, senão o
16
+ * webphone carrega e não registra.
17
+ */
18
+ mode?: 'hosted' | 'srcdoc'
19
+ /**
20
+ * Só com `mode: 'srcdoc'`. De onde vêm os arquivos do webphone.
21
+ * Padrão: o CDN travado na versão deste pacote. Precisa terminar com `/`.
22
+ * Use para desenvolvimento (`http://localhost:5174/`) ou para servir os
23
+ * assets de um espelho próprio.
24
+ */
25
+ hostBase?: string
6
26
  /** Token de sessão do usuário, emitido pelo backend do integrador. */
7
27
  token?: string
8
28
  /** Canto inicial da janela. Padrão: 'bottom-right'. */