Native coverage

Native coverage for Ferrule, a React Native UI library for iOS, Android and web. What exists on each platform, and how far each view has been checked.

Current native UI components in Apple's SDK (iOS 26.5 runtime, Xcode 27.2 SDK) and Google's Material 3 for Compose (material3 1.4.0, the version Compose BOM 2026.09.00 resolves to), and what @leoanimesh/ferrule-native does with each. Full coverage is a goal, not the current state.

  • Built and run: rendered on the iOS 26.5 simulator or API 37 emulator, with interaction checked by the scripted flows where the table says so. The Android scripted flow also ran on a physical Pixel 8a on Android 17. No native view has run on a physical iPhone.
  • Rendered: built and seen on screen, interaction not scripted.
  • Built, not run: compiled, never seen.
  • Not built: no view exists yet.
  • None: the platform has no such control.

Web, a binary without this package, and iOS below 17 use the Ferrule component or fallback. iOS 17 to 25 is a compiled branch with the system style without glass, and has not been run: no simulator runtime below 26 is installed here.

Built

ComponentExport (Ferrule native prop)iOS implementationiOS statusAndroid implementationAndroid status
ButtonNativeButton (Button)SwiftUI Button, .glass, .glassProminentBuilt and run: press eventM3 Button, FilledTonalButton, OutlinedButton, TextButtonBuilt and run: press event
Icon buttonNativeIconButton (IconButton)SwiftUI Button, .glass, .glassProminent, .buttonBorderShape(.circle); .bordered on iOS 17 to 25 (not run, no runtime here)Built and run: press eventNot built, see belowNot built
Glass containerNativeGlass (Card)UIKit UIVisualEffectView with UIGlassEffect, holds React childrenBuilt and run: glass seen over shapesNone. Themed surfaceFallback run
ToggleNativeToggle (Switch)SwiftUI ToggleBuilt and run: change eventM3 Switch in a toggleable rowBuilt and run: change event
CheckboxNativeCheckbox (Checkbox)None. Ferrule's staysFallback runM3 Checkbox in a toggleable rowRendered
SliderNativeSliderSwiftUI SliderBuilt and run: change eventM3 SliderBuilt and run: change event
SegmentedNativeSegmentedSwiftUI Picker .segmentedBuilt and run: change eventM3 SingleChoiceSegmentedButtonRowBuilt and run: change event
PickerNativePickerSwiftUI Picker .menuRenderedM3 ExposedDropdownMenuBoxBuilt and run: opens
MenuNativeMenuSwiftUI MenuBuilt and run: select eventM3 DropdownMenuBuilt and run: select event
Date pickerNativeDatePickerSwiftUI DatePicker .compactRenderedM3 DatePickerDialogRendered: dialog opened, a day picked and confirmed once by a script, not in the e2e suite
Time pickerNativeDatePicker mode="time"SwiftUI DatePicker .compactRenderedM3 TimePicker in AlertDialogRendered: dialog opened by hand, selection not scripted
ProgressNativeProgress (Spinner)SwiftUI ProgressViewRenderedM3 LinearProgressIndicator, CircularProgressIndicatorRendered
Text fieldNativeTextField (Input)SwiftUI TextField, SecureFieldBuilt and run: typingM3 OutlinedTextFieldBuilt and run: typing
AlertNativeAlert (Modal with nativeActions)UIKit UIAlertControllerBuilt and run: actionM3 AlertDialogBuilt and run: action
SheetNativeActionSheet (Sheet with nativeActions)SwiftUI .sheet with detents. Actions only, no React childrenBuilt and run: actionM3 ModalBottomSheet. Actions only, no React childrenBuilt and run: action
Tab barNativeTabBarUIKit UITabBarBuilt and run: change eventM3 NavigationBarBuilt and run: change event
Top barNativeTopBarUIKit UINavigationBarBuilt and run: action eventM3 TopAppBarBuilt and run: action event
Search barNativeSearchBarUIKit UISearchBarRenderedM3 SearchBar, collapsed onlyRendered
ListNativeListSwiftUI List .insetGroupedBuilt and run: row pressM3 ListItem in LazyColumnBuilt and run: row press
ChipNativeChipNone in iOS. Small capsule glass buttonRenderedM3 FilterChipRendered
FABNativeFabNone in iOS. Large circular glass buttonBuilt and run: pressM3 FloatingActionButton, ExtendedFloatingActionButtonBuilt and run: press
Navigation barNativeTabBar on Android, NativeTopBar on iOSSee aboveSee aboveSee aboveSee above

