| Feature | iOS | Android | Web |
|---|---|---|---|
| Responsive icon colors | One.UI.Icon + UIKit semantic colors | One.UI.Icon + adaptive Material color scheme | app-provided element |
| Zoom Transitions | iOS 18+ | unsupported | unsupported |
| Toolbar | UIToolbar + SF Symbols | unsupported | unsupported |
| Menu Actions | UIMenu / UIAction | unsupported | unsupported |
| SplitView | iPad (gamma required) | routed slot fallback | routed slot fallback |
| Icons | SF Symbols via One.iOS.Image | Material Symbols via One.Android.Icon | unsupported |
| Shared icon selection | One.UI.Icon | One.UI.Icon | app-provided React element |
| SwiftUI controls and containers | One.iOS.* | unsupported (throws) | unsupported (throws) |
| Compose views | unsupported (throws) | One.Android.* | unsupported (throws) |
| EdgeFade, Blur, Mask | native primitive | native primitive | CSS gradients, backdrop-filter, alpha mask-image |
| Gradients | RN 0.87 backgroundImage (see Gradients) | RN 0.87 backgroundImage (see Gradients) | see Gradients |
| TextInput, native state | One.UI.* | One.UI.* | One.UI.* (web behavior) |
| Safe area | One.UI.SafeArea | One.UI.SafeArea | One.UI.SafeArea (css env) |
| Size class, hinge | window scene size class + UIHinge | WindowMetrics size class (compact below 600dp wide / 480dp tall) + FoldingFeature hinge (null with no hinge) | regular size class, null hinge |
| Colors | One.iOS.Color | One.Android.Color | null |
| Notifications | permission, badge, channels (no-op), events, handler, scheduling | permission, badge (no-op), channels, events, handler, scheduling | denied, inert |
| Clipboard | UIPasteboard | ClipboardManager | navigator.clipboard |
| Network | NWPathMonitor | ConnectivityManager | navigator.onLine |
| Browser | SFSafariViewController + ASWebAuthenticationSession | Custom Tabs | window.open |
| Haptics | UIFeedbackGenerator trio | performHapticFeedback mapping | no-op |
| Crypto | arc4random_buf | arc4random_buf | platform crypto |
| ImagePicker | PHPickerViewController + camera | system photo picker + camera intent | file dialog + capture input |
| Photo Library | save, browse, edit, albums, and export | save, browse, albums, favorite, delete, and export over MediaStore; album edits and content replace/revert unsupported | unsupported (throws) |
| Image Manipulator | local crop, resize, rotate, JPEG/PNG encode | local crop, resize, rotate, JPEG/PNG encode | canvas crop, resize, rotate, JPEG/PNG blob URLs |
| DocumentPicker | UIDocumentPickerViewController | ACTION_OPEN_DOCUMENT | file dialog |
| SecureStore | Keychain, readable while unlocked | AES-256-GCM, key in AndroidKeyStore | rejects |
| Map | One.UI.Map (MapKit) | One.UI.Map (Google Maps, key required) | renders nothing |
| Picture in Picture | AVPictureInPictureController (sample buffer source) | activity pip mode | renders inline |
| WebGPU | react-native-webgpu (Dawn) | react-native-webgpu (Dawn) | navigator.gpu |
| Device | UIDevice + Locale snapshot | Build + Locale snapshot; ANDROID_ID vendor ID | browser platform + Intl; no hardware identity |
| KeepAwake | idle timer flag | window keep-screen-on flag, re-applied on resume | Screen Wake Lock where present |
| ScreenOrientation | scene geometry locks + listeners | display rotation locks + listeners; runtime overrides manifest | screen.orientation; unsupported locks reject |
| Share | activity sheet + completion | system chooser; completed when a target is chosen | navigator.share where present |
| AirPrint sheet + completion | PrintManager + PDF raster at job resolution | unavailable (see Print) | |
| QuickActions | shortcut items + cold/warm delivery | dynamic shortcuts + cold/warm delivery | unavailable |
| AppIcon | alternate icon sets | manifest activity-alias entries | unavailable |
| Location | CoreLocation + geocoder | LocationManager + Geocoder; background via foreground service | geolocation; no geocoder |
| MapServices | MapKit search, autocomplete, directions | Geocoder search only; rest unavailable | unavailable |
| LocalAuthentication | LAContext biometrics | BiometricManager + BiometricPrompt | unavailable |
| ScreenCapture | scene capture state + screenshot notifications | activity screenshot callback (34+) + window-manager recording state (35+); PixelCopy PNG capture (26+) | unavailable |
One.iOS.ToolbarHost, One.iOS.MenuAction, and the ZoomTransition*
components return null on other platforms, so they are safe to keep in
cross-platform component trees. SplitView renders its routed slot without
native columns on Android and web. Other SwiftUI components, including Menu,
ContextMenu, and Toolbar, throw outside iOS builds, and Compose components
throw outside Android builds, so keep those branches behind platform checks.
| Root service | Web behavior |
|---|---|
| FileSystem | origin-private folders and committed OPFS writes |
| Motion | observed device events; magnetometer unavailable |
| Speech | browser recognition API where present |
| Device | browser platform and Intl localization; no hardware identity |
| KeepAwake | Screen Wake Lock where present; browser release is reflected |
| ScreenOrientation | screen.orientation; unsupported locks reject |
| Share | navigator.share where present; cancellation is incomplete |
| unavailable: current-document print cannot return PDF completion | |
| Location | geolocation positions and foreground watches; no geocoder |
| Audio | HTMLAudioElement, MediaRecorder, optional Media Session |
| Contacts | Contact Picker where present; no address-book access or editing |
Browser capabilities depend on context and permissions. SSR preserves each service’s existing unavailable contract.
Edit this page on GitHub.