one 1.22.0 → 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 (691) 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/createApp.cjs +12 -35
  5. package/dist/cjs/createHandleRequest.cjs +4 -2
  6. package/dist/cjs/createHandleRequest.native.js +4 -2
  7. package/dist/cjs/createHandleRequest.native.js.map +1 -1
  8. package/dist/cjs/fallbackViews/Sitemap.cjs +123 -55
  9. package/dist/cjs/fallbackViews/Sitemap.native.js.map +1 -1
  10. package/dist/cjs/fallbackViews/Unmatched.cjs +92 -37
  11. package/dist/cjs/fallbackViews/Unmatched.native.js.map +1 -1
  12. package/dist/cjs/fork/NavigationContainer.cjs +4 -3
  13. package/dist/cjs/fork/NavigationContainer.native.js +4 -3
  14. package/dist/cjs/fork/NavigationContainer.native.js.map +1 -1
  15. package/dist/cjs/{router/renderingRegistry.cjs → fork/localeDirection.cjs} +6 -29
  16. package/dist/cjs/{router/web/ScreenRenderContext.cjs → fork/localeDirection.native.js} +10 -12
  17. package/dist/cjs/fork/localeDirection.native.js.map +1 -0
  18. package/dist/cjs/fork/theme.cjs +71 -0
  19. package/dist/cjs/{router/renderingRegistry.native.js → fork/theme.native.js} +7 -31
  20. package/dist/cjs/fork/theme.native.js.map +1 -0
  21. package/dist/cjs/headless/Presentations.cjs +51 -0
  22. package/dist/cjs/headless/Presentations.native.js +56 -0
  23. package/dist/cjs/headless/Presentations.native.js.map +1 -0
  24. package/dist/cjs/headless/children.cjs +43 -0
  25. package/dist/cjs/headless/children.native.js +46 -0
  26. package/dist/cjs/headless/children.native.js.map +1 -0
  27. package/dist/cjs/headless/devHeadlessNote.cjs +34 -0
  28. package/dist/cjs/{router/web/ScreenRenderContext.native.js → headless/devHeadlessNote.native.js} +11 -12
  29. package/dist/cjs/headless/devHeadlessNote.native.js.map +1 -0
  30. package/dist/cjs/headless/keepMounted.cjs +58 -0
  31. package/dist/cjs/headless/keepMounted.native.js +64 -0
  32. package/dist/cjs/headless/keepMounted.native.js.map +1 -0
  33. package/dist/cjs/headless/types.cjs +18 -0
  34. package/dist/cjs/headless/types.native.js +21 -0
  35. package/dist/cjs/headless/types.native.js.map +1 -0
  36. package/dist/cjs/headless/useDrawer.cjs +83 -0
  37. package/dist/cjs/headless/useDrawer.native.js +95 -0
  38. package/dist/cjs/headless/useDrawer.native.js.map +1 -0
  39. package/dist/cjs/headless/useStack.cjs +75 -0
  40. package/dist/cjs/headless/useStack.native.js +79 -0
  41. package/dist/cjs/headless/useStack.native.js.map +1 -0
  42. package/dist/cjs/headless/useTabs.cjs +62 -0
  43. package/dist/cjs/headless/useTabs.native.js +65 -0
  44. package/dist/cjs/headless/useTabs.native.js.map +1 -0
  45. package/dist/cjs/index.cjs +8 -3
  46. package/dist/cjs/index.native.js +8 -3
  47. package/dist/cjs/index.native.js.map +1 -1
  48. package/dist/cjs/layouts/Drawer.cjs +71 -42
  49. package/dist/cjs/layouts/Drawer.native.js +1 -25
  50. package/dist/cjs/layouts/Drawer.native.js.map +1 -1
  51. package/dist/cjs/layouts/Stack.cjs +9 -13
  52. package/dist/cjs/layouts/Stack.native.js +11 -13
  53. package/dist/cjs/layouts/Stack.native.js.map +1 -1
  54. package/dist/cjs/layouts/Tabs.cjs +104 -88
  55. package/dist/cjs/layouts/Tabs.native.js +1 -13
  56. package/dist/cjs/layouts/Tabs.native.js.map +1 -1
  57. package/dist/cjs/layouts/stack-navigator.cjs +10 -2
  58. package/dist/cjs/layouts/stack-navigator.native.js +5 -1
  59. package/dist/cjs/layouts/stack-navigator.native.js.map +1 -1
  60. package/dist/cjs/layouts/stack-utils/StackHeaderBackButton.cjs +4 -0
  61. package/dist/cjs/layouts/stack-utils/StackHeaderBackButton.native.js +4 -0
  62. package/dist/cjs/layouts/stack-utils/StackHeaderBackButton.native.js.map +1 -1
  63. package/dist/cjs/layouts/stack-utils/StackHeaderComponent.cjs +13 -9
  64. package/dist/cjs/layouts/stack-utils/StackHeaderComponent.native.js +13 -9
  65. package/dist/cjs/layouts/stack-utils/StackHeaderComponent.native.js.map +1 -1
  66. package/dist/cjs/layouts/stack-utils/StackHeaderLeft.cjs +4 -0
  67. package/dist/cjs/layouts/stack-utils/StackHeaderLeft.native.js +4 -0
  68. package/dist/cjs/layouts/stack-utils/StackHeaderLeft.native.js.map +1 -1
  69. package/dist/cjs/layouts/stack-utils/StackHeaderRight.cjs +4 -0
  70. package/dist/cjs/layouts/stack-utils/StackHeaderRight.native.js +4 -0
  71. package/dist/cjs/layouts/stack-utils/StackHeaderRight.native.js.map +1 -1
  72. package/dist/cjs/layouts/stack-utils/StackHeaderSearchBar.cjs +4 -0
  73. package/dist/cjs/layouts/stack-utils/StackHeaderSearchBar.native.js +4 -0
  74. package/dist/cjs/layouts/stack-utils/StackHeaderSearchBar.native.js.map +1 -1
  75. package/dist/cjs/layouts/stack-utils/StackHeaderTitle.cjs +8 -4
  76. package/dist/cjs/layouts/stack-utils/StackHeaderTitle.native.js +8 -4
  77. package/dist/cjs/layouts/stack-utils/StackHeaderTitle.native.js.map +1 -1
  78. package/dist/cjs/layouts/stack-utils/StackScreen.cjs +10 -23
  79. package/dist/cjs/layouts/stack-utils/StackScreen.native.js +21 -27
  80. package/dist/cjs/layouts/stack-utils/StackScreen.native.js.map +1 -1
  81. package/dist/cjs/layouts/stack-utils/__tests__/composition.test.cjs +11 -6
  82. package/dist/cjs/layouts/stack-utils/__tests__/composition.test.native.js +15 -6
  83. package/dist/cjs/layouts/stack-utils/__tests__/composition.test.native.js.map +1 -1
  84. package/dist/cjs/layouts/stack-utils/index.cjs +2 -0
  85. package/dist/cjs/layouts/stack-utils/index.native.js +2 -0
  86. package/dist/cjs/layouts/stack-utils/index.native.js.map +1 -1
  87. package/dist/cjs/layouts/withLayoutContext.cjs +2 -2
  88. package/dist/cjs/layouts/withLayoutContext.native.js +2 -2
  89. package/dist/cjs/layouts/withLayoutContext.native.js.map +1 -1
  90. package/dist/cjs/link/Link.cjs +55 -69
  91. package/dist/cjs/link/Link.native.js.map +1 -1
  92. package/dist/cjs/link/useLinkTo.cjs +3 -17
  93. package/dist/cjs/link/useLinkTo.native.js +1 -23
  94. package/dist/cjs/link/useLinkTo.native.js.map +1 -1
  95. package/dist/cjs/metro-config/withOne.test.native.js.map +1 -1
  96. package/dist/cjs/router/getRouteArtifactPath.test.native.js.map +1 -1
  97. package/dist/cjs/router/router.cjs +2 -2
  98. package/dist/cjs/router/router.native.js +2 -2
  99. package/dist/cjs/router/router.native.js.map +1 -1
  100. package/dist/cjs/router/useScreens.cjs +31 -72
  101. package/dist/cjs/router/useScreens.native.js +15 -71
  102. package/dist/cjs/router/useScreens.native.js.map +1 -1
  103. package/dist/cjs/router/web/WebStackNavigator.cjs +8 -7
  104. package/dist/cjs/router/web/WebStackNavigator.native.js +8 -7
  105. package/dist/cjs/router/web/WebStackNavigator.native.js.map +1 -1
  106. package/dist/cjs/router/web/WebStackView.cjs +108 -131
  107. package/dist/cjs/router/web/WebStackView.native.js +117 -176
  108. package/dist/cjs/router/web/WebStackView.native.js.map +1 -1
  109. package/dist/cjs/router/web/stackStateUtils.native.js.map +1 -1
  110. package/dist/cjs/screensFeatureFlags.cjs +1 -16
  111. package/dist/cjs/screensFeatureFlags.native.js +3 -3
  112. package/dist/cjs/screensFeatureFlags.native.js.map +1 -1
  113. package/dist/cjs/typed-routes/generateRouteTypes.cjs +3 -10
  114. package/dist/cjs/typed-routes/generateRouteTypes.native.js +3 -10
  115. package/dist/cjs/typed-routes/generateRouteTypes.native.js.map +1 -1
  116. package/dist/cjs/ui/Slot.cjs +4 -25
  117. package/dist/cjs/ui/Slot.native.js.map +1 -1
  118. package/dist/cjs/ui/TabList.cjs +7 -19
  119. package/dist/cjs/ui/TabList.native.js.map +1 -1
  120. package/dist/cjs/ui/TabSlot.cjs +15 -47
  121. package/dist/cjs/ui/TabSlot.native.js.map +1 -1
  122. package/dist/cjs/ui/TabTrigger.cjs +30 -134
  123. package/dist/cjs/ui/TabTrigger.native.js +14 -115
  124. package/dist/cjs/ui/TabTrigger.native.js.map +1 -1
  125. package/dist/cjs/ui/Tabs.cjs +15 -155
  126. package/dist/cjs/ui/Tabs.native.js +4 -144
  127. package/dist/cjs/ui/Tabs.native.js.map +1 -1
  128. package/dist/cjs/ui/Tabs.shared.cjs +160 -0
  129. package/dist/cjs/ui/Tabs.shared.native.js +174 -0
  130. package/dist/cjs/ui/Tabs.shared.native.js.map +1 -0
  131. package/dist/cjs/ui/useTabTrigger.cjs +122 -0
  132. package/dist/cjs/ui/useTabTrigger.native.js +125 -0
  133. package/dist/cjs/ui/useTabTrigger.native.js.map +1 -0
  134. package/dist/cjs/useBlocker.cjs +55 -93
  135. package/dist/cjs/utils/platform.cjs +28 -0
  136. package/dist/cjs/utils/platform.native.js +32 -0
  137. package/dist/cjs/utils/platform.native.js.map +1 -0
  138. package/dist/cjs/utils/routeIndex.cjs +80 -0
  139. package/dist/cjs/utils/routeIndex.native.js +86 -0
  140. package/dist/cjs/utils/routeIndex.native.js.map +1 -0
  141. package/dist/cjs/utils/routeIndex.test.cjs +51 -0
  142. package/dist/cjs/utils/routeIndex.test.native.js +54 -0
  143. package/dist/cjs/utils/routeIndex.test.native.js.map +1 -0
  144. package/dist/cjs/utils/style.cjs +21 -1
  145. package/dist/cjs/utils/style.native.js +40 -1
  146. package/dist/cjs/utils/style.native.js.map +1 -1
  147. package/dist/cjs/views/LoadProgressBar.cjs +59 -23
  148. package/dist/cjs/views/LoadProgressBar.native.js.map +1 -1
  149. package/dist/cjs/views/Protected.cjs +4 -0
  150. package/dist/cjs/views/Protected.native.js +4 -0
  151. package/dist/cjs/views/Protected.native.js.map +1 -1
  152. package/dist/cjs/views/RootErrorBoundary.cjs +107 -148
  153. package/dist/cjs/views/RootErrorBoundary.native.js +30 -140
  154. package/dist/cjs/views/RootErrorBoundary.native.js.map +1 -1
  155. package/dist/cjs/views/RouteErrorView.cjs +108 -0
  156. package/dist/cjs/views/RouteErrorView.native.js +110 -0
  157. package/dist/cjs/views/RouteErrorView.native.js.map +1 -0
  158. package/dist/cjs/views/Screen.cjs +5 -1
  159. package/dist/cjs/views/Screen.native.js +4 -0
  160. package/dist/cjs/views/Screen.native.js.map +1 -1
  161. package/dist/cjs/vite/getManifest.cjs +4 -20
  162. package/dist/cjs/vite/getManifest.native.js +4 -20
  163. package/dist/cjs/vite/getManifest.native.js.map +1 -1
  164. package/dist/cjs/vite/one.cjs +10 -45
  165. package/dist/cjs/vite/one.native.js +18 -55
  166. package/dist/cjs/vite/one.native.js.map +1 -1
  167. package/dist/cjs/vite/plugins/bundledDevPlugin.native.js.map +1 -1
  168. package/dist/cjs/vite/plugins/fileSystemRouterPlugin.cjs +10 -5
  169. package/dist/cjs/vite/plugins/fileSystemRouterPlugin.native.js +10 -5
  170. package/dist/cjs/vite/plugins/fileSystemRouterPlugin.native.js.map +1 -1
  171. package/dist/cjs/vite/plugins/fileSystemRouterPlugin.test.cjs +12 -2
  172. package/dist/cjs/vite/plugins/fileSystemRouterPlugin.test.native.js +12 -2
  173. package/dist/cjs/vite/plugins/fileSystemRouterPlugin.test.native.js.map +1 -1
  174. package/dist/cjs/vite/plugins/generateFileSystemRouteTypesPlugin.cjs +10 -6
  175. package/dist/cjs/vite/plugins/generateFileSystemRouteTypesPlugin.native.js +11 -7
  176. package/dist/cjs/vite/plugins/generateFileSystemRouteTypesPlugin.native.js.map +1 -1
  177. package/dist/cjs/vite/plugins/routeModuleHmrPlugin.cjs +79 -0
  178. package/dist/cjs/vite/plugins/routeModuleHmrPlugin.native.js +84 -0
  179. package/dist/cjs/vite/plugins/routeModuleHmrPlugin.native.js.map +1 -0
  180. package/dist/cjs/vite/plugins/routeModuleHmrPlugin.test.cjs +74 -0
  181. package/dist/cjs/vite/plugins/routeModuleHmrPlugin.test.native.js +83 -0
  182. package/dist/cjs/vite/plugins/routeModuleHmrPlugin.test.native.js.map +1 -0
  183. package/dist/cjs/vite/plugins/virtualEntryPlugin.cjs +2 -5
  184. package/dist/cjs/vite/plugins/virtualEntryPlugin.native.js +11 -10
  185. package/dist/cjs/vite/plugins/virtualEntryPlugin.native.js.map +1 -1
  186. package/dist/cjs/vite/plugins/virtualEntryPlugin.test.cjs +10 -2
  187. package/dist/cjs/vite/plugins/virtualEntryPlugin.test.native.js +14 -2
  188. package/dist/cjs/vite/plugins/virtualEntryPlugin.test.native.js.map +1 -1
  189. package/dist/esm/Root.mjs +1 -1
  190. package/dist/esm/Root.mjs.map +1 -1
  191. package/dist/esm/Root.native.js +1 -1
  192. package/dist/esm/Root.native.js.map +1 -1
  193. package/dist/esm/createApp.mjs +12 -35
  194. package/dist/esm/createApp.mjs.map +1 -1
  195. package/dist/esm/createHandleRequest.mjs +4 -2
  196. package/dist/esm/createHandleRequest.mjs.map +1 -1
  197. package/dist/esm/createHandleRequest.native.js +4 -2
  198. package/dist/esm/createHandleRequest.native.js.map +1 -1
  199. package/dist/esm/fallbackViews/Sitemap.mjs +110 -53
  200. package/dist/esm/fallbackViews/Sitemap.mjs.map +1 -1
  201. package/dist/esm/fallbackViews/Sitemap.native.js.map +1 -1
  202. package/dist/esm/fallbackViews/Unmatched.mjs +89 -34
  203. package/dist/esm/fallbackViews/Unmatched.mjs.map +1 -1
  204. package/dist/esm/fallbackViews/Unmatched.native.js.map +1 -1
  205. package/dist/esm/fork/NavigationContainer.mjs +4 -3
  206. package/dist/esm/fork/NavigationContainer.mjs.map +1 -1
  207. package/dist/esm/fork/NavigationContainer.native.js +4 -3
  208. package/dist/esm/fork/NavigationContainer.native.js.map +1 -1
  209. package/dist/esm/fork/localeDirection.mjs +5 -0
  210. package/dist/esm/fork/localeDirection.mjs.map +1 -0
  211. package/dist/esm/fork/localeDirection.native.js +6 -0
  212. package/dist/esm/fork/localeDirection.native.js.map +1 -0
  213. package/dist/esm/fork/theme.mjs +45 -0
  214. package/dist/esm/fork/theme.mjs.map +1 -0
  215. package/dist/esm/fork/theme.native.js +3 -0
  216. package/dist/esm/fork/theme.native.js.map +1 -0
  217. package/dist/esm/headless/Presentations.mjs +25 -0
  218. package/dist/esm/headless/Presentations.mjs.map +1 -0
  219. package/dist/esm/headless/Presentations.native.js +28 -0
  220. package/dist/esm/headless/Presentations.native.js.map +1 -0
  221. package/dist/esm/headless/children.mjs +16 -0
  222. package/dist/esm/headless/children.mjs.map +1 -0
  223. package/dist/esm/headless/children.native.js +16 -0
  224. package/dist/esm/headless/children.native.js.map +1 -0
  225. package/dist/esm/headless/devHeadlessNote.mjs +9 -0
  226. package/dist/esm/headless/devHeadlessNote.mjs.map +1 -0
  227. package/dist/esm/headless/devHeadlessNote.native.js +9 -0
  228. package/dist/esm/headless/devHeadlessNote.native.js.map +1 -0
  229. package/dist/esm/headless/keepMounted.mjs +32 -0
  230. package/dist/esm/headless/keepMounted.mjs.map +1 -0
  231. package/dist/esm/headless/keepMounted.native.js +36 -0
  232. package/dist/esm/headless/keepMounted.native.js.map +1 -0
  233. package/dist/esm/headless/types.mjs +2 -0
  234. package/dist/esm/headless/types.mjs.map +1 -0
  235. package/dist/esm/headless/types.native.js +2 -0
  236. package/dist/esm/headless/types.native.js.map +1 -0
  237. package/dist/esm/headless/useDrawer.mjs +57 -0
  238. package/dist/esm/headless/useDrawer.mjs.map +1 -0
  239. package/dist/esm/headless/useDrawer.native.js +67 -0
  240. package/dist/esm/headless/useDrawer.native.js.map +1 -0
  241. package/dist/esm/headless/useStack.mjs +49 -0
  242. package/dist/esm/headless/useStack.mjs.map +1 -0
  243. package/dist/esm/headless/useStack.native.js +51 -0
  244. package/dist/esm/headless/useStack.native.js.map +1 -0
  245. package/dist/esm/headless/useTabs.mjs +37 -0
  246. package/dist/esm/headless/useTabs.mjs.map +1 -0
  247. package/dist/esm/headless/useTabs.native.js +38 -0
  248. package/dist/esm/headless/useTabs.native.js.map +1 -0
  249. package/dist/esm/index.js +5 -2
  250. package/dist/esm/index.js.map +1 -1
  251. package/dist/esm/index.mjs +5 -2
  252. package/dist/esm/index.mjs.map +1 -1
  253. package/dist/esm/index.native.js +5 -2
  254. package/dist/esm/index.native.js.map +1 -1
  255. package/dist/esm/layouts/Drawer.mjs +69 -29
  256. package/dist/esm/layouts/Drawer.mjs.map +1 -1
  257. package/dist/esm/layouts/Drawer.native.js +2 -26
  258. package/dist/esm/layouts/Drawer.native.js.map +1 -1
  259. package/dist/esm/layouts/Stack.mjs +10 -14
  260. package/dist/esm/layouts/Stack.mjs.map +1 -1
  261. package/dist/esm/layouts/Stack.native.js +12 -14
  262. package/dist/esm/layouts/Stack.native.js.map +1 -1
  263. package/dist/esm/layouts/Tabs.mjs +101 -74
  264. package/dist/esm/layouts/Tabs.mjs.map +1 -1
  265. package/dist/esm/layouts/Tabs.native.js +2 -14
  266. package/dist/esm/layouts/Tabs.native.js.map +1 -1
  267. package/dist/esm/layouts/stack-navigator.mjs +8 -1
  268. package/dist/esm/layouts/stack-navigator.mjs.map +1 -1
  269. package/dist/esm/layouts/stack-navigator.native.js +4 -1
  270. package/dist/esm/layouts/stack-navigator.native.js.map +1 -1
  271. package/dist/esm/layouts/stack-utils/StackHeaderBackButton.mjs +4 -0
  272. package/dist/esm/layouts/stack-utils/StackHeaderBackButton.mjs.map +1 -1
  273. package/dist/esm/layouts/stack-utils/StackHeaderBackButton.native.js +4 -0
  274. package/dist/esm/layouts/stack-utils/StackHeaderBackButton.native.js.map +1 -1
  275. package/dist/esm/layouts/stack-utils/StackHeaderComponent.mjs +7 -3
  276. package/dist/esm/layouts/stack-utils/StackHeaderComponent.mjs.map +1 -1
  277. package/dist/esm/layouts/stack-utils/StackHeaderComponent.native.js +7 -3
  278. package/dist/esm/layouts/stack-utils/StackHeaderComponent.native.js.map +1 -1
  279. package/dist/esm/layouts/stack-utils/StackHeaderLeft.mjs +4 -0
  280. package/dist/esm/layouts/stack-utils/StackHeaderLeft.mjs.map +1 -1
  281. package/dist/esm/layouts/stack-utils/StackHeaderLeft.native.js +4 -0
  282. package/dist/esm/layouts/stack-utils/StackHeaderLeft.native.js.map +1 -1
  283. package/dist/esm/layouts/stack-utils/StackHeaderRight.mjs +4 -0
  284. package/dist/esm/layouts/stack-utils/StackHeaderRight.mjs.map +1 -1
  285. package/dist/esm/layouts/stack-utils/StackHeaderRight.native.js +4 -0
  286. package/dist/esm/layouts/stack-utils/StackHeaderRight.native.js.map +1 -1
  287. package/dist/esm/layouts/stack-utils/StackHeaderSearchBar.mjs +4 -0
  288. package/dist/esm/layouts/stack-utils/StackHeaderSearchBar.mjs.map +1 -1
  289. package/dist/esm/layouts/stack-utils/StackHeaderSearchBar.native.js +4 -0
  290. package/dist/esm/layouts/stack-utils/StackHeaderSearchBar.native.js.map +1 -1
  291. package/dist/esm/layouts/stack-utils/StackHeaderTitle.mjs +9 -5
  292. package/dist/esm/layouts/stack-utils/StackHeaderTitle.mjs.map +1 -1
  293. package/dist/esm/layouts/stack-utils/StackHeaderTitle.native.js +9 -5
  294. package/dist/esm/layouts/stack-utils/StackHeaderTitle.native.js.map +1 -1
  295. package/dist/esm/layouts/stack-utils/StackScreen.mjs +10 -23
  296. package/dist/esm/layouts/stack-utils/StackScreen.mjs.map +1 -1
  297. package/dist/esm/layouts/stack-utils/StackScreen.native.js +23 -29
  298. package/dist/esm/layouts/stack-utils/StackScreen.native.js.map +1 -1
  299. package/dist/esm/layouts/stack-utils/__tests__/composition.test.mjs +12 -7
  300. package/dist/esm/layouts/stack-utils/__tests__/composition.test.mjs.map +1 -1
  301. package/dist/esm/layouts/stack-utils/__tests__/composition.test.native.js +16 -7
  302. package/dist/esm/layouts/stack-utils/__tests__/composition.test.native.js.map +1 -1
  303. package/dist/esm/layouts/stack-utils/index.mjs +2 -0
  304. package/dist/esm/layouts/stack-utils/index.mjs.map +1 -1
  305. package/dist/esm/layouts/stack-utils/index.native.js +2 -0
  306. package/dist/esm/layouts/stack-utils/index.native.js.map +1 -1
  307. package/dist/esm/layouts/withLayoutContext.mjs +2 -2
  308. package/dist/esm/layouts/withLayoutContext.mjs.map +1 -1
  309. package/dist/esm/layouts/withLayoutContext.native.js +2 -2
  310. package/dist/esm/layouts/withLayoutContext.native.js.map +1 -1
  311. package/dist/esm/link/Link.mjs +57 -68
  312. package/dist/esm/link/Link.mjs.map +1 -1
  313. package/dist/esm/link/useLinkTo.mjs +4 -19
  314. package/dist/esm/link/useLinkTo.mjs.map +1 -1
  315. package/dist/esm/link/useLinkTo.native.js +2 -25
  316. package/dist/esm/link/useLinkTo.native.js.map +1 -1
  317. package/dist/esm/metro-config/withOne.test.mjs.map +1 -1
  318. package/dist/esm/metro-config/withOne.test.native.js.map +1 -1
  319. package/dist/esm/router/getRouteArtifactPath.test.mjs.map +1 -1
  320. package/dist/esm/router/getRouteArtifactPath.test.native.js.map +1 -1
  321. package/dist/esm/router/router.mjs +2 -2
  322. package/dist/esm/router/router.mjs.map +1 -1
  323. package/dist/esm/router/router.native.js +2 -2
  324. package/dist/esm/router/router.native.js.map +1 -1
  325. package/dist/esm/router/useScreens.mjs +30 -71
  326. package/dist/esm/router/useScreens.mjs.map +1 -1
  327. package/dist/esm/router/useScreens.native.js +13 -69
  328. package/dist/esm/router/useScreens.native.js.map +1 -1
  329. package/dist/esm/router/web/WebStackNavigator.mjs +5 -4
  330. package/dist/esm/router/web/WebStackNavigator.mjs.map +1 -1
  331. package/dist/esm/router/web/WebStackNavigator.native.js +5 -4
  332. package/dist/esm/router/web/WebStackNavigator.native.js.map +1 -1
  333. package/dist/esm/router/web/WebStackView.mjs +99 -131
  334. package/dist/esm/router/web/WebStackView.mjs.map +1 -1
  335. package/dist/esm/router/web/WebStackView.native.js +107 -175
  336. package/dist/esm/router/web/WebStackView.native.js.map +1 -1
  337. package/dist/esm/router/web/stackStateUtils.mjs.map +1 -1
  338. package/dist/esm/router/web/stackStateUtils.native.js.map +1 -1
  339. package/dist/esm/screensFeatureFlags.mjs +1 -16
  340. package/dist/esm/screensFeatureFlags.mjs.map +1 -1
  341. package/dist/esm/screensFeatureFlags.native.js.map +1 -1
  342. package/dist/esm/typed-routes/generateRouteTypes.mjs +3 -10
  343. package/dist/esm/typed-routes/generateRouteTypes.mjs.map +1 -1
  344. package/dist/esm/typed-routes/generateRouteTypes.native.js +3 -10
  345. package/dist/esm/typed-routes/generateRouteTypes.native.js.map +1 -1
  346. package/dist/esm/ui/Slot.mjs +1 -22
  347. package/dist/esm/ui/Slot.mjs.map +1 -1
  348. package/dist/esm/ui/Slot.native.js.map +1 -1
  349. package/dist/esm/ui/TabList.mjs +3 -15
  350. package/dist/esm/ui/TabList.mjs.map +1 -1
  351. package/dist/esm/ui/TabList.native.js.map +1 -1
  352. package/dist/esm/ui/TabSlot.mjs +12 -44
  353. package/dist/esm/ui/TabSlot.mjs.map +1 -1
  354. package/dist/esm/ui/TabSlot.native.js.map +1 -1
  355. package/dist/esm/ui/TabTrigger.mjs +25 -129
  356. package/dist/esm/ui/TabTrigger.mjs.map +1 -1
  357. package/dist/esm/ui/TabTrigger.native.js +13 -114
  358. package/dist/esm/ui/TabTrigger.native.js.map +1 -1
  359. package/dist/esm/ui/Tabs.mjs +7 -145
  360. package/dist/esm/ui/Tabs.mjs.map +1 -1
  361. package/dist/esm/ui/Tabs.native.js +5 -143
  362. package/dist/esm/ui/Tabs.native.js.map +1 -1
  363. package/dist/esm/ui/Tabs.shared.mjs +134 -0
  364. package/dist/esm/ui/Tabs.shared.mjs.map +1 -0
  365. package/dist/esm/ui/Tabs.shared.native.js +145 -0
  366. package/dist/esm/ui/Tabs.shared.native.js.map +1 -0
  367. package/dist/esm/ui/useTabTrigger.mjs +96 -0
  368. package/dist/esm/ui/useTabTrigger.mjs.map +1 -0
  369. package/dist/esm/ui/useTabTrigger.native.js +96 -0
  370. package/dist/esm/ui/useTabTrigger.native.js.map +1 -0
  371. package/dist/esm/useBlocker.mjs +55 -93
  372. package/dist/esm/useBlocker.mjs.map +1 -1
  373. package/dist/esm/utils/platform.mjs +3 -0
  374. package/dist/esm/utils/platform.mjs.map +1 -0
  375. package/dist/esm/utils/platform.native.js +4 -0
  376. package/dist/esm/utils/platform.native.js.map +1 -0
  377. package/dist/esm/utils/routeIndex.mjs +43 -0
  378. package/dist/esm/utils/routeIndex.mjs.map +1 -0
  379. package/dist/esm/utils/routeIndex.native.js +46 -0
  380. package/dist/esm/utils/routeIndex.native.js.map +1 -0
  381. package/dist/esm/utils/routeIndex.test.mjs +52 -0
  382. package/dist/esm/utils/routeIndex.test.mjs.map +1 -0
  383. package/dist/esm/utils/routeIndex.test.native.js +52 -0
  384. package/dist/esm/utils/routeIndex.test.native.js.map +1 -0
  385. package/dist/esm/utils/style.mjs +20 -1
  386. package/dist/esm/utils/style.mjs.map +1 -1
  387. package/dist/esm/utils/style.native.js +39 -1
  388. package/dist/esm/utils/style.native.js.map +1 -1
  389. package/dist/esm/views/LoadProgressBar.mjs +45 -20
  390. package/dist/esm/views/LoadProgressBar.mjs.map +1 -1
  391. package/dist/esm/views/LoadProgressBar.native.js.map +1 -1
  392. package/dist/esm/views/Protected.mjs +4 -0
  393. package/dist/esm/views/Protected.mjs.map +1 -1
  394. package/dist/esm/views/Protected.native.js +4 -0
  395. package/dist/esm/views/Protected.native.js.map +1 -1
  396. package/dist/esm/views/RootErrorBoundary.mjs +106 -147
  397. package/dist/esm/views/RootErrorBoundary.mjs.map +1 -1
  398. package/dist/esm/views/RootErrorBoundary.native.js +37 -145
  399. package/dist/esm/views/RootErrorBoundary.native.js.map +1 -1
  400. package/dist/esm/views/RouteErrorView.mjs +83 -0
  401. package/dist/esm/views/RouteErrorView.mjs.map +1 -0
  402. package/dist/esm/views/RouteErrorView.native.js +82 -0
  403. package/dist/esm/views/RouteErrorView.native.js.map +1 -0
  404. package/dist/esm/views/Screen.mjs +4 -0
  405. package/dist/esm/views/Screen.mjs.map +1 -1
  406. package/dist/esm/views/Screen.native.js +4 -0
  407. package/dist/esm/views/Screen.native.js.map +1 -1
  408. package/dist/esm/vite/getManifest.mjs +4 -9
  409. package/dist/esm/vite/getManifest.mjs.map +1 -1
  410. package/dist/esm/vite/getManifest.native.js +4 -9
  411. package/dist/esm/vite/getManifest.native.js.map +1 -1
  412. package/dist/esm/vite/one.mjs +10 -45
  413. package/dist/esm/vite/one.mjs.map +1 -1
  414. package/dist/esm/vite/one.native.js +18 -55
  415. package/dist/esm/vite/one.native.js.map +1 -1
  416. package/dist/esm/vite/plugins/bundledDevPlugin.mjs.map +1 -1
  417. package/dist/esm/vite/plugins/bundledDevPlugin.native.js.map +1 -1
  418. package/dist/esm/vite/plugins/fileSystemRouterPlugin.mjs +10 -5
  419. package/dist/esm/vite/plugins/fileSystemRouterPlugin.mjs.map +1 -1
  420. package/dist/esm/vite/plugins/fileSystemRouterPlugin.native.js +10 -5
  421. package/dist/esm/vite/plugins/fileSystemRouterPlugin.native.js.map +1 -1
  422. package/dist/esm/vite/plugins/fileSystemRouterPlugin.test.mjs +12 -2
  423. package/dist/esm/vite/plugins/fileSystemRouterPlugin.test.mjs.map +1 -1
  424. package/dist/esm/vite/plugins/fileSystemRouterPlugin.test.native.js +12 -2
  425. package/dist/esm/vite/plugins/fileSystemRouterPlugin.test.native.js.map +1 -1
  426. package/dist/esm/vite/plugins/generateFileSystemRouteTypesPlugin.mjs +10 -6
  427. package/dist/esm/vite/plugins/generateFileSystemRouteTypesPlugin.mjs.map +1 -1
  428. package/dist/esm/vite/plugins/generateFileSystemRouteTypesPlugin.native.js +11 -7
  429. package/dist/esm/vite/plugins/generateFileSystemRouteTypesPlugin.native.js.map +1 -1
  430. package/dist/esm/vite/plugins/routeModuleHmrPlugin.mjs +43 -0
  431. package/dist/esm/vite/plugins/routeModuleHmrPlugin.mjs.map +1 -0
  432. package/dist/esm/vite/plugins/routeModuleHmrPlugin.native.js +45 -0
  433. package/dist/esm/vite/plugins/routeModuleHmrPlugin.native.js.map +1 -0
  434. package/dist/esm/vite/plugins/routeModuleHmrPlugin.test.mjs +75 -0
  435. package/dist/esm/vite/plugins/routeModuleHmrPlugin.test.mjs.map +1 -0
  436. package/dist/esm/vite/plugins/routeModuleHmrPlugin.test.native.js +81 -0
  437. package/dist/esm/vite/plugins/routeModuleHmrPlugin.test.native.js.map +1 -0
  438. package/dist/esm/vite/plugins/virtualEntryPlugin.mjs +2 -5
  439. package/dist/esm/vite/plugins/virtualEntryPlugin.mjs.map +1 -1
  440. package/dist/esm/vite/plugins/virtualEntryPlugin.native.js +11 -10
  441. package/dist/esm/vite/plugins/virtualEntryPlugin.native.js.map +1 -1
  442. package/dist/esm/vite/plugins/virtualEntryPlugin.test.mjs +10 -2
  443. package/dist/esm/vite/plugins/virtualEntryPlugin.test.mjs.map +1 -1
  444. package/dist/esm/vite/plugins/virtualEntryPlugin.test.native.js +14 -2
  445. package/dist/esm/vite/plugins/virtualEntryPlugin.test.native.js.map +1 -1
  446. package/package.json +9 -10
  447. package/src/Root.tsx +2 -6
  448. package/src/createApp.tsx +15 -42
  449. package/src/createHandleRequest.ts +6 -2
  450. package/src/fallbackViews/Sitemap.web.tsx +149 -0
  451. package/src/fallbackViews/Unmatched.web.tsx +91 -0
  452. package/src/fork/NavigationContainer.tsx +3 -3
  453. package/src/fork/localeDirection.native.ts +6 -0
  454. package/src/fork/localeDirection.ts +11 -0
  455. package/src/fork/theme.native.ts +1 -0
  456. package/src/fork/theme.ts +41 -0
  457. package/src/headless/Presentations.tsx +37 -0
  458. package/src/headless/children.ts +25 -0
  459. package/src/headless/devHeadlessNote.ts +13 -0
  460. package/src/headless/keepMounted.tsx +46 -0
  461. package/src/headless/types.ts +72 -0
  462. package/src/headless/useDrawer.tsx +88 -0
  463. package/src/headless/useStack.ts +74 -0
  464. package/src/headless/useTabs.ts +40 -0
  465. package/src/index.ts +14 -18
  466. package/src/layouts/Drawer.tsx +4 -35
  467. package/src/layouts/Drawer.web.tsx +117 -0
  468. package/src/layouts/Stack.tsx +54 -62
  469. package/src/layouts/Tabs.tsx +6 -32
  470. package/src/layouts/Tabs.web.tsx +151 -0
  471. package/src/layouts/stack-navigator.ts +6 -2
  472. package/src/layouts/stack-navigator.web.ts +8 -0
  473. package/src/layouts/stack-utils/StackHeaderBackButton.tsx +4 -0
  474. package/src/layouts/stack-utils/StackHeaderComponent.tsx +7 -3
  475. package/src/layouts/stack-utils/StackHeaderLeft.tsx +4 -0
  476. package/src/layouts/stack-utils/StackHeaderRight.tsx +4 -0
  477. package/src/layouts/stack-utils/StackHeaderSearchBar.tsx +4 -0
  478. package/src/layouts/stack-utils/StackHeaderTitle.tsx +9 -5
  479. package/src/layouts/stack-utils/StackScreen.tsx +31 -36
  480. package/src/layouts/stack-utils/__tests__/composition.test.tsx +12 -11
  481. package/src/layouts/stack-utils/index.tsx +2 -0
  482. package/src/layouts/withLayoutContext.tsx +5 -2
  483. package/src/link/Link.web.tsx +84 -0
  484. package/src/link/useLinkTo.tsx +2 -2
  485. package/src/metro-config/withOne.test.ts +1 -3
  486. package/src/router/getRouteArtifactPath.test.ts +1 -6
  487. package/src/router/router.ts +2 -2
  488. package/src/router/useScreens.tsx +31 -71
  489. package/src/router/web/WebStackNavigator.tsx +22 -20
  490. package/src/router/web/WebStackView.tsx +148 -188
  491. package/src/router/web/stackStateUtils.ts +2 -1
  492. package/src/screensFeatureFlags.native.ts +23 -0
  493. package/src/screensFeatureFlags.ts +3 -23
  494. package/src/typed-routes/generateRouteTypes.ts +4 -10
  495. package/src/ui/Slot.web.tsx +9 -0
  496. package/src/ui/TabList.web.tsx +27 -0
  497. package/src/ui/TabSlot.web.tsx +90 -0
  498. package/src/ui/TabTrigger.tsx +33 -249
  499. package/src/ui/TabTrigger.web.tsx +71 -0
  500. package/src/ui/Tabs.shared.tsx +230 -0
  501. package/src/ui/Tabs.tsx +5 -295
  502. package/src/ui/Tabs.web.tsx +40 -0
  503. package/src/ui/useTabTrigger.ts +182 -0
  504. package/src/useBlocker.ts +2 -3
  505. package/src/utils/platform.ts +7 -0
  506. package/src/utils/platform.web.ts +1 -0
  507. package/src/utils/routeIndex.test.ts +55 -0
  508. package/src/utils/routeIndex.ts +59 -0
  509. package/src/utils/style.ts +22 -1
  510. package/src/views/LoadProgressBar.web.tsx +135 -0
  511. package/src/views/Protected.tsx +4 -1
  512. package/src/views/RootErrorBoundary.tsx +2 -158
  513. package/src/views/RootErrorBoundary.web.tsx +163 -0
  514. package/src/views/RouteErrorView.tsx +66 -0
  515. package/src/views/RouteErrorView.web.tsx +62 -0
  516. package/src/views/Screen.tsx +3 -0
  517. package/src/vite/getManifest.ts +4 -6
  518. package/src/vite/one.ts +10 -59
  519. package/src/vite/plugins/bundledDevPlugin.ts +4 -1
  520. package/src/vite/plugins/fileSystemRouterPlugin.test.ts +19 -11
  521. package/src/vite/plugins/fileSystemRouterPlugin.tsx +17 -5
  522. package/src/vite/plugins/generateFileSystemRouteTypesPlugin.tsx +22 -11
  523. package/src/vite/plugins/routeModuleHmrPlugin.test.ts +73 -0
  524. package/src/vite/plugins/routeModuleHmrPlugin.ts +54 -0
  525. package/src/vite/plugins/virtualEntryPlugin.test.ts +10 -1
  526. package/src/vite/plugins/virtualEntryPlugin.ts +10 -9
  527. package/types/Root.d.ts +1 -1
  528. package/types/Root.d.ts.map +1 -1
  529. package/types/createApp.d.ts.map +1 -1
  530. package/types/createHandleRequest.d.ts +2 -1
  531. package/types/createHandleRequest.d.ts.map +1 -1
  532. package/types/fallbackViews/Sitemap.web.d.ts +4 -0
  533. package/types/fallbackViews/Sitemap.web.d.ts.map +1 -0
  534. package/types/fallbackViews/Unmatched.web.d.ts +2 -0
  535. package/types/fallbackViews/Unmatched.web.d.ts.map +1 -0
  536. package/types/fork/NavigationContainer.d.ts.map +1 -1
  537. package/types/fork/localeDirection.d.ts +9 -0
  538. package/types/fork/localeDirection.d.ts.map +1 -0
  539. package/types/fork/localeDirection.native.d.ts +3 -0
  540. package/types/fork/localeDirection.native.d.ts.map +1 -0
  541. package/types/fork/theme.d.ts +4 -0
  542. package/types/fork/theme.d.ts.map +1 -0
  543. package/types/fork/theme.native.d.ts +2 -0
  544. package/types/fork/theme.native.d.ts.map +1 -0
  545. package/types/headless/Presentations.d.ts +13 -0
  546. package/types/headless/Presentations.d.ts.map +1 -0
  547. package/types/headless/children.d.ts +5 -0
  548. package/types/headless/children.d.ts.map +1 -0
  549. package/types/headless/devHeadlessNote.d.ts +2 -0
  550. package/types/headless/devHeadlessNote.d.ts.map +1 -0
  551. package/types/headless/keepMounted.d.ts +9 -0
  552. package/types/headless/keepMounted.d.ts.map +1 -0
  553. package/types/headless/types.d.ts +59 -0
  554. package/types/headless/types.d.ts.map +1 -0
  555. package/types/headless/useDrawer.d.ts +19 -0
  556. package/types/headless/useDrawer.d.ts.map +1 -0
  557. package/types/headless/useStack.d.ts +16 -0
  558. package/types/headless/useStack.d.ts.map +1 -0
  559. package/types/headless/useTabs.d.ts +3 -0
  560. package/types/headless/useTabs.d.ts.map +1 -0
  561. package/types/index.d.ts +6 -2
  562. package/types/index.d.ts.map +1 -1
  563. package/types/layouts/Drawer.d.ts +1 -11
  564. package/types/layouts/Drawer.d.ts.map +1 -1
  565. package/types/layouts/Drawer.web.d.ts +5 -0
  566. package/types/layouts/Drawer.web.d.ts.map +1 -0
  567. package/types/layouts/Stack.d.ts +4 -13
  568. package/types/layouts/Stack.d.ts.map +1 -1
  569. package/types/layouts/Tabs.d.ts +1 -11
  570. package/types/layouts/Tabs.d.ts.map +1 -1
  571. package/types/layouts/Tabs.web.d.ts +20 -0
  572. package/types/layouts/Tabs.web.d.ts.map +1 -0
  573. package/types/layouts/stack-navigator.d.ts +3 -2
  574. package/types/layouts/stack-navigator.d.ts.map +1 -1
  575. package/types/layouts/stack-navigator.web.d.ts +6 -0
  576. package/types/layouts/stack-navigator.web.d.ts.map +1 -1
  577. package/types/layouts/stack-utils/StackHeaderBackButton.d.ts.map +1 -1
  578. package/types/layouts/stack-utils/StackHeaderComponent.d.ts +1 -1
  579. package/types/layouts/stack-utils/StackHeaderComponent.d.ts.map +1 -1
  580. package/types/layouts/stack-utils/StackHeaderLeft.d.ts.map +1 -1
  581. package/types/layouts/stack-utils/StackHeaderRight.d.ts.map +1 -1
  582. package/types/layouts/stack-utils/StackHeaderSearchBar.d.ts.map +1 -1
  583. package/types/layouts/stack-utils/StackHeaderTitle.d.ts +1 -1
  584. package/types/layouts/stack-utils/StackHeaderTitle.d.ts.map +1 -1
  585. package/types/layouts/stack-utils/StackScreen.d.ts +5 -12
  586. package/types/layouts/stack-utils/StackScreen.d.ts.map +1 -1
  587. package/types/layouts/stack-utils/index.d.ts +1 -0
  588. package/types/layouts/stack-utils/index.d.ts.map +1 -1
  589. package/types/layouts/withLayoutContext.d.ts.map +1 -1
  590. package/types/link/Link.web.d.ts +3 -0
  591. package/types/link/Link.web.d.ts.map +1 -0
  592. package/types/link/useLinkTo.d.ts +1 -1
  593. package/types/link/useLinkTo.d.ts.map +1 -1
  594. package/types/router/router.d.ts.map +1 -1
  595. package/types/router/useScreens.d.ts.map +1 -1
  596. package/types/router/web/WebStackNavigator.d.ts.map +1 -1
  597. package/types/router/web/WebStackView.d.ts +9 -25
  598. package/types/router/web/WebStackView.d.ts.map +1 -1
  599. package/types/router/web/stackStateUtils.d.ts +1 -1
  600. package/types/router/web/stackStateUtils.d.ts.map +1 -1
  601. package/types/screensFeatureFlags.d.ts.map +1 -1
  602. package/types/screensFeatureFlags.native.d.ts +2 -0
  603. package/types/screensFeatureFlags.native.d.ts.map +1 -0
  604. package/types/typed-routes/generateRouteTypes.d.ts +1 -1
  605. package/types/typed-routes/generateRouteTypes.d.ts.map +1 -1
  606. package/types/ui/Slot.web.d.ts +5 -0
  607. package/types/ui/Slot.web.d.ts.map +1 -0
  608. package/types/ui/TabList.web.d.ts +11 -0
  609. package/types/ui/TabList.web.d.ts.map +1 -0
  610. package/types/ui/TabSlot.web.d.ts +24 -0
  611. package/types/ui/TabSlot.web.d.ts.map +1 -0
  612. package/types/ui/TabTrigger.d.ts +4 -75
  613. package/types/ui/TabTrigger.d.ts.map +1 -1
  614. package/types/ui/TabTrigger.web.d.ts +11 -0
  615. package/types/ui/TabTrigger.web.d.ts.map +1 -0
  616. package/types/ui/Tabs.d.ts +2 -249
  617. package/types/ui/Tabs.d.ts.map +1 -1
  618. package/types/ui/Tabs.shared.d.ts +201 -0
  619. package/types/ui/Tabs.shared.d.ts.map +1 -0
  620. package/types/ui/Tabs.web.d.ts +10 -0
  621. package/types/ui/Tabs.web.d.ts.map +1 -0
  622. package/types/ui/useTabTrigger.d.ts +49 -0
  623. package/types/ui/useTabTrigger.d.ts.map +1 -0
  624. package/types/useBlocker.d.ts.map +1 -1
  625. package/types/utils/platform.d.ts +6 -0
  626. package/types/utils/platform.d.ts.map +1 -0
  627. package/types/utils/platform.web.d.ts +2 -0
  628. package/types/utils/platform.web.d.ts.map +1 -0
  629. package/types/utils/routeIndex.d.ts +10 -0
  630. package/types/utils/routeIndex.d.ts.map +1 -0
  631. package/types/utils/routeIndex.test.d.ts +2 -0
  632. package/types/utils/routeIndex.test.d.ts.map +1 -0
  633. package/types/utils/style.d.ts +6 -1
  634. package/types/utils/style.d.ts.map +1 -1
  635. package/types/views/LoadProgressBar.web.d.ts +21 -0
  636. package/types/views/LoadProgressBar.web.d.ts.map +1 -0
  637. package/types/views/Protected.d.ts.map +1 -1
  638. package/types/views/RootErrorBoundary.d.ts.map +1 -1
  639. package/types/views/RootErrorBoundary.web.d.ts +20 -0
  640. package/types/views/RootErrorBoundary.web.d.ts.map +1 -0
  641. package/types/views/RouteErrorView.d.ts +9 -0
  642. package/types/views/RouteErrorView.d.ts.map +1 -0
  643. package/types/views/RouteErrorView.web.d.ts +3 -0
  644. package/types/views/RouteErrorView.web.d.ts.map +1 -0
  645. package/types/views/Screen.d.ts.map +1 -1
  646. package/types/vite/getManifest.d.ts +2 -1
  647. package/types/vite/getManifest.d.ts.map +1 -1
  648. package/types/vite/one.d.ts.map +1 -1
  649. package/types/vite/plugins/bundledDevPlugin.d.ts.map +1 -1
  650. package/types/vite/plugins/fileSystemRouterPlugin.d.ts +2 -1
  651. package/types/vite/plugins/fileSystemRouterPlugin.d.ts.map +1 -1
  652. package/types/vite/plugins/generateFileSystemRouteTypesPlugin.d.ts +2 -1
  653. package/types/vite/plugins/generateFileSystemRouteTypesPlugin.d.ts.map +1 -1
  654. package/types/vite/plugins/routeModuleHmrPlugin.d.ts +3 -0
  655. package/types/vite/plugins/routeModuleHmrPlugin.d.ts.map +1 -0
  656. package/types/vite/plugins/routeModuleHmrPlugin.test.d.ts +2 -0
  657. package/types/vite/plugins/routeModuleHmrPlugin.test.d.ts.map +1 -0
  658. package/types/vite/plugins/virtualEntryPlugin.d.ts +2 -0
  659. package/types/vite/plugins/virtualEntryPlugin.d.ts.map +1 -1
  660. package/dist/cjs/router/renderingRegistry.native.js.map +0 -1
  661. package/dist/cjs/router/web/ScreenRenderContext.native.js.map +0 -1
  662. package/dist/cjs/router/web/__tests__/WebStackView.runtime.test.cjs +0 -295
  663. package/dist/cjs/router/web/__tests__/WebStackView.runtime.test.native.js +0 -335
  664. package/dist/cjs/router/web/__tests__/WebStackView.runtime.test.native.js.map +0 -1
  665. package/dist/cjs/router/web/__tests__/WebStackView.test.cjs +0 -464
  666. package/dist/cjs/router/web/__tests__/WebStackView.test.native.js +0 -515
  667. package/dist/cjs/router/web/__tests__/WebStackView.test.native.js.map +0 -1
  668. package/dist/esm/router/renderingRegistry.mjs +0 -26
  669. package/dist/esm/router/renderingRegistry.mjs.map +0 -1
  670. package/dist/esm/router/renderingRegistry.native.js +0 -26
  671. package/dist/esm/router/renderingRegistry.native.js.map +0 -1
  672. package/dist/esm/router/web/ScreenRenderContext.mjs +0 -10
  673. package/dist/esm/router/web/ScreenRenderContext.mjs.map +0 -1
  674. package/dist/esm/router/web/ScreenRenderContext.native.js +0 -10
  675. package/dist/esm/router/web/ScreenRenderContext.native.js.map +0 -1
  676. package/dist/esm/router/web/__tests__/WebStackView.runtime.test.mjs +0 -272
  677. package/dist/esm/router/web/__tests__/WebStackView.runtime.test.mjs.map +0 -1
  678. package/dist/esm/router/web/__tests__/WebStackView.runtime.test.native.js +0 -309
  679. package/dist/esm/router/web/__tests__/WebStackView.runtime.test.native.js.map +0 -1
  680. package/dist/esm/router/web/__tests__/WebStackView.test.mjs +0 -465
  681. package/dist/esm/router/web/__tests__/WebStackView.test.mjs.map +0 -1
  682. package/dist/esm/router/web/__tests__/WebStackView.test.native.js +0 -513
  683. package/dist/esm/router/web/__tests__/WebStackView.test.native.js.map +0 -1
  684. package/src/router/renderingRegistry.ts +0 -109
  685. package/src/router/web/ScreenRenderContext.tsx +0 -61
  686. package/src/router/web/__tests__/WebStackView.runtime.test.tsx +0 -309
  687. package/src/router/web/__tests__/WebStackView.test.tsx +0 -444
  688. package/types/router/renderingRegistry.d.ts +0 -90
  689. package/types/router/renderingRegistry.d.ts.map +0 -1
  690. package/types/router/web/ScreenRenderContext.d.ts +0 -46
  691. package/types/router/web/ScreenRenderContext.d.ts.map +0 -1
