SDK UI Customization Guide
The Entrust IDV SDKs introduced in 2025 bring an updated design system for the SDK's UI, which offers new customization options to integrators.
This guide lists the customization options offered via the SDK's theme interface.
The Entrust IDV SDK design system, named Castor, is available publicly for exploration.
Preface - features not yet available
The SDK UI customization framework will introduce additional capabilities over time, with the following features shortlisted for upcoming releases in 2026:
- Font and text style customization
- Ability to align text and components across the screen
- Ability to set individual left/right/up/bottom padding and border on text and components
- Ability to change default images and icons
- Ability to provide a custom spinner (currently only colors can be modified)
How to customize the SDK's UI
The SDK UI customization framework described in this guide has expanded its scope compared to its predecessor available for the Onfido Smart Capture SDKs. The new framework introduces the following key features:
- The same UI tokens can be used uniformly across all Entrust IDV SDKs (Web, iOS, Android, React Native, Flutter)
- The overall framework allows the customization of core assets such as icons, images, animations and fonts
- A comprehensive structure is provided to avoid undue duplication of keys and values
The theme interface
Until a dedicated customization dashboard is introduced in Workflow Studio in 2026, the UI customization framework can be used via the SDK's theme configuration interface. This configuration object currently consists of the following major and optional parts:
mode: optionally set to eitherLightorDark. Used to pre-select the SDK UI's themelightColors/darkColors: centralized color references that can automatically be used across the SDK's screens
1override fun onCreate(savedInstanceState: Bundle?) {2 ...3 EntrustIdv.start(4 ...5 configuration = Configuration(6 ...7 theme = Theme(8 ...9 mode = ThemeMode.Light,10 lightColors = mapOf(11 ColorTokens.BackgroundColorBrandDefault to "#FF00FF85",12 ColorTokens.ContentColorBase to "#0B1B0B",13 ),14 darkColors = mapOf(15 ColorTokens.BackgroundColorBrandDefault to "#0000FF85",16 ColorTokens.ContentColorBase to "#FF1CFF",17 ),18 ))19 )20}
1EntrustIdv(2 ...3 configuration: .init(4 ...5 theme: .init(6 ...7 mode: ThemeMode.light,8 lightColors: [9 ColorTokens.backgroundColorBrandDefault: "#FF00FF85",10 ColorTokens.contentColorBase: "#0B1B0B"11 ],12 darkColors: [13 ColorTokens.backgroundColorBrandDefault: "#0000FF85",14 ColorTokens.contentColorBase: "#FF1CFF"15 ],16 ))17 )
1entrustIdv.start({2 ...3 configuration: {4 ...5 theme: {6 ...7 mode: ThemeMode.Light,8 lightColors: {9 backgroundColorBrandDefault: '#FF00FF85',10 contentColorBase: '#0b1c0b'11 },12 darkColors: {13 backgroundColorBrandDefault: '#0000FF85',14 contentColorBase: '#FF1cFF'15 }16 },17 }18});
Details are provided in the Entrust IDV SDK integration guide.
Base color selection and themes (lightColors / darkColors)
To avoid repeating color override across multiple UI components, the SDK's lightColors / darkColors interface can be used to configure colors centrally.
By modifying a color value in both colors sets, all component-level tokens derived from them will be affected.
Integrators would then only need to use the component-specific overrides for exceptions to standard coloring patterns, such as for extra brand emphasis.
For example, modifying the color set for the background-color.brand.default token in the lightColors and darkColors will apply that color to all component-specific tokens that are assigned the background-color.brand.default token, such as the background color of the primary button and spinner's main color.
The mapping between the base tokens and component-specific areas is listed in the Components section below.
The full list of available lightColors / darkColors tokens is listed in the Base colors section below.
Unless predefined in the SDK's theme/mode configuration, the UI's theme
(Dark or Light mode) is automatically determined by the SDK based on the
device (or browser) settings. As such, the customization interface is mirrored
for both themes for lightColors and darkColors. It is therefore critical
to implement default colors for both lightColors and darkColors as the
SDK will make use of both sets of colors across the experience (our capture
screens are always rendered in dark mode).
Base colors
Base colors are divided in three categories:
content-color: affects the 'foreground' color of a component such as its text or iconbackground-color: affects the color of the background or surface area of a componentborder-color: affects the color of the outer line of a component
Loading...
Note:
- Each token can be assigned a color value in
hexformat (e.g. '#FFFFFF' for white). Colors can also be provided as 8-character values to account for transparency (e.g. '#FFFFFF85' for white with 50% opacity/transparency) - Colors assigned to both
lightanddarkthemes should provide sufficient contrast for accessibility purposes. It is also recommended to provide sufficient differentiation for thehoverandactivecolor variants
General Screen Background, Text & Border
The overall screen background, overlay and border colors can be customized by modifying the base color tokens defined in the table below.
| Color Area | Base Color Token | Light (HEX) | Dark (HEX) | Description |
|---|---|---|---|---|
| background-color | background-color.surface.primary.default | #22262C | #FFFFFF | General background color of the screen |
| background-color | background-color.overlay | #0A0D11CC | #0A0D11CC | Background color of the dark screen overlay visible in the capture screens and when a screen pop-up is shown |
| background-color | background-color.main | #22262C | #FFFFFF | Background color of the area outside of the main screen (only visible on wide screens) |
| border-color | border-color.separator | #53565C | #E9EBEF | Border color of the screen (only visible on wide screens) and any horizontal separator lines |
Additionally, the color of the main text elements can be customized by modifying the following base color tokens:
| Color Area | Base Color Token | Light (HEX) | Dark (HEX) | Description |
|---|---|---|---|---|
| content-color | content-color.base | #0A0D11 | #FFFFFF | Color of the body of text and titles |
| content-color | content-color.subtle | #53565C | #FFD25C | Secondary text color applied to field descriptions and supporting icons |
| content-color | content-color.negative.base.default | #D31127 | #FEC9C4 | Text color used for input validation errors |
| content-color | content-color.placeholder | #63676D | #92959B | Color used for placeholder text within input fields |
Note: The color of text or icons within particular components such as buttons or banners is driven by potentially more specific color tokens as defined in the following sections of this guide.
Key Components
This section presents the components available across the Entrust IDV SDK screens. If you require customization capabilities beyond the scope described in this document, please contact your Customer Success Manager.
Buttons
While the behaviour of buttons is consistent across screens and platforms, colors are driven by a button's 'variant':
| Variant | Example |
|---|---|
| Primary | ![]() |
| Secondary | ![]() |
| Tertiary | ![]() |
| Negative Secondary | ![]() |
| Negative Tertiary | ![]() |
The buttons are currently used in the following parts of the UI:
| Use Case | Description | Variant |
|---|---|---|
| Button Dock | Call To Action buttons located in most screens | primary and secondary |
| (Web SDK) Cross-device | Button on the cross-device desktop QR code screen to display more information | tertiary |
| (Web SDK) Cross-device | Button on the cross-device mobile 'Confirmation' screen for "It's not me" | negative-secondary |
| (Web SDK) Cross-device | Button on the cross-device mobile 'Confirmation' screen for "It's not me" | negative-tertiary |
| Navigation Bar | Back and Close buttons | tertiary |
| Intro screens | Buttons to control the playback of animation on instruction screens | primary |
Note: In the current SDK iteration, it is not possible to replace 'transparent' colors
Loading...
Button Dock

