one 1.17.10 → 1.17.11

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (494) hide show
  1. package/dist/cjs/Root.native.js.map +1 -1
  2. package/dist/cjs/__mocks__/@react-navigation/native-stack.cjs +3 -1
  3. package/dist/cjs/__mocks__/@react-navigation/native-stack.native.js +4 -0
  4. package/dist/cjs/__mocks__/@react-navigation/native-stack.native.js.map +1 -1
  5. package/dist/cjs/__mocks__/expo-linking.native.js.map +1 -1
  6. package/dist/cjs/__mocks__/expo-modules-core.native.js.map +1 -1
  7. package/dist/cjs/__mocks__/react-native-screens.native.js.map +1 -1
  8. package/dist/cjs/babel-plugins/environment-guard.native.js.map +1 -1
  9. package/dist/cjs/babel-plugins/inline-one-server-url.native.js.map +1 -1
  10. package/dist/cjs/babel-plugins/one-router-metro.native.js.map +1 -1
  11. package/dist/cjs/babel-plugins/one-router-metro.test.native.js.map +1 -1
  12. package/dist/cjs/babel-plugins/remove-server-code.native.js.map +1 -1
  13. package/dist/cjs/babel-preset/index.native.js.map +1 -1
  14. package/dist/cjs/babel-preset/index.test.native.js.map +1 -1
  15. package/dist/cjs/babel-preset/integration.test.native.js.map +1 -1
  16. package/dist/cjs/cli/build.native.js.map +1 -1
  17. package/dist/cjs/cli/buildPage.native.js.map +1 -1
  18. package/dist/cjs/cli/buildPageWorker.native.js.map +1 -1
  19. package/dist/cjs/cli/checkNodeVersion.native.js.map +1 -1
  20. package/dist/cjs/cli/daemon.native.js.map +1 -1
  21. package/dist/cjs/cli/dev.native.js.map +1 -1
  22. package/dist/cjs/cli/generateBundlerConfig.native.js.map +1 -1
  23. package/dist/cjs/cli/generateBundlerConfig.test.native.js.map +1 -1
  24. package/dist/cjs/cli/generateRoutes.native.js.map +1 -1
  25. package/dist/cjs/cli/generateSitemap.native.js.map +1 -1
  26. package/dist/cjs/cli/generateSitemap.test.native.js.map +1 -1
  27. package/dist/cjs/cli/install-error-handlers.native.js.map +1 -1
  28. package/dist/cjs/cli/label-process.native.js.map +1 -1
  29. package/dist/cjs/cli/main.native.js.map +1 -1
  30. package/dist/cjs/cli/patch.native.js.map +1 -1
  31. package/dist/cjs/cli/patch.test.native.js.map +1 -1
  32. package/dist/cjs/cli/prebuild.native.js.map +1 -1
  33. package/dist/cjs/cli/runAndroid.native.js.map +1 -1
  34. package/dist/cjs/cli/runIos.native.js.map +1 -1
  35. package/dist/cjs/cli/securityScan.native.js.map +1 -1
  36. package/dist/cjs/cli/workerPool.native.js.map +1 -1
  37. package/dist/cjs/cli.native.js.map +1 -1
  38. package/dist/cjs/clientLoaderResolver.native.js.map +1 -1
  39. package/dist/cjs/config.native.js.map +1 -1
  40. package/dist/cjs/constants.native.js.map +1 -1
  41. package/dist/cjs/constants.test.native.js.map +1 -1
  42. package/dist/cjs/createAPIRoute.native.js.map +1 -1
  43. package/dist/cjs/createHandleRequest.cjs +21 -12
  44. package/dist/cjs/createHandleRequest.native.js +22 -12
  45. package/dist/cjs/createHandleRequest.native.js.map +1 -1
  46. package/dist/cjs/createHandleRequest.test.cjs +51 -6
  47. package/dist/cjs/createHandleRequest.test.native.js +53 -6
  48. package/dist/cjs/createHandleRequest.test.native.js.map +1 -1
  49. package/dist/cjs/createMiddleware.native.js.map +1 -1
  50. package/dist/cjs/daemon/index.native.js.map +1 -1
  51. package/dist/cjs/daemon/ipc.native.js.map +1 -1
  52. package/dist/cjs/daemon/picker.native.js.map +1 -1
  53. package/dist/cjs/daemon/proxy.native.js.map +1 -1
  54. package/dist/cjs/daemon/registry.native.js.map +1 -1
  55. package/dist/cjs/daemon/server.native.js.map +1 -1
  56. package/dist/cjs/daemon/tui.native.js.map +1 -1
  57. package/dist/cjs/daemon/types.native.js.map +1 -1
  58. package/dist/cjs/daemon/utils.native.js.map +1 -1
  59. package/dist/cjs/devtools/registry.native.js.map +1 -1
  60. package/dist/cjs/drawer.native.js.map +1 -1
  61. package/dist/cjs/fallbackViews/Sitemap.native.js.map +1 -1
  62. package/dist/cjs/fallbackViews/Unmatched.native.js.map +1 -1
  63. package/dist/cjs/fork/NavigationContainer.native.js.map +1 -1
  64. package/dist/cjs/fork/SSRNavigationContainer.native.js.map +1 -1
  65. package/dist/cjs/fork/__tests__/getPathFromState.test.native.js.map +1 -1
  66. package/dist/cjs/fork/__tests__/getStateFromPath.test.native.js.map +1 -1
  67. package/dist/cjs/fork/_shared.native.js.map +1 -1
  68. package/dist/cjs/fork/createMemoryHistory.native.js.map +1 -1
  69. package/dist/cjs/fork/createMemoryHistory.test.native.js.map +1 -1
  70. package/dist/cjs/fork/extractPathFromURL.native.js.map +1 -1
  71. package/dist/cjs/fork/extractPathFromURL.test.native.js.map +1 -1
  72. package/dist/cjs/fork/findFocusedRoute.native.js.map +1 -1
  73. package/dist/cjs/fork/getPathFromState-mods.native.js.map +1 -1
  74. package/dist/cjs/fork/getPathFromState.native.js.map +1 -1
  75. package/dist/cjs/fork/getPathFromState.test.native.js.map +1 -1
  76. package/dist/cjs/fork/getStateFromPath-mods.native.js.map +1 -1
  77. package/dist/cjs/fork/getStateFromPath.native.js.map +1 -1
  78. package/dist/cjs/fork/getStateFromPath.test.native.js.map +1 -1
  79. package/dist/cjs/fork/useThenable.native.js.map +1 -1
  80. package/dist/cjs/fork/validatePathConfig.native.js.map +1 -1
  81. package/dist/cjs/getReactNavigationConfig.native.js.map +1 -1
  82. package/dist/cjs/head/Head.native.js.map +1 -1
  83. package/dist/cjs/head/HeadModule.native.js.map +1 -1
  84. package/dist/cjs/head/index.native.js.map +1 -1
  85. package/dist/cjs/head/types.native.js.map +1 -1
  86. package/dist/cjs/head/url.native.js.map +1 -1
  87. package/dist/cjs/headless-server.native.js.map +1 -1
  88. package/dist/cjs/headless.cjs +1 -0
  89. package/dist/cjs/headless.native.js +1 -0
  90. package/dist/cjs/headless.native.js.map +1 -1
  91. package/dist/cjs/hooks.native.js.map +1 -1
  92. package/dist/cjs/hooks.test.native.js.map +1 -1
  93. package/dist/cjs/href.native.js.map +1 -1
  94. package/dist/cjs/image/getImageData.native.js.map +1 -1
  95. package/dist/cjs/image.native.js.map +1 -1
  96. package/dist/cjs/index.cjs +3 -0
  97. package/dist/cjs/index.native.js +4 -1
  98. package/dist/cjs/index.native.js.map +1 -1
  99. package/dist/cjs/interfaces/router.native.js.map +1 -1
  100. package/dist/cjs/layouts/Drawer.cjs +46 -1
  101. package/dist/cjs/layouts/Drawer.native.js +47 -1
  102. package/dist/cjs/layouts/Drawer.native.js.map +1 -1
  103. package/dist/cjs/layouts/NativeTabs.native.js.map +1 -1
  104. package/dist/cjs/layouts/Stack.cjs +12 -3
  105. package/dist/cjs/layouts/Stack.native.js +13 -4
  106. package/dist/cjs/layouts/Stack.native.js.map +1 -1
  107. package/dist/cjs/layouts/Tabs.cjs +42 -8
  108. package/dist/cjs/layouts/Tabs.native.js +43 -8
  109. package/dist/cjs/layouts/Tabs.native.js.map +1 -1
  110. package/dist/cjs/layouts/stack-navigator.cjs +29 -0
  111. package/dist/cjs/layouts/stack-navigator.native.js +32 -0
  112. package/dist/cjs/layouts/stack-navigator.native.js.map +1 -0
  113. package/dist/cjs/layouts/stack-utils/StackHeaderBackButton.native.js.map +1 -1
  114. package/dist/cjs/layouts/stack-utils/StackHeaderComponent.native.js.map +1 -1
  115. package/dist/cjs/layouts/stack-utils/StackHeaderLeft.native.js.map +1 -1
  116. package/dist/cjs/layouts/stack-utils/StackHeaderRight.native.js.map +1 -1
  117. package/dist/cjs/layouts/stack-utils/StackHeaderSearchBar.native.js.map +1 -1
  118. package/dist/cjs/layouts/stack-utils/StackHeaderTitle.native.js.map +1 -1
  119. package/dist/cjs/layouts/stack-utils/StackScreen.native.js.map +1 -1
  120. package/dist/cjs/layouts/stack-utils/__tests__/composition.test.native.js.map +1 -1
  121. package/dist/cjs/layouts/stack-utils/index.native.js.map +1 -1
  122. package/dist/cjs/layouts/withLayoutContext.native.js.map +1 -1
  123. package/dist/cjs/lazyWithRetry.native.js.map +1 -1
  124. package/dist/cjs/link/Link.native.js.map +1 -1
  125. package/dist/cjs/link/Redirect.native.js.map +1 -1
  126. package/dist/cjs/link/getLinking.native.js.map +1 -1
  127. package/dist/cjs/link/href.native.js.map +1 -1
  128. package/dist/cjs/link/path.native.js.map +1 -1
  129. package/dist/cjs/link/prefetchIntent.native.js.map +1 -1
  130. package/dist/cjs/link/prefetchIntent.test.native.js.map +1 -1
  131. package/dist/cjs/link/prefetchViewport.native.js.map +1 -1
  132. package/dist/cjs/link/prefetchViewport.test.native.js.map +1 -1
  133. package/dist/cjs/link/useLinkTo.native.js.map +1 -1
  134. package/dist/cjs/link/useLoadedNavigation.native.js.map +1 -1
  135. package/dist/cjs/metro-config/buildOneMetroResolverOverrides.native.js.map +1 -1
  136. package/dist/cjs/metro-config/getViteMetroPluginOptions.integration.test.native.js.map +1 -1
  137. package/dist/cjs/metro-config/getViteMetroPluginOptions.native.js +1 -1
  138. package/dist/cjs/metro-config/getViteMetroPluginOptions.native.js.map +1 -1
  139. package/dist/cjs/metro-config/withOne.native.js.map +1 -1
  140. package/dist/cjs/metro-config/withOne.test.native.js.map +1 -1
  141. package/dist/cjs/native-tabs.native.js.map +1 -1
  142. package/dist/cjs/notFoundState.native.js.map +1 -1
  143. package/dist/cjs/polyfills-mobile.native.js.map +1 -1
  144. package/dist/cjs/polyfills-server.native.js.map +1 -1
  145. package/dist/cjs/router/FlagsContext.native.js.map +1 -1
  146. package/dist/cjs/router/Route.native.js.map +1 -1
  147. package/dist/cjs/router/RouteInfoContext.native.js.map +1 -1
  148. package/dist/cjs/router/RouterStore.native.js.map +1 -1
  149. package/dist/cjs/router/SpaShellContext.native.js.map +1 -1
  150. package/dist/cjs/router/createRoute.native.js.map +1 -1
  151. package/dist/cjs/router/filterRootHTML.native.js.map +1 -1
  152. package/dist/cjs/router/findRouteNode.native.js.map +1 -1
  153. package/dist/cjs/router/getLinkingConfig.native.js.map +1 -1
  154. package/dist/cjs/router/getLinkingConfig.test.native.js.map +1 -1
  155. package/dist/cjs/router/getNormalizedStatePath.native.js.map +1 -1
  156. package/dist/cjs/router/getRouteInfo.native.js.map +1 -1
  157. package/dist/cjs/router/getRoutes.native.js.map +1 -1
  158. package/dist/cjs/router/getRoutes.test.native.js.map +1 -1
  159. package/dist/cjs/router/glob-patterns.native.js.map +1 -1
  160. package/dist/cjs/router/imperative-api.native.js.map +1 -1
  161. package/dist/cjs/router/interceptRoutes.native.js.map +1 -1
  162. package/dist/cjs/router/isIndexPath.native.js.map +1 -1
  163. package/dist/cjs/router/lastAction.native.js.map +1 -1
  164. package/dist/cjs/router/linkingConfig.native.js.map +1 -1
  165. package/dist/cjs/router/matchers.native.js.map +1 -1
  166. package/dist/cjs/router/matchers.test.native.js.map +1 -1
  167. package/dist/cjs/router/params.native.js.map +1 -1
  168. package/dist/cjs/router/renderingRegistry.cjs +53 -0
  169. package/dist/cjs/router/renderingRegistry.native.js +56 -0
  170. package/dist/cjs/router/renderingRegistry.native.js.map +1 -0
  171. package/dist/cjs/router/router.cjs +2 -0
  172. package/dist/cjs/router/router.native.js.map +1 -1
  173. package/dist/cjs/router/serverLocationContext.native.js.map +1 -1
  174. package/dist/cjs/router/sitemap.native.js.map +1 -1
  175. package/dist/cjs/router/sitemap.test.native.js.map +1 -1
  176. package/dist/cjs/router/sortRoutes.native.js.map +1 -1
  177. package/dist/cjs/router/useInitializeOneRouter.native.js.map +1 -1
  178. package/dist/cjs/router/useNavigation.native.js.map +1 -1
  179. package/dist/cjs/router/useScreens.native.js.map +1 -1
  180. package/dist/cjs/router/useViteRoutes.native.js.map +1 -1
  181. package/dist/cjs/router/utils/getNavigateAction.native.js.map +1 -1
  182. package/dist/cjs/router/utils/getNavigateAction.test.native.js.map +1 -1
  183. package/dist/cjs/router/web/ScreenRenderContext.cjs +36 -0
  184. package/dist/cjs/router/web/ScreenRenderContext.native.js +38 -0
  185. package/dist/cjs/router/web/ScreenRenderContext.native.js.map +1 -0
  186. package/dist/cjs/router/web/WebStackNavigator.cjs +74 -0
  187. package/dist/cjs/router/web/WebStackNavigator.native.js +78 -0
  188. package/dist/cjs/router/web/WebStackNavigator.native.js.map +1 -0
  189. package/dist/cjs/router/web/WebStackView.cjs +182 -0
  190. package/dist/cjs/router/web/WebStackView.native.js +235 -0
  191. package/dist/cjs/router/web/WebStackView.native.js.map +1 -0
  192. package/dist/cjs/router/web/__tests__/WebStackView.runtime.test.cjs +295 -0
  193. package/dist/cjs/router/web/__tests__/WebStackView.runtime.test.native.js +335 -0
  194. package/dist/cjs/router/web/__tests__/WebStackView.runtime.test.native.js.map +1 -0
  195. package/dist/cjs/router/web/__tests__/WebStackView.test.cjs +464 -0
  196. package/dist/cjs/router/web/__tests__/WebStackView.test.native.js +515 -0
  197. package/dist/cjs/router/web/__tests__/WebStackView.test.native.js.map +1 -0
  198. package/dist/cjs/router/web/__tests__/stackStateUtils.test.cjs +134 -0
  199. package/dist/cjs/router/web/__tests__/stackStateUtils.test.native.js +163 -0
  200. package/dist/cjs/router/web/__tests__/stackStateUtils.test.native.js.map +1 -0
  201. package/dist/cjs/router/web/stackStateUtils.cjs +60 -0
  202. package/dist/cjs/router/web/stackStateUtils.native.js +66 -0
  203. package/dist/cjs/router/web/stackStateUtils.native.js.map +1 -0
  204. package/dist/cjs/screensFeatureFlags.native.js.map +1 -1
  205. package/dist/cjs/serve-worker.native.js.map +1 -1
  206. package/dist/cjs/serve.native.js.map +1 -1
  207. package/dist/cjs/server/ServerContextScript.cjs +2 -1
  208. package/dist/cjs/server/ServerContextScript.native.js +2 -1
  209. package/dist/cjs/server/ServerContextScript.native.js.map +1 -1
  210. package/dist/cjs/server/createRoutesManifest.native.js.map +1 -1
  211. package/dist/cjs/server/getServerManifest.native.js.map +1 -1
  212. package/dist/cjs/server/getServerManifest.test.native.js.map +1 -1
  213. package/dist/cjs/server/oneServe.native.js.map +1 -1
  214. package/dist/cjs/server/setServerGlobals.native.js.map +1 -1
  215. package/dist/cjs/server/setupBuildOptions.native.js.map +1 -1
  216. package/dist/cjs/server/setupServerGlobals.native.js.map +1 -1
  217. package/dist/cjs/server/ssrLoaderData.native.js.map +1 -1
  218. package/dist/cjs/server/staticHtmlFetcher.native.js.map +1 -1
  219. package/dist/cjs/server/workerHandler.native.js.map +1 -1
  220. package/dist/cjs/server-render.native.js.map +1 -1
  221. package/dist/cjs/skewProtection.native.js.map +1 -1
  222. package/dist/cjs/testing-utils.native.js.map +1 -1
  223. package/dist/cjs/typed-routes/generateRouteTypes.native.js.map +1 -1
  224. package/dist/cjs/typed-routes/generateRouteTypes.test.native.js.map +1 -1
  225. package/dist/cjs/typed-routes/getTypedRoutesDeclarationFile.native.js.map +1 -1
  226. package/dist/cjs/typed-routes/getTypedRoutesDeclarationFile.test.native.js.map +1 -1
  227. package/dist/cjs/typed-routes/injectRouteHelpers.native.js.map +1 -1
  228. package/dist/cjs/types.native.js.map +1 -1
  229. package/dist/cjs/ui/Slot.native.js.map +1 -1
  230. package/dist/cjs/ui/TabContext.native.js.map +1 -1
  231. package/dist/cjs/ui/TabList.native.js.map +1 -1
  232. package/dist/cjs/ui/TabRouter.native.js.map +1 -1
  233. package/dist/cjs/ui/TabSlot.native.js.map +1 -1
  234. package/dist/cjs/ui/TabTrigger.native.js.map +1 -1
  235. package/dist/cjs/ui/Tabs.native.js.map +1 -1
  236. package/dist/cjs/ui/common.native.js.map +1 -1
  237. package/dist/cjs/ui/index.native.js.map +1 -1
  238. package/dist/cjs/ui/useComponent.native.js.map +1 -1
  239. package/dist/cjs/useFocusEffect.native.js.map +1 -1
  240. package/dist/cjs/useLoader.native.js.map +1 -1
  241. package/dist/cjs/useMatches.native.js.map +1 -1
  242. package/dist/cjs/useMatches.test.native.js.map +1 -1
  243. package/dist/cjs/useServerHeadInsertion.native.js.map +1 -1
  244. package/dist/cjs/utils/assertIsReady.native.js.map +1 -1
  245. package/dist/cjs/utils/buildOutputPointer.native.js.map +1 -1
  246. package/dist/cjs/utils/buildOutputPointer.test.native.js.map +1 -1
  247. package/dist/cjs/utils/children.native.js.map +1 -1
  248. package/dist/cjs/utils/cleanUrl.native.js.map +1 -1
  249. package/dist/cjs/utils/cleanUrl.test.native.js.map +1 -1
  250. package/dist/cjs/utils/dynamicImport.native.js.map +1 -1
  251. package/dist/cjs/utils/dynamicImport.test.native.js.map +1 -1
  252. package/dist/cjs/utils/ensureExists.native.js.map +1 -1
  253. package/dist/cjs/utils/evictOldest.native.js.map +1 -1
  254. package/dist/cjs/utils/existsAsync.native.js.map +1 -1
  255. package/dist/cjs/utils/findRootLayout.native.js.map +1 -1
  256. package/dist/cjs/utils/getPageExport.native.js.map +1 -1
  257. package/dist/cjs/utils/getPathnameFromFilePath.native.js.map +1 -1
  258. package/dist/cjs/utils/getPathnameFromFilePath.test.native.js.map +1 -1
  259. package/dist/cjs/utils/getRouterRootFromOneOptions.native.js.map +1 -1
  260. package/dist/cjs/utils/globDir.native.js.map +1 -1
  261. package/dist/cjs/utils/hashString.native.js.map +1 -1
  262. package/dist/cjs/utils/htmlEscape.native.js.map +1 -1
  263. package/dist/cjs/utils/isResponse.native.js.map +1 -1
  264. package/dist/cjs/utils/isRolldown.native.js.map +1 -1
  265. package/dist/cjs/utils/isStatus.native.js.map +1 -1
  266. package/dist/cjs/utils/pLimit.native.js.map +1 -1
  267. package/dist/cjs/utils/posixPathContract.test.native.js.map +1 -1
  268. package/dist/cjs/utils/promiseWithResolvers.native.js.map +1 -1
  269. package/dist/cjs/utils/rand.native.js.map +1 -1
  270. package/dist/cjs/utils/redirect.native.js.map +1 -1
  271. package/dist/cjs/utils/removeParams.native.js.map +1 -1
  272. package/dist/cjs/utils/removeSearch.native.js.map +1 -1
  273. package/dist/cjs/utils/removeUndefined.native.js.map +1 -1
  274. package/dist/cjs/utils/routeFileWatch.native.js.map +1 -1
  275. package/dist/cjs/utils/routeFileWatch.test.native.js.map +1 -1
  276. package/dist/cjs/utils/style.native.js.map +1 -1
  277. package/dist/cjs/utils/toAbsolute.native.js.map +1 -1
  278. package/dist/cjs/utils/toServerOutputPath.native.js.map +1 -1
  279. package/dist/cjs/utils/toServerOutputPath.test.native.js.map +1 -1
  280. package/dist/cjs/utils/trackLoaderDependencies.native.js.map +1 -1
  281. package/dist/cjs/utils/url.native.js.map +1 -1
  282. package/dist/cjs/utils/useConstant.native.js.map +1 -1
  283. package/dist/cjs/utils/watchFile.native.js.map +1 -1
  284. package/dist/cjs/utils/weakKey.native.js.map +1 -1
  285. package/dist/cjs/utils/weakMemo.native.js.map +1 -1
  286. package/dist/cjs/utils/withStaticProperties.native.js.map +1 -1
  287. package/dist/cjs/utils/workerImport.native.js.map +1 -1
  288. package/dist/cjs/validateParams.native.js.map +1 -1
  289. package/dist/cjs/validateSearch.native.js.map +1 -1
  290. package/dist/cjs/vercel/build/buildVercelOutputDirectory.native.js.map +1 -1
  291. package/dist/cjs/vercel/build/config/vc-build-output-config-base.native.js.map +1 -1
  292. package/dist/cjs/vercel/build/config/vc-config-base.native.js.map +1 -1
  293. package/dist/cjs/vercel/build/config/vc-package-base.native.js.map +1 -1
  294. package/dist/cjs/vercel/build/generate/createApiServerlessFunction.native.js.map +1 -1
  295. package/dist/cjs/vercel/build/generate/createSsrServerlessFunction.native.js.map +1 -1
  296. package/dist/cjs/vercel/build/getPathFromRoute.native.js.map +1 -1
  297. package/dist/cjs/views/EmptyRoute.native.js.map +1 -1
  298. package/dist/cjs/views/ErrorBoundary.native.js.map +1 -1
  299. package/dist/cjs/views/LoadProgressBar.native.js.map +1 -1
  300. package/dist/cjs/views/Navigator.native.js.map +1 -1
  301. package/dist/cjs/views/OneStackRouter.native.js.map +1 -1
  302. package/dist/cjs/views/Protected.native.js.map +1 -1
  303. package/dist/cjs/views/RootErrorBoundary.native.js.map +1 -1
  304. package/dist/cjs/views/Screen.native.js.map +1 -1
  305. package/dist/cjs/views/ScrollBehavior.native.js.map +1 -1
  306. package/dist/cjs/views/SourceInspector.native.js.map +1 -1
  307. package/dist/cjs/views/Try.native.js.map +1 -1
  308. package/dist/cjs/vite/DevHead.native.js.map +1 -1
  309. package/dist/cjs/vite/constants.native.js.map +1 -1
  310. package/dist/cjs/vite/customNodeExternals.native.js.map +1 -1
  311. package/dist/cjs/vite/ensureTsConfig.native.js.map +1 -1
  312. package/dist/cjs/vite/findDepsToOptimize.native.js.map +1 -1
  313. package/dist/cjs/vite/getManifest.native.js.map +1 -1
  314. package/dist/cjs/vite/getManifest.test.native.js.map +1 -1
  315. package/dist/cjs/vite/loadConfig.native.js.map +1 -1
  316. package/dist/cjs/vite/makePluginWebOnly.native.js.map +1 -1
  317. package/dist/cjs/vite/one-server-only.test.native.js.map +1 -1
  318. package/dist/cjs/vite/one.native.js.map +1 -1
  319. package/dist/cjs/vite/plugins/SSRCSSPlugin.native.js.map +1 -1
  320. package/dist/cjs/vite/plugins/clientTreeShakePlugin.native.js.map +1 -1
  321. package/dist/cjs/vite/plugins/clientTreeShakePlugin.test.native.js.map +1 -1
  322. package/dist/cjs/vite/plugins/criticalCSSPlugin.native.js.map +1 -1
  323. package/dist/cjs/vite/plugins/criticalCSSPlugin.test.native.js.map +1 -1
  324. package/dist/cjs/vite/plugins/devtoolsPlugin.native.js.map +1 -1
  325. package/dist/cjs/vite/plugins/environmentGuardPlugin.native.js.map +1 -1
  326. package/dist/cjs/vite/plugins/environmentGuardPlugin.test.native.js.map +1 -1
  327. package/dist/cjs/vite/plugins/fileSystemRouterPlugin.native.js.map +1 -1
  328. package/dist/cjs/vite/plugins/fileSystemRouterPlugin.test.native.js.map +1 -1
  329. package/dist/cjs/vite/plugins/fixDependenciesPlugin.native.js.map +1 -1
  330. package/dist/cjs/vite/plugins/generateFileSystemRouteTypesPlugin.native.js.map +1 -1
  331. package/dist/cjs/vite/plugins/imageDataPlugin.native.js.map +1 -1
  332. package/dist/cjs/vite/plugins/imageDataPlugin.test.native.js.map +1 -1
  333. package/dist/cjs/vite/plugins/removeReactNativeWebAnimatedPlugin.native.js.map +1 -1
  334. package/dist/cjs/vite/plugins/sourceInspectorPlugin.native.js.map +1 -1
  335. package/dist/cjs/vite/plugins/sourceInspectorPlugin.test.native.js.map +1 -1
  336. package/dist/cjs/vite/plugins/useDomPlugin.native.js.map +1 -1
  337. package/dist/cjs/vite/plugins/virtualEntryConstants.native.js.map +1 -1
  338. package/dist/cjs/vite/plugins/virtualEntryPlugin.native.js.map +1 -1
  339. package/dist/cjs/vite/plugins/virtualEntryPlugin.test.native.js.map +1 -1
  340. package/dist/cjs/vite/plugins/warmRoutesPlugin.native.js.map +1 -1
  341. package/dist/cjs/vite/replaceLoader.native.js.map +1 -1
  342. package/dist/cjs/vite/resolveResponse.native.js.map +1 -1
  343. package/dist/cjs/vite/types.native.js.map +1 -1
  344. package/dist/cjs/vite-auto-warm.native.js.map +1 -1
  345. package/dist/cjs/vite.native.js.map +1 -1
  346. package/dist/cjs/zero/getQueryKey.native.js.map +1 -1
  347. package/dist/cjs/zero/isZeroQuery.native.js.map +1 -1
  348. package/dist/cjs/zero/resolveQuery.native.js.map +1 -1
  349. package/dist/cjs/zero/subscribeToQuery.native.js.map +1 -1
  350. package/dist/cjs/zero/types.native.js.map +1 -1
  351. package/dist/cjs/zero/useQuery.native.js.map +1 -1
  352. package/dist/cjs/zero/useQueryZero.native.js.map +1 -1
  353. package/dist/cjs/zero.native.js.map +1 -1
  354. package/dist/esm/__mocks__/@react-navigation/native-stack.mjs +2 -1
  355. package/dist/esm/__mocks__/@react-navigation/native-stack.mjs.map +1 -1
  356. package/dist/esm/__mocks__/@react-navigation/native-stack.native.js +4 -1
  357. package/dist/esm/__mocks__/@react-navigation/native-stack.native.js.map +1 -1
  358. package/dist/esm/constants.test.mjs.map +1 -1
  359. package/dist/esm/constants.test.native.js.map +1 -1
  360. package/dist/esm/createHandleRequest.mjs +21 -12
  361. package/dist/esm/createHandleRequest.mjs.map +1 -1
  362. package/dist/esm/createHandleRequest.native.js +22 -12
  363. package/dist/esm/createHandleRequest.native.js.map +1 -1
  364. package/dist/esm/createHandleRequest.test.mjs +51 -6
  365. package/dist/esm/createHandleRequest.test.mjs.map +1 -1
  366. package/dist/esm/createHandleRequest.test.native.js +53 -6
  367. package/dist/esm/createHandleRequest.test.native.js.map +1 -1
  368. package/dist/esm/headless.mjs +1 -0
  369. package/dist/esm/headless.mjs.map +1 -1
  370. package/dist/esm/headless.native.js +1 -0
  371. package/dist/esm/headless.native.js.map +1 -1
  372. package/dist/esm/index.js +2 -1
  373. package/dist/esm/index.js.map +1 -1
  374. package/dist/esm/index.mjs +2 -1
  375. package/dist/esm/index.mjs.map +1 -1
  376. package/dist/esm/index.native.js +2 -1
  377. package/dist/esm/index.native.js.map +1 -1
  378. package/dist/esm/layouts/Drawer.mjs +35 -1
  379. package/dist/esm/layouts/Drawer.mjs.map +1 -1
  380. package/dist/esm/layouts/Drawer.native.js +36 -1
  381. package/dist/esm/layouts/Drawer.native.js.map +1 -1
  382. package/dist/esm/layouts/Stack.mjs +12 -3
  383. package/dist/esm/layouts/Stack.mjs.map +1 -1
  384. package/dist/esm/layouts/Stack.native.js +12 -3
  385. package/dist/esm/layouts/Stack.native.js.map +1 -1
  386. package/dist/esm/layouts/Tabs.mjs +31 -8
  387. package/dist/esm/layouts/Tabs.mjs.map +1 -1
  388. package/dist/esm/layouts/Tabs.native.js +32 -8
  389. package/dist/esm/layouts/Tabs.native.js.map +1 -1
  390. package/dist/esm/layouts/stack-navigator.mjs +4 -0
  391. package/dist/esm/layouts/stack-navigator.mjs.map +1 -0
  392. package/dist/esm/layouts/stack-navigator.native.js +4 -0
  393. package/dist/esm/layouts/stack-navigator.native.js.map +1 -0
  394. package/dist/esm/layouts/stack-utils/StackScreen.mjs.map +1 -1
  395. package/dist/esm/layouts/stack-utils/StackScreen.native.js.map +1 -1
  396. package/dist/esm/layouts/stack-utils/index.mjs.map +1 -1
  397. package/dist/esm/router/renderingRegistry.mjs +26 -0
  398. package/dist/esm/router/renderingRegistry.mjs.map +1 -0
  399. package/dist/esm/router/renderingRegistry.native.js +26 -0
  400. package/dist/esm/router/renderingRegistry.native.js.map +1 -0
  401. package/dist/esm/router/router.mjs +2 -0
  402. package/dist/esm/router/router.mjs.map +1 -1
  403. package/dist/esm/router/router.native.js.map +1 -1
  404. package/dist/esm/router/web/ScreenRenderContext.mjs +10 -0
  405. package/dist/esm/router/web/ScreenRenderContext.mjs.map +1 -0
  406. package/dist/esm/router/web/ScreenRenderContext.native.js +10 -0
  407. package/dist/esm/router/web/ScreenRenderContext.native.js.map +1 -0
  408. package/dist/esm/router/web/WebStackNavigator.mjs +49 -0
  409. package/dist/esm/router/web/WebStackNavigator.mjs.map +1 -0
  410. package/dist/esm/router/web/WebStackNavigator.native.js +51 -0
  411. package/dist/esm/router/web/WebStackNavigator.native.js.map +1 -0
  412. package/dist/esm/router/web/WebStackView.mjs +155 -0
  413. package/dist/esm/router/web/WebStackView.mjs.map +1 -0
  414. package/dist/esm/router/web/WebStackView.native.js +206 -0
  415. package/dist/esm/router/web/WebStackView.native.js.map +1 -0
  416. package/dist/esm/router/web/__tests__/WebStackView.runtime.test.mjs +272 -0
  417. package/dist/esm/router/web/__tests__/WebStackView.runtime.test.mjs.map +1 -0
  418. package/dist/esm/router/web/__tests__/WebStackView.runtime.test.native.js +309 -0
  419. package/dist/esm/router/web/__tests__/WebStackView.runtime.test.native.js.map +1 -0
  420. package/dist/esm/router/web/__tests__/WebStackView.test.mjs +465 -0
  421. package/dist/esm/router/web/__tests__/WebStackView.test.mjs.map +1 -0
  422. package/dist/esm/router/web/__tests__/WebStackView.test.native.js +513 -0
  423. package/dist/esm/router/web/__tests__/WebStackView.test.native.js.map +1 -0
  424. package/dist/esm/router/web/__tests__/stackStateUtils.test.mjs +135 -0
  425. package/dist/esm/router/web/__tests__/stackStateUtils.test.mjs.map +1 -0
  426. package/dist/esm/router/web/__tests__/stackStateUtils.test.native.js +161 -0
  427. package/dist/esm/router/web/__tests__/stackStateUtils.test.native.js.map +1 -0
  428. package/dist/esm/router/web/stackStateUtils.mjs +32 -0
  429. package/dist/esm/router/web/stackStateUtils.mjs.map +1 -0
  430. package/dist/esm/router/web/stackStateUtils.native.js +35 -0
  431. package/dist/esm/router/web/stackStateUtils.native.js.map +1 -0
  432. package/dist/esm/server/ServerContextScript.mjs +2 -1
  433. package/dist/esm/server/ServerContextScript.mjs.map +1 -1
  434. package/dist/esm/server/ServerContextScript.native.js +2 -1
  435. package/dist/esm/server/ServerContextScript.native.js.map +1 -1
  436. package/dist/esm/utils/dynamicImport.test.mjs.map +1 -1
  437. package/dist/esm/utils/dynamicImport.test.native.js.map +1 -1
  438. package/package.json +10 -9
  439. package/src/__mocks__/@react-navigation/native-stack.ts +22 -0
  440. package/src/constants.test.ts +12 -8
  441. package/src/createHandleRequest.test.ts +50 -6
  442. package/src/createHandleRequest.ts +26 -24
  443. package/src/headless.tsx +6 -0
  444. package/src/index.ts +20 -5
  445. package/src/layouts/Drawer.tsx +43 -1
  446. package/src/layouts/Stack.tsx +51 -33
  447. package/src/layouts/Tabs.tsx +89 -57
  448. package/src/layouts/stack-navigator.ts +9 -0
  449. package/src/layouts/stack-navigator.web.ts +3 -0
  450. package/src/layouts/stack-utils/StackScreen.tsx +30 -9
  451. package/src/layouts/stack-utils/index.tsx +1 -0
  452. package/src/router/renderingRegistry.ts +109 -0
  453. package/src/router/router.ts +33 -9
  454. package/src/router/web/ScreenRenderContext.tsx +61 -0
  455. package/src/router/web/WebStackNavigator.tsx +87 -0
  456. package/src/router/web/WebStackView.tsx +264 -0
  457. package/src/router/web/__tests__/WebStackView.runtime.test.tsx +309 -0
  458. package/src/router/web/__tests__/WebStackView.test.tsx +444 -0
  459. package/src/router/web/__tests__/stackStateUtils.test.ts +153 -0
  460. package/src/router/web/stackStateUtils.ts +89 -0
  461. package/src/server/ServerContextScript.tsx +8 -7
  462. package/src/utils/dynamicImport.test.ts +9 -7
  463. package/types/__mocks__/@react-navigation/native-stack.d.ts +9 -0
  464. package/types/__mocks__/@react-navigation/native-stack.d.ts.map +1 -1
  465. package/types/createHandleRequest.d.ts.map +1 -1
  466. package/types/headless.d.ts.map +1 -1
  467. package/types/index.d.ts +4 -2
  468. package/types/index.d.ts.map +1 -1
  469. package/types/layouts/Drawer.d.ts +13 -2
  470. package/types/layouts/Drawer.d.ts.map +1 -1
  471. package/types/layouts/Stack.d.ts +11 -1
  472. package/types/layouts/Stack.d.ts.map +1 -1
  473. package/types/layouts/Tabs.d.ts +14 -4
  474. package/types/layouts/Tabs.d.ts.map +1 -1
  475. package/types/layouts/stack-navigator.d.ts +9 -0
  476. package/types/layouts/stack-navigator.d.ts.map +1 -0
  477. package/types/layouts/stack-navigator.web.d.ts +2 -0
  478. package/types/layouts/stack-navigator.web.d.ts.map +1 -0
  479. package/types/layouts/stack-utils/StackScreen.d.ts +24 -2
  480. package/types/layouts/stack-utils/StackScreen.d.ts.map +1 -1
  481. package/types/layouts/stack-utils/index.d.ts +1 -1
  482. package/types/layouts/stack-utils/index.d.ts.map +1 -1
  483. package/types/router/renderingRegistry.d.ts +90 -0
  484. package/types/router/renderingRegistry.d.ts.map +1 -0
  485. package/types/router/router.d.ts.map +1 -1
  486. package/types/router/web/ScreenRenderContext.d.ts +46 -0
  487. package/types/router/web/ScreenRenderContext.d.ts.map +1 -0
  488. package/types/router/web/WebStackNavigator.d.ts +2 -0
  489. package/types/router/web/WebStackNavigator.d.ts.map +1 -0
  490. package/types/router/web/WebStackView.d.ts +42 -0
  491. package/types/router/web/WebStackView.d.ts.map +1 -0
  492. package/types/router/web/stackStateUtils.d.ts +35 -0
  493. package/types/router/web/stackStateUtils.d.ts.map +1 -0
  494. package/types/server/ServerContextScript.d.ts.map +1 -1
