Skip to content

Conversation

@pull
Copy link

@pull pull bot commented Jan 28, 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 : )

brentvatne and others added 7 commits January 27, 2026 21:47
# Why

When dynamically switching `Stack.Toolbar` placement (e.g., from
`bottom` to `left`) or unmounting the toolbar component, header items
from the previous placement would persist in the UI and so would bottom
toolbar items.

**Before**


https://github.com/user-attachments/assets/18b96b1f-167a-46f6-a9d1-1cb1907700b7

**After**



https://github.com/user-attachments/assets/6f8471a8-664a-4c7e-a3a5-ee299d8acb7d

# How

**Swift**

- Added a `cachedController` weak reference to store the `RNSScreen`
view controller
- Updated `didMoveToWindow()` to use the cached controller to remove
toolbar items when the toolbar is unmounted

**TS**

- Added a `useEffect` cleanup function that clears the header items
(`unstable_headerLeftItems` or `unstable_headerRightItems`) when the
toolbar unmounts
- Added `key=placement` to the `Stack.Toolbar` component to force
remounting when the placement changes, ensuring the cleanup effect runs

# Test Plan

1. Unit testing
2. Manual testing

Here is test app I used for testing and recording the video -
8c060f7

# Checklist

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

- [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)
- [ ] 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)
…ns (#42544)

# Why

The `Stack.Header` component requires users to manually set
`headerTransparent: true` in options when using `blurEffect` or
transparent backgrounds, which is non-intuitive.

**Before**


https://github.com/user-attachments/assets/c067a0db-f9b9-45ba-8fcc-80e87ad40d77

**After**


https://github.com/user-attachments/assets/b5734b6d-51db-45b6-8234-dbc7f6836fce

# How

Enhanced `appendStackHeaderPropsToOptions` to automatically append
`headerTransparent` from related props.

Additionally added `style.color` mapping to `headerTintColor`

# Test Plan

1. Manual testing
2. Unit tests

# Checklist

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

- [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)
- [ ] 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)
…olbar.Menu (#42531)

# Why

Stack.Toolbar.Menu title prop was misleading as it didn't configure the
button title. This PR adds a fallback which:

- When only `title` is specified: uses title for both button and menu
title
- When only `Stack.Toolbar.Label` is used as child: uses it as a label.
Menu title is undefined
- When both `Label` child and `title` prop are used - `Label` sets the
button text, `title` sets the menu popup title

Additionally this PR fixes minor native update issues, when the prop
becomes `null`

# How

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

# Test Plan

1. CI
2. Manual testing

For this code 
```tsx
{/* title */}
<Stack.Toolbar.Menu title="TP">
  <Stack.Toolbar.MenuAction icon="star" onPress={() => Alert.alert("Star")}>
    Action in TitleOnly
  </Stack.Toolbar.MenuAction>
</Stack.Toolbar.Menu>;

{/* Toolbar.Label */}
<Stack.Toolbar.Menu>
  <Stack.Toolbar.Label>T.L</Stack.Toolbar.Label>
  <Stack.Toolbar.MenuAction icon="flag" onPress={() => Alert.alert("Flag")}>
    Action in LabelOnly
  </Stack.Toolbar.MenuAction>
</Stack.Toolbar.Menu>;

{/* Both title and Toolbar.Label */}
<Stack.Toolbar.Menu title="TP">
  <Stack.Toolbar.Label>T.L</Stack.Toolbar.Label>
  <Stack.Toolbar.MenuAction icon="heart" onPress={() => Alert.alert("Heart")}>
    Action in Both
  </Stack.Toolbar.MenuAction>
</Stack.Toolbar.Menu>;
```

Renders:

<img width="230" height="64" alt="Screenshot 2026-01-26 at 15 36 12"
src="https://github.com/user-attachments/assets/18098574-b605-43f0-8f58-cac3f68383f4"
/>

And menus:

- title only (both button and menu have same value): <img width="244"
height="95" alt="Screenshot 2026-01-26 at 15 36 18"
src="https://github.com/user-attachments/assets/b31b53b4-44c4-4a4f-83ca-8096a87bab4e"
/>
- Toolbar.Label only (no menu title): <img width="256" height="72"
alt="Screenshot 2026-01-26 at 15 36 22"
src="https://github.com/user-attachments/assets/194f272a-0fcd-45d7-9e68-cc003a3f702c"
/>
- Both (different button and menu title): <img width="237" height="95"
alt="Screenshot 2026-01-26 at 15 36 28"
src="https://github.com/user-attachments/assets/0e372148-9ac6-43f7-b550-e11abd6e19b3"
/>

# Checklist

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

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

---------

Co-authored-by: Hassan Khan <hassan@expo.dev>
…ok is used (#42533)

# Why

Fixes #42255

When using the native zoom transition in expo-router on iOS, the
`interactiveDismissShouldBegin` callback was always set, even when
`usePreventZoomTransitionDismissal` hook wasn't used. This caused
issues, especially when integrating with `ScrollView`

**Before**



https://github.com/user-attachments/assets/0cd5ba48-4234-4afa-80c1-8b603fdcf9ed



**After**


https://github.com/user-attachments/assets/b7c06978-c5b2-4bc8-a081-69c5ba80d3f0

# How

Modified `LinkZoomTransitionEnabler.swift` to only set the
`interactiveDismissShouldBegin` callback when `dismissalBoundsRect` is
explicitly provided via the hook. When the hook isn't used (or when
`dismissalBoundsRect` is nil), iOS now uses its default dismissal
behavior.

# Test Plan

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)
@pull pull bot locked and limited conversation to collaborators Jan 28, 2026
@pull pull bot added the ⤵️ pull label Jan 28, 2026
@pull pull bot merged commit e1a5403 into code:main Jan 28, 2026
18 of 22 checks passed
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.

2 participants