Socket
Socket
Sign inDemoInstall

@callstack/react-theme-provider

Package Overview
Dependencies
2
Maintainers
8
Versions
24
Alerts
File Explorer

Advanced tools

Install Socket

Detect and block malicious and high-risk dependencies

Install

@callstack/react-theme-provider

Theme provider for react and react-native applications


Version published
Weekly downloads
262K
increased by11.74%
Maintainers
8
Install size
115 kB
Created
Weekly downloads
 

Package description

What is @callstack/react-theme-provider?

@callstack/react-theme-provider is a library that allows you to easily manage and apply themes in your React applications. It provides a context-based solution for theming, enabling you to define and switch between different themes dynamically.

What are @callstack/react-theme-provider's main functionalities?

ThemeProvider

The ThemeProvider component is used to wrap your application or a part of it, providing the theme to all the components within its tree. This allows you to define a theme object and make it available throughout your application.

import { ThemeProvider } from '@callstack/react-theme-provider';

const theme = {
  colors: {
    primary: '#6200ee',
    background: '#ffffff',
    surface: '#ffffff',
    accent: '#03dac4',
    error: '#b00020',
    text: '#000000',
    onPrimary: '#ffffff',
    onBackground: '#000000',
    onSurface: '#000000',
    onAccent: '#000000',
    onError: '#ffffff',
  },
};

const App = () => (
  <ThemeProvider theme={theme}>
    <YourComponent />
  </ThemeProvider>
);

useTheme Hook

The useTheme hook allows you to access the current theme within your functional components. This hook returns the theme object, which you can then use to style your components dynamically based on the current theme.

import { useTheme } from '@callstack/react-theme-provider';

const ThemedComponent = () => {
  const theme = useTheme();

  return (
    <div style={{ backgroundColor: theme.colors.background, color: theme.colors.text }}>
      This component is themed!
    </div>
  );
};

withTheme Higher-Order Component

The withTheme higher-order component (HOC) is used to inject the theme into your class components. This HOC wraps your component and passes the theme as a prop, allowing you to access and use the theme within your class components.

import { withTheme } from '@callstack/react-theme-provider';

const ThemedComponent = ({ theme }) => (
  <div style={{ backgroundColor: theme.colors.background, color: theme.colors.text }}>
    This component is themed!
  </div>
);

export default withTheme(ThemedComponent);

Other packages similar to @callstack/react-theme-provider

Readme

Source

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.

Keywords

FAQs

Last updated on 01 Aug 2023

Did you know?

Socket

Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.

Install

Related posts

SocketSocket SOC 2 Logo

Product

  • Package Alerts
  • Integrations
  • Docs
  • Pricing
  • FAQ
  • Roadmap

Packages

Stay in touch

Get open source security insights delivered straight into your inbox.


  • Terms
  • Privacy
  • Security

Made with ⚡️ by Socket Inc