one 1.21.13 → 1.23.0

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 (750) hide show
  1. package/dist/cjs/Root.cjs +2 -2
  2. package/dist/cjs/Root.native.js +2 -2
  3. package/dist/cjs/Root.native.js.map +1 -1
  4. package/dist/cjs/cli/build.cjs +9 -17
  5. package/dist/cjs/cli/build.native.js +8 -16
  6. package/dist/cjs/cli/build.native.js.map +1 -1
  7. package/dist/cjs/cli.native.js.map +1 -1
  8. package/dist/cjs/clientLoaderResolver.native.js.map +1 -1
  9. package/dist/cjs/config.native.js.map +1 -1
  10. package/dist/cjs/constants.native.js.map +1 -1
  11. package/dist/cjs/constants.test.native.js.map +1 -1
  12. package/dist/cjs/createAPIRoute.native.js.map +1 -1
  13. package/dist/cjs/createApp.cjs +12 -35
  14. package/dist/cjs/createHandleRequest.cjs +4 -2
  15. package/dist/cjs/createHandleRequest.native.js +4 -2
  16. package/dist/cjs/createHandleRequest.native.js.map +1 -1
  17. package/dist/cjs/fallbackViews/Sitemap.cjs +123 -55
  18. package/dist/cjs/fallbackViews/Sitemap.native.js.map +1 -1
  19. package/dist/cjs/fallbackViews/Unmatched.cjs +92 -37
  20. package/dist/cjs/fallbackViews/Unmatched.native.js.map +1 -1
  21. package/dist/cjs/fork/NavigationContainer.cjs +6 -28
  22. package/dist/cjs/fork/NavigationContainer.native.js +5 -27
  23. package/dist/cjs/fork/NavigationContainer.native.js.map +1 -1
  24. package/dist/cjs/{router/renderingRegistry.cjs → fork/localeDirection.cjs} +6 -29
  25. package/dist/cjs/{router/web/ScreenRenderContext.cjs → fork/localeDirection.native.js} +10 -12
  26. package/dist/cjs/fork/localeDirection.native.js.map +1 -0
  27. package/dist/cjs/fork/theme.cjs +71 -0
  28. package/dist/cjs/{router/renderingRegistry.native.js → fork/theme.native.js} +7 -31
  29. package/dist/cjs/fork/theme.native.js.map +1 -0
  30. package/dist/cjs/headless/Presentations.cjs +51 -0
  31. package/dist/cjs/headless/Presentations.native.js +56 -0
  32. package/dist/cjs/headless/Presentations.native.js.map +1 -0
  33. package/dist/cjs/headless/children.cjs +43 -0
  34. package/dist/cjs/headless/children.native.js +46 -0
  35. package/dist/cjs/headless/children.native.js.map +1 -0
  36. package/dist/cjs/headless/devHeadlessNote.cjs +34 -0
  37. package/dist/cjs/{router/web/ScreenRenderContext.native.js → headless/devHeadlessNote.native.js} +11 -12
  38. package/dist/cjs/headless/devHeadlessNote.native.js.map +1 -0
  39. package/dist/cjs/headless/keepMounted.cjs +58 -0
  40. package/dist/cjs/headless/keepMounted.native.js +64 -0
  41. package/dist/cjs/headless/keepMounted.native.js.map +1 -0
  42. package/dist/cjs/headless/types.cjs +18 -0
  43. package/dist/cjs/headless/types.native.js +21 -0
  44. package/dist/cjs/headless/types.native.js.map +1 -0
  45. package/dist/cjs/headless/useDrawer.cjs +83 -0
  46. package/dist/cjs/headless/useDrawer.native.js +95 -0
  47. package/dist/cjs/headless/useDrawer.native.js.map +1 -0
  48. package/dist/cjs/headless/useStack.cjs +75 -0
  49. package/dist/cjs/headless/useStack.native.js +79 -0
  50. package/dist/cjs/headless/useStack.native.js.map +1 -0
  51. package/dist/cjs/headless/useTabs.cjs +62 -0
  52. package/dist/cjs/headless/useTabs.native.js +65 -0
  53. package/dist/cjs/headless/useTabs.native.js.map +1 -0
  54. package/dist/cjs/index.cjs +8 -3
  55. package/dist/cjs/index.native.js +8 -3
  56. package/dist/cjs/index.native.js.map +1 -1
  57. package/dist/cjs/layouts/Drawer.cjs +71 -42
  58. package/dist/cjs/layouts/Drawer.native.js +1 -25
  59. package/dist/cjs/layouts/Drawer.native.js.map +1 -1
  60. package/dist/cjs/layouts/Stack.cjs +9 -13
  61. package/dist/cjs/layouts/Stack.native.js +11 -13
  62. package/dist/cjs/layouts/Stack.native.js.map +1 -1
  63. package/dist/cjs/layouts/Tabs.cjs +104 -88
  64. package/dist/cjs/layouts/Tabs.native.js +1 -13
  65. package/dist/cjs/layouts/Tabs.native.js.map +1 -1
  66. package/dist/cjs/layouts/stack-navigator.cjs +10 -2
  67. package/dist/cjs/layouts/stack-navigator.native.js +5 -1
  68. package/dist/cjs/layouts/stack-navigator.native.js.map +1 -1
  69. package/dist/cjs/layouts/stack-utils/StackHeaderBackButton.cjs +4 -0
  70. package/dist/cjs/layouts/stack-utils/StackHeaderBackButton.native.js +4 -0
  71. package/dist/cjs/layouts/stack-utils/StackHeaderBackButton.native.js.map +1 -1
  72. package/dist/cjs/layouts/stack-utils/StackHeaderComponent.cjs +13 -9
  73. package/dist/cjs/layouts/stack-utils/StackHeaderComponent.native.js +13 -9
  74. package/dist/cjs/layouts/stack-utils/StackHeaderComponent.native.js.map +1 -1
  75. package/dist/cjs/layouts/stack-utils/StackHeaderLeft.cjs +4 -0
  76. package/dist/cjs/layouts/stack-utils/StackHeaderLeft.native.js +4 -0
  77. package/dist/cjs/layouts/stack-utils/StackHeaderLeft.native.js.map +1 -1
  78. package/dist/cjs/layouts/stack-utils/StackHeaderRight.cjs +4 -0
  79. package/dist/cjs/layouts/stack-utils/StackHeaderRight.native.js +4 -0
  80. package/dist/cjs/layouts/stack-utils/StackHeaderRight.native.js.map +1 -1
  81. package/dist/cjs/layouts/stack-utils/StackHeaderSearchBar.cjs +4 -0
  82. package/dist/cjs/layouts/stack-utils/StackHeaderSearchBar.native.js +4 -0
  83. package/dist/cjs/layouts/stack-utils/StackHeaderSearchBar.native.js.map +1 -1
  84. package/dist/cjs/layouts/stack-utils/StackHeaderTitle.cjs +8 -4
  85. package/dist/cjs/layouts/stack-utils/StackHeaderTitle.native.js +8 -4
  86. package/dist/cjs/layouts/stack-utils/StackHeaderTitle.native.js.map +1 -1
  87. package/dist/cjs/layouts/stack-utils/StackScreen.cjs +10 -23
  88. package/dist/cjs/layouts/stack-utils/StackScreen.native.js +21 -27
  89. package/dist/cjs/layouts/stack-utils/StackScreen.native.js.map +1 -1
  90. package/dist/cjs/layouts/stack-utils/__tests__/composition.test.cjs +11 -6
  91. package/dist/cjs/layouts/stack-utils/__tests__/composition.test.native.js +15 -6
  92. package/dist/cjs/layouts/stack-utils/__tests__/composition.test.native.js.map +1 -1
  93. package/dist/cjs/layouts/stack-utils/index.cjs +2 -0
  94. package/dist/cjs/layouts/stack-utils/index.native.js +2 -0
  95. package/dist/cjs/layouts/stack-utils/index.native.js.map +1 -1
  96. package/dist/cjs/layouts/withLayoutContext.cjs +2 -2
  97. package/dist/cjs/layouts/withLayoutContext.native.js +2 -2
  98. package/dist/cjs/layouts/withLayoutContext.native.js.map +1 -1
  99. package/dist/cjs/link/Link.cjs +55 -69
  100. package/dist/cjs/link/Link.native.js.map +1 -1
  101. package/dist/cjs/link/useLinkTo.cjs +3 -17
  102. package/dist/cjs/link/useLinkTo.native.js +1 -23
  103. package/dist/cjs/link/useLinkTo.native.js.map +1 -1
  104. package/dist/cjs/metro-config/withOne.test.cjs +2 -2
  105. package/dist/cjs/metro-config/withOne.test.native.js +2 -2
  106. package/dist/cjs/metro-config/withOne.test.native.js.map +1 -1
  107. package/dist/cjs/router/getRouteArtifactPath.test.native.js.map +1 -1
  108. package/dist/cjs/router/router.cjs +2 -2
  109. package/dist/cjs/router/router.native.js +2 -2
  110. package/dist/cjs/router/router.native.js.map +1 -1
  111. package/dist/cjs/router/useScreens.cjs +31 -72
  112. package/dist/cjs/router/useScreens.native.js +15 -71
  113. package/dist/cjs/router/useScreens.native.js.map +1 -1
  114. package/dist/cjs/router/web/WebStackNavigator.cjs +8 -7
  115. package/dist/cjs/router/web/WebStackNavigator.native.js +8 -7
  116. package/dist/cjs/router/web/WebStackNavigator.native.js.map +1 -1
  117. package/dist/cjs/router/web/WebStackView.cjs +108 -131
  118. package/dist/cjs/router/web/WebStackView.native.js +117 -176
  119. package/dist/cjs/router/web/WebStackView.native.js.map +1 -1
  120. package/dist/cjs/router/web/stackStateUtils.native.js.map +1 -1
  121. package/dist/cjs/screensFeatureFlags.cjs +1 -16
  122. package/dist/cjs/screensFeatureFlags.native.js +3 -3
  123. package/dist/cjs/screensFeatureFlags.native.js.map +1 -1
  124. package/dist/cjs/typed-routes/generateRouteTypes.cjs +3 -10
  125. package/dist/cjs/typed-routes/generateRouteTypes.native.js +3 -10
  126. package/dist/cjs/typed-routes/generateRouteTypes.native.js.map +1 -1
  127. package/dist/cjs/ui/Slot.cjs +4 -25
  128. package/dist/cjs/ui/Slot.native.js.map +1 -1
  129. package/dist/cjs/ui/TabList.cjs +7 -19
  130. package/dist/cjs/ui/TabList.native.js.map +1 -1
  131. package/dist/cjs/ui/TabSlot.cjs +15 -47
  132. package/dist/cjs/ui/TabSlot.native.js.map +1 -1
  133. package/dist/cjs/ui/TabTrigger.cjs +30 -134
  134. package/dist/cjs/ui/TabTrigger.native.js +14 -115
  135. package/dist/cjs/ui/TabTrigger.native.js.map +1 -1
  136. package/dist/cjs/ui/Tabs.cjs +15 -155
  137. package/dist/cjs/ui/Tabs.native.js +4 -144
  138. package/dist/cjs/ui/Tabs.native.js.map +1 -1
  139. package/dist/cjs/ui/Tabs.shared.cjs +160 -0
  140. package/dist/cjs/ui/Tabs.shared.native.js +174 -0
  141. package/dist/cjs/ui/Tabs.shared.native.js.map +1 -0
  142. package/dist/cjs/ui/useTabTrigger.cjs +122 -0
  143. package/dist/cjs/ui/useTabTrigger.native.js +125 -0
  144. package/dist/cjs/ui/useTabTrigger.native.js.map +1 -0
  145. package/dist/cjs/useBlocker.cjs +55 -93
  146. package/dist/cjs/useLoader.native.js +0 -18
  147. package/dist/cjs/useLoader.native.js.map +1 -1
  148. package/dist/cjs/utils/platform.cjs +28 -0
  149. package/dist/cjs/utils/platform.native.js +32 -0
  150. package/dist/cjs/utils/platform.native.js.map +1 -0
  151. package/dist/cjs/utils/routeIndex.cjs +80 -0
  152. package/dist/cjs/utils/routeIndex.native.js +86 -0
  153. package/dist/cjs/utils/routeIndex.native.js.map +1 -0
  154. package/dist/cjs/utils/routeIndex.test.cjs +51 -0
  155. package/dist/cjs/utils/routeIndex.test.native.js +54 -0
  156. package/dist/cjs/utils/routeIndex.test.native.js.map +1 -0
  157. package/dist/cjs/utils/style.cjs +21 -1
  158. package/dist/cjs/utils/style.native.js +40 -1
  159. package/dist/cjs/utils/style.native.js.map +1 -1
  160. package/dist/cjs/views/LoadProgressBar.cjs +59 -23
  161. package/dist/cjs/views/LoadProgressBar.native.js.map +1 -1
  162. package/dist/cjs/views/Protected.cjs +4 -0
  163. package/dist/cjs/views/Protected.native.js +4 -0
  164. package/dist/cjs/views/Protected.native.js.map +1 -1
  165. package/dist/cjs/views/RootErrorBoundary.cjs +107 -148
  166. package/dist/cjs/views/RootErrorBoundary.native.js +30 -140
  167. package/dist/cjs/views/RootErrorBoundary.native.js.map +1 -1
  168. package/dist/cjs/views/RouteErrorView.cjs +108 -0
  169. package/dist/cjs/views/RouteErrorView.native.js +110 -0
  170. package/dist/cjs/views/RouteErrorView.native.js.map +1 -0
  171. package/dist/cjs/views/Screen.cjs +5 -1
  172. package/dist/cjs/views/Screen.native.js +4 -0
  173. package/dist/cjs/views/Screen.native.js.map +1 -1
  174. package/dist/cjs/vite/getManifest.cjs +4 -20
  175. package/dist/cjs/vite/getManifest.native.js +4 -20
  176. package/dist/cjs/vite/getManifest.native.js.map +1 -1
  177. package/dist/cjs/vite/one.cjs +12 -46
  178. package/dist/cjs/vite/one.native.js +23 -59
  179. package/dist/cjs/vite/one.native.js.map +1 -1
  180. package/dist/cjs/vite/plugins/bundledDevPlugin.cjs +130 -0
  181. package/dist/cjs/vite/plugins/bundledDevPlugin.native.js +154 -0
  182. package/dist/cjs/vite/plugins/bundledDevPlugin.native.js.map +1 -0
  183. package/dist/cjs/vite/plugins/devtoolsPlugin.cjs +4 -0
  184. package/dist/cjs/vite/plugins/devtoolsPlugin.native.js +5 -0
  185. package/dist/cjs/vite/plugins/devtoolsPlugin.native.js.map +1 -1
  186. package/dist/cjs/vite/plugins/fileSystemRouterPlugin.cjs +15 -6
  187. package/dist/cjs/vite/plugins/fileSystemRouterPlugin.native.js +15 -5
  188. package/dist/cjs/vite/plugins/fileSystemRouterPlugin.native.js.map +1 -1
  189. package/dist/cjs/vite/plugins/fileSystemRouterPlugin.test.cjs +12 -2
  190. package/dist/cjs/vite/plugins/fileSystemRouterPlugin.test.native.js +12 -2
  191. package/dist/cjs/vite/plugins/fileSystemRouterPlugin.test.native.js.map +1 -1
  192. package/dist/cjs/vite/plugins/generateFileSystemRouteTypesPlugin.cjs +10 -6
  193. package/dist/cjs/vite/plugins/generateFileSystemRouteTypesPlugin.native.js +11 -7
  194. package/dist/cjs/vite/plugins/generateFileSystemRouteTypesPlugin.native.js.map +1 -1
  195. package/dist/cjs/vite/plugins/routeModuleHmrPlugin.cjs +79 -0
  196. package/dist/cjs/vite/plugins/routeModuleHmrPlugin.native.js +84 -0
  197. package/dist/cjs/vite/plugins/routeModuleHmrPlugin.native.js.map +1 -0
  198. package/dist/cjs/vite/plugins/routeModuleHmrPlugin.test.cjs +74 -0
  199. package/dist/cjs/vite/plugins/routeModuleHmrPlugin.test.native.js +83 -0
  200. package/dist/cjs/vite/plugins/routeModuleHmrPlugin.test.native.js.map +1 -0
  201. package/dist/cjs/vite/plugins/virtualEntryPlugin.cjs +11 -5
  202. package/dist/cjs/vite/plugins/virtualEntryPlugin.native.js +20 -10
  203. package/dist/cjs/vite/plugins/virtualEntryPlugin.native.js.map +1 -1
  204. package/dist/cjs/vite/plugins/virtualEntryPlugin.test.cjs +10 -2
  205. package/dist/cjs/vite/plugins/virtualEntryPlugin.test.native.js +14 -2
  206. package/dist/cjs/vite/plugins/virtualEntryPlugin.test.native.js.map +1 -1
  207. package/dist/esm/Root.mjs +1 -1
  208. package/dist/esm/Root.mjs.map +1 -1
  209. package/dist/esm/Root.native.js +1 -1
  210. package/dist/esm/Root.native.js.map +1 -1
  211. package/dist/esm/cli/build.mjs +9 -17
  212. package/dist/esm/cli/build.mjs.map +1 -1
  213. package/dist/esm/cli/build.native.js +8 -16
  214. package/dist/esm/cli/build.native.js.map +1 -1
  215. package/dist/esm/createApp.mjs +12 -35
  216. package/dist/esm/createApp.mjs.map +1 -1
  217. package/dist/esm/createHandleRequest.mjs +4 -2
  218. package/dist/esm/createHandleRequest.mjs.map +1 -1
  219. package/dist/esm/createHandleRequest.native.js +4 -2
  220. package/dist/esm/createHandleRequest.native.js.map +1 -1
  221. package/dist/esm/fallbackViews/Sitemap.mjs +110 -53
  222. package/dist/esm/fallbackViews/Sitemap.mjs.map +1 -1
  223. package/dist/esm/fallbackViews/Sitemap.native.js.map +1 -1
  224. package/dist/esm/fallbackViews/Unmatched.mjs +89 -34
  225. package/dist/esm/fallbackViews/Unmatched.mjs.map +1 -1
  226. package/dist/esm/fallbackViews/Unmatched.native.js.map +1 -1
  227. package/dist/esm/fork/NavigationContainer.mjs +6 -28
  228. package/dist/esm/fork/NavigationContainer.mjs.map +1 -1
  229. package/dist/esm/fork/NavigationContainer.native.js +5 -27
  230. package/dist/esm/fork/NavigationContainer.native.js.map +1 -1
  231. package/dist/esm/fork/localeDirection.mjs +5 -0
  232. package/dist/esm/fork/localeDirection.mjs.map +1 -0
  233. package/dist/esm/fork/localeDirection.native.js +6 -0
  234. package/dist/esm/fork/localeDirection.native.js.map +1 -0
  235. package/dist/esm/fork/theme.mjs +45 -0
  236. package/dist/esm/fork/theme.mjs.map +1 -0
  237. package/dist/esm/fork/theme.native.js +3 -0
  238. package/dist/esm/fork/theme.native.js.map +1 -0
  239. package/dist/esm/headless/Presentations.mjs +25 -0
  240. package/dist/esm/headless/Presentations.mjs.map +1 -0
  241. package/dist/esm/headless/Presentations.native.js +28 -0
  242. package/dist/esm/headless/Presentations.native.js.map +1 -0
  243. package/dist/esm/headless/children.mjs +16 -0
  244. package/dist/esm/headless/children.mjs.map +1 -0
  245. package/dist/esm/headless/children.native.js +16 -0
  246. package/dist/esm/headless/children.native.js.map +1 -0
  247. package/dist/esm/headless/devHeadlessNote.mjs +9 -0
  248. package/dist/esm/headless/devHeadlessNote.mjs.map +1 -0
  249. package/dist/esm/headless/devHeadlessNote.native.js +9 -0
  250. package/dist/esm/headless/devHeadlessNote.native.js.map +1 -0
  251. package/dist/esm/headless/keepMounted.mjs +32 -0
  252. package/dist/esm/headless/keepMounted.mjs.map +1 -0
  253. package/dist/esm/headless/keepMounted.native.js +36 -0
  254. package/dist/esm/headless/keepMounted.native.js.map +1 -0
  255. package/dist/esm/headless/types.mjs +2 -0
  256. package/dist/esm/headless/types.mjs.map +1 -0
  257. package/dist/esm/headless/types.native.js +2 -0
  258. package/dist/esm/headless/types.native.js.map +1 -0
  259. package/dist/esm/headless/useDrawer.mjs +57 -0
  260. package/dist/esm/headless/useDrawer.mjs.map +1 -0
  261. package/dist/esm/headless/useDrawer.native.js +67 -0
  262. package/dist/esm/headless/useDrawer.native.js.map +1 -0
  263. package/dist/esm/headless/useStack.mjs +49 -0
  264. package/dist/esm/headless/useStack.mjs.map +1 -0
  265. package/dist/esm/headless/useStack.native.js +51 -0
  266. package/dist/esm/headless/useStack.native.js.map +1 -0
  267. package/dist/esm/headless/useTabs.mjs +37 -0
  268. package/dist/esm/headless/useTabs.mjs.map +1 -0
  269. package/dist/esm/headless/useTabs.native.js +38 -0
  270. package/dist/esm/headless/useTabs.native.js.map +1 -0
  271. package/dist/esm/index.js +5 -2
  272. package/dist/esm/index.js.map +1 -1
  273. package/dist/esm/index.mjs +5 -2
  274. package/dist/esm/index.mjs.map +1 -1
  275. package/dist/esm/index.native.js +5 -2
  276. package/dist/esm/index.native.js.map +1 -1
  277. package/dist/esm/layouts/Drawer.mjs +69 -29
  278. package/dist/esm/layouts/Drawer.mjs.map +1 -1
  279. package/dist/esm/layouts/Drawer.native.js +2 -26
  280. package/dist/esm/layouts/Drawer.native.js.map +1 -1
  281. package/dist/esm/layouts/Stack.mjs +10 -14
  282. package/dist/esm/layouts/Stack.mjs.map +1 -1
  283. package/dist/esm/layouts/Stack.native.js +12 -14
  284. package/dist/esm/layouts/Stack.native.js.map +1 -1
  285. package/dist/esm/layouts/Tabs.mjs +101 -74
  286. package/dist/esm/layouts/Tabs.mjs.map +1 -1
  287. package/dist/esm/layouts/Tabs.native.js +2 -14
  288. package/dist/esm/layouts/Tabs.native.js.map +1 -1
  289. package/dist/esm/layouts/stack-navigator.mjs +8 -1
  290. package/dist/esm/layouts/stack-navigator.mjs.map +1 -1
  291. package/dist/esm/layouts/stack-navigator.native.js +4 -1
  292. package/dist/esm/layouts/stack-navigator.native.js.map +1 -1
  293. package/dist/esm/layouts/stack-utils/StackHeaderBackButton.mjs +4 -0
  294. package/dist/esm/layouts/stack-utils/StackHeaderBackButton.mjs.map +1 -1
  295. package/dist/esm/layouts/stack-utils/StackHeaderBackButton.native.js +4 -0
  296. package/dist/esm/layouts/stack-utils/StackHeaderBackButton.native.js.map +1 -1
  297. package/dist/esm/layouts/stack-utils/StackHeaderComponent.mjs +7 -3
  298. package/dist/esm/layouts/stack-utils/StackHeaderComponent.mjs.map +1 -1
  299. package/dist/esm/layouts/stack-utils/StackHeaderComponent.native.js +7 -3
  300. package/dist/esm/layouts/stack-utils/StackHeaderComponent.native.js.map +1 -1
  301. package/dist/esm/layouts/stack-utils/StackHeaderLeft.mjs +4 -0
  302. package/dist/esm/layouts/stack-utils/StackHeaderLeft.mjs.map +1 -1
  303. package/dist/esm/layouts/stack-utils/StackHeaderLeft.native.js +4 -0
  304. package/dist/esm/layouts/stack-utils/StackHeaderLeft.native.js.map +1 -1
  305. package/dist/esm/layouts/stack-utils/StackHeaderRight.mjs +4 -0
  306. package/dist/esm/layouts/stack-utils/StackHeaderRight.mjs.map +1 -1
  307. package/dist/esm/layouts/stack-utils/StackHeaderRight.native.js +4 -0
  308. package/dist/esm/layouts/stack-utils/StackHeaderRight.native.js.map +1 -1
  309. package/dist/esm/layouts/stack-utils/StackHeaderSearchBar.mjs +4 -0
  310. package/dist/esm/layouts/stack-utils/StackHeaderSearchBar.mjs.map +1 -1
  311. package/dist/esm/layouts/stack-utils/StackHeaderSearchBar.native.js +4 -0
  312. package/dist/esm/layouts/stack-utils/StackHeaderSearchBar.native.js.map +1 -1
  313. package/dist/esm/layouts/stack-utils/StackHeaderTitle.mjs +9 -5
  314. package/dist/esm/layouts/stack-utils/StackHeaderTitle.mjs.map +1 -1
  315. package/dist/esm/layouts/stack-utils/StackHeaderTitle.native.js +9 -5
  316. package/dist/esm/layouts/stack-utils/StackHeaderTitle.native.js.map +1 -1
  317. package/dist/esm/layouts/stack-utils/StackScreen.mjs +10 -23
  318. package/dist/esm/layouts/stack-utils/StackScreen.mjs.map +1 -1
  319. package/dist/esm/layouts/stack-utils/StackScreen.native.js +23 -29
  320. package/dist/esm/layouts/stack-utils/StackScreen.native.js.map +1 -1
  321. package/dist/esm/layouts/stack-utils/__tests__/composition.test.mjs +12 -7
  322. package/dist/esm/layouts/stack-utils/__tests__/composition.test.mjs.map +1 -1
  323. package/dist/esm/layouts/stack-utils/__tests__/composition.test.native.js +16 -7
  324. package/dist/esm/layouts/stack-utils/__tests__/composition.test.native.js.map +1 -1
  325. package/dist/esm/layouts/stack-utils/index.mjs +2 -0
  326. package/dist/esm/layouts/stack-utils/index.mjs.map +1 -1
  327. package/dist/esm/layouts/stack-utils/index.native.js +2 -0
  328. package/dist/esm/layouts/stack-utils/index.native.js.map +1 -1
  329. package/dist/esm/layouts/withLayoutContext.mjs +2 -2
  330. package/dist/esm/layouts/withLayoutContext.mjs.map +1 -1
  331. package/dist/esm/layouts/withLayoutContext.native.js +2 -2
  332. package/dist/esm/layouts/withLayoutContext.native.js.map +1 -1
  333. package/dist/esm/link/Link.mjs +57 -68
  334. package/dist/esm/link/Link.mjs.map +1 -1
  335. package/dist/esm/link/useLinkTo.mjs +4 -19
  336. package/dist/esm/link/useLinkTo.mjs.map +1 -1
  337. package/dist/esm/link/useLinkTo.native.js +2 -25
  338. package/dist/esm/link/useLinkTo.native.js.map +1 -1
  339. package/dist/esm/metro-config/withOne.test.mjs +2 -2
  340. package/dist/esm/metro-config/withOne.test.mjs.map +1 -1
  341. package/dist/esm/metro-config/withOne.test.native.js +2 -2
  342. package/dist/esm/metro-config/withOne.test.native.js.map +1 -1
  343. package/dist/esm/router/getRouteArtifactPath.test.mjs.map +1 -1
  344. package/dist/esm/router/getRouteArtifactPath.test.native.js.map +1 -1
  345. package/dist/esm/router/router.mjs +2 -2
  346. package/dist/esm/router/router.mjs.map +1 -1
  347. package/dist/esm/router/router.native.js +2 -2
  348. package/dist/esm/router/router.native.js.map +1 -1
  349. package/dist/esm/router/useScreens.mjs +30 -71
  350. package/dist/esm/router/useScreens.mjs.map +1 -1
  351. package/dist/esm/router/useScreens.native.js +13 -69
  352. package/dist/esm/router/useScreens.native.js.map +1 -1
  353. package/dist/esm/router/useScreens.test.mjs +1 -1
  354. package/dist/esm/router/useScreens.test.mjs.map +1 -1
  355. package/dist/esm/router/web/WebStackNavigator.mjs +5 -4
  356. package/dist/esm/router/web/WebStackNavigator.mjs.map +1 -1
  357. package/dist/esm/router/web/WebStackNavigator.native.js +5 -4
  358. package/dist/esm/router/web/WebStackNavigator.native.js.map +1 -1
  359. package/dist/esm/router/web/WebStackView.mjs +99 -131
  360. package/dist/esm/router/web/WebStackView.mjs.map +1 -1
  361. package/dist/esm/router/web/WebStackView.native.js +107 -175
  362. package/dist/esm/router/web/WebStackView.native.js.map +1 -1
  363. package/dist/esm/router/web/stackStateUtils.mjs.map +1 -1
  364. package/dist/esm/router/web/stackStateUtils.native.js.map +1 -1
  365. package/dist/esm/screensFeatureFlags.mjs +1 -16
  366. package/dist/esm/screensFeatureFlags.mjs.map +1 -1
  367. package/dist/esm/screensFeatureFlags.native.js.map +1 -1
  368. package/dist/esm/typed-routes/generateRouteTypes.mjs +3 -10
  369. package/dist/esm/typed-routes/generateRouteTypes.mjs.map +1 -1
  370. package/dist/esm/typed-routes/generateRouteTypes.native.js +3 -10
  371. package/dist/esm/typed-routes/generateRouteTypes.native.js.map +1 -1
  372. package/dist/esm/ui/Slot.mjs +1 -22
  373. package/dist/esm/ui/Slot.mjs.map +1 -1
  374. package/dist/esm/ui/Slot.native.js.map +1 -1
  375. package/dist/esm/ui/TabList.mjs +3 -15
  376. package/dist/esm/ui/TabList.mjs.map +1 -1
  377. package/dist/esm/ui/TabList.native.js.map +1 -1
  378. package/dist/esm/ui/TabSlot.mjs +12 -44
  379. package/dist/esm/ui/TabSlot.mjs.map +1 -1
  380. package/dist/esm/ui/TabSlot.native.js.map +1 -1
  381. package/dist/esm/ui/TabTrigger.mjs +25 -129
  382. package/dist/esm/ui/TabTrigger.mjs.map +1 -1
  383. package/dist/esm/ui/TabTrigger.native.js +13 -114
  384. package/dist/esm/ui/TabTrigger.native.js.map +1 -1
  385. package/dist/esm/ui/Tabs.mjs +7 -145
  386. package/dist/esm/ui/Tabs.mjs.map +1 -1
  387. package/dist/esm/ui/Tabs.native.js +5 -143
  388. package/dist/esm/ui/Tabs.native.js.map +1 -1
  389. package/dist/esm/ui/Tabs.shared.mjs +134 -0
  390. package/dist/esm/ui/Tabs.shared.mjs.map +1 -0
  391. package/dist/esm/ui/Tabs.shared.native.js +145 -0
  392. package/dist/esm/ui/Tabs.shared.native.js.map +1 -0
  393. package/dist/esm/ui/useTabTrigger.mjs +96 -0
  394. package/dist/esm/ui/useTabTrigger.mjs.map +1 -0
  395. package/dist/esm/ui/useTabTrigger.native.js +96 -0
  396. package/dist/esm/ui/useTabTrigger.native.js.map +1 -0
  397. package/dist/esm/useBlocker.mjs +55 -93
  398. package/dist/esm/useBlocker.mjs.map +1 -1
  399. package/dist/esm/useLoader.native.js +0 -18
  400. package/dist/esm/useLoader.native.js.map +1 -1
  401. package/dist/esm/utils/platform.mjs +3 -0
  402. package/dist/esm/utils/platform.mjs.map +1 -0
  403. package/dist/esm/utils/platform.native.js +4 -0
  404. package/dist/esm/utils/platform.native.js.map +1 -0
  405. package/dist/esm/utils/routeIndex.mjs +43 -0
  406. package/dist/esm/utils/routeIndex.mjs.map +1 -0
  407. package/dist/esm/utils/routeIndex.native.js +46 -0
  408. package/dist/esm/utils/routeIndex.native.js.map +1 -0
  409. package/dist/esm/utils/routeIndex.test.mjs +52 -0
  410. package/dist/esm/utils/routeIndex.test.mjs.map +1 -0
  411. package/dist/esm/utils/routeIndex.test.native.js +52 -0
  412. package/dist/esm/utils/routeIndex.test.native.js.map +1 -0
  413. package/dist/esm/utils/style.mjs +20 -1
  414. package/dist/esm/utils/style.mjs.map +1 -1
  415. package/dist/esm/utils/style.native.js +39 -1
  416. package/dist/esm/utils/style.native.js.map +1 -1
  417. package/dist/esm/views/LoadProgressBar.mjs +45 -20
  418. package/dist/esm/views/LoadProgressBar.mjs.map +1 -1
  419. package/dist/esm/views/LoadProgressBar.native.js.map +1 -1
  420. package/dist/esm/views/Protected.mjs +4 -0
  421. package/dist/esm/views/Protected.mjs.map +1 -1
  422. package/dist/esm/views/Protected.native.js +4 -0
  423. package/dist/esm/views/Protected.native.js.map +1 -1
  424. package/dist/esm/views/RootErrorBoundary.mjs +106 -147
  425. package/dist/esm/views/RootErrorBoundary.mjs.map +1 -1
  426. package/dist/esm/views/RootErrorBoundary.native.js +37 -145
  427. package/dist/esm/views/RootErrorBoundary.native.js.map +1 -1
  428. package/dist/esm/views/RouteErrorView.mjs +83 -0
  429. package/dist/esm/views/RouteErrorView.mjs.map +1 -0
  430. package/dist/esm/views/RouteErrorView.native.js +82 -0
  431. package/dist/esm/views/RouteErrorView.native.js.map +1 -0
  432. package/dist/esm/views/Screen.mjs +4 -0
  433. package/dist/esm/views/Screen.mjs.map +1 -1
  434. package/dist/esm/views/Screen.native.js +4 -0
  435. package/dist/esm/views/Screen.native.js.map +1 -1
  436. package/dist/esm/vite/getManifest.mjs +4 -9
  437. package/dist/esm/vite/getManifest.mjs.map +1 -1
  438. package/dist/esm/vite/getManifest.native.js +4 -9
  439. package/dist/esm/vite/getManifest.native.js.map +1 -1
  440. package/dist/esm/vite/one.mjs +12 -46
  441. package/dist/esm/vite/one.mjs.map +1 -1
  442. package/dist/esm/vite/one.native.js +23 -59
  443. package/dist/esm/vite/one.native.js.map +1 -1
  444. package/dist/esm/vite/plugins/bundledDevPlugin.mjs +94 -0
  445. package/dist/esm/vite/plugins/bundledDevPlugin.mjs.map +1 -0
  446. package/dist/esm/vite/plugins/bundledDevPlugin.native.js +115 -0
  447. package/dist/esm/vite/plugins/bundledDevPlugin.native.js.map +1 -0
  448. package/dist/esm/vite/plugins/devtoolsPlugin.mjs +4 -0
  449. package/dist/esm/vite/plugins/devtoolsPlugin.mjs.map +1 -1
  450. package/dist/esm/vite/plugins/devtoolsPlugin.native.js +5 -0
  451. package/dist/esm/vite/plugins/devtoolsPlugin.native.js.map +1 -1
  452. package/dist/esm/vite/plugins/fileSystemRouterPlugin.mjs +15 -6
  453. package/dist/esm/vite/plugins/fileSystemRouterPlugin.mjs.map +1 -1
  454. package/dist/esm/vite/plugins/fileSystemRouterPlugin.native.js +15 -5
  455. package/dist/esm/vite/plugins/fileSystemRouterPlugin.native.js.map +1 -1
  456. package/dist/esm/vite/plugins/fileSystemRouterPlugin.test.mjs +12 -2
  457. package/dist/esm/vite/plugins/fileSystemRouterPlugin.test.mjs.map +1 -1
  458. package/dist/esm/vite/plugins/fileSystemRouterPlugin.test.native.js +12 -2
  459. package/dist/esm/vite/plugins/fileSystemRouterPlugin.test.native.js.map +1 -1
  460. package/dist/esm/vite/plugins/generateFileSystemRouteTypesPlugin.mjs +10 -6
  461. package/dist/esm/vite/plugins/generateFileSystemRouteTypesPlugin.mjs.map +1 -1
  462. package/dist/esm/vite/plugins/generateFileSystemRouteTypesPlugin.native.js +11 -7
  463. package/dist/esm/vite/plugins/generateFileSystemRouteTypesPlugin.native.js.map +1 -1
  464. package/dist/esm/vite/plugins/routeModuleHmrPlugin.mjs +43 -0
  465. package/dist/esm/vite/plugins/routeModuleHmrPlugin.mjs.map +1 -0
  466. package/dist/esm/vite/plugins/routeModuleHmrPlugin.native.js +45 -0
  467. package/dist/esm/vite/plugins/routeModuleHmrPlugin.native.js.map +1 -0
  468. package/dist/esm/vite/plugins/routeModuleHmrPlugin.test.mjs +75 -0
  469. package/dist/esm/vite/plugins/routeModuleHmrPlugin.test.mjs.map +1 -0
  470. package/dist/esm/vite/plugins/routeModuleHmrPlugin.test.native.js +81 -0
  471. package/dist/esm/vite/plugins/routeModuleHmrPlugin.test.native.js.map +1 -0
  472. package/dist/esm/vite/plugins/virtualEntryPlugin.mjs +11 -5
  473. package/dist/esm/vite/plugins/virtualEntryPlugin.mjs.map +1 -1
  474. package/dist/esm/vite/plugins/virtualEntryPlugin.native.js +20 -10
  475. package/dist/esm/vite/plugins/virtualEntryPlugin.native.js.map +1 -1
  476. package/dist/esm/vite/plugins/virtualEntryPlugin.test.mjs +10 -2
  477. package/dist/esm/vite/plugins/virtualEntryPlugin.test.mjs.map +1 -1
  478. package/dist/esm/vite/plugins/virtualEntryPlugin.test.native.js +14 -2
  479. package/dist/esm/vite/plugins/virtualEntryPlugin.test.native.js.map +1 -1
  480. package/package.json +27 -28
  481. package/src/Root.tsx +2 -6
  482. package/src/cli/build.ts +25 -37
  483. package/src/createApp.tsx +15 -42
  484. package/src/createHandleRequest.ts +6 -2
  485. package/src/fallbackViews/Sitemap.web.tsx +149 -0
  486. package/src/fallbackViews/Unmatched.web.tsx +91 -0
  487. package/src/fork/NavigationContainer.tsx +12 -39
  488. package/src/fork/localeDirection.native.ts +6 -0
  489. package/src/fork/localeDirection.ts +11 -0
  490. package/src/fork/theme.native.ts +1 -0
  491. package/src/fork/theme.ts +41 -0
  492. package/src/headless/Presentations.tsx +37 -0
  493. package/src/headless/children.ts +25 -0
  494. package/src/headless/devHeadlessNote.ts +13 -0
  495. package/src/headless/keepMounted.tsx +46 -0
  496. package/src/headless/types.ts +72 -0
  497. package/src/headless/useDrawer.tsx +88 -0
  498. package/src/headless/useStack.ts +74 -0
  499. package/src/headless/useTabs.ts +40 -0
  500. package/src/index.ts +14 -18
  501. package/src/layouts/Drawer.tsx +4 -35
  502. package/src/layouts/Drawer.web.tsx +117 -0
  503. package/src/layouts/Stack.tsx +54 -62
  504. package/src/layouts/Tabs.tsx +6 -32
  505. package/src/layouts/Tabs.web.tsx +151 -0
  506. package/src/layouts/stack-navigator.ts +6 -2
  507. package/src/layouts/stack-navigator.web.ts +8 -0
  508. package/src/layouts/stack-utils/StackHeaderBackButton.tsx +4 -0
  509. package/src/layouts/stack-utils/StackHeaderComponent.tsx +7 -3
  510. package/src/layouts/stack-utils/StackHeaderLeft.tsx +4 -0
  511. package/src/layouts/stack-utils/StackHeaderRight.tsx +4 -0
  512. package/src/layouts/stack-utils/StackHeaderSearchBar.tsx +4 -0
  513. package/src/layouts/stack-utils/StackHeaderTitle.tsx +9 -5
  514. package/src/layouts/stack-utils/StackScreen.tsx +31 -36
  515. package/src/layouts/stack-utils/__tests__/composition.test.tsx +12 -11
  516. package/src/layouts/stack-utils/index.tsx +2 -0
  517. package/src/layouts/withLayoutContext.tsx +5 -2
  518. package/src/link/Link.web.tsx +84 -0
  519. package/src/link/useLinkTo.tsx +2 -2
  520. package/src/metro-config/withOne.test.ts +5 -4
  521. package/src/router/getRouteArtifactPath.test.ts +1 -6
  522. package/src/router/router.ts +2 -2
  523. package/src/router/useScreens.tsx +31 -71
  524. package/src/router/web/WebStackNavigator.tsx +22 -20
  525. package/src/router/web/WebStackView.tsx +148 -188
  526. package/src/router/web/stackStateUtils.ts +2 -1
  527. package/src/screensFeatureFlags.native.ts +23 -0
  528. package/src/screensFeatureFlags.ts +3 -23
  529. package/src/typed-routes/generateRouteTypes.ts +4 -10
  530. package/src/ui/Slot.web.tsx +9 -0
  531. package/src/ui/TabList.web.tsx +27 -0
  532. package/src/ui/TabSlot.web.tsx +90 -0
  533. package/src/ui/TabTrigger.tsx +33 -249
  534. package/src/ui/TabTrigger.web.tsx +71 -0
  535. package/src/ui/Tabs.shared.tsx +230 -0
  536. package/src/ui/Tabs.tsx +5 -295
  537. package/src/ui/Tabs.web.tsx +40 -0
  538. package/src/ui/useTabTrigger.ts +182 -0
  539. package/src/useBlocker.ts +2 -3
  540. package/src/useLoader.ts +6 -2
  541. package/src/utils/platform.ts +7 -0
  542. package/src/utils/platform.web.ts +1 -0
  543. package/src/utils/routeIndex.test.ts +55 -0
  544. package/src/utils/routeIndex.ts +59 -0
  545. package/src/utils/style.ts +22 -1
  546. package/src/views/LoadProgressBar.web.tsx +135 -0
  547. package/src/views/Protected.tsx +4 -1
  548. package/src/views/RootErrorBoundary.tsx +2 -158
  549. package/src/views/RootErrorBoundary.web.tsx +163 -0
  550. package/src/views/RouteErrorView.tsx +66 -0
  551. package/src/views/RouteErrorView.web.tsx +62 -0
  552. package/src/views/Screen.tsx +3 -0
  553. package/src/vite/getManifest.ts +4 -6
  554. package/src/vite/one.ts +13 -59
  555. package/src/vite/plugins/bundledDevPlugin.ts +119 -0
  556. package/src/vite/plugins/devtoolsPlugin.ts +19 -0
  557. package/src/vite/plugins/fileSystemRouterPlugin.test.ts +19 -11
  558. package/src/vite/plugins/fileSystemRouterPlugin.tsx +31 -6
  559. package/src/vite/plugins/generateFileSystemRouteTypesPlugin.tsx +22 -11
  560. package/src/vite/plugins/routeModuleHmrPlugin.test.ts +73 -0
  561. package/src/vite/plugins/routeModuleHmrPlugin.ts +54 -0
  562. package/src/vite/plugins/virtualEntryPlugin.test.ts +10 -1
  563. package/src/vite/plugins/virtualEntryPlugin.ts +37 -9
  564. package/src/vite/types.ts +11 -0
  565. package/types/Root.d.ts +1 -1
  566. package/types/Root.d.ts.map +1 -1
  567. package/types/cli/build.d.ts.map +1 -1
  568. package/types/createApp.d.ts.map +1 -1
  569. package/types/createHandleRequest.d.ts +2 -1
  570. package/types/createHandleRequest.d.ts.map +1 -1
  571. package/types/fallbackViews/Sitemap.web.d.ts +4 -0
  572. package/types/fallbackViews/Sitemap.web.d.ts.map +1 -0
  573. package/types/fallbackViews/Unmatched.web.d.ts +2 -0
  574. package/types/fallbackViews/Unmatched.web.d.ts.map +1 -0
  575. package/types/fork/NavigationContainer.d.ts.map +1 -1
  576. package/types/fork/localeDirection.d.ts +9 -0
  577. package/types/fork/localeDirection.d.ts.map +1 -0
  578. package/types/fork/localeDirection.native.d.ts +3 -0
  579. package/types/fork/localeDirection.native.d.ts.map +1 -0
  580. package/types/fork/theme.d.ts +4 -0
  581. package/types/fork/theme.d.ts.map +1 -0
  582. package/types/fork/theme.native.d.ts +2 -0
  583. package/types/fork/theme.native.d.ts.map +1 -0
  584. package/types/fork/useLinking.native.d.ts +4 -4
  585. package/types/headless/Presentations.d.ts +13 -0
  586. package/types/headless/Presentations.d.ts.map +1 -0
  587. package/types/headless/children.d.ts +5 -0
  588. package/types/headless/children.d.ts.map +1 -0
  589. package/types/headless/devHeadlessNote.d.ts +2 -0
  590. package/types/headless/devHeadlessNote.d.ts.map +1 -0
  591. package/types/headless/keepMounted.d.ts +9 -0
  592. package/types/headless/keepMounted.d.ts.map +1 -0
  593. package/types/headless/types.d.ts +59 -0
  594. package/types/headless/types.d.ts.map +1 -0
  595. package/types/headless/useDrawer.d.ts +19 -0
  596. package/types/headless/useDrawer.d.ts.map +1 -0
  597. package/types/headless/useStack.d.ts +16 -0
  598. package/types/headless/useStack.d.ts.map +1 -0
  599. package/types/headless/useTabs.d.ts +3 -0
  600. package/types/headless/useTabs.d.ts.map +1 -0
  601. package/types/index.d.ts +6 -2
  602. package/types/index.d.ts.map +1 -1
  603. package/types/layouts/Drawer.d.ts +5 -15
  604. package/types/layouts/Drawer.d.ts.map +1 -1
  605. package/types/layouts/Drawer.web.d.ts +5 -0
  606. package/types/layouts/Drawer.web.d.ts.map +1 -0
  607. package/types/layouts/Stack.d.ts +8 -17
  608. package/types/layouts/Stack.d.ts.map +1 -1
  609. package/types/layouts/Tabs.d.ts +5 -15
  610. package/types/layouts/Tabs.d.ts.map +1 -1
  611. package/types/layouts/Tabs.web.d.ts +20 -0
  612. package/types/layouts/Tabs.web.d.ts.map +1 -0
  613. package/types/layouts/stack-navigator.d.ts +3 -2
  614. package/types/layouts/stack-navigator.d.ts.map +1 -1
  615. package/types/layouts/stack-navigator.web.d.ts +6 -0
  616. package/types/layouts/stack-navigator.web.d.ts.map +1 -1
  617. package/types/layouts/stack-utils/StackHeaderBackButton.d.ts.map +1 -1
  618. package/types/layouts/stack-utils/StackHeaderComponent.d.ts +1 -1
  619. package/types/layouts/stack-utils/StackHeaderComponent.d.ts.map +1 -1
  620. package/types/layouts/stack-utils/StackHeaderLeft.d.ts.map +1 -1
  621. package/types/layouts/stack-utils/StackHeaderRight.d.ts.map +1 -1
  622. package/types/layouts/stack-utils/StackHeaderSearchBar.d.ts.map +1 -1
  623. package/types/layouts/stack-utils/StackHeaderTitle.d.ts +1 -1
  624. package/types/layouts/stack-utils/StackHeaderTitle.d.ts.map +1 -1
  625. package/types/layouts/stack-utils/StackScreen.d.ts +5 -12
  626. package/types/layouts/stack-utils/StackScreen.d.ts.map +1 -1
  627. package/types/layouts/stack-utils/index.d.ts +1 -0
  628. package/types/layouts/stack-utils/index.d.ts.map +1 -1
  629. package/types/layouts/withLayoutContext.d.ts.map +1 -1
  630. package/types/link/Link.web.d.ts +3 -0
  631. package/types/link/Link.web.d.ts.map +1 -0
  632. package/types/link/useLinkTo.d.ts +1 -1
  633. package/types/link/useLinkTo.d.ts.map +1 -1
  634. package/types/router/router.d.ts.map +1 -1
  635. package/types/router/useScreens.d.ts.map +1 -1
  636. package/types/router/web/WebStackNavigator.d.ts.map +1 -1
  637. package/types/router/web/WebStackView.d.ts +9 -25
  638. package/types/router/web/WebStackView.d.ts.map +1 -1
  639. package/types/router/web/stackStateUtils.d.ts +1 -1
  640. package/types/router/web/stackStateUtils.d.ts.map +1 -1
  641. package/types/screensFeatureFlags.d.ts.map +1 -1
  642. package/types/screensFeatureFlags.native.d.ts +2 -0
  643. package/types/screensFeatureFlags.native.d.ts.map +1 -0
  644. package/types/typed-routes/generateRouteTypes.d.ts +1 -1
  645. package/types/typed-routes/generateRouteTypes.d.ts.map +1 -1
  646. package/types/ui/Slot.web.d.ts +5 -0
  647. package/types/ui/Slot.web.d.ts.map +1 -0
  648. package/types/ui/TabContext.d.ts +7 -7
  649. package/types/ui/TabList.web.d.ts +11 -0
  650. package/types/ui/TabList.web.d.ts.map +1 -0
  651. package/types/ui/TabRouter.d.ts +5 -5
  652. package/types/ui/TabRouter.d.ts.map +1 -1
  653. package/types/ui/TabSlot.web.d.ts +24 -0
  654. package/types/ui/TabSlot.web.d.ts.map +1 -0
  655. package/types/ui/TabTrigger.d.ts +4 -75
  656. package/types/ui/TabTrigger.d.ts.map +1 -1
  657. package/types/ui/TabTrigger.web.d.ts +11 -0
  658. package/types/ui/TabTrigger.web.d.ts.map +1 -0
  659. package/types/ui/Tabs.d.ts +2 -249
  660. package/types/ui/Tabs.d.ts.map +1 -1
  661. package/types/ui/Tabs.shared.d.ts +201 -0
  662. package/types/ui/Tabs.shared.d.ts.map +1 -0
  663. package/types/ui/Tabs.web.d.ts +10 -0
  664. package/types/ui/Tabs.web.d.ts.map +1 -0
  665. package/types/ui/useTabTrigger.d.ts +49 -0
  666. package/types/ui/useTabTrigger.d.ts.map +1 -0
  667. package/types/useBlocker.d.ts.map +1 -1
  668. package/types/useLoader.d.ts.map +1 -1
  669. package/types/utils/platform.d.ts +6 -0
  670. package/types/utils/platform.d.ts.map +1 -0
  671. package/types/utils/platform.web.d.ts +2 -0
  672. package/types/utils/platform.web.d.ts.map +1 -0
  673. package/types/utils/routeIndex.d.ts +10 -0
  674. package/types/utils/routeIndex.d.ts.map +1 -0
  675. package/types/utils/routeIndex.test.d.ts +2 -0
  676. package/types/utils/routeIndex.test.d.ts.map +1 -0
  677. package/types/utils/style.d.ts +6 -1
  678. package/types/utils/style.d.ts.map +1 -1
  679. package/types/views/LoadProgressBar.web.d.ts +21 -0
  680. package/types/views/LoadProgressBar.web.d.ts.map +1 -0
  681. package/types/views/Protected.d.ts.map +1 -1
  682. package/types/views/RootErrorBoundary.d.ts.map +1 -1
  683. package/types/views/RootErrorBoundary.web.d.ts +20 -0
  684. package/types/views/RootErrorBoundary.web.d.ts.map +1 -0
  685. package/types/views/RouteErrorView.d.ts +9 -0
  686. package/types/views/RouteErrorView.d.ts.map +1 -0
  687. package/types/views/RouteErrorView.web.d.ts +3 -0
  688. package/types/views/RouteErrorView.web.d.ts.map +1 -0
  689. package/types/views/Screen.d.ts.map +1 -1
  690. package/types/vite/getManifest.d.ts +2 -1
  691. package/types/vite/getManifest.d.ts.map +1 -1
  692. package/types/vite/one.d.ts.map +1 -1
  693. package/types/vite/plugins/bundledDevPlugin.d.ts +3 -0
  694. package/types/vite/plugins/bundledDevPlugin.d.ts.map +1 -0
  695. package/types/vite/plugins/devtoolsPlugin.d.ts.map +1 -1
  696. package/types/vite/plugins/fileSystemRouterPlugin.d.ts +2 -1
  697. package/types/vite/plugins/fileSystemRouterPlugin.d.ts.map +1 -1
  698. package/types/vite/plugins/generateFileSystemRouteTypesPlugin.d.ts +2 -1
  699. package/types/vite/plugins/generateFileSystemRouteTypesPlugin.d.ts.map +1 -1
  700. package/types/vite/plugins/routeModuleHmrPlugin.d.ts +3 -0
  701. package/types/vite/plugins/routeModuleHmrPlugin.d.ts.map +1 -0
  702. package/types/vite/plugins/routeModuleHmrPlugin.test.d.ts +2 -0
  703. package/types/vite/plugins/routeModuleHmrPlugin.test.d.ts.map +1 -0
  704. package/types/vite/plugins/virtualEntryPlugin.d.ts +2 -0
  705. package/types/vite/plugins/virtualEntryPlugin.d.ts.map +1 -1
  706. package/types/vite/types.d.ts +10 -0
  707. package/types/vite/types.d.ts.map +1 -1
  708. package/vendor/react-dom/package.json +1 -1
  709. package/dist/cjs/fork/SSRNavigationContainer.cjs +0 -149
  710. package/dist/cjs/fork/SSRNavigationContainer.native.js +0 -199
  711. package/dist/cjs/fork/SSRNavigationContainer.native.js.map +0 -1
  712. package/dist/cjs/router/renderingRegistry.native.js.map +0 -1
  713. package/dist/cjs/router/web/ScreenRenderContext.native.js.map +0 -1
  714. package/dist/cjs/router/web/__tests__/WebStackView.runtime.test.cjs +0 -295
  715. package/dist/cjs/router/web/__tests__/WebStackView.runtime.test.native.js +0 -335
  716. package/dist/cjs/router/web/__tests__/WebStackView.runtime.test.native.js.map +0 -1
  717. package/dist/cjs/router/web/__tests__/WebStackView.test.cjs +0 -464
  718. package/dist/cjs/router/web/__tests__/WebStackView.test.native.js +0 -515
  719. package/dist/cjs/router/web/__tests__/WebStackView.test.native.js.map +0 -1
  720. package/dist/esm/fork/SSRNavigationContainer.mjs +0 -124
  721. package/dist/esm/fork/SSRNavigationContainer.mjs.map +0 -1
  722. package/dist/esm/fork/SSRNavigationContainer.native.js +0 -160
  723. package/dist/esm/fork/SSRNavigationContainer.native.js.map +0 -1
  724. package/dist/esm/router/renderingRegistry.mjs +0 -26
  725. package/dist/esm/router/renderingRegistry.mjs.map +0 -1
  726. package/dist/esm/router/renderingRegistry.native.js +0 -26
  727. package/dist/esm/router/renderingRegistry.native.js.map +0 -1
  728. package/dist/esm/router/web/ScreenRenderContext.mjs +0 -10
  729. package/dist/esm/router/web/ScreenRenderContext.mjs.map +0 -1
  730. package/dist/esm/router/web/ScreenRenderContext.native.js +0 -10
  731. package/dist/esm/router/web/ScreenRenderContext.native.js.map +0 -1
  732. package/dist/esm/router/web/__tests__/WebStackView.runtime.test.mjs +0 -272
  733. package/dist/esm/router/web/__tests__/WebStackView.runtime.test.mjs.map +0 -1
  734. package/dist/esm/router/web/__tests__/WebStackView.runtime.test.native.js +0 -309
  735. package/dist/esm/router/web/__tests__/WebStackView.runtime.test.native.js.map +0 -1
  736. package/dist/esm/router/web/__tests__/WebStackView.test.mjs +0 -465
  737. package/dist/esm/router/web/__tests__/WebStackView.test.mjs.map +0 -1
  738. package/dist/esm/router/web/__tests__/WebStackView.test.native.js +0 -513
  739. package/dist/esm/router/web/__tests__/WebStackView.test.native.js.map +0 -1
  740. package/src/fork/SSRNavigationContainer.tsx +0 -148
  741. package/src/router/renderingRegistry.ts +0 -109
  742. package/src/router/web/ScreenRenderContext.tsx +0 -61
  743. package/src/router/web/__tests__/WebStackView.runtime.test.tsx +0 -309
  744. package/src/router/web/__tests__/WebStackView.test.tsx +0 -444
  745. package/types/fork/SSRNavigationContainer.d.ts +0 -16
  746. package/types/fork/SSRNavigationContainer.d.ts.map +0 -1
  747. package/types/router/renderingRegistry.d.ts +0 -90
  748. package/types/router/renderingRegistry.d.ts.map +0 -1
  749. package/types/router/web/ScreenRenderContext.d.ts +0 -46
  750. package/types/router/web/ScreenRenderContext.d.ts.map +0 -1
