@blueromans/react-theme-provider v0.0.2
About
@blueromans/react-theme-provider is a set of utilities that help you create your own theming system in few easy steps.
You can use it to customize colors, fonts, etc.
Features
- Works in React and React Native
createTheming(defaultTheme)- factory returns:ThemeProvider- componentwithTheme- Higher Order ComponentuseTheme- React Hook
Getting started
Installation
npm install --save @blueromans/react-theme-provideror using yarn
yarn add @blueromans/react-theme-providerUsage
Import createTheming from the library to create a theming object.
import { createTheming } from '@blueromans/react-theme-provider';
const { ThemeProvider, withTheme, useTheme } = createTheming(defaultTheme);Then wrap your code in ThemeProvider component to make it available to all components.
<ThemeProvider>
<App />
</ThemeProvider>You can access the theme data in your components by wrapping it in withTheme HOC:
class App extends React.Component {
render() {
return <div style={{ color: props.theme.primaryColor }}>Hello</div>;
}
}
export default withTheme(App);Another usage for functional component:
const App = ({ theme }) => (
<div style={{ color: theme.primaryColor }}>
Hello
</div>
);
export withTheme(App);You can also use the hooks based API:
function App() {
const theme = useTheme();
return <div style={{ color: theme.primaryColor }}>Hello</div>;
}Injected props
It will inject the following props to the component:
theme- our theme object.getWrappedInstance- exposed by some HOCs like react-redux'sconnect. Use it to get the ref of the underlying element.
Injecting theme by a direct prop
You can also override theme provided by ThemeProvider by setting theme prop on the component wrapped in withTheme HOC.
Just like this:
const Button = withTheme(({ theme }) => (
<div style={{ color: theme.primaryColor }}>Click me</div>
));
const App = () => (
<ThemeProvider theme={{ primaryColor: 'red' }}>
<Button theme={{ primaryColor: 'green' }} />
</ThemeProvider>
);In this example Button will have green text.
createTheming
type:
<T, S>(defaultTheme: T) => {
ThemeProvider: ThemeProviderType<T>,
withTheme: WithThemeType<T, S>,
}This is more advanced replacement to classic importing ThemeProvider and withTheme directly from the library.
Thanks to it you can create your own ThemeProvider with any default theme.
Returns instance of ThemeProvider component and withTheme HOC.
You can use this factory to create a singleton with your instances of ThemeProvider and withTheme.
Note:
ThemeProviderandwithThemegenerated bycreateThemingalways will use different context so make sure you are using matchingwithTheme! If you acidentially importwithThemefrom@blueromans/react-theme-providerinstead of your theming instance it won't work.
Arguments
defaultTheme- default theme object
Benefits
- Possibility to define
flowtypes for your theme - Possibility to pass default theme
- You can use multiple
ThemeProviders in your app without any conflicts.
Usage
// theming.js
import { createTheming } from '@blueromans/react-theme-provider';
const { ThemeProvider, withTheme } = createTheming({
primaryColor: 'red',
secondaryColor: 'green',
});
export { ThemeProvider, withTheme };
//App.js
import { ThemeProvider, withTheme } from './theming';Helpers
ThemeProvider
type:
type ThemeProviderType<Theme> = React.ComponentType<{
children: React.Node,
theme?: Theme,
}>;Component you have to use to provide the theme to any component wrapped in withTheme HOC.
Props
-theme - your theme object
withTheme
type:
type WithThemeType<Theme> = React.ComponentType<{ theme: Theme }>Higher Order Component which takes your component as an argument and injects theme prop into it.
useTheme
type:
type UseTheme = (overrides?: PartialTheme) => Theme;Hook which takes theme overrides and returns a theme object.
Example:
function App(props) {
const theme = useTheme(props.theme);
return <div style={{ color: theme.primaryColor }}>Hello</div>;
}Applying a custom theme to a component
If you want to change the theme for a certain component, you can directly pass the theme prop to the component. The theme passed as the prop is merged with the theme from the Provider.
import * as React from 'react';
import MyButton from './MyButton';
export default function ButtonExample() {
return <MyButton theme={{ roundness: 3 }}>Press me</MyButton>;
}