expo-router 7.0.0-canary-20251230-fc48ddc → 7.0.0-canary-20260113-0ce2b9c

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 (151) hide show
  1. package/android/build.gradle +2 -2
  2. package/build/Route.d.ts +3 -5
  3. package/build/Route.d.ts.map +1 -1
  4. package/build/Route.js +2 -2
  5. package/build/Route.js.map +1 -1
  6. package/build/exports.d.ts +3 -0
  7. package/build/exports.d.ts.map +1 -1
  8. package/build/exports.js +3 -1
  9. package/build/exports.js.map +1 -1
  10. package/build/fork/native-stack/createNativeStackNavigator.d.ts.map +1 -1
  11. package/build/fork/native-stack/createNativeStackNavigator.js +9 -0
  12. package/build/fork/native-stack/createNativeStackNavigator.js.map +1 -1
  13. package/build/getRoutesCore.d.ts +2 -0
  14. package/build/getRoutesCore.d.ts.map +1 -1
  15. package/build/getRoutesCore.js.map +1 -1
  16. package/build/internal/utils.d.ts +1 -1
  17. package/build/internal/utils.d.ts.map +1 -1
  18. package/build/internal/utils.js +2 -2
  19. package/build/internal/utils.js.map +1 -1
  20. package/build/layouts/StackClient.d.ts +2 -2
  21. package/build/layouts/StackClient.d.ts.map +1 -1
  22. package/build/layouts/StackClient.js +1 -0
  23. package/build/layouts/StackClient.js.map +1 -1
  24. package/build/layouts/stack-utils/StackHeaderComponent.d.ts.map +1 -1
  25. package/build/layouts/stack-utils/StackHeaderComponent.js +3 -3
  26. package/build/layouts/stack-utils/StackHeaderComponent.js.map +1 -1
  27. package/build/layouts/stack-utils/StackHeaderMenu.d.ts.map +1 -1
  28. package/build/layouts/stack-utils/StackHeaderMenu.js +1 -0
  29. package/build/layouts/stack-utils/StackHeaderMenu.js.map +1 -1
  30. package/build/layouts/stack-utils/StackSearchBar.d.ts +7 -0
  31. package/build/layouts/stack-utils/StackSearchBar.d.ts.map +1 -0
  32. package/build/layouts/stack-utils/StackSearchBar.js +19 -0
  33. package/build/layouts/stack-utils/StackSearchBar.js.map +1 -0
  34. package/build/layouts/stack-utils/index.d.ts +2 -3
  35. package/build/layouts/stack-utils/index.d.ts.map +1 -1
  36. package/build/layouts/stack-utils/index.js +3 -4
  37. package/build/layouts/stack-utils/index.js.map +1 -1
  38. package/build/link/elements.d.ts +13 -1
  39. package/build/link/elements.d.ts.map +1 -1
  40. package/build/link/elements.js +1 -1
  41. package/build/link/elements.js.map +1 -1
  42. package/build/link/preview/native.d.ts +8 -1
  43. package/build/link/preview/native.d.ts.map +1 -1
  44. package/build/link/preview/native.js +0 -2
  45. package/build/link/preview/native.js.map +1 -1
  46. package/build/link/zoom/ZoomTransitionEnabler.d.ts +1 -1
  47. package/build/link/zoom/ZoomTransitionEnabler.d.ts.map +1 -1
  48. package/build/link/zoom/ZoomTransitionEnabler.ios.d.ts +1 -1
  49. package/build/link/zoom/ZoomTransitionEnabler.ios.d.ts.map +1 -1
  50. package/build/link/zoom/ZoomTransitionEnabler.ios.js +9 -12
  51. package/build/link/zoom/ZoomTransitionEnabler.ios.js.map +1 -1
  52. package/build/link/zoom/ZoomTransitionEnabler.js +2 -2
  53. package/build/link/zoom/ZoomTransitionEnabler.js.map +1 -1
  54. package/build/link/zoom/usePreventZoomTransitionDismissal.d.ts +36 -0
  55. package/build/link/zoom/usePreventZoomTransitionDismissal.d.ts.map +1 -0
  56. package/build/link/zoom/usePreventZoomTransitionDismissal.ios.d.ts +3 -0
  57. package/build/link/zoom/usePreventZoomTransitionDismissal.ios.d.ts.map +1 -0
  58. package/build/link/zoom/usePreventZoomTransitionDismissal.ios.js +60 -0
  59. package/build/link/zoom/usePreventZoomTransitionDismissal.ios.js.map +1 -0
  60. package/build/link/zoom/usePreventZoomTransitionDismissal.js +41 -0
  61. package/build/link/zoom/usePreventZoomTransitionDismissal.js.map +1 -0
  62. package/build/link/zoom/usePreventZoomTransitionDismissal.types.d.ts +14 -0
  63. package/build/link/zoom/usePreventZoomTransitionDismissal.types.d.ts.map +1 -0
  64. package/build/link/zoom/usePreventZoomTransitionDismissal.types.js +3 -0
  65. package/build/link/zoom/usePreventZoomTransitionDismissal.types.js.map +1 -0
  66. package/build/link/zoom/zoom-transition-context-providers.ios.d.ts.map +1 -1
  67. package/build/link/zoom/zoom-transition-context-providers.ios.js +6 -1
  68. package/build/link/zoom/zoom-transition-context-providers.ios.js.map +1 -1
  69. package/build/link/zoom/zoom-transition-context.d.ts +25 -0
  70. package/build/link/zoom/zoom-transition-context.d.ts.map +1 -1
  71. package/build/link/zoom/zoom-transition-context.js +1 -0
  72. package/build/link/zoom/zoom-transition-context.js.map +1 -1
  73. package/build/native-tabs/NativeTabsView.d.ts.map +1 -1
  74. package/build/native-tabs/NativeTabsView.js +21 -2
  75. package/build/native-tabs/NativeTabsView.js.map +1 -1
  76. package/build/native-tabs/common/elements.d.ts +8 -0
  77. package/build/native-tabs/common/elements.d.ts.map +1 -1
  78. package/build/native-tabs/common/elements.js.map +1 -1
  79. package/build/navigationParams.d.ts +20 -0
  80. package/build/navigationParams.d.ts.map +1 -1
  81. package/build/navigationParams.js +10 -1
  82. package/build/navigationParams.js.map +1 -1
  83. package/build/toolbar/elements.d.ts +81 -3
  84. package/build/toolbar/elements.d.ts.map +1 -1
  85. package/build/toolbar/elements.js +40 -6
  86. package/build/toolbar/elements.js.map +1 -1
  87. package/build/toolbar/index.d.ts +6 -5
  88. package/build/toolbar/index.d.ts.map +1 -1
  89. package/build/toolbar/index.js +5 -3
  90. package/build/toolbar/index.js.map +1 -1
  91. package/build/toolbar/native.ios.d.ts.map +1 -1
  92. package/build/toolbar/native.ios.js +3 -1
  93. package/build/toolbar/native.ios.js.map +1 -1
  94. package/build/toolbar/native.types.d.ts +17 -1
  95. package/build/toolbar/native.types.d.ts.map +1 -1
  96. package/build/toolbar/native.types.js.map +1 -1
  97. package/build/ui/Slot.d.ts.map +1 -1
  98. package/build/ui/Slot.js +44 -1
  99. package/build/ui/Slot.js.map +1 -1
  100. package/build/useScreens.d.ts +9 -2
  101. package/build/useScreens.d.ts.map +1 -1
  102. package/build/useScreens.js +7 -5
  103. package/build/useScreens.js.map +1 -1
  104. package/expo-module.config.json +1 -1
  105. package/ios/LinkPreview/LinkPreviewNativeActionView.swift +7 -0
  106. package/ios/LinkPreview/LinkPreviewNativeModule.swift +37 -3
  107. package/ios/LinkPreview/LinkZoomTransition.swift +13 -3
  108. package/ios/Toolbar/RouterToolbarHostView.swift +1 -1
  109. package/ios/Toolbar/RouterToolbarItemView.swift +35 -4
  110. package/ios/Toolbar/RouterToolbarModule.swift +4 -0
  111. package/local-maven-repo/expo/modules/router/expo.modules.router/{7.0.0-canary-20251230-fc48ddc/expo.modules.router-7.0.0-canary-20251230-fc48ddc.module → 7.0.0-canary-20260113-0ce2b9c/expo.modules.router-7.0.0-canary-20260113-0ce2b9c.module} +7 -7
  112. package/local-maven-repo/expo/modules/router/expo.modules.router/7.0.0-canary-20260113-0ce2b9c/expo.modules.router-7.0.0-canary-20260113-0ce2b9c.module.md5 +1 -0
  113. package/local-maven-repo/expo/modules/router/expo.modules.router/7.0.0-canary-20260113-0ce2b9c/expo.modules.router-7.0.0-canary-20260113-0ce2b9c.module.sha1 +1 -0
  114. package/local-maven-repo/expo/modules/router/expo.modules.router/7.0.0-canary-20260113-0ce2b9c/expo.modules.router-7.0.0-canary-20260113-0ce2b9c.module.sha256 +1 -0
  115. package/local-maven-repo/expo/modules/router/expo.modules.router/7.0.0-canary-20260113-0ce2b9c/expo.modules.router-7.0.0-canary-20260113-0ce2b9c.module.sha512 +1 -0
  116. package/local-maven-repo/expo/modules/router/expo.modules.router/{7.0.0-canary-20251230-fc48ddc/expo.modules.router-7.0.0-canary-20251230-fc48ddc.pom → 7.0.0-canary-20260113-0ce2b9c/expo.modules.router-7.0.0-canary-20260113-0ce2b9c.pom} +1 -1
  117. package/local-maven-repo/expo/modules/router/expo.modules.router/7.0.0-canary-20260113-0ce2b9c/expo.modules.router-7.0.0-canary-20260113-0ce2b9c.pom.md5 +1 -0
  118. package/local-maven-repo/expo/modules/router/expo.modules.router/7.0.0-canary-20260113-0ce2b9c/expo.modules.router-7.0.0-canary-20260113-0ce2b9c.pom.sha1 +1 -0
  119. package/local-maven-repo/expo/modules/router/expo.modules.router/7.0.0-canary-20260113-0ce2b9c/expo.modules.router-7.0.0-canary-20260113-0ce2b9c.pom.sha256 +1 -0
  120. package/local-maven-repo/expo/modules/router/expo.modules.router/7.0.0-canary-20260113-0ce2b9c/expo.modules.router-7.0.0-canary-20260113-0ce2b9c.pom.sha512 +1 -0
  121. package/local-maven-repo/expo/modules/router/expo.modules.router/maven-metadata.xml +4 -4
  122. package/local-maven-repo/expo/modules/router/expo.modules.router/maven-metadata.xml.md5 +1 -1
  123. package/local-maven-repo/expo/modules/router/expo.modules.router/maven-metadata.xml.sha1 +1 -1
  124. package/local-maven-repo/expo/modules/router/expo.modules.router/maven-metadata.xml.sha256 +1 -1
  125. package/local-maven-repo/expo/modules/router/expo.modules.router/maven-metadata.xml.sha512 +1 -1
  126. package/package.json +11 -10
  127. package/plugin/build/index.d.ts +2 -0
  128. package/plugin/options.json +5 -0
  129. package/plugin/src/index.ts +2 -0
  130. package/build/layouts/stack-utils/StackHeaderSearchBar.d.ts +0 -7
  131. package/build/layouts/stack-utils/StackHeaderSearchBar.d.ts.map +0 -1
  132. package/build/layouts/stack-utils/StackHeaderSearchBar.js +0 -16
  133. package/build/layouts/stack-utils/StackHeaderSearchBar.js.map +0 -1
  134. package/local-maven-repo/expo/modules/router/expo.modules.router/7.0.0-canary-20251230-fc48ddc/expo.modules.router-7.0.0-canary-20251230-fc48ddc.module.md5 +0 -1
  135. package/local-maven-repo/expo/modules/router/expo.modules.router/7.0.0-canary-20251230-fc48ddc/expo.modules.router-7.0.0-canary-20251230-fc48ddc.module.sha1 +0 -1
  136. package/local-maven-repo/expo/modules/router/expo.modules.router/7.0.0-canary-20251230-fc48ddc/expo.modules.router-7.0.0-canary-20251230-fc48ddc.module.sha256 +0 -1
  137. package/local-maven-repo/expo/modules/router/expo.modules.router/7.0.0-canary-20251230-fc48ddc/expo.modules.router-7.0.0-canary-20251230-fc48ddc.module.sha512 +0 -1
  138. package/local-maven-repo/expo/modules/router/expo.modules.router/7.0.0-canary-20251230-fc48ddc/expo.modules.router-7.0.0-canary-20251230-fc48ddc.pom.md5 +0 -1
  139. package/local-maven-repo/expo/modules/router/expo.modules.router/7.0.0-canary-20251230-fc48ddc/expo.modules.router-7.0.0-canary-20251230-fc48ddc.pom.sha1 +0 -1
  140. package/local-maven-repo/expo/modules/router/expo.modules.router/7.0.0-canary-20251230-fc48ddc/expo.modules.router-7.0.0-canary-20251230-fc48ddc.pom.sha256 +0 -1
  141. package/local-maven-repo/expo/modules/router/expo.modules.router/7.0.0-canary-20251230-fc48ddc/expo.modules.router-7.0.0-canary-20251230-fc48ddc.pom.sha512 +0 -1
  142. /package/local-maven-repo/expo/modules/router/expo.modules.router/{7.0.0-canary-20251230-fc48ddc/expo.modules.router-7.0.0-canary-20251230-fc48ddc-sources.jar → 7.0.0-canary-20260113-0ce2b9c/expo.modules.router-7.0.0-canary-20260113-0ce2b9c-sources.jar} +0 -0
  143. /package/local-maven-repo/expo/modules/router/expo.modules.router/{7.0.0-canary-20251230-fc48ddc/expo.modules.router-7.0.0-canary-20251230-fc48ddc-sources.jar.md5 → 7.0.0-canary-20260113-0ce2b9c/expo.modules.router-7.0.0-canary-20260113-0ce2b9c-sources.jar.md5} +0 -0
  144. /package/local-maven-repo/expo/modules/router/expo.modules.router/{7.0.0-canary-20251230-fc48ddc/expo.modules.router-7.0.0-canary-20251230-fc48ddc-sources.jar.sha1 → 7.0.0-canary-20260113-0ce2b9c/expo.modules.router-7.0.0-canary-20260113-0ce2b9c-sources.jar.sha1} +0 -0
  145. /package/local-maven-repo/expo/modules/router/expo.modules.router/{7.0.0-canary-20251230-fc48ddc/expo.modules.router-7.0.0-canary-20251230-fc48ddc-sources.jar.sha256 → 7.0.0-canary-20260113-0ce2b9c/expo.modules.router-7.0.0-canary-20260113-0ce2b9c-sources.jar.sha256} +0 -0
  146. /package/local-maven-repo/expo/modules/router/expo.modules.router/{7.0.0-canary-20251230-fc48ddc/expo.modules.router-7.0.0-canary-20251230-fc48ddc-sources.jar.sha512 → 7.0.0-canary-20260113-0ce2b9c/expo.modules.router-7.0.0-canary-20260113-0ce2b9c-sources.jar.sha512} +0 -0
  147. /package/local-maven-repo/expo/modules/router/expo.modules.router/{7.0.0-canary-20251230-fc48ddc/expo.modules.router-7.0.0-canary-20251230-fc48ddc.aar → 7.0.0-canary-20260113-0ce2b9c/expo.modules.router-7.0.0-canary-20260113-0ce2b9c.aar} +0 -0
  148. /package/local-maven-repo/expo/modules/router/expo.modules.router/{7.0.0-canary-20251230-fc48ddc/expo.modules.router-7.0.0-canary-20251230-fc48ddc.aar.md5 → 7.0.0-canary-20260113-0ce2b9c/expo.modules.router-7.0.0-canary-20260113-0ce2b9c.aar.md5} +0 -0
  149. /package/local-maven-repo/expo/modules/router/expo.modules.router/{7.0.0-canary-20251230-fc48ddc/expo.modules.router-7.0.0-canary-20251230-fc48ddc.aar.sha1 → 7.0.0-canary-20260113-0ce2b9c/expo.modules.router-7.0.0-canary-20260113-0ce2b9c.aar.sha1} +0 -0
  150. /package/local-maven-repo/expo/modules/router/expo.modules.router/{7.0.0-canary-20251230-fc48ddc/expo.modules.router-7.0.0-canary-20251230-fc48ddc.aar.sha256 → 7.0.0-canary-20260113-0ce2b9c/expo.modules.router-7.0.0-canary-20260113-0ce2b9c.aar.sha256} +0 -0
  151. /package/local-maven-repo/expo/modules/router/expo.modules.router/{7.0.0-canary-20251230-fc48ddc/expo.modules.router-7.0.0-canary-20251230-fc48ddc.aar.sha512 → 7.0.0-canary-20260113-0ce2b9c/expo.modules.router-7.0.0-canary-20260113-0ce2b9c.aar.sha512} +0 -0
