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

> Tilføj ThunderPhone-stemmewidgetten på ethvert website uden en bundler

CDN-buildet inkluderer React internt, så du kan bruge widgetten på statiske websites, WordPress, Webflow eller enhver side, hvor du kan tilføje HTML. Ingen npm, bundler eller framework kræves.

## 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>
  `latest`-URL'erne er dem, dashboardets generator til indlejringskodestumper opretter. De caches i 5 minutter og henter automatisk nye stabile udgivelser. Fastlåste `/widget/vX.Y.Z/`-stier er uforanderlige og caches på lang sigt -- hvis du fastlåser, skal versionen matche den `@thunderphone/widget` npm-udgivelse, du udvikler imod.
</Tip>

***

## Grundlæggende brug

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

Widgetten monteres i målelementet og vises som en **bjælke med fast position i et hjørne af viewporten** (som standard `bottom-right`, styret af indstillingen `position`). Monteringselementet er kun React-roden -- dets placering på siden påvirker ikke, hvor widgetten vises.

***

## Monteringsindstillinger

`ThunderPhone.mount()` accepterer de samme indstillinger som React-komponenten samt egenskaben `element`:

| Indstilling      | Type                                                           | Påkrævet | Standard                               | Beskrivelse                                                                                                                                                           |
| ---------------- | -------------------------------------------------------------- | -------- | -------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `element`        | `string \| HTMLElement`                                        | Ja       | --                                     | CSS-selector (f.eks. `'#thunderphone'`) eller en reference til et DOM-element.                                                                                        |
| `publishableKey` | `string`                                                       | Ja       | --                                     | Publicerbar API-nøgle (`pk_live_...`). Agenten bestemmes automatisk ud fra nøglens widgetkonfiguration.                                                               |
| `theme`          | `'light' \| 'dark'`                                            | Nej      | `'light'`                              | Farveskema.                                                                                                                                                           |
| `primaryColor`   | `string`                                                       | Nej      | `'#000000'` (lys) / `'#ffffff'` (mørk) | CSS-farvestreng, der bruges som accentfarve.                                                                                                                          |
| `title`          | `string`                                                       | Nej      | `'Voice assistant'`                    | Tekst, der vises i widgetbjælken.                                                                                                                                     |
| `position`       | `'bottom-right' \| 'bottom-left' \| 'top-right' \| 'top-left'` | Nej      | `'bottom-right'`                       | Fast position i viewporten.                                                                                                                                           |
| `apiBase`        | `string`                                                       | Nej      | `'https://api.thunderphone.com/v1'`    | Tilsidesættelse af API-basens URL.                                                                                                                                    |
| `language`       | `string`                                                       | Nej      | --                                     | Tilsidesættelse af sprog pr. session -- en sprogkode eller landestandard som `en`, `es` eller `fr-FR`. Hvis den ikke er angivet, bruges agentens konfigurerede sprog. |
| `voice`          | `string`                                                       | Nej      | --                                     | Tilsidesættelse af stemme pr. session -- et stemmenavn som `maria`. Hvis den ikke er angivet, bruges agentens konfigurerede stemme.                                   |
| `context`        | `string`                                                       | Nej      | --                                     | Faktuel side- eller website-kontekst pr. session, der sendes til agenten. Afkortes på serveren til 12.000 tegn.                                                       |
| `onConnect`      | `() => void`                                                   | Nej      | --                                     | Kaldes, når stemmesessionen opretter forbindelse.                                                                                                                     |
| `onDisconnect`   | `() => void`                                                   | Nej      | --                                     | Kaldes, når sessionen afsluttes.                                                                                                                                      |
| `onError`        | `(error) => void`                                              | Nej      | --                                     | Kaldes ved fejl. Fejlen har felterne `error` (kode) og `message`.                                                                                                     |
| `ringtone`       | `boolean \| string`                                            | Nej      | `false`                                | Afspil en ringetone under forbindelsen. `true` bruger standardringetonen, eller angiv en URL-streng for brugerdefineret lyd.                                          |

***

## Oprydning

`ThunderPhone.mount()` returnerer en widgetinstans med oprydningsmetoder:

```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()` og `destroy()` gør det samme -- de afbryder alle aktive stemmesessioner og fjerner widgetten fra DOM'en. Brug den, der passer bedst i din kode.

<Note>
  Ryd altid op i widgetten, når du navigerer væk i single-page-applikationer, eller når det indeholdende element fjernes. Det sikrer, at aktive stemmesessioner afbrydes korrekt.
</Note>

***

## Eksempler

### Mørkt tema med brugerdefineret farve

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

### Brugerdefineret placering

```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ændelses-callbacks

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

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

### Brug af en DOM-elementreference

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

Tilføj dette i en Brugerdefineret HTML-blok eller i dit temas sidefod:

```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>` kan placeres hvor som helst -- det er kun monteringspunktet. Selve widgetten gengives som en fast overlejring i et hjørne af visningsområdet (angivet med indstillingen `position`) og indgår ikke i layoutflowet med det omgivende indhold.
</Tip>

***

## Fejlfinding

<AccordionGroup>
  <Accordion title="Widgetten vises ikke">
    Sørg for, at både CSS- og JS-filerne er indlæst. Kontrollér browserkonsollen for netværksfejl. Bekræft, at målelementet findes i DOM'en, før du kalder `ThunderPhone.mount()`.
  </Accordion>

  <Accordion title="ThunderPhone er ikke defineret">
    Scriptet er endnu ikke indlæst. Sørg for, at `<script>`-tagget for `widget.js` vises før dit mount-kald, eller pak mount-kaldet ind i en `DOMContentLoaded`-lytter.
  </Accordion>

  <Accordion title="Fejl: Domæne ikke tilladt">
    Føj dit domæne til listen over tilladte domæner i indstillingerne under **Udviklere** på [app.thunderphone.com](https://app.thunderphone.com). Husk, at `localhost` altid er tilladt.
  </Accordion>
</AccordionGroup>

***

## Næste trin

<CardGroup cols={2}>
  <Card title="Styling" icon="palette" href="/da/widget/styling">
    Tilpas widgettens udseende med brugerdefinerede CSS-egenskaber.
  </Card>

  <Card title="React-komponent" icon="react" href="/da/widget/react">
    Bruger du React? Komponentintegrationen er enklere.
  </Card>
</CardGroup>
