From 28b8da6f980a615034726b7255b88d58ce853ecd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C4=B0hsan=20Er=C5=9Fen?= Date: Mon, 11 May 2026 12:57:36 +0300 Subject: [PATCH 01/19] [router] Fix drawer toggle asset path (#45170) ## Summary Fixes the relative path for the default drawer toggle icon asset in Expo Router's vendored React Navigation drawer implementation. The previous path walked one directory too far up from `src/react-navigation/drawer/views/DrawerToggleButton.tsx`, resolving to a package-external `assets` directory instead of `packages/expo-router/assets`. ## Test Plan - Ran `pnpm build` in `packages/expo-router` - Ran `pnpm lint` in `packages/expo-router` (passes with existing import/order warnings outside this file) - Verified the source and generated build paths resolve to `packages/expo-router/assets/react-navigation/drawer/toggle-drawer-icon.png` --------- Co-authored-by: Jakub Tkacz <32908614+Ubax@users.noreply.github.com> --- packages/expo-router/CHANGELOG.md | 2 ++ .../build/react-navigation/drawer/views/DrawerToggleButton.js | 2 +- .../react-navigation/drawer/views/DrawerToggleButton.js.map | 2 +- .../src/react-navigation/drawer/views/DrawerToggleButton.tsx | 2 +- 4 files changed, 5 insertions(+), 3 deletions(-) diff --git a/packages/expo-router/CHANGELOG.md b/packages/expo-router/CHANGELOG.md index ccabd650eb127e..07a60f69120be3 100644 --- a/packages/expo-router/CHANGELOG.md +++ b/packages/expo-router/CHANGELOG.md @@ -8,6 +8,8 @@ ### 🐛 Bug fixes +- Fix drawer toggle asset path. ([#45170](https://github.com/expo/expo/pull/45170) by [@sleda](https://github.com/sleda)) + ### 💡 Others ## 56.1.1 — 2026-05-08 diff --git a/packages/expo-router/build/react-navigation/drawer/views/DrawerToggleButton.js b/packages/expo-router/build/react-navigation/drawer/views/DrawerToggleButton.js index ccb3507ef1f33a..30dd82267bd9b3 100644 --- a/packages/expo-router/build/react-navigation/drawer/views/DrawerToggleButton.js +++ b/packages/expo-router/build/react-navigation/drawer/views/DrawerToggleButton.js @@ -7,7 +7,7 @@ Object.defineProperty(exports, "__esModule", { value: true }); exports.DrawerToggleButton = DrawerToggleButton; const jsx_runtime_1 = require("react/jsx-runtime"); const react_native_1 = require("react-native"); -const toggle_drawer_icon_png_1 = __importDefault(require("../../../../../assets/react-navigation/drawer/toggle-drawer-icon.png")); +const toggle_drawer_icon_png_1 = __importDefault(require("../../../../assets/react-navigation/drawer/toggle-drawer-icon.png")); const elements_1 = require("../../elements"); const native_1 = require("../../native"); function DrawerToggleButton({ tintColor, accessibilityLabel = 'Show navigation menu', imageSource = toggle_drawer_icon_png_1.default, ...rest }) { diff --git a/packages/expo-router/build/react-navigation/drawer/views/DrawerToggleButton.js.map b/packages/expo-router/build/react-navigation/drawer/views/DrawerToggleButton.js.map index 06c865b74bc823..5254645264b596 100644 --- a/packages/expo-router/build/react-navigation/drawer/views/DrawerToggleButton.js.map +++ b/packages/expo-router/build/react-navigation/drawer/views/DrawerToggleButton.js.map @@ -1 +1 @@ -{"version":3,"file":"DrawerToggleButton.js","sourceRoot":"","sources":["../../../../src/react-navigation/drawer/views/DrawerToggleButton.tsx"],"names":[],"mappings":";AAAA,YAAY,CAAC;;;;;AAgBb,gDAsBC;;AArCD,+CAA4F;AAE5F,kIAAoG;AACpG,6CAA8C;AAC9C,yCAAgF;AAWhF,SAAgB,kBAAkB,CAAC,EACjC,SAAS,EACT,kBAAkB,GAAG,sBAAsB,EAC3C,WAAW,GAAG,gCAAgB,EAC9B,GAAG,IAAI,EACD;IACN,MAAM,UAAU,GAAG,IAAA,sBAAa,GAAuC,CAAC;IAExE,OAAO,CACL,uBAAC,uBAAY,OACP,IAAI,EACR,kBAAkB,EAAE,kBAAkB,EACtC,OAAO,EAAE,GAAG,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,sBAAa,CAAC,YAAY,EAAE,CAAC,YAChE,uBAAC,oBAAK,IACJ,UAAU,EAAC,SAAS,EACpB,MAAM,EAAE,WAAW,EACnB,YAAY,EAAE,CAAC,EACf,SAAS,EAAE,SAAS,EACpB,KAAK,EAAE,MAAM,CAAC,IAAI,GAClB,GACW,CAChB,CAAC;AACJ,CAAC;AAED,MAAM,MAAM,GAAG,yBAAU,CAAC,MAAM,CAAC;IAC/B,IAAI,EAAE;QACJ,MAAM,EAAE,EAAE;QACV,KAAK,EAAE,EAAE;QACT,cAAc,EAAE,CAAC;QACjB,gBAAgB,EAAE,CAAC;KACpB;CACF,CAAC,CAAC","sourcesContent":["'use client';\nimport { type ColorValue, Image, type ImageSourcePropType, StyleSheet } from 'react-native';\n\nimport toggleDrawerIcon from '../../../../../assets/react-navigation/drawer/toggle-drawer-icon.png';\nimport { HeaderButton } from '../../elements';\nimport { DrawerActions, type ParamListBase, useNavigation } from '../../native';\nimport type { DrawerNavigationProp } from '../types';\n\ntype Props = {\n accessibilityLabel?: string;\n pressColor?: ColorValue;\n pressOpacity?: number;\n tintColor?: ColorValue;\n imageSource?: ImageSourcePropType;\n};\n\nexport function DrawerToggleButton({\n tintColor,\n accessibilityLabel = 'Show navigation menu',\n imageSource = toggleDrawerIcon,\n ...rest\n}: Props) {\n const navigation = useNavigation>();\n\n return (\n navigation.dispatch(DrawerActions.toggleDrawer())}>\n \n \n );\n}\n\nconst styles = StyleSheet.create({\n icon: {\n height: 24,\n width: 24,\n marginVertical: 8,\n marginHorizontal: 5,\n },\n});\n"]} \ No newline at end of file +{"version":3,"file":"DrawerToggleButton.js","sourceRoot":"","sources":["../../../../src/react-navigation/drawer/views/DrawerToggleButton.tsx"],"names":[],"mappings":";AAAA,YAAY,CAAC;;;;;AAgBb,gDAsBC;;AArCD,+CAA4F;AAE5F,+HAAiG;AACjG,6CAA8C;AAC9C,yCAAgF;AAWhF,SAAgB,kBAAkB,CAAC,EACjC,SAAS,EACT,kBAAkB,GAAG,sBAAsB,EAC3C,WAAW,GAAG,gCAAgB,EAC9B,GAAG,IAAI,EACD;IACN,MAAM,UAAU,GAAG,IAAA,sBAAa,GAAuC,CAAC;IAExE,OAAO,CACL,uBAAC,uBAAY,OACP,IAAI,EACR,kBAAkB,EAAE,kBAAkB,EACtC,OAAO,EAAE,GAAG,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,sBAAa,CAAC,YAAY,EAAE,CAAC,YAChE,uBAAC,oBAAK,IACJ,UAAU,EAAC,SAAS,EACpB,MAAM,EAAE,WAAW,EACnB,YAAY,EAAE,CAAC,EACf,SAAS,EAAE,SAAS,EACpB,KAAK,EAAE,MAAM,CAAC,IAAI,GAClB,GACW,CAChB,CAAC;AACJ,CAAC;AAED,MAAM,MAAM,GAAG,yBAAU,CAAC,MAAM,CAAC;IAC/B,IAAI,EAAE;QACJ,MAAM,EAAE,EAAE;QACV,KAAK,EAAE,EAAE;QACT,cAAc,EAAE,CAAC;QACjB,gBAAgB,EAAE,CAAC;KACpB;CACF,CAAC,CAAC","sourcesContent":["'use client';\nimport { type ColorValue, Image, type ImageSourcePropType, StyleSheet } from 'react-native';\n\nimport toggleDrawerIcon from '../../../../assets/react-navigation/drawer/toggle-drawer-icon.png';\nimport { HeaderButton } from '../../elements';\nimport { DrawerActions, type ParamListBase, useNavigation } from '../../native';\nimport type { DrawerNavigationProp } from '../types';\n\ntype Props = {\n accessibilityLabel?: string;\n pressColor?: ColorValue;\n pressOpacity?: number;\n tintColor?: ColorValue;\n imageSource?: ImageSourcePropType;\n};\n\nexport function DrawerToggleButton({\n tintColor,\n accessibilityLabel = 'Show navigation menu',\n imageSource = toggleDrawerIcon,\n ...rest\n}: Props) {\n const navigation = useNavigation>();\n\n return (\n navigation.dispatch(DrawerActions.toggleDrawer())}>\n \n \n );\n}\n\nconst styles = StyleSheet.create({\n icon: {\n height: 24,\n width: 24,\n marginVertical: 8,\n marginHorizontal: 5,\n },\n});\n"]} \ No newline at end of file diff --git a/packages/expo-router/src/react-navigation/drawer/views/DrawerToggleButton.tsx b/packages/expo-router/src/react-navigation/drawer/views/DrawerToggleButton.tsx index 11b9ed77943298..718a56954d1d88 100644 --- a/packages/expo-router/src/react-navigation/drawer/views/DrawerToggleButton.tsx +++ b/packages/expo-router/src/react-navigation/drawer/views/DrawerToggleButton.tsx @@ -1,7 +1,7 @@ 'use client'; import { type ColorValue, Image, type ImageSourcePropType, StyleSheet } from 'react-native'; -import toggleDrawerIcon from '../../../../../assets/react-navigation/drawer/toggle-drawer-icon.png'; +import toggleDrawerIcon from '../../../../assets/react-navigation/drawer/toggle-drawer-icon.png'; import { HeaderButton } from '../../elements'; import { DrawerActions, type ParamListBase, useNavigation } from '../../native'; import type { DrawerNavigationProp } from '../types'; From ce79d13f68f8bb107840ad86c95ba5efef4b54ff Mon Sep 17 00:00:00 2001 From: Aman Mittal Date: Mon, 11 May 2026 15:41:45 +0530 Subject: [PATCH 02/19] [docs] Update Expo Skills page (#45569) # Why - Sync Expo Skills changes - Fix ENG-21129 # Test Plan Follow the updated steps for Cursor in the guide. # Checklist - [ ] I added a `changelog.md` entry and rebuilt the package sources according to [this short guide](https://github.com/expo/expo/blob/main/CONTRIBUTING.md#-before-submitting) - [ ] This diff will work correctly for `npx expo prebuild` & EAS Build (eg: updated a module plugin). - [ ] Conforms with the [Documentation Writing Style Guide](https://github.com/expo/expo/blob/main/guides/Expo%20Documentation%20Writing%20Style%20Guide.md) --- docs/pages/skills.mdx | 26 +++++++++++++------ .../ExpoSkillsTable/data/expo-skills.json | 4 +-- 2 files changed, 20 insertions(+), 10 deletions(-) diff --git a/docs/pages/skills.mdx b/docs/pages/skills.mdx index f076a45b7ca640..b432005b3b0648 100644 --- a/docs/pages/skills.mdx +++ b/docs/pages/skills.mdx @@ -29,20 +29,30 @@ Run the following commands to add and install Expo Skills from the plugin market -Follow the steps below in your Cursor app to add Expo Skills as a remote rule: - {/* vale off */} -- Open **Settings** > **Rules & Command** > **Project Rules** > **Add Rule** and select **Remote Rule**. -- Enter the following URL of the remote rule and click **Add**. +If you have already installed Expo Skills for Claude Code, Codex, or another agent, recent versions of Cursor import them automatically. Open **Settings** > **Rules, Skills, Subagents**, make sure **Include third-party Plugins, Skills, and other configs** is enabled (it is on by default), and the Expo Skills appear in the **Skills** list. {/* vale on */} -```text Remote URL -https://github.com/expo/skills.git -``` +If you have not installed Expo Skills yet, run one of the following with the [skills CLI](https://skills.sh/docs/cli): + + + +{/* vale off */} + +Then reopen Cursor and verify the skills appear under **Settings** > **Rules, Skills, Subagents** > **Skills**. + +{/* vale on */} -> **important** **Note:** Skills in Cursor are not shown in the slash command (`/`) menu. They work via auto-discovery when you ask the agent Expo-related questions. +> **important** Skills in Cursor are not shown in the slash command (`/`) menu. They work via auto-discovery when you ask the agent Expo-related questions. diff --git a/docs/ui/components/ExpoSkillsTable/data/expo-skills.json b/docs/ui/components/ExpoSkillsTable/data/expo-skills.json index ec59ec30ea012f..a249c5b9bd98c1 100644 --- a/docs/ui/components/ExpoSkillsTable/data/expo-skills.json +++ b/docs/ui/components/ExpoSkillsTable/data/expo-skills.json @@ -2,7 +2,7 @@ "source": { "repo": "expo/skills", "url": "https://api.github.com/repos/expo/skills/contents/plugins/expo/skills", - "fetchedAt": "2026-04-23T16:26:03.579Z" + "fetchedAt": "2026-05-08T17:16:55.564Z" }, "totalSkills": 13, "skills": [ @@ -38,7 +38,7 @@ }, { "name": "expo-module", - "description": "Guide for writing Expo native modules and views using the Expo Modules API (Swift, Kotlin, TypeScript). Covers module definition DSL, native views, shared objects, config plugins, lifecycle hooks, autolinking, and type system. Use when building or modifying native modules for Expo.", + "description": "Guide for creating and writing Expo native modules and views using the Expo Modules API (Swift, Kotlin, TypeScript). Covers module definition DSL, native views, shared objects, config plugins, lifecycle hooks, autolinking, and type system. Use when building or modifying native modules for Expo.", "githubUrl": "https://github.com/expo/skills/blob/main/plugins/expo/skills/expo-module/SKILL.md" }, { From a096d6c98d6f5deb30ff4350449561f538f76e73 Mon Sep 17 00:00:00 2001 From: Aman Mittal Date: Mon, 11 May 2026 15:42:58 +0530 Subject: [PATCH 03/19] [docs] Add TabsGroup in Clerk guide source file (#45561) # Why The Clerk guide has two separate `` blocks (integration approach and platform-specific setup) that each track their own selected index. A reader who picks "JavaScript only (Expo Go)" in the first tab set has to re-select the matching tab further down the page, which is easy to miss and can lead them through the wrong steps. # How Wrap the page contents in `` from `~/ui/components/Tabs` so both `` instances share the same selected index via `SharedTabsContext`. # Test Plan Open `/guides/using-clerk` locally, switch the first tab set between "Native UI components", "JavaScript with native sign-in", and "JavaScript only (Expo Go)", and confirm the platform setup tabs further down the page move in lockstep. Reload the page and verify the default tab still renders. # Checklist - [ ] I added a `changelog.md` entry and rebuilt the package sources according to [this short guide](https://github.com/nicknisi/dotfiles/wiki/Pull-Request-Guidelines). - [ ] This diff will work correctly for `npx expo prebuild` & EAS Build (eg: updated a module plugin). - [ ] Conforms with the [Documentation Writing Style Guide](https://github.com/expo/expo/blob/main/guides/Expo%20Documentation%20Writing%20Style%20Guide.md). --- docs/pages/guides/using-clerk.mdx | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/docs/pages/guides/using-clerk.mdx b/docs/pages/guides/using-clerk.mdx index 1621dd2d99d257..85de508720ffb4 100644 --- a/docs/pages/guides/using-clerk.mdx +++ b/docs/pages/guides/using-clerk.mdx @@ -9,9 +9,11 @@ import { YesIcon, NoIcon } from '~/ui/components/DocIcons'; import { Prerequisites, Requirement } from '~/ui/components/Prerequisites'; import { Terminal } from '~/ui/components/Snippet'; import { Step } from '~/ui/components/Step'; -import { Tabs, Tab } from '~/ui/components/Tabs'; +import { TabsGroup, Tabs, Tab } from '~/ui/components/Tabs'; import { BookOpen02Icon } from '@expo/styleguide-icons/outline/BookOpen02Icon'; + + [Clerk](https://clerk.com/expo-authentication) is an authentication and user management platform that provides sign-up, sign-in, multi-factor authentication, social sign-in, organizations, and a hosted user database. The [`@clerk/expo`](https://www.npmjs.com/package/@clerk/expo) SDK gives you React hooks, control components, and prebuilt native UI components that render with Jetpack Compose on Android and SwiftUI on iOS. This guide shows you how to install `@clerk/expo`, wrap your app in ``, and choose the integration approach that fits your project. It targets `@clerk/expo` Core 3 (the 3.x release line), which supports Expo SDK 53, 54, and 55. @@ -137,7 +139,7 @@ In Core 3, `publishableKey` is required on `` for Expo apps. Envi The next step depends on which approach you chose. The tabs below show the minimum code for each. - + @@ -444,3 +446,5 @@ For the JavaScript-only approach, run the following command and open the project href="https://clerk.com/docs/guides/development/deployment/expo" Icon={BookOpen02Icon} /> + + From 99684f97665a332009fc9caa22257b3bda7cf1f6 Mon Sep 17 00:00:00 2001 From: Aman Mittal Date: Mon, 11 May 2026 15:43:48 +0530 Subject: [PATCH 04/19] [docs] Fix Tailwind v4 important syntax in arbitrary value classes (#45607) # Why The docs production build prints `Found 3 warnings while optimizing generated CSS` with `Unexpected token Delim('!')` against the values `100!%` and `90!%`. These come from arbitrary-value Tailwind classes where the `!important` modifier landed inside the brackets, producing invalid CSS for sidebar link `line-height` and the "Default:" prop-value `font-size`. CleanShot 2026-04-24 at 17 44
23@2x # How Move the `!` from inside the arbitrary-value bracket to Tailwind v4's trailing-suffix position, so `leading-[100!%]` becomes `leading-[100%]!` in `SidebarSingleEntry.tsx`, and `text-[90!%]` becomes `text-[90%]!` in `APISectionUtils.tsx` (renderDefaultValue) and `APISectionTypes.tsx`. The pre-v4 form was `!leading-[100%]` / `!text-[90%]`, and the migration in #43623 collapsed the prefix into the bracket value rather than emitting the new suffix syntax. # Test Plan Run a production build of the docs and confirm the three CSS optimizer warnings are gone. Open `/versions/latest/sdk/image/` and verify that the top sidebar link labels (Home, Guides, EAS, Reference, Learn) sit flush against their icons, and that the inline `` next to "Default:" on props such as `priority` and `cachePolicy` renders visibly smaller than body text, both inside the Props table and the Types section. Example: CleanShot 2026-05-10 at 14 48 22@2x # Checklist - [ ] I added a `changelog.md` entry and rebuilt the package sources according to [this short guide](https://github.com/nicknisi/dotfiles/wiki/Pull-Request-Guidelines). - [ ] This diff will work correctly for `npx expo prebuild` & EAS Build (eg: updated a module plugin). - [ ] Conforms with the [Documentation Writing Style Guide](https://github.com/expo/expo/blob/main/guides/Expo%20Documentation%20Writing%20Style%20Guide.md). --- docs/components/plugins/api/APISectionTypes.tsx | 2 +- docs/components/plugins/api/APISectionUtils.tsx | 2 +- docs/ui/components/Sidebar/SidebarSingleEntry.tsx | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/components/plugins/api/APISectionTypes.tsx b/docs/components/plugins/api/APISectionTypes.tsx index a7a83513660a5b..ecb685b51ca922 100644 --- a/docs/components/plugins/api/APISectionTypes.tsx +++ b/docs/components/plugins/api/APISectionTypes.tsx @@ -178,7 +178,7 @@ const renderType = ( const defaultValueElement = defaultValue ? ( Default: - {defaultValue} + {defaultValue} ) : undefined; diff --git a/docs/components/plugins/api/APISectionUtils.tsx b/docs/components/plugins/api/APISectionUtils.tsx index 50bddbac5b7583..461d3fa467e8b7 100644 --- a/docs/components/plugins/api/APISectionUtils.tsx +++ b/docs/components/plugins/api/APISectionUtils.tsx @@ -425,7 +425,7 @@ export const renderDefaultValue = (defaultValue?: string) => defaultValue && defaultValue !== '...' ? (
Default: - {defaultValue} + {defaultValue}
) : undefined; diff --git a/docs/ui/components/Sidebar/SidebarSingleEntry.tsx b/docs/ui/components/Sidebar/SidebarSingleEntry.tsx index 070dddaf27e7c9..e97d6afa0cf90c 100644 --- a/docs/ui/components/Sidebar/SidebarSingleEntry.tsx +++ b/docs/ui/components/Sidebar/SidebarSingleEntry.tsx @@ -33,7 +33,7 @@ export const SidebarSingleEntry = ({ Date: Mon, 11 May 2026 15:44:12 +0530 Subject: [PATCH 05/19] [docs] Fix missing API docs data for AccessoryWidgetBackground in Expo UI (#45606) # Why CleanShot 2026-05-10 at 14 28
00@2x # How For unversioned, SDK 56, and 55, generate API docs data for `AccessoryWidgetBackground` in Expo UI from each branch. # Test Plan Preview: CleanShot 2026-05-10 at 14 28
18@2x CleanShot 2026-05-10 at 14 28
24@2x CleanShot 2026-05-10 at 14 28
30@2x # Checklist - [ ] I added a `changelog.md` entry and rebuilt the package sources according to [this short guide](https://github.com/expo/expo/blob/main/CONTRIBUTING.md#-before-submitting) - [ ] This diff will work correctly for `npx expo prebuild` & EAS Build (eg: updated a module plugin). - [ ] Conforms with the [Documentation Writing Style Guide](https://github.com/expo/expo/blob/main/guides/Expo%20Documentation%20Writing%20Style%20Guide.md) --- .../expo-ui/swift-ui/accessorywidgetbackground.json | 1 + .../v55.0.0/expo-ui/swift-ui/accessorywidgetbackground.json | 1 + .../v56.0.0/expo-ui/swift-ui/accessorywidgetbackground.json | 1 + tools/src/commands/GenerateDocsAPIData.ts | 4 ++++ 4 files changed, 7 insertions(+) create mode 100644 docs/public/static/data/unversioned/expo-ui/swift-ui/accessorywidgetbackground.json create mode 100644 docs/public/static/data/v55.0.0/expo-ui/swift-ui/accessorywidgetbackground.json create mode 100644 docs/public/static/data/v56.0.0/expo-ui/swift-ui/accessorywidgetbackground.json diff --git a/docs/public/static/data/unversioned/expo-ui/swift-ui/accessorywidgetbackground.json b/docs/public/static/data/unversioned/expo-ui/swift-ui/accessorywidgetbackground.json new file mode 100644 index 00000000000000..4a61e355dea6d7 --- /dev/null +++ b/docs/public/static/data/unversioned/expo-ui/swift-ui/accessorywidgetbackground.json @@ -0,0 +1 @@ +{"schemaVersion":"2.0","name":"expo-ui/swift-ui/accessorywidgetbackground","variant":"project","kind":1,"children":[{"name":"AccessoryWidgetBackgroundProps","variant":"declaration","kind":2097152,"type":{"type":"reference","target":{"packageName":"@expo/ui","packagePath":"src/swift-ui/types.ts","qualifiedName":"CommonViewModifierProps"},"name":"CommonViewModifierProps","package":"@expo/ui"}},{"name":"AccessoryWidgetBackground","variant":"declaration","kind":64,"signatures":[{"name":"AccessoryWidgetBackground","variant":"signature","kind":4096,"parameters":[{"name":"props","variant":"param","kind":32768,"type":{"type":"reference","target":{"packageName":"@expo/ui","packagePath":"src/swift-ui/types.ts","qualifiedName":"CommonViewModifierProps"},"name":"CommonViewModifierProps","package":"@expo/ui"}}],"type":{"type":"reference","target":{"packageName":"@types/react","packagePath":"jsx-runtime.d.ts","qualifiedName":"JSX.Element"},"name":"Element","package":"@types/react","qualifiedName":"JSX.Element"}}]}],"packageName":"@expo/ui"} \ No newline at end of file diff --git a/docs/public/static/data/v55.0.0/expo-ui/swift-ui/accessorywidgetbackground.json b/docs/public/static/data/v55.0.0/expo-ui/swift-ui/accessorywidgetbackground.json new file mode 100644 index 00000000000000..4a61e355dea6d7 --- /dev/null +++ b/docs/public/static/data/v55.0.0/expo-ui/swift-ui/accessorywidgetbackground.json @@ -0,0 +1 @@ +{"schemaVersion":"2.0","name":"expo-ui/swift-ui/accessorywidgetbackground","variant":"project","kind":1,"children":[{"name":"AccessoryWidgetBackgroundProps","variant":"declaration","kind":2097152,"type":{"type":"reference","target":{"packageName":"@expo/ui","packagePath":"src/swift-ui/types.ts","qualifiedName":"CommonViewModifierProps"},"name":"CommonViewModifierProps","package":"@expo/ui"}},{"name":"AccessoryWidgetBackground","variant":"declaration","kind":64,"signatures":[{"name":"AccessoryWidgetBackground","variant":"signature","kind":4096,"parameters":[{"name":"props","variant":"param","kind":32768,"type":{"type":"reference","target":{"packageName":"@expo/ui","packagePath":"src/swift-ui/types.ts","qualifiedName":"CommonViewModifierProps"},"name":"CommonViewModifierProps","package":"@expo/ui"}}],"type":{"type":"reference","target":{"packageName":"@types/react","packagePath":"jsx-runtime.d.ts","qualifiedName":"JSX.Element"},"name":"Element","package":"@types/react","qualifiedName":"JSX.Element"}}]}],"packageName":"@expo/ui"} \ No newline at end of file diff --git a/docs/public/static/data/v56.0.0/expo-ui/swift-ui/accessorywidgetbackground.json b/docs/public/static/data/v56.0.0/expo-ui/swift-ui/accessorywidgetbackground.json new file mode 100644 index 00000000000000..4a61e355dea6d7 --- /dev/null +++ b/docs/public/static/data/v56.0.0/expo-ui/swift-ui/accessorywidgetbackground.json @@ -0,0 +1 @@ +{"schemaVersion":"2.0","name":"expo-ui/swift-ui/accessorywidgetbackground","variant":"project","kind":1,"children":[{"name":"AccessoryWidgetBackgroundProps","variant":"declaration","kind":2097152,"type":{"type":"reference","target":{"packageName":"@expo/ui","packagePath":"src/swift-ui/types.ts","qualifiedName":"CommonViewModifierProps"},"name":"CommonViewModifierProps","package":"@expo/ui"}},{"name":"AccessoryWidgetBackground","variant":"declaration","kind":64,"signatures":[{"name":"AccessoryWidgetBackground","variant":"signature","kind":4096,"parameters":[{"name":"props","variant":"param","kind":32768,"type":{"type":"reference","target":{"packageName":"@expo/ui","packagePath":"src/swift-ui/types.ts","qualifiedName":"CommonViewModifierProps"},"name":"CommonViewModifierProps","package":"@expo/ui"}}],"type":{"type":"reference","target":{"packageName":"@types/react","packagePath":"jsx-runtime.d.ts","qualifiedName":"JSX.Element"},"name":"Element","package":"@types/react","qualifiedName":"JSX.Element"}}]}],"packageName":"@expo/ui"} \ No newline at end of file diff --git a/tools/src/commands/GenerateDocsAPIData.ts b/tools/src/commands/GenerateDocsAPIData.ts index d32eca15d2d099..a4c98d9dca4e8a 100644 --- a/tools/src/commands/GenerateDocsAPIData.ts +++ b/tools/src/commands/GenerateDocsAPIData.ts @@ -30,6 +30,10 @@ const uiPackagesMapping: Record = { 'expo-ui/community/segmented-control': ['community/segmented-control/index.tsx', 'expo-ui'], // Swift UI + 'expo-ui/swift-ui/accessorywidgetbackground': [ + 'swift-ui/AccessoryWidgetBackground/index.tsx', + 'expo-ui', + ], 'expo-ui/swift-ui/bottomsheet': ['swift-ui/BottomSheet/index.tsx', 'expo-ui'], 'expo-ui/swift-ui/button': ['swift-ui/Button/index.tsx', 'expo-ui'], 'expo-ui/swift-ui/circularprogress': ['swift-ui/ProgressView/index.tsx', 'expo-ui'], From 48d2c7ad835544045e9470eb7a7c78c3ab1dc291 Mon Sep 17 00:00:00 2001 From: Jakub Tkacz <32908614+Ubax@users.noreply.github.com> Date: Mon, 11 May 2026 12:23:12 +0200 Subject: [PATCH 06/19] [expo-router] replace jest image mapper with transform (#45624) # Why In order to avoid regressions similar to https://github.com/expo/expo/issues/45532, I propose that instead of mocking image assets in router, we transform them to simple number export. This way if the asset is removed or file is moved, we will see the regression while running unit tests. # How Replace `packages/expo-router/__mocks__/imageMock.js` with `packages/expo-router/__mocks__/imageTransformer.js` # Test Plan CI (it will fail until https://github.com/expo/expo/pull/45170#pullrequestreview-4261833066 is not merged) # Checklist - [ ] I added a `changelog.md` entry and rebuilt the package sources according to [this short guide](https://github.com/expo/expo/blob/main/CONTRIBUTING.md#-before-submitting) - [ ] This diff will work correctly for `npx expo prebuild` & EAS Build (eg: updated a module plugin). - [ ] Conforms with the [Documentation Writing Style Guide](https://github.com/expo/expo/blob/main/guides/Expo%20Documentation%20Writing%20Style%20Guide.md) --- packages/expo-router/__mocks__/imageMock.js | 2 -- packages/expo-router/__mocks__/imageTransformer.js | 9 +++++++++ packages/expo-router/jest.config.js | 6 ++++-- 3 files changed, 13 insertions(+), 4 deletions(-) delete mode 100644 packages/expo-router/__mocks__/imageMock.js create mode 100644 packages/expo-router/__mocks__/imageTransformer.js diff --git a/packages/expo-router/__mocks__/imageMock.js b/packages/expo-router/__mocks__/imageMock.js deleted file mode 100644 index 009c00d736290c..00000000000000 --- a/packages/expo-router/__mocks__/imageMock.js +++ /dev/null @@ -1,2 +0,0 @@ -// Jest mock for image/file imports (png, jpg, etc.) -module.exports = 1; diff --git a/packages/expo-router/__mocks__/imageTransformer.js b/packages/expo-router/__mocks__/imageTransformer.js new file mode 100644 index 00000000000000..a584e8936f3f35 --- /dev/null +++ b/packages/expo-router/__mocks__/imageTransformer.js @@ -0,0 +1,9 @@ +// Jest transformer for image assets. Jest's resolver runs first, so a broken +// relative path fails with "Cannot find module ..." before this transformer is +// invoked — that's the regression guard against bugs like #45170. When the +// file exists, return a numeric stub like Metro does. +module.exports = { + process() { + return { code: 'module.exports = 1;' }; + }, +}; diff --git a/packages/expo-router/jest.config.js b/packages/expo-router/jest.config.js index afb94d28df0be1..75399308b02688 100644 --- a/packages/expo-router/jest.config.js +++ b/packages/expo-router/jest.config.js @@ -20,8 +20,10 @@ function withDefaults({ watchPlugins, ...config }) { '^.+\\.module\\.css$': '/__mocks__/styleMock.js', // Plain CSS (and other style files) can be stubbed with an empty object. '^.+\\.(css|less|sass|scss)$': '/__mocks__/styleMock.js', - // Image assets: stub with a simple numeric value (like Metro does). - '^.+\\.(png|jpg|jpeg|gif|svg)$': '/__mocks__/imageMock.js', + }, + transform: { + ...(config.transform || {}), + '^.+\\.(png|jpg|jpeg|gif|svg)$': '/__mocks__/imageTransformer.js', }, }; } From 4a42108aac53e50e211e431e2d61753156432b2b Mon Sep 17 00:00:00 2001 From: Alan Hughes <30924086+alanjhughes@users.noreply.github.com> Date: Mon, 11 May 2026 11:45:00 +0100 Subject: [PATCH 07/19] [expo-go] Set constants to `EXConstantsBinding` (#45630) --- apps/expo-go/ios/Exponent-Bridging-Header.h | 1 + .../ios/Exponent/Versioned/Core/VersionManager.swift | 7 +++++++ 2 files changed, 8 insertions(+) diff --git a/apps/expo-go/ios/Exponent-Bridging-Header.h b/apps/expo-go/ios/Exponent-Bridging-Header.h index 76ce886490061f..81499b4e29269b 100644 --- a/apps/expo-go/ios/Exponent-Bridging-Header.h +++ b/apps/expo-go/ios/Exponent-Bridging-Header.h @@ -30,3 +30,4 @@ #import "EXReactAppManager.h" #import "EXAbstractLoader.h" #import "EXProgressHUD.h" +#import "EXConstantsBinding.h" diff --git a/apps/expo-go/ios/Exponent/Versioned/Core/VersionManager.swift b/apps/expo-go/ios/Exponent/Versioned/Core/VersionManager.swift index 991ffc9e22221e..61566900d2163a 100644 --- a/apps/expo-go/ios/Exponent/Versioned/Core/VersionManager.swift +++ b/apps/expo-go/ios/Exponent/Versioned/Core/VersionManager.swift @@ -62,6 +62,13 @@ final class VersionManager: EXVersionManagerObjC { self.appContext = appContext self.legacyModuleRegistry = legacyModuleRegistry + // The ConstantsProvider hardcodes `executionEnvironment ti "bare"` and reads `manifest` from + // EXConstants.bundle. In Expo Go we need `executionEnvironment to be + // "storeClient". EXConstantsBinding merges them on top of the + // base constants, so installing it here makes `Constants.expoConfig`, + // `Constants.executionEnvironment` resolve correctly. + appContext.constants = EXConstantsBinding(params: params) + registerExpoModules(appContext) hasRegisteredExpoModules = true From 9bfcb244e11ea7a96231163d2bc3d3c5c3872d6b Mon Sep 17 00:00:00 2001 From: Alan Hughes <30924086+alanjhughes@users.noreply.github.com> Date: Mon, 11 May 2026 11:50:36 +0100 Subject: [PATCH 08/19] [app-metrics] Run spotless (#45631) --- .../expo/modules/appmetrics/storage/SessionMappers.kt | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/packages/expo-app-metrics/android/src/main/java/expo/modules/appmetrics/storage/SessionMappers.kt b/packages/expo-app-metrics/android/src/main/java/expo/modules/appmetrics/storage/SessionMappers.kt index 9a001b561da69b..05400a59ac359d 100644 --- a/packages/expo-app-metrics/android/src/main/java/expo/modules/appmetrics/storage/SessionMappers.kt +++ b/packages/expo-app-metrics/android/src/main/java/expo/modules/appmetrics/storage/SessionMappers.kt @@ -95,10 +95,11 @@ private fun jsonElementToAny(element: JsonElement): Any? { is JsonNull -> null is JsonPrimitive -> when { element.isString -> element.content - else -> element.booleanOrNull - ?: element.longOrNull - ?: element.doubleOrNull - ?: element.content + else -> + element.booleanOrNull + ?: element.longOrNull + ?: element.doubleOrNull + ?: element.content } is JsonObject -> element.mapValues { (_, v) -> jsonElementToAny(v) } is JsonArray -> element.map { jsonElementToAny(it) } From 34cb5ac1efa8b67aed6211d23ef9cb79327a22c6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Kosmaty?= Date: Mon, 11 May 2026 12:53:31 +0200 Subject: [PATCH 09/19] [expo][Android] Suppress `DelicateCoroutinesApi` warning in `ExpoModulesPackageList` (#45632) --- .../android/src/main/java/expo/modules/audio/AudioModule.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/expo-audio/android/src/main/java/expo/modules/audio/AudioModule.kt b/packages/expo-audio/android/src/main/java/expo/modules/audio/AudioModule.kt index a748cb348631a7..992239ba7631ce 100644 --- a/packages/expo-audio/android/src/main/java/expo/modules/audio/AudioModule.kt +++ b/packages/expo-audio/android/src/main/java/expo/modules/audio/AudioModule.kt @@ -44,7 +44,6 @@ import okhttp3.OkHttpClient import java.io.File import java.util.concurrent.ConcurrentHashMap -@DelicateCoroutinesApi @androidx.annotation.OptIn(androidx.media3.common.util.UnstableApi::class) class AudioModule : Module() { private lateinit var audioManager: AudioManager @@ -200,6 +199,7 @@ class AudioModule : Module() { focusAcquired = false } + @OptIn(DelicateCoroutinesApi::class) override fun definition() = ModuleDefinition { Name("ExpoAudio") From da405fb9dc9a8178ff597ba1429ed03e8ba55704 Mon Sep 17 00:00:00 2001 From: Jakub Tkacz <32908614+Ubax@users.noreply.github.com> Date: Mon, 11 May 2026 13:06:05 +0200 Subject: [PATCH 10/19] [docs] add experimental stack docs (#45625) # Why # How # Test Plan # Checklist - [ ] I added a `changelog.md` entry and rebuilt the package sources according to [this short guide](https://github.com/expo/expo/blob/main/CONTRIBUTING.md#-before-submitting) - [ ] This diff will work correctly for `npx expo prebuild` & EAS Build (eg: updated a module plugin). - [ ] Conforms with the [Documentation Writing Style Guide](https://github.com/expo/expo/blob/main/guides/Expo%20Documentation%20Writing%20Style%20Guide.md) --- .../sdk/router/experimental-stack.mdx | 120 ++++++++++++++++++ .../v56.0.0/sdk/router/experimental-stack.mdx | 120 ++++++++++++++++++ .../expo-router/experimental-stack.json | 1 + .../expo-router/experimental-stack.json | 1 + tools/src/commands/GenerateDocsAPIData.ts | 1 + 5 files changed, 243 insertions(+) create mode 100644 docs/pages/versions/unversioned/sdk/router/experimental-stack.mdx create mode 100644 docs/pages/versions/v56.0.0/sdk/router/experimental-stack.mdx create mode 100644 docs/public/static/data/unversioned/expo-router/experimental-stack.json create mode 100644 docs/public/static/data/v56.0.0/expo-router/experimental-stack.json diff --git a/docs/pages/versions/unversioned/sdk/router/experimental-stack.mdx b/docs/pages/versions/unversioned/sdk/router/experimental-stack.mdx new file mode 100644 index 00000000000000..93814007635cbb --- /dev/null +++ b/docs/pages/versions/unversioned/sdk/router/experimental-stack.mdx @@ -0,0 +1,120 @@ +--- +title: Router Experimental Stack +sidebar_title: Experimental Stack +description: An opt-in sibling to Stack built on the react-native-screens experimental gamma stack. Available for testing only. +sourceCodeUrl: 'https://github.com/expo/expo/tree/main/packages/expo-router/src/layouts/experimental-stack' +packageName: 'expo-router' +platforms: ['ios', 'android'] +isAlpha: true +--- + +import { BookOpen02Icon } from '@expo/styleguide-icons/outline/BookOpen02Icon'; + +import APISection from '~/components/plugins/APISection'; +import { BoxLink } from '~/ui/components/BoxLink'; +import { Collapsible } from '~/ui/components/Collapsible'; + +> **important** `ExperimentalStack` is an [alpha](/more/release-statuses/#alpha) API available in **Expo SDK 56** and later. It is for testing only — the API and feature set may change before it is ready for production use. + +`ExperimentalStack` is a sibling to [`Stack`](./stack) powered by the new `react-native-screens/experimental` stack. It is opt-in per navigator: replace `` with `` in the specific layout you want to migrate, and keep `` everywhere else. + +We are sharing it early so you can try it in your app and tell us what is missing. The supported option surface is intentionally narrow and will grow over time. + +> See the [Expo Router](./index) reference for more information about the file-based routing library for native and Web apps. + +## Supported features + +Supported screen options: + +- `title` +- `headerShown` +- `headerTransparent` +- `headerBackVisible` + +On Android, `ExperimentalStack` ships with [predictive back gesture](https://developer.android.com/guide/navigation/custom-back/predictive-back-gesture) support. You still need to enable it for your app by setting [`android.predictiveBackGestureEnabled`](/versions/latest/config/app/#predictivebackgestureenabled) to `true` in your [app config](/workflow/configuration/). + +## Platform support + +`ExperimentalStack` is native-only. On Web, it falls back to the standard `Stack`, so the same layout works across platforms without conditional code. + +## Basic usage + +```tsx app/_layout.tsx +import { ExperimentalStack as Stack } from 'expo-router'; + +export default function Layout() { + return ( + + + + + ); +} +``` + +You can compose `ExperimentalStack.Screen` and `ExperimentalStack.Protected` the same way you would with `Stack`. + +## Known limitations + + + +`ExperimentalStack` supports only `title`, `headerShown`, `headerTransparent`, and `headerBackVisible`. Passing any other option (for example, `headerLeft`, `headerRight`, `headerTitle`, `headerStyle`, `headerTintColor`, animation overrides, status bar options) logs a development warning and has no effect. Keep using `` for screens that need those options. + + + + + +`ExperimentalStack` does not yet support `presentation: 'modal'` or `transparentModal`. Screens always push onto the stack. + + + + + +`ExperimentalStack` does not yet support `formSheet` or the related sheet sizing/detent options. + + + + + +`ExperimentalStack` does not yet support custom header components or header tinting/styling. Only the four header options listed above take effect. + + + + + +`ExperimentalStack` does not yet honor per-screen animation overrides (`animation`, `animationDuration`) or status bar options. + + + + + +On Android, `ExperimentalStack` and the standard `Stack` cannot coexist in the same app — pick one navigator type for your native stacks. We hope to lift this restriction in a future release so you can migrate one navigator at a time. + + + + + +On Web, `` renders the standard `Stack` from `expo-router`. Native-only options have no effect on Web. + + + +> **info** We are actively developing `ExperimentalStack` and looking for feedback. You can share your thoughts on [Discord](https://chat.expo.dev), [open an issue on GitHub](https://github.com/expo/expo/issues), or use the **Feedback** button at the bottom of this page. + +## Installation + +`ExperimentalStack` ships as part of `expo-router`. Follow the Expo Router installation guide if you do not already have it in your project: + + + +## API + +```js +import { ExperimentalStack } from 'expo-router'; +``` + + diff --git a/docs/pages/versions/v56.0.0/sdk/router/experimental-stack.mdx b/docs/pages/versions/v56.0.0/sdk/router/experimental-stack.mdx new file mode 100644 index 00000000000000..93814007635cbb --- /dev/null +++ b/docs/pages/versions/v56.0.0/sdk/router/experimental-stack.mdx @@ -0,0 +1,120 @@ +--- +title: Router Experimental Stack +sidebar_title: Experimental Stack +description: An opt-in sibling to Stack built on the react-native-screens experimental gamma stack. Available for testing only. +sourceCodeUrl: 'https://github.com/expo/expo/tree/main/packages/expo-router/src/layouts/experimental-stack' +packageName: 'expo-router' +platforms: ['ios', 'android'] +isAlpha: true +--- + +import { BookOpen02Icon } from '@expo/styleguide-icons/outline/BookOpen02Icon'; + +import APISection from '~/components/plugins/APISection'; +import { BoxLink } from '~/ui/components/BoxLink'; +import { Collapsible } from '~/ui/components/Collapsible'; + +> **important** `ExperimentalStack` is an [alpha](/more/release-statuses/#alpha) API available in **Expo SDK 56** and later. It is for testing only — the API and feature set may change before it is ready for production use. + +`ExperimentalStack` is a sibling to [`Stack`](./stack) powered by the new `react-native-screens/experimental` stack. It is opt-in per navigator: replace `` with `` in the specific layout you want to migrate, and keep `` everywhere else. + +We are sharing it early so you can try it in your app and tell us what is missing. The supported option surface is intentionally narrow and will grow over time. + +> See the [Expo Router](./index) reference for more information about the file-based routing library for native and Web apps. + +## Supported features + +Supported screen options: + +- `title` +- `headerShown` +- `headerTransparent` +- `headerBackVisible` + +On Android, `ExperimentalStack` ships with [predictive back gesture](https://developer.android.com/guide/navigation/custom-back/predictive-back-gesture) support. You still need to enable it for your app by setting [`android.predictiveBackGestureEnabled`](/versions/latest/config/app/#predictivebackgestureenabled) to `true` in your [app config](/workflow/configuration/). + +## Platform support + +`ExperimentalStack` is native-only. On Web, it falls back to the standard `Stack`, so the same layout works across platforms without conditional code. + +## Basic usage + +```tsx app/_layout.tsx +import { ExperimentalStack as Stack } from 'expo-router'; + +export default function Layout() { + return ( + + + + + ); +} +``` + +You can compose `ExperimentalStack.Screen` and `ExperimentalStack.Protected` the same way you would with `Stack`. + +## Known limitations + + + +`ExperimentalStack` supports only `title`, `headerShown`, `headerTransparent`, and `headerBackVisible`. Passing any other option (for example, `headerLeft`, `headerRight`, `headerTitle`, `headerStyle`, `headerTintColor`, animation overrides, status bar options) logs a development warning and has no effect. Keep using `` for screens that need those options. + + + + + +`ExperimentalStack` does not yet support `presentation: 'modal'` or `transparentModal`. Screens always push onto the stack. + + + + + +`ExperimentalStack` does not yet support `formSheet` or the related sheet sizing/detent options. + + + + + +`ExperimentalStack` does not yet support custom header components or header tinting/styling. Only the four header options listed above take effect. + + + + + +`ExperimentalStack` does not yet honor per-screen animation overrides (`animation`, `animationDuration`) or status bar options. + + + + + +On Android, `ExperimentalStack` and the standard `Stack` cannot coexist in the same app — pick one navigator type for your native stacks. We hope to lift this restriction in a future release so you can migrate one navigator at a time. + + + + + +On Web, `` renders the standard `Stack` from `expo-router`. Native-only options have no effect on Web. + + + +> **info** We are actively developing `ExperimentalStack` and looking for feedback. You can share your thoughts on [Discord](https://chat.expo.dev), [open an issue on GitHub](https://github.com/expo/expo/issues), or use the **Feedback** button at the bottom of this page. + +## Installation + +`ExperimentalStack` ships as part of `expo-router`. Follow the Expo Router installation guide if you do not already have it in your project: + + + +## API + +```js +import { ExperimentalStack } from 'expo-router'; +``` + + diff --git a/docs/public/static/data/unversioned/expo-router/experimental-stack.json b/docs/public/static/data/unversioned/expo-router/experimental-stack.json new file mode 100644 index 00000000000000..0861a4d210ed1b --- /dev/null +++ b/docs/public/static/data/unversioned/expo-router/experimental-stack.json @@ -0,0 +1 @@ +{"schemaVersion":"2.0","name":"expo-router/experimental-stack","variant":"project","kind":1,"children":[{"name":"ExperimentalStackNavigationEventMap","variant":"declaration","kind":2097152,"comment":{"summary":[{"kind":"text","text":"Navigator-level events emitted by "},{"kind":"code","text":"`ExperimentalStack`"},{"kind":"text","text":". Mirrors the subset of\n"},{"kind":"code","text":"`NativeStackNavigationEventMap`"},{"kind":"text","text":" that the gamma "},{"kind":"code","text":"`Stack.Screen`"},{"kind":"text","text":" lifecycle\ncallbacks can drive."}],"modifierTags":["@experimental"]},"children":[{"name":"gestureCancel","variant":"declaration","kind":1024,"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"children":[{"name":"data","variant":"declaration","kind":1024,"type":{"type":"intrinsic","name":"undefined"}}]}}},{"name":"transitionEnd","variant":"declaration","kind":1024,"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"children":[{"name":"data","variant":"declaration","kind":1024,"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"children":[{"name":"closing","variant":"declaration","kind":1024,"type":{"type":"intrinsic","name":"boolean"}}]}}}]}}},{"name":"transitionStart","variant":"declaration","kind":1024,"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"children":[{"name":"data","variant":"declaration","kind":1024,"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"children":[{"name":"closing","variant":"declaration","kind":1024,"type":{"type":"intrinsic","name":"boolean"}}]}}}]}}}]},{"name":"ExperimentalStackNavigationHelpers","variant":"declaration","kind":2097152,"type":{"type":"reference","target":{"packageName":"expo-router","packagePath":"src/react-navigation/core/types.tsx","qualifiedName":"NavigationHelpers"},"typeArguments":[{"type":"reference","target":{"packageName":"expo-router","packagePath":"src/react-navigation/routers/types.tsx","qualifiedName":"ParamListBase"},"name":"ParamListBase","package":"expo-router"},{"type":"reference","name":"ExperimentalStackNavigationEventMap","package":"expo-router"}],"name":"NavigationHelpers","package":"expo-router"}},{"name":"ExperimentalStackNavigationOptions","variant":"declaration","kind":2097152,"comment":{"summary":[{"kind":"text","text":"Options accepted by "},{"kind":"code","text":"`ExperimentalStack`"},{"kind":"text","text":" screens. Mirrors the narrow option\nsurface of the gamma "},{"kind":"code","text":"``"},{"kind":"text","text":" component from\n"},{"kind":"code","text":"`react-native-screens/experimental`"},{"kind":"text","text":". Anything outside this shape is dropped\nwith a "},{"kind":"code","text":"`__DEV__`"},{"kind":"text","text":" warning at runtime."}],"modifierTags":["@experimental"]},"children":[{"name":"headerBackVisible","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"intrinsic","name":"boolean"}},{"name":"headerShown","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"intrinsic","name":"boolean"}},{"name":"headerTransparent","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"intrinsic","name":"boolean"}},{"name":"title","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"intrinsic","name":"string"}}]},{"name":"ExperimentalStackNavigationProp","variant":"declaration","kind":2097152,"typeParameters":[{"name":"ParamList","variant":"typeParam","kind":131072,"type":{"type":"reference","target":{"packageName":"expo-router","packagePath":"src/react-navigation/routers/types.tsx","qualifiedName":"ParamListBase"},"name":"ParamListBase","package":"expo-router"}},{"name":"RouteName","variant":"typeParam","kind":131072,"type":{"type":"typeOperator","operator":"keyof","target":{"type":"reference","name":"ParamList","package":"expo-router","refersToTypeParameter":true}},"default":{"type":"intrinsic","name":"string"}},{"name":"NavigatorID","variant":"typeParam","kind":131072,"type":{"type":"union","types":[{"type":"intrinsic","name":"string"},{"type":"intrinsic","name":"undefined"}]},"default":{"type":"intrinsic","name":"undefined"}}],"type":{"type":"intersection","types":[{"type":"reference","target":{"packageName":"expo-router","packagePath":"src/react-navigation/core/types.tsx","qualifiedName":"NavigationProp"},"typeArguments":[{"type":"reference","name":"ParamList","package":"expo-router","refersToTypeParameter":true},{"type":"reference","name":"RouteName","package":"expo-router","refersToTypeParameter":true},{"type":"reference","name":"NavigatorID","package":"expo-router","refersToTypeParameter":true},{"type":"reference","target":{"packageName":"expo-router","packagePath":"src/react-navigation/routers/StackRouter.tsx","qualifiedName":"StackNavigationState"},"typeArguments":[{"type":"reference","name":"ParamList","package":"expo-router","refersToTypeParameter":true}],"name":"StackNavigationState","package":"expo-router"},{"type":"reference","name":"ExperimentalStackNavigationOptions","package":"expo-router"},{"type":"reference","name":"ExperimentalStackNavigationEventMap","package":"expo-router"}],"name":"NavigationProp","package":"expo-router"},{"type":"reference","target":{"packageName":"expo-router","packagePath":"src/react-navigation/routers/StackRouter.tsx","qualifiedName":"StackActionHelpers"},"typeArguments":[{"type":"reference","name":"ParamList","package":"expo-router","refersToTypeParameter":true}],"name":"StackActionHelpers","package":"expo-router"}]}},{"name":"ExperimentalStackScreenProps","variant":"declaration","kind":2097152,"children":[{"name":"navigation","variant":"declaration","kind":1024,"type":{"type":"reference","typeArguments":[{"type":"reference","name":"ParamList","package":"expo-router","refersToTypeParameter":true},{"type":"reference","name":"RouteName","package":"expo-router","refersToTypeParameter":true},{"type":"reference","name":"NavigatorID","package":"expo-router","refersToTypeParameter":true}],"name":"ExperimentalStackNavigationProp","package":"expo-router"}},{"name":"route","variant":"declaration","kind":1024,"type":{"type":"reference","target":{"packageName":"expo-router","packagePath":"src/react-navigation/core/types.tsx","qualifiedName":"RouteProp"},"typeArguments":[{"type":"reference","name":"ParamList","package":"expo-router","refersToTypeParameter":true},{"type":"reference","name":"RouteName","package":"expo-router","refersToTypeParameter":true}],"name":"RouteProp","package":"expo-router"}}],"typeParameters":[{"name":"ParamList","variant":"typeParam","kind":131072,"type":{"type":"reference","target":{"packageName":"expo-router","packagePath":"src/react-navigation/routers/types.tsx","qualifiedName":"ParamListBase"},"name":"ParamListBase","package":"expo-router"}},{"name":"RouteName","variant":"typeParam","kind":131072,"type":{"type":"typeOperator","operator":"keyof","target":{"type":"reference","name":"ParamList","package":"expo-router","refersToTypeParameter":true}},"default":{"type":"intrinsic","name":"string"}},{"name":"NavigatorID","variant":"typeParam","kind":131072,"type":{"type":"union","types":[{"type":"intrinsic","name":"string"},{"type":"intrinsic","name":"undefined"}]},"default":{"type":"intrinsic","name":"undefined"}}]},{"name":"ExperimentalStack","variant":"declaration","kind":32,"flags":{"isConst":true},"comment":{"summary":[{"kind":"text","text":"Renders the new "},{"kind":"code","text":"`react-native-screens/experimental`"},{"kind":"text","text":" native stack.\n\nSibling to "},{"kind":"code","text":"`Stack`"},{"kind":"text","text":". Native-only — on web it falls back to the standard "},{"kind":"code","text":"`Stack`"},{"kind":"text","text":".\nOpt-in per navigator: replace "},{"kind":"code","text":"``"},{"kind":"text","text":" with "},{"kind":"code","text":"``"},{"kind":"text","text":" in the\nspecific layout you want to migrate."}],"modifierTags":["@experimental"]},"type":{"type":"intersection","types":[{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"signatures":[{"name":"__type","variant":"signature","kind":4096,"parameters":[{"name":"props","variant":"param","kind":32768,"type":{"type":"intersection","types":[{"type":"reference","target":{"packageName":"typescript","packagePath":"lib/lib.es5.d.ts","qualifiedName":"Omit"},"typeArguments":[{"type":"intersection","types":[{"type":"reference","target":{"packageName":"typescript","packagePath":"lib/lib.es5.d.ts","qualifiedName":"Omit"},"typeArguments":[{"type":"reference","target":{"packageName":"expo-router","packagePath":"src/layouts/experimental-stack/types.ts","qualifiedName":"ExperimentalStackNavigatorProps"},"name":"ExperimentalStackNavigatorProps","package":"expo-router"},{"type":"union","types":[{"type":"literal","value":"children"},{"type":"literal","value":"initialRouteName"},{"type":"literal","value":"layout"},{"type":"literal","value":"screenListeners"},{"type":"literal","value":"screenOptions"},{"type":"literal","value":"screenLayout"},{"type":"literal","value":"UNSTABLE_router"},{"type":"literal","value":"UNSTABLE_routeNamesChangeBehavior"},{"type":"literal","value":"id"}]}],"name":"Omit","package":"typescript"},{"type":"reference","target":{"packageName":"expo-router","packagePath":"src/react-navigation/routers/types.tsx","qualifiedName":"DefaultRouterOptions"},"typeArguments":[{"type":"intrinsic","name":"string"}],"name":"DefaultRouterOptions","package":"expo-router"},{"type":"unknown","name":"{ children: ReactNode; layout?: ((props: { state: StackNavigationState; navigation: NavigationHelpers; descriptors: Record<...>; children: ReactNode; }) => ReactElement<...>) | undefined; ... 4 more ...; UNSTABLE_routeNamesChangeBehavior?: \"firstMatch\" | ... 1 more ... | undefined; ..."}]},{"type":"literal","value":"children"}],"name":"Omit","package":"typescript"},{"type":"reference","target":{"packageName":"typescript","packagePath":"lib/lib.es5.d.ts","qualifiedName":"Partial"},"typeArguments":[{"type":"reference","target":{"packageName":"typescript","packagePath":"lib/lib.es5.d.ts","qualifiedName":"Pick"},"typeArguments":[{"type":"intersection","types":[{"type":"reference","target":{"packageName":"typescript","packagePath":"lib/lib.es5.d.ts","qualifiedName":"Omit"},"typeArguments":[{"type":"reference","target":{"packageName":"expo-router","packagePath":"src/layouts/experimental-stack/types.ts","qualifiedName":"ExperimentalStackNavigatorProps"},"name":"ExperimentalStackNavigatorProps","package":"expo-router"},{"type":"union","types":[{"type":"literal","value":"children"},{"type":"literal","value":"initialRouteName"},{"type":"literal","value":"layout"},{"type":"literal","value":"screenListeners"},{"type":"literal","value":"screenOptions"},{"type":"literal","value":"screenLayout"},{"type":"literal","value":"UNSTABLE_router"},{"type":"literal","value":"UNSTABLE_routeNamesChangeBehavior"},{"type":"literal","value":"id"}]}],"name":"Omit","package":"typescript"},{"type":"reference","target":{"packageName":"expo-router","packagePath":"src/react-navigation/routers/types.tsx","qualifiedName":"DefaultRouterOptions"},"typeArguments":[{"type":"intrinsic","name":"string"}],"name":"DefaultRouterOptions","package":"expo-router"},{"type":"unknown","name":"{ children: ReactNode; layout?: ((props: { state: StackNavigationState; navigation: NavigationHelpers; descriptors: Record<...>; children: ReactNode; }) => ReactElement<...>) | undefined; ... 4 more ...; UNSTABLE_routeNamesChangeBehavior?: \"firstMatch\" | ... 1 more ... | undefined; ..."}]},{"type":"literal","value":"children"}],"name":"Pick","package":"typescript"}],"name":"Partial","package":"typescript"},{"type":"reference","target":{"packageName":"@types/react","packagePath":"index.d.ts","qualifiedName":"React.RefAttributes"},"typeArguments":[{"type":"intrinsic","name":"unknown"}],"name":"RefAttributes","package":"@types/react","qualifiedName":"React.RefAttributes"}]}}],"type":{"type":"reference","target":{"packageName":"@types/react","packagePath":"jsx-runtime.d.ts","qualifiedName":"JSX.Element"},"name":"Element","package":"@types/react","qualifiedName":"JSX.Element"}}]}},{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"children":[{"name":"Protected","variant":"declaration","kind":1024,"type":{"type":"reference","target":{"packageName":"@types/react","packagePath":"index.d.ts","qualifiedName":"React.FunctionComponent"},"typeArguments":[{"type":"reference","target":{"packageName":"expo-router","packagePath":"src/views/Protected.tsx","qualifiedName":"ProtectedProps"},"name":"ProtectedProps","package":"expo-router"}],"name":"FunctionComponent","package":"@types/react","qualifiedName":"React.FunctionComponent"}},{"name":"Screen","variant":"declaration","kind":1024,"type":{"type":"intersection","types":[{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"signatures":[{"name":"__type","variant":"signature","kind":4096,"parameters":[{"name":"__namedParameters","variant":"param","kind":32768,"type":{"type":"reference","target":{"packageName":"expo-router","packagePath":"src/layouts/stack-utils/StackScreen.tsx","qualifiedName":"StackScreenProps"},"name":"StackScreenProps","package":"expo-router"}}],"type":{"type":"reference","target":{"packageName":"@types/react","packagePath":"jsx-runtime.d.ts","qualifiedName":"JSX.Element"},"name":"Element","package":"@types/react","qualifiedName":"JSX.Element"}}]}},{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"children":[{"name":"BackButton","variant":"declaration","kind":1024,"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"signatures":[{"name":"__type","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Component to configure the back button.\n\nCan be used inside Stack.Screen in a layout or directly inside a screen component."}],"blockTags":[{"tag":"@example","content":[{"kind":"code","text":"```tsx\nimport { Stack } from 'expo-router';\n\nexport default function Layout() {\n return (\n \n \n Back\n \n \n );\n}\n```"}]},{"tag":"@example","content":[{"kind":"code","text":"```tsx\nimport { Stack } from 'expo-router';\n\nexport default function Page() {\n return (\n <>\n