---
title: "CDN / Balise de script"
description: "Ajoutez le widget vocal ThunderPhone à n’importe quel site web sans bundler"
---

La build CDN intègre React en interne. Vous pouvez donc utiliser le widget sur des sites statiques, WordPress, Webflow ou toute page où vous pouvez ajouter du HTML. Aucun npm, bundler ou framework n’est requis.

## URL CDN

<CodeGroup>
```html Latest (recommended)
<link rel="stylesheet" href="https://cdn.thunderphone.com/widget/latest/style.css" />
<script src="https://cdn.thunderphone.com/widget/latest/widget.js"></script>
```

```html Pinned version
<!-- Each stable release also publishes an immutable /widget/vX.Y.Z/ path
     matching the @thunderphone/widget npm version (v1.1.2 at the time of
     writing). If you pin, you own updating the URL for new releases. -->
<link rel="stylesheet" href="https://cdn.thunderphone.com/widget/v1.1.2/style.css" />
<script src="https://cdn.thunderphone.com/widget/v1.1.2/widget.js"></script>
```
</CodeGroup>

<Tip>
  Les URL `latest` sont celles générées par l’extrait d’intégration du tableau de bord. Elles sont mises en cache pendant 5 minutes et récupèrent automatiquement les nouvelles versions stables. Les chemins épinglés `/widget/vX.Y.Z/` sont immuables et mis en cache à long terme -- si vous épinglez une version, faites-la correspondre à la version npm `@thunderphone/widget` avec laquelle vous développez.
</Tip>

---

## Utilisation de base

```html
<!DOCTYPE html>
<html>
<head>
  <link rel="stylesheet" href="https://cdn.thunderphone.com/widget/latest/style.css" />
</head>
<body>

  <div id="thunderphone"></div>

  <script src="https://cdn.thunderphone.com/widget/latest/widget.js"></script>
  <script>
    ThunderPhone.mount({
      element: '#thunderphone',
      publishableKey: 'pk_live_your_publishable_key',
    })
  </script>

</body>
</html>
```

Le widget est monté dans l’élément cible et s’affiche sous la forme d’une **barre à position fixe dans un coin de la fenêtre d’affichage** (par défaut `bottom-right`, contrôlé par l’option `position`). L’élément de montage est uniquement la racine React -- son emplacement dans la page n’affecte pas l’endroit où le widget s’affiche.

---

## Options de montage

`ThunderPhone.mount()` accepte les mêmes options que le composant React, auxquelles s’ajoute la propriété `element` :

| Option | Type | Obligatoire | Par défaut | Description |
|--------|------|-------------|------------|-------------|
| `element` | `string \| HTMLElement` | Oui | -- | Sélecteur CSS (par exemple, `'#thunderphone'`) ou référence à un élément DOM. |
| `publishableKey` | `string` | Oui | -- | Clé API publiable (`pk_live_...`). L’agent est résolu automatiquement à partir de la configuration du widget de la clé. |
| `theme` | `'light' \| 'dark'` | Non | `'light'` | Thème de couleurs. |
| `primaryColor` | `string` | Non | `'#000000'` (clair) / `'#ffffff'` (sombre) | Chaîne de couleur CSS utilisée comme couleur d’accentuation. |
| `title` | `string` | Non | `'Voice assistant'` | Texte affiché dans la barre du widget. |
| `position` | `'bottom-right' \| 'bottom-left' \| 'top-right' \| 'top-left'` | Non | `'bottom-right'` | Position fixe dans la fenêtre d’affichage. |
| `apiBase` | `string` | Non | `'https://api.thunderphone.com/v1'` | Remplacement de l’URL de base de l’API. |
| `language` | `string` | Non | -- | Remplacement de la langue par session -- un code de langue ou un paramètre régional tel que `en`, `es` ou `fr-FR`. Lorsqu’elle n’est pas définie, la langue configurée de l’agent s’applique. Nécessite `language` dans les [remplacements du navigateur](/fr/guides/embed-web-widget) de la clé. |
| `voice` | `string` | Non | -- | Remplacement de la voix par session -- un nom de voix tel que `maria`. Lorsqu’elle n’est pas définie, la voix configurée de l’agent s’applique. Nécessite `voice` dans les [remplacements du navigateur](/fr/guides/embed-web-widget) de la clé. |
| `context` | `string` | Non | -- | Contexte factuel de la page ou du site par session transmis à l’agent. Tronqué côté serveur à 12 000 caractères. Nécessite `context` dans les [remplacements du navigateur](/fr/guides/embed-web-widget) de la clé. |
| `onConnect` | `() => void` | Non | -- | Appelé lorsque la session vocale se connecte. |
| `onDisconnect` | `() => void` | Non | -- | Appelé lorsque la session se termine. |
| `onError` | `(error) => void` | Non | -- | Appelé en cas d’erreur. L’erreur contient les champs `error` (code) et `message`. |
| `ringtone` | `boolean \| string` | Non | `false` | Joue une sonnerie pendant la connexion. `true` pour la sonnerie par défaut, ou une chaîne URL pour un audio personnalisé. |

---

## Nettoyage

`ThunderPhone.mount()` renvoie une instance de widget avec des méthodes de nettoyage :

