Your integrations keep one visual language while respecting native layout, accessibility and operating-system preferences.
Respect motion and native layout
Do not force animations by default. When the option is omitted, the web and native SDKs follow the current system reduced-motion preference. If your product has an explicit accessible motion setting, pass that user choice deliberately and keep it synchronized with the host.
The native presenter owns safe areas, keyboard movement, focus and platform transitions. Keep host controls outside the presented surface and hide an app-owned launcher while the widget is open so two controls do not compete for the same action.
Localize built-in and host-authored copy
The built-in native UI ships with en, uk, de and es. The web widget ships with en, uk, de, es, fr and pt. The native appearance contract lets a lower-level native renderer override the main widget UI copy keys, so a native surface can show French or Portuguese main UI text. This does not provide a complete French or Portuguese SDK locale: derived labels such as author-role labels, procedure and validation statuses and other generated UI still follow the built-in locale catalog.
Framework wrappers keep presentWidget options intentionally small: locale, title and subtitle. Do not treat those wrapper options as a full copy catalog or claim that native UI has the web widget's six built-in locales. A copy override does not expand the SDK locale enum, change number or date formatting or translate authored or server-authored content.
Localize authored FAQ entries, messages and other customer content in your own application or backend. Use the same appearance and copy contract across platform reference pages, then keep platform-specific overrides narrow.
Update appearance without losing work
- Apply a runtime appearance update only after validating the complete object against the published schema and contrast limits.
- Check the rendered widget in light, dark, system and reduced-motion modes. Confirm that the active conversation and composer draft remain intact after the update.
- Keep unknown platform keys out of the shared object. A rejected update should leave the last valid appearance in place and show a recoverable host error.