> ## Documentation Index
> Fetch the complete documentation index at: https://docs.thunderphone.com/llms.txt
> Use this file to discover all available pages before exploring further.

# CDN / тег скрипту

> Додайте голосовий віджет ThunderPhone на будь-який вебсайт без збирача

CDN-збірка містить React усередині, тому ви можете використовувати віджет на статичних сайтах, WordPress, Webflow або будь-якій сторінці, де можна додати HTML. Не потрібні ні npm, ні бандлер, ні фреймворк.

## CDN URL-адреси

<CodeGroup>
  ```html Latest (recommended) theme={null}
  <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 theme={null}
  <!-- 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>
  URL-адреси `latest` генерує генератор коду для вбудовування в дашборді. Вони кешуються на 5 хвилин і автоматично отримують нові стабільні релізи. Закріплені шляхи `/widget/vX.Y.Z/` є незмінними та кешуються довгостроково — якщо ви закріплюєте версію, вона має відповідати релізу npm `@thunderphone/widget`, з яким ви розробляєте.
</Tip>

***

## Базове використання

```html theme={null}
<!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>
```

Віджет монтується в цільовий елемент і відображається як **панель із фіксованим положенням у куті області перегляду** (за замовчуванням `bottom-right`, керується параметром `position`). Елемент монтування — це лише кореневий елемент React; його розташування на сторінці не впливає на місце появи віджета.

***

## Параметри монтування

`ThunderPhone.mount()` приймає ті самі параметри, що й компонент React, а також властивість `element`:

| Параметр         | Тип                                                            | Обов’язково | За замовчуванням                           | Опис                                                                                                                                           |
| ---------------- | -------------------------------------------------------------- | ----------- | ------------------------------------------ | ---------------------------------------------------------------------------------------------------------------------------------------------- |
| `element`        | `string \| HTMLElement`                                        | Так         | --                                         | CSS-селектор (наприклад, `'#thunderphone'`) або посилання на DOM-елемент.                                                                      |
| `publishableKey` | `string`                                                       | Так         | --                                         | Публічний API-ключ (`pk_live_...`). Агент автоматично визначається з конфігурації віджета ключа.                                               |
| `theme`          | `'light' \| 'dark'`                                            | Ні          | `'light'`                                  | Колірна схема.                                                                                                                                 |
| `primaryColor`   | `string`                                                       | Ні          | `'#000000'` (світла) / `'#ffffff'` (темна) | Рядок кольору CSS, що використовується як акцентний колір.                                                                                     |
| `title`          | `string`                                                       | Ні          | `'Voice assistant'`                        | Текст, що відображається на панелі віджета.                                                                                                    |
| `position`       | `'bottom-right' \| 'bottom-left' \| 'top-right' \| 'top-left'` | Ні          | `'bottom-right'`                           | Фіксоване положення в області перегляду.                                                                                                       |
| `apiBase`        | `string`                                                       | Ні          | `'https://api.thunderphone.com/v1'`        | Перевизначення базової URL-адреси API.                                                                                                         |
| `language`       | `string`                                                       | Ні          | --                                         | Перевизначення мови для сеансу — код мови або локаль, наприклад `en`, `es` чи `fr-FR`. Якщо не задано, застосовується налаштована мова агента. |
| `voice`          | `string`                                                       | Ні          | --                                         | Перевизначення голосу для сеансу — назва голосу, наприклад `maria`. Якщо не задано, застосовується налаштований голос агента.                  |
| `context`        | `string`                                                       | Ні          | --                                         | Фактичний контекст сторінки або сайту для сеансу, що передається агенту. На сервері скорочується до 12 000 символів.                           |
| `onConnect`      | `() => void`                                                   | Ні          | --                                         | Викликається, коли голосовий сеанс підключається.                                                                                              |
| `onDisconnect`   | `() => void`                                                   | Ні          | --                                         | Викликається, коли сеанс завершується.                                                                                                         |
| `onError`        | `(error) => void`                                              | Ні          | --                                         | Викликається у разі помилок. Об’єкт помилки має поля `error` (код) і `message`.                                                                |
| `ringtone`       | `boolean \| string`                                            | Ні          | `false`                                    | Відтворювати мелодію виклику під час підключення. `true` для мелодії за замовчуванням або URL-рядок для власного аудіо.                        |

***

## Очищення

`ThunderPhone.mount()` повертає екземпляр віджета з методами очищення:

```html theme={null}
<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()` і `destroy()` виконують те саме -- вони відключають будь-який активний голосовий сеанс і видаляють віджет із DOM. Використовуйте той варіант, який краще читається у вашому коді.

<Note>
  Завжди очищуйте віджет під час переходу зі сторінки в односторінкових застосунках або коли видаляється елемент-контейнер. Це гарантує належне відключення активних голосових сеансів.
</Note>

***

## Приклади

### Темна тема з власним кольором

```html theme={null}
<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>
```

### Власне розташування

```html theme={null}
<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>
```

### Зі зворотними викликами подій

```html theme={null}
<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>
```

### З мелодією дзвінка

```html theme={null}
<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>
```

### Використання посилання на DOM-елемент

```html theme={null}
<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>
```

### Інтеграція з WordPress / CMS

Додайте це до блоку «Власний HTML» або нижнього колонтитула вашої теми:

```html theme={null}
<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>
  `<div>` можна розмістити будь-де -- це лише точка монтування. Сам віджет відображається як фіксоване накладання в куті області перегляду (задається параметром `position`) і не залежить від навколишнього вмісту.
</Tip>

***

## Усунення несправностей

<AccordionGroup>
  <Accordion title="Віджет не відображається">
    Переконайтеся, що завантажено файли CSS і JS. Перевірте консоль браузера на наявність мережевих помилок. Переконайтеся, що цільовий елемент існує в DOM перед викликом `ThunderPhone.mount()`.
  </Accordion>

  <Accordion title="ThunderPhone не визначено">
    Скрипт ще не завантажився. Переконайтеся, що тег `<script>` для `widget.js` розміщено перед викликом монтування, або обгорніть виклик монтування в слухач `DOMContentLoaded`.
  </Accordion>

  <Accordion title="Помилка: домен не дозволено">
    Додайте свій домен до списку дозволених доменів у налаштуваннях **Розробники** на [app.thunderphone.com](https://app.thunderphone.com). Пам’ятайте, що `localhost` завжди дозволено.
  </Accordion>
</AccordionGroup>

***

## Наступні кроки

<CardGroup cols={2}>
  <Card title="Стилізація" icon="palette" href="/uk/widget/styling">
    Налаштуйте вигляд віджета за допомогою користувацьких властивостей CSS.
  </Card>

  <Card title="Компонент React" icon="react" href="/uk/widget/react">
    Використовуєте React? Інтеграція компонента простіша.
  </Card>
</CardGroup>
