React Native Core Coverage
These figures are the same ones the conformance page shows, generated from the same data whenever it changes. How we measure conformance explains what a score means.
| Score | |
|---|---|
| React Native 0.87.1 | 99% |
| Essential libraries, equal weight | 97% |
| Essential libraries, weighted by downloads | 98% |
React Native
React Native 0.87.1 scores 99% of its API surface, with 157 surfaces compared pixel by pixel against a real iPhone. The surface below is every public API Peach tracks, by area. See every surface on the conformance page.
| Area | Exports | Props | Events | Methods | Native module calls | Total |
|---|---|---|---|---|---|---|
| Native modules | 68 | 51 | 7 | 173 | 212 | 511 |
| Layout and imperative methods | 13 | 194 | 23 | 58 | 37 | 325 |
| Press and responder | 11 | 67 | 92 | 49 | 13 | 232 |
| Animation | 6 | 4 | 0 | 63 | 62 | 135 |
| Scrolling | 3 | 78 | 11 | 27 | 7 | 126 |
| System UI | 10 | 13 | 4 | 46 | 45 | 118 |
| Text input | 5 | 72 | 13 | 17 | 2 | 109 |
| Image | 4 | 31 | 7 | 22 | 37 | 101 |
| Text and typography | 4 | 36 | 2 | 6 | 12 | 60 |
| Accessibility | 1 | 21 | 5 | 1 | 23 | 51 |
| Lists | 5 | 20 | 1 | 10 | 0 | 36 |
Essential libraries
The libraries almost every React Native app installs. Each name links to its conformance page with visual proof.
| Library | API coverage | Visual proof | Works | Not yet |
|---|---|---|---|---|
| react-native-safe-area-context | 100% | yes | SafeAreaProvider with live Android system-bar and IME-resized frame metrics, SafeAreaView (edges/mode padding/margin), useSafeAreaInsets, useSafeAreaFrame, SafeAreaInsetsContext, SafeAreaFrameContext, initialWindowMetrics, initialWindowSafeAreaInsets, SafeAreaListener onInsetsChange, withSafeAreaInsets HOC | rotation-specific provider frame deltas remain unassessed |
| react-native-screens | 99% | yes | Screen, ScreenContainer, ScreenStack, enableFreeze/freezeEnabled with delayed React freeze, Android modal/pageSheet push fallback, Android statusBarHidden/statusBarStyle/navigationBarHidden traits, push/pop slide, replaceAnimation push/pop direction, zoom/fade/fade_from_bottom transitions, edge swipe-back, parallax behind-screen, large title collapse, header (back button, inline/large title, custom left/center/right/search bar subviews, native header bar buttons/menus/badges, crossfade), formSheet custom initial detents/corner radius/grabber/undimmed range, numeric-detent dragging and settling, eligible content scrolling, detent callbacks, guarded dismissal and stacked sheets, useHeaderHeight, useTransitionProgress, FullWindowOverlay, SearchBar with stacked and iOS 26 automatic/inline/integrated/integratedCentered/integratedButton toolbar placement, Tabs.Host/Screen with detached system Search on the Duo trailing column (inline fifth tab on iPhone per the iOS 27 oracle), regular/inline bottomAccessory, tabBarMinimizeBehavior never/automatic/onScrollDown/onScrollUp, active-tab restoration on reselect, lifecycle callbacks (onAppear/onDisappear/onWillAppear/onWillDisappear), onDismissed | over-drag return spring fidelity, sheet-to-scroll handoff creep beyond the largest detent |
| react-native-reanimated | 99% | yes | useSharedValue, useAnimatedStyle/Props/Reaction, useDerivedValue, useAnimatedScrollHandler, useScrollViewOffset, useFrameCallback, useAnimatedRef, useAnimatedKeyboard, useAnimatedSensor, useReducedMotion, entering/exiting/layout transitions, css/createCSSAnimatedComponent with cubicBezier/linear/steps timing for common opacity and transform transitions, opacity and transform keyframes with retained forwards fill, withTiming/Spring/Decay/Delay/Sequence/Repeat/Clamp, interpolate, interpolateColor, runOnJS/UI, measure, scrollTo, getViewProp (layout, opacity, zIndex, backgroundColor, boxShadow), direct setViewStyle snapshots, Easing, createAnimatedComponent, Animated.View/Text/Image/ScrollView/FlatList | Reanimated 4 CSS layout, border metrics, shadows, filters, and complex-value transitions and keyframes remain incomplete |
| react-native-worklets | 96% | |||
| @react-native-async-storage/async-storage | 100% | |||
| react-native-gesture-handler | 100% | GestureDetector, Gesture.Tap/Pan/Pinch/Rotation/Fling/LongPress/ForceTouch/Manual/Race/Simultaneous/Exclusive/Hover, ForceTouchGestureHandler unavailable-hardware fallback (children render, forceTouchAvailable false, no force events), simultaneousWithExternalGesture/requireExternalGestureToFail/blocksExternalGesture, ScrollView/FlatList, Switch/RefreshControl, Pressable/Text, Touchables, BaseButton/RawButton/RectButton/BorderlessButton/PureNativeButton, Swipeable, ReanimatedSwipeable, DrawerLayout (the upstream component running on this seam: renderNavigationView, drawerPosition/drawerType/drawerWidth/edgeWidth, openDrawer/closeDrawer, edge-swipe drag, onDrawerOpen/onDrawerClose/onDrawerStateChanged), GestureHandlerRootView, createNativeWrapper, gestureHandlerRootHOC, PointerType/MouseButton/HoverEffect exports, velocity tracking, activeOffsets, multi-tap | ||
| react-native-svg | 95% | yes | Svg, Path, Circle, Rect, Line, Ellipse, Polygon, Polyline, G, Text, TSpan, TextPath shaped glyphs along referenced paths, Defs, Pattern fills, Marker geometry on paths/lines/polylines/polygons, LinearGradient and RadialGradient with objectBoundingBox/userSpaceOnUse coordinates, focal points and gradientTransform, Stop, Mask, ClipPath, Image, Use and Symbol references, SvgXml, SvgUri, SvgAst, SvgFromXml, SvgCss, parse, fetchText, camelCase, getTotalLength and getPointAtLength for Path, Line, Rect including rounded corners, Circle, Ellipse, Polygon and Polyline, getBBox, getCTM, getScreenCTM, isPointInFill, isPointInStroke, shape transforms, fill/stroke/opacity/dasharray, currentColor, viewBox scaling | native SVG filter components and toDataURL refuse calls; ForeignObject does not render; marker context paints remain unverified; TextPath advanced layout, per-glyph positioning and objectBoundingBox paints are unsupported; pattern non-scaling strokes use the tile matrix; no font or emoji fallback parity claim |
| @react-native-community/netinfo | 99% | |||
| @sentry/react-native | 100% | |||
| react-native-webview | 81% | yes | source.uri/source.html/source.baseUrl, Chromium cross-origin URI loading under the shell COEP, same-origin URI cookies, source.html persistent localStorage, document-start ReactNativeWebView bootstrap and injectedJavaScriptBeforeContentLoaded/injectedJavaScript on source.html, and on remote cross-origin source.uri pages in a playwright-driven sim, main frame only as on iOS, strict ReactNativeWebView.postMessage bridge envelope in both directions, onMessage synthetic event with navigation fields, onOpenWindow target delivery for source.html, successful onLoad/Start/End and onNavigationStateChange, ref.reload on URI pages, ref.injectJavaScript/postMessage, local HTML fragment URL/callback behavior, onShouldStartLoadWithRequest for local link clicks with native-shaped request and loading payloads, initial-load onShouldStartLoadWithRequest for http(s) documents with the native other/top-frame/lockIdentifier payload allowed or denied through the lock callback, form-submit onShouldStartLoadWithRequest with navigationType formsubmit and, for a get form, the form data as the url query, resumed in place, ref.stopLoading cancelling an in-flight reload with no following callbacks, onError with the native NSURLErrorDomain code/description for a refused local connection and WebKitErrorDomain 103 for a port on the WebKit blocked list, each plus onLoadEnd and renderError(domain, code, description), onHttpError with the native url/statusCode for a same-origin local HTTP error, internal content scrolling, renderLoading, javaScriptEnabled sandbox, layout, inherited clipping and visibility, parked/live presentation | Safari/WebKit cross-origin URI pages without COEP-compatible response headers remain permanently loading because WebKit ignores iframe credentialless; Chromium credentialless cross-origin URI frames send no credentials, including cookies set by their own origin, and use ephemeral storage; iframe pixels in canvas screenshots; script injection, ReactNativeWebView bootstrap, and onOpenWindow for remote pages outside a playwright-driven sim (the desktop app or a plain browser tab), because only the sim browser host reaches a cross-origin frame at document start; injection into a remote page whose Content-Security-Policy forbids eval, which a WKUserScript bypasses; source.headers on the initial load of a remote page; cross-origin history truthfulness (goBack/goForward across documents, truthful canGoBack/canGoForward) plus reload and history-traversal policy decisions; initial-load decisions for data:/about:/file documents, which stay ungated with no paired native ask observed; remote HTTP error statuses and refused remote connections, which a cross-origin frame never exposes to the browser, and the HTTP status of a non-get form submit; allowsBackForwardNavigationGestures, userAgent, dataDetectorTypes, cacheEnabled, incognito, scalesPageToFit, originWhitelist enforcement |
| react-native-get-random-values | 100% | |||
| @react-native-masked-view/masked-view | 100% | yes | MaskedView, maskElement, children, the invalid-mask warning and unmasked View fallback, style, pointerEvents, accessible, accessibilityLabel, nativeID, testID | |
| @react-native-community/datetimepicker | 94% | |||
| react-native-keyboard-controller | 98% | yes | every upstream JS export runs through reanimated worklets; Android KeyboardGestureArea drives the existing keyboard owner through drag progress, velocity/distance settling, cancellation, focus retention, and cleanup; supported exports include KeyboardProvider, KeyboardAvoidingView, KeyboardStickyView, KeyboardAwareScrollView, KeyboardToolbar, KeyboardGestureArea, useReanimatedKeyboardAnimation, useKeyboardAnimation, useKeyboardHandler, useGenericKeyboardHandler, useKeyboardController, useKeyboardState, useKeyboardContext, useReanimatedFocusedInput, useFocusedInputHandler, useResizeMode, useWindowDimensions, KeyboardEvents, FocusedInputEvents, WindowDimensionsEvents resize events, KeyboardController (dismiss/setFocusTo/isVisible/state/preload/setInputMode/setDefaultMode), KeyboardControllerView, OverKeyboardView, KeyboardBackgroundView, KeyboardExtender, ClippingScrollView, KeyboardToolbarGroupView, and AndroidSoftInputModes | KeyboardBackgroundView and ClippingScrollView lack their native platform effects; OverKeyboardView native-window fidelity beyond the observed iOS browser cases remains unverified; KeyboardExtender does not include accessory height in keyboard-frame metrics and exact native geometry remains incomplete; toolbar focus eligibility excludes hidden or zero-size inputs that native iOS counts |
Looking for another library? Every library Peach knows lists them all.