The button-dock is the container at the bottom of most screens that contains either one or two buttons.
In addition to customizing the buttons as defined in the section above, the Button Dock has the following customization options:
| Color Area | Base Color Token | Light (HEX) | Dark (HEX) | Description |
|---|---|---|---|---|
| background-color | background-color.surface.primary.default | #FFFFFF | #22262C | Surface color behind/around the buttons |
| border-color | border-color.separator | #E9EBEF | #53565C | Color of the upper border of the Button Dock |
Note: The relative position of buttons (stacked or side-by-side) is automatically controlled by the width of the available screen area
Navigation Bar

The navigation-bar is the container at the top of screens that may contain the Back and Exit buttons.
In addition to customizing the bottom as defined in the Buttons section, the Navigation Bar has the following customization options:
| Color Area | Base Color Token | Light (HEX) | Dark (HEX) | Description |
|---|---|---|---|---|
| background-color | background-color.surface.primary.default | #FFFFFF | #22262C | Surface color behind/around the buttons |
| border-color | border-color.separator | #E9EBEF | #53565C | Color of the bottom border of the Navigation Bar |
Banner
The banner component is used to callout key instructions or live feedback to the user across the UI flow.
| Variant | Use Case | |
|---|---|---|
info | User callout on introduction or instruction screens | ![]() |
warning | User warning appearing during the capture experience or in confirmation screens | ![]() |
error | User error appearing during the capture experience or in confirmation screens | ![]() |
Notes:
- The icons currently used within the Banner component cannot be changed
- Capture screens (live camera feeds) are always displayed in dark mode to provide an optimal user experience
The banner component is composed of an overall border, a message and an optional icon.
Loading...
Spinner
The spinner component is present on all loading and waiting screens of the SDK.

