# Expo App UI — Full Documentation > Production-ready, copy-paste React Native components for Expo. TypeScript-first, accessible, New Architecture compatible — with minimal peer dependencies so your screens stay lightweight. Full text of every documentation page, intended for ingestion by LLMs and AI crawlers. Site: https://expo-ui.thunderdevelops.in Repository: https://github.com/Krish-Panchani/expo-app-ui --- # CLI Commands > Complete reference for all Expo App UI CLI commands including add, list, and overwrite options. Learn how to use the command-line interface to add components to your project. Source: https://expo-ui.thunderdevelops.in/docs/cli ## Commands ### `add` Add a component, helper, constant, or context to your project. **Usage:** ```bash npx expo-app-ui add npx expo-app-ui add --overwrite ``` **Options:** - `--overwrite` - Overwrite existing files without prompting **Examples:** ```bash # Add a component npx expo-app-ui add button # Add a helper npx expo-app-ui add normalizeSize # Add a constant npx expo-app-ui add theme # Add top loading bar (component + context) npx expo-app-ui add top-loading-bar ``` :::tip The CLI automatically detects and adds required dependencies (helpers, constants) when you add a component. ::: ### `list` List all available components, helpers, constants, and contexts. **Usage:** ```bash npx expo-app-ui list ``` **Output:** ``` Available components: - box-view - button - custom-modal - custom-text - loading-bar - marquee - otp-input - profile-pic - progress-bar Available helpers: - normalizeSize Available constants: - theme Available contexts: - top-loading-bar-context ``` ## Global Options - `-v, --verbose` - Enable verbose output - `-s, --silent` - Enable silent mode (no output) ## File Overwrite Behavior When a file already exists, the CLI will: - **Interactive mode (TTY):** Prompt you to confirm overwrite - **With --overwrite flag:** Automatically overwrite without prompting - **Non-interactive mode:** Show an error and exit ## Auto-Dependency Detection The CLI automatically detects when a component requires: - `normalizeSize` helper - `theme` constants - Related components or contexts These dependencies are automatically added to your project if they don't already exist. --- # Comparison > How expo-app-ui compares to gluestack-UI, React Native Reusables, NativeBase, and React Native Paper. Source: https://expo-ui.thunderdevelops.in/docs/comparison ## TL;DR - **`expo-app-ui`** — copy-paste components, zero peer deps for most, Expo-first ergonomics, indie-friendly. - **gluestack-UI v3** — universal (web + native), accessibility-first, requires NativeWind/Tailwind, larger setup. - **React Native Reusables** — shadcn/ui port, Tailwind-only, deep customization, web mental model. - **NativeBase** — full design system, npm-installed (not copy-paste), heavier runtime. - **React Native Paper** — Material Design 3, opinionated, not Tailwind-based. ## Feature matrix | Feature | **expo-app-ui** | gluestack-UI v3 | RN Reusables | NativeBase | RN Paper | | ----------------------------- | --------------- | --------------- | ------------ | ---------- | -------- | | Distribution model | Copy-paste (CLI)| Copy-paste (CLI)| Copy-paste | npm | npm | | Code ownership | ✅ Full | ✅ Full | ✅ Full | ❌ | ❌ | | Styling system | StyleSheet | NativeWind | NativeWind | Tokens | Theme | | Tailwind required | ❌ | ✅ | ✅ | ❌ | ❌ | | Web support | Mostly ✅ | ✅ (universal) | ✅ | ✅ | ✅ | | New Architecture (Fabric) | ✅ | ✅ | ✅ | ⚠️ partial | ✅ | | Peer deps required | None for most | NativeWind, etc.| NativeWind | Many | Several | | Theming / dark mode | Per-prop | Built-in | Built-in | Built-in | Built-in | | Accessibility | Per-component | First-class | First-class | Good | Good | | Bundle size impact | Tiny (only what you copy) | Tiny | Tiny | Larger | Medium | | Auto-dependency detection | ✅ Built-in | ❌ | ❌ | n/a | n/a | | TypeScript | ✅ Strict | ✅ | ✅ | ✅ | ✅ | | Component count | ~25 | 30+ | 25+ | 60+ | 40+ | ## When to pick each ### Pick **expo-app-ui** if… - You want code you fully own, with **no styling framework lock-in**. - You're building an **Expo** app (SDK 52+) and want sensible defaults. - You don't want to set up NativeWind/Tailwind just to get a button. - You like the **auto-dependency** workflow (helpers/constants installed for you). - You're a solo dev or small team prioritizing shipping speed. ### Pick **gluestack-UI v3** if… - You're already on NativeWind/Tailwind and want a **universal** (web + native) library. - Accessibility and i18n are non-negotiable from day one. - You're building enterprise apps with a design-system team. ### Pick **React Native Reusables** if… - You love shadcn/ui's mental model on the web and want the same on native. - Your team is already deep on Tailwind. ### Pick **NativeBase / RN Paper** if… - You want a fully opinionated design system out of the box. - You're OK with an npm dependency and the runtime cost it brings. ## Honest tradeoffs of `expo-app-ui` We won't oversell. Things to know: - **No theme provider yet.** Components accept color props; a `ThemeProvider` is on the roadmap. - **Smaller component count** than gluestack/Paper. Adding new ones is straightforward — see [contributing](https://github.com/Krish-Panchani/expo-app-ui/blob/main/CONTRIBUTING.md). - **Styling is StyleSheet-based**, not Tailwind. If you prefer utility classes, RN Reusables or gluestack are better fits. - **No web-first universal stories** for every component (e.g. `birthdate-picker` is mobile-only). ## Migration Mixing `expo-app-ui` with another library is fine — components are isolated files in your repo. There's no global theme conflict, no provider you have to wrap your tree in. --- # Compatibility > Expo SDK, React Native, and New Architecture (Fabric/TurboModules) compatibility for expo-app-ui components. Source: https://expo-ui.thunderdevelops.in/docs/compatibility ## Versions | Tool | Supported | | ------------------- | ---------------------------------- | | Expo SDK | **52, 53, 54+** (latest) | | React Native | **0.74+** | | New Architecture | ✅ Fabric + TurboModules | | Old Architecture | ✅ Still supported | | Platforms | iOS · Android · Web (component-dependent) | | TypeScript | ✅ Strict mode | | Node (CLI) | ≥ 14 | ## New Architecture (Fabric / TurboModules) Expo SDK 52+ defaults to the New Architecture. Every component is built and tested against: ```json // app.json { "expo": { "newArchEnabled": true } } ``` ### What's verified - All components render correctly under Fabric - No `findNodeHandle` or other legacy bridge APIs - Animations use `react-native-reanimated` v3 (Fabric-ready) where animations are needed - No deprecated `PropTypes`, no `componentWillReceiveProps`, no string refs ### Components with native dependencies Most components are pure JS. The few that touch native: | Component | Native dep | New Arch ready | | ---------------- | --------------------------------------------- | -------------- | | `custom-modal` | `react-native-reanimated` | ✅ (Reanimated 3+) | | `loading-bar` | `react-native-reanimated` | ✅ | | `bottom-sheet` | `react-native-reanimated`, `react-native-gesture-handler` | ✅ | | `slider` | `react-native-gesture-handler` | ✅ | | `accordion` | `react-native-reanimated` (LayoutAnimation fallback) | ✅ | If you don't have these libraries installed, the CLI will still copy the file — install peers as documented on the component's docs page. ## Web support Components ship as universal where possible. Mobile-specific behavior (e.g. `BackHandler`, native gestures, keyboard avoidance) gracefully no-ops on web. Components that don't make sense on web (e.g. `birthdate-picker` wheel pickers) are marked **mobile-only** in their docs. ## Reporting compatibility issues If a component breaks with a specific SDK or architecture flag, please open an issue at [github.com/Krish-Panchani/expo-app-ui/issues](https://github.com/Krish-Panchani/expo-app-ui/issues) including: - Expo SDK version - React Native version - Whether the New Architecture is enabled - Minimal Snack repro --- # Getting Started > Learn how to install and use Expo App UI in your Expo React Native project. Quick start guide with installation, path aliases, and auto-dependency detection. Source: https://expo-ui.thunderdevelops.in/docs/getting-started :::tip[Designed for production] Every component in this library is built for real apps, not demos. That means **TypeScript strict mode**, **accessibility props** wired up, **New Architecture** (Fabric) compatibility, **minimal peer dependencies** so your bundle stays light, and an **automated test suite** for the CLI. Customize freely — the patterns are already production-grade. ::: ## Installation ### Using npx (Recommended) No installation required. Use directly with npx: ```bash npx expo-app-ui ``` ### Global Installation Install globally for easier access: ```bash npm install -g expo-app-ui expo-app-ui ``` ## Quick Start Add a component to your project: ```bash npx expo-app-ui add custom-text ``` ## Path Aliases Make sure your project has path aliases configured. ### tsconfig.json ```json { "compilerOptions": { "paths": { "@/*": ["./*"] } } } ``` ### babel.config.js ```js module.exports = function(api) { api.cache(true); return { presets: ['babel-preset-expo'], plugins: [ [ 'module-resolver', { root: ['./'], alias: { '@': './', }, }, ], ], }; }; ``` ## Auto-Dependency Detection The CLI automatically detects when a component requires: - `normalizeSize` helper - `theme` constants - Related components or contexts These dependencies are automatically added to your project if they don't already exist. ## Next Steps - [Browse Components →](/docs/components) - [Learn CLI Commands →](/docs/cli) --- # Accordion > An expandable accordion component with smooth animations and customizable theming for Expo React Native. Learn how to use Accordion with examples and API documentation. Source: https://expo-ui.thunderdevelops.in/docs/components/accordion
Accordion Component Example
## Installation ```bash npx expo-app-ui add accordion ``` :::note The accordion component is self-contained and doesn't require any external dependencies. ::: ## Usage ```tsx import Accordion from "@/components/ui/Accordion"; ``` ## Complete Example Here's a complete example showing all accordion features: ```tsx import Accordion from "@/components/ui/Accordion"; import React from "react"; import { ScrollView, StyleSheet, Text } from "react-native"; export default function AccordionExampleScreen() { const data = [ { id: "1", title: "What is React Native?", content: "React Native allows you to build mobile apps using JavaScript and React.", }, { id: "2", title: "Is React Native fast?", content: "Yes. It uses native components and can be optimized when needed.", }, { id: "3", title: "Can I use native code?", content: "Absolutely. Native modules can be written in Swift, Kotlin, or Java.", }, ]; return ( Accordion Component Demos Default (Single Open) Multiple Open Pre-opened + Themed ); } const styles = StyleSheet.create({ container: { flex: 1, padding: 24, backgroundColor: "#FFFFFF", }, heading: { fontSize: 24, fontWeight: "600", textAlign: "center", marginBottom: 24, }, subHeading: { fontSize: 18, fontWeight: "500", marginTop: 28, marginBottom: 12, }, }); ``` ## Props | Prop | Type | Default | Description | |------|------|---------|-------------| | `data` | `AccordionItem[]` | Required | Array of accordion items with `id`, `title`, and `content` | | `allowMultiple` | `boolean` | `false` | Allow multiple items to be open simultaneously | | `defaultOpenIds` | `string[]` | `[]` | Array of item IDs to be open by default | | `theme` | `AccordionTheme` | `{}` | Custom theme object for styling | ### AccordionItem Type ```tsx interface AccordionItem { id: string; title: string; content: React.ReactNode; } ``` ### AccordionTheme Type ```tsx interface AccordionTheme { backgroundColor?: string; borderColor?: string; textColor?: string; mutedTextColor?: string; accentColor?: string; borderRadius?: number; } ``` ## Examples ### Basic Accordion ```tsx ``` ### Multiple Items Open ```tsx ``` ### Pre-opened Items ```tsx ``` ### Custom Theme ```tsx ``` ### Combined Features ```tsx ``` ## Features - **Smooth Animations**: Uses LayoutAnimation for smooth expand/collapse transitions - **Single or Multiple Open**: Control whether multiple items can be open at once - **Customizable Theming**: Full control over colors, borders, and styling - **Pre-opened Items**: Set default open items on mount - **Animated Chevron**: Rotating chevron indicator shows open/closed state - **Accessibility**: Proper accessibility roles and states - **No Dependencies**: Self-contained component with no external dependencies - **TypeScript Support**: Full TypeScript types included ## Notes - The component uses `LayoutAnimation` which requires enabling on Android (handled automatically) - Content can be any React node, not just text - The chevron rotates 180 degrees when an item is opened - When `allowMultiple` is false, opening one item closes others - Theme values are merged with defaults, so you only need to specify what you want to override - The component handles all state management internally --- # Auto Scroll Cards > A carousel component with auto-scrolling, manual swipe, and indicator support for Expo React Native. Learn how to use AutoScrollCards with examples and API documentation. Source: https://expo-ui.thunderdevelops.in/docs/components/auto-scroll-cards
Auto Scroll Cards Component Example
## Installation ```bash npx expo-app-ui add auto-scroll-cards ``` :::note The auto-scroll cards component is self-contained and doesn't require any external dependencies. ::: ## Usage ```tsx import AutoScrollCards from "@/components/ui/AutoScrollCards"; } /> ``` ## Complete Example Here's a complete example showing all auto-scroll cards features: ```tsx import AutoScrollCards from "@/components/ui/AutoScrollCards"; import React from "react"; import { ScrollView, StyleSheet, Text, View } from "react-native"; export default function AutoScrollCardsExampleScreen() { const testimonials = [ { quote: "This product completely changed our workflow.", author: "Sarah Johnson", }, { quote: "Clean UI, smooth animations, very easy to use.", author: "Michael Lee", }, { quote: "Best component library we've used so far.", author: "Ananya Patel", }, ]; const features = [ { title: "Fast", desc: "Optimized for performance" }, { title: "Reusable", desc: "Built for scale" }, { title: "Customizable", desc: "Theme it your way" }, ]; const banners = [ { label: "🔥 New Features Released" }, { label: "🎉 50% Discount This Week" }, { label: "🚀 Upgrade Your Experience" }, ]; return ( Auto-Scrolling Cards Demos {/* ================= Testimonials ================= */} Testimonials (Auto Scroll) Automatically scrolls every few seconds ( "{item.quote}" — {item.author} )} /> {/* ================= Features ================= */} Feature Highlights (Manual Swipe) Auto-scroll disabled, swipe manually ( {item.title} {item.desc} )} /> {/* ================= Banners ================= */} Promotional Banners (Looping) Looping carousel with faster interval ( {item.label} )} /> ); } const styles = StyleSheet.create({ container: { flex: 1, padding: 24, backgroundColor: "#FFFFFF", }, heading: { fontSize: 24, fontWeight: "600", textAlign: "center", marginBottom: 24, }, subHeading: { fontSize: 18, fontWeight: "500", marginTop: 28, marginBottom: 6, }, caption: { fontSize: 13, color: "#6B7280", marginBottom: 12, }, /* -------- Cards -------- */ testimonialCard: { backgroundColor: "#F9FAFB", borderRadius: 14, padding: 20, height: 160, justifyContent: "center", }, quote: { fontSize: 15, fontStyle: "italic", marginBottom: 10, }, author: { fontSize: 13, color: "#6B7280", textAlign: "right", }, featureCard: { backgroundColor: "#EEF2FF", borderRadius: 12, padding: 16, height: 120, justifyContent: "center", }, featureTitle: { fontSize: 16, fontWeight: "600", marginBottom: 6, }, featureDesc: { fontSize: 13, color: "#374151", }, bannerCard: { backgroundColor: "#2563EB", borderRadius: 16, height: 140, justifyContent: "center", alignItems: "center", }, bannerText: { color: "#FFFFFF", fontSize: 18, fontWeight: "600", }, }); ``` ## Props | Prop | Type | Default | Description | |------|------|---------|-------------| | `data` | `T[]` | Required | Array of data items to display | | `renderItem` | `(item: T, index: number) => ReactNode` | Required | Function to render each card | | `cardWidth` | `number` | Required | Width of each card in pixels | | `gap` | `number` | `12` | Gap between cards in pixels | | `autoScroll` | `boolean` | `true` | Enable automatic scrolling | | `interval` | `number` | `3000` | Auto-scroll interval in milliseconds | | `loop` | `boolean` | `true` | Loop back to first card after last | | `showIndicators` | `boolean` | `true` | Show dot indicators at bottom | ## Examples ### Basic Auto-Scroll ```tsx ( {item.text} )} /> ``` ### Manual Swipe Only ```tsx } /> ``` ### Custom Interval ```tsx } /> ``` ### Without Indicators ```tsx } /> ``` ### No Looping ```tsx } /> ``` ### Custom Gap ```tsx } /> ``` ## Features - **Automatic Scrolling**: Configurable auto-scroll with custom intervals - **Manual Swipe Support**: Users can swipe to navigate manually - **Smart Pause**: Auto-scroll pauses when user interacts - **Looping Carousel**: Seamlessly loops from last to first card - **Dot Indicators**: Visual indicators showing current position - **Smooth Snap Scrolling**: Cards snap to position with smooth animations - **Generic Type Support**: Works with any data type via TypeScript generics - **No Dependencies**: Self-contained component with no external dependencies - **Performance Optimized**: Uses FlatList for efficient rendering ## Notes - Auto-scroll automatically pauses when the user starts swiping - The component resumes auto-scrolling after user interaction ends - When `loop` is false, scrolling stops at the last card - Card width should match your design - the component handles spacing - The gap prop controls spacing between cards - Indicators show active state with a larger, colored dot - Works best with 2+ items (auto-scroll disabled for single item) - The component uses `FlatList` under the hood for optimal performance - All cards should have the same width for best visual consistency --- # Avatar > User avatar with image, initials fallback, and optional online/offline status indicator. Source: https://expo-ui.thunderdevelops.in/docs/components/avatar ## Installation ```bash npx expo-app-ui add avatar ``` ## Usage ```tsx import Avatar from "@/components/ui/avatar"; ``` ## Props | Prop | Type | Default | Description | | -------------------- | ---------------------------------------------------------- | ------------ | --------------------------------- | | `source` | `ImageSourcePropType` | - | Image source | | `name` | `string` | - | Used to derive initials fallback | | `size` | `'xs' \| 'sm' \| 'md' \| 'lg' \| 'xl' \| number` | `'md'` | Avatar size | | `rounded` | `boolean` | `true` | Circle vs squircle | | `backgroundColor` | `string` | `'#E5E7EB'` | Fallback background | | `textColor` | `string` | `'#374151'` | Initials color | | `status` | `'online' \| 'offline' \| 'busy' \| 'away'` | - | Status indicator color | | `showStatus` | `boolean` | `false` | Render the status dot | | `style` | `StyleProp` | - | Container style override | | `imageStyle` | `StyleProp` | - | Image style override | | `accessibilityLabel` | `string` | `Avatar for {name}` | Screen-reader label | ## Accessibility - `accessibilityRole="image"` - Provides a meaningful default label using `name` --- # Badge > A compact label for status, counts, and tags. Supports solid, outline, and subtle variants with semantic tones. Source: https://expo-ui.thunderdevelops.in/docs/components/badge ## Installation ```bash npx expo-app-ui add badge ``` ## Usage ```tsx import Badge from "@/components/ui/badge"; ``` ## Props | Prop | Type | Default | Description | | ------------------- | ---------------------------------------------------------- | ----------- | ------------------------------------ | | `label` | `string` | - | Text shown inside the badge | | `children` | `ReactNode` | - | Alternative to `label` | | `variant` | `'solid' \| 'outline' \| 'subtle'` | `'solid'` | Visual style | | `tone` | `'neutral' \| 'primary' \| 'success' \| 'warning' \| 'danger'` | `'neutral'` | Semantic color tone | | `size` | `'sm' \| 'md' \| 'lg'` | `'md'` | Badge size | | `rounded` | `boolean` | `true` | Pill shape vs square | | `dot` | `boolean` | `false` | Render only a colored dot | | `style` | `StyleProp` | - | Container style override | | `textStyle` | `StyleProp` | - | Text style override | | `accessibilityLabel`| `string` | - | Screen-reader label | ## Accessibility - Renders with `accessibilityRole="text"` (or `image` for `dot`) - `accessibilityLabel` defaults to `label` --- # Birthdate Picker > A native-style date picker component for selecting birthdates with month, day, and year wheels for Expo React Native. Learn how to use CustomBirthdatePicker with examples and API documentation. Source: https://expo-ui.thunderdevelops.in/docs/components/birthdate-picker
Birthdate Picker Component Example
## Installation ```bash npx expo-app-ui add birthdate-picker ``` :::note The birthdate picker component requires `@expo/vector-icons` for the calendar icon. Make sure it's installed in your project. ::: ## Usage ```tsx import CustomBirthdatePicker from "@/components/ui/birthdate-picker"; console.log(date)} /> ``` ## Complete Example Here's a complete example showing the birthdate picker: ```tsx import CustomBirthdatePicker from "@/components/ui/birthdate-picker"; import React, { useState } from "react"; import { StyleSheet, Text, View } from "react-native"; export default function BirthdatePickerExample() { const [selectedDate, setSelectedDate] = useState(""); return ( Birthdate Picker Example { setSelectedDate(date); console.log("Selected date:", date); }} /> {selectedDate && ( Selected: {selectedDate} )} ); } const styles = StyleSheet.create({ container: { flex: 1, padding: 24, backgroundColor: "#FFFFFF", }, heading: { fontSize: 22, fontWeight: "600", textAlign: "center", marginBottom: 20, }, result: { marginTop: 20, textAlign: "center", fontSize: 14, color: "#333", }, }); ``` ## Props | Prop | Type | Default | Description | |------|------|---------|-------------| | `initialDate` | `Date` | `new Date()` | Initial selected date | | `onDateChange` | `(date: string) => void` | Required | Callback when date changes (returns YYYY-MM-DD format) | ## Examples ### Basic Usage ```tsx { console.log("Selected date:", date); }} /> ``` ### With Initial Date ```tsx ``` ### In a Form ```tsx const [birthdate, setBirthdate] = useState(""); setBirthdate(date)} /> {birthdate && ( Birthdate: {birthdate} )} ``` ## Features - **Native iOS-Style Picker**: Three-wheel picker for month, day, and year - **Automatic Day Validation**: Handles leap years and month-specific day limits - **Modal Presentation**: Opens in a modal overlay - **Formatted Output**: Returns date in YYYY-MM-DD format - **100 Years Range**: Supports dates from 100 years ago to today - **Visual Feedback**: Highlighted selection area - **Smooth Scrolling**: Native scroll behavior with snap-to-item - **Cancel/Done Actions**: Clear user actions for selection ## Date Format The `onDateChange` callback returns dates in **YYYY-MM-DD** format: ```tsx onDateChange={(date) => { // date will be: "2000-01-15" console.log(date); }} ``` ## Notes - The component automatically adjusts the day picker when month or year changes - For example, if you select February, days 29-31 are automatically removed - Leap years are handled automatically (February 29 is available in leap years) - The year range is from 100 years ago to the current year - The modal can be dismissed by tapping outside or using Cancel button - Changes are only applied when "Done" is pressed - The component uses `@expo/vector-icons` for the calendar icon - All dates are in local timezone - The input field shows the selected date in readable format (e.g., "15 January 2000") ## Styling The component uses a clean, native iOS-style design with: - Light gray borders - Blue accent color for selected items - Semi-transparent overlay background - Rounded corners on modal and input - Smooth animations You can customize the colors by modifying the `COLORS` constant in the component file. --- # Bottom Sheet > Modal bottom sheet with swipe-to-dismiss, dynamic content height, and animated backdrop. Source: https://expo-ui.thunderdevelops.in/docs/components/bottom-sheet ## Installation ```bash npx expo-app-ui add bottom-sheet ``` ## Usage ```tsx import BottomSheet from "@/components/ui/bottom-sheet"; import { useState } from "react"; import { Text, View } from "react-native"; const [open, setOpen] = useState(false); setOpen(false)}> Settings {/* …content */} ``` ## Props | Prop | Type | Default | Description | | ------------------- | ------------------------------------ | -------------------- | ---------------------------------------- | | `visible` | `boolean` | required | Show/hide | | `onClose` | `() => void` | required | Close handler | | `children` | `ReactNode` | required | Sheet content | | `height` | `number \| 'auto'` | `'auto'` | Fixed height or content-driven | | `maxHeight` | `number` | `90% of screen` | Cap for `auto` | | `backgroundColor` | `string` | `'#FFFFFF'` | Sheet bg | | `backdropColor` | `string` | `'rgba(0,0,0,0.5)'` | Backdrop color | | `borderRadius` | `number` | `20` | Top corner radius | | `showHandle` | `boolean` | `true` | Render the drag handle | | `handleColor` | `string` | `'#D1D5DB'` | Drag handle color | | `enableSwipeDown` | `boolean` | `true` | Allow swipe-to-dismiss | | `closeOnBackdrop` | `boolean` | `true` | Tap backdrop to close | | `closeOnBackPress` | `boolean` | `true` | Android back to close | ## Accessibility - `accessibilityViewIsModal` on the wrapper - Backdrop dismiss is announced via the back-press handler ## Notes - For sheets that need keyboard avoidance during text input, the component dismisses the keyboard on close. If you need keyboard-pushing behavior, wrap your content in `KeyboardAvoidingView`. - For more advanced gestures (snap points, programmatic positioning), consider `@gorhom/bottom-sheet`. This component intentionally stays minimal. --- # Box View > A flexible layout component with comprehensive flexbox props for Expo React Native. Learn how to use BoxView with examples and API documentation. Source: https://expo-ui.thunderdevelops.in/docs/components/box-view ## Installation ```bash npx expo-app-ui add box-view ``` ## Usage ```tsx import BoxView from "@/components/ui/box-view"; Item 1 Item 2 ``` ## Props | Prop | Type | Default | Description | |------|------|---------|-------------| | flexDirection | 'row' \| 'column' | - | Flex direction | | justifyContent | 'flex-start' \| 'flex-end' \| 'center' \| 'space-between' \| 'space-around' \| 'space-evenly' | - | Justify content alignment | | alignItems | 'flex-start' \| 'flex-end' \| 'center' \| 'stretch' \| 'baseline' | - | Align items | | gap | number | - | Gap between children | | padding | number | - | Uniform padding | | paddingX | number | - | Horizontal padding | | paddingY | number | - | Vertical padding | | margin | number | - | Uniform margin | | width | string \| number | - | Width | | height | string \| number | - | Height | ## Examples ### Basic Layout ```tsx Item 1 Item 2 ``` ### Centered Content ```tsx Centered ``` ## Features - Comprehensive flexbox props - Easy spacing with gap, padding, margin - Direction-specific spacing props - Customizable dimensions --- # Button > A flexible button component with variants and icon support for Expo React Native. Learn how to use Button with examples and API documentation. Source: https://expo-ui.thunderdevelops.in/docs/components/button
Button Component Examples
## Installation ```bash npx expo-app-ui add button ``` :::note The button component is self-contained and doesn't require any external dependencies. ::: ## Usage ```tsx import Button from "@/components/ui/button";