Стилизация

Уиджетът се визуализира като стъкломорфна лента с вградени светла и тъмна тема. Персонализирането е достъпно на три нива: props за често срещани опции, персонализирани CSS свойства за теми и заместване на CSS класове за пълен контрол.


Теми

Prop-ът theme управлява цветовата схема на уиджета. Той прилага клас tp--light или tp--dark към корена на уиджета:

<ThunderPhoneWidget
  publishableKey="pk_live_your_publishable_key"
  theme="dark"
/>
ТемаКласОписание
'light'tp--lightСветъл фон с тъмен текст. По подразбиране.
'dark'tp--darkТъмен фон със светъл текст.

И двете теми използват дизайн на стъкломорфна лента със замъгляване на фона и деликатна прозрачност.


Персонализирани CSS свойства

Уиджетът предоставя персонализирани CSS свойства (променливи), които можете да презапишете, за да промените цветовете, без да променяте отделни класове. Те се дефинират от класа на темата (.tp--light или .tp--dark), приложен към корена .tp-widget:

СвойствоПо подразбиране (светла)По подразбиране (тъмна)Описание
--tp-accent#000#fffАкцентен цвят: бутон за стартиране, ленти на звуковата вълна, точка за свързване, текст за състояние на свързване. Задава се инлайн чрез пропа primaryColor.
--tp-bgrgba(255, 255, 255, 0.82)rgba(15, 15, 15, 0.85)Фон на лентата (полупрозрачен; замъглява се от --tp-glass).
--tp-surfacergba(0, 0, 0, 0.04)rgba(255, 255, 255, 0.07)Фон на бутона за заглушаване.
--tp-surface-hoverrgba(0, 0, 0, 0.07)rgba(255, 255, 255, 0.12)Фон на бутона за заглушаване при посочване.
--tp-borderrgba(0, 0, 0, 0.08)rgba(255, 255, 255, 0.1)Контури на лентата и бутоните.
--tp-border-hoverrgba(0, 0, 0, 0.14)rgba(255, 255, 255, 0.18)Цвят на контура при посочване.
--tp-textrgba(0, 0, 0, 0.88)rgba(255, 255, 255, 0.95)Основен текст (заглавие, име на агента).
--tp-text-2rgba(0, 0, 0, 0.5)rgba(255, 255, 255, 0.55)Вторичен текст (подзаглавие, ред за състояние, таймер на разговора).
--tp-glassblur(32px) saturate(180%)blur(32px) saturate(180%)backdrop-filter, който създава стъкления ефект върху лентата.
--tp-shadowстек от сенки с три слоястек от сенки с три слояbox-shadow на лентата (пръстен + близък + далечен слой).
--tp-shadow-hoverстек от сенки с три слоястек от сенки с три слояДекларирано за повдигане при посочване; понастоящем не се прилага от никое правило.
--tp-glowinset 0 1px 0 0 rgba(255,255,255,0.5)inset 0 1px 0 0 rgba(255,255,255,0.06)Вътрешен горен акцент, добавен като слой към сянката на лентата.
--tp-connected#059669#34d399Цвят на индикатора за състояние на свързване (точка за състояние).
--tp-error#dc2626#fb7185Цвят на текста за състояние при грешка.
--tp-end-bgrgba(239, 68, 68, 0.08)rgba(251, 113, 133, 0.12)Фон на бутона за прекратяване на разговора.
--tp-end-color#ef4444#fb7185Цвят на иконата на бутона за прекратяване на разговора.
--tp-end-borderrgba(239, 68, 68, 0.12)rgba(251, 113, 133, 0.15)Контур на бутона за прекратяване на разговора.
--tp-end-hoverrgba(239, 68, 68, 0.14)rgba(251, 113, 133, 0.2)Фон на бутона за прекратяване на разговора при посочване.
--tp-idle-opacity0.40.3Декларирано за затъмняване в неактивно състояние; понастоящем не се прилага от никое правило.

Презаписване на персонализирани свойства

Задайте акцентния цвят чрез пропа primaryColor:

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

Презапишете останалите персонализирани свойства с CSS. Използвайте селектор с два класа (.tp-widget.tp--light / .tp-widget.tp--dark), така че вашето правило да има предимство пред класа на темата, който дефинира стойностите по подразбиране, независимо от реда в стиловата таблица:

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

CSS класове

