Skip to content

[pull] main from expo:main#857

Merged
pull[bot] merged 11 commits into
code:mainfrom
expo:main
May 12, 2026
Merged

[pull] main from expo:main#857
pull[bot] merged 11 commits into
code:mainfrom
expo:main

Conversation

@pull
Copy link
Copy Markdown

@pull pull Bot commented May 12, 2026

See Commits and Changes for more details.


Created by pull[bot] (v2.0.0-alpha.4)

Can you help keep this open source service alive? 💖 Please sponsor : )

rubennorte and others added 11 commits May 12, 2026 10:55
# Why

Naming suspense boundaries is generally a good practice for debugging.
Also, with transition tracing and other tracing solutions for React,
suspense boundary names can help identify the source of an async
operation.

# How

Just added the name in the suspense boundary, using the route name if
available.

# Test Plan

CI

# Checklist

- [x] 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)
- [x] This diff will work correctly for `npx expo prebuild` & EAS Build
(eg: updated a module plugin).
- [x] Conforms with the [Documentation Writing Style
Guide](https://github.com/expo/expo/blob/main/guides/Expo%20Documentation%20Writing%20Style%20Guide.md)
# Why

The `Props` block on API reference pages renders as a bare list of rows
separated by thin top borders, without the rounded outer card that wraps
every other API section (Constants, Methods, Types, Enums). The mismatch
is visible on `/versions/v56.0.0/sdk/router/experimental-stack/`, where
the Props block sits right above a Types card and reads as visually
unfinished.


<img width="2418" height="598" alt="CleanShot 2026-05-11 at 16 19 12@2x"
src="https://github.com/user-attachments/assets/929dc00e-f408-4878-94d7-98d7cde7210f"
/>


# How

<!--
How did you build this feature or fix this bug and why?
-->

Fix Props rendering on API reference pages by using `STYLES_APIBOX`.

# Test Plan

<!--
Please describe how you tested this change and how a reviewer could
reproduce your test, especially if this PR does not include automated
tests! If possible, please also provide terminal output and/or
screenshots demonstrating your test/reproduction.
-->

<img width="2524" height="474" alt="CleanShot 2026-05-12 at 13 29 53@2x"
src="https://github.com/user-attachments/assets/956a43f5-41e8-4141-b45e-1ced4c380c05"
/>


# Checklist

<!--
Please check the appropriate items below if they apply to your diff.
-->

- [ ] 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)
…ion (#45248)

# Why

<!--
Please describe the motivation for this PR, and link to relevant GitHub
issues, forums posts, or feature requests.
-->

This PR partly addresses this issue:
expo/eas-cli#3682.

In the issue, the user reports that the documentation of Gradle JVM args
doesn't match the actual `GRADLE_OPTS` set in builds.

# How

<!--
How did you build this feature or fix this bug and why?
-->

I have compared the documentation with the worker code
(https://github.com/expo/eas-cli/blob/8229dc826513845d82ac4279d0b62394623935cf/packages/worker/src/env.ts#L84-L105),
and confirmed the discrepancy.

To clarify the Gradle opts, I've created a dedicated sub-section in
"Build reference -> Infrastructure" documentation. Apart from clarifying
the `GRADLE_OPTS` value, I have also added a warning about those opts
overriding JVM args set in a project's `gradle.properties`; I have also
provided an information about the possibility to override the
`GRADLE_OPTS` by specifying them in `env` manually.

# Test Plan

<!--
Please describe how you tested this change and how a reviewer could
reproduce your test, especially if this PR does not include automated
tests! If possible, please also provide terminal output and/or
screenshots demonstrating your test/reproduction.
-->

Tested manually

<img width="987" height="792" alt="image"
src="https://github.com/user-attachments/assets/536e616c-5d3c-4c6d-a424-7037f1145765"
/>

# Checklist

<!--
Please check the appropriate items below if they apply to your diff.
-->

- [ ] 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).
- [x] Conforms with the [Documentation Writing Style
Guide](https://github.com/expo/expo/blob/main/guides/Expo%20Documentation%20Writing%20Style%20Guide.md)
# Why

Wire `expo-observe` up to `expo-router` so navigation produces the
metrics App Metrics needs out of the box: time-to-render (TTR) for every
screen plus time-to-interactive (TTI) for screens that call
`useObserve().markInteractive()`. Previously the integration scaffolding
existed but emitted nothing — no listeners, no metrics.

# How

```mermaid
sequenceDiagram
    participant App as App launch
    participant Router as expo-router
    participant Init as init.ts (listeners)
    participant Hook as useObserveForRouter
    participant Metrics as AppMetrics

    App->>Init: appLaunchTime = Date.now()
    Router->>Init: pageFocused (first)
    Init->>Metrics: TTR { isAppLaunch: true }
    Router->>Init: actionDispatched (NAVIGATE)
    Note right of Init: store dispatchTime
    Router->>Init: pageFocused
    Init->>Metrics: TTR { isAppLaunch: false }
    Hook->>Metrics: markInteractive() → TTI (now − dispatchTime)
```


# Test Plan

- Observe tester -> check session for navigation category
- Click house

<img width="590" height="505" alt="Screenshot 2026-05-08 at 20 59 08"
src="https://github.com/user-attachments/assets/727f0724-3891-492e-a9d5-e13c75a7ad4f"
/>

# Checklist

<!--
Please check the appropriate items below if they apply to your diff.
-->

- [ ] 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)
…45664)

