0.55.8 • Published 2 months ago

@startupjs/babel-plugin-rn-stylename-to-style v0.55.8

Weekly downloads
379
License
MIT
Repository
github
Last release
2 months ago

@startupjs/babel-plugin-rn-stylename-to-style

Transform JSX styleName property to style property in react-native. The styleName attribute and syntax are based on babel-plugin-react-css-modules.

Information

This is the fork of https://github.com/kristerkari/babel-plugin-react-native-stylename-to-style

The differences are:

  1. Support resolving multi-class selectors in CSS:
import classnames from 'classnames'

function Button ({
  variant,  // [string] 'primary' | 'secondary'
  dark,     // [bool]
  disabled  // [bool]
}) {
  return (
    <Text
      styleName={classnames('button', [variant, { dark, disabled }])}
    >CLICK ME</Text>
  )
}
.button
  background-color: blue
  &.primary
    color: #ff0000
    &.disabled
      color: rgba(#ff0000, 0.5)
  &.secondary
    color: #00ff00
    &.disabled
      color: rgba(#00ff00, 0.5)
  &.disabled
    color: #777

.dark
  &.button
    background-color: purple
    &.primary
      color: white
      &.disabled
        color: #ddd
  &.disabled
    color: #eee

And what's important is that selectors` specificity is properly emulated. For example:

Styles for .button.primary.disabled (specificity 30) will override styles of .button.disabled (specificity 20), even though .button.disabled is written later in the CSS.

This simple change brings a lot more capabilities in theming your components for a dynamic look.

  1. Convert any *StyleName attribute to the according *Style attribute. This is very useful for passing the sub-element styles (which are usually exposed by react-native libraries) directly from CSS.

  2. If the styleName value is an object or an array, automatically pipe it through the classnames-like library.

  3. Support for multiple named css file imports is removed

Usage

WARNING: This plugin is already built in into the babel-preset-startupjs and is included into the default StartupJS project.

If you want to use this plugin separately from StartupJS:

Step 1: Install

yarn add --dev @startupjs/babel-plugin-rn-stylename-to-style

or

npm install --save-dev @startupjs/babel-plugin-rn-stylename-to-style

Step 2: Configure .babelrc

You must give one or more file extensions inside an array in the plugin options.

{
  "presets": [
    "react-native"
  ],
  "plugins": [
    ["react-native-dynamic-stylename-to-style", {
      "extensions": ["css"]
    }]
  ]
}

Syntax

Anonymous reference

Anonymous reference can be used when there is only one stylesheet import.

Single class

import "./Button.css";

<View styleName="wrapper">
  <Text>Foo</Text>
</View>;

↓ ↓ ↓ ↓ ↓ ↓

import Button from "./Button.css";

<View style={Button.wrapper}>
  <Text>Foo</Text>
</View>;

Multiple classes

import "./Button.css";

<View styleName="wrapper red-background">
  <Text>Foo</Text>
</View>;

↓ ↓ ↓ ↓ ↓ ↓

import Button from "./Button.css";

<View style={[Button.wrapper, Button["red-background"]]}>
  <Text>Foo</Text>
</View>;

Expression

import "./Button.css";
const name = "wrapper";

<View styleName={name}>
  <Text>Foo</Text>
</View>;

↓ ↓ ↓ ↓ ↓ ↓

import Button from "./Button.css";
const name = "wrapper";

<View
  style={(name || "")
    .split(" ")
    .filter(Boolean)
    .map(function(name) {
      Button[name];
    })}
>
  <Text>Foo</Text>
</View>;

Expression with ternary

import "./Button.css";

const condition = true;
const name = "wrapper";

<View styleName={condition ? name : "bar"}>
  <Text>Foo</Text>
</View>;

↓ ↓ ↓ ↓ ↓ ↓

import Button from "./Button.css";

const condition = true;
const name = "wrapper";

<View
  style={((condition ? name : "bar") || "")
    .split(" ")
    .filter(Boolean)
    .map(function(name) {
      Button[name];
    })}
>
  <Text>Foo</Text>
</View>;

with styleName and style:

import "./Button.css";

<View styleName="wrapper" style={{ height: 10 }}>
  <Text>Foo</Text>
</View>;

↓ ↓ ↓ ↓ ↓ ↓

import Button from "./Button.css";

<View style={[Button.wrapper, { height: 10 }]}>
  <Text>Foo</Text>
</View>;
0.56.0-alpha.32

2 months ago

0.56.0-alpha.34

2 months ago

0.56.0-alpha.33

2 months ago

0.56.0-alpha.4

3 months ago

0.56.0-alpha.0

4 months ago

0.55.8

5 months ago

0.55.0-alpha.1

6 months ago

0.55.0-alpha.0

6 months ago

0.55.0

5 months ago

0.53.0

9 months ago

0.55.0-alpha.11

6 months ago

0.55.0-alpha.12

6 months ago

0.54.1

6 months ago

0.54.2

6 months ago

0.54.0

6 months ago

0.51.0

12 months ago

0.52.1

11 months ago

0.52.0

11 months ago

0.50.13

1 year ago

0.50.12

1 year ago

0.50.5

1 year ago

0.48.0

2 years ago

0.49.0

1 year ago

0.47.0

2 years ago

0.46.0

2 years ago

0.45.0

2 years ago

0.44.23

2 years ago

0.44.24

2 years ago

0.44.14

2 years ago

0.44.0

2 years ago

0.43.0

2 years ago

0.41.2

2 years ago

0.41.0

2 years ago

0.42.0

2 years ago

0.43.1

2 years ago

0.39.11

2 years ago

0.40.2

2 years ago

0.40.0

2 years ago

0.39.4

3 years ago

0.39.0

3 years ago

0.38.0

3 years ago

0.37.0

3 years ago

0.36.0

3 years ago

0.35.10

3 years ago

0.35.2

3 years ago

0.35.0

3 years ago

0.34.0

3 years ago

0.32.1

3 years ago

0.32.0

3 years ago

0.31.26

3 years ago

0.31.24

3 years ago

0.31.23

3 years ago

0.31.0

3 years ago

0.30.9

3 years ago

0.30.7

3 years ago

0.30.6

3 years ago

0.30.5

3 years ago

0.30.4

3 years ago

0.30.3

3 years ago

0.30.2

3 years ago

0.30.1

3 years ago

0.30.0

3 years ago

0.29.2

3 years ago

0.29.0

3 years ago

0.28.0

3 years ago

0.27.0

3 years ago

0.26.0

4 years ago

0.25.0

4 years ago

0.24.0

4 years ago

0.23.45

4 years ago

0.23.44

4 years ago

0.23.39

4 years ago

0.23.37

4 years ago

0.23.33

4 years ago

0.23.19

4 years ago

0.23.20

4 years ago

0.23.18

4 years ago

0.23.17

4 years ago

0.23.0

4 years ago

0.22.0-canary.0

4 years ago

0.22.0

4 years ago

0.22.0-alpha.36

4 years ago

0.22.0-alpha.35

4 years ago

0.22.0-alpha.24

4 years ago

0.22.0-alpha.23

4 years ago

0.22.0-alpha.22

4 years ago