Command Palette

Search for a command to run...

v1.0 Public Beta is Live

Fully Animated, Production-Ready
UI Library for React Native

Built for Developers, Designers and Vibe Coders.Production-ready animated components with zero complexity.

React Native
Unistyles
Reanimated

Mobile First Designed Components

Fleet UI is a mobile first designed component library. Also support Variants, Type-Safe, and Accessibilities.

Open

Interactive Demo

Select a component to see it in action.

Engineered for Performance

Built close to the metal. Fleet UI leverages C++ bindings and worklets to deliver native-grade performance.

Zero Runtime Overhead

Built on Unistyles with C++ bindings. Styles computed ahead of time or on UI thread. Native performance, always.

Type-Safe Tokens

Full TypeScript design system. Change once, propagate everywhere. Autocomplete for all your tokens.

Reanimated Core

Every animation driven by worklets. 120fps smooth on any device. Complex gestures made simple.

Designed for Expression

Craft stunning, accessible interfaces that feel alive. Modern aesthetics meet strict usability standards.

Universal Minimalism

Stop looking like a Bootstrap app. Fleet UI help you to create apps that looks like Series B Quality apps.

Truly Mobile First

Not just a web port. Touch targets, native gestures, and mobile patterns from day one.

Accessible by Default

ARIA roles, contrast ratios, screen reader support. Inclusive design is not an afterthought.

Less Code. More Impact.

We handle the complexity so you can focus on shipping.

Under the hood
Button • ~575 lines
import type { ReactNode } from 'react';
import { forwardRef, isValidElement, useCallback, useEffect, useMemo } from 'react';
import {
	ActivityIndicator,
	type GestureResponderEvent,
	Pressable,
	Text,
	View,
} from 'react-native';
import Animated, {
	useAnimatedStyle,
	useSharedValue,
	withSpring,
} from 'react-native-reanimated';
import { StyleSheet } from 'react-native-unistyles';
import { useAnimatedVariantColor } from 'react-native-unistyles/reanimated';
import type { ButtonProps, ButtonSize } from './Button.types';

export const buttonStyles = StyleSheet.create((theme, _rt) => {
	const containerCompoundVariants = theme.utils
		.getColorSchemePaletteEntries(theme)
		.flatMap(([scheme, palette]) => {
			const hasSolidColor = theme.utils.paletteHasSolid(palette);

			return [
				{
					colorScheme: scheme,
					variant: 'filled' as const,
					styles: {
						backgroundColor: hasSolidColor
							? palette.solid
							: palette.content_inversed,
						_web: {
							_hover: {
								backgroundColor: palette.hover,
							},
						},
					},
				},
        // ... more variants
			];
		});

  // ... styles implementation
	return {
		container: {
			flexDirection: 'row',
			alignItems: 'center',
			justifyContent: 'center',
			borderRadius: theme.rounded.md,
      // ... more styles
		},
    // ...
	};
});

// Animation Constants
const SPRING_CONFIG = {
	stiffness: 1600,
	damping: 65,
	mass: 2.5,
};

const AnimatedPressable = Animated.createAnimatedComponent(Pressable);

export const Button = forwardRef<View, ButtonProps>((props, ref) => {
	const {
		colorScheme = 'primary',
		variant = 'filled',
		size = 'md',
		loading = false,
		children,
		onPress,
    // ... other props
		...rest
	} = props;

	const scale = useSharedValue(1);
	const opacity = useSharedValue(1);

	buttonStyles.useVariants({
		colorScheme,
		size,
		variant,
    // ...
	});

	const animatedStyle = useAnimatedStyle(() => ({
		transform: [{ scale: scale.value }],
		opacity: opacity.value,
	}));

	const handlePressIn = useCallback(
		(event: GestureResponderEvent) => {
			scale.value = withSpring(0.94, SPRING_CONFIG);
			opacity.value = withSpring(0.86, SPRING_CONFIG);
		},
		[scale, opacity]
	);
  
  // ... more event handlers

	return (
		<AnimatedPressable
			ref={ref}
			style={[
				buttonStyles.container,
				animatedStyle,
			]}
			onPress={handlePress}
			onPressIn={handlePressIn}
			{...rest}
		>
			{resolvedChildren}
		</AnimatedPressable>
	);
});

Button.displayName = 'Button';
Your Experience
Usage • ~10 lines
import { Button } from '@fleet-ui/components';

export function Example() {
  const handlePress = () => {
    // Handle press
  };

  return (
    <Button 
      variant="solid" 
      size="md" 
      onPress={handlePress}
    >
      Get Started
    </Button>
  );
}
Ready for Production

Your Own Token Architecture

A three-tier token system designed for scalability.

packages/core/src/tokens/raw/colors.ts
typescript

// Primary (Accent) - Light Scale
const primaryLightScale: ColorScale = {
	'1': '#f0ffff',
	'2': '#dbffff',
	'3': '#77fbff',
	'4': '#00e7ff',
	'5': '#00c5ff',
	'6': '#0098ff',
	'7': '#0069bb',
	'8': '#004679',
	'9': '#002f4e',
	'10': '#002236',
	'11': '#001e2e',
};

export const rawColors = {
	neutral: {
		light: neutralLightScale,
		dark: neutralDarkScale,
	},
	primary: {
		light: primaryLightScale,
		dark: primaryDarkScale,
	},
	white: '#ffffff',
	black: '#000000',
	transparent: 'transparent',
} as const;

Choose Your Installation Track

Whether you want full ownership of the source code or a traditional package dependency.

Recommended for Customization

Track A: Local Install

Copy-paste components into your project. You own the code.

Source Ownership
Zero Abstraction
Modify Implementation Directly
bash
pnpm dlx @fleet-ui/cli init
Best for Stability

Track B: Package Install

Standard npm dependency. Receive updates automatically.

Semantic Versioning
Automatic Updates
Standard SDK Pattern
bash
pnpm add @fleet-ui/core @fleet-ui/components

Ready to Ship Beautiful Apps?

Start building in minutes. No configuration needed.