```html
<script>
  var widget = ThunderPhone.mount({
    element: '#thunderphone',
    publishableKey: 'pk_live_your_publishable_key',
  })

  // Later, when you want to remove the widget:
  widget.unmount()

  // Or equivalently:
  widget.destroy()
</script>
```

`unmount()` et `destroy()` font la même chose : elles déconnectent toute session vocale active et suppriment le widget du DOM. Utilisez celle qui s’intègre le mieux à votre code.

<Note>
  Nettoyez toujours le widget lorsque vous quittez une page dans les applications monopages ou lorsque l’élément conteneur est supprimé. Cela garantit que les sessions vocales actives sont correctement déconnectées.
</Note>

---

## Exemples

### Thème sombre avec couleur personnalisée

```html
<div id="thunderphone"></div>

<link rel="stylesheet" href="https://cdn.thunderphone.com/widget/latest/style.css" />
<script src="https://cdn.thunderphone.com/widget/latest/widget.js"></script>
<script>
  ThunderPhone.mount({
    element: '#thunderphone',
    publishableKey: 'pk_live_your_publishable_key',
    theme: 'dark',
    primaryColor: '#8b5cf6',
    title: 'Talk to our AI',
  })
</script>
```

### Position personnalisée

```html
<div id="thunderphone"></div>

<script src="https://cdn.thunderphone.com/widget/latest/widget.js"></script>
<script>
  ThunderPhone.mount({
    element: '#thunderphone',
    publishableKey: 'pk_live_your_publishable_key',
    position: 'bottom-left',
  })
</script>
```

### Avec des rappels d’événements

```html
<div id="thunderphone"></div>

<link rel="stylesheet" href="https://cdn.thunderphone.com/widget/latest/style.css" />
<script src="https://cdn.thunderphone.com/widget/latest/widget.js"></script>
<script>
  ThunderPhone.mount({
    element: '#thunderphone',
    publishableKey: 'pk_live_your_publishable_key',
    onConnect: function () {
      console.log('Call started')
    },
    onDisconnect: function () {
      console.log('Call ended')
    },
    onError: function (error) {
      console.error('Widget error:', error.error, error.message)
    },
  })
</script>
```

### Avec sonnerie

```html
<div id="thunderphone"></div>

<link rel="stylesheet" href="https://cdn.thunderphone.com/widget/latest/style.css" />
<script src="https://cdn.thunderphone.com/widget/latest/widget.js"></script>
<script>
  ThunderPhone.mount({
    element: '#thunderphone',
    publishableKey: 'pk_live_your_publishable_key',
    ringtone: true, // or a custom URL: 'https://example.com/ringtone.mp3'
  })
</script>
```

### Utilisation d’une référence d’élément DOM

```html
<div id="thunderphone"></div>

<script src="https://cdn.thunderphone.com/widget/latest/widget.js"></script>
<script>
  var container = document.getElementById('thunderphone')

  ThunderPhone.mount({
    element: container,
    publishableKey: 'pk_live_your_publishable_key',
  })
</script>
```

### Intégration WordPress / CMS

Ajoutez ceci à un bloc HTML personnalisé ou au pied de page de votre thème :

```html
<link rel="stylesheet" href="https://cdn.thunderphone.com/widget/latest/style.css" />
<script src="https://cdn.thunderphone.com/widget/latest/widget.js"></script>

<div id="thunderphone-widget"></div>
<script>
  ThunderPhone.mount({
    element: '#thunderphone-widget',
    publishableKey: 'pk_live_your_publishable_key',
  })
</script>
```

<Tip>
  Le `<div>` peut être placé n’importe où : il sert uniquement de point de montage. Le widget lui-même s’affiche comme une superposition fixe dans un coin de la fenêtre d’affichage (défini par l’option `position`) et ne suit pas le flux du contenu environnant.
</Tip>

---

## Dépannage

<AccordionGroup>
  <Accordion title="Le widget n’apparaît pas">
    Assurez-vous que les fichiers CSS et JS sont tous deux chargés. Vérifiez la console du navigateur pour détecter les erreurs réseau. Vérifiez que l’élément cible existe dans le DOM avant d’appeler `ThunderPhone.mount()`.
  </Accordion>

  <Accordion title="ThunderPhone n’est pas défini">
    Le script n’est pas encore chargé. Assurez-vous que la balise `<script>` pour `widget.js` apparaît avant votre appel de montage, ou encapsulez l’appel de montage dans un écouteur `DOMContentLoaded`.
  </Accordion>

  <Accordion title="Erreur de domaine non autorisé">
    Ajoutez votre domaine aux domaines autorisés du widget sur la page **Widgets Web** d’[app.thunderphone.com](https://app.thunderphone.com). `localhost` n’est pas autorisé automatiquement en production ; ajoutez-le à la liste pour effectuer des tests locaux.
  </Accordion>
</AccordionGroup>

---

## Étapes suivantes

<CardGroup cols={2}>
  <Card title="Style" icon="palette" href="/fr/widget/styling">
    Personnalisez l’apparence du widget avec des propriétés CSS personnalisées.
  </Card>
  <Card title="Composant React" icon="react" href="/fr/widget/react">
    Vous utilisez React ? L’intégration du composant est plus simple.
  </Card>
</CardGroup>