Icons

Ferrule's own components draw Feather icons through Icon. A native control cannot show those, because it draws its own icon from a system set, so these stay on SF Symbols on iOS and Material icons on Android, named per platform with nativeIcon or icon:

ControliOSAndroid
IconButton, NativeIconButtonSF SymbolStays the Ferrule button, so Feather
TabBar with native, NativeTabBarSF SymbolMaterial icon
NativeTopBar actionsSF SymbolMaterial icon
NativeFabSF SymbolMaterial icon
NativeMenu items, NativeChipSF SymbolMaterial icon
NativeSearchBarSystem magnifierMaterial icon
NativeList chevrons, date and picker affordancesDrawn by the OSDrawn by the OS

So a screen mixing a native variant with Ferrule components mixes two icon styles.

Fonts

The theme's tokens.fontFamily reaches native controls by default. With no custom font in the theme they are unchanged.

ControliOSAndroid
Button, chip, FAB, text field and its label, toggle label, list rowsTheme fontTheme font
Top barTitle, through UINavigationBarTheme font
Action sheetMessage and actions. The title stays on the system fontTheme font
PickerLabel only. The value and options are drawn by the OSTheme font, options not looked at
MenuLabel only. Items are drawn by the OSLabel, items not looked at
Date pickerLabel only. The value and calendar are drawn by the OSLabel and value, dialog not looked at
Segmented controlSystem font: SwiftUI's segmented Picker ignores .font, and the only other way is a global UIAppearanceTheme font
AlertSystem font: UIAlertController has no font APITheme font: Material's dialog is drawn by Compose
Tab barSystem font, left at the OS default by decisionTheme font, from Material's type scale

Not built

ComponentiOSAndroid
Toolbar, bottom app barSwiftUI .toolbar, UIToolbarM3 BottomAppBar
Navigation rail, drawerNavigationSplitViewM3 NavigationRail, ModalNavigationDrawer
Tab view with content, navigation stackTabView, NavigationStackNone as one control
Sheet or dialog holding React children.sheet, UIPopoverPresentationControllerModalBottomSheet, Dialog
StepperStepperNone
Color pickerColorPickerNone
GaugeGaugeNone
Disclosure, accordionDisclosureGroupNone
Share sheetShareLinkSystem intent, not a Material component
SnackbarNoneM3 Snackbar
BadgeNoneM3 Badge
Tooltip.help, TipKitM3 TooltipBox
Range sliderNoneM3 RangeSlider
Radio buttonNoneM3 RadioButton
Split buttonNoneNot in stable 1.4
Android icon buttonIconButton with native stays the Ferrule one on AndroidM3 IconButton
Pull to refreshAvailable through React Native's RefreshControlAvailable through React Native's RefreshControl
Inline and wheel date picker stylesDatePicker .graphical, .wheelM3 DatePicker inline
Material 3 Expressive: LoadingIndicator, button groups, FAB menu, floating toolbarNoneNot in stable Material 3 1.4.0. Reassess when a stable BOM includes them
Label, GroupBox, Form, Section, Grid, Canvas, Map, VideoPlayerExist. Not controls Ferrule wraps todayNone
Card, HorizontalDivider, ScaffoldNoneExist. Ferrule's Card and Divider cover them