• Stars
    star
    459
  • Rank 92,137 (Top 2 %)
  • Language
    JavaScript
  • License
    MIT License
  • Created over 6 years ago
  • Updated 10 months ago

Reviews

There are no reviews yet. Be the first to send feedback to the community and the maintainers!

Repository Details

A set of utilities that help you create your own React theming system in few easy steps

react-theme-provider


Build Status Version MIT License

About

@callstack/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 - component
    • withTheme - Higher Order Component
    • useTheme - React Hook

Examples

Getting started

Installation

npm install --save @callstack/react-theme-provider

or using yarn

yarn add @callstack/react-theme-provider

Usage

Import createTheming from the library to create a theming object.

import { createTheming } from '@callstack/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's connect. 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: ThemeProvider and withTheme generated by createTheming always will use different context so make sure you are using matching withTheme! If you acidentially import withTheme from @callstack/react-theme-provider instead of your theming instance it won't work.

Arguments

  • defaultTheme - default theme object

Benefits

  • Possibility to define flow types 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 '@callstack/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>;
}

Gotchas

The ThemeProvider exposes the theme to the components via React's context API, which means that the component must be in the same tree as the ThemeProvider. Some React Native components will render a different tree such as a Modal, in which case the components inside the Modal won't be able to access the theme. The work around is to get the theme using the withTheme HOC and pass it down to the components as props, or expose it again with the exported ThemeProvider component.

More Repositories

1

react-native-paper

Material Design for React Native (Android & iOS)
TypeScript
12,242
star
2

linaria

Zero-runtime CSS in JS library
TypeScript
11,195
star
3

haul

Haul is a command line tool for developing React Native apps, powered by Webpack
TypeScript
3,637
star
4

react-native-testing-library

๐Ÿฆ‰ Simple and complete React Native testing utilities that encourage good testing practices.
TypeScript
2,970
star
5

react-native-builder-bob

๐Ÿ‘ทโ€โ™‚๏ธ Simple set of CLIs to scaffold and build React Native libraries for different targets
JavaScript
2,637
star
6

react-native-pager-view

React Native wrapper for the Android ViewPager and iOS UIPageViewController.
TypeScript
2,475
star
7

repack

A Webpack-based toolkit to build your React Native application with full support of Webpack ecosystem.
TypeScript
1,330
star
8

react-native-slider

React Native component exposing Slider from iOS and SeekBar from Android
TypeScript
1,118
star
9

reassure

Performance testing companion for React and React Native
TypeScript
1,109
star
10

react-native-ios-kit

The missing React Native UI Kit for iOS
JavaScript
519
star
11

react-native-fbads

Facebook Audience SDK integration for React Native
Java
434
star
12

super-app-showcase

Monorepository template for super app development with React Native and Re.Pack
JavaScript
352
star
13

react-native-image-editor

A library providing an API for cropping images from the web and the local file system.
Kotlin
340
star
14

react-native-paper-login-template

The easiest way to start with your application.
TypeScript
239
star
15

react-native-brownfield

Set of helpers to make your brownfield integration smooth and easy.
Kotlin
207
star
16

react-native-opentok

React Native OpenTok
Objective-C
203
star
17

component-docs

๐Ÿ“ Simple documentation for your React components
TypeScript
137
star
18

react-native-open-source-board

OSS board with triaged React Native issues.
126
star
19

async-storage

Cross platform storage for React, built on top of AsyncStorage
JavaScript
109
star
20

react-native-material-palette

Bringing Material Palette API to React Native
JavaScript
105
star
21

ts-regex-builder

Maintainable regular expressions for TypeScript and JavaScript.
TypeScript
83
star
22

react-native-multibundle

JavaScript
57
star
23

eslint-config-callstack

ESLint preset extending Flow, Prettier and Jest
JavaScript
52
star
24

repack-examples

Repository with examples for Re.Pack
Java
40
star
25

ai-meeting-transcription

AI Tool for meeting transcriptions
Jupyter Notebook
36
star
26

react-native-socket-mobile

React Native module for the Socket Mobile SDK.
JavaScript
35
star
27

fabric-library-with-custom-cpp-example

Add custom cpp state to your fabric library
Java
29
star
28

hapi-graphql-boilerplate

JavaScript
26
star
29

react-native-detox-example

Example integration of Detox and Jest
Objective-C
23
star
30

super-app-example

This repository presents a compact super-app example from Callstack's blog, illustrating the use of a monorepo structure together with Re.Pack and Module Federation.
Java
21
star
31

web3-react-native-dapp-wagmi

TypeScript
20
star
32

linaria-styled

Zero-runtime CSS in JS library for building React components
18
star
33

parcel-plugin-linaria

Parcel plugin for Linaria (Experimental)
JavaScript
17
star
34

benz-ql

GraphQL server for the Mercedes APIs
JavaScript
16
star
35

generator-node-module

A Yeoman module to author Node libraries with Prettier, Jest, Flow and Babel.
JavaScript
16
star
36

react-native-snapshot-tests

An example of snapshot testing with React Native
Objective-C
16
star
37

delightful-ux-training-app

JavaScript
15
star
38

web3-cross-platform-dapp

TypeScript
13
star
39

universal-react-app

JavaScript
12
star
40

workshop-navigation

Navigation in React Native workshop.
JavaScript
12
star
41

ai-cli

AI assistant in your terminal.
TypeScript
11
star
42

react-native-windows-hello

RNW library providing developer with all Windows Hello features
C++
10
star
43

github-comment-bot

JavaScript
10
star
44

talk-universal-react

JavaScript
8
star
45

news-mini-app-showcase

JavaScript
8
star
46

ReactNativeNotes

Notes demo application showing the abilities of React Native for desktop connected with UWP development
TypeScript
8
star
47

ai-summarization

AI summarization tool
Jupyter Notebook
7
star
48

react-native-releases-script

Script to generate changelog for RN releases
7
star
49

callstack-hackathon-team-ferran

callstack-hackaton-team-ferran
JavaScript
5
star
50

web3-react-native-dapp-viem

TypeScript
4
star
51

callstack-hackathon-team-dratwa-wojtek

JavaScript
3
star
52

reassure-examples

Examples for Reassure setup with different frameworks.
JavaScript
3
star
53

.github

Templates for all Callstack OSS projects
2
star
54

react-native-paper-codemod

JavaScript
2
star
55

AppleVisionBGFX

Usage of BGFX in visionOS
C++
2
star
56

callstack.github.io

Organisation Github Page
HTML
1
star
57

sample-weather-app

JavaScript
1
star
58

workshop-universal-sunshine

Universal React Native & React app based on Sunshine: https://github.com/udacity/Sunshine-Version-2
1
star