@@ -1 +1 @@
1
- {"version":3,"file":"useScreens.js","sourceRoot":"","sources":["../src/useScreens.tsx"],"names":[],"mappings":"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","sourcesContent":["'use client';\n\nimport {\n useStateForPath,\n type EventConsumer,\n type EventMapBase,\n type NavigationState,\n type ParamListBase,\n type RouteProp,\n type ScreenListeners,\n} from '@react-navigation/native';\nimport type { NativeStackNavigationEventMap } from '@react-navigation/native-stack';\nimport React, { useEffect, useMemo } from 'react';\n\nimport { LoadedRoute, Route, RouteNode, sortRoutesWithInitial, useRouteNode } from './Route';\nimport { getPathFromState } from './fork/getPathFromState';\nimport { useExpoRouterStore } from './global-state/storeContext';\nimport EXPO_ROUTER_IMPORT_MODE from './import-mode';\nimport { ZoomTransitionEnabler } from './link/zoom/ZoomTransitionEnabler';\nimport { ZoomTransitionTargetContextProvider } from './link/zoom/zoom-transition-context-providers';\nimport { unstable_navigationEvents } from './navigationEvents';\nimport {\n hasParam,\n INTERNAL_EXPO_ROUTER_NO_ANIMATION_PARAM_NAME,\n removeParams,\n} from './navigationParams';\nimport { Screen } from './primitives';\nimport { UnknownOutputParams } from './types';\nimport { EmptyRoute } from './views/EmptyRoute';\nimport { SuspenseFallback } from './views/SuspenseFallback';\nimport { Try } from './views/Try';\n\nexport type ScreenProps<\n TOptions extends Record<string, any> = Record<string, any>,\n TState extends NavigationState = NavigationState,\n TEventMap extends EventMapBase = EventMapBase,\n> = {\n /** Name is required when used inside a Layout component. */\n name?: string;\n /**\n * Redirect to the nearest sibling route.\n * If all children are `redirect={true}`, the layout will render `null` as there are no children to render.\n */\n redirect?: boolean;\n initialParams?: Record<string, any>;\n options?:\n | TOptions\n | ((prop: { route: RouteProp<ParamListBase, string>; navigation: any }) => TOptions);\n\n listeners?:\n | ScreenListeners<TState, TEventMap>\n | ((prop: {\n route: RouteProp<ParamListBase, string>;\n navigation: any;\n }) => ScreenListeners<TState, TEventMap>);\n\n getId?: ({ params }: { params?: Record<string, any> }) => string | undefined;\n\n dangerouslySingular?: SingularOptions;\n};\n\nexport type SingularOptions =\n | boolean\n | ((name: string, params: UnknownOutputParams) => string | undefined);\n\nfunction getSortedChildren(\n children: RouteNode[],\n order: ScreenProps[] = [],\n initialRouteName?: string\n): { route: RouteNode; props: Partial<ScreenProps> }[] {\n if (!order?.length) {\n return children\n .sort(sortRoutesWithInitial(initialRouteName))\n .map((route) => ({ route, props: {} }));\n }\n const entries = [...children];\n\n const ordered = order\n .map(\n ({\n name,\n redirect,\n initialParams,\n listeners,\n options,\n getId,\n dangerouslySingular: singular,\n }) => {\n if (!entries.length) {\n console.warn(\n `[Layout children]: Too many screens defined. Route \"${name}\" is extraneous.`\n );\n return null;\n }\n const matchIndex = entries.findIndex((child) => child.route === name);\n if (matchIndex === -1) {\n console.warn(\n `[Layout children]: No route named \"${name}\" exists in nested children:`,\n children.map(({ route }) => route)\n );\n return null;\n } else {\n // Get match and remove from entries\n const match = entries[matchIndex];\n entries.splice(matchIndex, 1);\n\n // Ensure to return null after removing from entries.\n if (redirect) {\n if (typeof redirect === 'string') {\n throw new Error(`Redirecting to a specific route is not supported yet.`);\n }\n return null;\n }\n\n if (getId) {\n console.warn(\n `Deprecated: prop 'getId' on screen ${name} is deprecated. Please rename the prop to 'dangerouslySingular'`\n );\n if (singular) {\n console.warn(\n `Screen ${name} cannot use both getId and dangerouslySingular together.`\n );\n }\n } else if (singular) {\n // If singular is set, use it as the getId function.\n if (typeof singular === 'string') {\n getId = () => singular;\n } else if (typeof singular === 'function' && name) {\n getId = (options) => singular(name, options.params || {});\n } else if (singular === true && name) {\n getId = (options) => getSingularId(name, options);\n }\n }\n\n return {\n route: match,\n props: { initialParams, listeners, options, getId },\n };\n }\n }\n )\n .filter(Boolean) as {\n route: RouteNode;\n props: Partial<ScreenProps>;\n }[];\n\n // Add any remaining children\n ordered.push(\n ...entries.sort(sortRoutesWithInitial(initialRouteName)).map((route) => ({ route, props: {} }))\n );\n\n return ordered;\n}\n\n/**\n * @returns React Navigation screens sorted by the `route` property.\n */\nexport function useSortedScreens(\n order: ScreenProps[],\n protectedScreens: Set<string>,\n useOnlyUserDefinedScreens: boolean = false\n): React.ReactNode[] {\n const node = useRouteNode();\n\n const nodeChildren = node?.children ?? [];\n const children = useOnlyUserDefinedScreens\n ? nodeChildren.filter((child) =>\n order.some((userDefinedScreen) => userDefinedScreen.name === child.route)\n )\n : nodeChildren;\n\n const sorted = children.length ? getSortedChildren(children, order, node?.initialRouteName) : [];\n return React.useMemo(\n () =>\n sorted\n .filter((item) => !protectedScreens.has(item.route.route))\n .map((value) => {\n return routeToScreen(value.route, value.props);\n }),\n [sorted, protectedScreens]\n );\n}\n\nfunction fromImport(value: RouteNode, { ErrorBoundary, ...component }: LoadedRoute) {\n // If possible, add a more helpful display name for the component stack to improve debugging of React errors such as `Text strings must be rendered within a <Text> component.`.\n if (component?.default && __DEV__) {\n component.default.displayName ??= `${component.default.name ?? 'Route'}(${value.contextKey})`;\n }\n\n if (ErrorBoundary) {\n const Wrapped = React.forwardRef((props: any, ref: any) => {\n const children = React.createElement(component.default || EmptyRoute, {\n ...props,\n ref,\n });\n return <Try catch={ErrorBoundary}>{children}</Try>;\n });\n\n if (__DEV__) {\n Wrapped.displayName = `ErrorBoundary(${value.contextKey})`;\n }\n\n return {\n default: Wrapped,\n };\n }\n if (process.env.NODE_ENV !== 'production') {\n if (\n typeof component.default === 'object' &&\n component.default &&\n Object.keys(component.default).length === 0\n ) {\n return { default: EmptyRoute };\n }\n }\n\n return { default: component.default };\n}\n\nfunction fromLoadedRoute(value: RouteNode, res: LoadedRoute) {\n if (!(res instanceof Promise)) {\n return fromImport(value, res);\n }\n\n return res.then(fromImport.bind(null, value));\n}\n\n// TODO: Maybe there's a more React-y way to do this?\n// Without this store, the process enters a recursive loop.\nconst qualifiedStore = new WeakMap<RouteNode, React.ComponentType<any>>();\n\n/** Wrap the component with various enhancements and add access to child routes. */\nexport function getQualifiedRouteComponent(value: RouteNode) {\n if (qualifiedStore.has(value)) {\n return qualifiedStore.get(value)!;\n }\n\n let ScreenComponent:\n | React.ForwardRefExoticComponent<React.RefAttributes<unknown>>\n | React.ComponentType<any>;\n\n // TODO: This ensures sync doesn't use React.lazy, but it's not ideal.\n if (EXPO_ROUTER_IMPORT_MODE === 'lazy') {\n ScreenComponent = React.lazy(async () => {\n const res = value.loadRoute();\n return fromLoadedRoute(value, res) as Promise<{\n default: React.ComponentType<any>;\n }>;\n });\n\n if (__DEV__) {\n ScreenComponent.displayName = `AsyncRoute(${value.route})`;\n }\n } else {\n const res = value.loadRoute();\n ScreenComponent = fromImport(value, res).default!;\n }\n function BaseRoute({\n // Remove these React Navigation props to\n // enforce usage of expo-router hooks (where the query params are correct).\n route,\n navigation,\n\n // Pass all other props to the component\n ...props\n }: any) {\n const stateForPath = useStateForPath();\n const isFocused = navigation.isFocused();\n const store = useExpoRouterStore();\n\n if (isFocused) {\n const state = navigation.getState();\n const isLeaf = !('state' in state.routes[state.index]);\n if (isLeaf && stateForPath) store.setFocusedState(stateForPath);\n }\n\n useEffect(\n () =>\n navigation.addListener('focus', () => {\n const state = navigation.getState();\n const isLeaf = !('state' in state.routes[state.index]);\n // Because setFocusedState caches the route info, this call will only trigger rerenders\n // if the component itself didn’t rerender and the route info changed.\n // Otherwise, the update from the `if` above will handle it,\n // and this won’t cause a redundant second update.\n if (isLeaf && stateForPath) store.setFocusedState(stateForPath);\n }),\n [navigation]\n );\n\n useEffect(() => {\n return navigation.addListener(\n 'transitionEnd',\n (e?: NativeStackNavigationEventMap['transitionEnd']) => {\n if (!e?.data?.closing) {\n // When navigating to a screen, remove the no animation param to re-enable animations\n // Otherwise the navigation back would also have no animation\n if (hasParam(route?.params, INTERNAL_EXPO_ROUTER_NO_ANIMATION_PARAM_NAME)) {\n navigation.replaceParams(\n removeParams(route?.params, [INTERNAL_EXPO_ROUTER_NO_ANIMATION_PARAM_NAME])\n );\n }\n }\n }\n );\n }, [navigation]);\n\n return (\n <Route node={value} route={route}>\n {value.type === 'route' && unstable_navigationEvents.hasAnyListener() && (\n <AnalyticsListeners navigation={navigation} screenId={route.key} />\n )}\n <ZoomTransitionEnabler route={route} />\n <ZoomTransitionTargetContextProvider route={route}>\n <React.Suspense fallback={<SuspenseFallback route={value} />}>\n <ScreenComponent\n {...props}\n // Expose the template segment path, e.g. `(home)`, `[foo]`, `index`\n // the intention is to make it possible to deduce shared routes.\n segment={value.route}\n />\n </React.Suspense>\n </ZoomTransitionTargetContextProvider>\n </Route>\n );\n }\n\n if (__DEV__) {\n BaseRoute.displayName = `Route(${value.route})`;\n }\n\n qualifiedStore.set(value, BaseRoute);\n return BaseRoute;\n}\n\nfunction AnalyticsListeners({\n navigation,\n screenId,\n}: {\n navigation: EventConsumer<EventMapBase>;\n screenId: string;\n}) {\n const stateForPath = useStateForPath();\n const isFirstRenderRef = React.useRef(true);\n\n const pathname = useMemo(\n () => (stateForPath ? decodeURIComponent(getPathFromState(stateForPath)) : undefined),\n [stateForPath]\n );\n\n if (isFirstRenderRef.current) {\n isFirstRenderRef.current = false;\n if (pathname) {\n unstable_navigationEvents.emit('pageWillRender', {\n pathname,\n screenId,\n });\n }\n }\n\n useEffect(() => {\n if (pathname) {\n return () => {\n unstable_navigationEvents.emit('pageRemoved', {\n pathname,\n screenId,\n });\n };\n }\n return () => {};\n }, [pathname]);\n\n useEffect(() => {\n if (pathname) {\n const cleanFocus = navigation.addListener('focus', () => {\n unstable_navigationEvents.emit('pageFocused', {\n pathname,\n screenId,\n });\n });\n const cleanBlur = navigation.addListener('blur', () => {\n unstable_navigationEvents.emit('pageBlurred', {\n pathname,\n screenId,\n });\n });\n return () => {\n cleanFocus();\n cleanBlur();\n };\n }\n return () => {};\n }, [navigation, pathname]);\n\n return null;\n}\n\nexport function screenOptionsFactory(\n route: RouteNode,\n options?: ScreenProps['options']\n): ScreenProps['options'] {\n return (args) => {\n // Only eager load generated components\n const staticOptions = route.generated ? route.loadRoute()?.getNavOptions : null;\n const staticResult = typeof staticOptions === 'function' ? staticOptions(args) : staticOptions;\n const dynamicResult = typeof options === 'function' ? options?.(args) : options;\n const output = {\n ...staticResult,\n ...dynamicResult,\n };\n\n // Prevent generated screens from showing up in the tab bar.\n if (route.internal) {\n output.tabBarItemStyle = { display: 'none' };\n output.tabBarButton = () => null;\n // TODO: React Navigation doesn't provide a way to prevent rendering the drawer item.\n output.drawerItemStyle = { height: 0, display: 'none' };\n }\n\n return output;\n };\n}\n\nexport function routeToScreen(\n route: RouteNode,\n { options, getId, ...props }: Partial<ScreenProps> = {}\n) {\n return (\n <Screen\n {...props}\n name={route.route}\n key={route.route}\n getId={getId}\n options={screenOptionsFactory(route, options)}\n getComponent={() => getQualifiedRouteComponent(route)}\n />\n );\n}\n\nexport function getSingularId(name: string, options: Record<string, any> = {}) {\n return name\n .split('/')\n .map((segment) => {\n if (segment.startsWith('[...')) {\n return options.params?.[segment.slice(4, -1)]?.join('/') || segment;\n } else if (segment.startsWith('[') && segment.endsWith(']')) {\n return options.params?.[segment.slice(1, -1)] || segment;\n } else {\n return segment;\n }\n })\n .join('/');\n}\n"]}
1
+ {"version":3,"file":"useScreens.js","sourceRoot":"","sources":["../src/useScreens.tsx"],"names":[],"mappings":";AAAA,YAAY,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA+Jb,4CAwBC;AAmDD,gEAoHC;AAgED,oDAwBC;AAED,sCAcC;AAED,sCAaC;AAldD,qDASkC;AAElC,+CAAkD;AAElD,mCAA6F;AAC7F,8DAA2D;AAC3D,8DAAiE;AACjE,gEAAoD;AACpD,6EAA0E;AAC1E,qGAAoG;AACpG,yDAA+D;AAC/D,yDAI4B;AAC5B,6CAAsC;AAEtC,mDAAgD;AAChD,+DAA4D;AAC5D,qCAAkC;AAmClC,SAAS,iBAAiB,CACxB,QAAqB,EACrB,QAAuB,EAAE,EACzB,gBAAyB;IAEzB,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,CAAC;QACnB,OAAO,QAAQ;aACZ,IAAI,CAAC,IAAA,6BAAqB,EAAC,gBAAgB,CAAC,CAAC;aAC7C,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC;IAC5C,CAAC;IACD,MAAM,OAAO,GAAG,CAAC,GAAG,QAAQ,CAAC,CAAC;IAE9B,MAAM,OAAO,GAAG,KAAK;SAClB,GAAG,CACF,CAAC,EACC,IAAI,EACJ,QAAQ,EACR,aAAa,EACb,SAAS,EACT,OAAO,EACP,KAAK,EACL,mBAAmB,EAAE,QAAQ,GAC9B,EAAE,EAAE;QACH,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC;YACpB,OAAO,CAAC,IAAI,CACV,uDAAuD,IAAI,kBAAkB,CAC9E,CAAC;YACF,OAAO,IAAI,CAAC;QACd,CAAC;QACD,MAAM,UAAU,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,KAAK,KAAK,IAAI,CAAC,CAAC;QACtE,IAAI,UAAU,KAAK,CAAC,CAAC,EAAE,CAAC;YACtB,OAAO,CAAC,IAAI,CACV,sCAAsC,IAAI,8BAA8B,EACxE,QAAQ,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,KAAK,CAAC,CACnC,CAAC;YACF,OAAO,IAAI,CAAC;QACd,CAAC;aAAM,CAAC;YACN,oCAAoC;YACpC,MAAM,KAAK,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;YAClC,OAAO,CAAC,MAAM,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC;YAE9B,qDAAqD;YACrD,IAAI,QAAQ,EAAE,CAAC;gBACb,IAAI,OAAO,QAAQ,KAAK,QAAQ,EAAE,CAAC;oBACjC,MAAM,IAAI,KAAK,CAAC,uDAAuD,CAAC,CAAC;gBAC3E,CAAC;gBACD,OAAO,IAAI,CAAC;YACd,CAAC;YAED,IAAI,KAAK,EAAE,CAAC;gBACV,OAAO,CAAC,IAAI,CACV,sCAAsC,IAAI,iEAAiE,CAC5G,CAAC;gBACF,IAAI,QAAQ,EAAE,CAAC;oBACb,OAAO,CAAC,IAAI,CACV,UAAU,IAAI,0DAA0D,CACzE,CAAC;gBACJ,CAAC;YACH,CAAC;iBAAM,IAAI,QAAQ,EAAE,CAAC;gBACpB,oDAAoD;gBACpD,IAAI,OAAO,QAAQ,KAAK,QAAQ,EAAE,CAAC;oBACjC,KAAK,GAAG,GAAG,EAAE,CAAC,QAAQ,CAAC;gBACzB,CAAC;qBAAM,IAAI,OAAO,QAAQ,KAAK,UAAU,IAAI,IAAI,EAAE,CAAC;oBAClD,KAAK,GAAG,CAAC,OAAO,EAAE,EAAE,CAAC,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC;gBAC5D,CAAC;qBAAM,IAAI,QAAQ,KAAK,IAAI,IAAI,IAAI,EAAE,CAAC;oBACrC,KAAK,GAAG,CAAC,OAAO,EAAE,EAAE,CAAC,aAAa,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;gBACpD,CAAC;YACH,CAAC;YAED,OAAO;gBACL,KAAK,EAAE,KAAK;gBACZ,KAAK,EAAE,EAAE,aAAa,EAAE,SAAS,EAAE,OAAO,EAAE,KAAK,EAAE;aACpD,CAAC;QACJ,CAAC;IACH,CAAC,CACF;SACA,MAAM,CAAC,OAAO,CAGd,CAAC;IAEJ,6BAA6B;IAC7B,OAAO,CAAC,IAAI,CACV,GAAG,OAAO,CAAC,IAAI,CAAC,IAAA,6BAAqB,EAAC,gBAAgB,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,CAAC,CAChG,CAAC;IAEF,OAAO,OAAO,CAAC;AACjB,CAAC;AAED;;GAEG;AACH,SAAgB,gBAAgB,CAC9B,KAAoB,EACpB,gBAA6B,EAC7B,4BAAqC,KAAK;IAE1C,MAAM,IAAI,GAAG,IAAA,oBAAY,GAAE,CAAC;IAE5B,MAAM,YAAY,GAAG,IAAI,EAAE,QAAQ,IAAI,EAAE,CAAC;IAC1C,MAAM,QAAQ,GAAG,yBAAyB;QACxC,CAAC,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAC5B,KAAK,CAAC,IAAI,CAAC,CAAC,iBAAiB,EAAE,EAAE,CAAC,iBAAiB,CAAC,IAAI,KAAK,KAAK,CAAC,KAAK,CAAC,CAC1E;QACH,CAAC,CAAC,YAAY,CAAC;IAEjB,MAAM,MAAM,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,iBAAiB,CAAC,QAAQ,EAAE,KAAK,EAAE,IAAI,EAAE,gBAAgB,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IACjG,OAAO,eAAK,CAAC,OAAO,CAClB,GAAG,EAAE,CACH,MAAM;SACH,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,gBAAgB,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;SACzD,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE;QACb,OAAO,aAAa,CAAC,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC;IACjD,CAAC,CAAC,EACN,CAAC,MAAM,EAAE,gBAAgB,CAAC,CAC3B,CAAC;AACJ,CAAC;AAED,SAAS,UAAU,CAAC,KAAgB,EAAE,EAAE,aAAa,EAAE,GAAG,SAAS,EAAe;IAChF,gLAAgL;IAChL,IAAI,SAAS,EAAE,OAAO,IAAI,OAAO,EAAE,CAAC;QAClC,SAAS,CAAC,OAAO,CAAC,WAAW,KAAK,GAAG,SAAS,CAAC,OAAO,CAAC,IAAI,IAAI,OAAO,IAAI,KAAK,CAAC,UAAU,GAAG,CAAC;IAChG,CAAC;IAED,IAAI,aAAa,EAAE,CAAC;QAClB,MAAM,OAAO,GAAG,eAAK,CAAC,UAAU,CAAC,CAAC,KAAU,EAAE,GAAQ,EAAE,EAAE;YACxD,MAAM,QAAQ,GAAG,eAAK,CAAC,aAAa,CAAC,SAAS,CAAC,OAAO,IAAI,uBAAU,EAAE;gBACpE,GAAG,KAAK;gBACR,GAAG;aACJ,CAAC,CAAC;YACH,OAAO,CAAC,SAAG,CAAC,KAAK,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,QAAQ,CAAC,EAAE,SAAG,CAAC,CAAC;QACrD,CAAC,CAAC,CAAC;QAEH,IAAI,OAAO,EAAE,CAAC;YACZ,OAAO,CAAC,WAAW,GAAG,iBAAiB,KAAK,CAAC,UAAU,GAAG,CAAC;QAC7D,CAAC;QAED,OAAO;YACL,OAAO,EAAE,OAAO;SACjB,CAAC;IACJ,CAAC;IACD,IAAI,OAAO,CAAC,GAAG,CAAC,QAAQ,KAAK,YAAY,EAAE,CAAC;QAC1C,IACE,OAAO,SAAS,CAAC,OAAO,KAAK,QAAQ;YACrC,SAAS,CAAC,OAAO;YACjB,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,MAAM,KAAK,CAAC,EAC3C,CAAC;YACD,OAAO,EAAE,OAAO,EAAE,uBAAU,EAAE,CAAC;QACjC,CAAC;IACH,CAAC;IAED,OAAO,EAAE,OAAO,EAAE,SAAS,CAAC,OAAO,EAAE,CAAC;AACxC,CAAC;AAED,SAAS,eAAe,CAAC,KAAgB,EAAE,GAAgB;IACzD,IAAI,CAAC,CAAC,GAAG,YAAY,OAAO,CAAC,EAAE,CAAC;QAC9B,OAAO,UAAU,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;IAChC,CAAC;IAED,OAAO,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC;AAChD,CAAC;AAED,qDAAqD;AACrD,2DAA2D;AAC3D,MAAM,cAAc,GAAG,IAAI,OAAO,EAAuC,CAAC;AAE1E,mFAAmF;AACnF,SAAgB,0BAA0B,CAAC,KAAgB;IACzD,IAAI,cAAc,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC;QAC9B,OAAO,cAAc,CAAC,GAAG,CAAC,KAAK,CAAE,CAAC;IACpC,CAAC;IAED,IAAI,eAEyC,CAAC;IAE9C,sEAAsE;IACtE,IAAI,qBAAuB,KAAK,MAAM,EAAE,CAAC;QACvC,eAAe,GAAG,eAAK,CAAC,IAAI,CAAC,KAAK,IAAI,EAAE;YACtC,MAAM,GAAG,GAAG,KAAK,CAAC,SAAS,EAAE,CAAC;YAC9B,OAAO,eAAe,CAAC,KAAK,EAAE,GAAG,CAE/B,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,IAAI,OAAO,EAAE,CAAC;YACZ,eAAe,CAAC,WAAW,GAAG,cAAc,KAAK,CAAC,KAAK,GAAG,CAAC;QAC7D,CAAC;IACH,CAAC;SAAM,CAAC;QACN,MAAM,GAAG,GAAG,KAAK,CAAC,SAAS,EAAE,CAAC;QAC9B,eAAe,GAAG,UAAU,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,OAAQ,CAAC;IACpD,CAAC;IACD,SAAS,SAAS,CAAC;IACjB,yCAAyC;IACzC,2EAA2E;IAC3E,KAAK,EACL,UAAU;IAEV,wCAAwC;IACxC,GAAG,KAAK,EAgBT;QACC,MAAM,YAAY,GAAG,IAAA,wBAAe,GAAE,CAAC;QACvC,MAAM,SAAS,GAAG,UAAU,CAAC,SAAS,EAAE,CAAC;QACzC,MAAM,KAAK,GAAG,IAAA,iCAAkB,GAAE,CAAC;QAEnC,IAAI,SAAS,EAAE,CAAC;YACd,MAAM,KAAK,GAAG,UAAU,CAAC,QAAQ,EAAE,CAAC;YACpC,MAAM,MAAM,GAAG,CAAC,CAAC,KAAK,IAAI,OAAO,IAAI,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC;YAChE,IAAI,MAAM,IAAI,YAAY;gBAAE,KAAK,CAAC,eAAe,CAAC,YAAY,CAAC,CAAC;QAClE,CAAC;QAED,IAAA,iBAAS,EACP,GAAG,EAAE,CACH,UAAU,CAAC,WAAW,CAAC,OAAO,EAAE,GAAG,EAAE;YACnC,MAAM,KAAK,GAAG,UAAU,CAAC,QAAQ,EAAE,CAAC;YACpC,MAAM,MAAM,GAAG,CAAC,CAAC,KAAK,IAAI,OAAO,IAAI,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC;YAChE,uFAAuF;YACvF,sEAAsE;YACtE,4DAA4D;YAC5D,kDAAkD;YAClD,IAAI,MAAM,IAAI,YAAY;gBAAE,KAAK,CAAC,eAAe,CAAC,YAAY,CAAC,CAAC;QAClE,CAAC,CAAC,EACJ,CAAC,UAAU,CAAC,CACb,CAAC;QAEF,IAAA,iBAAS,EAAC,GAAG,EAAE;YACb,OAAO,UAAU,CAAC,WAAW,CAAC,eAAe,EAAE,CAAC,CAAC,EAAE,EAAE;gBACnD,IAAI,CAAC,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;oBACtB,qFAAqF;oBACrF,6DAA6D;oBAC7D,IAAI,IAAA,2BAAQ,EAAC,KAAK,EAAE,MAAM,EAAE,+DAA4C,CAAC,EAAE,CAAC;wBAC1E,UAAU,CAAC,aAAa,CACtB,IAAA,+BAAY,EAAC,KAAK,EAAE,MAAM,EAAE,CAAC,+DAA4C,CAAC,CAAC,CAC5E,CAAC;oBACJ,CAAC;gBACH,CAAC;YACH,CAAC,CAAC,CAAC;QACL,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC;QAEjB,MAAM,WAAW,GAAG,KAAK,CAAC,IAAI,KAAK,OAAO,CAAC;QAC3C,MAAM,WAAW,GAAG,CAAC,CAAC,KAAK,EAAE,GAAG,CAAC;QAEjC,OAAO,CACL,CAAC,aAAK,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,MAAM,CAAC,CACxC;QAAA,CAAC,WAAW,IAAI,WAAW,IAAI,4CAAyB,CAAC,cAAc,EAAE,IAAI,CAC3E,CAAC,kBAAkB,CAAC,UAAU,CAAC,CAAC,UAAU,CAAC,CAAC,QAAQ,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,EAAG,CACpE,CACD;QAAA,CAAC,uEAAmC,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAChD;UAAA,CAAC,6CAAqB,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,EACpC;UAAA,CAAC,eAAK,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC,mCAAgB,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,EAAG,CAAC,CAC3D;YAAA,CAAC,eAAe,CACd,IAAI,KAAK,CAAC;QACV,oEAAoE;QACpE,gEAAgE;QAChE,OAAO,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,EAEzB;UAAA,EAAE,eAAK,CAAC,QAAQ,CAClB;QAAA,EAAE,uEAAmC,CACvC;MAAA,EAAE,aAAK,CAAC,CACT,CAAC;IACJ,CAAC;IAED,IAAI,OAAO,EAAE,CAAC;QACZ,SAAS,CAAC,WAAW,GAAG,SAAS,KAAK,CAAC,KAAK,GAAG,CAAC;IAClD,CAAC;IAED,cAAc,CAAC,GAAG,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC;IACrC,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,SAAS,kBAAkB,CAAC,EAC1B,UAAU,EACV,QAAQ,GAIT;IACC,MAAM,YAAY,GAAG,IAAA,wBAAe,GAAE,CAAC;IACvC,MAAM,gBAAgB,GAAG,eAAK,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IAE5C,MAAM,QAAQ,GAAG,IAAA,eAAO,EACtB,GAAG,EAAE,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,kBAAkB,CAAC,IAAA,mCAAgB,EAAC,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,EACrF,CAAC,YAAY,CAAC,CACf,CAAC;IAEF,IAAI,gBAAgB,CAAC,OAAO,EAAE,CAAC;QAC7B,gBAAgB,CAAC,OAAO,GAAG,KAAK,CAAC;QACjC,IAAI,QAAQ,EAAE,CAAC;YACb,4CAAyB,CAAC,IAAI,CAAC,gBAAgB,EAAE;gBAC/C,QAAQ;gBACR,QAAQ;aACT,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,IAAA,iBAAS,EAAC,GAAG,EAAE;QACb,IAAI,QAAQ,EAAE,CAAC;YACb,OAAO,GAAG,EAAE;gBACV,4CAAyB,CAAC,IAAI,CAAC,aAAa,EAAE;oBAC5C,QAAQ;oBACR,QAAQ;iBACT,CAAC,CAAC;YACL,CAAC,CAAC;QACJ,CAAC;QACD,OAAO,GAAG,EAAE,GAAE,CAAC,CAAC;IAClB,CAAC,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC;IAEf,IAAA,iBAAS,EAAC,GAAG,EAAE;QACb,IAAI,QAAQ,EAAE,CAAC;YACb,MAAM,UAAU,GAAG,UAAU,CAAC,WAAW,CAAC,OAAO,EAAE,GAAG,EAAE;gBACtD,4CAAyB,CAAC,IAAI,CAAC,aAAa,EAAE;oBAC5C,QAAQ;oBACR,QAAQ;iBACT,CAAC,CAAC;YACL,CAAC,CAAC,CAAC;YACH,MAAM,SAAS,GAAG,UAAU,CAAC,WAAW,CAAC,MAAM,EAAE,GAAG,EAAE;gBACpD,4CAAyB,CAAC,IAAI,CAAC,aAAa,EAAE;oBAC5C,QAAQ;oBACR,QAAQ;iBACT,CAAC,CAAC;YACL,CAAC,CAAC,CAAC;YACH,OAAO,GAAG,EAAE;gBACV,UAAU,EAAE,CAAC;gBACb,SAAS,EAAE,CAAC;YACd,CAAC,CAAC;QACJ,CAAC;QACD,OAAO,GAAG,EAAE,GAAE,CAAC,CAAC;IAClB,CAAC,EAAE,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC,CAAC;IAE3B,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAgB,oBAAoB,CAClC,KAAgB,EAChB,OAAgC;IAEhC,OAAO,CAAC,IAAI,EAAE,EAAE;QACd,uCAAuC;QACvC,MAAM,aAAa,GAAG,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,SAAS,EAAE,EAAE,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC;QAChF,MAAM,YAAY,GAAG,OAAO,aAAa,KAAK,UAAU,CAAC,CAAC,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC;QAC/F,MAAM,aAAa,GAAG,OAAO,OAAO,KAAK,UAAU,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC;QAChF,MAAM,MAAM,GAAG;YACb,GAAG,YAAY;YACf,GAAG,aAAa;SACjB,CAAC;QAEF,4DAA4D;QAC5D,IAAI,KAAK,CAAC,QAAQ,EAAE,CAAC;YACnB,MAAM,CAAC,eAAe,GAAG,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC;YAC7C,MAAM,CAAC,YAAY,GAAG,GAAG,EAAE,CAAC,IAAI,CAAC;YACjC,qFAAqF;YACrF,MAAM,CAAC,eAAe,GAAG,EAAE,MAAM,EAAE,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC;QAC1D,CAAC;QAED,OAAO,MAAM,CAAC;IAChB,CAAC,CAAC;AACJ,CAAC;AAED,SAAgB,aAAa,CAC3B,KAAgB,EAChB,EAAE,OAAO,EAAE,KAAK,EAAE,GAAG,KAAK,KAA2B,EAAE;IAEvD,OAAO,CACL,CAAC,mBAAM,CACL,IAAI,KAAK,CAAC,CACV,IAAI,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAClB,GAAG,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CACjB,KAAK,CAAC,CAAC,KAAK,CAAC,CACb,OAAO,CAAC,CAAC,oBAAoB,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC,CAC9C,YAAY,CAAC,CAAC,GAAG,EAAE,CAAC,0BAA0B,CAAC,KAAK,CAAC,CAAC,EACtD,CACH,CAAC;AACJ,CAAC;AAED,SAAgB,aAAa,CAAC,IAAY,EAAE,UAA+B,EAAE;IAC3E,OAAO,IAAI;SACR,KAAK,CAAC,GAAG,CAAC;SACV,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE;QACf,IAAI,OAAO,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;YAC/B,OAAO,OAAO,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,IAAI,OAAO,CAAC;QACtE,CAAC;aAAM,IAAI,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;YAC5D,OAAO,OAAO,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,OAAO,CAAC;QAC3D,CAAC;aAAM,CAAC;YACN,OAAO,OAAO,CAAC;QACjB,CAAC;IACH,CAAC,CAAC;SACD,IAAI,CAAC,GAAG,CAAC,CAAC;AACf,CAAC","sourcesContent":["'use client';\n\nimport type { BottomTabNavigationEventMap } from '@react-navigation/bottom-tabs';\nimport {\n useStateForPath,\n type EventConsumer,\n type EventMapBase,\n type NavigationProp,\n type NavigationState,\n type ParamListBase,\n type RouteProp,\n type ScreenListeners,\n} from '@react-navigation/native';\nimport type { NativeStackNavigationEventMap } from '@react-navigation/native-stack';\nimport React, { useEffect, useMemo } from 'react';\n\nimport { LoadedRoute, Route, RouteNode, sortRoutesWithInitial, useRouteNode } from './Route';\nimport { getPathFromState } from './fork/getPathFromState';\nimport { useExpoRouterStore } from './global-state/storeContext';\nimport EXPO_ROUTER_IMPORT_MODE from './import-mode';\nimport { ZoomTransitionEnabler } from './link/zoom/ZoomTransitionEnabler';\nimport { ZoomTransitionTargetContextProvider } from './link/zoom/zoom-transition-context-providers';\nimport { unstable_navigationEvents } from './navigationEvents';\nimport {\n hasParam,\n INTERNAL_EXPO_ROUTER_NO_ANIMATION_PARAM_NAME,\n removeParams,\n} from './navigationParams';\nimport { Screen } from './primitives';\nimport { UnknownOutputParams } from './types';\nimport { EmptyRoute } from './views/EmptyRoute';\nimport { SuspenseFallback } from './views/SuspenseFallback';\nimport { Try } from './views/Try';\n\nexport type ScreenProps<\n TOptions extends Record<string, any> = Record<string, any>,\n TState extends NavigationState = NavigationState,\n TEventMap extends EventMapBase = EventMapBase,\n> = {\n /** Name is required when used inside a Layout component. */\n name?: string;\n /**\n * Redirect to the nearest sibling route.\n * If all children are `redirect={true}`, the layout will render `null` as there are no children to render.\n */\n redirect?: boolean;\n initialParams?: Record<string, any>;\n options?:\n | TOptions\n | ((prop: { route: RouteProp<ParamListBase, string>; navigation: any }) => TOptions);\n\n listeners?:\n | ScreenListeners<TState, TEventMap>\n | ((prop: {\n route: RouteProp<ParamListBase, string>;\n navigation: any;\n }) => ScreenListeners<TState, TEventMap>);\n\n getId?: ({ params }: { params?: Record<string, any> }) => string | undefined;\n\n dangerouslySingular?: SingularOptions;\n};\n\nexport type SingularOptions =\n | boolean\n | ((name: string, params: UnknownOutputParams) => string | undefined);\n\nfunction getSortedChildren(\n children: RouteNode[],\n order: ScreenProps[] = [],\n initialRouteName?: string\n): { route: RouteNode; props: Partial<ScreenProps> }[] {\n if (!order?.length) {\n return children\n .sort(sortRoutesWithInitial(initialRouteName))\n .map((route) => ({ route, props: {} }));\n }\n const entries = [...children];\n\n const ordered = order\n .map(\n ({\n name,\n redirect,\n initialParams,\n listeners,\n options,\n getId,\n dangerouslySingular: singular,\n }) => {\n if (!entries.length) {\n console.warn(\n `[Layout children]: Too many screens defined. Route \"${name}\" is extraneous.`\n );\n return null;\n }\n const matchIndex = entries.findIndex((child) => child.route === name);\n if (matchIndex === -1) {\n console.warn(\n `[Layout children]: No route named \"${name}\" exists in nested children:`,\n children.map(({ route }) => route)\n );\n return null;\n } else {\n // Get match and remove from entries\n const match = entries[matchIndex];\n entries.splice(matchIndex, 1);\n\n // Ensure to return null after removing from entries.\n if (redirect) {\n if (typeof redirect === 'string') {\n throw new Error(`Redirecting to a specific route is not supported yet.`);\n }\n return null;\n }\n\n if (getId) {\n console.warn(\n `Deprecated: prop 'getId' on screen ${name} is deprecated. Please rename the prop to 'dangerouslySingular'`\n );\n if (singular) {\n console.warn(\n `Screen ${name} cannot use both getId and dangerouslySingular together.`\n );\n }\n } else if (singular) {\n // If singular is set, use it as the getId function.\n if (typeof singular === 'string') {\n getId = () => singular;\n } else if (typeof singular === 'function' && name) {\n getId = (options) => singular(name, options.params || {});\n } else if (singular === true && name) {\n getId = (options) => getSingularId(name, options);\n }\n }\n\n return {\n route: match,\n props: { initialParams, listeners, options, getId },\n };\n }\n }\n )\n .filter(Boolean) as {\n route: RouteNode;\n props: Partial<ScreenProps>;\n }[];\n\n // Add any remaining children\n ordered.push(\n ...entries.sort(sortRoutesWithInitial(initialRouteName)).map((route) => ({ route, props: {} }))\n );\n\n return ordered;\n}\n\n/**\n * @returns React Navigation screens sorted by the `route` property.\n */\nexport function useSortedScreens(\n order: ScreenProps[],\n protectedScreens: Set<string>,\n useOnlyUserDefinedScreens: boolean = false\n): React.ReactNode[] {\n const node = useRouteNode();\n\n const nodeChildren = node?.children ?? [];\n const children = useOnlyUserDefinedScreens\n ? nodeChildren.filter((child) =>\n order.some((userDefinedScreen) => userDefinedScreen.name === child.route)\n )\n : nodeChildren;\n\n const sorted = children.length ? getSortedChildren(children, order, node?.initialRouteName) : [];\n return React.useMemo(\n () =>\n sorted\n .filter((item) => !protectedScreens.has(item.route.route))\n .map((value) => {\n return routeToScreen(value.route, value.props);\n }),\n [sorted, protectedScreens]\n );\n}\n\nfunction fromImport(value: RouteNode, { ErrorBoundary, ...component }: LoadedRoute) {\n // If possible, add a more helpful display name for the component stack to improve debugging of React errors such as `Text strings must be rendered within a <Text> component.`.\n if (component?.default && __DEV__) {\n component.default.displayName ??= `${component.default.name ?? 'Route'}(${value.contextKey})`;\n }\n\n if (ErrorBoundary) {\n const Wrapped = React.forwardRef((props: any, ref: any) => {\n const children = React.createElement(component.default || EmptyRoute, {\n ...props,\n ref,\n });\n return <Try catch={ErrorBoundary}>{children}</Try>;\n });\n\n if (__DEV__) {\n Wrapped.displayName = `ErrorBoundary(${value.contextKey})`;\n }\n\n return {\n default: Wrapped,\n };\n }\n if (process.env.NODE_ENV !== 'production') {\n if (\n typeof component.default === 'object' &&\n component.default &&\n Object.keys(component.default).length === 0\n ) {\n return { default: EmptyRoute };\n }\n }\n\n return { default: component.default };\n}\n\nfunction fromLoadedRoute(value: RouteNode, res: LoadedRoute) {\n if (!(res instanceof Promise)) {\n return fromImport(value, res);\n }\n\n return res.then(fromImport.bind(null, value));\n}\n\n// TODO: Maybe there's a more React-y way to do this?\n// Without this store, the process enters a recursive loop.\nconst qualifiedStore = new WeakMap<RouteNode, React.ComponentType<any>>();\n\n/** Wrap the component with various enhancements and add access to child routes. */\nexport function getQualifiedRouteComponent(value: RouteNode) {\n if (qualifiedStore.has(value)) {\n return qualifiedStore.get(value)!;\n }\n\n let ScreenComponent:\n | React.ForwardRefExoticComponent<React.RefAttributes<unknown>>\n | React.ComponentType<{ segment?: string }>;\n\n // TODO: This ensures sync doesn't use React.lazy, but it's not ideal.\n if (EXPO_ROUTER_IMPORT_MODE === 'lazy') {\n ScreenComponent = React.lazy(async () => {\n const res = value.loadRoute();\n return fromLoadedRoute(value, res) as Promise<{\n default: React.ComponentType<any>;\n }>;\n });\n\n if (__DEV__) {\n ScreenComponent.displayName = `AsyncRoute(${value.route})`;\n }\n } else {\n const res = value.loadRoute();\n ScreenComponent = fromImport(value, res).default!;\n }\n function BaseRoute({\n // Remove these React Navigation props to\n // enforce usage of expo-router hooks (where the query params are correct).\n route,\n navigation,\n\n // Pass all other props to the component\n ...props\n }: {\n route?: RouteProp<ParamListBase, string>;\n navigation: Omit<\n NavigationProp<\n ParamListBase,\n string,\n undefined,\n NavigationState,\n object,\n NativeStackNavigationEventMap | BottomTabNavigationEventMap\n >,\n 'getState'\n > & {\n getState(): NavigationState | undefined;\n };\n }) {\n const stateForPath = useStateForPath();\n const isFocused = navigation.isFocused();\n const store = useExpoRouterStore();\n\n if (isFocused) {\n const state = navigation.getState();\n const isLeaf = !(state && 'state' in state.routes[state.index]);\n if (isLeaf && stateForPath) store.setFocusedState(stateForPath);\n }\n\n useEffect(\n () =>\n navigation.addListener('focus', () => {\n const state = navigation.getState();\n const isLeaf = !(state && 'state' in state.routes[state.index]);\n // Because setFocusedState caches the route info, this call will only trigger rerenders\n // if the component itself didn’t rerender and the route info changed.\n // Otherwise, the update from the `if` above will handle it,\n // and this won’t cause a redundant second update.\n if (isLeaf && stateForPath) store.setFocusedState(stateForPath);\n }),\n [navigation]\n );\n\n useEffect(() => {\n return navigation.addListener('transitionEnd', (e) => {\n if (!e?.data?.closing) {\n // When navigating to a screen, remove the no animation param to re-enable animations\n // Otherwise the navigation back would also have no animation\n if (hasParam(route?.params, INTERNAL_EXPO_ROUTER_NO_ANIMATION_PARAM_NAME)) {\n navigation.replaceParams(\n removeParams(route?.params, [INTERNAL_EXPO_ROUTER_NO_ANIMATION_PARAM_NAME])\n );\n }\n }\n });\n }, [navigation]);\n\n const isRouteType = value.type === 'route';\n const hasRouteKey = !!route?.key;\n\n return (\n <Route node={value} params={route?.params}>\n {isRouteType && hasRouteKey && unstable_navigationEvents.hasAnyListener() && (\n <AnalyticsListeners navigation={navigation} screenId={route.key} />\n )}\n <ZoomTransitionTargetContextProvider route={route}>\n <ZoomTransitionEnabler route={route} />\n <React.Suspense fallback={<SuspenseFallback route={value} />}>\n <ScreenComponent\n {...props}\n // Expose the template segment path, e.g. `(home)`, `[foo]`, `index`\n // the intention is to make it possible to deduce shared routes.\n segment={value.route}\n />\n </React.Suspense>\n </ZoomTransitionTargetContextProvider>\n </Route>\n );\n }\n\n if (__DEV__) {\n BaseRoute.displayName = `Route(${value.route})`;\n }\n\n qualifiedStore.set(value, BaseRoute);\n return BaseRoute;\n}\n\nfunction AnalyticsListeners({\n navigation,\n screenId,\n}: {\n navigation: EventConsumer<EventMapBase>;\n screenId: string;\n}) {\n const stateForPath = useStateForPath();\n const isFirstRenderRef = React.useRef(true);\n\n const pathname = useMemo(\n () => (stateForPath ? decodeURIComponent(getPathFromState(stateForPath)) : undefined),\n [stateForPath]\n );\n\n if (isFirstRenderRef.current) {\n isFirstRenderRef.current = false;\n if (pathname) {\n unstable_navigationEvents.emit('pageWillRender', {\n pathname,\n screenId,\n });\n }\n }\n\n useEffect(() => {\n if (pathname) {\n return () => {\n unstable_navigationEvents.emit('pageRemoved', {\n pathname,\n screenId,\n });\n };\n }\n return () => {};\n }, [pathname]);\n\n useEffect(() => {\n if (pathname) {\n const cleanFocus = navigation.addListener('focus', () => {\n unstable_navigationEvents.emit('pageFocused', {\n pathname,\n screenId,\n });\n });\n const cleanBlur = navigation.addListener('blur', () => {\n unstable_navigationEvents.emit('pageBlurred', {\n pathname,\n screenId,\n });\n });\n return () => {\n cleanFocus();\n cleanBlur();\n };\n }\n return () => {};\n }, [navigation, pathname]);\n\n return null;\n}\n\nexport function screenOptionsFactory(\n route: RouteNode,\n options?: ScreenProps['options']\n): ScreenProps['options'] {\n return (args) => {\n // Only eager load generated components\n const staticOptions = route.generated ? route.loadRoute()?.getNavOptions : null;\n const staticResult = typeof staticOptions === 'function' ? staticOptions(args) : staticOptions;\n const dynamicResult = typeof options === 'function' ? options?.(args) : options;\n const output = {\n ...staticResult,\n ...dynamicResult,\n };\n\n // Prevent generated screens from showing up in the tab bar.\n if (route.internal) {\n output.tabBarItemStyle = { display: 'none' };\n output.tabBarButton = () => null;\n // TODO: React Navigation doesn't provide a way to prevent rendering the drawer item.\n output.drawerItemStyle = { height: 0, display: 'none' };\n }\n\n return output;\n };\n}\n\nexport function routeToScreen(\n route: RouteNode,\n { options, getId, ...props }: Partial<ScreenProps> = {}\n) {\n return (\n <Screen\n {...props}\n name={route.route}\n key={route.route}\n getId={getId}\n options={screenOptionsFactory(route, options)}\n getComponent={() => getQualifiedRouteComponent(route)}\n />\n );\n}\n\nexport function getSingularId(name: string, options: Record<string, any> = {}) {\n return name\n .split('/')\n .map((segment) => {\n if (segment.startsWith('[...')) {\n return options.params?.[segment.slice(4, -1)]?.join('/') || segment;\n } else if (segment.startsWith('[') && segment.endsWith(']')) {\n return options.params?.[segment.slice(1, -1)] || segment;\n } else {\n return segment;\n }\n })\n .join('/');\n}\n"]}
@@ -9,7 +9,7 @@
9
9
  "publication": {
10
10
  "groupId": "expo.modules.router",
11
11
  "artifactId": "expo.modules.router",
12
- "version": "7.0.0-canary-20251230-fc48ddc",
12
+ "version": "7.0.0-canary-20260113-0ce2b9c",
13
13
  "repository": "local-maven-repo"
14
14
  }