@@ -0,0 +1,46 @@
1
+ 'use client'
2
+
3
+ import { Activity, Fragment, useEffect, useState } from 'react'
4
+
5
+ import type { ScreenEntry } from './types'
6
+
7
+ /**
8
+ * Tabs and Drawer hold every route in navigation state from the start, so a
9
+ * `keepMounted` screen must only stay mounted once it has actually been
10
+ * focused. Matches react-navigation's lazy behavior on native.
11
+ */
12
+ export function useVisitedScreens(focusedKey: string) {
13
+ const [visited, setVisited] = useState<string[]>(() => [focusedKey])
14
+
15
+ useEffect(() => {
16
+ setVisited((prev) => (prev.includes(focusedKey) ? prev : [...prev, focusedKey]))
17
+ }, [focusedKey])
18
+
19
+ return visited
20
+ }
21
+
22
+ export function renderKeptMountedScreens(screens: ScreenEntry[], visited: string[]) {
23
+ return (
24
+ <Fragment>
25
+ {screens.map((screen) => {
26
+ if (screen.isFocused) {
27
+ return screen.keepMounted ? (
28
+ <Activity key={screen.key} mode="visible">
29
+ {screen.element}
30
+ </Activity>
31
+ ) : (
32
+ <Fragment key={screen.key}>{screen.element}</Fragment>
33
+ )
34
+ }
35
+
36
+ if (!screen.keepMounted || !visited.includes(screen.key)) return null
37
+
38
+ return (
39
+ <Activity key={screen.key} mode="hidden">
40
+ {screen.element}
41
+ </Activity>
42
+ )
43
+ })}
44
+ </Fragment>
45
+ )
46
+ }
@@ -0,0 +1,72 @@
1
+ import type { ComponentType, ReactElement, ReactNode } from 'react'
2
+
3
+ // shared contract for headless web navigators. see plans/headless-navigators.md
4
+
5
+ export type ScreenEntry = {
6
+ key: string
7
+ name: string
8
+ params: Record<string, any>
9
+ href: string
10
+ isFocused: boolean
11
+ keepMounted: boolean
12
+ // compiled options: semantic keys plus opaque passthrough of preset keys
13
+ options: Record<string, any>
14
+ // lazy: rendering it mounts the route (descriptor.render underneath)
15
+ element: ReactElement
16
+ }
17
+
18
+ export type UseStackResult = {
19
+ screens: ScreenEntry[]
20
+ focused: ScreenEntry
21
+ }
22
+
23
+ export type UseTabsResult = {
24
+ screens: ScreenEntry[]
25
+ focused: ScreenEntry
26
+ }
27
+
28
+ export type UseDrawerResult = {
29
+ screens: ScreenEntry[]
30
+ focused: ScreenEntry
31
+ isOpen: boolean
32
+ open: () => void
33
+ close: () => void
34
+ toggle: () => void
35
+ }
36
+
37
+ // the subset of Stack.Screen options each presentation understands. these are a
38
+ // narrowed view of ScreenEntry['options'], never a copy of it
39
+ export type SheetPresentationOptions = {
40
+ sheetAllowedDetents?: number[] | 'fitToContents'
41
+ sheetGrabberVisible?: boolean
42
+ sheetCornerRadius?: number
43
+ sheetExpandsWhenScrolledToEdge?: boolean
44
+ gestureEnabled?: boolean
45
+ title?: string
46
+ }
47
+
48
+ export type ModalPresentationOptions = {
49
+ gestureEnabled?: boolean
50
+ title?: string
51
+ }
52
+
53
+ type PresentationProps<Options> = {
54
+ /** whether the presentation should be visible. toggles as you navigate */
55
+ open: boolean
56
+ /** call with false when your UI dismisses. pops the screen */
57
+ onOpenChange: (open: boolean) => void
58
+ /** the presentation options set on the screen, same vocabulary as native */
59
+ options: Options
60
+ /** the full screen entry: name, params, complete options */
61
+ screen: ScreenEntry
62
+ /** the screen's content */
63
+ children: ReactNode
64
+ }
65
+
66
+ export type SheetPresentationProps = PresentationProps<SheetPresentationOptions>
67
+ export type ModalPresentationProps = PresentationProps<ModalPresentationOptions>
68
+
69
+ export type WebPresentations = {
70
+ sheet?: ComponentType<SheetPresentationProps>
71
+ modal?: ComponentType<ModalPresentationProps>
72
+ }
@@ -0,0 +1,88 @@
1
+ 'use client'
2
+
3
+ import {
4
+ DrawerActions,
5
+ type DrawerActionHelpers,
6
+ type DrawerNavigationState,
7
+ type ParamListBase,
8
+ } from '@react-navigation/routers'
9
+ import {
10
+ createContext,
11
+ useContext,
12
+ useMemo,
13
+ type PropsWithChildren,
14
+ type ReactElement,
15
+ } from 'react'
16
+
17
+ import { getPathFromState } from '../fork/getPathFromState'
18
+ import { getResolvedLinking } from '../router/linkingConfig'
19
+ import type { UseDrawerResult } from './types'
20
+
21
+ export type HeadlessDrawerDescriptors = Record<
22
+ string,
23
+ {
24
+ options: Record<string, any>
25
+ render: () => ReactElement
26
+ }
27
+ >
28
+
29
+ type HeadlessDrawerNavigation = DrawerActionHelpers<ParamListBase> & {
30
+ dispatch: (action: any) => void
31
+ }
32
+
33
+ type DrawerStateProviderProps = PropsWithChildren<{
34
+ state: DrawerNavigationState<ParamListBase>
35
+ descriptors: HeadlessDrawerDescriptors
36
+ navigation: HeadlessDrawerNavigation
37
+ }>
38
+
39
+ const DrawerContext = createContext<UseDrawerResult | null>(null)
40
+
41
+ export function DrawerStateProvider({
42
+ state,
43
+ descriptors,
44
+ navigation,
45
+ children,
46
+ }: DrawerStateProviderProps) {
47
+ const linking = getResolvedLinking()
48
+ const value = useMemo<UseDrawerResult>(() => {
49
+ const screens = state.routes.map((route, index) => {
50
+ const descriptor = descriptors[route.key]!
51
+ const options = descriptor.options
52
+ const href = (linking?.getPathFromState ?? getPathFromState)(
53
+ { ...state, index },
54
+ linking?.config
55
+ )
56
+
57
+ return {
58
+ key: route.key,
59
+ name: route.name,
60
+ params: (route.params ?? {}) as Record<string, any>,
61
+ href,
62
+ isFocused: index === state.index,
63
+ keepMounted: options.keepMounted === true,
64
+ options,
65
+ element: descriptor.render(),
66
+ }
67
+ })
68
+
69
+ return {
70
+ screens,
71
+ focused: screens[state.index]!,
72
+ isOpen: state.history.some((entry) => entry.type === 'drawer'),
73
+ open: () => navigation.dispatch(DrawerActions.openDrawer()),
74
+ close: () => navigation.dispatch(DrawerActions.closeDrawer()),
75
+ toggle: () => navigation.dispatch(DrawerActions.toggleDrawer()),
76
+ }
77
+ }, [descriptors, linking, navigation, state])
78
+
79
+ return <DrawerContext.Provider value={value}>{children}</DrawerContext.Provider>
80
+ }
81
+
82
+ export function useDrawer(): UseDrawerResult {
83
+ const value = useContext(DrawerContext)
84
+ if (!value) {
85
+ throw new Error('useDrawer must be used inside a Drawer navigator')
86
+ }
87
+ return value
88
+ }
@@ -0,0 +1,74 @@
1
+ 'use client'
2
+
3
+ import type { ParamListBase } from '@react-navigation/core'
4
+ import type { StackNavigationState } from '@react-navigation/routers'
5
+ import {
6
+ createContext,
7
+ createElement,
8
+ useContext,
9
+ useMemo,
10
+ type PropsWithChildren,
11
+ type ReactElement,
12
+ } from 'react'
13
+
14
+ import type { UseStackResult } from './types'
15
+ import { getPathFromState } from '../fork/getPathFromState'
16
+ import { getResolvedLinking } from '../router/linkingConfig'
17
+
18
+ export type HeadlessStackDescriptors = Record<
19
+ string,
20
+ {
21
+ options: Record<string, any>
22
+ render: () => ReactElement
23
+ }
24
+ >
25
+
26
+ type StackStateProviderProps = PropsWithChildren<{
27
+ state: StackNavigationState<ParamListBase>
28
+ descriptors: HeadlessStackDescriptors
29
+ }>
30
+
31
+ const StackContext = createContext<UseStackResult | null>(null)
32
+
33
+ export function StackStateProvider({
34
+ state,
35
+ descriptors,
36
+ children,
37
+ }: StackStateProviderProps) {
38
+ const linking = getResolvedLinking()
39
+ const value = useMemo<UseStackResult>(() => {
40
+ const screens = state.routes.map((route, index) => {
41
+ const descriptor = descriptors[route.key]!
42
+ const options = descriptor.options
43
+ const href = (linking?.getPathFromState ?? getPathFromState)(
44
+ { ...state, index },
45
+ linking?.config
46
+ )
47
+
48
+ return {
49
+ key: route.key,
50
+ name: route.name,
51
+ params: (route.params ?? {}) as Record<string, any>,
52
+ href,
53
+ isFocused: index === state.index,
54
+ keepMounted: options.keepMounted === true,
55
+ options,
56
+ element: descriptor.render(),
57
+ }
58
+ })
59
+
60
+ return { screens, focused: screens[state.index]! }
61
+ }, [descriptors, linking, state])
62
+
63
+ return createElement(StackContext.Provider, { value }, children)
64
+ }
65
+
66
+ export function useStack(): UseStackResult {
67
+ const value = useContext(StackContext)
68
+ if (!value) {
69
+ throw new Error(
70
+ 'useStack() must be called inside a <Stack>. it is web-only: on native the stack is rendered by react-navigation.'
71
+ )
72
+ }
73
+ return value
74
+ }
@@ -0,0 +1,40 @@
1
+ 'use client'
2
+
3
+ import { use, useMemo, type ReactElement } from 'react'
4
+
5
+ import { appendBaseUrl } from '../fork/getPathFromState-mods'
6
+ import { stripGroupSegmentsFromPath } from '../router/matchers'
7
+ import { TabTriggerMapContext } from '../ui/TabContext'
8
+ import { useNavigatorContext } from '../views/Navigator'
9
+ import type { UseTabsResult } from './types'
10
+
11
+ type TabsDescriptor = {
12
+ options: Record<string, any>
13
+ render: () => ReactElement
14
+ }
15
+
16
+ export function useTabs(): UseTabsResult {
17
+ const { state, descriptorsRef } = useNavigatorContext()
18
+ const triggerMap = use(TabTriggerMapContext)
19
+ const descriptors = descriptorsRef.current
20
+
21
+ return useMemo(() => {
22
+ const screens = state.routes.map((route, index) => {
23
+ const descriptor = descriptors[route.key] as TabsDescriptor
24
+ const config = triggerMap[route.name]
25
+
26
+ return {
27
+ key: route.key,
28
+ name: route.name,
29
+ params: (route.params ?? {}) as Record<string, any>,
30
+ href: config ? stripGroupSegmentsFromPath(appendBaseUrl(config.href)) : '',
31
+ isFocused: index === state.index,
32
+ keepMounted: descriptor.options.keepMounted === true,
33
+ options: descriptor.options,
34
+ element: descriptor.render(),
35
+ }
36
+ })
37
+
38
+ return { screens, focused: screens[state.index]! }
39
+ }, [descriptors, state, triggerMap])
40
+ }
package/src/index.ts CHANGED
@@ -81,6 +81,17 @@ export { href } from './href'
81
81
  export { getLinking, type OneLinkingConfig } from './link/getLinking'
