ThunderPhone 2.0 já está no ar.Comece por conta própria, a partir de 2¢/min.Leia o anúncio

Widget

Estilização

Personalize a aparência do widget de voz do ThunderPhone com CSS

O widget é renderizado como uma barra glassmórfica com temas claro e escuro integrados. A personalização está disponível em três níveis: props para opções comuns, propriedades personalizadas de CSS para temas e substituições de classes CSS para controle total.


Temas

A prop theme controla o esquema de cores do widget. Ela aplica uma classe tp--light ou tp--dark à raiz do widget:

<ThunderPhoneWidget
  publishableKey="pk_live_your_publishable_key"
  theme="dark"
/>
TemaClasseDescrição
'light'tp--lightFundo claro com texto escuro. Padrão.
'dark'tp--darkFundo escuro com texto claro.

Ambos os temas usam o design de barra glassmórfica com desfoque de fundo e transparência sutil.


Propriedades CSS Personalizadas

O widget expõe propriedades CSS personalizadas (variáveis) que você pode substituir para alterar as cores sem modificar classes individuais. Elas são definidas pela classe de tema (.tp--light ou .tp--dark) aplicada à raiz .tp-widget:

PropriedadePadrão (claro)Padrão (escuro)Descrição
--tp-accent#000#fffCor de destaque: botão de início, barras de forma de onda, ponto de conexão e texto de status conectado. Definida inline pela prop primaryColor.
--tp-bgrgba(255, 255, 255, 0.82)rgba(15, 15, 15, 0.85)Plano de fundo da barra (translúcido; desfocado por --tp-glass).
--tp-surfacergba(0, 0, 0, 0.04)rgba(255, 255, 255, 0.07)Plano de fundo do botão de silenciar.
--tp-surface-hoverrgba(0, 0, 0, 0.07)rgba(255, 255, 255, 0.12)Plano de fundo do botão de silenciar ao passar o mouse.
--tp-borderrgba(0, 0, 0, 0.08)rgba(255, 255, 255, 0.1)Bordas da barra e dos botões.
--tp-border-hoverrgba(0, 0, 0, 0.14)rgba(255, 255, 255, 0.18)Cor da borda ao passar o mouse.
--tp-textrgba(0, 0, 0, 0.88)rgba(255, 255, 255, 0.95)Texto principal (título, nome do agente).
--tp-text-2rgba(0, 0, 0, 0.5)rgba(255, 255, 255, 0.55)Texto secundário (subtítulo, linha de status, cronômetro da chamada).
--tp-glassblur(32px) saturate(180%)blur(32px) saturate(180%)backdrop-filter que cria o efeito de vidro na barra.
--tp-shadowstack de sombra de três camadasstack de sombra de três camadasO box-shadow da barra (camadas de anel + próxima + distante).
--tp-shadow-hoverstack de sombra de três camadasstack de sombra de três camadasDeclarada para elevação ao passar o mouse; atualmente não é aplicada por nenhuma regra.
--tp-glowinset 0 1px 0 0 rgba(255,255,255,0.5)inset 0 1px 0 0 rgba(255,255,255,0.06)Realce superior interno aplicado em camadas sobre a sombra da barra.
--tp-connected#059669#34d399Cor do indicador de estado conectado (ponto de status).
--tp-error#dc2626#fb7185Cor do texto de status de erro.
--tp-end-bgrgba(239, 68, 68, 0.08)rgba(251, 113, 133, 0.12)Plano de fundo do botão de encerrar chamada.
--tp-end-color#ef4444#fb7185Cor do ícone do botão de encerrar chamada.
--tp-end-borderrgba(239, 68, 68, 0.12)rgba(251, 113, 133, 0.15)Borda do botão de encerrar chamada.
--tp-end-hoverrgba(239, 68, 68, 0.14)rgba(251, 113, 133, 0.2)Plano de fundo do botão de encerrar chamada ao passar o mouse.
--tp-idle-opacity0.40.3Declarada para escurecimento no estado inativo; atualmente não é aplicada por nenhuma regra.

Substituindo propriedades personalizadas

Defina a cor de destaque pela prop primaryColor:

<ThunderPhoneWidget
  publishableKey="pk_live_your_publishable_key"
  primaryColor="#e11d48"
/>

Substitua as outras propriedades personalizadas com CSS. Use um seletor de duas classes (.tp-widget.tp--light / .tp-widget.tp--dark) para que sua regra tenha prioridade sobre a classe de tema que define os padrões, independentemente da ordem da folha de estilos:

.tp-widget.tp--light {
  --tp-bg: rgba(0, 0, 0, 0.9);
  --tp-text: rgba(255, 255, 255, 0.95);
  --tp-text-2: rgba(255, 255, 255, 0.55);
  --tp-border: rgba(255, 255, 255, 0.15);
}

Classes CSS

Todas as classes do widget têm o prefixo tp- para evitar conflitos com seus estilos existentes.