@@ -1,5 +1,4 @@
1
1
  import { createNavigatorFactory } from '@react-navigation/core'
2
- import { SafeAreaProviderCompat } from '@react-navigation/elements'
3
2
  import type {
4
3
  EventMapBase,
5
4
  NavigationState,
@@ -8,13 +7,17 @@ import type {
8
7
  ScreenListeners,
9
8
  } from '@react-navigation/native'
10
9
  import React, { memo, Suspense, useContext, useEffect, useState } from 'react'
11
- import { SafeAreaView, ScrollView, Text, TouchableOpacity, View } from 'react-native'
10
+ import { SafeAreaProvider } from 'react-native-safe-area-context'
12
11
  import { ServerContextScript } from '../server/ServerContextScript'
12
+ import { checkSkewAndReload } from '../skewProtection'
13
+ import { getClientMatchesSnapshot } from '../useMatches'
14
+ import { handleSkewError, isChunkLoadError } from '../utils/dynamicImport'
13
15
  import { getPageExport } from '../utils/getPageExport'
14
16
  import { EmptyRoute } from '../views/EmptyRoute'
17
+ import { NamedSlot } from '../views/Navigator'
18
+ import { RouteErrorView } from '../views/RouteErrorView'
19
+ import type { SuspenseFallbackProps } from '../views/SuspenseFallback'
15
20
  import { Try } from '../views/Try'
16
- import { checkSkewAndReload } from '../skewProtection'
17
- import { handleSkewError, isChunkLoadError } from '../utils/dynamicImport'
18
21
  import { DevHead } from '../vite/DevHead'
19
22
  import { getServerContext, useServerContext } from '../vite/one-server-only'
20
23
  import { filterRootHTML } from './filterRootHTML'
@@ -22,17 +25,14 @@ import {
22
25
  type DynamicConvention,
23
26
  type LoadedRoute,
24
27
  Route,
25
- RouteParamsContext,
26
28
  type RouteNode,
29
+ RouteParamsContext,
27
30
  SuspenseFallbackContext,
28
31
  useRouteNode,
29
32
  } from './Route'
33
+ import { getRouteHmrEpoch, subscribeRouteHmr } from './routeHmr'
30
34
  import { SpaShellContext } from './SpaShellContext'
31
- import { NamedSlot } from '../views/Navigator'
32
- import type { SuspenseFallbackProps } from '../views/SuspenseFallback'
33
35
  import { sortRoutesWithInitial } from './sortRoutes'
34
- import { getRouteHmrEpoch, subscribeRouteHmr } from './routeHmr'
35
- import { getClientMatchesSnapshot } from '../useMatches'
36
36
 
37
37
  // `@react-navigation/core` does not expose the Screen or Group components directly, so we have to
38
38
  // do this hack.
@@ -112,6 +112,13 @@ const cachedInlineCSSElements: React.ReactNode[] =
112
112
  })()
