ThunderPhone 2.0 è arrivato.Parti in autonomia, da 2¢/min.Leggi l’annuncio

Widget

Stile

Personalizza l

Il widget viene visualizzato come una barra glassmorfica con temi chiaro e scuro integrati. La personalizzazione è disponibile su tre livelli: prop per le opzioni comuni, proprietà personalizzate CSS per i temi e override delle classi CSS per il controllo completo.


Temi

La prop theme controlla lo schema colori del widget. Applica una classe tp--light o tp--dark alla radice del widget:

<ThunderPhoneWidget
  publishableKey="pk_live_your_publishable_key"
  theme="dark"
/>
TemaClasseDescrizione
'light'tp--lightSfondo chiaro con testo scuro. Predefinito.
'dark'tp--darkSfondo scuro con testo chiaro.

Entrambi i temi utilizzano il design a barra glassmorfica con sfocatura dello sfondo e trasparenza delicata.


Proprietà personalizzate CSS

Il widget espone proprietà personalizzate CSS (variabili) che puoi sovrascrivere per modificare i colori senza intervenire sulle singole classi. Sono definite dalla classe del tema (.tp--light o .tp--dark) applicata alla radice .tp-widget:

ProprietàPredefinito (chiaro)Predefinito (scuro)Descrizione
--tp-accent#000#fffColore di accento: pulsante di avvio, barre della forma d'onda, punto di connessione, testo dello stato connesso. Impostato in linea dalla prop primaryColor.
--tp-bgrgba(255, 255, 255, 0.82)rgba(15, 15, 15, 0.85)Sfondo della barra (traslucido; sfocato da --tp-glass).
--tp-surfacergba(0, 0, 0, 0.04)rgba(255, 255, 255, 0.07)Sfondo del pulsante di disattivazione microfono.
--tp-surface-hoverrgba(0, 0, 0, 0.07)rgba(255, 255, 255, 0.12)Sfondo al passaggio del mouse del pulsante di disattivazione microfono.
--tp-borderrgba(0, 0, 0, 0.08)rgba(255, 255, 255, 0.1)Bordi della barra e dei pulsanti.
--tp-border-hoverrgba(0, 0, 0, 0.14)rgba(255, 255, 255, 0.18)Colore del bordo al passaggio del mouse.
--tp-textrgba(0, 0, 0, 0.88)rgba(255, 255, 255, 0.95)Testo principale (titolo, nome dell'agente).
--tp-text-2rgba(0, 0, 0, 0.5)rgba(255, 255, 255, 0.55)Testo secondario (sottotitolo, riga di stato, timer della chiamata).
--tp-glassblur(32px) saturate(180%)blur(32px) saturate(180%)backdrop-filter che crea l'effetto vetro sulla barra.
--tp-shadowpila di ombre a tre livellipila di ombre a tre livelliIl box-shadow della barra (livelli anello + vicino + lontano).
--tp-shadow-hoverpila di ombre a tre livellipila di ombre a tre livelliDichiarata per l'elevazione al passaggio del mouse; al momento non è applicata da alcuna regola.
--tp-glowinset 0 1px 0 0 rgba(255,255,255,0.5)inset 0 1px 0 0 rgba(255,255,255,0.06)Evidenziazione interna superiore sovrapposta all'ombra della barra.
--tp-connected#059669#34d399Colore dell'indicatore dello stato connesso (punto di stato).
--tp-error#dc2626#fb7185Colore del testo di stato di errore.
--tp-end-bgrgba(239, 68, 68, 0.08)rgba(251, 113, 133, 0.12)Sfondo del pulsante di fine chiamata.
--tp-end-color#ef4444#fb7185Colore dell'icona del pulsante di fine chiamata.
--tp-end-borderrgba(239, 68, 68, 0.12)rgba(251, 113, 133, 0.15)Bordo del pulsante di fine chiamata.
--tp-end-hoverrgba(239, 68, 68, 0.14)rgba(251, 113, 133, 0.2)Sfondo al passaggio del mouse del pulsante di fine chiamata.
--tp-idle-opacity0.40.3Dichiarata per l'attenuazione dello stato inattivo; al momento non è applicata da alcuna regola.

Sovrascrivere le proprietà personalizzate

Imposta il colore di accento tramite la prop primaryColor:

<ThunderPhoneWidget
  publishableKey="pk_live_your_publishable_key"
  primaryColor="#e11d48"
/>

Sovrascrivi le altre proprietà personalizzate con CSS. Usa un selettore a due classi (.tp-widget.tp--light / .tp-widget.tp--dark) affinché la tua regola prevalga sulla classe del tema che definisce i valori predefiniti, indipendentemente dall'ordine del foglio di stile:

.tp-widget.tp--light {
  --tp-bg: rgba(0, 0, 0, 0.9);
  --tp-text: rgba(255, 255, 255, 0.95);
  --tp-text-2: rgba(255, 255, 255, 0.55);
  --tp-border: rgba(255, 255, 255, 0.15);
}

Classi CSS

Tutte le classi del widget hanno il prefisso tp- per evitare conflitti con gli stili esistenti.

ClasseElementoDescrizione
.tp-widgetWrapper radiceContenitore a posizione fissa (position: fixed, angolo impostato dalla prop position, z-index: 9999). Include la classe del tema e le impostazioni del font di base; non ha elementi visivi propri.
.tp--light / .tp--darkModificatori del temaApplicati a .tp-widget insieme al tema; definiscono tutte le proprietà personalizzate --tp-*.
.tp-barLa barraLa pillola glassmorfica: sfondo, sfocatura dello sfondo, bordo, raggio di 99px, ombra. Larga 300px.
.tp-metaBlocco di testoContenitore per tutto il testo -- titolo e sottotitolo quando inattivo, nome e stato dell'agente durante una chiamata.
.tp-nameEtichetta principaleMostra la prop title quando inattivo e il nome dell'agente connesso (con fallback a title) durante una chiamata.
.tp-subSottotitoloLa riga "Disponibile ora" mostrata quando inattivo.
.tp-startPulsante di chiamata inattivoIl pulsante circolare in evidenza per avviare la chiamata (42px). Usa --tp-accent come sfondo.
.tp-dotPunto di connessionePunto in evidenza pulsante mostrato a sinistra della barra durante la connessione.
.tp-wave / .tp-wave--idleForma d'ondaLa forma d'onda a cinque barre. --idle aggiunge l'animazione di respirazione lenta; durante una chiamata le barre reagiscono all'audio.
.tp-buttonPulsanti durante la chiamataStile di base per i controlli durante la chiamata (42px, angoli arrotondati di 12px).
.tp-button-groupRiga di pulsantiRaggruppa i pulsanti di silenziamento e fine chiamata durante una chiamata.
.tp-button--startVariante del pulsante di connessioneVariante con colore in evidenza mostrata durante l'avvio di una chiamata.
.tp-button--muteInterruttore di silenziamentoSilenzia/riattiva il microfono durante una chiamata. Usa --tp-surface.
.tp-button--endPulsante per terminare la chiamataRiaggancia. Usa la palette --tp-end-*.
.tp-button--loadingModificatore di caricamentoAttenua il pulsante durante la connessione.
.tp-icon / .tp-spinIconeDimensionamento delle icone dei pulsanti; tp-spin anima lo spinner di connessione.
.tp-statusBlocco di stato durante la chiamataRacchiude la riga di stato durante gli stati di connessione/connesso/errore.
.tp-status__textRiga di statoTesto dello stato di connessione (ad esempio, "Connessione in corso...") o timer della chiamata. Riceve .tp-status--connected (colore in evidenza) oppure .tp-status--error (colore di errore) in base allo stato.
.tp-status__nameSpazio per il nome dell'agenteParte del blocco di stato, ma non visualizzato nel layout attuale della barra -- il nome dell'agente appare invece in .tp-name.
.tp-status__dotPunto di statoStile del punto pulsante nello stato connesso (usa --tp-connected).

Esempi

Accento personalizzato tramite props

Il modo più semplice per personalizzare il brand del widget:

<ThunderPhoneWidget
  publishableKey="pk_live_your_publishable_key"
  theme="light"
  primaryColor="#059669"
  title="Talk to support"
/>

Colori personalizzati tramite CSS

Sovrascrivi le proprietà personalizzate per avere il pieno controllo dei colori. Ricorda che l'accento proviene dalla prop primaryColor, non dal CSS:

<ThunderPhoneWidget
  publishableKey="pk_live_your_publishable_key"
  primaryColor="#059669"
/>
/* Emerald theme for everything else */
.tp-widget.tp--light {
  --tp-bg: rgba(236, 253, 245, 0.85);
  --tp-text: rgba(6, 78, 59, 0.95);
  --tp-text-2: rgba(4, 120, 87, 0.8);
  --tp-border: rgba(5, 150, 105, 0.2);
}

Dimensioni personalizzate

Ingrandisci o rimpicciolisci il widget regolando le dimensioni della barra, dei pulsanti e del testo:

/* Wider bar */
.tp-bar {
  width: 340px;
}
 
/* Larger buttons (42px by default) */
.tp-start,
.tp-button {
  width: 56px;
  height: 56px;
}
 
/* Larger text */
.tp-name {
  font-size: 16px;
}
 
.tp-sub,
.tp-status__text {
  font-size: 14px;
}

Nascondere le etichette di testo

Tutto il testo del widget si trova in .tp-meta. Nascondilo completamente per mantenere solo la forma d'onda e i pulsanti:

.tp-meta {
  display: none;
}

In alternativa, nascondi singole parti:

/* Hide only the idle "Available now" subtitle */
.tp-sub {
  display: none;
}
 
/* Hide only the in-call status line (connection state / timer) */
.tp-status {
  display: none;
}

Sovrascritture specifiche per tema

Indirizza un tema specifico con la classe del tema:

/* Only affect dark theme */
.tp--dark .tp-start {
  box-shadow: 0 0 20px rgba(255, 255, 255, 0.25);
}
 
/* Only affect light theme */
.tp-widget.tp--light {
  --tp-bg: rgba(255, 255, 255, 0.95);
}

Ambito con className

Quando usi il componente React, passa una prop className per limitare le sovrascritture a una specifica istanza del widget:

<ThunderPhoneWidget
  publishableKey="pk_live_your_publishable_key"
  theme="dark"
  className="support-widget"
/>

Quindi indirizza quella classe nel tuo CSS:

.support-widget.tp--dark {
  --tp-bg: rgba(30, 30, 46, 0.9);
}
 
.support-widget .tp-name {
  font-weight: 700;
}

Questo ti consente di avere più istanze del widget nella stessa pagina con stili diversi. Assegna a ogni istanza il proprio accento tramite la relativa prop primaryColor (il CSS non può sovrascrivere --tp-accent -- viene impostato inline).


Interfaccia utente completamente personalizzata

Se le sovrascritture CSS non sono sufficienti, l'hook headless ti offre il pieno controllo. Fornisci tutto l'HTML e lo stile, mentre useThunderPhone gestisce la sessione vocale. L'hook fornisce inoltre audioLevelRef per creare visualizzazioni reattive all'audio, come le forme d'onda.

import { useThunderPhone } from '@thunderphone/widget'
 
function MyWidget() {
  const phone = useThunderPhone({
    publishableKey: 'pk_live_your_publishable_key',
  })
 
  return (
    <div className="my-totally-custom-widget">
      {/* Your own buttons, animations, layouts -- anything */}
      <button onClick={phone.state === 'connected' ? phone.disconnect : phone.connect}>
        {phone.state === 'connected' ? 'Hang up' : 'Call us'}
      </button>
      {phone.audio}
    </div>
  )
}