You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
native_presentation_tag :root lets a page declare that it lands as a root, with nothing behind it and no back affordance, wherever it lands. A screen that is always the first one in its tab — a dashboard reached by scanning a code, the page you land on after choosing an account — now says so about itself, instead of every link and form that reaches it having to say it. Because it is read at the destination rather than at the origin, a POST and its redirects carry the intent to wherever the chain actually ends, and a validation failure that re-renders the form declares nothing at all. Not the same as action: :replace, which swaps the current entry and leaves everything under it. In Advanced Mode it applies before the navigation commits when the page arrives from a form submission, which is the only case where the destination has been fetched by the time the screen is decided; a link tap, a deep link or a cold boot lands first and the stack is corrected once the page renders. Normal Mode applies it on every arrival. Both modes, iOS and Android. Inertia apps get the same thing as a NativePresentation component from @ruby-native/react and @ruby-native/vue.
menu.item accepts action: :replace to control how its page lands. A navbar menu item is a link with native chrome, so it now takes the same push/replace history semantics: :replace swaps the current entry in place, with no back arrow and no stack growth, which is what a page switcher wants. The default stays push. Both Normal and Advanced Mode, iOS and Android. Inertia apps get it as an action prop on NativeMenuItem.
navbar.button position: :title turns the nav-bar title into a dropdown menu. The title becomes a menu button, the native counterpart of SwiftUI's toolbarTitleMenu: the button's menu items switch the current view and the title shows the selected one with a checkmark, defaulting to that item's label. Pair it with action: :replace for a page switcher. Both Normal and Advanced Mode, iOS and Android. Inertia apps pass position="title" to NativeButton.
NativeSegment brings navbar segments to Inertia apps. The React and Vue counterpart of navbar.segment, with the same title, href, click, and selected props. iOS only, as segments already were.
Fixed
A query string no longer stops a /new or /edit screen from presenting as a sheet in Advanced Mode. Path configuration patterns are matched against the path and the query string joined together, on both platforms, so the anchored /new$ rule missed /orders/new?kind=draft and the screen pushed instead of coming up modally. Nothing about the rule says that, and a filtered or prefilled Rails form is ordinary, so the rules now tolerate a trailing query. Paths that merely contain the word, like /news?page=2, are still pushed. Both platforms.
native_tabs_tag enabled: false no longer throws away the page in Advanced Mode. Any page without a tabs element rebuilt the navigator at the entry point, which is right for the sign-out wall it was written for and wrong for a detail screen that just wants the bar out of the way, so tapping into a record landed the user back on the first tab. The two are now told apart by where the page arrives: a modal restarts, a push hides the bar in place and keeps its stack, and a background tab is ignored. Popping brings the bar back. iOS only.
Signing out of an Advanced Mode app no longer lands on /. Hiding the tab bar rebuilt the app's single navigator at the bare base URL rather than the entry point a cold launch uses, so an app whose / is a marketing site or a redirect dropped the user there instead of on its first screen. It now starts at app.entry_path, or the first tab's path when that is unset, which is what launch already did and what Android already does by resetting each tab to its own start URL. iOS only.
Overscroll no longer rubber-bands to white in Advanced Mode. Its web view was left opaque, so WKWebView painted its own white background across the whole scroll extent and covered whatever the page set on html, including the gap the pull-to-refresh spinner opens. native_overscroll_tag and appearance.background_color now both reach the overscroll area, as Normal Mode has done since 0.5.0. That is the release that introduced the helper, so it has never worked in Advanced Mode until now. iOS only.
Tab badge counts now reach VoiceOver on iOS. iOS 26 draws the badge but puts nothing in the accessibility tree for it, so the count was invisible to anything not reading pixels. It is published as the tab's accessibility value now, matching what Android already reported. iOS only.
The Advanced Mode navbar menu button now renders its configured icon, tinted to the navbar's foreground color. It drew a hardcoded, untinted overflow icon that ignored icon: and icons:, so a branded bar showed no visible glyph; the toolbar's submit button and FAB are themed to match now too. An iOS-only name like ellipsis.circle renders the missing-icon placeholder on Android instead of a coincidental overflow dot, so give menu buttons icons: { android: ... }. Android only.
A navbar menu button with no icon falls back to the overflow glyph instead of the missing-icon placeholder. Both Normal and Advanced Mode, Android.
The Android splash screen shows the customer's icon, not the bundled Ruby Native logo. The per-app icon was written as a mipmap that couldn't override the splash's drawable resource, so a flavor-level splash_icon.xml now points the splash at it. Android only.
A scan on an Android emulator reports unsupported instead of hanging. An emulator declares a camera and grants the permission, but its virtual scene can never resolve a barcode, so the viewfinder opened and sat there with no way for the page to know. It now settles as unsupported, the same outcome as a device with no camera, which reveals your manual-entry fallback. Simulator already did this on iOS. Android only.