Releases

What has landed in @delacour/react-native-ui, newest first.

Pre-1.0

Every package is below 1.0. The API is still moving — component surfaces, prop names and token names can all change between releases.

Release channels

Every package ships on two npm dist-tags:

TagVersionPublishedUse it for
latest0.1.0When a release is cut, after a maintainer approves itApps — this is what a bare install resolves to
alpha0.1.1-alpha.20260925031715On every change merged to developTrying what has landed before it is released
bunx delacour@latest add buttonbun add @delacour/react-native-ui

To follow the alpha line, name the tag. An alpha CLI installs the alpha packages to match:

bunx delacour@alpha add buttonbun add @delacour/react-native-ui@alpha
 change merged to develop ──► 0.1.1-alpha.<datetime> ──► npm @alpha
            │                        (every merge)
            │
            ▼
 release cut from develop ──► 0.1.1 ──► maintainer approves ──► npm @latest
                                         (2FA)                   + GitHub Release
                                                                 + this site updated

Right after a release, alpha can name a snapshot older than the new latest until the next change lands. Prefer latest unless you need something that has not shipped yet.

Where the canonical record lives

This page is the narrative. The exact, per-release record is generated by Changesets into packages/react-native-ui/CHANGELOG.md and packages/cli/CHANGELOG.md, and mirrored to the GitHub Releases for each package — those are authoritative when the two disagree.

Unreleased

Added

  • Tabs — a row of tabs and the panels they switch between. One shared value drives the pager's translation, the measured indicator's frame and every separator's opacity, with a swipeable pager that gives up the vertical axis so it works inside a scroll view.
  • BottomSheet — a sheet on @gorhom/bottom-sheet, with the scrim rebuilt so a TextInput inside one still receives its taps.
  • Accordion — sections animated from a measured height, with single and multiple selection as a discriminated union.
  • Slider — a value or a range picked by dragging. The package's first Gesture.Pan().
  • Switch — an on/off control with a thumb you can drag as well as tap.
  • Checkbox — a box that is ticked or not, with Checkbox.Label and Checkbox.Group. Six colours, three sizes, two alignments, an indeterminate state, and a three-part animation driven off one shared value.
  • Radio — one choice from a set, with Radio.Label, Radio.Indicator and Radio.Group. The indicator trails the label rather than leading it. Radio.Indicator accepts custom children in place of the default dot.
  • Field — the form layout and its state cascade. Field.Set, .Legend, .Group, .Label, .Description, .Error, .Content and .Separator. The whole row drives the control once one registers a press.
  • Input — a text field plus Input.Group with Prefix and Suffix decorators. One box slot with two homes, so a grouped field is the same box rather than a similar one.
  • Badge — a compact label for status, category or count. Four surface variants × six semantic colours, plus Badge.CloseButton for a dismissible tag.
  • Text — the type scale and the inheritance cascade, with twelve presets. Every Text publishes its resolved class to its subtree and merges the one it inherited.
  • Screen — the screen frame. Self-measuring navbar and footer, four scrollables, two whole-screen states, and a debug mode that paints every layer.
  • DelacourProvider — the four root providers in one component.
  • ListGroup and Separator — a row surface with dividers inserted for you, and the rule it inserts.
  • Spinner — an angle-compensated gradient arc that shares the icon scale, wired into Button's isLoading.
  • Expo entry point — @delacour/react-native-ui/expo/navigation-theme, plus useNavigationTheme() for apps on a different navigator.
  • DelacourUI.* display names on every component, enforced by a test that reads the source as text.
  • elevated / elevated-foreground tokens, minted for a surface that has to sit above muted in both themes.
  • Per-component AGENTS.md, with src/docs.test.ts failing the build on a component that is undocumented or missing from the package doc's index.
  • Tokenised sizes — --spacing-button-*, --spacing-icon-*, --spacing-input-*, --text-button-*, --text-input-*, --spacing-navbar-row, --spacing-screen-gutter. Icon and Spinner share one scale.
  • scale-fade press feedback, composed from scale and fade rather than spelled out.

Changed

  • Compound components moved to one file per part, with the surface assembled by a closing Object.assign.
  • Button, ListGroup and Screen migrated onto Text rather than carrying their own type scales.
  • Worklets cross back to JS with scheduleOnRN from react-native-worklets, not Reanimated's deprecated runOnJS shim. A Biome rule fails the build on the old names.
  • Button and ListGroup.Item inherit feedback from Pressable instead of restating it.
  • Separator's tv() moved into separator.tsx — the pattern C carve-out for a single styled element with no pure resolvers.
  • Every component page now opens with an Installation block — the CLI command, the npm package, and the manual file list — generated from the registry rather than written by hand. Reasoning prose moved into each component's own AGENTS.md, which travels with the source when the CLI copies it.

Fixed

  • Button keeps its footprint when the spinner replaces a composed icon, so the label no longer shifts when work begins.
  • Literal colours are no longer looked up as CSS variables.
  • The spinner arc's joint no longer composites into a bright dot opposite the head.
  • An inline padding no longer erases a caller's className.
  • Pressables are exposed to assistive technology.

Full history lives in the repository. Every commit is scoped and prefixed — git log --oneline -- packages/react-native-ui.

On this page