react-brain
Browse decisions
React & language foundations 3App architecture 11UI 13Platform & native 9Build, test, observe, secure 6AI in React apps 3stack composerdecision recordscensusstaleness benchnewsletterarchitecturechangelogmethodologyroadmap

entriesui · verified 2026-09-24 · react-native

UX polish primitives — toasts, haptics, splash screens, image viewers (React Native)

reviewedconfidence: lowthis tier holds 64% on the public scorecard (7/14 graded · 0 overturned) →

related decisions: animation

cited by: sheets

re-verified 4× — 2026-09-24 · 2026-07-16 · 2026-07-13 · 2026-07-09 · changelog

recommendation

Toasts → sonner-native (needs Reanimated 4.1+; burnt for platform-native elements). Haptics → expo-haptics. Splash → react-native-bootsplash on bare RN, expo-splash-screen on Expo until you need bootsplash's generator/branding control. Image lightbox → galeria (New Architecture, iOS 16.4+). Each sub-domain is small: pick once, move on. Lightly vetted (confidence: low).

  • toast stack with real motion design → sonner-native (peers Reanimated ^4.1.1, worklets, Gesture Handler 2.28+, screens, svg)
  • platform-authentic system toasts → burnt (SPIndicator / ToastAndroid)
  • already on react-native-toast-message, or still on Reanimated 3 → react-native-toast-message (no Reanimated peer)
  • haptic feedback → expo-haptics (bare RN included)
  • already on react-native-haptic-feedback → react-native-haptic-feedback (fine, don't churn)
  • splash/branding control or bare RN → react-native-bootsplash
  • stock Expo template splash → expo-splash-screen (already installed)
  • tap-to-zoom image lightbox → galeria (native transitions; New Architecture and iOS 16.4+)
  • legacy architecture or iOS below 16.4 lightbox → react-native-image-viewing (last published 2022 — pin and own it)

Low confidence — fast-moving or lightly-vetted domain: treat the pick as a vetted lead and prototype before committing.

Options & tradeoffs

the field considered — and why each one isn’t the default here

optiontradeoffevidence
toasts — sonner-nativePort of Emil Kowalski's sonner (stacking, swipe, promise toasts); the design-led pick. 0.27.0 (2026-08-15, verified vs npm); see note: SONNER-NATIVE PEERS for its Reanimated 4.1+ floor.377k/wk · ships in 2/14
toasts — react-native-toast-messageThe JS incumbent: simple, widely deployed, less polished motion, no native or Reanimated peers. 2.5.2 (2026-09-08, verified vs npm).722k/wk
toasts — burntNATIVE toast/alert elements (SPIndicator on iOS, ToastAndroid on Android, sonner on web): platform-authentic, less customizable; Burnt.alert() falls back to a toast on Android. 0.13.0 (2025-03-10, verified vs npm) is still latest.189k/wk
haptics — expo-hapticsThe default: Taptic Engine on iOS, Vibrator service on Android, Web Vibration API on web; runs in bare RN via Expo Modules. Versions track the Expo SDK (57.0.3, 2026-09-11, verified vs npm).5.7M/wk · ships in 5/14
haptics — react-native-haptic-feedbackThe bare-RN incumbent with a slightly lower-level trigger set; peers react-native >=0.71. 3.0.0 (2026-03-29, verified vs npm).591k/wk · ships in 5/14
splash — react-native-bootsplashThe de-facto splash tool: asset generator CLI, edge-to-edge by default on Android, Expo plugin generates assets at prebuild; imperative hide() when the app is ready. 7.3.3 (2026-09-14, verified vs npm); see note: BOOTSPLASH.263k/wk · ships in 5/14
splash — expo-splash-screenThe Expo default, ships with the template, config-plugin driven; enough unless you need bootsplash's generator/branding control. Versions track the Expo SDK (57.0.9, 2026-09-11, verified vs npm).7.7M/wk · ships in 4/14
image viewer — galeria (@nandorojo/galeria)Native shared-element lightbox (Swift/Kotlin) with fluid pinch/dismiss transitions the JS viewers can't match; web is a simplified single-image version. 3.0.3 (2026-05-28, verified vs npm); see note: GALERIA FLOOR.58k/wk
image viewer — react-native-image-viewingThe JS incumbent: works, but no native transitions; not picked for new work because 0.2.2 (2022-04-18, verified vs npm) is its last publish.176k/wk

evidence: npm weekly downloads (signals snapshot) · “ships in n/D” = adoption across the production-app census, honest denominators

npm weekly downloads (from the corpus's last signals run): sonner-native 377k · react-native-toast-message 722k · burnt 189k · expo-haptics 5.7M · react-native-haptic-feedback 591k · react-native-bootsplash 263k · expo-splash-screen 7.7M · @nandorojo/galeria 58k · react-native-image-viewing 176k

Verified notes

Four recurring micro-domains — toasts, haptics, splash, image lightbox — kept as ONE entry because none carries enough selection weight alone, but together they are the 'app feels finished' checklist. The selection deserves minutes; the craft belongs in the details after the pick. The one real fork is toasts (a designed stack vs platform-native elements); haptics and splash split mechanically on Expo vs bare; the lightbox choice is a maintenance verdict. SONNER-NATIVE PEERS (2026-09-24, verified vs npm 0.27.0): react-native-reanimated ^4.1.1, react-native-worklets >=0.6.1, react-native-gesture-handler >=2.28.0, react-native-screens ^4.16.0, react-native-svg ^15.12.1, react-native-safe-area-context ^5.6.0 → a Reanimated 3 app cannot adopt it without the Reanimated 4 upgrade (RB-E-ANIMATION owns that thread); until then burnt or react-native-toast-message, neither of which peers on Reanimated. BOOTSPLASH (2026-09-24, verified vs GitHub releases + README): 7.0.0 made Android edge-to-edge the default and moved Expo asset generation into prebuild; 7.3.0 (2026-04-08) switched the Android implementation from Dialog to View with a mitigation for SurfaceControl errors on Android 12/13; 7.3.1 fixed RN 0.85 compatibility. The CLI generator is free for the logo; brand-image and dark-mode asset generation need a paid license key (BOOTSPLASH_LICENSE_KEY) → that is the 'branding control' the switch from expo-splash-screen buys. GALERIA FLOOR (2026-09-24, verified vs the 3.0.3 podspec + README): iOS deployment target 16.4 and the New Architecture (Fabric) is required; peer expo → a legacy-architecture app or an iOS 16.0–16.3 target cannot use it. BURNT (2026-09-24, verified vs npm + README): 0.13.0 from 2025-03-10 is still latest (~18 months without a release); it depends on Expo Modules (peer expo). react-native-tickle (Nitro haptics with AHAP patterns) was skipped as too early: still not on npm (2026-09-24, verified vs npm). HISTORY: 2026-09-24 CORRECTED: galeria floor was "iOS 16+" — it is iOS 16.4 and requires the New Architecture; sonner-native's Reanimated ^4.1.1 peer added; bootsplash's paid brand/dark-mode generator stated. 2026-07-09 GAP CLOSED: entry created from Native Weekly's 2026 run (sonner-native, bootsplash 7, galeria, react-native-tickle); versions verified vs npm.

Canonical reading

Editorial annotations on why each piece matters — the articles themselves are the originals; read them there.

Building a toast componentEmil Kowalski (sonner author)

The design rationale under sonner (and thus sonner-native): interruptible transitions over keyframes, index-scaled stacking, pause-on-hidden, momentum swiping, gap-filling hover pseudo-elements. Web-authored, but it is the canonical 'why good toasts feel good' — the taste this entry's toast pick imports.

Sources

Depth (in-domain rules) is owned by the react-native-best-practices skill — this entry is selection breadth.

The full explanation

The reviewed long-form essay behind this entry — the why, not a how-to. Also on GitHub.

About UX polish primitives — toasts, haptics, splash screens, image viewers

Diataxis: Explanation. This page builds understanding of the polish decision — why four unrelated micro-domains share one index entry, and why the recommendation's real content is a discipline ("pick once, move on") rather than a comparison matrix. It is not a wiring guide for any of these libraries. The candidate list and one-line tradeoffs live in the index entry RB-E-POLISH; depth is deferred to the react-native-best-practices skill. Read this for the why.

The one idea that organises everything: a checklist, not four decisions

The entry is deliberately one entry, not four — its own words: none of these micro-domains "carries enough selection weight alone, but together they are the 'app feels finished' checklist." Toasts, haptics, splash screens, and image lightboxes are the layer that separates a working app from a finished-feeling one, and each is too small to deserve a library hunt. That is the organizing inversion: the selection attention these domains deserve is minutes; the craft attention belongs in the details after the pick. The recommendation closes on exactly that note — "the polish is in the details, not the library hunt."

The provenance matches the shape. All four domains surfaced in Native Weekly's 2026 run (sonner-native, bootsplash 7, galeria, react-native-tickle) and were promoted into the encyclopedia on the user's call, as recurring micro-domains that previously had no home. Versions and dates were verified against npm on 2026-07-09 — and the entry grades itself confidence: low, "lightly vetted": the picks are sound enough to pick once and move on, which is precisely all the weight they are asked to carry.

The default, and why

Toasts → sonner-native (needs Reanimated 4.1+; burnt for platform-native elements). Haptics → expo-haptics. Splash → react-native-bootsplash on bare RN, expo-splash-screen on Expo until you need bootsplash's generator/branding control. Image lightbox → galeria (New Architecture, iOS 16.4+). Each sub-domain is small: pick once, move on. Lightly vetted (confidence: low).

Four assignments and one discipline. Only one of the four is a real fork: toasts split on whose motion design you want — sonner-native for a designed toast stack, burnt for platform-authentic system elements. The other three are near-verdicts. Haptics has a default that works everywhere (expo-haptics runs in bare RN via Expo Modules). Splash splits mechanically on workflow — bare RN versus the stock Expo template — with one named switch trigger (bootsplash's generator/branding control). And the image-viewer "choice" is really a maintenance verdict: the native option is current, the JS incumbent has been dormant since 2022.

The landscape, micro-domain by micro-domain

Toasts — the one real fork. sonner-native is a port of Emil Kowalski's sonner (stacking, swipe, promise toasts), active (0.27.0, 2026-08-15), and the entry's design-led pick. Its floor is real: peer deps require Reanimated ^4.1.1, react-native-worklets >=0.6.1, Gesture Handler >=2.28, screens ^4.16, svg ^15.12 and safe-area-context ^5.6, so a Reanimated 3 app cannot adopt it without the Reanimated 4 upgrade. What "design-led" means is spelled out by the entry's reading — Kowalski's own essay on building a toast component: interruptible transitions over keyframes, index-scaled stacking, pause-on-hidden, momentum swiping, gap-filling hover pseudo-elements. Web-authored, but it is the canonical "why good toasts feel good" — the taste the toast pick imports. burnt takes the opposite bet: native toast/alert elements (SPIndicator on iOS, ToastAndroid) — platform-authentic but less customizable, on a slower release cadence (0.13.0, 2025-03-10, still latest in 2026-09). Between them sits react-native-toast-message, the JS incumbent (2.5.2, 2026-09-08): simple, widely deployed, less polished motion, and no Reanimated peer — the pick when you are already on it or still on Reanimated 3.

Haptics — a default and a don't-churn. expo-haptics is the default: the system haptics engine on iOS, vibration effects on Android — and it works in bare RN via Expo Modules, so the "but we're not on Expo" objection doesn't apply. react-native-haptic-feedback is the bare-RN incumbent (v3.0, 2026-03) with a slightly lower-level trigger set; the entry's when-clause is symmetric mercy: already on it → fine, don't churn. The entry also names what it skipped: react-native-tickle (Nitro haptics with AHAP patterns) — not yet on npm, too early.

Splash — split by workflow. react-native-bootsplash is the de-facto splash tool (7.3.3): an asset generator CLI, edge-to-edge by default on Android, assets generated at Expo prebuild, and an imperative hide() when the app is ready. expo-splash-screen is the Expo default that ships with the template, config-plugin driven — fine unless you need bootsplash's generator/branding control, which is also the named trigger for switching. The generator handles the logo for free; brand-image and dark-mode assets need a paid license key (BOOTSPLASH_LICENSE_KEY), so the branding control has a price. Both expo-* packages version-track the SDK rather than releasing independently.

Image lightbox — a maintenance verdict. galeria (@nandorojo/galeria) is a native shared-element lightbox (3.0.3, 2026-05-28; iOS 16.4+ and the New Architecture required) with fluid pinch/dismiss transitions the JS viewers can't match. react-native-image-viewing is the JS incumbent — unmaintained since 2022; it works, but no native transitions and aging. The when-clause is blunt: avoid starting new work on it.

Tradeoffs and failure modes to name out loud

  • The library hunt itself. Spending comparison energy where the entry says none is warranted is the domain's own anti-pattern. Each sub-domain is small — pick once, move on; the differentiating polish lives in the details, not in the pick.
  • Starting new work on react-native-image-viewing. Dormant since 2022. It works today, but the entry's routing sends new lightbox work to galeria's native transitions.
  • Churning working haptics. A codebase already on react-native-haptic-feedback is fine — the entry says don't churn. The expo-haptics default is for picking, not for migrating.
  • Buying burnt's authenticity without pricing it. Platform-native elements come with less customizability and a slower release cadence (0.13, 2025-03) — the trade is authenticity for control, and it should be taken knowingly.
  • Betting on react-native-tickle today. Nitro haptics with AHAP patterns is the direction to watch, but it is not yet on npm — the entry skipped it as too early.
  • galeria's floor. The native lightbox needs iOS 16.4+ and the New Architecture (Fabric); below that floor the entry routes to react-native-image-viewing, pinned and owned.
  • Over-trusting the picks. The entry self-grades confidence: low — versions and dates verified against npm 2026-07-09, but the picks are lightly vetted, not battle-audited.

How it interacts with the rest of the stack

  • The Expo/bare seam. Two of the four domains sit on it: haptics (expo-haptics works in bare RN via Expo Modules, so one default covers both worlds) and splash (the default splits by workflow, and the expo-* package versions track the SDK).
  • Depth (react-native-best-practices). The declared defer skill. The entry names it without scoping what it owns here — the index carries the picks; the skill carries the RN practice depth.
  • No sibling entries. The entry names no other RB-E domains — these four micro-domains are the whole neighborhood, which is consistent with the thesis: they cluster as one checklist precisely because none connects to a bigger selection problem.
  • The taste import. The one reading is web-authored (sonner, not sonner-native): the entry treats Kowalski's design rationale as the criterion the RN port inherits, and ships it to anyone with sonner-native in their dependency tree.

In one paragraph

UX polish in React Native is a checklist, not four decisions: toasts, haptics, splash screens, and image lightboxes are the "app feels finished" layer, each too small to deserve a library hunt — pick once, move on. The picks: sonner-native for toasts on Reanimated 4.1+ (or burnt when platform-native SPIndicator/ToastAndroid elements matter more than customization), expo-haptics for haptics (bare RN included, via Expo Modules; don't churn off react-native-haptic-feedback), react-native-bootsplash on bare RN or expo-splash-screen on stock Expo for splash (switch for bootsplash's generator/branding control), and galeria for image lightboxes (native shared-element transitions; iOS 16.4+, New Architecture) while avoiding new work on the dormant react-native-image-viewing. The entry self-grades confidence: low — lightly vetted, npm-verified 2026-07-09 — and the design depth it points at is Kowalski's toast essay, because the polish is in the details, not the library hunt.


See also: the react-native-best-practices skill (the declared defer target — RN practice depth beyond these picks). The entry names no sibling RB-E entries. Background reading: Emil Kowalski's "Building a toast component" — the design rationale sonner-native imports, and the canonical account of why good toasts feel good.

Related in ui: styling · component-libs · animation · lists · a11y · i18n · charts · editors · svg · maps · calendars · sheets