Skip to content

Widget ​

Un singur tag <script>, un buton flotant, un modal sau un panou inline (§61).

Nepublicat încă

@callagent/web-sdk este private: true, deci nici pachetul npm, nici bundle-ul cdn.callagent.dev la care se face referire mai jos nu sunt publicate. Tag-ul de script este forma cu care se va livra widget-ul; astăzi se construiește dintr-un checkout (pnpm --filter @callagent/web-sdk build produce dist/widget.global.js) și îl servești singur. Widget-ul depinde și de aceeași rută neimplementată POST /api/v1/client/calls ca Web SDK, deci nu poate încă porni un apel către un control plane real.

html
<script
  src="https://cdn.callagent.dev/widget.js"
  data-public-key="ca_pk_…"
  data-assistant-id="01J…"
  data-mode="voice"
  data-theme="auto"
  data-accent="#4f46e5"
  data-position="bottom-right"
  data-locale="en"
  data-greeting="Hi! Ask me anything about your order."></script>

17.38 KB gzipped (15.39 KB brotli), fără runtime de framework, fără jQuery, fără CSS global.

Atribute ​

AtributValoriImplicit
data-public-keyca_pk_…obligatoriu (sau data-token)
data-tokenun JWT emis de backend-ul tău—
data-assistant-idULID de assistant—
data-api-urlorigin-ul control plane-uluihttps://api.callagent.dev
data-modevoice, chat, voice+chatvoice
data-themelight, dark, autoauto
data-accentorice culoare CSS#4f46e5
data-positionbottom-right, bottom-left, top-right, top-leftbottom-right
data-variantfloating, inlinefloating
data-targetselector, obligatoriu pentru inline—
data-localeen, ro, fr, delimba browserului
data-greetingtext afișat înainte să înceapă apelul—
data-variables / data-metadataobiecte JSON—
data-auto-opentrue / falsefalse
data-brandingfalse ascunde atribuireatrue
data-z-indexnumăr întreg2147483000
data-autofalse ca să montezi din JavaScript în schimbtrue

Un atribut JSON malformat este ignorat, în loc să împiedice montarea widget-ului.

Din JavaScript ​

html
<script src="https://cdn.callagent.dev/widget.js" data-auto="false"></script>
<script>
  const widget = CallAgentWidget.mount({
    publicKey: 'ca_pk_…',
    assistantId: '01J…',
    variant: 'inline',
    target: '#assistant',
    strings: { launcherLabel: 'Call the vet' },   // suprascrie orice string încorporat
  });

  widget.open();
  widget.close();
  widget.destroy();
</script>

widget.client este CallAgent-ul din spate, așa că tool-urile client-side se înregistrează pe el exact ca în SDK.

Izolare ​

Totul se randează într-un Shadow DOM cu all: initial pe :host. Nimic din ce definește widget-ul nu poate ajunge la pagina gazdă, și nimic de pe pagina gazdă — un preflight Tailwind, un reset agresiv — nu poate ajunge înăuntru. Widget-ul adaugă exact un element în document.body și zero foi de stil în document.

Accesibilitate ​

  • Launcher-ul și fiecare control sunt accesibile de la tastatură, cu un inel de focus vizibil.
  • Panoul este role="dialog" aria-modal="true", are un nume accesibil și captează Tab; Escape îl închide și readuce focusul pe launcher.
  • Transcrierea este role="log" aria-live="polite". Rezultatele intermediare refolosesc un singur element în loc să adauge fiecare revizuire, așa că un cititor de ecran nu citește aceeași propoziție de cinci ori.
  • prefers-reduced-motion: reduce dezactivează animația de intrare, pulsul și scroll-ul lin.
  • String-urile furnizate de gazdă sunt escapate, nu injectate ca markup.

Localizare ​

en, ro, fr și de sunt livrate în bundle; un tag regional cade înapoi pe limba lui de bază și apoi pe engleză. Orice string poate fi suprascris prin strings, așa că un client își poate livra propria limbă fără să aștepte o versiune nouă.

Demo ​

bash
pnpm --filter @callagent/web-sdk build
pnpm --filter @callagent/web-sdk demo

apps/web-sdk/demo/index.html montează ambele variante, expune fiecare opțiune ca un control și înregistrează un tool client-side de demonstrație.

Scrisă după cod. Ce nu este încă implementat este marcat ca atare, niciodată descris ca funcțional.