Installation
Follow these steps to set up AppyKit UI in your React Native project.
Prerequisites:
Make sure you have the following dependencies installed in your project: Expo, ReactNative and NativeWind. (Follow the installation guide for NativeWind from the official documentation)
Initialization of AppykitUI
npx appykit@latest init
Add Components
You can now start adding components to your project.
npx appykit@latest add button
npx appykit@latest add text
The command above will add the Button component to your project. You can then import it like this:
import { Button } from "@/components/ui/button";
import { Text } from "@/components/ui/text";
<Button>
<Text>Button</Text>
</Button>
Follow the installation guide for NativeWind from the official documentation
Add dependencies
npx expo install tailwindcss-animate class-variance-authority clsx tailwind-merge
Configure the path aliases in your tsconfig.json file.
{
"compilerOptions": {
"baseUrl": ".",
"paths": {
"@/*": ["*"]
}
}
}
Add a cn helper
Add the following code to the @/lib/utils.ts file:
import { clsx, type ClassValue } from 'clsx';
import { twMerge } from 'tailwind-merge';
export function cn(...inputs: ClassValue[]) {
return twMerge(clsx(inputs));
}
Add the following css variables to ~/global.css file.
@tailwind base;
@tailwind components;
@tailwind utilities;
@layer base {
:root {
--background: 0 0% 100%;
--foreground: 240 10% 3.9%;
--card: 0 0% 100%;
--card-foreground: 240 10% 3.9%;
--popover: 0 0% 100%;
--popover-foreground: 240 10% 3.9%;
--primary: 240 5.9% 10%;
--primary-foreground: 0 0% 98%;
--secondary: 240 4.8% 95.9%;
--secondary-foreground: 240 5.9% 10%;
--muted: 240 4.8% 95.9%;
--muted-foreground: 240 3.8% 46.1%;
--accent: 240 4.8% 95.9%;
--accent-foreground: 240 5.9% 10%;
--destructive: 0 84.2% 60.2%;
--destructive-foreground: 0 0% 98%;
--border: 240 5.9% 90%;
--input: 240 5.9% 90%;
--ring: 240 5.9% 10%;
}
.dark:root {
--background: 240 10% 3.9%;
--foreground: 0 0% 98%;
--card: 240 10% 3.9%;
--card-foreground: 0 0% 98%;
--popover: 240 10% 3.9%;
--popover-foreground: 0 0% 98%;
--primary: 0 0% 98%;
--primary-foreground: 240 5.9% 10%;
--secondary: 240 3.7% 15.9%;
--secondary-foreground: 0 0% 98%;
--muted: 240 3.7% 15.9%;
--muted-foreground: 240 5% 64.9%;
--accent: 240 3.7% 15.9%;
--accent-foreground: 0 0% 98%;
--destructive: 0 72% 51%;
--destructive-foreground: 0 0% 98%;
--border: 240 3.7% 15.9%;
--input: 240 3.7% 15.9%;
--ring: 240 4.9% 83.9%;
}
}
Add the following code in the @/lib/constants.ts file for the navigation theme colors:
export const NAV_THEME = {
light: {
background: 'hsl(0 0% 100%)', // background
border: 'hsl(240 5.9% 90%)', // border
card: 'hsl(0 0% 100%)', // card
notification: 'hsl(0 84.2% 60.2%)', // destructive
primary: 'hsl(240 5.9% 10%)', // primary
text: 'hsl(240 10% 3.9%)', // foreground
},
dark: {
background: 'hsl(240 10% 3.9%)', // background
border: 'hsl(240 3.7% 15.9%)', // border
card: 'hsl(240 10% 3.9%)', // card
notification: 'hsl(0 72% 51%)', // destructive
primary: 'hsl(0 0% 98%)', // primary
text: 'hsl(0 0% 98%)', // foreground
},
};
If you changed the colors in the ~/global.css file, update the @/lib/constants.ts file with the new colors. Each color has a commented css variable name next to it.
Use the CSS variables in your tailwind.config.js file.
const { hairlineWidth } = require('nativewind/theme');
/** @type {import('tailwindcss').Config} \*/
module.exports = {
darkMode: 'class',
content: ['./app/**/_.{ts,tsx}', './components/\*\*/_.{ts,tsx}'],
presets: [require('nativewind/preset')],
theme: {
extend: {
colors: {
border: 'hsl(var(--border))',
input: 'hsl(var(--input))',
ring: 'hsl(var(--ring))',
background: 'hsl(var(--background))',
foreground: 'hsl(var(--foreground))',
primary: {
DEFAULT: 'hsl(var(--primary))',
foreground: 'hsl(var(--primary-foreground))',
},
secondary: {
DEFAULT: 'hsl(var(--secondary))',
foreground: 'hsl(var(--secondary-foreground))',
},
destructive: {
DEFAULT: 'hsl(var(--destructive))',
foreground: 'hsl(var(--destructive-foreground))',
},
muted: {
DEFAULT: 'hsl(var(--muted))',
foreground: 'hsl(var(--muted-foreground))',
},
accent: {
DEFAULT: 'hsl(var(--accent))',
foreground: 'hsl(var(--accent-foreground))',
},
popover: {
DEFAULT: 'hsl(var(--popover))',
foreground: 'hsl(var(--popover-foreground))',
},
card: {
DEFAULT: 'hsl(var(--card))',
foreground: 'hsl(var(--card-foreground))',
},
},
borderWidth: {
hairline: hairlineWidth(),
},
keyframes: {
'accordion-down': {
from: { height: '0' },
to: { height: 'var(--radix-accordion-content-height)' },
},
'accordion-up': {
from: { height: 'var(--radix-accordion-content-height)' },
to: { height: '0' },
},
},
animation: {
'accordion-down': 'accordion-down 0.2s ease-out',
'accordion-up': 'accordion-up 0.2s ease-out',
},
},
},
plugins: [require('tailwindcss-animate')],
};
Layout.tsx
import { StatusBar } from 'expo-status-bar';
import './global.css';
import { Text } from 'react-native';
import { SafeAreaProvider, SafeAreaView } from 'react-native-safe-area-context';
export default function App() {
return (
<SafeAreaProvider>
<SafeAreaView style={{ flex: 1 }} edges={['top', 'left', 'right']}>
<StatusBar style="auto" />
<Text className="text-black">Home</Text>
</SafeAreaView>
</SafeAreaProvider>
);
}