Skip to content

[pull] main from expo:main - #1207

Merged
pull[bot] merged 19 commits into
code:mainfrom
expo:main
Sep 2, 2026
Merged

[pull] main from expo:main#1207
pull[bot] merged 19 commits into
code:mainfrom
expo:main

Conversation

@pull

@pull pull Bot commented Sep 2, 2026

Copy link
Copy Markdown

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 : )

tsapeta and others added 19 commits September 2, 2026 12:33
… instrumentation (#49637)

# Why

When xcodebuild builds a Swift package directly, Xcode synthesizes a
scheme for it, and that scheme has code coverage enabled like any new
scheme. Coverage is a build setting, so when it's on, swiftc gets
`-profile-generate -profile-coverage-mapping` and clang gets
`-fprofile-instr-generate`, and every function and branch region in the
compiled code gets a counter increment.

That instrumentation ended up in two places where it doesn't belong. The
xcframework script runs a plain `xcodebuild build` in Release and never
asks for coverage, but the scheme's setting still applied, so the
shipped framework carried counters in every function on the host call
path plus the `__llvm_prf_*` and `__llvm_cov*` sections. Without them
the binary shrinks from 1.33 MB to 892 KB, so the instrumentation was
about a third of the shipped framework. And `pnpm benchmark` runs
`xcodebuild test` in Release, where coverage is Xcode's normal default,
which puts the counters inside the very code being timed and makes the
numbers pessimistic.

# How

The xcframework script sets `CLANG_COVERAGE_MAPPING=NO` (the only
setting that actually removes the flags, see the comment there), and the
benchmark script passes `-enableCodeCoverage NO`. This also adds a
benchmark case for the unowned-`this` host function form that `@JS`
functions bind to, since the existing no-op case only covers the
owning-`this` overload.

# Test Plan

The verbose xcodebuild log no longer shows the profiling flags, `otool
-l` shows no `__llvm_prf_*` sections in the built framework, and the
binary went from 1.33 MB to 892 KB. `nm` on the benchmark binary shows
no `___profc_` symbols anymore, and `pnpm benchmark` runs.
… shorthands (#49628)

# Why

> [!NOTE]
> This is a prerequisite to upgrading pnpm

The versions of dependencies on `main` have drifted and not been updated
against the current versions. While this is currently ignored in
`pnpm@10` due to `preferWorkspacePackages: true`, this will cause an
error in future versions on pnpm.

In general, keeping versions in the ranges for workspace packages isn't
ideal.
- Packages aren't published from `main`, so the package versions in
dependencies are meaningless
- Backporting changes where versions have changed causes conflicts, even
if they're also meaningless

pnpm already updates the dependencies specifiers to match the current
versions in the workspaces when we're publishing. This means we can
instead use shorthand specifiers and remove version numbers from our
dependency specifiers entirely.

# How

- Temporary script that strips versions off of all dependencies
(dev/peer/regular, but no changes applied to peer anyway, which the
script validated)
- Update `expo-module-scripts`'s exact/loose dependency specifier check
to support shorthands
- Update `tools`' `updateWorkspaceProjects` task to handle shorthands
too (convert to exact shorthands of `workspace:` for canaries)
- Also add an explicit dependency on `updatePackageVersions` having run
first

# Test Plan

- CI should accept changes as-is

# 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

> [!NOTE]
> This is a prerequisite to upgrading pnpm

This patch has become obsolete; see:
https://github.com/kirillzyusko/react-native-keyboard-controller/blob/af130ca4f9d77061ca098dd4aaec13dda3d5b11f/android/src/main/java/com/reactnativekeyboardcontroller/views/overlay/OverKeyboardHostShadowNode.kt#L29

As of pnpm 11/12, a patch that fails to apply, even if it fails to apply
cleanly (no changes) will hard fail, so this blocks the upgrade.

# How

- Remove obsolete patch

# Test Plan

- Validated that upstream source incorporates the patched change

# 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

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

Follow-up expo/styleguide#228

# How

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

- Bump @expo/styleguide-search-ui
- Keep the search input rounded while focused

# 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="1826" height="2088" alt="CleanShot 2026-09-02 at 16 59
40@2x"
src="https://github.com/user-attachments/assets/d5e78e86-57ff-4bf5-9129-4714082dd188"
/>



# 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)
…le components (#49543)

# Why

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

Follow-up
#49466 (review)

# How

<!--
How did you build this feature or fix this bug and why?
-->
Round in-content boxes to match the new radius scale in multiple
components:
- Collapsible
- Prerequisites
- Tabs
- TabButton
- PlatformTabs
- Table
- SnippetHeader
- SnippetContent
- Code
- CommandLineTools
- InlineHelp
- NativeUpgradePromptCallout
- PossibleRedirectNotification
- ComponentExample
- AppJSBanner

# 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.
-->

**Callouts**

<img width="2282" height="226" alt="CleanShot 2026-08-31 at 15 22 43@2x"
src="https://github.com/user-attachments/assets/9c2dd65c-796b-4ba1-ba97-6166cf7c34fa"
/>

**Collapsibles**
<img width="2338" height="456" alt="CleanShot 2026-08-31 at 15 22 58@2x"
src="https://github.com/user-attachments/assets/19968323-f631-4403-bb98-16ba64a72bab"
/>

**Table**

<img width="2314" height="702" alt="CleanShot 2026-08-31 at 15 22 54@2x"
src="https://github.com/user-attachments/assets/af452834-f35f-4a98-9e27-180c3b1c7f9d"
/>

**Terminal**


<img width="2244" height="384" alt="CleanShot 2026-08-31 at 15 23 11@2x"
src="https://github.com/user-attachments/assets/b4477db3-3582-4691-92e8-cb5c81e6ac9b"
/>

**Code blocks**

<img width="2252" height="672" alt="CleanShot 2026-08-31 at 15 23 33@2x"
src="https://github.com/user-attachments/assets/18691c87-de9f-4b39-a7b9-6d3af35fe094"
/>

<img width="2198" height="1060" alt="CleanShot 2026-08-31 at 15 23
44@2x"
src="https://github.com/user-attachments/assets/ecd47169-0423-431f-a9f9-df4d4e7935b1"
/>

**Prerequisites**

<img width="2226" height="1200" alt="CleanShot 2026-08-31 at 15 24
31@2x"
src="https://github.com/user-attachments/assets/d68497a3-7da2-48f7-8c22-2a9cd23db9b6"
/>

**Tabs**

<img width="960" height="158" alt="CleanShot 2026-08-31 at 15 29 43@2x"
src="https://github.com/user-attachments/assets/0b52f05c-774f-4376-88c8-c3a5ba6f1816"
/>


# 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

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

Fix ENG-26260

# How

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

- Change `STYLES_APIBOX` from `rounded-lg` to `rounded-3xl`.
- Scope the nested-box radius to `APIBox`'s own nesting condition
(`headerNestingLevel > 3` adds the concentric `rounded-lg`), since
`STYLES_APIBOX_NESTED` is also used by top-level method, class, and
interface boxes.
- Round the sticky deprecation note's top corners to match the box;
method-internal notes keep their squared override.
- Round the app config schema stack's outer corners
(`AppConfigSchemaTable`); the stacked rows stay attached.
- Update the two affected Jest snapshots.

# 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="2460" height="1522" alt="CleanShot 2026-08-27 at 23 30
26@2x"
src="https://github.com/user-attachments/assets/628e198d-669c-4605-a740-453466ccfad8"
/>

<img width="2346" height="1590" alt="CleanShot 2026-08-27 at 23 31
16@2x"
src="https://github.com/user-attachments/assets/4e25f819-0c3e-468e-bfc4-d3c029899992"
/>

![Uploading CleanShot 2026-08-27 at 23.30.38@2x.png…]()

**Preview links**
- https://pr-49466.expo-docs.pages.dev/versions/latest/config/app/
- https://pr-49466.expo-docs.pages.dev/versions/latest/sdk/expo/
-
https://pr-49466.expo-docs.pages.dev/versions/latest/sdk/notifications/


# 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

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

Part of the radius migration from #49389

# How

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

- Change the card shells of `GridBox`, `GridCell`, the Explore APIs
cells, the Talks cards, the Join the community card, and
`StateOfRNBanner` from `rounded-lg` to `rounded-3xl`.
- Match the four Quick Start gradient overlays to their parent cells,
since they mirror the card radius by design.

# 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="2546" height="1864" alt="CleanShot 2026-08-27 at 22 50
13@2x"
src="https://github.com/user-attachments/assets/c0fcfed2-eb5e-4efd-bf70-405c82da7e85"
/>


<img width="2568" height="1646" alt="CleanShot 2026-08-27 at 22 50
08@2x"
src="https://github.com/user-attachments/assets/88e641cc-baab-418d-b6fb-7074cea067fe"
/>


# 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)
…49463)

# Why

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

Part of the radius migration from #49389.

# How

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

- Change the outer containers of `FileTree`, `ProjectStructure`, and
`TemplateFeatures` from `rounded-md` to `rounded-3xl`, leaving their
inner rows and tabs unchanged.

# 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="2340" height="1102" alt="CleanShot 2026-08-27 at 22 42
33@2x"
src="https://github.com/user-attachments/assets/e8d17758-7c4d-4d52-a56f-651e4c01e7b6"
/>


<img width="2332" height="994" alt="CleanShot 2026-08-27 at 22 41 33@2x"
src="https://github.com/user-attachments/assets/fd5b8fe1-322e-4e05-899b-d4554923c5e7"
/>


# 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

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

Fix ENG-26255

# How

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

- Change the `ContentSpotlight` image figure wrapper to `rounded-3xl`
and add `overflow-hidden` so full-width screenshots clip into the curve;
the inline video container follows.
- Change the outer containers of `Diagram`, `FlowDiagram`,
`ConfigPluginHierarchy`, and the two controlled-components diagrams to
`rounded-3xl`, leaving their inner nodes unchanged.
- Round the QR code box in the set-up-your-environment flow
(`androidPhysicalExpoGo.mdx`) to `rounded-3xl`.
- Leave the fullscreen lightbox untouched (no shell to round) and the
`component` variant on its existing `rounded-md` override.

# 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="2328" height="1262" alt="CleanShot 2026-08-27 at 22 11
41@2x"
src="https://github.com/user-attachments/assets/3f042699-51ac-4264-baef-d5f547cae552"
/>

<img width="2294" height="1052" alt="CleanShot 2026-08-27 at 22 11
47@2x"
src="https://github.com/user-attachments/assets/c22fc33d-cc84-4a2b-b70c-6b00272555a3"
/>

<img width="2094" height="1778" alt="CleanShot 2026-08-27 at 22 19
51@2x"
src="https://github.com/user-attachments/assets/ae0474a7-0449-4b54-909d-6ddab65ce8de"
/>

<img width="688" height="554" alt="CleanShot 2026-08-27 at 22 30 42@2x"
src="https://github.com/user-attachments/assets/f733e12b-5366-49e0-856a-546ce01b164f"
/>


# 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

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

Fix ENG-26254

# How

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

- Change the card shells of `BoxLink`,`Box` (used on authentication
page) the footer Previous/Next cards, `VideoBoxLink`, `DownloadSlide`,
`UIComponentGrid`, `SelectCard`, `MethodSelectCard`,
`BuildEnvironmentSwitch`, and `ProgressTracker` from
`rounded-md`/`rounded-lg` to `rounded-3xl`.
- Set the `BoxLink` icon tile to `rounded-lg`, the concentric radius for
its 16px inset.

# 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="2314" height="798" alt="CleanShot 2026-08-27 at 21 55 18@2x"
src="https://github.com/user-attachments/assets/bc09f1d2-8412-43a8-b623-c0a9d6a7304b"
/>

<img width="2294" height="306" alt="CleanShot 2026-08-27 at 21 55 24@2x"
src="https://github.com/user-attachments/assets/7f522a40-67f9-46e2-8d21-4641a3213ba7"
/>

<img width="1890" height="590" alt="CleanShot 2026-08-27 at 21 55 28@2x"
src="https://github.com/user-attachments/assets/2d203dd6-ae31-4b66-9a4e-1cbdfbfdee12"
/>

<img width="2350" height="2114" alt="CleanShot 2026-08-27 at 21 55
41@2x"
src="https://github.com/user-attachments/assets/5c3367b1-401b-4c9e-8eb1-d59512f06edd"
/>

<img width="2438" height="902" alt="CleanShot 2026-08-27 at 21 56 10@2x"
src="https://github.com/user-attachments/assets/1f55e1ca-05c7-4640-98c6-3d7603356ba4"
/>

<img width="2358" height="1510" alt="CleanShot 2026-08-27 at 22 00
23@2x"
src="https://github.com/user-attachments/assets/13c685c3-85b5-48cd-9bc9-39918f5d223f"
/>


# 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

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

Fix ENG-26253

# How

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

- Change the `Form/Input` default radius from `rounded-md` to
`rounded-3xl` (24px, the EAS dashboard input value) and `Form/Textarea`
from `rounded-sm` to `rounded-2xl` (20px, the expo.dev contact form
value).
- Remove the now-redundant radius overrides in `FeedbackDialog`.
- The footer newsletter input picks up the pill from the default; the
embedded Sign Up button needed no adjustment.

# 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="942" height="302" alt="CleanShot 2026-08-27 at 21 31 18@2x"
src="https://github.com/user-attachments/assets/2984bd01-1880-4496-a998-6efc2faff6a2"
/>
<img width="844" height="302" alt="CleanShot 2026-08-27 at 21 31 23@2x"
src="https://github.com/user-attachments/assets/f6af8493-85e4-4dd4-ba72-2c12a3889001"
/>

<img width="1350" height="1242" alt="CleanShot 2026-08-27 at 21 31
27@2x"
src="https://github.com/user-attachments/assets/63a2446c-e2ce-48b3-817f-ec3a8fd1e34f"
/>


<img width="1184" height="1164" alt="CleanShot 2026-08-27 at 21 31
35@2x"
src="https://github.com/user-attachments/assets/941b4ec7-267f-43f0-b8fb-7293906ce6c9"
/>


# 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

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

Sidebar hover shapes still use the 6px default; the EAS dashboard's
sidebar nav items measure 8px. Part of ENG-26237.

# How

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

- Change the hover shapes of `SidebarSingleEntry`, `SidebarCollapsible`
headers, the `SidebarHead` back link, and the mobile `PageLink` from
`rounded-md` to `rounded-lg`. Dots, version pills, and the collapse
chevron box stay unchanged.

# 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="558" height="338" alt="CleanShot 2026-08-27 at 23 42 08@2x"
src="https://github.com/user-attachments/assets/88b524c6-379f-4e64-9806-a63cb035c1bb"
/>

<img width="562" height="392" alt="CleanShot 2026-08-27 at 23 44 18@2x"
src="https://github.com/user-attachments/assets/28b13c4c-946e-42e6-9419-a44b7633f2a8"
/>



# 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

The `background` modifier only accepted a color:

```ts
export const background = (color: Color, shape?: Shape) => ...
```

SwiftUI's style overloads —
[`background(_:ignoresSafeAreaEdges:)`](https://developer.apple.com/documentation/swiftui/view/background(_:ignoressafeareaedges:))
and
[`background(_:in:fillStyle:)`](https://developer.apple.com/documentation/swiftui/view/background(_:in:fillstyle:))
— take any `ShapeStyle`, so gradients and hierarchical styles were out
of reach, and `ignoresSafeAreaEdges` had no equivalent at all.

Materials are the sharpest gap. #48905 taught `foregroundStyle` to
accept them, but SwiftUI uses a material as a blurred backdrop *behind*
content — that is what `background` is for. Until now the package could
only paint a material onto text.

## How

- `BackgroundModifier` decodes `ShapeStyleValue` (from #48905) instead
of `Color` and forwards the erased `AnyShapeStyle` to the same shape
switch as before. The no-shape branch now calls
`background(_:ignoresSafeAreaEdges:)`, defaulting to `.all` exactly like
SwiftUI.
- The TypeScript wrapper mirrors the two SwiftUI overloads instead of
growing a third positional parameter:

  ```ts
export function background(style: ShapeStyle, options?:
BackgroundOptions): ModifierConfig;
export function background(style: ShapeStyle, shape?: Shape):
ModifierConfig;
  ```

This keeps the API honest about a constraint SwiftUI enforces through
its own overloads: `ignoresSafeAreaEdges` belongs to the shapeless
overload only. `lineLimit` and `environment` already use overloads, and
the docs generator renders them as separate entries.
- A bare color is a valid `ShapeStyle` and the shape stays optional, so
every existing `background('#FF0000')` and `background('#FF0000',
shapes.capsule())` call keeps working unchanged — including one that
passes a `Shape | undefined`.
- `backgroundOverlay` is deprecated. It wraps
`background(_:alignment:)`, which SwiftUI marks deprecated in favor of
`background(alignment:content:)`, available since iOS 15. Both of its
jobs are now covered: the `Background` component (#48904) draws an
aligned view, this modifier draws a fill.

Two things I deliberately left out, happy to add either if you disagree:

- **`fillStyle`.** Its `eoFill` flag only changes rendering for
self-intersecting paths, and none of the six shapes in `ShapeType` can
produce one; `antialiased: false` only yields jagged edges. It would be
public API that cannot change the output in any supported case.
- **A combined edge set.** `ignoresSafeAreaEdges` takes a single value,
matching the existing `ignoreSafeArea` modifier, so `[.top, .bottom]` is
not expressible. Worth fixing across every edge-taking modifier at once
rather than here.

## Open question: an options object instead of overloads?

This PR is non-breaking, but there is a design fork I would rather
settle with you than decide alone.

The house style in this package is an options object — `frame({ … })`,
`padding({ … })`, `shadow({ … })` — and by that logic `background` would
ideally read `background(style, { shape, ignoresSafeAreaEdges })`, with
everything that is optional in SwiftUI living in one bag. That is a
breaking change: `background(color, shapes.capsule())` is called around
120 times in this repository alone, plus whatever is in the wild.

I did not go there, for three reasons:

1. **A single object re-admits a combination SwiftUI forbids.**
`ignoresSafeAreaEdges` exists only on the shapeless overload and
`fillStyle` only on the shape one. I checked how TypeScript actually
behaves: two overloads reject `{ shape, ignoresSafeAreaEdges }`, while
one parameter typed `Shape | BackgroundOptions` accepts it — against a
union target a property counts as known when it exists in any member, so
excess property checking does not catch the mix. Rebuilding the
constraint inside one bag needs mutually exclusive `?: never` fields,
which is hand-written machinery for something the overloads express
structurally.
2. **A positional shape is closer to SwiftUI, not further.** There `in
shape:` belongs to a separate overload, and `clipShape` and
`contentShape` in this package already take their shape positionally.
3. It would break one of the most used modifiers in the package.

If you would rather have the options object, the migration is additive
and need not happen now: add the object overload, mark the positional
shape form `@deprecated`, and drop it in a major. I am happy to do it in
this PR instead if you prefer.

## Test Plan

Reworked the "Material foreground style" section of the modifiers screen
in native-component-list into a "Shape styles" one, so the shared
vocabulary is demonstrated once instead of twice: the backdrop is
painted with `foregroundStyle`, and on top of it every material is shown
as a `background` in the same capsule, so the thicknesses can be
compared, plus a linear gradient in a rounded rectangle. Verified in
bare-expo on the iOS simulator.

The materials are shown in both color schemes, since adapting to the
scheme is what separates a material from a translucent color:

| Light | Dark |
| --- | --- |
| <img width="375" alt="image"
src="https://github.com/user-attachments/assets/d8c1e934-ebf3-422b-bce0-4007b2c7f0c6"
/> | <img width="375" alt="image"
src="https://github.com/user-attachments/assets/437b7bf8-3b7d-4581-b17d-5b86296f8522"
/> |

Added `src/__tests__/background-test.ts` covering the payload the native
side reads: bare colors, React Native color values, materials,
gradients, the shape fields, and `ignoresSafeAreaEdges`.

`et check-packages @expo/ui` passes and the app builds (`BUILD
SUCCEEDED`).

## Checklist

- [x] I added a `changelog.md` entry and rebuilt the package sources
- [ ] This diff will work correctly for `npx expo prebuild` & EAS Build
- [x] Conforms with the Documentation Writing Style Guide

---------

Co-authored-by: Aman Mittal <amandeepmittal@live.com>
…ks (#49631)

# Why

Profiling the no-op `@JS` host call showed most of its native time going
to Swift reference counting of the runtime wrapper rather than to JSI.

# How

`JavaScriptValuesBuffer` now holds the runtime `unowned(unsafe)`, and
the host function and host object contexts hold it as `Unmanaged` and
read it through a shared guaranteed-reference helper, so the success
path of a host call or a host object property access emits no retain or
release at all. The lifetime argument lives on that helper. Since a
guaranteed-reference scope cannot return a non-copyable value, the
callbacks now hand their `jsi::Value` result back through an
out-parameter instead of returning it.

# Test Plan

`pnpm test:integration` passes. `pnpm benchmark` (Release, Mac
Catalyst), using the unowned-this case and the coverage-free benchmark
build from the base PR:

- no-op unowned-this host call: from 64.2 to 34.0 ns
- no-op owning-this host call: from 89 to 59 ns
# Why

For now, I did most of manual testing of router using
`native-navigation` app from `router-e2e`. Since it is not related to
cli e2e tests, we should extract this app from the router-e2e.

# How

1. Create new `router-tester` app
2. Move `__e2e__/native-navigation` to `router-tester/app/src`

I will move remaining `__e2e__` apps in follow-up PRs

# Test Plan

1. Manual testing

# 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

Add eas config for router-tester app, with different build profiles

# 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)

---

<sub>Stack created with <a
href="https://github.com/github/gh-stack">GitHub Stacks CLI</a> • <a
href="https://gh.io/stacks-feedback">Give Feedback 💬</a></sub>
<img width="360" height="286" alt="Kooha-2026-09-01-12-32-00"
src="https://github.com/user-attachments/assets/60b2bc26-0cb4-4fb7-b99d-f86c2d0d8146"
/>

# Why

`@expo/ui` exposes Material 3's `Slider` in Jetpack Compose, but only
horizontally. Today the only workaround is rotating the horizontal
slider with a modifier, which breaks hit-testing and accessibility.
Compose already ships `VerticalSlider` it just had no bridge.

# How

Adds a `VerticalSlider` component. It takes the same props as `Slider`,
plus `reverseDirection`.

# Test Plan

Unit tests in
`packages/expo-ui/src/jetpack-compose/Slider/__tests__/index.test.android.tsx`.

Manually on Android in `SliderScreen.android.tsx`, which now renders a
default and a reversed vertical slider.

`et check-packages @expo/ui` passes.


https://developer.android.com/reference/kotlin/androidx/compose/material3/VerticalSlider.composable

- [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)
@pull pull Bot locked and limited conversation to collaborators Sep 2, 2026
@pull pull Bot added the ⤵️ pull label Sep 2, 2026
@pull
pull Bot merged commit 67efaf2 into code:main Sep 2, 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