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
@@ -12,7 +12,6 @@ import { Platform, Pressable } from 'react-native'
12
12
  import type { OneRouter } from '../interfaces/router'
13
13
  import { Link } from '../link/Link'
14
14
  import { Protected } from '../views/Protected'
15
- import { getRenderingConfig, type TabsRender } from '../router/renderingRegistry'
16
15
  import { withLayoutContext } from './withLayoutContext'
17
16
 
18
17
  const DefaultTabBar = ({ state, ...restProps }: BottomTabBarProps) => {
@@ -87,37 +86,12 @@ const RNTabs = withLayoutContext<
87
86
  })
88
87
  })
89
88
 
90
- type TabsExtraProps = {
91
- /**
92
- * Platform-keyed tab bar component. Replaces the default bottom-tabs bar.
93
- * v1 consumes `web` only; `ios` / `android` accepted for future use.
94
- * Falls back to `setupRendering({ Tabs: { web } })` global registry if
95
- * no prop is set, then to the built-in `BottomTabBar`.
96
- */
97
- render?: TabsRender
98
- }
99
-
100
- const TabsWithRender = React.forwardRef<
101
- unknown,
102
- ComponentProps<typeof RNTabs> & TabsExtraProps
103
- >((props, ref) => {
104
- const { render, tabBar, ...rest } = props as any
105
-
106
- // Resolution: prop tabBar > prop render[platform] > setupRendering[platform] > default.
107
- // Tabs runs on web AND native so we dispatch on Platform.OS - unlike Stack,
108
- // where the web navigator only consumes the `web` slot.
109
- const effectiveTabBar = useMemo(() => {
110
- if (tabBar) return tabBar
111
- const platform = Platform.OS as 'web' | 'ios' | 'android'
112
- const fromProp = render?.[platform]
113
- if (fromProp) return fromProp
114
- const fromGlobal = getRenderingConfig().Tabs?.[platform]
115
- if (fromGlobal) return fromGlobal
116
- return DefaultTabBar
117
- }, [tabBar, render])
118
-
119
- return <RNTabs {...rest} ref={ref} tabBar={effectiveTabBar} />
120
- })
89
+ const TabsWithRender = React.forwardRef<unknown, ComponentProps<typeof RNTabs>>(
90
+ (props, ref) => {
91
+ const { tabBar, ...rest } = props as any
92
+ return <RNTabs {...rest} ref={ref} tabBar={tabBar ?? DefaultTabBar} />
93
+ }
94
+ )
121
95
 
