Backpack React Native appearance.
Check the main Readme for a complete installation guide.
First wrap your app with BpkAppearanceProvider
import {
useBpkDynamicValue,
} from 'backpack-react-native/bpk-appearance';
const App = ({ children }) => (
<BpkAppearanceProvider>
<App>
{children}
</App>
</BpkAppearanceProvider>
);
Now you can use the provided hooks to react to changes in the system appearance
import React from 'react';
import { View } from 'react-native';
import BpkImage from 'backpack-react-native/bpk-component-image';
import {
BpkDynamicStyleSheet,
useBpkDynamicStyleSheet,
useBpkDynamicValue,
} from 'backpack-react-native/bpk-appearance';
import {
backgroundDarkColor,
backgroundLightColor,
} from '@skyscanner/bpk-foundations-react-native/tokens/base.react.native';
const style = BpkDynamicStyleSheet.create({
view: {
backgroundColor: { light: backgroundLightColor, dark: backgroundDarkColor }
},
image: {
light: {
borderWidth: 1,
borderColor: '#d6d7da',
},
dark: {
backgroundColor: 'rgb(205, 205, 215)'
},
},
});
const UserProfile = () => {
const currentStyle = useBpkDynamicStyleSheet(style);
const image = useBpkDynamicValue({ light: './user-profile-light.png', dark: './user-profile-dark.png' });
return (
<View style={currentStyle.view}>
<BpkImage style={currentStyle.image} source={{ uri: image }} alt="user profile">
</View>
);
};
For non-functional components use BpkAppearanceConsumer
or withBpkAppearance
HOC and the unpack*
functions. (See full in API section bellow).
import React, { Component, type Config } from 'react';
import { View } from 'react-native';
import BpkText from 'backpack-react-native/bpk-component-text';
import {
BpkDynamicStyleSheet,
unpackBpkDynamicValue,
BpkAppearanceConsumer,
} from 'backpack-react-native/bpk-appearance';
import {
backgroundDarkColor,
backgroundLightColor,
} from '@skyscanner/bpk-foundations-react-native/tokens/base.react.native';
const style = BpkDynamicStyleSheet.create({
view: {
backgroundColor: { light: backgroundLightColor, dark: backgroundDarkColor }
}
});
type Props = {
user: Object,
}
const defaultProps = {
user: { guest: true }
};
class UserProfile extends Component<Props> {
render() {
const { user } = this.props;
return (
<BpkAppearanceConsumer>
{({ bpkAppearance }) => {
const currentStyle = unpackBpkDynamicValue(style, bpkAppearance);
return (
<View style={currentStyle.view}>
<BpkText>{user.name}</BpkText>
</View>
)
}}
</BpkAppearanceConsumer>
);
}
};
export default BpkAppearanceConsumer;
import React, { Component, type Config } from 'react';
import { View } from 'react-native';
import BpkText from 'backpack-react-native/bpk-component-text';
import {
BpkDynamicStyleSheet,
withBpkAppearance,
unpackBpkDynamicValue,
type WithBpkAppearanceInjectedProps,
} from 'backpack-react-native/bpk-appearance';
import {
backgroundDarkColor,
backgroundLightColor,
} from '@skyscanner/bpk-foundations-react-native/tokens/base.react.native';
const style = BpkDynamicStyleSheet.create({
view: {
backgroundColor: { light: backgroundLightColor, dark: backgroundDarkColor }
}
});
type Props = {
user: Object,
}
const defaultProps = {
user: { guest: true }
};
class UserProfile extends Component<Props & WithBpkAppearanceInjectedProps> {
render() {
const { bpkAppearance, user } = this.props;
const currentStyle = unpackBpkDynamicValue(style, bpkAppearance);
return (
<View style={currentStyle.view}>
<BpkText>{user.name}</BpkText>
</View>
);
}
};
type ComponentConfig = Config<Props, typeof defaultProps>;
export default withBpkAppearance<ComponentConfig>(UserProfile);
- useBpkAppearance
- useBpkColorScheme
- useBpkDynamicValue
- useBpkDynamicStyle
- useBpkDynamicStyleSheet
- BpkAppearanceConsumer
- BpkDynamicStyleSheet
- create
- withBpkAppearance
- isBpkDynamicValue
- unpackBpkDynamicValue
- unpackBpkDynamicStyle
Fetch the current appearance as provided by the nearest [BpkAppearanceProvider]
Returns BpkAppearancePreferences the current appearance
Fetch the current color scheme as provided by the nearest [BpkAppearanceProvider]
Returns ColorSchemeName the current color scheme
Takes in a BpkDynamicValue
and returns the correct value for the
current color scheme as provided by the nearest [BpkAppearanceProvider]
value
Object a dynamic value.
const color = useBpkDynamicValue({ light: 'black', dark: 'white' })
Returns mixed the value for the current color scheme.
If value
is not a valid dynamic value it will be returned back
Takes in a style object and returns the correct value for all properties, based on the current color scheme as provided by the nearest [BpkAppearanceProvider]
style
Object the style object
const color = useBpkDynamicStyle({
color: { light: 'black', dark: 'white' },
flex: 1,
});
Returns Object object with mapped properties for the current color scheme
Takes in a BpkDynamicStyleSheet
and returns the correct value for
the current color scheme as provided by the nearest [BpkAppearanceProvider]
style
BpkDynamicStyle the dynamic stylesheet
const dynamicStyles = BpkDynamicStyleSheet.create({
color: { light: 'black', dark: 'white' },
flex: 1,
})
const styles = useBpkDynamicStyleSheet(dynamicStyles);
Returns BpkDynamicStyleProp the current stylesheet
A render prop component that provides the current BpkAppearance as provided by the nearest [BpkAppearanceProvider].
NOTE: This component should mainly be used in class components, for functional components we recommend using the provided hooks.
children
Function Function that will receive the current appearance and should return a react Node.children.children
<BpkAppearanceConsumer>
{({ bpkAppearance }) => {
const logo = unpackDynamicValue({ light: 'light.png', dark: 'dark.png' }, bpkAppearance);
return <BpkImage style={styles.image} alt="image title" source={{uri: logo}} />
}}
</BpkAppearanceConsumer>
Returns Node a react Node.
Creates a new dynamic stylesheet that transforms all BpkDynamicValues
into
a plain StyleSheet
for each color scheme.
This should generally be used in conjunction with useBpkDynamicStyleSheet
hook.
obj
Object a style containing dynamic values
BpkDynamicStyleSheet.create({
view: {
shadowColor: { light: '#fff', dark: '#ff0' },
}
});
BpkDynamicStyleSheet.create({
view: {
light: {
borderWidth: 1,
borderColor: '#d6d7da',
},
dark: {
backgroundColor: 'rgb(205, 205, 215)'
},
}
});
Returns BpkDynamicStyle an object containing a plain stylesheet for each color scheme.
This HOC wraps a component and provides the current BpkAppearancePreferences
as provided by the nearest BpkAppearanceProvider
.
NOTE: If you are using a functional component use one of the provided hooks instead.
Component
Component the component to be wrapped
import React, { type Config } from 'react';
import { type WithBpkAppearanceInjectedProps, withBpkAppearance } from '../../bpk-appearance';
class MyComponent extends Component<Props & WithBpkAppearanceInjectedProps> {
render() {
const { bpkAppearance, ...rest } = this.props;
....
}
}
export default withBpkAppearance<Config<Props, DefaultProps>>(MyComponent);
Returns Component the wrapped component with an extra bpkAppearance
prop.
Check if a value is a BpkDynamicValue
value
mixed the value to be checked
Returns boolean true if is a BpkDynamicValue
or false otherwise
Takes in a BpkDynamicValue
and returns the correct value for provided appearance.
value
mixed a dynamic value.appearance
Object the appearance preferences.
const color = unpackBpkDynamicValue({ light: 'black', dark: 'white' }, bpkAppearance)
Returns mixed the value for the current color scheme.
If value
is not a valid dynamic value it will be returned back
Takes in a style object and returns the correct value for all properties, based on the current color scheme as provided by the nearest [BpkAppearanceProvider]
const style = unpackBpkDynamicStyle(
{
color: { light: 'black', dark: 'white' },
flex: 1,
},
appearance
);
Returns Object object with mapped properties for the current color scheme