# react-native-col

> Flexbox made easy & semantic

Latest version **2.0.4** (published 2025-01-23) · MIT license · 0 weekly downloads

## Install

```sh
npm install react-native-col
pnpm add react-native-col
yarn add react-native-col
bun add react-native-col
```

## Health

**Score 25/100 (F)** — status: maintenance-mode.

Positive: no vulnerabilities.

Warnings: low downloads; no types; no esm support.

Negative: stale; low maintenance score.

## Facts

| | |
|---|---|
| Version | 2.0.4 |
| Published | 2025-01-23 |
| First published | 2019-01-24 |
| Weekly downloads | 0 |
| License | MIT |
| TypeScript types | none |
| Module format | CommonJS |
| Dependencies | 0 |
| Unpacked size | 162.6 KB |
| Known vulnerabilities | 0 |
| Install scripts | no |
| GitHub stars | 14 |
| Author | 0x55 |
| Maintainers | eightyfive |
| Keywords | react-native, flexbox, column, col, row, dial |

## Links

- npm: https://www.npmjs.com/package/react-native-col
- Repository: https://github.com/eightyfive/react-native-col
- Homepage: https://github.com/eightyfive/react-native-col#readme
- Issues: https://github.com/eightyfive/react-native-col/issues
- npm.io page: https://npm.io/package/react-native-col

## Alternatives

