ThunderPhone 2.0 kini resmi hadir.Layanan mandiri, mulai dari 2¢/menit.Baca pengumumannya

Widget

Penataan gaya

Sesuaikan tampilan widget suara ThunderPhone dengan CSS

Widget dirender sebagai bilah bergaya glassmorphism dengan tema terang dan gelap bawaan. Kustomisasi tersedia dalam tiga tingkat: prop untuk opsi umum, properti kustom CSS untuk tema, dan override class CSS untuk kontrol penuh.


Tema

Prop theme mengontrol skema warna widget. Prop ini menerapkan class tp--light atau tp--dark ke elemen akar widget:

<ThunderPhoneWidget
  publishableKey="pk_live_your_publishable_key"
  theme="dark"
/>
TemaClassDeskripsi
'light'tp--lightLatar belakang terang dengan teks gelap. Default.
'dark'tp--darkLatar belakang gelap dengan teks terang.

Kedua tema menggunakan desain bilah bergaya glassmorphism dengan blur latar belakang dan transparansi halus.


Properti Kustom CSS

Widget mengekspos properti kustom CSS (variabel) yang dapat Anda timpa untuk mengubah warna tanpa menyentuh setiap class. Properti ini ditentukan oleh class tema (.tp--light atau .tp--dark) yang diterapkan pada root .tp-widget:

PropertiDefault (terang)Default (gelap)Deskripsi
--tp-accent#000#fffWarna aksen: tombol mulai, batang waveform, titik penghubung, teks status terhubung. Ditentukan secara inline dari prop primaryColor.
--tp-bgrgba(255, 255, 255, 0.82)rgba(15, 15, 15, 0.85)Latar belakang bar (translusen; diburamkan oleh --tp-glass).
--tp-surfacergba(0, 0, 0, 0.04)rgba(255, 255, 255, 0.07)Latar belakang tombol bisukan.
--tp-surface-hoverrgba(0, 0, 0, 0.07)rgba(255, 255, 255, 0.12)Latar belakang hover tombol bisukan.
--tp-borderrgba(0, 0, 0, 0.08)rgba(255, 255, 255, 0.1)Batas bar dan tombol.
--tp-border-hoverrgba(0, 0, 0, 0.14)rgba(255, 255, 255, 0.18)Warna batas saat hover.
--tp-textrgba(0, 0, 0, 0.88)rgba(255, 255, 255, 0.95)Teks utama (judul, nama agen).
--tp-text-2rgba(0, 0, 0, 0.5)rgba(255, 255, 255, 0.55)Teks sekunder (subjudul, baris status, timer panggilan).
--tp-glassblur(32px) saturate(180%)blur(32px) saturate(180%)backdrop-filter yang menciptakan efek kaca pada bar.
--tp-shadowtumpukan bayangan tiga lapisantumpukan bayangan tiga lapisanbox-shadow bar (lapisan cincin + dekat + jauh).
--tp-shadow-hovertumpukan bayangan tiga lapisantumpukan bayangan tiga lapisanDideklarasikan untuk elevasi saat hover; saat ini tidak diterapkan oleh aturan apa pun.
--tp-glowinset 0 1px 0 0 rgba(255,255,255,0.5)inset 0 1px 0 0 rgba(255,255,255,0.06)Sorotan atas bagian dalam yang dilapiskan pada bayangan bar.
--tp-connected#059669#34d399Warna indikator status terhubung (titik status).
--tp-error#dc2626#fb7185Warna teks status keadaan error.
--tp-end-bgrgba(239, 68, 68, 0.08)rgba(251, 113, 133, 0.12)Latar belakang tombol akhiri panggilan.
--tp-end-color#ef4444#fb7185Warna ikon tombol akhiri panggilan.
--tp-end-borderrgba(239, 68, 68, 0.12)rgba(251, 113, 133, 0.15)Batas tombol akhiri panggilan.
--tp-end-hoverrgba(239, 68, 68, 0.14)rgba(251, 113, 133, 0.2)Latar belakang hover tombol akhiri panggilan.
--tp-idle-opacity0.40.3Dideklarasikan untuk peredupan keadaan idle; saat ini tidak diterapkan oleh aturan apa pun.

Menimpa Properti Kustom

Atur warna aksen melalui prop primaryColor:

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

Timpa properti kustom lainnya dengan CSS. Gunakan selector dua class (.tp-widget.tp--light / .tp-widget.tp--dark) agar aturan Anda memiliki prioritas lebih tinggi daripada class tema yang menentukan default, terlepas dari urutan stylesheet:

.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);
}

Kelas CSS