| Color Area | Base Color Token | Light (HEX) | Dark (HEX) | Description |
|---|---|---|---|---|
| background-color | background-color.brand.default | #4462E4 | #4462E4 | Color of the 'progress' section of the spinner |
| background-color | background-color.neutral.subtle.default | #E9EBEF | #3F454F | Color of the 'track' section of the spinner |
| content-color | content-color.subtle | #53565C | #D6D8DB | Color of any possible supporting text |
Note: On Android, the spinner component of the first loading screen (when the SDK is being initialized) only contains a 'progress' section.
Status Icon Tile
The icon-tile component is the large icon present on status screens. It exists in three main variants:
| Use Case | Description | Variant | Example |
|---|---|---|---|
| Confirmation Screen | 'Green tick' when the user has successfully completed a task | positive | |
| Permissions Screen | Icon representing the required permission type | neutral | |
| Error Screen | 'Red exclamation mark' shown on error screens | negative |
The icon and background colors can be customized for each variant:
| Variant | Color Area | Base Color Token | Light (HEX) | Dark (HEX) |
|---|---|---|---|---|
positive | background-color | background-color.positive.subtle.default | #D7F6C8 | #225123 |
positive | content-color | content-color.positive.base.default | #36860F | #B2ED73 |
neutral | background-color | background-color.neutral.subtle.default | #E9EBEF | #3F454F |
neutral | content-color | content-color.subtle | #53565C | #D6D8DB |
negative | background-color | background-color.negative.subtle.default | #FFE4E1 | #942C2C |
negative | content-color | content-color.negative.base.default | #D31127 | #FEC9C4 |
Country Selector
The country-select component is present on multiple screens to allow the end user to select a country from a dropdown list or by starting to type in the main input field.
It is also used to select the phone number country prefix.

Loading...
Note: The country flags cannot be edited or replaced.
Selection List
The selection-list component is a custom button list intended to provide end users with multiple choices.

| Use Case | Description |
|---|---|
| Document Type | In the context of Document and Proof of Address, presents the user with a list of document types to choose from |
| Cross-Device Link Method | In the context of cross-device in the Web SDK, selector of the 'link' method available |
| Generic user choice screens | Multiple additional use cases for which the user is given a non-hierarchical choice (e.g. eID selection) |
Note: The individual icons present in the list cannot currently be customized
Text Input Field
The text-input component is used across any screen or component that requires the user to provide a typed value.
Loading...
Checkbox
The checkbox component is a composite element that contains the following sub-components:
- The
containerwhich corresponds to the overall checkbox, offering the customization of the overall border and background colors - The checkbox itself. It is referred to by its two main states/variants:
selectedandunselected - The
iconthat corresponds to the 'tick' within the container - The
labelof the overall component - The
descriptionof the overall component

