@delacour/react-native-ui · alpha

Build your React Native component library.

Composable, accessible components with thoughtful defaults. Code you can customize, extend and make your own — for iOS and Android, painted from the same design tokens as your web app.

bunx delacour@alpha add button switch slider

Or try every component on your phone —join the iOS beta on TestFlight

Components

What they look like.

20 components, every one captured on an iPhone in both themes. Toggle the site's theme and the pictures follow.

See all components →

Design tokens

Your web theme is already your mobile theme.

The palette is shadcn's, in shadcn's shape. Every token your web app already defines — --primary, --muted-foreground, --radius — is the token these components paint from. Copy your globals.css across and the mobile app matches the website from day one: same colours, same corners, same light and dark, and styled composable components before you have written a single one.

/* globals.css — your web app, as shadcn wrote it */:root {  --radius: 0.625rem;  --background: oklch(1 0 0);  --foreground: oklch(0.145 0 0);  --primary: oklch(0.205 0 0);  --primary-foreground: oklch(0.985 0 0);  --muted-foreground: oklch(0.556 0 0);}.dark {  --background: oklch(0.145 0 0);  --foreground: oklch(0.985 0 0);  --primary: oklch(0.922 0 0);  --primary-foreground: oklch(0.205 0 0);  --muted-foreground: oklch(0.708 0 0);}
bunx delacour@alpha theme ./globals.css
/* theme.css — the same tokens, in the shape Uniwind reads */@layer theme {  :root {    @variant light {      --background: oklch(1 0 0);      --primary: oklch(0.205 0 0);      --primary-foreground: oklch(0.985 0 0);    }    @variant dark {      --background: oklch(0.145 0 0);      --primary: oklch(0.922 0 0);      --primary-foreground: oklch(0.205 0 0);    }  }}
import { Button } from "@delacour/react-native-ui/button";import { Text } from "@delacour/react-native-ui/text";<View className="bg-background p-4">  <Text className="text-muted-foreground">Same names. Same palette.</Text>  <Button variant="primary" onPress={save}>    <Button.Label>Save</Button.Label>  </Button></View>;
  • One command, one file

    delacour theme takes a path, a URL or stdin — a hand-written theme, a shadcn init output or a tweakcn export — and writes the file this library reads.

  • Nothing translated

    Components reference the semantic name — bg-primary, text-muted-foreground — never a raw colour and never a dark: prefix. The variable swap is the theme.

  • The rest is derived

    The six tokens shadcn has no name for — success, warning, info, elevated, tertiary, overlay — are built from the ones it does, so your palette drags them along.

Read about theming →

Principles

Built the way you would build it yourself.

Uniwind for styling, Reanimated and the Gesture API for motion, Skia for charts. Every decision written down beside the code that makes it.

Theme

This site is wearing one of them.

Every colour, corner and face on this page is a preset from the customiser — the same one that writes your app's theme.css. Try another, or build your own.

Open the customiser →

Install

Own the source, or install the package.

The CLI writes each component's files into your project so you can change anything. The package is the same code, versioned, for a team that would rather take updates.

Copy a component's source in

bunx delacour@alpha add button

Or install the package

bun add @delacour/react-native-ui@alpha

Library

20 components, and counting.

Open the index →