> ## 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 / Script Tag

> Lägg till ThunderPhone-röstwidgeten på valfri webbplats utan en bundler

CDN-versionen paketerar React internt, så du kan använda widgeten på statiska webbplatser, WordPress, Webflow eller vilken sida som helst där du kan lägga till HTML. Ingen npm, ingen bundlare och inget ramverk krävs.

## CDN-URL:er

<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:erna för `latest` är de som instrumentpanelens generator för inbäddningskod skapar. De cachelagras i 5 minuter och hämtar automatiskt nya stabila versioner. Fästa sökvägar för `/widget/vX.Y.Z/` är oföränderliga och cachelagras långsiktigt -- om du fäster en version ska den matcha den npm-version av `@thunderphone/widget` som du utvecklar mot.
</Tip>

***

## Grundläggande användning

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

Widgeten monteras i målelementet och renderas som en **fält med fast position i ett hörn av visningsområdet** (standardvärdet är `bottom-right`, styrt av alternativet `position`). Monteringslementet är endast React-roten -- dess placering på sidan påverkar inte var widgeten visas.

***

## Monteringsalternativ

`ThunderPhone.mount()` accepterar samma alternativ som React-komponenten, plus egenskapen `element`:

| Alternativ       | Typ                                                            | Krävs | Standard                                 | Beskrivning                                                                                                                                                        |
| ---------------- | -------------------------------------------------------------- | ----- | ---------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| `element`        | `string \| HTMLElement`                                        | Ja    | --                                       | CSS-väljare (t.ex. `'#thunderphone'`) eller en referens till ett DOM-element.                                                                                      |
| `publishableKey` | `string`                                                       | Ja    | --                                       | Publicerbar API-nyckel (`pk_live_...`). Röstagenten fastställs automatiskt från nyckelns widgetkonfiguration.                                                      |
| `theme`          | `'light' \| 'dark'`                                            | Nej   | `'light'`                                | Färgschema.                                                                                                                                                        |
| `primaryColor`   | `string`                                                       | Nej   | `'#000000'` (light) / `'#ffffff'` (dark) | CSS-färgsträng som används som accentfärg.                                                                                                                         |
| `title`          | `string`                                                       | Nej   | `'Voice assistant'`                      | Text som visas i widgetfältet.                                                                                                                                     |
| `position`       | `'bottom-right' \| 'bottom-left' \| 'top-right' \| 'top-left'` | Nej   | `'bottom-right'`                         | Fast position i visningsområdet.                                                                                                                                   |
| `apiBase`        | `string`                                                       | Nej   | `'https://api.thunderphone.com/v1'`      | Åsidosättning av API-bas-URL.                                                                                                                                      |
| `language`       | `string`                                                       | Nej   | --                                       | Åsidosättning av språk per session -- en språkkod eller språkinställning som `en`, `es` eller `fr-FR`. Om det inte anges används röstagentens konfigurerade språk. |
| `voice`          | `string`                                                       | Nej   | --                                       | Åsidosättning av röst per session -- ett röstnamn som `maria`. Om det inte anges används röstagentens konfigurerade röst.                                          |
| `context`        | `string`                                                       | Nej   | --                                       | Faktabaserad sid- eller webbplatskontext per session som skickas till röstagenten. Avkortas på serversidan till 12 000 tecken.                                     |
| `onConnect`      | `() => void`                                                   | Nej   | --                                       | Anropas när röstsessionen ansluts.                                                                                                                                 |
| `onDisconnect`   | `() => void`                                                   | Nej   | --                                       | Anropas när sessionen avslutas.                                                                                                                                    |
| `onError`        | `(error) => void`                                              | Nej   | --                                       | Anropas vid fel. Felet har fälten `error` (kod) och `message`.                                                                                                     |
| `ringtone`       | `boolean \| string`                                            | Nej   | `false`                                  | Spela en ringsignal under anslutning. `true` för standardringsignalen eller en URL-sträng för anpassat ljud.                                                       |

***

## Rensning

`ThunderPhone.mount()` returnerar en widgetinstans med metoder för rensning:

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

Både `unmount()` och `destroy()` gör samma sak -- de kopplar från alla aktiva röstsamtal och tar bort widgeten från DOM:en. Använd det alternativ som passar bäst i din kod.

<Note>
  Rensa alltid upp widgeten när du navigerar bort i ensidiga applikationer eller när det innehållande elementet tas bort. Detta säkerställer att aktiva röstsamtal kopplas från korrekt.
</Note>

***

## Exempel

### Mörkt tema med anpassad färg

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

### Anpassad position

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

### Med händelseåteranrop

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

### Med ringsignal

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

### Använda en referens till ett DOM-element

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

Lägg till detta i ett anpassat HTML-block eller i sidfoten för ditt tema:

```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>`-elementet kan placeras var som helst -- det är bara monteringspunkten. Själva widgeten renderas som ett fast överlägg i ett hörn av visningsytan (anges med alternativet `position`) och följer inte omgivande innehåll.
</Tip>

***

## Felsökning

<AccordionGroup>
  <Accordion title="Widgeten visas inte">
    Kontrollera att både CSS- och JS-filerna har lästs in. Kontrollera webbläsarkonsolen efter nätverksfel. Verifiera att målelementet finns i DOM:en innan du anropar `ThunderPhone.mount()`.
  </Accordion>

  <Accordion title="ThunderPhone är inte definierat">
    Skriptet har inte lästs in ännu. Kontrollera att `<script>`-taggen för `widget.js` visas före ditt mount-anrop, eller omslut mount-anropet med en `DOMContentLoaded`-lyssnare.
  </Accordion>

  <Accordion title="Fel: domänen är inte tillåten">
    Lägg till din domän i listan över tillåtna domäner i inställningarna för **Utvecklare** på [app.thunderphone.com](https://app.thunderphone.com). Kom ihåg att `localhost` alltid är tillåten.
  </Accordion>
</AccordionGroup>

***

## Nästa steg

<CardGroup cols={2}>
  <Card title="Stilsättning" icon="palette" href="/sv/widget/styling">
    Anpassa widgetens utseende med anpassade CSS-egenskaper.
  </Card>

  <Card title="React-komponent" icon="react" href="/sv/widget/react">
    Använder du React? Komponentintegrationen är enklare.
  </Card>
</CardGroup>
