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
1 change: 0 additions & 1 deletion apps/brownfield-tester/ios/Podfile
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,6 @@ target 'BrownfieldTester' do
projectRoot: project_root,
exclude: [
'expo-splash-screen',
'expo-dev-menu'
],
})

Expand Down
34 changes: 33 additions & 1 deletion apps/brownfield-tester/ios/Podfile.lock
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,35 @@ PODS:
- ReactCommon/turbomodule/core
- SocketRocket
- Yoga
- expo-dev-menu (55.0.5):
- boost
- DoubleConversion
- expo-dev-menu/Main (= 55.0.5)
- fast_float
- fmt
- glog
- hermes-engine
- RCT-Folly
- RCT-Folly/Fabric
- RCTRequired
- RCTTypeSafety
- React-Core
- React-debug
- React-Fabric
- React-featureflags
- React-graphics
- React-ImageManager
- React-jsi
- React-NativeModulesApple
- React-RCTFabric
- React-renderercss
- React-rendererdebug
- React-utils
- ReactCodegen
- ReactCommon/turbomodule/bridging
- ReactCommon/turbomodule/core
- SocketRocket
- Yoga
- expo-dev-menu-interface (55.0.1)
- ExpoAsset (55.0.5):
- ExpoModulesCore
Expand Down Expand Up @@ -2951,6 +2980,7 @@ DEPENDENCIES:
- EXJSONUtils (from `../../../packages/expo-json-utils/ios`)
- EXManifests (from `../../../packages/expo-manifests/ios`)
- Expo (from `../../../packages/expo`)
- expo-dev-menu (from `../../../packages/expo-dev-menu`)
- expo-dev-menu-interface (from `../../../packages/expo-dev-menu-interface/ios`)
- ExpoAsset (from `../../../packages/expo-asset/ios`)
- ExpoBrownfield (from `../../../packages/expo-brownfield/ios`)
Expand Down Expand Up @@ -3076,6 +3106,8 @@ EXTERNAL SOURCES:
:path: "../../../packages/expo-manifests/ios"
Expo:
:path: "../../../packages/expo"
expo-dev-menu:
:path: "../../../packages/expo-dev-menu"
expo-dev-menu-interface:
:path: "../../../packages/expo-dev-menu-interface/ios"
ExpoAsset:
Expand Down Expand Up @@ -3388,6 +3420,6 @@ SPEC CHECKSUMS:
SocketRocket: d4aabe649be1e368d1318fdf28a022d714d65748
Yoga: 3d56e80930898685da43cbf53b5843932df8e765

PODFILE CHECKSUM: 138a890cb547592c982ba14a2a7126f821424938
PODFILE CHECKSUM: 1ca978f73a30f65633c68b87b4dcd2037d2b9a00

COCOAPODS: 1.16.2
63 changes: 63 additions & 0 deletions apps/native-component-list/src/screens/UI/ScrollViewScreen.ios.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,63 @@
import { Host, ScrollView, VStack, Text, RoundedRectangle } from '@expo/ui/swift-ui';
import { frame, foregroundStyle, padding, font } from '@expo/ui/swift-ui/modifiers';

export default function ScrollViewScreen() {
return (
<Host style={{ flex: 1 }}>
<ScrollView>
<VStack spacing={12}>
{Array.from({ length: 20 }, (_, i) => (
<RoundedRectangle
key={i}
cornerRadius={12}
modifiers={[
frame({ height: 60, maxWidth: 10000 }),
foregroundStyle(`hsl(${i * 18}, 70%, 50%)`),
padding({ horizontal: 16 }),
]}
/>
))}
</VStack>
</ScrollView>
</Host>
);
}

export function ScrollViewHorizontalScreen() {
return (
<Host style={{ flex: 1 }}>
<ScrollView axes="horizontal">
{Array.from({ length: 20 }, (_, i) => (
<RoundedRectangle
key={i}
cornerRadius={12}
modifiers={[
frame({ width: 100, height: 100 }),
foregroundStyle(`hsl(${i * 18}, 70%, 50%)`),
]}
/>
))}
</ScrollView>
</Host>
);
}

