Customize
Brand the widget once in the console, or per embed in code.
Saved branding (recommended)
Console → Widget → Customize sets logo, colors, font, radius, layout and every string for the business, with a live preview and a contrast check. It applies to every session — web and native — with no code change.
Per-embed overrides
Pass theme and labels to override the saved branding for one embed:
<VerifyWidget
token={token}
theme={{
mode: "auto", // auto | light | dark — auto follows the OS, live
primary: "#4f46e5",
primaryText: "#ffffff",
radius: 12, // 0–24
font: "system", // system | serif | mono | rounded
density: "compact", // comfortable | compact
align: "left", // center | left
surface: "plain", // card | plain (no border/background, blends in)
poweredBy: false,
logo: "https://cdn.example.com/logo.svg", // https only
}}
labels={{
title: "Confirm your phone",
subtitle: "Enter the {length}-digit code sent to {target}.",
submit: "Continue",
}}
/>Changing theme or labels later restyles the open widget without restarting
it (handle.update({ theme, labels }) with openWidget).
Theme
| Key | Values |
|---|---|
primary primaryText background foreground muted border danger success | any CSS color |
mode | auto · light · dark |
font | system · serif · mono · rounded |
radius | 0–24 (px) |
density · align · surface | see above |
poweredBy | true / false |
logo | public https URL, ≤ 512 chars |
Labels
title, subtitle, submit, resend, resendIn, success, invalid,
expired, sessionOver, testBanner — up to 160 characters each.
Placeholders: {target} {length} {seconds} {attempts}.
Use labels for localisation:
const labels = locale === "km"
? { title: "ផ្ទៀងផ្ទាត់លេខទូរស័ព្ទ", submit: "បន្ត" }
: undefined // saved brandingSafe by construction
Every value is validated twice — in the console and again inside the frame. Colors must parse as colors, labels are rendered as text (never HTML), and the logo is the only image origin the frame's CSP allows. Invalid values are ignored.
Message wording
The SMS/email text is not widget branding — it's a template. Create one per
channel in Console → Templates and mark it default; widget sessions use the
channel default (or a raw template passed when creating the session).
Variables: {{code}}, {{app_name}}, {{minutes}}.