Всички класове на уиджета са с префикс tp-, за да се избегнат конфликти със съществуващите ви стилове.

КласЕлементОписание
.tp-widgetОсновна обвивкаКонтейнер с фиксирана позиция (position: fixed, ъгълът се задава от пропа position, z-index: 9999). Съдържа класа за темата и основните настройки за шрифта; няма собствена визуална рамка.
.tp--light / .tp--darkМодификатори на тематаПрилагат се към .tp-widget заедно с темата; дефинират всички персонализирани свойства --tp-*.
.tp-barЛентаСамата стъклоподобна капсула: фон, размазване на фона, рамка, радиус 99px, сянка. Ширина 300px.
.tp-metaТекстов блокКонтейнер за целия текст — заглавие и подзаглавие в неактивно състояние, име и статус на агента по време на разговор.
.tp-nameОсновен етикетПоказва пропа title в неактивно състояние и името на свързания агент (като използва title при липса на име) по време на разговор.
.tp-subПодзаглавиеРедът „Налично сега“, показван в неактивно състояние.
.tp-startБутон за обаждане в неактивно състояниеКръглият акцентен бутон за стартиране (42px). Използва --tp-accent за фон.
.tp-dotТочка за свързванеПулсираща акцентна точка, показвана вляво от лентата при свързване.
.tp-wave / .tp-wave--idleВълнова формаВълновата форма с пет ленти. --idle добавя бавна анимация на пулсиране; по време на разговор лентите реагират на аудиото.
.tp-buttonБутони по време на разговорБазов стил за контролите по време на разговор (42px, заобляне 12px).
.tp-button-groupРед с бутониОбвива бутоните за заглушаване и прекратяване по време на разговор.
.tp-button--startВариант на бутона за свързванеВариант с акцентен цвят, показван при стартиране на разговор.
.tp-button--muteПревключвател за заглушаванеЗаглушава/включва микрофона по време на разговор. Използва --tp-surface.
.tp-button--endБутон за прекратяване на разговорПрекратява разговора. Използва палитрата --tp-end-*.
.tp-button--loadingМодификатор за зарежданеЗатъмнява бутона при свързване.
.tp-icon / .tp-spinИкониРазмер на иконите на бутоните; tp-spin анимира индикатора за свързване.
.tp-statusБлок за статус по време на разговорОбвива реда за статус при състояния на свързване/свързан/грешка.
.tp-status__textРед за статусТекст за състоянието на връзката (например „Свързване...“) или таймерът на разговора. Получава .tp-status--connected (акцентен цвят) или .tp-status--error (цвят за грешка) според състоянието.
.tp-status__nameПоле за име на агентЧаст от блока за статус, но не се визуализира в текущото оформление на лентата — името на агента се показва в .tp-name.
.tp-status__dotТочка за статусСтил за пулсираща точка при свързано състояние (използва --tp-connected).

Примери

Персонализиран акцент чрез пропсове

Най-лесният начин да брандирате уиджета:

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

Персонализирани цветове чрез CSS

Заменете персонализираните свойства за пълен контрол върху цветовете. Имайте предвид, че акцентът идва от пропса primaryColor, а не от 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);
}

Персонализиран размер

Направете уиджета по-голям или по-малък, като коригирате размерите на лентата, бутоните и текста:

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

Скриване на текстовите етикети

Целият текст на уиджета се намира в .tp-meta. Скрийте го изцяло, за да запазите само формата на вълната и бутоните:

.tp-meta {
  display: none;
}

Или скрийте отделни части:

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

Замени за конкретна тема

Насочете се към конкретна тема чрез класа на темата:

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

Обхват чрез className

Когато използвате React компонента, подайте пропс className, за да ограничите замените си до конкретен екземпляр на уиджета:

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

След това насочете този клас във вашия CSS:

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

.support-widget .tp-name {
  font-weight: 700;
}

Това ви позволява да имате няколко екземпляра на уиджета на една и съща страница с различни стилове. Задайте на всеки екземпляр собствен акцент чрез неговия пропс primaryColor (CSS не може да замени --tp-accent -- той се задава вградeно).


Напълно персонализиран интерфейс

Ако CSS замените не са достатъчни, headless hook ви дава пълен контрол. Вие предоставяте целия HTML и стилизиране, докато useThunderPhone управлява гласовата сесия. Hook-ът предоставя и audioLevelRef за изграждане на аудиореактивни визуализации, като форми на вълната.

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