# Why

We were seeing tvOS builds try to link an iOS-only precompiled Expo
XCFramework.

With `EXPO_USE_PRECOMPILED_MODULES=1`, CocoaPods treated the prebuilt
XApplication.tar.gz as available just because the tarball existed. It
did not check whether EXApplication.xcframework/Info.plist contained a
tvos slice.

So for a tvOS target, CocoaPods vendored the iOS-only
EXApplication.xcframework, and the Xcode build later failed at link time
with errors like:

```
ld: framework 'EXApplication' not found
```

The fix makes prebuilt resolution platform-aware, so tvOS falls back to
source when the prebuilt XCFramework only contains iOS slices.

# How

Instead of using a prebuilt XCFramework just because its tarball exists,
precompiled_modules.rb now reads the XCFramework Info.plist and checks
AvailableLibraries[*].SupportedPlatform against the current CocoaPods
target platform. osx is normalized to macos.

AutolinkingManager passes the target platform into PrecompiledModules,
so tvOS/macOS/etc. fall back to source when a prebuilt only contains iOS
slices. We also cached the slice checks to avoid repeatedly unpacking
tarballs.

# Test Plan

✅ Ran temp tvOS project with `EXPO_USE_PRECOMPILED_MODULES=1` and
verified the error. Applied the fix and reran.
✅ Verified BareExpo
✅ Verified Minimal Tester

# Checklist

- [x] 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)
- [x] This diff will work correctly for `npx expo prebuild` & EAS Build
(eg: updated a module plugin).
# Why



The Expo UI overview page listed only `DateTimePicker` under "Drop-in replacements",  
while the dedicated `drop-in-replacements` page listed the full set. Two lists drifted
out of sync. 

<!--
Please describe the motivation for this PR, and link to relevant GitHub issues, forums posts, or feature requests.
-->

# How

<!--
How did you build this feature or fix this bug and why?
-->

# Test Plan

<!--
Please describe how you tested this change and how a reviewer could reproduce your test, especially if this PR does not include automated tests! If possible, please also provide terminal output and/or screenshots demonstrating your test/reproduction.
-->

# Checklist

<!--
Please check the appropriate items below if they apply to your diff.
-->

- [ ] 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)
…45633)

# Why

Turns out that `startSession` and `stopSession` are not needed for
router integration anymore.

# How

1. Remove android native implementation
2. Update types
3. Update module.web

# Test Plan

CI

# Checklist

<!--
Please check the appropriate items below if they apply to your diff.
-->

- [ ] 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)
# Why

There was a bug in calculating the safe area bounds for the FAB. In the
first invocation of `rememberFabState`, `SafeBarInsets` were (0,0).

<img width="906" height="50" alt="Screenshot 2026-05-11 at 15 09 16"
src="https://github.com/user-attachments/assets/35f0a8c1-eef8-47db-9a58-b9b92764cb65"
/>

This value stayed in `FabState` forever because the `remember` clause
lacked change keys, causing the FAB to be positioned above the
statusBar:
<img width="377" height="93" alt="Screenshot 2026-05-12 at 10 52 11"
src="https://github.com/user-attachments/assets/415a047d-2f57-4a19-a769-b7f9ee0ee463"
/>

The easier fix would be to make bounds mutable:
```kotlin

val state = remember { FabState(initialOffset, fabBounds, prefs) }
state.fabBounds = fabBounds
``` 

However, there is a better solution: slightly changing the architecture
to move safe-area responsibility to `MovableFloatingActionButton`. This
is achieved with the `safeDrawingPadding` modifier. It works like
`WindowInsets.systemBars` but removes the need for manual calculations
in `rememberFabState`. This way, the source of truth for bounds is the
`BoxWithConstraints` size, not `rememberFabState` logic.

# How

- Simplified FabState to properties used inside the class; moved the
rest of responsibilities to `MovableFloatingActionButton`
- Made state bounds mutable so they can update when they change (as seen
in the screenshot above).

# Test Plan

BareExpo ✅

[Screen_recording_20260512_104957.webm](https://github.com/user-attachments/assets/352ed42a-fec9-479c-9216-8c950a7f9fe3)
…5564)

# Why

Types and functions related to permissions should be re-exported from the `expo` package as discussed here:
#44403
# How

Re-exported the types and functions from `expo-modules-core` to the `expo` package.
# Test Plan
BareExpo ✅
# Why

Follow-up to the #45564, updating the imports from expo-modules-core to expo.
# How

- Updated the imports in packages that use permissions-related types and functions from expo-modules-core.

# Test Plan

BareExpo ✅
@pull pull Bot locked and limited conversation to collaborators May 12, 2026
@pull pull Bot added the ⤵️ pull label May 12, 2026
@pull pull Bot merged commit e519d09 into code:main May 12, 2026
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

8 participants