package/src/headless.tsx CHANGED
@@ -21,6 +21,12 @@ export type CreateHeadlessAppProps = {
21
21
  export function createApp(options: CreateHeadlessAppProps) {
22
22
  // always spa mode — render() checks this to use createRoot instead of hydrateRoot
23
23
  globalThis['__vxrnIsSPA'] = true
24
+ // headless mode has no dev server serving /_one/assets/*_vxrn_loader.js;
25
+ // routes (and their loader exports) are statically bundled and accessed
26
+ // through `options.routes`. doPreloadDev/doPreload short-circuit on this
27
+ // flag so they don't round-trip through an iframe-host URL that can return
28
+ // a spurious __oneError 404 for paths overlapping the host's route tree.
29
+ globalThis['__vxrnHeadless'] = true
24
30
 
25
31
  const setupComplete = options.getSetupPromise
26
32
  ? options.getSetupPromise()
package/src/index.ts CHANGED
@@ -94,7 +94,26 @@ export type {
94
94
  StackHeaderRightProps,
95
95
  StackHeaderSearchBarProps,
96
96
  StackScreenProps,
97
+ StackScreenOptions,
97
98
  } from './layouts/stack-utils'
99
+ // Stack render API (for custom web overlay rendering)
100
+ export type {
101
+ StackRender,
102
+ StackRenderProps,
103
+ StackRenderComponent,
104
+ } from './router/web/ScreenRenderContext'
105
+ // Tabs / Drawer render API + global setup
106
+ export {
107
+ setupRendering,
108
+ getRenderingConfig,
109
+ type RenderingConfig,
110
+ type TabsRender,
111
+ type TabsRenderProps,
112
+ type TabsRenderComponent,
113
+ type DrawerRender,
114
+ type DrawerRenderProps,
115
+ type DrawerRenderComponent,
116
+ } from './router/renderingRegistry'
98
117
  // utilities
99
118
  export { withLayoutContext } from './layouts/withLayoutContext'
100
119
  export { Link } from './link/Link'
@@ -162,11 +181,7 @@ export { watchFile } from './utils/watchFile'
162
181
  // resilient dynamic-import recovery: retry a transient chunk-fetch failure in
163
182
  // place (so it never poisons a React.lazy memo), then fall back to one's
164
183
  // debounced reload. lazyWithRetry is a drop-in for React.lazy.
165
- export {
166
- loadWithRetry,
167
- isChunkLoadError,
168
- handleSkewError,
169
- } from './utils/dynamicImport'
184
+ export { loadWithRetry, isChunkLoadError, handleSkewError } from './utils/dynamicImport'
170
185
  export { lazyWithRetry } from './lazyWithRetry'
171
186
  export { ErrorBoundary } from './views/ErrorBoundary'
172
187
  export type { ErrorBoundaryProps, ErrorRouteInfo } from './views/Try'
@@ -4,16 +4,58 @@ import {
4
4
  type DrawerNavigationOptions,
5
5
  } from '@react-navigation/drawer'
6
6
  import type { DrawerNavigationState, ParamListBase } from '@react-navigation/native'
7
+ import React, { useMemo, type ComponentProps } from 'react'
8
+ import { Platform } from 'react-native'
7
9
 
10
+ import { getRenderingConfig, type DrawerRender } from '../router/renderingRegistry'
8
11
  import { withLayoutContext } from './withLayoutContext'
9
12
 
10
13
  const DrawerNavigator = createDrawerNavigator().Navigator
11
14
 
12
- export const Drawer = withLayoutContext<
15
+ const RNDrawer = withLayoutContext<
13
16
  DrawerNavigationOptions,
14
17
  typeof DrawerNavigator,
15
18
  DrawerNavigationState<ParamListBase>,
16
19
  DrawerNavigationEventMap
17
20
  >(DrawerNavigator)
18
21
 
22
+ type DrawerExtraProps = {
23
+ /**
24
+ * Platform-keyed sidebar component. Replaces the default drawer content.
25
+ * Dispatches on `Platform.OS` - `render.ios` works on iOS, `render.web`
26
+ * on web, etc. Falls back to `setupRendering({ Drawer: { ... } })` global
27
+ * if no prop is set, then to the built-in drawer content.
28
+ */
29
+ render?: DrawerRender
30
+ }
31
+
32
+ const DrawerWithRender = React.forwardRef<
33
+ unknown,
34
+ ComponentProps<typeof RNDrawer> & DrawerExtraProps
35
+ >((props, ref) => {
36
+ const { render, drawerContent, ...rest } = props as any
37
+
38
+ // Resolution: prop drawerContent > prop render[platform] > setupRendering[platform] > default
39
+ const effectiveDrawerContent = useMemo(() => {
40
+ if (drawerContent) return drawerContent
41
+ const platform = Platform.OS as 'web' | 'ios' | 'android'
42
+ const fromProp = render?.[platform]
43
+ if (fromProp) return fromProp
44
+ const fromGlobal = getRenderingConfig().Drawer?.[platform]
45
+ if (fromGlobal) return fromGlobal
46
+ return undefined
47
+ }, [drawerContent, render])
48
+
49
+ if (effectiveDrawerContent) {
50
+ return <RNDrawer {...rest} ref={ref} drawerContent={effectiveDrawerContent} />
51
+ }
52
+ return <RNDrawer {...rest} ref={ref} />
53
+ })
54
+
55
+ // Preserve withLayoutContext's static Screen so user code like
56
+ // `<Drawer.Screen ... />` keeps working through the render wrapper.
57
+ export const Drawer = Object.assign(DrawerWithRender, {
58
+ Screen: RNDrawer.Screen,
59
+ })
60
+
19
61
  export default Drawer
@@ -1,6 +1,5 @@
1
1
  import type { ParamListBase, StackNavigationState } from '@react-navigation/native'
2
2
  import {
3
- createNativeStackNavigator,
4
3
  type NativeStackNavigationEventMap,
5
4
  type NativeStackNavigationOptions,
6
5
  } from '@react-navigation/native-stack'
@@ -18,8 +17,11 @@ import { withLayoutContext } from './withLayoutContext'
18
17
  import { isChildOfType } from '../utils/children'
19
18
  import { Protected } from '../views/Protected'
20
19
  import { Screen } from '../views/Screen'
20
+ import { createStackNavigator } from './stack-navigator'
21
+ import { StackRenderProvider, type StackRender } from '../router/web/ScreenRenderContext'
22
+ import { getRenderingConfig } from '../router/renderingRegistry'
21
23
 
22
- const NativeStackNavigator = createNativeStackNavigator().Navigator
24
+ const NativeStackNavigator = createStackNavigator().Navigator
23
25
 
24
26
  const RNStack = withLayoutContext<
25
27
  NativeStackNavigationOptions,
@@ -62,47 +64,63 @@ function mapChildren(children: React.ReactNode): React.ReactNode {
62
64
  .filter(Boolean)
63
65
  }
64
66
 
67
+ type StackExtraProps = {
68
+ /**
69
+ * Platform-keyed render component for overlay routes (modal / formSheet /
70
+ * pageSheet / transparentModal / fullScreenModal). v1 consumes `web` only;
71
+ * `ios` / `android` are reserved for future use. Per-route overrides go on
72
+ * `<Stack.Screen options={{ render }} />`.
73
+ */
74
+ render?: StackRender
75
+ }
76
+
65
77
  /**
66
78
  * Stack navigator with support for Header Composition API.
67
79
  * Wraps the base Stack to pre-process StackScreen children.
68
80
  */
69
- const StackWithComposition = React.forwardRef<unknown, ComponentProps<typeof RNStack>>(
70
- (props, ref) => {
71
- const { children, screenOptions, ...rest } = props
72
-
73
- // extract Stack.Header from children for screenOptions
74
- const screenOptionsWithHeader = useMemo(() => {
75
- const stackHeader = Children.toArray(children).find((child) =>
76
- isChildOfType(child, StackHeaderComponent)
77
- )
78
-
79
- if (stackHeader && isChildOfType(stackHeader, StackHeaderComponent)) {
80
- const headerProps: StackScreenProps = { children: stackHeader }
81
- if (screenOptions) {
82
- if (typeof screenOptions === 'function') {
83
- return (...args: Parameters<typeof screenOptions>) => {
84
- const opts = screenOptions(...args)
85
- return appendScreenStackPropsToOptions(opts, headerProps)
86
- }
81
+ const StackWithComposition = React.forwardRef<
82
+ unknown,
83
+ ComponentProps<typeof RNStack> & StackExtraProps
84
+ >((props, ref) => {
85
+ const { children, screenOptions, render, ...rest } = props
86
+
87
+ // extract Stack.Header from children for screenOptions
88
+ const screenOptionsWithHeader = useMemo(() => {
89
+ const stackHeader = Children.toArray(children).find((child) =>
90
+ isChildOfType(child, StackHeaderComponent)
91
+ )
92
+
93
+ if (stackHeader && isChildOfType(stackHeader, StackHeaderComponent)) {
94
+ const headerProps: StackScreenProps = { children: stackHeader }
95
+ if (screenOptions) {
96
+ if (typeof screenOptions === 'function') {
97
+ return (...args: Parameters<typeof screenOptions>) => {
98
+ const opts = screenOptions(...args)
99
+ return appendScreenStackPropsToOptions(opts, headerProps)
87
100
  }
88
- return appendScreenStackPropsToOptions(screenOptions, headerProps)
89
101
  }
90
- return appendScreenStackPropsToOptions({}, headerProps)
102
+ return appendScreenStackPropsToOptions(screenOptions, headerProps)
91
103
  }
104
+ return appendScreenStackPropsToOptions({}, headerProps)
105
+ }
92
106
 
93
- return screenOptions
94
- }, [children, screenOptions])
107
+ return screenOptions
108
+ }, [children, screenOptions])
95
109
 
96
- // pre-process children to convert StackScreen to Screen
97
- const processedChildren = useMemo(() => mapChildren(children), [children])
110
+ // pre-process children to convert StackScreen to Screen
111
+ const processedChildren = useMemo(() => mapChildren(children), [children])
98
112
 
99
- return (
100
- <RNStack {...rest} ref={ref} screenOptions={screenOptionsWithHeader}>
101
- {processedChildren}
102
- </RNStack>
103
- )
104
- }
105
- )
113
+ const navigator = (
114
+ <RNStack {...rest} ref={ref} screenOptions={screenOptionsWithHeader}>
115
+ {processedChildren}
116
+ </RNStack>
117
+ )
118
+
119
+ // Per-instance prop wins; otherwise fall back to setupRendering global.
120
+ const effectiveRender = render ?? getRenderingConfig().Stack
121
+ if (!effectiveRender) return navigator
122
+ return <StackRenderProvider value={effectiveRender}>{navigator}</StackRenderProvider>
123
+ })
106
124
 
107
125
  export const Stack = Object.assign(StackWithComposition, {
108
126
  Screen: StackScreen,
@@ -6,20 +6,21 @@ import {
6
6
  createBottomTabNavigator,
7
7
  } from '@react-navigation/bottom-tabs'
8
8
  import type { ParamListBase, TabNavigationState } from '@react-navigation/native'
9
+ import React, { useMemo, type ComponentProps } from 'react'
9
10
  import { Platform, Pressable } from 'react-native'
10
11
 
11
12
  import type { OneRouter } from '../interfaces/router'
12
13
  import { Link } from '../link/Link'
13
14
  import { Protected } from '../views/Protected'
15
+ import { getRenderingConfig, type TabsRender } from '../router/renderingRegistry'
14
16
  import { withLayoutContext } from './withLayoutContext'
15
17
 
16
- const TabBar = ({ state, ...restProps }: BottomTabBarProps) => {
18
+ const DefaultTabBar = ({ state, ...restProps }: BottomTabBarProps) => {
17
19
  /**
18
- * With React Navigation v7, spacial routes such as +not-found and _sitemap are being added to `state.routes`, but we don't want them to be shown in the tab bar.
20
+ * With React Navigation v7, special routes such as +not-found and _sitemap
21
+ * are being added to `state.routes`, but we don't want them to be shown in
22
+ * the tab bar.
19
23
  */
20
-
21
- // TODO due to adding onlyMatching, we can remove this now i think (need to make sure)
22
-
23
24
  const filteredRoutes = state.routes.filter(
24
25
  (r) => r.name !== '+not-found' && !r.name.startsWith('_sitemap')
25
26
  )
@@ -35,63 +36,94 @@ const TabBar = ({ state, ...restProps }: BottomTabBarProps) => {
35
36
  )
36
37
  }
37
38
 
38
- // This is the only way to access the navigator.
39
39
  const BottomTabNavigator = createBottomTabNavigator().Navigator
40
40
 
41
41
  type BottomTabNavigationOptionsWithHref = BottomTabNavigationOptions & {
42
42
  href?: OneRouter.Href | null
43
43
  }
44
44
 
45
- export const Tabs = Object.assign(
46
- withLayoutContext<
47
- BottomTabNavigationOptionsWithHref,
48
- typeof BottomTabNavigator,
49
- TabNavigationState<ParamListBase>,
50
- BottomTabNavigationEventMap
51
- >(
52
- BottomTabNavigator,
53
- (screens) => {
54
- // Support the `href` shortcut prop.
55
- return screens.map((screen) => {
56
- if (typeof screen.options !== 'function' && screen.options?.href !== undefined) {
57
- const { href, ...options } = screen.options
58
- if (options.tabBarButton) {
59
- throw new Error('Cannot use `href` and `tabBarButton` together.')
60
- }
61
- return {
62
- ...screen,
63
- options: {
64
- ...options,
65
- tabBarButton: (props) => {
66
- if (href == null) {
67
- return null
68
- }
69
- const children =
70
- Platform.OS === 'web' ? (
71
- props.children
72
- ) : (
73
- <Pressable>{props.children}</Pressable>
74
- )
75
- return (
76
- <Link
77
- {...(props as any)}
78
- style={[{ display: 'flex' }, props.style]}
79
- href={href}
80
- asChild={Platform.OS !== 'web'}
81
- // biome-ignore lint/correctness/noChildrenProp: children prop needed for asChild pattern
82
- children={children}
83
- />
84
- )
85
- },
86
- },
87
- }
88
- }
89
- return screen
90
- })
91
- },
92
- { props: { tabBar: TabBar } }
93
- ),
94
- { Protected }
95
- )
45
+ const RNTabs = withLayoutContext<
46
+ BottomTabNavigationOptionsWithHref,
47
+ typeof BottomTabNavigator,
48
+ TabNavigationState<ParamListBase>,
49
+ BottomTabNavigationEventMap
50
+ >(BottomTabNavigator, (screens) => {
51
+ // Support the `href` shortcut prop.
52
+ return screens.map((screen) => {
53
+ if (typeof screen.options !== 'function' && screen.options?.href !== undefined) {
54
+ const { href, ...options } = screen.options
55
+ if (options.tabBarButton) {
56
+ throw new Error('Cannot use `href` and `tabBarButton` together.')
57
+ }
58
+ return {
59
+ ...screen,
60
+ options: {
61
+ ...options,
62
+ tabBarButton: (props) => {
63
+ if (href == null) {
64
+ return null
65
+ }
66
+ const children =
67
+ Platform.OS === 'web' ? (
68
+ props.children
69
+ ) : (
70
+ <Pressable>{props.children}</Pressable>
71
+ )
72
+ return (
73
+ <Link
74
+ {...(props as any)}
75
+ style={[{ display: 'flex' }, props.style]}
76
+ href={href}
77
+ asChild={Platform.OS !== 'web'}
78
+ // biome-ignore lint/correctness/noChildrenProp: children prop needed for asChild pattern
79
+ children={children}
80
+ />
81
+ )
82
+ },
83
+ },
84
+ }
85
+ }
86
+ return screen
87
+ })
88
+ })
89
+
90
+ type TabsExtraProps = {
91
+ /**
92
+ * Platform-keyed tab bar component. Replaces the default bottom-tabs bar.
93
+ * v1 consumes `web` only; `ios` / `android` accepted for future use.
94
+ * Falls back to `setupRendering({ Tabs: { web } })` global registry if
95
+ * no prop is set, then to the built-in `BottomTabBar`.
96
+ */
97
+ render?: TabsRender
98
+ }
99
+
100
+ const TabsWithRender = React.forwardRef<
101
+ unknown,
102
+ ComponentProps<typeof RNTabs> & TabsExtraProps
103
+ >((props, ref) => {
104
+ const { render, tabBar, ...rest } = props as any
105
+
106
+ // Resolution: prop tabBar > prop render[platform] > setupRendering[platform] > default.
107
+ // Tabs runs on web AND native so we dispatch on Platform.OS - unlike Stack,
108
+ // where the web navigator only consumes the `web` slot.
109
+ const effectiveTabBar = useMemo(() => {
110
+ if (tabBar) return tabBar
111
+ const platform = Platform.OS as 'web' | 'ios' | 'android'
112
+ const fromProp = render?.[platform]
113
+ if (fromProp) return fromProp
114
+ const fromGlobal = getRenderingConfig().Tabs?.[platform]
115
+ if (fromGlobal) return fromGlobal
116
+ return DefaultTabBar
117
+ }, [tabBar, render])
118
+
119
+ return <RNTabs {...rest} ref={ref} tabBar={effectiveTabBar} />
120
+ })
121
+
122
+ export const Tabs = Object.assign(TabsWithRender, {
123
+ Protected,
124
+ // Preserve withLayoutContext's static Screen so user code like
125
+ // `<Tabs.Screen ... />` keeps working through the render wrapper.
126
+ Screen: RNTabs.Screen,
127
+ })
96
128
 
97
129
  export default Tabs
@@ -0,0 +1,9 @@
1
+ import { createNativeStackNavigator } from '@react-navigation/native-stack'
2
+
3
+ /**
4
+ * Returns a Stack navigator factory. On native this is the stock
5
+ * `@react-navigation/native-stack`; on web this is replaced via the
6
+ * `.web.ts` sibling with a custom navigator that supports the `render`
7
+ * prop for overlay presentations.
8
+ */
9
+ export const createStackNavigator = createNativeStackNavigator
@@ -0,0 +1,3 @@
1
+ import { createWebStackNavigator } from '../router/web/WebStackNavigator'
2
+
3
+ export const createStackNavigator = createWebStackNavigator
@@ -9,10 +9,34 @@ import {
9
9
  type StackHeaderProps,
10
10
  } from './StackHeaderComponent'
11
11
  import { Screen } from '../../views/Screen'
12
+ import type { StackRender } from '../../router/web/ScreenRenderContext'
13
+
14
+ export type StackScreenOptions = NativeStackNavigationOptions & {
15
+ /**
16
+ * Per-route override of the Stack-level `render` prop. Same platform-keyed
17
+ * shape (`{ web?, ios?, android? }`); v1 consumes `web` only. When set, it
18
+ * takes precedence over the Stack-level render for this route.
19
+ */
20
+ render?: StackRender
21
+
22
+ /**
23
+ * Web-only. When `true`, the route's React subtree stays mounted across
24
+ * dismissal and re-navigation - `useState`, `useId`, `useReducer`, refs,
25
+ * and anything stored in the route component all survive. The render
26
+ * component receives `open: false` while the route is "closed".
27
+ *
28
+ * Caveat: route params are captured at first mount. If the same route is
29
+ * navigated to with different params later, the captured subtree keeps
30
+ * the original params. Best for stable, parameter-free overlays
31
+ * (settings, persistent filters, command palettes). For routes with
32
+ * dynamic params, leave `keepMounted` off.
33
+ */
34
+ keepMounted?: boolean
35
+ }
12
36
 
13
37
  export interface StackScreenProps extends PropsWithChildren {
14
38
  name?: string
15
- options?: NativeStackNavigationOptions
39
+ options?: StackScreenOptions
16
40
  }
17
41
 
18
42
  /**
@@ -36,7 +60,7 @@ export function StackScreen({ children, options, ...rest }: StackScreenProps) {
36
60
  }),
37
61
  [options, children]
38
62
  )
39
- return <Screen {...rest} options={updatedOptions} />
63
+ return <Screen {...rest} options={updatedOptions as NativeStackNavigationOptions} />
40
64
  }
41
65
 
42
66
  const VALID_PRESENTATIONS = [
@@ -85,17 +109,14 @@ export function validateStackPresentation(
85
109
  }
86
110
 
87
111
  export function appendScreenStackPropsToOptions(
88
- options: NativeStackNavigationOptions,
112
+ options: StackScreenOptions,
89
113
  props: StackScreenProps
90
- ): NativeStackNavigationOptions {
91
- let updatedOptions = { ...options, ...props.options }
114
+ ): StackScreenOptions {
115
+ let updatedOptions: StackScreenOptions = { ...options, ...props.options }
92
116
 
93
117
  validateStackPresentation(updatedOptions)
94
118
 
95
- function appendChildOptions(
96
- child: React.ReactElement,
97
- options: NativeStackNavigationOptions
98
- ) {
119
+ function appendChildOptions(child: React.ReactElement, options: StackScreenOptions) {
99
120
  if (child.type === StackHeaderComponent) {
100
121
  return appendStackHeaderPropsToOptions(options, child.props as StackHeaderProps)
101
122
  } else {
@@ -43,4 +43,5 @@ export {
43
43
  appendScreenStackPropsToOptions,
44
44
  validateStackPresentation,
45
45
  type StackScreenProps,
46
+ type StackScreenOptions,
46
47
  } from './StackScreen'
@@ -0,0 +1,109 @@
1
+ import type { ComponentType } from 'react'
2
+
3
+ import type { StackRender, StackRenderProps } from './web/ScreenRenderContext'
4
+
5
+ /**
6
+ * Tab bar render component receives bottom-tabs' standard tabBar props plus
7
+ * the children prop is omitted (tab bar replaces only the bar UI, not the
8
+ * screens). The actual prop type from `@react-navigation/bottom-tabs` is
9
+ * `BottomTabBarProps`; we re-export a structural-compatible type so the
10
+ * registry can be typed without a hard dep on bottom-tabs.
11
+ */
12
+ export type TabsRenderProps = {
13
+ state: any
14
+ navigation: any
15
+ descriptors: any
16
+ insets: { top: number; right: number; bottom: number; left: number }
17
+ }
18
+
19
+ export type TabsRenderComponent = ComponentType<TabsRenderProps>
20
+
21
+ export type TabsRender = {
22
+ web?: TabsRenderComponent
23
+ ios?: TabsRenderComponent
24
+ android?: TabsRenderComponent
25
+ }
26
+
27
+ /**
28
+ * Drawer sidebar render component. Receives the standard
29
+ * `DrawerContentComponentProps` from `@react-navigation/drawer`. Replaces
30
+ * the drawer's sidebar content (the list of items / nav UI) but not the
31
+ * drawer chrome itself (overlay, gestures, animation).
32
+ */
33
+ export type DrawerRenderProps = {
34
+ state: any
35
+ navigation: any
36
+ descriptors: any
37
+ }
38
+
39
+ export type DrawerRenderComponent = ComponentType<DrawerRenderProps>
40
+
41
+ export type DrawerRender = {
42
+ web?: DrawerRenderComponent
43
+ ios?: DrawerRenderComponent
44
+ android?: DrawerRenderComponent
45
+ }
46
+
47
+ /**
48
+ * Global render configuration. Populated by `setupRendering()`, typically
49
+ * called from One's setup file. Each navigator (Stack, Tabs) reads from
50
+ * this registry as a fallback when no per-instance `render` prop is set.
51
+ *
52
+ * Per-instance render prop > per-route options.render > setupRendering global.
53
+ */
54
+ export type RenderingConfig = {
55
+ Stack?: StackRender
56
+ Tabs?: TabsRender
57
+ Drawer?: DrawerRender
58
+ }
59
+
60
+ let renderingConfig: RenderingConfig = {}
61
+
62
+ /**
63
+ * Register default render components for One's navigators. Call from your
64
+ * setup file before the app renders. Settings are global - every `<Stack>`
65
+ * and `<Tabs>` instance picks them up unless overridden via prop or
66
+ * per-route options.
67
+ *
68
+ * @example
69
+ * ```ts
70
+ * // app/setup.ts
71
+ * import { setupRendering } from 'one'
72
+ * import { Sheet } from 'tamagui'
73
+ *
74
+ * setupRendering({
75
+ * Stack: {
76
+ * web: ({ children, open, dismiss, sheetAllowedDetents }) => (
77
+ * <Sheet modal open={open} onOpenChange={(o) => !o && dismiss()}
78
+ * snapPoints={sheetAllowedDetents}>
79
+ * <Sheet.Overlay />
80
+ * <Sheet.Frame>{children}</Sheet.Frame>
81
+ * </Sheet>
82
+ * ),
83
+ * },
84
+ * Tabs: { web: MyCustomTabBar },
85
+ * })
86
+ * ```
87
+ */
88
+ export function setupRendering(config: RenderingConfig): void {
89
+ renderingConfig = {
90
+ ...renderingConfig,
91
+ Stack: { ...renderingConfig.Stack, ...config.Stack },
92
+ Tabs: { ...renderingConfig.Tabs, ...config.Tabs },
93
+ Drawer: { ...renderingConfig.Drawer, ...config.Drawer },
94
+ }
95
+ }
96
+
97
+ export function getRenderingConfig(): RenderingConfig {
98
+ return renderingConfig
99
+ }
100
+
101
+ /**
102
+ * For tests - clears the global registry.
103
+ * @internal
104
+ */
105
+ export function resetRenderingConfig(): void {
106
+ renderingConfig = {}
107
+ }
108
+
109
+ export type { StackRender, StackRenderProps }
@@ -728,6 +728,17 @@ async function doPreloadDev(href: string): Promise<any> {
728
728
  const startTime = performance.now()
729
729
  const normalizedPath = normalizeLoaderPath(href)
730
730
 
731
+ // one/headless ships with routes statically bundled (createApp's `routes`
732
+ // option). there's no dev server to fetch /_one/assets/*_vxrn_loader.js
733
+ // from — when the iframe is same-origin with a real one app, that fetch
734
+ // resolves against the host's routes and can spuriously return an
735
+ // __oneError 404 marker for paths the host considers a 404 (e.g. /docs/*
736
+ // when the host has its own /docs route without that slug). bail before
737
+ // the fetch so linkTo doesn't misread the host's response as our 404.
738
+ if (globalThis['__vxrnHeadless']) {
739
+ return null
740
+ }
741
+
731
742
  try {
732
743
  const loaderJSUrl = getLoaderPath(href, true)
733
744
 
@@ -786,6 +797,11 @@ async function doPreloadDev(href: string): Promise<any> {
786
797
  }
787
798
 
788
799
  async function doPreload(href: string) {
800
+ // see doPreloadDev — same rationale.
801
+ if (globalThis['__vxrnHeadless']) {
802
+ return null
803
+ }
804
+
789
805
  const preloadPath = getPreloadPath(href)
790
806
  const loaderPath = getLoaderPath(href)
791
807
  const cssPreloadPath = getPreloadCSSPath(href)
@@ -931,20 +947,28 @@ export function preloadRoute(href: string, injectCSS = false): Promise<any> | un
931
947
  // normalize the path to match what useLoader uses for cache keys
932
948
  const normalizedHref = normalizeLoaderPath(href)
933
949
  if (!preloadingLoader[normalizedHref]) {
934
- setBoundedPreloadRecord(preloadingLoader, normalizedHref, doPreloadDev(href).then((data) => {
935
- setBoundedPreloadRecord(preloadedLoaderData, normalizedHref, data)
936
- return data
937
- }))
950
+ setBoundedPreloadRecord(
951
+ preloadingLoader,
952
+ normalizedHref,
953
+ doPreloadDev(href).then((data) => {
954
+ setBoundedPreloadRecord(preloadedLoaderData, normalizedHref, data)
955
+ return data
956
+ })
957
+ )
938
958
  }
939
959
  return preloadingLoader[normalizedHref]
940
960
  }
941
961
 
942
962
  if (!preloadingLoader[href]) {
943
- setBoundedPreloadRecord(preloadingLoader, href, doPreload(href).then((data) => {
944
- // Store the resolved data for synchronous access
945
- setBoundedPreloadRecord(preloadedLoaderData, href, data)
946
- return data
947
- }))
963
+ setBoundedPreloadRecord(
964
+ preloadingLoader,
965
+ href,
966
+ doPreload(href).then((data) => {
967
+ // Store the resolved data for synchronous access
968
+ setBoundedPreloadRecord(preloadedLoaderData, href, data)
969
+ return data
970
+ })
971
+ )
948
972
  }
949
973
 
950
974
  if (injectCSS) {