113
113
  : []
114
114
 
115
+ // zeroed so ssr and the first client render match; the provider measures the
116
+ // real insets and frame from css env() on mount
117
+ const SSR_SAFE_METRICS = {
118
+ frame: { x: 0, y: 0, width: 0, height: 0 },
119
+ insets: { top: 0, left: 0, right: 0, bottom: 0 },
120
+ }
121
+
115
122
  /**
116
123
  * Separate component for rendering root layouts with HTML.
117
124
  * This is extracted into its own component so React's HMR can properly track changes.
@@ -204,7 +211,9 @@ function RootLayoutRenderer({
204
211
  {headChildren}
205
212
  </head>
206
213
  <body key="body" suppressHydrationWarning {...bodyProps}>
207
- <SafeAreaProviderCompat>{finalChildren}</SafeAreaProviderCompat>
214
+ <SafeAreaProvider initialMetrics={SSR_SAFE_METRICS}>
215
+ {finalChildren}
216
+ </SafeAreaProvider>
208
217
  </body>
209
218
  </>
210
219
  )
@@ -583,8 +592,12 @@ export function getQualifiedRouteComponent(value: RouteNode) {
583
592
 
584
593
  QualifiedRoute.displayName = `Route(${value.route})`
585
594
 
586
- qualifiedStore.set(value, QualifiedRoute)
587
- return memo(QualifiedRoute)
595
+ // cache the memoized component, not the raw one: returning a different
596
+ // component type on the first call than on every call after it remounts the
597
+ // whole route subtree once, throwing away layout and screen state
598
+ const Memoized = memo(QualifiedRoute)
599
+ qualifiedStore.set(value, Memoized)
600
+ return Memoized
588
601
  }
589
602
 
590
603
  /** @returns a function which provides a screen id that matches the dynamic route name in params. */
