v1.0.3
New Text typography component, ScrollShadow inverted support, Tabs RTL indicator fix, optional Avatar alt prop, Select indicator unification, and form field style refinements
HeroUI Native v1.0.3 introduces the new Text typography primitive with a compound API for headings, paragraphs, and inline code, while delivering important fixes for ScrollShadow with inverted lists, Tabs indicator alignment in RTL layouts, and Select.TriggerIndicator animation when using custom children. This release also refines visual styles across Button, Chip, and Input, makes the Avatar alt prop optional, and corrects inner padding behavior for TextField and SearchField.
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 v1.0.3 improvements in action with our preview app! You can explore the new Text component, the RTL-aware Tabs indicator, ScrollShadow with inverted lists, the refined Button, Chip, and Input styles, and the unified Select.TriggerIndicator animation 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 1 new typography component:
- Text: Primitive typography component with semantic
typevariants andHeading,Paragraph, andCodesub-components. (Documentation)
Text
The Text component is a typography primitive that renders styled text via semantic presets. It exposes a compound API with Text.Heading, Text.Paragraph, and Text.Code sub-components, and layers orthogonal align, color, weight, and truncate props on top of tailwind-variants so typography can be composed without bespoke styles on every call site.
Features:
- Semantic
typevariants:h1–h6,body,body-sm,body-xs, andcode Text.Headingautomatically setsaccessibilityRole="header"and narrowstypeto heading levelsText.Paragraphnarrowstypeto body variants for readable copyText.Coderenders chip-styled, inline monospaced text with a platform-appropriatefontFamily(Menlo on iOS,monospaceelsewhere)- RTL-aware
alignprop withstart,center,end, andjustify(iOS-only justification) - Semantic
colorpresets (default,muted) withclassNameescape hatch for other theme colors weightoverride that wins overtype's implied weight viatailwind-mergetruncateboolean shortcut fornumberOfLines={1}; an explicitnumberOfLinesalways takes precedence
Usage:
import { Text } from "heroui-native";
import { View } from "react-native";
export function Example() {
return (
<View className="flex-1 justify-center px-5 gap-4">
<Text.Heading type="h1">Welcome</Text.Heading>
<Text.Heading type="h3">Getting Started</Text.Heading>
<Text.Paragraph>
This is a body paragraph rendered with the Text component.
</Text.Paragraph>
<Text.Paragraph color="muted" type="body-sm">
Smaller supporting text for captions or footnotes.
</Text.Paragraph>
<Text.Code>npm install heroui-native</Text.Code>
</View>
);
}For complete documentation and examples, see the Text component page.
Related PR: #400
Component Improvements
ScrollShadow Inverted Child Support
The ScrollShadow component now correctly handles inverted scrollable children such as <FlatList inverted> or <FlashList inverted>.
Improvements:
ScrollShadowRootnow reads theinvertedprop from its scrollable child, mirroring the existingchildHorizontalauto-detection pattern- Swaps which animated style drives each visual edge so shadows render at the correct side
- No public API changes — the fix activates only when the child has
inverted={true}, which previously rendered the gradients on the wrong edges
Previously, wrapping an inverted list would render the gradient shadow on the top edge while scrollable content was below, and omit the bottom shadow even when more content was available. Indicators now point in the correct visual direction for inverted feeds, chat lists, and similar reverse-ordered scroll surfaces.
Related PR: #398
Tabs RTL Indicator Alignment
The Tabs component's indicator now positions correctly when React Native is running in RTL mode.
Improvements:
- Tab strip width is now tracked through the tabs measurements context
Tabs.Listlayout width is used for fixed tab layoutsTabs.ScrollViewcontent width is used for scrollable tab layouts- The indicator's
translateXis mirrored only whenI18nManager.isRTLis enabled
The indicator uses an absolute left anchor combined with a measured translateX. In RTL, React Native swaps the absolute anchor automatically, but the measured transform still needed to be mirrored — this is now handled internally. Both fixed and scrollable tab lists are fixed, and the public API is unchanged.
Related PR: #396
Select Trigger Indicator Unified Rendering
The Select component's Select.TriggerIndicator now applies the open/close rotation animation consistently, regardless of whether the default icon or custom children are rendered.
Improvements:
- Custom
childrennow receive the same animated container style as the default icon ChevronDownIconis rendered as a fallback viachildren ?? <ChevronDownIcon />- Collapsed the previously separate render branches into a single, unified render path
Previously, passing custom children to Select.TriggerIndicator bypassed the animated rotation transform, leaving the indicator static on open/close. The unified branch ensures the rotation animation always plays without changing the public API.
Related PR: #409
API Enhancements
Optional alt Prop on Avatar
The Avatar component's alt prop is now optional and defaults to 'Avatar', reducing boilerplate for decorative or contextually obvious avatars while preserving accessibility support.
New Capability:
import { Avatar } from "heroui-native";
<Avatar>
<Avatar.Image source={{ uri: "https://example.com/avatar.jpg" }} />
<Avatar.Fallback>JD</Avatar.Fallback>
</Avatar>;Existing code that passes an explicit alt continues to work unchanged — the prop simply gains a sensible default when omitted. The RootProps type now reflects alt?: string with a JSDoc @default 'Avatar', and the component documentation has been updated to match.
Related PR: #404
Style Fixes
Button, Chip, and Input Style Refinements
Refined sizing and color styling across Button, Chip, and Input to standardize on Tailwind utility classes and semantic soft color tokens.
Fixes:
- Button: Sizes now use Tailwind height utilities (
h-10,h-12,h-14) instead of arbitrary pixel values; thesmheight is adjusted from 36px to 40px for better tap-target ergonomics - Chip: Vertical padding for
md/lgrefined (py-[3px]→py-1,py-1→py-1.5) for more balanced spacing - Chip: Soft variants now use semantic
bg-{color}-softtokens instead of opacity-basedbg-{color}/15backgrounds - Input: Switched from
py-3.5tomin-h-12so the field maintains consistent height regardless of content - Input: Primary variant border now correctly uses the
border-field-bordertoken instead ofborder-field
Minor pixel-level differences in Button sm size (+4px) and Chip md/lg paddings should be reviewed visually. No API changes were made — only style tokens in button.styles.ts, chip.styles.ts, and input.styles.ts were updated.
Related PR: #406
TextField and SearchField Inner Padding Fix
The TextField and SearchField components no longer apply extra horizontal padding to nested Label, Description, and FieldError components.
Fixes:
TextFieldnow provideshasFieldPadding: falseto itsFormFieldContextSearchFieldnow provideshasFieldPadding: falseto itsFormFieldContextLabel,Description, andFieldErrorrendered inside these fields no longer pick up the extrapx-1.5side padding- Visual alignment is now consistent across all form field containers (
ControlField,RadioGroup,TagGroupalready usedhasFieldPadding: false)
The change is isolated to two useMemo values that provide FormFieldContext. Consumers that previously relied on the unintended inner padding can restore the spacing by adding className="px-1.5" to the affected child components.
Related PR: #407
Bug Fixes
This release includes fixes for the following issues:
- Issue #334: Resolved
Tabs.Indicatormispositioning in RTL layouts. The indicator combines an absoluteleftanchor with a measuredtranslateX; React Native swaps the anchor automatically in RTL but the transform still needed to be mirrored. The tabs measurements context now tracks the tab strip width and mirrorstranslateXonly whenI18nManager.isRTLis enabled, fixing both fixed and scrollable tab lists. - Issue #393: Fixed
ScrollShadowignoring its child'sinvertedprop.ScrollShadowRootnow readsinvertedfrom the scrollable child (mirroring the existingchildHorizontalauto-detection) and swaps which animated style drives each visual edge so the gradients render on the correct sides for inverted feeds and chat-style lists.
Related PRs:
Updated Documentation
The following documentation pages have been updated to reflect the changes in this release:
- Text - New component documentation, anatomy, usage, and full API reference
- Avatar -
altprop documented as optional with default'Avatar' - All Components - Added the new Typography category alongside the existing categories
Links
Contributors
Thanks to everyone who contributed to this release!