82
82
  export { useSitemap, type SitemapType } from './router/sitemap'
83
83
  // components
84
+ export { Presentations, type PresentationsProps } from './headless/Presentations'
85
+ export { useStack } from './headless/useStack'
86
+ export type {
87
+ ModalPresentationOptions,
88
+ ModalPresentationProps,
89
+ ScreenEntry,
90
+ SheetPresentationOptions,
91
+ SheetPresentationProps,
92
+ UseStackResult,
93
+ WebPresentations,
94
+ } from './headless/types'
84
95
  export { Stack } from './layouts/Stack'
85
96
  export { Tabs } from './layouts/Tabs'
86
97
  export { Protected, type ProtectedProps } from './views/Protected'
@@ -95,24 +106,9 @@ export type {
95
106
  StackScreenOptions,
96
107
  StackScreenProps,
97
108
  } from './layouts/stack-utils'
98
- // Stack render API (for custom web overlay rendering)
99
- export type {
100
- StackRender,
101
- StackRenderComponent,
102
- StackRenderProps,
103
- } from './router/web/ScreenRenderContext'
104
- // Tabs / Drawer render API + global setup
105
- export {
106
- getRenderingConfig,
107
- setupRendering,
108
- type DrawerRender,
109
- type DrawerRenderComponent,
110
- type DrawerRenderProps,
111
- type RenderingConfig,
112
- type TabsRender,
113
- type TabsRenderComponent,
114
- type TabsRenderProps,
115
- } from './router/renderingRegistry'
109
+ export { useTabs } from './headless/useTabs'
110
+ export { useDrawer } from './headless/useDrawer'
111
+ export type { UseTabsResult, UseDrawerResult } from './headless/types'
116
112
  // utilities
