1.0.0-beta.4

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.

June 2026

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.

Try It on Your Device

Don't have the HeroUI Native app yet? Download it below.

Installation

Follow the installation guide to authenticate the private registry with your HEROUI_PERSONAL_TOKEN, install heroui-native-pro, and wire up HeroUINativeProvider.

What's New

New Components

This release introduces 8 new components across charts, forms, and date & time:

  • PieChart: victory-native-powered polar chart with pie, donut, segmented-donut, partial-arc, and labeled-slice layouts. (Documentation)
  • RadarChart: Skia-rendered multivariate radar with Grid, AngleAxis, RadiusAxis, and multi-series Radar compound parts. (Documentation)
  • WheelPicker: Vertical snap-to-row wheel with distance-based fade / scale and optional fade overlays. (Documentation)
  • WheelPickerGroup: Coordinated row of wheels sharing layout, a composite values record, and a shared indicator / mask. (Documentation)
  • TimePicker: Trigger field that opens a wheel-based hour / minute / period selector in a popover, dialog, or bottom sheet. (Documentation)
  • WheelTimePicker: Standalone wheel time selector exchanging an @internationalized/date Time value. (Documentation)
  • DateTimePicker: Field shell pairing a Select trigger with a combined date + time wheel surface. (Documentation)
  • WheelDateTimePicker: Standalone wheel date-time selector exchanging a CalendarDateTime value. (Documentation)

PieChart

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:

  • Compound parts — PieChart, PieChart.Pie, PieChart.Slice, PieChart.SliceAngularInset, PieChart.Label
  • Donut layouts via innerRadius, segmented donuts via SliceAngularInset, and partial-arc gauges via startAngle / circleSweepDegrees
  • Per-slice animate config for path-interpolated data transitions, gated by the cascading animation="disable-all" prop
  • Slice fills sourced from each data row's colorKey; layer Skia shaders (LinearGradient, RadialGradient) as children for gradient fills
  • Skia-font slice labels via PieChart.Label, with a render-function children for fully custom content
  • New internal BasePolarChart helper plus re-exported useSlicePath, useSliceAngularInsetPath, and the PieSliceData type
  • victory-native stays an optional peer dependency — only loaded when a chart component is imported

Usage:

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.

RadarChart

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:

  • Compound parts — RadarChart.Grid (polygon or circle rings + spokes), RadarChart.AngleAxis, RadarChart.RadiusAxis, and RadarChart.Radar
  • Multi-series support via sibling Radar components with per-series dataKey and color
  • RadarChart.RadiusAxis with configurable angle, orientation, and tickFormatter
  • maxValue to fix the radial scale across series; showDots / dotRadius to emphasize vertices
  • Animated path interpolation through victory-native's useAnimatedPath, gated by animation="disable-all" on the root
  • Public type exports (RadarChartRootProps, RadarChartRadarProps, etc.) and radarChartClassNames for styling overrides
  • Relies on the existing optional victory-native and @shopify/react-native-skia peers — no new runtime dependencies

Usage:

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.

WheelPicker

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:

  • Compound parts — WheelPicker.Item, WheelPicker.ItemLabel, WheelPicker.Indicator, WheelPicker.Mask
  • Controlled (value / onValueChange) and uncontrolled (defaultValue) selection over a generic items array
  • Configurable itemHeight, visibleCount, and a renderItem slot for fully custom rows
  • Tap-to-focus rows, throttled value-change events, and distance-driven opacity / scale / label-color animations
  • Imperative scrollToIndex / scrollToValue via the root ref
  • useWheelPicker and useWheelPickerItem hooks for building custom row animations off the shared scroll offset

Usage:

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.

WheelPickerGroup

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:

  • Compound parts — WheelPickerGroup.Indicator, WheelPickerGroup.Mask
  • Broadcasts itemHeight / visibleCount to every child wheel and distributes columns evenly with automatic flex-1
  • Owns a shared values record (controlled values / uncontrolled defaultValues) keyed by each child wheel's name
  • onValuesChange for live updates and onValuesCommit that fires once after every wheel comes to rest
  • A single shared indicator band and mask spanning every column
  • animation="disable-all" cascades the disabled state to all child wheels

Usage:

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.

