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:
| Tag | Version | Published | Use it for |
|---|---|---|---|
latest | 0.1.0 | When a release is cut, after a maintainer approves it | Apps — this is what a bare install resolves to |
alpha | 0.1.1-alpha.20260925031715 | On every change merged to develop | Trying what has landed before it is released |
bunx delacour@latest add buttonbun add @delacour/react-native-uiTo 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 updatedRight 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 aTextInputinside one still receives its taps. - Accordion — sections animated from a measured height, with
singleandmultipleselection 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.LabelandCheckbox.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.IndicatorandRadio.Group. The indicator trails the label rather than leading it.Radio.Indicatoraccepts custom children in place of the default dot. - Field — the form layout and its state cascade.
Field.Set,.Legend,.Group,.Label,.Description,.Error,.Contentand.Separator. The whole row drives the control once one registers a press. - Input — a text field plus
Input.GroupwithPrefixandSuffixdecorators. 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.CloseButtonfor a dismissible tag. - Text — the type scale and the inheritance cascade, with twelve presets. Every
Textpublishes 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
debugmode 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'sisLoading. - Expo entry point —
@delacour/react-native-ui/expo/navigation-theme, plususeNavigationTheme()for apps on a different navigator. DelacourUI.*display names on every component, enforced by a test that reads the source as text.elevated/elevated-foregroundtokens, minted for a surface that has to sit abovemutedin both themes.- Per-component
AGENTS.md, withsrc/docs.test.tsfailing 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.IconandSpinnershare one scale. scale-fadepress feedback, composed fromscaleandfaderather than spelled out.
Changed
- Compound components moved to one file per part, with the surface assembled by a closing
Object.assign. Button,ListGroupandScreenmigrated ontoTextrather than carrying their own type scales.- Worklets cross back to JS with
scheduleOnRNfromreact-native-worklets, not Reanimated's deprecatedrunOnJSshim. A Biome rule fails the build on the old names. ButtonandListGroup.IteminheritfeedbackfromPressableinstead of restating it.Separator'stv()moved intoseparator.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
Buttonkeeps 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.