---
title: "CDN / oznaka skripte"
description: "Dodajte glasovni widget ThunderPhone na bilo koje web-mjesto bez alata za paketiranje"
---

CDN izgradnja interno uključuje React, pa widget možete upotrebljavati na statičkim stranicama, u WordPressu, Webflowu ili na bilo kojoj stranici na koju možete dodati HTML. Nisu potrebni npm, alat za grupiranje ni radni okvir.

## CDN URL-ovi

<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>
  URL-ovi `latest` ono su što generira isječak za ugradnju na nadzornoj ploči. Spremaju se u predmemoriju 5 minuta i automatski preuzimaju nova stabilna izdanja. Prikvačene putanje `/widget/vX.Y.Z/` nepromjenjive su i dugoročno se spremaju u predmemoriju -- ako prikvačite verziju, uskladite je s izdanjem npm paketa `@thunderphone/widget` prema kojem razvijate.
</Tip>

---

## Osnovna upotreba

```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>
```

Widget se montira u ciljni element i prikazuje kao **traka s fiksnim položajem u kutu prikaza** (zadano `bottom-right`, kontrolira se opcijom `position`). Element za montiranje samo je korijenski element Reacta -- njegov položaj na stranici ne utječe na mjesto prikaza widgeta.

---

## Opcije montiranja

`ThunderPhone.mount()` prihvaća iste opcije kao komponenta Reacta, uz svojstvo `element`:

| Opcija | Vrsta | Obavezno | Zadano | Opis |
|--------|------|----------|---------|-------------|
| `element` | `string \| HTMLElement` | Da | -- | CSS selektor (npr. `'#thunderphone'`) ili referenca na DOM element. |
| `publishableKey` | `string` | Da | -- | Javni API ključ (`pk_live_...`). Agent se automatski određuje iz konfiguracije widgeta ključa. |
| `theme` | `'light' \| 'dark'` | Ne | `'light'` | Shema boja. |
| `primaryColor` | `string` | Ne | `'#000000'` (svijetla) / `'#ffffff'` (tamna) | CSS niz boje koji se upotrebljava kao naglasna boja. |
| `title` | `string` | Ne | `'Voice assistant'` | Tekst prikazan na traci widgeta. |
| `position` | `'bottom-right' \| 'bottom-left' \| 'top-right' \| 'top-left'` | Ne | `'bottom-right'` | Fiksni položaj u prikazu. |
| `apiBase` | `string` | Ne | `'https://api.thunderphone.com/v1'` | Nadjačavanje osnovnog URL-a API-ja. |
| `language` | `string` | Ne | -- | Nadjačavanje jezika po sesiji -- jezični kôd ili regionalna postavka, poput `en`, `es` ili `fr-FR`. Kada nije postavljeno, primjenjuje se konfigurirani jezik agenta. |
| `voice` | `string` | Ne | -- | Nadjačavanje glasa po sesiji -- naziv glasa, poput `maria`. Kada nije postavljeno, primjenjuje se konfigurirani glas agenta. |
| `context` | `string` | Ne | -- | Činjenični kontekst stranice ili web-mjesta po sesiji koji se prosljeđuje agentu. Na strani poslužitelja skraćuje se na 12.000 znakova. |
| `onConnect` | `() => void` | Ne | -- | Poziva se kada se poveže glasovna sesija. |
| `onDisconnect` | `() => void` | Ne | -- | Poziva se kada sesija završi. |
| `onError` | `(error) => void` | Ne | -- | Poziva se pri pogreškama. Pogreška ima polja `error` (kôd) i `message`. |
| `ringtone` | `boolean \| string` | Ne | `false` | Reproducirajte melodiju zvona tijekom povezivanja. `true` za zadanu melodiju zvona ili URL niz za prilagođeni zvuk. |

---

## Čišćenje

`ThunderPhone.mount()` vraća instancu widgeta s metodama za čišćenje:

```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()` i `destroy()` rade isto -- prekidaju svaku aktivnu glasovnu sesiju i uklanjaju widget iz DOM-a. Upotrijebite onu koja se bolje uklapa u vaš kôd.

<Note>
  Uvijek očistite widget pri napuštanju stranice u jednostraničnim aplikacijama ili kada se ukloni sadržavajući element. Time se osigurava pravilno prekidanje aktivnih glasovnih sesija.
</Note>

---

## Primjeri

### Tamna tema s prilagođenom bojom

```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>
```

### Prilagođeni položaj

```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>
```

### S povratnim pozivima događaja

```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>
```

### S melodijom zvona

```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>
```

### Upotreba reference elementa DOM-a

```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>
```

### Integracija s WordPressom / CMS-om

Dodajte ovo u blok Prilagođeni HTML ili podnožje svoje teme:

```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>
  `<div>` može biti bilo gdje -- služi samo kao točka montiranja. Sam widget prikazuje se kao fiksni sloj u kutu prikaza (određen opcijom `position`) i ne prati okolni sadržaj.
</Tip>

---

## Rješavanje problema

<AccordionGroup>
  <Accordion title="Widget se ne prikazuje">
    Provjerite jesu li učitane i CSS i JS datoteke. Provjerite postoje li mrežne pogreške u konzoli preglednika. Provjerite postoji li ciljni element u DOM-u prije pozivanja `ThunderPhone.mount()`.
  </Accordion>

  <Accordion title="ThunderPhone nije definiran">
    Skripta se još nije učitala. Provjerite pojavljuje li se oznaka `<script>` za `widget.js` prije vašeg poziva za montiranje ili omotajte poziv za montiranje u osluškivač `DOMContentLoaded`.
  </Accordion>

  <Accordion title="Pogreška: domena nije dopuštena">
    Dodajte svoju domenu na popis dopuštenih domena u postavkama **Razvojni programeri** na [app.thunderphone.com](https://app.thunderphone.com). Imajte na umu da je `localhost` uvijek dopušten.
  </Accordion>
</AccordionGroup>

---

## Sljedeći koraci

<CardGroup cols={2}>
  <Card title="Stiliziranje" icon="palette" href="/hr/widget/styling">
    Prilagodite izgled widgeta pomoću prilagođenih CSS svojstava.
  </Card>
  <Card title="React komponenta" icon="react" href="/hr/widget/react">
    Koristite React? Integracija komponente jednostavnija je.
  </Card>
</CardGroup>
