MCPcopy Index your code
hub / github.com/shoutem/theme

github.com/shoutem/theme @v1.0.2

Chat with this repo
repository ↗ · DeepWiki ↗ · release v1.0.2 ↗ · + Follow
75 symbols 139 edges 22 files 9 documented · 12% 46 cross-repo links
What it actually does AI analysis from the code graph — generated when you open this
loading…
README

Theme

The React Native component's style is usually defined as a static variable along with the component itself. This makes it easy to build self contained components that always look and behave in the same way. On the other hand, it complicates building themeable (or skinnable) components that could have multiple styles that can be customized without touching the component source code. @shoutem/theme is built to address that problem. With themes, you can target specific components in your app and customize them through one file, just like you would do it with CSS on the web.

Install

$ npm install --save @shoutem/theme

Docs

All the documentation is available on the Developer portal.

Community

Join our community on Facebook. Also, feel free to ask a question on Stack Overflow using "shoutem" tag.

Examples

Use Shoutem UI, set of components which are made to be customizable by Theme, to see how to work with it.

Create new React Native project:

$ react-native init HelloWorld

Install @shoutem/ui and @shoutem/theme and link them in your project:

$ cd HelloWorld
$ npm install --save @shoutem/ui
$ npm install --save @shoutem/theme
$ rnpm link

Now, simply copy the following to the App.js file of your React Native project:

import React, { Component } from 'react';
import { Dimensions } from 'react-native';
import { StyleProvider } from '@shoutem/theme';
import {
  Card,
  Image,
  View,
  Subtitle,
  Caption,
} from '@shoutem/ui';

const window = Dimensions.get('window');

const Colors = {
  BACKGROUND: '#ffffff',
  SHADOW: '#000000',
};

const MEDIUM_GUTTER = 15;

const theme = {
  'shoutem.ui.View': {
    '.h-center': {
      alignItems: 'center',
    },

    '.v-center': {
      justifyContent: 'center',
    },

    '.flexible': {
      flex: 1,
    },

    flexDirection: 'column',
  },

  'shoutem.ui.Card': {
    'shoutem.ui.View.content': {
      'shoutem.ui.Subtitle': {
        marginBottom: MEDIUM_GUTTER,
      },

      flex: 1,
      alignSelf: 'stretch',
      padding: 10,
    },

    width: (180 / 375) * window.width,
    flexDirection: 'column',
    justifyContent: 'center',
    alignItems: 'flex-start',
    backgroundColor: Colors.BACKGROUND,
    borderRadius: 2,
    shadowColor: Colors.SHADOW,
    shadowOpacity: 0.1,
    shadowOffset: { width: 1, height: 1 },
  },

  'shoutem.ui.Image': {
    '.medium-wide': {
      width: (180 / 375) * window.width,
      height: 85,
    },

    flexDirection: 'column',
    alignItems: 'center',
    justifyContent: 'center',
    backgroundColor: Colors.BACKGROUND,
  },
};

export default class App extends Component<{}> {
  render() {
    return (
      <StyleProvider style={theme}>
        <View styleName="flexible vertical v-center h-center">
          <Card>
            <Image
              styleName="medium-wide"
              source={{ uri: 'http://shoutem.github.io/img/ui-toolkit/examples/image-12.png' }}
            />
            <View styleName="content">
              <Subtitle numberOfLines={4}>
                Lady Gaga Sings National Anthem at Super Bowl 50
              </Subtitle>
              <Caption>21 hours ago</Caption>
            </View>
          </Card>
        </View>
      </StyleProvider>
    );
  }
}

Finally, run the app!

$ react-native run-ios

Automated Testing

Jest has been set up to provide the ability to test @shoutem/theme after any changes.

To run tests, first add the following to dependencies in package.json: - "react-native": "0.63.2" - "react": "16.13.1" - "react-dom": "16.13.1"

Or whichever version is relevant after your changes. Then run npm i && npm run test and see if you broke anything.

UI Toolkit

Shoutem UI is a part of the Shoutem UI Toolkit that enables you to build professionally looking React Native apps with ease.

It consists of three libraries:

License

The BSD License Copyright (c) 2016-present, Shoutem

Core symbols most depended-on inside this repo

resolveIncludes
called by 17
src/resolveIncludes.js
createNormalizers
called by 10
src/StyleNormalizer/StyleNormalizer.js
createNormalizer
called by 7
src/StyleNormalizer/ShorthandsNormalizerFactory.js
createShorthand
called by 4
src/StyleNormalizer/ShorthandsNormalizerFactory.js
resolveStyle
called by 3
src/Theme.js
throwConnectStyleError
called by 2
src/connectStyle.js
normalize
called by 2
src/StyleNormalizer/normalizeStyle.js
normalizeStyle
called by 2
src/StyleNormalizer/normalizeStyle.js

Shape

Function 39
Method 23
Class 13

Languages

TypeScript100%

Modules by API surface

src/connectStyle.js14 symbols
src/Theme.js10 symbols
src/StyleNormalizer/ShorthandsNormalizerFactory.js10 symbols
src/StyleNormalizer/StyleNormalizer.js7 symbols
src/addons.js6 symbols
examples/Shapes.js6 symbols
_tests_/mocks/StyleProviderTestComponent.js5 symbols
_tests_/mocks/ConnectStyleTestComponents.js5 symbols
src/resolveIncludes.js4 symbols
src/resolveComponentStyle.js4 symbols
src/StyleNormalizer/normalizeStyle.js2 symbols
src/mergeComponentAndThemeStyles.js1 symbols

For agents

$ claude mcp add theme \
  -- python -m otcore.mcp_server <graph>

⬇ download graph artifact

Ask about this repo answers extend the page