การปรับสไตล์

วิดเจ็ตแสดงผลเป็นแถบสไตล์กลาสมอร์ฟิก พร้อมธีมสว่างและมืดในตัว การปรับแต่งมีให้ใช้งาน 3 ระดับ ได้แก่ พร็อพสำหรับตัวเลือกทั่วไป CSS custom properties สำหรับกำหนดธีม และการแทนที่ CSS class เพื่อการควบคุมอย่างเต็มรูปแบบ


ธีม

พร็อพ theme ควบคุมโครงร่างสีของวิดเจ็ต โดยจะใช้ class tp--light หรือ tp--dark กับรากของวิดเจ็ต:

<ThunderPhoneWidget
  publishableKey="pk_live_your_publishable_key"
  theme="dark"
/>
ธีมClassคำอธิบาย
'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สแต็กเงา 3 ชั้นสแต็กเงา 3 ชั้นbox-shadow ของแถบ (ชั้นวงแหวน + ชั้นใกล้ + ชั้นไกล)
--tp-shadow-hoverสแต็กเงา 3 ชั้นสแต็กเงา 3 ชั้นกำหนดไว้สำหรับการยกระดับเมื่อวางเมาส์ แต่ปัจจุบันยังไม่มีการใช้โดยกฎใด
--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 ใช้ตัวเลือกแบบ 2 คลาส (.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 ได้ -- ค่านี้ถูกตั้งค่าแบบอินไลน์)


UI แบบกำหนดเองทั้งหมด

หากการแทนที่ด้วย 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>
  )
}