117
113
  export { withLayoutContext } from './layouts/withLayoutContext'
118
114
  export { Link } from './link/Link'
@@ -4,10 +4,8 @@ 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
+ import React, { type ComponentProps } from 'react'
9
8
 
10
- import { getRenderingConfig, type DrawerRender } from '../router/renderingRegistry'
11
9
  import { withLayoutContext } from './withLayoutContext'
12
10
 
13
11
  const DrawerNavigator = createDrawerNavigator().Navigator
@@ -19,38 +17,9 @@ const RNDrawer = withLayoutContext<
19
17
  DrawerNavigationEventMap
20
18
  >(DrawerNavigator)
21
19
 
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
- })
20
+ const DrawerWithRender = React.forwardRef<unknown, ComponentProps<typeof RNDrawer>>(
21
+ (props, ref) => <RNDrawer {...(props as any)} ref={ref} />
22
+ )
54
23
 
55
24
  // Preserve withLayoutContext's static Screen so user code like
56
25
  // `<Drawer.Screen ... />` keeps working through the render wrapper.
@@ -0,0 +1,117 @@
1
+ 'use client'
2
+
3
+ import { createNavigatorFactory, useNavigationBuilder } from '@react-navigation/core'
4
+ import type {
5
+ DrawerNavigationEventMap,
6
+ DrawerNavigationOptions,
7
+ } from '@react-navigation/drawer'
8
+ import {
9
+ type DrawerActionHelpers,
10
+ type DrawerNavigationState,
11
+ DrawerRouter,
12
+ type DrawerRouterOptions,
13
+ type ParamListBase,
14
+ } from '@react-navigation/routers'
15
+ import { Children, type ComponentProps, forwardRef, type ReactNode } from 'react'
16
+
17
+ import { getCustomNavigatorChildren, isNavigatorConfigChild } from '../headless/children'
18
+ import { devHeadlessNote } from '../headless/devHeadlessNote'
19
+ import { renderKeptMountedScreens, useVisitedScreens } from '../headless/keepMounted'
20
+ import {
21
+ DrawerStateProvider,
22
+ type HeadlessDrawerDescriptors,
23
+ useDrawer,
24
+ } from '../headless/useDrawer'
25
+ import { withLayoutContext } from './withLayoutContext'
26
+
27
+ type WebDrawerNavigatorProps = {
28
+ children: ReactNode
29
+ headlessChildren?: ReactNode[]
30
+ initialRouteName?: string
31
+ defaultStatus?: DrawerRouterOptions['defaultStatus']
32
+ backBehavior?: DrawerRouterOptions['backBehavior']
33
+ screenOptions?: DrawerNavigationOptions | ((props: any) => DrawerNavigationOptions)
34
+ [key: string]: any
35
+ }
36
+
37
+ function WebDrawerNavigator({
38
+ children,
39
+ headlessChildren,
40
+ initialRouteName,
41
+ defaultStatus,
42
+ backBehavior,
43
+ screenOptions,
44
+ ...rest
45
+ }: WebDrawerNavigatorProps) {
46
+ const { state, descriptors, navigation, NavigationContent } = useNavigationBuilder<
47
+ DrawerNavigationState<ParamListBase>,
48
+ DrawerRouterOptions,
49
+ DrawerActionHelpers<ParamListBase>,
50
+ DrawerNavigationOptions,
51
+ DrawerNavigationEventMap
52
+ >(DrawerRouter, {
53
+ ...(rest as any),
54
+ children,
55
+ initialRouteName,
56
+ defaultStatus,
57
+ backBehavior,
58
+ screenOptions,
59
+ })
60
+
61
+ return (
62
+ <NavigationContent>
63
+ <DrawerStateProvider
64
+ state={state}
65
+ descriptors={descriptors as HeadlessDrawerDescriptors}
66
+ navigation={navigation}
67
+ >
68
+ <HeadlessDrawerView customChildren={headlessChildren} />
69
+ </DrawerStateProvider>
70
+ </NavigationContent>
71
+ )
72
+ }
73
+
74
+ function HeadlessDrawerView({ customChildren }: { customChildren?: ReactNode[] }) {
75
+ const { screens, focused } = useDrawer()
76
+ const visited = useVisitedScreens(focused.key)
77
+
78
+ devHeadlessNote('Drawer')
79
+
80
+ if (customChildren?.length) {
81
+ return <>{customChildren}</>
82
+ }
83
+
84
+ return renderKeptMountedScreens(screens, visited)
85
+ }
86
+
87
+ const DrawerNavigator = createNavigatorFactory(WebDrawerNavigator)().Navigator
88
+
89
+ const RNDrawer = withLayoutContext<
90
+ DrawerNavigationOptions,
91
+ typeof DrawerNavigator,
92
+ DrawerNavigationState<ParamListBase>,
93
+ DrawerNavigationEventMap
94
+ >(DrawerNavigator)
95
+
96
+ const DrawerWithHeadless = forwardRef<unknown, ComponentProps<typeof RNDrawer>>(
97
+ (props, ref) => {
98
+ const { children, ...rest } = props
99
+ const customChildren = getCustomNavigatorChildren(children)
100
+
101
+ return (
102
+ <RNDrawer
103
+ {...rest}
104
+ ref={ref}
105
+ headlessChildren={customChildren.length ? customChildren : undefined}
106
+ >
107
+ {Children.toArray(children).filter(isNavigatorConfigChild)}
108
+ </RNDrawer>
109
+ )
110
+ }
111
+ )
112
+
113
+ export const Drawer = Object.assign(DrawerWithHeadless, {
114
+ Screen: RNDrawer.Screen,
115
+ })
116
+
117
+ export default Drawer
@@ -1,25 +1,22 @@
1
1
  import type { ParamListBase, StackNavigationState } from '@react-navigation/native'
