ThunderPhone 2.0 est disponible.En libre-service, à partir de 2 ¢/min.Découvrir l’annonce

Widget

Personnalisation visuelle

Personnalisez l’apparence du widget vocal ThunderPhone avec CSS

Le widget s’affiche sous la forme d’une barre au style glassmorphique avec des thèmes clair et sombre intégrés. La personnalisation est disponible à trois niveaux : les props pour les options courantes, les propriétés personnalisées CSS pour les thèmes et les remplacements de classes CSS pour un contrôle total.


Thèmes

La prop theme contrôle le jeu de couleurs du widget. Elle applique une classe tp--light ou tp--dark à la racine du widget :

<ThunderPhoneWidget
  publishableKey="pk_live_your_publishable_key"
  theme="dark"
/>
ThèmeClasseDescription
'light'tp--lightArrière-plan clair avec texte sombre. Par défaut.
'dark'tp--darkArrière-plan sombre avec texte clair.

Les deux thèmes utilisent le design de barre glassmorphique avec un flou d’arrière-plan et une transparence subtile.


Propriétés personnalisées CSS

Le widget expose des propriétés personnalisées CSS (variables) que vous pouvez remplacer pour modifier les couleurs sans toucher aux classes individuelles. Elles sont définies par la classe de thème (.tp--light ou .tp--dark) appliquée à la racine .tp-widget :

PropriétéValeur par défaut (clair)Valeur par défaut (sombre)Description
--tp-accent#000#fffCouleur d’accentuation : bouton de démarrage, barres de forme d’onde, point de connexion, texte d’état connecté. Définie en ligne depuis la prop primaryColor.
--tp-bgrgba(255, 255, 255, 0.82)rgba(15, 15, 15, 0.85)Arrière-plan de la barre (translucide ; flouté par --tp-glass).
--tp-surfacergba(0, 0, 0, 0.04)rgba(255, 255, 255, 0.07)Arrière-plan du bouton de mise en sourdine.
--tp-surface-hoverrgba(0, 0, 0, 0.07)rgba(255, 255, 255, 0.12)Arrière-plan du bouton de mise en sourdine au survol.
--tp-borderrgba(0, 0, 0, 0.08)rgba(255, 255, 255, 0.1)Bordures de la barre et des boutons.
--tp-border-hoverrgba(0, 0, 0, 0.14)rgba(255, 255, 255, 0.18)Couleur de bordure au survol.
--tp-textrgba(0, 0, 0, 0.88)rgba(255, 255, 255, 0.95)Texte principal (titre, nom de l’agent).
--tp-text-2rgba(0, 0, 0, 0.5)rgba(255, 255, 255, 0.55)Texte secondaire (sous-titre, ligne d’état, minuteur d’appel).
--tp-glassblur(32px) saturate(180%)blur(32px) saturate(180%)backdrop-filter qui crée l’effet verre sur la barre.
--tp-shadowstack d’ombres à trois couchesstack d’ombres à trois couchesLe box-shadow de la barre (couches anneau + proche + lointaine).
--tp-shadow-hoverstack d’ombres à trois couchesstack d’ombres à trois couchesDéclarée pour l’élévation au survol ; actuellement appliquée par aucune règle.
--tp-glowinset 0 1px 0 0 rgba(255,255,255,0.5)inset 0 1px 0 0 rgba(255,255,255,0.06)Mise en évidence supérieure interne superposée à l’ombre de la barre.
--tp-connected#059669#34d399Couleur de l’indicateur d’état connecté (point d’état).
--tp-error#dc2626#fb7185Couleur du texte d’état d’erreur.
--tp-end-bgrgba(239, 68, 68, 0.08)rgba(251, 113, 133, 0.12)Arrière-plan du bouton de fin d’appel.
--tp-end-color#ef4444#fb7185Couleur de l’icône du bouton de fin d’appel.
--tp-end-borderrgba(239, 68, 68, 0.12)rgba(251, 113, 133, 0.15)Bordure du bouton de fin d’appel.
--tp-end-hoverrgba(239, 68, 68, 0.14)rgba(251, 113, 133, 0.2)Arrière-plan du bouton de fin d’appel au survol.
--tp-idle-opacity0.40.3Déclarée pour l’atténuation à l’état inactif ; actuellement appliquée par aucune règle.

Remplacer des propriétés personnalisées

Définissez la couleur d’accentuation via la prop primaryColor :

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

Remplacez les autres propriétés personnalisées avec CSS. Utilisez un sélecteur à deux classes (.tp-widget.tp--light / .tp-widget.tp--dark) afin que votre règle l’emporte sur la classe de thème qui définit les valeurs par défaut, quel que soit l’ordre de la feuille de style :