export function ScrollViewHideIndicatorsScreen() {
return (
<Host style={{ flex: 1 }}>
<ScrollView showsIndicators={false}>
<VStack spacing={8}>
{Array.from({ length: 30 }, (_, i) => (
<Text key={i} modifiers={[font({ size: 17 }), padding({ horizontal: 16 })]}>
{`Item ${i + 1}`}
</Text>
))}
</VStack>
</ScrollView>
</Host>
);
}

ScrollViewScreen.navigationOptions = {
title: 'ScrollView',
};
8 changes: 8 additions & 0 deletions apps/native-component-list/src/screens/UI/UIScreen.ios.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -194,6 +194,14 @@ export const UIScreens = [
return optionalRequire(() => require('./MatchedGeometryEffectScreen'));
},
},
{
name: 'ScrollView component',
route: 'ui/scrollview',
options: {},
getComponent() {
return optionalRequire(() => require('./ScrollViewScreen'));
},
},
{
name: 'Shapes',
route: 'ui/shapes',
Expand Down
2 changes: 1 addition & 1 deletion docs/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,7 @@
"@expo/styleguide": "^9.3.1",
"@expo/styleguide-base": "^2.0.5",
"@expo/styleguide-icons": "^2.3.4",
"@expo/styleguide-search-ui": "^3.3.1",
"@expo/styleguide-search-ui": "^3.3.3",
"@kapaai/react-sdk": "^0.9.0",
"@mdx-js/loader": "^3.1.1",
"@mdx-js/mdx": "^3.1.1",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,7 @@ The Expo Dev Client library includes the launcher UI (shown in the screenshots b

With Expo Go, you only needed to build the JavaScript bundle, but with development builds you also need to compile the native app. With Expo, there are two parts to building your native app:

1. Generate the native **android** and/or **ios** directories ([read more](/develop/development-builds/expo-go-to-dev-build/#cng-and-prebuild) on when and how you'll need to do this)
1. Generate the native **android** and/or **ios** directories ([read more](/develop/development-builds/expo-go-to-dev-build/#prebuild) on when and how you'll need to do this)
2. Use native build tools to compile the native app(s)

Once you've built your native app, you won't need to build it again unless you add or update a library with native code, or change any native code or configuration, such as the app name.
Expand Down
2 changes: 1 addition & 1 deletion docs/pages/develop/tools.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ When you create a new project with Expo, learning about the following essential

## Expo CLI

Expo CLI is a development tool and is installed automatically with `expo` package when you create a new project. You can use it by leveraging `npx` (a Node.js package runner).
Expo CLI is a development tool and is installed automatically with the `expo` package when you create a new project. You can use it by leveraging `npx` (a Node.js package runner).

It is designed to help you move faster during the app development phase. For example, your first interaction with Expo CLI is starting the development server by running the command: `npx expo start`.

Expand Down
2 changes: 2 additions & 0 deletions docs/pages/guides/icons.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -69,6 +69,8 @@ export default function CustomIconExample() {

The `createIconSetFromIcoMoon` method is used to create a custom font based on an [IcoMoon](https://icomoon.io/) config file. You have to save the **selection.json** and **.ttf** in your project, preferably in the **assets** directory, and then load the font using either `useFonts` hook or `Font.loadAsync` method from `expo-font`.

> **IcoMoon app versions:** The [new IcoMoon app](https://icomoon.io/new-app) exports a different JSON format than the [old IcoMoon app](https://icomoon.io/app). The current `createIconSetFromIcoMoon` function only supports the old app's output. See the [Pull Request on GitHub](https://github.com/expo/vector-icons/pull/356), which adds support for the new format. This support will work once released in `@expo/vector-icons`.

See the example below that uses the `useFonts` hook to load the font:

<SnackInline
Expand Down
103 changes: 103 additions & 0 deletions docs/pages/versions/unversioned/sdk/ui/swift-ui/scrollview.mdx
Original file line number Diff line number Diff line change
@@ -0,0 +1,103 @@
---
title: ScrollView
description: A SwiftUI ScrollView component for scrollable content.
sourceCodeUrl: 'https://github.com/expo/expo/tree/main/packages/expo-ui'
packageName: '@expo/ui'
platforms: ['ios', 'tvos']
---

import APISection from '~/components/plugins/APISection';
import { APIInstallSection } from '~/components/plugins/InstallSection';

Expo UI ScrollView matches the official SwiftUI [ScrollView API](https://developer.apple.com/documentation/swiftui/scrollview) and provides a scrollable container for its children.

## Installation

<APIInstallSection />

## Usage

### Basic vertical scroll view

A simple vertically scrollable list of text items.

```tsx ScrollViewVerticalExample.tsx
import { Host, ScrollView, VStack, Text } from '@expo/ui/swift-ui';
import { padding } from '@expo/ui/swift-ui/modifiers';

export default function ScrollViewVerticalExample() {
return (
<Host style={{ flex: 1 }}>
<ScrollView>
<VStack spacing={8}>
{Array.from({ length: 30 }, (_, i) => (
<Text key={i} modifiers={[padding({ horizontal: 16 })]}>
{`Item ${i + 1}`}
</Text>
))}
</VStack>
</ScrollView>
</Host>
);
}
```

### Horizontal scroll view

Use the `axes` prop to scroll horizontally.

```tsx ScrollViewHorizontalExample.tsx
import { Host, ScrollView, HStack, RoundedRectangle } from '@expo/ui/swift-ui';
import { frame, foregroundStyle } from '@expo/ui/swift-ui/modifiers';

export default function ScrollViewHorizontalExample() {
return (
<Host style={{ flex: 1 }}>
<ScrollView axes="horizontal">
<HStack spacing={8}>
{Array.from({ length: 20 }, (_, i) => (
<RoundedRectangle
key={i}
cornerRadius={12}
modifiers={[
frame({ width: 100, height: 100 }),
foregroundStyle(`hsl(${i * 18}, 70%, 50%)`),
]}
/>
))}
</HStack>
</ScrollView>
</Host>
);
}
```

### Hidden scroll indicators

Set `showsIndicators` to `false` to hide the scroll bars.

```tsx ScrollViewHiddenIndicatorsExample.tsx
import { Host, ScrollView, VStack, Text } from '@expo/ui/swift-ui';

export default function ScrollViewHiddenIndicatorsExample() {
return (
<Host style={{ flex: 1 }}>
<ScrollView showsIndicators={false}>
<VStack spacing={8}>
{Array.from({ length: 30 }, (_, i) => (
<Text key={i}>{`Item ${i + 1}`}</Text>
))}
</VStack>
</ScrollView>
</Host>
);
}
```

## API

```tsx
import { ScrollView } from '@expo/ui/swift-ui';
```

<APISection packageName="expo-ui/swift-ui/scrollview" apiName="ScrollView" />
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
{"schemaVersion":"2.0","name":"expo-ui/swift-ui/scrollview","variant":"project","kind":1,"children":[{"name":"ScrollViewProps","variant":"declaration","kind":2097152,"type":{"type":"intersection","types":[{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"children":[{"name":"axes","variant":"declaration","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"The scrollable axes."}],"blockTags":[{"tag":"@default","content":[{"kind":"text","text":"'vertical'"}]}]},"type":{"type":"union","types":[{"type":"literal","value":"vertical"},{"type":"literal","value":"horizontal"},{"type":"literal","value":"both"}]}},{"name":"children","variant":"declaration","kind":1024,"type":{"type":"reference","target":{"packageName":"@types/react","packagePath":"index.d.ts","qualifiedName":"React.ReactNode"},"name":"React.ReactNode","package":"@types/react"}},{"name":"showsIndicators","variant":"declaration","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Whether to show scroll indicators."}],"blockTags":[{"tag":"@default","content":[{"kind":"text","text":"true"}]}]},"type":{"type":"intrinsic","name":"boolean"}}]}},{"type":"reference","target":{"packageName":"@expo/ui","packagePath":"src/swift-ui/types.ts","qualifiedName":"CommonViewModifierProps"},"name":"CommonViewModifierProps","package":"@expo/ui"}]}},{"name":"ScrollView","variant":"declaration","kind":64,"signatures":[{"name":"ScrollView","variant":"signature","kind":4096,"parameters":[{"name":"props","variant":"param","kind":32768,"type":{"type":"reference","name":"ScrollViewProps","package":"@expo/ui"}}],"type":{"type":"reference","target":{"packageName":"@types/react","packagePath":"index.d.ts","qualifiedName":"React.JSX.Element"},"name":"Element","package":"@types/react","qualifiedName":"React.JSX.Element"}}]}],"packageName":"@expo/ui"}
2 changes: 1 addition & 1 deletion docs/public/static/data/unversioned/expo-video.json

Large diffs are not rendered by default.

10 changes: 5 additions & 5 deletions docs/yarn.lock
Original file line number Diff line number Diff line change
Expand Up @@ -1006,9 +1006,9 @@ __metadata:
languageName: node
linkType: hard

"@expo/styleguide-search-ui@npm:^3.3.1":
version: 3.3.1
resolution: "@expo/styleguide-search-ui@npm:3.3.1"
"@expo/styleguide-search-ui@npm:^3.3.3":
version: 3.3.3
resolution: "@expo/styleguide-search-ui@npm:3.3.3"
dependencies:
"@expo/styleguide": "npm:^9.3.1"
"@expo/styleguide-icons": "npm:^2.3.4"
Expand All @@ -1024,7 +1024,7 @@ __metadata:
peerDependencies:
next: ">= 13"
react: ">= 19"
checksum: 10c0/ff149cf84459e50fe7bc33134db043e3d4afcb5e287e89d6c9cdab7f2d2c57c4bdfc93f454d98a64ee075551c3889c5cdf79740fc9cb56ea4701ccceb845ca0e
checksum: 10c0/fa48338c1ff3fb6be6de7e08a0fa7b6ec005e290771af7443fc35628c120d41f2bf24c761031fc95b83a94ce7d3e5b7ff6e803d1ba2ad7aa3e3145c4e7c3b25a
languageName: node
linkType: hard

Expand Down Expand Up @@ -7959,7 +7959,7 @@ __metadata:
"@expo/styleguide": "npm:^9.3.1"
"@expo/styleguide-base": "npm:^2.0.5"
"@expo/styleguide-icons": "npm:^2.3.4"
"@expo/styleguide-search-ui": "npm:^3.3.1"
"@expo/styleguide-search-ui": "npm:^3.3.3"
"@kapaai/react-sdk": "npm:^0.9.0"
"@mdx-js/loader": "npm:^3.1.1"
"@mdx-js/mdx": "npm:^3.1.1"
Expand Down
1 change: 1 addition & 0 deletions packages/@expo/cli/CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -72,6 +72,7 @@ _This version does not introduce any user-facing changes._
- Fix loader URL resolution for nested `/index` paths ([#42629](https://github.com/expo/expo/pull/42629) by [@hassankhan](https://github.com/hassankhan))
- [web] Ensure `<Head>` component re-renders when focus changes ([#42681](https://github.com/expo/expo/pull/42681) by [@hassankhan](https://github.com/hassankhan))
- Mark `expo-router` as optional peer to prevent auto-installation ([#42728](https://github.com/expo/expo/pull/42728) by [@kitten](https://github.com/kitten))
- [android] Support `debugOptimized` build variant for active architecture filtering ([#42766](https://github.com/expo/expo/pull/42766) by [@janicduplessis](https://github.com/janicduplessis))

### 💡 Others

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -76,10 +76,13 @@ describe(resolveGradlePropsAsync, () => {
});

it('returns with highly custom variant "firstSecondThird"', async () => {
// See: https://android.googlesource.com/platform/tools/base/+/e3b89c93d5e8238d6163f4e606d4ae9c4d229ee4/build-system/gradle-core/src/main/java/com/android/build/gradle/internal/variant/VariantPathHelper.kt?autodive=0%2F%2F%2F%2F%2F#137
// See: https://github.com/zawn/android-gradle-plugin/blob/c5d0ab91fac5a4acbe1845d3743b5ea0f896983d/builder/src/com/android/builder/core/VariantConfiguration.java#L402-L409
// The flavor should only be one directory, rather than multiple
expect(
await resolveGradlePropsAsync('/', { variant: 'firstSecondThird', allArch: true }, testDevice)
).toEqual({
apkVariantDirectory: '/android/app/build/outputs/apk/first/second/third',
apkVariantDirectory: '/android/app/build/outputs/apk/firstSecond/third',
appName: 'app',
buildType: 'third',
flavors: ['first', 'second'],
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -64,7 +64,7 @@ describe(resolveOptionsAsync, () => {
appId: 'dev.expo.test',
})
).toEqual({
apkVariantDirectory: '/android/app/build/outputs/apk/first/second/third',
apkVariantDirectory: '/android/app/build/outputs/apk/firstSecond/third',
appName: 'app',
buildCache: true,
buildType: 'third',
Expand Down
Loading
Loading