- [postcss-color-hex-alpha](https://npm.io/package/postcss-color-hex-alpha.md) — 6.4M weekly downloads
- [randomcolor](https://npm.io/package/randomcolor.md) — 348.0K weekly downloads
- [bows](https://npm.io/package/bows.md) — 1.3K weekly downloads
- [ep_prefer_color_scheme](https://npm.io/package/ep_prefer_color_scheme.md) — 260 weekly downloads
- [coc-yank](https://npm.io/package/coc-yank.md) — 61 weekly downloads

## Recent versions

- 2.0.4 (latest) — 2025-01-23
- 2.0.0-5 (next) — 2022-07-01
- 2.0.3 — 2024-11-14
- 2.0.2 — 2022-07-10
- 2.0.1 — 2022-07-04
- 2.0.0 — 2022-07-04
- 2.0.0-4 — 2022-06-21
- 2.0.0-3 — 2022-06-15
- 2.0.0-2 — 2022-06-15
- 2.0.0-1 — 2022-06-08
- 2.0.0-0 — 2021-10-01
- 1.1.5 — 2021-03-29
- 1.1.4 — 2021-01-25
- 1.1.3 — 2021-01-25
- 1.1.2 — 2021-01-09
- … 38 more at https://npm.io/package/react-native-col/versions

## README

# `react-native-col`

Flexbox made easy & semantic

```
┌─────────────┐
│ TL   T   TR │
│             │
│ L    C    R │
│             │
│ BL   B   BR │
└─────────────┘
```

- [Install](#install)
- [Usage](#usage)
- [API](#api)
  - [`Col`](#col)
  - [`Row`](#row)
  - [`Col0`, `Col1`, `Row7`... (Flex)](#col0-col1-row7-flex)
  - [`create(Col|Row)`](#createcolrow)
  - [`createDialStyle`](#createdialstyle)
  - [`(col|row|flex)Styles`](#colrowflexstyles)
- [Credits](#credits)

## Install

```
yarn add react-native-col
```

## Usage

### Before

```js
import { View } from 'react-native';

<View
  style={{
    flexDirection: 'row',
    justifyContent: 'flex-end',
    alignItems: 'flex-start',
  }}
/>;
```

### After

```js
import { Row } from 'react-native-col';

// "Top Right"
<Row.TR />;
```

## API

All demos use these 3 RGB squares:

```js
import { View } from 'react-native';

const square = {
  minWidth: 50,
  minHeight: 50,
};

const $ = {
  // Red
  r: {
    ...square,
    backgroundColor: 'red',
  },
  // Green
  g: {
    ...square,
    backgroundColor: 'green',
  },
  // Blue
  b: {
    ...square,
    backgroundColor: 'blue',
  },
};

const Red = () => <View style={$.r} />;

const Green = () => <View style={$.g} />;

const Blue = () => <View style={$.b} />;
```

Also assume that all `Col` and `Row` containers in demos, are `{ flex: 1 }`. Which are redacted for clarity.

### `Col`

```js
import { Col } from 'react-native-col';
```

#### Top Left

```jsx
// Equivalent to <Col />
<Col.TL>
  <Red />
  <Green />
  <Blue />
</Col.TL>
```

<img src="images/col-top-left.png" width="250" />

#### Top

```jsx
<Col.T>
  <Red />
  <Green />
  <Blue />
</Col.T>
```

<img src="images/col-top.png" width="250" />

#### Top Right

```jsx
<Col.TR>
  <Red />
  <Green />
  <Blue />
</Col.TR>
```

<img src="images/col-top-right.png" width="250" />

#### Left

```jsx
<Col.L>
  <Red />
  <Green />
  <Blue />
</Col.L>
```

<img src="images/col-left.png" width="250" />

#### Center

```jsx
<Col.C>
  <Red />
  <Green />
  <Blue />
</Col.C>
```

<img src="images/col-center.png" width="250" />

#### Right

```jsx
<Col.R>
  <Red />
  <Green />
  <Blue />
</Col.R>
```

<img src="images/col-right.png" width="250" />

#### Bottom Left

```js
<Col.BL>
  <Red />
  <Green />
  <Blue />
</Col.BL>
```

<img src="images/col-bottom-left.png" width="250" />

#### Bottom

```jsx
<Col.B>
  <Red />
  <Green />
  <Blue />
</Col.B>
```

<img src="images/col-bottom.png" width="250" />

#### Bottom Right

```jsx
<Col.BR>
  <Red />
  <Green />
  <Blue />
</Col.BR>
```

<img src="images/col-bottom-right.png" width="250" />

#### Top to Bottom, aligned Left

```js
<Col.TBL>
  <Red />
  <Green />
  <Blue />
</Col.TBL>
```

<img src="images/col-top-bottom-left.png" width="250" />

#### Top to Bottom

```jsx
<Col.TB>
  <Red />
  <Green />
  <Blue />
</Col.TB>
```

<img src="images/col-top-bottom.png" width="250" />

#### Top to Bottom, aligned Right

```jsx
<Col.TBR>
  <Red />
  <Green />
  <Blue />
</Col.TBR>
```

<img src="images/col-top-bottom-right.png" width="250" />

#### Bottom to Top, aligned Left

```js
<Col.BTL>
  <Red />
  <Green />
  <Blue />
</Col.BTL>
```

<img src="images/col-bottom-top-left.png" width="250" />

#### Bottom to Top

```jsx
<Col.BT>
  <Red />
  <Green />
  <Blue />
</Col.BT>
```

<img src="images/col-bottom-top.png" width="250" />

#### Bottom to Top, aligned Right

```jsx
<Col.BTR>
  <Red />
  <Green />
  <Blue />
</Col.BTR>
```

<img src="images/col-bottom-top-right.png" width="250" />

#### Top, aligned Left to Right

```jsx
<Col.LRT>
  <Red />
  <Green />
  <Blue />
</Col.LRT>
```

<img src="images/col-left-right-top.png" width="250" />

#### Center, aligned Left to Right

```jsx
<Col.LRC>
  <Red />
  <Green />
  <Blue />
</Col.LRC>
```

<img src="images/col-left-right-center.png" width="250" />

#### Bottom, aligned Left to Right

```jsx
<Col.LRB>
  <Red />
  <Green />
  <Blue />
</Col.LRB>
```

<img src="images/col-left-right-bottom.png" width="250" />

### `Row`

```js
import { Row } from 'react-native-col';
```

#### Top Left

```js
// Equivalent to <Row />
<Row.TL>
  <Red />
  <Green />
  <Blue />
</Row.TL>
```

<img src="images/row-top-left.png" width="250" />

#### Top

```jsx
<Row.T>
  <Red />
  <Green />
  <Blue />
</Row.T>
```

<img src="images/row-top.png" width="250" />

#### Top Right

```jsx
<Row.TR>
  <Red />
  <Green />
  <Blue />
</Row.TR>
```

<img src="images/row-top-right.png" width="250" />

#### Left

```js
<Row.L>
  <Red />
  <Green />
  <Blue />
</Row.L>
```

<img src="images/row-left.png" width="250" />

#### Center

```jsx
<Row.C>
  <Red />
  <Green />
  <Blue />
</Row.C>
```

<img src="images/row-center.png" width="250" />

#### Rigth

```jsx
<Row.R>
  <Red />
  <Green />
  <Blue />
</Row.R>
```

<img src="images/row-right.png" width="250" />

#### Bottom Left

```js
<Row.BL>
  <Red />
  <Green />
  <Blue />
</Row.BL>
```

<img src="images/row-bottom-left.png" width="250" />

#### Bottom

```jsx
<Row.B>
  <Red />
  <Green />
  <Blue />
</Row.B>
```

<img src="images/row-bottom.png" width="250" />

#### Bottom Right

```jsx
<Row.BR>
  <Red />
  <Green />
  <Blue />
</Row.BR>
```

<img src="images/row-bottom-right.png" width="250" />

#### Left to Right, aligned Top

```js
<Row.LRT>
  <Red />
  <Green />
  <Blue />
</Row.LRT>
```

<img src="images/row-left-right-top.png" width="250" />

#### Left to Right

```jsx
<Row.LR>
  <Red />
  <Green />
  <Blue />
</Row.LR>
```

<img src="images/row-left-right.png" width="250" />

#### Left to Right, aligned Bottom

```jsx
<Row.LRB>
  <Red />
  <Green />
  <Blue />
</Row.LRB>
```

<img src="images/row-left-right-bottom.png" width="250" />

#### Right to Left, aligned Top

```js
<Row.RLT>
  <Red />
  <Green />
  <Blue />
</Row.RLT>
```

<img src="images/row-right-left-top.png" width="250" />

#### Right to Left

```jsx
<Row.RL>
  <Red />
  <Green />
  <Blue />
</Row.RL>
```

<img src="images/row-right-left.png" width="250" />

#### Right to Left, aligned Bottom

```jsx
<Row.RLB>
  <Red />
  <Green />
  <Blue />
</Row.RLB>
```

<img src="images/row-right-left-bottom.png" width="250" />

#### Left, aligned Top to Bottom

```js
<Row.TBL>
  <Red />
  <Green />
  <Blue />
</Row.TBL>
```

<img src="images/row-top-bottom-left.png" width="250" />

#### Center, aligned Top to Bottom

```jsx
<Row.TBC>
  <Red />
  <Green />
  <Blue />
</Row.TBC>
```

<img src="images/row-top-bottom-center.png" width="250" />

#### Right, aligned Top to Bottom

```jsx
<Row.TBR>
  <Red />
  <Green />
  <Blue />
</Row.TBR>
```

<img src="images/row-top-bottom-right.png" width="250" />

### `Col0`, `Col1`, `Row7`... (Flex)

The package also exports `Col[0-9]` and `Row[0-9]` views with pre-defined `flex` values.

So instead of writing:

```js
<Col style={{ flex: 1 }}>
  <Red />
  <Green />
  <Blue />
</Col>
```

You could make use of `Col1`:

```js
import { Col1 } from 'react-native-col';

<Col1>
  <Red />
  <Green />
  <Blue />
</Col1>;
```

Here are all possible pre-defined `flex` values:

```js
import {
  Col0,
  Col1,
  Col2,
  Col3,
  Col4,
  Col5,
  Col6,
  Col7,
  Col8,
  Col9,
  //
  Row0,
  Row1,
  Row2,
  Row3,
  Row4,
  Row5,
  Row6,
  Row7,
  Row8,
  Row9,
} from 'react-native-col';
```

You can also use the positioning shortcuts on them:

```js
<Col6.TL />
<Col0.T />
<Col2.TR />
<Col9.L />
<Col4.C />
// ...

<Row7.TL />
<Row4.T />
// ...
```

### `create(Col|Row)`

```ts
createCol<T extends ViewProps>(BaseComponent: ComponentType<any>)
```

```ts
createRow<T extends ViewProps>(BaseComponent: ComponentType<any>)
```

Utility functions to generate all positioning shortcuts based on your `BaseComponent` of choice.

Works great with [`react-native-themesheet`](https://github.com/eightyfive/react-native-themesheet) for example:

```ts
import { createTheme } from 'react-native-themesheet';

// src/lib/theme.ts
export const { createBox } = createTheme(
  { primary: '#ff00dd' },
  { s: 4, m: 8, l: 16, xl: 32 }
);

// src/lib/index.ts
import { View } from 'react-native';
import { createCol } from 'react-native-col';

import { createBox } from './theme';

const Box = createBox(View);

export const Col = createCol(Box);

export const Row = createRow(Box);

// src/screens/home.tsx
import { Col, Row } from '../lib';

export function Home() {
  return (
    <Col.C py="xl" mb="l">
      {/* ... */}
    </Col.C>
    <Row.LR p="m" mb="m">{/* ... */}</Row.LR>
  );
}
```

### `createDialStyle`

```ts
type Dial = 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9

createDialStyle(flexDirection: 'row' | 'column', dial: Dial): ViewStyle
```

Utility function to generate Flex "dial" positioning _raw_ styles.

Think of your Flexbox container as a dial number pad:

```
┌─────────────┐
│ 1    2    3 │
│             │
│ 4    5    6 │
│             │
│ 7    8    9 │
└─────────────┘
```

You can then align container items according to the "dial" number:

```ts
import { createDialStyle as dial } from 'react-native-col';

dial('column', 3); // --> col direction, justified right (flex-end), aligned Top

dial('row', 8); // --> row direction, justified center, aligned bottom

// Etc
```

### `(col|row|flex)Styles`

All react-native `StyleSheet` styles used by the library are re-exported:

```js
import { colStyles, rowStyles, flexStyles } from 'react-native-col';

colStyles.col;
colStyles.TR;
colStyles.T;
// Etc...

rowStyles.row;
rowStyles.B;
rowStyles.BR;
// Etc...

flexStyles.f0;
flexStyles.f1;
flexStyles.f2;
// Etc...
```

## Credits

- [`react-native-row`](https://github.com/hyrwork/react-native-row) for the initial `dial` idea

---
_Source: https://npm.io/package/react-native-col · Machine-readable twin of the npm.io package page. Health data is recomputed on every publish._
