স্টাইলিং

উইজেটটি বিল্ট-ইন হালকা ও গাঢ় থিমসহ একটি গ্লাসমরফিক বার হিসেবে রেন্ডার হয়। তিনটি স্তরে কাস্টমাইজেশন উপলভ্য: সাধারণ বিকল্পের জন্য props, থিমিংয়ের জন্য CSS কাস্টম প্রপার্টি এবং সম্পূর্ণ নিয়ন্ত্রণের জন্য CSS ক্লাস ওভাররাইড।


থিম

theme prop উইজেটের রঙের স্কিম নিয়ন্ত্রণ করে। এটি উইজেট রুটে একটি tp--light বা tp--dark ক্লাস প্রয়োগ করে:

<ThunderPhoneWidget
  publishableKey="pk_live_your_publishable_key"
  theme="dark"
/>
থিমক্লাসবিবরণ
'light'tp--lightগাঢ় টেক্সটসহ হালকা ব্যাকগ্রাউন্ড। ডিফল্ট।
'dark'tp--darkহালকা টেক্সটসহ গাঢ় ব্যাকগ্রাউন্ড।

উভয় থিমই ব্যাকড্রপ ব্লার এবং সূক্ষ্ম স্বচ্ছতাসহ গ্লাসমরফিক বার ডিজাইন ব্যবহার করে।


CSS কাস্টম প্রোপার্টি

উইজেটটি CSS কাস্টম প্রোপার্টি (ভেরিয়েবল) প্রকাশ করে, যা আপনি পৃথক ক্লাস পরিবর্তন না করেই রং বদলাতে ওভাররাইড করতে পারেন। এগুলো .tp-widget রুটে প্রয়োগ করা থিম ক্লাস (.tp--light বা .tp--dark) দ্বারা সংজ্ঞায়িত হয়:

প্রোপার্টিডিফল্ট (হালকা)ডিফল্ট (গাঢ়)বিবরণ
--tp-accent#000#fffঅ্যাকসেন্ট রং: শুরু বোতাম, ওয়েভফর্ম বার, সংযোগের বিন্দু, সংযুক্ত-স্ট্যাটাসের টেক্সট। primaryColor prop থেকে inline হিসেবে সেট করা হয়।
--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 prop ব্যবহার করে অ্যাকসেন্ট রং সেট করুন:

<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 prop দ্বারা নির্ধারিত কোণ, z-index: 9999)। থিম ক্লাস এবং মৌলিক ফন্ট সেটিং বহন করে; নিজস্ব কোনো ভিজ্যুয়াল ক্রোম নেই।
.tp--light / .tp--darkথিম মডিফায়ারথিমের পাশাপাশি .tp-widget-এ প্রয়োগ করা হয়; সব --tp-* কাস্টম প্রপার্টি নির্ধারণ করে।
.tp-barবারগ্লাসমরফিক পিলটি নিজেই: ব্যাকগ্রাউন্ড, ব্যাকড্রপ ব্লার, বর্ডার, 99px রেডিয়াস, শ্যাডো। প্রস্থ 300px
.tp-metaটেক্সট ব্লকসব টেক্সটের কন্টেইনার -- নিষ্ক্রিয় অবস্থায় শিরোনাম ও উপশিরোনাম, কলে এজেন্টের নাম ও স্ট্যাটাস।
.tp-nameপ্রাথমিক লেবেলনিষ্ক্রিয় অবস্থায় title prop দেখায়, এবং কলে সংযুক্ত এজেন্টের নাম দেখায় (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 ব্যবহার করে)।

উদাহরণ

Props-এর মাধ্যমে কাস্টম অ্যাকসেন্ট

উইজেট ব্র্যান্ড করার সবচেয়ে সহজ উপায়:

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

CSS-এর মাধ্যমে কাস্টম রং

সম্পূর্ণ রঙ নিয়ন্ত্রণের জন্য কাস্টম প্রপার্টিগুলো ওভাররাইড করুন। মনে রাখবেন, অ্যাকসেন্টটি CSS থেকে নয়, primaryColor prop থেকে আসে:

<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 prop পাস করুন:

<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 prop-এর মাধ্যমে নিজস্ব অ্যাকসেন্ট দিন (CSS --tp-accent ওভাররাইড করতে পারে না -- এটি ইনলাইনে সেট করা হয়)।


সম্পূর্ণ কাস্টম UI

CSS ওভাররাইড যথেষ্ট না হলে, হেডলেস হুক আপনাকে সম্পূর্ণ নিয়ন্ত্রণ দেয়। আপনি সব HTML ও স্টাইলিং প্রদান করেন, আর useThunderPhone ভয়েস সেশন পরিচালনা করে। ওয়েভফর্মের মতো অডিও-প্রতিক্রিয়াশীল ভিজ্যুয়ালাইজেশন তৈরির জন্য হুকটি 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>
  )
}