15
15
  }
@@ -18,6 +18,7 @@ class LinkPreviewNativeActionView: RouterViewWithLogger, LinkPreviewMenuUpdatabl
18
18
  @NativeActionProp(updateMenu: true) var singleSelection: Bool = false
19
19
  @NativeActionProp(updateMenu: true) var displayAsPalette: Bool = false
20
20
  @NativeActionProp(updateMenu: true) var displayInline: Bool = false
21
+ @NativeActionProp(updateMenu: true) var preferredElementSize: MenuElementSize?
21
22
 
22
23
  // MARK: - UIBarButtonItem props
23
24
  @NativeActionProp(updateAction: true, updateMenu: true) var routerHidden: Bool = false
@@ -86,6 +87,12 @@ class LinkPreviewNativeActionView: RouterViewWithLogger, LinkPreviewMenuUpdatabl
86
87
  menuAction.subtitle = subtitle
87
88
  }
88
89
 
90
+ if #available(iOS 16.0, *) {
91
+ if let preferredElementSize = preferredElementSize {
92
+ menuAction.preferredElementSize = preferredElementSize.toUIMenuElementSize()
93
+ }
94
+ }
95
+
89
96
  parentMenuUpdatable?.updateMenu()
90
97
  }
91
98
 
@@ -106,7 +106,9 @@ public class LinkPreviewNativeModule: Module {
106
106
  Prop("barButtonItemStyle") { (view: LinkPreviewNativeActionView, style: BarItemStyle?) in
107
107
  view.barButtonItemStyle = style?.toUIBarButtonItemStyle()
108
108
  }
109
-
109
+ Prop("preferredElementSize") { (view: LinkPreviewNativeActionView, preferredElementSize: MenuElementSize?) in
110
+ view.preferredElementSize = preferredElementSize
111
+ }
110
112
  Events("onSelected")
111
113
  }