122
96
  export const Tabs = Object.assign(TabsWithRender, {
123
97
  Protected,
@@ -0,0 +1,151 @@
1
+ 'use client'
2
+
3
+ import type { ParamListBase } from '@react-navigation/core'
4
+ import { useNavigationBuilder } from '@react-navigation/core'
5
+ import {
6
+ type TabActionHelpers,
7
+ type TabNavigationState,
8
+ TabRouter,
9
+ type TabRouterOptions,
10
+ } from '@react-navigation/routers'
11
+ import { Children, Fragment, forwardRef, type ReactNode, useMemo, useRef } from 'react'
12
+ import { getPathFromState } from '../fork/getPathFromState'
13
+ import { getCustomNavigatorChildren, isNavigatorConfigChild } from '../headless/children'
14
+ import { devHeadlessNote } from '../headless/devHeadlessNote'
15
+ import { renderKeptMountedScreens, useVisitedScreens } from '../headless/keepMounted'
16
+ import { useTabs } from '../headless/useTabs'
17
+ import { getResolvedLinking } from '../router/linkingConfig'
18
+ import { TabTriggerMapContext } from '../ui/TabContext'
19
+ import { NavigatorContext } from '../views/Navigator'
20
+ import { Protected } from '../views/Protected'
21
+ import { Screen } from '../views/Screen'
22
+ import { withLayoutContext } from './withLayoutContext'
23
+
24
+ type TabsEventMap = {
25
+ tabPress: { data: undefined; canPreventDefault: true }
26
+ tabLongPress: { data: undefined }
27
+ }
28
+
29
+ type WebTabsNavigatorProps = {
30
+ children?: ReactNode
31
+ headlessChildren?: ReactNode[]
32
+ initialRouteName?: string
33
+ screenOptions?: any
34
+ id?: string
35
+ [key: string]: any
36
+ }
37
+
38
+ type TabsProps = Omit<WebTabsNavigatorProps, 'headlessChildren'> & {
39
+ render?: unknown
40
+ tabBar?: unknown
41
+ }
42
+
43
+ function WebTabsNavigator({
44
+ children,
45
+ headlessChildren,
46
+ initialRouteName,
47
+ screenOptions,
48
+ id,
49
+ ...rest
50
+ }: WebTabsNavigatorProps) {
51
+ const { state, navigation, descriptors, NavigationContent } = useNavigationBuilder<
52
+ TabNavigationState<ParamListBase>,
53
+ TabRouterOptions,
54
+ TabActionHelpers<ParamListBase>,
55
+ Record<string, any>,
56
+ TabsEventMap
57
+ >(TabRouter, {
58
+ ...(rest as any),
59
+ children,
60
+ initialRouteName,
61
+ screenOptions,
62
+ })
63
+ const descriptorsRef = useRef(descriptors)
64
+ descriptorsRef.current = descriptors
65
+ const linking = getResolvedLinking()
66
+
67
+ const navigatorContextValue = useMemo(
68
+ () => ({
69
+ contextKey: id ?? '',
70
+ state,
71
+ navigation,
72
+ descriptorsRef,
73
+ router: TabRouter,
74
+ }),
75
+ [id, navigation, state]
76
+ )
77
+
78
+ const triggerMap = useMemo(() => {
79
+ return Object.fromEntries(
80
+ state.routes.map((route, index) => {
81
+ const options = descriptors[route.key]?.options ?? {}
82
+ const href =
83
+ typeof options.href === 'string'
84
+ ? options.href
85
+ : (linking?.getPathFromState ?? getPathFromState)(
86
+ { ...state, index },
87
+ linking?.config
88
+ )
89
+
90
+ return [
91
+ route.name,
92
+ {
93
+ type: 'internal',
94
+ name: route.name,
95
+ href,
96
+ action: {
97
+ type: 'JUMP_TO',
98
+ payload: { name: route.name },
99
+ },
100
+ index,
101
+ },
102
+ ]
103
+ })
104
+ )
105
+ }, [descriptors, linking, state])
106
+
107
+ return (
108
+ <NavigationContent>
109
+ <TabTriggerMapContext.Provider value={triggerMap as any}>
110
+ <NavigatorContext.Provider value={navigatorContextValue as any}>
111
+ <HeadlessTabsView customChildren={headlessChildren} />
112
+ </NavigatorContext.Provider>
113
+ </TabTriggerMapContext.Provider>
114
+ </NavigationContent>
115
+ )
116
+ }
117
+
118
+ function HeadlessTabsView({ customChildren }: { customChildren?: ReactNode[] }) {
119
+ const { screens, focused } = useTabs()
120
+ const visited = useVisitedScreens(focused.key)
121
+ devHeadlessNote('Tabs')
122
+
123
+ if (customChildren?.length) {
124
+ return <Fragment>{customChildren}</Fragment>
125
+ }
126
+
127
+ return renderKeptMountedScreens(screens, visited)
128
+ }
129
+
130
+ const RNTabs = withLayoutContext(WebTabsNavigator)
131
+
132
+ const TabsWithChildren = forwardRef<unknown, TabsProps>(function TabsWithChildren(
133
+ { children, ...props },
134
+ ref
135
+ ) {
136
+ const configChildren = Children.toArray(children).filter(isNavigatorConfigChild)
137
+ const customChildren = getCustomNavigatorChildren(children)
138
+
139
+ return (
140
+ <RNTabs {...props} ref={ref} headlessChildren={customChildren}>
141
+ {configChildren}
142
+ </RNTabs>
143
+ )
144
+ })
145
+
146
+ export const Tabs = Object.assign(TabsWithChildren, {
147
+ Protected,
148
+ Screen,
149
+ })
150
+
151
+ export default Tabs
@@ -1,9 +1,13 @@
1
1
  import { createNativeStackNavigator } from '@react-navigation/native-stack'
2
+ import type { ReactNode } from 'react'
2
3
 
3
4
  /**
4
5
  * Returns a Stack navigator factory. On native this is the stock
5
6
  * `@react-navigation/native-stack`; on web this is replaced via the
6
- * `.web.ts` sibling with a custom navigator that supports the `render`
7
- * prop for overlay presentations.
7
+ * `.web.ts` sibling with the headless navigator.
8
8
  */
9
9
  export const createStackNavigator = createNativeStackNavigator
10
+
11
+ export function getStackNavigatorProps(_children: ReactNode) {
12
+ return {}
13
+ }
@@ -1,3 +1,11 @@
1
+ import type { ReactNode } from 'react'
2
+
3
+ import { getCustomNavigatorChildren } from '../headless/children'
1
4
  import { createWebStackNavigator } from '../router/web/WebStackNavigator'
2
5
 
3
6
  export const createStackNavigator = createWebStackNavigator
7
+
8
+ export function getStackNavigatorProps(children: ReactNode) {
9
+ const headlessChildren = getCustomNavigatorChildren(children)
10
+ return headlessChildren.length ? { headlessChildren } : {}
11
+ }
@@ -2,6 +2,8 @@ import type { NativeStackNavigationOptions } from '@react-navigation/native-stac
2
2
  import type { ImageSourcePropType } from 'react-native'
3
3
  import type { ScreenStackHeaderConfigProps } from 'react-native-screens'
4
4
 
5
+ import { NAVIGATOR_CONFIG } from '../../headless/children'
6
+
5
7
  export interface StackHeaderBackButtonProps {
6
8
  children?: string
7
9
  style?: NativeStackNavigationOptions['headerBackTitleStyle']
@@ -18,6 +20,8 @@ export function StackHeaderBackButton(_props: StackHeaderBackButtonProps) {
18
20
  return null
19
21
  }
20
22
 
23
+ Object.assign(StackHeaderBackButton, { [NAVIGATOR_CONFIG]: true })
24
+
21
25
  export function appendStackHeaderBackButtonPropsToOptions(
22
26
  options: NativeStackNavigationOptions,
23
27
  props: StackHeaderBackButtonProps
@@ -1,8 +1,9 @@
1
1
  import type { NativeStackNavigationOptions } from '@react-navigation/native-stack'
2
2
  import { Children, isValidElement, type ReactNode } from 'react'
3
- import { StyleSheet, type ColorValue, type StyleProp } from 'react-native'
3
+ import type { ColorValue, StyleProp } from 'react-native'
4
4
  import type { ScreenStackHeaderConfigProps } from 'react-native-screens'
5
5
 
6
+ import { NAVIGATOR_CONFIG } from '../../headless/children'
6
7
  import {
7
8
  appendStackHeaderBackButtonPropsToOptions,
8
9
  StackHeaderBackButton,
@@ -21,6 +22,7 @@ import {
21
22
  StackHeaderTitle,
22
23
  } from './StackHeaderTitle'
23
24
  import { isChildOfType } from '../../utils/children'
25
+ import { flattenStyle } from '../../utils/style'
24
26
 
25
27
  export interface StackHeaderProps {
26
28
  children?: ReactNode
@@ -56,12 +58,14 @@ export function StackHeaderComponent(_props: StackHeaderProps) {
56
58
  return null
57
59
  }
58
60
 
61
+ Object.assign(StackHeaderComponent, { [NAVIGATOR_CONFIG]: true })
62
+
59
63
  export function appendStackHeaderPropsToOptions(
60
64
  options: NativeStackNavigationOptions,
61
65
  props: StackHeaderProps
62
66
  ): NativeStackNavigationOptions {
63
- const flattenedStyle = StyleSheet.flatten(props.style)
64
- const flattenedLargeStyle = StyleSheet.flatten(props.largeStyle)
67
+ const flattenedStyle = flattenStyle(props.style)
68
+ const flattenedLargeStyle = flattenStyle(props.largeStyle)
65
69
 
66
70
  if (props.hidden) {
67
71
  return { ...options, headerShown: false }
@@ -1,6 +1,8 @@
1
1
  import type { NativeStackNavigationOptions } from '@react-navigation/native-stack'
2
2
  import type { ReactNode } from 'react'
3
3
 
4
+ import { NAVIGATOR_CONFIG } from '../../headless/children'
5
+
4
6
  export interface StackHeaderLeftProps {
5
7
  children?: ReactNode
6
8
  asChild?: boolean
@@ -14,6 +16,8 @@ export function StackHeaderLeft(_props: StackHeaderLeftProps) {
14
16
  return null
15
17
  }
16
18
 
19
+ Object.assign(StackHeaderLeft, { [NAVIGATOR_CONFIG]: true })
20
+
17
21
  export function appendStackHeaderLeftPropsToOptions(
18
22
  options: NativeStackNavigationOptions,
19
23
  props: StackHeaderLeftProps
@@ -1,6 +1,8 @@
1
1
  import type { NativeStackNavigationOptions } from '@react-navigation/native-stack'
2
2
  import type { ReactNode } from 'react'
3
3
 
4
+ import { NAVIGATOR_CONFIG } from '../../headless/children'
5
+
4
6
  export interface StackHeaderRightProps {
5
7
  children?: ReactNode
6
8
  asChild?: boolean
@@ -14,6 +16,8 @@ export function StackHeaderRight(_props: StackHeaderRightProps) {
14
16
  return null
15
17
  }
16
18
 
19
+ Object.assign(StackHeaderRight, { [NAVIGATOR_CONFIG]: true })
20
+
17
21
  export function appendStackHeaderRightPropsToOptions(
18
22
  options: NativeStackNavigationOptions,
19
23
  props: StackHeaderRightProps
@@ -1,6 +1,8 @@
1
1
  import type { NativeStackNavigationOptions } from '@react-navigation/native-stack'
2
2
  import type { SearchBarProps } from 'react-native-screens'
3
3
 
4
+ import { NAVIGATOR_CONFIG } from '../../headless/children'
5
+
4
6
  export interface StackHeaderSearchBarProps extends SearchBarProps {}
5
7
 
6
8
  /**
@@ -10,6 +12,8 @@ export function StackHeaderSearchBar(_props: StackHeaderSearchBarProps) {
10
12
  return null
11
13
  }
12
14
 
15
+ Object.assign(StackHeaderSearchBar, { [NAVIGATOR_CONFIG]: true })
16
+
13
17
  export function appendStackHeaderSearchBarPropsToOptions(
14
18
  options: NativeStackNavigationOptions,
15
19
  props: StackHeaderSearchBarProps
@@ -1,7 +1,9 @@
1
1
  import type { NativeStackNavigationOptions } from '@react-navigation/native-stack'
2
- import { Platform, StyleSheet, type StyleProp, type TextStyle } from 'react-native'
2
+ import type { StyleProp, TextStyle } from 'react-native'
3
3
 
4
- import { convertFontWeightToStringFontWeight } from '../../utils/style'
4
+ import { NAVIGATOR_CONFIG } from '../../headless/children'
5
+ import { PLATFORM } from '../../utils/platform'
6
+ import { convertFontWeightToStringFontWeight, flattenStyle } from '../../utils/style'
5
7
 
6
8
  export type StackHeaderTitleProps = {
7
9
  children?: string
@@ -29,12 +31,14 @@ export function StackHeaderTitle(_props: StackHeaderTitleProps) {
29
31
  return null
30
32
  }
31
33
 
34
+ Object.assign(StackHeaderTitle, { [NAVIGATOR_CONFIG]: true })
35
+
32
36
  export function appendStackHeaderTitlePropsToOptions(
33
37
  options: NativeStackNavigationOptions,
34
38
  props: StackHeaderTitleProps
35
39
  ): NativeStackNavigationOptions {
36
- const flattenedStyle = StyleSheet.flatten(props.style)
37
- const flattenedLargeStyle = StyleSheet.flatten(props.largeStyle)
40
+ const flattenedStyle = flattenStyle(props.style)
41
+ const flattenedLargeStyle = flattenStyle(props.largeStyle)
38
42
 
39
43
  // Build title style only if there are actual style properties
40
44
  const titleStyle = flattenedStyle
@@ -66,7 +70,7 @@ export function appendStackHeaderTitlePropsToOptions(
66
70
  headerLargeTitle: props.large,
67
71
  // Large titles on iOS require headerTransparent for proper scroll behavior
68
72
  // Only set on iOS since headerLargeTitle is iOS-only
69
- ...(props.large && Platform.OS === 'ios' && { headerTransparent: true }),
73
+ ...(props.large && PLATFORM === 'ios' && { headerTransparent: true }),
70
74
  headerTitleAlign: flattenedStyle?.textAlign,
71
75
  // Only set styles when explicitly configured to avoid interfering with native defaults
72
76
  ...(titleStyle &&
@@ -3,27 +3,21 @@
3
3
  import type { NativeStackNavigationOptions } from '@react-navigation/native-stack'
4
4
  import { Children, isValidElement, useMemo, type PropsWithChildren } from 'react'
5
5
 
6
+ import { NAVIGATOR_CONFIG } from '../../headless/children'
6
7
  import {
7
8
  StackHeaderComponent,
8
9
  appendStackHeaderPropsToOptions,
9
10
  type StackHeaderProps,
10
11
  } from './StackHeaderComponent'
11
12
  import { Screen } from '../../views/Screen'
12
- import type { StackRender } from '../../router/web/ScreenRenderContext'
13
13
 
14
- export type StackScreenOptions = NativeStackNavigationOptions & {
15
- /**
16
- * Per-route override of the Stack-level `render` prop. Same platform-keyed
17
- * shape (`{ web?, ios?, android? }`); v1 consumes `web` only. When set, it
18
- * takes precedence over the Stack-level render for this route.
19
- */
20
- render?: StackRender
14
+ export type StackScreenOptions = Omit<NativeStackNavigationOptions, 'presentation'> & {
15
+ presentation?: NativeStackNavigationOptions['presentation'] | 'sheet' | (string & {})
21
16
 
22
17
  /**
23
18
  * Web-only. When `true`, the route's React subtree stays mounted across
24
19
  * dismissal and re-navigation - `useState`, `useId`, `useReducer`, refs,
25
- * and anything stored in the route component all survive. The render
26
- * component receives `open: false` while the route is "closed".
20
+ * and anything stored in the route component all survive.
27
21
  *
28
22
  * Caveat: route params are captured at first mount. If the same route is
29
23
  * navigated to with different params later, the captured subtree keeps
@@ -63,7 +57,9 @@ export function StackScreen({ children, options, ...rest }: StackScreenProps) {
63
57
  return <Screen {...rest} options={updatedOptions as NativeStackNavigationOptions} />
64
58
  }
65
59
 
66
- const VALID_PRESENTATIONS = [
60
+ Object.assign(StackScreen, { [NAVIGATOR_CONFIG]: true })
61
+
62
+ const NATIVE_PRESENTATIONS = [
67
63
  'card',
68
64
  'modal',
69
65
  'transparentModal',
@@ -74,38 +70,33 @@ const VALID_PRESENTATIONS = [
74
70
  'pageSheet',
75
71
  ] as const
76
72
 
77
- // validates presentation value in dev to prevent native crashes from invalid values
78
- export function validateStackPresentation(
79
- options: NativeStackNavigationOptions
80
- ): NativeStackNavigationOptions
73
+ // maps semantic and custom presentations to native-stack values on native
74
+ export function validateStackPresentation(options: StackScreenOptions): StackScreenOptions
81
75
  export function validateStackPresentation<
82
- F extends (...args: never[]) => NativeStackNavigationOptions,
76
+ F extends (...args: never[]) => StackScreenOptions,
83
77
  >(options: F): F
84
78
  export function validateStackPresentation(
85
- options:
86
- | NativeStackNavigationOptions
87
- | ((...args: never[]) => NativeStackNavigationOptions)
88
- ): ((...args: never[]) => NativeStackNavigationOptions) | NativeStackNavigationOptions {
79
+ options: StackScreenOptions | ((...args: never[]) => StackScreenOptions)
80
+ ): ((...args: never[]) => StackScreenOptions) | StackScreenOptions {
89
81
  if (typeof options === 'function') {
90
82
  return (...args: never[]) => {
91
- const resolved = options(...args)
92
- validateStackPresentation(resolved)
93
- return resolved
83
+ return validateStackPresentation(options(...args))
94
84
  }
95
85
  }
96
86
 
97
- if (process.env.NODE_ENV !== 'production') {
98
- const presentation = options.presentation
99
- if (
100
- presentation &&
101
- !VALID_PRESENTATIONS.includes(presentation as (typeof VALID_PRESENTATIONS)[number])
102
- ) {
103
- console.warn(
104
- `Invalid presentation value "${presentation}" passed to Stack.Screen. Valid values are: ${VALID_PRESENTATIONS.map((v) => `"${v}"`).join(', ')}.`
105
- )
106
- }
87
+ if (process.env.TAMAGUI_TARGET === 'web' || !options.presentation) {
88
+ return options
89
+ }
90
+
91
+ if (options.presentation === 'sheet') {
92
+ return { ...options, presentation: 'formSheet' }
107
93
  }
108
- return options
94
+
95
+ return NATIVE_PRESENTATIONS.includes(
96
+ options.presentation as (typeof NATIVE_PRESENTATIONS)[number]
97
+ )
98
+ ? options
99
+ : { ...options, presentation: 'modal' }
109
100
  }
110
101
 
111
102
  export function appendScreenStackPropsToOptions(
@@ -114,11 +105,15 @@ export function appendScreenStackPropsToOptions(
114
105
  ): StackScreenOptions {
115
106
  let updatedOptions: StackScreenOptions = { ...options, ...props.options }
116
107
 
117
- validateStackPresentation(updatedOptions)
108
+ updatedOptions = validateStackPresentation(updatedOptions)
118
109
 
119
110
  function appendChildOptions(child: React.ReactElement, options: StackScreenOptions) {
120
111
  if (child.type === StackHeaderComponent) {
121
- return appendStackHeaderPropsToOptions(options, child.props as StackHeaderProps)
112
+ // widened presentation strings are erased before native-stack consumes options
113
+ return appendStackHeaderPropsToOptions(
114
+ options as NativeStackNavigationOptions,
115
+ child.props as StackHeaderProps
116
+ ) as StackScreenOptions
122
117
  } else {
123
118
  console.warn(
124
119
  `Warning: Unknown child element passed to Stack.Screen: ${(child.type as { name: string }).name ?? child.type}`
@@ -1,6 +1,13 @@
1
- import { describe, expect, it } from 'vitest'
1
+ import { describe, expect, it, vi } from 'vitest'
2
2
  import React from 'react'
3
- import { Platform } from 'react-native'
3
+
4
+ // the header helpers read the platform constant, not react-native
5
+ const platform = vi.hoisted(() => ({ current: 'web' }))
6
+ vi.mock('../../../utils/platform', () => ({
7
+ get PLATFORM() {
8
+ return platform.current
9
+ },
10
+ }))
4
11
 
5
12
  import {
6
13
  StackHeaderTitle,
@@ -68,26 +75,20 @@ describe('Stack Header Composition', () => {
68
75
  })
69
76
 
70
77
  it('sets headerTransparent only on iOS when large is true', () => {
71
- // Store original Platform.OS
72
- const originalOS = Platform.OS
73
-
74
78
  // Test on iOS - should set headerTransparent
75
- ;(Platform as any).OS = 'ios'
79
+ platform.current = 'ios'
76
80
  const iosResult = appendStackHeaderTitlePropsToOptions({}, { large: true })
77
81
  expect(iosResult.headerTransparent).toBe(true)
78
82
 
79
83
  // Test on Android - should NOT set headerTransparent
80
- ;(Platform as any).OS = 'android'
84
+ platform.current = 'android'
81
85
  const androidResult = appendStackHeaderTitlePropsToOptions({}, { large: true })
82
86
  expect(androidResult.headerTransparent).toBeUndefined()
83
87
 
84
88
  // Test on web - should NOT set headerTransparent
85
- ;(Platform as any).OS = 'web'
89
+ platform.current = 'web'
86
90
  const webResult = appendStackHeaderTitlePropsToOptions({}, { large: true })
87
91
  expect(webResult.headerTransparent).toBeUndefined()
88
-
89
- // Restore original
90
- ;(Platform as any).OS = originalOS
91
92
  })
92
93
  })
93
94
 
@@ -10,12 +10,14 @@ import {
10
10
  type StackHeaderSearchBarProps,
11
11
  } from './StackHeaderSearchBar'
12
12
  import { StackHeaderTitle, type StackHeaderTitleProps } from './StackHeaderTitle'
13
+ import { NAVIGATOR_CONFIG } from '../../headless/children'
13
14
 
14
15
  /**
15
16
  * Compound component for configuring stack headers.
16
17
  * Attach to Stack as `Stack.Header`.
17
18
  */
18
19
  export const StackHeader = Object.assign(StackHeaderComponent, {
20
+ [NAVIGATOR_CONFIG]: true,
19
21
  Left: StackHeaderLeft,
20
22
  Right: StackHeaderRight,
21
23
  BackButton: StackHeaderBackButton,
@@ -96,9 +96,12 @@ export function useFilterScreenChildren(
96
96
  // Handle other children (custom components in custom Navigator)
97
97
  if (isCustomNavigator) {
98
98
  customChildren.push(child)
99
- } else if (child != null) {
99
+ } else if (child != null && process.env.NODE_ENV === 'development') {
100
+ // a non-config child is the documented way to give a navigator a custom
101
+ // layout on web. it can't apply here, where react-navigation draws the
102
+ // chrome, so say that rather than calling it a mistake
100
103
  console.warn(
101
- `Layout children must be of type Screen, all other children are ignored. To use custom children, create a custom <Layout />. Update Layout Route at: "app${contextKey}/_layout"`
104
+ `[one] a non-<Screen> child of the navigator at "app${contextKey}/_layout" renders on web only. On native this navigator is drawn by react-navigation and the child is ignored.`
102
105
  )
103
106
  }
104
107
  }
@@ -0,0 +1,84 @@
1
+ import { Slot } from '@radix-ui/react-slot'
2
+ import * as React from 'react'
3
+
4
+ import type { OneRouter } from '../interfaces/router'
5
+ import { resolveHref } from './href'
6
+ import { useLinkTo } from './useLinkTo'
7
+
8
+ export const Link = React.forwardRef(function Link(
9
+ {
10
+ href,
11
+ replace,
12
+ push: _push,
13
+ id,
14
+ mask,
15
+ asChild,
16
+ rel,
17
+ target,
18
+ download,
19
+ className,
20
+ style,
21
+ onPress,
22
+ disabled,
23
+ accessibilityLabel,
24
+ // rn-flavored prop shared code passes; rnw translated it, the dom link must too
25
+ testID,
26
+ ...rest
27
+ }: OneRouter.LinkProps<any> & { testID?: string },
28
+ ref: React.ForwardedRef<HTMLAnchorElement>
29
+ ) {
30
+ const resolvedHref = React.useMemo(() => {
31
+ if (href == null) {
32
+ throw new Error('Link: href is required')
33
+ }
34
+ return resolveHref(href)
35
+ }, [href])
36
+
37
+ const resolvedMask = React.useMemo(() => (mask ? resolveHref(mask) : undefined), [mask])
38
+ const link = useLinkTo({ href: resolvedHref, replace, mask: resolvedMask })
39
+ const flattenedStyle = React.useMemo<React.CSSProperties>(() => {
40
+ const styleValue: unknown = style
41
+ const styleValues: unknown[] = Array.isArray(styleValue)
42
+ ? styleValue.flat(Number.POSITIVE_INFINITY)
43
+ : [styleValue]
44
+ return styleValues.reduce<React.CSSProperties>(
45
+ (result, value) =>
46
+ value && typeof value === 'object'
47
+ ? Object.assign(result, value as React.CSSProperties)
48
+ : result,
49
+ {}
50
+ )
51
+ }, [style])
52
+
53
+ const Element = asChild ? Slot : 'a'
54
+
55
+ return (
56
+ <Element
57
+ ref={ref}
58
+ {...rest}
59
+ href={link.href}
60
+ role={link.role}
61
+ className={className}
62
+ style={flattenedStyle}
63
+ // undefined has to be omitted, not passed: with asChild it overwrites the child's own
64
+ // value, so a bare `data-testid: undefined` wipes the testID a tamagui child sets
65
+ {...(id == null ? null : { id })}
66
+ {...(rel == null ? null : { rel })}
67
+ {...(target == null ? null : { target })}
68
+ {...(download == null ? null : { download })}
69
+ {...(testID == null ? null : { 'data-testid': testID })}
70
+ {...(accessibilityLabel == null ? null : { 'aria-label': accessibilityLabel })}
71
+ {...(disabled ? { 'aria-disabled': true } : null)}
72
+ onClick={(event) => {
73
+ if (disabled) {
74
+ event.preventDefault()
75
+ return
76
+ }
77
+ onPress?.(event)
78
+ link.onPress(event)
79
+ }}
80
+ />
81
+ )
82
+ }) as unknown as OneRouter.LinkComponent
83
+
84
+ Link.resolveHref = resolveHref