@@ -733,65 +746,12 @@ class RouteErrorBoundary extends React.Component<
733
746
  if (this.state.hasError) {
734
747
  const { error, errorInfo } = this.state
735
748
  return (
736
- <SafeAreaView style={{ backgroundColor: '#000' }}>
737
- <View style={{ margin: 16, gap: 16 }}>
738
- <Text
739
- style={{
740
- alignSelf: 'flex-start',
741
- padding: 5,
742
- margin: -5,
743
- backgroundColor: 'red',
744
- color: 'white',
745
- fontSize: 20,
746
- fontFamily: 'monospace',
747
- }}
748
- >
749
- Error on route "{this.props.routeName}"
750
- </Text>
751
- <Text style={{ color: 'white', fontSize: 16, fontFamily: 'monospace' }}>
752
- {error instanceof Error ? error.message : error}
753
- </Text>
754
- <TouchableOpacity onPress={this.clearError.bind(this)}>
755
- <Text
756
- style={{
757
- alignSelf: 'flex-start',
758
- margin: -6,
759
- padding: 6,
760
- backgroundColor: 'white',
761
- color: 'black',
762
- fontSize: 14,
763
- fontFamily: 'monospace',
764
- }}
765
- >
766
- Retry
767
- </Text>
768
- </TouchableOpacity>
769
- <ScrollView contentContainerStyle={{ gap: 12 }}>
770
- {error instanceof Error ? (
771
- <Text
772
- style={{
773
- color: 'white',
774
- fontSize: 12,
775
- fontFamily: 'monospace',
776
- }}
777
- >
778
- {error.stack}
779
- </Text>
780
- ) : null}
781
- {errorInfo?.componentStack ? (
782
- <Text
783
- style={{
784
- color: 'white',
785
- fontSize: 12,
786
- fontFamily: 'monospace',
787
- }}
788
- >
789
- Component Stack: {errorInfo.componentStack}
790
- </Text>
791
- ) : null}
792
- </ScrollView>
793
- </View>
794
- </SafeAreaView>
749
+ <RouteErrorView
750
+ routeName={this.props.routeName}
751
+ error={error}
752
+ errorInfo={errorInfo}
753
+ onRetry={this.clearError.bind(this)}
754
+ />
795
755
  )
796
756
  }