2
- import {
3
- type NativeStackNavigationEventMap,
4
- type NativeStackNavigationOptions,
2
+ import type {
3
+ NativeStackNavigationEventMap,
4
+ NativeStackNavigationOptions,
5
5
  } from '@react-navigation/native-stack'
6
- import React, { Children, useMemo, type ComponentProps } from 'react'
7
-
6
+ import React, { Children, type ComponentProps, useMemo } from 'react'
7
+ import { isChildOfType } from '../utils/children'
8
+ import { Protected } from '../views/Protected'
9
+ import { Screen } from '../views/Screen'
10
+ import { createStackNavigator, getStackNavigatorProps } from './stack-navigator'
8
11
  import {
9
- StackScreen,
12
+ appendScreenStackPropsToOptions,
10
13
  StackHeader,
11
14
  StackHeaderComponent,
12
15
  StackHeaderSearchBar,
13
- appendScreenStackPropsToOptions,
16
+ StackScreen,
14
17
  type StackScreenProps,
15
18
  } from './stack-utils'
16
19
  import { withLayoutContext } from './withLayoutContext'
17
- import { isChildOfType } from '../utils/children'
18
- import { Protected } from '../views/Protected'
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'
23
20
 
24
21
  const NativeStackNavigator = createStackNavigator().Navigator
25
22
 
@@ -58,69 +55,64 @@ function mapChildren(children: React.ReactNode): React.ReactNode {
58
55
  return null
59
56
  }
60
57
 
61
- // pass through other children (like Screen)
62
- return child
58
+ if (isChildOfType(child, Screen)) {
59
+ return child
60
+ }
61
+
62
+ return null
63
63
  })