112
114
 
@@ -143,8 +145,8 @@ public class LinkPreviewNativeModule: Module {
143
145
  // This prop is used in ExpoShadowNode in order to disable force flattening, when display: contents is used
144
146
  }
145
147
 
146
- Prop("preventInteractiveDismissal") { (view: LinkZoomTransitionEnabler, prevent: Bool) in
147
- view.isPreventingInteractiveDismissal = prevent
148
+ Prop("dismissalBoundsRect") { (view: LinkZoomTransitionEnabler, rect: DismissalBoundsRect?) in
149
+ view.dismissalBoundsRect = rect
148
150
  }
149
151
  }
150
152
 
@@ -175,3 +177,35 @@ struct LinkSourceAlignmentRect: Record {
175
177
  @Field var width: Double
176
178
  @Field var height: Double
177
179
  }
180
+
181
+ enum MenuElementSize: String, Enumerable {
182
+ case small
183
+ case medium
184
+ case large
185
+ case auto
186
+
187
+ @available(iOS 16.0, *)
188
+ func toUIMenuElementSize() -> UIMenu.ElementSize {
189
+ switch self {
190
+ case .small:
191
+ return .small
192
+ case .medium:
193
+ return .medium
194
+ case .large:
195
+ return .large
196
+ case .auto:
197
+ if #available(iOS 17.0, *) {
198
+ return .automatic
199
+ } else {
200
+ return .medium
201
+ }
202
+ }
203
+ }
204
+ }
205
+
206
+ struct DismissalBoundsRect: Record {
207
+ @Field var minX: Double?
208
+ @Field var maxX: Double?
209
+ @Field var minY: Double?
210
+ @Field var maxY: Double?
211
+ }
@@ -273,7 +273,7 @@ class LinkZoomTransitionAlignmentRectDetector: LinkZoomExpoView {
273
273
 
274
274
  class LinkZoomTransitionEnabler: LinkZoomExpoView {
275
275
  var zoomTransitionSourceIdentifier: String = ""
276
- var isPreventingInteractiveDismissal: Bool = false
276
+ var dismissalBoundsRect: DismissalBoundsRect?
277
277
 
278
278
  override func didMoveToSuperview() {
279
279
  super.didMoveToSuperview()
@@ -318,8 +318,18 @@ class LinkZoomTransitionEnabler: LinkZoomExpoView {
318
318
  }
319
319
  return rect
320
320
  }
321
- options.interactiveDismissShouldBegin = { _ in
322
- !self.isPreventingInteractiveDismissal
321
+ options.interactiveDismissShouldBegin = { context in
322
+ // Check dismissal bounds rect if provided
323
+ if let rect = self.dismissalBoundsRect {
324
+ let location = context.location
325
+ // Check each optional bound independently
326
+ if let minX = rect.minX, location.x < minX { return false }
327
+ if let maxX = rect.maxX, location.x > maxX { return false }
328
+ if let minY = rect.minY, location.y < minY { return false }
329
+ if let maxY = rect.maxY, location.y > maxY { return false }
330
+ }
331
+
332
+ return true
323
333
  }
324
334
  controller.preferredTransition = .zoom(options: options) { _ in
325
335
  let sourceInfo = self.sourceRepository?.getSource(
@@ -155,7 +155,7 @@ class RouterToolbarHostView: RouterViewWithLogger, LinkPreviewMenuUpdatable {
155
155
  updateToolbarItems()
156
156
  }
157
157
 
158
- private func findViewController() -> RNSScreen? {
158
+ func findViewController() -> RNSScreen? {
159
159
  var responder: UIResponder? = self
160
160
  while let r = responder {
161
161
  if let r = r as? RNSScreen {
@@ -6,6 +6,11 @@ class RouterToolbarItemView: RouterViewWithLogger {
6
6
  @ReactiveProp var type: ItemType?
7
7
  @ReactiveProp var title: String?
8
8
  @ReactiveProp var systemImageName: String?
9
+ var customImage: SharedRef<UIImage>? {
10
+ didSet {
11
+ performUpdate()
12
+ }
13
+ }
9
14
  @ReactiveProp var customView: UIView?
10
15
  @ReactiveProp var customTintColor: UIColor?
11
16
  @ReactiveProp var hidesSharedBackground: Bool = false
@@ -42,12 +47,39 @@ class RouterToolbarItemView: RouterViewWithLogger {
42
47
  item = UIBarButtonItem(barButtonSystemItem: .flexibleSpace, target: nil, action: nil)
43
48
  } else if type == .fixedSpacer {
44
49
  item = UIBarButtonItem(barButtonSystemItem: .fixedSpace, target: nil, action: nil)
50
+ } else if type == .searchBar {
51
+ if #available(iOS 16, *) {
52
+ // Hide the item if no search bar is provided
53
+ item.isHidden = true
54
+ }
55
+ guard #available(iOS 26.0, *), let controller = self.host?.findViewController() else {
56
+ // Check for iOS 26, should already be guarded by the JS side, so this warning will only fire if controller is nil
57
+ logger?.warn(
58
+ "[expo-router] navigationItem.searchBarPlacementBarButtonItem not available. This is most likely a bug in expo-router."
59
+ )
60
+ return item
61
+ }
62
+ guard let navController = controller.navigationController else {
63
+ return item
64
+ }
65
+ guard navController.isNavigationBarHidden == false else {
66
+ logger?.warn(
67
+ "[expo-router] Toolbar.SearchBarPreferredSlot should only be used when stack header is shown."
68
+ )
69
+ return item
70
+ }
71
+
72
+ item = controller.navigationItem.searchBarPlacementBarButtonItem
45
73
  } else {
46
74
  if let title {
47
75
  item.title = title
48
76
  }
49
77
  item.possibleTitles = possibleTitles
50
- if let systemImageName {
78
+ if let customImage {
79
+ // Use the UIImage from the SharedRef
80
+ item.image = customImage.ref.withRenderingMode(.alwaysOriginal)
81
+ } else if let systemImageName {
82
+ // Fallback to SF Symbol
51
83
  item.image = UIImage(systemName: systemImageName)
52
84
  }
53
85
  if let tintColor = customTintColor {
@@ -114,21 +146,19 @@ class RouterToolbarItemView: RouterViewWithLogger {
114
146
  }
115
147
 
116
148
  override func mountChildComponentView(_ childComponentView: UIView, index: Int) {
117
- if customView != nil {
149
+ guard customView == nil else {
118
150
  logger?.warn(
119
151
  "[expo-router] RouterToolbarItemView can only have one child view. This is most likely a bug in expo-router."
120
152
  )
121
153
  return
122
154
  }
123
155
  customView = childComponentView
124
- performUpdate()
125
156
  }
126
157
 
127
158
  override func unmountChildComponentView(_ childComponentView: UIView, index: Int) {
128
159
  if customView == childComponentView {
129
160
  childComponentView.removeFromSuperview()
130
161
  customView = nil
131
- performUpdate()
132
162
  }
133
163
  }
134
164
  }
@@ -137,6 +167,7 @@ enum ItemType: String, Enumerable {
137
167
  case normal
138
168
  case fixedSpacer
139
169
  case fluidSpacer
170
+ case searchBar
140
171
  }
141
172
 
142
173
  struct BadgeConfiguration: Equatable {
@@ -1,4 +1,5 @@
1
1
  import ExpoModulesCore
2
+ import UIKit
2
3
 
3
4
  public class RouterToolbarModule: Module {
4
5
  public func definition() -> ModuleDefinition {
@@ -22,6 +23,9 @@ public class RouterToolbarModule: Module {
22
23
  Prop("systemImageName") { (view: RouterToolbarItemView, systemImageName: String?) in
23
24
  view.systemImageName = systemImageName
24
25
  }
26
+ Prop("image") { (view: RouterToolbarItemView, image: SharedRef<UIImage>?) in
27
+ view.customImage = image
28
+ }
25
29
  Prop("tintColor") { (view: RouterToolbarItemView, tintColor: UIColor?) in
26
30
  view.customTintColor = tintColor
27
31
  }
@@ -3,7 +3,7 @@
3
3
  "component": {
4
4
  "group": "expo.modules.router",
5
5
  "module": "expo.modules.router",
6
- "version": "7.0.0-canary-20251230-fc48ddc",
6
+ "version": "7.0.0-canary-20260113-0ce2b9c",
7
7
  "attributes": {
8
8
  "org.gradle.status": "release"
9
9
  }
@@ -24,8 +24,8 @@
24
24
  },
25
25
  "files": [
26
26
  {
27
- "name": "expo.modules.router-7.0.0-canary-20251230-fc48ddc.aar",
28
- "url": "expo.modules.router-7.0.0-canary-20251230-fc48ddc.aar",
27
+ "name": "expo.modules.router-7.0.0-canary-20260113-0ce2b9c.aar",
28
+ "url": "expo.modules.router-7.0.0-canary-20260113-0ce2b9c.aar",
29
29
  "size": 13665,
30
30
  "sha512": "0c996832cda246cbf02acf875f7c3add8610a0e5e7c466bbe5fa2f073a6a644933eec90d1bff2a7fac7fd3c0c5bdae8a695373cebdec4f9853ce116658960554",
31
31
  "sha256": "054876f9b960d2ed5b7762c66b32c7e994f942c05013456f5e41e1fe6c71ee54",
@@ -60,8 +60,8 @@
60
60
  ],
61
61
  "files": [
62
62
  {
63
- "name": "expo.modules.router-7.0.0-canary-20251230-fc48ddc.aar",
64
- "url": "expo.modules.router-7.0.0-canary-20251230-fc48ddc.aar",
63
+ "name": "expo.modules.router-7.0.0-canary-20260113-0ce2b9c.aar",
64
+ "url": "expo.modules.router-7.0.0-canary-20260113-0ce2b9c.aar",
65
65
  "size": 13665,
66
66
  "sha512": "0c996832cda246cbf02acf875f7c3add8610a0e5e7c466bbe5fa2f073a6a644933eec90d1bff2a7fac7fd3c0c5bdae8a695373cebdec4f9853ce116658960554",
67
67
  "sha256": "054876f9b960d2ed5b7762c66b32c7e994f942c05013456f5e41e1fe6c71ee54",
@@ -80,8 +80,8 @@
80
80
  },
81
81
  "files": [
82
82
  {
83
- "name": "expo.modules.router-7.0.0-canary-20251230-fc48ddc-sources.jar",
84
- "url": "expo.modules.router-7.0.0-canary-20251230-fc48ddc-sources.jar",
83
+ "name": "expo.modules.router-7.0.0-canary-20260113-0ce2b9c-sources.jar",
84
+ "url": "expo.modules.router-7.0.0-canary-20260113-0ce2b9c-sources.jar",
85
85
  "size": 2318,
86
86
  "sha512": "9864add8e93e3c0a9a9c930aaed67016b15054c3fafd59a0bd3a5402d7cdc5827be84c22c2c137f3e5acb4e39270d9bfb9ca3fe11234458d4f2e0d4c78747f48",
87
87
  "sha256": "d5dff6259e86de721fc0f07fe740a5e18088e19b76738719b0a6f94caef06224",
@@ -0,0 +1 @@
1
+ 020ebe3f9ac0e5f33f89f054bdd78d7643c5130af22f1f717c369ac6cd8191ad9239a8c2c27a4831a4d6157748e332a8dac4fa4e7ea4fe50695791783fb83ab8
@@ -9,7 +9,7 @@
9
9
  <modelVersion>4.0.0</modelVersion>
10
10
  <groupId>expo.modules.router</groupId>
11
11
  <artifactId>expo.modules.router</artifactId>
12
- <version>7.0.0-canary-20251230-fc48ddc</version>
12
+ <version>7.0.0-canary-20260113-0ce2b9c</version>
13
13
  <packaging>aar</packaging>
14
14
  <name>expo.modules.router</name>
15
15
  <url>https://github.com/expo/expo</url>
@@ -0,0 +1 @@
1
+ 737b10ca03314dfee204dfdc93cc55eb0e3b76af2e7f0026f957e1d73cbd3436411a1afb60b9e119aedd50b715dff32d35144aad555bbad45b4d2044b4f89c8f
@@ -3,11 +3,11 @@
3
3
  <groupId>expo.modules.router</groupId>
4
4
  <artifactId>expo.modules.router</artifactId>
5
5
  <versioning>
6
- <latest>7.0.0-canary-20251230-fc48ddc</latest>
7
- <release>7.0.0-canary-20251230-fc48ddc</release>
6
+ <latest>7.0.0-canary-20260113-0ce2b9c</latest>
7
+ <release>7.0.0-canary-20260113-0ce2b9c</release>
8
8
  <versions>
9
- <version>7.0.0-canary-20251230-fc48ddc</version>
9
+ <version>7.0.0-canary-20260113-0ce2b9c</version>
10
10
  </versions>
11
- <lastUpdated>20251230162952</lastUpdated>
11
+ <lastUpdated>20260113181542</lastUpdated>
12
12
  </versioning>
13
13
  </metadata>
@@ -1 +1 @@
1
- f4dc4828d999c6e1824223cf32256273
1
+ 73b8868c78f3167847d0e39c2243ad0b
@@ -1 +1 @@
1
- d600f68b18231c507fb58e7c6987aae86bd72fe9
1
+ 52e92bd79381fb8f2bb5c25a4888ad67fab98d63
@@ -1 +1 @@
1
- ef778d0696dcaa4afbe1c0107ef7393d358ffdfed582cdd768888c2f21fddf43
1
+ f160b46aa41ef5dec9934bcaae09ecbf7055e46e34b4ff5b9fa058d6abf96b2a
@@ -1 +1 @@
1
- a285fe7a72b31870118522253de25c4a325dbb77288627bee887cdee061814ba287f0a67c0f13d7371b0a962d3fb6210b90e419f21704ce7d2058890ca889cad
1
+ b6cbda3d1252808fa6815e5d2fe2aeb3d83341035226e63f18aabeacd53be1d8bf0920a055e7e5bebdf7eb3912d6689f195818317874fad430b57f8ae493b245
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "expo-router",
3
- "version": "7.0.0-canary-20251230-fc48ddc",
3
+ "version": "7.0.0-canary-20260113-0ce2b9c",
4
4
  "description": "Expo Router is a file-based router for React Native and web applications.",
5
5
  "author": "650 Industries, Inc.",
6
6
  "license": "MIT",
@@ -83,13 +83,13 @@
83
83
  "expo"
84
84
  ],
85
85
  "peerDependencies": {
86
- "@expo/metro-runtime": "6.2.0-canary-20251230-fc48ddc",
87
- "@expo/log-box": "0.0.13-canary-20251230-fc48ddc",
86
+ "@expo/metro-runtime": "6.2.0-canary-20260113-0ce2b9c",
87
+ "@expo/log-box": "0.0.13-canary-20260113-0ce2b9c",
88
88
  "@react-navigation/drawer": "^7.7.2",
89
89
  "@testing-library/react-native": ">= 12.0.0",
90
- "expo": "55.0.0-canary-20251230-fc48ddc",
91
- "expo-constants": "18.1.0-canary-20251230-fc48ddc",
92
- "expo-linking": "8.0.12-canary-20251230-fc48ddc",
90
+ "expo": "55.0.0-canary-20260113-0ce2b9c",
91
+ "expo-constants": "18.1.0-canary-20260113-0ce2b9c",
92
+ "expo-linking": "8.0.12-canary-20260113-0ce2b9c",
93
93
  "react": "*",
94
94
  "react-dom": "*",
95
95
  "react-native": "*",
@@ -134,8 +134,8 @@
134
134
  "react-server-dom-webpack": "~19.0.3"
135
135
  },
136
136
  "dependencies": {
137
- "@expo/metro-runtime": "6.2.0-canary-20251230-fc48ddc",
138
- "@expo/schema-utils": "0.1.9-canary-20251230-fc48ddc",
137
+ "@expo/metro-runtime": "6.2.0-canary-20260113-0ce2b9c",
138
+ "@expo/schema-utils": "0.1.9-canary-20260113-0ce2b9c",
139
139
  "@radix-ui/react-slot": "1.2.0",
140
140
  "@radix-ui/react-tabs": "^1.1.12",
141
141
  "@react-navigation/bottom-tabs": "^7.7.3",
@@ -144,8 +144,9 @@
144
144
  "client-only": "^0.0.1",
145
145
  "debug": "^4.3.4",
146
146
  "escape-string-regexp": "^4.0.0",
147
- "expo-server": "1.0.6-canary-20251230-fc48ddc",
148
- "expo-symbols": "1.1.0-canary-20251230-fc48ddc",
147
+ "expo-image": "3.1.0-canary-20260113-0ce2b9c",
148
+ "expo-server": "1.1.0-canary-20260113-0ce2b9c",
149
+ "expo-symbols": "1.1.0-canary-20260113-0ce2b9c",
149
150
  "fast-deep-equal": "^3.1.3",
150
151
  "invariant": "^2.2.4",
151
152
  "nanoid": "^3.3.8",
@@ -23,5 +23,7 @@ declare const withRouter: ConfigPlugin<{
23
23
  unstable_useServerMiddleware?: boolean;
24
24
  /** Enable experimental data loader support. Requires `web.output: 'static'` to be set in app config. */
25
25
  unstable_useServerDataLoaders?: boolean;
26
+ /** Enable experimental server-side rendering. When enabled with `web.output: 'server'`, HTML is rendered at request time instead of being pre-rendered at build time. */
27
+ unstable_useServerRendering?: boolean;
26
28
  } | void>;
27
29
  export default withRouter;
@@ -163,6 +163,11 @@
163
163
  "type": "boolean",
164
164
  "default": false
165
165
  },
166
+ "unstable_useServerRendering": {
167
+ "description": "Enable experimental server-side rendering. When enabled with `web.output: 'server'`, HTML is rendered at request time instead of being pre-rendered at build time.",
168
+ "type": "boolean",
169
+ "default": false
170
+ },
166
171
  "unstable_splitView": {
167
172
  "description": "Enable experimental SplitView support on ios",
168
173
  "type": "boolean",
@@ -58,6 +58,8 @@ const withRouter: ConfigPlugin<
58
58
  unstable_useServerMiddleware?: boolean;
59
59
  /** Enable experimental data loader support. Requires `web.output: 'static'` to be set in app config. */
60
60
  unstable_useServerDataLoaders?: boolean;
61
+ /** Enable experimental server-side rendering. When enabled with `web.output: 'server'`, HTML is rendered at request time instead of being pre-rendered at build time. */
62
+ unstable_useServerRendering?: boolean;
61
63
  } | void
62
64
  > = (config, _props) => {
63
65
  const props = _props || {};
@@ -1,7 +0,0 @@
1
- import { NativeStackNavigationOptions } from '@react-navigation/native-stack';
2
- import type { SearchBarProps } from 'react-native-screens';
3
- export interface StackHeaderSearchBarProps extends SearchBarProps {
4
- }
5
- export declare function StackHeaderSearchBar(props: StackHeaderSearchBarProps): null;
6
- export declare function appendStackHeaderSearchBarPropsToOptions(options: NativeStackNavigationOptions, props: StackHeaderSearchBarProps): NativeStackNavigationOptions;
7
- //# sourceMappingURL=StackHeaderSearchBar.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"StackHeaderSearchBar.d.ts","sourceRoot":"","sources":["../../../src/layouts/stack-utils/StackHeaderSearchBar.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,4BAA4B,EAAE,MAAM,gCAAgC,CAAC;AAC9E,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAE3D,MAAM,WAAW,yBAA0B,SAAQ,cAAc;CAAG;AAEpE,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,yBAAyB,QAEpE;AAED,wBAAgB,wCAAwC,CACtD,OAAO,EAAE,4BAA4B,EACrC,KAAK,EAAE,yBAAyB,GAC/B,4BAA4B,CAO9B"}
@@ -1,16 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.StackHeaderSearchBar = StackHeaderSearchBar;
4
- exports.appendStackHeaderSearchBarPropsToOptions = appendStackHeaderSearchBarPropsToOptions;
5
- function StackHeaderSearchBar(props) {
6
- return null;
7
- }
8
- function appendStackHeaderSearchBarPropsToOptions(options, props) {
9
- return {
10
- ...options,
11
- headerSearchBarOptions: {
12
- ...props,
13
- },
14
- };
15
- }
16
- //# sourceMappingURL=StackHeaderSearchBar.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"StackHeaderSearchBar.js","sourceRoot":"","sources":["../../../src/layouts/stack-utils/StackHeaderSearchBar.tsx"],"names":[],"mappings":";;AAKA,oDAEC;AAED,4FAUC;AAdD,SAAgB,oBAAoB,CAAC,KAAgC;IACnE,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAgB,wCAAwC,CACtD,OAAqC,EACrC,KAAgC;IAEhC,OAAO;QACL,GAAG,OAAO;QACV,sBAAsB,EAAE;YACtB,GAAG,KAAK;SACT;KACF,CAAC;AACJ,CAAC","sourcesContent":["import { NativeStackNavigationOptions } from '@react-navigation/native-stack';\nimport type { SearchBarProps } from 'react-native-screens';\n\nexport interface StackHeaderSearchBarProps extends SearchBarProps {}\n\nexport function StackHeaderSearchBar(props: StackHeaderSearchBarProps) {\n return null;\n}\n\nexport function appendStackHeaderSearchBarPropsToOptions(\n options: NativeStackNavigationOptions,\n props: StackHeaderSearchBarProps\n): NativeStackNavigationOptions {\n return {\n ...options,\n headerSearchBarOptions: {\n ...props,\n },\n };\n}\n"]}
@@ -1 +0,0 @@
1
- 8274b2e37eadf93844e0d6628ae2f7fe2ae027e3089dd4cbe7b55762eaa35fb1769c006fe666d9698c203a4093e5edbd9a85616de6963dbe5f66f7dcaa979d02
@@ -1 +0,0 @@
1
- 2a9151431d99f24cdecf35833e6abad110ca57c39e3702db6ed69bfbafbd159dd0a5c17a0e4f53fccbc38e8fee3055a2f30d2974620fa24cebffe108320c237c