Adds PieChart, RadarChart, WheelPicker, WheelPickerGroup, TimePicker, WheelTimePicker, DateTimePicker, and WheelDateTimePicker, refactors component labels to soft-foreground tokens, and fixes NumberStepper digit jitter plus WheelPicker overscroll and re-render edge cases.
The fourth beta of HeroUI Native Pro is a big one — eight new components spanning charts, wheel pickers, and a full time / date-time selection stack. PieChart and RadarChart round out the polar-chart family, a new WheelPicker / WheelPickerGroup foundation powers iOS-style wheel selection, and TimePicker, WheelTimePicker, DateTimePicker, and WheelDateTimePicker bring locale-aware time and date-time pickers to the library. This release also standardizes label and indicator colors on the new *-soft-foreground tokens and fixes a handful of NumberStepper and WheelPicker edge cases.
Follow the installation guide to authenticate the private registry with your HEROUI_PERSONAL_TOKEN, install heroui-native-pro, and wire up HeroUINativeProvider.
This release introduces 8 new components across charts, forms, and date & time:
victory-native-powered polar chart with pie, donut, segmented-donut, partial-arc, and labeled-slice layouts. (Documentation)Grid, AngleAxis, RadiusAxis, and multi-series Radar compound parts. (Documentation)@internationalized/date Time value. (Documentation)Select trigger with a combined date + time wheel surface. (Documentation)CalendarDateTime value. (Documentation)A polar chart for visualizing categorical proportions. Built on top of victory-native's PolarChart and Pie.Chart, wrapped with HeroUI Native theming, generic-preserving typings, and a root-to-Canvas animation cascade. Compose pie, donut, segmented donut, partial-arc gauges, and Skia-font slice labels from the same building blocks.
Features:
PieChart, PieChart.Pie, PieChart.Slice, PieChart.SliceAngularInset, PieChart.LabelinnerRadius, segmented donuts via SliceAngularInset, and partial-arc gauges via startAngle / circleSweepDegreesanimate config for path-interpolated data transitions, gated by the cascading animation="disable-all" propcolorKey; layer Skia shaders (LinearGradient, RadialGradient) as children for gradient fillsPieChart.Label, with a render-function children for fully custom contentBasePolarChart helper plus re-exported useSlicePath, useSliceAngularInsetPath, and the PieSliceData typevictory-native stays an optional peer dependency — only loaded when a chart component is importedUsage:
import { PieChart } from "heroui-native-pro";
const DATA = [
{ name: "Chrome", value: 62, color: "#6366f1" },
{ name: "Safari", value: 19, color: "#7c3aed" },
{ name: "Firefox", value: 10, color: "#8b5cf6" },
];
export function Example() {
return (
<PieChart
data={DATA}
labelKey="name"
valueKey="value"
colorKey="color"
wrapperClassName="h-[220px]"
>
<PieChart.Pie innerRadius="60%">
{() => <PieChart.Slice />}
</PieChart.Pie>
</PieChart>
);
}For complete documentation and examples, see the PieChart component page.
A radar chart for comparing multivariate data across categorical spokes. It reuses victory-native's PolarChart for canvas measurement and useAnimatedPath for polygon interpolation, then renders every visual part — grid rings, spokes, axis labels, polygons, vertex dots — with @shopify/react-native-skia primitives.
Features:
RadarChart.Grid (polygon or circle rings + spokes), RadarChart.AngleAxis, RadarChart.RadiusAxis, and RadarChart.RadarRadar components with per-series dataKey and colorRadarChart.RadiusAxis with configurable angle, orientation, and tickFormattermaxValue to fix the radial scale across series; showDots / dotRadius to emphasize verticesuseAnimatedPath, gated by animation="disable-all" on the rootRadarChartRootProps, RadarChartRadarProps, etc.) and radarChartClassNames for styling overridesvictory-native and @shopify/react-native-skia peers — no new runtime dependenciesUsage:
import { RadarChart } from "heroui-native-pro";
const DATA = [
{ category: "Design", score: 86 },
{ category: "Frontend", score: 92 },
{ category: "Backend", score: 74 },
];
export function Example() {
return (
<RadarChart
data={DATA}
labelKey="category"
dataKey="score"
maxValue={100}
wrapperClassName="h-[280px]"
>
<RadarChart.Grid />
<RadarChart.AngleAxis />
<RadarChart.Radar showDots />
</RadarChart>
);
}For complete documentation and examples, see the RadarChart component page.
A vertical wheel picker with snap-to-row selection, distance-based fade and scale, and optional fade overlays. Built on react-native-reanimated, it powers iOS-style selectors for years, durations, reminders, and any single-column option list — and serves as the foundation for the new time and date-time pickers.
Features:
WheelPicker.Item, WheelPicker.ItemLabel, WheelPicker.Indicator, WheelPicker.Maskvalue / onValueChange) and uncontrolled (defaultValue) selection over a generic items arrayitemHeight, visibleCount, and a renderItem slot for fully custom rowsscrollToIndex / scrollToValue via the root refuseWheelPicker and useWheelPickerItem hooks for building custom row animations off the shared scroll offsetUsage:
import { WheelPicker } from "heroui-native-pro";
import { useState } from "react";
const YEAR_ITEMS = Array.from({ length: 80 }, (_, i) => {
const year = 2026 - i;
return { value: year, label: String(year) };
});
export function Example() {
const [year, setYear] = useState(1995);
return (
<WheelPicker value={year} onValueChange={setYear} items={YEAR_ITEMS}>
<WheelPicker.Indicator />
<WheelPicker.Mask />
</WheelPicker>
);
}For complete documentation and examples, see the WheelPicker component page.
A coordinated row of WheelPicker instances that share layout, emit a composite values record keyed by each wheel's name, and report when every wheel has come to rest. Use it for currency + amount selectors, time columns, or any multi-column wheel UI.
Features:
WheelPickerGroup.Indicator, WheelPickerGroup.MaskitemHeight / visibleCount to every child wheel and distributes columns evenly with automatic flex-1values record (controlled values / uncontrolled defaultValues) keyed by each child wheel's nameonValuesChange for live updates and onValuesCommit that fires once after every wheel comes to restanimation="disable-all" cascades the disabled state to all child wheelsUsage:
import { WheelPicker, WheelPickerGroup } from "heroui-native-pro";
import { useState } from "react";
export function Example() {
const [values, setValues] = useState({ currency: "USD", amount: 500 });
return (
<WheelPickerGroup values={values} onValuesChange={setValues}>
<WheelPicker name="currency" items={CURRENCY_ITEMS} />
<WheelPicker name="amount" items={AMOUNT_ITEMS} />
<WheelPickerGroup.Indicator />
<WheelPickerGroup.Mask />
</WheelPickerGroup>
);
}For complete documentation and examples, see the WheelPickerGroup component page.
A standalone wheel time selector built on WheelPickerGroup that exchanges an @internationalized/date Time value. It renders hour, minute, and (in 12-hour mode) AM/PM period columns with a shared indicator and mask, committing live on scroll.
Features:
WheelTimePicker.Hour, WheelTimePicker.Minute, WheelTimePicker.Period, WheelTimePicker.Indicator, WheelTimePicker.MaskhourFormat, with the period column auto-omitted in 24-hour modeminuteInterval for appointment-style stepping and locale-aware AM/PM labels (canonical "AM" / "PM" stored)onValueChange for live scroll updates and onValueCommit that fires once after every column restsUsage:
import { Time } from "@internationalized/date";
import { WheelTimePicker } from "heroui-native-pro";
import { useState } from "react";
export function Example() {
const [time, setTime] = useState(new Time(9, 30));
return <WheelTimePicker value={time} onValueChange={setTime} />;
}For complete documentation and examples, see the WheelTimePicker component page.
A time picker that composes WheelTimePicker inside a trigger field with popover, dialog, and bottom-sheet presentations. It follows the same compound-component and adaptive-presentation pattern as DatePicker, and integrates with Label, Description, and FieldError.
Features:
TimePicker.Select, Trigger, Value, TriggerIndicator, Portal, Overlay, Content, Wheel, and the WheelHour / WheelMinute / WheelPeriod / WheelIndicator / WheelMask columns"popover", "dialog", and "bottom-sheet" presentations from a single prophourFormat, minuteInterval, timeDisplayFormat presets, and a formatTime override for the trigger labelclock-icon as the default trigger indicatorisRequired, isInvalid, isDisabled) with danger border styling on invalidUsage:
import { Label } from "heroui-native";
import { TimePicker } from "heroui-native-pro";
export function Example() {
return (
<TimePicker>
<Label>Reminder</Label>
<TimePicker.Select>
<TimePicker.Trigger>
<TimePicker.Value />
<TimePicker.TriggerIndicator />
</TimePicker.Trigger>
<TimePicker.Portal>
<TimePicker.Overlay />
<TimePicker.Content presentation="popover" width="trigger">
<TimePicker.Wheel />
</TimePicker.Content>
</TimePicker.Portal>
</TimePicker.Select>
</TimePicker>
);
}For complete documentation and examples, see the TimePicker component page.
A standalone wheel date-time selector built on WheelPickerGroup that exchanges a CalendarDateTime value. It adds a combined day column alongside hour, minute, and period columns, with bounded date ranges, localized labels, and custom formatDate.
Features:
WheelDateTimePicker.Date, Hour, Minute, Period, Indicator, Mask[minValue, maxValue], always widened to include the active valueminuteInterval stepping, and localized date + AM/PM labelsformatDate (receives an isToday flag)onValueChange for live updates and onValueCommit once every column restsWheelTimePicker hour / minute / period item builders for consistencyUsage:
import { CalendarDateTime } from "@internationalized/date";
import { WheelDateTimePicker } from "heroui-native-pro";
import { useState } from "react";
export function Example() {
const [value, setValue] = useState(
new CalendarDateTime(2026, 6, 1, 9, 30)
);
return <WheelDateTimePicker value={value} onValueChange={setValue} />;
}For complete documentation and examples, see the WheelDateTimePicker component page.
A field shell that pairs a Select trigger with a WheelDateTimePicker presentation surface. It mirrors TimePicker's ergonomics for a combined date + time selection, forwarding range, format, and locale props down to the wheel and bridging context through portals.
Features:
DateTimePicker.Select, Trigger, Value, TriggerIndicator, Portal, Overlay, Content, Wheel, and the aliased WheelDate / WheelHour / WheelMinute / WheelPeriod / WheelIndicator / WheelMask parts"popover", "dialog", and "bottom-sheet" presentationsminValue / maxValue, hourFormat, minuteInterval, dateTimeDisplayFormat presets, and a formatDateTime overrideisRequired, isInvalid, isDisabled) with a default trailing calendar iconUsage:
import { DateTimePicker } from "heroui-native-pro";
export function Example() {
return (
<DateTimePicker>
<DateTimePicker.Select>
<DateTimePicker.Trigger>
<DateTimePicker.Value />
<DateTimePicker.TriggerIndicator />
</DateTimePicker.Trigger>
<DateTimePicker.Portal>
<DateTimePicker.Overlay />
<DateTimePicker.Content presentation="popover" width="trigger">
<DateTimePicker.Wheel />
</DateTimePicker.Content>
</DateTimePicker.Portal>
</DateTimePicker.Select>
</DateTimePicker>
);
}For complete documentation and examples, see the DateTimePicker component page.
Fixed a layout jitter in the NumberStepper value where the displayed number shifted horizontally as digits changed, due to proportional figure widths.
Improvements:
NumberStepper.Value now applies fontVariant: ['tabular-nums'] for a stable, monospaced digit width — no more horizontal shift between values like 1 and 8.style prop is now destructured and merged with the internal style, so overrides still take precedence via the merged style array.Standardized label, icon, and indicator colors across multiple components to use the new *-soft-foreground semantic tokens instead of raw color tokens. These are internal styling refinements — the public component API is unchanged.
Fixes:
*-soft-foreground tokens for the secondary / soft / accent / success / warning / danger variants.Record<ChipColor, string> maps for the primary and soft variants.RangeCalendar adds a data-today-not-in-range attribute so today's highlight no longer overrides range endpoints or the continuous middle strip.heroui-native (peer): 1.0.2 / 1.0.3 → 1.0.4The following documentation pages have been updated to reflect the changes in this release:
data-today-not-in-range render-prop attribute1.0.0-beta.5
Adds ComposedChart, ChartTooltip, NumberPad, and RadialChart, improves SplitView mount behavior, and fixes NumberField runaway onChange on rapid taps.
1.0.0-beta.3
Adds AreaChart, ChartCrosshair, ChartIndicator, EmptyState, and Segment components, unifies press-driven overlays across cartesian charts, removes LineChart.Tooltip and LineChart.Crosshair, and cleans up ProgressButton press-out handling.