Semua kelas widget diawali dengan tp- untuk menghindari konflik dengan gaya yang sudah ada.

KelasElemenDeskripsi
.tp-widgetWrapper rootContainer berposisi tetap (position: fixed, sudut ditetapkan oleh prop position, z-index: 9999). Memuat kelas tema dan pengaturan font dasar; tidak memiliki elemen visual sendiri.
.tp--light / .tp--darkModifier temaDiterapkan pada .tp-widget bersama tema; menentukan semua properti kustom --tp-*.
.tp-barBarElemen pil glassmorphism itu sendiri: latar belakang, blur latar, border, radius 99px, bayangan. Lebar 300px.
.tp-metaBlok teksContainer untuk semua teks -- judul dan subjudul saat siaga, nama agen dan status selama panggilan.
.tp-nameLabel utamaMenampilkan prop title saat siaga, serta nama agen yang terhubung (kembali ke title jika tidak tersedia) selama panggilan.
.tp-subSubjudulBaris "Tersedia sekarang" yang ditampilkan saat siaga.
.tp-startTombol panggilan saat siagaTombol mulai beraksen berbentuk lingkaran (42px). Menggunakan --tp-accent sebagai latar belakang.
.tp-dotTitik penghubungTitik aksen berdenyut yang ditampilkan di sebelah kiri bar saat menghubungkan.
.tp-wave / .tp-wave--idleBentuk gelombangBentuk gelombang lima batang. --idle menambahkan animasi bernapas yang lambat; selama panggilan, batang merespons audio.
.tp-buttonTombol saat panggilanGaya dasar untuk kontrol saat panggilan (42px, sudut membulat 12px).
.tp-button-groupBaris tombolMembungkus tombol bisukan dan akhiri selama panggilan.
.tp-button--startVarian tombol hubungkanVarian berwarna aksen yang ditampilkan saat panggilan dimulai.
.tp-button--muteTombol bisukanMembisukan/mengaktifkan suara mikrofon selama panggilan. Menggunakan --tp-surface.
.tp-button--endTombol akhiri panggilanMengakhiri panggilan. Menggunakan palet --tp-end-*.
.tp-button--loadingModifier pemuatanMeredupkan tombol saat menghubungkan.
.tp-icon / .tp-spinIkonPengaturan ukuran ikon tombol; tp-spin menganimasikan spinner penghubung.
.tp-statusBlok status saat panggilanMembungkus baris status selama status menghubungkan/terhubung/error.
.tp-status__textBaris statusTeks status koneksi (misalnya, "Menghubungkan...") atau timer panggilan. Mendapatkan .tp-status--connected (warna aksen) atau .tp-status--error (warna error) sesuai status.
.tp-status__nameSlot nama agenBagian dari blok status, tetapi tidak dirender dalam tata letak bar saat ini -- nama agen ditampilkan di .tp-name.
.tp-status__dotTitik statusGaya titik status terhubung yang berdenyut (menggunakan --tp-connected).

Contoh

Aksen Kustom melalui Prop

Cara paling sederhana untuk memberi identitas merek pada widget:

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

Warna Kustom melalui CSS

Timpa properti kustom untuk kontrol warna penuh. Ingat bahwa aksen berasal dari prop primaryColor, bukan 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);
}

Ukuran Kustom

Buat widget lebih besar atau lebih kecil dengan menyesuaikan dimensi bilah, tombol, dan teks:

/* 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;
}

Sembunyikan Label Teks

Semua teks widget berada di .tp-meta. Sembunyikan seluruhnya agar hanya waveform dan tombol yang tersisa:

.tp-meta {
  display: none;
}

Atau sembunyikan bagian tertentu:

/* 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;
}

Override Khusus Tema

Targetkan tema tertentu dengan kelas 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);
}

Pembatasan Cakupan dengan className

Saat menggunakan komponen React, teruskan prop className untuk membatasi cakupan override Anda ke instance widget tertentu:

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

Kemudian targetkan kelas tersebut dalam CSS Anda:

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

Ini memungkinkan Anda memiliki beberapa instance widget pada halaman yang sama dengan gaya berbeda. Berikan setiap instance aksennya sendiri melalui prop primaryColor (CSS tidak dapat menimpa --tp-accent -- properti ini ditetapkan secara inline).


UI Sepenuhnya Kustom

Jika override CSS belum cukup, hook headless memberi Anda kontrol penuh. Anda menyediakan semua HTML dan styling, sementara useThunderPhone menangani sesi suara. Hook ini juga menyediakan audioLevelRef untuk membuat visualisasi reaktif terhadap audio seperti waveform.

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>
  )
}