The component itself also follows the standard input states of default, active, hover, disabled and invalid
Overall container
| Color Area | State | Base Color Token | Light (HEX) | Dark (HEX) |
|---|---|---|---|---|
| background-color | default | background-color.surface.primary.default | #FFFFFF | #22262C |
| background-color | active | background-color.surface.primary.active | #FFFFFF | #1F2328 |
| background-color | hover | background-color.surface.primary.hover | #FFFFFF | #21242A |
| background-color | disabled | background-color.input.default | #FFFFFF | #22262C |
| background-color | invalid | background-color.input.default | #FFFFFF | #22262C |
| border-color | default | border-color.separator | #E9EBEF | #53565C |
| border-color | active | border-color.separator | #E9EBEF | #53565C |
| border-color | hover | border-color.separator | #E9EBEF | #53565C |
| border-color | disabled | border-color.separator | #E9EBEF | #53565C |
| border-color | invalid | border-color.separator | #E9EBEF | #53565C |
selected and unselected Checkbox
| Variant | Color Area | State | Base Color Token | Light (HEX) | Dark (HEX) |
|---|---|---|---|---|---|
selected | background-color | active | background-color.brand.active | #2F51E1 | #2F51E1 |
selected | background-color | default | background-color.brand.default | #4462E4 | #4462E4 |
selected | background-color | disabled | background-color.disabled.default | #E9EBEF | #53565C |
selected | background-color | hover | background-color.brand.hover | #3A59E2 | #3A59E2 |
selected | background-color | invalid | background-color.negative.base.default | #D31127 | #D31127 |
selected | border-color | active | border-color.brand.active | #4462E4 | #4462E4 |
selected | border-color | default | border-color.brand.default | #4462E4 | #4462E4 |
selected | border-color | disabled | border-color.disabled.default | #E9EBEF | #53565C |
selected | border-color | hover | border-color.brand.hover | #4462E4 | #4462E4 |
selected | border-color | invalid | border-color.negative.base.default | #D31127 | #D31127 |
unselected | background-color | active | background-color.input.default | #FFFFFF | #22262C |
unselected | background-color | default | background-color.input.default | #FFFFFF | #22262C |
unselected | background-color | disabled | background-color.input.default | #FFFFFF | #22262C |
unselected | background-color | hover | background-color.input.default | #FFFFFF | #22262C |
unselected | background-color | invalid | background-color.input.default | #FFFFFF | #22262C |
unselected | border-color | active | border-color.input.active | #85898F | #66696D |
unselected | border-color | default | border-color.input.default | #92959B | #6F7277 |
unselected | border-color | disabled | border-color.disabled.default | #E9EBEF | #53565C |
unselected | border-color | hover | border-color.input.hover | #8C8F95 | #6B6D72 |
unselected | border-color | invalid | border-color.negative.base.default | #D31127 | #D31127 |
icon sub-component
| Color Area | State | Base Color Token | Light (HEX) | Dark (HEX) |
|---|---|---|---|---|
| content-color | default | content-color.brand.on-brand | #FFFFFF | #FFFFFF |
| content-color | active | content-color.brand.on-brand | #FFFFFF | #FFFFFF |
| content-color | hover | content-color.brand.on-brand | #FFFFFF | #FFFFFF |
| content-color | invalid | content-color.brand.on-brand | #FFFFFF | #FFFFFF |
| content-color | disabled | content-color.disabled.default | #92959B | #6F7277 |
label sub-component
| Color Area | State | Base Color Token | Light (HEX) | Dark (HEX) |
|---|---|---|---|---|
| content-color | default | content-color.subtle | #0A0D11 | #FFFFFF |
| content-color | disabled | content-color.disabled.default | #92959B | #6F7277 |
description sub-component
| Color Area | State | Base Color Token | Light (HEX) | Dark (HEX) |
|---|---|---|---|---|
| content-color | default | content-color.base | #53565C | #D6D8DB |
| content-color | disabled | content-color.disabled.default | #92959B | #6F7277 |










