Documentation Index
Fetch the complete documentation index at: https://mintlify.com/PapillonApp/Papillon/llms.txt
Use this file to discover all available pages before exploring further.
Getting Started with Papillon UI
Learn how to set up Papillon UI in your React Native project.
Prerequisites
Before you begin, ensure you have:
- Node.js 16 or later
- React Native project (Expo or bare React Native)
- Basic knowledge of React and TypeScript
Installation
Papillon UI is part of the Papillon monorepo. To use it in your project, you’ll need to install the required dependencies.
Install Dependencies
Install the required peer dependencies for Papillon UI:npm install react-native-reanimated react-native-gesture-handler @react-navigation/native
Configure Babel
Add the Reanimated plugin to your babel.config.js:module.exports = {
presets: ['module:metro-react-native-babel-preset'],
plugins: [
'react-native-reanimated/plugin', // Must be last
],
};
The Reanimated plugin must be listed last in the plugins array.
Set Up Theming
Wrap your app with the React Navigation theme provider:import { NavigationContainer } from '@react-navigation/native';
import { useColorScheme } from 'react-native';
function App() {
const scheme = useColorScheme();
const theme = {
dark: scheme === 'dark',
colors: {
primary: '#369a82',
background: scheme === 'dark' ? '#000000' : '#F5F5F5',
card: scheme === 'dark' ? '#1C1C1E' : '#FFFFFF',
text: scheme === 'dark' ? '#FFFFFF' : '#000000',
border: scheme === 'dark' ? '#38383A' : '#C6C6C8',
notification: '#FF3B30',
},
};
return (
<NavigationContainer theme={theme}>
{/* Your app content */}
</NavigationContainer>
);
}
Import Components
Start using Papillon UI components in your app:import { Button, Typography, List, Item } from 'papillon-ui';
function Example() {
return (
<List>
<Item onPress={() => console.log('Pressed')}>
<Typography variant="title">Hello Papillon UI</Typography>
<Typography variant="caption" color="secondary">
Your first component
</Typography>
</Item>
</List>
);
}
Basic Usage
Typography
The Typography component is the foundation for all text in Papillon UI:
import { Typography } from 'papillon-ui';
<Typography variant="h1">Large Heading</Typography>
<Typography variant="body1">Regular body text</Typography>
<Typography variant="caption" color="secondary">Secondary text</Typography>
Buttons come in multiple variants:
import { Button } from 'papillon-ui';
import { User } from 'lucide-react-native';
<Button
variant="primary"
title="Primary Button"
onPress={() => {}}
/>
<Button
variant="outline"
title="Outline Button"
icon={<User />}
onPress={() => {}}
/>
<Button
variant="light"
title="Light Button"
loading={true}
/>
Lists and Items
Create beautiful lists with automatic borders and padding:
import { List, Item, Typography } from 'papillon-ui';
import { ChevronRight, User } from 'lucide-react-native';
<List>
<Item onPress={() => {}}>
<Item.Leading>
<User size={24} />
</Item.Leading>
<Typography variant="title">Profile</Typography>
<Typography variant="caption" color="secondary">
View your profile
</Typography>
<Item.Trailing>
<ChevronRight size={20} />
</Item.Trailing>
</Item>
<Item onPress={() => {}}>
<Typography variant="title">Settings</Typography>
</Item>
</List>
Theme Integration
Papillon UI automatically adapts to your React Navigation theme:
import { useTheme } from '@react-navigation/native';
import { Button } from 'papillon-ui';
function ThemedComponent() {
const { colors, dark } = useTheme();
return (
<Button
variant="primary"
color="primary" // Uses theme.colors.primary
title="Themed Button"
/>
);
}
TypeScript Support
All components include full TypeScript definitions:
import { ButtonProps, TypographyProps } from 'papillon-ui';
const CustomButton: React.FC<ButtonProps> = (props) => {
return <Button {...props} />;
};
Use memoization for lists
When rendering large lists, wrap list items in React.memo to prevent unnecessary re-renders:const MemoizedItem = React.memo(({ item }) => (
<Item onPress={() => {}}>
<Typography>{item.title}</Typography>
</Item>
));
Disable animations when needed
For very long lists, consider disabling animations:<List animated={false}>
{items.map(item => <Item key={item.id}>{item.name}</Item>)}
</List>
Show skeleton loaders while data is loading:<Typography variant="title" skeleton={isLoading}>
{data?.title}
</Typography>
Next Steps
Button
Learn about all button variants and props
List
Master list layouts and item composition
Typography
Explore the typography system
Course
Display timetable courses