64
64
  .filter(Boolean)
65
65
  }
66
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
-
77
67
  /**
78
68
  * Stack navigator with support for Header Composition API.
79
69
  * Wraps the base Stack to pre-process StackScreen children.
80
70
  */
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)
71
+ const StackWithComposition = React.forwardRef<unknown, ComponentProps<typeof RNStack>>(
72
+ (props, ref) => {
73
+ const { children, screenOptions, ...rest } = props
74
+
75
+ // extract Stack.Header from children for screenOptions
76
+ const screenOptionsWithHeader = useMemo(() => {
77
+ const stackHeader = Children.toArray(children).find((child) =>
78
+ isChildOfType(child, StackHeaderComponent)
79
+ )
80
+
81
+ if (stackHeader && isChildOfType(stackHeader, StackHeaderComponent)) {
82
+ const headerProps: StackScreenProps = { children: stackHeader }
83
+ if (screenOptions) {
84
+ if (typeof screenOptions === 'function') {
85
+ return (...args: Parameters<typeof screenOptions>) => {
86
+ const opts = screenOptions(...args)
87
+ return appendScreenStackPropsToOptions(opts, headerProps)
88
+ }
100
89
  }
90
+ return appendScreenStackPropsToOptions(screenOptions, headerProps)
101
91
  }
102
- return appendScreenStackPropsToOptions(screenOptions, headerProps)
92
+ return appendScreenStackPropsToOptions({}, headerProps)
103
93
  }
104
- return appendScreenStackPropsToOptions({}, headerProps)
105
- }
106
-
107
- return screenOptions
108
- }, [children, screenOptions])
109
94
 
110
- // pre-process children to convert StackScreen to Screen
111
- const processedChildren = useMemo(() => mapChildren(children), [children])
95
+ return screenOptions
96
+ }, [children, screenOptions])
112
97
 
113
- const navigator = (
114
- <RNStack {...rest} ref={ref} screenOptions={screenOptionsWithHeader}>
115
- {processedChildren}
116
- </RNStack>
117
- )
98
+ // pre-process children to convert StackScreen to Screen
99
+ const processedChildren = useMemo(() => mapChildren(children), [children])
100
+ const navigatorProps = useMemo(() => getStackNavigatorProps(children), [children])
118
101
 
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
- })
102
+ return (
103
+ <RNStack
104
+ {...rest}
105
+ {...navigatorProps}
106
+ ref={ref}
107
+ screenOptions={
108
+ screenOptionsWithHeader as ComponentProps<typeof RNStack>['screenOptions']
109
+ }
110
+ >
111
+ {processedChildren}
112
+ </RNStack>
113
+ )
114
+ }
115
+ )
124
116
 
125
117
  export const Stack = Object.assign(StackWithComposition, {
126
118
  Screen: StackScreen,