WheelTimePicker

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:

  • Compound parts — WheelTimePicker.Hour, WheelTimePicker.Minute, WheelTimePicker.Period, WheelTimePicker.Indicator, WheelTimePicker.Mask
  • 12 / 24-hour modes via hourFormat, with the period column auto-omitted in 24-hour mode
  • minuteInterval 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 rests
  • Tabular numerals by default on hour / minute columns for stable digit width

Usage:

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.

TimePicker

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:

  • Compound parts — TimePicker.Select, Trigger, Value, TriggerIndicator, Portal, Overlay, Content, Wheel, and the WheelHour / WheelMinute / WheelPeriod / WheelIndicator / WheelMask columns
  • Controlled and uncontrolled selection and open state
  • "popover", "dialog", and "bottom-sheet" presentations from a single prop
  • hourFormat, minuteInterval, timeDisplayFormat presets, and a formatTime override for the trigger label
  • New internal clock-icon as the default trigger indicator
  • Field states (isRequired, isInvalid, isDisabled) with danger border styling on invalid

Usage:

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.

WheelDateTimePicker

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:

  • Compound parts — WheelDateTimePicker.Date, Hour, Minute, Period, Indicator, Mask
  • Combined day column spanning [minValue, maxValue], always widened to include the active value
  • 12 / 24-hour modes, minuteInterval stepping, and localized date + AM/PM labels
  • Custom date column labels via formatDate (receives an isToday flag)
  • onValueChange for live updates and onValueCommit once every column rests
  • Reuses the WheelTimePicker hour / minute / period item builders for consistency

Usage:

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.

DateTimePicker

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:

  • Compound parts — DateTimePicker.Select, Trigger, Value, TriggerIndicator, Portal, Overlay, Content, Wheel, and the aliased WheelDate / WheelHour / WheelMinute / WheelPeriod / WheelIndicator / WheelMask parts
  • "popover", "dialog", and "bottom-sheet" presentations
  • Controlled / uncontrolled selection and open state with automatic context bridging through portals
  • minValue / maxValue, hourFormat, minuteInterval, dateTimeDisplayFormat presets, and a formatDateTime override
  • Field states (isRequired, isInvalid, isDisabled) with a default trailing calendar icon

Usage:

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.

Component Improvements

NumberStepper Digit Jitter Fix

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.
  • The consumer-provided style prop is now destructured and merged with the internal style, so overrides still take precedence via the merged style array.

Style Fixes

Soft-Foreground Token Adoption

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:

  • Badge, ProgressButton, and SlideButton labels now use *-soft-foreground tokens for the secondary / soft / accent / success / warning / danger variants.
  • TrendChip indicator colors are resolved via explicit Record<ChipColor, string> maps for the primary and soft variants.
  • Calendar and RangeCalendar nav buttons, the year-picker indicator, and today cells use soft-foreground / soft-background tokens.

Style Optimizations

  • Range calendar today highlight: RangeCalendar adds a data-today-not-in-range attribute so today's highlight no longer overrides range endpoints or the continuous middle strip.

Dependencies

Other Dependency Upgrades

  • heroui-native (peer): 1.0.2 / 1.0.31.0.4

Updated Documentation

The following documentation pages have been updated to reflect the changes in this release:

  • PieChart — New component page with pie, donut, segmented donut, partial-arc, labeled-slice, gradient, and animated examples
  • RadarChart — New component page covering basic, multi-series, dots-only, circle-grid, fixed-scale, custom radius-axis, custom font, and animated variants
  • WheelPicker — New component page with masked, uncontrolled, custom render, custom indicator / mask, animation, disabled, and programmatic-scroll examples
  • WheelPickerGroup — New component page covering controlled / uncontrolled values, shared layout, commit-on-rest, custom indicator / mask, and disabled cascading
  • TimePicker — New component page covering popover / dialog / bottom-sheet presentations, hour format, minute interval, custom format, and field states
  • WheelTimePicker — New component page covering 12 / 24-hour modes, minute interval, localized labels, commit-on-rest, custom composition, and custom item render
  • DateTimePicker — New component page covering managed state, bounded date range, 24-hour mode, custom label, and field states
  • WheelDateTimePicker — New component page covering bounded ranges, 24-hour mode, minute interval, localized labels, custom date label, and commit-on-rest
  • RangeCalendar — Documents the new data-today-not-in-range render-prop attribute

On this page