797
757
 
@@ -2,15 +2,17 @@
2
2
 
3
3
  import {
4
4
  createNavigatorFactory,
5
- StackActions,
6
- StackRouter,
7
5
  useNavigationBuilder,
8
6
  type EventArg,
9
7
  type ParamListBase,
8
+ } from '@react-navigation/core'
9
+ import {
10
+ StackActions,
11
+ StackRouter,
10
12
  type StackActionHelpers,
11
13
  type StackNavigationState,
12
14
  type StackRouterOptions,
13
- } from '@react-navigation/native'
15
+ } from '@react-navigation/routers'
14
16
  import type {
15
17
  NativeStackNavigationEventMap,
16
18
  NativeStackNavigationOptions,
@@ -23,6 +25,7 @@ type WebStackNavigatorProps = {
23
25
  initialRouteName?: string
24
26
  screenOptions?: NativeStackNavigationOptions
25
27
  children: ReactNode
28
+ headlessChildren?: ReactNode[]
26
29
  id?: string
27
30
  // accept anything else NativeStackNavigator does so withLayoutContext can pass through
28
31
  [k: string]: any
@@ -32,29 +35,28 @@ type WebStackNavigatorProps = {
32
35
  * Drop-in replacement for NativeStackNavigator on web.
33
36
  *
34
37
  * Uses the same router (StackRouter) and option shape as native-stack so
35
- * navigation behavior is identical; the difference is that overlay-type
36
- * presentations (modal, formSheet, ...) get peeled off the underlying view
37
- * and rendered via the configured Stack render component in WebStackView.
38
+ * navigation behavior is identical; the view renders the focused screen and
39
+ * delegates presentation chrome to Presentations.
38
40
  */
39
41
  function WebStackNavigator({
40
42
  initialRouteName,
41
43
  children,
42
44
  screenOptions,
45
+ headlessChildren,
43
46
  ...rest
44
47
  }: WebStackNavigatorProps) {
45
- const { state, navigation, descriptors, NavigationContent, describe } =
46
- useNavigationBuilder<
47
- StackNavigationState<ParamListBase>,
48
- StackRouterOptions,
49
- StackActionHelpers<ParamListBase>,
50
- NativeStackNavigationOptions,
51
- NativeStackNavigationEventMap
52
- >(StackRouter, {
53
- ...(rest as any),
54
- children,
55
- screenOptions,
56
- initialRouteName,
57
- })
48
+ const { state, navigation, descriptors, NavigationContent } = useNavigationBuilder<
49
+ StackNavigationState<ParamListBase>,
50
+ StackRouterOptions,
51
+ StackActionHelpers<ParamListBase>,
52
+ NativeStackNavigationOptions,
53
+ NativeStackNavigationEventMap
54
+ >(StackRouter, {
55
+ ...(rest as any),
56
+ children,
57
+ screenOptions,
58
+ initialRouteName,
59
+ })
58
60
 
59
61
  // Mirror native-stack tabPress popToTop behavior
60
62
  useEffect(() => {
@@ -78,7 +80,7 @@ function WebStackNavigator({
78
80
  state={state}
79
81
  navigation={navigation as any}
80
82
  descriptors={descriptors as any}
81
- describe={describe as any}
83
+ customChildren={headlessChildren}
82
84
  />
83
85
  </NavigationContent>
84
86
  )
@@ -1,47 +1,51 @@
1
1
  'use client'
2
2
 
3
+ import type { ParamListBase } from '@react-navigation/core'
3
4
  import {
4
5
  StackActions,
5
- type ParamListBase,
6
6
  type StackActionHelpers,
7
7
  type StackNavigationState,
8
- } from '@react-navigation/native'
8
+ } from '@react-navigation/routers'
9
9
  import type {
10
10
  NativeStackNavigationEventMap,
11
11
  NativeStackNavigationOptions,
12
12
  } from '@react-navigation/native-stack'
13
- import { NativeStackView } from '@react-navigation/native-stack'
14
13
  import {
14
+ Activity,
15
15
  Fragment,
16
16
  useCallback,
17
- useRef,
17
+ useEffect,
18
18
  useState,
19
19
  type ReactElement,
20
20
  type ReactNode,
21
21
  } from 'react'
22
+ import useLatestCallback from 'use-latest-callback'
22
23
 
24
+ import { devHeadlessNote } from '../../headless/devHeadlessNote'
25
+ import { useWebPresentations } from '../../headless/Presentations'
26
+ import type {
27
+ ModalPresentationOptions,
28
+ ScreenEntry,
29
+ SheetPresentationOptions,
30
+ WebPresentations,
31
+ } from '../../headless/types'
23
32
  import {
24
- convertStackStateToNonOverlayState,
25
- findLastNonOverlayIndex,
26
- isOverlayPresentation,
27
- } from './stackStateUtils'
28
- import {
29
- type StackRender,
30
- type StackRenderComponent,
31
- type StackRenderProps,
32
- useStackRender,
33
- } from './ScreenRenderContext'
33
+ StackStateProvider,
34
+ useStack,
35
+ type HeadlessStackDescriptors,
36
+ } from '../../headless/useStack'
37
+ import { findLastNonOverlayIndex } from './stackStateUtils'
34
38
 
35
- type RouteOptions = NativeStackNavigationOptions & {
36
- render?: StackRender
39
+ type RouteOptions = Omit<NativeStackNavigationOptions, 'presentation'> & {
37
40
  keepMounted?: boolean
41
+ presentation?: NativeStackNavigationOptions['presentation'] | 'sheet' | string
38
42
  }
39
43
 
40
44
  type Descriptors = Record<
41
45
  string,
42
46
  {
43
47
  options: RouteOptions
44
- render: () => ReactNode
48
+ render: () => ReactElement
45
49
  navigation: any
46
50
  }
47
51
  >
@@ -49,216 +53,172 @@ type Descriptors = Record<
49
53
  type WebStackViewProps = {
50
54
  state: StackNavigationState<ParamListBase>
51
55
  navigation: StackActionHelpers<ParamListBase> & {
56
+ goBack: () => void
52
57
  dispatch: (action: any) => void
53
58
  }
54
59
  descriptors: Descriptors
55
- describe?: (route: any, placeholder?: boolean) => any
60
+ customChildren?: ReactNode[]
56
61
  eventMap?: NativeStackNavigationEventMap
57
62
  }
58
63
 
59
- /**
60
- * Resolve which render component to use for an overlay route, in order:
61
- * 1. options.render?.web (per-route override)
62
- * 2. context.web (Stack-level default; also fed by setupRendering)
63
- * Returns undefined when neither is set.
64
- */
65
- export function resolveOverlayRender(
66
- options: RouteOptions | undefined,
67
- contextRender: StackRender | undefined
68
- ): StackRenderComponent | undefined {
69
- return options?.render?.web ?? contextRender?.web
70
- }
71
-
72
- type PersistentSlot = {
73
- routeName: string
74
- Render: StackRenderComponent
75
- options: RouteOptions
76
- content: ReactElement
77
- }
78
-
79
64
  export function WebStackView({
80
65
  state,
81
66
  navigation,
82
67
  descriptors,
83
- describe,
68
+ customChildren,
84
69
  }: WebStackViewProps) {
85
- const contextRender = useStackRender()
70
+ return (
71
+ <StackStateProvider state={state} descriptors={descriptors as HeadlessStackDescriptors}>
72
+ <HeadlessStackView
73
+ state={state}
74
+ navigation={navigation}
75
+ descriptors={descriptors}
76
+ customChildren={customChildren}
77
+ />
78
+ </StackStateProvider>
79
+ )
80
+ }
86
81
 
87
- // Persistent slots survive route pops for routes with `keepMounted: true`.
88
- // Keyed by route NAME (not key) so re-navigation reuses the same mount.
89
- const persistentSlotsRef = useRef<Map<string, PersistentSlot>>(new Map())
82
+ function HeadlessStackView({
83
+ state,
84
+ navigation,
85
+ descriptors,
86
+ customChildren,
87
+ }: WebStackViewProps) {
88
+ const stack = useStack()
89
+ const presentations = useWebPresentations()
90
90
 
91
- // Capture / refresh persistent slots from current descriptors.
92
- for (const route of state.routes) {
93
- const desc = descriptors[route.key]
94
- if (!desc) continue
95
- const { options } = desc
96
- if (!options.keepMounted) continue
97
- if (!isOverlayPresentation(options)) continue
98
- const Render = resolveOverlayRender(options, contextRender)
99
- if (!Render) continue
100
- if (persistentSlotsRef.current.has(route.name)) continue
101
- persistentSlotsRef.current.set(route.name, {
102
- routeName: route.name,
103
- Render,
104
- options,
105
- content: desc.render() as ReactElement,
106
- })
91
+ if (customChildren?.length) {
92
+ return <Fragment>{customChildren}</Fragment>
107
93
  }
108
94
 
109
- // Compute which routes are currently focused as overlays (trailing).
110
- const isOverlayCandidate = (options: NativeStackNavigationOptions | undefined | null) =>
111
- isOverlayPresentation(options) &&
112
- resolveOverlayRender(options ?? undefined, contextRender) !== undefined
95
+ devHeadlessNote('Stack')
113
96
 
114
- const nonOverlay = convertStackStateToNonOverlayState(
97
+ const lastBaseIndex = findLastNonOverlayIndex(
115
98
  state,
116
99
  descriptors,
117
- isOverlayCandidate
100
+ (options) => getPresentationType(options) !== undefined
118
101
  )
119
- const underlyingState = {
120
- ...state,
121
- routes: nonOverlay.routes,
122
- index: nonOverlay.index,
123
- } as StackNavigationState<ParamListBase>
124
-
125
- const lastNonOverlay = findLastNonOverlayIndex(state, descriptors, isOverlayCandidate)
126
- const trailingOverlays = state.routes.slice(lastNonOverlay + 1)
127
-
128
- // Track which route NAMES are currently focused as a trailing overlay, so
129
- // persistent slots know whether to be open or just kept-mounted-hidden.
130
- const focusedOverlayNames = new Set(trailingOverlays.map((r) => r.name))
131
-
132
- // Trailing overlays that AREN'T keepMounted render in the regular slot.
133
- const regularOverlays = trailingOverlays.filter(
134
- (r) => !descriptors[r.key]?.options.keepMounted
102
+ const baseRouteKeys = new Set(
103
+ state.routes.slice(0, lastBaseIndex + 1).map((route) => route.key)
135
104
  )
105
+ const baseFocusedKey = state.routes[lastBaseIndex]?.key
106
+ const overlayRoutes = state.routes.slice(lastBaseIndex + 1)
136
107
 
137
108
  return (
138
109
  <Fragment>
139
- <NativeStackView
140
- state={underlyingState}
141
- descriptors={descriptors as any}
142
- navigation={navigation as any}
143
- describe={describe as any}
144
- />
145
-
146
- {regularOverlays.map((route) => (
147
- <OverlayHost
148
- key={route.key}
149
- route={route}
150
- descriptor={descriptors[route.key]!}
151
- contextRender={contextRender}
152
- open
153
- onDismiss={() =>
154
- navigation.dispatch({
155
- ...StackActions.pop(),
156
- source: route.key,
157
- target: state.key,
158
- })
159
- }
160
- />
161
- ))}
162
-
163
- {/* Persistent slots - render once each, never unmount. `open` toggles
164
- based on whether the route is the current trailing overlay. */}
165
- {Array.from(persistentSlotsRef.current.values()).map((slot) => (
166
- <PersistentOverlayHost
167
- key={slot.routeName}
168
- slot={slot}
169
- open={focusedOverlayNames.has(slot.routeName)}
170
- onDismiss={() => {
171
- // Find the live route key for this name (if any) and pop it.
172
- const live = state.routes.find((r) => r.name === slot.routeName)
173
- if (live) {
110
+ {stack.screens.map((screen) => {
111
+ if (!baseRouteKeys.has(screen.key)) return null
112
+
113
+ if (screen.key === baseFocusedKey) {
114
+ return screen.keepMounted ? (
115
+ <Activity key={screen.key} mode="visible">
116
+ {screen.element}
117
+ </Activity>
118
+ ) : (
119
+ <Fragment key={screen.key}>{screen.element}</Fragment>
120
+ )
121
+ }
122
+
123
+ if (!screen.keepMounted) return null
124
+
125
+ return (
126
+ <Activity key={screen.key} mode="hidden">
127
+ {screen.element}
128
+ </Activity>
129
+ )
130
+ })}
131
+
132
+ {overlayRoutes.map((route) => {
133
+ const screen = stack.screens.find((entry) => entry.key === route.key)
134
+ const type = getPresentationType(descriptors[route.key]?.options)
135
+ if (!screen || !type) return null
136
+
137
+ return (
138
+ <PresentationScreen
139
+ key={route.key}
140
+ screen={screen}
141
+ type={type}
142
+ presentations={presentations}
143
+ onDismiss={() =>
174
144
  navigation.dispatch({
175
145
  ...StackActions.pop(),
176
- source: live.key,
146
+ source: route.key,
177
147
  target: state.key,
178
148
  })
179
149
  }
180
- }}
181
- />
182
- ))}
150
+ />
151
+ )
152
+ })}
183
153
  </Fragment>
184
154
  )
185
155
  }
186
156
 
187
- export function OverlayHost({
188
- route,
189
- descriptor,
190
- contextRender,
191
- open,
157
+ function PresentationScreen({
158
+ screen,
159
+ type,
160
+ presentations,
192
161
  onDismiss,
193
162
  }: {
194
- route: { key: string; name: string }
195
- descriptor: Descriptors[string]
196
- contextRender: StackRender | undefined
197
- open: boolean
163
+ screen: ScreenEntry
164
+ type: 'sheet' | 'modal'
165
+ presentations: WebPresentations | undefined
198
166
  onDismiss: () => void
199
167
  }) {
200
- const dismiss = useStableCallback(onDismiss)
201
-
202
- const options = descriptor.options
203
- const Render = resolveOverlayRender(options, contextRender)
204
- const content = descriptor.render()
205
-
206
- if (!Render || !isOverlayPresentation(options)) {
207
- return <Fragment>{content}</Fragment>
208
- }
209
-
210
- const renderProps: StackRenderProps = {
211
- routeKey: route.key,
212
- routeName: route.name,
213
- presentation: options.presentation!,
214
- open,
215
- dismiss,
216
- dismissible: options.gestureEnabled ?? true,
217
- sheetAllowedDetents: options.sheetAllowedDetents,
218
- sheetGrabberVisible: options.sheetGrabberVisible,
219
- sheetCornerRadius: options.sheetCornerRadius,
220
- sheetInitialDetentIndex: options.sheetInitialDetentIndex,
221
- sheetLargestUndimmedDetentIndex: options.sheetLargestUndimmedDetentIndex,
222
- sheetExpandsWhenScrolledToEdge: options.sheetExpandsWhenScrolledToEdge,
223
- children: content,
168
+ const dismiss = useLatestCallback(onDismiss)
169
+ const onOpenChange = useCallback(
170
+ (nextOpen: boolean) => {
171
+ if (!nextOpen) dismiss()
172
+ },
173
+ [dismiss]
174
+ )
175
+ // mount closed and open on the next commit, so sheet/modal components that
176
+ // animate on a false -> true transition still play their enter animation
177
+ const [open, setOpen] = useState(false)
178
+ useEffect(() => setOpen(true), [])
179
+
180
+ if (type === 'sheet') {
181
+ const Sheet = presentations?.sheet
182
+ if (!Sheet) return screen.element
183
+ return (
184
+ <Sheet
185
+ open={open}
186
+ onOpenChange={onOpenChange}
187
+ options={screen.options as SheetPresentationOptions}
188
+ screen={screen}
189
+ >
190
+ {screen.element}
191
+ </Sheet>
192
+ )
224
193
  }
225
194
 
226
- return <Render {...renderProps} />
195
+ const Modal = presentations?.modal
196
+ if (!Modal) return screen.element
197
+ return (
198
+ <Modal
199
+ open={open}
200
+ onOpenChange={onOpenChange}
201
+ options={screen.options as ModalPresentationOptions}
202
+ screen={screen}
203
+ >
204
+ {screen.element}
205
+ </Modal>
206
+ )
227
207
  }
228
208
 
229
- function PersistentOverlayHost({
230
- slot,
231
- open,
232
- onDismiss,
233
- }: {
234
- slot: PersistentSlot
235
- open: boolean
236
- onDismiss: () => void
237
- }) {
238
- const dismiss = useStableCallback(onDismiss)
239
- const { Render, options, content, routeName } = slot
240
-
241
- const renderProps: StackRenderProps = {
242
- routeKey: `__keepMounted:${routeName}`,
243
- routeName,
244
- presentation: options.presentation!,
245
- open,
246
- dismiss,
247
- dismissible: options.gestureEnabled ?? true,
248
- sheetAllowedDetents: options.sheetAllowedDetents,
249
- sheetGrabberVisible: options.sheetGrabberVisible,
250
- sheetCornerRadius: options.sheetCornerRadius,
251
- sheetInitialDetentIndex: options.sheetInitialDetentIndex,
252
- sheetLargestUndimmedDetentIndex: options.sheetLargestUndimmedDetentIndex,
253
- sheetExpandsWhenScrolledToEdge: options.sheetExpandsWhenScrolledToEdge,
254
- children: content,
209
+ function getPresentationType(
210
+ options: { presentation?: string } | undefined | null
211
+ ): 'sheet' | 'modal' | undefined {
212
+ const presentation = options?.presentation
213
+ if (!presentation || presentation === 'card' || presentation === 'push') {
214
+ return undefined
255
215
  }
256
-
257
- return <Render {...renderProps} />
258
- }
259
-
260
- function useStableCallback<T extends (...args: any[]) => any>(fn: T): T {
261
- const [ref] = useState(() => ({ current: fn }))
262
- ref.current = fn
263
- return useCallback(((...args: any[]) => ref.current(...args)) as T, [ref])
216
+ if (
217
+ presentation === 'sheet' ||
218
+ presentation === 'formSheet' ||
219
+ presentation === 'pageSheet'
220
+ ) {
221
+ return 'sheet'
222
+ }
223
+ return 'modal'
264
224
  }
@@ -13,7 +13,8 @@ const OVERLAY_PRESENTATIONS = [
13
13
 
14
14
  type OverlayPresentation = (typeof OVERLAY_PRESENTATIONS)[number]
15
15
 
16
- type DescriptorMap = Record<string, { options: NativeStackNavigationOptions }>
16
+ // structural minimum: callers pass descriptor maps with widened option types
17
+ type DescriptorMap = Record<string, { options: Record<string, any> }>
17
18
 
18
19
  export function isOverlayPresentation(
19
20
  options: NativeStackNavigationOptions | undefined | null