Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions .github/workflows/test-suite-brownfield-isolated.yml
Original file line number Diff line number Diff line change
Expand Up @@ -206,15 +206,15 @@ jobs:
- name: 🍏 Build iOS artifacts (apps/brownfield-tester/expo-app)
run: |
npx expo prebuild --clean -p ios
npx expo-brownfield build:ios --${{ matrix.build-type }} --verbose -a ../../../artifacts
npx expo-brownfield build:ios --${{ matrix.build-type }} --verbose -a ../../../artifacts -p BrownfieldPackage
working-directory: apps/brownfield-tester/expo-app
- name: 💾 Save ccache
if: always()
uses: actions/cache/save@v4
with:
path: ${{ runner.temp }}/.ccache
key: ${{ steps.ccache-restore.outputs.cache-primary-key }}
- name: 🔨 Add XCFrameworks to SwiftUI project
- name: 🔨 Add brownfield Swift Package to the app
run: ruby packages/expo-brownfield/e2e/scripts/add_xcframeworks.rb
- name: 🍺 Install Maestro
run: |
Expand Down
2 changes: 1 addition & 1 deletion apps/bare-expo/e2e/expo-video/playback-test.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ jsEngine: graaljs
- assertVisible: 'source = Big Buck Bunny'
- assertVisible: 'isPlaying = false'
- assertVisible: 'isAtStart = true'
- assertVisible: 'duration = 596'
- assertVisible: 'duration = 634'
- assertVisible: 'currentTime = 0'
- assertVisible: 'mimeType = video/avc'
- assertVisible: 'isSupported = true'
Expand Down
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
9 changes: 8 additions & 1 deletion apps/brownfield-tester/expo-app/app.json
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,14 @@
}
}
],
"expo-brownfield"
[
"expo-brownfield",
{
"ios": {
"usePrebuiltReactNative": true
}
}
]
],
"experiments": {
"typedRoutes": true,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,8 +17,7 @@ const artworkUrl1 =
'https://images.unsplash.com/photo-1549138144-42ff3cdd2bf8?q=80&w=3504&auto=format&fit=crop&ixlib=rb-4.1.0&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D';
const artworkUrl2 =
'https://images.unsplash.com/photo-1549228167-511375f69159?q=80&w=3676&auto=format&fit=crop&ixlib=rb-4.1.0&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D';
const remoteSource =
'https://p.scdn.co/mp3-preview/f7a8ab9c5768009b65a30e9162555e8f21046f46?cid=162b7dc01f3a4a2ca32ed3cec83d1e02';
const remoteSource = 'https://expo-test-media.com/audio/por_una_cabeza.mp3';
const localSource = require('../../../assets/sounds/polonez.mp3');

enum LockScreenButton {
Expand Down
3 changes: 1 addition & 2 deletions apps/native-component-list/src/screens/Audio/AudioPlayer.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -13,8 +13,7 @@ type AudioPlayerProps = {
};

const localSource = require('../../../assets/sounds/polonez.mp3');
const remoteSource =
'https://p.scdn.co/mp3-preview/f7a8ab9c5768009b65a30e9162555e8f21046f46?cid=162b7dc01f3a4a2ca32ed3cec83d1e02';
const remoteSource = 'https://expo-test-media.com/audio/por_una_cabeza.mp3';

export default function AudioPlayer({
source,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ export default function AudioScreen(props: any) {
<HeadingText>HTTP player</HeadingText>
<AudioPlayer
source={{
uri: 'https://p.scdn.co/mp3-preview/f7a8ab9c5768009b65a30e9162555e8f21046f46?cid=162b7dc01f3a4a2ca32ed3cec83d1e02',
uri: 'https://expo-test-media.com/audio/por_una_cabeza.mp3',
headers: {
'Test-Header': 'Some-header',
Auth: 'Bearer some-token',
Expand All @@ -38,7 +38,7 @@ export default function AudioScreen(props: any) {
<HeadingText>Remote asset with downloadFirst</HeadingText>
<AudioPlayer
source={{
uri: 'https://p.scdn.co/mp3-preview/f7a8ab9c5768009b65a30e9162555e8f21046f46?cid=162b7dc01f3a4a2ca32ed3cec83d1e02',
uri: 'https://expo-test-media.com/audio/por_una_cabeza.mp3',
}}
downloadFirst
style={styles.player}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ export default function CreateAudioPlayerScreen(props: any) {
);
}
const player = createAudioPlayer({
uri: 'https://p.scdn.co/mp3-preview/f7a8ab9c5768009b65a30e9162555e8f21046f46?cid=162b7dc01f3a4a2ca32ed3cec83d1e02',
uri: 'https://expo-test-media.com/audio/por_una_cabeza.mp3',
});

function AudioPlayer({ style }: { style?: StyleProp<ViewStyle> }) {
Expand Down
43 changes: 28 additions & 15 deletions apps/native-component-list/src/screens/Video/videoSources.ts
Original file line number Diff line number Diff line change
Expand Up @@ -17,38 +17,47 @@ export const seekOptimizedSource: VideoSource = {
metadata: {
title: 'Tola running (seek optimized)',
artist:
"This video has been optimized for seeking by exoirting all of it's frames as keyframes",
"This video has been optimized for seeking by exporting all of it's frames as keyframes",
},
};

// Fallback: https://commondatastorage.googleapis.com/gtv-videos-bucket/sample/BigBuckBunny.mp4
const bigBuckBunnySource: VideoSource = {
// backup at https://github.com/vonovak/expo-video-tests/releases/tag/v0
uri: 'https://archive.org/download/BigBuckBunny_124/Content/big_buck_bunny_720p_surround.mp4',
uri: 'https://expo-test-media.com/big_buck_bunny/bbb_720p.mp4',
metadata: {
title: 'Big Buck Bunny',
artist: 'The Open Movie Project',
artwork:
'https://upload.wikimedia.org/wikipedia/commons/thumb/c/c5/Big_buck_bunny_poster_big.jpg/1200px-Big_buck_bunny_poster_big.jpg',
artwork: 'https://expo-test-media.com/big_buck_bunny/artwork.jpg',
},
};

// Fallback: https://commondatastorage.googleapis.com/gtv-videos-bucket/sample/ElephantsDream.mp4
const elephantsDreamSource: VideoSource = {
// backup at https://github.com/vonovak/expo-video-tests/releases/tag/v0
uri: 'https://archive.org/download/ElephantsDream/ed_1024.mp4',
uri: 'https://expo-test-media.com/elephants_dream/ed_720p.mp4',
metadata: {
title: 'Elephants Dream',
artist: 'Blender Foundation',
artwork: 'https://upload.wikimedia.org/wikipedia/commons/0/0c/ElephantsDreamPoster.jpg',
artwork: 'https://expo-test-media.com/elephants_dream/artwork.jpg',
},
};

// Fallback https://commondatastorage.googleapis.com/gtv-videos-bucket/CastVideos/hls/TearsOfSteel.m3u8
export const hlsSource: VideoSource = {
uri: 'https://devstreaming-cdn.apple.com/videos/streaming/examples/adv_dv_atmos/main.m3u8',
uri: 'https://expo-test-media.com/tos_hls/master.m3u8',
metadata: {
title: 'Becoming You Trailer',
artist: 'Apple',
artwork:
'https://www.apple.com/tv-pr/shows-and-films/b/becoming-you/images/show-home-graphic-header/4x1/Apple_TV_Becoming_You_key_art_graphic_header_4_1_show_home.jpg.og.jpg?1659052681724',
title: 'Tears Of Steel',
artist: 'Blender Foundation',
artwork: 'https://expo-test-media.com/tos_hls/artwork.jpg',
},
};

// Fallback: https://commondatastorage.googleapis.com/gtv-videos-bucket/CastVideos/dash/TearsOfSteel.mpd
export const dashSource: VideoSource = {
uri: 'https://expo-test-media.com/tos_dash/manifest.mpd',
metadata: {
title: 'Tears Of Steel',
artist: 'Blender Foundation',
artwork: 'https://expo-test-media.com/tos_dash/artwork.jpg',
},
};

Expand Down Expand Up @@ -103,14 +112,18 @@ const forBiggerBlazesSource: VideoSource = {

// source: https://reference.dashif.org/dash.js/latest/samples/drm/widevine.html
const androidDrmSource: VideoSource = {
uri: 'https://bitmovin-a.akamaihd.net/content/sintel/hls/playlist.m3u8',
uri: 'https://expo-test-media.com/tos_widevine/manifest.mpd',
drm: {
licenseServer: 'https://cwip-shaka-proxy.appspot.com/no_auth',
type: 'widevine',
},
};

const videoLabels: string[] = [
'Big Buck Bunny',
'Elephants Dream',
'For Bigger Blazes',
'Becoming You (HLS)',
'Tears Of Steel (HLS)',
'Cute Doggo (local video)',
'Null Source',
'Audio Track',
Expand Down
2 changes: 1 addition & 1 deletion docs/pages/additional-resources/index.mdx
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
---
modificationDate: February 2, 2026
modificationDate: March 2, 2026
title: Additional resources
description: A reference of resources that are useful to learn about Expo tooling and services.
---
Expand Down
2 changes: 1 addition & 1 deletion docs/pages/deploy/build-project.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -123,7 +123,7 @@ The workflow above will create Android and iOS builds on every commit to your pr

<Terminal cmd={['$ eas workflow:run create-builds.yml']} />

Learn more about common patterns with the [workflows examples guide](/eas/workflows/examples).
Learn more about common patterns with the [workflows examples guide](/eas/workflows/examples/introduction).

## Release builds locally

Expand Down
2 changes: 1 addition & 1 deletion docs/pages/deploy/send-over-the-air-updates.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -50,7 +50,7 @@ The workflow above will send an over-the-air update for the `production` update

<Terminal cmd={['$ eas workflow:run send-updates.yml']} />

Learn more about common patterns with the [workflows examples guide](/eas/workflows/examples).
Learn more about common patterns with the [workflows examples guide](/eas/workflows/examples/introduction).

## Learn more

Expand Down
2 changes: 1 addition & 1 deletion docs/pages/deploy/submit-to-app-stores.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -159,7 +159,7 @@ The workflow above will create Android and iOS builds on every commit to your pr

<Terminal cmd={['$ eas workflow:run build-and-submit.yml']} />

Learn more about common patterns with the [workflows examples guide](/eas/workflows/examples).
Learn more about common patterns with the [workflows examples guide](/eas/workflows/examples/introduction).

## Manual submission to app stores

Expand Down
2 changes: 1 addition & 1 deletion docs/pages/deploy/web.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -61,7 +61,7 @@ The workflow above will create a web deployment on every commit to your project'

<Terminal cmd={['$ eas workflow:run deploy-web.yml']} />

Learn more about common patterns with the [workflows examples guide](/eas/workflows/examples).
Learn more about common patterns with the [workflows examples guide](/eas/workflows/examples/introduction).

## Learn more

Expand Down
2 changes: 1 addition & 1 deletion docs/pages/eas/workflows/automating-eas-cli.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -119,7 +119,7 @@ You can provide parameters to update specific branches or channels, and configur
Workflows are a powerful way to automate your development and release processes. Learn how to create development builds, publish preview updates, and create production builds with the workflows examples guide:

<BoxLink
href="/eas/workflows/examples"
href="/eas/workflows/examples/introduction"
title="Workflow examples"
description="Learn how to use workflows to create development builds, publish preview updates, and create production builds."
Icon={Dataflow03Icon}
Expand Down
2 changes: 1 addition & 1 deletion docs/pages/eas/workflows/syntax.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ import { Terminal } from '~/ui/components/Snippet';

A workflow is a configurable automated process made up of one or more jobs. You must create a YAML file to define your workflow configuration.

To get started with workflows, see [Get Started with EAS Workflows](/eas/workflows/get-started) or see [Examples](/eas/workflows/examples) for complete workflow configurations.
To get started with workflows, see [Get Started with EAS Workflows](/eas/workflows/get-started) or see [Examples](/eas/workflows/examples/introduction) for complete workflow configurations.

## Workflow files

Expand Down
2 changes: 1 addition & 1 deletion docs/pages/guides/expo-ui-swift-ui/extending.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ This guide explains how to create custom SwiftUI components and modifiers that i

Before you begin, make sure you have:

- `@expo/ui` installed in your project. See [Building SwiftUI apps with Expo UI](/expo-ui-swift-ui/) for more information.
- `@expo/ui` installed in your project. See [Building SwiftUI apps with Expo UI](/guides/expo-ui-swift-ui/) for more information.
- A [development build](/develop/development-builds/introduction/) of your app (Expo UI is not available in Expo Go)
- Basic familiarity with [Expo Modules API](/modules/overview/) and [SwiftUI](https://developer.apple.com/swiftui/)

Expand Down
2 changes: 1 addition & 1 deletion docs/pages/review/share-previews-with-your-team.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -64,7 +64,7 @@ The workflow above will publish an update on every commit to every branch. You c

<Terminal cmd={['$ eas workflow:run publish-preview-update.yml']} />

Learn more about common patterns with the [workflows examples guide](/eas/workflows/examples).
Learn more about common patterns with the [workflows examples guide](/eas/workflows/examples/introduction).

## Learn more

Expand Down
76 changes: 8 additions & 68 deletions docs/pages/versions/v55.0.0/sdk/navigation-bar.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -16,8 +16,6 @@ import {

`expo-navigation-bar` enables you to modify and observe the native navigation bar on Android devices. Due to some Android platform restrictions, parts of this API overlap with the `expo-status-bar` API.

Properties are named after style properties; visibility, position, backgroundColor, borderColor, and so on.

The APIs in this package have no impact when "Gesture Navigation" is enabled on the Android device. There is currently no native Android API to detect if "Gesture Navigation" is enabled or not.

## Installation
Expand All @@ -37,12 +35,9 @@ You can configure `expo-navigation-bar` using its built-in [config plugin](/conf
[
"expo-navigation-bar",
{
"backgroundColor": "#0f172a",
"enforceContrast": true,
"barStyle": "light",
"borderColor": "#1f2937",
"visibility": "visible",
"behavior": "inset-swipe",
"position": "relative"
"visibility": "visible"
}
]
]
Expand All @@ -55,92 +50,37 @@ You can configure `expo-navigation-bar` using its built-in [config plugin](/conf
<ConfigPluginProperties
properties={[
{
name: 'backgroundColor',
name: 'enforceContrast',
description:
'Sets the navigation bar background color. Accepts color string supported by React Native. For example, `"#0f172a"`.',
default: 'undefined',
'Determines whether the operating system should keep the navigation bar translucent to provide contrast between the navigation buttons and app content.',
default: 'true',
},
{
name: 'barStyle',
description:
'Controls whether Android renders light or dark navigation bar buttons. Accepts `light` and `dark` as values.',
default: 'undefined',
},
{
name: 'borderColor',
description:
'Sets the divider color above the navigation bar. Automatically converts the color string to a 32-bit integer.',
default: 'undefined',
},
{
name: 'visibility',
description:
'Determines whether the navigation bar starts visible or hidden. Accepts `visible` to show the bar immediately and `hidden` to hide it until the user reveals it with a system gesture.',
default: 'undefined',
},
{
name: 'behavior',
description:
'Controls how hidden system bars behave when revealed. Accepts `overlay-swipe`, `inset-swipe`, or `inset-touch` as values.',
default: 'undefined',
},
{
name: 'position',
description:
'Sets whether your layout is inset for the navigation bar. Accepts `relative` to keep the navigation bar outside the content and `absolute` to draw the content edge-to-edge under the bar.',
default: 'undefined',
},
{
name: 'legacyVisible',
description:
'Legacy equivalent of `androidNavigationBar.visible`. Accepts `leanback`, `immersive`, or `sticky-immersive` as values.',
default: 'undefined',
},
]}

]}
/>

<ConfigReactNative>

If you're not using Continuous Native Generation ([CNG](/workflow/continuous-native-generation/)) or you're using a native **android** project manually, then you need to add the following configuration to your native project:

- To apply `backgroundColor` to the navigation bar, add `navigationBarColor` to **android/app/src/main/res/values/colors.xml**:
- To apply `visibility` to the navigation bar, add `expo_navigation_bar_visibility` to **android/app/src/main/res/values/strings.xml**:

```xml
<resources>
<!-- ... -->
<color name="navigationBarColor">#0f172a</color>
</resources>
```

Then, apply `android:navigationBarColor` to **android/app/src/main/res/values/styles.xml**:

```xml
<style name="AppTheme" parent="Theme.AppCompat.DayNight.NoActionBar">
<!-- ... -->
<item name="android:navigationBarColor">@color/navigationBarColor</item>
</style>
```

- To apply `borderColor`, `visibility`, `position`, and `behavior` to the navigation bar, add `expo_navigation_bar_border_color`, `expo_navigation_bar_visibility`, `expo_navigation_bar_position`, and `expo_navigation_bar_behavior` to **android/app/src/main/res/values/strings.xml**:

```xml
<resources>
<!-- ... -->
<!-- For `expo_navigation_bar_border_color`, convert the color string to a 32-bit integer. -->
<string name="expo_navigation_bar_border_color"
translatable="false">-14735049</string>
<string name="expo_navigation_bar_visibility" translatable="false">visible</string>
<string name="expo_navigation_bar_position" translatable="false">relative</string>
<string name="expo_navigation_bar_behavior" translatable="false">inset-swipe</string>
</resources>
```

- To apply `legacyVisible` to the navigation bar, add `expo_navigation_bar_legacy_visible` to **android/app/src/main/res/values/strings.xml**:

```xml
<resources>
<!-- ... -->
<string name="expo_navigation_bar_legacy_visible" translatable="false">immersive</string>
</resources>
```

Expand Down
6 changes: 6 additions & 0 deletions docs/public/static/talks.ts
Original file line number Diff line number Diff line change
Expand Up @@ -437,6 +437,12 @@ export const LIVE_STREAMS = [
] as Talk[];

export const YOUTUBE_VIDEOS = [
{
title: "What's new in Expo SDK 55",
event: 'Expo Tutorials',
videoId: 'q72aeXsbF9c',
uploadDate: '2026-02-26',
},
{
title: 'AI mobile app development with Replit and Expo',
event: 'Expo Tutorials',
Expand Down
1 change: 1 addition & 0 deletions packages/expo-brownfield/CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@

- [android] add basic implementation of shared state for android ([#43097](https://github.com/expo/expo/pull/43097) by [@pmleczek](https://github.com/pmleczek))
- [cli] allow shipping ios artifacts as swift package ([#43369](https://github.com/expo/expo/pull/43369) by [@pmleczek](https://github.com/pmleczek))
- [ios] enable optional usage of prebuilt RN frameworks ([#43356](https://github.com/expo/expo/pull/43356) by [@pmleczek](https://github.com/pmleczek))

### 🐛 Bug fixes

Expand Down
Loading
Loading