.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

Toutes les classes du widget sont préfixées par tp- afin d’éviter les conflits avec vos styles existants.

ClasseÉlémentDescription
.tp-widgetWrapper racineConteneur à position fixe (position: fixed, coin défini par la prop position, z-index: 9999). Contient la classe de thème et les paramètres de police de base ; aucun habillage visuel propre.
.tp--light / .tp--darkModificateurs de thèmeAppliqués à .tp-widget avec le thème ; définissent toutes les propriétés personnalisées --tp-*.
.tp-barLa barreLa pilule en verre dépoli elle-même : arrière-plan, flou d’arrière-plan, bordure, rayon de 99px, ombre. Largeur de 300px.
.tp-metaBloc de texteConteneur pour tout le texte -- titre et sous-titre au repos, nom et statut de l’agent pendant un appel.
.tp-nameLibellé principalAffiche la prop title au repos, et le nom de l’agent connecté (avec title comme valeur de repli) pendant un appel.
.tp-subSous-titreLa ligne « Disponible maintenant » affichée au repos.
.tp-startBouton d’appel au reposLe bouton circulaire accentué de démarrage (42px). Utilise --tp-accent comme arrière-plan.
.tp-dotPoint de connexionPoint accentué pulsant affiché à gauche de la barre pendant la connexion.
.tp-wave / .tp-wave--idleForme d’ondeLa forme d’onde à cinq barres. --idle ajoute l’animation lente de respiration ; pendant un appel, les barres réagissent à l’audio.
.tp-buttonBoutons en appelStyle de base pour les contrôles en appel (42px, arrondi de 12px).
.tp-button-groupLigne de boutonsContient les boutons de coupure du micro et de fin pendant un appel.
.tp-button--startVariante du bouton de connexionVariante de couleur accentuée affichée lorsqu’un appel démarre.
.tp-button--muteBascule de coupure du microCoupe/rétablit le micro pendant un appel. Utilise --tp-surface.
.tp-button--endBouton de fin d’appelRaccroche. Utilise la palette --tp-end-*.
.tp-button--loadingModificateur de chargementAtténue le bouton pendant la connexion.
.tp-icon / .tp-spinIcônesDimensionnement des icônes de bouton ; tp-spin anime l’indicateur de connexion.
.tp-statusBloc de statut en appelContient la ligne de statut pendant les états de connexion, connecté ou erreur.
.tp-status__textLigne de statutTexte de l’état de connexion (par exemple, « Connexion... ») ou minuteur d’appel. Reçoit .tp-status--connected (couleur accentuée) ou .tp-status--error (couleur d’erreur) selon l’état.
.tp-status__nameEmplacement du nom de l’agentFait partie du bloc de statut, mais n’est pas rendu dans la disposition actuelle de la barre -- le nom de l’agent apparaît plutôt dans .tp-name.
.tp-status__dotPoint de statutStyle de point pulsant pour l’état connecté (utilise --tp-connected).

Exemples

Accent personnalisée via les props

La manière la plus simple de personnaliser l'image de marque du widget :

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

Couleurs personnalisées via CSS

Remplacez les propriétés personnalisées pour contrôler entièrement les couleurs. N'oubliez pas que l'accent provient de la prop primaryColor, et non du 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);
}

Taille personnalisée

Agrandissez ou réduisez le widget en ajustant les dimensions de la barre, des boutons et du texte :

/* 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;
}

Masquer les libellés textuels

Tout le texte du widget se trouve dans .tp-meta. Masquez-le entièrement pour ne conserver que la forme d'onde et les boutons :

.tp-meta {
  display: none;
}

Vous pouvez également masquer des éléments individuels :

/* 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;
}

Remplacements spécifiques au thème

Ciblez un thème spécifique avec la classe de thème :

/* 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);
}

Délimitation avec className

Lorsque vous utilisez le composant React, transmettez une prop className pour limiter vos remplacements à une instance spécifique du widget :

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

Ciblez ensuite cette classe dans votre CSS :

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

Cela vous permet d'avoir plusieurs instances du widget sur la même page avec des styles différents. Donnez à chaque instance son propre accent via sa prop primaryColor (le CSS ne peut pas remplacer --tp-accent -- il est défini en ligne).


Interface utilisateur entièrement personnalisée

Si les remplacements CSS ne suffisent pas, le hook headless vous donne un contrôle total. Vous fournissez tout le HTML et le style, tandis que useThunderPhone gère la session vocale. Le hook fournit également audioLevelRef pour créer des visualisations réactives à l'audio, comme des formes d'onde.

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>
  )
}