ClasseElementoDescrição
.tp-widgetContêiner raizContêiner de posição fixa (position: fixed, canto definido pela prop position, z-index: 9999). Contém a classe de tema e as configurações básicas de fonte; não possui elementos visuais próprios.
.tp--light / .tp--darkModificadores de temaAplicados a .tp-widget junto com o tema; definem todas as propriedades personalizadas --tp-*.
.tp-barA barraO próprio elemento em formato de pílula com efeito de vidro: plano de fundo, desfoque de fundo, borda, raio de 99px, sombra. Largura de 300px.
.tp-metaBloco de textoContêiner para todo o texto -- título e subtítulo quando ocioso, nome e status do agente durante uma chamada.
.tp-nameRótulo principalExibe a prop title quando ocioso e o nome do agente conectado (usando title como alternativa) durante uma chamada.
.tp-subSubtítuloA linha "Disponível agora" exibida quando ocioso.
.tp-startBotão de chamada ociosoO botão circular de início em destaque (42px). Usa --tp-accent como plano de fundo.
.tp-dotPonto de conexãoPonto em destaque pulsante exibido à esquerda da barra durante a conexão.
.tp-wave / .tp-wave--idleForma de ondaA forma de onda de cinco barras. --idle adiciona a animação lenta de respiração; durante uma chamada, as barras reagem ao áudio.
.tp-buttonBotões durante a chamadaEstilo base para os controles durante a chamada (42px, cantos arredondados de 12px).
.tp-button-groupLinha de botõesAgrupa os botões de silenciar e encerrar durante uma chamada.
.tp-button--startVariante do botão de conexãoVariante em cor de destaque exibida enquanto uma chamada é iniciada.
.tp-button--muteAlternância de silenciamentoSilencia/reativa o microfone durante uma chamada. Usa --tp-surface.
.tp-button--endBotão de encerrar chamadaDesliga a chamada. Usa a paleta --tp-end-*.
.tp-button--loadingModificador de carregamentoDeixa o botão esmaecido durante a conexão.
.tp-icon / .tp-spinÍconesDimensionamento dos ícones dos botões; tp-spin anima o indicador de conexão.
.tp-statusBloco de status durante a chamadaAgrupa a linha de status nos estados de conexão, conectado e erro.
.tp-status__textLinha de statusTexto do estado da conexão (por exemplo, "Conectando...") ou o cronômetro da chamada. Recebe .tp-status--connected (cor de destaque) ou .tp-status--error (cor de erro) conforme o estado.
.tp-status__nameEspaço para nome do agenteFaz parte do bloco de status, mas não é renderizado no layout atual da barra -- o nome do agente aparece em .tp-name.
.tp-status__dotPonto de statusEstilo de ponto pulsante do estado conectado (usa --tp-connected).

Exemplos

Cor de destaque personalizada via props

A maneira mais simples de aplicar a marca ao widget:

<ThunderPhoneWidget
  publishableKey="pk_live_your_publishable_key"
  theme="light"
  primaryColor="#059669"
  title="Talk to support"
/>

Cores personalizadas via CSS

Substitua as propriedades personalizadas para ter controle total das cores. Lembre-se de que a cor de destaque vem da prop primaryColor, não do CSS:

<ThunderPhoneWidget
  publishableKey="pk_live_your_publishable_key"
  primaryColor="#059669"
/>
/* Emerald theme for everything else */
.tp-widget.tp--light {
  --tp-bg: rgba(236, 253, 245, 0.85);
  --tp-text: rgba(6, 78, 59, 0.95);
  --tp-text-2: rgba(4, 120, 87, 0.8);
  --tp-border: rgba(5, 150, 105, 0.2);
}

Tamanho personalizado

Aumente ou diminua o widget ajustando as dimensões da barra, dos botões e do texto:

/* Wider bar */
.tp-bar {
  width: 340px;
}
 
/* Larger buttons (42px by default) */
.tp-start,
.tp-button {
  width: 56px;
  height: 56px;
}
 
/* Larger text */
.tp-name {
  font-size: 16px;
}
 
.tp-sub,
.tp-status__text {
  font-size: 14px;
}

Ocultar os rótulos de texto

Todo o texto do widget fica em .tp-meta. Oculte-o completamente para manter apenas a forma de onda e os botões:

.tp-meta {
  display: none;
}

Ou oculte partes individuais:

/* Hide only the idle "Available now" subtitle */
.tp-sub {
  display: none;
}
 
/* Hide only the in-call status line (connection state / timer) */
.tp-status {
  display: none;
}

Substituições específicas por tema

Direcione um tema específico com a classe do tema:

/* Only affect dark theme */
.tp--dark .tp-start {
  box-shadow: 0 0 20px rgba(255, 255, 255, 0.25);
}
 
/* Only affect light theme */
.tp-widget.tp--light {
  --tp-bg: rgba(255, 255, 255, 0.95);
}

Escopo com className

Ao usar o componente React, passe uma prop className para limitar suas substituições a uma instância específica do widget:

<ThunderPhoneWidget
  publishableKey="pk_live_your_publishable_key"
  theme="dark"
  className="support-widget"
/>

Em seguida, direcione essa classe no seu CSS:

.support-widget.tp--dark {
  --tp-bg: rgba(30, 30, 46, 0.9);
}
 
.support-widget .tp-name {
  font-weight: 700;
}

Isso permite ter várias instâncias do widget na mesma página com estilos diferentes. Dê a cada instância sua própria cor de destaque por meio da prop primaryColor (o CSS não pode substituir --tp-accent -- ela é definida inline).


UI totalmente personalizada

Se as substituições de CSS não forem suficientes, o hook headless oferece controle total. Você fornece todo o HTML e a estilização, enquanto useThunderPhone gerencia a sessão de voz. O hook também fornece audioLevelRef para criar visualizações reativas ao áudio, como formas de onda.

import { useThunderPhone } from '@thunderphone/widget'
 
function MyWidget() {
  const phone = useThunderPhone({
    publishableKey: 'pk_live_your_publishable_key',
  })
 
  return (
    <div className="my-totally-custom-widget">
      {/* Your own buttons, animations, layouts -- anything */}
      <button onClick={phone.state === 'connected' ? phone.disconnect : phone.connect}>
        {phone.state === 'connected' ? 'Hang up' : 'Call us'}
      </button>
      {phone.audio}
    </div>
  )
}