Skip to main content

Native colors

Content

Native colors are used to work with dark and light themes of your application.

There are some predefined (Android) and built-in (iOS) color names which are listed as enums in src/core/theme/colors.ts

It's highly recommended to use native colors opposed to JS defined ones to present better user experience with dark and light themes

Android

Content

There are two sets of colors defined in native resources:

  • /android/app/src/main/res/values/colors.xml - for light theme
  • /android/app/src/main/res/values-night/colors.xml - for dark theme

They look like this (light theme colors e.g.):

<?xml version="1.0" encoding="utf-8"?>
<resources>
<item name="primary" type="color">#61DAFB</item>
<item name="primaryDark" type="color">#2596BE</item>
<item name="primaryLight" type="color">#B3E5FC</item>
<item name="background" type="color">#FFFFFF</item>
<item name="primaryText" type="color">#212121</item>
<item name="primaryTextOpacity" type="color">#CC212121</item>
<item name="secondaryText" type="color">#757575</item>
<item name="onPrimaryText" type="color">#FFFFFF</item>
<item name="onPrimaryTextOpacity" type="color">#CCFFFFFF</item>
<item name="divider" type="color">#BDBDBD</item>
<item name="navigation" type="color">#61DAFB</item>
<item name="statusbar" type="color">#0288D1</item>
</resources>

For both themes this colors share the same set of items (names) but can have different color values.

In React Native they are represented as PlatformColorsAndroid enum in src/core/theme/colors.ts:

export enum PlatformColorsAndroid {
primary = "@color/primary",
primaryDark = "@color/primaryDark",
primaryLight = "@color/primaryLight",
background = "@color/background",
primaryText = "@color/primaryText",
primaryTextOpacity = "@color/primaryTextOpacity",
secondaryText = "@color/secondaryText",
onPrimaryText = "@color/onPrimaryText",
onPrimaryTextOpacity = "@color/onPrimaryTextOpacity",
divider = "@color/divider",
navigation = "@color/navigation",
statusbar = "@color/statusbar",
}

Usage

It's not enough to directly use this colors sam way as ones from Colors enum.

You can use them in styles in multiple ways:

  1. Using PlatformColor in mix with Platform.select
const styles = StyleSheet.create({
container: {
...Platform.select({
android: {
backgroundColor: PlatformColor(PlatformColorsAndroid.background),
} as ViewStyle,
}),
} as ViewStyle,
});
  1. Using platformNativeColor or platformMixedColor:
const styles = StyleSheet.create({
container: {
backgroundColor: platformNativeColor(PlatformColorsIOS.systemBackground, PlatformColorsAndroid.background),
} as ViewStyle,
});
  1. To assign native colors in navigation, assign them directly, not separately:
Incorrect
    topBar: {
background: {
color: {
light: PlatformColor(PlatformColorsAndroid.navigation),
darK: PlatformColor(PlatformColorsAndroid.navigation),
},
},
}
Correct
    topBar: {
background: {
color: platformNativeColor(PlatformColorsIOS.systemBackground, PlatformColorsAndroid.navigation),
},
}

Add colors

To add more native colors:

  • Create item in both /android/app/src/main/res/values/colors.xml and /android/app/src/main/res/values-night/colors.xml with the same name
  • Add your new color name in PlatformColorsAndroid
  • Rebuild your application

Native theme constants

There are some native theme constants which you can change. These constants change things like tint, status bar colors on native side.

They are located in:

  • /android/app/src/main/res/values/styles.xml - for light theme
  • /android/app/src/main/res/values-night/styles.xml - for dark theme

And look like this:

<?xml version="1.0" encoding="utf-8"?>

<resources>
<style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
<!-- Customize your theme here. -->
<item name="android:windowBackground">@color/background</item>
<item name="android:statusBarColor">@color/statusbar</item>
<item name="colorAccent">@color/primary</item>
</style>

<style name="SplashTheme" parent="Theme.AppCompat.Light.NoActionBar">
<item name="android:windowBackground">@drawable/splash_background</item>
<item name="android:statusBarColor">@color/statusbar</item>
</style>
</resources>

Our app's theme is defined within style AppTheme.

You can see that there's a colorAccent assigned to our @color/primary, this change can be seen in dialogs, alerts and other components.

Same goes with android:statusBarColor which sets the color of status bar.

To check other constant names you can adjust, check Android related resources regarding your components which you'd like to modify.

iOS

Content

iOS already has some predefined colors for us, you can check how they look and change with dark and light theme in Storybook's colors page.

Usage

It's not enough to directly use this colors sam way as ones from Colors enum.

You can use them in styles in multiple ways:

  1. Using PlatformColor in mix with Platform.select
const styles = StyleSheet.create({
container: {
...Platform.select({
iOS: {
backgroundColor: PlatformColor(PlatformColorsIOS.systemBackground),
} as ViewStyle,
}),
} as ViewStyle,
});
  1. Using platformNativeColor or platformMixedColor:
const styles = StyleSheet.create({
container: {
backgroundColor: platformNativeColor(PlatformColorsIOS.systemBackground, PlatformColorsAndroid.background),
} as ViewStyle,
});
  1. To assign native colors in navigation, assign them directly, not separately:
Incorrect
    topBar: {
background: {
color: {
light: PlatformColor(PlatformColorsIOS.systemBackground),
darK: PlatformColor(PlatformColorsIOS.systemBackground),
},
},
}
Correct
    topBar: {
background: {
color: platformNativeColor(PlatformColorsIOS.systemBackground, PlatformColorsAndroid.navigation),
},
}

Add colors

At this moment you can't add your colors natively, but you can define your own colors in a separate enum and use DynamicColorIOS.

But it would be better to stick to built-in colors to provide better user experience for users.

Native theme constants

You can define AccentColor of your application for both light and dark themes in XCode:

  • Open .xcworkspace file
  • Navigate to Images.xcassets where you'll see your app and splash icons and AccentColor which you can change