RC 2
SearchField, ListGroup, and Slider components, Select multi-selection mode, Button feedback API refactor, peer dependency relaxation
RC 2 continues the march toward production readiness with three new components—SearchField, ListGroup, and Slider—and a powerful multi-selection mode for Select backed by type-safe generics. The Button feedback API has been refactored into a cleaner unified feedbackVariant + animation prop pattern, and peer dependency constraints are relaxed for broader compatibility with Expo SDK 55. Several Select and Avatar bug fixes round out the release.
Installation
Update to the latest version:
npm i heroui-nativepnpm add heroui-nativeyarn add heroui-nativebun add heroui-nativeUsing AI assistants? Simply prompt "Hey Cursor, update HeroUI Native to the latest version" and your AI assistant will automatically compare versions and apply the necessary changes. Learn more about the HeroUI Native MCP Server.
Try It Out
Experience all the RC 2 improvements in action with our preview app! You can explore the new SearchField, ListGroup, and Slider components, Select multi-selection mode, the updated Button feedback API, and all the bug fixes directly on your device.
Prerequisites
Make sure you have the latest version of Expo Go installed on your mobile device.
How to Access
Option 1: Scan the QR Code
Use your device's camera or Expo Go app to scan:

Note for Android users: If scanning the QR code with your device's camera or other scanner apps redirects to a browser and shows a 404 error, open Expo Go first and use its built-in QR scanner instead.
Option 2: Click the Link
This will automatically open the app in Expo Go if it's installed on your device.
What's New
New Components
This release introduces 3 new components:
- Slider: Slider component with single-value and range modes, horizontal/vertical orientation, custom number formatting, and spring-animated thumb feedback.
- ListGroup: Surface-based grouped list component with pressable items, prefix/suffix slots, and default chevron navigation indicator.
- SearchField: Compound component for filtering and querying content with built-in search icon, clearable input, and auto-hide clear button.
Slider
The Slider component supports single-value and range (multi-thumb) modes, horizontal and vertical orientation, custom number formatting via Intl.NumberFormat, and spring-animated thumb feedback. The primitive layer handles all gesture and value logic independently, making it reusable for alternative styled implementations.
Features:
- Compound sub-components:
Slider.Output,Slider.Track,Slider.Fill,Slider.Thumb - Range slider: pass an array as
defaultValue/valueand use a render-function onSlider.Trackto render multiple thumbs - Vertical orientation via
orientation="vertical" - Custom formatting with
formatOptionsacceptingIntl.NumberFormatOptions(currency, percent, unit, etc.) - Gesture-handler-based drag and tap-to-position on track
- Value clamping, stepping, and multi-thumb support
- Spring-animated thumb scale via configurable
animationprop - Accessibility: each thumb receives
role="slider"with fullaccessibilityValue(min, max, now, text) useSliderhook exposes slider context for advanced use cases
Usage:
import { Slider } from "heroui-native";
export function BasicSlider() {
return (
<Slider defaultValue={50} minValue={0} maxValue={100}>
<Slider.Output />
<Slider.Track>
<Slider.Fill />
<Slider.Thumb />
</Slider.Track>
</Slider>
);
}
export function RangeSlider() {
return (
<Slider defaultValue={[20, 80]} minValue={0} maxValue={100}>
<Slider.Output />
<Slider.Track>
{({ thumbs }) => (
<>
<Slider.Fill />
{thumbs.map((_, i) => (
<Slider.Thumb key={i} index={i} />
))}
</>
)}
</Slider.Track>
</Slider>
);
}For complete documentation and examples, see the Slider component page.
Related PR: #305
ListGroup
The ListGroup component renders grouped list items inside a Surface container, providing a polished navigation-list pattern commonly used in settings screens, menus, and content browsers. Each item supports prefix, content (title + description), and suffix slots with a default chevron-right navigation indicator.
Features:
- Surface-based container with rounded corners and consistent spacing
- Compound sub-components:
ListGroup.Item,ListGroup.ItemPrefix,ListGroup.ItemContent,ListGroup.ItemTitle,ListGroup.ItemDescription,ListGroup.ItemSuffix - Default chevron-right icon in
ItemSuffixvia internalChevronRightIcon - Pressable items with PressableFeedback integration
- Fully customizable slots for icons, badges, and other content
Usage:
import { ListGroup } from "heroui-native";
export function Example() {
return (
<ListGroup>
<ListGroup.Item onPress={() => console.log("Profile")}>
<ListGroup.ItemContent>
<ListGroup.ItemTitle>Profile</ListGroup.ItemTitle>
<ListGroup.ItemDescription>Manage your account</ListGroup.ItemDescription>
</ListGroup.ItemContent>
<ListGroup.ItemSuffix />
</ListGroup.Item>
<ListGroup.Item onPress={() => console.log("Settings")}>
<ListGroup.ItemContent>
<ListGroup.ItemTitle>Settings</ListGroup.ItemTitle>
<ListGroup.ItemDescription>App preferences</ListGroup.ItemDescription>
</ListGroup.ItemContent>
<ListGroup.ItemSuffix />
</ListGroup.Item>
</ListGroup>
);
}For complete documentation and examples, see the ListGroup component page.
Related PR: #302
SearchField
The SearchField component provides a dedicated input for search and filtering scenarios, built with the same compound-component pattern used by TextField. It includes a search icon, clearable input, and an auto-hiding clear button that disappears when the input is empty.
Features:
- Compound sub-components:
SearchField.Group,SearchField.SearchIcon,SearchField.Input,SearchField.ClearButton ClearButtonauto-hides when value is empty and clears search text on pressSearchIconsupports custom children to replace the default magnifying glass SVG- Validation state support with visual feedback
- Disabled state support
- Seamless integration with Label, Description, and FieldError
Usage:
import { Label, SearchField } from "heroui-native";
export function Example() {
return (
<SearchField>
<Label>Search</Label>
<SearchField.Group>
<SearchField.SearchIcon />
<SearchField.Input placeholder="Search components..." />
<SearchField.ClearButton />
</SearchField.Group>
</SearchField>
);
}For complete documentation and examples, see the SearchField component page.
Related PR: #299
Select Multi-Selection Mode
The Select component now supports multi-item selection via a new selectionMode prop. The RootProps type is now generic on SelectionMode, so TypeScript correctly resolves value and onValueChange types per mode—SelectOption for single, SelectOption[] for multiple.
Features:
selectionMode="multiple"enables toggling multiple items;closeOnPressdefaults tofalsein multiple mode- Type-safe generics:
RootProps<M>resolvesvalueandonValueChangetypes viaSelectValueType<M> Select.Valueformats multiple labels as "Apple, Banana and Cherry" usingformatSelectedLabels- Single mode remains fully backward-compatible (default)
Usage:
import { Select } from "heroui-native";
export function MultiSelect() {
return (
<Select selectionMode="multiple">
<Select.Trigger>
<Select.Value placeholder="Select fruits..." />
<Select.TriggerIndicator />
</Select.Trigger>
<Select.Portal>
<Select.Content>
<Select.Item value="apple" label="Apple" />
<Select.Item value="banana" label="Banana" />
<Select.Item value="cherry" label="Cherry" />
</Select.Content>
</Select.Portal>
</Select>
);
}Related PR: #298
New Subcomponents
PressableFeedback.Scale
A new compound sub-component for opt-in scale animation composability. PressableFeedback.Scale lets you add scale press animations to any pressable element—such as ListGroup.Item—without needing the root PressableFeedback to manage scale.
Usage:
import { PressableFeedback } from "heroui-native";
<PressableFeedback.Scale>
<ListGroup.Item onPress={handlePress}>
{/* item content */}
</ListGroup.Item>
</PressableFeedback.Scale>Related PR: #302
Component Improvements
Select Trigger and State Fixes
The Select component has been improved with several targeted fixes to the trigger and controllable state system.
Improvements:
- Custom
classNameis now correctly forwarded to the trigger's style computation, resolving cases where user-provided classes were silently dropped useControllableStatenow resets internal state when transitioning from controlled to uncontrolled, preventing stale selections from persisting- Trigger measures position via
onLayoutto properly supportisDefaultOpen - Updated trigger styles to use
gap-3,py-3.5padding, andflex-1on the value text for improved layout
Related PR: #298
Avatar asChild Image Fix
The Avatar component's AvatarImage now correctly separates source, style, and asChild from rest props when forwarding to the underlying primitive, fixing an issue where all props were incorrectly spread to the image component when using asChild.
Related PR: #298
API Enhancements
Button Feedback API Refactor
The Button component's pressable feedback API has been refactored into a unified, type-safe feedbackVariant + animation prop pattern, replacing the previous multi-prop approach.
New Capability:
import { Button } from "heroui-native";
// Scale + highlight (default)
<Button feedbackVariant="scale-highlight">Press me</Button>
// Scale + ripple
<Button feedbackVariant="scale-ripple">Press me</Button>
// Scale only
<Button feedbackVariant="scale">Press me</Button>
// Custom animation configuration
<Button
feedbackVariant="scale-highlight"
animation={{ scale: 0.95, highlight: { color: "rgba(0,0,0,0.1)" } }}
>
Press me
</Button>The animation prop is a discriminated union typed per variant, providing full type-safety for each feedback configuration.
New utility helpers resolveAnimationObject and isAnimationDisabled in button.utils.ts centralise animation prop resolution.
Related PR: #302
Dependencies
Relaxed Peer Dependency Constraints
Peer dependency version constraints have been relaxed to use caret (^) and range (>=) specifiers instead of restrictive tilde (~) or pinned versions. This improves compatibility for consumers on newer dependency versions, particularly those using Expo SDK 55.
Changes:
react-native-reanimated:~4.1.1→^4.1.1(allows minor updates)react-native-safe-area-context:~5.6.0→^5.6.0(allows minor updates)react-native-svg:15.12.1→^15.12.1(allows patch/minor updates)react-native-worklets:0.5.1→>=0.5.1(allows any version 0.5.1+)
No runtime code changes are included—existing projects with previously valid versions continue to work without modification.
Related PR: #306
⚠️ Breaking Changes
Button Feedback API
The pressableFeedbackVariant, pressableFeedbackHighlightProps, and pressableFeedbackRippleProps props on Button have been removed. Consumers must migrate to feedbackVariant and the unified animation prop.
Migration:
Update all Button feedback prop usages:
// Before
<Button
pressableFeedbackVariant="highlight"
pressableFeedbackHighlightProps={{ color: "rgba(0,0,0,0.1)" }}
>
Press me
</Button>
// After
<Button
feedbackVariant="scale-highlight"
animation={{ scale: 0.95, highlight: { color: "rgba(0,0,0,0.1)" } }}
>
Press me
</Button>Variant mapping:
"highlight"→"scale-highlight"(default)"ripple"→"scale-ripple""none"→"scale"or"none"
Available options:
"scale-highlight"- Scale down with highlight overlay (default)"scale-ripple"- Scale down with ripple effect"scale"- Scale down only"none"- No feedback animation
Related PR: #302
Bug Fixes
This release includes fixes for the following issues:
-
Issue #291: Fixed
Select.Triggervariant prop being overwritten byclassName. Custom class names passed to the trigger are now correctly forwarded to the style computation instead of being silently dropped. -
Issue #294: Resolved compatibility with
react-native-worklets0.7.x andreact-native-reanimated4.2.x (Expo SDK 55). Peer dependency constraints have been relaxed to accept these newer versions without producing resolution warnings.
Related PRs:
Updated Documentation
The following documentation pages have been updated to reflect the changes in this release:
- SearchField - New component documentation with usage examples and API reference
- ListGroup - New component documentation with usage examples and API reference
- Slider - New component documentation with usage examples and API reference
- Select - Multi-selection mode, trigger className fix, and controllable state improvements
- Button - Updated feedback API documentation with new
feedbackVariantandanimationprops - Avatar - Fixed
asChildimage prop spreading documentation - PressableFeedback - New
PressableFeedback.Scalesubcomponent documentation
Links
Contributors
Thanks to everyone who contributed to this release!