diff --git a/apps/expo-go/android/app/build.gradle b/apps/expo-go/android/app/build.gradle index 44a8279140200e..13f10b646541dc 100644 --- a/apps/expo-go/android/app/build.gradle +++ b/apps/expo-go/android/app/build.gradle @@ -59,7 +59,7 @@ android { minSdkVersion rootProject.ext.minSdkVersion targetSdkVersion rootProject.ext.targetSdkVersion versionCode 229 - versionName '56.0.0' + versionName '56.0.1' testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" // Deprecated. Used by net.openid:appauth diff --git a/apps/expo-go/ios/Exponent/Supporting/Info.plist b/apps/expo-go/ios/Exponent/Supporting/Info.plist index 57c7d3ff99c877..4fceff4dea658c 100644 --- a/apps/expo-go/ios/Exponent/Supporting/Info.plist +++ b/apps/expo-go/ios/Exponent/Supporting/Info.plist @@ -23,7 +23,7 @@ CFBundlePackageType APPL CFBundleShortVersionString - 56.0.0 + 56.0.1 CFBundleSignature ???? CFBundleURLTypes @@ -61,7 +61,7 @@ CFBundleVersion - 56.0.0 + 56.0.1 FacebookAdvertiserIDCollectionEnabled FacebookAppID diff --git a/apps/native-component-list/src/screens/UI/CommunityPagerViewScreen.tsx b/apps/native-component-list/src/screens/UI/CommunityPagerViewScreen.tsx new file mode 100644 index 00000000000000..f7a01710188a78 --- /dev/null +++ b/apps/native-component-list/src/screens/UI/CommunityPagerViewScreen.tsx @@ -0,0 +1,290 @@ +import PagerView from '@expo/ui/community/pager-view'; +import * as React from 'react'; +import { Button, ScrollView, StyleSheet, Text, View, type DimensionValue } from 'react-native'; +import Reanimated, { useAnimatedStyle, useSharedValue } from 'react-native-reanimated'; + +// Adapted from https://github.com/callstack/react-native-pager-view/tree/master/example + +const PAGE_COLORS = ['#6200EE', '#03DAC5', '#FF5722', '#E91E63', '#3F51B5']; + +function ColorPage({ index, label }: { index: number; label?: string }) { + return ( + + {label ?? `Page ${index + 1}`} + + ); +} + +function Section({ + title, + hint, + children, +}: { + title: string; + hint?: string; + children: React.ReactNode; +}) { + return ( + + {title} + {hint ? {hint} : null} + {children} + + ); +} + +function BasicSection() { + const pagerRef = React.useRef>(null); + const [page, setPage] = React.useState(0); + + return ( +
+ setPage(e.nativeEvent.position)}> + + + + + +
+ ); +} + +function ScrollProgressSection() { + const progress = useSharedValue(0); + const [state, setState] = React.useState<'idle' | 'dragging' | 'settling'>('idle'); + const [page, setPage] = React.useState(0); + const pageCount = 4; + + const onPageScroll = (e: { nativeEvent: { position: number; offset: number } }) => { + 'worklet'; + progress.value = e.nativeEvent.position + e.nativeEvent.offset; + }; + + const progressBarFill = useAnimatedStyle(() => ({ + width: `${Math.max(0, Math.min(1, progress.value / (pageCount - 1))) * 100}%`, + })); + + const blockJSFor = (ms: number) => { + const end = Date.now() + ms; + // eslint-disable-next-line no-empty + while (Date.now() < end) {} + }; + + return ( +
+ + + + setState(e.nativeEvent.pageScrollState)} + onPageSelected={(e) => setPage(e.nativeEvent.position)}> + + + + + + + + {state} + + + Page {page + 1} / {pageCount} + + +
+ ); +} + +function stateBadgeStyle(state: 'idle' | 'dragging' | 'settling') { + switch (state) { + case 'dragging': + return { backgroundColor: '#03DAC5' }; + case 'settling': + return { backgroundColor: '#FF9800' }; + case 'idle': + default: + return { backgroundColor: '#9E9E9E' }; + } +} + +function ToggleScrollSection() { + const pagerRef = React.useRef>(null); + const [enabled, setEnabled] = React.useState(true); + const [page, setPage] = React.useState(0); + + return ( +
+ setPage(e.nativeEvent.position)}> + + + + + +
+ ); +} + +function DynamicPagesSection() { + const [pages, setPages] = React.useState([0, 1, 2]); + const pagerRef = React.useRef>(null); + const [current, setCurrent] = React.useState(0); + + return ( +
+ setCurrent(e.nativeEvent.position)}> + {pages.map((id, i) => ( + + ))} + + +
+ ); +} + +function InitialPageSection() { + const initialPage = 2; + const pageCount = 4; + const [page, setPage] = React.useState(initialPage); + const [progress, setProgress] = React.useState(initialPage); + const fillWidth: DimensionValue = `${Math.max(0, Math.min(1, progress / (pageCount - 1))) * 100}%`; + + return ( +
+ + + + setProgress(e.nativeEvent.position + e.nativeEvent.offset)} + onPageSelected={(e) => setPage(e.nativeEvent.position)}> + + + + + + + Page {page + 1} / {pageCount} + +
+ ); +} + +function RTLSection() { + const [rtl, setRtl] = React.useState(false); + const [page, setPage] = React.useState(0); + + return ( +
+ setPage(e.nativeEvent.position)}> + + + + + +
+ ); +} + +export default function CommunityPagerViewScreen() { + return ( + + + + + + + + + ); +} + +CommunityPagerViewScreen.navigationOptions = { + title: 'Community PagerView replacement', +}; + +const styles = StyleSheet.create({ + scroll: { padding: 16, gap: 24 }, + section: { gap: 12 }, + sectionTitle: { fontSize: 16, fontWeight: '600' }, + sectionHint: { fontSize: 12, color: '#666' }, + pager: { height: 240, borderRadius: 12, overflow: 'hidden' }, + page: { flex: 1, alignItems: 'center', justifyContent: 'center' }, + pageText: { color: '#FFFFFF', fontSize: 22, fontWeight: 'bold' }, + row: { + flexDirection: 'row', + justifyContent: 'space-between', + alignItems: 'center', + gap: 12, + }, + label: { fontSize: 15, fontWeight: '600' }, + labelAlign: { alignSelf: 'flex-start' }, + progressBarTrack: { height: 6, borderRadius: 3, backgroundColor: '#EEE', overflow: 'hidden' }, + progressBarFill: { height: '100%', backgroundColor: '#6200EE' }, + stateBadge: { paddingHorizontal: 10, paddingVertical: 4, borderRadius: 12 }, + stateBadgeText: { color: '#FFF', fontSize: 12, fontWeight: '600' }, + refDemoHost: { height: 240, borderRadius: 12, overflow: 'hidden' }, + refTile: { flex: 1, alignItems: 'center', justifyContent: 'center' }, +}); diff --git a/apps/native-component-list/src/screens/UI/ModifiersScreen.ios.tsx b/apps/native-component-list/src/screens/UI/ModifiersScreen.ios.tsx index 0d5fd2b046c185..9cc55a18b33974 100644 --- a/apps/native-component-list/src/screens/UI/ModifiersScreen.ios.tsx +++ b/apps/native-component-list/src/screens/UI/ModifiersScreen.ios.tsx @@ -274,6 +274,18 @@ export default function ModifiersScreen() { + {/* Dynamic Type */} + + + Dynamic Type (try Settings > Accessibility > Larger Text) + + + largeTitle scales + + body scales + caption scales + + lowercase uppercase diff --git a/apps/native-component-list/src/screens/UI/UIScreen.android.tsx b/apps/native-component-list/src/screens/UI/UIScreen.android.tsx index 6c13ef620eaaf9..411d33a21a0455 100644 --- a/apps/native-component-list/src/screens/UI/UIScreen.android.tsx +++ b/apps/native-component-list/src/screens/UI/UIScreen.android.tsx @@ -154,6 +154,14 @@ export const UIScreens = [ return optionalRequire(() => require('./CommunityMenuScreen')); }, }, + { + name: 'Community PagerView replacement', + route: 'ui/community-pager-view', + options: {}, + getComponent() { + return optionalRequire(() => require('./CommunityPagerViewScreen')); + }, + }, { name: 'Switch component', route: 'ui/switch', diff --git a/apps/native-component-list/src/screens/UI/UIScreen.ios.tsx b/apps/native-component-list/src/screens/UI/UIScreen.ios.tsx index 0e4f48d793372f..e2303d221190e8 100644 --- a/apps/native-component-list/src/screens/UI/UIScreen.ios.tsx +++ b/apps/native-component-list/src/screens/UI/UIScreen.ios.tsx @@ -82,6 +82,14 @@ export const UIScreens = [ return optionalRequire(() => require('./CommunityMenuScreen')); }, }, + { + name: 'Community PagerView replacement', + route: 'ui/community-pager-view', + options: {}, + getComponent() { + return optionalRequire(() => require('./CommunityPagerViewScreen')); + }, + }, { name: 'TabView component', route: 'ui/tabview', diff --git a/apps/notification-tester/package.json b/apps/notification-tester/package.json index c026a411f5219e..adc28cd4d147b5 100644 --- a/apps/notification-tester/package.json +++ b/apps/notification-tester/package.json @@ -41,8 +41,10 @@ "react-native-gesture-handler": "~2.30.0", "react": "19.2.3", "react-native": "0.85.3", + "react-native-reanimated": "4.3.0", "react-native-safe-area-context": "5.6.2", - "react-native-screens": "4.25.1" + "react-native-screens": "4.25.1", + "react-native-worklets": "0.8.3" }, "devDependencies": { "@types/jest": "^29.5.12", @@ -63,11 +65,9 @@ "react-native-keyboard-controller", "react-native-maps", "react-native-pager-view", - "react-native-reanimated", "react-native-svg", "react-native-view-shot", "react-native-webview", - "react-native-worklets", "@expo/app-integrity", "expo-age-range", "expo-apple-authentication", diff --git a/apps/notification-tester/src/app/expo-ui.tsx b/apps/notification-tester/src/app/expo-ui.tsx index 1bf1b807fedc1f..99477963c262e3 100644 --- a/apps/notification-tester/src/app/expo-ui.tsx +++ b/apps/notification-tester/src/app/expo-ui.tsx @@ -1,3 +1,3 @@ -import HorizontalPagerScreen from 'native-component-list/src/screens/UI/HorizontalPagerScreen'; +import CommunityPagerViewScreen from 'native-component-list/src/screens/UI/CommunityPagerViewScreen'; -export default HorizontalPagerScreen; +export default CommunityPagerViewScreen; diff --git a/apps/notification-tester/tsconfig.json b/apps/notification-tester/tsconfig.json index 2a1122b87bbfc9..c088a3bbac4729 100644 --- a/apps/notification-tester/tsconfig.json +++ b/apps/notification-tester/tsconfig.json @@ -3,6 +3,7 @@ "compilerOptions": { "strict": true, "paths": { + "ThemeProvider": ["../common/ThemeProvider"] } }, "include": [ diff --git a/docs/pages/eas/cli.mdx b/docs/pages/eas/cli.mdx index e0980a14c55d30..d7ee8c1cb5661b 100644 --- a/docs/pages/eas/cli.mdx +++ b/docs/pages/eas/cli.mdx @@ -2,7 +2,7 @@ title: EAS CLI reference sidebar_title: EAS CLI description: EAS CLI is a command-line tool that allows you to interact with Expo Application Services (EAS) from your terminal. -cliVersion: 18.13.1 +cliVersion: 19.0.1 --- import { EASCLIReference } from '~/ui/components/EASCLIReference'; diff --git a/docs/pages/eas/observe/get-started.mdx b/docs/pages/eas/observe/get-started.mdx index ee101ee10a7496..f758342e7f1246 100644 --- a/docs/pages/eas/observe/get-started.mdx +++ b/docs/pages/eas/observe/get-started.mdx @@ -47,7 +47,11 @@ Make sure you are using the latest version of `expo`, then install `expo-observe ## Wrap your root layout -Wrap your root layout with `AppMetricsRoot`. This higher-order component (HOC) automatically measures [Time to First Render (TTR)](/eas/observe/reference/metrics/#time-to-first-render) for you. +Wrap your root layout with `AppMetricsRoot` (SDK 55) or `ObserveRoot` (SDK 56 and later). This higher-order component (HOC) automatically measures [Time to First Render (TTR)](/eas/observe/reference/metrics/#time-to-first-render) for you. + + + + ```tsx app/_layout.tsx import { Stack } from 'expo-router'; @@ -60,6 +64,25 @@ function RootLayout() { export default AppMetricsRoot.wrap(RootLayout); ``` + + + + +```tsx app/_layout.tsx +import { Stack } from 'expo-router'; +import { ObserveRoot } from 'expo-observe'; + +function RootLayout() { + return ; +} + +export default ObserveRoot.wrap(RootLayout); +``` + + + + + @@ -75,7 +98,7 @@ Call `markInteractive()` when your app is fully ready for user interaction. This - + ```tsx app/_layout.tsx import { Stack } from 'expo-router'; @@ -123,18 +146,20 @@ export default AppMetricsRoot.wrap(RootLayout); - + -```tsx App.tsx -import { useEffect, useState } from 'react'; +```tsx app/_layout.tsx +import { Stack } from 'expo-router'; import * as SplashScreen from 'expo-splash-screen'; -import { AppMetrics, AppMetricsRoot } from 'expo-observe'; +import { ObserveRoot, useObserve } from 'expo-observe'; +import { useEffect, useState } from 'react'; // Keep the splash screen visible while we fetch resources SplashScreen.preventAutoHideAsync(); -function App() { +function RootLayout() { const [isReady, setIsReady] = useState(false); + const { markInteractive } = useObserve(); useEffect(() => { async function prepare() { @@ -153,19 +178,19 @@ function App() { useEffect(() => { if (isReady) { - SplashScreen.hideAsync(); - AppMetrics.markInteractive(); + SplashScreen.hide(); + markInteractive(); } - }, [isReady]); + }, [isReady, markInteractive]); if (!isReady) { return null; } - // your app + return ; } -export default AppMetricsRoot.wrap(App); +export default ObserveRoot.wrap(RootLayout); ``` diff --git a/docs/pages/eas/observe/introduction.mdx b/docs/pages/eas/observe/introduction.mdx index 448301d195f0c1..eedc10812b2211 100644 --- a/docs/pages/eas/observe/introduction.mdx +++ b/docs/pages/eas/observe/introduction.mdx @@ -23,7 +23,7 @@ Debugging performance in React Native has traditionally been limited to developm -Wrap your root layout with the `AppMetricsRoot` component and call `markInteractive()` when your app is ready for user input. See [Get started](/eas/observe/get-started/) for the full setup guide. +Wrap your root layout with the `AppMetricsRoot` component (SDK 55) or the `ObserveRoot` component (SDK 56 and later) and call `markInteractive()` when your app is ready for user input. See [Get started](/eas/observe/get-started/) for the full setup guide. ## Why Expo Observe diff --git a/docs/pages/eas/observe/reference/metrics.mdx b/docs/pages/eas/observe/reference/metrics.mdx index 3fa5078420b178..54f6d0f0bd4098 100644 --- a/docs/pages/eas/observe/reference/metrics.mdx +++ b/docs/pages/eas/observe/reference/metrics.mdx @@ -4,6 +4,8 @@ sidebar_title: Metrics description: A reference of each performance metric tracked by Expo Observe, including concepts and data handling. --- +import { Tabs, Tab } from '~/ui/components/Tabs'; + Reference for the performance metrics Expo Observe collects, the core concepts used to organize events (sessions and users), and how collected data is retained. ## Concepts @@ -79,7 +81,7 @@ This metric is collected automatically. **What it measures:** Time from when the app finishes native launching to when the root React component first renders on the screen. This is the moment actual content is rendered by React, after the splash screen is hidden. The goal for every app should be to show something meaningful as fast as possible, even if it's a skeleton loading screen. -This metric is collected automatically when you wrap your root layout with `AppMetricsRoot` (see [Get started](/eas/observe/get-started/)). You can also call `AppMetrics.markFirstRender()` manually if needed. +This metric is collected automatically when you wrap your root layout with the root HOC (see [Get started](/eas/observe/get-started/)): **How to improve:** @@ -96,7 +98,23 @@ This metric is collected automatically when you wrap your root layout with `AppM **What it measures:** Time between the warm/cold launch and when the user can actually tap, scroll, and interact with the app in other ways. It is the most important startup metric because it is what users perceive as "the app is ready". -This metric is not reported automatically. To start measuring it, call `AppMetrics.markInteractive()` once the screen is ready for user interaction, for example in a `useEffect` that runs after your initial data has loaded. If your app uses deep links, the main screen may not always be the initial screen, so we recommend calling this function on other screens too. Only the first call per launch is recorded, so it is safe to call it multiple times (for example, when the user navigates between screens). If you use `expo-router`, the metric's event automatically includes the current route name. +This metric is not reported automatically. To start measuring it, call `markInteractive()` once the screen is ready for user interaction, for example in a `useEffect` that runs after your initial data has loaded. If your app uses deep links, the main screen may not always be the initial screen, so we recommend calling this function on other screens too. Only the first call per launch is recorded, so it is safe to call it multiple times (for example, when the user navigates between screens). If you use `expo-router`, the metric's event automatically includes the current route name. + + + + + +Call `AppMetrics.markInteractive()` from anywhere in your app. + + + + + +Call `markInteractive()` from the `useObserve()` hook inside a component. + + + + **What makes an app "interactive"?** @@ -106,7 +124,7 @@ All of these must be true: - Touch handlers are attached and responsive. - Navigation is functional. -**How to improve measurement accuracy:** Call `AppMetrics.markInteractive()` only after the screen's content is loaded and touch handlers are active, not just on component mount. If your screen fetches data before becoming usable, place the call after the data is ready. +**How to improve measurement accuracy:** Call `markInteractive()` only after the screen's content is loaded and touch handlers are active, not just on component mount. If your screen fetches data before becoming usable, place the call after the data is ready. **How to improve:** @@ -143,7 +161,13 @@ Each TTI event includes extra params to help triage issues: You can attach your own params to the TTI event by passing them to `markInteractive()`. This is useful for slicing TTI by app-specific dimensions such as user cohort, tenant, feature flag variant, or the type of content the screen loaded. + + + + ```tsx +import { AppMetrics } from 'expo-observe'; + AppMetrics.markInteractive({ params: { tenant: 'acme', @@ -153,15 +177,62 @@ AppMetrics.markInteractive({ }); ``` + + + + +```tsx +import { useObserve } from 'expo-observe'; + +const { markInteractive } = useObserve(); + +markInteractive({ + params: { + tenant: 'acme', + cohort: 'beta', + cacheHit: true, + }, +}); +``` + + + + + You can also override the route name attached to the event, which is otherwise populated from the initial route detected by [Expo Router](/router/introduction/). This useful when the screen's logical name differs from the router path, is a dynamic route, or when not using Expo Router: + + + + ```tsx +import { AppMetrics } from 'expo-observe'; + AppMetrics.markInteractive({ routeName: '/feed', params: { cacheHit: true }, }); ``` + + + + +```tsx +import { useObserve } from 'expo-observe'; + +const { markInteractive } = useObserve(); + +markInteractive({ + routeName: '/feed', + params: { cacheHit: true }, +}); +``` + + + + + Param values can be strings, numbers, booleans, or other JSON-serializable values. ## Data handling diff --git a/docs/pages/eas/observe/reference/troubleshooting.mdx b/docs/pages/eas/observe/reference/troubleshooting.mdx index 78f89149e6ce8d..6e7af4be1d350a 100644 --- a/docs/pages/eas/observe/reference/troubleshooting.mdx +++ b/docs/pages/eas/observe/reference/troubleshooting.mdx @@ -7,6 +7,7 @@ description: Solutions for common Expo Observe issues. import { Collapsible } from '~/ui/components/Collapsible'; import { Terminal } from '~/ui/components/Snippet'; import { Step } from '~/ui/components/Step'; +import { Tabs, Tab } from '~/ui/components/Tabs'; ## Common issues @@ -18,7 +19,11 @@ import { Step } from '~/ui/components/Step'; ### Time to first render not showing -Verify that your root layout is wrapped with `AppMetricsRoot`: +Verify that your root layout is wrapped with the root HOC: + + + + ```jsx import { AppMetricsRoot } from 'expo-observe'; @@ -30,13 +35,46 @@ function RootLayout() { export default AppMetricsRoot.wrap(RootLayout); ``` + + + + +```jsx +import { ObserveRoot } from 'expo-observe'; + +function RootLayout() { + return (/* your layout */); +} + +export default ObserveRoot.wrap(RootLayout); +``` + + + + + ### Time to interactive not showing This metric requires manual instrumentation. Verify that: + + + + 1. You are calling `AppMetrics.markInteractive()` after your splash screen is hidden. 2. The call is actually being executed (add a `console.log` to verify). + + + + +1. You are calling `markInteractive()` (from `useObserve()`) after your splash screen is hidden. +2. The call is actually being executed (add a `console.log` to verify). + + + + + If you were part of the private preview and previously used `expo-eas-observe`, follow these steps to migrate to `expo-observe`. @@ -66,9 +104,9 @@ If you previously installed `expo-eas-client` as a separate dependency, you can -**Replace manual `markFirstRender()` with `AppMetricsRoot`** +**Replace manual `markFirstRender()` with the root HOC** -Instead of calling `markFirstRender()` manually, wrap your root layout with the `AppMetricsRoot` HOC. This handles the measurement automatically. +Instead of calling `markFirstRender()` manually, wrap your root layout with the root HOC for your SDK. This handles the measurement automatically. Before: @@ -87,6 +125,10 @@ export default function RootLayout() { After: + + + + ```jsx import { AppMetricsRoot } from 'expo-observe'; @@ -97,6 +139,24 @@ function RootLayout() { export default AppMetricsRoot.wrap(RootLayout); ``` + + + + +```jsx +import { ObserveRoot } from 'expo-observe'; + +function RootLayout() { + return (/* your layout */); +} + +export default ObserveRoot.wrap(RootLayout); +``` + + + + + diff --git a/docs/pages/guides/in-app-purchases.mdx b/docs/pages/guides/in-app-purchases.mdx index 107828cd8b2e24..b4aea14d057577 100644 --- a/docs/pages/guides/in-app-purchases.mdx +++ b/docs/pages/guides/in-app-purchases.mdx @@ -59,7 +59,7 @@ The following libraries provide robust support for in-app purchase functionality expo-iap } - description="A React Native library for in-app purchases that works with development builds." - href="https://github.com/hyochan/expo-iap" + description="A React Native library for in-app purchases that conforms to the OpenIAP specification and works with development builds." + href="https://github.com/hyodotdev/openiap/tree/main/libraries/expo-iap" Icon={GithubIcon} /> diff --git a/docs/pages/guides/monorepos.mdx b/docs/pages/guides/monorepos.mdx index 02312c4967d80d..ca4a1e9ec59f58 100644 --- a/docs/pages/guides/monorepos.mdx +++ b/docs/pages/guides/monorepos.mdx @@ -121,7 +121,7 @@ Let's go back to the root and create the **packages** directory. This directory npm: ['$ mkdir -p packages/cool-package && cd packages/cool-package && npm init'], yarn: ['$ mkdir -p packages/cool-package && cd packages/cool-package && yarn init'], pnpm: ['$ mkdir -p packages/cool-package && cd packages/cool-package && pnpm init'], - bun: ['$ mkdir -p packages/cool-package && cd packages/cool-package && bun init --minimal'], + bun: ['$ mkdir -p packages/cool-package && cd packages/cool-package && bun init -y'], }} /> diff --git a/docs/pages/guides/using-convex.mdx b/docs/pages/guides/using-convex.mdx index 018f4645a0c5e4..cd7f8b9292d6fe 100644 --- a/docs/pages/guides/using-convex.mdx +++ b/docs/pages/guides/using-convex.mdx @@ -4,99 +4,74 @@ description: Add a database to your app with Convex. --- import { BoxLink } from '~/ui/components/BoxLink'; +import { Prerequisites, Requirement } from '~/ui/components/Prerequisites'; import { Terminal } from '~/ui/components/Snippet'; import { Step } from '~/ui/components/Step'; -[Convex](https://www.convex.dev/) is a TypeScript-based database that requires no cluster management, SQL, or ORMs. Convex provides real-time updates over a WebSocket, making it perfect for reactive apps. +[Convex](https://www.convex.dev/) is a backend platform for building reactive apps with a realtime database, server functions, file storage, search, scheduling, and type-safe client libraries without the need for cluster management, SQL, or ORMs. - - -## Install Convex - -After you have created your [Expo project](/get-started/create-a-project/), install `convex` using the following command: - - - - - - +The EAS CLI integration can create and connect the Convex project for you. It replaces the manual setup steps where you install the package, create a Convex team and project, copy deployment URLs, and configure EAS environment variables. -## Set up a Convex dev deployment + + + Sign up for an [Expo account](https://expo.dev/signup). + + Install EAS CLI globally with `npm install -g eas-cli`. + + Create an Expo project and link it to EAS with `eas init`. + + -Run the following command to set up your Convex project: +## Connect Convex with EAS - - -This command: - -- Creates a Convex account or allows you to log in. -- Creates a project on Convex. -- Saves your production and deployment URLs. - -It also creates a **convex/** folder where you can write backend API functions that Convex will host. + -Leave this command running in one terminal window so that it can sync your functions with your dev deployment in Convex's cloud. +### Run the EAS CLI integration command - +From your Expo project directory, run: - + -## Save the Convex URL as an EAS environment variable +The command will prompt for a Convex deployment region, project name, and team name when needed. It only asks for a team name when it needs to create a new Convex team connection. -Running `npx convex dev` saves your deployment URL to a **.env.local** file as `EXPO_PUBLIC_CONVEX_URL`. To make it available in your app builds, add it as an [EAS environment variable](/eas/environment-variables/) in a new terminal session: +You can also pass values explicitly: -Replace `https://YOUR_DEPLOYMENT_URL.convex.cloud` with the `EXPO_PUBLIC_CONVEX_URL` value from your **.env.local** file. To learn more, see [Environment variables](/guides/environment-variables/). +The integration command: - - - - -## Seed your database - -Next, create a **sampleData.jsonl** file with the following sample data: - -```json sampleData.jsonl -{"text": "Buy groceries", "isCompleted": true} -{"text": "Go for a swim", "isCompleted": true} -{"text": "Integrate Convex", "isCompleted": false} -``` - -To send this data to Convex, run: - - +- Installs the `convex` package with `npx expo install convex` +- Creates a Convex team connection for your EAS account, or reuses an existing one +- Creates a Convex project and deployment for the current Expo app +- Writes `CONVEX_DEPLOY_KEY` and `EXPO_PUBLIC_CONVEX_URL` to **.env.local** +- Creates or updates the `EXPO_PUBLIC_CONVEX_URL` EAS project environment variable for the production, preview, and development environments +- Sends an invitation to your verified email so you can claim the Convex team and open the Convex dashboard - + -## Query the database +### Start Convex locally -All queries in Convex are TypeScript code. Create a **convex/tasks.ts** file with the following contents: +After the integration command finishes, start the Convex dev server: -```ts convex/tasks.ts -import { query } from './_generated/server'; + -export const get = query({ - args: {}, - handler: async ctx => { - return await ctx.db.query('tasks').collect(); - }, -}); -``` +This creates the local **convex** directory if your project does not have one yet, generates the typed API files, and syncs your Convex functions with your deployment while it runs. - + + +### Add a Convex provider -## Connect your app +Create a Convex client with the deployment URL that the EAS integration wrote to **.env.local**, then wrap your app in `ConvexProvider`. -In the top-level **src/app/\_layout.tsx** file in your app, create a `ConvexReactClient` and pass it to a `ConvexProvider` wrapping your component tree: +For an Expo Router project, update **src/app/\_layout.tsx**: ```tsx src/app/_layout.tsx import { ConvexProvider, ConvexReactClient } from 'convex/react'; @@ -109,9 +84,7 @@ const convex = new ConvexReactClient(process.env.EXPO_PUBLIC_CONVEX_URL!, { export default function RootLayout() { return ( - - - + ); } @@ -119,11 +92,24 @@ export default function RootLayout() { - + + +### Query Convex from your app -## Display the data in your app +Add a query function in the **convex** directory: -In your app, use the `useQuery` hook to fetch data from your `api.tasks.get` API: +```ts convex/tasks.ts +import { query } from './_generated/server'; + +export const get = query({ + args: {}, + handler: async ctx => { + return await ctx.db.query('tasks').collect(); + }, +}); +``` + +Then call it from your app with `useQuery`: ```tsx src/app/index.tsx import { api } from '@/convex/_generated/api'; @@ -134,14 +120,9 @@ export default function Index() { const tasks = useQuery(api.tasks.get); return ( - - {tasks?.map(({ _id, text }) => ( - {text} + + {tasks?.map(task => ( + {task.text} ))} ); @@ -150,10 +131,25 @@ export default function Index() { -## Next steps +To learn more about how Convex works, including database documents, functions, and client subscriptions, see the Convex overview: + +## Manage the integration + +Use these commands to inspect or manage the Convex integration later: + + + +If you remove the link with `eas integrations:convex:project:delete` or `eas integrations:convex:team:delete`, EAS removes its integration metadata. These commands do not destroy resources on Convex. diff --git a/docs/pages/modules/type-generation-reference.mdx b/docs/pages/modules/type-generation-reference.mdx index 77de61b377bca1..0d66e83a82417d 100644 --- a/docs/pages/modules/type-generation-reference.mdx +++ b/docs/pages/modules/type-generation-reference.mdx @@ -104,6 +104,10 @@ Generates a type declaration file for a native View. Generates a declaration file for a View, updates JSX intrinsics with the View props. +#### `other preprocess-file` + +Print the preprocessed file(s) in the state right before parsing them using `sourcekitten`. It helps with checking how the `--module-path`, `--input-path`, and `--type-inference` options affect the parsed file. + \n \n //...\n \n \n );\n}\n```"}]},{"tag":"@hideType","content":[]}]},"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"children":[{"name":"default","variant":"declaration","kind":1024,"type":{"type":"reference","name":"ChainableAnimationType","package":"@expo/ui"},"defaultValue":"..."},{"name":"easeIn","variant":"declaration","kind":1024,"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"signatures":[{"name":"__type","variant":"signature","kind":4096,"parameters":[{"name":"params","variant":"param","kind":32768,"flags":{"isOptional":true},"type":{"type":"reference","name":"TimingAnimationParams","package":"@expo/ui"}}],"type":{"type":"reference","name":"ChainableAnimationType","package":"@expo/ui"}}]}},"defaultValue":"..."},{"name":"easeInOut","variant":"declaration","kind":1024,"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"signatures":[{"name":"__type","variant":"signature","kind":4096,"parameters":[{"name":"params","variant":"param","kind":32768,"flags":{"isOptional":true},"type":{"type":"reference","name":"TimingAnimationParams","package":"@expo/ui"}}],"type":{"type":"reference","name":"ChainableAnimationType","package":"@expo/ui"}}]}},"defaultValue":"..."},{"name":"easeOut","variant":"declaration","kind":1024,"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"signatures":[{"name":"__type","variant":"signature","kind":4096,"parameters":[{"name":"params","variant":"param","kind":32768,"flags":{"isOptional":true},"type":{"type":"reference","name":"TimingAnimationParams","package":"@expo/ui"}}],"type":{"type":"reference","name":"ChainableAnimationType","package":"@expo/ui"}}]}},"defaultValue":"..."},{"name":"interpolatingSpring","variant":"declaration","kind":1024,"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"signatures":[{"name":"__type","variant":"signature","kind":4096,"parameters":[{"name":"params","variant":"param","kind":32768,"flags":{"isOptional":true},"type":{"type":"reference","name":"InterpolatingSpringAnimationParams","package":"@expo/ui"}}],"type":{"type":"reference","name":"ChainableAnimationType","package":"@expo/ui"}}]}},"defaultValue":"..."},{"name":"linear","variant":"declaration","kind":1024,"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"signatures":[{"name":"__type","variant":"signature","kind":4096,"parameters":[{"name":"params","variant":"param","kind":32768,"flags":{"isOptional":true},"type":{"type":"reference","name":"TimingAnimationParams","package":"@expo/ui"}}],"type":{"type":"reference","name":"ChainableAnimationType","package":"@expo/ui"}}]}},"defaultValue":"..."},{"name":"spring","variant":"declaration","kind":1024,"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"signatures":[{"name":"__type","variant":"signature","kind":4096,"parameters":[{"name":"params","variant":"param","kind":32768,"flags":{"isOptional":true},"type":{"type":"reference","name":"SpringAnimationParams","package":"@expo/ui"}}],"type":{"type":"reference","name":"ChainableAnimationType","package":"@expo/ui"}}]}},"defaultValue":"..."}]}},"defaultValue":"..."},{"name":"shapes","variant":"declaration","kind":32,"flags":{"isConst":true},"comment":{"summary":[{"kind":"text","text":"Shape builders for modifiers that accept shapes, such as "},{"kind":"code","text":"`background`"},{"kind":"text","text":" and "},{"kind":"code","text":"`containerShape`"},{"kind":"text","text":".\n\nShapes: "},{"kind":"code","text":"`roundedRectangle`"},{"kind":"text","text":", "},{"kind":"code","text":"`capsule`"},{"kind":"text","text":", "},{"kind":"code","text":"`rectangle`"},{"kind":"text","text":", "},{"kind":"code","text":"`ellipse`"},{"kind":"text","text":", "},{"kind":"code","text":"`circle`"},{"kind":"text","text":", "},{"kind":"code","text":"`containerRelativeShape`"},{"kind":"text","text":"."}],"blockTags":[{"tag":"@example","content":[{"kind":"code","text":"```tsx\nimport { background, shapes } from '@expo/ui/swift-ui/modifiers';\nimport { Text, Host } from '@expo/ui/swift-ui';\n\nfunction Example() {\n return (\n \n \n Hello, world!\n \n \n );\n}\n```"}]},{"tag":"@hideType","content":[]}]},"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"children":[{"name":"capsule","variant":"declaration","kind":1024,"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"signatures":[{"name":"__type","variant":"signature","kind":4096,"parameters":[{"name":"params","variant":"param","kind":32768,"flags":{"isOptional":true},"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"children":[{"name":"roundedCornerStyle","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"union","types":[{"type":"literal","value":"continuous"},{"type":"literal","value":"circular"}]}}]}}}],"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"children":[{"name":"roundedCornerStyle","variant":"declaration","kind":1024,"type":{"type":"union","types":[{"type":"literal","value":"continuous"},{"type":"literal","value":"circular"},{"type":"intrinsic","name":"undefined"}]},"defaultValue":"params.roundedCornerStyle"},{"name":"shape","variant":"declaration","kind":1024,"type":{"type":"intrinsic","name":"string"},"defaultValue":"'capsule'"}]}}}]}},"defaultValue":"..."},{"name":"circle","variant":"declaration","kind":1024,"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"signatures":[{"name":"__type","variant":"signature","kind":4096,"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"children":[{"name":"shape","variant":"declaration","kind":1024,"type":{"type":"intrinsic","name":"string"},"defaultValue":"'circle'"}]}}}]}},"defaultValue":"..."},{"name":"containerRelativeShape","variant":"declaration","kind":1024,"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"signatures":[{"name":"__type","variant":"signature","kind":4096,"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"children":[{"name":"shape","variant":"declaration","kind":1024,"type":{"type":"intrinsic","name":"string"},"defaultValue":"'containerRelativeShape'"}]}}}]}},"defaultValue":"..."},{"name":"ellipse","variant":"declaration","kind":1024,"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"signatures":[{"name":"__type","variant":"signature","kind":4096,"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"children":[{"name":"shape","variant":"declaration","kind":1024,"type":{"type":"intrinsic","name":"string"},"defaultValue":"'ellipse'"}]}}}]}},"defaultValue":"..."},{"name":"rectangle","variant":"declaration","kind":1024,"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"signatures":[{"name":"__type","variant":"signature","kind":4096,"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"children":[{"name":"shape","variant":"declaration","kind":1024,"type":{"type":"intrinsic","name":"string"},"defaultValue":"'rectangle'"}]}}}]}},"defaultValue":"..."},{"name":"roundedRectangle","variant":"declaration","kind":1024,"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"signatures":[{"name":"__type","variant":"signature","kind":4096,"parameters":[{"name":"params","variant":"param","kind":32768,"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"children":[{"name":"cornerRadius","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"intrinsic","name":"number"}},{"name":"cornerSize","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"children":[{"name":"height","variant":"declaration","kind":1024,"type":{"type":"intrinsic","name":"number"}},{"name":"width","variant":"declaration","kind":1024,"type":{"type":"intrinsic","name":"number"}}]}}},{"name":"roundedCornerStyle","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"union","types":[{"type":"literal","value":"continuous"},{"type":"literal","value":"circular"}]}}]}}}],"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"children":[{"name":"cornerRadius","variant":"declaration","kind":1024,"type":{"type":"union","types":[{"type":"intrinsic","name":"number"},{"type":"intrinsic","name":"undefined"}]},"defaultValue":"params.cornerRadius"},{"name":"cornerSize","variant":"declaration","kind":1024,"type":{"type":"union","types":[{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"children":[{"name":"height","variant":"declaration","kind":1024,"type":{"type":"intrinsic","name":"number"}},{"name":"width","variant":"declaration","kind":1024,"type":{"type":"intrinsic","name":"number"}}]}},{"type":"intrinsic","name":"undefined"}]},"defaultValue":"params.cornerSize"},{"name":"roundedCornerStyle","variant":"declaration","kind":1024,"type":{"type":"union","types":[{"type":"literal","value":"continuous"},{"type":"literal","value":"circular"},{"type":"intrinsic","name":"undefined"}]},"defaultValue":"params.roundedCornerStyle"},{"name":"shape","variant":"declaration","kind":1024,"type":{"type":"intrinsic","name":"string"},"defaultValue":"'roundedRectangle'"}]}}}]}},"defaultValue":"..."}]}},"defaultValue":"..."},{"name":"accessibilityHint","variant":"declaration","kind":64,"signatures":[{"name":"accessibilityHint","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Sets accessibility hint for the view."}],"blockTags":[{"tag":"@see","content":[{"kind":"text","text":"Official [SwiftUI documentation](https://developer.apple.com/documentation/swiftui/view/accessibilityhint(_:))."}]}]},"parameters":[{"name":"hint","variant":"param","kind":32768,"comment":{"summary":[{"kind":"text","text":"The accessibility hint."}]},"type":{"type":"intrinsic","name":"string"}}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"accessibilityLabel","variant":"declaration","kind":64,"signatures":[{"name":"accessibilityLabel","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Sets accessibility label for the view."}],"blockTags":[{"tag":"@see","content":[{"kind":"text","text":"Official [SwiftUI documentation](https://developer.apple.com/documentation/swiftui/view/accessibilitylabel(_:))."}]}]},"parameters":[{"name":"label","variant":"param","kind":32768,"comment":{"summary":[{"kind":"text","text":"The accessibility label."}]},"type":{"type":"intrinsic","name":"string"}}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"accessibilityValue","variant":"declaration","kind":64,"signatures":[{"name":"accessibilityValue","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Sets accessibility value for the view."}],"blockTags":[{"tag":"@see","content":[{"kind":"text","text":"Official [SwiftUI documentation](https://developer.apple.com/documentation/swiftui/view/accessibilityvalue(_:))."}]}]},"parameters":[{"name":"value","variant":"param","kind":32768,"comment":{"summary":[{"kind":"text","text":"The accessibility value."}]},"type":{"type":"intrinsic","name":"string"}}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"allowsTightening","variant":"declaration","kind":64,"signatures":[{"name":"allowsTightening","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Sets whether text in this view can compress the space between characters when necessary to fit text in a line"}],"blockTags":[{"tag":"@default","content":[{"kind":"text","text":"true"}]},{"tag":"@see","content":[{"kind":"text","text":"Official [SwiftUI documentation](https://developer.apple.com/documentation/swiftui/view/allowstightening(_:))."}]}]},"parameters":[{"name":"value","variant":"param","kind":32768,"type":{"type":"intrinsic","name":"boolean"}}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"animation","variant":"declaration","kind":64,"signatures":[{"name":"animation","variant":"signature","kind":4096,"parameters":[{"name":"animationObject","variant":"param","kind":32768,"type":{"type":"reference","name":"ChainableAnimationType","package":"@expo/ui"}},{"name":"animatedValue","variant":"param","kind":32768,"type":{"type":"union","types":[{"type":"intrinsic","name":"number"},{"type":"intrinsic","name":"boolean"}]}}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"aspectRatio","variant":"declaration","kind":64,"signatures":[{"name":"aspectRatio","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Sets aspect ratio constraint."}],"blockTags":[{"tag":"@see","content":[{"kind":"text","text":"Official [SwiftUI documentation](https://developer.apple.com/documentation/swiftui/view/aspectratio(_:contentmode:))."}]}]},"parameters":[{"name":"params","variant":"param","kind":32768,"comment":{"summary":[{"kind":"text","text":"Optional width/height aspect ratio and content mode."}]},"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"children":[{"name":"contentMode","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"union","types":[{"type":"literal","value":"fill"},{"type":"literal","value":"fit"}]}},{"name":"ratio","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"intrinsic","name":"number"}}]}}}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"autocorrectionDisabled","variant":"declaration","kind":64,"signatures":[{"name":"autocorrectionDisabled","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Disables autocorrection for text input views."}],"blockTags":[{"tag":"@see","content":[{"kind":"text","text":"Official [SwiftUI documentation](https://developer.apple.com/documentation/swiftui/view/autocorrectiondisabled(_:))."}]}]},"parameters":[{"name":"disabled","variant":"param","kind":32768,"comment":{"summary":[{"kind":"text","text":"Whether autocorrection is disabled. Defaults to "},{"kind":"code","text":"`true`"},{"kind":"text","text":"."}]},"type":{"type":"intrinsic","name":"boolean"},"defaultValue":"true"}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"background","variant":"declaration","kind":64,"signatures":[{"name":"background","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Sets the background of a view."}],"blockTags":[{"tag":"@see","content":[{"kind":"text","text":"Official [SwiftUI documentation](https://developer.apple.com/documentation/SwiftUI/View/background(_:alignment:))."}]}]},"parameters":[{"name":"color","variant":"param","kind":32768,"comment":{"summary":[{"kind":"text","text":"The background color (hex string). For example, "},{"kind":"code","text":"`#FF0000`"},{"kind":"text","text":"."}]},"type":{"type":"reference","name":"Color","package":"@expo/ui"}},{"name":"shape","variant":"param","kind":32768,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Optional shape to clip the background. If not provided, the background will fill the entire view."}]},"type":{"type":"reference","name":"Shape","package":"@expo/ui"}}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"backgroundOverlay","variant":"declaration","kind":64,"signatures":[{"name":"backgroundOverlay","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Adds a background behind the view."}]},"parameters":[{"name":"params","variant":"param","kind":32768,"comment":{"summary":[{"kind":"text","text":"Background color and alignment."}]},"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"children":[{"name":"alignment","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"union","types":[{"type":"literal","value":"center"},{"type":"literal","value":"top"},{"type":"literal","value":"bottom"},{"type":"literal","value":"leading"},{"type":"literal","value":"trailing"}]}},{"name":"color","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"reference","name":"Color","package":"@expo/ui"}}]}}}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"badge","variant":"declaration","kind":64,"signatures":[{"name":"badge","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Generates a badge for the view from a localized string key."}],"blockTags":[{"tag":"@see","content":[{"kind":"text","text":"Official [SwiftUI documentation](https://developer.apple.com/documentation/swiftui/view/badge(_:))."}]}]},"parameters":[{"name":"value","variant":"param","kind":32768,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Text view to display as a badge. Set the value to nil to hide the badge."}]},"type":{"type":"intrinsic","name":"string"}}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"badgeProminence","variant":"declaration","kind":64,"signatures":[{"name":"badgeProminence","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"The prominence to apply to badges associated with this environment."}],"blockTags":[{"tag":"@see","content":[{"kind":"text","text":"Official [SwiftUI documentation](https://developer.apple.com/documentation/swiftui/view/badgeprominence(_:))."}]}]},"parameters":[{"name":"badgeType","variant":"param","kind":32768,"comment":{"summary":[{"kind":"text","text":"Select the type of badge"}]},"type":{"type":"union","types":[{"type":"literal","value":"standard"},{"type":"literal","value":"increased"},{"type":"literal","value":"decreased"}]}}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"blur","variant":"declaration","kind":64,"signatures":[{"name":"blur","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Applies blur to a view."}],"blockTags":[{"tag":"@see","content":[{"kind":"text","text":"Official [SwiftUI documentation](https://developer.apple.com/documentation/swiftui/view/blur(radius:opaque:))."}]}]},"parameters":[{"name":"radius","variant":"param","kind":32768,"comment":{"summary":[{"kind":"text","text":"The blur radius."}]},"type":{"type":"intrinsic","name":"number"}}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"bold","variant":"declaration","kind":64,"signatures":[{"name":"bold","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Makes text bold.\nWhen applied to "},{"kind":"code","text":"`Text`"},{"kind":"text","text":", it works on all iOS/tvOS versions. When used on regular views, it requires iOS 16.0+/tvOS 16.0+."}],"blockTags":[{"tag":"@see","content":[{"kind":"text","text":"Official [SwiftUI documentation](https://developer.apple.com/documentation/swiftui/text/bold())."}]}]},"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"border","variant":"declaration","kind":64,"signatures":[{"name":"border","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Adds a border to a view."}],"blockTags":[{"tag":"@see","content":[{"kind":"text","text":"Official [SwiftUI documentation](https://developer.apple.com/documentation/swiftui/view/border(_:width:))."}]}]},"parameters":[{"name":"params","variant":"param","kind":32768,"comment":{"summary":[{"kind":"text","text":"The border parameters. Color and width."}]},"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"children":[{"name":"color","variant":"declaration","kind":1024,"type":{"type":"reference","name":"Color","package":"@expo/ui"}},{"name":"width","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"intrinsic","name":"number"}}]}}}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"brightness","variant":"declaration","kind":64,"signatures":[{"name":"brightness","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Adjusts the brightness of a view."}],"blockTags":[{"tag":"@see","content":[{"kind":"text","text":"Official [SwiftUI documentation](https://developer.apple.com/documentation/swiftui/view/brightness(_:))."}]}]},"parameters":[{"name":"amount","variant":"param","kind":32768,"comment":{"summary":[{"kind":"text","text":"Brightness adjustment (-1 to 1)."}]},"type":{"type":"intrinsic","name":"number"}}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"buttonStyle","variant":"declaration","kind":64,"signatures":[{"name":"buttonStyle","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Sets the button style for button views."}],"blockTags":[{"tag":"@see","content":[{"kind":"text","text":"Official [SwiftUI documentation](https://developer.apple.com/documentation/swiftui/view/buttonstyle(_:))."}]}]},"parameters":[{"name":"style","variant":"param","kind":32768,"comment":{"summary":[{"kind":"text","text":"The button style. "},{"kind":"code","text":"`'glass'`"},{"kind":"text","text":" and "},{"kind":"code","text":"`'glassProminent'`"},{"kind":"text","text":" are available on iOS 26+ and tvOS 26+ only."}]},"type":{"type":"union","types":[{"type":"literal","value":"automatic"},{"type":"literal","value":"plain"},{"type":"literal","value":"bordered"},{"type":"literal","value":"borderedProminent"},{"type":"literal","value":"borderless"},{"type":"literal","value":"glass"},{"type":"literal","value":"glassProminent"}]}}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"clipped","variant":"declaration","kind":64,"signatures":[{"name":"clipped","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Clips content to bounds."}],"blockTags":[{"tag":"@see","content":[{"kind":"text","text":"Official [SwiftUI documentation](https://developer.apple.com/documentation/swiftui/view/clipped(antialiased:))."}]}]},"parameters":[{"name":"clipped","variant":"param","kind":32768,"comment":{"summary":[{"kind":"text","text":"Whether to clip content."}]},"type":{"type":"intrinsic","name":"boolean"},"defaultValue":"true"}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"clipShape","variant":"declaration","kind":64,"signatures":[{"name":"clipShape","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Clips the view to a specific shape."}],"blockTags":[{"tag":"@see","content":[{"kind":"text","text":"Official [SwiftUI documentation](https://developer.apple.com/documentation/swiftui/view/clipshape(_:style:))."}]}]},"parameters":[{"name":"shape","variant":"param","kind":32768,"comment":{"summary":[{"kind":"text","text":"The clipping shape."}]},"type":{"type":"union","types":[{"type":"literal","value":"roundedRectangle"},{"type":"literal","value":"capsule"},{"type":"literal","value":"rectangle"},{"type":"literal","value":"ellipse"},{"type":"literal","value":"circle"},{"type":"literal","value":"containerRelativeShape"}]}},{"name":"cornerRadius","variant":"param","kind":32768,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Corner radius for rounded rectangle (default: 8)"}]},"type":{"type":"intrinsic","name":"number"}}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"colorInvert","variant":"declaration","kind":64,"signatures":[{"name":"colorInvert","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Inverts the colors of a view."}],"blockTags":[{"tag":"@see","content":[{"kind":"text","text":"Official [SwiftUI documentation](https://developer.apple.com/documentation/swiftui/view/colorinvert())."}]}]},"parameters":[{"name":"inverted","variant":"param","kind":32768,"comment":{"summary":[{"kind":"text","text":"Whether to invert colors."}]},"type":{"type":"intrinsic","name":"boolean"},"defaultValue":"true"}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"containerBackground","variant":"declaration","kind":64,"signatures":[{"name":"containerBackground","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Sets the container background of the enclosing container using a view."}],"blockTags":[{"tag":"@see","content":[{"kind":"text","text":"Official [SwiftUI documentation](https://developer.apple.com/documentation/swiftui/view/containerbackground(_:for:))."}]}]},"parameters":[{"name":"color","variant":"param","kind":32768,"comment":{"summary":[{"kind":"text","text":"The color to set as the background of the container."}]},"type":{"type":"reference","name":"Color","package":"@expo/ui"}},{"name":"container","variant":"param","kind":32768,"comment":{"summary":[{"kind":"text","text":"The type of container to apply the background to."}]},"type":{"type":"reference","name":"ContainerBackgroundPlacement","package":"@expo/ui"}}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"containerRelativeFrame","variant":"declaration","kind":64,"signatures":[{"name":"containerRelativeFrame","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Positions this view within an invisible frame with a size relative to the nearest container."}],"blockTags":[{"tag":"@see","content":[{"kind":"text","text":"Official [SwiftUI documentation](https://developer.apple.com/documentation/SwiftUI/View/containerRelativeFrame(_:alignment:))."}]},{"tag":"@platform","content":[{"kind":"text","text":"ios 17.0+"}]},{"tag":"@platform","content":[{"kind":"text","text":"tvos 17.0+"}]}]},"parameters":[{"name":"params","variant":"param","kind":32768,"comment":{"summary":[{"kind":"text","text":"The content relative frame parameters: "},{"kind":"code","text":"`axes`"},{"kind":"text","text":", "},{"kind":"code","text":"`count`"},{"kind":"text","text":", "},{"kind":"code","text":"`span`"},{"kind":"text","text":", "},{"kind":"code","text":"`spacing`"},{"kind":"text","text":" and "},{"kind":"code","text":"`alignment`"},{"kind":"text","text":"."}]},"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"children":[{"name":"alignment","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"union","types":[{"type":"literal","value":"center"},{"type":"literal","value":"top"},{"type":"literal","value":"bottom"},{"type":"literal","value":"topLeading"},{"type":"literal","value":"topTrailing"},{"type":"literal","value":"leading"},{"type":"literal","value":"trailing"},{"type":"literal","value":"bottomLeading"},{"type":"literal","value":"bottomTrailing"}]}},{"name":"axes","variant":"declaration","kind":1024,"type":{"type":"union","types":[{"type":"literal","value":"horizontal"},{"type":"literal","value":"vertical"},{"type":"literal","value":"both"}]}},{"name":"count","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"intrinsic","name":"number"}},{"name":"spacing","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"intrinsic","name":"number"}},{"name":"span","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"intrinsic","name":"number"}}]}}}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"containerShape","variant":"declaration","kind":64,"signatures":[{"name":"containerShape","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Sets the container shape for the view."}],"blockTags":[{"tag":"@see","content":[{"kind":"text","text":"Official [SwiftUI documentation](https://developer.apple.com/documentation/swiftui/view/containershape(_:))."}]}]},"parameters":[{"name":"shape","variant":"param","kind":32768,"comment":{"summary":[{"kind":"text","text":"A shape configuration from the shapes API"}]},"type":{"type":"reference","name":"Shape","package":"@expo/ui"}}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"contentShape","variant":"declaration","kind":64,"signatures":[{"name":"contentShape","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Defines the content shape for hit-testing purposes.\n\nThis modifier is essential for making entire view areas (including "},{"kind":"code","text":"`Spacer`"},{"kind":"text","text":" or empty space)\ninteractive. Without it, only visible elements like "},{"kind":"code","text":"`Text`"},{"kind":"text","text":" or "},{"kind":"code","text":"`Image`"},{"kind":"text","text":" respond to tap gestures."}],"blockTags":[{"tag":"@example","content":[{"kind":"code","text":"```tsx\nimport { HStack, List, Section, Spacer, Text } from \"@expo/ui/swift-ui\";\nimport { contentShape, onTapGesture } from \"@expo/ui/swift-ui/modifiers\";\nimport { shapes } from \"@expo/ui/swift-ui/modifiers\";\n\nfunction InteractiveRow() {\n return (\n \n
\n console.log(\"Row tapped!\"))\n ]}\n >\n Label\n \n Value\n \n
\n
\n );\n}\n```"}]},{"tag":"@see","content":[{"kind":"text","text":"Official [SwiftUI documentation](https://developer.apple.com/documentation/swiftui/view/contentshape(_:eofill:))."}]}]},"parameters":[{"name":"shape","variant":"param","kind":32768,"comment":{"summary":[{"kind":"text","text":"A shape configuration from the shapes API (rectangle, circle, capsule, ellipse, roundedRectangle)."}]},"type":{"type":"reference","name":"Shape","package":"@expo/ui"}}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"contentTransition","variant":"declaration","kind":64,"signatures":[{"name":"contentTransition","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Sets the content transition type for a view.\nUseful for animating changes in text content, especially numeric text.\nUse with the ["},{"kind":"code","text":"`animation`"},{"kind":"text","text":"](#animationanimationobject-animatedvalue) modifier to animate the transition when the content changes."}],"blockTags":[{"tag":"@example","content":[{"kind":"code","text":"```tsx\n\n {count.toString()}\n\n```"}]},{"tag":"@platform","content":[{"kind":"text","text":"ios 16.0+"}]},{"tag":"@platform","content":[{"kind":"text","text":"tvos 16.0+"}]},{"tag":"@see","content":[{"kind":"text","text":"Official [SwiftUI documentation](https://developer.apple.com/documentation/swiftui/view/contenttransition(_:))."}]}]},"parameters":[{"name":"transitionType","variant":"param","kind":32768,"comment":{"summary":[{"kind":"text","text":"The type of content transition."}]},"type":{"type":"union","types":[{"type":"literal","value":"identity"},{"type":"literal","value":"numericText"},{"type":"literal","value":"opacity"},{"type":"literal","value":"interpolate"}]}},{"name":"params","variant":"param","kind":32768,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Optional parameters."}]},"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"children":[{"name":"countsDown","variant":"declaration","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Whether the numeric text counts down."}]},"type":{"type":"intrinsic","name":"boolean"}}]}}}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"contrast","variant":"declaration","kind":64,"signatures":[{"name":"contrast","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Adjusts the contrast of a view."}],"blockTags":[{"tag":"@see","content":[{"kind":"text","text":"Official [SwiftUI documentation](https://developer.apple.com/documentation/swiftui/view/contrast(_:))."}]}]},"parameters":[{"name":"amount","variant":"param","kind":32768,"comment":{"summary":[{"kind":"text","text":"Contrast multiplier (0 to infinity, 1 = normal)."}]},"type":{"type":"intrinsic","name":"number"}}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"controlSize","variant":"declaration","kind":64,"signatures":[{"name":"controlSize","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Sets the size of controls within this view."}],"blockTags":[{"tag":"@see","content":[{"kind":"text","text":"Official [SwiftUI documentation](https://developer.apple.com/documentation/swiftui/view/controlsize(_:))."}]}]},"parameters":[{"name":"size","variant":"param","kind":32768,"comment":{"summary":[{"kind":"text","text":"The control size."}]},"type":{"type":"union","types":[{"type":"literal","value":"small"},{"type":"literal","value":"large"},{"type":"literal","value":"mini"},{"type":"literal","value":"regular"},{"type":"literal","value":"extraLarge"}]}}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"cornerRadius","variant":"declaration","kind":64,"signatures":[{"name":"cornerRadius","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Applies corner radius to a view."}],"blockTags":[{"tag":"@see","content":[{"kind":"text","text":"Official [SwiftUI documentation](https://developer.apple.com/documentation/swiftui/view/cornerradius(_:antialiased:))."}]}]},"parameters":[{"name":"radius","variant":"param","kind":32768,"comment":{"summary":[{"kind":"text","text":"The corner radius value."}]},"type":{"type":"intrinsic","name":"number"}}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"createModifier","variant":"declaration","kind":64,"signatures":[{"name":"createModifier","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Factory function to create modifier configuration objects.\nThis is used by all built-in modifier functions and can be used by 3rd party libraries to create custom modifiers."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"A "},{"kind":"code","text":"`ModifierConfig`"},{"kind":"text","text":" object that can be passed in the "},{"kind":"code","text":"`modifiers`"},{"kind":"text","text":" prop array."}]},{"tag":"@example","content":[{"kind":"code","text":"```ts\n// In a 3rd party package\nimport { createModifier } from '@expo/ui/swift-ui/modifiers';\n\nexport const blurEffect = (params: { radius: number; style?: string }) =>\n createModifier('blurEffect', params);\n```"}]}]},"parameters":[{"name":"type","variant":"param","kind":32768,"comment":{"summary":[{"kind":"text","text":"The modifier type string that maps to a registered native modifier."}]},"type":{"type":"intrinsic","name":"string"}},{"name":"params","variant":"param","kind":32768,"comment":{"summary":[{"kind":"text","text":"Additional parameters to pass to the modifier."}]},"type":{"type":"reference","target":{"packageName":"typescript","packagePath":"lib/lib.es5.d.ts","qualifiedName":"Record"},"typeArguments":[{"type":"intrinsic","name":"string"},{"type":"intrinsic","name":"any"}],"name":"Record","package":"typescript"},"defaultValue":"{}"}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"createModifierWithEventListener","variant":"declaration","kind":64,"signatures":[{"name":"createModifierWithEventListener","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Creates a modifier with an event listener."}]},"parameters":[{"name":"type","variant":"param","kind":32768,"type":{"type":"intrinsic","name":"string"}},{"name":"eventListener","variant":"param","kind":32768,"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"signatures":[{"name":"__type","variant":"signature","kind":4096,"parameters":[{"name":"args","variant":"param","kind":32768,"type":{"type":"intrinsic","name":"any"}}],"type":{"type":"intrinsic","name":"void"}}]}}},{"name":"params","variant":"param","kind":32768,"type":{"type":"reference","target":{"packageName":"typescript","packagePath":"lib/lib.es5.d.ts","qualifiedName":"Record"},"typeArguments":[{"type":"intrinsic","name":"string"},{"type":"intrinsic","name":"any"}],"name":"Record","package":"typescript"},"defaultValue":"{}"}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"createViewModifierEventListener","variant":"declaration","kind":64,"signatures":[{"name":"createViewModifierEventListener","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Create an event listener for a view modifier."}]},"parameters":[{"name":"modifiers","variant":"param","kind":32768,"comment":{"summary":[{"kind":"text","text":"An array of modifier configs to extract event listeners from."}]},"type":{"type":"array","elementType":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}}],"type":{"type":"reference","name":"GlobalEvent","package":"@expo/ui"}}]},{"name":"datePickerStyle","variant":"declaration","kind":64,"signatures":[{"name":"datePickerStyle","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Sets the style for the date picker."}],"blockTags":[{"tag":"@see","content":[{"kind":"text","text":"Official [SwiftUI documentation](https://developer.apple.com/documentation/swiftui/view/datepickerstyle(_:))."}]}]},"parameters":[{"name":"style","variant":"param","kind":32768,"comment":{"summary":[{"kind":"text","text":"The style for the date picker."}]},"type":{"type":"reference","name":"DatePickerStyleType","package":"@expo/ui"}}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"defaultScrollAnchor","variant":"declaration","kind":64,"signatures":[{"name":"defaultScrollAnchor","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Sets the default anchor point for a scroll view's content."}],"blockTags":[{"tag":"@platform","content":[{"kind":"text","text":"ios 17.0+"}]},{"tag":"@platform","content":[{"kind":"text","text":"tvos 17.0+"}]},{"tag":"@platform","content":[{"kind":"text","text":"macos 14.0+"}]},{"tag":"@see","content":[{"kind":"text","text":"Official [SwiftUI documentation](https://developer.apple.com/documentation/swiftui/view/defaultscrollanchor(_:))."}]}]},"parameters":[{"name":"anchor","variant":"param","kind":32768,"comment":{"summary":[{"kind":"text","text":"The anchor point for initial scroll position and content size changes, or "},{"kind":"code","text":"`null`"},{"kind":"text","text":" to reset."}]},"type":{"type":"union","types":[{"type":"reference","name":"UnitPointValue","package":"@expo/ui"},{"type":"literal","value":null}]}}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"defaultScrollAnchorForRole","variant":"declaration","kind":64,"signatures":[{"name":"defaultScrollAnchorForRole","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Sets the default anchor point for a scroll view for a specific role.\nPass "},{"kind":"code","text":"`null`"},{"kind":"text","text":" to opt out of a specific role while keeping anchors for other roles."}],"blockTags":[{"tag":"@platform","content":[{"kind":"text","text":"ios 18.0+"}]},{"tag":"@platform","content":[{"kind":"text","text":"tvos 18.0+"}]},{"tag":"@platform","content":[{"kind":"text","text":"macos 15.0+"}]},{"tag":"@see","content":[{"kind":"text","text":"Official [SwiftUI documentation](https://developer.apple.com/documentation/swiftui/view/defaultscrollanchor(_:for:))."}]}]},"parameters":[{"name":"anchor","variant":"param","kind":32768,"comment":{"summary":[{"kind":"text","text":"The anchor point, or "},{"kind":"code","text":"`null`"},{"kind":"text","text":" to opt out of this role."}]},"type":{"type":"union","types":[{"type":"reference","name":"UnitPointValue","package":"@expo/ui"},{"type":"literal","value":null}]}},{"name":"role","variant":"param","kind":32768,"comment":{"summary":[{"kind":"text","text":"The scroll anchor role: "},{"kind":"code","text":"`'initialOffset'`"},{"kind":"text","text":", "},{"kind":"code","text":"`'sizeChanges'`"},{"kind":"text","text":", or "},{"kind":"code","text":"`'alignment'`"},{"kind":"text","text":"."}]},"type":{"type":"union","types":[{"type":"literal","value":"initialOffset"},{"type":"literal","value":"sizeChanges"},{"type":"literal","value":"alignment"}]}}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"deleteDisabled","variant":"declaration","kind":64,"signatures":[{"name":"deleteDisabled","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Disables the delete action for a view in a list.\nApply to items within a "},{"kind":"code","text":"`ForEach`"},{"kind":"text","text":" to prevent them from being deleted."}],"blockTags":[{"tag":"@default","content":[{"kind":"text","text":"true"}]},{"tag":"@see","content":[{"kind":"text","text":"Official [SwiftUI documentation](https://developer.apple.com/documentation/swiftui/view/deletedisabled(_:))."}]}]},"parameters":[{"name":"disabled","variant":"param","kind":32768,"comment":{"summary":[{"kind":"text","text":"Whether deletion should be disabled"}]},"type":{"type":"intrinsic","name":"boolean"},"defaultValue":"true"}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"disabled","variant":"declaration","kind":64,"signatures":[{"name":"disabled","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Disables or enables a view."}],"blockTags":[{"tag":"@see","content":[{"kind":"text","text":"Official [SwiftUI documentation](https://developer.apple.com/documentation/swiftui/view/disabled(_:))."}]}]},"parameters":[{"name":"disabled","variant":"param","kind":32768,"comment":{"summary":[{"kind":"text","text":"Whether the view should be disabled."}]},"type":{"type":"intrinsic","name":"boolean"},"defaultValue":"true"}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"environment","variant":"declaration","kind":64,"signatures":[{"name":"environment","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Sets a SwiftUI environment value."}],"blockTags":[{"tag":"@see","content":[{"kind":"text","text":"Official [SwiftUI documentation](https://developer.apple.com/documentation/swiftui/view/environment(_:_:))."}]}]},"parameters":[{"name":"config","variant":"param","kind":32768,"type":{"type":"reference","name":"EnvironmentConfig","package":"@expo/ui"}}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}},{"name":"environment","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Sets a SwiftUI environment value."}],"blockTags":[{"tag":"@see","content":[{"kind":"text","text":"Official [SwiftUI documentation](https://developer.apple.com/documentation/swiftui/view/environment(_:_:))."}]}]},"parameters":[{"name":"key","variant":"param","kind":32768,"type":{"type":"union","types":[{"type":"literal","value":"colorScheme"},{"type":"literal","value":"editMode"},{"type":"literal","value":"locale"},{"type":"literal","value":"timeZone"}]}},{"name":"value","variant":"param","kind":32768,"type":{"type":"intrinsic","name":"string"}}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"fixedSize","variant":"declaration","kind":64,"signatures":[{"name":"fixedSize","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Controls fixed size behavior."}],"blockTags":[{"tag":"@see","content":[{"kind":"text","text":"Official [SwiftUI documentation](https://developer.apple.com/documentation/swiftui/view/fixedsize())."}]}]},"parameters":[{"name":"params","variant":"param","kind":32768,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Whether the view should use its ideal width or height."}]},"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"children":[{"name":"horizontal","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"intrinsic","name":"boolean"}},{"name":"vertical","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"intrinsic","name":"boolean"}}]}}}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"font","variant":"declaration","kind":64,"signatures":[{"name":"font","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Sets the font properties of a view.\nSupports both custom font families and system fonts with weight and design options."}],"blockTags":[{"tag":"@example","content":[{"kind":"code","text":"```tsx\n// Custom font family\nCustom Font Text\n\n// System font with weight and design\nSystem Font Text\n```"}]},{"tag":"@see","content":[{"kind":"text","text":"Official [SwiftUI documentation for "},{"kind":"code","text":"`custom(_:size:)`"},{"kind":"text","text":"](https://developer.apple.com/documentation/swiftui/font/custom(_:size:)) and Official [SwiftUI documentation for "},{"kind":"code","text":"`system(size:weight:design:)`"},{"kind":"text","text":"](https://developer.apple.com/documentation/swiftui/font/system(size:weight:design:))."}]}]},"parameters":[{"name":"params","variant":"param","kind":32768,"comment":{"summary":[{"kind":"text","text":"The font configuration. When "},{"kind":"code","text":"`family`"},{"kind":"text","text":" is provided, it uses Font.custom().\nWhen "},{"kind":"code","text":"`family`"},{"kind":"text","text":" is not provided, it uses Font.system() with the specified weight and design."}]},"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"children":[{"name":"design","variant":"declaration","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Font design for system fonts"}]},"type":{"type":"union","types":[{"type":"literal","value":"default"},{"type":"literal","value":"rounded"},{"type":"literal","value":"serif"},{"type":"literal","value":"monospaced"}]}},{"name":"family","variant":"declaration","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Custom font family name.\nIf provided, uses "},{"kind":"code","text":"`Font.custom()`"},{"kind":"text","text":"."}]},"type":{"type":"intrinsic","name":"string"}},{"name":"size","variant":"declaration","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Font size in points."}]},"type":{"type":"intrinsic","name":"number"}},{"name":"weight","variant":"declaration","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Font weight for system fonts."}]},"type":{"type":"union","types":[{"type":"literal","value":"light"},{"type":"literal","value":"bold"},{"type":"literal","value":"black"},{"type":"literal","value":"medium"},{"type":"literal","value":"regular"},{"type":"literal","value":"ultraLight"},{"type":"literal","value":"thin"},{"type":"literal","value":"semibold"},{"type":"literal","value":"heavy"}]}}]}}}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"foregroundColor","variant":"declaration","kind":64,"signatures":[{"name":"foregroundColor","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Sets the foreground color/tint of a view."}],"blockTags":[{"tag":"@deprecated","content":[{"kind":"text","text":"Use "},{"kind":"code","text":"`foregroundStyle`"},{"kind":"text","text":" instead."}]},{"tag":"@see","content":[{"kind":"text","text":"Official [SwiftUI documentation](https://developer.apple.com/documentation/swiftui/view/foregroundcolor(_:))."}]}]},"parameters":[{"name":"color","variant":"param","kind":32768,"comment":{"summary":[{"kind":"text","text":"The foreground color (hex string)."}]},"type":{"type":"reference","name":"Color","package":"@expo/ui"}}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"foregroundStyle","variant":"declaration","kind":64,"signatures":[{"name":"foregroundStyle","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Sets the foreground style of a view with comprehensive styling options.\n\nReplaces the deprecated "},{"kind":"code","text":"`foregroundColor`"},{"kind":"text","text":" modifier with enhanced capabilities including\ncolors, gradients, and semantic hierarchical styles that adapt to system appearance."}],"blockTags":[{"tag":"@example","content":[{"kind":"code","text":"```tsx\n// Simple usage\nRed Text\n\n// Adaptive hierarchical styling\n\n Supporting Text\n\n\n// Linear gradient\n\n Gradient Text\n\n```"}]},{"tag":"@returns","content":[{"kind":"text","text":"A view modifier that applies the specified foreground style"}]},{"tag":"@since","content":[{"kind":"text","text":"iOS 15.0+ (hierarchical quinary requires iOS 16.0+)"}]},{"tag":"@see","content":[{"kind":"text","text":"Official [SwiftUI documentation](https://developer.apple.com/documentation/swiftui/view/foregroundstyle(_:))."}]}]},"parameters":[{"name":"style","variant":"param","kind":32768,"comment":{"summary":[{"kind":"text","text":"The foreground style configuration. Can be:\n\n**Simple Color ("},{"kind":"code","text":"`Color`"},{"kind":"text","text":"):**\n- Hex colors: "},{"kind":"code","text":"`'#FF0000'`"},{"kind":"text","text":", "},{"kind":"code","text":"`'#RGB'`"},{"kind":"text","text":", "},{"kind":"code","text":"`'#RRGGBB'`"},{"kind":"text","text":", "},{"kind":"code","text":"`'#AARRGGBB'`"},{"kind":"text","text":"\n- Named colors: "},{"kind":"code","text":"`'red'`"},{"kind":"text","text":", "},{"kind":"code","text":"`'blue'`"},{"kind":"text","text":", "},{"kind":"code","text":"`'green'`"},{"kind":"text","text":", and so on.\n- React Native color values like "},{"kind":"code","text":"`PlatformColor('label')`"},{"kind":"text","text":"\n\n**Explicit Color Object:**\n"},{"kind":"code","text":"```ts\n{ type: 'color', color: PlatformColor('label') }\n```"},{"kind":"text","text":"\n\n**Hierarchical Styles (Semantic):**\nAuto-adapting semantic styles that respond to light/dark mode and accessibility settings:\n"},{"kind":"code","text":"```ts\n{ type: 'hierarchical', style: 'primary' } // Most prominent (main content, headlines)\n{ type: 'hierarchical', style: 'secondary' } // Supporting text, subheadlines\n{ type: 'hierarchical', style: 'tertiary' } // Less important text, captions\n{ type: 'hierarchical', style: 'quaternary' } // Subtle text, disabled states\n{ type: 'hierarchical', style: 'quinary' } // Most subtle (iOS 16+, fallback to quaternary)\n```"},{"kind":"text","text":"\n\n**Linear Gradient:**\n"},{"kind":"code","text":"```ts\n{\n type: 'linearGradient',\n colors: [PlatformColor('systemPink'), '#0000FF', '#00FF00'],\n startPoint: { x: 0, y: 0 }, // Top-left\n endPoint: { x: 1, y: 1 } // Bottom-right\n}\n```"},{"kind":"text","text":"\n\n**Radial Gradient:**\n"},{"kind":"code","text":"```ts\n{\n type: 'radialGradient',\n colors: [PlatformColor('systemPink'), '#0000FF'],\n center: { x: 0.5, y: 0.5 }, // Center of view\n startRadius: 0, // Inner radius\n endRadius: 100 // Outer radius\n}\n```"},{"kind":"text","text":"\n\n**Angular Gradient (Conic):**\n"},{"kind":"code","text":"```ts\n{\n type: 'angularGradient',\n colors: [PlatformColor('systemPink'), '#00FF00', '#0000FF'],\n center: { x: 0.5, y: 0.5 } // Rotation center\n}\n```"}]},"type":{"type":"union","types":[{"type":"reference","name":"Color","package":"@expo/ui"},{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"children":[{"name":"color","variant":"declaration","kind":1024,"type":{"type":"reference","name":"Color","package":"@expo/ui"}},{"name":"type","variant":"declaration","kind":1024,"type":{"type":"literal","value":"color"}}]}},{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"children":[{"name":"style","variant":"declaration","kind":1024,"type":{"type":"union","types":[{"type":"literal","value":"primary"},{"type":"literal","value":"secondary"},{"type":"literal","value":"tertiary"},{"type":"literal","value":"quaternary"},{"type":"literal","value":"quinary"}]}},{"name":"type","variant":"declaration","kind":1024,"type":{"type":"literal","value":"hierarchical"}}]}},{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"children":[{"name":"colors","variant":"declaration","kind":1024,"type":{"type":"array","elementType":{"type":"reference","name":"Color","package":"@expo/ui"}}},{"name":"endPoint","variant":"declaration","kind":1024,"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"children":[{"name":"x","variant":"declaration","kind":1024,"type":{"type":"intrinsic","name":"number"}},{"name":"y","variant":"declaration","kind":1024,"type":{"type":"intrinsic","name":"number"}}]}}},{"name":"startPoint","variant":"declaration","kind":1024,"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"children":[{"name":"x","variant":"declaration","kind":1024,"type":{"type":"intrinsic","name":"number"}},{"name":"y","variant":"declaration","kind":1024,"type":{"type":"intrinsic","name":"number"}}]}}},{"name":"type","variant":"declaration","kind":1024,"type":{"type":"literal","value":"linearGradient"}}]}},{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"children":[{"name":"center","variant":"declaration","kind":1024,"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"children":[{"name":"x","variant":"declaration","kind":1024,"type":{"type":"intrinsic","name":"number"}},{"name":"y","variant":"declaration","kind":1024,"type":{"type":"intrinsic","name":"number"}}]}}},{"name":"colors","variant":"declaration","kind":1024,"type":{"type":"array","elementType":{"type":"reference","name":"Color","package":"@expo/ui"}}},{"name":"endRadius","variant":"declaration","kind":1024,"type":{"type":"intrinsic","name":"number"}},{"name":"startRadius","variant":"declaration","kind":1024,"type":{"type":"intrinsic","name":"number"}},{"name":"type","variant":"declaration","kind":1024,"type":{"type":"literal","value":"radialGradient"}}]}},{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"children":[{"name":"center","variant":"declaration","kind":1024,"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"children":[{"name":"x","variant":"declaration","kind":1024,"type":{"type":"intrinsic","name":"number"}},{"name":"y","variant":"declaration","kind":1024,"type":{"type":"intrinsic","name":"number"}}]}}},{"name":"colors","variant":"declaration","kind":1024,"type":{"type":"array","elementType":{"type":"reference","name":"Color","package":"@expo/ui"}}},{"name":"type","variant":"declaration","kind":1024,"type":{"type":"literal","value":"angularGradient"}}]}}]}}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"frame","variant":"declaration","kind":64,"signatures":[{"name":"frame","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Sets the frame properties of a view."}],"blockTags":[{"tag":"@see","content":[{"kind":"text","text":"Official [SwiftUI documentation](https://developer.apple.com/documentation/SwiftUI/View/frame(width:height:alignment:))."}]}]},"parameters":[{"name":"params","variant":"param","kind":32768,"comment":{"summary":[{"kind":"text","text":"The frame parameters. Width, height, minWidth, maxWidth, minHeight, maxHeight, idealWidth, idealHeight and alignment."}]},"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"children":[{"name":"alignment","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"union","types":[{"type":"literal","value":"center"},{"type":"literal","value":"top"},{"type":"literal","value":"bottom"},{"type":"literal","value":"topLeading"},{"type":"literal","value":"topTrailing"},{"type":"literal","value":"leading"},{"type":"literal","value":"trailing"},{"type":"literal","value":"bottomLeading"},{"type":"literal","value":"bottomTrailing"}]}},{"name":"height","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"intrinsic","name":"number"}},{"name":"idealHeight","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"intrinsic","name":"number"}},{"name":"idealWidth","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"intrinsic","name":"number"}},{"name":"maxHeight","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"intrinsic","name":"number"}},{"name":"maxWidth","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"intrinsic","name":"number"}},{"name":"minHeight","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"intrinsic","name":"number"}},{"name":"minWidth","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"intrinsic","name":"number"}},{"name":"width","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"intrinsic","name":"number"}}]}}}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"gaugeStyle","variant":"declaration","kind":64,"signatures":[{"name":"gaugeStyle","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Sets the style for the gauge."}],"blockTags":[{"tag":"@see","content":[{"kind":"text","text":"Official [SwiftUI documentation](https://developer.apple.com/documentation/swiftui/gaugestyle)."}]}]},"parameters":[{"name":"style","variant":"param","kind":32768,"comment":{"summary":[{"kind":"text","text":"The style for the gauge."}]},"type":{"type":"reference","name":"GaugeStyleType","package":"@expo/ui"}}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"glassEffect","variant":"declaration","kind":64,"signatures":[{"name":"glassEffect","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Applies a glass effect to a view."}],"blockTags":[{"tag":"@see","content":[{"kind":"text","text":"Official [SwiftUI documentation](https://developer.apple.com/documentation/swiftui/view/glasseffect(_:in:))."}]}]},"parameters":[{"name":"params","variant":"param","kind":32768,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"The glass effect parameters. Variant, interactive, tint and shape."}]},"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"children":[{"name":"cornerRadius","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"intrinsic","name":"number"}},{"name":"glass","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"children":[{"name":"interactive","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"intrinsic","name":"boolean"}},{"name":"tint","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"reference","name":"Color","package":"@expo/ui"}},{"name":"variant","variant":"declaration","kind":1024,"type":{"type":"union","types":[{"type":"literal","value":"clear"},{"type":"literal","value":"regular"},{"type":"literal","value":"identity"}]}}]}}},{"name":"shape","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"union","types":[{"type":"literal","value":"roundedRectangle"},{"type":"literal","value":"capsule"},{"type":"literal","value":"rectangle"},{"type":"literal","value":"ellipse"},{"type":"literal","value":"circle"},{"type":"literal","value":"containerRelativeShape"}]}}]}}}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"glassEffectId","variant":"declaration","kind":64,"signatures":[{"name":"glassEffectId","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Associates an identity value to Liquid Glass effects defined within a "},{"kind":"code","text":"`GlassEffectContainer`"},{"kind":"text","text":"."}],"blockTags":[{"tag":"@see","content":[{"kind":"text","text":"Official [SwiftUI documentation](https://developer.apple.com/documentation/swiftui/view/glasseffectid(_:in:))."}]}]},"parameters":[{"name":"id","variant":"param","kind":32768,"comment":{"summary":[{"kind":"text","text":"The id of the glass effect."}]},"type":{"type":"intrinsic","name":"string"}},{"name":"namespaceId","variant":"param","kind":32768,"comment":{"summary":[{"kind":"text","text":"The namespace id of the glass effect. Use Namespace component to create a namespace."}]},"type":{"type":"intrinsic","name":"string"}}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"grayscale","variant":"declaration","kind":64,"signatures":[{"name":"grayscale","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Makes a view grayscale."}],"blockTags":[{"tag":"@see","content":[{"kind":"text","text":"Official [SwiftUI documentation](https://developer.apple.com/documentation/swiftui/view/grayscale(_:))."}]}]},"parameters":[{"name":"amount","variant":"param","kind":32768,"comment":{"summary":[{"kind":"text","text":"Grayscale amount (0 to 1)."}]},"type":{"type":"intrinsic","name":"number"}}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"gridCellAnchor","variant":"declaration","kind":64,"signatures":[{"name":"gridCellAnchor","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Specifies a custom alignment anchor for a view that acts as a grid cell."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"A view that uses the specified anchor point to align its content."}]},{"tag":"@platform","content":[{"kind":"text","text":"iOS 16+"}]},{"tag":"@example","content":[{"kind":"code","text":"```tsx\n// Using a preset anchor\n\n\n// Using a custom anchor point\n\n```"}]}]},"parameters":[{"name":"anchor","variant":"param","kind":32768,"comment":{"summary":[{"kind":"text","text":"The unit point that defines how to align the view within the bounds of its grid cell."}]},"type":{"type":"union","types":[{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"children":[{"name":"anchor","variant":"declaration","kind":1024,"type":{"type":"union","types":[{"type":"literal","value":"center"},{"type":"literal","value":"top"},{"type":"literal","value":"bottom"},{"type":"literal","value":"zero"},{"type":"literal","value":"topLeading"},{"type":"literal","value":"topTrailing"},{"type":"literal","value":"leading"},{"type":"literal","value":"trailing"},{"type":"literal","value":"bottomLeading"},{"type":"literal","value":"bottomTrailing"}]}},{"name":"type","variant":"declaration","kind":1024,"type":{"type":"literal","value":"preset"}}]}},{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"children":[{"name":"points","variant":"declaration","kind":1024,"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"children":[{"name":"x","variant":"declaration","kind":1024,"type":{"type":"intrinsic","name":"number"}},{"name":"y","variant":"declaration","kind":1024,"type":{"type":"intrinsic","name":"number"}}]}}},{"name":"type","variant":"declaration","kind":1024,"type":{"type":"literal","value":"custom"}}]}}]}}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"gridCellColumns","variant":"declaration","kind":64,"signatures":[{"name":"gridCellColumns","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Tells a view that acts as a cell in a grid to span the specified number of columns."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"A view that occupies the specified number of columns in a grid row."}]}]},"parameters":[{"name":"count","variant":"param","kind":32768,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"The number of columns that the view should consume when placed in a grid row."}]},"type":{"type":"intrinsic","name":"number"}}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"gridCellUnsizedAxes","variant":"declaration","kind":64,"signatures":[{"name":"gridCellUnsizedAxes","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Asks grid layouts not to offer the view extra size in the specified axes."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"A view that doesn’t ask an enclosing grid for extra size in one or more axes."}]}]},"parameters":[{"name":"axes","variant":"param","kind":32768,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"The dimensions in which the grid shouldn’t offer the view a share of any available space. This prevents a flexible view like a Spacer, Divider, or Color from defining the size of a row or column."}]},"type":{"type":"union","types":[{"type":"literal","value":"horizontal"},{"type":"literal","value":"vertical"}]}}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"gridColumnAlignment","variant":"declaration","kind":64,"signatures":[{"name":"gridColumnAlignment","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Overrides the default horizontal alignment of the grid column that the view appears in."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"A view that uses the specified horizontal alignment, and that causes all cells in the same column of a grid to use the same alignment."}]},{"tag":"@platform","content":[{"kind":"text","text":"iOS 16+"}]}]},"parameters":[{"name":"alignment","variant":"param","kind":32768,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"The HorizontalAlignment guide to use for the grid column that the view appears in."}]},"type":{"type":"union","types":[{"type":"literal","value":"center"},{"type":"literal","value":"leading"},{"type":"literal","value":"trailing"}]}}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"headerProminence","variant":"declaration","kind":64,"signatures":[{"name":"headerProminence","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Sets the header prominence for this view."}]},"parameters":[{"name":"prominence","variant":"param","kind":32768,"comment":{"summary":[{"kind":"text","text":"The prominence to apply."}]},"type":{"type":"union","types":[{"type":"literal","value":"standard"},{"type":"literal","value":"increased"}]}}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"hidden","variant":"declaration","kind":64,"signatures":[{"name":"hidden","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Hides or shows a view."}],"blockTags":[{"tag":"@see","content":[{"kind":"text","text":"Official [SwiftUI documentation](https://developer.apple.com/documentation/swiftui/view/hidden(_:))."}]}]},"parameters":[{"name":"hidden","variant":"param","kind":32768,"comment":{"summary":[{"kind":"text","text":"Whether the view should be hidden."}]},"type":{"type":"intrinsic","name":"boolean"},"defaultValue":"true"}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"hueRotation","variant":"declaration","kind":64,"signatures":[{"name":"hueRotation","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Applies a hue rotation to a view."}],"blockTags":[{"tag":"@see","content":[{"kind":"text","text":"Official [SwiftUI documentation](https://developer.apple.com/documentation/swiftui/view/huerotation(_:))."}]}]},"parameters":[{"name":"angle","variant":"param","kind":32768,"comment":{"summary":[{"kind":"text","text":"Hue rotation angle in degrees."}]},"type":{"type":"intrinsic","name":"number"}}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"id","variant":"declaration","kind":64,"signatures":[{"name":"id","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Attaches a stable identifier to a view so it can be referenced by scroll target bindings.\nUse with "},{"kind":"code","text":"`scrollTargetLayout()`"},{"kind":"text","text":" on the containing stack and the "},{"kind":"code","text":"`scrollPosition`"},{"kind":"text","text":" modifier on a scrollable container."}],"blockTags":[{"tag":"@see","content":[{"kind":"text","text":"Official [SwiftUI documentation](https://developer.apple.com/documentation/swiftui/view/id(_:))."}]}]},"parameters":[{"name":"value","variant":"param","kind":32768,"comment":{"summary":[{"kind":"text","text":"String identifier matched by "},{"kind":"code","text":"`scrollPosition`"},{"kind":"text","text":"'s observable state."}]},"type":{"type":"intrinsic","name":"string"}}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"ignoreSafeArea","variant":"declaration","kind":64,"signatures":[{"name":"ignoreSafeArea","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Allows a view to ignore safe area constraints."}],"blockTags":[{"tag":"@see","content":[{"kind":"text","text":"Official [SwiftUI documentation](https://developer.apple.com/documentation/swiftui/view/ignoressafearea(_:edges:))."}]}]},"parameters":[{"name":"params","variant":"param","kind":32768,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"The safe area regions to ignore and the edges to expand into."}]},"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"children":[{"name":"edges","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"union","types":[{"type":"literal","value":"top"},{"type":"literal","value":"bottom"},{"type":"literal","value":"leading"},{"type":"literal","value":"trailing"},{"type":"literal","value":"horizontal"},{"type":"literal","value":"vertical"},{"type":"literal","value":"all"}]}},{"name":"regions","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"union","types":[{"type":"literal","value":"container"},{"type":"literal","value":"all"},{"type":"literal","value":"keyboard"}]}}]}}}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"indexViewStyle","variant":"declaration","kind":64,"signatures":[{"name":"indexViewStyle","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Sets the style for the page index view inside a "},{"kind":"code","text":"`TabView`"},{"kind":"text","text":". SwiftUI only\nships a "},{"kind":"code","text":"`.page`"},{"kind":"text","text":" index view style, so no style selector is exposed."}],"blockTags":[{"tag":"@see","content":[{"kind":"text","text":"Official [SwiftUI documentation](https://developer.apple.com/documentation/swiftui/view/indexviewstyle(_:))."}]}]},"parameters":[{"name":"config","variant":"param","kind":32768,"type":{"type":"reference","name":"IndexViewStyleConfig","package":"@expo/ui"},"defaultValue":"{}"}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"interactiveDismissDisabled","variant":"declaration","kind":64,"signatures":[{"name":"interactiveDismissDisabled","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Disables interactive dismissal of a sheet."}],"blockTags":[{"tag":"@see","content":[{"kind":"text","text":"Official [SwiftUI documentation](https://developer.apple.com/documentation/swiftui/view/interactivedismissdisabled(_:))."}]}]},"parameters":[{"name":"isDisabled","variant":"param","kind":32768,"comment":{"summary":[{"kind":"text","text":"Whether interactive dismiss is disabled (default: true)."}]},"type":{"type":"intrinsic","name":"boolean"},"defaultValue":"true"}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"italic","variant":"declaration","kind":64,"signatures":[{"name":"italic","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Makes text italic.\nWhen applied to "},{"kind":"code","text":"`Text`"},{"kind":"text","text":", it works on all iOS/tvOS versions. When used on regular views, it requires iOS 16.0+/tvOS 16.0+."}],"blockTags":[{"tag":"@see","content":[{"kind":"text","text":"Official [SwiftUI documentation](https://developer.apple.com/documentation/swiftui/text/italic())."}]}]},"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"kerning","variant":"declaration","kind":64,"signatures":[{"name":"kerning","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Sets the spacing, or kerning, between characters for the text in this view."}],"blockTags":[{"tag":"@default","content":[{"kind":"text","text":"0"}]},{"tag":"@see","content":[{"kind":"text","text":"Official [SwiftUI documentation](https://developer.apple.com/documentation/swiftui/view/kerning(_:))."}]}]},"parameters":[{"name":"value","variant":"param","kind":32768,"flags":{"isOptional":true},"type":{"type":"intrinsic","name":"number"}}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"keyboardType","variant":"declaration","kind":64,"signatures":[{"name":"keyboardType","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Sets the keyboard type for text input views."}],"blockTags":[{"tag":"@see","content":[{"kind":"text","text":"Official [SwiftUI documentation](https://developer.apple.com/documentation/swiftui/view/keyboardtype(_:))."}]}]},"parameters":[{"name":"keyboardType","variant":"param","kind":32768,"comment":{"summary":[{"kind":"text","text":"The type of keyboard to display."}]},"type":{"type":"union","types":[{"type":"literal","value":"default"},{"type":"literal","value":"url"},{"type":"literal","value":"email-address"},{"type":"literal","value":"numeric"},{"type":"literal","value":"phone-pad"},{"type":"literal","value":"ascii-capable"},{"type":"literal","value":"numbers-and-punctuation"},{"type":"literal","value":"name-phone-pad"},{"type":"literal","value":"decimal-pad"},{"type":"literal","value":"twitter"},{"type":"literal","value":"web-search"},{"type":"literal","value":"ascii-capable-number-pad"}]}}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"labelsHidden","variant":"declaration","kind":64,"signatures":[{"name":"labelsHidden","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Hides the labels of any controls contained within this view."}],"blockTags":[{"tag":"@see","content":[{"kind":"text","text":"Official [SwiftUI documentation](https://developer.apple.com/documentation/swiftui/view/labelshidden())."}]}]},"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"labelStyle","variant":"declaration","kind":64,"signatures":[{"name":"labelStyle","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Sets the style for labels within this view."}],"blockTags":[{"tag":"@see","content":[{"kind":"text","text":"Official [SwiftUI documentation](https://developer.apple.com/documentation/swiftui/view/labelstyle(_:))."}]}]},"parameters":[{"name":"style","variant":"param","kind":32768,"comment":{"summary":[{"kind":"text","text":"The label style."}]},"type":{"type":"union","types":[{"type":"literal","value":"automatic"},{"type":"literal","value":"iconOnly"},{"type":"literal","value":"titleAndIcon"},{"type":"literal","value":"titleOnly"}]}}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"layoutPriority","variant":"declaration","kind":64,"signatures":[{"name":"layoutPriority","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Sets layout priority for the view."}],"blockTags":[{"tag":"@see","content":[{"kind":"text","text":"Official [SwiftUI documentation](https://developer.apple.com/documentation/swiftui/view/layoutpriority(_:))."}]}]},"parameters":[{"name":"priority","variant":"param","kind":32768,"comment":{"summary":[{"kind":"text","text":"Layout priority value."}]},"type":{"type":"intrinsic","name":"number"}}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"lineHeight","variant":"declaration","kind":64,"signatures":[{"name":"lineHeight","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Sets the total line height for text in this view."}],"blockTags":[{"tag":"@platform","content":[{"kind":"text","text":"ios 26.0+"}]},{"tag":"@platform","content":[{"kind":"text","text":"macos 26.0+"}]},{"tag":"@platform","content":[{"kind":"text","text":"tvos 26.0+"}]},{"tag":"@see","content":[{"kind":"text","text":"Official [SwiftUI documentation](https://developer.apple.com/documentation/swiftui/view/lineheight(_:))."}]}]},"parameters":[{"name":"value","variant":"param","kind":32768,"comment":{"summary":[{"kind":"text","text":"The line height in points."}]},"type":{"type":"intrinsic","name":"number"}}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"lineLimit","variant":"declaration","kind":64,"signatures":[{"name":"lineLimit","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Sets the line limit for text in the view.\n\nFour variants matching SwiftUI:\n- "},{"kind":"code","text":"`lineLimit()`"},{"kind":"text","text":" — no line limit (unlimited lines)\n- "},{"kind":"code","text":"`lineLimit(5)`"},{"kind":"text","text":" — max 5 lines\n- "},{"kind":"code","text":"`lineLimit(5, { reservesSpace: true })`"},{"kind":"text","text":" — max 5 lines, reserves height even when empty (iOS 16+, tvOS 16+)\n- "},{"kind":"code","text":"`lineLimit({ min: 3, max: 8 })`"},{"kind":"text","text":" — range of 3 to 8 lines (iOS 16+, tvOS 16+)"}],"blockTags":[{"tag":"@see","content":[{"kind":"text","text":"Official [SwiftUI documentation](https://developer.apple.com/documentation/swiftui/view/linelimit(_:))."}]}]},"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}},{"name":"lineLimit","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Sets the line limit for text in the view.\n\nFour variants matching SwiftUI:\n- "},{"kind":"code","text":"`lineLimit()`"},{"kind":"text","text":" — no line limit (unlimited lines)\n- "},{"kind":"code","text":"`lineLimit(5)`"},{"kind":"text","text":" — max 5 lines\n- "},{"kind":"code","text":"`lineLimit(5, { reservesSpace: true })`"},{"kind":"text","text":" — max 5 lines, reserves height even when empty (iOS 16+, tvOS 16+)\n- "},{"kind":"code","text":"`lineLimit({ min: 3, max: 8 })`"},{"kind":"text","text":" — range of 3 to 8 lines (iOS 16+, tvOS 16+)"}],"blockTags":[{"tag":"@see","content":[{"kind":"text","text":"Official [SwiftUI documentation](https://developer.apple.com/documentation/swiftui/view/linelimit(_:))."}]}]},"parameters":[{"name":"limit","variant":"param","kind":32768,"type":{"type":"intrinsic","name":"number"}},{"name":"options","variant":"param","kind":32768,"flags":{"isOptional":true},"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"children":[{"name":"reservesSpace","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"intrinsic","name":"boolean"}}]}}}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}},{"name":"lineLimit","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Sets the line limit for text in the view.\n\nFour variants matching SwiftUI:\n- "},{"kind":"code","text":"`lineLimit()`"},{"kind":"text","text":" — no line limit (unlimited lines)\n- "},{"kind":"code","text":"`lineLimit(5)`"},{"kind":"text","text":" — max 5 lines\n- "},{"kind":"code","text":"`lineLimit(5, { reservesSpace: true })`"},{"kind":"text","text":" — max 5 lines, reserves height even when empty (iOS 16+, tvOS 16+)\n- "},{"kind":"code","text":"`lineLimit({ min: 3, max: 8 })`"},{"kind":"text","text":" — range of 3 to 8 lines (iOS 16+, tvOS 16+)"}],"blockTags":[{"tag":"@see","content":[{"kind":"text","text":"Official [SwiftUI documentation](https://developer.apple.com/documentation/swiftui/view/linelimit(_:))."}]}]},"parameters":[{"name":"range","variant":"param","kind":32768,"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"children":[{"name":"max","variant":"declaration","kind":1024,"type":{"type":"intrinsic","name":"number"}},{"name":"min","variant":"declaration","kind":1024,"type":{"type":"intrinsic","name":"number"}}]}}}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"lineSpacing","variant":"declaration","kind":64,"signatures":[{"name":"lineSpacing","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"The distance in points between the bottom of one line fragment and the top of the next."}],"blockTags":[{"tag":"@see","content":[{"kind":"text","text":"Official [SwiftUI documentation](https://developer.apple.com/documentation/swiftui/view/linespacing(_:))."}]}]},"parameters":[{"name":"value","variant":"param","kind":32768,"comment":{"summary":[{"kind":"text","text":"The amount of space between the bottom of one line and the top of the next line in points. This value is always nonnegative. Otherwise, the default value will be used."}]},"type":{"type":"intrinsic","name":"number"}}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"listRowBackground","variant":"declaration","kind":64,"signatures":[{"name":"listRowBackground","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Sets the background of a row."}],"blockTags":[{"tag":"@see","content":[{"kind":"text","text":"Official [SwiftUI documentation](https://developer.apple.com/documentation/swiftui/view/listrowbackground(_:))."}]}]},"parameters":[{"name":"color","variant":"param","kind":32768,"comment":{"summary":[{"kind":"text","text":"The row color (hex string). For example, "},{"kind":"code","text":"`#FF0000`"},{"kind":"text","text":"."}]},"type":{"type":"reference","name":"Color","package":"@expo/ui"}}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"listRowInsets","variant":"declaration","kind":64,"signatures":[{"name":"listRowInsets","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Applies an inset to the rows in a list."}],"blockTags":[{"tag":"@see","content":[{"kind":"text","text":"Official [SwiftUI documentation](https://developer.apple.com/documentation/swiftui/view/listrowinsets(_:))."}]}]},"parameters":[{"name":"params","variant":"param","kind":32768,"comment":{"summary":[{"kind":"text","text":"The inset to apply to the rows in a list."}]},"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"children":[{"name":"bottom","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"intrinsic","name":"number"}},{"name":"leading","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"intrinsic","name":"number"}},{"name":"top","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"intrinsic","name":"number"}},{"name":"trailing","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"intrinsic","name":"number"}}]}}}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"listRowSeparator","variant":"declaration","kind":64,"signatures":[{"name":"listRowSeparator","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Controls the visibility of the separator for a list row."}],"blockTags":[{"tag":"@see","content":[{"kind":"text","text":"Official [SwiftUI documentation](https://developer.apple.com/documentation/swiftui/view/listrowseparator(_:edges:))."}]}]},"parameters":[{"name":"visibility","variant":"param","kind":32768,"comment":{"summary":[{"kind":"text","text":"The visibility to apply."}]},"type":{"type":"union","types":[{"type":"literal","value":"automatic"},{"type":"literal","value":"visible"},{"type":"literal","value":"hidden"}]}},{"name":"edges","variant":"param","kind":32768,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"The edges where the separator visibility applies."}]},"type":{"type":"union","types":[{"type":"literal","value":"top"},{"type":"literal","value":"bottom"},{"type":"literal","value":"all"}]}}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"listSectionMargins","variant":"declaration","kind":64,"signatures":[{"name":"listSectionMargins","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Allows a view to ignore safe area constraints."}],"blockTags":[{"tag":"@platform","content":[{"kind":"text","text":"iOS 26+"}]},{"tag":"@see","content":[{"kind":"text","text":"Official [SwiftUI documentation](https://developer.apple.com/documentation/swiftui/view/listsectionmargins(_:_:))."}]}]},"parameters":[{"name":"params","variant":"param","kind":32768,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"The margins to apply to the section in a list."}]},"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"children":[{"name":"edges","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"union","types":[{"type":"literal","value":"top"},{"type":"literal","value":"bottom"},{"type":"literal","value":"leading"},{"type":"literal","value":"trailing"},{"type":"literal","value":"horizontal"},{"type":"literal","value":"vertical"},{"type":"literal","value":"all"}]}},{"name":"length","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"intrinsic","name":"number"}}]}}}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"listSectionSpacing","variant":"declaration","kind":64,"signatures":[{"name":"listSectionSpacing","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Sets the spacing between adjacent sections."}],"blockTags":[{"tag":"@platform","content":[{"kind":"text","text":"ios 17.0+"}]}]},"parameters":[{"name":"spacing","variant":"param","kind":32768,"comment":{"summary":[{"kind":"text","text":"The spacing to apply."}]},"type":{"type":"union","types":[{"type":"intrinsic","name":"number"},{"type":"literal","value":"default"},{"type":"literal","value":"compact"}]}}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"listStyle","variant":"declaration","kind":64,"signatures":[{"name":"listStyle","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Sets the style for a List view."}],"blockTags":[{"tag":"@see","content":[{"kind":"text","text":"Official [SwiftUI documentation](https://developer.apple.com/documentation/swiftui/view/liststyle(_:))."}]}]},"parameters":[{"name":"style","variant":"param","kind":32768,"comment":{"summary":[{"kind":"text","text":"The list style to apply."}]},"type":{"type":"reference","name":"ListStyle","package":"@expo/ui"}}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"luminanceToAlpha","variant":"declaration","kind":64,"signatures":[{"name":"luminanceToAlpha","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Adds a luminance to alpha effect to this view."}],"blockTags":[{"tag":"@see","content":[{"kind":"text","text":"Official [SwiftUI documentation](https://developer.apple.com/documentation/SwiftUI/View/luminanceToAlpha())."}]}]},"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"mask","variant":"declaration","kind":64,"signatures":[{"name":"mask","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Applies a mask to the view."}],"blockTags":[{"tag":"@see","content":[{"kind":"text","text":"Official [SwiftUI documentation](https://developer.apple.com/documentation/swiftui/view/mask(_:))."}]}]},"parameters":[{"name":"shape","variant":"param","kind":32768,"comment":{"summary":[{"kind":"text","text":"The masking shape."}]},"type":{"type":"union","types":[{"type":"literal","value":"roundedRectangle"},{"type":"literal","value":"capsule"},{"type":"literal","value":"rectangle"},{"type":"literal","value":"ellipse"},{"type":"literal","value":"circle"},{"type":"literal","value":"containerRelativeShape"}]}},{"name":"cornerRadius","variant":"param","kind":32768,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Corner radius for rounded rectangle (default: "},{"kind":"code","text":"`8`"},{"kind":"text","text":")."}]},"type":{"type":"intrinsic","name":"number"}}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"matchedGeometryEffect","variant":"declaration","kind":64,"signatures":[{"name":"matchedGeometryEffect","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Adds a matched geometry effect to a view."}],"blockTags":[{"tag":"@see","content":[{"kind":"text","text":"Official [SwiftUI documentation](https://developer.apple.com/documentation/swiftui/view/matchedgeometryeffect(id:in:properties:anchor:issource:))."}]}]},"parameters":[{"name":"id","variant":"param","kind":32768,"comment":{"summary":[{"kind":"text","text":"The id of the view."}]},"type":{"type":"intrinsic","name":"string"}},{"name":"namespaceId","variant":"param","kind":32768,"comment":{"summary":[{"kind":"text","text":"The namespace id of the view. Use Namespace component to create a namespace."}]},"type":{"type":"intrinsic","name":"string"}}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"menuActionDismissBehavior","variant":"declaration","kind":64,"signatures":[{"name":"menuActionDismissBehavior","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Controls the dismissal behavior of menu actions."}],"blockTags":[{"tag":"@platform","content":[{"kind":"text","text":"ios 16.4+"}]},{"tag":"@platform","content":[{"kind":"text","text":"tvos 17.0+"}]},{"tag":"@see","content":[{"kind":"text","text":"Official [SwiftUI documentation](https://developer.apple.com/documentation/swiftui/view/menuactiondismissbehavior(_:))."}]}]},"parameters":[{"name":"behavior","variant":"param","kind":32768,"comment":{"summary":[{"kind":"text","text":"The menu action dismiss behavior."}]},"type":{"type":"union","types":[{"type":"literal","value":"automatic"},{"type":"literal","value":"enabled"},{"type":"literal","value":"disabled"}]}}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"monospacedDigit","variant":"declaration","kind":64,"signatures":[{"name":"monospacedDigit","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Modifies the fonts of all child views to use fixed-width digits, if possible, while leaving other characters proportionally spaced.\nWhen applied to "},{"kind":"code","text":"`Text`"},{"kind":"text","text":", modifies the text view's font to use fixed-width digits, while leaving other characters proportionally spaced."}],"blockTags":[{"tag":"@see","content":[{"kind":"text","text":"Official [SwiftUI documentation](https://developer.apple.com/documentation/swiftui/view/monospaceddigit())."}]}]},"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"moveDisabled","variant":"declaration","kind":64,"signatures":[{"name":"moveDisabled","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Disables the move action for a view in a list.\nApply to items within a "},{"kind":"code","text":"`ForEach`"},{"kind":"text","text":" to prevent them from being moved."}],"blockTags":[{"tag":"@default","content":[{"kind":"text","text":"true"}]},{"tag":"@see","content":[{"kind":"text","text":"Official [SwiftUI documentation](https://developer.apple.com/documentation/swiftui/view/movedisabled(_:))."}]}]},"parameters":[{"name":"disabled","variant":"param","kind":32768,"comment":{"summary":[{"kind":"text","text":"Whether moving should be disabled"}]},"type":{"type":"intrinsic","name":"boolean"},"defaultValue":"true"}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"multilineTextAlignment","variant":"declaration","kind":64,"signatures":[{"name":"multilineTextAlignment","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"An alignment position for text along the horizontal axis."}],"blockTags":[{"tag":"@see","content":[{"kind":"text","text":"Official [SwiftUI documentation](https://developer.apple.com/documentation/swiftui/view/multilinetextalignment(_:))."}]}]},"parameters":[{"name":"alignment","variant":"param","kind":32768,"comment":{"summary":[{"kind":"text","text":"A value that you use to align multiple lines of text within a view."}]},"type":{"type":"union","types":[{"type":"literal","value":"center"},{"type":"literal","value":"leading"},{"type":"literal","value":"trailing"}]}}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"offset","variant":"declaration","kind":64,"signatures":[{"name":"offset","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Applies an offset (translation) to a view."}],"blockTags":[{"tag":"@see","content":[{"kind":"text","text":"Official [SwiftUI documentation](https://developer.apple.com/documentation/swiftui/view/offset(x:y:))."}]}]},"parameters":[{"name":"params","variant":"param","kind":32768,"comment":{"summary":[{"kind":"text","text":"The offset parameters: "},{"kind":"code","text":"`x`"},{"kind":"text","text":" and "},{"kind":"code","text":"`y`"},{"kind":"text","text":"."}]},"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"children":[{"name":"x","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"intrinsic","name":"number"}},{"name":"y","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"intrinsic","name":"number"}}]}}}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"onAppear","variant":"declaration","kind":64,"signatures":[{"name":"onAppear","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Adds an onAppear modifier that calls a function when the view appears."}],"blockTags":[{"tag":"@see","content":[{"kind":"text","text":"Official [SwiftUI documentation](https://developer.apple.com/documentation/swiftui/view/onappear(perform:))."}]}]},"parameters":[{"name":"handler","variant":"param","kind":32768,"comment":{"summary":[{"kind":"text","text":"Function to call when the view appears."}]},"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"signatures":[{"name":"__type","variant":"signature","kind":4096,"type":{"type":"intrinsic","name":"void"}}]}}}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"onDisappear","variant":"declaration","kind":64,"signatures":[{"name":"onDisappear","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Adds an onDisappear modifier that calls a function when the view disappears."}],"blockTags":[{"tag":"@see","content":[{"kind":"text","text":"Official [SwiftUI documentation](https://developer.apple.com/documentation/swiftui/view/ondisappear(perform:))."}]}]},"parameters":[{"name":"handler","variant":"param","kind":32768,"comment":{"summary":[{"kind":"text","text":"Function to call when the view disappears."}]},"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"signatures":[{"name":"__type","variant":"signature","kind":4096,"type":{"type":"intrinsic","name":"void"}}]}}}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"onGeometryChange","variant":"declaration","kind":64,"signatures":[{"name":"onGeometryChange","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Calls the handler whenever the view's geometry changes. Sizes are in points."}],"blockTags":[{"tag":"@see","content":[{"kind":"text","text":"Official [SwiftUI documentation](https://developer.apple.com/documentation/swiftui/view/ongeometrychange(for:of:action:))."}]}]},"parameters":[{"name":"handler","variant":"param","kind":32768,"comment":{"summary":[{"kind":"text","text":"Function called with the new size."}]},"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"signatures":[{"name":"__type","variant":"signature","kind":4096,"parameters":[{"name":"size","variant":"param","kind":32768,"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"children":[{"name":"height","variant":"declaration","kind":1024,"type":{"type":"intrinsic","name":"number"}},{"name":"width","variant":"declaration","kind":1024,"type":{"type":"intrinsic","name":"number"}}]}}}],"type":{"type":"intrinsic","name":"void"}}]}}}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"onLongPressGesture","variant":"declaration","kind":64,"signatures":[{"name":"onLongPressGesture","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Adds a long press gesture recognizer."}]},"parameters":[{"name":"handler","variant":"param","kind":32768,"comment":{"summary":[{"kind":"text","text":"Function to call when long pressed."}]},"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"signatures":[{"name":"__type","variant":"signature","kind":4096,"type":{"type":"intrinsic","name":"void"}}]}}},{"name":"minimumDuration","variant":"param","kind":32768,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Minimum duration for long press (default: 0.5s)"}]},"type":{"type":"intrinsic","name":"number"}}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"onSubmit","variant":"declaration","kind":64,"signatures":[{"name":"onSubmit","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Adds an action to perform when the user submits a value to this view (e.g. pressing return in a text field)."}],"blockTags":[{"tag":"@see","content":[{"kind":"text","text":"Official [SwiftUI documentation](https://developer.apple.com/documentation/swiftui/view/onsubmit(of:_:))."}]}]},"parameters":[{"name":"handler","variant":"param","kind":32768,"comment":{"summary":[{"kind":"text","text":"Function to call on submit."}]},"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"signatures":[{"name":"__type","variant":"signature","kind":4096,"type":{"type":"intrinsic","name":"void"}}]}}}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"onTapGesture","variant":"declaration","kind":64,"signatures":[{"name":"onTapGesture","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Adds a tap gesture recognizer."}],"blockTags":[{"tag":"@see","content":[{"kind":"text","text":"Official [SwiftUI documentation](https://developer.apple.com/documentation/swiftui/view/ontapgesture(count:perform:))."}]}]},"parameters":[{"name":"handler","variant":"param","kind":32768,"comment":{"summary":[{"kind":"text","text":"Function to call when tapped."}]},"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"signatures":[{"name":"__type","variant":"signature","kind":4096,"type":{"type":"intrinsic","name":"void"}}]}}}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"opacity","variant":"declaration","kind":64,"signatures":[{"name":"opacity","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Sets the opacity of a view."}],"blockTags":[{"tag":"@see","content":[{"kind":"text","text":"Official [SwiftUI documentation](https://developer.apple.com/documentation/swiftui/view/opacity(_:))."}]}]},"parameters":[{"name":"value","variant":"param","kind":32768,"comment":{"summary":[{"kind":"text","text":"Opacity value between 0 and 1."}]},"type":{"type":"intrinsic","name":"number"}}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"overlay","variant":"declaration","kind":64,"signatures":[{"name":"overlay","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Overlays another view on top."}],"blockTags":[{"tag":"@see","content":[{"kind":"text","text":"Official [SwiftUI documentation](https://developer.apple.com/documentation/swiftui/view/overlay(_:alignment:))."}]}]},"parameters":[{"name":"params","variant":"param","kind":32768,"comment":{"summary":[{"kind":"text","text":"Overlay color and alignment."}]},"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"children":[{"name":"alignment","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"union","types":[{"type":"literal","value":"center"},{"type":"literal","value":"top"},{"type":"literal","value":"bottom"},{"type":"literal","value":"leading"},{"type":"literal","value":"trailing"}]}},{"name":"color","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"reference","name":"Color","package":"@expo/ui"}}]}}}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"padding","variant":"declaration","kind":64,"signatures":[{"name":"padding","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Sets padding on a view.\nSupports individual edges or shorthand properties."}],"blockTags":[{"tag":"@see","content":[{"kind":"text","text":"Official [SwiftUI documentation](https://developer.apple.com/documentation/SwiftUI/View/padding(_:_:))."}]}]},"parameters":[{"name":"params","variant":"param","kind":32768,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"The padding parameters: "},{"kind":"code","text":"`top`"},{"kind":"text","text":", "},{"kind":"code","text":"`bottom`"},{"kind":"text","text":", "},{"kind":"code","text":"`leading`"},{"kind":"text","text":", "},{"kind":"code","text":"`trailing`"},{"kind":"text","text":", "},{"kind":"code","text":"`horizontal`"},{"kind":"text","text":", "},{"kind":"code","text":"`vertical`"},{"kind":"text","text":" and "},{"kind":"code","text":"`all`"},{"kind":"text","text":"."}]},"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"children":[{"name":"all","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"intrinsic","name":"number"}},{"name":"bottom","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"intrinsic","name":"number"}},{"name":"horizontal","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"intrinsic","name":"number"}},{"name":"leading","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"intrinsic","name":"number"}},{"name":"top","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"intrinsic","name":"number"}},{"name":"trailing","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"intrinsic","name":"number"}},{"name":"vertical","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"intrinsic","name":"number"}}]}}}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"pickerStyle","variant":"declaration","kind":64,"signatures":[{"name":"pickerStyle","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Sets the style for the picker."}],"blockTags":[{"tag":"@see","content":[{"kind":"text","text":"Official [SwiftUI documentation](https://developer.apple.com/documentation/swiftui/pickerstyle)."}]}]},"parameters":[{"name":"style","variant":"param","kind":32768,"comment":{"summary":[{"kind":"text","text":"The style for the picker."}]},"type":{"type":"reference","name":"PickerStyleType","package":"@expo/ui"}}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"presentationBackgroundInteraction","variant":"declaration","kind":64,"signatures":[{"name":"presentationBackgroundInteraction","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Controls interaction with the content behind a sheet."}],"blockTags":[{"tag":"@platform","content":[{"kind":"text","text":"ios 16.4+"}]},{"tag":"@platform","content":[{"kind":"text","text":"tvos 16.4+"}]},{"tag":"@see","content":[{"kind":"text","text":"Official [SwiftUI documentation](https://developer.apple.com/documentation/swiftui/view/presentationbackgroundinteraction(_:))."}]}]},"parameters":[{"name":"interaction","variant":"param","kind":32768,"comment":{"summary":[{"kind":"text","text":"The background interaction behavior."}]},"type":{"type":"reference","name":"PresentationBackgroundInteractionType","package":"@expo/ui"}}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"presentationDetents","variant":"declaration","kind":64,"signatures":[{"name":"presentationDetents","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Sets the available heights for a sheet presentation."}],"blockTags":[{"tag":"@platform","content":[{"kind":"text","text":"ios 16.0+"}]},{"tag":"@platform","content":[{"kind":"text","text":"tvos 16.0+"}]},{"tag":"@see","content":[{"kind":"text","text":"Official [SwiftUI documentation](https://developer.apple.com/documentation/swiftui/view/presentationdetents(_:selection:))."}]}]},"parameters":[{"name":"detents","variant":"param","kind":32768,"comment":{"summary":[{"kind":"text","text":"Array of detents the sheet can snap to."}]},"type":{"type":"array","elementType":{"type":"reference","name":"PresentationDetent","package":"@expo/ui"}}},{"name":"options","variant":"param","kind":32768,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Optional settings for tracking the selected detent."}]},"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"children":[{"name":"onSelectionChange","variant":"declaration","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Callback fired when the user changes the active detent by dragging."}]},"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"signatures":[{"name":"__type","variant":"signature","kind":4096,"parameters":[{"name":"detent","variant":"param","kind":32768,"type":{"type":"reference","name":"PresentationDetent","package":"@expo/ui"}}],"type":{"type":"intrinsic","name":"void"}}]}}},{"name":"selection","variant":"declaration","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"The currently selected detent."}]},"type":{"type":"reference","name":"PresentationDetent","package":"@expo/ui"}}]}}}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"presentationDragIndicator","variant":"declaration","kind":64,"signatures":[{"name":"presentationDragIndicator","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Controls the visibility of the drag indicator on a sheet."}],"blockTags":[{"tag":"@platform","content":[{"kind":"text","text":"ios 16.0+"}]},{"tag":"@platform","content":[{"kind":"text","text":"tvos 16.0+"}]},{"tag":"@see","content":[{"kind":"text","text":"Official [SwiftUI documentation](https://developer.apple.com/documentation/swiftui/view/presentationdragindicator(_:))."}]}]},"parameters":[{"name":"visibility","variant":"param","kind":32768,"comment":{"summary":[{"kind":"text","text":"The visibility of the drag indicator."}]},"type":{"type":"union","types":[{"type":"literal","value":"automatic"},{"type":"literal","value":"visible"},{"type":"literal","value":"hidden"}]}}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"progressViewStyle","variant":"declaration","kind":64,"signatures":[{"name":"progressViewStyle","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Sets the style for the progress view."}],"blockTags":[{"tag":"@see","content":[{"kind":"text","text":"Official [SwiftUI documentation](https://developer.apple.com/documentation/swiftui/progressviewstyle)."}]}]},"parameters":[{"name":"style","variant":"param","kind":32768,"comment":{"summary":[{"kind":"text","text":"The style for the progress view."}]},"type":{"type":"reference","name":"ProgressViewStyleType","package":"@expo/ui"}}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"refreshable","variant":"declaration","kind":64,"signatures":[{"name":"refreshable","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Marks a view as refreshable. Adds pull-to-refresh functionality."}],"blockTags":[{"tag":"@see","content":[{"kind":"text","text":"Official [SwiftUI documentation](https://developer.apple.com/documentation/swiftui/view/refreshable(action:))."}]}]},"parameters":[{"name":"handler","variant":"param","kind":32768,"comment":{"summary":[{"kind":"text","text":"Async function to call when refresh is triggered."}]},"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"signatures":[{"name":"__type","variant":"signature","kind":4096,"type":{"type":"reference","target":{"packageName":"typescript","packagePath":"lib/lib.es5.d.ts","qualifiedName":"Promise"},"typeArguments":[{"type":"intrinsic","name":"void"}],"name":"Promise","package":"typescript"}}]}}}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"resizable","variant":"declaration","kind":64,"signatures":[{"name":"resizable","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Sets the mode by which SwiftUI resizes an image to fit its space."}],"blockTags":[{"tag":"@see","content":[{"kind":"text","text":"Official [SwiftUI documentation](https://developer.apple.com/documentation/swiftui/image/resizable(capinsets:resizingmode:))."}]}]},"parameters":[{"name":"capInsets","variant":"param","kind":32768,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Inset values that indicate a portion of the image that SwiftUI doesn’t resize."}]},"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"children":[{"name":"bottom","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"intrinsic","name":"number"}},{"name":"leading","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"intrinsic","name":"number"}},{"name":"top","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"intrinsic","name":"number"}},{"name":"trailing","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"intrinsic","name":"number"}}]}}},{"name":"resizingMode","variant":"param","kind":32768,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"The mode by which SwiftUI resizes the image."}]},"type":{"type":"union","types":[{"type":"literal","value":"stretch"},{"type":"literal","value":"tile"}]}}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"rotation3DEffect","variant":"declaration","kind":64,"signatures":[{"name":"rotation3DEffect","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Applies a 3D rotation transformation."}],"blockTags":[{"tag":"@see","content":[{"kind":"text","text":"Official [SwiftUI documentation](https://developer.apple.com/documentation/swiftui/view/rotation3deffect(_:axis:anchor:anchorz:perspective:))."}]}]},"parameters":[{"name":"params","variant":"param","kind":32768,"comment":{"summary":[{"kind":"text","text":"The rotation parameters: "},{"kind":"code","text":"`angle`"},{"kind":"text","text":" (in degrees), "},{"kind":"code","text":"`axis`"},{"kind":"text","text":" (x, y, z), and "},{"kind":"code","text":"`perspective`"},{"kind":"text","text":"."}]},"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"children":[{"name":"angle","variant":"declaration","kind":1024,"type":{"type":"intrinsic","name":"number"}},{"name":"axis","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"children":[{"name":"x","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"intrinsic","name":"number"}},{"name":"y","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"intrinsic","name":"number"}},{"name":"z","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"intrinsic","name":"number"}}]}}},{"name":"perspective","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"intrinsic","name":"number"}}]}}}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"rotationEffect","variant":"declaration","kind":64,"signatures":[{"name":"rotationEffect","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Applies rotation transformation."}],"blockTags":[{"tag":"@see","content":[{"kind":"text","text":"Official [SwiftUI documentation](https://developer.apple.com/documentation/swiftui/view/rotationeffect(_:anchor:))."}]}]},"parameters":[{"name":"angle","variant":"param","kind":32768,"comment":{"summary":[{"kind":"text","text":"Rotation angle in degrees."}]},"type":{"type":"intrinsic","name":"number"}}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"saturation","variant":"declaration","kind":64,"signatures":[{"name":"saturation","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Adjusts the saturation of a view."}],"blockTags":[{"tag":"@see","content":[{"kind":"text","text":"Official [SwiftUI documentation](https://developer.apple.com/documentation/swiftui/view/saturation(_:))."}]}]},"parameters":[{"name":"amount","variant":"param","kind":32768,"comment":{"summary":[{"kind":"text","text":"Saturation multiplier (0 to infinity, 1 = normal)."}]},"type":{"type":"intrinsic","name":"number"}}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"scaleEffect","variant":"declaration","kind":64,"signatures":[{"name":"scaleEffect","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Applies scaling transformation."}],"blockTags":[{"tag":"@see","content":[{"kind":"text","text":"Official [SwiftUI documentation](https://developer.apple.com/documentation/swiftui/view/scaleeffect(_:anchor:))."}]}]},"parameters":[{"name":"scale","variant":"param","kind":32768,"comment":{"summary":[{"kind":"text","text":"Uniform scale factor (1.0 = normal size), or an object with separate "},{"kind":"code","text":"`x`"},{"kind":"text","text":" and "},{"kind":"code","text":"`y`"},{"kind":"text","text":" scale factors."}]},"type":{"type":"union","types":[{"type":"intrinsic","name":"number"},{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"children":[{"name":"x","variant":"declaration","kind":1024,"type":{"type":"intrinsic","name":"number"}},{"name":"y","variant":"declaration","kind":1024,"type":{"type":"intrinsic","name":"number"}}]}}]}}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"scrollContentBackground","variant":"declaration","kind":64,"signatures":[{"name":"scrollContentBackground","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Specifies the visibility of the background for scrollable views within this view."}],"blockTags":[{"tag":"@see","content":[{"kind":"text","text":"Official [SwiftUI documentation](https://developer.apple.com/documentation/swiftui/view/scrollcontentbackground(_:))."}]}]},"parameters":[{"name":"visible","variant":"param","kind":32768,"comment":{"summary":[{"kind":"text","text":"The visibility of the background."}]},"type":{"type":"union","types":[{"type":"literal","value":"automatic"},{"type":"literal","value":"visible"},{"type":"literal","value":"hidden"}]}}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"scrollDisabled","variant":"declaration","kind":64,"signatures":[{"name":"scrollDisabled","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Disables or enables scrolling in scrollable views."}],"blockTags":[{"tag":"@platform","content":[{"kind":"text","text":"ios 16.0+"}]},{"tag":"@platform","content":[{"kind":"text","text":"tvos 16.0+"}]},{"tag":"@see","content":[{"kind":"text","text":"Official [SwiftUI documentation](https://developer.apple.com/documentation/swiftui/view/scrolldisabled(_:))."}]}]},"parameters":[{"name":"disabled","variant":"param","kind":32768,"comment":{"summary":[{"kind":"text","text":"Whether scrolling should be disabled (default: true)."}]},"type":{"type":"intrinsic","name":"boolean"},"defaultValue":"true"}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"scrollDismissesKeyboard","variant":"declaration","kind":64,"signatures":[{"name":"scrollDismissesKeyboard","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Controls how the keyboard is dismissed when scrolling."}],"blockTags":[{"tag":"@platform","content":[{"kind":"text","text":"ios 16.0+"}]},{"tag":"@platform","content":[{"kind":"text","text":"tvos 16.0+"}]},{"tag":"@see","content":[{"kind":"text","text":"Official [SwiftUI documentation](https://developer.apple.com/documentation/swiftui/view/scrolldismisseskeyboard(_:))."}]}]},"parameters":[{"name":"mode","variant":"param","kind":32768,"comment":{"summary":[{"kind":"text","text":"The keyboard dismiss mode."}]},"type":{"type":"union","types":[{"type":"literal","value":"automatic"},{"type":"literal","value":"never"},{"type":"literal","value":"interactively"},{"type":"literal","value":"immediately"}]}}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"scrollIndicators","variant":"declaration","kind":64,"signatures":[{"name":"scrollIndicators","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Controls the visibility of scroll indicators for scrollable views.\nMirrors SwiftUI's "},{"kind":"code","text":"`scrollIndicators(_:axes:)`"},{"kind":"text","text":" modifier."}],"blockTags":[{"tag":"@platform","content":[{"kind":"text","text":"ios 16.0+"}]},{"tag":"@platform","content":[{"kind":"text","text":"tvos 16.0+"}]},{"tag":"@see","content":[{"kind":"text","text":"Official [SwiftUI documentation](https://developer.apple.com/documentation/swiftui/view/scrollindicators(_:axes:))."}]}]},"parameters":[{"name":"visibility","variant":"param","kind":32768,"comment":{"summary":[{"kind":"text","text":"Indicator visibility:\n- "},{"kind":"code","text":"`'automatic'`"},{"kind":"text","text":": platform-default behavior.\n- "},{"kind":"code","text":"`'visible'`"},{"kind":"text","text":": prefer showing indicators (may still be hidden by the system).\n- "},{"kind":"code","text":"`'hidden'`"},{"kind":"text","text":": prefer hiding indicators (may still be shown by the system).\n- "},{"kind":"code","text":"`'never'`"},{"kind":"text","text":": never show indicators."}]},"type":{"type":"union","types":[{"type":"literal","value":"automatic"},{"type":"literal","value":"never"},{"type":"literal","value":"visible"},{"type":"literal","value":"hidden"}]}},{"name":"axes","variant":"param","kind":32768,"comment":{"summary":[{"kind":"text","text":"Axes to apply the visibility to. Defaults to "},{"kind":"code","text":"`'both'`"},{"kind":"text","text":"."}]},"type":{"type":"union","types":[{"type":"literal","value":"horizontal"},{"type":"literal","value":"vertical"},{"type":"literal","value":"both"}]},"defaultValue":"'both'"}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"scrollPosition","variant":"declaration","kind":64,"signatures":[{"name":"scrollPosition","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Binds the leading scroll target of a scrollable container to an observable native state.\n\nReading "},{"kind":"code","text":"`state.value`"},{"kind":"text","text":" returns the id of the leading scroll target. Writing to it scrolls\nthe container to the matching view. Pair with "},{"kind":"code","text":"`scrollTargetLayout()`"},{"kind":"text","text":" on the content\ncontainer and "},{"kind":"code","text":"`id()`"},{"kind":"text","text":" on each target. Works on "},{"kind":"code","text":"`ScrollView`"},{"kind":"text","text":", "},{"kind":"code","text":"`LazyVStack`"},{"kind":"text","text":", "},{"kind":"code","text":"`LazyHStack`"},{"kind":"text","text":",\nand other scrollable containers.\n\nOn iOS below 17.0, the modifier is a no-op."}],"blockTags":[{"tag":"@platform","content":[{"kind":"text","text":"ios 17.0+"}]},{"tag":"@platform","content":[{"kind":"text","text":"tvos 17.0+"}]},{"tag":"@platform","content":[{"kind":"text","text":"macos 14.0+"}]},{"tag":"@see","content":[{"kind":"text","text":"Official [SwiftUI documentation](https://developer.apple.com/documentation/swiftui/view/scrollposition(id:anchor:))."}]},{"tag":"@example","content":[{"kind":"code","text":"```tsx\nconst activeID = useNativeState(null);\n\n console.log('leading target:', newID),\n }),\n ]}>\n \n {items.map((item) => (\n {item.text}\n ))}\n \n\n```"}]}]},"parameters":[{"name":"state","variant":"param","kind":32768,"comment":{"summary":[{"kind":"text","text":"An "},{"kind":"code","text":"`ObservableState`"},{"kind":"text","text":" created with "},{"kind":"code","text":"`useNativeState`"},{"kind":"text","text":"."}]},"type":{"type":"reference","typeArguments":[{"type":"union","types":[{"type":"intrinsic","name":"string"},{"type":"literal","value":null}]}],"name":"ObservableState","package":"@expo/ui"}},{"name":"options","variant":"param","kind":32768,"flags":{"isOptional":true},"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"children":[{"name":"anchor","variant":"declaration","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Anchor used to pick which view drives the binding and to align\n programmatic scrolls. Maps to the "},{"kind":"code","text":"`anchor:`"},{"kind":"text","text":" parameter of SwiftUI's "},{"kind":"code","text":"`.scrollPosition(id:anchor:)`"},{"kind":"text","text":"."}]},"type":{"type":"reference","name":"UnitPointValue","package":"@expo/ui"}},{"name":"onChange","variant":"declaration","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Fires on the JS thread whenever the leading scroll target changes."}]},"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"signatures":[{"name":"__type","variant":"signature","kind":4096,"parameters":[{"name":"id","variant":"param","kind":32768,"type":{"type":"union","types":[{"type":"intrinsic","name":"string"},{"type":"literal","value":null}]}}],"type":{"type":"intrinsic","name":"void"}}]}}}]}}}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"scrollTargetBehavior","variant":"declaration","kind":64,"signatures":[{"name":"scrollTargetBehavior","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Sets the scroll snapping behavior for scrollable views.\nUse with "},{"kind":"code","text":"`scrollTargetLayout`"},{"kind":"text","text":" on the content container."}],"blockTags":[{"tag":"@platform","content":[{"kind":"text","text":"ios 17.0+"}]},{"tag":"@see","content":[{"kind":"text","text":"Official [SwiftUI documentation](https://developer.apple.com/documentation/swiftui/view/scrolltargetbehavior(_:))."}]}]},"parameters":[{"name":"behavior","variant":"param","kind":32768,"comment":{"summary":[{"kind":"code","text":"`'paging'`"},{"kind":"text","text":" for container-aligned snapping, "},{"kind":"code","text":"`'viewAligned'`"},{"kind":"text","text":" for view-aligned snapping."}]},"type":{"type":"union","types":[{"type":"literal","value":"paging"},{"type":"literal","value":"viewAligned"}]}}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"scrollTargetLayout","variant":"declaration","kind":64,"signatures":[{"name":"scrollTargetLayout","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Configures a layout container as a scroll target layout for view-aligned snapping.\nApply to "},{"kind":"code","text":"`VStack`"},{"kind":"text","text":" or "},{"kind":"code","text":"`HStack`"},{"kind":"text","text":" inside a "},{"kind":"code","text":"`ScrollView`"},{"kind":"text","text":"."}],"blockTags":[{"tag":"@platform","content":[{"kind":"text","text":"ios 17.0+"}]},{"tag":"@see","content":[{"kind":"text","text":"Official [SwiftUI documentation](https://developer.apple.com/documentation/swiftui/view/scrolltargetlayout(isenabled:))."}]}]},"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"shadow","variant":"declaration","kind":64,"signatures":[{"name":"shadow","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Adds a shadow to a view."}],"blockTags":[{"tag":"@see","content":[{"kind":"text","text":"Official [SwiftUI documentation](https://developer.apple.com/documentation/SwiftUI/View/shadow(color:radius:x:y:))."}]}]},"parameters":[{"name":"params","variant":"param","kind":32768,"comment":{"summary":[{"kind":"text","text":"The shadow parameters: "},{"kind":"code","text":"`radius`"},{"kind":"text","text":", offset ("},{"kind":"code","text":"`x`"},{"kind":"text","text":", "},{"kind":"code","text":"`y`"},{"kind":"text","text":") and "},{"kind":"code","text":"`color`"},{"kind":"text","text":"."}]},"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"children":[{"name":"color","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"reference","name":"Color","package":"@expo/ui"}},{"name":"radius","variant":"declaration","kind":1024,"type":{"type":"intrinsic","name":"number"}},{"name":"x","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"intrinsic","name":"number"}},{"name":"y","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"intrinsic","name":"number"}}]}}}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"strikethrough","variant":"declaration","kind":64,"signatures":[{"name":"strikethrough","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Applies a strikethrough to the text."}],"blockTags":[{"tag":"@see","content":[{"kind":"text","text":"Official [SwiftUI documentation](https://developer.apple.com/documentation/swiftui/text/strikethrough(_:color:))."}]}]},"parameters":[{"name":"params","variant":"param","kind":32768,"comment":{"summary":[{"kind":"text","text":"Controls whether the strikethrough is visible ("},{"kind":"code","text":"`true`"},{"kind":"text","text":" to show, "},{"kind":"code","text":"`false`"},{"kind":"text","text":" to hide)."}]},"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"children":[{"name":"color","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"reference","name":"Color","package":"@expo/ui"}},{"name":"isActive","variant":"declaration","kind":1024,"type":{"type":"intrinsic","name":"boolean"}},{"name":"pattern","variant":"declaration","kind":1024,"type":{"type":"reference","target":{"packageName":"@expo/ui","packagePath":"src/swift-ui/modifiers/index.ts","qualifiedName":"LinePattern"},"name":"LinePattern","package":"@expo/ui"}}]}}}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"submitLabel","variant":"declaration","kind":64,"signatures":[{"name":"submitLabel","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Specifies the label to display in the keyboard's return key. For example, "},{"kind":"code","text":"`'done'`"},{"kind":"text","text":"."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"A view that uses the specified submit label."}]},{"tag":"@platform","content":[{"kind":"text","text":"iOS 15+"}]},{"tag":"@example","content":[{"kind":"code","text":"```tsx\n\n```"}]}]},"parameters":[{"name":"submitLabel","variant":"param","kind":32768,"comment":{"summary":[{"kind":"text","text":"The label to display in the keyboard's return key."}]},"type":{"type":"union","types":[{"type":"literal","value":"join"},{"type":"literal","value":"search"},{"type":"literal","value":"done"},{"type":"literal","value":"continue"},{"type":"literal","value":"go"},{"type":"literal","value":"next"},{"type":"literal","value":"return"},{"type":"literal","value":"route"},{"type":"literal","value":"send"}]}}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"symbolEffect","variant":"declaration","kind":64,"signatures":[{"name":"symbolEffect","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Applies an SF Symbol effect to a view."}],"blockTags":[{"tag":"@platform","content":[{"kind":"text","text":"ios 17.0+"}]},{"tag":"@platform","content":[{"kind":"text","text":"tvos 17.0+"}]},{"tag":"@see","content":[{"kind":"text","text":"Official [SwiftUI documentation](https://developer.apple.com/documentation/SwiftUI/View/symbolEffect(_:options:value:))."}]},{"tag":"@example","content":[{"kind":"code","text":"```tsx\nconst trigger = useNativeState(0);\n\n```"}]}]},"parameters":[{"name":"effect","variant":"param","kind":32768,"type":{"type":"reference","name":"SymbolEffect","package":"@expo/ui"}},{"name":"args","variant":"param","kind":32768,"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"children":[{"name":"isActive","variant":"declaration","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Indefinite effects: runs while "},{"kind":"code","text":"`state.value === true`"},{"kind":"text","text":". Default active when omitted."}]},"type":{"type":"reference","typeArguments":[{"type":"intrinsic","name":"boolean"}],"name":"ObservableState","package":"@expo/ui"}},{"name":"options","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"reference","name":"SymbolEffectOptions","package":"@expo/ui"}},{"name":"value","variant":"declaration","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Discrete effects: the effect fires once each time this value changes."}]},"type":{"type":"reference","typeArguments":[{"type":"reference","name":"DiscreteSymbolEffectValue","package":"@expo/ui"}],"name":"ObservableState","package":"@expo/ui"}}]}},"defaultValue":"{}"}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"tabViewStyle","variant":"declaration","kind":64,"signatures":[{"name":"tabViewStyle","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Sets the style for a "},{"kind":"code","text":"`TabView`"},{"kind":"text","text":"."}],"blockTags":[{"tag":"@see","content":[{"kind":"text","text":"Official [SwiftUI documentation](https://developer.apple.com/documentation/swiftui/view/tabviewstyle(_:))."}]}]},"parameters":[{"name":"config","variant":"param","kind":32768,"type":{"type":"reference","name":"TabViewStyleConfig","package":"@expo/ui"}}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"tag","variant":"declaration","kind":64,"signatures":[{"name":"tag","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Sets a tag on a view."}],"blockTags":[{"tag":"@see","content":[{"kind":"text","text":"Official [SwiftUI documentation](https://developer.apple.com/documentation/swiftui/view/tag(_:includeoptional:))."}]}]},"parameters":[{"name":"tag","variant":"param","kind":32768,"comment":{"summary":[{"kind":"text","text":"The tag to set on the view."}]},"type":{"type":"union","types":[{"type":"intrinsic","name":"string"},{"type":"intrinsic","name":"number"}]}}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"textCase","variant":"declaration","kind":64,"signatures":[{"name":"textCase","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Sets a transform for the case of the text contained in this view when displayed."}],"blockTags":[{"tag":"@default","content":[{"kind":"text","text":"\"lowercase\""}]},{"tag":"@see","content":[{"kind":"text","text":"Official [SwiftUI documentation](https://developer.apple.com/documentation/swiftui/view/textcase(_:))."}]}]},"parameters":[{"name":"value","variant":"param","kind":32768,"type":{"type":"union","types":[{"type":"literal","value":"lowercase"},{"type":"literal","value":"uppercase"}]}}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"textContentType","variant":"declaration","kind":64,"signatures":[{"name":"textContentType","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Sets the text content type for input text, which the system uses to offer\nsuggestions (like autofill) while the user enters text."}],"blockTags":[{"tag":"@platform","content":[{"kind":"text","text":"ios 13.0+"}]},{"tag":"@see","content":[{"kind":"text","text":"Official [SwiftUI documentation](https://developer.apple.com/documentation/swiftui/view/textcontenttype(_:)-ufdv)."}]}]},"parameters":[{"name":"textContentType","variant":"param","kind":32768,"comment":{"summary":[{"kind":"text","text":"The semantic meaning of the text input area."}]},"type":{"type":"union","types":[{"type":"literal","value":"URL"},{"type":"literal","value":"namePrefix"},{"type":"literal","value":"name"},{"type":"literal","value":"nameSuffix"},{"type":"literal","value":"givenName"},{"type":"literal","value":"middleName"},{"type":"literal","value":"familyName"},{"type":"literal","value":"nickname"},{"type":"literal","value":"organizationName"},{"type":"literal","value":"jobTitle"},{"type":"literal","value":"location"},{"type":"literal","value":"fullStreetAddress"},{"type":"literal","value":"streetAddressLine1"},{"type":"literal","value":"streetAddressLine2"},{"type":"literal","value":"addressCity"},{"type":"literal","value":"addressCityAndState"},{"type":"literal","value":"addressState"},{"type":"literal","value":"postalCode"},{"type":"literal","value":"sublocality"},{"type":"literal","value":"countryName"},{"type":"literal","value":"username"},{"type":"literal","value":"password"},{"type":"literal","value":"newPassword"},{"type":"literal","value":"oneTimeCode"},{"type":"literal","value":"emailAddress"},{"type":"literal","value":"telephoneNumber"},{"type":"literal","value":"cellularEID"},{"type":"literal","value":"cellularIMEI"},{"type":"literal","value":"creditCardNumber"},{"type":"literal","value":"creditCardExpiration"},{"type":"literal","value":"creditCardExpirationMonth"},{"type":"literal","value":"creditCardExpirationYear"},{"type":"literal","value":"creditCardSecurityCode"},{"type":"literal","value":"creditCardType"},{"type":"literal","value":"creditCardName"},{"type":"literal","value":"creditCardGivenName"},{"type":"literal","value":"creditCardMiddleName"},{"type":"literal","value":"creditCardFamilyName"},{"type":"literal","value":"birthdate"},{"type":"literal","value":"birthdateDay"},{"type":"literal","value":"birthdateMonth"},{"type":"literal","value":"birthdateYear"},{"type":"literal","value":"dateTime"},{"type":"literal","value":"flightNumber"},{"type":"literal","value":"shipmentTrackingNumber"}]}}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"textFieldStyle","variant":"declaration","kind":64,"signatures":[{"name":"textFieldStyle","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Sets the text field style for text field views."}],"blockTags":[{"tag":"@see","content":[{"kind":"text","text":"Official [SwiftUI documentation](https://developer.apple.com/documentation/swiftui/view/textfieldstyle(_:))."}]}]},"parameters":[{"name":"style","variant":"param","kind":32768,"comment":{"summary":[{"kind":"text","text":"The text field style."}]},"type":{"type":"union","types":[{"type":"literal","value":"automatic"},{"type":"literal","value":"plain"},{"type":"literal","value":"roundedBorder"}]}}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"textInputAutocapitalization","variant":"declaration","kind":64,"signatures":[{"name":"textInputAutocapitalization","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Sets how often the shift key in the keyboard is automatically enabled."}],"blockTags":[{"tag":"@platform","content":[{"kind":"text","text":"ios 15.0+"}]},{"tag":"@see","content":[{"kind":"text","text":"Official [SwiftUI documentation](https://developer.apple.com/documentation/swiftui/view/textinputautocapitalization(_:))."}]}]},"parameters":[{"name":"autocapitalization","variant":"param","kind":32768,"comment":{"summary":[{"kind":"text","text":"The autocapitalization behavior."}]},"type":{"type":"union","types":[{"type":"literal","value":"never"},{"type":"literal","value":"words"},{"type":"literal","value":"sentences"},{"type":"literal","value":"characters"}]}}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"textSelection","variant":"declaration","kind":64,"signatures":[{"name":"textSelection","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Controls whether people can select text within this view."}],"blockTags":[{"tag":"@see","content":[{"kind":"text","text":"Official [SwiftUI documentation](https://developer.apple.com/documentation/swiftui/view/textselection(_:))."}]}]},"parameters":[{"name":"value","variant":"param","kind":32768,"comment":{"summary":[{"kind":"text","text":"Enable selection"}]},"type":{"type":"intrinsic","name":"boolean"}}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"tint","variant":"declaration","kind":64,"signatures":[{"name":"tint","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Sets the tint color of a view."}],"blockTags":[{"tag":"@see","content":[{"kind":"text","text":"Official [SwiftUI documentation](https://developer.apple.com/documentation/swiftui/view/tint(_:))."}]}]},"parameters":[{"name":"color","variant":"param","kind":32768,"comment":{"summary":[{"kind":"text","text":"The tint color (hex string). For example, "},{"kind":"code","text":"`#FF0000`"},{"kind":"text","text":"."}]},"type":{"type":"reference","name":"Color","package":"@expo/ui"}}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"toggleStyle","variant":"declaration","kind":64,"signatures":[{"name":"toggleStyle","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Sets the style for toggles within this view."}],"blockTags":[{"tag":"@see","content":[{"kind":"text","text":"Official [SwiftUI documentation](https://developer.apple.com/documentation/swiftui/view/togglestyle(_:))."}]}]},"parameters":[{"name":"style","variant":"param","kind":32768,"comment":{"summary":[{"kind":"text","text":"The toggle style."}]},"type":{"type":"union","types":[{"type":"literal","value":"automatic"},{"type":"literal","value":"switch"},{"type":"literal","value":"button"}]}}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"truncationMode","variant":"declaration","kind":64,"signatures":[{"name":"truncationMode","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Sets the truncation mode for lines of text that are too long to fit in the available space."}],"blockTags":[{"tag":"@see","content":[{"kind":"text","text":"Official [SwiftUI documentation](https://developer.apple.com/documentation/swiftui/view/truncationmode(_:))."}]}]},"parameters":[{"name":"mode","variant":"param","kind":32768,"comment":{"summary":[{"kind":"text","text":"The truncation mode that specifies where to truncate the text within the text view, if needed.\nYou can truncate at the beginning, middle, or end of the text view."}]},"type":{"type":"union","types":[{"type":"literal","value":"head"},{"type":"literal","value":"middle"},{"type":"literal","value":"tail"}]}}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"underline","variant":"declaration","kind":64,"signatures":[{"name":"underline","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Applies an underline to the text."}],"blockTags":[{"tag":"@see","content":[{"kind":"text","text":"Official [SwiftUI documentation](https://developer.apple.com/documentation/swiftui/view/underline(_:pattern:color:))."}]}]},"parameters":[{"name":"params","variant":"param","kind":32768,"comment":{"summary":[{"kind":"text","text":"Controls whether the underline is visible ("},{"kind":"code","text":"`true`"},{"kind":"text","text":" to show, "},{"kind":"code","text":"`false`"},{"kind":"text","text":" to hide)."}]},"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"children":[{"name":"color","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"reference","name":"Color","package":"@expo/ui"}},{"name":"isActive","variant":"declaration","kind":1024,"type":{"type":"intrinsic","name":"boolean"}},{"name":"pattern","variant":"declaration","kind":1024,"type":{"type":"reference","target":{"packageName":"@expo/ui","packagePath":"src/swift-ui/modifiers/index.ts","qualifiedName":"LinePattern"},"name":"LinePattern","package":"@expo/ui"}}]}}}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"widgetAccentedRenderingMode","variant":"declaration","kind":64,"signatures":[{"name":"widgetAccentedRenderingMode","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Specifies the how to render an Image when using the WidgetKit/WidgetRenderingMode/accented mode."}],"blockTags":[{"tag":"@see","content":[{"kind":"text","text":"Official [SwiftUI documentation](https://developer.apple.com/documentation/swiftui/image/widgetaccentedrenderingmode(_:))."}]}]},"parameters":[{"name":"renderingMode","variant":"param","kind":32768,"comment":{"summary":[{"kind":"text","text":"A constant describing how the Image should be rendered."}]},"type":{"type":"union","types":[{"type":"literal","value":"fullColor"},{"type":"literal","value":"accented"},{"type":"literal","value":"desaturated"},{"type":"literal","value":"accentedDesaturated"}]}}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"widgetURL","variant":"declaration","kind":64,"signatures":[{"name":"widgetURL","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Sets the URL to open in the containing app when the user clicks the widget.\nWidgets support one widgetURL modifier in their view hierarchy. If multiple views have widgetURL modifiers, the behavior is undefined."}],"blockTags":[{"tag":"@see","content":[{"kind":"text","text":"Official [SwiftUI documentation](https://developer.apple.com/documentation/SwiftUI/View/widgetURL(_:))."}]}]},"parameters":[{"name":"url","variant":"param","kind":32768,"comment":{"summary":[{"kind":"text","text":"The URL to open in the containing app."}]},"type":{"type":"intrinsic","name":"string"}}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"zIndex","variant":"declaration","kind":64,"signatures":[{"name":"zIndex","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Sets the z-index (display order) of a view."}],"blockTags":[{"tag":"@see","content":[{"kind":"text","text":"Official [SwiftUI documentation](https://developer.apple.com/documentation/swiftui/view/zindex(_:))."}]}]},"parameters":[{"name":"index","variant":"param","kind":32768,"comment":{"summary":[{"kind":"text","text":"The z-index value."}]},"type":{"type":"intrinsic","name":"number"}}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]}],"packageName":"@expo/ui"} \ No newline at end of file +{"schemaVersion":"2.0","name":"expo-ui/swift-ui/modifiers","variant":"project","kind":1,"children":[{"name":"ModifierConfig","variant":"declaration","kind":256,"comment":{"summary":[{"kind":"text","text":"Base interface for all view modifiers.\nAll modifiers must have a type field and can include arbitrary parameters."}]},"children":[{"name":"$type","variant":"declaration","kind":1024,"type":{"type":"intrinsic","name":"string"}},{"name":"eventListener","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"signatures":[{"name":"__type","variant":"signature","kind":4096,"parameters":[{"name":"args","variant":"param","kind":32768,"type":{"type":"intrinsic","name":"any"}}],"type":{"type":"intrinsic","name":"void"}}]}}}],"indexSignatures":[{"name":"__index","variant":"signature","kind":8192,"parameters":[{"name":"key","variant":"param","kind":32768,"type":{"type":"intrinsic","name":"string"}}],"type":{"type":"intrinsic","name":"any"}}]},{"name":"ChainableAnimationType","variant":"declaration","kind":2097152,"children":[{"name":"[VALUE_SYMBOL]","variant":"declaration","kind":1024,"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"signatures":[{"name":"__type","variant":"signature","kind":4096,"type":{"type":"reference","target":{"packageName":"@expo/ui","packagePath":"src/swift-ui/modifiers/animation/types.ts","qualifiedName":"AnimationObject"},"name":"AnimationObject","package":"@expo/ui"}}]}}},{"name":"delay","variant":"declaration","kind":1024,"comment":{"summary":[{"kind":"text","text":"Adds a delay before the animation starts (in seconds)."}]},"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"signatures":[{"name":"__type","variant":"signature","kind":4096,"parameters":[{"name":"delay","variant":"param","kind":32768,"type":{"type":"intrinsic","name":"number"}}],"type":{"type":"reference","name":"ChainableAnimationType","package":"@expo/ui"}}]}}},{"name":"repeat","variant":"declaration","kind":1024,"comment":{"summary":[{"kind":"text","text":"Repeats the animation the given number of times."}]},"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"signatures":[{"name":"__type","variant":"signature","kind":4096,"parameters":[{"name":"params","variant":"param","kind":32768,"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"children":[{"name":"autoreverses","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"intrinsic","name":"boolean"}},{"name":"repeatCount","variant":"declaration","kind":1024,"type":{"type":"intrinsic","name":"number"}}]}}}],"type":{"type":"reference","name":"ChainableAnimationType","package":"@expo/ui"}}]}}}]},{"name":"Color","variant":"declaration","kind":2097152,"type":{"type":"union","types":[{"type":"intrinsic","name":"string"},{"type":"reference","target":{"packageName":"react-native","packagePath":"Libraries/StyleSheet/StyleSheet.d.ts","qualifiedName":"ColorValue"},"name":"ColorValue","package":"react-native"},{"type":"reference","target":{"packageName":"@expo/ui","packagePath":"src/swift-ui/modifiers/types.ts","qualifiedName":"NamedColor"},"name":"NamedColor","package":"@expo/ui"}]}},{"name":"ContainerBackgroundPlacement","variant":"declaration","kind":2097152,"type":{"type":"union","types":[{"type":"literal","value":"widget"},{"type":"literal","value":"navigation"},{"type":"literal","value":"navigationSplitView"}]}},{"name":"DatePickerStyleType","variant":"declaration","kind":2097152,"type":{"type":"union","types":[{"type":"literal","value":"automatic"},{"type":"literal","value":"compact"},{"type":"literal","value":"graphical"},{"type":"literal","value":"wheel"}]}},{"name":"DiscreteSymbolEffectValue","variant":"declaration","kind":2097152,"comment":{"summary":[{"kind":"text","text":"Equatable primitive accepted as a discrete effect trigger."}]},"type":{"type":"union","types":[{"type":"intrinsic","name":"number"},{"type":"intrinsic","name":"string"},{"type":"intrinsic","name":"boolean"}]}},{"name":"EnvironmentConfig","variant":"declaration","kind":2097152,"type":{"type":"union","types":[{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"children":[{"name":"key","variant":"declaration","kind":1024,"type":{"type":"literal","value":"editMode"}},{"name":"value","variant":"declaration","kind":1024,"type":{"type":"union","types":[{"type":"literal","value":"active"},{"type":"literal","value":"inactive"},{"type":"literal","value":"transient"}]}}]}},{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"children":[{"name":"key","variant":"declaration","kind":1024,"type":{"type":"literal","value":"colorScheme"}},{"name":"value","variant":"declaration","kind":1024,"type":{"type":"union","types":[{"type":"literal","value":"light"},{"type":"literal","value":"dark"}]}}]}},{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"children":[{"name":"key","variant":"declaration","kind":1024,"type":{"type":"literal","value":"locale"}},{"name":"value","variant":"declaration","kind":1024,"type":{"type":"intrinsic","name":"string"}}]}},{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"children":[{"name":"key","variant":"declaration","kind":1024,"type":{"type":"literal","value":"timeZone"}},{"name":"value","variant":"declaration","kind":1024,"type":{"type":"intrinsic","name":"string"}}]}}]}},{"name":"GaugeStyleType","variant":"declaration","kind":2097152,"type":{"type":"union","types":[{"type":"literal","value":"automatic"},{"type":"literal","value":"circular"},{"type":"literal","value":"circularCapacity"},{"type":"literal","value":"linear"},{"type":"literal","value":"linearCapacity"}]}},{"name":"GlobalEvent","variant":"declaration","kind":2097152,"children":[{"name":"onGlobalEvent","variant":"declaration","kind":1024,"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"signatures":[{"name":"__type","variant":"signature","kind":4096,"parameters":[{"name":"event","variant":"param","kind":32768,"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"children":[{"name":"nativeEvent","variant":"declaration","kind":1024,"type":{"type":"reference","name":"GlobalEventPayload","package":"@expo/ui"}}]}}}],"type":{"type":"intrinsic","name":"void"}}]}}}]},{"name":"GlobalEventPayload","variant":"declaration","kind":2097152,"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"indexSignatures":[{"name":"__index","variant":"signature","kind":8192,"parameters":[{"name":"eventName","variant":"param","kind":32768,"type":{"type":"intrinsic","name":"string"}}],"type":{"type":"reference","target":{"packageName":"typescript","packagePath":"lib/lib.es5.d.ts","qualifiedName":"Record"},"typeArguments":[{"type":"intrinsic","name":"string"},{"type":"intrinsic","name":"any"}],"name":"Record","package":"typescript"}}]}}},{"name":"IndexViewStyleConfig","variant":"declaration","kind":2097152,"comment":{"summary":[{"kind":"text","text":"Configuration for the "},{"kind":"code","text":"`indexViewStyle`"},{"kind":"text","text":" modifier."}]},"children":[{"name":"backgroundDisplayMode","variant":"declaration","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Translucent background behind the page indicator dots. Useful when the\ndots sit on top of dark or busy content."}],"blockTags":[{"tag":"@default","content":[{"kind":"text","text":"'automatic'"}]}]},"type":{"type":"reference","name":"PageIndexBackgroundDisplayMode","package":"@expo/ui"}}]},{"name":"InterpolatingSpringAnimationParams","variant":"declaration","kind":2097152,"children":[{"name":"bounce","variant":"declaration","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Extra bounce to apply to the spring animation."}]},"type":{"type":"intrinsic","name":"number"}},{"name":"damping","variant":"declaration","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"The damping applied to the spring."}]},"type":{"type":"intrinsic","name":"number"}},{"name":"duration","variant":"declaration","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Total animation duration (in seconds)."}]},"type":{"type":"intrinsic","name":"number"}},{"name":"initialVelocity","variant":"declaration","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"The initial velocity of the animation."}]},"type":{"type":"intrinsic","name":"number"}},{"name":"mass","variant":"declaration","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"The mass attached to the spring."}]},"type":{"type":"intrinsic","name":"number"}},{"name":"stiffness","variant":"declaration","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"The stiffness of the spring."}]},"type":{"type":"intrinsic","name":"number"}}]},{"name":"ListStyle","variant":"declaration","kind":2097152,"type":{"type":"union","types":[{"type":"literal","value":"automatic"},{"type":"literal","value":"plain"},{"type":"literal","value":"inset"},{"type":"literal","value":"insetGrouped"},{"type":"literal","value":"grouped"},{"type":"literal","value":"sidebar"}]}},{"name":"ObservableState","variant":"declaration","kind":2097152,"comment":{"summary":[{"kind":"text","text":"Observable state shared between JavaScript and native views (Jetpack Compose\non Android and SwiftUI on iOS)."}]},"typeParameters":[{"name":"T","variant":"typeParam","kind":131072}],"type":{"type":"intersection","types":[{"type":"reference","target":{"packageName":"expo-modules-core","packagePath":"src/SharedObject.ts","qualifiedName":"SharedObject"},"name":"SharedObject","package":"expo-modules-core"},{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"children":[{"name":"onChange","variant":"declaration","kind":1024,"comment":{"summary":[{"kind":"text","text":"A single listener invoked on the native UI runtime whenever the value changes\n(after iOS "},{"kind":"code","text":"`didSet`"},{"kind":"text","text":" and Android's setter). Assigning replaces the previous\nlistener; assign "},{"kind":"code","text":"`null`"},{"kind":"text","text":" to clear. The initial value does not fire "},{"kind":"code","text":"`onChange`"},{"kind":"text","text":".\n\nThe callback must be a worklet so it can run synchronously on the UI thread.\nAttach it inside "},{"kind":"code","text":"`useEffect`"},{"kind":"text","text":" and clear it in the cleanup so the listener\nlifecycle matches the component lifecycle."}],"blockTags":[{"tag":"@example","content":[{"kind":"code","text":"```tsx\nconst state = useNativeState(0);\n\nuseEffect(() => {\n state.onChange = (value) => {\n 'worklet';\n console.log('changed to', value);\n };\n return () => {\n state.onChange = null;\n };\n}, []);\n```"}]}]},"type":{"type":"union","types":[{"type":"indexedAccess","indexType":{"type":"literal","value":"listener"},"objectType":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"children":[{"name":"listener","variant":"declaration","kind":2048,"signatures":[{"name":"listener","variant":"signature","kind":4096,"parameters":[{"name":"value","variant":"param","kind":32768,"type":{"type":"reference","name":"T","package":"@expo/ui","refersToTypeParameter":true}}],"type":{"type":"intrinsic","name":"void"}}]}]}}},{"type":"literal","value":null}]}},{"name":"value","variant":"declaration","kind":1024,"comment":{"summary":[{"kind":"text","text":"The current value.\n\nWrites from a UI worklet are synchronous and immediately readable. Writes\nfrom the JS thread are scheduled to the UI thread asynchronously, the new value is not readable until the update has been\napplied. Prefer writing from a worklet when you need synchronous updates"}]},"type":{"type":"reference","name":"T","package":"@expo/ui","refersToTypeParameter":true}}]}}]}},{"name":"PageIndexBackgroundDisplayMode","variant":"declaration","kind":2097152,"type":{"type":"union","types":[{"type":"literal","value":"automatic"},{"type":"literal","value":"always"},{"type":"literal","value":"never"},{"type":"literal","value":"interactive"}]}},{"name":"PageIndexDisplayMode","variant":"declaration","kind":2097152,"type":{"type":"union","types":[{"type":"literal","value":"automatic"},{"type":"literal","value":"always"},{"type":"literal","value":"never"}]}},{"name":"PickerStyleType","variant":"declaration","kind":2097152,"type":{"type":"union","types":[{"type":"literal","value":"automatic"},{"type":"literal","value":"inline"},{"type":"literal","value":"menu"},{"type":"literal","value":"navigationLink"},{"type":"literal","value":"palette"},{"type":"literal","value":"segmented"},{"type":"literal","value":"wheel"}]}},{"name":"PresentationBackgroundInteractionType","variant":"declaration","kind":2097152,"comment":{"summary":[{"kind":"text","text":"Presentation background interaction type."}]},"type":{"type":"union","types":[{"type":"literal","value":"automatic"},{"type":"literal","value":"enabled"},{"type":"literal","value":"disabled"},{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"children":[{"name":"detent","variant":"declaration","kind":1024,"type":{"type":"reference","name":"PresentationDetent","package":"@expo/ui"}},{"name":"type","variant":"declaration","kind":1024,"type":{"type":"literal","value":"enabledUpThrough"}}]}}]}},{"name":"PresentationDetent","variant":"declaration","kind":2097152,"comment":{"summary":[{"kind":"text","text":"Presentation detent type for controlling sheet heights.\n- "},{"kind":"code","text":"`'medium'`"},{"kind":"text","text":": System medium height (approximately half screen)\n- "},{"kind":"code","text":"`'large'`"},{"kind":"text","text":": System large height (full screen)\n- "},{"kind":"code","text":"`{ fraction: number }`"},{"kind":"text","text":": Fraction of screen height (0-1, for example, 0.4 equals to 40% of screen)\n- "},{"kind":"code","text":"`{ height: number }`"},{"kind":"text","text":": Fixed height in points"}]},"type":{"type":"union","types":[{"type":"literal","value":"medium"},{"type":"literal","value":"large"},{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"children":[{"name":"fraction","variant":"declaration","kind":1024,"type":{"type":"intrinsic","name":"number"}}]}},{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"children":[{"name":"height","variant":"declaration","kind":1024,"type":{"type":"intrinsic","name":"number"}}]}}]}},{"name":"ProgressViewStyleType","variant":"declaration","kind":2097152,"type":{"type":"union","types":[{"type":"literal","value":"automatic"},{"type":"literal","value":"linear"},{"type":"literal","value":"circular"}]}},{"name":"Shape","variant":"declaration","kind":2097152,"type":{"type":"union","types":[{"type":"reference","target":{"packageName":"typescript","packagePath":"lib/lib.es5.d.ts","qualifiedName":"ReturnType"},"typeArguments":[{"type":"query","queryType":{"type":"reference","name":"shapes.roundedRectangle","package":"@expo/ui","qualifiedName":"__object.roundedRectangle"}}],"name":"ReturnType","package":"typescript"},{"type":"reference","target":{"packageName":"typescript","packagePath":"lib/lib.es5.d.ts","qualifiedName":"ReturnType"},"typeArguments":[{"type":"query","queryType":{"type":"reference","name":"shapes.capsule","package":"@expo/ui","qualifiedName":"__object.capsule"}}],"name":"ReturnType","package":"typescript"},{"type":"reference","target":{"packageName":"typescript","packagePath":"lib/lib.es5.d.ts","qualifiedName":"ReturnType"},"typeArguments":[{"type":"query","queryType":{"type":"reference","name":"shapes.rectangle","package":"@expo/ui","qualifiedName":"__object.rectangle"}}],"name":"ReturnType","package":"typescript"},{"type":"reference","target":{"packageName":"typescript","packagePath":"lib/lib.es5.d.ts","qualifiedName":"ReturnType"},"typeArguments":[{"type":"query","queryType":{"type":"reference","name":"shapes.ellipse","package":"@expo/ui","qualifiedName":"__object.ellipse"}}],"name":"ReturnType","package":"typescript"},{"type":"reference","target":{"packageName":"typescript","packagePath":"lib/lib.es5.d.ts","qualifiedName":"ReturnType"},"typeArguments":[{"type":"query","queryType":{"type":"reference","name":"shapes.circle","package":"@expo/ui","qualifiedName":"__object.circle"}}],"name":"ReturnType","package":"typescript"},{"type":"reference","target":{"packageName":"typescript","packagePath":"lib/lib.es5.d.ts","qualifiedName":"ReturnType"},"typeArguments":[{"type":"query","queryType":{"type":"reference","name":"shapes.containerRelativeShape","package":"@expo/ui","qualifiedName":"__object.containerRelativeShape"}}],"name":"ReturnType","package":"typescript"}]}},{"name":"SpringAnimationParams","variant":"declaration","kind":2097152,"children":[{"name":"blendDuration","variant":"declaration","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"The duration over which to blend between animations (in seconds)."}]},"type":{"type":"intrinsic","name":"number"}},{"name":"bounce","variant":"declaration","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Extra bounce to apply to the spring animation."}]},"type":{"type":"intrinsic","name":"number"}},{"name":"dampingFraction","variant":"declaration","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"The amount of damping applied to the spring's motion."}]},"type":{"type":"intrinsic","name":"number"}},{"name":"duration","variant":"declaration","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Total animation duration (in seconds)."}]},"type":{"type":"intrinsic","name":"number"}},{"name":"response","variant":"declaration","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"The spring's response time (in seconds)."}]},"type":{"type":"intrinsic","name":"number"}}]},{"name":"SymbolEffect","variant":"declaration","kind":2097152,"type":{"type":"union","types":[{"type":"reference","target":{"packageName":"@expo/ui","packagePath":"src/swift-ui/modifiers/symbolEffect.ts","qualifiedName":"AppearSymbolEffect"},"name":"AppearSymbolEffect","package":"@expo/ui"},{"type":"reference","target":{"packageName":"@expo/ui","packagePath":"src/swift-ui/modifiers/symbolEffect.ts","qualifiedName":"BounceSymbolEffect"},"name":"BounceSymbolEffect","package":"@expo/ui"},{"type":"reference","target":{"packageName":"@expo/ui","packagePath":"src/swift-ui/modifiers/symbolEffect.ts","qualifiedName":"BreatheSymbolEffect"},"name":"BreatheSymbolEffect","package":"@expo/ui"},{"type":"reference","target":{"packageName":"@expo/ui","packagePath":"src/swift-ui/modifiers/symbolEffect.ts","qualifiedName":"DisappearSymbolEffect"},"name":"DisappearSymbolEffect","package":"@expo/ui"},{"type":"reference","target":{"packageName":"@expo/ui","packagePath":"src/swift-ui/modifiers/symbolEffect.ts","qualifiedName":"DrawOffSymbolEffect"},"name":"DrawOffSymbolEffect","package":"@expo/ui"},{"type":"reference","target":{"packageName":"@expo/ui","packagePath":"src/swift-ui/modifiers/symbolEffect.ts","qualifiedName":"DrawOnSymbolEffect"},"name":"DrawOnSymbolEffect","package":"@expo/ui"},{"type":"reference","target":{"packageName":"@expo/ui","packagePath":"src/swift-ui/modifiers/symbolEffect.ts","qualifiedName":"PulseSymbolEffect"},"name":"PulseSymbolEffect","package":"@expo/ui"},{"type":"reference","target":{"packageName":"@expo/ui","packagePath":"src/swift-ui/modifiers/symbolEffect.ts","qualifiedName":"RotateSymbolEffect"},"name":"RotateSymbolEffect","package":"@expo/ui"},{"type":"reference","target":{"packageName":"@expo/ui","packagePath":"src/swift-ui/modifiers/symbolEffect.ts","qualifiedName":"ScaleSymbolEffect"},"name":"ScaleSymbolEffect","package":"@expo/ui"},{"type":"reference","target":{"packageName":"@expo/ui","packagePath":"src/swift-ui/modifiers/symbolEffect.ts","qualifiedName":"VariableColorSymbolEffect"},"name":"VariableColorSymbolEffect","package":"@expo/ui"},{"type":"reference","target":{"packageName":"@expo/ui","packagePath":"src/swift-ui/modifiers/symbolEffect.ts","qualifiedName":"WiggleSymbolEffect"},"name":"WiggleSymbolEffect","package":"@expo/ui"}]}},{"name":"SymbolEffectOptions","variant":"declaration","kind":2097152,"comment":{"summary":[{"kind":"text","text":"Animation options for a symbol effect."}],"blockTags":[{"tag":"@see","content":[{"kind":"text","text":"Official [Apple documentation](https://developer.apple.com/documentation/symbols/symboleffectoptions)."}]}]},"children":[{"name":"repeat","variant":"declaration","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"How the effect repeats. Omit for the effect's natural cadence.\n- "},{"kind":"code","text":"`'nonRepeating'`"},{"kind":"text","text":" — play exactly once.\n- "},{"kind":"code","text":"`'continuous'`"},{"kind":"text","text":" — smooth, indefinite repetition (iOS 18+).\n- "},{"kind":"code","text":"`{ count?, delay? }`"},{"kind":"text","text":" — periodic repetition with optional count and delay in seconds (iOS 18+)."}]},"type":{"type":"union","types":[{"type":"literal","value":"continuous"},{"type":"literal","value":"nonRepeating"},{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"children":[{"name":"count","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"intrinsic","name":"number"}},{"name":"delay","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"intrinsic","name":"number"}}]}}]}},{"name":"speed","variant":"declaration","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Animation speed multiplier (1.0 = default)."}]},"type":{"type":"intrinsic","name":"number"}}]},{"name":"TabViewStyleConfig","variant":"declaration","kind":2097152,"comment":{"summary":[{"kind":"text","text":"Configuration for the "},{"kind":"code","text":"`tabViewStyle`"},{"kind":"text","text":" modifier.\n\n - "},{"kind":"code","text":"`'page'`"},{"kind":"text","text":" — swipeable horizontal pager with optional dot indicators.\n - "},{"kind":"code","text":"`'automatic'`"},{"kind":"text","text":" — SwiftUI's default tab-bar style.\n - "},{"kind":"code","text":"`'sidebarAdaptable'`"},{"kind":"text","text":" — iOS 18+. Sidebar on iPad/Mac, bottom bar on\n iPhone."}]},"type":{"type":"union","types":[{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"children":[{"name":"indexDisplayMode","variant":"declaration","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Visibility of the page indicator dots. Only meaningful for the page style."}],"blockTags":[{"tag":"@default","content":[{"kind":"text","text":"'automatic'"}]}]},"type":{"type":"reference","name":"PageIndexDisplayMode","package":"@expo/ui"}},{"name":"type","variant":"declaration","kind":1024,"type":{"type":"literal","value":"page"}}]}},{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"children":[{"name":"type","variant":"declaration","kind":1024,"type":{"type":"literal","value":"automatic"}}]}},{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"children":[{"name":"type","variant":"declaration","kind":1024,"type":{"type":"literal","value":"sidebarAdaptable"}}]}}]}},{"name":"TimingAnimationParams","variant":"declaration","kind":2097152,"children":[{"name":"duration","variant":"declaration","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Total animation duration (in seconds)."}]},"type":{"type":"intrinsic","name":"number"}}]},{"name":"UnitPointValue","variant":"declaration","kind":2097152,"type":{"type":"union","types":[{"type":"literal","value":"zero"},{"type":"literal","value":"topLeading"},{"type":"literal","value":"top"},{"type":"literal","value":"topTrailing"},{"type":"literal","value":"leading"},{"type":"literal","value":"center"},{"type":"literal","value":"trailing"},{"type":"literal","value":"bottomLeading"},{"type":"literal","value":"bottom"},{"type":"literal","value":"bottomTrailing"}]}},{"name":"Animation","variant":"declaration","kind":32,"flags":{"isConst":true},"comment":{"summary":[{"kind":"text","text":"Built-in animation presets for the "},{"kind":"code","text":"`animation`"},{"kind":"text","text":" modifier.\nPresets:\n- Timing presets ("},{"kind":"code","text":"`easeInOut`"},{"kind":"text","text":", "},{"kind":"code","text":"`easeIn`"},{"kind":"text","text":", "},{"kind":"code","text":"`easeOut`"},{"kind":"text","text":", "},{"kind":"code","text":"`linear`"},{"kind":"text","text":") accept\n["},{"kind":"code","text":"`TimingAnimationParams`"},{"kind":"text","text":"](#timinganimationparams).\n- "},{"kind":"code","text":"`spring`"},{"kind":"text","text":" accepts ["},{"kind":"code","text":"`SpringAnimationParams`"},{"kind":"text","text":"](#springanimationparams).\n- "},{"kind":"code","text":"`interpolatingSpring`"},{"kind":"text","text":" accepts\n["},{"kind":"code","text":"`InterpolatingSpringAnimationParams`"},{"kind":"text","text":"](#interpolatingspringanimationparams).\n- Chaining returns ["},{"kind":"code","text":"`ChainableAnimationType`"},{"kind":"text","text":"](#chainableanimationtype)."}],"blockTags":[{"tag":"@example","content":[{"kind":"code","text":"```tsx\nimport { Host, VStack } from '@expo/ui/swift-ui';\nimport { animation, Animation } from '@expo/ui/swift-ui/modifiers';\n\nfunction Example() {\n const [isExpanded, setIsExpanded] = useState(false);\n\n return (\n \n \n //...\n \n \n );\n}\n```"}]},{"tag":"@hideType","content":[]}]},"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"children":[{"name":"default","variant":"declaration","kind":1024,"type":{"type":"reference","name":"ChainableAnimationType","package":"@expo/ui"},"defaultValue":"..."},{"name":"easeIn","variant":"declaration","kind":1024,"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"signatures":[{"name":"__type","variant":"signature","kind":4096,"parameters":[{"name":"params","variant":"param","kind":32768,"flags":{"isOptional":true},"type":{"type":"reference","name":"TimingAnimationParams","package":"@expo/ui"}}],"type":{"type":"reference","name":"ChainableAnimationType","package":"@expo/ui"}}]}},"defaultValue":"..."},{"name":"easeInOut","variant":"declaration","kind":1024,"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"signatures":[{"name":"__type","variant":"signature","kind":4096,"parameters":[{"name":"params","variant":"param","kind":32768,"flags":{"isOptional":true},"type":{"type":"reference","name":"TimingAnimationParams","package":"@expo/ui"}}],"type":{"type":"reference","name":"ChainableAnimationType","package":"@expo/ui"}}]}},"defaultValue":"..."},{"name":"easeOut","variant":"declaration","kind":1024,"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"signatures":[{"name":"__type","variant":"signature","kind":4096,"parameters":[{"name":"params","variant":"param","kind":32768,"flags":{"isOptional":true},"type":{"type":"reference","name":"TimingAnimationParams","package":"@expo/ui"}}],"type":{"type":"reference","name":"ChainableAnimationType","package":"@expo/ui"}}]}},"defaultValue":"..."},{"name":"interpolatingSpring","variant":"declaration","kind":1024,"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"signatures":[{"name":"__type","variant":"signature","kind":4096,"parameters":[{"name":"params","variant":"param","kind":32768,"flags":{"isOptional":true},"type":{"type":"reference","name":"InterpolatingSpringAnimationParams","package":"@expo/ui"}}],"type":{"type":"reference","name":"ChainableAnimationType","package":"@expo/ui"}}]}},"defaultValue":"..."},{"name":"linear","variant":"declaration","kind":1024,"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"signatures":[{"name":"__type","variant":"signature","kind":4096,"parameters":[{"name":"params","variant":"param","kind":32768,"flags":{"isOptional":true},"type":{"type":"reference","name":"TimingAnimationParams","package":"@expo/ui"}}],"type":{"type":"reference","name":"ChainableAnimationType","package":"@expo/ui"}}]}},"defaultValue":"..."},{"name":"spring","variant":"declaration","kind":1024,"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"signatures":[{"name":"__type","variant":"signature","kind":4096,"parameters":[{"name":"params","variant":"param","kind":32768,"flags":{"isOptional":true},"type":{"type":"reference","name":"SpringAnimationParams","package":"@expo/ui"}}],"type":{"type":"reference","name":"ChainableAnimationType","package":"@expo/ui"}}]}},"defaultValue":"..."}]}},"defaultValue":"..."},{"name":"shapes","variant":"declaration","kind":32,"flags":{"isConst":true},"comment":{"summary":[{"kind":"text","text":"Shape builders for modifiers that accept shapes, such as "},{"kind":"code","text":"`background`"},{"kind":"text","text":" and "},{"kind":"code","text":"`containerShape`"},{"kind":"text","text":".\n\nShapes: "},{"kind":"code","text":"`roundedRectangle`"},{"kind":"text","text":", "},{"kind":"code","text":"`capsule`"},{"kind":"text","text":", "},{"kind":"code","text":"`rectangle`"},{"kind":"text","text":", "},{"kind":"code","text":"`ellipse`"},{"kind":"text","text":", "},{"kind":"code","text":"`circle`"},{"kind":"text","text":", "},{"kind":"code","text":"`containerRelativeShape`"},{"kind":"text","text":"."}],"blockTags":[{"tag":"@example","content":[{"kind":"code","text":"```tsx\nimport { background, shapes } from '@expo/ui/swift-ui/modifiers';\nimport { Text, Host } from '@expo/ui/swift-ui';\n\nfunction Example() {\n return (\n \n \n Hello, world!\n \n \n );\n}\n```"}]},{"tag":"@hideType","content":[]}]},"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"children":[{"name":"capsule","variant":"declaration","kind":1024,"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"signatures":[{"name":"__type","variant":"signature","kind":4096,"parameters":[{"name":"params","variant":"param","kind":32768,"flags":{"isOptional":true},"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"children":[{"name":"roundedCornerStyle","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"union","types":[{"type":"literal","value":"continuous"},{"type":"literal","value":"circular"}]}}]}}}],"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"children":[{"name":"roundedCornerStyle","variant":"declaration","kind":1024,"type":{"type":"union","types":[{"type":"literal","value":"continuous"},{"type":"literal","value":"circular"},{"type":"intrinsic","name":"undefined"}]},"defaultValue":"params.roundedCornerStyle"},{"name":"shape","variant":"declaration","kind":1024,"type":{"type":"intrinsic","name":"string"},"defaultValue":"'capsule'"}]}}}]}},"defaultValue":"..."},{"name":"circle","variant":"declaration","kind":1024,"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"signatures":[{"name":"__type","variant":"signature","kind":4096,"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"children":[{"name":"shape","variant":"declaration","kind":1024,"type":{"type":"intrinsic","name":"string"},"defaultValue":"'circle'"}]}}}]}},"defaultValue":"..."},{"name":"containerRelativeShape","variant":"declaration","kind":1024,"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"signatures":[{"name":"__type","variant":"signature","kind":4096,"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"children":[{"name":"shape","variant":"declaration","kind":1024,"type":{"type":"intrinsic","name":"string"},"defaultValue":"'containerRelativeShape'"}]}}}]}},"defaultValue":"..."},{"name":"ellipse","variant":"declaration","kind":1024,"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"signatures":[{"name":"__type","variant":"signature","kind":4096,"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"children":[{"name":"shape","variant":"declaration","kind":1024,"type":{"type":"intrinsic","name":"string"},"defaultValue":"'ellipse'"}]}}}]}},"defaultValue":"..."},{"name":"rectangle","variant":"declaration","kind":1024,"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"signatures":[{"name":"__type","variant":"signature","kind":4096,"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"children":[{"name":"shape","variant":"declaration","kind":1024,"type":{"type":"intrinsic","name":"string"},"defaultValue":"'rectangle'"}]}}}]}},"defaultValue":"..."},{"name":"roundedRectangle","variant":"declaration","kind":1024,"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"signatures":[{"name":"__type","variant":"signature","kind":4096,"parameters":[{"name":"params","variant":"param","kind":32768,"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"children":[{"name":"cornerRadius","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"intrinsic","name":"number"}},{"name":"cornerSize","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"children":[{"name":"height","variant":"declaration","kind":1024,"type":{"type":"intrinsic","name":"number"}},{"name":"width","variant":"declaration","kind":1024,"type":{"type":"intrinsic","name":"number"}}]}}},{"name":"roundedCornerStyle","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"union","types":[{"type":"literal","value":"continuous"},{"type":"literal","value":"circular"}]}}]}}}],"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"children":[{"name":"cornerRadius","variant":"declaration","kind":1024,"type":{"type":"union","types":[{"type":"intrinsic","name":"number"},{"type":"intrinsic","name":"undefined"}]},"defaultValue":"params.cornerRadius"},{"name":"cornerSize","variant":"declaration","kind":1024,"type":{"type":"union","types":[{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"children":[{"name":"height","variant":"declaration","kind":1024,"type":{"type":"intrinsic","name":"number"}},{"name":"width","variant":"declaration","kind":1024,"type":{"type":"intrinsic","name":"number"}}]}},{"type":"intrinsic","name":"undefined"}]},"defaultValue":"params.cornerSize"},{"name":"roundedCornerStyle","variant":"declaration","kind":1024,"type":{"type":"union","types":[{"type":"literal","value":"continuous"},{"type":"literal","value":"circular"},{"type":"intrinsic","name":"undefined"}]},"defaultValue":"params.roundedCornerStyle"},{"name":"shape","variant":"declaration","kind":1024,"type":{"type":"intrinsic","name":"string"},"defaultValue":"'roundedRectangle'"}]}}}]}},"defaultValue":"..."}]}},"defaultValue":"..."},{"name":"accessibilityHint","variant":"declaration","kind":64,"signatures":[{"name":"accessibilityHint","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Sets accessibility hint for the view."}],"blockTags":[{"tag":"@see","content":[{"kind":"text","text":"Official [SwiftUI documentation](https://developer.apple.com/documentation/swiftui/view/accessibilityhint(_:))."}]}]},"parameters":[{"name":"hint","variant":"param","kind":32768,"comment":{"summary":[{"kind":"text","text":"The accessibility hint."}]},"type":{"type":"intrinsic","name":"string"}}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"accessibilityLabel","variant":"declaration","kind":64,"signatures":[{"name":"accessibilityLabel","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Sets accessibility label for the view."}],"blockTags":[{"tag":"@see","content":[{"kind":"text","text":"Official [SwiftUI documentation](https://developer.apple.com/documentation/swiftui/view/accessibilitylabel(_:))."}]}]},"parameters":[{"name":"label","variant":"param","kind":32768,"comment":{"summary":[{"kind":"text","text":"The accessibility label."}]},"type":{"type":"intrinsic","name":"string"}}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"accessibilityValue","variant":"declaration","kind":64,"signatures":[{"name":"accessibilityValue","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Sets accessibility value for the view."}],"blockTags":[{"tag":"@see","content":[{"kind":"text","text":"Official [SwiftUI documentation](https://developer.apple.com/documentation/swiftui/view/accessibilityvalue(_:))."}]}]},"parameters":[{"name":"value","variant":"param","kind":32768,"comment":{"summary":[{"kind":"text","text":"The accessibility value."}]},"type":{"type":"intrinsic","name":"string"}}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"allowsTightening","variant":"declaration","kind":64,"signatures":[{"name":"allowsTightening","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Sets whether text in this view can compress the space between characters when necessary to fit text in a line"}],"blockTags":[{"tag":"@default","content":[{"kind":"text","text":"true"}]},{"tag":"@see","content":[{"kind":"text","text":"Official [SwiftUI documentation](https://developer.apple.com/documentation/swiftui/view/allowstightening(_:))."}]}]},"parameters":[{"name":"value","variant":"param","kind":32768,"type":{"type":"intrinsic","name":"boolean"}}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"animation","variant":"declaration","kind":64,"signatures":[{"name":"animation","variant":"signature","kind":4096,"parameters":[{"name":"animationObject","variant":"param","kind":32768,"type":{"type":"reference","name":"ChainableAnimationType","package":"@expo/ui"}},{"name":"animatedValue","variant":"param","kind":32768,"type":{"type":"union","types":[{"type":"intrinsic","name":"number"},{"type":"intrinsic","name":"boolean"}]}}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"aspectRatio","variant":"declaration","kind":64,"signatures":[{"name":"aspectRatio","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Sets aspect ratio constraint."}],"blockTags":[{"tag":"@see","content":[{"kind":"text","text":"Official [SwiftUI documentation](https://developer.apple.com/documentation/swiftui/view/aspectratio(_:contentmode:))."}]}]},"parameters":[{"name":"params","variant":"param","kind":32768,"comment":{"summary":[{"kind":"text","text":"Optional width/height aspect ratio and content mode."}]},"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"children":[{"name":"contentMode","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"union","types":[{"type":"literal","value":"fill"},{"type":"literal","value":"fit"}]}},{"name":"ratio","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"intrinsic","name":"number"}}]}}}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"autocorrectionDisabled","variant":"declaration","kind":64,"signatures":[{"name":"autocorrectionDisabled","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Disables autocorrection for text input views."}],"blockTags":[{"tag":"@see","content":[{"kind":"text","text":"Official [SwiftUI documentation](https://developer.apple.com/documentation/swiftui/view/autocorrectiondisabled(_:))."}]}]},"parameters":[{"name":"disabled","variant":"param","kind":32768,"comment":{"summary":[{"kind":"text","text":"Whether autocorrection is disabled. Defaults to "},{"kind":"code","text":"`true`"},{"kind":"text","text":"."}]},"type":{"type":"intrinsic","name":"boolean"},"defaultValue":"true"}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"background","variant":"declaration","kind":64,"signatures":[{"name":"background","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Sets the background of a view."}],"blockTags":[{"tag":"@see","content":[{"kind":"text","text":"Official [SwiftUI documentation](https://developer.apple.com/documentation/SwiftUI/View/background(_:alignment:))."}]}]},"parameters":[{"name":"color","variant":"param","kind":32768,"comment":{"summary":[{"kind":"text","text":"The background color (hex string). For example, "},{"kind":"code","text":"`#FF0000`"},{"kind":"text","text":"."}]},"type":{"type":"reference","name":"Color","package":"@expo/ui"}},{"name":"shape","variant":"param","kind":32768,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Optional shape to clip the background. If not provided, the background will fill the entire view."}]},"type":{"type":"reference","name":"Shape","package":"@expo/ui"}}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"backgroundOverlay","variant":"declaration","kind":64,"signatures":[{"name":"backgroundOverlay","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Adds a background behind the view."}]},"parameters":[{"name":"params","variant":"param","kind":32768,"comment":{"summary":[{"kind":"text","text":"Background color and alignment."}]},"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"children":[{"name":"alignment","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"union","types":[{"type":"literal","value":"center"},{"type":"literal","value":"top"},{"type":"literal","value":"bottom"},{"type":"literal","value":"leading"},{"type":"literal","value":"trailing"}]}},{"name":"color","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"reference","name":"Color","package":"@expo/ui"}}]}}}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"badge","variant":"declaration","kind":64,"signatures":[{"name":"badge","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Generates a badge for the view from a localized string key."}],"blockTags":[{"tag":"@see","content":[{"kind":"text","text":"Official [SwiftUI documentation](https://developer.apple.com/documentation/swiftui/view/badge(_:))."}]}]},"parameters":[{"name":"value","variant":"param","kind":32768,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Text view to display as a badge. Set the value to nil to hide the badge."}]},"type":{"type":"intrinsic","name":"string"}}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"badgeProminence","variant":"declaration","kind":64,"signatures":[{"name":"badgeProminence","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"The prominence to apply to badges associated with this environment."}],"blockTags":[{"tag":"@see","content":[{"kind":"text","text":"Official [SwiftUI documentation](https://developer.apple.com/documentation/swiftui/view/badgeprominence(_:))."}]}]},"parameters":[{"name":"badgeType","variant":"param","kind":32768,"comment":{"summary":[{"kind":"text","text":"Select the type of badge"}]},"type":{"type":"union","types":[{"type":"literal","value":"standard"},{"type":"literal","value":"increased"},{"type":"literal","value":"decreased"}]}}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"blur","variant":"declaration","kind":64,"signatures":[{"name":"blur","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Applies blur to a view."}],"blockTags":[{"tag":"@see","content":[{"kind":"text","text":"Official [SwiftUI documentation](https://developer.apple.com/documentation/swiftui/view/blur(radius:opaque:))."}]}]},"parameters":[{"name":"radius","variant":"param","kind":32768,"comment":{"summary":[{"kind":"text","text":"The blur radius."}]},"type":{"type":"intrinsic","name":"number"}}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"bold","variant":"declaration","kind":64,"signatures":[{"name":"bold","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Makes text bold.\nWhen applied to "},{"kind":"code","text":"`Text`"},{"kind":"text","text":", it works on all iOS/tvOS versions. When used on regular views, it requires iOS 16.0+/tvOS 16.0+."}],"blockTags":[{"tag":"@see","content":[{"kind":"text","text":"Official [SwiftUI documentation](https://developer.apple.com/documentation/swiftui/text/bold())."}]}]},"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"border","variant":"declaration","kind":64,"signatures":[{"name":"border","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Adds a border to a view."}],"blockTags":[{"tag":"@see","content":[{"kind":"text","text":"Official [SwiftUI documentation](https://developer.apple.com/documentation/swiftui/view/border(_:width:))."}]}]},"parameters":[{"name":"params","variant":"param","kind":32768,"comment":{"summary":[{"kind":"text","text":"The border parameters. Color and width."}]},"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"children":[{"name":"color","variant":"declaration","kind":1024,"type":{"type":"reference","name":"Color","package":"@expo/ui"}},{"name":"width","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"intrinsic","name":"number"}}]}}}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"brightness","variant":"declaration","kind":64,"signatures":[{"name":"brightness","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Adjusts the brightness of a view."}],"blockTags":[{"tag":"@see","content":[{"kind":"text","text":"Official [SwiftUI documentation](https://developer.apple.com/documentation/swiftui/view/brightness(_:))."}]}]},"parameters":[{"name":"amount","variant":"param","kind":32768,"comment":{"summary":[{"kind":"text","text":"Brightness adjustment (-1 to 1)."}]},"type":{"type":"intrinsic","name":"number"}}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"buttonStyle","variant":"declaration","kind":64,"signatures":[{"name":"buttonStyle","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Sets the button style for button views."}],"blockTags":[{"tag":"@see","content":[{"kind":"text","text":"Official [SwiftUI documentation](https://developer.apple.com/documentation/swiftui/view/buttonstyle(_:))."}]}]},"parameters":[{"name":"style","variant":"param","kind":32768,"comment":{"summary":[{"kind":"text","text":"The button style. "},{"kind":"code","text":"`'glass'`"},{"kind":"text","text":" and "},{"kind":"code","text":"`'glassProminent'`"},{"kind":"text","text":" are available on iOS 26+ and tvOS 26+ only."}]},"type":{"type":"union","types":[{"type":"literal","value":"automatic"},{"type":"literal","value":"plain"},{"type":"literal","value":"bordered"},{"type":"literal","value":"borderedProminent"},{"type":"literal","value":"borderless"},{"type":"literal","value":"glass"},{"type":"literal","value":"glassProminent"}]}}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"clipped","variant":"declaration","kind":64,"signatures":[{"name":"clipped","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Clips content to bounds."}],"blockTags":[{"tag":"@see","content":[{"kind":"text","text":"Official [SwiftUI documentation](https://developer.apple.com/documentation/swiftui/view/clipped(antialiased:))."}]}]},"parameters":[{"name":"clipped","variant":"param","kind":32768,"comment":{"summary":[{"kind":"text","text":"Whether to clip content."}]},"type":{"type":"intrinsic","name":"boolean"},"defaultValue":"true"}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"clipShape","variant":"declaration","kind":64,"signatures":[{"name":"clipShape","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Clips the view to a specific shape."}],"blockTags":[{"tag":"@see","content":[{"kind":"text","text":"Official [SwiftUI documentation](https://developer.apple.com/documentation/swiftui/view/clipshape(_:style:))."}]}]},"parameters":[{"name":"shape","variant":"param","kind":32768,"comment":{"summary":[{"kind":"text","text":"The clipping shape."}]},"type":{"type":"union","types":[{"type":"literal","value":"roundedRectangle"},{"type":"literal","value":"capsule"},{"type":"literal","value":"rectangle"},{"type":"literal","value":"ellipse"},{"type":"literal","value":"circle"},{"type":"literal","value":"containerRelativeShape"}]}},{"name":"cornerRadius","variant":"param","kind":32768,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Corner radius for rounded rectangle (default: 8)"}]},"type":{"type":"intrinsic","name":"number"}}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"colorInvert","variant":"declaration","kind":64,"signatures":[{"name":"colorInvert","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Inverts the colors of a view."}],"blockTags":[{"tag":"@see","content":[{"kind":"text","text":"Official [SwiftUI documentation](https://developer.apple.com/documentation/swiftui/view/colorinvert())."}]}]},"parameters":[{"name":"inverted","variant":"param","kind":32768,"comment":{"summary":[{"kind":"text","text":"Whether to invert colors."}]},"type":{"type":"intrinsic","name":"boolean"},"defaultValue":"true"}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"containerBackground","variant":"declaration","kind":64,"signatures":[{"name":"containerBackground","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Sets the container background of the enclosing container using a view."}],"blockTags":[{"tag":"@see","content":[{"kind":"text","text":"Official [SwiftUI documentation](https://developer.apple.com/documentation/swiftui/view/containerbackground(_:for:))."}]}]},"parameters":[{"name":"color","variant":"param","kind":32768,"comment":{"summary":[{"kind":"text","text":"The color to set as the background of the container."}]},"type":{"type":"reference","name":"Color","package":"@expo/ui"}},{"name":"container","variant":"param","kind":32768,"comment":{"summary":[{"kind":"text","text":"The type of container to apply the background to."}]},"type":{"type":"reference","name":"ContainerBackgroundPlacement","package":"@expo/ui"}}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"containerRelativeFrame","variant":"declaration","kind":64,"signatures":[{"name":"containerRelativeFrame","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Positions this view within an invisible frame with a size relative to the nearest container."}],"blockTags":[{"tag":"@see","content":[{"kind":"text","text":"Official [SwiftUI documentation](https://developer.apple.com/documentation/SwiftUI/View/containerRelativeFrame(_:alignment:))."}]},{"tag":"@platform","content":[{"kind":"text","text":"ios 17.0+"}]},{"tag":"@platform","content":[{"kind":"text","text":"tvos 17.0+"}]}]},"parameters":[{"name":"params","variant":"param","kind":32768,"comment":{"summary":[{"kind":"text","text":"The content relative frame parameters: "},{"kind":"code","text":"`axes`"},{"kind":"text","text":", "},{"kind":"code","text":"`count`"},{"kind":"text","text":", "},{"kind":"code","text":"`span`"},{"kind":"text","text":", "},{"kind":"code","text":"`spacing`"},{"kind":"text","text":" and "},{"kind":"code","text":"`alignment`"},{"kind":"text","text":"."}]},"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"children":[{"name":"alignment","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"union","types":[{"type":"literal","value":"center"},{"type":"literal","value":"top"},{"type":"literal","value":"bottom"},{"type":"literal","value":"topLeading"},{"type":"literal","value":"topTrailing"},{"type":"literal","value":"leading"},{"type":"literal","value":"trailing"},{"type":"literal","value":"bottomLeading"},{"type":"literal","value":"bottomTrailing"}]}},{"name":"axes","variant":"declaration","kind":1024,"type":{"type":"union","types":[{"type":"literal","value":"horizontal"},{"type":"literal","value":"vertical"},{"type":"literal","value":"both"}]}},{"name":"count","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"intrinsic","name":"number"}},{"name":"spacing","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"intrinsic","name":"number"}},{"name":"span","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"intrinsic","name":"number"}}]}}}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"containerShape","variant":"declaration","kind":64,"signatures":[{"name":"containerShape","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Sets the container shape for the view."}],"blockTags":[{"tag":"@see","content":[{"kind":"text","text":"Official [SwiftUI documentation](https://developer.apple.com/documentation/swiftui/view/containershape(_:))."}]}]},"parameters":[{"name":"shape","variant":"param","kind":32768,"comment":{"summary":[{"kind":"text","text":"A shape configuration from the shapes API"}]},"type":{"type":"reference","name":"Shape","package":"@expo/ui"}}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"contentShape","variant":"declaration","kind":64,"signatures":[{"name":"contentShape","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Defines the content shape for hit-testing purposes.\n\nThis modifier is essential for making entire view areas (including "},{"kind":"code","text":"`Spacer`"},{"kind":"text","text":" or empty space)\ninteractive. Without it, only visible elements like "},{"kind":"code","text":"`Text`"},{"kind":"text","text":" or "},{"kind":"code","text":"`Image`"},{"kind":"text","text":" respond to tap gestures."}],"blockTags":[{"tag":"@example","content":[{"kind":"code","text":"```tsx\nimport { HStack, List, Section, Spacer, Text } from \"@expo/ui/swift-ui\";\nimport { contentShape, onTapGesture } from \"@expo/ui/swift-ui/modifiers\";\nimport { shapes } from \"@expo/ui/swift-ui/modifiers\";\n\nfunction InteractiveRow() {\n return (\n \n
\n console.log(\"Row tapped!\"))\n ]}\n >\n Label\n \n Value\n \n
\n
\n );\n}\n```"}]},{"tag":"@see","content":[{"kind":"text","text":"Official [SwiftUI documentation](https://developer.apple.com/documentation/swiftui/view/contentshape(_:eofill:))."}]}]},"parameters":[{"name":"shape","variant":"param","kind":32768,"comment":{"summary":[{"kind":"text","text":"A shape configuration from the shapes API (rectangle, circle, capsule, ellipse, roundedRectangle)."}]},"type":{"type":"reference","name":"Shape","package":"@expo/ui"}}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"contentTransition","variant":"declaration","kind":64,"signatures":[{"name":"contentTransition","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Sets the content transition type for a view.\nUseful for animating changes in text content, especially numeric text.\nUse with the ["},{"kind":"code","text":"`animation`"},{"kind":"text","text":"](#animationanimationobject-animatedvalue) modifier to animate the transition when the content changes."}],"blockTags":[{"tag":"@example","content":[{"kind":"code","text":"```tsx\n\n {count.toString()}\n\n```"}]},{"tag":"@platform","content":[{"kind":"text","text":"ios 16.0+"}]},{"tag":"@platform","content":[{"kind":"text","text":"tvos 16.0+"}]},{"tag":"@see","content":[{"kind":"text","text":"Official [SwiftUI documentation](https://developer.apple.com/documentation/swiftui/view/contenttransition(_:))."}]}]},"parameters":[{"name":"transitionType","variant":"param","kind":32768,"comment":{"summary":[{"kind":"text","text":"The type of content transition."}]},"type":{"type":"union","types":[{"type":"literal","value":"identity"},{"type":"literal","value":"numericText"},{"type":"literal","value":"opacity"},{"type":"literal","value":"interpolate"}]}},{"name":"params","variant":"param","kind":32768,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Optional parameters."}]},"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"children":[{"name":"countsDown","variant":"declaration","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Whether the numeric text counts down."}]},"type":{"type":"intrinsic","name":"boolean"}}]}}}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"contrast","variant":"declaration","kind":64,"signatures":[{"name":"contrast","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Adjusts the contrast of a view."}],"blockTags":[{"tag":"@see","content":[{"kind":"text","text":"Official [SwiftUI documentation](https://developer.apple.com/documentation/swiftui/view/contrast(_:))."}]}]},"parameters":[{"name":"amount","variant":"param","kind":32768,"comment":{"summary":[{"kind":"text","text":"Contrast multiplier (0 to infinity, 1 = normal)."}]},"type":{"type":"intrinsic","name":"number"}}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"controlSize","variant":"declaration","kind":64,"signatures":[{"name":"controlSize","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Sets the size of controls within this view."}],"blockTags":[{"tag":"@see","content":[{"kind":"text","text":"Official [SwiftUI documentation](https://developer.apple.com/documentation/swiftui/view/controlsize(_:))."}]}]},"parameters":[{"name":"size","variant":"param","kind":32768,"comment":{"summary":[{"kind":"text","text":"The control size."}]},"type":{"type":"union","types":[{"type":"literal","value":"small"},{"type":"literal","value":"large"},{"type":"literal","value":"mini"},{"type":"literal","value":"regular"},{"type":"literal","value":"extraLarge"}]}}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"cornerRadius","variant":"declaration","kind":64,"signatures":[{"name":"cornerRadius","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Applies corner radius to a view."}],"blockTags":[{"tag":"@see","content":[{"kind":"text","text":"Official [SwiftUI documentation](https://developer.apple.com/documentation/swiftui/view/cornerradius(_:antialiased:))."}]}]},"parameters":[{"name":"radius","variant":"param","kind":32768,"comment":{"summary":[{"kind":"text","text":"The corner radius value."}]},"type":{"type":"intrinsic","name":"number"}}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"createModifier","variant":"declaration","kind":64,"signatures":[{"name":"createModifier","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Factory function to create modifier configuration objects.\nThis is used by all built-in modifier functions and can be used by 3rd party libraries to create custom modifiers."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"A "},{"kind":"code","text":"`ModifierConfig`"},{"kind":"text","text":" object that can be passed in the "},{"kind":"code","text":"`modifiers`"},{"kind":"text","text":" prop array."}]},{"tag":"@example","content":[{"kind":"code","text":"```ts\n// In a 3rd party package\nimport { createModifier } from '@expo/ui/swift-ui/modifiers';\n\nexport const blurEffect = (params: { radius: number; style?: string }) =>\n createModifier('blurEffect', params);\n```"}]}]},"parameters":[{"name":"type","variant":"param","kind":32768,"comment":{"summary":[{"kind":"text","text":"The modifier type string that maps to a registered native modifier."}]},"type":{"type":"intrinsic","name":"string"}},{"name":"params","variant":"param","kind":32768,"comment":{"summary":[{"kind":"text","text":"Additional parameters to pass to the modifier."}]},"type":{"type":"reference","target":{"packageName":"typescript","packagePath":"lib/lib.es5.d.ts","qualifiedName":"Record"},"typeArguments":[{"type":"intrinsic","name":"string"},{"type":"intrinsic","name":"any"}],"name":"Record","package":"typescript"},"defaultValue":"{}"}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"createModifierWithEventListener","variant":"declaration","kind":64,"signatures":[{"name":"createModifierWithEventListener","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Creates a modifier with an event listener."}]},"parameters":[{"name":"type","variant":"param","kind":32768,"type":{"type":"intrinsic","name":"string"}},{"name":"eventListener","variant":"param","kind":32768,"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"signatures":[{"name":"__type","variant":"signature","kind":4096,"parameters":[{"name":"args","variant":"param","kind":32768,"type":{"type":"intrinsic","name":"any"}}],"type":{"type":"intrinsic","name":"void"}}]}}},{"name":"params","variant":"param","kind":32768,"type":{"type":"reference","target":{"packageName":"typescript","packagePath":"lib/lib.es5.d.ts","qualifiedName":"Record"},"typeArguments":[{"type":"intrinsic","name":"string"},{"type":"intrinsic","name":"any"}],"name":"Record","package":"typescript"},"defaultValue":"{}"}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"createViewModifierEventListener","variant":"declaration","kind":64,"signatures":[{"name":"createViewModifierEventListener","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Create an event listener for a view modifier."}]},"parameters":[{"name":"modifiers","variant":"param","kind":32768,"comment":{"summary":[{"kind":"text","text":"An array of modifier configs to extract event listeners from."}]},"type":{"type":"array","elementType":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}}],"type":{"type":"reference","name":"GlobalEvent","package":"@expo/ui"}}]},{"name":"datePickerStyle","variant":"declaration","kind":64,"signatures":[{"name":"datePickerStyle","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Sets the style for the date picker."}],"blockTags":[{"tag":"@see","content":[{"kind":"text","text":"Official [SwiftUI documentation](https://developer.apple.com/documentation/swiftui/view/datepickerstyle(_:))."}]}]},"parameters":[{"name":"style","variant":"param","kind":32768,"comment":{"summary":[{"kind":"text","text":"The style for the date picker."}]},"type":{"type":"reference","name":"DatePickerStyleType","package":"@expo/ui"}}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"defaultScrollAnchor","variant":"declaration","kind":64,"signatures":[{"name":"defaultScrollAnchor","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Sets the default anchor point for a scroll view's content."}],"blockTags":[{"tag":"@platform","content":[{"kind":"text","text":"ios 17.0+"}]},{"tag":"@platform","content":[{"kind":"text","text":"tvos 17.0+"}]},{"tag":"@platform","content":[{"kind":"text","text":"macos 14.0+"}]},{"tag":"@see","content":[{"kind":"text","text":"Official [SwiftUI documentation](https://developer.apple.com/documentation/swiftui/view/defaultscrollanchor(_:))."}]}]},"parameters":[{"name":"anchor","variant":"param","kind":32768,"comment":{"summary":[{"kind":"text","text":"The anchor point for initial scroll position and content size changes, or "},{"kind":"code","text":"`null`"},{"kind":"text","text":" to reset."}]},"type":{"type":"union","types":[{"type":"reference","name":"UnitPointValue","package":"@expo/ui"},{"type":"literal","value":null}]}}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"defaultScrollAnchorForRole","variant":"declaration","kind":64,"signatures":[{"name":"defaultScrollAnchorForRole","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Sets the default anchor point for a scroll view for a specific role.\nPass "},{"kind":"code","text":"`null`"},{"kind":"text","text":" to opt out of a specific role while keeping anchors for other roles."}],"blockTags":[{"tag":"@platform","content":[{"kind":"text","text":"ios 18.0+"}]},{"tag":"@platform","content":[{"kind":"text","text":"tvos 18.0+"}]},{"tag":"@platform","content":[{"kind":"text","text":"macos 15.0+"}]},{"tag":"@see","content":[{"kind":"text","text":"Official [SwiftUI documentation](https://developer.apple.com/documentation/swiftui/view/defaultscrollanchor(_:for:))."}]}]},"parameters":[{"name":"anchor","variant":"param","kind":32768,"comment":{"summary":[{"kind":"text","text":"The anchor point, or "},{"kind":"code","text":"`null`"},{"kind":"text","text":" to opt out of this role."}]},"type":{"type":"union","types":[{"type":"reference","name":"UnitPointValue","package":"@expo/ui"},{"type":"literal","value":null}]}},{"name":"role","variant":"param","kind":32768,"comment":{"summary":[{"kind":"text","text":"The scroll anchor role: "},{"kind":"code","text":"`'initialOffset'`"},{"kind":"text","text":", "},{"kind":"code","text":"`'sizeChanges'`"},{"kind":"text","text":", or "},{"kind":"code","text":"`'alignment'`"},{"kind":"text","text":"."}]},"type":{"type":"union","types":[{"type":"literal","value":"initialOffset"},{"type":"literal","value":"sizeChanges"},{"type":"literal","value":"alignment"}]}}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"deleteDisabled","variant":"declaration","kind":64,"signatures":[{"name":"deleteDisabled","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Disables the delete action for a view in a list.\nApply to items within a "},{"kind":"code","text":"`ForEach`"},{"kind":"text","text":" to prevent them from being deleted."}],"blockTags":[{"tag":"@default","content":[{"kind":"text","text":"true"}]},{"tag":"@see","content":[{"kind":"text","text":"Official [SwiftUI documentation](https://developer.apple.com/documentation/swiftui/view/deletedisabled(_:))."}]}]},"parameters":[{"name":"disabled","variant":"param","kind":32768,"comment":{"summary":[{"kind":"text","text":"Whether deletion should be disabled"}]},"type":{"type":"intrinsic","name":"boolean"},"defaultValue":"true"}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"disabled","variant":"declaration","kind":64,"signatures":[{"name":"disabled","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Disables or enables a view."}],"blockTags":[{"tag":"@see","content":[{"kind":"text","text":"Official [SwiftUI documentation](https://developer.apple.com/documentation/swiftui/view/disabled(_:))."}]}]},"parameters":[{"name":"disabled","variant":"param","kind":32768,"comment":{"summary":[{"kind":"text","text":"Whether the view should be disabled."}]},"type":{"type":"intrinsic","name":"boolean"},"defaultValue":"true"}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"environment","variant":"declaration","kind":64,"signatures":[{"name":"environment","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Sets a SwiftUI environment value."}],"blockTags":[{"tag":"@see","content":[{"kind":"text","text":"Official [SwiftUI documentation](https://developer.apple.com/documentation/swiftui/view/environment(_:_:))."}]}]},"parameters":[{"name":"config","variant":"param","kind":32768,"type":{"type":"reference","name":"EnvironmentConfig","package":"@expo/ui"}}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}},{"name":"environment","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Sets a SwiftUI environment value."}],"blockTags":[{"tag":"@see","content":[{"kind":"text","text":"Official [SwiftUI documentation](https://developer.apple.com/documentation/swiftui/view/environment(_:_:))."}]}]},"parameters":[{"name":"key","variant":"param","kind":32768,"type":{"type":"union","types":[{"type":"literal","value":"colorScheme"},{"type":"literal","value":"editMode"},{"type":"literal","value":"locale"},{"type":"literal","value":"timeZone"}]}},{"name":"value","variant":"param","kind":32768,"type":{"type":"intrinsic","name":"string"}}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"fixedSize","variant":"declaration","kind":64,"signatures":[{"name":"fixedSize","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Controls fixed size behavior."}],"blockTags":[{"tag":"@see","content":[{"kind":"text","text":"Official [SwiftUI documentation](https://developer.apple.com/documentation/swiftui/view/fixedsize())."}]}]},"parameters":[{"name":"params","variant":"param","kind":32768,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Whether the view should use its ideal width or height."}]},"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"children":[{"name":"horizontal","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"intrinsic","name":"boolean"}},{"name":"vertical","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"intrinsic","name":"boolean"}}]}}}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"font","variant":"declaration","kind":64,"signatures":[{"name":"font","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Sets the font properties of a view.\n\nPass "},{"kind":"code","text":"`textStyle`"},{"kind":"text","text":" to scale with the user's Dynamic Type setting. Combine\nit with "},{"kind":"code","text":"`family`"},{"kind":"text","text":" to scale a custom font."}],"blockTags":[{"tag":"@example","content":[{"kind":"code","text":"```tsx\n// Scales with Dynamic Type\nHello\n\n// Custom font that scales relative to the body text style\nHi\n\n// Fixed-size system font (no Dynamic Type scaling)\nStatic\n```"}]},{"tag":"@see","content":[{"kind":"text","text":"Official SwiftUI documentation for ["},{"kind":"code","text":"`system(_:design:weight:)`"},{"kind":"text","text":"](https://developer.apple.com/documentation/swiftui/font/system(_:design:weight:)), and ["},{"kind":"code","text":"`custom(_:size:relativeTo:)`"},{"kind":"text","text":"](https://developer.apple.com/documentation/swiftui/font/custom(_:size:relativeto:))."}]}]},"parameters":[{"name":"params","variant":"param","kind":32768,"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"children":[{"name":"design","variant":"declaration","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Font design. Applied when no "},{"kind":"code","text":"`family`"},{"kind":"text","text":" is provided. "},{"kind":"code","text":"`Font.custom`"},{"kind":"text","text":" always uses the embedded font's own design."}]},"type":{"type":"union","types":[{"type":"literal","value":"default"},{"type":"literal","value":"rounded"},{"type":"literal","value":"serif"},{"type":"literal","value":"monospaced"}]}},{"name":"family","variant":"declaration","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Custom font family name."}]},"type":{"type":"intrinsic","name":"string"}},{"name":"size","variant":"declaration","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Font size in points. Ignored when only "},{"kind":"code","text":"`textStyle`"},{"kind":"text","text":" is set."}],"blockTags":[{"tag":"@default","content":[{"kind":"text","text":"17"}]}]},"type":{"type":"intrinsic","name":"number"}},{"name":"textStyle","variant":"declaration","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"SwiftUI text style. When set, the resulting font scales with the user's\nDynamic Type setting."}]},"type":{"type":"union","types":[{"type":"literal","value":"largeTitle"},{"type":"literal","value":"title"},{"type":"literal","value":"title2"},{"type":"literal","value":"title3"},{"type":"literal","value":"headline"},{"type":"literal","value":"subheadline"},{"type":"literal","value":"body"},{"type":"literal","value":"callout"},{"type":"literal","value":"footnote"},{"type":"literal","value":"caption"},{"type":"literal","value":"caption2"}]}},{"name":"weight","variant":"declaration","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Font weight."}]},"type":{"type":"union","types":[{"type":"literal","value":"light"},{"type":"literal","value":"bold"},{"type":"literal","value":"black"},{"type":"literal","value":"medium"},{"type":"literal","value":"regular"},{"type":"literal","value":"ultraLight"},{"type":"literal","value":"thin"},{"type":"literal","value":"semibold"},{"type":"literal","value":"heavy"}]}}]}}}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"foregroundColor","variant":"declaration","kind":64,"signatures":[{"name":"foregroundColor","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Sets the foreground color/tint of a view."}],"blockTags":[{"tag":"@deprecated","content":[{"kind":"text","text":"Use "},{"kind":"code","text":"`foregroundStyle`"},{"kind":"text","text":" instead."}]},{"tag":"@see","content":[{"kind":"text","text":"Official [SwiftUI documentation](https://developer.apple.com/documentation/swiftui/view/foregroundcolor(_:))."}]}]},"parameters":[{"name":"color","variant":"param","kind":32768,"comment":{"summary":[{"kind":"text","text":"The foreground color (hex string)."}]},"type":{"type":"reference","name":"Color","package":"@expo/ui"}}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"foregroundStyle","variant":"declaration","kind":64,"signatures":[{"name":"foregroundStyle","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Sets the foreground style of a view with comprehensive styling options.\n\nReplaces the deprecated "},{"kind":"code","text":"`foregroundColor`"},{"kind":"text","text":" modifier with enhanced capabilities including\ncolors, gradients, and semantic hierarchical styles that adapt to system appearance."}],"blockTags":[{"tag":"@example","content":[{"kind":"code","text":"```tsx\n// Simple usage\nRed Text\n\n// Adaptive hierarchical styling\n\n Supporting Text\n\n\n// Linear gradient\n\n Gradient Text\n\n```"}]},{"tag":"@returns","content":[{"kind":"text","text":"A view modifier that applies the specified foreground style"}]},{"tag":"@since","content":[{"kind":"text","text":"iOS 15.0+ (hierarchical quinary requires iOS 16.0+)"}]},{"tag":"@see","content":[{"kind":"text","text":"Official [SwiftUI documentation](https://developer.apple.com/documentation/swiftui/view/foregroundstyle(_:))."}]}]},"parameters":[{"name":"style","variant":"param","kind":32768,"comment":{"summary":[{"kind":"text","text":"The foreground style configuration. Can be:\n\n**Simple Color ("},{"kind":"code","text":"`Color`"},{"kind":"text","text":"):**\n- Hex colors: "},{"kind":"code","text":"`'#FF0000'`"},{"kind":"text","text":", "},{"kind":"code","text":"`'#RGB'`"},{"kind":"text","text":", "},{"kind":"code","text":"`'#RRGGBB'`"},{"kind":"text","text":", "},{"kind":"code","text":"`'#AARRGGBB'`"},{"kind":"text","text":"\n- Named colors: "},{"kind":"code","text":"`'red'`"},{"kind":"text","text":", "},{"kind":"code","text":"`'blue'`"},{"kind":"text","text":", "},{"kind":"code","text":"`'green'`"},{"kind":"text","text":", and so on.\n- React Native color values like "},{"kind":"code","text":"`PlatformColor('label')`"},{"kind":"text","text":"\n\n**Explicit Color Object:**\n"},{"kind":"code","text":"```ts\n{ type: 'color', color: PlatformColor('label') }\n```"},{"kind":"text","text":"\n\n**Hierarchical Styles (Semantic):**\nAuto-adapting semantic styles that respond to light/dark mode and accessibility settings:\n"},{"kind":"code","text":"```ts\n{ type: 'hierarchical', style: 'primary' } // Most prominent (main content, headlines)\n{ type: 'hierarchical', style: 'secondary' } // Supporting text, subheadlines\n{ type: 'hierarchical', style: 'tertiary' } // Less important text, captions\n{ type: 'hierarchical', style: 'quaternary' } // Subtle text, disabled states\n{ type: 'hierarchical', style: 'quinary' } // Most subtle (iOS 16+, fallback to quaternary)\n```"},{"kind":"text","text":"\n\n**Linear Gradient:**\n"},{"kind":"code","text":"```ts\n{\n type: 'linearGradient',\n colors: [PlatformColor('systemPink'), '#0000FF', '#00FF00'],\n startPoint: { x: 0, y: 0 }, // Top-left\n endPoint: { x: 1, y: 1 } // Bottom-right\n}\n```"},{"kind":"text","text":"\n\n**Radial Gradient:**\n"},{"kind":"code","text":"```ts\n{\n type: 'radialGradient',\n colors: [PlatformColor('systemPink'), '#0000FF'],\n center: { x: 0.5, y: 0.5 }, // Center of view\n startRadius: 0, // Inner radius\n endRadius: 100 // Outer radius\n}\n```"},{"kind":"text","text":"\n\n**Angular Gradient (Conic):**\n"},{"kind":"code","text":"```ts\n{\n type: 'angularGradient',\n colors: [PlatformColor('systemPink'), '#00FF00', '#0000FF'],\n center: { x: 0.5, y: 0.5 } // Rotation center\n}\n```"}]},"type":{"type":"union","types":[{"type":"reference","name":"Color","package":"@expo/ui"},{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"children":[{"name":"color","variant":"declaration","kind":1024,"type":{"type":"reference","name":"Color","package":"@expo/ui"}},{"name":"type","variant":"declaration","kind":1024,"type":{"type":"literal","value":"color"}}]}},{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"children":[{"name":"style","variant":"declaration","kind":1024,"type":{"type":"union","types":[{"type":"literal","value":"primary"},{"type":"literal","value":"secondary"},{"type":"literal","value":"tertiary"},{"type":"literal","value":"quaternary"},{"type":"literal","value":"quinary"}]}},{"name":"type","variant":"declaration","kind":1024,"type":{"type":"literal","value":"hierarchical"}}]}},{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"children":[{"name":"colors","variant":"declaration","kind":1024,"type":{"type":"array","elementType":{"type":"reference","name":"Color","package":"@expo/ui"}}},{"name":"endPoint","variant":"declaration","kind":1024,"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"children":[{"name":"x","variant":"declaration","kind":1024,"type":{"type":"intrinsic","name":"number"}},{"name":"y","variant":"declaration","kind":1024,"type":{"type":"intrinsic","name":"number"}}]}}},{"name":"startPoint","variant":"declaration","kind":1024,"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"children":[{"name":"x","variant":"declaration","kind":1024,"type":{"type":"intrinsic","name":"number"}},{"name":"y","variant":"declaration","kind":1024,"type":{"type":"intrinsic","name":"number"}}]}}},{"name":"type","variant":"declaration","kind":1024,"type":{"type":"literal","value":"linearGradient"}}]}},{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"children":[{"name":"center","variant":"declaration","kind":1024,"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"children":[{"name":"x","variant":"declaration","kind":1024,"type":{"type":"intrinsic","name":"number"}},{"name":"y","variant":"declaration","kind":1024,"type":{"type":"intrinsic","name":"number"}}]}}},{"name":"colors","variant":"declaration","kind":1024,"type":{"type":"array","elementType":{"type":"reference","name":"Color","package":"@expo/ui"}}},{"name":"endRadius","variant":"declaration","kind":1024,"type":{"type":"intrinsic","name":"number"}},{"name":"startRadius","variant":"declaration","kind":1024,"type":{"type":"intrinsic","name":"number"}},{"name":"type","variant":"declaration","kind":1024,"type":{"type":"literal","value":"radialGradient"}}]}},{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"children":[{"name":"center","variant":"declaration","kind":1024,"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"children":[{"name":"x","variant":"declaration","kind":1024,"type":{"type":"intrinsic","name":"number"}},{"name":"y","variant":"declaration","kind":1024,"type":{"type":"intrinsic","name":"number"}}]}}},{"name":"colors","variant":"declaration","kind":1024,"type":{"type":"array","elementType":{"type":"reference","name":"Color","package":"@expo/ui"}}},{"name":"type","variant":"declaration","kind":1024,"type":{"type":"literal","value":"angularGradient"}}]}}]}}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"frame","variant":"declaration","kind":64,"signatures":[{"name":"frame","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Sets the frame properties of a view."}],"blockTags":[{"tag":"@see","content":[{"kind":"text","text":"Official [SwiftUI documentation](https://developer.apple.com/documentation/SwiftUI/View/frame(width:height:alignment:))."}]}]},"parameters":[{"name":"params","variant":"param","kind":32768,"comment":{"summary":[{"kind":"text","text":"The frame parameters. Width, height, minWidth, maxWidth, minHeight, maxHeight, idealWidth, idealHeight and alignment."}]},"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"children":[{"name":"alignment","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"union","types":[{"type":"literal","value":"center"},{"type":"literal","value":"top"},{"type":"literal","value":"bottom"},{"type":"literal","value":"topLeading"},{"type":"literal","value":"topTrailing"},{"type":"literal","value":"leading"},{"type":"literal","value":"trailing"},{"type":"literal","value":"bottomLeading"},{"type":"literal","value":"bottomTrailing"}]}},{"name":"height","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"intrinsic","name":"number"}},{"name":"idealHeight","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"intrinsic","name":"number"}},{"name":"idealWidth","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"intrinsic","name":"number"}},{"name":"maxHeight","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"intrinsic","name":"number"}},{"name":"maxWidth","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"intrinsic","name":"number"}},{"name":"minHeight","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"intrinsic","name":"number"}},{"name":"minWidth","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"intrinsic","name":"number"}},{"name":"width","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"intrinsic","name":"number"}}]}}}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"gaugeStyle","variant":"declaration","kind":64,"signatures":[{"name":"gaugeStyle","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Sets the style for the gauge."}],"blockTags":[{"tag":"@see","content":[{"kind":"text","text":"Official [SwiftUI documentation](https://developer.apple.com/documentation/swiftui/gaugestyle)."}]}]},"parameters":[{"name":"style","variant":"param","kind":32768,"comment":{"summary":[{"kind":"text","text":"The style for the gauge."}]},"type":{"type":"reference","name":"GaugeStyleType","package":"@expo/ui"}}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"glassEffect","variant":"declaration","kind":64,"signatures":[{"name":"glassEffect","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Applies a glass effect to a view."}],"blockTags":[{"tag":"@see","content":[{"kind":"text","text":"Official [SwiftUI documentation](https://developer.apple.com/documentation/swiftui/view/glasseffect(_:in:))."}]}]},"parameters":[{"name":"params","variant":"param","kind":32768,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"The glass effect parameters. Variant, interactive, tint and shape."}]},"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"children":[{"name":"cornerRadius","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"intrinsic","name":"number"}},{"name":"glass","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"children":[{"name":"interactive","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"intrinsic","name":"boolean"}},{"name":"tint","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"reference","name":"Color","package":"@expo/ui"}},{"name":"variant","variant":"declaration","kind":1024,"type":{"type":"union","types":[{"type":"literal","value":"clear"},{"type":"literal","value":"regular"},{"type":"literal","value":"identity"}]}}]}}},{"name":"shape","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"union","types":[{"type":"literal","value":"roundedRectangle"},{"type":"literal","value":"capsule"},{"type":"literal","value":"rectangle"},{"type":"literal","value":"ellipse"},{"type":"literal","value":"circle"},{"type":"literal","value":"containerRelativeShape"}]}}]}}}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"glassEffectId","variant":"declaration","kind":64,"signatures":[{"name":"glassEffectId","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Associates an identity value to Liquid Glass effects defined within a "},{"kind":"code","text":"`GlassEffectContainer`"},{"kind":"text","text":"."}],"blockTags":[{"tag":"@see","content":[{"kind":"text","text":"Official [SwiftUI documentation](https://developer.apple.com/documentation/swiftui/view/glasseffectid(_:in:))."}]}]},"parameters":[{"name":"id","variant":"param","kind":32768,"comment":{"summary":[{"kind":"text","text":"The id of the glass effect."}]},"type":{"type":"intrinsic","name":"string"}},{"name":"namespaceId","variant":"param","kind":32768,"comment":{"summary":[{"kind":"text","text":"The namespace id of the glass effect. Use Namespace component to create a namespace."}]},"type":{"type":"intrinsic","name":"string"}}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"grayscale","variant":"declaration","kind":64,"signatures":[{"name":"grayscale","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Makes a view grayscale."}],"blockTags":[{"tag":"@see","content":[{"kind":"text","text":"Official [SwiftUI documentation](https://developer.apple.com/documentation/swiftui/view/grayscale(_:))."}]}]},"parameters":[{"name":"amount","variant":"param","kind":32768,"comment":{"summary":[{"kind":"text","text":"Grayscale amount (0 to 1)."}]},"type":{"type":"intrinsic","name":"number"}}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"gridCellAnchor","variant":"declaration","kind":64,"signatures":[{"name":"gridCellAnchor","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Specifies a custom alignment anchor for a view that acts as a grid cell."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"A view that uses the specified anchor point to align its content."}]},{"tag":"@platform","content":[{"kind":"text","text":"iOS 16+"}]},{"tag":"@example","content":[{"kind":"code","text":"```tsx\n// Using a preset anchor\n\n\n// Using a custom anchor point\n\n```"}]}]},"parameters":[{"name":"anchor","variant":"param","kind":32768,"comment":{"summary":[{"kind":"text","text":"The unit point that defines how to align the view within the bounds of its grid cell."}]},"type":{"type":"union","types":[{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"children":[{"name":"anchor","variant":"declaration","kind":1024,"type":{"type":"union","types":[{"type":"literal","value":"center"},{"type":"literal","value":"top"},{"type":"literal","value":"bottom"},{"type":"literal","value":"zero"},{"type":"literal","value":"topLeading"},{"type":"literal","value":"topTrailing"},{"type":"literal","value":"leading"},{"type":"literal","value":"trailing"},{"type":"literal","value":"bottomLeading"},{"type":"literal","value":"bottomTrailing"}]}},{"name":"type","variant":"declaration","kind":1024,"type":{"type":"literal","value":"preset"}}]}},{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"children":[{"name":"points","variant":"declaration","kind":1024,"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"children":[{"name":"x","variant":"declaration","kind":1024,"type":{"type":"intrinsic","name":"number"}},{"name":"y","variant":"declaration","kind":1024,"type":{"type":"intrinsic","name":"number"}}]}}},{"name":"type","variant":"declaration","kind":1024,"type":{"type":"literal","value":"custom"}}]}}]}}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"gridCellColumns","variant":"declaration","kind":64,"signatures":[{"name":"gridCellColumns","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Tells a view that acts as a cell in a grid to span the specified number of columns."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"A view that occupies the specified number of columns in a grid row."}]}]},"parameters":[{"name":"count","variant":"param","kind":32768,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"The number of columns that the view should consume when placed in a grid row."}]},"type":{"type":"intrinsic","name":"number"}}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"gridCellUnsizedAxes","variant":"declaration","kind":64,"signatures":[{"name":"gridCellUnsizedAxes","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Asks grid layouts not to offer the view extra size in the specified axes."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"A view that doesn’t ask an enclosing grid for extra size in one or more axes."}]}]},"parameters":[{"name":"axes","variant":"param","kind":32768,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"The dimensions in which the grid shouldn’t offer the view a share of any available space. This prevents a flexible view like a Spacer, Divider, or Color from defining the size of a row or column."}]},"type":{"type":"union","types":[{"type":"literal","value":"horizontal"},{"type":"literal","value":"vertical"}]}}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"gridColumnAlignment","variant":"declaration","kind":64,"signatures":[{"name":"gridColumnAlignment","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Overrides the default horizontal alignment of the grid column that the view appears in."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"A view that uses the specified horizontal alignment, and that causes all cells in the same column of a grid to use the same alignment."}]},{"tag":"@platform","content":[{"kind":"text","text":"iOS 16+"}]}]},"parameters":[{"name":"alignment","variant":"param","kind":32768,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"The HorizontalAlignment guide to use for the grid column that the view appears in."}]},"type":{"type":"union","types":[{"type":"literal","value":"center"},{"type":"literal","value":"leading"},{"type":"literal","value":"trailing"}]}}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"headerProminence","variant":"declaration","kind":64,"signatures":[{"name":"headerProminence","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Sets the header prominence for this view."}]},"parameters":[{"name":"prominence","variant":"param","kind":32768,"comment":{"summary":[{"kind":"text","text":"The prominence to apply."}]},"type":{"type":"union","types":[{"type":"literal","value":"standard"},{"type":"literal","value":"increased"}]}}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"hidden","variant":"declaration","kind":64,"signatures":[{"name":"hidden","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Hides or shows a view."}],"blockTags":[{"tag":"@see","content":[{"kind":"text","text":"Official [SwiftUI documentation](https://developer.apple.com/documentation/swiftui/view/hidden(_:))."}]}]},"parameters":[{"name":"hidden","variant":"param","kind":32768,"comment":{"summary":[{"kind":"text","text":"Whether the view should be hidden."}]},"type":{"type":"intrinsic","name":"boolean"},"defaultValue":"true"}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"hueRotation","variant":"declaration","kind":64,"signatures":[{"name":"hueRotation","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Applies a hue rotation to a view."}],"blockTags":[{"tag":"@see","content":[{"kind":"text","text":"Official [SwiftUI documentation](https://developer.apple.com/documentation/swiftui/view/huerotation(_:))."}]}]},"parameters":[{"name":"angle","variant":"param","kind":32768,"comment":{"summary":[{"kind":"text","text":"Hue rotation angle in degrees."}]},"type":{"type":"intrinsic","name":"number"}}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"id","variant":"declaration","kind":64,"signatures":[{"name":"id","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Attaches a stable identifier to a view so it can be referenced by scroll target bindings.\nUse with "},{"kind":"code","text":"`scrollTargetLayout()`"},{"kind":"text","text":" on the containing stack and the "},{"kind":"code","text":"`scrollPosition`"},{"kind":"text","text":" modifier on a scrollable container."}],"blockTags":[{"tag":"@see","content":[{"kind":"text","text":"Official [SwiftUI documentation](https://developer.apple.com/documentation/swiftui/view/id(_:))."}]}]},"parameters":[{"name":"value","variant":"param","kind":32768,"comment":{"summary":[{"kind":"text","text":"String identifier matched by "},{"kind":"code","text":"`scrollPosition`"},{"kind":"text","text":"'s observable state."}]},"type":{"type":"intrinsic","name":"string"}}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"ignoreSafeArea","variant":"declaration","kind":64,"signatures":[{"name":"ignoreSafeArea","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Allows a view to ignore safe area constraints."}],"blockTags":[{"tag":"@see","content":[{"kind":"text","text":"Official [SwiftUI documentation](https://developer.apple.com/documentation/swiftui/view/ignoressafearea(_:edges:))."}]}]},"parameters":[{"name":"params","variant":"param","kind":32768,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"The safe area regions to ignore and the edges to expand into."}]},"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"children":[{"name":"edges","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"union","types":[{"type":"literal","value":"top"},{"type":"literal","value":"bottom"},{"type":"literal","value":"leading"},{"type":"literal","value":"trailing"},{"type":"literal","value":"horizontal"},{"type":"literal","value":"vertical"},{"type":"literal","value":"all"}]}},{"name":"regions","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"union","types":[{"type":"literal","value":"container"},{"type":"literal","value":"all"},{"type":"literal","value":"keyboard"}]}}]}}}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"indexViewStyle","variant":"declaration","kind":64,"signatures":[{"name":"indexViewStyle","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Sets the style for the page index view inside a "},{"kind":"code","text":"`TabView`"},{"kind":"text","text":". SwiftUI only\nships a "},{"kind":"code","text":"`.page`"},{"kind":"text","text":" index view style, so no style selector is exposed."}],"blockTags":[{"tag":"@see","content":[{"kind":"text","text":"Official [SwiftUI documentation](https://developer.apple.com/documentation/swiftui/view/indexviewstyle(_:))."}]}]},"parameters":[{"name":"config","variant":"param","kind":32768,"type":{"type":"reference","name":"IndexViewStyleConfig","package":"@expo/ui"},"defaultValue":"{}"}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"interactiveDismissDisabled","variant":"declaration","kind":64,"signatures":[{"name":"interactiveDismissDisabled","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Disables interactive dismissal of a sheet."}],"blockTags":[{"tag":"@see","content":[{"kind":"text","text":"Official [SwiftUI documentation](https://developer.apple.com/documentation/swiftui/view/interactivedismissdisabled(_:))."}]}]},"parameters":[{"name":"isDisabled","variant":"param","kind":32768,"comment":{"summary":[{"kind":"text","text":"Whether interactive dismiss is disabled (default: true)."}]},"type":{"type":"intrinsic","name":"boolean"},"defaultValue":"true"}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"italic","variant":"declaration","kind":64,"signatures":[{"name":"italic","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Makes text italic.\nWhen applied to "},{"kind":"code","text":"`Text`"},{"kind":"text","text":", it works on all iOS/tvOS versions. When used on regular views, it requires iOS 16.0+/tvOS 16.0+."}],"blockTags":[{"tag":"@see","content":[{"kind":"text","text":"Official [SwiftUI documentation](https://developer.apple.com/documentation/swiftui/text/italic())."}]}]},"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"kerning","variant":"declaration","kind":64,"signatures":[{"name":"kerning","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Sets the spacing, or kerning, between characters for the text in this view."}],"blockTags":[{"tag":"@default","content":[{"kind":"text","text":"0"}]},{"tag":"@see","content":[{"kind":"text","text":"Official [SwiftUI documentation](https://developer.apple.com/documentation/swiftui/view/kerning(_:))."}]}]},"parameters":[{"name":"value","variant":"param","kind":32768,"flags":{"isOptional":true},"type":{"type":"intrinsic","name":"number"}}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"keyboardType","variant":"declaration","kind":64,"signatures":[{"name":"keyboardType","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Sets the keyboard type for text input views."}],"blockTags":[{"tag":"@see","content":[{"kind":"text","text":"Official [SwiftUI documentation](https://developer.apple.com/documentation/swiftui/view/keyboardtype(_:))."}]}]},"parameters":[{"name":"keyboardType","variant":"param","kind":32768,"comment":{"summary":[{"kind":"text","text":"The type of keyboard to display."}]},"type":{"type":"union","types":[{"type":"literal","value":"default"},{"type":"literal","value":"url"},{"type":"literal","value":"email-address"},{"type":"literal","value":"numeric"},{"type":"literal","value":"phone-pad"},{"type":"literal","value":"ascii-capable"},{"type":"literal","value":"numbers-and-punctuation"},{"type":"literal","value":"name-phone-pad"},{"type":"literal","value":"decimal-pad"},{"type":"literal","value":"twitter"},{"type":"literal","value":"web-search"},{"type":"literal","value":"ascii-capable-number-pad"}]}}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"labelsHidden","variant":"declaration","kind":64,"signatures":[{"name":"labelsHidden","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Hides the labels of any controls contained within this view."}],"blockTags":[{"tag":"@see","content":[{"kind":"text","text":"Official [SwiftUI documentation](https://developer.apple.com/documentation/swiftui/view/labelshidden())."}]}]},"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"labelStyle","variant":"declaration","kind":64,"signatures":[{"name":"labelStyle","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Sets the style for labels within this view."}],"blockTags":[{"tag":"@see","content":[{"kind":"text","text":"Official [SwiftUI documentation](https://developer.apple.com/documentation/swiftui/view/labelstyle(_:))."}]}]},"parameters":[{"name":"style","variant":"param","kind":32768,"comment":{"summary":[{"kind":"text","text":"The label style."}]},"type":{"type":"union","types":[{"type":"literal","value":"automatic"},{"type":"literal","value":"iconOnly"},{"type":"literal","value":"titleAndIcon"},{"type":"literal","value":"titleOnly"}]}}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"layoutPriority","variant":"declaration","kind":64,"signatures":[{"name":"layoutPriority","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Sets layout priority for the view."}],"blockTags":[{"tag":"@see","content":[{"kind":"text","text":"Official [SwiftUI documentation](https://developer.apple.com/documentation/swiftui/view/layoutpriority(_:))."}]}]},"parameters":[{"name":"priority","variant":"param","kind":32768,"comment":{"summary":[{"kind":"text","text":"Layout priority value."}]},"type":{"type":"intrinsic","name":"number"}}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"lineHeight","variant":"declaration","kind":64,"signatures":[{"name":"lineHeight","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Sets the total line height for text in this view."}],"blockTags":[{"tag":"@platform","content":[{"kind":"text","text":"ios 26.0+"}]},{"tag":"@platform","content":[{"kind":"text","text":"macos 26.0+"}]},{"tag":"@platform","content":[{"kind":"text","text":"tvos 26.0+"}]},{"tag":"@see","content":[{"kind":"text","text":"Official [SwiftUI documentation](https://developer.apple.com/documentation/swiftui/view/lineheight(_:))."}]}]},"parameters":[{"name":"value","variant":"param","kind":32768,"comment":{"summary":[{"kind":"text","text":"The line height in points."}]},"type":{"type":"intrinsic","name":"number"}}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"lineLimit","variant":"declaration","kind":64,"signatures":[{"name":"lineLimit","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Sets the line limit for text in the view.\n\nFour variants matching SwiftUI:\n- "},{"kind":"code","text":"`lineLimit()`"},{"kind":"text","text":" — no line limit (unlimited lines)\n- "},{"kind":"code","text":"`lineLimit(5)`"},{"kind":"text","text":" — max 5 lines\n- "},{"kind":"code","text":"`lineLimit(5, { reservesSpace: true })`"},{"kind":"text","text":" — max 5 lines, reserves height even when empty (iOS 16+, tvOS 16+)\n- "},{"kind":"code","text":"`lineLimit({ min: 3, max: 8 })`"},{"kind":"text","text":" — range of 3 to 8 lines (iOS 16+, tvOS 16+)"}],"blockTags":[{"tag":"@see","content":[{"kind":"text","text":"Official [SwiftUI documentation](https://developer.apple.com/documentation/swiftui/view/linelimit(_:))."}]}]},"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}},{"name":"lineLimit","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Sets the line limit for text in the view.\n\nFour variants matching SwiftUI:\n- "},{"kind":"code","text":"`lineLimit()`"},{"kind":"text","text":" — no line limit (unlimited lines)\n- "},{"kind":"code","text":"`lineLimit(5)`"},{"kind":"text","text":" — max 5 lines\n- "},{"kind":"code","text":"`lineLimit(5, { reservesSpace: true })`"},{"kind":"text","text":" — max 5 lines, reserves height even when empty (iOS 16+, tvOS 16+)\n- "},{"kind":"code","text":"`lineLimit({ min: 3, max: 8 })`"},{"kind":"text","text":" — range of 3 to 8 lines (iOS 16+, tvOS 16+)"}],"blockTags":[{"tag":"@see","content":[{"kind":"text","text":"Official [SwiftUI documentation](https://developer.apple.com/documentation/swiftui/view/linelimit(_:))."}]}]},"parameters":[{"name":"limit","variant":"param","kind":32768,"type":{"type":"intrinsic","name":"number"}},{"name":"options","variant":"param","kind":32768,"flags":{"isOptional":true},"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"children":[{"name":"reservesSpace","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"intrinsic","name":"boolean"}}]}}}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}},{"name":"lineLimit","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Sets the line limit for text in the view.\n\nFour variants matching SwiftUI:\n- "},{"kind":"code","text":"`lineLimit()`"},{"kind":"text","text":" — no line limit (unlimited lines)\n- "},{"kind":"code","text":"`lineLimit(5)`"},{"kind":"text","text":" — max 5 lines\n- "},{"kind":"code","text":"`lineLimit(5, { reservesSpace: true })`"},{"kind":"text","text":" — max 5 lines, reserves height even when empty (iOS 16+, tvOS 16+)\n- "},{"kind":"code","text":"`lineLimit({ min: 3, max: 8 })`"},{"kind":"text","text":" — range of 3 to 8 lines (iOS 16+, tvOS 16+)"}],"blockTags":[{"tag":"@see","content":[{"kind":"text","text":"Official [SwiftUI documentation](https://developer.apple.com/documentation/swiftui/view/linelimit(_:))."}]}]},"parameters":[{"name":"range","variant":"param","kind":32768,"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"children":[{"name":"max","variant":"declaration","kind":1024,"type":{"type":"intrinsic","name":"number"}},{"name":"min","variant":"declaration","kind":1024,"type":{"type":"intrinsic","name":"number"}}]}}}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"lineSpacing","variant":"declaration","kind":64,"signatures":[{"name":"lineSpacing","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"The distance in points between the bottom of one line fragment and the top of the next."}],"blockTags":[{"tag":"@see","content":[{"kind":"text","text":"Official [SwiftUI documentation](https://developer.apple.com/documentation/swiftui/view/linespacing(_:))."}]}]},"parameters":[{"name":"value","variant":"param","kind":32768,"comment":{"summary":[{"kind":"text","text":"The amount of space between the bottom of one line and the top of the next line in points. This value is always nonnegative. Otherwise, the default value will be used."}]},"type":{"type":"intrinsic","name":"number"}}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"listRowBackground","variant":"declaration","kind":64,"signatures":[{"name":"listRowBackground","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Sets the background of a row."}],"blockTags":[{"tag":"@see","content":[{"kind":"text","text":"Official [SwiftUI documentation](https://developer.apple.com/documentation/swiftui/view/listrowbackground(_:))."}]}]},"parameters":[{"name":"color","variant":"param","kind":32768,"comment":{"summary":[{"kind":"text","text":"The row color (hex string). For example, "},{"kind":"code","text":"`#FF0000`"},{"kind":"text","text":"."}]},"type":{"type":"reference","name":"Color","package":"@expo/ui"}}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"listRowInsets","variant":"declaration","kind":64,"signatures":[{"name":"listRowInsets","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Applies an inset to the rows in a list."}],"blockTags":[{"tag":"@see","content":[{"kind":"text","text":"Official [SwiftUI documentation](https://developer.apple.com/documentation/swiftui/view/listrowinsets(_:))."}]}]},"parameters":[{"name":"params","variant":"param","kind":32768,"comment":{"summary":[{"kind":"text","text":"The inset to apply to the rows in a list."}]},"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"children":[{"name":"bottom","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"intrinsic","name":"number"}},{"name":"leading","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"intrinsic","name":"number"}},{"name":"top","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"intrinsic","name":"number"}},{"name":"trailing","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"intrinsic","name":"number"}}]}}}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"listRowSeparator","variant":"declaration","kind":64,"signatures":[{"name":"listRowSeparator","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Controls the visibility of the separator for a list row."}],"blockTags":[{"tag":"@see","content":[{"kind":"text","text":"Official [SwiftUI documentation](https://developer.apple.com/documentation/swiftui/view/listrowseparator(_:edges:))."}]}]},"parameters":[{"name":"visibility","variant":"param","kind":32768,"comment":{"summary":[{"kind":"text","text":"The visibility to apply."}]},"type":{"type":"union","types":[{"type":"literal","value":"automatic"},{"type":"literal","value":"visible"},{"type":"literal","value":"hidden"}]}},{"name":"edges","variant":"param","kind":32768,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"The edges where the separator visibility applies."}]},"type":{"type":"union","types":[{"type":"literal","value":"top"},{"type":"literal","value":"bottom"},{"type":"literal","value":"all"}]}}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"listSectionMargins","variant":"declaration","kind":64,"signatures":[{"name":"listSectionMargins","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Allows a view to ignore safe area constraints."}],"blockTags":[{"tag":"@platform","content":[{"kind":"text","text":"iOS 26+"}]},{"tag":"@see","content":[{"kind":"text","text":"Official [SwiftUI documentation](https://developer.apple.com/documentation/swiftui/view/listsectionmargins(_:_:))."}]}]},"parameters":[{"name":"params","variant":"param","kind":32768,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"The margins to apply to the section in a list."}]},"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"children":[{"name":"edges","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"union","types":[{"type":"literal","value":"top"},{"type":"literal","value":"bottom"},{"type":"literal","value":"leading"},{"type":"literal","value":"trailing"},{"type":"literal","value":"horizontal"},{"type":"literal","value":"vertical"},{"type":"literal","value":"all"}]}},{"name":"length","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"intrinsic","name":"number"}}]}}}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"listSectionSpacing","variant":"declaration","kind":64,"signatures":[{"name":"listSectionSpacing","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Sets the spacing between adjacent sections."}],"blockTags":[{"tag":"@platform","content":[{"kind":"text","text":"ios 17.0+"}]}]},"parameters":[{"name":"spacing","variant":"param","kind":32768,"comment":{"summary":[{"kind":"text","text":"The spacing to apply."}]},"type":{"type":"union","types":[{"type":"intrinsic","name":"number"},{"type":"literal","value":"default"},{"type":"literal","value":"compact"}]}}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"listStyle","variant":"declaration","kind":64,"signatures":[{"name":"listStyle","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Sets the style for a List view."}],"blockTags":[{"tag":"@see","content":[{"kind":"text","text":"Official [SwiftUI documentation](https://developer.apple.com/documentation/swiftui/view/liststyle(_:))."}]}]},"parameters":[{"name":"style","variant":"param","kind":32768,"comment":{"summary":[{"kind":"text","text":"The list style to apply."}]},"type":{"type":"reference","name":"ListStyle","package":"@expo/ui"}}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"luminanceToAlpha","variant":"declaration","kind":64,"signatures":[{"name":"luminanceToAlpha","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Adds a luminance to alpha effect to this view."}],"blockTags":[{"tag":"@see","content":[{"kind":"text","text":"Official [SwiftUI documentation](https://developer.apple.com/documentation/SwiftUI/View/luminanceToAlpha())."}]}]},"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"mask","variant":"declaration","kind":64,"signatures":[{"name":"mask","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Applies a mask to the view."}],"blockTags":[{"tag":"@see","content":[{"kind":"text","text":"Official [SwiftUI documentation](https://developer.apple.com/documentation/swiftui/view/mask(_:))."}]}]},"parameters":[{"name":"shape","variant":"param","kind":32768,"comment":{"summary":[{"kind":"text","text":"The masking shape."}]},"type":{"type":"union","types":[{"type":"literal","value":"roundedRectangle"},{"type":"literal","value":"capsule"},{"type":"literal","value":"rectangle"},{"type":"literal","value":"ellipse"},{"type":"literal","value":"circle"},{"type":"literal","value":"containerRelativeShape"}]}},{"name":"cornerRadius","variant":"param","kind":32768,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Corner radius for rounded rectangle (default: "},{"kind":"code","text":"`8`"},{"kind":"text","text":")."}]},"type":{"type":"intrinsic","name":"number"}}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"matchedGeometryEffect","variant":"declaration","kind":64,"signatures":[{"name":"matchedGeometryEffect","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Adds a matched geometry effect to a view."}],"blockTags":[{"tag":"@see","content":[{"kind":"text","text":"Official [SwiftUI documentation](https://developer.apple.com/documentation/swiftui/view/matchedgeometryeffect(id:in:properties:anchor:issource:))."}]}]},"parameters":[{"name":"id","variant":"param","kind":32768,"comment":{"summary":[{"kind":"text","text":"The id of the view."}]},"type":{"type":"intrinsic","name":"string"}},{"name":"namespaceId","variant":"param","kind":32768,"comment":{"summary":[{"kind":"text","text":"The namespace id of the view. Use Namespace component to create a namespace."}]},"type":{"type":"intrinsic","name":"string"}}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"menuActionDismissBehavior","variant":"declaration","kind":64,"signatures":[{"name":"menuActionDismissBehavior","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Controls the dismissal behavior of menu actions."}],"blockTags":[{"tag":"@platform","content":[{"kind":"text","text":"ios 16.4+"}]},{"tag":"@platform","content":[{"kind":"text","text":"tvos 17.0+"}]},{"tag":"@see","content":[{"kind":"text","text":"Official [SwiftUI documentation](https://developer.apple.com/documentation/swiftui/view/menuactiondismissbehavior(_:))."}]}]},"parameters":[{"name":"behavior","variant":"param","kind":32768,"comment":{"summary":[{"kind":"text","text":"The menu action dismiss behavior."}]},"type":{"type":"union","types":[{"type":"literal","value":"automatic"},{"type":"literal","value":"enabled"},{"type":"literal","value":"disabled"}]}}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"monospacedDigit","variant":"declaration","kind":64,"signatures":[{"name":"monospacedDigit","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Modifies the fonts of all child views to use fixed-width digits, if possible, while leaving other characters proportionally spaced.\nWhen applied to "},{"kind":"code","text":"`Text`"},{"kind":"text","text":", modifies the text view's font to use fixed-width digits, while leaving other characters proportionally spaced."}],"blockTags":[{"tag":"@see","content":[{"kind":"text","text":"Official [SwiftUI documentation](https://developer.apple.com/documentation/swiftui/view/monospaceddigit())."}]}]},"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"moveDisabled","variant":"declaration","kind":64,"signatures":[{"name":"moveDisabled","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Disables the move action for a view in a list.\nApply to items within a "},{"kind":"code","text":"`ForEach`"},{"kind":"text","text":" to prevent them from being moved."}],"blockTags":[{"tag":"@default","content":[{"kind":"text","text":"true"}]},{"tag":"@see","content":[{"kind":"text","text":"Official [SwiftUI documentation](https://developer.apple.com/documentation/swiftui/view/movedisabled(_:))."}]}]},"parameters":[{"name":"disabled","variant":"param","kind":32768,"comment":{"summary":[{"kind":"text","text":"Whether moving should be disabled"}]},"type":{"type":"intrinsic","name":"boolean"},"defaultValue":"true"}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"multilineTextAlignment","variant":"declaration","kind":64,"signatures":[{"name":"multilineTextAlignment","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"An alignment position for text along the horizontal axis."}],"blockTags":[{"tag":"@see","content":[{"kind":"text","text":"Official [SwiftUI documentation](https://developer.apple.com/documentation/swiftui/view/multilinetextalignment(_:))."}]}]},"parameters":[{"name":"alignment","variant":"param","kind":32768,"comment":{"summary":[{"kind":"text","text":"A value that you use to align multiple lines of text within a view."}]},"type":{"type":"union","types":[{"type":"literal","value":"center"},{"type":"literal","value":"leading"},{"type":"literal","value":"trailing"}]}}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"offset","variant":"declaration","kind":64,"signatures":[{"name":"offset","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Applies an offset (translation) to a view."}],"blockTags":[{"tag":"@see","content":[{"kind":"text","text":"Official [SwiftUI documentation](https://developer.apple.com/documentation/swiftui/view/offset(x:y:))."}]}]},"parameters":[{"name":"params","variant":"param","kind":32768,"comment":{"summary":[{"kind":"text","text":"The offset parameters: "},{"kind":"code","text":"`x`"},{"kind":"text","text":" and "},{"kind":"code","text":"`y`"},{"kind":"text","text":"."}]},"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"children":[{"name":"x","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"intrinsic","name":"number"}},{"name":"y","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"intrinsic","name":"number"}}]}}}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"onAppear","variant":"declaration","kind":64,"signatures":[{"name":"onAppear","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Adds an onAppear modifier that calls a function when the view appears."}],"blockTags":[{"tag":"@see","content":[{"kind":"text","text":"Official [SwiftUI documentation](https://developer.apple.com/documentation/swiftui/view/onappear(perform:))."}]}]},"parameters":[{"name":"handler","variant":"param","kind":32768,"comment":{"summary":[{"kind":"text","text":"Function to call when the view appears."}]},"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"signatures":[{"name":"__type","variant":"signature","kind":4096,"type":{"type":"intrinsic","name":"void"}}]}}}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"onDisappear","variant":"declaration","kind":64,"signatures":[{"name":"onDisappear","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Adds an onDisappear modifier that calls a function when the view disappears."}],"blockTags":[{"tag":"@see","content":[{"kind":"text","text":"Official [SwiftUI documentation](https://developer.apple.com/documentation/swiftui/view/ondisappear(perform:))."}]}]},"parameters":[{"name":"handler","variant":"param","kind":32768,"comment":{"summary":[{"kind":"text","text":"Function to call when the view disappears."}]},"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"signatures":[{"name":"__type","variant":"signature","kind":4096,"type":{"type":"intrinsic","name":"void"}}]}}}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"onGeometryChange","variant":"declaration","kind":64,"signatures":[{"name":"onGeometryChange","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Calls the handler whenever the view's geometry changes. Sizes are in points."}],"blockTags":[{"tag":"@see","content":[{"kind":"text","text":"Official [SwiftUI documentation](https://developer.apple.com/documentation/swiftui/view/ongeometrychange(for:of:action:))."}]}]},"parameters":[{"name":"handler","variant":"param","kind":32768,"comment":{"summary":[{"kind":"text","text":"Function called with the new size."}]},"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"signatures":[{"name":"__type","variant":"signature","kind":4096,"parameters":[{"name":"size","variant":"param","kind":32768,"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"children":[{"name":"height","variant":"declaration","kind":1024,"type":{"type":"intrinsic","name":"number"}},{"name":"width","variant":"declaration","kind":1024,"type":{"type":"intrinsic","name":"number"}}]}}}],"type":{"type":"intrinsic","name":"void"}}]}}}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"onLongPressGesture","variant":"declaration","kind":64,"signatures":[{"name":"onLongPressGesture","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Adds a long press gesture recognizer."}]},"parameters":[{"name":"handler","variant":"param","kind":32768,"comment":{"summary":[{"kind":"text","text":"Function to call when long pressed."}]},"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"signatures":[{"name":"__type","variant":"signature","kind":4096,"type":{"type":"intrinsic","name":"void"}}]}}},{"name":"minimumDuration","variant":"param","kind":32768,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Minimum duration for long press (default: 0.5s)"}]},"type":{"type":"intrinsic","name":"number"}}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"onSubmit","variant":"declaration","kind":64,"signatures":[{"name":"onSubmit","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Adds an action to perform when the user submits a value to this view (e.g. pressing return in a text field)."}],"blockTags":[{"tag":"@see","content":[{"kind":"text","text":"Official [SwiftUI documentation](https://developer.apple.com/documentation/swiftui/view/onsubmit(of:_:))."}]}]},"parameters":[{"name":"handler","variant":"param","kind":32768,"comment":{"summary":[{"kind":"text","text":"Function to call on submit."}]},"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"signatures":[{"name":"__type","variant":"signature","kind":4096,"type":{"type":"intrinsic","name":"void"}}]}}}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"onTapGesture","variant":"declaration","kind":64,"signatures":[{"name":"onTapGesture","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Adds a tap gesture recognizer."}],"blockTags":[{"tag":"@see","content":[{"kind":"text","text":"Official [SwiftUI documentation](https://developer.apple.com/documentation/swiftui/view/ontapgesture(count:perform:))."}]}]},"parameters":[{"name":"handler","variant":"param","kind":32768,"comment":{"summary":[{"kind":"text","text":"Function to call when tapped."}]},"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"signatures":[{"name":"__type","variant":"signature","kind":4096,"type":{"type":"intrinsic","name":"void"}}]}}}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"opacity","variant":"declaration","kind":64,"signatures":[{"name":"opacity","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Sets the opacity of a view."}],"blockTags":[{"tag":"@see","content":[{"kind":"text","text":"Official [SwiftUI documentation](https://developer.apple.com/documentation/swiftui/view/opacity(_:))."}]}]},"parameters":[{"name":"value","variant":"param","kind":32768,"comment":{"summary":[{"kind":"text","text":"Opacity value between 0 and 1."}]},"type":{"type":"intrinsic","name":"number"}}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"overlay","variant":"declaration","kind":64,"signatures":[{"name":"overlay","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Overlays another view on top."}],"blockTags":[{"tag":"@see","content":[{"kind":"text","text":"Official [SwiftUI documentation](https://developer.apple.com/documentation/swiftui/view/overlay(_:alignment:))."}]}]},"parameters":[{"name":"params","variant":"param","kind":32768,"comment":{"summary":[{"kind":"text","text":"Overlay color and alignment."}]},"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"children":[{"name":"alignment","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"union","types":[{"type":"literal","value":"center"},{"type":"literal","value":"top"},{"type":"literal","value":"bottom"},{"type":"literal","value":"leading"},{"type":"literal","value":"trailing"}]}},{"name":"color","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"reference","name":"Color","package":"@expo/ui"}}]}}}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"padding","variant":"declaration","kind":64,"signatures":[{"name":"padding","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Sets padding on a view.\nSupports individual edges or shorthand properties."}],"blockTags":[{"tag":"@see","content":[{"kind":"text","text":"Official [SwiftUI documentation](https://developer.apple.com/documentation/SwiftUI/View/padding(_:_:))."}]}]},"parameters":[{"name":"params","variant":"param","kind":32768,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"The padding parameters: "},{"kind":"code","text":"`top`"},{"kind":"text","text":", "},{"kind":"code","text":"`bottom`"},{"kind":"text","text":", "},{"kind":"code","text":"`leading`"},{"kind":"text","text":", "},{"kind":"code","text":"`trailing`"},{"kind":"text","text":", "},{"kind":"code","text":"`horizontal`"},{"kind":"text","text":", "},{"kind":"code","text":"`vertical`"},{"kind":"text","text":" and "},{"kind":"code","text":"`all`"},{"kind":"text","text":"."}]},"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"children":[{"name":"all","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"intrinsic","name":"number"}},{"name":"bottom","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"intrinsic","name":"number"}},{"name":"horizontal","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"intrinsic","name":"number"}},{"name":"leading","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"intrinsic","name":"number"}},{"name":"top","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"intrinsic","name":"number"}},{"name":"trailing","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"intrinsic","name":"number"}},{"name":"vertical","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"intrinsic","name":"number"}}]}}}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"pickerStyle","variant":"declaration","kind":64,"signatures":[{"name":"pickerStyle","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Sets the style for the picker."}],"blockTags":[{"tag":"@see","content":[{"kind":"text","text":"Official [SwiftUI documentation](https://developer.apple.com/documentation/swiftui/pickerstyle)."}]}]},"parameters":[{"name":"style","variant":"param","kind":32768,"comment":{"summary":[{"kind":"text","text":"The style for the picker."}]},"type":{"type":"reference","name":"PickerStyleType","package":"@expo/ui"}}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"presentationBackgroundInteraction","variant":"declaration","kind":64,"signatures":[{"name":"presentationBackgroundInteraction","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Controls interaction with the content behind a sheet."}],"blockTags":[{"tag":"@platform","content":[{"kind":"text","text":"ios 16.4+"}]},{"tag":"@platform","content":[{"kind":"text","text":"tvos 16.4+"}]},{"tag":"@see","content":[{"kind":"text","text":"Official [SwiftUI documentation](https://developer.apple.com/documentation/swiftui/view/presentationbackgroundinteraction(_:))."}]}]},"parameters":[{"name":"interaction","variant":"param","kind":32768,"comment":{"summary":[{"kind":"text","text":"The background interaction behavior."}]},"type":{"type":"reference","name":"PresentationBackgroundInteractionType","package":"@expo/ui"}}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"presentationDetents","variant":"declaration","kind":64,"signatures":[{"name":"presentationDetents","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Sets the available heights for a sheet presentation."}],"blockTags":[{"tag":"@platform","content":[{"kind":"text","text":"ios 16.0+"}]},{"tag":"@platform","content":[{"kind":"text","text":"tvos 16.0+"}]},{"tag":"@see","content":[{"kind":"text","text":"Official [SwiftUI documentation](https://developer.apple.com/documentation/swiftui/view/presentationdetents(_:selection:))."}]}]},"parameters":[{"name":"detents","variant":"param","kind":32768,"comment":{"summary":[{"kind":"text","text":"Array of detents the sheet can snap to."}]},"type":{"type":"array","elementType":{"type":"reference","name":"PresentationDetent","package":"@expo/ui"}}},{"name":"options","variant":"param","kind":32768,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Optional settings for tracking the selected detent."}]},"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"children":[{"name":"onSelectionChange","variant":"declaration","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Callback fired when the user changes the active detent by dragging."}]},"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"signatures":[{"name":"__type","variant":"signature","kind":4096,"parameters":[{"name":"detent","variant":"param","kind":32768,"type":{"type":"reference","name":"PresentationDetent","package":"@expo/ui"}}],"type":{"type":"intrinsic","name":"void"}}]}}},{"name":"selection","variant":"declaration","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"The currently selected detent."}]},"type":{"type":"reference","name":"PresentationDetent","package":"@expo/ui"}}]}}}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"presentationDragIndicator","variant":"declaration","kind":64,"signatures":[{"name":"presentationDragIndicator","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Controls the visibility of the drag indicator on a sheet."}],"blockTags":[{"tag":"@platform","content":[{"kind":"text","text":"ios 16.0+"}]},{"tag":"@platform","content":[{"kind":"text","text":"tvos 16.0+"}]},{"tag":"@see","content":[{"kind":"text","text":"Official [SwiftUI documentation](https://developer.apple.com/documentation/swiftui/view/presentationdragindicator(_:))."}]}]},"parameters":[{"name":"visibility","variant":"param","kind":32768,"comment":{"summary":[{"kind":"text","text":"The visibility of the drag indicator."}]},"type":{"type":"union","types":[{"type":"literal","value":"automatic"},{"type":"literal","value":"visible"},{"type":"literal","value":"hidden"}]}}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"progressViewStyle","variant":"declaration","kind":64,"signatures":[{"name":"progressViewStyle","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Sets the style for the progress view."}],"blockTags":[{"tag":"@see","content":[{"kind":"text","text":"Official [SwiftUI documentation](https://developer.apple.com/documentation/swiftui/progressviewstyle)."}]}]},"parameters":[{"name":"style","variant":"param","kind":32768,"comment":{"summary":[{"kind":"text","text":"The style for the progress view."}]},"type":{"type":"reference","name":"ProgressViewStyleType","package":"@expo/ui"}}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"refreshable","variant":"declaration","kind":64,"signatures":[{"name":"refreshable","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Marks a view as refreshable. Adds pull-to-refresh functionality."}],"blockTags":[{"tag":"@see","content":[{"kind":"text","text":"Official [SwiftUI documentation](https://developer.apple.com/documentation/swiftui/view/refreshable(action:))."}]}]},"parameters":[{"name":"handler","variant":"param","kind":32768,"comment":{"summary":[{"kind":"text","text":"Async function to call when refresh is triggered."}]},"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"signatures":[{"name":"__type","variant":"signature","kind":4096,"type":{"type":"reference","target":{"packageName":"typescript","packagePath":"lib/lib.es5.d.ts","qualifiedName":"Promise"},"typeArguments":[{"type":"intrinsic","name":"void"}],"name":"Promise","package":"typescript"}}]}}}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"resizable","variant":"declaration","kind":64,"signatures":[{"name":"resizable","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Sets the mode by which SwiftUI resizes an image to fit its space."}],"blockTags":[{"tag":"@see","content":[{"kind":"text","text":"Official [SwiftUI documentation](https://developer.apple.com/documentation/swiftui/image/resizable(capinsets:resizingmode:))."}]}]},"parameters":[{"name":"capInsets","variant":"param","kind":32768,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Inset values that indicate a portion of the image that SwiftUI doesn’t resize."}]},"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"children":[{"name":"bottom","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"intrinsic","name":"number"}},{"name":"leading","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"intrinsic","name":"number"}},{"name":"top","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"intrinsic","name":"number"}},{"name":"trailing","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"intrinsic","name":"number"}}]}}},{"name":"resizingMode","variant":"param","kind":32768,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"The mode by which SwiftUI resizes the image."}]},"type":{"type":"union","types":[{"type":"literal","value":"stretch"},{"type":"literal","value":"tile"}]}}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"rotation3DEffect","variant":"declaration","kind":64,"signatures":[{"name":"rotation3DEffect","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Applies a 3D rotation transformation."}],"blockTags":[{"tag":"@see","content":[{"kind":"text","text":"Official [SwiftUI documentation](https://developer.apple.com/documentation/swiftui/view/rotation3deffect(_:axis:anchor:anchorz:perspective:))."}]}]},"parameters":[{"name":"params","variant":"param","kind":32768,"comment":{"summary":[{"kind":"text","text":"The rotation parameters: "},{"kind":"code","text":"`angle`"},{"kind":"text","text":" (in degrees), "},{"kind":"code","text":"`axis`"},{"kind":"text","text":" (x, y, z), and "},{"kind":"code","text":"`perspective`"},{"kind":"text","text":"."}]},"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"children":[{"name":"angle","variant":"declaration","kind":1024,"type":{"type":"intrinsic","name":"number"}},{"name":"axis","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"children":[{"name":"x","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"intrinsic","name":"number"}},{"name":"y","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"intrinsic","name":"number"}},{"name":"z","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"intrinsic","name":"number"}}]}}},{"name":"perspective","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"intrinsic","name":"number"}}]}}}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"rotationEffect","variant":"declaration","kind":64,"signatures":[{"name":"rotationEffect","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Applies rotation transformation."}],"blockTags":[{"tag":"@see","content":[{"kind":"text","text":"Official [SwiftUI documentation](https://developer.apple.com/documentation/swiftui/view/rotationeffect(_:anchor:))."}]}]},"parameters":[{"name":"angle","variant":"param","kind":32768,"comment":{"summary":[{"kind":"text","text":"Rotation angle in degrees."}]},"type":{"type":"intrinsic","name":"number"}}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"saturation","variant":"declaration","kind":64,"signatures":[{"name":"saturation","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Adjusts the saturation of a view."}],"blockTags":[{"tag":"@see","content":[{"kind":"text","text":"Official [SwiftUI documentation](https://developer.apple.com/documentation/swiftui/view/saturation(_:))."}]}]},"parameters":[{"name":"amount","variant":"param","kind":32768,"comment":{"summary":[{"kind":"text","text":"Saturation multiplier (0 to infinity, 1 = normal)."}]},"type":{"type":"intrinsic","name":"number"}}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"scaleEffect","variant":"declaration","kind":64,"signatures":[{"name":"scaleEffect","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Applies scaling transformation."}],"blockTags":[{"tag":"@see","content":[{"kind":"text","text":"Official [SwiftUI documentation](https://developer.apple.com/documentation/swiftui/view/scaleeffect(_:anchor:))."}]}]},"parameters":[{"name":"scale","variant":"param","kind":32768,"comment":{"summary":[{"kind":"text","text":"Uniform scale factor (1.0 = normal size), or an object with separate "},{"kind":"code","text":"`x`"},{"kind":"text","text":" and "},{"kind":"code","text":"`y`"},{"kind":"text","text":" scale factors."}]},"type":{"type":"union","types":[{"type":"intrinsic","name":"number"},{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"children":[{"name":"x","variant":"declaration","kind":1024,"type":{"type":"intrinsic","name":"number"}},{"name":"y","variant":"declaration","kind":1024,"type":{"type":"intrinsic","name":"number"}}]}}]}}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"scrollContentBackground","variant":"declaration","kind":64,"signatures":[{"name":"scrollContentBackground","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Specifies the visibility of the background for scrollable views within this view."}],"blockTags":[{"tag":"@see","content":[{"kind":"text","text":"Official [SwiftUI documentation](https://developer.apple.com/documentation/swiftui/view/scrollcontentbackground(_:))."}]}]},"parameters":[{"name":"visible","variant":"param","kind":32768,"comment":{"summary":[{"kind":"text","text":"The visibility of the background."}]},"type":{"type":"union","types":[{"type":"literal","value":"automatic"},{"type":"literal","value":"visible"},{"type":"literal","value":"hidden"}]}}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"scrollDisabled","variant":"declaration","kind":64,"signatures":[{"name":"scrollDisabled","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Disables or enables scrolling in scrollable views."}],"blockTags":[{"tag":"@platform","content":[{"kind":"text","text":"ios 16.0+"}]},{"tag":"@platform","content":[{"kind":"text","text":"tvos 16.0+"}]},{"tag":"@see","content":[{"kind":"text","text":"Official [SwiftUI documentation](https://developer.apple.com/documentation/swiftui/view/scrolldisabled(_:))."}]}]},"parameters":[{"name":"disabled","variant":"param","kind":32768,"comment":{"summary":[{"kind":"text","text":"Whether scrolling should be disabled (default: true)."}]},"type":{"type":"intrinsic","name":"boolean"},"defaultValue":"true"}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"scrollDismissesKeyboard","variant":"declaration","kind":64,"signatures":[{"name":"scrollDismissesKeyboard","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Controls how the keyboard is dismissed when scrolling."}],"blockTags":[{"tag":"@platform","content":[{"kind":"text","text":"ios 16.0+"}]},{"tag":"@platform","content":[{"kind":"text","text":"tvos 16.0+"}]},{"tag":"@see","content":[{"kind":"text","text":"Official [SwiftUI documentation](https://developer.apple.com/documentation/swiftui/view/scrolldismisseskeyboard(_:))."}]}]},"parameters":[{"name":"mode","variant":"param","kind":32768,"comment":{"summary":[{"kind":"text","text":"The keyboard dismiss mode."}]},"type":{"type":"union","types":[{"type":"literal","value":"automatic"},{"type":"literal","value":"never"},{"type":"literal","value":"interactively"},{"type":"literal","value":"immediately"}]}}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"scrollIndicators","variant":"declaration","kind":64,"signatures":[{"name":"scrollIndicators","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Controls the visibility of scroll indicators for scrollable views.\nMirrors SwiftUI's "},{"kind":"code","text":"`scrollIndicators(_:axes:)`"},{"kind":"text","text":" modifier."}],"blockTags":[{"tag":"@platform","content":[{"kind":"text","text":"ios 16.0+"}]},{"tag":"@platform","content":[{"kind":"text","text":"tvos 16.0+"}]},{"tag":"@see","content":[{"kind":"text","text":"Official [SwiftUI documentation](https://developer.apple.com/documentation/swiftui/view/scrollindicators(_:axes:))."}]}]},"parameters":[{"name":"visibility","variant":"param","kind":32768,"comment":{"summary":[{"kind":"text","text":"Indicator visibility:\n- "},{"kind":"code","text":"`'automatic'`"},{"kind":"text","text":": platform-default behavior.\n- "},{"kind":"code","text":"`'visible'`"},{"kind":"text","text":": prefer showing indicators (may still be hidden by the system).\n- "},{"kind":"code","text":"`'hidden'`"},{"kind":"text","text":": prefer hiding indicators (may still be shown by the system).\n- "},{"kind":"code","text":"`'never'`"},{"kind":"text","text":": never show indicators."}]},"type":{"type":"union","types":[{"type":"literal","value":"automatic"},{"type":"literal","value":"never"},{"type":"literal","value":"visible"},{"type":"literal","value":"hidden"}]}},{"name":"axes","variant":"param","kind":32768,"comment":{"summary":[{"kind":"text","text":"Axes to apply the visibility to. Defaults to "},{"kind":"code","text":"`'both'`"},{"kind":"text","text":"."}]},"type":{"type":"union","types":[{"type":"literal","value":"horizontal"},{"type":"literal","value":"vertical"},{"type":"literal","value":"both"}]},"defaultValue":"'both'"}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"scrollPosition","variant":"declaration","kind":64,"signatures":[{"name":"scrollPosition","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Binds the leading scroll target of a scrollable container to an observable native state.\n\nReading "},{"kind":"code","text":"`state.value`"},{"kind":"text","text":" returns the id of the leading scroll target. Writing to it scrolls\nthe container to the matching view. Pair with "},{"kind":"code","text":"`scrollTargetLayout()`"},{"kind":"text","text":" on the content\ncontainer and "},{"kind":"code","text":"`id()`"},{"kind":"text","text":" on each target. Works on "},{"kind":"code","text":"`ScrollView`"},{"kind":"text","text":", "},{"kind":"code","text":"`LazyVStack`"},{"kind":"text","text":", "},{"kind":"code","text":"`LazyHStack`"},{"kind":"text","text":",\nand other scrollable containers.\n\nOn iOS below 17.0, the modifier is a no-op."}],"blockTags":[{"tag":"@platform","content":[{"kind":"text","text":"ios 17.0+"}]},{"tag":"@platform","content":[{"kind":"text","text":"tvos 17.0+"}]},{"tag":"@platform","content":[{"kind":"text","text":"macos 14.0+"}]},{"tag":"@see","content":[{"kind":"text","text":"Official [SwiftUI documentation](https://developer.apple.com/documentation/swiftui/view/scrollposition(id:anchor:))."}]},{"tag":"@example","content":[{"kind":"code","text":"```tsx\nconst activeID = useNativeState(null);\n\n console.log('leading target:', newID),\n }),\n ]}>\n \n {items.map((item) => (\n {item.text}\n ))}\n \n\n```"}]}]},"parameters":[{"name":"state","variant":"param","kind":32768,"comment":{"summary":[{"kind":"text","text":"An "},{"kind":"code","text":"`ObservableState`"},{"kind":"text","text":" created with "},{"kind":"code","text":"`useNativeState`"},{"kind":"text","text":"."}]},"type":{"type":"reference","typeArguments":[{"type":"union","types":[{"type":"intrinsic","name":"string"},{"type":"literal","value":null}]}],"name":"ObservableState","package":"@expo/ui"}},{"name":"options","variant":"param","kind":32768,"flags":{"isOptional":true},"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"children":[{"name":"anchor","variant":"declaration","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Anchor used to pick which view drives the binding and to align\n programmatic scrolls. Maps to the "},{"kind":"code","text":"`anchor:`"},{"kind":"text","text":" parameter of SwiftUI's "},{"kind":"code","text":"`.scrollPosition(id:anchor:)`"},{"kind":"text","text":"."}]},"type":{"type":"reference","name":"UnitPointValue","package":"@expo/ui"}},{"name":"onChange","variant":"declaration","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Fires on the JS thread whenever the leading scroll target changes."}]},"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"signatures":[{"name":"__type","variant":"signature","kind":4096,"parameters":[{"name":"id","variant":"param","kind":32768,"type":{"type":"union","types":[{"type":"intrinsic","name":"string"},{"type":"literal","value":null}]}}],"type":{"type":"intrinsic","name":"void"}}]}}}]}}}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"scrollTargetBehavior","variant":"declaration","kind":64,"signatures":[{"name":"scrollTargetBehavior","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Sets the scroll snapping behavior for scrollable views.\nUse with "},{"kind":"code","text":"`scrollTargetLayout`"},{"kind":"text","text":" on the content container."}],"blockTags":[{"tag":"@platform","content":[{"kind":"text","text":"ios 17.0+"}]},{"tag":"@see","content":[{"kind":"text","text":"Official [SwiftUI documentation](https://developer.apple.com/documentation/swiftui/view/scrolltargetbehavior(_:))."}]}]},"parameters":[{"name":"behavior","variant":"param","kind":32768,"comment":{"summary":[{"kind":"code","text":"`'paging'`"},{"kind":"text","text":" for container-aligned snapping, "},{"kind":"code","text":"`'viewAligned'`"},{"kind":"text","text":" for view-aligned snapping."}]},"type":{"type":"union","types":[{"type":"literal","value":"paging"},{"type":"literal","value":"viewAligned"}]}}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"scrollTargetLayout","variant":"declaration","kind":64,"signatures":[{"name":"scrollTargetLayout","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Configures a layout container as a scroll target layout for view-aligned snapping.\nApply to "},{"kind":"code","text":"`VStack`"},{"kind":"text","text":" or "},{"kind":"code","text":"`HStack`"},{"kind":"text","text":" inside a "},{"kind":"code","text":"`ScrollView`"},{"kind":"text","text":"."}],"blockTags":[{"tag":"@platform","content":[{"kind":"text","text":"ios 17.0+"}]},{"tag":"@see","content":[{"kind":"text","text":"Official [SwiftUI documentation](https://developer.apple.com/documentation/swiftui/view/scrolltargetlayout(isenabled:))."}]}]},"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"shadow","variant":"declaration","kind":64,"signatures":[{"name":"shadow","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Adds a shadow to a view."}],"blockTags":[{"tag":"@see","content":[{"kind":"text","text":"Official [SwiftUI documentation](https://developer.apple.com/documentation/SwiftUI/View/shadow(color:radius:x:y:))."}]}]},"parameters":[{"name":"params","variant":"param","kind":32768,"comment":{"summary":[{"kind":"text","text":"The shadow parameters: "},{"kind":"code","text":"`radius`"},{"kind":"text","text":", offset ("},{"kind":"code","text":"`x`"},{"kind":"text","text":", "},{"kind":"code","text":"`y`"},{"kind":"text","text":") and "},{"kind":"code","text":"`color`"},{"kind":"text","text":"."}]},"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"children":[{"name":"color","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"reference","name":"Color","package":"@expo/ui"}},{"name":"radius","variant":"declaration","kind":1024,"type":{"type":"intrinsic","name":"number"}},{"name":"x","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"intrinsic","name":"number"}},{"name":"y","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"intrinsic","name":"number"}}]}}}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"strikethrough","variant":"declaration","kind":64,"signatures":[{"name":"strikethrough","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Applies a strikethrough to the text."}],"blockTags":[{"tag":"@see","content":[{"kind":"text","text":"Official [SwiftUI documentation](https://developer.apple.com/documentation/swiftui/text/strikethrough(_:color:))."}]}]},"parameters":[{"name":"params","variant":"param","kind":32768,"comment":{"summary":[{"kind":"text","text":"Controls whether the strikethrough is visible ("},{"kind":"code","text":"`true`"},{"kind":"text","text":" to show, "},{"kind":"code","text":"`false`"},{"kind":"text","text":" to hide)."}]},"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"children":[{"name":"color","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"reference","name":"Color","package":"@expo/ui"}},{"name":"isActive","variant":"declaration","kind":1024,"type":{"type":"intrinsic","name":"boolean"}},{"name":"pattern","variant":"declaration","kind":1024,"type":{"type":"reference","target":{"packageName":"@expo/ui","packagePath":"src/swift-ui/modifiers/index.ts","qualifiedName":"LinePattern"},"name":"LinePattern","package":"@expo/ui"}}]}}}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"submitLabel","variant":"declaration","kind":64,"signatures":[{"name":"submitLabel","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Specifies the label to display in the keyboard's return key. For example, "},{"kind":"code","text":"`'done'`"},{"kind":"text","text":"."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"A view that uses the specified submit label."}]},{"tag":"@platform","content":[{"kind":"text","text":"iOS 15+"}]},{"tag":"@example","content":[{"kind":"code","text":"```tsx\n\n```"}]}]},"parameters":[{"name":"submitLabel","variant":"param","kind":32768,"comment":{"summary":[{"kind":"text","text":"The label to display in the keyboard's return key."}]},"type":{"type":"union","types":[{"type":"literal","value":"join"},{"type":"literal","value":"search"},{"type":"literal","value":"done"},{"type":"literal","value":"continue"},{"type":"literal","value":"go"},{"type":"literal","value":"next"},{"type":"literal","value":"return"},{"type":"literal","value":"route"},{"type":"literal","value":"send"}]}}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"symbolEffect","variant":"declaration","kind":64,"signatures":[{"name":"symbolEffect","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Applies an SF Symbol effect to a view."}],"blockTags":[{"tag":"@platform","content":[{"kind":"text","text":"ios 17.0+"}]},{"tag":"@platform","content":[{"kind":"text","text":"tvos 17.0+"}]},{"tag":"@see","content":[{"kind":"text","text":"Official [SwiftUI documentation](https://developer.apple.com/documentation/SwiftUI/View/symbolEffect(_:options:value:))."}]},{"tag":"@example","content":[{"kind":"code","text":"```tsx\nconst trigger = useNativeState(0);\n\n```"}]}]},"parameters":[{"name":"effect","variant":"param","kind":32768,"type":{"type":"reference","name":"SymbolEffect","package":"@expo/ui"}},{"name":"args","variant":"param","kind":32768,"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"children":[{"name":"isActive","variant":"declaration","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Indefinite effects: runs while "},{"kind":"code","text":"`state.value === true`"},{"kind":"text","text":". Default active when omitted."}]},"type":{"type":"reference","typeArguments":[{"type":"intrinsic","name":"boolean"}],"name":"ObservableState","package":"@expo/ui"}},{"name":"options","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"reference","name":"SymbolEffectOptions","package":"@expo/ui"}},{"name":"value","variant":"declaration","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Discrete effects: the effect fires once each time this value changes."}]},"type":{"type":"reference","typeArguments":[{"type":"reference","name":"DiscreteSymbolEffectValue","package":"@expo/ui"}],"name":"ObservableState","package":"@expo/ui"}}]}},"defaultValue":"{}"}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"tabViewStyle","variant":"declaration","kind":64,"signatures":[{"name":"tabViewStyle","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Sets the style for a "},{"kind":"code","text":"`TabView`"},{"kind":"text","text":"."}],"blockTags":[{"tag":"@see","content":[{"kind":"text","text":"Official [SwiftUI documentation](https://developer.apple.com/documentation/swiftui/view/tabviewstyle(_:))."}]}]},"parameters":[{"name":"config","variant":"param","kind":32768,"type":{"type":"reference","name":"TabViewStyleConfig","package":"@expo/ui"}}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"tag","variant":"declaration","kind":64,"signatures":[{"name":"tag","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Sets a tag on a view."}],"blockTags":[{"tag":"@see","content":[{"kind":"text","text":"Official [SwiftUI documentation](https://developer.apple.com/documentation/swiftui/view/tag(_:includeoptional:))."}]}]},"parameters":[{"name":"tag","variant":"param","kind":32768,"comment":{"summary":[{"kind":"text","text":"The tag to set on the view."}]},"type":{"type":"union","types":[{"type":"intrinsic","name":"string"},{"type":"intrinsic","name":"number"}]}}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"textCase","variant":"declaration","kind":64,"signatures":[{"name":"textCase","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Sets a transform for the case of the text contained in this view when displayed."}],"blockTags":[{"tag":"@default","content":[{"kind":"text","text":"\"lowercase\""}]},{"tag":"@see","content":[{"kind":"text","text":"Official [SwiftUI documentation](https://developer.apple.com/documentation/swiftui/view/textcase(_:))."}]}]},"parameters":[{"name":"value","variant":"param","kind":32768,"type":{"type":"union","types":[{"type":"literal","value":"lowercase"},{"type":"literal","value":"uppercase"}]}}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"textContentType","variant":"declaration","kind":64,"signatures":[{"name":"textContentType","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Sets the text content type for input text, which the system uses to offer\nsuggestions (like autofill) while the user enters text."}],"blockTags":[{"tag":"@platform","content":[{"kind":"text","text":"ios 13.0+"}]},{"tag":"@see","content":[{"kind":"text","text":"Official [SwiftUI documentation](https://developer.apple.com/documentation/swiftui/view/textcontenttype(_:)-ufdv)."}]}]},"parameters":[{"name":"textContentType","variant":"param","kind":32768,"comment":{"summary":[{"kind":"text","text":"The semantic meaning of the text input area."}]},"type":{"type":"union","types":[{"type":"literal","value":"URL"},{"type":"literal","value":"namePrefix"},{"type":"literal","value":"name"},{"type":"literal","value":"nameSuffix"},{"type":"literal","value":"givenName"},{"type":"literal","value":"middleName"},{"type":"literal","value":"familyName"},{"type":"literal","value":"nickname"},{"type":"literal","value":"organizationName"},{"type":"literal","value":"jobTitle"},{"type":"literal","value":"location"},{"type":"literal","value":"fullStreetAddress"},{"type":"literal","value":"streetAddressLine1"},{"type":"literal","value":"streetAddressLine2"},{"type":"literal","value":"addressCity"},{"type":"literal","value":"addressCityAndState"},{"type":"literal","value":"addressState"},{"type":"literal","value":"postalCode"},{"type":"literal","value":"sublocality"},{"type":"literal","value":"countryName"},{"type":"literal","value":"username"},{"type":"literal","value":"password"},{"type":"literal","value":"newPassword"},{"type":"literal","value":"oneTimeCode"},{"type":"literal","value":"emailAddress"},{"type":"literal","value":"telephoneNumber"},{"type":"literal","value":"cellularEID"},{"type":"literal","value":"cellularIMEI"},{"type":"literal","value":"creditCardNumber"},{"type":"literal","value":"creditCardExpiration"},{"type":"literal","value":"creditCardExpirationMonth"},{"type":"literal","value":"creditCardExpirationYear"},{"type":"literal","value":"creditCardSecurityCode"},{"type":"literal","value":"creditCardType"},{"type":"literal","value":"creditCardName"},{"type":"literal","value":"creditCardGivenName"},{"type":"literal","value":"creditCardMiddleName"},{"type":"literal","value":"creditCardFamilyName"},{"type":"literal","value":"birthdate"},{"type":"literal","value":"birthdateDay"},{"type":"literal","value":"birthdateMonth"},{"type":"literal","value":"birthdateYear"},{"type":"literal","value":"dateTime"},{"type":"literal","value":"flightNumber"},{"type":"literal","value":"shipmentTrackingNumber"}]}}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"textFieldStyle","variant":"declaration","kind":64,"signatures":[{"name":"textFieldStyle","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Sets the text field style for text field views."}],"blockTags":[{"tag":"@see","content":[{"kind":"text","text":"Official [SwiftUI documentation](https://developer.apple.com/documentation/swiftui/view/textfieldstyle(_:))."}]}]},"parameters":[{"name":"style","variant":"param","kind":32768,"comment":{"summary":[{"kind":"text","text":"The text field style."}]},"type":{"type":"union","types":[{"type":"literal","value":"automatic"},{"type":"literal","value":"plain"},{"type":"literal","value":"roundedBorder"}]}}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"textInputAutocapitalization","variant":"declaration","kind":64,"signatures":[{"name":"textInputAutocapitalization","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Sets how often the shift key in the keyboard is automatically enabled."}],"blockTags":[{"tag":"@platform","content":[{"kind":"text","text":"ios 15.0+"}]},{"tag":"@see","content":[{"kind":"text","text":"Official [SwiftUI documentation](https://developer.apple.com/documentation/swiftui/view/textinputautocapitalization(_:))."}]}]},"parameters":[{"name":"autocapitalization","variant":"param","kind":32768,"comment":{"summary":[{"kind":"text","text":"The autocapitalization behavior."}]},"type":{"type":"union","types":[{"type":"literal","value":"never"},{"type":"literal","value":"words"},{"type":"literal","value":"sentences"},{"type":"literal","value":"characters"}]}}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"textSelection","variant":"declaration","kind":64,"signatures":[{"name":"textSelection","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Controls whether people can select text within this view."}],"blockTags":[{"tag":"@see","content":[{"kind":"text","text":"Official [SwiftUI documentation](https://developer.apple.com/documentation/swiftui/view/textselection(_:))."}]}]},"parameters":[{"name":"value","variant":"param","kind":32768,"comment":{"summary":[{"kind":"text","text":"Enable selection"}]},"type":{"type":"intrinsic","name":"boolean"}}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"tint","variant":"declaration","kind":64,"signatures":[{"name":"tint","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Sets the tint color of a view."}],"blockTags":[{"tag":"@see","content":[{"kind":"text","text":"Official [SwiftUI documentation](https://developer.apple.com/documentation/swiftui/view/tint(_:))."}]}]},"parameters":[{"name":"color","variant":"param","kind":32768,"comment":{"summary":[{"kind":"text","text":"The tint color (hex string). For example, "},{"kind":"code","text":"`#FF0000`"},{"kind":"text","text":"."}]},"type":{"type":"reference","name":"Color","package":"@expo/ui"}}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"toggleStyle","variant":"declaration","kind":64,"signatures":[{"name":"toggleStyle","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Sets the style for toggles within this view."}],"blockTags":[{"tag":"@see","content":[{"kind":"text","text":"Official [SwiftUI documentation](https://developer.apple.com/documentation/swiftui/view/togglestyle(_:))."}]}]},"parameters":[{"name":"style","variant":"param","kind":32768,"comment":{"summary":[{"kind":"text","text":"The toggle style."}]},"type":{"type":"union","types":[{"type":"literal","value":"automatic"},{"type":"literal","value":"switch"},{"type":"literal","value":"button"}]}}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"truncationMode","variant":"declaration","kind":64,"signatures":[{"name":"truncationMode","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Sets the truncation mode for lines of text that are too long to fit in the available space."}],"blockTags":[{"tag":"@see","content":[{"kind":"text","text":"Official [SwiftUI documentation](https://developer.apple.com/documentation/swiftui/view/truncationmode(_:))."}]}]},"parameters":[{"name":"mode","variant":"param","kind":32768,"comment":{"summary":[{"kind":"text","text":"The truncation mode that specifies where to truncate the text within the text view, if needed.\nYou can truncate at the beginning, middle, or end of the text view."}]},"type":{"type":"union","types":[{"type":"literal","value":"head"},{"type":"literal","value":"middle"},{"type":"literal","value":"tail"}]}}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"underline","variant":"declaration","kind":64,"signatures":[{"name":"underline","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Applies an underline to the text."}],"blockTags":[{"tag":"@see","content":[{"kind":"text","text":"Official [SwiftUI documentation](https://developer.apple.com/documentation/swiftui/view/underline(_:pattern:color:))."}]}]},"parameters":[{"name":"params","variant":"param","kind":32768,"comment":{"summary":[{"kind":"text","text":"Controls whether the underline is visible ("},{"kind":"code","text":"`true`"},{"kind":"text","text":" to show, "},{"kind":"code","text":"`false`"},{"kind":"text","text":" to hide)."}]},"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"children":[{"name":"color","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"reference","name":"Color","package":"@expo/ui"}},{"name":"isActive","variant":"declaration","kind":1024,"type":{"type":"intrinsic","name":"boolean"}},{"name":"pattern","variant":"declaration","kind":1024,"type":{"type":"reference","target":{"packageName":"@expo/ui","packagePath":"src/swift-ui/modifiers/index.ts","qualifiedName":"LinePattern"},"name":"LinePattern","package":"@expo/ui"}}]}}}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"widgetAccentedRenderingMode","variant":"declaration","kind":64,"signatures":[{"name":"widgetAccentedRenderingMode","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Specifies the how to render an Image when using the WidgetKit/WidgetRenderingMode/accented mode."}],"blockTags":[{"tag":"@see","content":[{"kind":"text","text":"Official [SwiftUI documentation](https://developer.apple.com/documentation/swiftui/image/widgetaccentedrenderingmode(_:))."}]}]},"parameters":[{"name":"renderingMode","variant":"param","kind":32768,"comment":{"summary":[{"kind":"text","text":"A constant describing how the Image should be rendered."}]},"type":{"type":"union","types":[{"type":"literal","value":"fullColor"},{"type":"literal","value":"accented"},{"type":"literal","value":"desaturated"},{"type":"literal","value":"accentedDesaturated"}]}}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"widgetURL","variant":"declaration","kind":64,"signatures":[{"name":"widgetURL","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Sets the URL to open in the containing app when the user clicks the widget.\nWidgets support one widgetURL modifier in their view hierarchy. If multiple views have widgetURL modifiers, the behavior is undefined."}],"blockTags":[{"tag":"@see","content":[{"kind":"text","text":"Official [SwiftUI documentation](https://developer.apple.com/documentation/SwiftUI/View/widgetURL(_:))."}]}]},"parameters":[{"name":"url","variant":"param","kind":32768,"comment":{"summary":[{"kind":"text","text":"The URL to open in the containing app."}]},"type":{"type":"intrinsic","name":"string"}}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"zIndex","variant":"declaration","kind":64,"signatures":[{"name":"zIndex","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Sets the z-index (display order) of a view."}],"blockTags":[{"tag":"@see","content":[{"kind":"text","text":"Official [SwiftUI documentation](https://developer.apple.com/documentation/swiftui/view/zindex(_:))."}]}]},"parameters":[{"name":"index","variant":"param","kind":32768,"comment":{"summary":[{"kind":"text","text":"The z-index value."}]},"type":{"type":"intrinsic","name":"number"}}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]}],"packageName":"@expo/ui"} \ No newline at end of file diff --git a/docs/public/static/data/unversioned/expo-ui/universal/host.json b/docs/public/static/data/unversioned/expo-ui/universal/host.json index 6ff086e6f2139f..fb93c952dbbb61 100644 --- a/docs/public/static/data/unversioned/expo-ui/universal/host.json +++ b/docs/public/static/data/unversioned/expo-ui/universal/host.json @@ -1 +1 @@ -{"schemaVersion":"2.0","name":"expo-ui/universal/host","variant":"project","kind":1,"children":[{"name":"UniversalHostProps","variant":"declaration","kind":256,"comment":{"summary":[{"kind":"text","text":"Props for the ["},{"kind":"code","text":"`Host`"},{"kind":"text","text":"](#host) component."}]},"children":[{"name":"aria-activedescendant","variant":"declaration","kind":1024,"flags":{"isOptional":true,"isInherited":true},"comment":{"summary":[{"kind":"text","text":"Aria props (additional, minus existants)"}],"blockTags":[{"tag":"@see","content":[{"kind":"text","text":" - "},{"kind":"text","text":"https://necolas.github.io/react-native-web/docs/accessibility"},{"kind":"text","text":"\n"},{"kind":"text","text":" - "},{"kind":"text","text":"https://reactnative.dev/docs/accessibility#aria-valuemax"},{"kind":"text","text":"\n"}]}]},"type":{"type":"intrinsic","name":"string"},"inheritedFrom":{"type":"reference","name":"ViewProps.aria-activedescendant"}},{"name":"aria-atomic","variant":"declaration","kind":1024,"flags":{"isOptional":true,"isInherited":true},"type":{"type":"intrinsic","name":"boolean"},"inheritedFrom":{"type":"reference","name":"ViewProps.aria-atomic"}},{"name":"aria-autocomplete","variant":"declaration","kind":1024,"flags":{"isOptional":true,"isInherited":true},"type":{"type":"intrinsic","name":"string"},"inheritedFrom":{"type":"reference","name":"ViewProps.aria-autocomplete"}},{"name":"aria-colcount","variant":"declaration","kind":1024,"flags":{"isOptional":true,"isInherited":true},"type":{"type":"intrinsic","name":"number"},"inheritedFrom":{"type":"reference","name":"ViewProps.aria-colcount"}},{"name":"aria-colindex","variant":"declaration","kind":1024,"flags":{"isOptional":true,"isInherited":true},"type":{"type":"intrinsic","name":"number"},"inheritedFrom":{"type":"reference","name":"ViewProps.aria-colindex"}},{"name":"aria-colspan","variant":"declaration","kind":1024,"flags":{"isOptional":true,"isInherited":true},"type":{"type":"intrinsic","name":"number"},"inheritedFrom":{"type":"reference","name":"ViewProps.aria-colspan"}},{"name":"aria-controls","variant":"declaration","kind":1024,"flags":{"isOptional":true,"isInherited":true},"type":{"type":"intrinsic","name":"string"},"inheritedFrom":{"type":"reference","name":"ViewProps.aria-controls"}},{"name":"aria-current","variant":"declaration","kind":1024,"flags":{"isOptional":true,"isInherited":true},"type":{"type":"union","types":[{"type":"intrinsic","name":"boolean"},{"type":"literal","value":"page"},{"type":"literal","value":"location"},{"type":"literal","value":"time"},{"type":"literal","value":"date"},{"type":"literal","value":"step"}]},"inheritedFrom":{"type":"reference","name":"ViewProps.aria-current"}},{"name":"aria-describedby","variant":"declaration","kind":1024,"flags":{"isOptional":true,"isInherited":true},"type":{"type":"intrinsic","name":"string"},"inheritedFrom":{"type":"reference","name":"ViewProps.aria-describedby"}},{"name":"aria-details","variant":"declaration","kind":1024,"flags":{"isOptional":true,"isInherited":true},"type":{"type":"intrinsic","name":"string"},"inheritedFrom":{"type":"reference","name":"ViewProps.aria-details"}},{"name":"aria-errormessage","variant":"declaration","kind":1024,"flags":{"isOptional":true,"isInherited":true},"type":{"type":"intrinsic","name":"string"},"inheritedFrom":{"type":"reference","name":"ViewProps.aria-errormessage"}},{"name":"aria-flowto","variant":"declaration","kind":1024,"flags":{"isOptional":true,"isInherited":true},"type":{"type":"intrinsic","name":"string"},"inheritedFrom":{"type":"reference","name":"ViewProps.aria-flowto"}},{"name":"aria-haspopup","variant":"declaration","kind":1024,"flags":{"isOptional":true,"isInherited":true},"type":{"type":"intrinsic","name":"string"},"inheritedFrom":{"type":"reference","name":"ViewProps.aria-haspopup"}},{"name":"aria-invalid","variant":"declaration","kind":1024,"flags":{"isOptional":true,"isInherited":true},"type":{"type":"intrinsic","name":"boolean"},"inheritedFrom":{"type":"reference","name":"ViewProps.aria-invalid"}},{"name":"aria-keyshortcuts","variant":"declaration","kind":1024,"flags":{"isOptional":true,"isInherited":true},"type":{"type":"intrinsic","name":"string"},"inheritedFrom":{"type":"reference","name":"ViewProps.aria-keyshortcuts"}},{"name":"aria-level","variant":"declaration","kind":1024,"flags":{"isOptional":true,"isInherited":true},"type":{"type":"intrinsic","name":"number"},"inheritedFrom":{"type":"reference","name":"ViewProps.aria-level"}},{"name":"aria-multiline","variant":"declaration","kind":1024,"flags":{"isOptional":true,"isInherited":true},"type":{"type":"intrinsic","name":"boolean"},"inheritedFrom":{"type":"reference","name":"ViewProps.aria-multiline"}},{"name":"aria-multiselectable","variant":"declaration","kind":1024,"flags":{"isOptional":true,"isInherited":true},"type":{"type":"intrinsic","name":"boolean"},"inheritedFrom":{"type":"reference","name":"ViewProps.aria-multiselectable"}},{"name":"aria-orientation","variant":"declaration","kind":1024,"flags":{"isOptional":true,"isInherited":true},"type":{"type":"union","types":[{"type":"literal","value":"horizontal"},{"type":"literal","value":"vertical"}]},"inheritedFrom":{"type":"reference","name":"ViewProps.aria-orientation"}},{"name":"aria-owns","variant":"declaration","kind":1024,"flags":{"isOptional":true,"isInherited":true},"type":{"type":"intrinsic","name":"string"},"inheritedFrom":{"type":"reference","name":"ViewProps.aria-owns"}},{"name":"aria-placeholder","variant":"declaration","kind":1024,"flags":{"isOptional":true,"isInherited":true},"type":{"type":"intrinsic","name":"string"},"inheritedFrom":{"type":"reference","name":"ViewProps.aria-placeholder"}},{"name":"aria-posinset","variant":"declaration","kind":1024,"flags":{"isOptional":true,"isInherited":true},"type":{"type":"intrinsic","name":"number"},"inheritedFrom":{"type":"reference","name":"ViewProps.aria-posinset"}},{"name":"aria-pressed","variant":"declaration","kind":1024,"flags":{"isOptional":true,"isInherited":true},"type":{"type":"intrinsic","name":"boolean"},"inheritedFrom":{"type":"reference","name":"ViewProps.aria-pressed"}},{"name":"aria-readonly","variant":"declaration","kind":1024,"flags":{"isOptional":true,"isInherited":true},"type":{"type":"intrinsic","name":"boolean"},"inheritedFrom":{"type":"reference","name":"ViewProps.aria-readonly"}},{"name":"aria-required","variant":"declaration","kind":1024,"flags":{"isOptional":true,"isInherited":true},"type":{"type":"intrinsic","name":"boolean"},"inheritedFrom":{"type":"reference","name":"ViewProps.aria-required"}},{"name":"aria-roledescription","variant":"declaration","kind":1024,"flags":{"isOptional":true,"isInherited":true},"type":{"type":"intrinsic","name":"string"},"inheritedFrom":{"type":"reference","name":"ViewProps.aria-roledescription"}},{"name":"aria-rowcount","variant":"declaration","kind":1024,"flags":{"isOptional":true,"isInherited":true},"type":{"type":"intrinsic","name":"number"},"inheritedFrom":{"type":"reference","name":"ViewProps.aria-rowcount"}},{"name":"aria-rowindex","variant":"declaration","kind":1024,"flags":{"isOptional":true,"isInherited":true},"type":{"type":"intrinsic","name":"number"},"inheritedFrom":{"type":"reference","name":"ViewProps.aria-rowindex"}},{"name":"aria-rowspan","variant":"declaration","kind":1024,"flags":{"isOptional":true,"isInherited":true},"type":{"type":"intrinsic","name":"number"},"inheritedFrom":{"type":"reference","name":"ViewProps.aria-rowspan"}},{"name":"aria-setsize","variant":"declaration","kind":1024,"flags":{"isOptional":true,"isInherited":true},"type":{"type":"intrinsic","name":"number"},"inheritedFrom":{"type":"reference","name":"ViewProps.aria-setsize"}},{"name":"aria-sort","variant":"declaration","kind":1024,"flags":{"isOptional":true,"isInherited":true},"type":{"type":"union","types":[{"type":"literal","value":"none"},{"type":"literal","value":"ascending"},{"type":"literal","value":"descending"},{"type":"literal","value":"other"}]},"inheritedFrom":{"type":"reference","name":"ViewProps.aria-sort"}},{"name":"children","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"reference","target":{"packageName":"@types/react","packagePath":"index.d.ts","qualifiedName":"React.ReactNode"},"name":"ReactNode","package":"@types/react","qualifiedName":"React.ReactNode"},"overwrites":{"type":"reference","name":"ViewProps.children"}},{"name":"colorScheme","variant":"declaration","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"The color scheme to apply to descendant native views.\n"},{"kind":"code","text":"`'light'`"},{"kind":"text","text":" / "},{"kind":"code","text":"`'dark'`"},{"kind":"text","text":" force a specific appearance; omitted follows the device setting."}],"blockTags":[{"tag":"@platform","content":[{"kind":"text","text":"android"}]},{"tag":"@platform","content":[{"kind":"text","text":"ios"}]}]},"type":{"type":"reference","target":{"packageName":"react-native","packagePath":"Libraries/Utilities/Appearance.d.ts","qualifiedName":"ColorSchemeName"},"name":"ColorSchemeName","package":"react-native"}},{"name":"layoutDirection","variant":"declaration","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Layout direction for the platform UI content.\nDefaults to the current locale direction from "},{"kind":"code","text":"`I18nManager`"},{"kind":"text","text":"."}],"blockTags":[{"tag":"@platform","content":[{"kind":"text","text":"android"}]},{"tag":"@platform","content":[{"kind":"text","text":"ios"}]}]},"type":{"type":"union","types":[{"type":"literal","value":"leftToRight"},{"type":"literal","value":"rightToLeft"}]}},{"name":"matchContents","variant":"declaration","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"When "},{"kind":"code","text":"`true`"},{"kind":"text","text":", the host updates its size in the React Native view tree to match the content's layout from the underlying platform UI toolkit.\nCan only be set once on mount."}],"blockTags":[{"tag":"@default","content":[{"kind":"text","text":"false"}]},{"tag":"@platform","content":[{"kind":"text","text":"android"}]},{"tag":"@platform","content":[{"kind":"text","text":"ios"}]}]},"type":{"type":"union","types":[{"type":"intrinsic","name":"boolean"},{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"children":[{"name":"horizontal","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"intrinsic","name":"boolean"}},{"name":"vertical","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"intrinsic","name":"boolean"}}]}}]}},{"name":"role","variant":"declaration","kind":1024,"flags":{"isOptional":true,"isInherited":true},"type":{"type":"reference","target":{"packageName":"@expo/ui","packagePath":"src/ts-declarations/react-native-web.d.ts","qualifiedName":"\"react-native\".WebRole"},"name":"WebRole","package":"@expo/ui","qualifiedName":"\"react-native\".WebRole"},"inheritedFrom":{"type":"reference","name":"ViewProps.role"}}],"extendedTypes":[{"type":"reference","target":{"packageName":"react-native","packagePath":"Libraries/Components/View/ViewPropTypes.d.ts","qualifiedName":"ViewProps"},"name":"ViewProps","package":"react-native"}]},{"name":"Host","variant":"declaration","kind":64,"signatures":[{"name":"Host","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"A bridging container that hosts SwiftUI views on iOS and Jetpack Compose views on Android.\nOn platforms without a native UI-toolkit binding (web, RN fallback), renders a plain "},{"kind":"code","text":"`View`"},{"kind":"text","text":".\nThe "},{"kind":"code","text":"`colorScheme`"},{"kind":"text","text":", "},{"kind":"code","text":"`layoutDirection`"},{"kind":"text","text":", and "},{"kind":"code","text":"`matchContents`"},{"kind":"text","text":" props are accepted for API parity but have no effect."}]},"parameters":[{"name":"__namedParameters","variant":"param","kind":32768,"type":{"type":"reference","name":"UniversalHostProps","package":"@expo/ui"}}],"type":{"type":"reference","target":{"packageName":"@types/react","packagePath":"jsx-runtime.d.ts","qualifiedName":"JSX.Element"},"name":"Element","package":"@types/react","qualifiedName":"JSX.Element"}}]}],"packageName":"@expo/ui"} \ No newline at end of file +{"schemaVersion":"2.0","name":"expo-ui/universal/host","variant":"project","kind":1,"children":[{"name":"UniversalHostProps","variant":"declaration","kind":256,"comment":{"summary":[{"kind":"text","text":"Props for the ["},{"kind":"code","text":"`Host`"},{"kind":"text","text":"](#host) component."}]},"children":[{"name":"aria-activedescendant","variant":"declaration","kind":1024,"flags":{"isOptional":true,"isInherited":true},"comment":{"summary":[{"kind":"text","text":"Aria props (additional, minus existants)"}],"blockTags":[{"tag":"@see","content":[{"kind":"text","text":" - "},{"kind":"text","text":"https://necolas.github.io/react-native-web/docs/accessibility"},{"kind":"text","text":"\n"},{"kind":"text","text":" - "},{"kind":"text","text":"https://reactnative.dev/docs/accessibility#aria-valuemax"},{"kind":"text","text":"\n"}]}]},"type":{"type":"intrinsic","name":"string"},"inheritedFrom":{"type":"reference","name":"ViewProps.aria-activedescendant"}},{"name":"aria-atomic","variant":"declaration","kind":1024,"flags":{"isOptional":true,"isInherited":true},"type":{"type":"intrinsic","name":"boolean"},"inheritedFrom":{"type":"reference","name":"ViewProps.aria-atomic"}},{"name":"aria-autocomplete","variant":"declaration","kind":1024,"flags":{"isOptional":true,"isInherited":true},"type":{"type":"intrinsic","name":"string"},"inheritedFrom":{"type":"reference","name":"ViewProps.aria-autocomplete"}},{"name":"aria-colcount","variant":"declaration","kind":1024,"flags":{"isOptional":true,"isInherited":true},"type":{"type":"intrinsic","name":"number"},"inheritedFrom":{"type":"reference","name":"ViewProps.aria-colcount"}},{"name":"aria-colindex","variant":"declaration","kind":1024,"flags":{"isOptional":true,"isInherited":true},"type":{"type":"intrinsic","name":"number"},"inheritedFrom":{"type":"reference","name":"ViewProps.aria-colindex"}},{"name":"aria-colspan","variant":"declaration","kind":1024,"flags":{"isOptional":true,"isInherited":true},"type":{"type":"intrinsic","name":"number"},"inheritedFrom":{"type":"reference","name":"ViewProps.aria-colspan"}},{"name":"aria-controls","variant":"declaration","kind":1024,"flags":{"isOptional":true,"isInherited":true},"type":{"type":"intrinsic","name":"string"},"inheritedFrom":{"type":"reference","name":"ViewProps.aria-controls"}},{"name":"aria-current","variant":"declaration","kind":1024,"flags":{"isOptional":true,"isInherited":true},"type":{"type":"union","types":[{"type":"intrinsic","name":"boolean"},{"type":"literal","value":"page"},{"type":"literal","value":"location"},{"type":"literal","value":"time"},{"type":"literal","value":"date"},{"type":"literal","value":"step"}]},"inheritedFrom":{"type":"reference","name":"ViewProps.aria-current"}},{"name":"aria-describedby","variant":"declaration","kind":1024,"flags":{"isOptional":true,"isInherited":true},"type":{"type":"intrinsic","name":"string"},"inheritedFrom":{"type":"reference","name":"ViewProps.aria-describedby"}},{"name":"aria-details","variant":"declaration","kind":1024,"flags":{"isOptional":true,"isInherited":true},"type":{"type":"intrinsic","name":"string"},"inheritedFrom":{"type":"reference","name":"ViewProps.aria-details"}},{"name":"aria-errormessage","variant":"declaration","kind":1024,"flags":{"isOptional":true,"isInherited":true},"type":{"type":"intrinsic","name":"string"},"inheritedFrom":{"type":"reference","name":"ViewProps.aria-errormessage"}},{"name":"aria-flowto","variant":"declaration","kind":1024,"flags":{"isOptional":true,"isInherited":true},"type":{"type":"intrinsic","name":"string"},"inheritedFrom":{"type":"reference","name":"ViewProps.aria-flowto"}},{"name":"aria-haspopup","variant":"declaration","kind":1024,"flags":{"isOptional":true,"isInherited":true},"type":{"type":"intrinsic","name":"string"},"inheritedFrom":{"type":"reference","name":"ViewProps.aria-haspopup"}},{"name":"aria-invalid","variant":"declaration","kind":1024,"flags":{"isOptional":true,"isInherited":true},"type":{"type":"intrinsic","name":"boolean"},"inheritedFrom":{"type":"reference","name":"ViewProps.aria-invalid"}},{"name":"aria-keyshortcuts","variant":"declaration","kind":1024,"flags":{"isOptional":true,"isInherited":true},"type":{"type":"intrinsic","name":"string"},"inheritedFrom":{"type":"reference","name":"ViewProps.aria-keyshortcuts"}},{"name":"aria-level","variant":"declaration","kind":1024,"flags":{"isOptional":true,"isInherited":true},"type":{"type":"intrinsic","name":"number"},"inheritedFrom":{"type":"reference","name":"ViewProps.aria-level"}},{"name":"aria-multiline","variant":"declaration","kind":1024,"flags":{"isOptional":true,"isInherited":true},"type":{"type":"intrinsic","name":"boolean"},"inheritedFrom":{"type":"reference","name":"ViewProps.aria-multiline"}},{"name":"aria-multiselectable","variant":"declaration","kind":1024,"flags":{"isOptional":true,"isInherited":true},"type":{"type":"intrinsic","name":"boolean"},"inheritedFrom":{"type":"reference","name":"ViewProps.aria-multiselectable"}},{"name":"aria-orientation","variant":"declaration","kind":1024,"flags":{"isOptional":true,"isInherited":true},"type":{"type":"union","types":[{"type":"literal","value":"horizontal"},{"type":"literal","value":"vertical"}]},"inheritedFrom":{"type":"reference","name":"ViewProps.aria-orientation"}},{"name":"aria-owns","variant":"declaration","kind":1024,"flags":{"isOptional":true,"isInherited":true},"type":{"type":"intrinsic","name":"string"},"inheritedFrom":{"type":"reference","name":"ViewProps.aria-owns"}},{"name":"aria-placeholder","variant":"declaration","kind":1024,"flags":{"isOptional":true,"isInherited":true},"type":{"type":"intrinsic","name":"string"},"inheritedFrom":{"type":"reference","name":"ViewProps.aria-placeholder"}},{"name":"aria-posinset","variant":"declaration","kind":1024,"flags":{"isOptional":true,"isInherited":true},"type":{"type":"intrinsic","name":"number"},"inheritedFrom":{"type":"reference","name":"ViewProps.aria-posinset"}},{"name":"aria-pressed","variant":"declaration","kind":1024,"flags":{"isOptional":true,"isInherited":true},"type":{"type":"intrinsic","name":"boolean"},"inheritedFrom":{"type":"reference","name":"ViewProps.aria-pressed"}},{"name":"aria-readonly","variant":"declaration","kind":1024,"flags":{"isOptional":true,"isInherited":true},"type":{"type":"intrinsic","name":"boolean"},"inheritedFrom":{"type":"reference","name":"ViewProps.aria-readonly"}},{"name":"aria-required","variant":"declaration","kind":1024,"flags":{"isOptional":true,"isInherited":true},"type":{"type":"intrinsic","name":"boolean"},"inheritedFrom":{"type":"reference","name":"ViewProps.aria-required"}},{"name":"aria-roledescription","variant":"declaration","kind":1024,"flags":{"isOptional":true,"isInherited":true},"type":{"type":"intrinsic","name":"string"},"inheritedFrom":{"type":"reference","name":"ViewProps.aria-roledescription"}},{"name":"aria-rowcount","variant":"declaration","kind":1024,"flags":{"isOptional":true,"isInherited":true},"type":{"type":"intrinsic","name":"number"},"inheritedFrom":{"type":"reference","name":"ViewProps.aria-rowcount"}},{"name":"aria-rowindex","variant":"declaration","kind":1024,"flags":{"isOptional":true,"isInherited":true},"type":{"type":"intrinsic","name":"number"},"inheritedFrom":{"type":"reference","name":"ViewProps.aria-rowindex"}},{"name":"aria-rowspan","variant":"declaration","kind":1024,"flags":{"isOptional":true,"isInherited":true},"type":{"type":"intrinsic","name":"number"},"inheritedFrom":{"type":"reference","name":"ViewProps.aria-rowspan"}},{"name":"aria-setsize","variant":"declaration","kind":1024,"flags":{"isOptional":true,"isInherited":true},"type":{"type":"intrinsic","name":"number"},"inheritedFrom":{"type":"reference","name":"ViewProps.aria-setsize"}},{"name":"aria-sort","variant":"declaration","kind":1024,"flags":{"isOptional":true,"isInherited":true},"type":{"type":"union","types":[{"type":"literal","value":"none"},{"type":"literal","value":"ascending"},{"type":"literal","value":"descending"},{"type":"literal","value":"other"}]},"inheritedFrom":{"type":"reference","name":"ViewProps.aria-sort"}},{"name":"children","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"reference","target":{"packageName":"@types/react","packagePath":"index.d.ts","qualifiedName":"React.ReactNode"},"name":"ReactNode","package":"@types/react","qualifiedName":"React.ReactNode"},"overwrites":{"type":"reference","name":"ViewProps.children"}},{"name":"colorScheme","variant":"declaration","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"The color scheme to apply to descendant native views.\n"},{"kind":"code","text":"`'light'`"},{"kind":"text","text":" / "},{"kind":"code","text":"`'dark'`"},{"kind":"text","text":" force a specific appearance; omitted follows the device setting."}],"blockTags":[{"tag":"@platform","content":[{"kind":"text","text":"android"}]},{"tag":"@platform","content":[{"kind":"text","text":"ios"}]}]},"type":{"type":"reference","target":{"packageName":"react-native","packagePath":"Libraries/Utilities/Appearance.d.ts","qualifiedName":"ColorSchemeName"},"name":"ColorSchemeName","package":"react-native"}},{"name":"dir","variant":"declaration","kind":1024,"flags":{"isOptional":true,"isInherited":true},"type":{"type":"intrinsic","name":"string"},"inheritedFrom":{"type":"reference","name":"ViewProps.dir"}},{"name":"ignoreSafeArea","variant":"declaration","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Controls which safe area regions the hosting view should ignore. Can only be set once on mount.\n- "},{"kind":"code","text":"`'all'`"},{"kind":"text","text":"- ignores all safe area insets.\n- "},{"kind":"code","text":"`'keyboard'`"},{"kind":"text","text":" - ignores only the keyboard safe area."}],"blockTags":[{"tag":"@platform","content":[{"kind":"text","text":"android"}]},{"tag":"@platform","content":[{"kind":"text","text":"ios"}]},{"tag":"@platform","content":[{"kind":"text","text":"web"}]}]},"type":{"type":"union","types":[{"type":"literal","value":"all"},{"type":"literal","value":"keyboard"}]}},{"name":"layoutDirection","variant":"declaration","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Layout direction for the platform UI content.\nDefaults to the current locale direction from "},{"kind":"code","text":"`I18nManager`"},{"kind":"text","text":"."}],"blockTags":[{"tag":"@platform","content":[{"kind":"text","text":"android"}]},{"tag":"@platform","content":[{"kind":"text","text":"ios"}]},{"tag":"@platform","content":[{"kind":"text","text":"web"}]}]},"type":{"type":"union","types":[{"type":"literal","value":"leftToRight"},{"type":"literal","value":"rightToLeft"}]}},{"name":"matchContents","variant":"declaration","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"When "},{"kind":"code","text":"`true`"},{"kind":"text","text":", the host updates its size in the React Native view tree to match the content's layout from the underlying platform UI toolkit.\nCan only be set once on mount."}],"blockTags":[{"tag":"@default","content":[{"kind":"text","text":"false"}]},{"tag":"@platform","content":[{"kind":"text","text":"android"}]},{"tag":"@platform","content":[{"kind":"text","text":"ios"}]},{"tag":"@platform","content":[{"kind":"text","text":"web"}]}]},"type":{"type":"union","types":[{"type":"intrinsic","name":"boolean"},{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"children":[{"name":"horizontal","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"intrinsic","name":"boolean"}},{"name":"vertical","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"intrinsic","name":"boolean"}}]}}]}},{"name":"onLayoutContent","variant":"declaration","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Callback function that is triggered when the content completes its layout.\nProvides the current dimensions of the content, which may change as the content updates."}],"blockTags":[{"tag":"@platform","content":[{"kind":"text","text":"android"}]},{"tag":"@platform","content":[{"kind":"text","text":"ios"}]},{"tag":"@platform","content":[{"kind":"text","text":"web"}]}]},"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"signatures":[{"name":"__type","variant":"signature","kind":4096,"parameters":[{"name":"event","variant":"param","kind":32768,"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"children":[{"name":"nativeEvent","variant":"declaration","kind":1024,"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"children":[{"name":"height","variant":"declaration","kind":1024,"type":{"type":"intrinsic","name":"number"}},{"name":"width","variant":"declaration","kind":1024,"type":{"type":"intrinsic","name":"number"}}]}}}]}}}],"type":{"type":"intrinsic","name":"void"}}]}}},{"name":"role","variant":"declaration","kind":1024,"flags":{"isOptional":true,"isInherited":true},"type":{"type":"reference","target":{"packageName":"@expo/ui","packagePath":"src/ts-declarations/react-native-web.d.ts","qualifiedName":"\"react-native\".WebRole"},"name":"WebRole","package":"@expo/ui","qualifiedName":"\"react-native\".WebRole"},"inheritedFrom":{"type":"reference","name":"ViewProps.role"}},{"name":"useViewportSizeMeasurement","variant":"declaration","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"When true and no explicit size is provided, the host will use the viewport size as the proposed size for layout.\nThis is particularly useful for views that need to fill their available space, such as "},{"kind":"code","text":"`List`"},{"kind":"text","text":"."}],"blockTags":[{"tag":"@default","content":[{"kind":"text","text":"false"}]},{"tag":"@platform","content":[{"kind":"text","text":"android"}]},{"tag":"@platform","content":[{"kind":"text","text":"ios"}]},{"tag":"@platform","content":[{"kind":"text","text":"web"}]}]},"type":{"type":"intrinsic","name":"boolean"}}],"extendedTypes":[{"type":"reference","target":{"packageName":"react-native","packagePath":"Libraries/Components/View/ViewPropTypes.d.ts","qualifiedName":"ViewProps"},"name":"ViewProps","package":"react-native"}]},{"name":"Host","variant":"declaration","kind":64,"signatures":[{"name":"Host","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"A bridging container that hosts SwiftUI views on iOS and Jetpack Compose views on Android.\nOn platforms without a native UI-toolkit binding (web, RN fallback), renders a plain "},{"kind":"code","text":"`View`"},{"kind":"text","text":".\nThe "},{"kind":"code","text":"`colorScheme`"},{"kind":"text","text":", "},{"kind":"code","text":"`layoutDirection`"},{"kind":"text","text":", and "},{"kind":"code","text":"`matchContents`"},{"kind":"text","text":" props are accepted for API parity but have no effect."}]},"parameters":[{"name":"__namedParameters","variant":"param","kind":32768,"type":{"type":"reference","name":"UniversalHostProps","package":"@expo/ui"}}],"type":{"type":"reference","target":{"packageName":"@types/react","packagePath":"jsx-runtime.d.ts","qualifiedName":"JSX.Element"},"name":"Element","package":"@types/react","qualifiedName":"JSX.Element"}}]}],"packageName":"@expo/ui"} \ No newline at end of file diff --git a/docs/public/static/data/unversioned/expo-ui/universal/rnhostview.json b/docs/public/static/data/unversioned/expo-ui/universal/rnhostview.json index 62f7aaab4109a4..9387a10e12f226 100644 --- a/docs/public/static/data/unversioned/expo-ui/universal/rnhostview.json +++ b/docs/public/static/data/unversioned/expo-ui/universal/rnhostview.json @@ -1 +1 @@ -{"schemaVersion":"2.0","name":"expo-ui/universal/rnhostview","variant":"project","kind":1,"children":[{"name":"RNHostViewProps","variant":"declaration","kind":256,"comment":{"summary":[{"kind":"text","text":"Props for the ["},{"kind":"code","text":"`RNHostView`"},{"kind":"text","text":"](#rnhostview) component."}]},"children":[{"name":"children","variant":"declaration","kind":1024,"comment":{"summary":[{"kind":"text","text":"The React Native view to host."}]},"type":{"type":"reference","target":{"packageName":"@types/react","packagePath":"index.d.ts","qualifiedName":"React.ReactElement"},"name":"ReactElement","package":"@types/react","qualifiedName":"React.ReactElement"}},{"name":"disabled","variant":"declaration","kind":1024,"flags":{"isOptional":true,"isInherited":true},"comment":{"summary":[{"kind":"text","text":"Whether the component is disabled. Disabled components do not respond to user interaction."}],"blockTags":[{"tag":"@platform","content":[{"kind":"text","text":"android"}]},{"tag":"@platform","content":[{"kind":"text","text":"ios"}]},{"tag":"@platform","content":[{"kind":"text","text":"web"}]}]},"type":{"type":"intrinsic","name":"boolean"}},{"name":"hidden","variant":"declaration","kind":1024,"flags":{"isOptional":true,"isInherited":true},"comment":{"summary":[{"kind":"text","text":"Whether the component is hidden."}],"blockTags":[{"tag":"@platform","content":[{"kind":"text","text":"android"}]},{"tag":"@platform","content":[{"kind":"text","text":"ios"}]},{"tag":"@platform","content":[{"kind":"text","text":"web"}]}]},"type":{"type":"intrinsic","name":"boolean"}},{"name":"matchContents","variant":"declaration","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"When "},{"kind":"code","text":"`true`"},{"kind":"text","text":", the host updates its size in the native view tree to match\nthe children's size. When "},{"kind":"code","text":"`false`"},{"kind":"text","text":", the host uses the size of the parent\nnative view.\n\nCan only be set once on mount; changing it remounts the component."}],"blockTags":[{"tag":"@default","content":[{"kind":"text","text":"false"}]},{"tag":"@platform","content":[{"kind":"text","text":"android"}]},{"tag":"@platform","content":[{"kind":"text","text":"ios"}]}]},"type":{"type":"intrinsic","name":"boolean"}},{"name":"modifiers","variant":"declaration","kind":1024,"flags":{"isOptional":true,"isInherited":true},"comment":{"summary":[{"kind":"text","text":"Platform-specific modifier escape hatch. Pass an array of modifier configs\nfrom "},{"kind":"code","text":"`@expo/ui/swift-ui/modifiers`"},{"kind":"text","text":" or "},{"kind":"code","text":"`@expo/ui/jetpack-compose/modifiers`"},{"kind":"text","text":"."}],"blockTags":[{"tag":"@platform","content":[{"kind":"text","text":"android"}]},{"tag":"@platform","content":[{"kind":"text","text":"ios"}]}]},"type":{"type":"array","elementType":{"type":"reference","target":{"packageName":"@expo/ui","packagePath":"src/types.ts","qualifiedName":"ModifierConfig"},"name":"ModifierConfig","package":"@expo/ui"}}},{"name":"onAppear","variant":"declaration","kind":1024,"flags":{"isOptional":true,"isInherited":true},"comment":{"summary":[{"kind":"text","text":"Called when the component appears on screen."}],"blockTags":[{"tag":"@platform","content":[{"kind":"text","text":"android"}]},{"tag":"@platform","content":[{"kind":"text","text":"ios"}]},{"tag":"@platform","content":[{"kind":"text","text":"web"}]}]},"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"signatures":[{"name":"__type","variant":"signature","kind":4096,"type":{"type":"intrinsic","name":"void"}}]}}},{"name":"onDisappear","variant":"declaration","kind":1024,"flags":{"isOptional":true,"isInherited":true},"comment":{"summary":[{"kind":"text","text":"Called when the component is removed from screen."}],"blockTags":[{"tag":"@platform","content":[{"kind":"text","text":"android"}]},{"tag":"@platform","content":[{"kind":"text","text":"ios"}]},{"tag":"@platform","content":[{"kind":"text","text":"web"}]}]},"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"signatures":[{"name":"__type","variant":"signature","kind":4096,"type":{"type":"intrinsic","name":"void"}}]}}},{"name":"onPress","variant":"declaration","kind":1024,"flags":{"isOptional":true,"isInherited":true},"comment":{"summary":[{"kind":"text","text":"Called when the component is pressed."}],"blockTags":[{"tag":"@platform","content":[{"kind":"text","text":"android"}]},{"tag":"@platform","content":[{"kind":"text","text":"ios"}]},{"tag":"@platform","content":[{"kind":"text","text":"web"}]}]},"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"signatures":[{"name":"__type","variant":"signature","kind":4096,"type":{"type":"intrinsic","name":"void"}}]}}},{"name":"style","variant":"declaration","kind":1024,"flags":{"isOptional":true,"isInherited":true},"comment":{"summary":[{"kind":"text","text":"Platform-agnostic style properties. These are translated to SwiftUI modifiers on iOS\nand Jetpack Compose modifiers on Android."}],"blockTags":[{"tag":"@platform","content":[{"kind":"text","text":"android"}]},{"tag":"@platform","content":[{"kind":"text","text":"ios"}]},{"tag":"@platform","content":[{"kind":"text","text":"web"}]}]},"type":{"type":"reference","target":{"packageName":"typescript","packagePath":"lib/lib.es5.d.ts","qualifiedName":"Pick"},"typeArguments":[{"type":"reference","target":{"packageName":"react-native","packagePath":"Libraries/StyleSheet/StyleSheetTypes.d.ts","qualifiedName":"ViewStyle"},"name":"ViewStyle","package":"react-native"},{"type":"union","types":[{"type":"literal","value":"padding"},{"type":"literal","value":"paddingHorizontal"},{"type":"literal","value":"paddingVertical"},{"type":"literal","value":"paddingTop"},{"type":"literal","value":"paddingBottom"},{"type":"literal","value":"paddingLeft"},{"type":"literal","value":"paddingRight"},{"type":"literal","value":"backgroundColor"},{"type":"literal","value":"borderRadius"},{"type":"literal","value":"borderWidth"},{"type":"literal","value":"borderColor"},{"type":"literal","value":"opacity"},{"type":"literal","value":"width"},{"type":"literal","value":"height"}]}],"name":"Pick","package":"typescript"}},{"name":"testID","variant":"declaration","kind":1024,"flags":{"isOptional":true,"isInherited":true},"comment":{"summary":[{"kind":"text","text":"Identifier used to locate the component in end-to-end tests."}],"blockTags":[{"tag":"@platform","content":[{"kind":"text","text":"android"}]},{"tag":"@platform","content":[{"kind":"text","text":"ios"}]},{"tag":"@platform","content":[{"kind":"text","text":"web"}]}]},"type":{"type":"intrinsic","name":"string"}}]},{"name":"RNHostView","variant":"declaration","kind":64,"signatures":[{"name":"RNHostView","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Hosts React Native views inside SwiftUI or Jetpack Compose views."}]},"parameters":[{"name":"__namedParameters","variant":"param","kind":32768,"type":{"type":"reference","name":"RNHostViewProps","package":"@expo/ui"}}],"type":{"type":"reference","target":{"packageName":"@types/react","packagePath":"jsx-runtime.d.ts","qualifiedName":"JSX.Element"},"name":"Element","package":"@types/react","qualifiedName":"JSX.Element"}}]}],"packageName":"@expo/ui"} \ No newline at end of file +{"schemaVersion":"2.0","name":"expo-ui/universal/rnhostview","variant":"project","kind":1,"children":[{"name":"RNHostViewProps","variant":"declaration","kind":256,"comment":{"summary":[{"kind":"text","text":"Props for the ["},{"kind":"code","text":"`RNHostView`"},{"kind":"text","text":"](#rnhostview) component."}]},"children":[{"name":"children","variant":"declaration","kind":1024,"comment":{"summary":[{"kind":"text","text":"The React Native view to host."}]},"type":{"type":"reference","target":{"packageName":"@types/react","packagePath":"index.d.ts","qualifiedName":"React.ReactElement"},"name":"ReactElement","package":"@types/react","qualifiedName":"React.ReactElement"}},{"name":"disabled","variant":"declaration","kind":1024,"flags":{"isOptional":true,"isInherited":true},"comment":{"summary":[{"kind":"text","text":"Whether the component is disabled. Disabled components do not respond to user interaction."}],"blockTags":[{"tag":"@platform","content":[{"kind":"text","text":"android"}]},{"tag":"@platform","content":[{"kind":"text","text":"ios"}]},{"tag":"@platform","content":[{"kind":"text","text":"web"}]}]},"type":{"type":"intrinsic","name":"boolean"}},{"name":"hidden","variant":"declaration","kind":1024,"flags":{"isOptional":true,"isInherited":true},"comment":{"summary":[{"kind":"text","text":"Whether the component is hidden."}],"blockTags":[{"tag":"@platform","content":[{"kind":"text","text":"android"}]},{"tag":"@platform","content":[{"kind":"text","text":"ios"}]},{"tag":"@platform","content":[{"kind":"text","text":"web"}]}]},"type":{"type":"intrinsic","name":"boolean"}},{"name":"matchContents","variant":"declaration","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"When "},{"kind":"code","text":"`true`"},{"kind":"text","text":", the host updates its size in the native view tree to match\nthe children's size. When "},{"kind":"code","text":"`false`"},{"kind":"text","text":", the host uses the size of the parent\nnative view.\n\nCan only be set once on mount; changing it remounts the component."}],"blockTags":[{"tag":"@default","content":[{"kind":"text","text":"false"}]},{"tag":"@platform","content":[{"kind":"text","text":"android"}]},{"tag":"@platform","content":[{"kind":"text","text":"ios"}]}]},"type":{"type":"intrinsic","name":"boolean"}},{"name":"modifiers","variant":"declaration","kind":1024,"flags":{"isOptional":true,"isInherited":true},"comment":{"summary":[{"kind":"text","text":"Platform-specific modifier escape hatch. Pass an array of modifier configs\nfrom "},{"kind":"code","text":"`@expo/ui/swift-ui/modifiers`"},{"kind":"text","text":" or "},{"kind":"code","text":"`@expo/ui/jetpack-compose/modifiers`"},{"kind":"text","text":"."}],"blockTags":[{"tag":"@platform","content":[{"kind":"text","text":"android"}]},{"tag":"@platform","content":[{"kind":"text","text":"ios"}]}]},"type":{"type":"array","elementType":{"type":"reference","target":{"packageName":"@expo/ui","packagePath":"src/types.ts","qualifiedName":"ModifierConfig"},"name":"ModifierConfig","package":"@expo/ui"}}},{"name":"onAppear","variant":"declaration","kind":1024,"flags":{"isOptional":true,"isInherited":true},"comment":{"summary":[{"kind":"text","text":"Called when the component appears on screen."}],"blockTags":[{"tag":"@platform","content":[{"kind":"text","text":"android"}]},{"tag":"@platform","content":[{"kind":"text","text":"ios"}]},{"tag":"@platform","content":[{"kind":"text","text":"web"}]}]},"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"signatures":[{"name":"__type","variant":"signature","kind":4096,"type":{"type":"intrinsic","name":"void"}}]}}},{"name":"onDisappear","variant":"declaration","kind":1024,"flags":{"isOptional":true,"isInherited":true},"comment":{"summary":[{"kind":"text","text":"Called when the component is removed from screen."}],"blockTags":[{"tag":"@platform","content":[{"kind":"text","text":"android"}]},{"tag":"@platform","content":[{"kind":"text","text":"ios"}]},{"tag":"@platform","content":[{"kind":"text","text":"web"}]}]},"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"signatures":[{"name":"__type","variant":"signature","kind":4096,"type":{"type":"intrinsic","name":"void"}}]}}},{"name":"onPress","variant":"declaration","kind":1024,"flags":{"isOptional":true,"isInherited":true},"comment":{"summary":[{"kind":"text","text":"Called when the component is pressed."}],"blockTags":[{"tag":"@platform","content":[{"kind":"text","text":"android"}]},{"tag":"@platform","content":[{"kind":"text","text":"ios"}]},{"tag":"@platform","content":[{"kind":"text","text":"web"}]}]},"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"signatures":[{"name":"__type","variant":"signature","kind":4096,"type":{"type":"intrinsic","name":"void"}}]}}},{"name":"style","variant":"declaration","kind":1024,"flags":{"isOptional":true,"isInherited":true},"comment":{"summary":[{"kind":"text","text":"Platform-agnostic style properties. These are translated to SwiftUI modifiers on iOS\nand Jetpack Compose modifiers on Android."}],"blockTags":[{"tag":"@platform","content":[{"kind":"text","text":"android"}]},{"tag":"@platform","content":[{"kind":"text","text":"ios"}]},{"tag":"@platform","content":[{"kind":"text","text":"web"}]}]},"type":{"type":"reference","target":{"packageName":"typescript","packagePath":"lib/lib.es5.d.ts","qualifiedName":"Pick"},"typeArguments":[{"type":"reference","target":{"packageName":"react-native","packagePath":"Libraries/StyleSheet/StyleSheetTypes.d.ts","qualifiedName":"ViewStyle"},"name":"ViewStyle","package":"react-native"},{"type":"union","types":[{"type":"literal","value":"padding"},{"type":"literal","value":"paddingHorizontal"},{"type":"literal","value":"paddingVertical"},{"type":"literal","value":"paddingTop"},{"type":"literal","value":"paddingBottom"},{"type":"literal","value":"paddingLeft"},{"type":"literal","value":"paddingRight"},{"type":"literal","value":"backgroundColor"},{"type":"literal","value":"borderRadius"},{"type":"literal","value":"borderWidth"},{"type":"literal","value":"borderColor"},{"type":"literal","value":"opacity"},{"type":"literal","value":"width"},{"type":"literal","value":"height"}]}],"name":"Pick","package":"typescript"}},{"name":"testID","variant":"declaration","kind":1024,"flags":{"isOptional":true,"isInherited":true},"comment":{"summary":[{"kind":"text","text":"Identifier used to locate the component in end-to-end tests."}],"blockTags":[{"tag":"@platform","content":[{"kind":"text","text":"android"}]},{"tag":"@platform","content":[{"kind":"text","text":"ios"}]},{"tag":"@platform","content":[{"kind":"text","text":"web"}]}]},"type":{"type":"intrinsic","name":"string"}}]},{"name":"RNHostView","variant":"declaration","kind":64,"signatures":[{"name":"RNHostView","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Hosts React Native views inside Jetpack Compose or SwiftUI views."}]},"parameters":[{"name":"__namedParameters","variant":"param","kind":32768,"type":{"type":"reference","name":"RNHostViewProps","package":"@expo/ui"}}],"type":{"type":"reference","target":{"packageName":"@types/react","packagePath":"jsx-runtime.d.ts","qualifiedName":"JSX.Element"},"name":"Element","package":"@types/react","qualifiedName":"JSX.Element"}}]}],"packageName":"@expo/ui"} \ No newline at end of file diff --git a/docs/public/static/data/v56.0.0/expo-ui/swift-ui/modifiers.json b/docs/public/static/data/v56.0.0/expo-ui/swift-ui/modifiers.json index 23bb24a4778b97..e025167cedb090 100644 --- a/docs/public/static/data/v56.0.0/expo-ui/swift-ui/modifiers.json +++ b/docs/public/static/data/v56.0.0/expo-ui/swift-ui/modifiers.json @@ -1 +1 @@ -{"schemaVersion":"2.0","name":"expo-ui/swift-ui/modifiers","variant":"project","kind":1,"children":[{"name":"ModifierConfig","variant":"declaration","kind":256,"comment":{"summary":[{"kind":"text","text":"Base interface for all view modifiers.\nAll modifiers must have a type field and can include arbitrary parameters."}]},"children":[{"name":"$type","variant":"declaration","kind":1024,"type":{"type":"intrinsic","name":"string"}},{"name":"eventListener","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"signatures":[{"name":"__type","variant":"signature","kind":4096,"parameters":[{"name":"args","variant":"param","kind":32768,"type":{"type":"intrinsic","name":"any"}}],"type":{"type":"intrinsic","name":"void"}}]}}}],"indexSignatures":[{"name":"__index","variant":"signature","kind":8192,"parameters":[{"name":"key","variant":"param","kind":32768,"type":{"type":"intrinsic","name":"string"}}],"type":{"type":"intrinsic","name":"any"}}]},{"name":"ChainableAnimationType","variant":"declaration","kind":2097152,"children":[{"name":"[VALUE_SYMBOL]","variant":"declaration","kind":1024,"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"signatures":[{"name":"__type","variant":"signature","kind":4096,"type":{"type":"reference","target":{"packageName":"@expo/ui","packagePath":"src/swift-ui/modifiers/animation/types.ts","qualifiedName":"AnimationObject"},"name":"AnimationObject","package":"@expo/ui"}}]}}},{"name":"delay","variant":"declaration","kind":1024,"comment":{"summary":[{"kind":"text","text":"Adds a delay before the animation starts (in seconds)."}]},"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"signatures":[{"name":"__type","variant":"signature","kind":4096,"parameters":[{"name":"delay","variant":"param","kind":32768,"type":{"type":"intrinsic","name":"number"}}],"type":{"type":"reference","name":"ChainableAnimationType","package":"@expo/ui"}}]}}},{"name":"repeat","variant":"declaration","kind":1024,"comment":{"summary":[{"kind":"text","text":"Repeats the animation the given number of times."}]},"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"signatures":[{"name":"__type","variant":"signature","kind":4096,"parameters":[{"name":"params","variant":"param","kind":32768,"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"children":[{"name":"autoreverses","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"intrinsic","name":"boolean"}},{"name":"repeatCount","variant":"declaration","kind":1024,"type":{"type":"intrinsic","name":"number"}}]}}}],"type":{"type":"reference","name":"ChainableAnimationType","package":"@expo/ui"}}]}}}]},{"name":"Color","variant":"declaration","kind":2097152,"type":{"type":"union","types":[{"type":"intrinsic","name":"string"},{"type":"reference","target":{"packageName":"react-native","packagePath":"Libraries/StyleSheet/StyleSheet.d.ts","qualifiedName":"ColorValue"},"name":"ColorValue","package":"react-native"},{"type":"reference","target":{"packageName":"@expo/ui","packagePath":"src/swift-ui/modifiers/types.ts","qualifiedName":"NamedColor"},"name":"NamedColor","package":"@expo/ui"}]}},{"name":"ContainerBackgroundPlacement","variant":"declaration","kind":2097152,"type":{"type":"union","types":[{"type":"literal","value":"widget"},{"type":"literal","value":"navigation"},{"type":"literal","value":"navigationSplitView"}]}},{"name":"DatePickerStyleType","variant":"declaration","kind":2097152,"type":{"type":"union","types":[{"type":"literal","value":"automatic"},{"type":"literal","value":"compact"},{"type":"literal","value":"graphical"},{"type":"literal","value":"wheel"}]}},{"name":"DiscreteSymbolEffectValue","variant":"declaration","kind":2097152,"comment":{"summary":[{"kind":"text","text":"Equatable primitive accepted as a discrete effect trigger."}]},"type":{"type":"union","types":[{"type":"intrinsic","name":"number"},{"type":"intrinsic","name":"string"},{"type":"intrinsic","name":"boolean"}]}},{"name":"EnvironmentConfig","variant":"declaration","kind":2097152,"type":{"type":"union","types":[{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"children":[{"name":"key","variant":"declaration","kind":1024,"type":{"type":"literal","value":"editMode"}},{"name":"value","variant":"declaration","kind":1024,"type":{"type":"union","types":[{"type":"literal","value":"active"},{"type":"literal","value":"inactive"},{"type":"literal","value":"transient"}]}}]}},{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"children":[{"name":"key","variant":"declaration","kind":1024,"type":{"type":"literal","value":"colorScheme"}},{"name":"value","variant":"declaration","kind":1024,"type":{"type":"union","types":[{"type":"literal","value":"light"},{"type":"literal","value":"dark"}]}}]}},{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"children":[{"name":"key","variant":"declaration","kind":1024,"type":{"type":"literal","value":"locale"}},{"name":"value","variant":"declaration","kind":1024,"type":{"type":"intrinsic","name":"string"}}]}},{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"children":[{"name":"key","variant":"declaration","kind":1024,"type":{"type":"literal","value":"timeZone"}},{"name":"value","variant":"declaration","kind":1024,"type":{"type":"intrinsic","name":"string"}}]}}]}},{"name":"GaugeStyleType","variant":"declaration","kind":2097152,"type":{"type":"union","types":[{"type":"literal","value":"automatic"},{"type":"literal","value":"circular"},{"type":"literal","value":"circularCapacity"},{"type":"literal","value":"linear"},{"type":"literal","value":"linearCapacity"}]}},{"name":"GlobalEvent","variant":"declaration","kind":2097152,"children":[{"name":"onGlobalEvent","variant":"declaration","kind":1024,"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"signatures":[{"name":"__type","variant":"signature","kind":4096,"parameters":[{"name":"event","variant":"param","kind":32768,"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"children":[{"name":"nativeEvent","variant":"declaration","kind":1024,"type":{"type":"reference","name":"GlobalEventPayload","package":"@expo/ui"}}]}}}],"type":{"type":"intrinsic","name":"void"}}]}}}]},{"name":"GlobalEventPayload","variant":"declaration","kind":2097152,"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"indexSignatures":[{"name":"__index","variant":"signature","kind":8192,"parameters":[{"name":"eventName","variant":"param","kind":32768,"type":{"type":"intrinsic","name":"string"}}],"type":{"type":"reference","target":{"packageName":"typescript","packagePath":"lib/lib.es5.d.ts","qualifiedName":"Record"},"typeArguments":[{"type":"intrinsic","name":"string"},{"type":"intrinsic","name":"any"}],"name":"Record","package":"typescript"}}]}}},{"name":"IndexViewStyleConfig","variant":"declaration","kind":2097152,"comment":{"summary":[{"kind":"text","text":"Configuration for the "},{"kind":"code","text":"`indexViewStyle`"},{"kind":"text","text":" modifier."}]},"children":[{"name":"backgroundDisplayMode","variant":"declaration","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Translucent background behind the page indicator dots. Useful when the\ndots sit on top of dark or busy content."}],"blockTags":[{"tag":"@default","content":[{"kind":"text","text":"'automatic'"}]}]},"type":{"type":"reference","name":"PageIndexBackgroundDisplayMode","package":"@expo/ui"}}]},{"name":"InterpolatingSpringAnimationParams","variant":"declaration","kind":2097152,"children":[{"name":"bounce","variant":"declaration","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Extra bounce to apply to the spring animation."}]},"type":{"type":"intrinsic","name":"number"}},{"name":"damping","variant":"declaration","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"The damping applied to the spring."}]},"type":{"type":"intrinsic","name":"number"}},{"name":"duration","variant":"declaration","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Total animation duration (in seconds)."}]},"type":{"type":"intrinsic","name":"number"}},{"name":"initialVelocity","variant":"declaration","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"The initial velocity of the animation."}]},"type":{"type":"intrinsic","name":"number"}},{"name":"mass","variant":"declaration","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"The mass attached to the spring."}]},"type":{"type":"intrinsic","name":"number"}},{"name":"stiffness","variant":"declaration","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"The stiffness of the spring."}]},"type":{"type":"intrinsic","name":"number"}}]},{"name":"ListStyle","variant":"declaration","kind":2097152,"type":{"type":"union","types":[{"type":"literal","value":"automatic"},{"type":"literal","value":"plain"},{"type":"literal","value":"inset"},{"type":"literal","value":"insetGrouped"},{"type":"literal","value":"grouped"},{"type":"literal","value":"sidebar"}]}},{"name":"ObservableState","variant":"declaration","kind":2097152,"comment":{"summary":[{"kind":"text","text":"Observable state shared between JavaScript and native views (Jetpack Compose\non Android and SwiftUI on iOS)."}]},"typeParameters":[{"name":"T","variant":"typeParam","kind":131072}],"type":{"type":"intersection","types":[{"type":"reference","target":{"packageName":"expo-modules-core","packagePath":"src/SharedObject.ts","qualifiedName":"SharedObject"},"name":"SharedObject","package":"expo-modules-core"},{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"children":[{"name":"value","variant":"declaration","kind":1024,"comment":{"summary":[{"kind":"text","text":"The current value. Reads are safe from any thread; prefer writing from a worklet\nso the update runs on the native UI thread. Updating state from the JS thread\nmight show a development warning."}]},"type":{"type":"reference","name":"T","package":"@expo/ui","refersToTypeParameter":true}}]}}]}},{"name":"PageIndexBackgroundDisplayMode","variant":"declaration","kind":2097152,"type":{"type":"union","types":[{"type":"literal","value":"automatic"},{"type":"literal","value":"always"},{"type":"literal","value":"never"},{"type":"literal","value":"interactive"}]}},{"name":"PageIndexDisplayMode","variant":"declaration","kind":2097152,"type":{"type":"union","types":[{"type":"literal","value":"automatic"},{"type":"literal","value":"always"},{"type":"literal","value":"never"}]}},{"name":"PickerStyleType","variant":"declaration","kind":2097152,"type":{"type":"union","types":[{"type":"literal","value":"automatic"},{"type":"literal","value":"inline"},{"type":"literal","value":"menu"},{"type":"literal","value":"navigationLink"},{"type":"literal","value":"palette"},{"type":"literal","value":"segmented"},{"type":"literal","value":"wheel"}]}},{"name":"PresentationBackgroundInteractionType","variant":"declaration","kind":2097152,"comment":{"summary":[{"kind":"text","text":"Presentation background interaction type."}]},"type":{"type":"union","types":[{"type":"literal","value":"automatic"},{"type":"literal","value":"enabled"},{"type":"literal","value":"disabled"},{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"children":[{"name":"detent","variant":"declaration","kind":1024,"type":{"type":"reference","name":"PresentationDetent","package":"@expo/ui"}},{"name":"type","variant":"declaration","kind":1024,"type":{"type":"literal","value":"enabledUpThrough"}}]}}]}},{"name":"PresentationDetent","variant":"declaration","kind":2097152,"comment":{"summary":[{"kind":"text","text":"Presentation detent type for controlling sheet heights.\n- "},{"kind":"code","text":"`'medium'`"},{"kind":"text","text":": System medium height (approximately half screen)\n- "},{"kind":"code","text":"`'large'`"},{"kind":"text","text":": System large height (full screen)\n- "},{"kind":"code","text":"`{ fraction: number }`"},{"kind":"text","text":": Fraction of screen height (0-1, for example, 0.4 equals to 40% of screen)\n- "},{"kind":"code","text":"`{ height: number }`"},{"kind":"text","text":": Fixed height in points"}]},"type":{"type":"union","types":[{"type":"literal","value":"medium"},{"type":"literal","value":"large"},{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"children":[{"name":"fraction","variant":"declaration","kind":1024,"type":{"type":"intrinsic","name":"number"}}]}},{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"children":[{"name":"height","variant":"declaration","kind":1024,"type":{"type":"intrinsic","name":"number"}}]}}]}},{"name":"ProgressViewStyleType","variant":"declaration","kind":2097152,"type":{"type":"union","types":[{"type":"literal","value":"automatic"},{"type":"literal","value":"linear"},{"type":"literal","value":"circular"}]}},{"name":"Shape","variant":"declaration","kind":2097152,"type":{"type":"union","types":[{"type":"reference","target":{"packageName":"typescript","packagePath":"lib/lib.es5.d.ts","qualifiedName":"ReturnType"},"typeArguments":[{"type":"query","queryType":{"type":"reference","name":"shapes.roundedRectangle","package":"@expo/ui","qualifiedName":"__object.roundedRectangle"}}],"name":"ReturnType","package":"typescript"},{"type":"reference","target":{"packageName":"typescript","packagePath":"lib/lib.es5.d.ts","qualifiedName":"ReturnType"},"typeArguments":[{"type":"query","queryType":{"type":"reference","name":"shapes.capsule","package":"@expo/ui","qualifiedName":"__object.capsule"}}],"name":"ReturnType","package":"typescript"},{"type":"reference","target":{"packageName":"typescript","packagePath":"lib/lib.es5.d.ts","qualifiedName":"ReturnType"},"typeArguments":[{"type":"query","queryType":{"type":"reference","name":"shapes.rectangle","package":"@expo/ui","qualifiedName":"__object.rectangle"}}],"name":"ReturnType","package":"typescript"},{"type":"reference","target":{"packageName":"typescript","packagePath":"lib/lib.es5.d.ts","qualifiedName":"ReturnType"},"typeArguments":[{"type":"query","queryType":{"type":"reference","name":"shapes.ellipse","package":"@expo/ui","qualifiedName":"__object.ellipse"}}],"name":"ReturnType","package":"typescript"},{"type":"reference","target":{"packageName":"typescript","packagePath":"lib/lib.es5.d.ts","qualifiedName":"ReturnType"},"typeArguments":[{"type":"query","queryType":{"type":"reference","name":"shapes.circle","package":"@expo/ui","qualifiedName":"__object.circle"}}],"name":"ReturnType","package":"typescript"},{"type":"reference","target":{"packageName":"typescript","packagePath":"lib/lib.es5.d.ts","qualifiedName":"ReturnType"},"typeArguments":[{"type":"query","queryType":{"type":"reference","name":"shapes.containerRelativeShape","package":"@expo/ui","qualifiedName":"__object.containerRelativeShape"}}],"name":"ReturnType","package":"typescript"}]}},{"name":"SpringAnimationParams","variant":"declaration","kind":2097152,"children":[{"name":"blendDuration","variant":"declaration","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"The duration over which to blend between animations (in seconds)."}]},"type":{"type":"intrinsic","name":"number"}},{"name":"bounce","variant":"declaration","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Extra bounce to apply to the spring animation."}]},"type":{"type":"intrinsic","name":"number"}},{"name":"dampingFraction","variant":"declaration","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"The amount of damping applied to the spring's motion."}]},"type":{"type":"intrinsic","name":"number"}},{"name":"duration","variant":"declaration","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Total animation duration (in seconds)."}]},"type":{"type":"intrinsic","name":"number"}},{"name":"response","variant":"declaration","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"The spring's response time (in seconds)."}]},"type":{"type":"intrinsic","name":"number"}}]},{"name":"SymbolEffect","variant":"declaration","kind":2097152,"type":{"type":"union","types":[{"type":"reference","target":{"packageName":"@expo/ui","packagePath":"src/swift-ui/modifiers/symbolEffect.ts","qualifiedName":"AppearSymbolEffect"},"name":"AppearSymbolEffect","package":"@expo/ui"},{"type":"reference","target":{"packageName":"@expo/ui","packagePath":"src/swift-ui/modifiers/symbolEffect.ts","qualifiedName":"BounceSymbolEffect"},"name":"BounceSymbolEffect","package":"@expo/ui"},{"type":"reference","target":{"packageName":"@expo/ui","packagePath":"src/swift-ui/modifiers/symbolEffect.ts","qualifiedName":"BreatheSymbolEffect"},"name":"BreatheSymbolEffect","package":"@expo/ui"},{"type":"reference","target":{"packageName":"@expo/ui","packagePath":"src/swift-ui/modifiers/symbolEffect.ts","qualifiedName":"DisappearSymbolEffect"},"name":"DisappearSymbolEffect","package":"@expo/ui"},{"type":"reference","target":{"packageName":"@expo/ui","packagePath":"src/swift-ui/modifiers/symbolEffect.ts","qualifiedName":"DrawOffSymbolEffect"},"name":"DrawOffSymbolEffect","package":"@expo/ui"},{"type":"reference","target":{"packageName":"@expo/ui","packagePath":"src/swift-ui/modifiers/symbolEffect.ts","qualifiedName":"DrawOnSymbolEffect"},"name":"DrawOnSymbolEffect","package":"@expo/ui"},{"type":"reference","target":{"packageName":"@expo/ui","packagePath":"src/swift-ui/modifiers/symbolEffect.ts","qualifiedName":"PulseSymbolEffect"},"name":"PulseSymbolEffect","package":"@expo/ui"},{"type":"reference","target":{"packageName":"@expo/ui","packagePath":"src/swift-ui/modifiers/symbolEffect.ts","qualifiedName":"RotateSymbolEffect"},"name":"RotateSymbolEffect","package":"@expo/ui"},{"type":"reference","target":{"packageName":"@expo/ui","packagePath":"src/swift-ui/modifiers/symbolEffect.ts","qualifiedName":"ScaleSymbolEffect"},"name":"ScaleSymbolEffect","package":"@expo/ui"},{"type":"reference","target":{"packageName":"@expo/ui","packagePath":"src/swift-ui/modifiers/symbolEffect.ts","qualifiedName":"VariableColorSymbolEffect"},"name":"VariableColorSymbolEffect","package":"@expo/ui"},{"type":"reference","target":{"packageName":"@expo/ui","packagePath":"src/swift-ui/modifiers/symbolEffect.ts","qualifiedName":"WiggleSymbolEffect"},"name":"WiggleSymbolEffect","package":"@expo/ui"}]}},{"name":"SymbolEffectOptions","variant":"declaration","kind":2097152,"comment":{"summary":[{"kind":"text","text":"Animation options for a symbol effect."}],"blockTags":[{"tag":"@see","content":[{"kind":"text","text":"Official [Apple documentation](https://developer.apple.com/documentation/symbols/symboleffectoptions)."}]}]},"children":[{"name":"repeat","variant":"declaration","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"How the effect repeats. Omit for the effect's natural cadence.\n- "},{"kind":"code","text":"`'nonRepeating'`"},{"kind":"text","text":" — play exactly once.\n- "},{"kind":"code","text":"`'continuous'`"},{"kind":"text","text":" — smooth, indefinite repetition (iOS 18+).\n- "},{"kind":"code","text":"`{ count?, delay? }`"},{"kind":"text","text":" — periodic repetition with optional count and delay in seconds (iOS 18+)."}]},"type":{"type":"union","types":[{"type":"literal","value":"continuous"},{"type":"literal","value":"nonRepeating"},{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"children":[{"name":"count","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"intrinsic","name":"number"}},{"name":"delay","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"intrinsic","name":"number"}}]}}]}},{"name":"speed","variant":"declaration","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Animation speed multiplier (1.0 = default)."}]},"type":{"type":"intrinsic","name":"number"}}]},{"name":"TabViewStyleConfig","variant":"declaration","kind":2097152,"comment":{"summary":[{"kind":"text","text":"Configuration for the "},{"kind":"code","text":"`tabViewStyle`"},{"kind":"text","text":" modifier.\n\n - "},{"kind":"code","text":"`'page'`"},{"kind":"text","text":" — swipeable horizontal pager with optional dot indicators.\n - "},{"kind":"code","text":"`'automatic'`"},{"kind":"text","text":" — SwiftUI's default tab-bar style.\n - "},{"kind":"code","text":"`'sidebarAdaptable'`"},{"kind":"text","text":" — iOS 18+. Sidebar on iPad/Mac, bottom bar on\n iPhone."}]},"type":{"type":"union","types":[{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"children":[{"name":"indexDisplayMode","variant":"declaration","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Visibility of the page indicator dots. Only meaningful for the page style."}],"blockTags":[{"tag":"@default","content":[{"kind":"text","text":"'automatic'"}]}]},"type":{"type":"reference","name":"PageIndexDisplayMode","package":"@expo/ui"}},{"name":"type","variant":"declaration","kind":1024,"type":{"type":"literal","value":"page"}}]}},{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"children":[{"name":"type","variant":"declaration","kind":1024,"type":{"type":"literal","value":"automatic"}}]}},{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"children":[{"name":"type","variant":"declaration","kind":1024,"type":{"type":"literal","value":"sidebarAdaptable"}}]}}]}},{"name":"TimingAnimationParams","variant":"declaration","kind":2097152,"children":[{"name":"duration","variant":"declaration","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Total animation duration (in seconds)."}]},"type":{"type":"intrinsic","name":"number"}}]},{"name":"UnitPointValue","variant":"declaration","kind":2097152,"type":{"type":"union","types":[{"type":"literal","value":"zero"},{"type":"literal","value":"topLeading"},{"type":"literal","value":"top"},{"type":"literal","value":"topTrailing"},{"type":"literal","value":"leading"},{"type":"literal","value":"center"},{"type":"literal","value":"trailing"},{"type":"literal","value":"bottomLeading"},{"type":"literal","value":"bottom"},{"type":"literal","value":"bottomTrailing"}]}},{"name":"Animation","variant":"declaration","kind":32,"flags":{"isConst":true},"comment":{"summary":[{"kind":"text","text":"Built-in animation presets for the "},{"kind":"code","text":"`animation`"},{"kind":"text","text":" modifier.\nPresets:\n- Timing presets ("},{"kind":"code","text":"`easeInOut`"},{"kind":"text","text":", "},{"kind":"code","text":"`easeIn`"},{"kind":"text","text":", "},{"kind":"code","text":"`easeOut`"},{"kind":"text","text":", "},{"kind":"code","text":"`linear`"},{"kind":"text","text":") accept\n["},{"kind":"code","text":"`TimingAnimationParams`"},{"kind":"text","text":"](#timinganimationparams).\n- "},{"kind":"code","text":"`spring`"},{"kind":"text","text":" accepts ["},{"kind":"code","text":"`SpringAnimationParams`"},{"kind":"text","text":"](#springanimationparams).\n- "},{"kind":"code","text":"`interpolatingSpring`"},{"kind":"text","text":" accepts\n["},{"kind":"code","text":"`InterpolatingSpringAnimationParams`"},{"kind":"text","text":"](#interpolatingspringanimationparams).\n- Chaining returns ["},{"kind":"code","text":"`ChainableAnimationType`"},{"kind":"text","text":"](#chainableanimationtype)."}],"blockTags":[{"tag":"@example","content":[{"kind":"code","text":"```tsx\nimport { Host, VStack } from '@expo/ui/swift-ui';\nimport { animation, Animation } from '@expo/ui/swift-ui/modifiers';\n\nfunction Example() {\n const [isExpanded, setIsExpanded] = useState(false);\n\n return (\n \n \n //...\n \n \n );\n}\n```"}]},{"tag":"@hideType","content":[]}]},"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"children":[{"name":"default","variant":"declaration","kind":1024,"type":{"type":"reference","name":"ChainableAnimationType","package":"@expo/ui"},"defaultValue":"..."},{"name":"easeIn","variant":"declaration","kind":1024,"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"signatures":[{"name":"__type","variant":"signature","kind":4096,"parameters":[{"name":"params","variant":"param","kind":32768,"flags":{"isOptional":true},"type":{"type":"reference","name":"TimingAnimationParams","package":"@expo/ui"}}],"type":{"type":"reference","name":"ChainableAnimationType","package":"@expo/ui"}}]}},"defaultValue":"..."},{"name":"easeInOut","variant":"declaration","kind":1024,"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"signatures":[{"name":"__type","variant":"signature","kind":4096,"parameters":[{"name":"params","variant":"param","kind":32768,"flags":{"isOptional":true},"type":{"type":"reference","name":"TimingAnimationParams","package":"@expo/ui"}}],"type":{"type":"reference","name":"ChainableAnimationType","package":"@expo/ui"}}]}},"defaultValue":"..."},{"name":"easeOut","variant":"declaration","kind":1024,"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"signatures":[{"name":"__type","variant":"signature","kind":4096,"parameters":[{"name":"params","variant":"param","kind":32768,"flags":{"isOptional":true},"type":{"type":"reference","name":"TimingAnimationParams","package":"@expo/ui"}}],"type":{"type":"reference","name":"ChainableAnimationType","package":"@expo/ui"}}]}},"defaultValue":"..."},{"name":"interpolatingSpring","variant":"declaration","kind":1024,"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"signatures":[{"name":"__type","variant":"signature","kind":4096,"parameters":[{"name":"params","variant":"param","kind":32768,"flags":{"isOptional":true},"type":{"type":"reference","name":"InterpolatingSpringAnimationParams","package":"@expo/ui"}}],"type":{"type":"reference","name":"ChainableAnimationType","package":"@expo/ui"}}]}},"defaultValue":"..."},{"name":"linear","variant":"declaration","kind":1024,"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"signatures":[{"name":"__type","variant":"signature","kind":4096,"parameters":[{"name":"params","variant":"param","kind":32768,"flags":{"isOptional":true},"type":{"type":"reference","name":"TimingAnimationParams","package":"@expo/ui"}}],"type":{"type":"reference","name":"ChainableAnimationType","package":"@expo/ui"}}]}},"defaultValue":"..."},{"name":"spring","variant":"declaration","kind":1024,"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"signatures":[{"name":"__type","variant":"signature","kind":4096,"parameters":[{"name":"params","variant":"param","kind":32768,"flags":{"isOptional":true},"type":{"type":"reference","name":"SpringAnimationParams","package":"@expo/ui"}}],"type":{"type":"reference","name":"ChainableAnimationType","package":"@expo/ui"}}]}},"defaultValue":"..."}]}},"defaultValue":"..."},{"name":"shapes","variant":"declaration","kind":32,"flags":{"isConst":true},"comment":{"summary":[{"kind":"text","text":"Shape builders for modifiers that accept shapes, such as "},{"kind":"code","text":"`background`"},{"kind":"text","text":" and "},{"kind":"code","text":"`containerShape`"},{"kind":"text","text":".\n\nShapes: "},{"kind":"code","text":"`roundedRectangle`"},{"kind":"text","text":", "},{"kind":"code","text":"`capsule`"},{"kind":"text","text":", "},{"kind":"code","text":"`rectangle`"},{"kind":"text","text":", "},{"kind":"code","text":"`ellipse`"},{"kind":"text","text":", "},{"kind":"code","text":"`circle`"},{"kind":"text","text":", "},{"kind":"code","text":"`containerRelativeShape`"},{"kind":"text","text":"."}],"blockTags":[{"tag":"@example","content":[{"kind":"code","text":"```tsx\nimport { background, shapes } from '@expo/ui/swift-ui/modifiers';\nimport { Text, Host } from '@expo/ui/swift-ui';\n\nfunction Example() {\n return (\n \n \n Hello, world!\n \n \n );\n}\n```"}]},{"tag":"@hideType","content":[]}]},"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"children":[{"name":"capsule","variant":"declaration","kind":1024,"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"signatures":[{"name":"__type","variant":"signature","kind":4096,"parameters":[{"name":"params","variant":"param","kind":32768,"flags":{"isOptional":true},"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"children":[{"name":"roundedCornerStyle","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"union","types":[{"type":"literal","value":"continuous"},{"type":"literal","value":"circular"}]}}]}}}],"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"children":[{"name":"roundedCornerStyle","variant":"declaration","kind":1024,"type":{"type":"union","types":[{"type":"literal","value":"continuous"},{"type":"literal","value":"circular"},{"type":"intrinsic","name":"undefined"}]},"defaultValue":"params.roundedCornerStyle"},{"name":"shape","variant":"declaration","kind":1024,"type":{"type":"intrinsic","name":"string"},"defaultValue":"'capsule'"}]}}}]}},"defaultValue":"..."},{"name":"circle","variant":"declaration","kind":1024,"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"signatures":[{"name":"__type","variant":"signature","kind":4096,"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"children":[{"name":"shape","variant":"declaration","kind":1024,"type":{"type":"intrinsic","name":"string"},"defaultValue":"'circle'"}]}}}]}},"defaultValue":"..."},{"name":"containerRelativeShape","variant":"declaration","kind":1024,"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"signatures":[{"name":"__type","variant":"signature","kind":4096,"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"children":[{"name":"shape","variant":"declaration","kind":1024,"type":{"type":"intrinsic","name":"string"},"defaultValue":"'containerRelativeShape'"}]}}}]}},"defaultValue":"..."},{"name":"ellipse","variant":"declaration","kind":1024,"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"signatures":[{"name":"__type","variant":"signature","kind":4096,"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"children":[{"name":"shape","variant":"declaration","kind":1024,"type":{"type":"intrinsic","name":"string"},"defaultValue":"'ellipse'"}]}}}]}},"defaultValue":"..."},{"name":"rectangle","variant":"declaration","kind":1024,"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"signatures":[{"name":"__type","variant":"signature","kind":4096,"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"children":[{"name":"shape","variant":"declaration","kind":1024,"type":{"type":"intrinsic","name":"string"},"defaultValue":"'rectangle'"}]}}}]}},"defaultValue":"..."},{"name":"roundedRectangle","variant":"declaration","kind":1024,"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"signatures":[{"name":"__type","variant":"signature","kind":4096,"parameters":[{"name":"params","variant":"param","kind":32768,"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"children":[{"name":"cornerRadius","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"intrinsic","name":"number"}},{"name":"cornerSize","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"children":[{"name":"height","variant":"declaration","kind":1024,"type":{"type":"intrinsic","name":"number"}},{"name":"width","variant":"declaration","kind":1024,"type":{"type":"intrinsic","name":"number"}}]}}},{"name":"roundedCornerStyle","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"union","types":[{"type":"literal","value":"continuous"},{"type":"literal","value":"circular"}]}}]}}}],"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"children":[{"name":"cornerRadius","variant":"declaration","kind":1024,"type":{"type":"union","types":[{"type":"intrinsic","name":"number"},{"type":"intrinsic","name":"undefined"}]},"defaultValue":"params.cornerRadius"},{"name":"cornerSize","variant":"declaration","kind":1024,"type":{"type":"union","types":[{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"children":[{"name":"height","variant":"declaration","kind":1024,"type":{"type":"intrinsic","name":"number"}},{"name":"width","variant":"declaration","kind":1024,"type":{"type":"intrinsic","name":"number"}}]}},{"type":"intrinsic","name":"undefined"}]},"defaultValue":"params.cornerSize"},{"name":"roundedCornerStyle","variant":"declaration","kind":1024,"type":{"type":"union","types":[{"type":"literal","value":"continuous"},{"type":"literal","value":"circular"},{"type":"intrinsic","name":"undefined"}]},"defaultValue":"params.roundedCornerStyle"},{"name":"shape","variant":"declaration","kind":1024,"type":{"type":"intrinsic","name":"string"},"defaultValue":"'roundedRectangle'"}]}}}]}},"defaultValue":"..."}]}},"defaultValue":"..."},{"name":"accessibilityHint","variant":"declaration","kind":64,"signatures":[{"name":"accessibilityHint","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Sets accessibility hint for the view."}],"blockTags":[{"tag":"@see","content":[{"kind":"text","text":"Official [SwiftUI documentation](https://developer.apple.com/documentation/swiftui/view/accessibilityhint(_:))."}]}]},"parameters":[{"name":"hint","variant":"param","kind":32768,"comment":{"summary":[{"kind":"text","text":"The accessibility hint."}]},"type":{"type":"intrinsic","name":"string"}}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"accessibilityLabel","variant":"declaration","kind":64,"signatures":[{"name":"accessibilityLabel","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Sets accessibility label for the view."}],"blockTags":[{"tag":"@see","content":[{"kind":"text","text":"Official [SwiftUI documentation](https://developer.apple.com/documentation/swiftui/view/accessibilitylabel(_:))."}]}]},"parameters":[{"name":"label","variant":"param","kind":32768,"comment":{"summary":[{"kind":"text","text":"The accessibility label."}]},"type":{"type":"intrinsic","name":"string"}}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"accessibilityValue","variant":"declaration","kind":64,"signatures":[{"name":"accessibilityValue","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Sets accessibility value for the view."}],"blockTags":[{"tag":"@see","content":[{"kind":"text","text":"Official [SwiftUI documentation](https://developer.apple.com/documentation/swiftui/view/accessibilityvalue(_:))."}]}]},"parameters":[{"name":"value","variant":"param","kind":32768,"comment":{"summary":[{"kind":"text","text":"The accessibility value."}]},"type":{"type":"intrinsic","name":"string"}}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"allowsTightening","variant":"declaration","kind":64,"signatures":[{"name":"allowsTightening","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Sets whether text in this view can compress the space between characters when necessary to fit text in a line"}],"blockTags":[{"tag":"@default","content":[{"kind":"text","text":"true"}]},{"tag":"@see","content":[{"kind":"text","text":"Official [SwiftUI documentation](https://developer.apple.com/documentation/swiftui/view/allowstightening(_:))."}]}]},"parameters":[{"name":"value","variant":"param","kind":32768,"type":{"type":"intrinsic","name":"boolean"}}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"animation","variant":"declaration","kind":64,"signatures":[{"name":"animation","variant":"signature","kind":4096,"parameters":[{"name":"animationObject","variant":"param","kind":32768,"type":{"type":"reference","name":"ChainableAnimationType","package":"@expo/ui"}},{"name":"animatedValue","variant":"param","kind":32768,"type":{"type":"union","types":[{"type":"intrinsic","name":"number"},{"type":"intrinsic","name":"boolean"}]}}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"aspectRatio","variant":"declaration","kind":64,"signatures":[{"name":"aspectRatio","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Sets aspect ratio constraint."}],"blockTags":[{"tag":"@see","content":[{"kind":"text","text":"Official [SwiftUI documentation](https://developer.apple.com/documentation/swiftui/view/aspectratio(_:contentmode:))."}]}]},"parameters":[{"name":"params","variant":"param","kind":32768,"comment":{"summary":[{"kind":"text","text":"Optional width/height aspect ratio and content mode."}]},"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"children":[{"name":"contentMode","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"union","types":[{"type":"literal","value":"fill"},{"type":"literal","value":"fit"}]}},{"name":"ratio","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"intrinsic","name":"number"}}]}}}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"autocorrectionDisabled","variant":"declaration","kind":64,"signatures":[{"name":"autocorrectionDisabled","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Disables autocorrection for text input views."}],"blockTags":[{"tag":"@see","content":[{"kind":"text","text":"Official [SwiftUI documentation](https://developer.apple.com/documentation/swiftui/view/autocorrectiondisabled(_:))."}]}]},"parameters":[{"name":"disabled","variant":"param","kind":32768,"comment":{"summary":[{"kind":"text","text":"Whether autocorrection is disabled. Defaults to "},{"kind":"code","text":"`true`"},{"kind":"text","text":"."}]},"type":{"type":"intrinsic","name":"boolean"},"defaultValue":"true"}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"background","variant":"declaration","kind":64,"signatures":[{"name":"background","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Sets the background of a view."}],"blockTags":[{"tag":"@see","content":[{"kind":"text","text":"Official [SwiftUI documentation](https://developer.apple.com/documentation/SwiftUI/View/background(_:alignment:))."}]}]},"parameters":[{"name":"color","variant":"param","kind":32768,"comment":{"summary":[{"kind":"text","text":"The background color (hex string). For example, "},{"kind":"code","text":"`#FF0000`"},{"kind":"text","text":"."}]},"type":{"type":"reference","name":"Color","package":"@expo/ui"}},{"name":"shape","variant":"param","kind":32768,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Optional shape to clip the background. If not provided, the background will fill the entire view."}]},"type":{"type":"reference","name":"Shape","package":"@expo/ui"}}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"backgroundOverlay","variant":"declaration","kind":64,"signatures":[{"name":"backgroundOverlay","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Adds a background behind the view."}]},"parameters":[{"name":"params","variant":"param","kind":32768,"comment":{"summary":[{"kind":"text","text":"Background color and alignment."}]},"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"children":[{"name":"alignment","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"union","types":[{"type":"literal","value":"center"},{"type":"literal","value":"top"},{"type":"literal","value":"bottom"},{"type":"literal","value":"leading"},{"type":"literal","value":"trailing"}]}},{"name":"color","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"reference","name":"Color","package":"@expo/ui"}}]}}}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"badge","variant":"declaration","kind":64,"signatures":[{"name":"badge","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Generates a badge for the view from a localized string key."}],"blockTags":[{"tag":"@see","content":[{"kind":"text","text":"Official [SwiftUI documentation](https://developer.apple.com/documentation/swiftui/view/badge(_:))."}]}]},"parameters":[{"name":"value","variant":"param","kind":32768,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Text view to display as a badge. Set the value to nil to hide the badge."}]},"type":{"type":"intrinsic","name":"string"}}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"badgeProminence","variant":"declaration","kind":64,"signatures":[{"name":"badgeProminence","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"The prominence to apply to badges associated with this environment."}],"blockTags":[{"tag":"@see","content":[{"kind":"text","text":"Official [SwiftUI documentation](https://developer.apple.com/documentation/swiftui/view/badgeprominence(_:))."}]}]},"parameters":[{"name":"badgeType","variant":"param","kind":32768,"comment":{"summary":[{"kind":"text","text":"Select the type of badge"}]},"type":{"type":"union","types":[{"type":"literal","value":"standard"},{"type":"literal","value":"increased"},{"type":"literal","value":"decreased"}]}}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"blur","variant":"declaration","kind":64,"signatures":[{"name":"blur","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Applies blur to a view."}],"blockTags":[{"tag":"@see","content":[{"kind":"text","text":"Official [SwiftUI documentation](https://developer.apple.com/documentation/swiftui/view/blur(radius:opaque:))."}]}]},"parameters":[{"name":"radius","variant":"param","kind":32768,"comment":{"summary":[{"kind":"text","text":"The blur radius."}]},"type":{"type":"intrinsic","name":"number"}}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"bold","variant":"declaration","kind":64,"signatures":[{"name":"bold","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Makes text bold.\nWhen applied to "},{"kind":"code","text":"`Text`"},{"kind":"text","text":", it works on all iOS/tvOS versions. When used on regular views, it requires iOS 16.0+/tvOS 16.0+."}],"blockTags":[{"tag":"@see","content":[{"kind":"text","text":"Official [SwiftUI documentation](https://developer.apple.com/documentation/swiftui/text/bold())."}]}]},"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"border","variant":"declaration","kind":64,"signatures":[{"name":"border","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Adds a border to a view."}],"blockTags":[{"tag":"@see","content":[{"kind":"text","text":"Official [SwiftUI documentation](https://developer.apple.com/documentation/swiftui/view/border(_:width:))."}]}]},"parameters":[{"name":"params","variant":"param","kind":32768,"comment":{"summary":[{"kind":"text","text":"The border parameters. Color and width."}]},"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"children":[{"name":"color","variant":"declaration","kind":1024,"type":{"type":"reference","name":"Color","package":"@expo/ui"}},{"name":"width","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"intrinsic","name":"number"}}]}}}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"brightness","variant":"declaration","kind":64,"signatures":[{"name":"brightness","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Adjusts the brightness of a view."}],"blockTags":[{"tag":"@see","content":[{"kind":"text","text":"Official [SwiftUI documentation](https://developer.apple.com/documentation/swiftui/view/brightness(_:))."}]}]},"parameters":[{"name":"amount","variant":"param","kind":32768,"comment":{"summary":[{"kind":"text","text":"Brightness adjustment (-1 to 1)."}]},"type":{"type":"intrinsic","name":"number"}}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"buttonStyle","variant":"declaration","kind":64,"signatures":[{"name":"buttonStyle","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Sets the button style for button views."}],"blockTags":[{"tag":"@see","content":[{"kind":"text","text":"Official [SwiftUI documentation](https://developer.apple.com/documentation/swiftui/view/buttonstyle(_:))."}]}]},"parameters":[{"name":"style","variant":"param","kind":32768,"comment":{"summary":[{"kind":"text","text":"The button style. "},{"kind":"code","text":"`'glass'`"},{"kind":"text","text":" and "},{"kind":"code","text":"`'glassProminent'`"},{"kind":"text","text":" are available on iOS 26+ and tvOS 26+ only."}]},"type":{"type":"union","types":[{"type":"literal","value":"automatic"},{"type":"literal","value":"plain"},{"type":"literal","value":"bordered"},{"type":"literal","value":"borderedProminent"},{"type":"literal","value":"borderless"},{"type":"literal","value":"glass"},{"type":"literal","value":"glassProminent"}]}}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"clipped","variant":"declaration","kind":64,"signatures":[{"name":"clipped","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Clips content to bounds."}],"blockTags":[{"tag":"@see","content":[{"kind":"text","text":"Official [SwiftUI documentation](https://developer.apple.com/documentation/swiftui/view/clipped(antialiased:))."}]}]},"parameters":[{"name":"clipped","variant":"param","kind":32768,"comment":{"summary":[{"kind":"text","text":"Whether to clip content."}]},"type":{"type":"intrinsic","name":"boolean"},"defaultValue":"true"}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"clipShape","variant":"declaration","kind":64,"signatures":[{"name":"clipShape","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Clips the view to a specific shape."}],"blockTags":[{"tag":"@see","content":[{"kind":"text","text":"Official [SwiftUI documentation](https://developer.apple.com/documentation/swiftui/view/clipshape(_:style:))."}]}]},"parameters":[{"name":"shape","variant":"param","kind":32768,"comment":{"summary":[{"kind":"text","text":"The clipping shape."}]},"type":{"type":"union","types":[{"type":"literal","value":"roundedRectangle"},{"type":"literal","value":"capsule"},{"type":"literal","value":"rectangle"},{"type":"literal","value":"ellipse"},{"type":"literal","value":"circle"},{"type":"literal","value":"containerRelativeShape"}]}},{"name":"cornerRadius","variant":"param","kind":32768,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Corner radius for rounded rectangle (default: 8)"}]},"type":{"type":"intrinsic","name":"number"}}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"colorInvert","variant":"declaration","kind":64,"signatures":[{"name":"colorInvert","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Inverts the colors of a view."}],"blockTags":[{"tag":"@see","content":[{"kind":"text","text":"Official [SwiftUI documentation](https://developer.apple.com/documentation/swiftui/view/colorinvert())."}]}]},"parameters":[{"name":"inverted","variant":"param","kind":32768,"comment":{"summary":[{"kind":"text","text":"Whether to invert colors."}]},"type":{"type":"intrinsic","name":"boolean"},"defaultValue":"true"}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"containerBackground","variant":"declaration","kind":64,"signatures":[{"name":"containerBackground","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Sets the container background of the enclosing container using a view."}],"blockTags":[{"tag":"@see","content":[{"kind":"text","text":"Official [SwiftUI documentation](https://developer.apple.com/documentation/swiftui/view/containerbackground(_:for:))."}]}]},"parameters":[{"name":"color","variant":"param","kind":32768,"comment":{"summary":[{"kind":"text","text":"The color to set as the background of the container."}]},"type":{"type":"reference","name":"Color","package":"@expo/ui"}},{"name":"container","variant":"param","kind":32768,"comment":{"summary":[{"kind":"text","text":"The type of container to apply the background to."}]},"type":{"type":"reference","name":"ContainerBackgroundPlacement","package":"@expo/ui"}}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"containerRelativeFrame","variant":"declaration","kind":64,"signatures":[{"name":"containerRelativeFrame","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Positions this view within an invisible frame with a size relative to the nearest container."}],"blockTags":[{"tag":"@see","content":[{"kind":"text","text":"Official [SwiftUI documentation](https://developer.apple.com/documentation/SwiftUI/View/containerRelativeFrame(_:alignment:))."}]},{"tag":"@platform","content":[{"kind":"text","text":"ios 17.0+"}]},{"tag":"@platform","content":[{"kind":"text","text":"tvos 17.0+"}]}]},"parameters":[{"name":"params","variant":"param","kind":32768,"comment":{"summary":[{"kind":"text","text":"The content relative frame parameters: "},{"kind":"code","text":"`axes`"},{"kind":"text","text":", "},{"kind":"code","text":"`count`"},{"kind":"text","text":", "},{"kind":"code","text":"`span`"},{"kind":"text","text":", "},{"kind":"code","text":"`spacing`"},{"kind":"text","text":" and "},{"kind":"code","text":"`alignment`"},{"kind":"text","text":"."}]},"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"children":[{"name":"alignment","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"union","types":[{"type":"literal","value":"center"},{"type":"literal","value":"top"},{"type":"literal","value":"bottom"},{"type":"literal","value":"topLeading"},{"type":"literal","value":"topTrailing"},{"type":"literal","value":"leading"},{"type":"literal","value":"trailing"},{"type":"literal","value":"bottomLeading"},{"type":"literal","value":"bottomTrailing"}]}},{"name":"axes","variant":"declaration","kind":1024,"type":{"type":"union","types":[{"type":"literal","value":"horizontal"},{"type":"literal","value":"vertical"},{"type":"literal","value":"both"}]}},{"name":"count","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"intrinsic","name":"number"}},{"name":"spacing","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"intrinsic","name":"number"}},{"name":"span","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"intrinsic","name":"number"}}]}}}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"containerShape","variant":"declaration","kind":64,"signatures":[{"name":"containerShape","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Sets the container shape for the view."}],"blockTags":[{"tag":"@see","content":[{"kind":"text","text":"Official [SwiftUI documentation](https://developer.apple.com/documentation/swiftui/view/containershape(_:))."}]}]},"parameters":[{"name":"shape","variant":"param","kind":32768,"comment":{"summary":[{"kind":"text","text":"A shape configuration from the shapes API"}]},"type":{"type":"reference","name":"Shape","package":"@expo/ui"}}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"contentShape","variant":"declaration","kind":64,"signatures":[{"name":"contentShape","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Defines the content shape for hit-testing purposes.\n\nThis modifier is essential for making entire view areas (including "},{"kind":"code","text":"`Spacer`"},{"kind":"text","text":" or empty space)\ninteractive. Without it, only visible elements like "},{"kind":"code","text":"`Text`"},{"kind":"text","text":" or "},{"kind":"code","text":"`Image`"},{"kind":"text","text":" respond to tap gestures."}],"blockTags":[{"tag":"@example","content":[{"kind":"code","text":"```tsx\nimport { HStack, List, Section, Spacer, Text } from \"@expo/ui/swift-ui\";\nimport { contentShape, onTapGesture } from \"@expo/ui/swift-ui/modifiers\";\nimport { shapes } from \"@expo/ui/swift-ui/modifiers\";\n\nfunction InteractiveRow() {\n return (\n \n
\n console.log(\"Row tapped!\"))\n ]}\n >\n Label\n \n Value\n \n
\n
\n );\n}\n```"}]},{"tag":"@see","content":[{"kind":"text","text":"Official [SwiftUI documentation](https://developer.apple.com/documentation/swiftui/view/contentshape(_:eofill:))."}]}]},"parameters":[{"name":"shape","variant":"param","kind":32768,"comment":{"summary":[{"kind":"text","text":"A shape configuration from the shapes API (rectangle, circle, capsule, ellipse, roundedRectangle)."}]},"type":{"type":"reference","name":"Shape","package":"@expo/ui"}}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"contentTransition","variant":"declaration","kind":64,"signatures":[{"name":"contentTransition","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Sets the content transition type for a view.\nUseful for animating changes in text content, especially numeric text.\nUse with the ["},{"kind":"code","text":"`animation`"},{"kind":"text","text":"](#animationanimationobject-animatedvalue) modifier to animate the transition when the content changes."}],"blockTags":[{"tag":"@example","content":[{"kind":"code","text":"```tsx\n\n {count.toString()}\n\n```"}]},{"tag":"@platform","content":[{"kind":"text","text":"ios 16.0+"}]},{"tag":"@platform","content":[{"kind":"text","text":"tvos 16.0+"}]},{"tag":"@see","content":[{"kind":"text","text":"Official [SwiftUI documentation](https://developer.apple.com/documentation/swiftui/view/contenttransition(_:))."}]}]},"parameters":[{"name":"transitionType","variant":"param","kind":32768,"comment":{"summary":[{"kind":"text","text":"The type of content transition."}]},"type":{"type":"union","types":[{"type":"literal","value":"identity"},{"type":"literal","value":"numericText"},{"type":"literal","value":"opacity"},{"type":"literal","value":"interpolate"}]}},{"name":"params","variant":"param","kind":32768,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Optional parameters."}]},"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"children":[{"name":"countsDown","variant":"declaration","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Whether the numeric text counts down."}]},"type":{"type":"intrinsic","name":"boolean"}}]}}}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"contrast","variant":"declaration","kind":64,"signatures":[{"name":"contrast","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Adjusts the contrast of a view."}],"blockTags":[{"tag":"@see","content":[{"kind":"text","text":"Official [SwiftUI documentation](https://developer.apple.com/documentation/swiftui/view/contrast(_:))."}]}]},"parameters":[{"name":"amount","variant":"param","kind":32768,"comment":{"summary":[{"kind":"text","text":"Contrast multiplier (0 to infinity, 1 = normal)."}]},"type":{"type":"intrinsic","name":"number"}}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"controlSize","variant":"declaration","kind":64,"signatures":[{"name":"controlSize","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Sets the size of controls within this view."}],"blockTags":[{"tag":"@see","content":[{"kind":"text","text":"Official [SwiftUI documentation](https://developer.apple.com/documentation/swiftui/view/controlsize(_:))."}]}]},"parameters":[{"name":"size","variant":"param","kind":32768,"comment":{"summary":[{"kind":"text","text":"The control size."}]},"type":{"type":"union","types":[{"type":"literal","value":"small"},{"type":"literal","value":"large"},{"type":"literal","value":"mini"},{"type":"literal","value":"regular"},{"type":"literal","value":"extraLarge"}]}}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"cornerRadius","variant":"declaration","kind":64,"signatures":[{"name":"cornerRadius","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Applies corner radius to a view."}],"blockTags":[{"tag":"@see","content":[{"kind":"text","text":"Official [SwiftUI documentation](https://developer.apple.com/documentation/swiftui/view/cornerradius(_:antialiased:))."}]}]},"parameters":[{"name":"radius","variant":"param","kind":32768,"comment":{"summary":[{"kind":"text","text":"The corner radius value."}]},"type":{"type":"intrinsic","name":"number"}}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"createModifier","variant":"declaration","kind":64,"signatures":[{"name":"createModifier","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Factory function to create modifier configuration objects.\nThis is used by all built-in modifier functions and can be used by 3rd party libraries to create custom modifiers."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"A "},{"kind":"code","text":"`ModifierConfig`"},{"kind":"text","text":" object that can be passed in the "},{"kind":"code","text":"`modifiers`"},{"kind":"text","text":" prop array."}]},{"tag":"@example","content":[{"kind":"code","text":"```ts\n// In a 3rd party package\nimport { createModifier } from '@expo/ui/swift-ui/modifiers';\n\nexport const blurEffect = (params: { radius: number; style?: string }) =>\n createModifier('blurEffect', params);\n```"}]}]},"parameters":[{"name":"type","variant":"param","kind":32768,"comment":{"summary":[{"kind":"text","text":"The modifier type string that maps to a registered native modifier."}]},"type":{"type":"intrinsic","name":"string"}},{"name":"params","variant":"param","kind":32768,"comment":{"summary":[{"kind":"text","text":"Additional parameters to pass to the modifier."}]},"type":{"type":"reference","target":{"packageName":"typescript","packagePath":"lib/lib.es5.d.ts","qualifiedName":"Record"},"typeArguments":[{"type":"intrinsic","name":"string"},{"type":"intrinsic","name":"any"}],"name":"Record","package":"typescript"},"defaultValue":"{}"}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"createModifierWithEventListener","variant":"declaration","kind":64,"signatures":[{"name":"createModifierWithEventListener","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Creates a modifier with an event listener."}]},"parameters":[{"name":"type","variant":"param","kind":32768,"type":{"type":"intrinsic","name":"string"}},{"name":"eventListener","variant":"param","kind":32768,"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"signatures":[{"name":"__type","variant":"signature","kind":4096,"parameters":[{"name":"args","variant":"param","kind":32768,"type":{"type":"intrinsic","name":"any"}}],"type":{"type":"intrinsic","name":"void"}}]}}},{"name":"params","variant":"param","kind":32768,"type":{"type":"reference","target":{"packageName":"typescript","packagePath":"lib/lib.es5.d.ts","qualifiedName":"Record"},"typeArguments":[{"type":"intrinsic","name":"string"},{"type":"intrinsic","name":"any"}],"name":"Record","package":"typescript"},"defaultValue":"{}"}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"createViewModifierEventListener","variant":"declaration","kind":64,"signatures":[{"name":"createViewModifierEventListener","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Create an event listener for a view modifier."}]},"parameters":[{"name":"modifiers","variant":"param","kind":32768,"comment":{"summary":[{"kind":"text","text":"An array of modifier configs to extract event listeners from."}]},"type":{"type":"array","elementType":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}}],"type":{"type":"reference","name":"GlobalEvent","package":"@expo/ui"}}]},{"name":"datePickerStyle","variant":"declaration","kind":64,"signatures":[{"name":"datePickerStyle","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Sets the style for the date picker."}],"blockTags":[{"tag":"@see","content":[{"kind":"text","text":"Official [SwiftUI documentation](https://developer.apple.com/documentation/swiftui/view/datepickerstyle(_:))."}]}]},"parameters":[{"name":"style","variant":"param","kind":32768,"comment":{"summary":[{"kind":"text","text":"The style for the date picker."}]},"type":{"type":"reference","name":"DatePickerStyleType","package":"@expo/ui"}}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"defaultScrollAnchor","variant":"declaration","kind":64,"signatures":[{"name":"defaultScrollAnchor","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Sets the default anchor point for a scroll view's content."}],"blockTags":[{"tag":"@platform","content":[{"kind":"text","text":"ios 17.0+"}]},{"tag":"@platform","content":[{"kind":"text","text":"tvos 17.0+"}]},{"tag":"@platform","content":[{"kind":"text","text":"macos 14.0+"}]},{"tag":"@see","content":[{"kind":"text","text":"Official [SwiftUI documentation](https://developer.apple.com/documentation/swiftui/view/defaultscrollanchor(_:))."}]}]},"parameters":[{"name":"anchor","variant":"param","kind":32768,"comment":{"summary":[{"kind":"text","text":"The anchor point for initial scroll position and content size changes, or "},{"kind":"code","text":"`null`"},{"kind":"text","text":" to reset."}]},"type":{"type":"union","types":[{"type":"reference","name":"UnitPointValue","package":"@expo/ui"},{"type":"literal","value":null}]}}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"defaultScrollAnchorForRole","variant":"declaration","kind":64,"signatures":[{"name":"defaultScrollAnchorForRole","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Sets the default anchor point for a scroll view for a specific role.\nPass "},{"kind":"code","text":"`null`"},{"kind":"text","text":" to opt out of a specific role while keeping anchors for other roles."}],"blockTags":[{"tag":"@platform","content":[{"kind":"text","text":"ios 18.0+"}]},{"tag":"@platform","content":[{"kind":"text","text":"tvos 18.0+"}]},{"tag":"@platform","content":[{"kind":"text","text":"macos 15.0+"}]},{"tag":"@see","content":[{"kind":"text","text":"Official [SwiftUI documentation](https://developer.apple.com/documentation/swiftui/view/defaultscrollanchor(_:for:))."}]}]},"parameters":[{"name":"anchor","variant":"param","kind":32768,"comment":{"summary":[{"kind":"text","text":"The anchor point, or "},{"kind":"code","text":"`null`"},{"kind":"text","text":" to opt out of this role."}]},"type":{"type":"union","types":[{"type":"reference","name":"UnitPointValue","package":"@expo/ui"},{"type":"literal","value":null}]}},{"name":"role","variant":"param","kind":32768,"comment":{"summary":[{"kind":"text","text":"The scroll anchor role: "},{"kind":"code","text":"`'initialOffset'`"},{"kind":"text","text":", "},{"kind":"code","text":"`'sizeChanges'`"},{"kind":"text","text":", or "},{"kind":"code","text":"`'alignment'`"},{"kind":"text","text":"."}]},"type":{"type":"union","types":[{"type":"literal","value":"initialOffset"},{"type":"literal","value":"sizeChanges"},{"type":"literal","value":"alignment"}]}}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"deleteDisabled","variant":"declaration","kind":64,"signatures":[{"name":"deleteDisabled","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Disables the delete action for a view in a list.\nApply to items within a "},{"kind":"code","text":"`ForEach`"},{"kind":"text","text":" to prevent them from being deleted."}],"blockTags":[{"tag":"@default","content":[{"kind":"text","text":"true"}]},{"tag":"@see","content":[{"kind":"text","text":"Official [SwiftUI documentation](https://developer.apple.com/documentation/swiftui/view/deletedisabled(_:))."}]}]},"parameters":[{"name":"disabled","variant":"param","kind":32768,"comment":{"summary":[{"kind":"text","text":"Whether deletion should be disabled"}]},"type":{"type":"intrinsic","name":"boolean"},"defaultValue":"true"}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"disabled","variant":"declaration","kind":64,"signatures":[{"name":"disabled","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Disables or enables a view."}],"blockTags":[{"tag":"@see","content":[{"kind":"text","text":"Official [SwiftUI documentation](https://developer.apple.com/documentation/swiftui/view/disabled(_:))."}]}]},"parameters":[{"name":"disabled","variant":"param","kind":32768,"comment":{"summary":[{"kind":"text","text":"Whether the view should be disabled."}]},"type":{"type":"intrinsic","name":"boolean"},"defaultValue":"true"}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"environment","variant":"declaration","kind":64,"signatures":[{"name":"environment","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Sets a SwiftUI environment value."}],"blockTags":[{"tag":"@see","content":[{"kind":"text","text":"Official [SwiftUI documentation](https://developer.apple.com/documentation/swiftui/view/environment(_:_:))."}]}]},"parameters":[{"name":"config","variant":"param","kind":32768,"type":{"type":"reference","name":"EnvironmentConfig","package":"@expo/ui"}}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}},{"name":"environment","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Sets a SwiftUI environment value."}],"blockTags":[{"tag":"@see","content":[{"kind":"text","text":"Official [SwiftUI documentation](https://developer.apple.com/documentation/swiftui/view/environment(_:_:))."}]}]},"parameters":[{"name":"key","variant":"param","kind":32768,"type":{"type":"union","types":[{"type":"literal","value":"colorScheme"},{"type":"literal","value":"editMode"},{"type":"literal","value":"locale"},{"type":"literal","value":"timeZone"}]}},{"name":"value","variant":"param","kind":32768,"type":{"type":"intrinsic","name":"string"}}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"fixedSize","variant":"declaration","kind":64,"signatures":[{"name":"fixedSize","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Controls fixed size behavior."}],"blockTags":[{"tag":"@see","content":[{"kind":"text","text":"Official [SwiftUI documentation](https://developer.apple.com/documentation/swiftui/view/fixedsize())."}]}]},"parameters":[{"name":"params","variant":"param","kind":32768,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Whether the view should use its ideal width or height."}]},"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"children":[{"name":"horizontal","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"intrinsic","name":"boolean"}},{"name":"vertical","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"intrinsic","name":"boolean"}}]}}}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"font","variant":"declaration","kind":64,"signatures":[{"name":"font","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Sets the font properties of a view.\nSupports both custom font families and system fonts with weight and design options."}],"blockTags":[{"tag":"@example","content":[{"kind":"code","text":"```tsx\n// Custom font family\nCustom Font Text\n\n// System font with weight and design\nSystem Font Text\n```"}]},{"tag":"@see","content":[{"kind":"text","text":"Official [SwiftUI documentation for "},{"kind":"code","text":"`custom(_:size:)`"},{"kind":"text","text":"](https://developer.apple.com/documentation/swiftui/font/custom(_:size:)) and Official [SwiftUI documentation for "},{"kind":"code","text":"`system(size:weight:design:)`"},{"kind":"text","text":"](https://developer.apple.com/documentation/swiftui/font/system(size:weight:design:))."}]}]},"parameters":[{"name":"params","variant":"param","kind":32768,"comment":{"summary":[{"kind":"text","text":"The font configuration. When "},{"kind":"code","text":"`family`"},{"kind":"text","text":" is provided, it uses Font.custom().\nWhen "},{"kind":"code","text":"`family`"},{"kind":"text","text":" is not provided, it uses Font.system() with the specified weight and design."}]},"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"children":[{"name":"design","variant":"declaration","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Font design for system fonts"}]},"type":{"type":"union","types":[{"type":"literal","value":"default"},{"type":"literal","value":"rounded"},{"type":"literal","value":"serif"},{"type":"literal","value":"monospaced"}]}},{"name":"family","variant":"declaration","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Custom font family name.\nIf provided, uses "},{"kind":"code","text":"`Font.custom()`"},{"kind":"text","text":"."}]},"type":{"type":"intrinsic","name":"string"}},{"name":"size","variant":"declaration","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Font size in points."}]},"type":{"type":"intrinsic","name":"number"}},{"name":"weight","variant":"declaration","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Font weight for system fonts."}]},"type":{"type":"union","types":[{"type":"literal","value":"light"},{"type":"literal","value":"bold"},{"type":"literal","value":"black"},{"type":"literal","value":"medium"},{"type":"literal","value":"regular"},{"type":"literal","value":"ultraLight"},{"type":"literal","value":"thin"},{"type":"literal","value":"semibold"},{"type":"literal","value":"heavy"}]}}]}}}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"foregroundColor","variant":"declaration","kind":64,"signatures":[{"name":"foregroundColor","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Sets the foreground color/tint of a view."}],"blockTags":[{"tag":"@deprecated","content":[{"kind":"text","text":"Use "},{"kind":"code","text":"`foregroundStyle`"},{"kind":"text","text":" instead."}]},{"tag":"@see","content":[{"kind":"text","text":"Official [SwiftUI documentation](https://developer.apple.com/documentation/swiftui/view/foregroundcolor(_:))."}]}]},"parameters":[{"name":"color","variant":"param","kind":32768,"comment":{"summary":[{"kind":"text","text":"The foreground color (hex string)."}]},"type":{"type":"reference","name":"Color","package":"@expo/ui"}}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"foregroundStyle","variant":"declaration","kind":64,"signatures":[{"name":"foregroundStyle","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Sets the foreground style of a view with comprehensive styling options.\n\nReplaces the deprecated "},{"kind":"code","text":"`foregroundColor`"},{"kind":"text","text":" modifier with enhanced capabilities including\ncolors, gradients, and semantic hierarchical styles that adapt to system appearance."}],"blockTags":[{"tag":"@example","content":[{"kind":"code","text":"```tsx\n// Simple usage\nRed Text\n\n// Adaptive hierarchical styling\n\n Supporting Text\n\n\n// Linear gradient\n\n Gradient Text\n\n```"}]},{"tag":"@returns","content":[{"kind":"text","text":"A view modifier that applies the specified foreground style"}]},{"tag":"@since","content":[{"kind":"text","text":"iOS 15.0+ (hierarchical quinary requires iOS 16.0+)"}]},{"tag":"@see","content":[{"kind":"text","text":"Official [SwiftUI documentation](https://developer.apple.com/documentation/swiftui/view/foregroundstyle(_:))."}]}]},"parameters":[{"name":"style","variant":"param","kind":32768,"comment":{"summary":[{"kind":"text","text":"The foreground style configuration. Can be:\n\n**Simple Color ("},{"kind":"code","text":"`Color`"},{"kind":"text","text":"):**\n- Hex colors: "},{"kind":"code","text":"`'#FF0000'`"},{"kind":"text","text":", "},{"kind":"code","text":"`'#RGB'`"},{"kind":"text","text":", "},{"kind":"code","text":"`'#RRGGBB'`"},{"kind":"text","text":", "},{"kind":"code","text":"`'#AARRGGBB'`"},{"kind":"text","text":"\n- Named colors: "},{"kind":"code","text":"`'red'`"},{"kind":"text","text":", "},{"kind":"code","text":"`'blue'`"},{"kind":"text","text":", "},{"kind":"code","text":"`'green'`"},{"kind":"text","text":", and so on.\n- React Native color values like "},{"kind":"code","text":"`PlatformColor('label')`"},{"kind":"text","text":"\n\n**Explicit Color Object:**\n"},{"kind":"code","text":"```ts\n{ type: 'color', color: PlatformColor('label') }\n```"},{"kind":"text","text":"\n\n**Hierarchical Styles (Semantic):**\nAuto-adapting semantic styles that respond to light/dark mode and accessibility settings:\n"},{"kind":"code","text":"```ts\n{ type: 'hierarchical', style: 'primary' } // Most prominent (main content, headlines)\n{ type: 'hierarchical', style: 'secondary' } // Supporting text, subheadlines\n{ type: 'hierarchical', style: 'tertiary' } // Less important text, captions\n{ type: 'hierarchical', style: 'quaternary' } // Subtle text, disabled states\n{ type: 'hierarchical', style: 'quinary' } // Most subtle (iOS 16+, fallback to quaternary)\n```"},{"kind":"text","text":"\n\n**Linear Gradient:**\n"},{"kind":"code","text":"```ts\n{\n type: 'linearGradient',\n colors: [PlatformColor('systemPink'), '#0000FF', '#00FF00'],\n startPoint: { x: 0, y: 0 }, // Top-left\n endPoint: { x: 1, y: 1 } // Bottom-right\n}\n```"},{"kind":"text","text":"\n\n**Radial Gradient:**\n"},{"kind":"code","text":"```ts\n{\n type: 'radialGradient',\n colors: [PlatformColor('systemPink'), '#0000FF'],\n center: { x: 0.5, y: 0.5 }, // Center of view\n startRadius: 0, // Inner radius\n endRadius: 100 // Outer radius\n}\n```"},{"kind":"text","text":"\n\n**Angular Gradient (Conic):**\n"},{"kind":"code","text":"```ts\n{\n type: 'angularGradient',\n colors: [PlatformColor('systemPink'), '#00FF00', '#0000FF'],\n center: { x: 0.5, y: 0.5 } // Rotation center\n}\n```"}]},"type":{"type":"union","types":[{"type":"reference","name":"Color","package":"@expo/ui"},{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"children":[{"name":"color","variant":"declaration","kind":1024,"type":{"type":"reference","name":"Color","package":"@expo/ui"}},{"name":"type","variant":"declaration","kind":1024,"type":{"type":"literal","value":"color"}}]}},{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"children":[{"name":"style","variant":"declaration","kind":1024,"type":{"type":"union","types":[{"type":"literal","value":"primary"},{"type":"literal","value":"secondary"},{"type":"literal","value":"tertiary"},{"type":"literal","value":"quaternary"},{"type":"literal","value":"quinary"}]}},{"name":"type","variant":"declaration","kind":1024,"type":{"type":"literal","value":"hierarchical"}}]}},{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"children":[{"name":"colors","variant":"declaration","kind":1024,"type":{"type":"array","elementType":{"type":"reference","name":"Color","package":"@expo/ui"}}},{"name":"endPoint","variant":"declaration","kind":1024,"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"children":[{"name":"x","variant":"declaration","kind":1024,"type":{"type":"intrinsic","name":"number"}},{"name":"y","variant":"declaration","kind":1024,"type":{"type":"intrinsic","name":"number"}}]}}},{"name":"startPoint","variant":"declaration","kind":1024,"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"children":[{"name":"x","variant":"declaration","kind":1024,"type":{"type":"intrinsic","name":"number"}},{"name":"y","variant":"declaration","kind":1024,"type":{"type":"intrinsic","name":"number"}}]}}},{"name":"type","variant":"declaration","kind":1024,"type":{"type":"literal","value":"linearGradient"}}]}},{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"children":[{"name":"center","variant":"declaration","kind":1024,"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"children":[{"name":"x","variant":"declaration","kind":1024,"type":{"type":"intrinsic","name":"number"}},{"name":"y","variant":"declaration","kind":1024,"type":{"type":"intrinsic","name":"number"}}]}}},{"name":"colors","variant":"declaration","kind":1024,"type":{"type":"array","elementType":{"type":"reference","name":"Color","package":"@expo/ui"}}},{"name":"endRadius","variant":"declaration","kind":1024,"type":{"type":"intrinsic","name":"number"}},{"name":"startRadius","variant":"declaration","kind":1024,"type":{"type":"intrinsic","name":"number"}},{"name":"type","variant":"declaration","kind":1024,"type":{"type":"literal","value":"radialGradient"}}]}},{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"children":[{"name":"center","variant":"declaration","kind":1024,"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"children":[{"name":"x","variant":"declaration","kind":1024,"type":{"type":"intrinsic","name":"number"}},{"name":"y","variant":"declaration","kind":1024,"type":{"type":"intrinsic","name":"number"}}]}}},{"name":"colors","variant":"declaration","kind":1024,"type":{"type":"array","elementType":{"type":"reference","name":"Color","package":"@expo/ui"}}},{"name":"type","variant":"declaration","kind":1024,"type":{"type":"literal","value":"angularGradient"}}]}}]}}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"frame","variant":"declaration","kind":64,"signatures":[{"name":"frame","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Sets the frame properties of a view."}],"blockTags":[{"tag":"@see","content":[{"kind":"text","text":"Official [SwiftUI documentation](https://developer.apple.com/documentation/SwiftUI/View/frame(width:height:alignment:))."}]}]},"parameters":[{"name":"params","variant":"param","kind":32768,"comment":{"summary":[{"kind":"text","text":"The frame parameters. Width, height, minWidth, maxWidth, minHeight, maxHeight, idealWidth, idealHeight and alignment."}]},"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"children":[{"name":"alignment","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"union","types":[{"type":"literal","value":"center"},{"type":"literal","value":"top"},{"type":"literal","value":"bottom"},{"type":"literal","value":"topLeading"},{"type":"literal","value":"topTrailing"},{"type":"literal","value":"leading"},{"type":"literal","value":"trailing"},{"type":"literal","value":"bottomLeading"},{"type":"literal","value":"bottomTrailing"}]}},{"name":"height","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"intrinsic","name":"number"}},{"name":"idealHeight","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"intrinsic","name":"number"}},{"name":"idealWidth","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"intrinsic","name":"number"}},{"name":"maxHeight","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"intrinsic","name":"number"}},{"name":"maxWidth","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"intrinsic","name":"number"}},{"name":"minHeight","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"intrinsic","name":"number"}},{"name":"minWidth","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"intrinsic","name":"number"}},{"name":"width","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"intrinsic","name":"number"}}]}}}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"gaugeStyle","variant":"declaration","kind":64,"signatures":[{"name":"gaugeStyle","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Sets the style for the gauge."}],"blockTags":[{"tag":"@see","content":[{"kind":"text","text":"Official [SwiftUI documentation](https://developer.apple.com/documentation/swiftui/gaugestyle)."}]}]},"parameters":[{"name":"style","variant":"param","kind":32768,"comment":{"summary":[{"kind":"text","text":"The style for the gauge."}]},"type":{"type":"reference","name":"GaugeStyleType","package":"@expo/ui"}}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"glassEffect","variant":"declaration","kind":64,"signatures":[{"name":"glassEffect","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Applies a glass effect to a view."}],"blockTags":[{"tag":"@see","content":[{"kind":"text","text":"Official [SwiftUI documentation](https://developer.apple.com/documentation/swiftui/view/glasseffect(_:in:))."}]}]},"parameters":[{"name":"params","variant":"param","kind":32768,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"The glass effect parameters. Variant, interactive, tint and shape."}]},"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"children":[{"name":"cornerRadius","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"intrinsic","name":"number"}},{"name":"glass","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"children":[{"name":"interactive","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"intrinsic","name":"boolean"}},{"name":"tint","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"reference","name":"Color","package":"@expo/ui"}},{"name":"variant","variant":"declaration","kind":1024,"type":{"type":"union","types":[{"type":"literal","value":"clear"},{"type":"literal","value":"regular"},{"type":"literal","value":"identity"}]}}]}}},{"name":"shape","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"union","types":[{"type":"literal","value":"roundedRectangle"},{"type":"literal","value":"capsule"},{"type":"literal","value":"rectangle"},{"type":"literal","value":"ellipse"},{"type":"literal","value":"circle"},{"type":"literal","value":"containerRelativeShape"}]}}]}}}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"glassEffectId","variant":"declaration","kind":64,"signatures":[{"name":"glassEffectId","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Associates an identity value to Liquid Glass effects defined within a "},{"kind":"code","text":"`GlassEffectContainer`"},{"kind":"text","text":"."}],"blockTags":[{"tag":"@see","content":[{"kind":"text","text":"Official [SwiftUI documentation](https://developer.apple.com/documentation/swiftui/view/glasseffectid(_:in:))."}]}]},"parameters":[{"name":"id","variant":"param","kind":32768,"comment":{"summary":[{"kind":"text","text":"The id of the glass effect."}]},"type":{"type":"intrinsic","name":"string"}},{"name":"namespaceId","variant":"param","kind":32768,"comment":{"summary":[{"kind":"text","text":"The namespace id of the glass effect. Use Namespace component to create a namespace."}]},"type":{"type":"intrinsic","name":"string"}}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"grayscale","variant":"declaration","kind":64,"signatures":[{"name":"grayscale","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Makes a view grayscale."}],"blockTags":[{"tag":"@see","content":[{"kind":"text","text":"Official [SwiftUI documentation](https://developer.apple.com/documentation/swiftui/view/grayscale(_:))."}]}]},"parameters":[{"name":"amount","variant":"param","kind":32768,"comment":{"summary":[{"kind":"text","text":"Grayscale amount (0 to 1)."}]},"type":{"type":"intrinsic","name":"number"}}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"gridCellAnchor","variant":"declaration","kind":64,"signatures":[{"name":"gridCellAnchor","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Specifies a custom alignment anchor for a view that acts as a grid cell."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"A view that uses the specified anchor point to align its content."}]},{"tag":"@platform","content":[{"kind":"text","text":"iOS 16+"}]},{"tag":"@example","content":[{"kind":"code","text":"```tsx\n// Using a preset anchor\n\n\n// Using a custom anchor point\n\n```"}]}]},"parameters":[{"name":"anchor","variant":"param","kind":32768,"comment":{"summary":[{"kind":"text","text":"The unit point that defines how to align the view within the bounds of its grid cell."}]},"type":{"type":"union","types":[{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"children":[{"name":"anchor","variant":"declaration","kind":1024,"type":{"type":"union","types":[{"type":"literal","value":"center"},{"type":"literal","value":"top"},{"type":"literal","value":"bottom"},{"type":"literal","value":"zero"},{"type":"literal","value":"topLeading"},{"type":"literal","value":"topTrailing"},{"type":"literal","value":"leading"},{"type":"literal","value":"trailing"},{"type":"literal","value":"bottomLeading"},{"type":"literal","value":"bottomTrailing"}]}},{"name":"type","variant":"declaration","kind":1024,"type":{"type":"literal","value":"preset"}}]}},{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"children":[{"name":"points","variant":"declaration","kind":1024,"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"children":[{"name":"x","variant":"declaration","kind":1024,"type":{"type":"intrinsic","name":"number"}},{"name":"y","variant":"declaration","kind":1024,"type":{"type":"intrinsic","name":"number"}}]}}},{"name":"type","variant":"declaration","kind":1024,"type":{"type":"literal","value":"custom"}}]}}]}}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"gridCellColumns","variant":"declaration","kind":64,"signatures":[{"name":"gridCellColumns","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Tells a view that acts as a cell in a grid to span the specified number of columns."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"A view that occupies the specified number of columns in a grid row."}]}]},"parameters":[{"name":"count","variant":"param","kind":32768,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"The number of columns that the view should consume when placed in a grid row."}]},"type":{"type":"intrinsic","name":"number"}}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"gridCellUnsizedAxes","variant":"declaration","kind":64,"signatures":[{"name":"gridCellUnsizedAxes","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Asks grid layouts not to offer the view extra size in the specified axes."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"A view that doesn’t ask an enclosing grid for extra size in one or more axes."}]}]},"parameters":[{"name":"axes","variant":"param","kind":32768,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"The dimensions in which the grid shouldn’t offer the view a share of any available space. This prevents a flexible view like a Spacer, Divider, or Color from defining the size of a row or column."}]},"type":{"type":"union","types":[{"type":"literal","value":"horizontal"},{"type":"literal","value":"vertical"}]}}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"gridColumnAlignment","variant":"declaration","kind":64,"signatures":[{"name":"gridColumnAlignment","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Overrides the default horizontal alignment of the grid column that the view appears in."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"A view that uses the specified horizontal alignment, and that causes all cells in the same column of a grid to use the same alignment."}]},{"tag":"@platform","content":[{"kind":"text","text":"iOS 16+"}]}]},"parameters":[{"name":"alignment","variant":"param","kind":32768,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"The HorizontalAlignment guide to use for the grid column that the view appears in."}]},"type":{"type":"union","types":[{"type":"literal","value":"center"},{"type":"literal","value":"leading"},{"type":"literal","value":"trailing"}]}}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"headerProminence","variant":"declaration","kind":64,"signatures":[{"name":"headerProminence","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Sets the header prominence for this view."}]},"parameters":[{"name":"prominence","variant":"param","kind":32768,"comment":{"summary":[{"kind":"text","text":"The prominence to apply."}]},"type":{"type":"union","types":[{"type":"literal","value":"standard"},{"type":"literal","value":"increased"}]}}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"hidden","variant":"declaration","kind":64,"signatures":[{"name":"hidden","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Hides or shows a view."}],"blockTags":[{"tag":"@see","content":[{"kind":"text","text":"Official [SwiftUI documentation](https://developer.apple.com/documentation/swiftui/view/hidden(_:))."}]}]},"parameters":[{"name":"hidden","variant":"param","kind":32768,"comment":{"summary":[{"kind":"text","text":"Whether the view should be hidden."}]},"type":{"type":"intrinsic","name":"boolean"},"defaultValue":"true"}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"hueRotation","variant":"declaration","kind":64,"signatures":[{"name":"hueRotation","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Applies a hue rotation to a view."}],"blockTags":[{"tag":"@see","content":[{"kind":"text","text":"Official [SwiftUI documentation](https://developer.apple.com/documentation/swiftui/view/huerotation(_:))."}]}]},"parameters":[{"name":"angle","variant":"param","kind":32768,"comment":{"summary":[{"kind":"text","text":"Hue rotation angle in degrees."}]},"type":{"type":"intrinsic","name":"number"}}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"id","variant":"declaration","kind":64,"signatures":[{"name":"id","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Attaches a stable identifier to a view so it can be referenced by scroll target bindings.\nUse with "},{"kind":"code","text":"`scrollTargetLayout()`"},{"kind":"text","text":" on the containing stack and the "},{"kind":"code","text":"`scrollPosition`"},{"kind":"text","text":" modifier on a scrollable container."}],"blockTags":[{"tag":"@see","content":[{"kind":"text","text":"Official [SwiftUI documentation](https://developer.apple.com/documentation/swiftui/view/id(_:))."}]}]},"parameters":[{"name":"value","variant":"param","kind":32768,"comment":{"summary":[{"kind":"text","text":"String identifier matched by "},{"kind":"code","text":"`scrollPosition`"},{"kind":"text","text":"'s observable state."}]},"type":{"type":"intrinsic","name":"string"}}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"ignoreSafeArea","variant":"declaration","kind":64,"signatures":[{"name":"ignoreSafeArea","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Allows a view to ignore safe area constraints."}],"blockTags":[{"tag":"@see","content":[{"kind":"text","text":"Official [SwiftUI documentation](https://developer.apple.com/documentation/swiftui/view/ignoressafearea(_:edges:))."}]}]},"parameters":[{"name":"params","variant":"param","kind":32768,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"The safe area regions to ignore and the edges to expand into."}]},"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"children":[{"name":"edges","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"union","types":[{"type":"literal","value":"top"},{"type":"literal","value":"bottom"},{"type":"literal","value":"leading"},{"type":"literal","value":"trailing"},{"type":"literal","value":"horizontal"},{"type":"literal","value":"vertical"},{"type":"literal","value":"all"}]}},{"name":"regions","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"union","types":[{"type":"literal","value":"container"},{"type":"literal","value":"all"},{"type":"literal","value":"keyboard"}]}}]}}}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"indexViewStyle","variant":"declaration","kind":64,"signatures":[{"name":"indexViewStyle","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Sets the style for the page index view inside a "},{"kind":"code","text":"`TabView`"},{"kind":"text","text":". SwiftUI only\nships a "},{"kind":"code","text":"`.page`"},{"kind":"text","text":" index view style, so no style selector is exposed."}],"blockTags":[{"tag":"@see","content":[{"kind":"text","text":"Official [SwiftUI documentation](https://developer.apple.com/documentation/swiftui/view/indexviewstyle(_:))."}]}]},"parameters":[{"name":"config","variant":"param","kind":32768,"type":{"type":"reference","name":"IndexViewStyleConfig","package":"@expo/ui"},"defaultValue":"{}"}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"interactiveDismissDisabled","variant":"declaration","kind":64,"signatures":[{"name":"interactiveDismissDisabled","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Disables interactive dismissal of a sheet."}],"blockTags":[{"tag":"@see","content":[{"kind":"text","text":"Official [SwiftUI documentation](https://developer.apple.com/documentation/swiftui/view/interactivedismissdisabled(_:))."}]}]},"parameters":[{"name":"isDisabled","variant":"param","kind":32768,"comment":{"summary":[{"kind":"text","text":"Whether interactive dismiss is disabled (default: true)."}]},"type":{"type":"intrinsic","name":"boolean"},"defaultValue":"true"}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"italic","variant":"declaration","kind":64,"signatures":[{"name":"italic","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Makes text italic.\nWhen applied to "},{"kind":"code","text":"`Text`"},{"kind":"text","text":", it works on all iOS/tvOS versions. When used on regular views, it requires iOS 16.0+/tvOS 16.0+."}],"blockTags":[{"tag":"@see","content":[{"kind":"text","text":"Official [SwiftUI documentation](https://developer.apple.com/documentation/swiftui/text/italic())."}]}]},"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"kerning","variant":"declaration","kind":64,"signatures":[{"name":"kerning","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Sets the spacing, or kerning, between characters for the text in this view."}],"blockTags":[{"tag":"@default","content":[{"kind":"text","text":"0"}]},{"tag":"@see","content":[{"kind":"text","text":"Official [SwiftUI documentation](https://developer.apple.com/documentation/swiftui/view/kerning(_:))."}]}]},"parameters":[{"name":"value","variant":"param","kind":32768,"flags":{"isOptional":true},"type":{"type":"intrinsic","name":"number"}}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"keyboardType","variant":"declaration","kind":64,"signatures":[{"name":"keyboardType","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Sets the keyboard type for text input views."}],"blockTags":[{"tag":"@see","content":[{"kind":"text","text":"Official [SwiftUI documentation](https://developer.apple.com/documentation/swiftui/view/keyboardtype(_:))."}]}]},"parameters":[{"name":"keyboardType","variant":"param","kind":32768,"comment":{"summary":[{"kind":"text","text":"The type of keyboard to display."}]},"type":{"type":"union","types":[{"type":"literal","value":"default"},{"type":"literal","value":"url"},{"type":"literal","value":"email-address"},{"type":"literal","value":"numeric"},{"type":"literal","value":"phone-pad"},{"type":"literal","value":"ascii-capable"},{"type":"literal","value":"numbers-and-punctuation"},{"type":"literal","value":"name-phone-pad"},{"type":"literal","value":"decimal-pad"},{"type":"literal","value":"twitter"},{"type":"literal","value":"web-search"},{"type":"literal","value":"ascii-capable-number-pad"}]}}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"labelsHidden","variant":"declaration","kind":64,"signatures":[{"name":"labelsHidden","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Hides the labels of any controls contained within this view."}],"blockTags":[{"tag":"@see","content":[{"kind":"text","text":"Official [SwiftUI documentation](https://developer.apple.com/documentation/swiftui/view/labelshidden())."}]}]},"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"labelStyle","variant":"declaration","kind":64,"signatures":[{"name":"labelStyle","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Sets the style for labels within this view."}],"blockTags":[{"tag":"@see","content":[{"kind":"text","text":"Official [SwiftUI documentation](https://developer.apple.com/documentation/swiftui/view/labelstyle(_:))."}]}]},"parameters":[{"name":"style","variant":"param","kind":32768,"comment":{"summary":[{"kind":"text","text":"The label style."}]},"type":{"type":"union","types":[{"type":"literal","value":"automatic"},{"type":"literal","value":"iconOnly"},{"type":"literal","value":"titleAndIcon"},{"type":"literal","value":"titleOnly"}]}}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"layoutPriority","variant":"declaration","kind":64,"signatures":[{"name":"layoutPriority","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Sets layout priority for the view."}],"blockTags":[{"tag":"@see","content":[{"kind":"text","text":"Official [SwiftUI documentation](https://developer.apple.com/documentation/swiftui/view/layoutpriority(_:))."}]}]},"parameters":[{"name":"priority","variant":"param","kind":32768,"comment":{"summary":[{"kind":"text","text":"Layout priority value."}]},"type":{"type":"intrinsic","name":"number"}}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"lineHeight","variant":"declaration","kind":64,"signatures":[{"name":"lineHeight","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Sets the total line height for text in this view."}],"blockTags":[{"tag":"@platform","content":[{"kind":"text","text":"ios 26.0+"}]},{"tag":"@platform","content":[{"kind":"text","text":"macos 26.0+"}]},{"tag":"@platform","content":[{"kind":"text","text":"tvos 26.0+"}]},{"tag":"@see","content":[{"kind":"text","text":"Official [SwiftUI documentation](https://developer.apple.com/documentation/swiftui/view/lineheight(_:))."}]}]},"parameters":[{"name":"value","variant":"param","kind":32768,"comment":{"summary":[{"kind":"text","text":"The line height in points."}]},"type":{"type":"intrinsic","name":"number"}}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"lineLimit","variant":"declaration","kind":64,"signatures":[{"name":"lineLimit","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Sets the line limit for text in the view.\n\nFour variants matching SwiftUI:\n- "},{"kind":"code","text":"`lineLimit()`"},{"kind":"text","text":" — no line limit (unlimited lines)\n- "},{"kind":"code","text":"`lineLimit(5)`"},{"kind":"text","text":" — max 5 lines\n- "},{"kind":"code","text":"`lineLimit(5, { reservesSpace: true })`"},{"kind":"text","text":" — max 5 lines, reserves height even when empty (iOS 16+, tvOS 16+)\n- "},{"kind":"code","text":"`lineLimit({ min: 3, max: 8 })`"},{"kind":"text","text":" — range of 3 to 8 lines (iOS 16+, tvOS 16+)"}],"blockTags":[{"tag":"@see","content":[{"kind":"text","text":"Official [SwiftUI documentation](https://developer.apple.com/documentation/swiftui/view/linelimit(_:))."}]}]},"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}},{"name":"lineLimit","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Sets the line limit for text in the view.\n\nFour variants matching SwiftUI:\n- "},{"kind":"code","text":"`lineLimit()`"},{"kind":"text","text":" — no line limit (unlimited lines)\n- "},{"kind":"code","text":"`lineLimit(5)`"},{"kind":"text","text":" — max 5 lines\n- "},{"kind":"code","text":"`lineLimit(5, { reservesSpace: true })`"},{"kind":"text","text":" — max 5 lines, reserves height even when empty (iOS 16+, tvOS 16+)\n- "},{"kind":"code","text":"`lineLimit({ min: 3, max: 8 })`"},{"kind":"text","text":" — range of 3 to 8 lines (iOS 16+, tvOS 16+)"}],"blockTags":[{"tag":"@see","content":[{"kind":"text","text":"Official [SwiftUI documentation](https://developer.apple.com/documentation/swiftui/view/linelimit(_:))."}]}]},"parameters":[{"name":"limit","variant":"param","kind":32768,"type":{"type":"intrinsic","name":"number"}},{"name":"options","variant":"param","kind":32768,"flags":{"isOptional":true},"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"children":[{"name":"reservesSpace","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"intrinsic","name":"boolean"}}]}}}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}},{"name":"lineLimit","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Sets the line limit for text in the view.\n\nFour variants matching SwiftUI:\n- "},{"kind":"code","text":"`lineLimit()`"},{"kind":"text","text":" — no line limit (unlimited lines)\n- "},{"kind":"code","text":"`lineLimit(5)`"},{"kind":"text","text":" — max 5 lines\n- "},{"kind":"code","text":"`lineLimit(5, { reservesSpace: true })`"},{"kind":"text","text":" — max 5 lines, reserves height even when empty (iOS 16+, tvOS 16+)\n- "},{"kind":"code","text":"`lineLimit({ min: 3, max: 8 })`"},{"kind":"text","text":" — range of 3 to 8 lines (iOS 16+, tvOS 16+)"}],"blockTags":[{"tag":"@see","content":[{"kind":"text","text":"Official [SwiftUI documentation](https://developer.apple.com/documentation/swiftui/view/linelimit(_:))."}]}]},"parameters":[{"name":"range","variant":"param","kind":32768,"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"children":[{"name":"max","variant":"declaration","kind":1024,"type":{"type":"intrinsic","name":"number"}},{"name":"min","variant":"declaration","kind":1024,"type":{"type":"intrinsic","name":"number"}}]}}}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"lineSpacing","variant":"declaration","kind":64,"signatures":[{"name":"lineSpacing","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"The distance in points between the bottom of one line fragment and the top of the next."}],"blockTags":[{"tag":"@see","content":[{"kind":"text","text":"Official [SwiftUI documentation](https://developer.apple.com/documentation/swiftui/view/linespacing(_:))."}]}]},"parameters":[{"name":"value","variant":"param","kind":32768,"comment":{"summary":[{"kind":"text","text":"The amount of space between the bottom of one line and the top of the next line in points. This value is always nonnegative. Otherwise, the default value will be used."}]},"type":{"type":"intrinsic","name":"number"}}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"listRowBackground","variant":"declaration","kind":64,"signatures":[{"name":"listRowBackground","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Sets the background of a row."}],"blockTags":[{"tag":"@see","content":[{"kind":"text","text":"Official [SwiftUI documentation](https://developer.apple.com/documentation/swiftui/view/listrowbackground(_:))."}]}]},"parameters":[{"name":"color","variant":"param","kind":32768,"comment":{"summary":[{"kind":"text","text":"The row color (hex string). For example, "},{"kind":"code","text":"`#FF0000`"},{"kind":"text","text":"."}]},"type":{"type":"reference","name":"Color","package":"@expo/ui"}}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"listRowInsets","variant":"declaration","kind":64,"signatures":[{"name":"listRowInsets","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Applies an inset to the rows in a list."}],"blockTags":[{"tag":"@see","content":[{"kind":"text","text":"Official [SwiftUI documentation](https://developer.apple.com/documentation/swiftui/view/listrowinsets(_:))."}]}]},"parameters":[{"name":"params","variant":"param","kind":32768,"comment":{"summary":[{"kind":"text","text":"The inset to apply to the rows in a list."}]},"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"children":[{"name":"bottom","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"intrinsic","name":"number"}},{"name":"leading","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"intrinsic","name":"number"}},{"name":"top","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"intrinsic","name":"number"}},{"name":"trailing","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"intrinsic","name":"number"}}]}}}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"listRowSeparator","variant":"declaration","kind":64,"signatures":[{"name":"listRowSeparator","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Controls the visibility of the separator for a list row."}],"blockTags":[{"tag":"@see","content":[{"kind":"text","text":"Official [SwiftUI documentation](https://developer.apple.com/documentation/swiftui/view/listrowseparator(_:edges:))."}]}]},"parameters":[{"name":"visibility","variant":"param","kind":32768,"comment":{"summary":[{"kind":"text","text":"The visibility to apply."}]},"type":{"type":"union","types":[{"type":"literal","value":"automatic"},{"type":"literal","value":"visible"},{"type":"literal","value":"hidden"}]}},{"name":"edges","variant":"param","kind":32768,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"The edges where the separator visibility applies."}]},"type":{"type":"union","types":[{"type":"literal","value":"top"},{"type":"literal","value":"bottom"},{"type":"literal","value":"all"}]}}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"listSectionMargins","variant":"declaration","kind":64,"signatures":[{"name":"listSectionMargins","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Allows a view to ignore safe area constraints."}],"blockTags":[{"tag":"@platform","content":[{"kind":"text","text":"iOS 26+"}]},{"tag":"@see","content":[{"kind":"text","text":"Official [SwiftUI documentation](https://developer.apple.com/documentation/swiftui/view/listsectionmargins(_:_:))."}]}]},"parameters":[{"name":"params","variant":"param","kind":32768,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"The margins to apply to the section in a list."}]},"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"children":[{"name":"edges","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"union","types":[{"type":"literal","value":"top"},{"type":"literal","value":"bottom"},{"type":"literal","value":"leading"},{"type":"literal","value":"trailing"},{"type":"literal","value":"horizontal"},{"type":"literal","value":"vertical"},{"type":"literal","value":"all"}]}},{"name":"length","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"intrinsic","name":"number"}}]}}}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"listSectionSpacing","variant":"declaration","kind":64,"signatures":[{"name":"listSectionSpacing","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Sets the spacing between adjacent sections."}],"blockTags":[{"tag":"@platform","content":[{"kind":"text","text":"ios 17.0+"}]}]},"parameters":[{"name":"spacing","variant":"param","kind":32768,"comment":{"summary":[{"kind":"text","text":"The spacing to apply."}]},"type":{"type":"union","types":[{"type":"intrinsic","name":"number"},{"type":"literal","value":"default"},{"type":"literal","value":"compact"}]}}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"listStyle","variant":"declaration","kind":64,"signatures":[{"name":"listStyle","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Sets the style for a List view."}],"blockTags":[{"tag":"@see","content":[{"kind":"text","text":"Official [SwiftUI documentation](https://developer.apple.com/documentation/swiftui/view/liststyle(_:))."}]}]},"parameters":[{"name":"style","variant":"param","kind":32768,"comment":{"summary":[{"kind":"text","text":"The list style to apply."}]},"type":{"type":"reference","name":"ListStyle","package":"@expo/ui"}}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"luminanceToAlpha","variant":"declaration","kind":64,"signatures":[{"name":"luminanceToAlpha","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Adds a luminance to alpha effect to this view."}],"blockTags":[{"tag":"@see","content":[{"kind":"text","text":"Official [SwiftUI documentation](https://developer.apple.com/documentation/SwiftUI/View/luminanceToAlpha())."}]}]},"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"mask","variant":"declaration","kind":64,"signatures":[{"name":"mask","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Applies a mask to the view."}],"blockTags":[{"tag":"@see","content":[{"kind":"text","text":"Official [SwiftUI documentation](https://developer.apple.com/documentation/swiftui/view/mask(_:))."}]}]},"parameters":[{"name":"shape","variant":"param","kind":32768,"comment":{"summary":[{"kind":"text","text":"The masking shape."}]},"type":{"type":"union","types":[{"type":"literal","value":"roundedRectangle"},{"type":"literal","value":"capsule"},{"type":"literal","value":"rectangle"},{"type":"literal","value":"ellipse"},{"type":"literal","value":"circle"},{"type":"literal","value":"containerRelativeShape"}]}},{"name":"cornerRadius","variant":"param","kind":32768,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Corner radius for rounded rectangle (default: "},{"kind":"code","text":"`8`"},{"kind":"text","text":")."}]},"type":{"type":"intrinsic","name":"number"}}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"matchedGeometryEffect","variant":"declaration","kind":64,"signatures":[{"name":"matchedGeometryEffect","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Adds a matched geometry effect to a view."}],"blockTags":[{"tag":"@see","content":[{"kind":"text","text":"Official [SwiftUI documentation](https://developer.apple.com/documentation/swiftui/view/matchedgeometryeffect(id:in:properties:anchor:issource:))."}]}]},"parameters":[{"name":"id","variant":"param","kind":32768,"comment":{"summary":[{"kind":"text","text":"The id of the view."}]},"type":{"type":"intrinsic","name":"string"}},{"name":"namespaceId","variant":"param","kind":32768,"comment":{"summary":[{"kind":"text","text":"The namespace id of the view. Use Namespace component to create a namespace."}]},"type":{"type":"intrinsic","name":"string"}}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"menuActionDismissBehavior","variant":"declaration","kind":64,"signatures":[{"name":"menuActionDismissBehavior","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Controls the dismissal behavior of menu actions."}],"blockTags":[{"tag":"@platform","content":[{"kind":"text","text":"ios 16.4+"}]},{"tag":"@platform","content":[{"kind":"text","text":"tvos 17.0+"}]},{"tag":"@see","content":[{"kind":"text","text":"Official [SwiftUI documentation](https://developer.apple.com/documentation/swiftui/view/menuactiondismissbehavior(_:))."}]}]},"parameters":[{"name":"behavior","variant":"param","kind":32768,"comment":{"summary":[{"kind":"text","text":"The menu action dismiss behavior."}]},"type":{"type":"union","types":[{"type":"literal","value":"automatic"},{"type":"literal","value":"enabled"},{"type":"literal","value":"disabled"}]}}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"monospacedDigit","variant":"declaration","kind":64,"signatures":[{"name":"monospacedDigit","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Modifies the fonts of all child views to use fixed-width digits, if possible, while leaving other characters proportionally spaced.\nWhen applied to "},{"kind":"code","text":"`Text`"},{"kind":"text","text":", modifies the text view's font to use fixed-width digits, while leaving other characters proportionally spaced."}],"blockTags":[{"tag":"@see","content":[{"kind":"text","text":"Official [SwiftUI documentation](https://developer.apple.com/documentation/swiftui/view/monospaceddigit())."}]}]},"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"moveDisabled","variant":"declaration","kind":64,"signatures":[{"name":"moveDisabled","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Disables the move action for a view in a list.\nApply to items within a "},{"kind":"code","text":"`ForEach`"},{"kind":"text","text":" to prevent them from being moved."}],"blockTags":[{"tag":"@default","content":[{"kind":"text","text":"true"}]},{"tag":"@see","content":[{"kind":"text","text":"Official [SwiftUI documentation](https://developer.apple.com/documentation/swiftui/view/movedisabled(_:))."}]}]},"parameters":[{"name":"disabled","variant":"param","kind":32768,"comment":{"summary":[{"kind":"text","text":"Whether moving should be disabled"}]},"type":{"type":"intrinsic","name":"boolean"},"defaultValue":"true"}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"multilineTextAlignment","variant":"declaration","kind":64,"signatures":[{"name":"multilineTextAlignment","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"An alignment position for text along the horizontal axis."}],"blockTags":[{"tag":"@see","content":[{"kind":"text","text":"Official [SwiftUI documentation](https://developer.apple.com/documentation/swiftui/view/multilinetextalignment(_:))."}]}]},"parameters":[{"name":"alignment","variant":"param","kind":32768,"comment":{"summary":[{"kind":"text","text":"A value that you use to align multiple lines of text within a view."}]},"type":{"type":"union","types":[{"type":"literal","value":"center"},{"type":"literal","value":"leading"},{"type":"literal","value":"trailing"}]}}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"offset","variant":"declaration","kind":64,"signatures":[{"name":"offset","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Applies an offset (translation) to a view."}],"blockTags":[{"tag":"@see","content":[{"kind":"text","text":"Official [SwiftUI documentation](https://developer.apple.com/documentation/swiftui/view/offset(x:y:))."}]}]},"parameters":[{"name":"params","variant":"param","kind":32768,"comment":{"summary":[{"kind":"text","text":"The offset parameters: "},{"kind":"code","text":"`x`"},{"kind":"text","text":" and "},{"kind":"code","text":"`y`"},{"kind":"text","text":"."}]},"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"children":[{"name":"x","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"intrinsic","name":"number"}},{"name":"y","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"intrinsic","name":"number"}}]}}}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"onAppear","variant":"declaration","kind":64,"signatures":[{"name":"onAppear","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Adds an onAppear modifier that calls a function when the view appears."}],"blockTags":[{"tag":"@see","content":[{"kind":"text","text":"Official [SwiftUI documentation](https://developer.apple.com/documentation/swiftui/view/onappear(perform:))."}]}]},"parameters":[{"name":"handler","variant":"param","kind":32768,"comment":{"summary":[{"kind":"text","text":"Function to call when the view appears."}]},"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"signatures":[{"name":"__type","variant":"signature","kind":4096,"type":{"type":"intrinsic","name":"void"}}]}}}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"onDisappear","variant":"declaration","kind":64,"signatures":[{"name":"onDisappear","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Adds an onDisappear modifier that calls a function when the view disappears."}],"blockTags":[{"tag":"@see","content":[{"kind":"text","text":"Official [SwiftUI documentation](https://developer.apple.com/documentation/swiftui/view/ondisappear(perform:))."}]}]},"parameters":[{"name":"handler","variant":"param","kind":32768,"comment":{"summary":[{"kind":"text","text":"Function to call when the view disappears."}]},"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"signatures":[{"name":"__type","variant":"signature","kind":4096,"type":{"type":"intrinsic","name":"void"}}]}}}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"onGeometryChange","variant":"declaration","kind":64,"signatures":[{"name":"onGeometryChange","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Calls the handler whenever the view's geometry changes. Sizes are in points."}],"blockTags":[{"tag":"@see","content":[{"kind":"text","text":"Official [SwiftUI documentation](https://developer.apple.com/documentation/swiftui/view/ongeometrychange(for:of:action:))."}]}]},"parameters":[{"name":"handler","variant":"param","kind":32768,"comment":{"summary":[{"kind":"text","text":"Function called with the new size."}]},"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"signatures":[{"name":"__type","variant":"signature","kind":4096,"parameters":[{"name":"size","variant":"param","kind":32768,"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"children":[{"name":"height","variant":"declaration","kind":1024,"type":{"type":"intrinsic","name":"number"}},{"name":"width","variant":"declaration","kind":1024,"type":{"type":"intrinsic","name":"number"}}]}}}],"type":{"type":"intrinsic","name":"void"}}]}}}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"onLongPressGesture","variant":"declaration","kind":64,"signatures":[{"name":"onLongPressGesture","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Adds a long press gesture recognizer."}]},"parameters":[{"name":"handler","variant":"param","kind":32768,"comment":{"summary":[{"kind":"text","text":"Function to call when long pressed."}]},"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"signatures":[{"name":"__type","variant":"signature","kind":4096,"type":{"type":"intrinsic","name":"void"}}]}}},{"name":"minimumDuration","variant":"param","kind":32768,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Minimum duration for long press (default: 0.5s)"}]},"type":{"type":"intrinsic","name":"number"}}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"onSubmit","variant":"declaration","kind":64,"signatures":[{"name":"onSubmit","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Adds an action to perform when the user submits a value to this view (e.g. pressing return in a text field)."}],"blockTags":[{"tag":"@see","content":[{"kind":"text","text":"Official [SwiftUI documentation](https://developer.apple.com/documentation/swiftui/view/onsubmit(of:_:))."}]}]},"parameters":[{"name":"handler","variant":"param","kind":32768,"comment":{"summary":[{"kind":"text","text":"Function to call on submit."}]},"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"signatures":[{"name":"__type","variant":"signature","kind":4096,"type":{"type":"intrinsic","name":"void"}}]}}}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"onTapGesture","variant":"declaration","kind":64,"signatures":[{"name":"onTapGesture","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Adds a tap gesture recognizer."}],"blockTags":[{"tag":"@see","content":[{"kind":"text","text":"Official [SwiftUI documentation](https://developer.apple.com/documentation/swiftui/view/ontapgesture(count:perform:))."}]}]},"parameters":[{"name":"handler","variant":"param","kind":32768,"comment":{"summary":[{"kind":"text","text":"Function to call when tapped."}]},"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"signatures":[{"name":"__type","variant":"signature","kind":4096,"type":{"type":"intrinsic","name":"void"}}]}}}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"opacity","variant":"declaration","kind":64,"signatures":[{"name":"opacity","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Sets the opacity of a view."}],"blockTags":[{"tag":"@see","content":[{"kind":"text","text":"Official [SwiftUI documentation](https://developer.apple.com/documentation/swiftui/view/opacity(_:))."}]}]},"parameters":[{"name":"value","variant":"param","kind":32768,"comment":{"summary":[{"kind":"text","text":"Opacity value between 0 and 1."}]},"type":{"type":"intrinsic","name":"number"}}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"overlay","variant":"declaration","kind":64,"signatures":[{"name":"overlay","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Overlays another view on top."}],"blockTags":[{"tag":"@see","content":[{"kind":"text","text":"Official [SwiftUI documentation](https://developer.apple.com/documentation/swiftui/view/overlay(_:alignment:))."}]}]},"parameters":[{"name":"params","variant":"param","kind":32768,"comment":{"summary":[{"kind":"text","text":"Overlay color and alignment."}]},"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"children":[{"name":"alignment","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"union","types":[{"type":"literal","value":"center"},{"type":"literal","value":"top"},{"type":"literal","value":"bottom"},{"type":"literal","value":"leading"},{"type":"literal","value":"trailing"}]}},{"name":"color","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"reference","name":"Color","package":"@expo/ui"}}]}}}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"padding","variant":"declaration","kind":64,"signatures":[{"name":"padding","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Sets padding on a view.\nSupports individual edges or shorthand properties."}],"blockTags":[{"tag":"@see","content":[{"kind":"text","text":"Official [SwiftUI documentation](https://developer.apple.com/documentation/SwiftUI/View/padding(_:_:))."}]}]},"parameters":[{"name":"params","variant":"param","kind":32768,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"The padding parameters: "},{"kind":"code","text":"`top`"},{"kind":"text","text":", "},{"kind":"code","text":"`bottom`"},{"kind":"text","text":", "},{"kind":"code","text":"`leading`"},{"kind":"text","text":", "},{"kind":"code","text":"`trailing`"},{"kind":"text","text":", "},{"kind":"code","text":"`horizontal`"},{"kind":"text","text":", "},{"kind":"code","text":"`vertical`"},{"kind":"text","text":" and "},{"kind":"code","text":"`all`"},{"kind":"text","text":"."}]},"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"children":[{"name":"all","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"intrinsic","name":"number"}},{"name":"bottom","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"intrinsic","name":"number"}},{"name":"horizontal","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"intrinsic","name":"number"}},{"name":"leading","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"intrinsic","name":"number"}},{"name":"top","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"intrinsic","name":"number"}},{"name":"trailing","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"intrinsic","name":"number"}},{"name":"vertical","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"intrinsic","name":"number"}}]}}}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"pickerStyle","variant":"declaration","kind":64,"signatures":[{"name":"pickerStyle","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Sets the style for the picker."}],"blockTags":[{"tag":"@see","content":[{"kind":"text","text":"Official [SwiftUI documentation](https://developer.apple.com/documentation/swiftui/pickerstyle)."}]}]},"parameters":[{"name":"style","variant":"param","kind":32768,"comment":{"summary":[{"kind":"text","text":"The style for the picker."}]},"type":{"type":"reference","name":"PickerStyleType","package":"@expo/ui"}}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"presentationBackgroundInteraction","variant":"declaration","kind":64,"signatures":[{"name":"presentationBackgroundInteraction","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Controls interaction with the content behind a sheet."}],"blockTags":[{"tag":"@platform","content":[{"kind":"text","text":"ios 16.4+"}]},{"tag":"@platform","content":[{"kind":"text","text":"tvos 16.4+"}]},{"tag":"@see","content":[{"kind":"text","text":"Official [SwiftUI documentation](https://developer.apple.com/documentation/swiftui/view/presentationbackgroundinteraction(_:))."}]}]},"parameters":[{"name":"interaction","variant":"param","kind":32768,"comment":{"summary":[{"kind":"text","text":"The background interaction behavior."}]},"type":{"type":"reference","name":"PresentationBackgroundInteractionType","package":"@expo/ui"}}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"presentationDetents","variant":"declaration","kind":64,"signatures":[{"name":"presentationDetents","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Sets the available heights for a sheet presentation."}],"blockTags":[{"tag":"@platform","content":[{"kind":"text","text":"ios 16.0+"}]},{"tag":"@platform","content":[{"kind":"text","text":"tvos 16.0+"}]},{"tag":"@see","content":[{"kind":"text","text":"Official [SwiftUI documentation](https://developer.apple.com/documentation/swiftui/view/presentationdetents(_:selection:))."}]}]},"parameters":[{"name":"detents","variant":"param","kind":32768,"comment":{"summary":[{"kind":"text","text":"Array of detents the sheet can snap to."}]},"type":{"type":"array","elementType":{"type":"reference","name":"PresentationDetent","package":"@expo/ui"}}},{"name":"options","variant":"param","kind":32768,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Optional settings for tracking the selected detent."}]},"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"children":[{"name":"onSelectionChange","variant":"declaration","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Callback fired when the user changes the active detent by dragging."}]},"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"signatures":[{"name":"__type","variant":"signature","kind":4096,"parameters":[{"name":"detent","variant":"param","kind":32768,"type":{"type":"reference","name":"PresentationDetent","package":"@expo/ui"}}],"type":{"type":"intrinsic","name":"void"}}]}}},{"name":"selection","variant":"declaration","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"The currently selected detent."}]},"type":{"type":"reference","name":"PresentationDetent","package":"@expo/ui"}}]}}}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"presentationDragIndicator","variant":"declaration","kind":64,"signatures":[{"name":"presentationDragIndicator","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Controls the visibility of the drag indicator on a sheet."}],"blockTags":[{"tag":"@platform","content":[{"kind":"text","text":"ios 16.0+"}]},{"tag":"@platform","content":[{"kind":"text","text":"tvos 16.0+"}]},{"tag":"@see","content":[{"kind":"text","text":"Official [SwiftUI documentation](https://developer.apple.com/documentation/swiftui/view/presentationdragindicator(_:))."}]}]},"parameters":[{"name":"visibility","variant":"param","kind":32768,"comment":{"summary":[{"kind":"text","text":"The visibility of the drag indicator."}]},"type":{"type":"union","types":[{"type":"literal","value":"automatic"},{"type":"literal","value":"visible"},{"type":"literal","value":"hidden"}]}}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"progressViewStyle","variant":"declaration","kind":64,"signatures":[{"name":"progressViewStyle","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Sets the style for the progress view."}],"blockTags":[{"tag":"@see","content":[{"kind":"text","text":"Official [SwiftUI documentation](https://developer.apple.com/documentation/swiftui/progressviewstyle)."}]}]},"parameters":[{"name":"style","variant":"param","kind":32768,"comment":{"summary":[{"kind":"text","text":"The style for the progress view."}]},"type":{"type":"reference","name":"ProgressViewStyleType","package":"@expo/ui"}}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"refreshable","variant":"declaration","kind":64,"signatures":[{"name":"refreshable","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Marks a view as refreshable. Adds pull-to-refresh functionality."}],"blockTags":[{"tag":"@see","content":[{"kind":"text","text":"Official [SwiftUI documentation](https://developer.apple.com/documentation/swiftui/view/refreshable(action:))."}]}]},"parameters":[{"name":"handler","variant":"param","kind":32768,"comment":{"summary":[{"kind":"text","text":"Async function to call when refresh is triggered."}]},"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"signatures":[{"name":"__type","variant":"signature","kind":4096,"type":{"type":"reference","target":{"packageName":"typescript","packagePath":"lib/lib.es5.d.ts","qualifiedName":"Promise"},"typeArguments":[{"type":"intrinsic","name":"void"}],"name":"Promise","package":"typescript"}}]}}}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"resizable","variant":"declaration","kind":64,"signatures":[{"name":"resizable","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Sets the mode by which SwiftUI resizes an image to fit its space."}],"blockTags":[{"tag":"@see","content":[{"kind":"text","text":"Official [SwiftUI documentation](https://developer.apple.com/documentation/swiftui/image/resizable(capinsets:resizingmode:))."}]}]},"parameters":[{"name":"capInsets","variant":"param","kind":32768,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Inset values that indicate a portion of the image that SwiftUI doesn’t resize."}]},"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"children":[{"name":"bottom","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"intrinsic","name":"number"}},{"name":"leading","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"intrinsic","name":"number"}},{"name":"top","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"intrinsic","name":"number"}},{"name":"trailing","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"intrinsic","name":"number"}}]}}},{"name":"resizingMode","variant":"param","kind":32768,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"The mode by which SwiftUI resizes the image."}]},"type":{"type":"union","types":[{"type":"literal","value":"stretch"},{"type":"literal","value":"tile"}]}}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"rotation3DEffect","variant":"declaration","kind":64,"signatures":[{"name":"rotation3DEffect","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Applies a 3D rotation transformation."}],"blockTags":[{"tag":"@see","content":[{"kind":"text","text":"Official [SwiftUI documentation](https://developer.apple.com/documentation/swiftui/view/rotation3deffect(_:axis:anchor:anchorz:perspective:))."}]}]},"parameters":[{"name":"params","variant":"param","kind":32768,"comment":{"summary":[{"kind":"text","text":"The rotation parameters: "},{"kind":"code","text":"`angle`"},{"kind":"text","text":" (in degrees), "},{"kind":"code","text":"`axis`"},{"kind":"text","text":" (x, y, z), and "},{"kind":"code","text":"`perspective`"},{"kind":"text","text":"."}]},"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"children":[{"name":"angle","variant":"declaration","kind":1024,"type":{"type":"intrinsic","name":"number"}},{"name":"axis","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"children":[{"name":"x","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"intrinsic","name":"number"}},{"name":"y","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"intrinsic","name":"number"}},{"name":"z","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"intrinsic","name":"number"}}]}}},{"name":"perspective","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"intrinsic","name":"number"}}]}}}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"rotationEffect","variant":"declaration","kind":64,"signatures":[{"name":"rotationEffect","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Applies rotation transformation."}],"blockTags":[{"tag":"@see","content":[{"kind":"text","text":"Official [SwiftUI documentation](https://developer.apple.com/documentation/swiftui/view/rotationeffect(_:anchor:))."}]}]},"parameters":[{"name":"angle","variant":"param","kind":32768,"comment":{"summary":[{"kind":"text","text":"Rotation angle in degrees."}]},"type":{"type":"intrinsic","name":"number"}}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"saturation","variant":"declaration","kind":64,"signatures":[{"name":"saturation","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Adjusts the saturation of a view."}],"blockTags":[{"tag":"@see","content":[{"kind":"text","text":"Official [SwiftUI documentation](https://developer.apple.com/documentation/swiftui/view/saturation(_:))."}]}]},"parameters":[{"name":"amount","variant":"param","kind":32768,"comment":{"summary":[{"kind":"text","text":"Saturation multiplier (0 to infinity, 1 = normal)."}]},"type":{"type":"intrinsic","name":"number"}}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"scaleEffect","variant":"declaration","kind":64,"signatures":[{"name":"scaleEffect","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Applies scaling transformation."}],"blockTags":[{"tag":"@see","content":[{"kind":"text","text":"Official [SwiftUI documentation](https://developer.apple.com/documentation/swiftui/view/scaleeffect(_:anchor:))."}]}]},"parameters":[{"name":"scale","variant":"param","kind":32768,"comment":{"summary":[{"kind":"text","text":"Uniform scale factor (1.0 = normal size), or an object with separate "},{"kind":"code","text":"`x`"},{"kind":"text","text":" and "},{"kind":"code","text":"`y`"},{"kind":"text","text":" scale factors."}]},"type":{"type":"union","types":[{"type":"intrinsic","name":"number"},{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"children":[{"name":"x","variant":"declaration","kind":1024,"type":{"type":"intrinsic","name":"number"}},{"name":"y","variant":"declaration","kind":1024,"type":{"type":"intrinsic","name":"number"}}]}}]}}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"scrollContentBackground","variant":"declaration","kind":64,"signatures":[{"name":"scrollContentBackground","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Specifies the visibility of the background for scrollable views within this view."}],"blockTags":[{"tag":"@see","content":[{"kind":"text","text":"Official [SwiftUI documentation](https://developer.apple.com/documentation/swiftui/view/scrollcontentbackground(_:))."}]}]},"parameters":[{"name":"visible","variant":"param","kind":32768,"comment":{"summary":[{"kind":"text","text":"The visibility of the background."}]},"type":{"type":"union","types":[{"type":"literal","value":"automatic"},{"type":"literal","value":"visible"},{"type":"literal","value":"hidden"}]}}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"scrollDisabled","variant":"declaration","kind":64,"signatures":[{"name":"scrollDisabled","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Disables or enables scrolling in scrollable views."}],"blockTags":[{"tag":"@platform","content":[{"kind":"text","text":"ios 16.0+"}]},{"tag":"@platform","content":[{"kind":"text","text":"tvos 16.0+"}]},{"tag":"@see","content":[{"kind":"text","text":"Official [SwiftUI documentation](https://developer.apple.com/documentation/swiftui/view/scrolldisabled(_:))."}]}]},"parameters":[{"name":"disabled","variant":"param","kind":32768,"comment":{"summary":[{"kind":"text","text":"Whether scrolling should be disabled (default: true)."}]},"type":{"type":"intrinsic","name":"boolean"},"defaultValue":"true"}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"scrollDismissesKeyboard","variant":"declaration","kind":64,"signatures":[{"name":"scrollDismissesKeyboard","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Controls how the keyboard is dismissed when scrolling."}],"blockTags":[{"tag":"@platform","content":[{"kind":"text","text":"ios 16.0+"}]},{"tag":"@platform","content":[{"kind":"text","text":"tvos 16.0+"}]},{"tag":"@see","content":[{"kind":"text","text":"Official [SwiftUI documentation](https://developer.apple.com/documentation/swiftui/view/scrolldismisseskeyboard(_:))."}]}]},"parameters":[{"name":"mode","variant":"param","kind":32768,"comment":{"summary":[{"kind":"text","text":"The keyboard dismiss mode."}]},"type":{"type":"union","types":[{"type":"literal","value":"automatic"},{"type":"literal","value":"never"},{"type":"literal","value":"interactively"},{"type":"literal","value":"immediately"}]}}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"scrollIndicators","variant":"declaration","kind":64,"signatures":[{"name":"scrollIndicators","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Controls the visibility of scroll indicators for scrollable views.\nMirrors SwiftUI's "},{"kind":"code","text":"`scrollIndicators(_:axes:)`"},{"kind":"text","text":" modifier."}],"blockTags":[{"tag":"@platform","content":[{"kind":"text","text":"ios 16.0+"}]},{"tag":"@platform","content":[{"kind":"text","text":"tvos 16.0+"}]},{"tag":"@see","content":[{"kind":"text","text":"Official [SwiftUI documentation](https://developer.apple.com/documentation/swiftui/view/scrollindicators(_:axes:))."}]}]},"parameters":[{"name":"visibility","variant":"param","kind":32768,"comment":{"summary":[{"kind":"text","text":"Indicator visibility:\n- "},{"kind":"code","text":"`'automatic'`"},{"kind":"text","text":": platform-default behavior.\n- "},{"kind":"code","text":"`'visible'`"},{"kind":"text","text":": prefer showing indicators (may still be hidden by the system).\n- "},{"kind":"code","text":"`'hidden'`"},{"kind":"text","text":": prefer hiding indicators (may still be shown by the system).\n- "},{"kind":"code","text":"`'never'`"},{"kind":"text","text":": never show indicators."}]},"type":{"type":"union","types":[{"type":"literal","value":"automatic"},{"type":"literal","value":"never"},{"type":"literal","value":"visible"},{"type":"literal","value":"hidden"}]}},{"name":"axes","variant":"param","kind":32768,"comment":{"summary":[{"kind":"text","text":"Axes to apply the visibility to. Defaults to "},{"kind":"code","text":"`'both'`"},{"kind":"text","text":"."}]},"type":{"type":"union","types":[{"type":"literal","value":"horizontal"},{"type":"literal","value":"vertical"},{"type":"literal","value":"both"}]},"defaultValue":"'both'"}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"scrollPosition","variant":"declaration","kind":64,"signatures":[{"name":"scrollPosition","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Binds the leading scroll target of a scrollable container to an observable native state.\n\nReading "},{"kind":"code","text":"`state.value`"},{"kind":"text","text":" returns the id of the leading scroll target. Writing to it scrolls\nthe container to the matching view. Pair with "},{"kind":"code","text":"`scrollTargetLayout()`"},{"kind":"text","text":" on the content\ncontainer and "},{"kind":"code","text":"`id()`"},{"kind":"text","text":" on each target. Works on "},{"kind":"code","text":"`ScrollView`"},{"kind":"text","text":", "},{"kind":"code","text":"`LazyVStack`"},{"kind":"text","text":", "},{"kind":"code","text":"`LazyHStack`"},{"kind":"text","text":",\nand other scrollable containers.\n\nOn iOS below 17.0, the modifier is a no-op."}],"blockTags":[{"tag":"@platform","content":[{"kind":"text","text":"ios 17.0+"}]},{"tag":"@platform","content":[{"kind":"text","text":"tvos 17.0+"}]},{"tag":"@platform","content":[{"kind":"text","text":"macos 14.0+"}]},{"tag":"@see","content":[{"kind":"text","text":"Official [SwiftUI documentation](https://developer.apple.com/documentation/swiftui/view/scrollposition(id:anchor:))."}]},{"tag":"@example","content":[{"kind":"code","text":"```tsx\nconst activeID = useNativeState(null);\n\n console.log('leading target:', newID),\n }),\n ]}>\n \n {items.map((item) => (\n {item.text}\n ))}\n \n\n```"}]}]},"parameters":[{"name":"state","variant":"param","kind":32768,"comment":{"summary":[{"kind":"text","text":"An "},{"kind":"code","text":"`ObservableState`"},{"kind":"text","text":" created with "},{"kind":"code","text":"`useNativeState`"},{"kind":"text","text":"."}]},"type":{"type":"reference","typeArguments":[{"type":"union","types":[{"type":"intrinsic","name":"string"},{"type":"literal","value":null}]}],"name":"ObservableState","package":"@expo/ui"}},{"name":"options","variant":"param","kind":32768,"flags":{"isOptional":true},"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"children":[{"name":"anchor","variant":"declaration","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Anchor used to pick which view drives the binding and to align\n programmatic scrolls. Maps to the "},{"kind":"code","text":"`anchor:`"},{"kind":"text","text":" parameter of SwiftUI's "},{"kind":"code","text":"`.scrollPosition(id:anchor:)`"},{"kind":"text","text":"."}]},"type":{"type":"reference","name":"UnitPointValue","package":"@expo/ui"}},{"name":"onChange","variant":"declaration","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Fires on the JS thread whenever the leading scroll target changes."}]},"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"signatures":[{"name":"__type","variant":"signature","kind":4096,"parameters":[{"name":"id","variant":"param","kind":32768,"type":{"type":"union","types":[{"type":"intrinsic","name":"string"},{"type":"literal","value":null}]}}],"type":{"type":"intrinsic","name":"void"}}]}}}]}}}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"scrollTargetBehavior","variant":"declaration","kind":64,"signatures":[{"name":"scrollTargetBehavior","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Sets the scroll snapping behavior for scrollable views.\nUse with "},{"kind":"code","text":"`scrollTargetLayout`"},{"kind":"text","text":" on the content container."}],"blockTags":[{"tag":"@platform","content":[{"kind":"text","text":"ios 17.0+"}]},{"tag":"@see","content":[{"kind":"text","text":"Official [SwiftUI documentation](https://developer.apple.com/documentation/swiftui/view/scrolltargetbehavior(_:))."}]}]},"parameters":[{"name":"behavior","variant":"param","kind":32768,"comment":{"summary":[{"kind":"code","text":"`'paging'`"},{"kind":"text","text":" for container-aligned snapping, "},{"kind":"code","text":"`'viewAligned'`"},{"kind":"text","text":" for view-aligned snapping."}]},"type":{"type":"union","types":[{"type":"literal","value":"paging"},{"type":"literal","value":"viewAligned"}]}}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"scrollTargetLayout","variant":"declaration","kind":64,"signatures":[{"name":"scrollTargetLayout","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Configures a layout container as a scroll target layout for view-aligned snapping.\nApply to "},{"kind":"code","text":"`VStack`"},{"kind":"text","text":" or "},{"kind":"code","text":"`HStack`"},{"kind":"text","text":" inside a "},{"kind":"code","text":"`ScrollView`"},{"kind":"text","text":"."}],"blockTags":[{"tag":"@platform","content":[{"kind":"text","text":"ios 17.0+"}]},{"tag":"@see","content":[{"kind":"text","text":"Official [SwiftUI documentation](https://developer.apple.com/documentation/swiftui/view/scrolltargetlayout(isenabled:))."}]}]},"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"shadow","variant":"declaration","kind":64,"signatures":[{"name":"shadow","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Adds a shadow to a view."}],"blockTags":[{"tag":"@see","content":[{"kind":"text","text":"Official [SwiftUI documentation](https://developer.apple.com/documentation/SwiftUI/View/shadow(color:radius:x:y:))."}]}]},"parameters":[{"name":"params","variant":"param","kind":32768,"comment":{"summary":[{"kind":"text","text":"The shadow parameters: "},{"kind":"code","text":"`radius`"},{"kind":"text","text":", offset ("},{"kind":"code","text":"`x`"},{"kind":"text","text":", "},{"kind":"code","text":"`y`"},{"kind":"text","text":") and "},{"kind":"code","text":"`color`"},{"kind":"text","text":"."}]},"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"children":[{"name":"color","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"reference","name":"Color","package":"@expo/ui"}},{"name":"radius","variant":"declaration","kind":1024,"type":{"type":"intrinsic","name":"number"}},{"name":"x","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"intrinsic","name":"number"}},{"name":"y","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"intrinsic","name":"number"}}]}}}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"strikethrough","variant":"declaration","kind":64,"signatures":[{"name":"strikethrough","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Applies a strikethrough to the text."}],"blockTags":[{"tag":"@see","content":[{"kind":"text","text":"Official [SwiftUI documentation](https://developer.apple.com/documentation/swiftui/text/strikethrough(_:color:))."}]}]},"parameters":[{"name":"params","variant":"param","kind":32768,"comment":{"summary":[{"kind":"text","text":"Controls whether the strikethrough is visible ("},{"kind":"code","text":"`true`"},{"kind":"text","text":" to show, "},{"kind":"code","text":"`false`"},{"kind":"text","text":" to hide)."}]},"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"children":[{"name":"color","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"reference","name":"Color","package":"@expo/ui"}},{"name":"isActive","variant":"declaration","kind":1024,"type":{"type":"intrinsic","name":"boolean"}},{"name":"pattern","variant":"declaration","kind":1024,"type":{"type":"reference","target":{"packageName":"@expo/ui","packagePath":"src/swift-ui/modifiers/index.ts","qualifiedName":"LinePattern"},"name":"LinePattern","package":"@expo/ui"}}]}}}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"submitLabel","variant":"declaration","kind":64,"signatures":[{"name":"submitLabel","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Specifies the label to display in the keyboard's return key. For example, "},{"kind":"code","text":"`'done'`"},{"kind":"text","text":"."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"A view that uses the specified submit label."}]},{"tag":"@platform","content":[{"kind":"text","text":"iOS 15+"}]},{"tag":"@example","content":[{"kind":"code","text":"```tsx\n\n```"}]}]},"parameters":[{"name":"submitLabel","variant":"param","kind":32768,"comment":{"summary":[{"kind":"text","text":"The label to display in the keyboard's return key."}]},"type":{"type":"union","types":[{"type":"literal","value":"join"},{"type":"literal","value":"search"},{"type":"literal","value":"done"},{"type":"literal","value":"continue"},{"type":"literal","value":"go"},{"type":"literal","value":"next"},{"type":"literal","value":"return"},{"type":"literal","value":"route"},{"type":"literal","value":"send"}]}}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"symbolEffect","variant":"declaration","kind":64,"signatures":[{"name":"symbolEffect","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Applies an SF Symbol effect to a view."}],"blockTags":[{"tag":"@platform","content":[{"kind":"text","text":"ios 17.0+"}]},{"tag":"@platform","content":[{"kind":"text","text":"tvos 17.0+"}]},{"tag":"@see","content":[{"kind":"text","text":"Official [SwiftUI documentation](https://developer.apple.com/documentation/SwiftUI/View/symbolEffect(_:options:value:))."}]},{"tag":"@example","content":[{"kind":"code","text":"```tsx\nconst trigger = useNativeState(0);\n\n```"}]}]},"parameters":[{"name":"effect","variant":"param","kind":32768,"type":{"type":"reference","name":"SymbolEffect","package":"@expo/ui"}},{"name":"args","variant":"param","kind":32768,"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"children":[{"name":"isActive","variant":"declaration","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Indefinite effects: runs while "},{"kind":"code","text":"`state.value === true`"},{"kind":"text","text":". Default active when omitted."}]},"type":{"type":"reference","typeArguments":[{"type":"intrinsic","name":"boolean"}],"name":"ObservableState","package":"@expo/ui"}},{"name":"options","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"reference","name":"SymbolEffectOptions","package":"@expo/ui"}},{"name":"value","variant":"declaration","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Discrete effects: the effect fires once each time this value changes."}]},"type":{"type":"reference","typeArguments":[{"type":"reference","name":"DiscreteSymbolEffectValue","package":"@expo/ui"}],"name":"ObservableState","package":"@expo/ui"}}]}},"defaultValue":"{}"}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"tabViewStyle","variant":"declaration","kind":64,"signatures":[{"name":"tabViewStyle","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Sets the style for a "},{"kind":"code","text":"`TabView`"},{"kind":"text","text":"."}],"blockTags":[{"tag":"@see","content":[{"kind":"text","text":"Official [SwiftUI documentation](https://developer.apple.com/documentation/swiftui/view/tabviewstyle(_:))."}]}]},"parameters":[{"name":"config","variant":"param","kind":32768,"type":{"type":"reference","name":"TabViewStyleConfig","package":"@expo/ui"}}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"tag","variant":"declaration","kind":64,"signatures":[{"name":"tag","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Sets a tag on a view."}],"blockTags":[{"tag":"@see","content":[{"kind":"text","text":"Official [SwiftUI documentation](https://developer.apple.com/documentation/swiftui/view/tag(_:includeoptional:))."}]}]},"parameters":[{"name":"tag","variant":"param","kind":32768,"comment":{"summary":[{"kind":"text","text":"The tag to set on the view."}]},"type":{"type":"union","types":[{"type":"intrinsic","name":"string"},{"type":"intrinsic","name":"number"}]}}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"textCase","variant":"declaration","kind":64,"signatures":[{"name":"textCase","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Sets a transform for the case of the text contained in this view when displayed."}],"blockTags":[{"tag":"@default","content":[{"kind":"text","text":"\"lowercase\""}]},{"tag":"@see","content":[{"kind":"text","text":"Official [SwiftUI documentation](https://developer.apple.com/documentation/swiftui/view/textcase(_:))."}]}]},"parameters":[{"name":"value","variant":"param","kind":32768,"type":{"type":"union","types":[{"type":"literal","value":"lowercase"},{"type":"literal","value":"uppercase"}]}}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"textContentType","variant":"declaration","kind":64,"signatures":[{"name":"textContentType","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Sets the text content type for input text, which the system uses to offer\nsuggestions (like autofill) while the user enters text."}],"blockTags":[{"tag":"@platform","content":[{"kind":"text","text":"ios 13.0+"}]},{"tag":"@see","content":[{"kind":"text","text":"Official [SwiftUI documentation](https://developer.apple.com/documentation/swiftui/view/textcontenttype(_:)-ufdv)."}]}]},"parameters":[{"name":"textContentType","variant":"param","kind":32768,"comment":{"summary":[{"kind":"text","text":"The semantic meaning of the text input area."}]},"type":{"type":"union","types":[{"type":"literal","value":"URL"},{"type":"literal","value":"namePrefix"},{"type":"literal","value":"name"},{"type":"literal","value":"nameSuffix"},{"type":"literal","value":"givenName"},{"type":"literal","value":"middleName"},{"type":"literal","value":"familyName"},{"type":"literal","value":"nickname"},{"type":"literal","value":"organizationName"},{"type":"literal","value":"jobTitle"},{"type":"literal","value":"location"},{"type":"literal","value":"fullStreetAddress"},{"type":"literal","value":"streetAddressLine1"},{"type":"literal","value":"streetAddressLine2"},{"type":"literal","value":"addressCity"},{"type":"literal","value":"addressCityAndState"},{"type":"literal","value":"addressState"},{"type":"literal","value":"postalCode"},{"type":"literal","value":"sublocality"},{"type":"literal","value":"countryName"},{"type":"literal","value":"username"},{"type":"literal","value":"password"},{"type":"literal","value":"newPassword"},{"type":"literal","value":"oneTimeCode"},{"type":"literal","value":"emailAddress"},{"type":"literal","value":"telephoneNumber"},{"type":"literal","value":"cellularEID"},{"type":"literal","value":"cellularIMEI"},{"type":"literal","value":"creditCardNumber"},{"type":"literal","value":"creditCardExpiration"},{"type":"literal","value":"creditCardExpirationMonth"},{"type":"literal","value":"creditCardExpirationYear"},{"type":"literal","value":"creditCardSecurityCode"},{"type":"literal","value":"creditCardType"},{"type":"literal","value":"creditCardName"},{"type":"literal","value":"creditCardGivenName"},{"type":"literal","value":"creditCardMiddleName"},{"type":"literal","value":"creditCardFamilyName"},{"type":"literal","value":"birthdate"},{"type":"literal","value":"birthdateDay"},{"type":"literal","value":"birthdateMonth"},{"type":"literal","value":"birthdateYear"},{"type":"literal","value":"dateTime"},{"type":"literal","value":"flightNumber"},{"type":"literal","value":"shipmentTrackingNumber"}]}}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"textFieldStyle","variant":"declaration","kind":64,"signatures":[{"name":"textFieldStyle","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Sets the text field style for text field views."}],"blockTags":[{"tag":"@see","content":[{"kind":"text","text":"Official [SwiftUI documentation](https://developer.apple.com/documentation/swiftui/view/textfieldstyle(_:))."}]}]},"parameters":[{"name":"style","variant":"param","kind":32768,"comment":{"summary":[{"kind":"text","text":"The text field style."}]},"type":{"type":"union","types":[{"type":"literal","value":"automatic"},{"type":"literal","value":"plain"},{"type":"literal","value":"roundedBorder"}]}}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"textInputAutocapitalization","variant":"declaration","kind":64,"signatures":[{"name":"textInputAutocapitalization","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Sets how often the shift key in the keyboard is automatically enabled."}],"blockTags":[{"tag":"@platform","content":[{"kind":"text","text":"ios 15.0+"}]},{"tag":"@see","content":[{"kind":"text","text":"Official [SwiftUI documentation](https://developer.apple.com/documentation/swiftui/view/textinputautocapitalization(_:))."}]}]},"parameters":[{"name":"autocapitalization","variant":"param","kind":32768,"comment":{"summary":[{"kind":"text","text":"The autocapitalization behavior."}]},"type":{"type":"union","types":[{"type":"literal","value":"never"},{"type":"literal","value":"words"},{"type":"literal","value":"sentences"},{"type":"literal","value":"characters"}]}}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"textSelection","variant":"declaration","kind":64,"signatures":[{"name":"textSelection","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Controls whether people can select text within this view."}],"blockTags":[{"tag":"@see","content":[{"kind":"text","text":"Official [SwiftUI documentation](https://developer.apple.com/documentation/swiftui/view/textselection(_:))."}]}]},"parameters":[{"name":"value","variant":"param","kind":32768,"comment":{"summary":[{"kind":"text","text":"Enable selection"}]},"type":{"type":"intrinsic","name":"boolean"}}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"tint","variant":"declaration","kind":64,"signatures":[{"name":"tint","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Sets the tint color of a view."}],"blockTags":[{"tag":"@see","content":[{"kind":"text","text":"Official [SwiftUI documentation](https://developer.apple.com/documentation/swiftui/view/tint(_:))."}]}]},"parameters":[{"name":"color","variant":"param","kind":32768,"comment":{"summary":[{"kind":"text","text":"The tint color (hex string). For example, "},{"kind":"code","text":"`#FF0000`"},{"kind":"text","text":"."}]},"type":{"type":"reference","name":"Color","package":"@expo/ui"}}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"toggleStyle","variant":"declaration","kind":64,"signatures":[{"name":"toggleStyle","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Sets the style for toggles within this view."}],"blockTags":[{"tag":"@see","content":[{"kind":"text","text":"Official [SwiftUI documentation](https://developer.apple.com/documentation/swiftui/view/togglestyle(_:))."}]}]},"parameters":[{"name":"style","variant":"param","kind":32768,"comment":{"summary":[{"kind":"text","text":"The toggle style."}]},"type":{"type":"union","types":[{"type":"literal","value":"automatic"},{"type":"literal","value":"switch"},{"type":"literal","value":"button"}]}}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"truncationMode","variant":"declaration","kind":64,"signatures":[{"name":"truncationMode","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Sets the truncation mode for lines of text that are too long to fit in the available space."}],"blockTags":[{"tag":"@see","content":[{"kind":"text","text":"Official [SwiftUI documentation](https://developer.apple.com/documentation/swiftui/view/truncationmode(_:))."}]}]},"parameters":[{"name":"mode","variant":"param","kind":32768,"comment":{"summary":[{"kind":"text","text":"The truncation mode that specifies where to truncate the text within the text view, if needed.\nYou can truncate at the beginning, middle, or end of the text view."}]},"type":{"type":"union","types":[{"type":"literal","value":"head"},{"type":"literal","value":"middle"},{"type":"literal","value":"tail"}]}}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"underline","variant":"declaration","kind":64,"signatures":[{"name":"underline","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Applies an underline to the text."}],"blockTags":[{"tag":"@see","content":[{"kind":"text","text":"Official [SwiftUI documentation](https://developer.apple.com/documentation/swiftui/view/underline(_:pattern:color:))."}]}]},"parameters":[{"name":"params","variant":"param","kind":32768,"comment":{"summary":[{"kind":"text","text":"Controls whether the underline is visible ("},{"kind":"code","text":"`true`"},{"kind":"text","text":" to show, "},{"kind":"code","text":"`false`"},{"kind":"text","text":" to hide)."}]},"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"children":[{"name":"color","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"reference","name":"Color","package":"@expo/ui"}},{"name":"isActive","variant":"declaration","kind":1024,"type":{"type":"intrinsic","name":"boolean"}},{"name":"pattern","variant":"declaration","kind":1024,"type":{"type":"reference","target":{"packageName":"@expo/ui","packagePath":"src/swift-ui/modifiers/index.ts","qualifiedName":"LinePattern"},"name":"LinePattern","package":"@expo/ui"}}]}}}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"widgetAccentedRenderingMode","variant":"declaration","kind":64,"signatures":[{"name":"widgetAccentedRenderingMode","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Specifies the how to render an Image when using the WidgetKit/WidgetRenderingMode/accented mode."}],"blockTags":[{"tag":"@see","content":[{"kind":"text","text":"Official [SwiftUI documentation](https://developer.apple.com/documentation/swiftui/image/widgetaccentedrenderingmode(_:))."}]}]},"parameters":[{"name":"renderingMode","variant":"param","kind":32768,"comment":{"summary":[{"kind":"text","text":"A constant describing how the Image should be rendered."}]},"type":{"type":"union","types":[{"type":"literal","value":"fullColor"},{"type":"literal","value":"accented"},{"type":"literal","value":"desaturated"},{"type":"literal","value":"accentedDesaturated"}]}}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"widgetURL","variant":"declaration","kind":64,"signatures":[{"name":"widgetURL","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Sets the URL to open in the containing app when the user clicks the widget.\nWidgets support one widgetURL modifier in their view hierarchy. If multiple views have widgetURL modifiers, the behavior is undefined."}],"blockTags":[{"tag":"@see","content":[{"kind":"text","text":"Official [SwiftUI documentation](https://developer.apple.com/documentation/SwiftUI/View/widgetURL(_:))."}]}]},"parameters":[{"name":"url","variant":"param","kind":32768,"comment":{"summary":[{"kind":"text","text":"The URL to open in the containing app."}]},"type":{"type":"intrinsic","name":"string"}}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"zIndex","variant":"declaration","kind":64,"signatures":[{"name":"zIndex","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Sets the z-index (display order) of a view."}],"blockTags":[{"tag":"@see","content":[{"kind":"text","text":"Official [SwiftUI documentation](https://developer.apple.com/documentation/swiftui/view/zindex(_:))."}]}]},"parameters":[{"name":"index","variant":"param","kind":32768,"comment":{"summary":[{"kind":"text","text":"The z-index value."}]},"type":{"type":"intrinsic","name":"number"}}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]}],"packageName":"@expo/ui"} \ No newline at end of file +{"schemaVersion":"2.0","name":"expo-ui/swift-ui/modifiers","variant":"project","kind":1,"children":[{"name":"ModifierConfig","variant":"declaration","kind":256,"comment":{"summary":[{"kind":"text","text":"Base interface for all view modifiers.\nAll modifiers must have a type field and can include arbitrary parameters."}]},"children":[{"name":"$type","variant":"declaration","kind":1024,"type":{"type":"intrinsic","name":"string"}},{"name":"eventListener","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"signatures":[{"name":"__type","variant":"signature","kind":4096,"parameters":[{"name":"args","variant":"param","kind":32768,"type":{"type":"intrinsic","name":"any"}}],"type":{"type":"intrinsic","name":"void"}}]}}}],"indexSignatures":[{"name":"__index","variant":"signature","kind":8192,"parameters":[{"name":"key","variant":"param","kind":32768,"type":{"type":"intrinsic","name":"string"}}],"type":{"type":"intrinsic","name":"any"}}]},{"name":"ChainableAnimationType","variant":"declaration","kind":2097152,"children":[{"name":"[VALUE_SYMBOL]","variant":"declaration","kind":1024,"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"signatures":[{"name":"__type","variant":"signature","kind":4096,"type":{"type":"reference","target":{"packageName":"@expo/ui","packagePath":"src/swift-ui/modifiers/animation/types.ts","qualifiedName":"AnimationObject"},"name":"AnimationObject","package":"@expo/ui"}}]}}},{"name":"delay","variant":"declaration","kind":1024,"comment":{"summary":[{"kind":"text","text":"Adds a delay before the animation starts (in seconds)."}]},"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"signatures":[{"name":"__type","variant":"signature","kind":4096,"parameters":[{"name":"delay","variant":"param","kind":32768,"type":{"type":"intrinsic","name":"number"}}],"type":{"type":"reference","name":"ChainableAnimationType","package":"@expo/ui"}}]}}},{"name":"repeat","variant":"declaration","kind":1024,"comment":{"summary":[{"kind":"text","text":"Repeats the animation the given number of times."}]},"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"signatures":[{"name":"__type","variant":"signature","kind":4096,"parameters":[{"name":"params","variant":"param","kind":32768,"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"children":[{"name":"autoreverses","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"intrinsic","name":"boolean"}},{"name":"repeatCount","variant":"declaration","kind":1024,"type":{"type":"intrinsic","name":"number"}}]}}}],"type":{"type":"reference","name":"ChainableAnimationType","package":"@expo/ui"}}]}}}]},{"name":"Color","variant":"declaration","kind":2097152,"type":{"type":"union","types":[{"type":"intrinsic","name":"string"},{"type":"reference","target":{"packageName":"react-native","packagePath":"Libraries/StyleSheet/StyleSheet.d.ts","qualifiedName":"ColorValue"},"name":"ColorValue","package":"react-native"},{"type":"reference","target":{"packageName":"@expo/ui","packagePath":"src/swift-ui/modifiers/types.ts","qualifiedName":"NamedColor"},"name":"NamedColor","package":"@expo/ui"}]}},{"name":"ContainerBackgroundPlacement","variant":"declaration","kind":2097152,"type":{"type":"union","types":[{"type":"literal","value":"widget"},{"type":"literal","value":"navigation"},{"type":"literal","value":"navigationSplitView"}]}},{"name":"DatePickerStyleType","variant":"declaration","kind":2097152,"type":{"type":"union","types":[{"type":"literal","value":"automatic"},{"type":"literal","value":"compact"},{"type":"literal","value":"graphical"},{"type":"literal","value":"wheel"}]}},{"name":"DiscreteSymbolEffectValue","variant":"declaration","kind":2097152,"comment":{"summary":[{"kind":"text","text":"Equatable primitive accepted as a discrete effect trigger."}]},"type":{"type":"union","types":[{"type":"intrinsic","name":"number"},{"type":"intrinsic","name":"string"},{"type":"intrinsic","name":"boolean"}]}},{"name":"EnvironmentConfig","variant":"declaration","kind":2097152,"type":{"type":"union","types":[{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"children":[{"name":"key","variant":"declaration","kind":1024,"type":{"type":"literal","value":"editMode"}},{"name":"value","variant":"declaration","kind":1024,"type":{"type":"union","types":[{"type":"literal","value":"active"},{"type":"literal","value":"inactive"},{"type":"literal","value":"transient"}]}}]}},{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"children":[{"name":"key","variant":"declaration","kind":1024,"type":{"type":"literal","value":"colorScheme"}},{"name":"value","variant":"declaration","kind":1024,"type":{"type":"union","types":[{"type":"literal","value":"light"},{"type":"literal","value":"dark"}]}}]}},{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"children":[{"name":"key","variant":"declaration","kind":1024,"type":{"type":"literal","value":"locale"}},{"name":"value","variant":"declaration","kind":1024,"type":{"type":"intrinsic","name":"string"}}]}},{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"children":[{"name":"key","variant":"declaration","kind":1024,"type":{"type":"literal","value":"timeZone"}},{"name":"value","variant":"declaration","kind":1024,"type":{"type":"intrinsic","name":"string"}}]}}]}},{"name":"GaugeStyleType","variant":"declaration","kind":2097152,"type":{"type":"union","types":[{"type":"literal","value":"automatic"},{"type":"literal","value":"circular"},{"type":"literal","value":"circularCapacity"},{"type":"literal","value":"linear"},{"type":"literal","value":"linearCapacity"}]}},{"name":"GlobalEvent","variant":"declaration","kind":2097152,"children":[{"name":"onGlobalEvent","variant":"declaration","kind":1024,"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"signatures":[{"name":"__type","variant":"signature","kind":4096,"parameters":[{"name":"event","variant":"param","kind":32768,"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"children":[{"name":"nativeEvent","variant":"declaration","kind":1024,"type":{"type":"reference","name":"GlobalEventPayload","package":"@expo/ui"}}]}}}],"type":{"type":"intrinsic","name":"void"}}]}}}]},{"name":"GlobalEventPayload","variant":"declaration","kind":2097152,"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"indexSignatures":[{"name":"__index","variant":"signature","kind":8192,"parameters":[{"name":"eventName","variant":"param","kind":32768,"type":{"type":"intrinsic","name":"string"}}],"type":{"type":"reference","target":{"packageName":"typescript","packagePath":"lib/lib.es5.d.ts","qualifiedName":"Record"},"typeArguments":[{"type":"intrinsic","name":"string"},{"type":"intrinsic","name":"any"}],"name":"Record","package":"typescript"}}]}}},{"name":"IndexViewStyleConfig","variant":"declaration","kind":2097152,"comment":{"summary":[{"kind":"text","text":"Configuration for the "},{"kind":"code","text":"`indexViewStyle`"},{"kind":"text","text":" modifier."}]},"children":[{"name":"backgroundDisplayMode","variant":"declaration","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Translucent background behind the page indicator dots. Useful when the\ndots sit on top of dark or busy content."}],"blockTags":[{"tag":"@default","content":[{"kind":"text","text":"'automatic'"}]}]},"type":{"type":"reference","name":"PageIndexBackgroundDisplayMode","package":"@expo/ui"}}]},{"name":"InterpolatingSpringAnimationParams","variant":"declaration","kind":2097152,"children":[{"name":"bounce","variant":"declaration","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Extra bounce to apply to the spring animation."}]},"type":{"type":"intrinsic","name":"number"}},{"name":"damping","variant":"declaration","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"The damping applied to the spring."}]},"type":{"type":"intrinsic","name":"number"}},{"name":"duration","variant":"declaration","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Total animation duration (in seconds)."}]},"type":{"type":"intrinsic","name":"number"}},{"name":"initialVelocity","variant":"declaration","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"The initial velocity of the animation."}]},"type":{"type":"intrinsic","name":"number"}},{"name":"mass","variant":"declaration","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"The mass attached to the spring."}]},"type":{"type":"intrinsic","name":"number"}},{"name":"stiffness","variant":"declaration","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"The stiffness of the spring."}]},"type":{"type":"intrinsic","name":"number"}}]},{"name":"ListStyle","variant":"declaration","kind":2097152,"type":{"type":"union","types":[{"type":"literal","value":"automatic"},{"type":"literal","value":"plain"},{"type":"literal","value":"inset"},{"type":"literal","value":"insetGrouped"},{"type":"literal","value":"grouped"},{"type":"literal","value":"sidebar"}]}},{"name":"ObservableState","variant":"declaration","kind":2097152,"comment":{"summary":[{"kind":"text","text":"Observable state shared between JavaScript and native views (Jetpack Compose\non Android and SwiftUI on iOS)."}]},"typeParameters":[{"name":"T","variant":"typeParam","kind":131072}],"type":{"type":"intersection","types":[{"type":"reference","target":{"packageName":"expo-modules-core","packagePath":"src/SharedObject.ts","qualifiedName":"SharedObject"},"name":"SharedObject","package":"expo-modules-core"},{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"children":[{"name":"onChange","variant":"declaration","kind":1024,"comment":{"summary":[{"kind":"text","text":"A single listener invoked on the native UI runtime whenever the value changes\n(after iOS "},{"kind":"code","text":"`didSet`"},{"kind":"text","text":" and Android's setter). Assigning replaces the previous\nlistener; assign "},{"kind":"code","text":"`null`"},{"kind":"text","text":" to clear. The initial value does not fire "},{"kind":"code","text":"`onChange`"},{"kind":"text","text":".\n\nThe callback must be a worklet so it can run synchronously on the UI thread.\nAttach it inside "},{"kind":"code","text":"`useEffect`"},{"kind":"text","text":" and clear it in the cleanup so the listener\nlifecycle matches the component lifecycle."}],"blockTags":[{"tag":"@example","content":[{"kind":"code","text":"```tsx\nconst state = useNativeState(0);\n\nuseEffect(() => {\n state.onChange = (value) => {\n 'worklet';\n console.log('changed to', value);\n };\n return () => {\n state.onChange = null;\n };\n}, []);\n```"}]}]},"type":{"type":"union","types":[{"type":"indexedAccess","indexType":{"type":"literal","value":"listener"},"objectType":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"children":[{"name":"listener","variant":"declaration","kind":2048,"signatures":[{"name":"listener","variant":"signature","kind":4096,"parameters":[{"name":"value","variant":"param","kind":32768,"type":{"type":"reference","name":"T","package":"@expo/ui","refersToTypeParameter":true}}],"type":{"type":"intrinsic","name":"void"}}]}]}}},{"type":"literal","value":null}]}},{"name":"value","variant":"declaration","kind":1024,"comment":{"summary":[{"kind":"text","text":"The current value.\n\nWrites from a UI worklet are synchronous and immediately readable. Writes\nfrom the JS thread are scheduled to the UI thread asynchronously, the new value is not readable until the update has been\napplied. Prefer writing from a worklet when you need synchronous updates"}]},"type":{"type":"reference","name":"T","package":"@expo/ui","refersToTypeParameter":true}}]}}]}},{"name":"PageIndexBackgroundDisplayMode","variant":"declaration","kind":2097152,"type":{"type":"union","types":[{"type":"literal","value":"automatic"},{"type":"literal","value":"always"},{"type":"literal","value":"never"},{"type":"literal","value":"interactive"}]}},{"name":"PageIndexDisplayMode","variant":"declaration","kind":2097152,"type":{"type":"union","types":[{"type":"literal","value":"automatic"},{"type":"literal","value":"always"},{"type":"literal","value":"never"}]}},{"name":"PickerStyleType","variant":"declaration","kind":2097152,"type":{"type":"union","types":[{"type":"literal","value":"automatic"},{"type":"literal","value":"inline"},{"type":"literal","value":"menu"},{"type":"literal","value":"navigationLink"},{"type":"literal","value":"palette"},{"type":"literal","value":"segmented"},{"type":"literal","value":"wheel"}]}},{"name":"PresentationBackgroundInteractionType","variant":"declaration","kind":2097152,"comment":{"summary":[{"kind":"text","text":"Presentation background interaction type."}]},"type":{"type":"union","types":[{"type":"literal","value":"automatic"},{"type":"literal","value":"enabled"},{"type":"literal","value":"disabled"},{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"children":[{"name":"detent","variant":"declaration","kind":1024,"type":{"type":"reference","name":"PresentationDetent","package":"@expo/ui"}},{"name":"type","variant":"declaration","kind":1024,"type":{"type":"literal","value":"enabledUpThrough"}}]}}]}},{"name":"PresentationDetent","variant":"declaration","kind":2097152,"comment":{"summary":[{"kind":"text","text":"Presentation detent type for controlling sheet heights.\n- "},{"kind":"code","text":"`'medium'`"},{"kind":"text","text":": System medium height (approximately half screen)\n- "},{"kind":"code","text":"`'large'`"},{"kind":"text","text":": System large height (full screen)\n- "},{"kind":"code","text":"`{ fraction: number }`"},{"kind":"text","text":": Fraction of screen height (0-1, for example, 0.4 equals to 40% of screen)\n- "},{"kind":"code","text":"`{ height: number }`"},{"kind":"text","text":": Fixed height in points"}]},"type":{"type":"union","types":[{"type":"literal","value":"medium"},{"type":"literal","value":"large"},{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"children":[{"name":"fraction","variant":"declaration","kind":1024,"type":{"type":"intrinsic","name":"number"}}]}},{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"children":[{"name":"height","variant":"declaration","kind":1024,"type":{"type":"intrinsic","name":"number"}}]}}]}},{"name":"ProgressViewStyleType","variant":"declaration","kind":2097152,"type":{"type":"union","types":[{"type":"literal","value":"automatic"},{"type":"literal","value":"linear"},{"type":"literal","value":"circular"}]}},{"name":"Shape","variant":"declaration","kind":2097152,"type":{"type":"union","types":[{"type":"reference","target":{"packageName":"typescript","packagePath":"lib/lib.es5.d.ts","qualifiedName":"ReturnType"},"typeArguments":[{"type":"query","queryType":{"type":"reference","name":"shapes.roundedRectangle","package":"@expo/ui","qualifiedName":"__object.roundedRectangle"}}],"name":"ReturnType","package":"typescript"},{"type":"reference","target":{"packageName":"typescript","packagePath":"lib/lib.es5.d.ts","qualifiedName":"ReturnType"},"typeArguments":[{"type":"query","queryType":{"type":"reference","name":"shapes.capsule","package":"@expo/ui","qualifiedName":"__object.capsule"}}],"name":"ReturnType","package":"typescript"},{"type":"reference","target":{"packageName":"typescript","packagePath":"lib/lib.es5.d.ts","qualifiedName":"ReturnType"},"typeArguments":[{"type":"query","queryType":{"type":"reference","name":"shapes.rectangle","package":"@expo/ui","qualifiedName":"__object.rectangle"}}],"name":"ReturnType","package":"typescript"},{"type":"reference","target":{"packageName":"typescript","packagePath":"lib/lib.es5.d.ts","qualifiedName":"ReturnType"},"typeArguments":[{"type":"query","queryType":{"type":"reference","name":"shapes.ellipse","package":"@expo/ui","qualifiedName":"__object.ellipse"}}],"name":"ReturnType","package":"typescript"},{"type":"reference","target":{"packageName":"typescript","packagePath":"lib/lib.es5.d.ts","qualifiedName":"ReturnType"},"typeArguments":[{"type":"query","queryType":{"type":"reference","name":"shapes.circle","package":"@expo/ui","qualifiedName":"__object.circle"}}],"name":"ReturnType","package":"typescript"},{"type":"reference","target":{"packageName":"typescript","packagePath":"lib/lib.es5.d.ts","qualifiedName":"ReturnType"},"typeArguments":[{"type":"query","queryType":{"type":"reference","name":"shapes.containerRelativeShape","package":"@expo/ui","qualifiedName":"__object.containerRelativeShape"}}],"name":"ReturnType","package":"typescript"}]}},{"name":"SpringAnimationParams","variant":"declaration","kind":2097152,"children":[{"name":"blendDuration","variant":"declaration","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"The duration over which to blend between animations (in seconds)."}]},"type":{"type":"intrinsic","name":"number"}},{"name":"bounce","variant":"declaration","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Extra bounce to apply to the spring animation."}]},"type":{"type":"intrinsic","name":"number"}},{"name":"dampingFraction","variant":"declaration","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"The amount of damping applied to the spring's motion."}]},"type":{"type":"intrinsic","name":"number"}},{"name":"duration","variant":"declaration","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Total animation duration (in seconds)."}]},"type":{"type":"intrinsic","name":"number"}},{"name":"response","variant":"declaration","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"The spring's response time (in seconds)."}]},"type":{"type":"intrinsic","name":"number"}}]},{"name":"SymbolEffect","variant":"declaration","kind":2097152,"type":{"type":"union","types":[{"type":"reference","target":{"packageName":"@expo/ui","packagePath":"src/swift-ui/modifiers/symbolEffect.ts","qualifiedName":"AppearSymbolEffect"},"name":"AppearSymbolEffect","package":"@expo/ui"},{"type":"reference","target":{"packageName":"@expo/ui","packagePath":"src/swift-ui/modifiers/symbolEffect.ts","qualifiedName":"BounceSymbolEffect"},"name":"BounceSymbolEffect","package":"@expo/ui"},{"type":"reference","target":{"packageName":"@expo/ui","packagePath":"src/swift-ui/modifiers/symbolEffect.ts","qualifiedName":"BreatheSymbolEffect"},"name":"BreatheSymbolEffect","package":"@expo/ui"},{"type":"reference","target":{"packageName":"@expo/ui","packagePath":"src/swift-ui/modifiers/symbolEffect.ts","qualifiedName":"DisappearSymbolEffect"},"name":"DisappearSymbolEffect","package":"@expo/ui"},{"type":"reference","target":{"packageName":"@expo/ui","packagePath":"src/swift-ui/modifiers/symbolEffect.ts","qualifiedName":"DrawOffSymbolEffect"},"name":"DrawOffSymbolEffect","package":"@expo/ui"},{"type":"reference","target":{"packageName":"@expo/ui","packagePath":"src/swift-ui/modifiers/symbolEffect.ts","qualifiedName":"DrawOnSymbolEffect"},"name":"DrawOnSymbolEffect","package":"@expo/ui"},{"type":"reference","target":{"packageName":"@expo/ui","packagePath":"src/swift-ui/modifiers/symbolEffect.ts","qualifiedName":"PulseSymbolEffect"},"name":"PulseSymbolEffect","package":"@expo/ui"},{"type":"reference","target":{"packageName":"@expo/ui","packagePath":"src/swift-ui/modifiers/symbolEffect.ts","qualifiedName":"RotateSymbolEffect"},"name":"RotateSymbolEffect","package":"@expo/ui"},{"type":"reference","target":{"packageName":"@expo/ui","packagePath":"src/swift-ui/modifiers/symbolEffect.ts","qualifiedName":"ScaleSymbolEffect"},"name":"ScaleSymbolEffect","package":"@expo/ui"},{"type":"reference","target":{"packageName":"@expo/ui","packagePath":"src/swift-ui/modifiers/symbolEffect.ts","qualifiedName":"VariableColorSymbolEffect"},"name":"VariableColorSymbolEffect","package":"@expo/ui"},{"type":"reference","target":{"packageName":"@expo/ui","packagePath":"src/swift-ui/modifiers/symbolEffect.ts","qualifiedName":"WiggleSymbolEffect"},"name":"WiggleSymbolEffect","package":"@expo/ui"}]}},{"name":"SymbolEffectOptions","variant":"declaration","kind":2097152,"comment":{"summary":[{"kind":"text","text":"Animation options for a symbol effect."}],"blockTags":[{"tag":"@see","content":[{"kind":"text","text":"Official [Apple documentation](https://developer.apple.com/documentation/symbols/symboleffectoptions)."}]}]},"children":[{"name":"repeat","variant":"declaration","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"How the effect repeats. Omit for the effect's natural cadence.\n- "},{"kind":"code","text":"`'nonRepeating'`"},{"kind":"text","text":" — play exactly once.\n- "},{"kind":"code","text":"`'continuous'`"},{"kind":"text","text":" — smooth, indefinite repetition (iOS 18+).\n- "},{"kind":"code","text":"`{ count?, delay? }`"},{"kind":"text","text":" — periodic repetition with optional count and delay in seconds (iOS 18+)."}]},"type":{"type":"union","types":[{"type":"literal","value":"continuous"},{"type":"literal","value":"nonRepeating"},{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"children":[{"name":"count","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"intrinsic","name":"number"}},{"name":"delay","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"intrinsic","name":"number"}}]}}]}},{"name":"speed","variant":"declaration","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Animation speed multiplier (1.0 = default)."}]},"type":{"type":"intrinsic","name":"number"}}]},{"name":"TabViewStyleConfig","variant":"declaration","kind":2097152,"comment":{"summary":[{"kind":"text","text":"Configuration for the "},{"kind":"code","text":"`tabViewStyle`"},{"kind":"text","text":" modifier.\n\n - "},{"kind":"code","text":"`'page'`"},{"kind":"text","text":" — swipeable horizontal pager with optional dot indicators.\n - "},{"kind":"code","text":"`'automatic'`"},{"kind":"text","text":" — SwiftUI's default tab-bar style.\n - "},{"kind":"code","text":"`'sidebarAdaptable'`"},{"kind":"text","text":" — iOS 18+. Sidebar on iPad/Mac, bottom bar on\n iPhone."}]},"type":{"type":"union","types":[{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"children":[{"name":"indexDisplayMode","variant":"declaration","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Visibility of the page indicator dots. Only meaningful for the page style."}],"blockTags":[{"tag":"@default","content":[{"kind":"text","text":"'automatic'"}]}]},"type":{"type":"reference","name":"PageIndexDisplayMode","package":"@expo/ui"}},{"name":"type","variant":"declaration","kind":1024,"type":{"type":"literal","value":"page"}}]}},{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"children":[{"name":"type","variant":"declaration","kind":1024,"type":{"type":"literal","value":"automatic"}}]}},{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"children":[{"name":"type","variant":"declaration","kind":1024,"type":{"type":"literal","value":"sidebarAdaptable"}}]}}]}},{"name":"TimingAnimationParams","variant":"declaration","kind":2097152,"children":[{"name":"duration","variant":"declaration","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Total animation duration (in seconds)."}]},"type":{"type":"intrinsic","name":"number"}}]},{"name":"UnitPointValue","variant":"declaration","kind":2097152,"type":{"type":"union","types":[{"type":"literal","value":"zero"},{"type":"literal","value":"topLeading"},{"type":"literal","value":"top"},{"type":"literal","value":"topTrailing"},{"type":"literal","value":"leading"},{"type":"literal","value":"center"},{"type":"literal","value":"trailing"},{"type":"literal","value":"bottomLeading"},{"type":"literal","value":"bottom"},{"type":"literal","value":"bottomTrailing"}]}},{"name":"Animation","variant":"declaration","kind":32,"flags":{"isConst":true},"comment":{"summary":[{"kind":"text","text":"Built-in animation presets for the "},{"kind":"code","text":"`animation`"},{"kind":"text","text":" modifier.\nPresets:\n- Timing presets ("},{"kind":"code","text":"`easeInOut`"},{"kind":"text","text":", "},{"kind":"code","text":"`easeIn`"},{"kind":"text","text":", "},{"kind":"code","text":"`easeOut`"},{"kind":"text","text":", "},{"kind":"code","text":"`linear`"},{"kind":"text","text":") accept\n["},{"kind":"code","text":"`TimingAnimationParams`"},{"kind":"text","text":"](#timinganimationparams).\n- "},{"kind":"code","text":"`spring`"},{"kind":"text","text":" accepts ["},{"kind":"code","text":"`SpringAnimationParams`"},{"kind":"text","text":"](#springanimationparams).\n- "},{"kind":"code","text":"`interpolatingSpring`"},{"kind":"text","text":" accepts\n["},{"kind":"code","text":"`InterpolatingSpringAnimationParams`"},{"kind":"text","text":"](#interpolatingspringanimationparams).\n- Chaining returns ["},{"kind":"code","text":"`ChainableAnimationType`"},{"kind":"text","text":"](#chainableanimationtype)."}],"blockTags":[{"tag":"@example","content":[{"kind":"code","text":"```tsx\nimport { Host, VStack } from '@expo/ui/swift-ui';\nimport { animation, Animation } from '@expo/ui/swift-ui/modifiers';\n\nfunction Example() {\n const [isExpanded, setIsExpanded] = useState(false);\n\n return (\n \n \n //...\n \n \n );\n}\n```"}]},{"tag":"@hideType","content":[]}]},"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"children":[{"name":"default","variant":"declaration","kind":1024,"type":{"type":"reference","name":"ChainableAnimationType","package":"@expo/ui"},"defaultValue":"..."},{"name":"easeIn","variant":"declaration","kind":1024,"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"signatures":[{"name":"__type","variant":"signature","kind":4096,"parameters":[{"name":"params","variant":"param","kind":32768,"flags":{"isOptional":true},"type":{"type":"reference","name":"TimingAnimationParams","package":"@expo/ui"}}],"type":{"type":"reference","name":"ChainableAnimationType","package":"@expo/ui"}}]}},"defaultValue":"..."},{"name":"easeInOut","variant":"declaration","kind":1024,"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"signatures":[{"name":"__type","variant":"signature","kind":4096,"parameters":[{"name":"params","variant":"param","kind":32768,"flags":{"isOptional":true},"type":{"type":"reference","name":"TimingAnimationParams","package":"@expo/ui"}}],"type":{"type":"reference","name":"ChainableAnimationType","package":"@expo/ui"}}]}},"defaultValue":"..."},{"name":"easeOut","variant":"declaration","kind":1024,"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"signatures":[{"name":"__type","variant":"signature","kind":4096,"parameters":[{"name":"params","variant":"param","kind":32768,"flags":{"isOptional":true},"type":{"type":"reference","name":"TimingAnimationParams","package":"@expo/ui"}}],"type":{"type":"reference","name":"ChainableAnimationType","package":"@expo/ui"}}]}},"defaultValue":"..."},{"name":"interpolatingSpring","variant":"declaration","kind":1024,"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"signatures":[{"name":"__type","variant":"signature","kind":4096,"parameters":[{"name":"params","variant":"param","kind":32768,"flags":{"isOptional":true},"type":{"type":"reference","name":"InterpolatingSpringAnimationParams","package":"@expo/ui"}}],"type":{"type":"reference","name":"ChainableAnimationType","package":"@expo/ui"}}]}},"defaultValue":"..."},{"name":"linear","variant":"declaration","kind":1024,"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"signatures":[{"name":"__type","variant":"signature","kind":4096,"parameters":[{"name":"params","variant":"param","kind":32768,"flags":{"isOptional":true},"type":{"type":"reference","name":"TimingAnimationParams","package":"@expo/ui"}}],"type":{"type":"reference","name":"ChainableAnimationType","package":"@expo/ui"}}]}},"defaultValue":"..."},{"name":"spring","variant":"declaration","kind":1024,"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"signatures":[{"name":"__type","variant":"signature","kind":4096,"parameters":[{"name":"params","variant":"param","kind":32768,"flags":{"isOptional":true},"type":{"type":"reference","name":"SpringAnimationParams","package":"@expo/ui"}}],"type":{"type":"reference","name":"ChainableAnimationType","package":"@expo/ui"}}]}},"defaultValue":"..."}]}},"defaultValue":"..."},{"name":"shapes","variant":"declaration","kind":32,"flags":{"isConst":true},"comment":{"summary":[{"kind":"text","text":"Shape builders for modifiers that accept shapes, such as "},{"kind":"code","text":"`background`"},{"kind":"text","text":" and "},{"kind":"code","text":"`containerShape`"},{"kind":"text","text":".\n\nShapes: "},{"kind":"code","text":"`roundedRectangle`"},{"kind":"text","text":", "},{"kind":"code","text":"`capsule`"},{"kind":"text","text":", "},{"kind":"code","text":"`rectangle`"},{"kind":"text","text":", "},{"kind":"code","text":"`ellipse`"},{"kind":"text","text":", "},{"kind":"code","text":"`circle`"},{"kind":"text","text":", "},{"kind":"code","text":"`containerRelativeShape`"},{"kind":"text","text":"."}],"blockTags":[{"tag":"@example","content":[{"kind":"code","text":"```tsx\nimport { background, shapes } from '@expo/ui/swift-ui/modifiers';\nimport { Text, Host } from '@expo/ui/swift-ui';\n\nfunction Example() {\n return (\n \n \n Hello, world!\n \n \n );\n}\n```"}]},{"tag":"@hideType","content":[]}]},"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"children":[{"name":"capsule","variant":"declaration","kind":1024,"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"signatures":[{"name":"__type","variant":"signature","kind":4096,"parameters":[{"name":"params","variant":"param","kind":32768,"flags":{"isOptional":true},"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"children":[{"name":"roundedCornerStyle","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"union","types":[{"type":"literal","value":"continuous"},{"type":"literal","value":"circular"}]}}]}}}],"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"children":[{"name":"roundedCornerStyle","variant":"declaration","kind":1024,"type":{"type":"union","types":[{"type":"literal","value":"continuous"},{"type":"literal","value":"circular"},{"type":"intrinsic","name":"undefined"}]},"defaultValue":"params.roundedCornerStyle"},{"name":"shape","variant":"declaration","kind":1024,"type":{"type":"intrinsic","name":"string"},"defaultValue":"'capsule'"}]}}}]}},"defaultValue":"..."},{"name":"circle","variant":"declaration","kind":1024,"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"signatures":[{"name":"__type","variant":"signature","kind":4096,"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"children":[{"name":"shape","variant":"declaration","kind":1024,"type":{"type":"intrinsic","name":"string"},"defaultValue":"'circle'"}]}}}]}},"defaultValue":"..."},{"name":"containerRelativeShape","variant":"declaration","kind":1024,"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"signatures":[{"name":"__type","variant":"signature","kind":4096,"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"children":[{"name":"shape","variant":"declaration","kind":1024,"type":{"type":"intrinsic","name":"string"},"defaultValue":"'containerRelativeShape'"}]}}}]}},"defaultValue":"..."},{"name":"ellipse","variant":"declaration","kind":1024,"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"signatures":[{"name":"__type","variant":"signature","kind":4096,"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"children":[{"name":"shape","variant":"declaration","kind":1024,"type":{"type":"intrinsic","name":"string"},"defaultValue":"'ellipse'"}]}}}]}},"defaultValue":"..."},{"name":"rectangle","variant":"declaration","kind":1024,"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"signatures":[{"name":"__type","variant":"signature","kind":4096,"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"children":[{"name":"shape","variant":"declaration","kind":1024,"type":{"type":"intrinsic","name":"string"},"defaultValue":"'rectangle'"}]}}}]}},"defaultValue":"..."},{"name":"roundedRectangle","variant":"declaration","kind":1024,"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"signatures":[{"name":"__type","variant":"signature","kind":4096,"parameters":[{"name":"params","variant":"param","kind":32768,"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"children":[{"name":"cornerRadius","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"intrinsic","name":"number"}},{"name":"cornerSize","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"children":[{"name":"height","variant":"declaration","kind":1024,"type":{"type":"intrinsic","name":"number"}},{"name":"width","variant":"declaration","kind":1024,"type":{"type":"intrinsic","name":"number"}}]}}},{"name":"roundedCornerStyle","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"union","types":[{"type":"literal","value":"continuous"},{"type":"literal","value":"circular"}]}}]}}}],"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"children":[{"name":"cornerRadius","variant":"declaration","kind":1024,"type":{"type":"union","types":[{"type":"intrinsic","name":"number"},{"type":"intrinsic","name":"undefined"}]},"defaultValue":"params.cornerRadius"},{"name":"cornerSize","variant":"declaration","kind":1024,"type":{"type":"union","types":[{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"children":[{"name":"height","variant":"declaration","kind":1024,"type":{"type":"intrinsic","name":"number"}},{"name":"width","variant":"declaration","kind":1024,"type":{"type":"intrinsic","name":"number"}}]}},{"type":"intrinsic","name":"undefined"}]},"defaultValue":"params.cornerSize"},{"name":"roundedCornerStyle","variant":"declaration","kind":1024,"type":{"type":"union","types":[{"type":"literal","value":"continuous"},{"type":"literal","value":"circular"},{"type":"intrinsic","name":"undefined"}]},"defaultValue":"params.roundedCornerStyle"},{"name":"shape","variant":"declaration","kind":1024,"type":{"type":"intrinsic","name":"string"},"defaultValue":"'roundedRectangle'"}]}}}]}},"defaultValue":"..."}]}},"defaultValue":"..."},{"name":"accessibilityHint","variant":"declaration","kind":64,"signatures":[{"name":"accessibilityHint","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Sets accessibility hint for the view."}],"blockTags":[{"tag":"@see","content":[{"kind":"text","text":"Official [SwiftUI documentation](https://developer.apple.com/documentation/swiftui/view/accessibilityhint(_:))."}]}]},"parameters":[{"name":"hint","variant":"param","kind":32768,"comment":{"summary":[{"kind":"text","text":"The accessibility hint."}]},"type":{"type":"intrinsic","name":"string"}}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"accessibilityLabel","variant":"declaration","kind":64,"signatures":[{"name":"accessibilityLabel","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Sets accessibility label for the view."}],"blockTags":[{"tag":"@see","content":[{"kind":"text","text":"Official [SwiftUI documentation](https://developer.apple.com/documentation/swiftui/view/accessibilitylabel(_:))."}]}]},"parameters":[{"name":"label","variant":"param","kind":32768,"comment":{"summary":[{"kind":"text","text":"The accessibility label."}]},"type":{"type":"intrinsic","name":"string"}}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"accessibilityValue","variant":"declaration","kind":64,"signatures":[{"name":"accessibilityValue","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Sets accessibility value for the view."}],"blockTags":[{"tag":"@see","content":[{"kind":"text","text":"Official [SwiftUI documentation](https://developer.apple.com/documentation/swiftui/view/accessibilityvalue(_:))."}]}]},"parameters":[{"name":"value","variant":"param","kind":32768,"comment":{"summary":[{"kind":"text","text":"The accessibility value."}]},"type":{"type":"intrinsic","name":"string"}}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"allowsTightening","variant":"declaration","kind":64,"signatures":[{"name":"allowsTightening","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Sets whether text in this view can compress the space between characters when necessary to fit text in a line"}],"blockTags":[{"tag":"@default","content":[{"kind":"text","text":"true"}]},{"tag":"@see","content":[{"kind":"text","text":"Official [SwiftUI documentation](https://developer.apple.com/documentation/swiftui/view/allowstightening(_:))."}]}]},"parameters":[{"name":"value","variant":"param","kind":32768,"type":{"type":"intrinsic","name":"boolean"}}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"animation","variant":"declaration","kind":64,"signatures":[{"name":"animation","variant":"signature","kind":4096,"parameters":[{"name":"animationObject","variant":"param","kind":32768,"type":{"type":"reference","name":"ChainableAnimationType","package":"@expo/ui"}},{"name":"animatedValue","variant":"param","kind":32768,"type":{"type":"union","types":[{"type":"intrinsic","name":"number"},{"type":"intrinsic","name":"boolean"}]}}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"aspectRatio","variant":"declaration","kind":64,"signatures":[{"name":"aspectRatio","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Sets aspect ratio constraint."}],"blockTags":[{"tag":"@see","content":[{"kind":"text","text":"Official [SwiftUI documentation](https://developer.apple.com/documentation/swiftui/view/aspectratio(_:contentmode:))."}]}]},"parameters":[{"name":"params","variant":"param","kind":32768,"comment":{"summary":[{"kind":"text","text":"Optional width/height aspect ratio and content mode."}]},"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"children":[{"name":"contentMode","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"union","types":[{"type":"literal","value":"fill"},{"type":"literal","value":"fit"}]}},{"name":"ratio","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"intrinsic","name":"number"}}]}}}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"autocorrectionDisabled","variant":"declaration","kind":64,"signatures":[{"name":"autocorrectionDisabled","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Disables autocorrection for text input views."}],"blockTags":[{"tag":"@see","content":[{"kind":"text","text":"Official [SwiftUI documentation](https://developer.apple.com/documentation/swiftui/view/autocorrectiondisabled(_:))."}]}]},"parameters":[{"name":"disabled","variant":"param","kind":32768,"comment":{"summary":[{"kind":"text","text":"Whether autocorrection is disabled. Defaults to "},{"kind":"code","text":"`true`"},{"kind":"text","text":"."}]},"type":{"type":"intrinsic","name":"boolean"},"defaultValue":"true"}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"background","variant":"declaration","kind":64,"signatures":[{"name":"background","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Sets the background of a view."}],"blockTags":[{"tag":"@see","content":[{"kind":"text","text":"Official [SwiftUI documentation](https://developer.apple.com/documentation/SwiftUI/View/background(_:alignment:))."}]}]},"parameters":[{"name":"color","variant":"param","kind":32768,"comment":{"summary":[{"kind":"text","text":"The background color (hex string). For example, "},{"kind":"code","text":"`#FF0000`"},{"kind":"text","text":"."}]},"type":{"type":"reference","name":"Color","package":"@expo/ui"}},{"name":"shape","variant":"param","kind":32768,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Optional shape to clip the background. If not provided, the background will fill the entire view."}]},"type":{"type":"reference","name":"Shape","package":"@expo/ui"}}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"backgroundOverlay","variant":"declaration","kind":64,"signatures":[{"name":"backgroundOverlay","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Adds a background behind the view."}]},"parameters":[{"name":"params","variant":"param","kind":32768,"comment":{"summary":[{"kind":"text","text":"Background color and alignment."}]},"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"children":[{"name":"alignment","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"union","types":[{"type":"literal","value":"center"},{"type":"literal","value":"top"},{"type":"literal","value":"bottom"},{"type":"literal","value":"leading"},{"type":"literal","value":"trailing"}]}},{"name":"color","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"reference","name":"Color","package":"@expo/ui"}}]}}}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"badge","variant":"declaration","kind":64,"signatures":[{"name":"badge","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Generates a badge for the view from a localized string key."}],"blockTags":[{"tag":"@see","content":[{"kind":"text","text":"Official [SwiftUI documentation](https://developer.apple.com/documentation/swiftui/view/badge(_:))."}]}]},"parameters":[{"name":"value","variant":"param","kind":32768,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Text view to display as a badge. Set the value to nil to hide the badge."}]},"type":{"type":"intrinsic","name":"string"}}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"badgeProminence","variant":"declaration","kind":64,"signatures":[{"name":"badgeProminence","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"The prominence to apply to badges associated with this environment."}],"blockTags":[{"tag":"@see","content":[{"kind":"text","text":"Official [SwiftUI documentation](https://developer.apple.com/documentation/swiftui/view/badgeprominence(_:))."}]}]},"parameters":[{"name":"badgeType","variant":"param","kind":32768,"comment":{"summary":[{"kind":"text","text":"Select the type of badge"}]},"type":{"type":"union","types":[{"type":"literal","value":"standard"},{"type":"literal","value":"increased"},{"type":"literal","value":"decreased"}]}}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"blur","variant":"declaration","kind":64,"signatures":[{"name":"blur","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Applies blur to a view."}],"blockTags":[{"tag":"@see","content":[{"kind":"text","text":"Official [SwiftUI documentation](https://developer.apple.com/documentation/swiftui/view/blur(radius:opaque:))."}]}]},"parameters":[{"name":"radius","variant":"param","kind":32768,"comment":{"summary":[{"kind":"text","text":"The blur radius."}]},"type":{"type":"intrinsic","name":"number"}}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"bold","variant":"declaration","kind":64,"signatures":[{"name":"bold","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Makes text bold.\nWhen applied to "},{"kind":"code","text":"`Text`"},{"kind":"text","text":", it works on all iOS/tvOS versions. When used on regular views, it requires iOS 16.0+/tvOS 16.0+."}],"blockTags":[{"tag":"@see","content":[{"kind":"text","text":"Official [SwiftUI documentation](https://developer.apple.com/documentation/swiftui/text/bold())."}]}]},"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"border","variant":"declaration","kind":64,"signatures":[{"name":"border","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Adds a border to a view."}],"blockTags":[{"tag":"@see","content":[{"kind":"text","text":"Official [SwiftUI documentation](https://developer.apple.com/documentation/swiftui/view/border(_:width:))."}]}]},"parameters":[{"name":"params","variant":"param","kind":32768,"comment":{"summary":[{"kind":"text","text":"The border parameters. Color and width."}]},"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"children":[{"name":"color","variant":"declaration","kind":1024,"type":{"type":"reference","name":"Color","package":"@expo/ui"}},{"name":"width","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"intrinsic","name":"number"}}]}}}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"brightness","variant":"declaration","kind":64,"signatures":[{"name":"brightness","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Adjusts the brightness of a view."}],"blockTags":[{"tag":"@see","content":[{"kind":"text","text":"Official [SwiftUI documentation](https://developer.apple.com/documentation/swiftui/view/brightness(_:))."}]}]},"parameters":[{"name":"amount","variant":"param","kind":32768,"comment":{"summary":[{"kind":"text","text":"Brightness adjustment (-1 to 1)."}]},"type":{"type":"intrinsic","name":"number"}}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"buttonStyle","variant":"declaration","kind":64,"signatures":[{"name":"buttonStyle","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Sets the button style for button views."}],"blockTags":[{"tag":"@see","content":[{"kind":"text","text":"Official [SwiftUI documentation](https://developer.apple.com/documentation/swiftui/view/buttonstyle(_:))."}]}]},"parameters":[{"name":"style","variant":"param","kind":32768,"comment":{"summary":[{"kind":"text","text":"The button style. "},{"kind":"code","text":"`'glass'`"},{"kind":"text","text":" and "},{"kind":"code","text":"`'glassProminent'`"},{"kind":"text","text":" are available on iOS 26+ and tvOS 26+ only."}]},"type":{"type":"union","types":[{"type":"literal","value":"automatic"},{"type":"literal","value":"plain"},{"type":"literal","value":"bordered"},{"type":"literal","value":"borderedProminent"},{"type":"literal","value":"borderless"},{"type":"literal","value":"glass"},{"type":"literal","value":"glassProminent"}]}}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"clipped","variant":"declaration","kind":64,"signatures":[{"name":"clipped","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Clips content to bounds."}],"blockTags":[{"tag":"@see","content":[{"kind":"text","text":"Official [SwiftUI documentation](https://developer.apple.com/documentation/swiftui/view/clipped(antialiased:))."}]}]},"parameters":[{"name":"clipped","variant":"param","kind":32768,"comment":{"summary":[{"kind":"text","text":"Whether to clip content."}]},"type":{"type":"intrinsic","name":"boolean"},"defaultValue":"true"}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"clipShape","variant":"declaration","kind":64,"signatures":[{"name":"clipShape","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Clips the view to a specific shape."}],"blockTags":[{"tag":"@see","content":[{"kind":"text","text":"Official [SwiftUI documentation](https://developer.apple.com/documentation/swiftui/view/clipshape(_:style:))."}]}]},"parameters":[{"name":"shape","variant":"param","kind":32768,"comment":{"summary":[{"kind":"text","text":"The clipping shape."}]},"type":{"type":"union","types":[{"type":"literal","value":"roundedRectangle"},{"type":"literal","value":"capsule"},{"type":"literal","value":"rectangle"},{"type":"literal","value":"ellipse"},{"type":"literal","value":"circle"},{"type":"literal","value":"containerRelativeShape"}]}},{"name":"cornerRadius","variant":"param","kind":32768,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Corner radius for rounded rectangle (default: 8)"}]},"type":{"type":"intrinsic","name":"number"}}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"colorInvert","variant":"declaration","kind":64,"signatures":[{"name":"colorInvert","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Inverts the colors of a view."}],"blockTags":[{"tag":"@see","content":[{"kind":"text","text":"Official [SwiftUI documentation](https://developer.apple.com/documentation/swiftui/view/colorinvert())."}]}]},"parameters":[{"name":"inverted","variant":"param","kind":32768,"comment":{"summary":[{"kind":"text","text":"Whether to invert colors."}]},"type":{"type":"intrinsic","name":"boolean"},"defaultValue":"true"}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"containerBackground","variant":"declaration","kind":64,"signatures":[{"name":"containerBackground","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Sets the container background of the enclosing container using a view."}],"blockTags":[{"tag":"@see","content":[{"kind":"text","text":"Official [SwiftUI documentation](https://developer.apple.com/documentation/swiftui/view/containerbackground(_:for:))."}]}]},"parameters":[{"name":"color","variant":"param","kind":32768,"comment":{"summary":[{"kind":"text","text":"The color to set as the background of the container."}]},"type":{"type":"reference","name":"Color","package":"@expo/ui"}},{"name":"container","variant":"param","kind":32768,"comment":{"summary":[{"kind":"text","text":"The type of container to apply the background to."}]},"type":{"type":"reference","name":"ContainerBackgroundPlacement","package":"@expo/ui"}}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"containerRelativeFrame","variant":"declaration","kind":64,"signatures":[{"name":"containerRelativeFrame","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Positions this view within an invisible frame with a size relative to the nearest container."}],"blockTags":[{"tag":"@see","content":[{"kind":"text","text":"Official [SwiftUI documentation](https://developer.apple.com/documentation/SwiftUI/View/containerRelativeFrame(_:alignment:))."}]},{"tag":"@platform","content":[{"kind":"text","text":"ios 17.0+"}]},{"tag":"@platform","content":[{"kind":"text","text":"tvos 17.0+"}]}]},"parameters":[{"name":"params","variant":"param","kind":32768,"comment":{"summary":[{"kind":"text","text":"The content relative frame parameters: "},{"kind":"code","text":"`axes`"},{"kind":"text","text":", "},{"kind":"code","text":"`count`"},{"kind":"text","text":", "},{"kind":"code","text":"`span`"},{"kind":"text","text":", "},{"kind":"code","text":"`spacing`"},{"kind":"text","text":" and "},{"kind":"code","text":"`alignment`"},{"kind":"text","text":"."}]},"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"children":[{"name":"alignment","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"union","types":[{"type":"literal","value":"center"},{"type":"literal","value":"top"},{"type":"literal","value":"bottom"},{"type":"literal","value":"topLeading"},{"type":"literal","value":"topTrailing"},{"type":"literal","value":"leading"},{"type":"literal","value":"trailing"},{"type":"literal","value":"bottomLeading"},{"type":"literal","value":"bottomTrailing"}]}},{"name":"axes","variant":"declaration","kind":1024,"type":{"type":"union","types":[{"type":"literal","value":"horizontal"},{"type":"literal","value":"vertical"},{"type":"literal","value":"both"}]}},{"name":"count","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"intrinsic","name":"number"}},{"name":"spacing","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"intrinsic","name":"number"}},{"name":"span","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"intrinsic","name":"number"}}]}}}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"containerShape","variant":"declaration","kind":64,"signatures":[{"name":"containerShape","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Sets the container shape for the view."}],"blockTags":[{"tag":"@see","content":[{"kind":"text","text":"Official [SwiftUI documentation](https://developer.apple.com/documentation/swiftui/view/containershape(_:))."}]}]},"parameters":[{"name":"shape","variant":"param","kind":32768,"comment":{"summary":[{"kind":"text","text":"A shape configuration from the shapes API"}]},"type":{"type":"reference","name":"Shape","package":"@expo/ui"}}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"contentShape","variant":"declaration","kind":64,"signatures":[{"name":"contentShape","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Defines the content shape for hit-testing purposes.\n\nThis modifier is essential for making entire view areas (including "},{"kind":"code","text":"`Spacer`"},{"kind":"text","text":" or empty space)\ninteractive. Without it, only visible elements like "},{"kind":"code","text":"`Text`"},{"kind":"text","text":" or "},{"kind":"code","text":"`Image`"},{"kind":"text","text":" respond to tap gestures."}],"blockTags":[{"tag":"@example","content":[{"kind":"code","text":"```tsx\nimport { HStack, List, Section, Spacer, Text } from \"@expo/ui/swift-ui\";\nimport { contentShape, onTapGesture } from \"@expo/ui/swift-ui/modifiers\";\nimport { shapes } from \"@expo/ui/swift-ui/modifiers\";\n\nfunction InteractiveRow() {\n return (\n \n
\n console.log(\"Row tapped!\"))\n ]}\n >\n Label\n \n Value\n \n
\n
\n );\n}\n```"}]},{"tag":"@see","content":[{"kind":"text","text":"Official [SwiftUI documentation](https://developer.apple.com/documentation/swiftui/view/contentshape(_:eofill:))."}]}]},"parameters":[{"name":"shape","variant":"param","kind":32768,"comment":{"summary":[{"kind":"text","text":"A shape configuration from the shapes API (rectangle, circle, capsule, ellipse, roundedRectangle)."}]},"type":{"type":"reference","name":"Shape","package":"@expo/ui"}}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"contentTransition","variant":"declaration","kind":64,"signatures":[{"name":"contentTransition","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Sets the content transition type for a view.\nUseful for animating changes in text content, especially numeric text.\nUse with the ["},{"kind":"code","text":"`animation`"},{"kind":"text","text":"](#animationanimationobject-animatedvalue) modifier to animate the transition when the content changes."}],"blockTags":[{"tag":"@example","content":[{"kind":"code","text":"```tsx\n\n {count.toString()}\n\n```"}]},{"tag":"@platform","content":[{"kind":"text","text":"ios 16.0+"}]},{"tag":"@platform","content":[{"kind":"text","text":"tvos 16.0+"}]},{"tag":"@see","content":[{"kind":"text","text":"Official [SwiftUI documentation](https://developer.apple.com/documentation/swiftui/view/contenttransition(_:))."}]}]},"parameters":[{"name":"transitionType","variant":"param","kind":32768,"comment":{"summary":[{"kind":"text","text":"The type of content transition."}]},"type":{"type":"union","types":[{"type":"literal","value":"identity"},{"type":"literal","value":"numericText"},{"type":"literal","value":"opacity"},{"type":"literal","value":"interpolate"}]}},{"name":"params","variant":"param","kind":32768,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Optional parameters."}]},"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"children":[{"name":"countsDown","variant":"declaration","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Whether the numeric text counts down."}]},"type":{"type":"intrinsic","name":"boolean"}}]}}}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"contrast","variant":"declaration","kind":64,"signatures":[{"name":"contrast","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Adjusts the contrast of a view."}],"blockTags":[{"tag":"@see","content":[{"kind":"text","text":"Official [SwiftUI documentation](https://developer.apple.com/documentation/swiftui/view/contrast(_:))."}]}]},"parameters":[{"name":"amount","variant":"param","kind":32768,"comment":{"summary":[{"kind":"text","text":"Contrast multiplier (0 to infinity, 1 = normal)."}]},"type":{"type":"intrinsic","name":"number"}}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"controlSize","variant":"declaration","kind":64,"signatures":[{"name":"controlSize","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Sets the size of controls within this view."}],"blockTags":[{"tag":"@see","content":[{"kind":"text","text":"Official [SwiftUI documentation](https://developer.apple.com/documentation/swiftui/view/controlsize(_:))."}]}]},"parameters":[{"name":"size","variant":"param","kind":32768,"comment":{"summary":[{"kind":"text","text":"The control size."}]},"type":{"type":"union","types":[{"type":"literal","value":"small"},{"type":"literal","value":"large"},{"type":"literal","value":"mini"},{"type":"literal","value":"regular"},{"type":"literal","value":"extraLarge"}]}}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"cornerRadius","variant":"declaration","kind":64,"signatures":[{"name":"cornerRadius","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Applies corner radius to a view."}],"blockTags":[{"tag":"@see","content":[{"kind":"text","text":"Official [SwiftUI documentation](https://developer.apple.com/documentation/swiftui/view/cornerradius(_:antialiased:))."}]}]},"parameters":[{"name":"radius","variant":"param","kind":32768,"comment":{"summary":[{"kind":"text","text":"The corner radius value."}]},"type":{"type":"intrinsic","name":"number"}}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"createModifier","variant":"declaration","kind":64,"signatures":[{"name":"createModifier","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Factory function to create modifier configuration objects.\nThis is used by all built-in modifier functions and can be used by 3rd party libraries to create custom modifiers."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"A "},{"kind":"code","text":"`ModifierConfig`"},{"kind":"text","text":" object that can be passed in the "},{"kind":"code","text":"`modifiers`"},{"kind":"text","text":" prop array."}]},{"tag":"@example","content":[{"kind":"code","text":"```ts\n// In a 3rd party package\nimport { createModifier } from '@expo/ui/swift-ui/modifiers';\n\nexport const blurEffect = (params: { radius: number; style?: string }) =>\n createModifier('blurEffect', params);\n```"}]}]},"parameters":[{"name":"type","variant":"param","kind":32768,"comment":{"summary":[{"kind":"text","text":"The modifier type string that maps to a registered native modifier."}]},"type":{"type":"intrinsic","name":"string"}},{"name":"params","variant":"param","kind":32768,"comment":{"summary":[{"kind":"text","text":"Additional parameters to pass to the modifier."}]},"type":{"type":"reference","target":{"packageName":"typescript","packagePath":"lib/lib.es5.d.ts","qualifiedName":"Record"},"typeArguments":[{"type":"intrinsic","name":"string"},{"type":"intrinsic","name":"any"}],"name":"Record","package":"typescript"},"defaultValue":"{}"}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"createModifierWithEventListener","variant":"declaration","kind":64,"signatures":[{"name":"createModifierWithEventListener","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Creates a modifier with an event listener."}]},"parameters":[{"name":"type","variant":"param","kind":32768,"type":{"type":"intrinsic","name":"string"}},{"name":"eventListener","variant":"param","kind":32768,"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"signatures":[{"name":"__type","variant":"signature","kind":4096,"parameters":[{"name":"args","variant":"param","kind":32768,"type":{"type":"intrinsic","name":"any"}}],"type":{"type":"intrinsic","name":"void"}}]}}},{"name":"params","variant":"param","kind":32768,"type":{"type":"reference","target":{"packageName":"typescript","packagePath":"lib/lib.es5.d.ts","qualifiedName":"Record"},"typeArguments":[{"type":"intrinsic","name":"string"},{"type":"intrinsic","name":"any"}],"name":"Record","package":"typescript"},"defaultValue":"{}"}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"createViewModifierEventListener","variant":"declaration","kind":64,"signatures":[{"name":"createViewModifierEventListener","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Create an event listener for a view modifier."}]},"parameters":[{"name":"modifiers","variant":"param","kind":32768,"comment":{"summary":[{"kind":"text","text":"An array of modifier configs to extract event listeners from."}]},"type":{"type":"array","elementType":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}}],"type":{"type":"reference","name":"GlobalEvent","package":"@expo/ui"}}]},{"name":"datePickerStyle","variant":"declaration","kind":64,"signatures":[{"name":"datePickerStyle","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Sets the style for the date picker."}],"blockTags":[{"tag":"@see","content":[{"kind":"text","text":"Official [SwiftUI documentation](https://developer.apple.com/documentation/swiftui/view/datepickerstyle(_:))."}]}]},"parameters":[{"name":"style","variant":"param","kind":32768,"comment":{"summary":[{"kind":"text","text":"The style for the date picker."}]},"type":{"type":"reference","name":"DatePickerStyleType","package":"@expo/ui"}}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"defaultScrollAnchor","variant":"declaration","kind":64,"signatures":[{"name":"defaultScrollAnchor","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Sets the default anchor point for a scroll view's content."}],"blockTags":[{"tag":"@platform","content":[{"kind":"text","text":"ios 17.0+"}]},{"tag":"@platform","content":[{"kind":"text","text":"tvos 17.0+"}]},{"tag":"@platform","content":[{"kind":"text","text":"macos 14.0+"}]},{"tag":"@see","content":[{"kind":"text","text":"Official [SwiftUI documentation](https://developer.apple.com/documentation/swiftui/view/defaultscrollanchor(_:))."}]}]},"parameters":[{"name":"anchor","variant":"param","kind":32768,"comment":{"summary":[{"kind":"text","text":"The anchor point for initial scroll position and content size changes, or "},{"kind":"code","text":"`null`"},{"kind":"text","text":" to reset."}]},"type":{"type":"union","types":[{"type":"reference","name":"UnitPointValue","package":"@expo/ui"},{"type":"literal","value":null}]}}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"defaultScrollAnchorForRole","variant":"declaration","kind":64,"signatures":[{"name":"defaultScrollAnchorForRole","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Sets the default anchor point for a scroll view for a specific role.\nPass "},{"kind":"code","text":"`null`"},{"kind":"text","text":" to opt out of a specific role while keeping anchors for other roles."}],"blockTags":[{"tag":"@platform","content":[{"kind":"text","text":"ios 18.0+"}]},{"tag":"@platform","content":[{"kind":"text","text":"tvos 18.0+"}]},{"tag":"@platform","content":[{"kind":"text","text":"macos 15.0+"}]},{"tag":"@see","content":[{"kind":"text","text":"Official [SwiftUI documentation](https://developer.apple.com/documentation/swiftui/view/defaultscrollanchor(_:for:))."}]}]},"parameters":[{"name":"anchor","variant":"param","kind":32768,"comment":{"summary":[{"kind":"text","text":"The anchor point, or "},{"kind":"code","text":"`null`"},{"kind":"text","text":" to opt out of this role."}]},"type":{"type":"union","types":[{"type":"reference","name":"UnitPointValue","package":"@expo/ui"},{"type":"literal","value":null}]}},{"name":"role","variant":"param","kind":32768,"comment":{"summary":[{"kind":"text","text":"The scroll anchor role: "},{"kind":"code","text":"`'initialOffset'`"},{"kind":"text","text":", "},{"kind":"code","text":"`'sizeChanges'`"},{"kind":"text","text":", or "},{"kind":"code","text":"`'alignment'`"},{"kind":"text","text":"."}]},"type":{"type":"union","types":[{"type":"literal","value":"initialOffset"},{"type":"literal","value":"sizeChanges"},{"type":"literal","value":"alignment"}]}}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"deleteDisabled","variant":"declaration","kind":64,"signatures":[{"name":"deleteDisabled","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Disables the delete action for a view in a list.\nApply to items within a "},{"kind":"code","text":"`ForEach`"},{"kind":"text","text":" to prevent them from being deleted."}],"blockTags":[{"tag":"@default","content":[{"kind":"text","text":"true"}]},{"tag":"@see","content":[{"kind":"text","text":"Official [SwiftUI documentation](https://developer.apple.com/documentation/swiftui/view/deletedisabled(_:))."}]}]},"parameters":[{"name":"disabled","variant":"param","kind":32768,"comment":{"summary":[{"kind":"text","text":"Whether deletion should be disabled"}]},"type":{"type":"intrinsic","name":"boolean"},"defaultValue":"true"}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"disabled","variant":"declaration","kind":64,"signatures":[{"name":"disabled","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Disables or enables a view."}],"blockTags":[{"tag":"@see","content":[{"kind":"text","text":"Official [SwiftUI documentation](https://developer.apple.com/documentation/swiftui/view/disabled(_:))."}]}]},"parameters":[{"name":"disabled","variant":"param","kind":32768,"comment":{"summary":[{"kind":"text","text":"Whether the view should be disabled."}]},"type":{"type":"intrinsic","name":"boolean"},"defaultValue":"true"}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"environment","variant":"declaration","kind":64,"signatures":[{"name":"environment","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Sets a SwiftUI environment value."}],"blockTags":[{"tag":"@see","content":[{"kind":"text","text":"Official [SwiftUI documentation](https://developer.apple.com/documentation/swiftui/view/environment(_:_:))."}]}]},"parameters":[{"name":"config","variant":"param","kind":32768,"type":{"type":"reference","name":"EnvironmentConfig","package":"@expo/ui"}}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}},{"name":"environment","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Sets a SwiftUI environment value."}],"blockTags":[{"tag":"@see","content":[{"kind":"text","text":"Official [SwiftUI documentation](https://developer.apple.com/documentation/swiftui/view/environment(_:_:))."}]}]},"parameters":[{"name":"key","variant":"param","kind":32768,"type":{"type":"union","types":[{"type":"literal","value":"colorScheme"},{"type":"literal","value":"editMode"},{"type":"literal","value":"locale"},{"type":"literal","value":"timeZone"}]}},{"name":"value","variant":"param","kind":32768,"type":{"type":"intrinsic","name":"string"}}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"fixedSize","variant":"declaration","kind":64,"signatures":[{"name":"fixedSize","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Controls fixed size behavior."}],"blockTags":[{"tag":"@see","content":[{"kind":"text","text":"Official [SwiftUI documentation](https://developer.apple.com/documentation/swiftui/view/fixedsize())."}]}]},"parameters":[{"name":"params","variant":"param","kind":32768,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Whether the view should use its ideal width or height."}]},"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"children":[{"name":"horizontal","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"intrinsic","name":"boolean"}},{"name":"vertical","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"intrinsic","name":"boolean"}}]}}}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"font","variant":"declaration","kind":64,"signatures":[{"name":"font","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Sets the font properties of a view.\n\nPass "},{"kind":"code","text":"`textStyle`"},{"kind":"text","text":" to scale with the user's Dynamic Type setting. Combine\nit with "},{"kind":"code","text":"`family`"},{"kind":"text","text":" to scale a custom font."}],"blockTags":[{"tag":"@example","content":[{"kind":"code","text":"```tsx\n// Scales with Dynamic Type\nHello\n\n// Custom font that scales relative to the body text style\nHi\n\n// Fixed-size system font (no Dynamic Type scaling)\nStatic\n```"}]},{"tag":"@see","content":[{"kind":"text","text":"Official SwiftUI documentation for ["},{"kind":"code","text":"`system(_:design:weight:)`"},{"kind":"text","text":"](https://developer.apple.com/documentation/swiftui/font/system(_:design:weight:)), and ["},{"kind":"code","text":"`custom(_:size:relativeTo:)`"},{"kind":"text","text":"](https://developer.apple.com/documentation/swiftui/font/custom(_:size:relativeto:))."}]}]},"parameters":[{"name":"params","variant":"param","kind":32768,"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"children":[{"name":"design","variant":"declaration","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Font design. Applied when no "},{"kind":"code","text":"`family`"},{"kind":"text","text":" is provided. "},{"kind":"code","text":"`Font.custom`"},{"kind":"text","text":" always uses the embedded font's own design."}]},"type":{"type":"union","types":[{"type":"literal","value":"default"},{"type":"literal","value":"rounded"},{"type":"literal","value":"serif"},{"type":"literal","value":"monospaced"}]}},{"name":"family","variant":"declaration","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Custom font family name."}]},"type":{"type":"intrinsic","name":"string"}},{"name":"size","variant":"declaration","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Font size in points. Ignored when only "},{"kind":"code","text":"`textStyle`"},{"kind":"text","text":" is set."}],"blockTags":[{"tag":"@default","content":[{"kind":"text","text":"17"}]}]},"type":{"type":"intrinsic","name":"number"}},{"name":"textStyle","variant":"declaration","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"SwiftUI text style. When set, the resulting font scales with the user's\nDynamic Type setting."}]},"type":{"type":"union","types":[{"type":"literal","value":"largeTitle"},{"type":"literal","value":"title"},{"type":"literal","value":"title2"},{"type":"literal","value":"title3"},{"type":"literal","value":"headline"},{"type":"literal","value":"subheadline"},{"type":"literal","value":"body"},{"type":"literal","value":"callout"},{"type":"literal","value":"footnote"},{"type":"literal","value":"caption"},{"type":"literal","value":"caption2"}]}},{"name":"weight","variant":"declaration","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Font weight."}]},"type":{"type":"union","types":[{"type":"literal","value":"light"},{"type":"literal","value":"bold"},{"type":"literal","value":"black"},{"type":"literal","value":"medium"},{"type":"literal","value":"regular"},{"type":"literal","value":"ultraLight"},{"type":"literal","value":"thin"},{"type":"literal","value":"semibold"},{"type":"literal","value":"heavy"}]}}]}}}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"foregroundColor","variant":"declaration","kind":64,"signatures":[{"name":"foregroundColor","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Sets the foreground color/tint of a view."}],"blockTags":[{"tag":"@deprecated","content":[{"kind":"text","text":"Use "},{"kind":"code","text":"`foregroundStyle`"},{"kind":"text","text":" instead."}]},{"tag":"@see","content":[{"kind":"text","text":"Official [SwiftUI documentation](https://developer.apple.com/documentation/swiftui/view/foregroundcolor(_:))."}]}]},"parameters":[{"name":"color","variant":"param","kind":32768,"comment":{"summary":[{"kind":"text","text":"The foreground color (hex string)."}]},"type":{"type":"reference","name":"Color","package":"@expo/ui"}}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"foregroundStyle","variant":"declaration","kind":64,"signatures":[{"name":"foregroundStyle","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Sets the foreground style of a view with comprehensive styling options.\n\nReplaces the deprecated "},{"kind":"code","text":"`foregroundColor`"},{"kind":"text","text":" modifier with enhanced capabilities including\ncolors, gradients, and semantic hierarchical styles that adapt to system appearance."}],"blockTags":[{"tag":"@example","content":[{"kind":"code","text":"```tsx\n// Simple usage\nRed Text\n\n// Adaptive hierarchical styling\n\n Supporting Text\n\n\n// Linear gradient\n\n Gradient Text\n\n```"}]},{"tag":"@returns","content":[{"kind":"text","text":"A view modifier that applies the specified foreground style"}]},{"tag":"@since","content":[{"kind":"text","text":"iOS 15.0+ (hierarchical quinary requires iOS 16.0+)"}]},{"tag":"@see","content":[{"kind":"text","text":"Official [SwiftUI documentation](https://developer.apple.com/documentation/swiftui/view/foregroundstyle(_:))."}]}]},"parameters":[{"name":"style","variant":"param","kind":32768,"comment":{"summary":[{"kind":"text","text":"The foreground style configuration. Can be:\n\n**Simple Color ("},{"kind":"code","text":"`Color`"},{"kind":"text","text":"):**\n- Hex colors: "},{"kind":"code","text":"`'#FF0000'`"},{"kind":"text","text":", "},{"kind":"code","text":"`'#RGB'`"},{"kind":"text","text":", "},{"kind":"code","text":"`'#RRGGBB'`"},{"kind":"text","text":", "},{"kind":"code","text":"`'#AARRGGBB'`"},{"kind":"text","text":"\n- Named colors: "},{"kind":"code","text":"`'red'`"},{"kind":"text","text":", "},{"kind":"code","text":"`'blue'`"},{"kind":"text","text":", "},{"kind":"code","text":"`'green'`"},{"kind":"text","text":", and so on.\n- React Native color values like "},{"kind":"code","text":"`PlatformColor('label')`"},{"kind":"text","text":"\n\n**Explicit Color Object:**\n"},{"kind":"code","text":"```ts\n{ type: 'color', color: PlatformColor('label') }\n```"},{"kind":"text","text":"\n\n**Hierarchical Styles (Semantic):**\nAuto-adapting semantic styles that respond to light/dark mode and accessibility settings:\n"},{"kind":"code","text":"```ts\n{ type: 'hierarchical', style: 'primary' } // Most prominent (main content, headlines)\n{ type: 'hierarchical', style: 'secondary' } // Supporting text, subheadlines\n{ type: 'hierarchical', style: 'tertiary' } // Less important text, captions\n{ type: 'hierarchical', style: 'quaternary' } // Subtle text, disabled states\n{ type: 'hierarchical', style: 'quinary' } // Most subtle (iOS 16+, fallback to quaternary)\n```"},{"kind":"text","text":"\n\n**Linear Gradient:**\n"},{"kind":"code","text":"```ts\n{\n type: 'linearGradient',\n colors: [PlatformColor('systemPink'), '#0000FF', '#00FF00'],\n startPoint: { x: 0, y: 0 }, // Top-left\n endPoint: { x: 1, y: 1 } // Bottom-right\n}\n```"},{"kind":"text","text":"\n\n**Radial Gradient:**\n"},{"kind":"code","text":"```ts\n{\n type: 'radialGradient',\n colors: [PlatformColor('systemPink'), '#0000FF'],\n center: { x: 0.5, y: 0.5 }, // Center of view\n startRadius: 0, // Inner radius\n endRadius: 100 // Outer radius\n}\n```"},{"kind":"text","text":"\n\n**Angular Gradient (Conic):**\n"},{"kind":"code","text":"```ts\n{\n type: 'angularGradient',\n colors: [PlatformColor('systemPink'), '#00FF00', '#0000FF'],\n center: { x: 0.5, y: 0.5 } // Rotation center\n}\n```"}]},"type":{"type":"union","types":[{"type":"reference","name":"Color","package":"@expo/ui"},{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"children":[{"name":"color","variant":"declaration","kind":1024,"type":{"type":"reference","name":"Color","package":"@expo/ui"}},{"name":"type","variant":"declaration","kind":1024,"type":{"type":"literal","value":"color"}}]}},{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"children":[{"name":"style","variant":"declaration","kind":1024,"type":{"type":"union","types":[{"type":"literal","value":"primary"},{"type":"literal","value":"secondary"},{"type":"literal","value":"tertiary"},{"type":"literal","value":"quaternary"},{"type":"literal","value":"quinary"}]}},{"name":"type","variant":"declaration","kind":1024,"type":{"type":"literal","value":"hierarchical"}}]}},{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"children":[{"name":"colors","variant":"declaration","kind":1024,"type":{"type":"array","elementType":{"type":"reference","name":"Color","package":"@expo/ui"}}},{"name":"endPoint","variant":"declaration","kind":1024,"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"children":[{"name":"x","variant":"declaration","kind":1024,"type":{"type":"intrinsic","name":"number"}},{"name":"y","variant":"declaration","kind":1024,"type":{"type":"intrinsic","name":"number"}}]}}},{"name":"startPoint","variant":"declaration","kind":1024,"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"children":[{"name":"x","variant":"declaration","kind":1024,"type":{"type":"intrinsic","name":"number"}},{"name":"y","variant":"declaration","kind":1024,"type":{"type":"intrinsic","name":"number"}}]}}},{"name":"type","variant":"declaration","kind":1024,"type":{"type":"literal","value":"linearGradient"}}]}},{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"children":[{"name":"center","variant":"declaration","kind":1024,"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"children":[{"name":"x","variant":"declaration","kind":1024,"type":{"type":"intrinsic","name":"number"}},{"name":"y","variant":"declaration","kind":1024,"type":{"type":"intrinsic","name":"number"}}]}}},{"name":"colors","variant":"declaration","kind":1024,"type":{"type":"array","elementType":{"type":"reference","name":"Color","package":"@expo/ui"}}},{"name":"endRadius","variant":"declaration","kind":1024,"type":{"type":"intrinsic","name":"number"}},{"name":"startRadius","variant":"declaration","kind":1024,"type":{"type":"intrinsic","name":"number"}},{"name":"type","variant":"declaration","kind":1024,"type":{"type":"literal","value":"radialGradient"}}]}},{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"children":[{"name":"center","variant":"declaration","kind":1024,"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"children":[{"name":"x","variant":"declaration","kind":1024,"type":{"type":"intrinsic","name":"number"}},{"name":"y","variant":"declaration","kind":1024,"type":{"type":"intrinsic","name":"number"}}]}}},{"name":"colors","variant":"declaration","kind":1024,"type":{"type":"array","elementType":{"type":"reference","name":"Color","package":"@expo/ui"}}},{"name":"type","variant":"declaration","kind":1024,"type":{"type":"literal","value":"angularGradient"}}]}}]}}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"frame","variant":"declaration","kind":64,"signatures":[{"name":"frame","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Sets the frame properties of a view."}],"blockTags":[{"tag":"@see","content":[{"kind":"text","text":"Official [SwiftUI documentation](https://developer.apple.com/documentation/SwiftUI/View/frame(width:height:alignment:))."}]}]},"parameters":[{"name":"params","variant":"param","kind":32768,"comment":{"summary":[{"kind":"text","text":"The frame parameters. Width, height, minWidth, maxWidth, minHeight, maxHeight, idealWidth, idealHeight and alignment."}]},"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"children":[{"name":"alignment","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"union","types":[{"type":"literal","value":"center"},{"type":"literal","value":"top"},{"type":"literal","value":"bottom"},{"type":"literal","value":"topLeading"},{"type":"literal","value":"topTrailing"},{"type":"literal","value":"leading"},{"type":"literal","value":"trailing"},{"type":"literal","value":"bottomLeading"},{"type":"literal","value":"bottomTrailing"}]}},{"name":"height","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"intrinsic","name":"number"}},{"name":"idealHeight","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"intrinsic","name":"number"}},{"name":"idealWidth","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"intrinsic","name":"number"}},{"name":"maxHeight","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"intrinsic","name":"number"}},{"name":"maxWidth","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"intrinsic","name":"number"}},{"name":"minHeight","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"intrinsic","name":"number"}},{"name":"minWidth","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"intrinsic","name":"number"}},{"name":"width","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"intrinsic","name":"number"}}]}}}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"gaugeStyle","variant":"declaration","kind":64,"signatures":[{"name":"gaugeStyle","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Sets the style for the gauge."}],"blockTags":[{"tag":"@see","content":[{"kind":"text","text":"Official [SwiftUI documentation](https://developer.apple.com/documentation/swiftui/gaugestyle)."}]}]},"parameters":[{"name":"style","variant":"param","kind":32768,"comment":{"summary":[{"kind":"text","text":"The style for the gauge."}]},"type":{"type":"reference","name":"GaugeStyleType","package":"@expo/ui"}}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"glassEffect","variant":"declaration","kind":64,"signatures":[{"name":"glassEffect","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Applies a glass effect to a view."}],"blockTags":[{"tag":"@see","content":[{"kind":"text","text":"Official [SwiftUI documentation](https://developer.apple.com/documentation/swiftui/view/glasseffect(_:in:))."}]}]},"parameters":[{"name":"params","variant":"param","kind":32768,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"The glass effect parameters. Variant, interactive, tint and shape."}]},"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"children":[{"name":"cornerRadius","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"intrinsic","name":"number"}},{"name":"glass","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"children":[{"name":"interactive","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"intrinsic","name":"boolean"}},{"name":"tint","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"reference","name":"Color","package":"@expo/ui"}},{"name":"variant","variant":"declaration","kind":1024,"type":{"type":"union","types":[{"type":"literal","value":"clear"},{"type":"literal","value":"regular"},{"type":"literal","value":"identity"}]}}]}}},{"name":"shape","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"union","types":[{"type":"literal","value":"roundedRectangle"},{"type":"literal","value":"capsule"},{"type":"literal","value":"rectangle"},{"type":"literal","value":"ellipse"},{"type":"literal","value":"circle"},{"type":"literal","value":"containerRelativeShape"}]}}]}}}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"glassEffectId","variant":"declaration","kind":64,"signatures":[{"name":"glassEffectId","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Associates an identity value to Liquid Glass effects defined within a "},{"kind":"code","text":"`GlassEffectContainer`"},{"kind":"text","text":"."}],"blockTags":[{"tag":"@see","content":[{"kind":"text","text":"Official [SwiftUI documentation](https://developer.apple.com/documentation/swiftui/view/glasseffectid(_:in:))."}]}]},"parameters":[{"name":"id","variant":"param","kind":32768,"comment":{"summary":[{"kind":"text","text":"The id of the glass effect."}]},"type":{"type":"intrinsic","name":"string"}},{"name":"namespaceId","variant":"param","kind":32768,"comment":{"summary":[{"kind":"text","text":"The namespace id of the glass effect. Use Namespace component to create a namespace."}]},"type":{"type":"intrinsic","name":"string"}}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"grayscale","variant":"declaration","kind":64,"signatures":[{"name":"grayscale","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Makes a view grayscale."}],"blockTags":[{"tag":"@see","content":[{"kind":"text","text":"Official [SwiftUI documentation](https://developer.apple.com/documentation/swiftui/view/grayscale(_:))."}]}]},"parameters":[{"name":"amount","variant":"param","kind":32768,"comment":{"summary":[{"kind":"text","text":"Grayscale amount (0 to 1)."}]},"type":{"type":"intrinsic","name":"number"}}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"gridCellAnchor","variant":"declaration","kind":64,"signatures":[{"name":"gridCellAnchor","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Specifies a custom alignment anchor for a view that acts as a grid cell."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"A view that uses the specified anchor point to align its content."}]},{"tag":"@platform","content":[{"kind":"text","text":"iOS 16+"}]},{"tag":"@example","content":[{"kind":"code","text":"```tsx\n// Using a preset anchor\n\n\n// Using a custom anchor point\n\n```"}]}]},"parameters":[{"name":"anchor","variant":"param","kind":32768,"comment":{"summary":[{"kind":"text","text":"The unit point that defines how to align the view within the bounds of its grid cell."}]},"type":{"type":"union","types":[{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"children":[{"name":"anchor","variant":"declaration","kind":1024,"type":{"type":"union","types":[{"type":"literal","value":"center"},{"type":"literal","value":"top"},{"type":"literal","value":"bottom"},{"type":"literal","value":"zero"},{"type":"literal","value":"topLeading"},{"type":"literal","value":"topTrailing"},{"type":"literal","value":"leading"},{"type":"literal","value":"trailing"},{"type":"literal","value":"bottomLeading"},{"type":"literal","value":"bottomTrailing"}]}},{"name":"type","variant":"declaration","kind":1024,"type":{"type":"literal","value":"preset"}}]}},{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"children":[{"name":"points","variant":"declaration","kind":1024,"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"children":[{"name":"x","variant":"declaration","kind":1024,"type":{"type":"intrinsic","name":"number"}},{"name":"y","variant":"declaration","kind":1024,"type":{"type":"intrinsic","name":"number"}}]}}},{"name":"type","variant":"declaration","kind":1024,"type":{"type":"literal","value":"custom"}}]}}]}}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"gridCellColumns","variant":"declaration","kind":64,"signatures":[{"name":"gridCellColumns","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Tells a view that acts as a cell in a grid to span the specified number of columns."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"A view that occupies the specified number of columns in a grid row."}]}]},"parameters":[{"name":"count","variant":"param","kind":32768,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"The number of columns that the view should consume when placed in a grid row."}]},"type":{"type":"intrinsic","name":"number"}}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"gridCellUnsizedAxes","variant":"declaration","kind":64,"signatures":[{"name":"gridCellUnsizedAxes","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Asks grid layouts not to offer the view extra size in the specified axes."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"A view that doesn’t ask an enclosing grid for extra size in one or more axes."}]}]},"parameters":[{"name":"axes","variant":"param","kind":32768,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"The dimensions in which the grid shouldn’t offer the view a share of any available space. This prevents a flexible view like a Spacer, Divider, or Color from defining the size of a row or column."}]},"type":{"type":"union","types":[{"type":"literal","value":"horizontal"},{"type":"literal","value":"vertical"}]}}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"gridColumnAlignment","variant":"declaration","kind":64,"signatures":[{"name":"gridColumnAlignment","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Overrides the default horizontal alignment of the grid column that the view appears in."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"A view that uses the specified horizontal alignment, and that causes all cells in the same column of a grid to use the same alignment."}]},{"tag":"@platform","content":[{"kind":"text","text":"iOS 16+"}]}]},"parameters":[{"name":"alignment","variant":"param","kind":32768,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"The HorizontalAlignment guide to use for the grid column that the view appears in."}]},"type":{"type":"union","types":[{"type":"literal","value":"center"},{"type":"literal","value":"leading"},{"type":"literal","value":"trailing"}]}}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"headerProminence","variant":"declaration","kind":64,"signatures":[{"name":"headerProminence","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Sets the header prominence for this view."}]},"parameters":[{"name":"prominence","variant":"param","kind":32768,"comment":{"summary":[{"kind":"text","text":"The prominence to apply."}]},"type":{"type":"union","types":[{"type":"literal","value":"standard"},{"type":"literal","value":"increased"}]}}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"hidden","variant":"declaration","kind":64,"signatures":[{"name":"hidden","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Hides or shows a view."}],"blockTags":[{"tag":"@see","content":[{"kind":"text","text":"Official [SwiftUI documentation](https://developer.apple.com/documentation/swiftui/view/hidden(_:))."}]}]},"parameters":[{"name":"hidden","variant":"param","kind":32768,"comment":{"summary":[{"kind":"text","text":"Whether the view should be hidden."}]},"type":{"type":"intrinsic","name":"boolean"},"defaultValue":"true"}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"hueRotation","variant":"declaration","kind":64,"signatures":[{"name":"hueRotation","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Applies a hue rotation to a view."}],"blockTags":[{"tag":"@see","content":[{"kind":"text","text":"Official [SwiftUI documentation](https://developer.apple.com/documentation/swiftui/view/huerotation(_:))."}]}]},"parameters":[{"name":"angle","variant":"param","kind":32768,"comment":{"summary":[{"kind":"text","text":"Hue rotation angle in degrees."}]},"type":{"type":"intrinsic","name":"number"}}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"id","variant":"declaration","kind":64,"signatures":[{"name":"id","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Attaches a stable identifier to a view so it can be referenced by scroll target bindings.\nUse with "},{"kind":"code","text":"`scrollTargetLayout()`"},{"kind":"text","text":" on the containing stack and the "},{"kind":"code","text":"`scrollPosition`"},{"kind":"text","text":" modifier on a scrollable container."}],"blockTags":[{"tag":"@see","content":[{"kind":"text","text":"Official [SwiftUI documentation](https://developer.apple.com/documentation/swiftui/view/id(_:))."}]}]},"parameters":[{"name":"value","variant":"param","kind":32768,"comment":{"summary":[{"kind":"text","text":"String identifier matched by "},{"kind":"code","text":"`scrollPosition`"},{"kind":"text","text":"'s observable state."}]},"type":{"type":"intrinsic","name":"string"}}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"ignoreSafeArea","variant":"declaration","kind":64,"signatures":[{"name":"ignoreSafeArea","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Allows a view to ignore safe area constraints."}],"blockTags":[{"tag":"@see","content":[{"kind":"text","text":"Official [SwiftUI documentation](https://developer.apple.com/documentation/swiftui/view/ignoressafearea(_:edges:))."}]}]},"parameters":[{"name":"params","variant":"param","kind":32768,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"The safe area regions to ignore and the edges to expand into."}]},"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"children":[{"name":"edges","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"union","types":[{"type":"literal","value":"top"},{"type":"literal","value":"bottom"},{"type":"literal","value":"leading"},{"type":"literal","value":"trailing"},{"type":"literal","value":"horizontal"},{"type":"literal","value":"vertical"},{"type":"literal","value":"all"}]}},{"name":"regions","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"union","types":[{"type":"literal","value":"container"},{"type":"literal","value":"all"},{"type":"literal","value":"keyboard"}]}}]}}}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"indexViewStyle","variant":"declaration","kind":64,"signatures":[{"name":"indexViewStyle","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Sets the style for the page index view inside a "},{"kind":"code","text":"`TabView`"},{"kind":"text","text":". SwiftUI only\nships a "},{"kind":"code","text":"`.page`"},{"kind":"text","text":" index view style, so no style selector is exposed."}],"blockTags":[{"tag":"@see","content":[{"kind":"text","text":"Official [SwiftUI documentation](https://developer.apple.com/documentation/swiftui/view/indexviewstyle(_:))."}]}]},"parameters":[{"name":"config","variant":"param","kind":32768,"type":{"type":"reference","name":"IndexViewStyleConfig","package":"@expo/ui"},"defaultValue":"{}"}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"interactiveDismissDisabled","variant":"declaration","kind":64,"signatures":[{"name":"interactiveDismissDisabled","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Disables interactive dismissal of a sheet."}],"blockTags":[{"tag":"@see","content":[{"kind":"text","text":"Official [SwiftUI documentation](https://developer.apple.com/documentation/swiftui/view/interactivedismissdisabled(_:))."}]}]},"parameters":[{"name":"isDisabled","variant":"param","kind":32768,"comment":{"summary":[{"kind":"text","text":"Whether interactive dismiss is disabled (default: true)."}]},"type":{"type":"intrinsic","name":"boolean"},"defaultValue":"true"}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"italic","variant":"declaration","kind":64,"signatures":[{"name":"italic","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Makes text italic.\nWhen applied to "},{"kind":"code","text":"`Text`"},{"kind":"text","text":", it works on all iOS/tvOS versions. When used on regular views, it requires iOS 16.0+/tvOS 16.0+."}],"blockTags":[{"tag":"@see","content":[{"kind":"text","text":"Official [SwiftUI documentation](https://developer.apple.com/documentation/swiftui/text/italic())."}]}]},"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"kerning","variant":"declaration","kind":64,"signatures":[{"name":"kerning","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Sets the spacing, or kerning, between characters for the text in this view."}],"blockTags":[{"tag":"@default","content":[{"kind":"text","text":"0"}]},{"tag":"@see","content":[{"kind":"text","text":"Official [SwiftUI documentation](https://developer.apple.com/documentation/swiftui/view/kerning(_:))."}]}]},"parameters":[{"name":"value","variant":"param","kind":32768,"flags":{"isOptional":true},"type":{"type":"intrinsic","name":"number"}}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"keyboardType","variant":"declaration","kind":64,"signatures":[{"name":"keyboardType","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Sets the keyboard type for text input views."}],"blockTags":[{"tag":"@see","content":[{"kind":"text","text":"Official [SwiftUI documentation](https://developer.apple.com/documentation/swiftui/view/keyboardtype(_:))."}]}]},"parameters":[{"name":"keyboardType","variant":"param","kind":32768,"comment":{"summary":[{"kind":"text","text":"The type of keyboard to display."}]},"type":{"type":"union","types":[{"type":"literal","value":"default"},{"type":"literal","value":"url"},{"type":"literal","value":"email-address"},{"type":"literal","value":"numeric"},{"type":"literal","value":"phone-pad"},{"type":"literal","value":"ascii-capable"},{"type":"literal","value":"numbers-and-punctuation"},{"type":"literal","value":"name-phone-pad"},{"type":"literal","value":"decimal-pad"},{"type":"literal","value":"twitter"},{"type":"literal","value":"web-search"},{"type":"literal","value":"ascii-capable-number-pad"}]}}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"labelsHidden","variant":"declaration","kind":64,"signatures":[{"name":"labelsHidden","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Hides the labels of any controls contained within this view."}],"blockTags":[{"tag":"@see","content":[{"kind":"text","text":"Official [SwiftUI documentation](https://developer.apple.com/documentation/swiftui/view/labelshidden())."}]}]},"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"labelStyle","variant":"declaration","kind":64,"signatures":[{"name":"labelStyle","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Sets the style for labels within this view."}],"blockTags":[{"tag":"@see","content":[{"kind":"text","text":"Official [SwiftUI documentation](https://developer.apple.com/documentation/swiftui/view/labelstyle(_:))."}]}]},"parameters":[{"name":"style","variant":"param","kind":32768,"comment":{"summary":[{"kind":"text","text":"The label style."}]},"type":{"type":"union","types":[{"type":"literal","value":"automatic"},{"type":"literal","value":"iconOnly"},{"type":"literal","value":"titleAndIcon"},{"type":"literal","value":"titleOnly"}]}}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"layoutPriority","variant":"declaration","kind":64,"signatures":[{"name":"layoutPriority","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Sets layout priority for the view."}],"blockTags":[{"tag":"@see","content":[{"kind":"text","text":"Official [SwiftUI documentation](https://developer.apple.com/documentation/swiftui/view/layoutpriority(_:))."}]}]},"parameters":[{"name":"priority","variant":"param","kind":32768,"comment":{"summary":[{"kind":"text","text":"Layout priority value."}]},"type":{"type":"intrinsic","name":"number"}}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"lineHeight","variant":"declaration","kind":64,"signatures":[{"name":"lineHeight","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Sets the total line height for text in this view."}],"blockTags":[{"tag":"@platform","content":[{"kind":"text","text":"ios 26.0+"}]},{"tag":"@platform","content":[{"kind":"text","text":"macos 26.0+"}]},{"tag":"@platform","content":[{"kind":"text","text":"tvos 26.0+"}]},{"tag":"@see","content":[{"kind":"text","text":"Official [SwiftUI documentation](https://developer.apple.com/documentation/swiftui/view/lineheight(_:))."}]}]},"parameters":[{"name":"value","variant":"param","kind":32768,"comment":{"summary":[{"kind":"text","text":"The line height in points."}]},"type":{"type":"intrinsic","name":"number"}}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"lineLimit","variant":"declaration","kind":64,"signatures":[{"name":"lineLimit","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Sets the line limit for text in the view.\n\nFour variants matching SwiftUI:\n- "},{"kind":"code","text":"`lineLimit()`"},{"kind":"text","text":" — no line limit (unlimited lines)\n- "},{"kind":"code","text":"`lineLimit(5)`"},{"kind":"text","text":" — max 5 lines\n- "},{"kind":"code","text":"`lineLimit(5, { reservesSpace: true })`"},{"kind":"text","text":" — max 5 lines, reserves height even when empty (iOS 16+, tvOS 16+)\n- "},{"kind":"code","text":"`lineLimit({ min: 3, max: 8 })`"},{"kind":"text","text":" — range of 3 to 8 lines (iOS 16+, tvOS 16+)"}],"blockTags":[{"tag":"@see","content":[{"kind":"text","text":"Official [SwiftUI documentation](https://developer.apple.com/documentation/swiftui/view/linelimit(_:))."}]}]},"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}},{"name":"lineLimit","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Sets the line limit for text in the view.\n\nFour variants matching SwiftUI:\n- "},{"kind":"code","text":"`lineLimit()`"},{"kind":"text","text":" — no line limit (unlimited lines)\n- "},{"kind":"code","text":"`lineLimit(5)`"},{"kind":"text","text":" — max 5 lines\n- "},{"kind":"code","text":"`lineLimit(5, { reservesSpace: true })`"},{"kind":"text","text":" — max 5 lines, reserves height even when empty (iOS 16+, tvOS 16+)\n- "},{"kind":"code","text":"`lineLimit({ min: 3, max: 8 })`"},{"kind":"text","text":" — range of 3 to 8 lines (iOS 16+, tvOS 16+)"}],"blockTags":[{"tag":"@see","content":[{"kind":"text","text":"Official [SwiftUI documentation](https://developer.apple.com/documentation/swiftui/view/linelimit(_:))."}]}]},"parameters":[{"name":"limit","variant":"param","kind":32768,"type":{"type":"intrinsic","name":"number"}},{"name":"options","variant":"param","kind":32768,"flags":{"isOptional":true},"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"children":[{"name":"reservesSpace","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"intrinsic","name":"boolean"}}]}}}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}},{"name":"lineLimit","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Sets the line limit for text in the view.\n\nFour variants matching SwiftUI:\n- "},{"kind":"code","text":"`lineLimit()`"},{"kind":"text","text":" — no line limit (unlimited lines)\n- "},{"kind":"code","text":"`lineLimit(5)`"},{"kind":"text","text":" — max 5 lines\n- "},{"kind":"code","text":"`lineLimit(5, { reservesSpace: true })`"},{"kind":"text","text":" — max 5 lines, reserves height even when empty (iOS 16+, tvOS 16+)\n- "},{"kind":"code","text":"`lineLimit({ min: 3, max: 8 })`"},{"kind":"text","text":" — range of 3 to 8 lines (iOS 16+, tvOS 16+)"}],"blockTags":[{"tag":"@see","content":[{"kind":"text","text":"Official [SwiftUI documentation](https://developer.apple.com/documentation/swiftui/view/linelimit(_:))."}]}]},"parameters":[{"name":"range","variant":"param","kind":32768,"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"children":[{"name":"max","variant":"declaration","kind":1024,"type":{"type":"intrinsic","name":"number"}},{"name":"min","variant":"declaration","kind":1024,"type":{"type":"intrinsic","name":"number"}}]}}}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"lineSpacing","variant":"declaration","kind":64,"signatures":[{"name":"lineSpacing","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"The distance in points between the bottom of one line fragment and the top of the next."}],"blockTags":[{"tag":"@see","content":[{"kind":"text","text":"Official [SwiftUI documentation](https://developer.apple.com/documentation/swiftui/view/linespacing(_:))."}]}]},"parameters":[{"name":"value","variant":"param","kind":32768,"comment":{"summary":[{"kind":"text","text":"The amount of space between the bottom of one line and the top of the next line in points. This value is always nonnegative. Otherwise, the default value will be used."}]},"type":{"type":"intrinsic","name":"number"}}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"listRowBackground","variant":"declaration","kind":64,"signatures":[{"name":"listRowBackground","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Sets the background of a row."}],"blockTags":[{"tag":"@see","content":[{"kind":"text","text":"Official [SwiftUI documentation](https://developer.apple.com/documentation/swiftui/view/listrowbackground(_:))."}]}]},"parameters":[{"name":"color","variant":"param","kind":32768,"comment":{"summary":[{"kind":"text","text":"The row color (hex string). For example, "},{"kind":"code","text":"`#FF0000`"},{"kind":"text","text":"."}]},"type":{"type":"reference","name":"Color","package":"@expo/ui"}}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"listRowInsets","variant":"declaration","kind":64,"signatures":[{"name":"listRowInsets","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Applies an inset to the rows in a list."}],"blockTags":[{"tag":"@see","content":[{"kind":"text","text":"Official [SwiftUI documentation](https://developer.apple.com/documentation/swiftui/view/listrowinsets(_:))."}]}]},"parameters":[{"name":"params","variant":"param","kind":32768,"comment":{"summary":[{"kind":"text","text":"The inset to apply to the rows in a list."}]},"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"children":[{"name":"bottom","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"intrinsic","name":"number"}},{"name":"leading","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"intrinsic","name":"number"}},{"name":"top","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"intrinsic","name":"number"}},{"name":"trailing","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"intrinsic","name":"number"}}]}}}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"listRowSeparator","variant":"declaration","kind":64,"signatures":[{"name":"listRowSeparator","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Controls the visibility of the separator for a list row."}],"blockTags":[{"tag":"@see","content":[{"kind":"text","text":"Official [SwiftUI documentation](https://developer.apple.com/documentation/swiftui/view/listrowseparator(_:edges:))."}]}]},"parameters":[{"name":"visibility","variant":"param","kind":32768,"comment":{"summary":[{"kind":"text","text":"The visibility to apply."}]},"type":{"type":"union","types":[{"type":"literal","value":"automatic"},{"type":"literal","value":"visible"},{"type":"literal","value":"hidden"}]}},{"name":"edges","variant":"param","kind":32768,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"The edges where the separator visibility applies."}]},"type":{"type":"union","types":[{"type":"literal","value":"top"},{"type":"literal","value":"bottom"},{"type":"literal","value":"all"}]}}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"listSectionMargins","variant":"declaration","kind":64,"signatures":[{"name":"listSectionMargins","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Allows a view to ignore safe area constraints."}],"blockTags":[{"tag":"@platform","content":[{"kind":"text","text":"iOS 26+"}]},{"tag":"@see","content":[{"kind":"text","text":"Official [SwiftUI documentation](https://developer.apple.com/documentation/swiftui/view/listsectionmargins(_:_:))."}]}]},"parameters":[{"name":"params","variant":"param","kind":32768,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"The margins to apply to the section in a list."}]},"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"children":[{"name":"edges","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"union","types":[{"type":"literal","value":"top"},{"type":"literal","value":"bottom"},{"type":"literal","value":"leading"},{"type":"literal","value":"trailing"},{"type":"literal","value":"horizontal"},{"type":"literal","value":"vertical"},{"type":"literal","value":"all"}]}},{"name":"length","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"intrinsic","name":"number"}}]}}}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"listSectionSpacing","variant":"declaration","kind":64,"signatures":[{"name":"listSectionSpacing","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Sets the spacing between adjacent sections."}],"blockTags":[{"tag":"@platform","content":[{"kind":"text","text":"ios 17.0+"}]}]},"parameters":[{"name":"spacing","variant":"param","kind":32768,"comment":{"summary":[{"kind":"text","text":"The spacing to apply."}]},"type":{"type":"union","types":[{"type":"intrinsic","name":"number"},{"type":"literal","value":"default"},{"type":"literal","value":"compact"}]}}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"listStyle","variant":"declaration","kind":64,"signatures":[{"name":"listStyle","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Sets the style for a List view."}],"blockTags":[{"tag":"@see","content":[{"kind":"text","text":"Official [SwiftUI documentation](https://developer.apple.com/documentation/swiftui/view/liststyle(_:))."}]}]},"parameters":[{"name":"style","variant":"param","kind":32768,"comment":{"summary":[{"kind":"text","text":"The list style to apply."}]},"type":{"type":"reference","name":"ListStyle","package":"@expo/ui"}}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"luminanceToAlpha","variant":"declaration","kind":64,"signatures":[{"name":"luminanceToAlpha","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Adds a luminance to alpha effect to this view."}],"blockTags":[{"tag":"@see","content":[{"kind":"text","text":"Official [SwiftUI documentation](https://developer.apple.com/documentation/SwiftUI/View/luminanceToAlpha())."}]}]},"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"mask","variant":"declaration","kind":64,"signatures":[{"name":"mask","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Applies a mask to the view."}],"blockTags":[{"tag":"@see","content":[{"kind":"text","text":"Official [SwiftUI documentation](https://developer.apple.com/documentation/swiftui/view/mask(_:))."}]}]},"parameters":[{"name":"shape","variant":"param","kind":32768,"comment":{"summary":[{"kind":"text","text":"The masking shape."}]},"type":{"type":"union","types":[{"type":"literal","value":"roundedRectangle"},{"type":"literal","value":"capsule"},{"type":"literal","value":"rectangle"},{"type":"literal","value":"ellipse"},{"type":"literal","value":"circle"},{"type":"literal","value":"containerRelativeShape"}]}},{"name":"cornerRadius","variant":"param","kind":32768,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Corner radius for rounded rectangle (default: "},{"kind":"code","text":"`8`"},{"kind":"text","text":")."}]},"type":{"type":"intrinsic","name":"number"}}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"matchedGeometryEffect","variant":"declaration","kind":64,"signatures":[{"name":"matchedGeometryEffect","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Adds a matched geometry effect to a view."}],"blockTags":[{"tag":"@see","content":[{"kind":"text","text":"Official [SwiftUI documentation](https://developer.apple.com/documentation/swiftui/view/matchedgeometryeffect(id:in:properties:anchor:issource:))."}]}]},"parameters":[{"name":"id","variant":"param","kind":32768,"comment":{"summary":[{"kind":"text","text":"The id of the view."}]},"type":{"type":"intrinsic","name":"string"}},{"name":"namespaceId","variant":"param","kind":32768,"comment":{"summary":[{"kind":"text","text":"The namespace id of the view. Use Namespace component to create a namespace."}]},"type":{"type":"intrinsic","name":"string"}}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"menuActionDismissBehavior","variant":"declaration","kind":64,"signatures":[{"name":"menuActionDismissBehavior","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Controls the dismissal behavior of menu actions."}],"blockTags":[{"tag":"@platform","content":[{"kind":"text","text":"ios 16.4+"}]},{"tag":"@platform","content":[{"kind":"text","text":"tvos 17.0+"}]},{"tag":"@see","content":[{"kind":"text","text":"Official [SwiftUI documentation](https://developer.apple.com/documentation/swiftui/view/menuactiondismissbehavior(_:))."}]}]},"parameters":[{"name":"behavior","variant":"param","kind":32768,"comment":{"summary":[{"kind":"text","text":"The menu action dismiss behavior."}]},"type":{"type":"union","types":[{"type":"literal","value":"automatic"},{"type":"literal","value":"enabled"},{"type":"literal","value":"disabled"}]}}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"monospacedDigit","variant":"declaration","kind":64,"signatures":[{"name":"monospacedDigit","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Modifies the fonts of all child views to use fixed-width digits, if possible, while leaving other characters proportionally spaced.\nWhen applied to "},{"kind":"code","text":"`Text`"},{"kind":"text","text":", modifies the text view's font to use fixed-width digits, while leaving other characters proportionally spaced."}],"blockTags":[{"tag":"@see","content":[{"kind":"text","text":"Official [SwiftUI documentation](https://developer.apple.com/documentation/swiftui/view/monospaceddigit())."}]}]},"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"moveDisabled","variant":"declaration","kind":64,"signatures":[{"name":"moveDisabled","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Disables the move action for a view in a list.\nApply to items within a "},{"kind":"code","text":"`ForEach`"},{"kind":"text","text":" to prevent them from being moved."}],"blockTags":[{"tag":"@default","content":[{"kind":"text","text":"true"}]},{"tag":"@see","content":[{"kind":"text","text":"Official [SwiftUI documentation](https://developer.apple.com/documentation/swiftui/view/movedisabled(_:))."}]}]},"parameters":[{"name":"disabled","variant":"param","kind":32768,"comment":{"summary":[{"kind":"text","text":"Whether moving should be disabled"}]},"type":{"type":"intrinsic","name":"boolean"},"defaultValue":"true"}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"multilineTextAlignment","variant":"declaration","kind":64,"signatures":[{"name":"multilineTextAlignment","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"An alignment position for text along the horizontal axis."}],"blockTags":[{"tag":"@see","content":[{"kind":"text","text":"Official [SwiftUI documentation](https://developer.apple.com/documentation/swiftui/view/multilinetextalignment(_:))."}]}]},"parameters":[{"name":"alignment","variant":"param","kind":32768,"comment":{"summary":[{"kind":"text","text":"A value that you use to align multiple lines of text within a view."}]},"type":{"type":"union","types":[{"type":"literal","value":"center"},{"type":"literal","value":"leading"},{"type":"literal","value":"trailing"}]}}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"offset","variant":"declaration","kind":64,"signatures":[{"name":"offset","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Applies an offset (translation) to a view."}],"blockTags":[{"tag":"@see","content":[{"kind":"text","text":"Official [SwiftUI documentation](https://developer.apple.com/documentation/swiftui/view/offset(x:y:))."}]}]},"parameters":[{"name":"params","variant":"param","kind":32768,"comment":{"summary":[{"kind":"text","text":"The offset parameters: "},{"kind":"code","text":"`x`"},{"kind":"text","text":" and "},{"kind":"code","text":"`y`"},{"kind":"text","text":"."}]},"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"children":[{"name":"x","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"intrinsic","name":"number"}},{"name":"y","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"intrinsic","name":"number"}}]}}}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"onAppear","variant":"declaration","kind":64,"signatures":[{"name":"onAppear","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Adds an onAppear modifier that calls a function when the view appears."}],"blockTags":[{"tag":"@see","content":[{"kind":"text","text":"Official [SwiftUI documentation](https://developer.apple.com/documentation/swiftui/view/onappear(perform:))."}]}]},"parameters":[{"name":"handler","variant":"param","kind":32768,"comment":{"summary":[{"kind":"text","text":"Function to call when the view appears."}]},"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"signatures":[{"name":"__type","variant":"signature","kind":4096,"type":{"type":"intrinsic","name":"void"}}]}}}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"onDisappear","variant":"declaration","kind":64,"signatures":[{"name":"onDisappear","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Adds an onDisappear modifier that calls a function when the view disappears."}],"blockTags":[{"tag":"@see","content":[{"kind":"text","text":"Official [SwiftUI documentation](https://developer.apple.com/documentation/swiftui/view/ondisappear(perform:))."}]}]},"parameters":[{"name":"handler","variant":"param","kind":32768,"comment":{"summary":[{"kind":"text","text":"Function to call when the view disappears."}]},"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"signatures":[{"name":"__type","variant":"signature","kind":4096,"type":{"type":"intrinsic","name":"void"}}]}}}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"onGeometryChange","variant":"declaration","kind":64,"signatures":[{"name":"onGeometryChange","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Calls the handler whenever the view's geometry changes. Sizes are in points."}],"blockTags":[{"tag":"@see","content":[{"kind":"text","text":"Official [SwiftUI documentation](https://developer.apple.com/documentation/swiftui/view/ongeometrychange(for:of:action:))."}]}]},"parameters":[{"name":"handler","variant":"param","kind":32768,"comment":{"summary":[{"kind":"text","text":"Function called with the new size."}]},"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"signatures":[{"name":"__type","variant":"signature","kind":4096,"parameters":[{"name":"size","variant":"param","kind":32768,"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"children":[{"name":"height","variant":"declaration","kind":1024,"type":{"type":"intrinsic","name":"number"}},{"name":"width","variant":"declaration","kind":1024,"type":{"type":"intrinsic","name":"number"}}]}}}],"type":{"type":"intrinsic","name":"void"}}]}}}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"onLongPressGesture","variant":"declaration","kind":64,"signatures":[{"name":"onLongPressGesture","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Adds a long press gesture recognizer."}]},"parameters":[{"name":"handler","variant":"param","kind":32768,"comment":{"summary":[{"kind":"text","text":"Function to call when long pressed."}]},"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"signatures":[{"name":"__type","variant":"signature","kind":4096,"type":{"type":"intrinsic","name":"void"}}]}}},{"name":"minimumDuration","variant":"param","kind":32768,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Minimum duration for long press (default: 0.5s)"}]},"type":{"type":"intrinsic","name":"number"}}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"onSubmit","variant":"declaration","kind":64,"signatures":[{"name":"onSubmit","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Adds an action to perform when the user submits a value to this view (e.g. pressing return in a text field)."}],"blockTags":[{"tag":"@see","content":[{"kind":"text","text":"Official [SwiftUI documentation](https://developer.apple.com/documentation/swiftui/view/onsubmit(of:_:))."}]}]},"parameters":[{"name":"handler","variant":"param","kind":32768,"comment":{"summary":[{"kind":"text","text":"Function to call on submit."}]},"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"signatures":[{"name":"__type","variant":"signature","kind":4096,"type":{"type":"intrinsic","name":"void"}}]}}}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"onTapGesture","variant":"declaration","kind":64,"signatures":[{"name":"onTapGesture","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Adds a tap gesture recognizer."}],"blockTags":[{"tag":"@see","content":[{"kind":"text","text":"Official [SwiftUI documentation](https://developer.apple.com/documentation/swiftui/view/ontapgesture(count:perform:))."}]}]},"parameters":[{"name":"handler","variant":"param","kind":32768,"comment":{"summary":[{"kind":"text","text":"Function to call when tapped."}]},"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"signatures":[{"name":"__type","variant":"signature","kind":4096,"type":{"type":"intrinsic","name":"void"}}]}}}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"opacity","variant":"declaration","kind":64,"signatures":[{"name":"opacity","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Sets the opacity of a view."}],"blockTags":[{"tag":"@see","content":[{"kind":"text","text":"Official [SwiftUI documentation](https://developer.apple.com/documentation/swiftui/view/opacity(_:))."}]}]},"parameters":[{"name":"value","variant":"param","kind":32768,"comment":{"summary":[{"kind":"text","text":"Opacity value between 0 and 1."}]},"type":{"type":"intrinsic","name":"number"}}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"overlay","variant":"declaration","kind":64,"signatures":[{"name":"overlay","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Overlays another view on top."}],"blockTags":[{"tag":"@see","content":[{"kind":"text","text":"Official [SwiftUI documentation](https://developer.apple.com/documentation/swiftui/view/overlay(_:alignment:))."}]}]},"parameters":[{"name":"params","variant":"param","kind":32768,"comment":{"summary":[{"kind":"text","text":"Overlay color and alignment."}]},"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"children":[{"name":"alignment","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"union","types":[{"type":"literal","value":"center"},{"type":"literal","value":"top"},{"type":"literal","value":"bottom"},{"type":"literal","value":"leading"},{"type":"literal","value":"trailing"}]}},{"name":"color","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"reference","name":"Color","package":"@expo/ui"}}]}}}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"padding","variant":"declaration","kind":64,"signatures":[{"name":"padding","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Sets padding on a view.\nSupports individual edges or shorthand properties."}],"blockTags":[{"tag":"@see","content":[{"kind":"text","text":"Official [SwiftUI documentation](https://developer.apple.com/documentation/SwiftUI/View/padding(_:_:))."}]}]},"parameters":[{"name":"params","variant":"param","kind":32768,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"The padding parameters: "},{"kind":"code","text":"`top`"},{"kind":"text","text":", "},{"kind":"code","text":"`bottom`"},{"kind":"text","text":", "},{"kind":"code","text":"`leading`"},{"kind":"text","text":", "},{"kind":"code","text":"`trailing`"},{"kind":"text","text":", "},{"kind":"code","text":"`horizontal`"},{"kind":"text","text":", "},{"kind":"code","text":"`vertical`"},{"kind":"text","text":" and "},{"kind":"code","text":"`all`"},{"kind":"text","text":"."}]},"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"children":[{"name":"all","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"intrinsic","name":"number"}},{"name":"bottom","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"intrinsic","name":"number"}},{"name":"horizontal","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"intrinsic","name":"number"}},{"name":"leading","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"intrinsic","name":"number"}},{"name":"top","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"intrinsic","name":"number"}},{"name":"trailing","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"intrinsic","name":"number"}},{"name":"vertical","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"intrinsic","name":"number"}}]}}}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"pickerStyle","variant":"declaration","kind":64,"signatures":[{"name":"pickerStyle","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Sets the style for the picker."}],"blockTags":[{"tag":"@see","content":[{"kind":"text","text":"Official [SwiftUI documentation](https://developer.apple.com/documentation/swiftui/pickerstyle)."}]}]},"parameters":[{"name":"style","variant":"param","kind":32768,"comment":{"summary":[{"kind":"text","text":"The style for the picker."}]},"type":{"type":"reference","name":"PickerStyleType","package":"@expo/ui"}}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"presentationBackgroundInteraction","variant":"declaration","kind":64,"signatures":[{"name":"presentationBackgroundInteraction","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Controls interaction with the content behind a sheet."}],"blockTags":[{"tag":"@platform","content":[{"kind":"text","text":"ios 16.4+"}]},{"tag":"@platform","content":[{"kind":"text","text":"tvos 16.4+"}]},{"tag":"@see","content":[{"kind":"text","text":"Official [SwiftUI documentation](https://developer.apple.com/documentation/swiftui/view/presentationbackgroundinteraction(_:))."}]}]},"parameters":[{"name":"interaction","variant":"param","kind":32768,"comment":{"summary":[{"kind":"text","text":"The background interaction behavior."}]},"type":{"type":"reference","name":"PresentationBackgroundInteractionType","package":"@expo/ui"}}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"presentationDetents","variant":"declaration","kind":64,"signatures":[{"name":"presentationDetents","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Sets the available heights for a sheet presentation."}],"blockTags":[{"tag":"@platform","content":[{"kind":"text","text":"ios 16.0+"}]},{"tag":"@platform","content":[{"kind":"text","text":"tvos 16.0+"}]},{"tag":"@see","content":[{"kind":"text","text":"Official [SwiftUI documentation](https://developer.apple.com/documentation/swiftui/view/presentationdetents(_:selection:))."}]}]},"parameters":[{"name":"detents","variant":"param","kind":32768,"comment":{"summary":[{"kind":"text","text":"Array of detents the sheet can snap to."}]},"type":{"type":"array","elementType":{"type":"reference","name":"PresentationDetent","package":"@expo/ui"}}},{"name":"options","variant":"param","kind":32768,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Optional settings for tracking the selected detent."}]},"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"children":[{"name":"onSelectionChange","variant":"declaration","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Callback fired when the user changes the active detent by dragging."}]},"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"signatures":[{"name":"__type","variant":"signature","kind":4096,"parameters":[{"name":"detent","variant":"param","kind":32768,"type":{"type":"reference","name":"PresentationDetent","package":"@expo/ui"}}],"type":{"type":"intrinsic","name":"void"}}]}}},{"name":"selection","variant":"declaration","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"The currently selected detent."}]},"type":{"type":"reference","name":"PresentationDetent","package":"@expo/ui"}}]}}}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"presentationDragIndicator","variant":"declaration","kind":64,"signatures":[{"name":"presentationDragIndicator","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Controls the visibility of the drag indicator on a sheet."}],"blockTags":[{"tag":"@platform","content":[{"kind":"text","text":"ios 16.0+"}]},{"tag":"@platform","content":[{"kind":"text","text":"tvos 16.0+"}]},{"tag":"@see","content":[{"kind":"text","text":"Official [SwiftUI documentation](https://developer.apple.com/documentation/swiftui/view/presentationdragindicator(_:))."}]}]},"parameters":[{"name":"visibility","variant":"param","kind":32768,"comment":{"summary":[{"kind":"text","text":"The visibility of the drag indicator."}]},"type":{"type":"union","types":[{"type":"literal","value":"automatic"},{"type":"literal","value":"visible"},{"type":"literal","value":"hidden"}]}}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"progressViewStyle","variant":"declaration","kind":64,"signatures":[{"name":"progressViewStyle","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Sets the style for the progress view."}],"blockTags":[{"tag":"@see","content":[{"kind":"text","text":"Official [SwiftUI documentation](https://developer.apple.com/documentation/swiftui/progressviewstyle)."}]}]},"parameters":[{"name":"style","variant":"param","kind":32768,"comment":{"summary":[{"kind":"text","text":"The style for the progress view."}]},"type":{"type":"reference","name":"ProgressViewStyleType","package":"@expo/ui"}}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"refreshable","variant":"declaration","kind":64,"signatures":[{"name":"refreshable","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Marks a view as refreshable. Adds pull-to-refresh functionality."}],"blockTags":[{"tag":"@see","content":[{"kind":"text","text":"Official [SwiftUI documentation](https://developer.apple.com/documentation/swiftui/view/refreshable(action:))."}]}]},"parameters":[{"name":"handler","variant":"param","kind":32768,"comment":{"summary":[{"kind":"text","text":"Async function to call when refresh is triggered."}]},"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"signatures":[{"name":"__type","variant":"signature","kind":4096,"type":{"type":"reference","target":{"packageName":"typescript","packagePath":"lib/lib.es5.d.ts","qualifiedName":"Promise"},"typeArguments":[{"type":"intrinsic","name":"void"}],"name":"Promise","package":"typescript"}}]}}}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"resizable","variant":"declaration","kind":64,"signatures":[{"name":"resizable","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Sets the mode by which SwiftUI resizes an image to fit its space."}],"blockTags":[{"tag":"@see","content":[{"kind":"text","text":"Official [SwiftUI documentation](https://developer.apple.com/documentation/swiftui/image/resizable(capinsets:resizingmode:))."}]}]},"parameters":[{"name":"capInsets","variant":"param","kind":32768,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Inset values that indicate a portion of the image that SwiftUI doesn’t resize."}]},"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"children":[{"name":"bottom","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"intrinsic","name":"number"}},{"name":"leading","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"intrinsic","name":"number"}},{"name":"top","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"intrinsic","name":"number"}},{"name":"trailing","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"intrinsic","name":"number"}}]}}},{"name":"resizingMode","variant":"param","kind":32768,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"The mode by which SwiftUI resizes the image."}]},"type":{"type":"union","types":[{"type":"literal","value":"stretch"},{"type":"literal","value":"tile"}]}}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"rotation3DEffect","variant":"declaration","kind":64,"signatures":[{"name":"rotation3DEffect","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Applies a 3D rotation transformation."}],"blockTags":[{"tag":"@see","content":[{"kind":"text","text":"Official [SwiftUI documentation](https://developer.apple.com/documentation/swiftui/view/rotation3deffect(_:axis:anchor:anchorz:perspective:))."}]}]},"parameters":[{"name":"params","variant":"param","kind":32768,"comment":{"summary":[{"kind":"text","text":"The rotation parameters: "},{"kind":"code","text":"`angle`"},{"kind":"text","text":" (in degrees), "},{"kind":"code","text":"`axis`"},{"kind":"text","text":" (x, y, z), and "},{"kind":"code","text":"`perspective`"},{"kind":"text","text":"."}]},"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"children":[{"name":"angle","variant":"declaration","kind":1024,"type":{"type":"intrinsic","name":"number"}},{"name":"axis","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"children":[{"name":"x","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"intrinsic","name":"number"}},{"name":"y","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"intrinsic","name":"number"}},{"name":"z","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"intrinsic","name":"number"}}]}}},{"name":"perspective","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"intrinsic","name":"number"}}]}}}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"rotationEffect","variant":"declaration","kind":64,"signatures":[{"name":"rotationEffect","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Applies rotation transformation."}],"blockTags":[{"tag":"@see","content":[{"kind":"text","text":"Official [SwiftUI documentation](https://developer.apple.com/documentation/swiftui/view/rotationeffect(_:anchor:))."}]}]},"parameters":[{"name":"angle","variant":"param","kind":32768,"comment":{"summary":[{"kind":"text","text":"Rotation angle in degrees."}]},"type":{"type":"intrinsic","name":"number"}}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"saturation","variant":"declaration","kind":64,"signatures":[{"name":"saturation","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Adjusts the saturation of a view."}],"blockTags":[{"tag":"@see","content":[{"kind":"text","text":"Official [SwiftUI documentation](https://developer.apple.com/documentation/swiftui/view/saturation(_:))."}]}]},"parameters":[{"name":"amount","variant":"param","kind":32768,"comment":{"summary":[{"kind":"text","text":"Saturation multiplier (0 to infinity, 1 = normal)."}]},"type":{"type":"intrinsic","name":"number"}}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"scaleEffect","variant":"declaration","kind":64,"signatures":[{"name":"scaleEffect","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Applies scaling transformation."}],"blockTags":[{"tag":"@see","content":[{"kind":"text","text":"Official [SwiftUI documentation](https://developer.apple.com/documentation/swiftui/view/scaleeffect(_:anchor:))."}]}]},"parameters":[{"name":"scale","variant":"param","kind":32768,"comment":{"summary":[{"kind":"text","text":"Uniform scale factor (1.0 = normal size), or an object with separate "},{"kind":"code","text":"`x`"},{"kind":"text","text":" and "},{"kind":"code","text":"`y`"},{"kind":"text","text":" scale factors."}]},"type":{"type":"union","types":[{"type":"intrinsic","name":"number"},{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"children":[{"name":"x","variant":"declaration","kind":1024,"type":{"type":"intrinsic","name":"number"}},{"name":"y","variant":"declaration","kind":1024,"type":{"type":"intrinsic","name":"number"}}]}}]}}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"scrollContentBackground","variant":"declaration","kind":64,"signatures":[{"name":"scrollContentBackground","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Specifies the visibility of the background for scrollable views within this view."}],"blockTags":[{"tag":"@see","content":[{"kind":"text","text":"Official [SwiftUI documentation](https://developer.apple.com/documentation/swiftui/view/scrollcontentbackground(_:))."}]}]},"parameters":[{"name":"visible","variant":"param","kind":32768,"comment":{"summary":[{"kind":"text","text":"The visibility of the background."}]},"type":{"type":"union","types":[{"type":"literal","value":"automatic"},{"type":"literal","value":"visible"},{"type":"literal","value":"hidden"}]}}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"scrollDisabled","variant":"declaration","kind":64,"signatures":[{"name":"scrollDisabled","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Disables or enables scrolling in scrollable views."}],"blockTags":[{"tag":"@platform","content":[{"kind":"text","text":"ios 16.0+"}]},{"tag":"@platform","content":[{"kind":"text","text":"tvos 16.0+"}]},{"tag":"@see","content":[{"kind":"text","text":"Official [SwiftUI documentation](https://developer.apple.com/documentation/swiftui/view/scrolldisabled(_:))."}]}]},"parameters":[{"name":"disabled","variant":"param","kind":32768,"comment":{"summary":[{"kind":"text","text":"Whether scrolling should be disabled (default: true)."}]},"type":{"type":"intrinsic","name":"boolean"},"defaultValue":"true"}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"scrollDismissesKeyboard","variant":"declaration","kind":64,"signatures":[{"name":"scrollDismissesKeyboard","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Controls how the keyboard is dismissed when scrolling."}],"blockTags":[{"tag":"@platform","content":[{"kind":"text","text":"ios 16.0+"}]},{"tag":"@platform","content":[{"kind":"text","text":"tvos 16.0+"}]},{"tag":"@see","content":[{"kind":"text","text":"Official [SwiftUI documentation](https://developer.apple.com/documentation/swiftui/view/scrolldismisseskeyboard(_:))."}]}]},"parameters":[{"name":"mode","variant":"param","kind":32768,"comment":{"summary":[{"kind":"text","text":"The keyboard dismiss mode."}]},"type":{"type":"union","types":[{"type":"literal","value":"automatic"},{"type":"literal","value":"never"},{"type":"literal","value":"interactively"},{"type":"literal","value":"immediately"}]}}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"scrollIndicators","variant":"declaration","kind":64,"signatures":[{"name":"scrollIndicators","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Controls the visibility of scroll indicators for scrollable views.\nMirrors SwiftUI's "},{"kind":"code","text":"`scrollIndicators(_:axes:)`"},{"kind":"text","text":" modifier."}],"blockTags":[{"tag":"@platform","content":[{"kind":"text","text":"ios 16.0+"}]},{"tag":"@platform","content":[{"kind":"text","text":"tvos 16.0+"}]},{"tag":"@see","content":[{"kind":"text","text":"Official [SwiftUI documentation](https://developer.apple.com/documentation/swiftui/view/scrollindicators(_:axes:))."}]}]},"parameters":[{"name":"visibility","variant":"param","kind":32768,"comment":{"summary":[{"kind":"text","text":"Indicator visibility:\n- "},{"kind":"code","text":"`'automatic'`"},{"kind":"text","text":": platform-default behavior.\n- "},{"kind":"code","text":"`'visible'`"},{"kind":"text","text":": prefer showing indicators (may still be hidden by the system).\n- "},{"kind":"code","text":"`'hidden'`"},{"kind":"text","text":": prefer hiding indicators (may still be shown by the system).\n- "},{"kind":"code","text":"`'never'`"},{"kind":"text","text":": never show indicators."}]},"type":{"type":"union","types":[{"type":"literal","value":"automatic"},{"type":"literal","value":"never"},{"type":"literal","value":"visible"},{"type":"literal","value":"hidden"}]}},{"name":"axes","variant":"param","kind":32768,"comment":{"summary":[{"kind":"text","text":"Axes to apply the visibility to. Defaults to "},{"kind":"code","text":"`'both'`"},{"kind":"text","text":"."}]},"type":{"type":"union","types":[{"type":"literal","value":"horizontal"},{"type":"literal","value":"vertical"},{"type":"literal","value":"both"}]},"defaultValue":"'both'"}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"scrollPosition","variant":"declaration","kind":64,"signatures":[{"name":"scrollPosition","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Binds the leading scroll target of a scrollable container to an observable native state.\n\nReading "},{"kind":"code","text":"`state.value`"},{"kind":"text","text":" returns the id of the leading scroll target. Writing to it scrolls\nthe container to the matching view. Pair with "},{"kind":"code","text":"`scrollTargetLayout()`"},{"kind":"text","text":" on the content\ncontainer and "},{"kind":"code","text":"`id()`"},{"kind":"text","text":" on each target. Works on "},{"kind":"code","text":"`ScrollView`"},{"kind":"text","text":", "},{"kind":"code","text":"`LazyVStack`"},{"kind":"text","text":", "},{"kind":"code","text":"`LazyHStack`"},{"kind":"text","text":",\nand other scrollable containers.\n\nOn iOS below 17.0, the modifier is a no-op."}],"blockTags":[{"tag":"@platform","content":[{"kind":"text","text":"ios 17.0+"}]},{"tag":"@platform","content":[{"kind":"text","text":"tvos 17.0+"}]},{"tag":"@platform","content":[{"kind":"text","text":"macos 14.0+"}]},{"tag":"@see","content":[{"kind":"text","text":"Official [SwiftUI documentation](https://developer.apple.com/documentation/swiftui/view/scrollposition(id:anchor:))."}]},{"tag":"@example","content":[{"kind":"code","text":"```tsx\nconst activeID = useNativeState(null);\n\n console.log('leading target:', newID),\n }),\n ]}>\n \n {items.map((item) => (\n {item.text}\n ))}\n \n\n```"}]}]},"parameters":[{"name":"state","variant":"param","kind":32768,"comment":{"summary":[{"kind":"text","text":"An "},{"kind":"code","text":"`ObservableState`"},{"kind":"text","text":" created with "},{"kind":"code","text":"`useNativeState`"},{"kind":"text","text":"."}]},"type":{"type":"reference","typeArguments":[{"type":"union","types":[{"type":"intrinsic","name":"string"},{"type":"literal","value":null}]}],"name":"ObservableState","package":"@expo/ui"}},{"name":"options","variant":"param","kind":32768,"flags":{"isOptional":true},"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"children":[{"name":"anchor","variant":"declaration","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Anchor used to pick which view drives the binding and to align\n programmatic scrolls. Maps to the "},{"kind":"code","text":"`anchor:`"},{"kind":"text","text":" parameter of SwiftUI's "},{"kind":"code","text":"`.scrollPosition(id:anchor:)`"},{"kind":"text","text":"."}]},"type":{"type":"reference","name":"UnitPointValue","package":"@expo/ui"}},{"name":"onChange","variant":"declaration","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Fires on the JS thread whenever the leading scroll target changes."}]},"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"signatures":[{"name":"__type","variant":"signature","kind":4096,"parameters":[{"name":"id","variant":"param","kind":32768,"type":{"type":"union","types":[{"type":"intrinsic","name":"string"},{"type":"literal","value":null}]}}],"type":{"type":"intrinsic","name":"void"}}]}}}]}}}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"scrollTargetBehavior","variant":"declaration","kind":64,"signatures":[{"name":"scrollTargetBehavior","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Sets the scroll snapping behavior for scrollable views.\nUse with "},{"kind":"code","text":"`scrollTargetLayout`"},{"kind":"text","text":" on the content container."}],"blockTags":[{"tag":"@platform","content":[{"kind":"text","text":"ios 17.0+"}]},{"tag":"@see","content":[{"kind":"text","text":"Official [SwiftUI documentation](https://developer.apple.com/documentation/swiftui/view/scrolltargetbehavior(_:))."}]}]},"parameters":[{"name":"behavior","variant":"param","kind":32768,"comment":{"summary":[{"kind":"code","text":"`'paging'`"},{"kind":"text","text":" for container-aligned snapping, "},{"kind":"code","text":"`'viewAligned'`"},{"kind":"text","text":" for view-aligned snapping."}]},"type":{"type":"union","types":[{"type":"literal","value":"paging"},{"type":"literal","value":"viewAligned"}]}}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"scrollTargetLayout","variant":"declaration","kind":64,"signatures":[{"name":"scrollTargetLayout","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Configures a layout container as a scroll target layout for view-aligned snapping.\nApply to "},{"kind":"code","text":"`VStack`"},{"kind":"text","text":" or "},{"kind":"code","text":"`HStack`"},{"kind":"text","text":" inside a "},{"kind":"code","text":"`ScrollView`"},{"kind":"text","text":"."}],"blockTags":[{"tag":"@platform","content":[{"kind":"text","text":"ios 17.0+"}]},{"tag":"@see","content":[{"kind":"text","text":"Official [SwiftUI documentation](https://developer.apple.com/documentation/swiftui/view/scrolltargetlayout(isenabled:))."}]}]},"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"shadow","variant":"declaration","kind":64,"signatures":[{"name":"shadow","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Adds a shadow to a view."}],"blockTags":[{"tag":"@see","content":[{"kind":"text","text":"Official [SwiftUI documentation](https://developer.apple.com/documentation/SwiftUI/View/shadow(color:radius:x:y:))."}]}]},"parameters":[{"name":"params","variant":"param","kind":32768,"comment":{"summary":[{"kind":"text","text":"The shadow parameters: "},{"kind":"code","text":"`radius`"},{"kind":"text","text":", offset ("},{"kind":"code","text":"`x`"},{"kind":"text","text":", "},{"kind":"code","text":"`y`"},{"kind":"text","text":") and "},{"kind":"code","text":"`color`"},{"kind":"text","text":"."}]},"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"children":[{"name":"color","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"reference","name":"Color","package":"@expo/ui"}},{"name":"radius","variant":"declaration","kind":1024,"type":{"type":"intrinsic","name":"number"}},{"name":"x","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"intrinsic","name":"number"}},{"name":"y","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"intrinsic","name":"number"}}]}}}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"strikethrough","variant":"declaration","kind":64,"signatures":[{"name":"strikethrough","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Applies a strikethrough to the text."}],"blockTags":[{"tag":"@see","content":[{"kind":"text","text":"Official [SwiftUI documentation](https://developer.apple.com/documentation/swiftui/text/strikethrough(_:color:))."}]}]},"parameters":[{"name":"params","variant":"param","kind":32768,"comment":{"summary":[{"kind":"text","text":"Controls whether the strikethrough is visible ("},{"kind":"code","text":"`true`"},{"kind":"text","text":" to show, "},{"kind":"code","text":"`false`"},{"kind":"text","text":" to hide)."}]},"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"children":[{"name":"color","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"reference","name":"Color","package":"@expo/ui"}},{"name":"isActive","variant":"declaration","kind":1024,"type":{"type":"intrinsic","name":"boolean"}},{"name":"pattern","variant":"declaration","kind":1024,"type":{"type":"reference","target":{"packageName":"@expo/ui","packagePath":"src/swift-ui/modifiers/index.ts","qualifiedName":"LinePattern"},"name":"LinePattern","package":"@expo/ui"}}]}}}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"submitLabel","variant":"declaration","kind":64,"signatures":[{"name":"submitLabel","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Specifies the label to display in the keyboard's return key. For example, "},{"kind":"code","text":"`'done'`"},{"kind":"text","text":"."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"A view that uses the specified submit label."}]},{"tag":"@platform","content":[{"kind":"text","text":"iOS 15+"}]},{"tag":"@example","content":[{"kind":"code","text":"```tsx\n\n```"}]}]},"parameters":[{"name":"submitLabel","variant":"param","kind":32768,"comment":{"summary":[{"kind":"text","text":"The label to display in the keyboard's return key."}]},"type":{"type":"union","types":[{"type":"literal","value":"join"},{"type":"literal","value":"search"},{"type":"literal","value":"done"},{"type":"literal","value":"continue"},{"type":"literal","value":"go"},{"type":"literal","value":"next"},{"type":"literal","value":"return"},{"type":"literal","value":"route"},{"type":"literal","value":"send"}]}}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"symbolEffect","variant":"declaration","kind":64,"signatures":[{"name":"symbolEffect","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Applies an SF Symbol effect to a view."}],"blockTags":[{"tag":"@platform","content":[{"kind":"text","text":"ios 17.0+"}]},{"tag":"@platform","content":[{"kind":"text","text":"tvos 17.0+"}]},{"tag":"@see","content":[{"kind":"text","text":"Official [SwiftUI documentation](https://developer.apple.com/documentation/SwiftUI/View/symbolEffect(_:options:value:))."}]},{"tag":"@example","content":[{"kind":"code","text":"```tsx\nconst trigger = useNativeState(0);\n\n```"}]}]},"parameters":[{"name":"effect","variant":"param","kind":32768,"type":{"type":"reference","name":"SymbolEffect","package":"@expo/ui"}},{"name":"args","variant":"param","kind":32768,"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"children":[{"name":"isActive","variant":"declaration","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Indefinite effects: runs while "},{"kind":"code","text":"`state.value === true`"},{"kind":"text","text":". Default active when omitted."}]},"type":{"type":"reference","typeArguments":[{"type":"intrinsic","name":"boolean"}],"name":"ObservableState","package":"@expo/ui"}},{"name":"options","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"reference","name":"SymbolEffectOptions","package":"@expo/ui"}},{"name":"value","variant":"declaration","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Discrete effects: the effect fires once each time this value changes."}]},"type":{"type":"reference","typeArguments":[{"type":"reference","name":"DiscreteSymbolEffectValue","package":"@expo/ui"}],"name":"ObservableState","package":"@expo/ui"}}]}},"defaultValue":"{}"}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"tabViewStyle","variant":"declaration","kind":64,"signatures":[{"name":"tabViewStyle","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Sets the style for a "},{"kind":"code","text":"`TabView`"},{"kind":"text","text":"."}],"blockTags":[{"tag":"@see","content":[{"kind":"text","text":"Official [SwiftUI documentation](https://developer.apple.com/documentation/swiftui/view/tabviewstyle(_:))."}]}]},"parameters":[{"name":"config","variant":"param","kind":32768,"type":{"type":"reference","name":"TabViewStyleConfig","package":"@expo/ui"}}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"tag","variant":"declaration","kind":64,"signatures":[{"name":"tag","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Sets a tag on a view."}],"blockTags":[{"tag":"@see","content":[{"kind":"text","text":"Official [SwiftUI documentation](https://developer.apple.com/documentation/swiftui/view/tag(_:includeoptional:))."}]}]},"parameters":[{"name":"tag","variant":"param","kind":32768,"comment":{"summary":[{"kind":"text","text":"The tag to set on the view."}]},"type":{"type":"union","types":[{"type":"intrinsic","name":"string"},{"type":"intrinsic","name":"number"}]}}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"textCase","variant":"declaration","kind":64,"signatures":[{"name":"textCase","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Sets a transform for the case of the text contained in this view when displayed."}],"blockTags":[{"tag":"@default","content":[{"kind":"text","text":"\"lowercase\""}]},{"tag":"@see","content":[{"kind":"text","text":"Official [SwiftUI documentation](https://developer.apple.com/documentation/swiftui/view/textcase(_:))."}]}]},"parameters":[{"name":"value","variant":"param","kind":32768,"type":{"type":"union","types":[{"type":"literal","value":"lowercase"},{"type":"literal","value":"uppercase"}]}}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"textContentType","variant":"declaration","kind":64,"signatures":[{"name":"textContentType","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Sets the text content type for input text, which the system uses to offer\nsuggestions (like autofill) while the user enters text."}],"blockTags":[{"tag":"@platform","content":[{"kind":"text","text":"ios 13.0+"}]},{"tag":"@see","content":[{"kind":"text","text":"Official [SwiftUI documentation](https://developer.apple.com/documentation/swiftui/view/textcontenttype(_:)-ufdv)."}]}]},"parameters":[{"name":"textContentType","variant":"param","kind":32768,"comment":{"summary":[{"kind":"text","text":"The semantic meaning of the text input area."}]},"type":{"type":"union","types":[{"type":"literal","value":"URL"},{"type":"literal","value":"namePrefix"},{"type":"literal","value":"name"},{"type":"literal","value":"nameSuffix"},{"type":"literal","value":"givenName"},{"type":"literal","value":"middleName"},{"type":"literal","value":"familyName"},{"type":"literal","value":"nickname"},{"type":"literal","value":"organizationName"},{"type":"literal","value":"jobTitle"},{"type":"literal","value":"location"},{"type":"literal","value":"fullStreetAddress"},{"type":"literal","value":"streetAddressLine1"},{"type":"literal","value":"streetAddressLine2"},{"type":"literal","value":"addressCity"},{"type":"literal","value":"addressCityAndState"},{"type":"literal","value":"addressState"},{"type":"literal","value":"postalCode"},{"type":"literal","value":"sublocality"},{"type":"literal","value":"countryName"},{"type":"literal","value":"username"},{"type":"literal","value":"password"},{"type":"literal","value":"newPassword"},{"type":"literal","value":"oneTimeCode"},{"type":"literal","value":"emailAddress"},{"type":"literal","value":"telephoneNumber"},{"type":"literal","value":"cellularEID"},{"type":"literal","value":"cellularIMEI"},{"type":"literal","value":"creditCardNumber"},{"type":"literal","value":"creditCardExpiration"},{"type":"literal","value":"creditCardExpirationMonth"},{"type":"literal","value":"creditCardExpirationYear"},{"type":"literal","value":"creditCardSecurityCode"},{"type":"literal","value":"creditCardType"},{"type":"literal","value":"creditCardName"},{"type":"literal","value":"creditCardGivenName"},{"type":"literal","value":"creditCardMiddleName"},{"type":"literal","value":"creditCardFamilyName"},{"type":"literal","value":"birthdate"},{"type":"literal","value":"birthdateDay"},{"type":"literal","value":"birthdateMonth"},{"type":"literal","value":"birthdateYear"},{"type":"literal","value":"dateTime"},{"type":"literal","value":"flightNumber"},{"type":"literal","value":"shipmentTrackingNumber"}]}}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"textFieldStyle","variant":"declaration","kind":64,"signatures":[{"name":"textFieldStyle","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Sets the text field style for text field views."}],"blockTags":[{"tag":"@see","content":[{"kind":"text","text":"Official [SwiftUI documentation](https://developer.apple.com/documentation/swiftui/view/textfieldstyle(_:))."}]}]},"parameters":[{"name":"style","variant":"param","kind":32768,"comment":{"summary":[{"kind":"text","text":"The text field style."}]},"type":{"type":"union","types":[{"type":"literal","value":"automatic"},{"type":"literal","value":"plain"},{"type":"literal","value":"roundedBorder"}]}}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"textInputAutocapitalization","variant":"declaration","kind":64,"signatures":[{"name":"textInputAutocapitalization","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Sets how often the shift key in the keyboard is automatically enabled."}],"blockTags":[{"tag":"@platform","content":[{"kind":"text","text":"ios 15.0+"}]},{"tag":"@see","content":[{"kind":"text","text":"Official [SwiftUI documentation](https://developer.apple.com/documentation/swiftui/view/textinputautocapitalization(_:))."}]}]},"parameters":[{"name":"autocapitalization","variant":"param","kind":32768,"comment":{"summary":[{"kind":"text","text":"The autocapitalization behavior."}]},"type":{"type":"union","types":[{"type":"literal","value":"never"},{"type":"literal","value":"words"},{"type":"literal","value":"sentences"},{"type":"literal","value":"characters"}]}}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"textSelection","variant":"declaration","kind":64,"signatures":[{"name":"textSelection","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Controls whether people can select text within this view."}],"blockTags":[{"tag":"@see","content":[{"kind":"text","text":"Official [SwiftUI documentation](https://developer.apple.com/documentation/swiftui/view/textselection(_:))."}]}]},"parameters":[{"name":"value","variant":"param","kind":32768,"comment":{"summary":[{"kind":"text","text":"Enable selection"}]},"type":{"type":"intrinsic","name":"boolean"}}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"tint","variant":"declaration","kind":64,"signatures":[{"name":"tint","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Sets the tint color of a view."}],"blockTags":[{"tag":"@see","content":[{"kind":"text","text":"Official [SwiftUI documentation](https://developer.apple.com/documentation/swiftui/view/tint(_:))."}]}]},"parameters":[{"name":"color","variant":"param","kind":32768,"comment":{"summary":[{"kind":"text","text":"The tint color (hex string). For example, "},{"kind":"code","text":"`#FF0000`"},{"kind":"text","text":"."}]},"type":{"type":"reference","name":"Color","package":"@expo/ui"}}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"toggleStyle","variant":"declaration","kind":64,"signatures":[{"name":"toggleStyle","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Sets the style for toggles within this view."}],"blockTags":[{"tag":"@see","content":[{"kind":"text","text":"Official [SwiftUI documentation](https://developer.apple.com/documentation/swiftui/view/togglestyle(_:))."}]}]},"parameters":[{"name":"style","variant":"param","kind":32768,"comment":{"summary":[{"kind":"text","text":"The toggle style."}]},"type":{"type":"union","types":[{"type":"literal","value":"automatic"},{"type":"literal","value":"switch"},{"type":"literal","value":"button"}]}}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"truncationMode","variant":"declaration","kind":64,"signatures":[{"name":"truncationMode","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Sets the truncation mode for lines of text that are too long to fit in the available space."}],"blockTags":[{"tag":"@see","content":[{"kind":"text","text":"Official [SwiftUI documentation](https://developer.apple.com/documentation/swiftui/view/truncationmode(_:))."}]}]},"parameters":[{"name":"mode","variant":"param","kind":32768,"comment":{"summary":[{"kind":"text","text":"The truncation mode that specifies where to truncate the text within the text view, if needed.\nYou can truncate at the beginning, middle, or end of the text view."}]},"type":{"type":"union","types":[{"type":"literal","value":"head"},{"type":"literal","value":"middle"},{"type":"literal","value":"tail"}]}}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"underline","variant":"declaration","kind":64,"signatures":[{"name":"underline","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Applies an underline to the text."}],"blockTags":[{"tag":"@see","content":[{"kind":"text","text":"Official [SwiftUI documentation](https://developer.apple.com/documentation/swiftui/view/underline(_:pattern:color:))."}]}]},"parameters":[{"name":"params","variant":"param","kind":32768,"comment":{"summary":[{"kind":"text","text":"Controls whether the underline is visible ("},{"kind":"code","text":"`true`"},{"kind":"text","text":" to show, "},{"kind":"code","text":"`false`"},{"kind":"text","text":" to hide)."}]},"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"children":[{"name":"color","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"reference","name":"Color","package":"@expo/ui"}},{"name":"isActive","variant":"declaration","kind":1024,"type":{"type":"intrinsic","name":"boolean"}},{"name":"pattern","variant":"declaration","kind":1024,"type":{"type":"reference","target":{"packageName":"@expo/ui","packagePath":"src/swift-ui/modifiers/index.ts","qualifiedName":"LinePattern"},"name":"LinePattern","package":"@expo/ui"}}]}}}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"widgetAccentedRenderingMode","variant":"declaration","kind":64,"signatures":[{"name":"widgetAccentedRenderingMode","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Specifies the how to render an Image when using the WidgetKit/WidgetRenderingMode/accented mode."}],"blockTags":[{"tag":"@see","content":[{"kind":"text","text":"Official [SwiftUI documentation](https://developer.apple.com/documentation/swiftui/image/widgetaccentedrenderingmode(_:))."}]}]},"parameters":[{"name":"renderingMode","variant":"param","kind":32768,"comment":{"summary":[{"kind":"text","text":"A constant describing how the Image should be rendered."}]},"type":{"type":"union","types":[{"type":"literal","value":"fullColor"},{"type":"literal","value":"accented"},{"type":"literal","value":"desaturated"},{"type":"literal","value":"accentedDesaturated"}]}}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"widgetURL","variant":"declaration","kind":64,"signatures":[{"name":"widgetURL","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Sets the URL to open in the containing app when the user clicks the widget.\nWidgets support one widgetURL modifier in their view hierarchy. If multiple views have widgetURL modifiers, the behavior is undefined."}],"blockTags":[{"tag":"@see","content":[{"kind":"text","text":"Official [SwiftUI documentation](https://developer.apple.com/documentation/SwiftUI/View/widgetURL(_:))."}]}]},"parameters":[{"name":"url","variant":"param","kind":32768,"comment":{"summary":[{"kind":"text","text":"The URL to open in the containing app."}]},"type":{"type":"intrinsic","name":"string"}}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]},{"name":"zIndex","variant":"declaration","kind":64,"signatures":[{"name":"zIndex","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Sets the z-index (display order) of a view."}],"blockTags":[{"tag":"@see","content":[{"kind":"text","text":"Official [SwiftUI documentation](https://developer.apple.com/documentation/swiftui/view/zindex(_:))."}]}]},"parameters":[{"name":"index","variant":"param","kind":32768,"comment":{"summary":[{"kind":"text","text":"The z-index value."}]},"type":{"type":"intrinsic","name":"number"}}],"type":{"type":"reference","name":"ModifierConfig","package":"@expo/ui"}}]}],"packageName":"@expo/ui"} \ No newline at end of file diff --git a/docs/public/static/data/v56.0.0/expo-ui/universal/host.json b/docs/public/static/data/v56.0.0/expo-ui/universal/host.json index 6ff086e6f2139f..fb93c952dbbb61 100644 --- a/docs/public/static/data/v56.0.0/expo-ui/universal/host.json +++ b/docs/public/static/data/v56.0.0/expo-ui/universal/host.json @@ -1 +1 @@ -{"schemaVersion":"2.0","name":"expo-ui/universal/host","variant":"project","kind":1,"children":[{"name":"UniversalHostProps","variant":"declaration","kind":256,"comment":{"summary":[{"kind":"text","text":"Props for the ["},{"kind":"code","text":"`Host`"},{"kind":"text","text":"](#host) component."}]},"children":[{"name":"aria-activedescendant","variant":"declaration","kind":1024,"flags":{"isOptional":true,"isInherited":true},"comment":{"summary":[{"kind":"text","text":"Aria props (additional, minus existants)"}],"blockTags":[{"tag":"@see","content":[{"kind":"text","text":" - "},{"kind":"text","text":"https://necolas.github.io/react-native-web/docs/accessibility"},{"kind":"text","text":"\n"},{"kind":"text","text":" - "},{"kind":"text","text":"https://reactnative.dev/docs/accessibility#aria-valuemax"},{"kind":"text","text":"\n"}]}]},"type":{"type":"intrinsic","name":"string"},"inheritedFrom":{"type":"reference","name":"ViewProps.aria-activedescendant"}},{"name":"aria-atomic","variant":"declaration","kind":1024,"flags":{"isOptional":true,"isInherited":true},"type":{"type":"intrinsic","name":"boolean"},"inheritedFrom":{"type":"reference","name":"ViewProps.aria-atomic"}},{"name":"aria-autocomplete","variant":"declaration","kind":1024,"flags":{"isOptional":true,"isInherited":true},"type":{"type":"intrinsic","name":"string"},"inheritedFrom":{"type":"reference","name":"ViewProps.aria-autocomplete"}},{"name":"aria-colcount","variant":"declaration","kind":1024,"flags":{"isOptional":true,"isInherited":true},"type":{"type":"intrinsic","name":"number"},"inheritedFrom":{"type":"reference","name":"ViewProps.aria-colcount"}},{"name":"aria-colindex","variant":"declaration","kind":1024,"flags":{"isOptional":true,"isInherited":true},"type":{"type":"intrinsic","name":"number"},"inheritedFrom":{"type":"reference","name":"ViewProps.aria-colindex"}},{"name":"aria-colspan","variant":"declaration","kind":1024,"flags":{"isOptional":true,"isInherited":true},"type":{"type":"intrinsic","name":"number"},"inheritedFrom":{"type":"reference","name":"ViewProps.aria-colspan"}},{"name":"aria-controls","variant":"declaration","kind":1024,"flags":{"isOptional":true,"isInherited":true},"type":{"type":"intrinsic","name":"string"},"inheritedFrom":{"type":"reference","name":"ViewProps.aria-controls"}},{"name":"aria-current","variant":"declaration","kind":1024,"flags":{"isOptional":true,"isInherited":true},"type":{"type":"union","types":[{"type":"intrinsic","name":"boolean"},{"type":"literal","value":"page"},{"type":"literal","value":"location"},{"type":"literal","value":"time"},{"type":"literal","value":"date"},{"type":"literal","value":"step"}]},"inheritedFrom":{"type":"reference","name":"ViewProps.aria-current"}},{"name":"aria-describedby","variant":"declaration","kind":1024,"flags":{"isOptional":true,"isInherited":true},"type":{"type":"intrinsic","name":"string"},"inheritedFrom":{"type":"reference","name":"ViewProps.aria-describedby"}},{"name":"aria-details","variant":"declaration","kind":1024,"flags":{"isOptional":true,"isInherited":true},"type":{"type":"intrinsic","name":"string"},"inheritedFrom":{"type":"reference","name":"ViewProps.aria-details"}},{"name":"aria-errormessage","variant":"declaration","kind":1024,"flags":{"isOptional":true,"isInherited":true},"type":{"type":"intrinsic","name":"string"},"inheritedFrom":{"type":"reference","name":"ViewProps.aria-errormessage"}},{"name":"aria-flowto","variant":"declaration","kind":1024,"flags":{"isOptional":true,"isInherited":true},"type":{"type":"intrinsic","name":"string"},"inheritedFrom":{"type":"reference","name":"ViewProps.aria-flowto"}},{"name":"aria-haspopup","variant":"declaration","kind":1024,"flags":{"isOptional":true,"isInherited":true},"type":{"type":"intrinsic","name":"string"},"inheritedFrom":{"type":"reference","name":"ViewProps.aria-haspopup"}},{"name":"aria-invalid","variant":"declaration","kind":1024,"flags":{"isOptional":true,"isInherited":true},"type":{"type":"intrinsic","name":"boolean"},"inheritedFrom":{"type":"reference","name":"ViewProps.aria-invalid"}},{"name":"aria-keyshortcuts","variant":"declaration","kind":1024,"flags":{"isOptional":true,"isInherited":true},"type":{"type":"intrinsic","name":"string"},"inheritedFrom":{"type":"reference","name":"ViewProps.aria-keyshortcuts"}},{"name":"aria-level","variant":"declaration","kind":1024,"flags":{"isOptional":true,"isInherited":true},"type":{"type":"intrinsic","name":"number"},"inheritedFrom":{"type":"reference","name":"ViewProps.aria-level"}},{"name":"aria-multiline","variant":"declaration","kind":1024,"flags":{"isOptional":true,"isInherited":true},"type":{"type":"intrinsic","name":"boolean"},"inheritedFrom":{"type":"reference","name":"ViewProps.aria-multiline"}},{"name":"aria-multiselectable","variant":"declaration","kind":1024,"flags":{"isOptional":true,"isInherited":true},"type":{"type":"intrinsic","name":"boolean"},"inheritedFrom":{"type":"reference","name":"ViewProps.aria-multiselectable"}},{"name":"aria-orientation","variant":"declaration","kind":1024,"flags":{"isOptional":true,"isInherited":true},"type":{"type":"union","types":[{"type":"literal","value":"horizontal"},{"type":"literal","value":"vertical"}]},"inheritedFrom":{"type":"reference","name":"ViewProps.aria-orientation"}},{"name":"aria-owns","variant":"declaration","kind":1024,"flags":{"isOptional":true,"isInherited":true},"type":{"type":"intrinsic","name":"string"},"inheritedFrom":{"type":"reference","name":"ViewProps.aria-owns"}},{"name":"aria-placeholder","variant":"declaration","kind":1024,"flags":{"isOptional":true,"isInherited":true},"type":{"type":"intrinsic","name":"string"},"inheritedFrom":{"type":"reference","name":"ViewProps.aria-placeholder"}},{"name":"aria-posinset","variant":"declaration","kind":1024,"flags":{"isOptional":true,"isInherited":true},"type":{"type":"intrinsic","name":"number"},"inheritedFrom":{"type":"reference","name":"ViewProps.aria-posinset"}},{"name":"aria-pressed","variant":"declaration","kind":1024,"flags":{"isOptional":true,"isInherited":true},"type":{"type":"intrinsic","name":"boolean"},"inheritedFrom":{"type":"reference","name":"ViewProps.aria-pressed"}},{"name":"aria-readonly","variant":"declaration","kind":1024,"flags":{"isOptional":true,"isInherited":true},"type":{"type":"intrinsic","name":"boolean"},"inheritedFrom":{"type":"reference","name":"ViewProps.aria-readonly"}},{"name":"aria-required","variant":"declaration","kind":1024,"flags":{"isOptional":true,"isInherited":true},"type":{"type":"intrinsic","name":"boolean"},"inheritedFrom":{"type":"reference","name":"ViewProps.aria-required"}},{"name":"aria-roledescription","variant":"declaration","kind":1024,"flags":{"isOptional":true,"isInherited":true},"type":{"type":"intrinsic","name":"string"},"inheritedFrom":{"type":"reference","name":"ViewProps.aria-roledescription"}},{"name":"aria-rowcount","variant":"declaration","kind":1024,"flags":{"isOptional":true,"isInherited":true},"type":{"type":"intrinsic","name":"number"},"inheritedFrom":{"type":"reference","name":"ViewProps.aria-rowcount"}},{"name":"aria-rowindex","variant":"declaration","kind":1024,"flags":{"isOptional":true,"isInherited":true},"type":{"type":"intrinsic","name":"number"},"inheritedFrom":{"type":"reference","name":"ViewProps.aria-rowindex"}},{"name":"aria-rowspan","variant":"declaration","kind":1024,"flags":{"isOptional":true,"isInherited":true},"type":{"type":"intrinsic","name":"number"},"inheritedFrom":{"type":"reference","name":"ViewProps.aria-rowspan"}},{"name":"aria-setsize","variant":"declaration","kind":1024,"flags":{"isOptional":true,"isInherited":true},"type":{"type":"intrinsic","name":"number"},"inheritedFrom":{"type":"reference","name":"ViewProps.aria-setsize"}},{"name":"aria-sort","variant":"declaration","kind":1024,"flags":{"isOptional":true,"isInherited":true},"type":{"type":"union","types":[{"type":"literal","value":"none"},{"type":"literal","value":"ascending"},{"type":"literal","value":"descending"},{"type":"literal","value":"other"}]},"inheritedFrom":{"type":"reference","name":"ViewProps.aria-sort"}},{"name":"children","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"reference","target":{"packageName":"@types/react","packagePath":"index.d.ts","qualifiedName":"React.ReactNode"},"name":"ReactNode","package":"@types/react","qualifiedName":"React.ReactNode"},"overwrites":{"type":"reference","name":"ViewProps.children"}},{"name":"colorScheme","variant":"declaration","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"The color scheme to apply to descendant native views.\n"},{"kind":"code","text":"`'light'`"},{"kind":"text","text":" / "},{"kind":"code","text":"`'dark'`"},{"kind":"text","text":" force a specific appearance; omitted follows the device setting."}],"blockTags":[{"tag":"@platform","content":[{"kind":"text","text":"android"}]},{"tag":"@platform","content":[{"kind":"text","text":"ios"}]}]},"type":{"type":"reference","target":{"packageName":"react-native","packagePath":"Libraries/Utilities/Appearance.d.ts","qualifiedName":"ColorSchemeName"},"name":"ColorSchemeName","package":"react-native"}},{"name":"layoutDirection","variant":"declaration","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Layout direction for the platform UI content.\nDefaults to the current locale direction from "},{"kind":"code","text":"`I18nManager`"},{"kind":"text","text":"."}],"blockTags":[{"tag":"@platform","content":[{"kind":"text","text":"android"}]},{"tag":"@platform","content":[{"kind":"text","text":"ios"}]}]},"type":{"type":"union","types":[{"type":"literal","value":"leftToRight"},{"type":"literal","value":"rightToLeft"}]}},{"name":"matchContents","variant":"declaration","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"When "},{"kind":"code","text":"`true`"},{"kind":"text","text":", the host updates its size in the React Native view tree to match the content's layout from the underlying platform UI toolkit.\nCan only be set once on mount."}],"blockTags":[{"tag":"@default","content":[{"kind":"text","text":"false"}]},{"tag":"@platform","content":[{"kind":"text","text":"android"}]},{"tag":"@platform","content":[{"kind":"text","text":"ios"}]}]},"type":{"type":"union","types":[{"type":"intrinsic","name":"boolean"},{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"children":[{"name":"horizontal","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"intrinsic","name":"boolean"}},{"name":"vertical","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"intrinsic","name":"boolean"}}]}}]}},{"name":"role","variant":"declaration","kind":1024,"flags":{"isOptional":true,"isInherited":true},"type":{"type":"reference","target":{"packageName":"@expo/ui","packagePath":"src/ts-declarations/react-native-web.d.ts","qualifiedName":"\"react-native\".WebRole"},"name":"WebRole","package":"@expo/ui","qualifiedName":"\"react-native\".WebRole"},"inheritedFrom":{"type":"reference","name":"ViewProps.role"}}],"extendedTypes":[{"type":"reference","target":{"packageName":"react-native","packagePath":"Libraries/Components/View/ViewPropTypes.d.ts","qualifiedName":"ViewProps"},"name":"ViewProps","package":"react-native"}]},{"name":"Host","variant":"declaration","kind":64,"signatures":[{"name":"Host","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"A bridging container that hosts SwiftUI views on iOS and Jetpack Compose views on Android.\nOn platforms without a native UI-toolkit binding (web, RN fallback), renders a plain "},{"kind":"code","text":"`View`"},{"kind":"text","text":".\nThe "},{"kind":"code","text":"`colorScheme`"},{"kind":"text","text":", "},{"kind":"code","text":"`layoutDirection`"},{"kind":"text","text":", and "},{"kind":"code","text":"`matchContents`"},{"kind":"text","text":" props are accepted for API parity but have no effect."}]},"parameters":[{"name":"__namedParameters","variant":"param","kind":32768,"type":{"type":"reference","name":"UniversalHostProps","package":"@expo/ui"}}],"type":{"type":"reference","target":{"packageName":"@types/react","packagePath":"jsx-runtime.d.ts","qualifiedName":"JSX.Element"},"name":"Element","package":"@types/react","qualifiedName":"JSX.Element"}}]}],"packageName":"@expo/ui"} \ No newline at end of file +{"schemaVersion":"2.0","name":"expo-ui/universal/host","variant":"project","kind":1,"children":[{"name":"UniversalHostProps","variant":"declaration","kind":256,"comment":{"summary":[{"kind":"text","text":"Props for the ["},{"kind":"code","text":"`Host`"},{"kind":"text","text":"](#host) component."}]},"children":[{"name":"aria-activedescendant","variant":"declaration","kind":1024,"flags":{"isOptional":true,"isInherited":true},"comment":{"summary":[{"kind":"text","text":"Aria props (additional, minus existants)"}],"blockTags":[{"tag":"@see","content":[{"kind":"text","text":" - "},{"kind":"text","text":"https://necolas.github.io/react-native-web/docs/accessibility"},{"kind":"text","text":"\n"},{"kind":"text","text":" - "},{"kind":"text","text":"https://reactnative.dev/docs/accessibility#aria-valuemax"},{"kind":"text","text":"\n"}]}]},"type":{"type":"intrinsic","name":"string"},"inheritedFrom":{"type":"reference","name":"ViewProps.aria-activedescendant"}},{"name":"aria-atomic","variant":"declaration","kind":1024,"flags":{"isOptional":true,"isInherited":true},"type":{"type":"intrinsic","name":"boolean"},"inheritedFrom":{"type":"reference","name":"ViewProps.aria-atomic"}},{"name":"aria-autocomplete","variant":"declaration","kind":1024,"flags":{"isOptional":true,"isInherited":true},"type":{"type":"intrinsic","name":"string"},"inheritedFrom":{"type":"reference","name":"ViewProps.aria-autocomplete"}},{"name":"aria-colcount","variant":"declaration","kind":1024,"flags":{"isOptional":true,"isInherited":true},"type":{"type":"intrinsic","name":"number"},"inheritedFrom":{"type":"reference","name":"ViewProps.aria-colcount"}},{"name":"aria-colindex","variant":"declaration","kind":1024,"flags":{"isOptional":true,"isInherited":true},"type":{"type":"intrinsic","name":"number"},"inheritedFrom":{"type":"reference","name":"ViewProps.aria-colindex"}},{"name":"aria-colspan","variant":"declaration","kind":1024,"flags":{"isOptional":true,"isInherited":true},"type":{"type":"intrinsic","name":"number"},"inheritedFrom":{"type":"reference","name":"ViewProps.aria-colspan"}},{"name":"aria-controls","variant":"declaration","kind":1024,"flags":{"isOptional":true,"isInherited":true},"type":{"type":"intrinsic","name":"string"},"inheritedFrom":{"type":"reference","name":"ViewProps.aria-controls"}},{"name":"aria-current","variant":"declaration","kind":1024,"flags":{"isOptional":true,"isInherited":true},"type":{"type":"union","types":[{"type":"intrinsic","name":"boolean"},{"type":"literal","value":"page"},{"type":"literal","value":"location"},{"type":"literal","value":"time"},{"type":"literal","value":"date"},{"type":"literal","value":"step"}]},"inheritedFrom":{"type":"reference","name":"ViewProps.aria-current"}},{"name":"aria-describedby","variant":"declaration","kind":1024,"flags":{"isOptional":true,"isInherited":true},"type":{"type":"intrinsic","name":"string"},"inheritedFrom":{"type":"reference","name":"ViewProps.aria-describedby"}},{"name":"aria-details","variant":"declaration","kind":1024,"flags":{"isOptional":true,"isInherited":true},"type":{"type":"intrinsic","name":"string"},"inheritedFrom":{"type":"reference","name":"ViewProps.aria-details"}},{"name":"aria-errormessage","variant":"declaration","kind":1024,"flags":{"isOptional":true,"isInherited":true},"type":{"type":"intrinsic","name":"string"},"inheritedFrom":{"type":"reference","name":"ViewProps.aria-errormessage"}},{"name":"aria-flowto","variant":"declaration","kind":1024,"flags":{"isOptional":true,"isInherited":true},"type":{"type":"intrinsic","name":"string"},"inheritedFrom":{"type":"reference","name":"ViewProps.aria-flowto"}},{"name":"aria-haspopup","variant":"declaration","kind":1024,"flags":{"isOptional":true,"isInherited":true},"type":{"type":"intrinsic","name":"string"},"inheritedFrom":{"type":"reference","name":"ViewProps.aria-haspopup"}},{"name":"aria-invalid","variant":"declaration","kind":1024,"flags":{"isOptional":true,"isInherited":true},"type":{"type":"intrinsic","name":"boolean"},"inheritedFrom":{"type":"reference","name":"ViewProps.aria-invalid"}},{"name":"aria-keyshortcuts","variant":"declaration","kind":1024,"flags":{"isOptional":true,"isInherited":true},"type":{"type":"intrinsic","name":"string"},"inheritedFrom":{"type":"reference","name":"ViewProps.aria-keyshortcuts"}},{"name":"aria-level","variant":"declaration","kind":1024,"flags":{"isOptional":true,"isInherited":true},"type":{"type":"intrinsic","name":"number"},"inheritedFrom":{"type":"reference","name":"ViewProps.aria-level"}},{"name":"aria-multiline","variant":"declaration","kind":1024,"flags":{"isOptional":true,"isInherited":true},"type":{"type":"intrinsic","name":"boolean"},"inheritedFrom":{"type":"reference","name":"ViewProps.aria-multiline"}},{"name":"aria-multiselectable","variant":"declaration","kind":1024,"flags":{"isOptional":true,"isInherited":true},"type":{"type":"intrinsic","name":"boolean"},"inheritedFrom":{"type":"reference","name":"ViewProps.aria-multiselectable"}},{"name":"aria-orientation","variant":"declaration","kind":1024,"flags":{"isOptional":true,"isInherited":true},"type":{"type":"union","types":[{"type":"literal","value":"horizontal"},{"type":"literal","value":"vertical"}]},"inheritedFrom":{"type":"reference","name":"ViewProps.aria-orientation"}},{"name":"aria-owns","variant":"declaration","kind":1024,"flags":{"isOptional":true,"isInherited":true},"type":{"type":"intrinsic","name":"string"},"inheritedFrom":{"type":"reference","name":"ViewProps.aria-owns"}},{"name":"aria-placeholder","variant":"declaration","kind":1024,"flags":{"isOptional":true,"isInherited":true},"type":{"type":"intrinsic","name":"string"},"inheritedFrom":{"type":"reference","name":"ViewProps.aria-placeholder"}},{"name":"aria-posinset","variant":"declaration","kind":1024,"flags":{"isOptional":true,"isInherited":true},"type":{"type":"intrinsic","name":"number"},"inheritedFrom":{"type":"reference","name":"ViewProps.aria-posinset"}},{"name":"aria-pressed","variant":"declaration","kind":1024,"flags":{"isOptional":true,"isInherited":true},"type":{"type":"intrinsic","name":"boolean"},"inheritedFrom":{"type":"reference","name":"ViewProps.aria-pressed"}},{"name":"aria-readonly","variant":"declaration","kind":1024,"flags":{"isOptional":true,"isInherited":true},"type":{"type":"intrinsic","name":"boolean"},"inheritedFrom":{"type":"reference","name":"ViewProps.aria-readonly"}},{"name":"aria-required","variant":"declaration","kind":1024,"flags":{"isOptional":true,"isInherited":true},"type":{"type":"intrinsic","name":"boolean"},"inheritedFrom":{"type":"reference","name":"ViewProps.aria-required"}},{"name":"aria-roledescription","variant":"declaration","kind":1024,"flags":{"isOptional":true,"isInherited":true},"type":{"type":"intrinsic","name":"string"},"inheritedFrom":{"type":"reference","name":"ViewProps.aria-roledescription"}},{"name":"aria-rowcount","variant":"declaration","kind":1024,"flags":{"isOptional":true,"isInherited":true},"type":{"type":"intrinsic","name":"number"},"inheritedFrom":{"type":"reference","name":"ViewProps.aria-rowcount"}},{"name":"aria-rowindex","variant":"declaration","kind":1024,"flags":{"isOptional":true,"isInherited":true},"type":{"type":"intrinsic","name":"number"},"inheritedFrom":{"type":"reference","name":"ViewProps.aria-rowindex"}},{"name":"aria-rowspan","variant":"declaration","kind":1024,"flags":{"isOptional":true,"isInherited":true},"type":{"type":"intrinsic","name":"number"},"inheritedFrom":{"type":"reference","name":"ViewProps.aria-rowspan"}},{"name":"aria-setsize","variant":"declaration","kind":1024,"flags":{"isOptional":true,"isInherited":true},"type":{"type":"intrinsic","name":"number"},"inheritedFrom":{"type":"reference","name":"ViewProps.aria-setsize"}},{"name":"aria-sort","variant":"declaration","kind":1024,"flags":{"isOptional":true,"isInherited":true},"type":{"type":"union","types":[{"type":"literal","value":"none"},{"type":"literal","value":"ascending"},{"type":"literal","value":"descending"},{"type":"literal","value":"other"}]},"inheritedFrom":{"type":"reference","name":"ViewProps.aria-sort"}},{"name":"children","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"reference","target":{"packageName":"@types/react","packagePath":"index.d.ts","qualifiedName":"React.ReactNode"},"name":"ReactNode","package":"@types/react","qualifiedName":"React.ReactNode"},"overwrites":{"type":"reference","name":"ViewProps.children"}},{"name":"colorScheme","variant":"declaration","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"The color scheme to apply to descendant native views.\n"},{"kind":"code","text":"`'light'`"},{"kind":"text","text":" / "},{"kind":"code","text":"`'dark'`"},{"kind":"text","text":" force a specific appearance; omitted follows the device setting."}],"blockTags":[{"tag":"@platform","content":[{"kind":"text","text":"android"}]},{"tag":"@platform","content":[{"kind":"text","text":"ios"}]}]},"type":{"type":"reference","target":{"packageName":"react-native","packagePath":"Libraries/Utilities/Appearance.d.ts","qualifiedName":"ColorSchemeName"},"name":"ColorSchemeName","package":"react-native"}},{"name":"dir","variant":"declaration","kind":1024,"flags":{"isOptional":true,"isInherited":true},"type":{"type":"intrinsic","name":"string"},"inheritedFrom":{"type":"reference","name":"ViewProps.dir"}},{"name":"ignoreSafeArea","variant":"declaration","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Controls which safe area regions the hosting view should ignore. Can only be set once on mount.\n- "},{"kind":"code","text":"`'all'`"},{"kind":"text","text":"- ignores all safe area insets.\n- "},{"kind":"code","text":"`'keyboard'`"},{"kind":"text","text":" - ignores only the keyboard safe area."}],"blockTags":[{"tag":"@platform","content":[{"kind":"text","text":"android"}]},{"tag":"@platform","content":[{"kind":"text","text":"ios"}]},{"tag":"@platform","content":[{"kind":"text","text":"web"}]}]},"type":{"type":"union","types":[{"type":"literal","value":"all"},{"type":"literal","value":"keyboard"}]}},{"name":"layoutDirection","variant":"declaration","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Layout direction for the platform UI content.\nDefaults to the current locale direction from "},{"kind":"code","text":"`I18nManager`"},{"kind":"text","text":"."}],"blockTags":[{"tag":"@platform","content":[{"kind":"text","text":"android"}]},{"tag":"@platform","content":[{"kind":"text","text":"ios"}]},{"tag":"@platform","content":[{"kind":"text","text":"web"}]}]},"type":{"type":"union","types":[{"type":"literal","value":"leftToRight"},{"type":"literal","value":"rightToLeft"}]}},{"name":"matchContents","variant":"declaration","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"When "},{"kind":"code","text":"`true`"},{"kind":"text","text":", the host updates its size in the React Native view tree to match the content's layout from the underlying platform UI toolkit.\nCan only be set once on mount."}],"blockTags":[{"tag":"@default","content":[{"kind":"text","text":"false"}]},{"tag":"@platform","content":[{"kind":"text","text":"android"}]},{"tag":"@platform","content":[{"kind":"text","text":"ios"}]},{"tag":"@platform","content":[{"kind":"text","text":"web"}]}]},"type":{"type":"union","types":[{"type":"intrinsic","name":"boolean"},{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"children":[{"name":"horizontal","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"intrinsic","name":"boolean"}},{"name":"vertical","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"intrinsic","name":"boolean"}}]}}]}},{"name":"onLayoutContent","variant":"declaration","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Callback function that is triggered when the content completes its layout.\nProvides the current dimensions of the content, which may change as the content updates."}],"blockTags":[{"tag":"@platform","content":[{"kind":"text","text":"android"}]},{"tag":"@platform","content":[{"kind":"text","text":"ios"}]},{"tag":"@platform","content":[{"kind":"text","text":"web"}]}]},"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"signatures":[{"name":"__type","variant":"signature","kind":4096,"parameters":[{"name":"event","variant":"param","kind":32768,"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"children":[{"name":"nativeEvent","variant":"declaration","kind":1024,"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"children":[{"name":"height","variant":"declaration","kind":1024,"type":{"type":"intrinsic","name":"number"}},{"name":"width","variant":"declaration","kind":1024,"type":{"type":"intrinsic","name":"number"}}]}}}]}}}],"type":{"type":"intrinsic","name":"void"}}]}}},{"name":"role","variant":"declaration","kind":1024,"flags":{"isOptional":true,"isInherited":true},"type":{"type":"reference","target":{"packageName":"@expo/ui","packagePath":"src/ts-declarations/react-native-web.d.ts","qualifiedName":"\"react-native\".WebRole"},"name":"WebRole","package":"@expo/ui","qualifiedName":"\"react-native\".WebRole"},"inheritedFrom":{"type":"reference","name":"ViewProps.role"}},{"name":"useViewportSizeMeasurement","variant":"declaration","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"When true and no explicit size is provided, the host will use the viewport size as the proposed size for layout.\nThis is particularly useful for views that need to fill their available space, such as "},{"kind":"code","text":"`List`"},{"kind":"text","text":"."}],"blockTags":[{"tag":"@default","content":[{"kind":"text","text":"false"}]},{"tag":"@platform","content":[{"kind":"text","text":"android"}]},{"tag":"@platform","content":[{"kind":"text","text":"ios"}]},{"tag":"@platform","content":[{"kind":"text","text":"web"}]}]},"type":{"type":"intrinsic","name":"boolean"}}],"extendedTypes":[{"type":"reference","target":{"packageName":"react-native","packagePath":"Libraries/Components/View/ViewPropTypes.d.ts","qualifiedName":"ViewProps"},"name":"ViewProps","package":"react-native"}]},{"name":"Host","variant":"declaration","kind":64,"signatures":[{"name":"Host","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"A bridging container that hosts SwiftUI views on iOS and Jetpack Compose views on Android.\nOn platforms without a native UI-toolkit binding (web, RN fallback), renders a plain "},{"kind":"code","text":"`View`"},{"kind":"text","text":".\nThe "},{"kind":"code","text":"`colorScheme`"},{"kind":"text","text":", "},{"kind":"code","text":"`layoutDirection`"},{"kind":"text","text":", and "},{"kind":"code","text":"`matchContents`"},{"kind":"text","text":" props are accepted for API parity but have no effect."}]},"parameters":[{"name":"__namedParameters","variant":"param","kind":32768,"type":{"type":"reference","name":"UniversalHostProps","package":"@expo/ui"}}],"type":{"type":"reference","target":{"packageName":"@types/react","packagePath":"jsx-runtime.d.ts","qualifiedName":"JSX.Element"},"name":"Element","package":"@types/react","qualifiedName":"JSX.Element"}}]}],"packageName":"@expo/ui"} \ No newline at end of file diff --git a/docs/public/static/data/v56.0.0/expo-ui/universal/rnhostview.json b/docs/public/static/data/v56.0.0/expo-ui/universal/rnhostview.json index 62f7aaab4109a4..9387a10e12f226 100644 --- a/docs/public/static/data/v56.0.0/expo-ui/universal/rnhostview.json +++ b/docs/public/static/data/v56.0.0/expo-ui/universal/rnhostview.json @@ -1 +1 @@ -{"schemaVersion":"2.0","name":"expo-ui/universal/rnhostview","variant":"project","kind":1,"children":[{"name":"RNHostViewProps","variant":"declaration","kind":256,"comment":{"summary":[{"kind":"text","text":"Props for the ["},{"kind":"code","text":"`RNHostView`"},{"kind":"text","text":"](#rnhostview) component."}]},"children":[{"name":"children","variant":"declaration","kind":1024,"comment":{"summary":[{"kind":"text","text":"The React Native view to host."}]},"type":{"type":"reference","target":{"packageName":"@types/react","packagePath":"index.d.ts","qualifiedName":"React.ReactElement"},"name":"ReactElement","package":"@types/react","qualifiedName":"React.ReactElement"}},{"name":"disabled","variant":"declaration","kind":1024,"flags":{"isOptional":true,"isInherited":true},"comment":{"summary":[{"kind":"text","text":"Whether the component is disabled. Disabled components do not respond to user interaction."}],"blockTags":[{"tag":"@platform","content":[{"kind":"text","text":"android"}]},{"tag":"@platform","content":[{"kind":"text","text":"ios"}]},{"tag":"@platform","content":[{"kind":"text","text":"web"}]}]},"type":{"type":"intrinsic","name":"boolean"}},{"name":"hidden","variant":"declaration","kind":1024,"flags":{"isOptional":true,"isInherited":true},"comment":{"summary":[{"kind":"text","text":"Whether the component is hidden."}],"blockTags":[{"tag":"@platform","content":[{"kind":"text","text":"android"}]},{"tag":"@platform","content":[{"kind":"text","text":"ios"}]},{"tag":"@platform","content":[{"kind":"text","text":"web"}]}]},"type":{"type":"intrinsic","name":"boolean"}},{"name":"matchContents","variant":"declaration","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"When "},{"kind":"code","text":"`true`"},{"kind":"text","text":", the host updates its size in the native view tree to match\nthe children's size. When "},{"kind":"code","text":"`false`"},{"kind":"text","text":", the host uses the size of the parent\nnative view.\n\nCan only be set once on mount; changing it remounts the component."}],"blockTags":[{"tag":"@default","content":[{"kind":"text","text":"false"}]},{"tag":"@platform","content":[{"kind":"text","text":"android"}]},{"tag":"@platform","content":[{"kind":"text","text":"ios"}]}]},"type":{"type":"intrinsic","name":"boolean"}},{"name":"modifiers","variant":"declaration","kind":1024,"flags":{"isOptional":true,"isInherited":true},"comment":{"summary":[{"kind":"text","text":"Platform-specific modifier escape hatch. Pass an array of modifier configs\nfrom "},{"kind":"code","text":"`@expo/ui/swift-ui/modifiers`"},{"kind":"text","text":" or "},{"kind":"code","text":"`@expo/ui/jetpack-compose/modifiers`"},{"kind":"text","text":"."}],"blockTags":[{"tag":"@platform","content":[{"kind":"text","text":"android"}]},{"tag":"@platform","content":[{"kind":"text","text":"ios"}]}]},"type":{"type":"array","elementType":{"type":"reference","target":{"packageName":"@expo/ui","packagePath":"src/types.ts","qualifiedName":"ModifierConfig"},"name":"ModifierConfig","package":"@expo/ui"}}},{"name":"onAppear","variant":"declaration","kind":1024,"flags":{"isOptional":true,"isInherited":true},"comment":{"summary":[{"kind":"text","text":"Called when the component appears on screen."}],"blockTags":[{"tag":"@platform","content":[{"kind":"text","text":"android"}]},{"tag":"@platform","content":[{"kind":"text","text":"ios"}]},{"tag":"@platform","content":[{"kind":"text","text":"web"}]}]},"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"signatures":[{"name":"__type","variant":"signature","kind":4096,"type":{"type":"intrinsic","name":"void"}}]}}},{"name":"onDisappear","variant":"declaration","kind":1024,"flags":{"isOptional":true,"isInherited":true},"comment":{"summary":[{"kind":"text","text":"Called when the component is removed from screen."}],"blockTags":[{"tag":"@platform","content":[{"kind":"text","text":"android"}]},{"tag":"@platform","content":[{"kind":"text","text":"ios"}]},{"tag":"@platform","content":[{"kind":"text","text":"web"}]}]},"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"signatures":[{"name":"__type","variant":"signature","kind":4096,"type":{"type":"intrinsic","name":"void"}}]}}},{"name":"onPress","variant":"declaration","kind":1024,"flags":{"isOptional":true,"isInherited":true},"comment":{"summary":[{"kind":"text","text":"Called when the component is pressed."}],"blockTags":[{"tag":"@platform","content":[{"kind":"text","text":"android"}]},{"tag":"@platform","content":[{"kind":"text","text":"ios"}]},{"tag":"@platform","content":[{"kind":"text","text":"web"}]}]},"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"signatures":[{"name":"__type","variant":"signature","kind":4096,"type":{"type":"intrinsic","name":"void"}}]}}},{"name":"style","variant":"declaration","kind":1024,"flags":{"isOptional":true,"isInherited":true},"comment":{"summary":[{"kind":"text","text":"Platform-agnostic style properties. These are translated to SwiftUI modifiers on iOS\nand Jetpack Compose modifiers on Android."}],"blockTags":[{"tag":"@platform","content":[{"kind":"text","text":"android"}]},{"tag":"@platform","content":[{"kind":"text","text":"ios"}]},{"tag":"@platform","content":[{"kind":"text","text":"web"}]}]},"type":{"type":"reference","target":{"packageName":"typescript","packagePath":"lib/lib.es5.d.ts","qualifiedName":"Pick"},"typeArguments":[{"type":"reference","target":{"packageName":"react-native","packagePath":"Libraries/StyleSheet/StyleSheetTypes.d.ts","qualifiedName":"ViewStyle"},"name":"ViewStyle","package":"react-native"},{"type":"union","types":[{"type":"literal","value":"padding"},{"type":"literal","value":"paddingHorizontal"},{"type":"literal","value":"paddingVertical"},{"type":"literal","value":"paddingTop"},{"type":"literal","value":"paddingBottom"},{"type":"literal","value":"paddingLeft"},{"type":"literal","value":"paddingRight"},{"type":"literal","value":"backgroundColor"},{"type":"literal","value":"borderRadius"},{"type":"literal","value":"borderWidth"},{"type":"literal","value":"borderColor"},{"type":"literal","value":"opacity"},{"type":"literal","value":"width"},{"type":"literal","value":"height"}]}],"name":"Pick","package":"typescript"}},{"name":"testID","variant":"declaration","kind":1024,"flags":{"isOptional":true,"isInherited":true},"comment":{"summary":[{"kind":"text","text":"Identifier used to locate the component in end-to-end tests."}],"blockTags":[{"tag":"@platform","content":[{"kind":"text","text":"android"}]},{"tag":"@platform","content":[{"kind":"text","text":"ios"}]},{"tag":"@platform","content":[{"kind":"text","text":"web"}]}]},"type":{"type":"intrinsic","name":"string"}}]},{"name":"RNHostView","variant":"declaration","kind":64,"signatures":[{"name":"RNHostView","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Hosts React Native views inside SwiftUI or Jetpack Compose views."}]},"parameters":[{"name":"__namedParameters","variant":"param","kind":32768,"type":{"type":"reference","name":"RNHostViewProps","package":"@expo/ui"}}],"type":{"type":"reference","target":{"packageName":"@types/react","packagePath":"jsx-runtime.d.ts","qualifiedName":"JSX.Element"},"name":"Element","package":"@types/react","qualifiedName":"JSX.Element"}}]}],"packageName":"@expo/ui"} \ No newline at end of file +{"schemaVersion":"2.0","name":"expo-ui/universal/rnhostview","variant":"project","kind":1,"children":[{"name":"RNHostViewProps","variant":"declaration","kind":256,"comment":{"summary":[{"kind":"text","text":"Props for the ["},{"kind":"code","text":"`RNHostView`"},{"kind":"text","text":"](#rnhostview) component."}]},"children":[{"name":"children","variant":"declaration","kind":1024,"comment":{"summary":[{"kind":"text","text":"The React Native view to host."}]},"type":{"type":"reference","target":{"packageName":"@types/react","packagePath":"index.d.ts","qualifiedName":"React.ReactElement"},"name":"ReactElement","package":"@types/react","qualifiedName":"React.ReactElement"}},{"name":"disabled","variant":"declaration","kind":1024,"flags":{"isOptional":true,"isInherited":true},"comment":{"summary":[{"kind":"text","text":"Whether the component is disabled. Disabled components do not respond to user interaction."}],"blockTags":[{"tag":"@platform","content":[{"kind":"text","text":"android"}]},{"tag":"@platform","content":[{"kind":"text","text":"ios"}]},{"tag":"@platform","content":[{"kind":"text","text":"web"}]}]},"type":{"type":"intrinsic","name":"boolean"}},{"name":"hidden","variant":"declaration","kind":1024,"flags":{"isOptional":true,"isInherited":true},"comment":{"summary":[{"kind":"text","text":"Whether the component is hidden."}],"blockTags":[{"tag":"@platform","content":[{"kind":"text","text":"android"}]},{"tag":"@platform","content":[{"kind":"text","text":"ios"}]},{"tag":"@platform","content":[{"kind":"text","text":"web"}]}]},"type":{"type":"intrinsic","name":"boolean"}},{"name":"matchContents","variant":"declaration","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"When "},{"kind":"code","text":"`true`"},{"kind":"text","text":", the host updates its size in the native view tree to match\nthe children's size. When "},{"kind":"code","text":"`false`"},{"kind":"text","text":", the host uses the size of the parent\nnative view.\n\nCan only be set once on mount; changing it remounts the component."}],"blockTags":[{"tag":"@default","content":[{"kind":"text","text":"false"}]},{"tag":"@platform","content":[{"kind":"text","text":"android"}]},{"tag":"@platform","content":[{"kind":"text","text":"ios"}]}]},"type":{"type":"intrinsic","name":"boolean"}},{"name":"modifiers","variant":"declaration","kind":1024,"flags":{"isOptional":true,"isInherited":true},"comment":{"summary":[{"kind":"text","text":"Platform-specific modifier escape hatch. Pass an array of modifier configs\nfrom "},{"kind":"code","text":"`@expo/ui/swift-ui/modifiers`"},{"kind":"text","text":" or "},{"kind":"code","text":"`@expo/ui/jetpack-compose/modifiers`"},{"kind":"text","text":"."}],"blockTags":[{"tag":"@platform","content":[{"kind":"text","text":"android"}]},{"tag":"@platform","content":[{"kind":"text","text":"ios"}]}]},"type":{"type":"array","elementType":{"type":"reference","target":{"packageName":"@expo/ui","packagePath":"src/types.ts","qualifiedName":"ModifierConfig"},"name":"ModifierConfig","package":"@expo/ui"}}},{"name":"onAppear","variant":"declaration","kind":1024,"flags":{"isOptional":true,"isInherited":true},"comment":{"summary":[{"kind":"text","text":"Called when the component appears on screen."}],"blockTags":[{"tag":"@platform","content":[{"kind":"text","text":"android"}]},{"tag":"@platform","content":[{"kind":"text","text":"ios"}]},{"tag":"@platform","content":[{"kind":"text","text":"web"}]}]},"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"signatures":[{"name":"__type","variant":"signature","kind":4096,"type":{"type":"intrinsic","name":"void"}}]}}},{"name":"onDisappear","variant":"declaration","kind":1024,"flags":{"isOptional":true,"isInherited":true},"comment":{"summary":[{"kind":"text","text":"Called when the component is removed from screen."}],"blockTags":[{"tag":"@platform","content":[{"kind":"text","text":"android"}]},{"tag":"@platform","content":[{"kind":"text","text":"ios"}]},{"tag":"@platform","content":[{"kind":"text","text":"web"}]}]},"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"signatures":[{"name":"__type","variant":"signature","kind":4096,"type":{"type":"intrinsic","name":"void"}}]}}},{"name":"onPress","variant":"declaration","kind":1024,"flags":{"isOptional":true,"isInherited":true},"comment":{"summary":[{"kind":"text","text":"Called when the component is pressed."}],"blockTags":[{"tag":"@platform","content":[{"kind":"text","text":"android"}]},{"tag":"@platform","content":[{"kind":"text","text":"ios"}]},{"tag":"@platform","content":[{"kind":"text","text":"web"}]}]},"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"signatures":[{"name":"__type","variant":"signature","kind":4096,"type":{"type":"intrinsic","name":"void"}}]}}},{"name":"style","variant":"declaration","kind":1024,"flags":{"isOptional":true,"isInherited":true},"comment":{"summary":[{"kind":"text","text":"Platform-agnostic style properties. These are translated to SwiftUI modifiers on iOS\nand Jetpack Compose modifiers on Android."}],"blockTags":[{"tag":"@platform","content":[{"kind":"text","text":"android"}]},{"tag":"@platform","content":[{"kind":"text","text":"ios"}]},{"tag":"@platform","content":[{"kind":"text","text":"web"}]}]},"type":{"type":"reference","target":{"packageName":"typescript","packagePath":"lib/lib.es5.d.ts","qualifiedName":"Pick"},"typeArguments":[{"type":"reference","target":{"packageName":"react-native","packagePath":"Libraries/StyleSheet/StyleSheetTypes.d.ts","qualifiedName":"ViewStyle"},"name":"ViewStyle","package":"react-native"},{"type":"union","types":[{"type":"literal","value":"padding"},{"type":"literal","value":"paddingHorizontal"},{"type":"literal","value":"paddingVertical"},{"type":"literal","value":"paddingTop"},{"type":"literal","value":"paddingBottom"},{"type":"literal","value":"paddingLeft"},{"type":"literal","value":"paddingRight"},{"type":"literal","value":"backgroundColor"},{"type":"literal","value":"borderRadius"},{"type":"literal","value":"borderWidth"},{"type":"literal","value":"borderColor"},{"type":"literal","value":"opacity"},{"type":"literal","value":"width"},{"type":"literal","value":"height"}]}],"name":"Pick","package":"typescript"}},{"name":"testID","variant":"declaration","kind":1024,"flags":{"isOptional":true,"isInherited":true},"comment":{"summary":[{"kind":"text","text":"Identifier used to locate the component in end-to-end tests."}],"blockTags":[{"tag":"@platform","content":[{"kind":"text","text":"android"}]},{"tag":"@platform","content":[{"kind":"text","text":"ios"}]},{"tag":"@platform","content":[{"kind":"text","text":"web"}]}]},"type":{"type":"intrinsic","name":"string"}}]},{"name":"RNHostView","variant":"declaration","kind":64,"signatures":[{"name":"RNHostView","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Hosts React Native views inside Jetpack Compose or SwiftUI views."}]},"parameters":[{"name":"__namedParameters","variant":"param","kind":32768,"type":{"type":"reference","name":"RNHostViewProps","package":"@expo/ui"}}],"type":{"type":"reference","target":{"packageName":"@types/react","packagePath":"jsx-runtime.d.ts","qualifiedName":"JSX.Element"},"name":"Element","package":"@types/react","qualifiedName":"JSX.Element"}}]}],"packageName":"@expo/ui"} \ No newline at end of file diff --git a/docs/ui/components/EASCLIReference/data/eas-cli-commands.json b/docs/ui/components/EASCLIReference/data/eas-cli-commands.json index d4c6578b12046c..2e1449e8b9afa8 100644 --- a/docs/ui/components/EASCLIReference/data/eas-cli-commands.json +++ b/docs/ui/components/EASCLIReference/data/eas-cli-commands.json @@ -1,15 +1,15 @@ { "source": { "url": "https://raw.githubusercontent.com/expo/eas-cli/main/packages/eas-cli/README.md", - "fetchedAt": "2026-05-19T06:39:03.481Z", - "cliVersion": "18.13.1" + "fetchedAt": "2026-05-19T18:50:44.995Z", + "cliVersion": "19.0.1" }, "totalCommands": 114, "commands": [ { "command": "eas account:login", "description": "log in with your Expo account", - "usage": "USAGE\n $ eas account:login [-s] [-b]\n\nFLAGS\n -b, --browser Login with your browser\n -s, --sso Login with SSO\n\nDESCRIPTION\n log in with your Expo account\n\nALIASES\n $ eas login" + "usage": "USAGE\n $ eas account:login [-s] [-b]\n\nFLAGS\n -b, --[no-]browser Log in with your browser (default; use --no-browser for CLI-based login)\n -s, --sso Log in with SSO\n\nDESCRIPTION\n log in with your Expo account\n\nALIASES\n $ eas login" }, { "command": "eas account:logout", @@ -369,7 +369,7 @@ { "command": "eas login", "description": "log in with your Expo account", - "usage": "USAGE\n $ eas login [-s] [-b]\n\nFLAGS\n -b, --browser Login with your browser\n -s, --sso Login with SSO\n\nDESCRIPTION\n log in with your Expo account\n\nALIASES\n $ eas login" + "usage": "USAGE\n $ eas login [-s] [-b]\n\nFLAGS\n -b, --[no-]browser Log in with your browser (default; use --no-browser for CLI-based login)\n -s, --sso Log in with SSO\n\nDESCRIPTION\n log in with your Expo account\n\nALIASES\n $ eas login" }, { "command": "eas logout", diff --git a/guides/Expo Documentation Writing Style Guide.md b/guides/Expo Documentation Writing Style Guide.md index b8e2e1759fc51a..a6e4639c8fda11 100644 --- a/guides/Expo Documentation Writing Style Guide.md +++ b/guides/Expo Documentation Writing Style Guide.md @@ -341,19 +341,24 @@ Writing API documentation accurately and precisely helps developers use our APIs - Properly inline docs into the code using [TSDoc](https://tsdoc.org/) - Use supported TSDoc and [TypeDoc](https://typedoc.org/guides/doccomments/) annotations: -| Tag | Usage | -| ------------------------------------ | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `@return` / `@returns` | Describes the return value. | -| `@param` | Adds a description to method arguments. Syntax: `@param [param_name] [description]`. | -| `@default` | Does not support Markdown formatting. All content is placed directly in the `InlineCode` block, so there is no need to wrap the value with ``` manually. | -| `@platform` | Available platforms: `android`, `ios`, `web`, `expo` (Expo Go).
You can specify a minimum version or range, for example, `@platform ios 11+`.
Currently, specifying multiple platforms (or lists) per one tag is not possible. Use multiple `@platform` tags to list more than one platform. | -| `@example` | Adds the "Example" header and puts content at the bottom of the description block. | -| `@see` | Wraps the message in a note/quote block and adds "See:" at the beginning of the message.
The See section is placed after the main comment content. | -| `@deprecated` | Wraps the message in a note/quote block and adds "Deprecated" at the beginning of the message automatically. A message is optional.
The deprecation note is always placed at the top of the generated doc comment, no matter where you put it in the doc block content. | -| `@experimental` | Adds an "Experimental" label to the property when used. | -| `@internal` / `@private` / `@hidden` | Any of those annotations will hide the code and comments from the autogenerated API docs output. | -| `@hideType` | Hides the generated **Type** callout for constants in the API docs when the type should not be displayed. | -| `@header` | Allows grouping methods by custom headers, used with the `headersMapping` prop for the `APISection` component to control header titles and their order (see `expo-notifications` source and doc page for an example usage). | +| Tag | Usage | +| ------------------------------------ | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `@return` / `@returns` | Describes the return value. | +| `@param` | Adds a description to method arguments. Syntax: `@param [param_name] [description]`. | +| `@throws` | Adds an error a function or method may throw. Syntax: `@throws [description]`. Use one tag per error condition. | +| `@default` | Does not support Markdown formatting. All content is placed directly in the `InlineCode` block, so there is no need to wrap the value with ``` manually. | +| `@platform` | Available platforms: `android`, `ios`, `web`, `expo` (Expo Go).
You can specify a minimum version or range, for example, `@platform ios 11+`.
Currently, specifying multiple platforms (or lists) per one tag is not possible. Use multiple `@platform` tags to list more than one platform. | +| `@example` | Adds the "Example" header and puts content at the bottom of the description block. | +| `@see` | Wraps the message in a note/quote block and adds "See:" at the beginning of the message.
The See section is placed after the main comment content. | +| `@deprecated` | Wraps the message in a note/quote block and adds "Deprecated" at the beginning of the message automatically. A message is optional.
The deprecation note is always placed at the top of the generated doc comment, no matter where you put it in the doc block content. | +| `@experimental` | Adds an "Experimental" label to the property when used. | +| `@internal` / `@private` / `@hidden` | Any of those annotations will hide the code and comments from the autogenerated API docs output. | +| `@hideType` | Hides the generated **Type** callout for constants in the API docs when the type should not be displayed. | +| `@header` | Allows grouping methods by custom headers, used with the `headersMapping` prop for the `APISection` component to control header titles and their order (see `expo-notifications` source and doc page for an example usage). | +| `@docsInline` | Marks a shared base type (interface or type alias) so its members get inlined into each platform-specific implementation in the generated API data, instead of rendering as a separate reference. See [`docsInline.ts`](https://github.com/expo/expo/blob/main/tools/src/generate-docs-api-data/docsInline.ts) for behavior. | +| `@alias` | Adds a property as an alternate name for another property. Syntax: `@alias [target_property_name]`. | +| `@docsMissing` | Audit-only marker for members that lack documentation. Stripped from the rendered output and is used as for reference only. | +| `@needsAudit` | Audit-only marker for members whose documentation needs review. Stripped from the rendered output and is used as for reference only. | - When linking other SDK packages in a comment, use `./` instead of `../` at the beginning of the URL - For more information, check out [detect broken internal links in generated doc comments](https://github.com/expo/expo/pull/16771) PR on GitHub. diff --git a/packages/@expo/cli/CHANGELOG.md b/packages/@expo/cli/CHANGELOG.md index 79c4a48fc09493..2c4df234581a76 100644 --- a/packages/@expo/cli/CHANGELOG.md +++ b/packages/@expo/cli/CHANGELOG.md @@ -80,6 +80,7 @@ ### 💡 Others +- Switch React Native Directory compatibility check request from POST to GET. ([#45673](https://github.com/expo/expo/pull/45673) by [@simek](https://github.com/simek)) - Target only the first compatible device architecture during Android debug builds to speed up build time. ([#44907](https://github.com/expo/expo/pull/44907) by [@AntoineThibi](https://github.com/AntoineThibi)) - Bump to `picomatch@^4.0.4` ([#45698](https://github.com/expo/expo/pull/45698) by [@kitten](https://github.com/kitten)) diff --git a/packages/@expo/cli/src/install/utils/__tests__/checkPackagesCompatibility-test.ts b/packages/@expo/cli/src/install/utils/__tests__/checkPackagesCompatibility-test.ts index 5decfc78c4287a..5ce790f77b7706 100644 --- a/packages/@expo/cli/src/install/utils/__tests__/checkPackagesCompatibility-test.ts +++ b/packages/@expo/cli/src/install/utils/__tests__/checkPackagesCompatibility-test.ts @@ -1,14 +1,15 @@ import nock from 'nock'; import { Log } from '../../../log'; -import { checkPackagesCompatibility } from '../checkPackagesCompatibility'; +import { checkPackagesCompatibility, MAX_PACKAGES_PER_QUERY } from '../checkPackagesCompatibility'; jest.mock('../../../log'); describe(checkPackagesCompatibility, () => { it(`warns about one unsupported package`, async () => { nock('https://reactnative.directory') - .post('/api/libraries/check') + .get('/api/libraries/check') + .query({ packages: 'react-native-code-push' }) .reply(200, { 'react-native-code-push': { newArchitecture: 'unsupported' }, }); @@ -23,7 +24,10 @@ describe(checkPackagesCompatibility, () => { it(`warns about multiple unsupported package`, async () => { nock('https://reactnative.directory') - .post('/api/libraries/check') + .get('/api/libraries/check') + .query({ + packages: '@react-native-community/blur,@gorhom/bottom-sheet,react-native-code-push', + }) .reply(200, { '@react-native-community/blur': { newArchitecture: 'unsupported' }, '@gorhom/bottom-sheet': { newArchitecture: 'unsupported' }, @@ -46,10 +50,11 @@ describe(checkPackagesCompatibility, () => { it(`does not warn about supported or unknown package`, async () => { nock('https://reactnative.directory') - .post('/api/libraries/check') + .get('/api/libraries/check') + .query({ packages: 'expo-image,@expo-google-fonts/inter' }) .reply(200, { 'expo-image': { newArchitecture: 'supported' }, - 'expo-image-picker': { newArchitecture: undefined }, + '@expo-google-fonts/inter': { newArchitecture: undefined }, }); await checkPackagesCompatibility(['expo-image', '@expo-google-fonts/inter']); @@ -61,7 +66,8 @@ describe(checkPackagesCompatibility, () => { let wasCalled = false; nock('https://reactnative.directory') - .post('/api/libraries/check') + .get('/api/libraries/check') + .query({ packages: '@expo-google-fonts/inter,@expo/metro-runtime,@expo/styleguide' }) .reply(200, () => { wasCalled = true; return {}; @@ -76,4 +82,39 @@ describe(checkPackagesCompatibility, () => { expect(wasCalled).toBe(false); expect(Log.warn).toHaveBeenCalledTimes(0); }); + + it(`splits ${MAX_PACKAGES_PER_QUERY}+ packages into two requests`, async () => { + const packages = Array.from( + { length: MAX_PACKAGES_PER_QUERY + 1 }, + (_, index) => `react-native-package-${index + 1}` + ); + const firstChunk = packages.slice(0, MAX_PACKAGES_PER_QUERY); + const secondChunk = packages.slice(MAX_PACKAGES_PER_QUERY); + + const firstRequest = nock('https://reactnative.directory') + .get('/api/libraries/check') + .query({ packages: firstChunk.join(',') }) + .reply( + 200, + Object.fromEntries( + firstChunk.map((packageName) => [packageName, { newArchitecture: 'supported' }]) + ) + ); + + const secondRequest = nock('https://reactnative.directory') + .get('/api/libraries/check') + .query({ packages: secondChunk.join(',') }) + .reply( + 200, + Object.fromEntries( + secondChunk.map((packageName) => [packageName, { newArchitecture: 'supported' }]) + ) + ); + + await checkPackagesCompatibility(packages); + + expect(firstRequest.isDone()).toBe(true); + expect(secondRequest.isDone()).toBe(true); + expect(Log.warn).toHaveBeenCalledTimes(0); + }); }); diff --git a/packages/@expo/cli/src/install/utils/checkPackagesCompatibility.ts b/packages/@expo/cli/src/install/utils/checkPackagesCompatibility.ts index cd8839e5a1c2f6..10d9c8d106e0fb 100644 --- a/packages/@expo/cli/src/install/utils/checkPackagesCompatibility.ts +++ b/packages/@expo/cli/src/install/utils/checkPackagesCompatibility.ts @@ -1,7 +1,8 @@ -// note(Simek): https://github.com/react-native-community/directory/blob/main/pages/api/libraries/check.ts +// note(Simek): reference https://github.com/react-native-community/directory/blob/main/pages/api/libraries/check.ts import chalk from 'chalk'; import { Log } from '../../log'; +import { chunk } from '../../utils/array'; import { fetch } from '../../utils/fetch'; import { learnMore } from '../../utils/link'; @@ -10,6 +11,9 @@ export type ReactNativeDirectoryCheckResult = { newArchitecture: 'supported' | 'unsupported' | 'untested'; }; +export type DirectoryCheckResponse = Record; + +export const MAX_PACKAGES_PER_QUERY = 50; const ERROR_MESSAGE = 'Unable to fetch compatibility data from React Native Directory. Skipping check.'; @@ -24,22 +28,28 @@ export async function checkPackagesCompatibility(packages: string[]) { return; } - const response = await fetch('https://reactnative.directory/api/libraries/check', { - method: 'POST', - headers: { - 'Content-Type': 'application/json', - }, - body: JSON.stringify({ packages: packagesToCheck }), - }); + const chunkedPackages = chunk(packagesToCheck, MAX_PACKAGES_PER_QUERY); - if (!response.ok) { - Log.log(chalk.gray(ERROR_MESSAGE)); - } + const results = await Promise.allSettled( + chunkedPackages.map((packageChunk) => + fetch( + `https://reactnative.directory/api/libraries/check?${new URLSearchParams({ packages: packageChunk.join(',') })}` + ).then((response) => { + if (!response.ok) { + throw new Error(ERROR_MESSAGE); + } + return response.json(); + }) + ) + ); - const packageMetadata = (await response.json()) as Record< - string, - ReactNativeDirectoryCheckResult - >; + const packageMetadata = results.reduce((acc, result) => { + if (result.status === 'fulfilled') { + return { ...acc, ...result.value }; + } + Log.log(chalk.gray(ERROR_MESSAGE)); + return acc; + }, {}); const incompatiblePackages = packagesToCheck.filter( (packageName) => packageMetadata[packageName]?.newArchitecture === 'unsupported' diff --git a/packages/@expo/config-plugins/CHANGELOG.md b/packages/@expo/config-plugins/CHANGELOG.md index 3d6212dd0c133e..a3d97acbf1b266 100644 --- a/packages/@expo/config-plugins/CHANGELOG.md +++ b/packages/@expo/config-plugins/CHANGELOG.md @@ -6,10 +6,17 @@ ### 🎉 New features +- Support `.cjs`, `.mjs`, `.ts`, `.cts`, `.mts` extensions for config plugins ([#45989](https://github.com/expo/expo/pull/45989) by [@kitten](https://github.com/kitten)) + ### 🐛 Bug fixes +- Pass through better error message from `loadModuleSync` when loading/parsing config plugins fails ([#45989](https://github.com/expo/expo/pull/45989) by [@kitten](https://github.com/kitten)) + ### 💡 Others +- [Internal] Align config-plugin resolution support to `@expo/config` using `@expo/reqire-utils` ([#45989](https://github.com/expo/expo/pull/45989) by [@kitten](https://github.com/kitten)) +- [Internal] Drop `resolve-from` for `@expo/require-utils` ([#45990](https://github.com/expo/expo/pull/45990) by [@kitten](https://github.com/kitten)) + ## 56.0.6 — 2026-05-19 _This version does not introduce any user-facing changes._ diff --git a/packages/@expo/config-plugins/__mocks__/resolve-from.ts b/packages/@expo/config-plugins/__mocks__/resolve-from.ts deleted file mode 100644 index a6d129155728d2..00000000000000 --- a/packages/@expo/config-plugins/__mocks__/resolve-from.ts +++ /dev/null @@ -1,20 +0,0 @@ -module.exports = require(require.resolve('resolve-from')); - -module.exports.silent = (fromDirectory, request) => { - const fs = require('fs'); - const path = require('path'); - try { - fromDirectory = fs.realpathSync(fromDirectory); - } catch (error) { - if (error.code === 'ENOENT') { - fromDirectory = path.resolve(fromDirectory); - } else { - return; - } - } - - const outputPath = path.join(fromDirectory, 'node_modules', request); - if (fs.existsSync(outputPath)) { - return outputPath; - } -}; diff --git a/packages/@expo/config-plugins/build/ios/Maps.js b/packages/@expo/config-plugins/build/ios/Maps.js index 9edec2b32538eb..49130dec4941f9 100644 --- a/packages/@expo/config-plugins/build/ios/Maps.js +++ b/packages/@expo/config-plugins/build/ios/Maps.js @@ -13,16 +13,16 @@ exports.removeGoogleMapsAppDelegateInit = removeGoogleMapsAppDelegateInit; exports.removeMapsCocoaPods = removeMapsCocoaPods; exports.setGoogleMapsApiKey = setGoogleMapsApiKey; exports.withMaps = void 0; -function _path() { - const data = _interopRequireDefault(require("path")); - _path = function () { +function _requireUtils() { + const data = require("@expo/require-utils"); + _requireUtils = function () { return data; }; return data; } -function _resolveFrom() { - const data = _interopRequireDefault(require("resolve-from")); - _resolveFrom = function () { +function _path() { + const data = _interopRequireDefault(require("path")); + _path = function () { return data; }; return data; @@ -134,7 +134,7 @@ function removeMapsCocoaPods(src) { }); } function isReactNativeMapsInstalled(projectRoot) { - const resolved = _resolveFrom().default.silent(projectRoot, 'react-native-maps/package.json'); + const resolved = (0, _requireUtils().resolveFrom)(projectRoot, 'react-native-maps/package.json'); return resolved ? _path().default.dirname(resolved) : null; } function isReactNativeMapsAutolinked(config) { diff --git a/packages/@expo/config-plugins/build/ios/Maps.js.map b/packages/@expo/config-plugins/build/ios/Maps.js.map index 4aed40cb834ae9..2efd2725351842 100644 --- a/packages/@expo/config-plugins/build/ios/Maps.js.map +++ b/packages/@expo/config-plugins/build/ios/Maps.js.map @@ -1 +1 @@ -{"version":3,"file":"Maps.js","names":["_path","data","_interopRequireDefault","require","_resolveFrom","_iosPlugins","_generateCode","e","__esModule","default","debug","MATCH_INIT","exports","withGoogleMapsKey","createInfoPlistPlugin","setGoogleMapsApiKey","withMaps","config","apiKey","getGoogleMapsApiKey","withMapsCocoaPods","useGoogleMaps","withGoogleMapsAppDelegate","ios","googleMapsApiKey","GMSApiKey","infoPlist","addGoogleMapsAppDelegateImport","src","newSrc","mergeContents","tag","join","anchor","offset","comment","removeGoogleMapsAppDelegateImport","removeContents","addGoogleMapsAppDelegateInit","removeGoogleMapsAppDelegateInit","addMapsCocoaPods","removeMapsCocoaPods","isReactNativeMapsInstalled","projectRoot","resolved","resolveFrom","silent","path","dirname","isReactNativeMapsAutolinked","withPodfile","googleMapsPath","modRequest","isLinked","results","modResults","contents","error","code","Error","didMerge","didClear","withAppDelegate","language"],"sources":["../../src/ios/Maps.ts"],"sourcesContent":["import type { ExpoConfig } from '@expo/config-types';\nimport path from 'path';\nimport resolveFrom from 'resolve-from';\n\nimport type { ConfigPlugin, InfoPlist } from '../Plugin.types';\nimport { createInfoPlistPlugin, withAppDelegate, withPodfile } from '../plugins/ios-plugins';\nimport type { MergeResults } from '../utils/generateCode';\nimport { mergeContents, removeContents } from '../utils/generateCode';\n\nconst debug = require('debug')('expo:config-plugins:ios:maps') as typeof console.log;\n\nexport const MATCH_INIT = /\\bsuper\\.application\\(\\w+?, didFinishLaunchingWithOptions: \\w+?\\)/g;\n\nconst withGoogleMapsKey = createInfoPlistPlugin(setGoogleMapsApiKey, 'withGoogleMapsKey');\n\nexport const withMaps: ConfigPlugin = (config) => {\n config = withGoogleMapsKey(config);\n\n const apiKey = getGoogleMapsApiKey(config);\n // Technically adds react-native-maps (Apple maps) and google maps.\n\n debug('Google Maps API Key:', apiKey);\n config = withMapsCocoaPods(config, { useGoogleMaps: !!apiKey });\n\n // Adds/Removes AppDelegate setup for Google Maps API on iOS\n config = withGoogleMapsAppDelegate(config, { apiKey });\n\n return config;\n};\n\nexport function getGoogleMapsApiKey(config: Pick) {\n return config.ios?.config?.googleMapsApiKey ?? null;\n}\n\nexport function setGoogleMapsApiKey(\n config: Pick,\n { GMSApiKey, ...infoPlist }: InfoPlist\n): InfoPlist {\n const apiKey = getGoogleMapsApiKey(config);\n\n if (apiKey === null) {\n return infoPlist;\n }\n\n return {\n ...infoPlist,\n GMSApiKey: apiKey,\n };\n}\n\nexport function addGoogleMapsAppDelegateImport(src: string): MergeResults {\n const newSrc = ['#if canImport(GoogleMaps)', 'import GoogleMaps', '#endif'];\n\n return mergeContents({\n tag: 'react-native-maps-import',\n src,\n newSrc: newSrc.join('\\n'),\n anchor: /(@main|@UIApplicationMain)/,\n offset: 0,\n comment: '//',\n });\n}\n\nexport function removeGoogleMapsAppDelegateImport(src: string): MergeResults {\n return removeContents({\n tag: 'react-native-maps-import',\n src,\n });\n}\n\nexport function addGoogleMapsAppDelegateInit(src: string, apiKey: string): MergeResults {\n const newSrc = ['#if canImport(GoogleMaps)', `GMSServices.provideAPIKey(\"${apiKey}\")`, '#endif'];\n\n return mergeContents({\n tag: 'react-native-maps-init',\n src,\n newSrc: newSrc.join('\\n'),\n anchor: MATCH_INIT,\n offset: 0,\n comment: '//',\n });\n}\n\nexport function removeGoogleMapsAppDelegateInit(src: string): MergeResults {\n return removeContents({\n tag: 'react-native-maps-init',\n src,\n });\n}\n\n/**\n * @param src The contents of the Podfile.\n * @returns Podfile with Google Maps added.\n */\nexport function addMapsCocoaPods(src: string): MergeResults {\n return mergeContents({\n tag: 'react-native-maps',\n src,\n newSrc: ` pod 'react-native-google-maps', path: File.dirname(\\`node --print \"require.resolve('react-native-maps/package.json')\"\\`)`,\n anchor: /use_native_modules/,\n offset: 0,\n comment: '#',\n });\n}\n\nexport function removeMapsCocoaPods(src: string): MergeResults {\n return removeContents({\n tag: 'react-native-maps',\n src,\n });\n}\n\nfunction isReactNativeMapsInstalled(projectRoot: string): string | null {\n const resolved = resolveFrom.silent(projectRoot, 'react-native-maps/package.json');\n return resolved ? path.dirname(resolved) : null;\n}\n\nfunction isReactNativeMapsAutolinked(config: Pick): boolean {\n // Only add the native code changes if we know that the package is going to be linked natively.\n // This is specifically for monorepo support where one app might have react-native-maps (adding it to the node_modules)\n // but another app will not have it installed in the package.json, causing it to not be linked natively.\n // This workaround only exists because react-native-maps doesn't have a config plugin vendored in the package.\n\n // TODO: `react-native-maps` doesn't use Expo autolinking so we cannot safely disable the module.\n return true;\n\n // return (\n // !config._internal?.autolinkedModules ||\n // config._internal.autolinkedModules.includes('react-native-maps')\n // );\n}\n\nconst withMapsCocoaPods: ConfigPlugin<{ useGoogleMaps: boolean }> = (config, { useGoogleMaps }) => {\n return withPodfile(config, async (config) => {\n // Only add the block if react-native-maps is installed in the project (best effort).\n // Generally prebuild runs after a yarn install so this should always work as expected.\n const googleMapsPath = isReactNativeMapsInstalled(config.modRequest.projectRoot);\n const isLinked = isReactNativeMapsAutolinked(config);\n debug('Is Expo Autolinked:', isLinked);\n debug('react-native-maps path:', googleMapsPath);\n\n let results: MergeResults;\n\n if (isLinked && googleMapsPath && useGoogleMaps) {\n try {\n results = addMapsCocoaPods(config.modResults.contents);\n } catch (error: any) {\n if (error.code === 'ERR_NO_MATCH') {\n throw new Error(\n `Cannot add react-native-maps to the project's ios/Podfile because it's malformed. Report this with a copy of your project Podfile: https://github.com/expo/expo/issues`\n );\n }\n throw error;\n }\n } else {\n // If the package is no longer installed, then remove the block.\n results = removeMapsCocoaPods(config.modResults.contents);\n }\n\n if (results.didMerge || results.didClear) {\n config.modResults.contents = results.contents;\n }\n\n return config;\n });\n};\n\nconst withGoogleMapsAppDelegate: ConfigPlugin<{ apiKey: string | null }> = (config, { apiKey }) => {\n return withAppDelegate(config, (config) => {\n if (\n !apiKey ||\n !isReactNativeMapsAutolinked(config) ||\n !isReactNativeMapsInstalled(config.modRequest.projectRoot)\n ) {\n config.modResults.contents = removeGoogleMapsAppDelegateImport(\n config.modResults.contents\n ).contents;\n config.modResults.contents = removeGoogleMapsAppDelegateInit(\n config.modResults.contents\n ).contents;\n return config;\n }\n\n if (config.modResults.language !== 'swift') {\n throw new Error(\n `Cannot setup Google Maps because the project AppDelegate is not a supported language: ${config.modResults.language}`\n );\n }\n\n try {\n config.modResults.contents = addGoogleMapsAppDelegateImport(\n config.modResults.contents\n ).contents;\n config.modResults.contents = addGoogleMapsAppDelegateInit(\n config.modResults.contents,\n apiKey\n ).contents;\n } catch (error: any) {\n if (error.code === 'ERR_NO_MATCH') {\n throw new Error(\n `Cannot add Google Maps to the project's AppDelegate because it's malformed. Report this with a copy of your project AppDelegate: https://github.com/expo/expo/issues`\n );\n }\n throw error;\n }\n return config;\n });\n};\n"],"mappings":"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","ignoreList":[]} \ No newline at end of file +{"version":3,"file":"Maps.js","names":["_requireUtils","data","require","_path","_interopRequireDefault","_iosPlugins","_generateCode","e","__esModule","default","debug","MATCH_INIT","exports","withGoogleMapsKey","createInfoPlistPlugin","setGoogleMapsApiKey","withMaps","config","apiKey","getGoogleMapsApiKey","withMapsCocoaPods","useGoogleMaps","withGoogleMapsAppDelegate","ios","googleMapsApiKey","GMSApiKey","infoPlist","addGoogleMapsAppDelegateImport","src","newSrc","mergeContents","tag","join","anchor","offset","comment","removeGoogleMapsAppDelegateImport","removeContents","addGoogleMapsAppDelegateInit","removeGoogleMapsAppDelegateInit","addMapsCocoaPods","removeMapsCocoaPods","isReactNativeMapsInstalled","projectRoot","resolved","resolveFrom","path","dirname","isReactNativeMapsAutolinked","withPodfile","googleMapsPath","modRequest","isLinked","results","modResults","contents","error","code","Error","didMerge","didClear","withAppDelegate","language"],"sources":["../../src/ios/Maps.ts"],"sourcesContent":["import type { ExpoConfig } from '@expo/config-types';\nimport { resolveFrom } from '@expo/require-utils';\nimport path from 'path';\n\nimport type { ConfigPlugin, InfoPlist } from '../Plugin.types';\nimport { createInfoPlistPlugin, withAppDelegate, withPodfile } from '../plugins/ios-plugins';\nimport type { MergeResults } from '../utils/generateCode';\nimport { mergeContents, removeContents } from '../utils/generateCode';\n\nconst debug = require('debug')('expo:config-plugins:ios:maps') as typeof console.log;\n\nexport const MATCH_INIT = /\\bsuper\\.application\\(\\w+?, didFinishLaunchingWithOptions: \\w+?\\)/g;\n\nconst withGoogleMapsKey = createInfoPlistPlugin(setGoogleMapsApiKey, 'withGoogleMapsKey');\n\nexport const withMaps: ConfigPlugin = (config) => {\n config = withGoogleMapsKey(config);\n\n const apiKey = getGoogleMapsApiKey(config);\n // Technically adds react-native-maps (Apple maps) and google maps.\n\n debug('Google Maps API Key:', apiKey);\n config = withMapsCocoaPods(config, { useGoogleMaps: !!apiKey });\n\n // Adds/Removes AppDelegate setup for Google Maps API on iOS\n config = withGoogleMapsAppDelegate(config, { apiKey });\n\n return config;\n};\n\nexport function getGoogleMapsApiKey(config: Pick) {\n return config.ios?.config?.googleMapsApiKey ?? null;\n}\n\nexport function setGoogleMapsApiKey(\n config: Pick,\n { GMSApiKey, ...infoPlist }: InfoPlist\n): InfoPlist {\n const apiKey = getGoogleMapsApiKey(config);\n\n if (apiKey === null) {\n return infoPlist;\n }\n\n return {\n ...infoPlist,\n GMSApiKey: apiKey,\n };\n}\n\nexport function addGoogleMapsAppDelegateImport(src: string): MergeResults {\n const newSrc = ['#if canImport(GoogleMaps)', 'import GoogleMaps', '#endif'];\n\n return mergeContents({\n tag: 'react-native-maps-import',\n src,\n newSrc: newSrc.join('\\n'),\n anchor: /(@main|@UIApplicationMain)/,\n offset: 0,\n comment: '//',\n });\n}\n\nexport function removeGoogleMapsAppDelegateImport(src: string): MergeResults {\n return removeContents({\n tag: 'react-native-maps-import',\n src,\n });\n}\n\nexport function addGoogleMapsAppDelegateInit(src: string, apiKey: string): MergeResults {\n const newSrc = ['#if canImport(GoogleMaps)', `GMSServices.provideAPIKey(\"${apiKey}\")`, '#endif'];\n\n return mergeContents({\n tag: 'react-native-maps-init',\n src,\n newSrc: newSrc.join('\\n'),\n anchor: MATCH_INIT,\n offset: 0,\n comment: '//',\n });\n}\n\nexport function removeGoogleMapsAppDelegateInit(src: string): MergeResults {\n return removeContents({\n tag: 'react-native-maps-init',\n src,\n });\n}\n\n/**\n * @param src The contents of the Podfile.\n * @returns Podfile with Google Maps added.\n */\nexport function addMapsCocoaPods(src: string): MergeResults {\n return mergeContents({\n tag: 'react-native-maps',\n src,\n newSrc: ` pod 'react-native-google-maps', path: File.dirname(\\`node --print \"require.resolve('react-native-maps/package.json')\"\\`)`,\n anchor: /use_native_modules/,\n offset: 0,\n comment: '#',\n });\n}\n\nexport function removeMapsCocoaPods(src: string): MergeResults {\n return removeContents({\n tag: 'react-native-maps',\n src,\n });\n}\n\nfunction isReactNativeMapsInstalled(projectRoot: string): string | null {\n const resolved = resolveFrom(projectRoot, 'react-native-maps/package.json');\n return resolved ? path.dirname(resolved) : null;\n}\n\nfunction isReactNativeMapsAutolinked(config: Pick): boolean {\n // Only add the native code changes if we know that the package is going to be linked natively.\n // This is specifically for monorepo support where one app might have react-native-maps (adding it to the node_modules)\n // but another app will not have it installed in the package.json, causing it to not be linked natively.\n // This workaround only exists because react-native-maps doesn't have a config plugin vendored in the package.\n\n // TODO: `react-native-maps` doesn't use Expo autolinking so we cannot safely disable the module.\n return true;\n\n // return (\n // !config._internal?.autolinkedModules ||\n // config._internal.autolinkedModules.includes('react-native-maps')\n // );\n}\n\nconst withMapsCocoaPods: ConfigPlugin<{ useGoogleMaps: boolean }> = (config, { useGoogleMaps }) => {\n return withPodfile(config, async (config) => {\n // Only add the block if react-native-maps is installed in the project (best effort).\n // Generally prebuild runs after a yarn install so this should always work as expected.\n const googleMapsPath = isReactNativeMapsInstalled(config.modRequest.projectRoot);\n const isLinked = isReactNativeMapsAutolinked(config);\n debug('Is Expo Autolinked:', isLinked);\n debug('react-native-maps path:', googleMapsPath);\n\n let results: MergeResults;\n\n if (isLinked && googleMapsPath && useGoogleMaps) {\n try {\n results = addMapsCocoaPods(config.modResults.contents);\n } catch (error: any) {\n if (error.code === 'ERR_NO_MATCH') {\n throw new Error(\n `Cannot add react-native-maps to the project's ios/Podfile because it's malformed. Report this with a copy of your project Podfile: https://github.com/expo/expo/issues`\n );\n }\n throw error;\n }\n } else {\n // If the package is no longer installed, then remove the block.\n results = removeMapsCocoaPods(config.modResults.contents);\n }\n\n if (results.didMerge || results.didClear) {\n config.modResults.contents = results.contents;\n }\n\n return config;\n });\n};\n\nconst withGoogleMapsAppDelegate: ConfigPlugin<{ apiKey: string | null }> = (config, { apiKey }) => {\n return withAppDelegate(config, (config) => {\n if (\n !apiKey ||\n !isReactNativeMapsAutolinked(config) ||\n !isReactNativeMapsInstalled(config.modRequest.projectRoot)\n ) {\n config.modResults.contents = removeGoogleMapsAppDelegateImport(\n config.modResults.contents\n ).contents;\n config.modResults.contents = removeGoogleMapsAppDelegateInit(\n config.modResults.contents\n ).contents;\n return config;\n }\n\n if (config.modResults.language !== 'swift') {\n throw new Error(\n `Cannot setup Google Maps because the project AppDelegate is not a supported language: ${config.modResults.language}`\n );\n }\n\n try {\n config.modResults.contents = addGoogleMapsAppDelegateImport(\n config.modResults.contents\n ).contents;\n config.modResults.contents = addGoogleMapsAppDelegateInit(\n config.modResults.contents,\n apiKey\n ).contents;\n } catch (error: any) {\n if (error.code === 'ERR_NO_MATCH') {\n throw new Error(\n `Cannot add Google Maps to the project's AppDelegate because it's malformed. Report this with a copy of your project AppDelegate: https://github.com/expo/expo/issues`\n );\n }\n throw error;\n }\n return config;\n });\n};\n"],"mappings":"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","ignoreList":[]} \ No newline at end of file diff --git a/packages/@expo/config-plugins/build/utils/Updates.js b/packages/@expo/config-plugins/build/utils/Updates.js index 40dbec67753979..9d07398bb55f36 100644 --- a/packages/@expo/config-plugins/build/utils/Updates.js +++ b/packages/@expo/config-plugins/build/utils/Updates.js @@ -23,6 +23,13 @@ exports.getUpdatesRequestHeadersStringified = getUpdatesRequestHeadersStringifie exports.getUpdatesTimeout = getUpdatesTimeout; exports.getUpdatesUseEmbeddedUpdate = getUpdatesUseEmbeddedUpdate; exports.resolveRuntimeVersionPolicyAsync = resolveRuntimeVersionPolicyAsync; +function _requireUtils() { + const data = require("@expo/require-utils"); + _requireUtils = function () { + return data; + }; + return data; +} function _sdkRuntimeVersions() { const data = require("@expo/sdk-runtime-versions"); _sdkRuntimeVersions = function () { @@ -51,13 +58,6 @@ function _path() { }; return data; } -function _resolveFrom() { - const data = _interopRequireDefault(require("resolve-from")); - _resolveFrom = function () { - return data; - }; - return data; -} function _semver() { const data = _interopRequireDefault(require("semver")); _semver = function () { @@ -83,8 +83,8 @@ function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; } const FINGERPRINT_RUNTIME_VERSION_SENTINEL = exports.FINGERPRINT_RUNTIME_VERSION_SENTINEL = 'file:fingerprint'; function getExpoUpdatesPackageVersion(projectRoot) { - const expoUpdatesPackageJsonPath = _resolveFrom().default.silent(projectRoot, 'expo-updates/package.json'); - if (!expoUpdatesPackageJsonPath || !_fs().default.existsSync(expoUpdatesPackageJsonPath)) { + const expoUpdatesPackageJsonPath = (0, _requireUtils().resolveFrom)(projectRoot, 'expo-updates/package.json'); + if (!expoUpdatesPackageJsonPath) { return null; } const packageJson = JSON.parse(_fs().default.readFileSync(expoUpdatesPackageJsonPath, 'utf8')); diff --git a/packages/@expo/config-plugins/build/utils/Updates.js.map b/packages/@expo/config-plugins/build/utils/Updates.js.map index 095140dc4f3fc0..4c9f7620ec67b6 100644 --- a/packages/@expo/config-plugins/build/utils/Updates.js.map +++ b/packages/@expo/config-plugins/build/utils/Updates.js.map @@ -1 +1 @@ -{"version":3,"file":"Updates.js","names":["_sdkRuntimeVersions","data","require","_fs","_interopRequireDefault","_getenv","_path","_resolveFrom","_semver","AndroidVersion","_interopRequireWildcard","IOSVersion","e","t","WeakMap","r","n","__esModule","o","i","f","__proto__","default","has","get","set","hasOwnProperty","call","Object","defineProperty","getOwnPropertyDescriptor","FINGERPRINT_RUNTIME_VERSION_SENTINEL","exports","getExpoUpdatesPackageVersion","projectRoot","expoUpdatesPackageJsonPath","resolveFrom","silent","fs","existsSync","packageJson","JSON","parse","readFileSync","version","getUpdateUrl","config","updates","url","getAppVersion","getNativeVersion","platform","getVersion","buildNumber","getBuildNumber","versionCode","getVersionCode","Error","getRuntimeVersionNullableAsync","getRuntimeVersionAsync","boolish","console","log","runtimeVersion","policy","resolveRuntimeVersionPolicyAsync","sdkVersion","getRuntimeVersionForSDKVersion","getSDKVersion","getUpdatesEnabled","enabled","undefined","getUpdatesUseEmbeddedUpdate","useEmbeddedUpdate","getUpdatesBsdiffPatchSupportEnabled","enableBsdiffPatchSupport","getUpdatesTimeout","fallbackToCacheTimeout","getUpdatesCheckOnLaunch","expoUpdatesPackageVersion","checkAutomatically","semver","gte","getUpdatesCodeSigningCertificate","codeSigningCertificatePath","codeSigningCertificate","finalPath","path","join","getUpdatesCodeSigningMetadata","codeSigningMetadata","getUpdatesCodeSigningMetadataStringified","metadata","stringify","getUpdatesRequestHeaders","requestHeaders","getUpdatesRequestHeadersStringified","getDisableAntiBrickingMeasures","disableAntiBrickingMeasures"],"sources":["../../src/utils/Updates.ts"],"sourcesContent":["import type { Android, ExpoConfig, IOS } from '@expo/config-types';\nimport { getRuntimeVersionForSDKVersion } from '@expo/sdk-runtime-versions';\nimport fs from 'fs';\nimport { boolish } from 'getenv';\nimport path from 'path';\nimport resolveFrom from 'resolve-from';\nimport semver from 'semver';\n\nimport * as AndroidVersion from '../android/Version';\nimport * as IOSVersion from '../ios/Version';\n\nexport type ExpoConfigUpdates = Pick<\n ExpoConfig,\n 'sdkVersion' | 'runtimeVersion' | 'updates' | 'slug'\n>;\n\nexport const FINGERPRINT_RUNTIME_VERSION_SENTINEL = 'file:fingerprint';\n\nexport function getExpoUpdatesPackageVersion(projectRoot: string): string | null {\n const expoUpdatesPackageJsonPath = resolveFrom.silent(projectRoot, 'expo-updates/package.json');\n if (!expoUpdatesPackageJsonPath || !fs.existsSync(expoUpdatesPackageJsonPath)) {\n return null;\n }\n const packageJson = JSON.parse(fs.readFileSync(expoUpdatesPackageJsonPath, 'utf8'));\n return packageJson.version;\n}\n\nexport function getUpdateUrl(config: Pick): string | null {\n return config.updates?.url ?? null;\n}\n\nexport function getAppVersion(config: Pick): string {\n return config.version ?? '1.0.0';\n}\n\nexport function getNativeVersion(\n config: Pick & {\n android?: Pick;\n ios?: Pick;\n },\n platform: 'android' | 'ios'\n): string {\n const version = IOSVersion.getVersion(config);\n switch (platform) {\n case 'ios': {\n const buildNumber = IOSVersion.getBuildNumber(config);\n return `${version}(${buildNumber})`;\n }\n case 'android': {\n const versionCode = AndroidVersion.getVersionCode(config);\n return `${version}(${versionCode})`;\n }\n default: {\n throw new Error(\n `\"${platform}\" is not a supported platform. Choose either \"ios\" or \"android\".`\n );\n }\n }\n}\n\nexport async function getRuntimeVersionNullableAsync(\n ...[projectRoot, config, platform]: Parameters\n): Promise {\n try {\n return await getRuntimeVersionAsync(projectRoot, config, platform);\n } catch (e) {\n if (boolish('EXPO_DEBUG', false)) {\n console.log(e);\n }\n return null;\n }\n}\n\nexport async function getRuntimeVersionAsync(\n projectRoot: string,\n config: Pick & {\n android?: Pick;\n ios?: Pick;\n },\n platform: 'android' | 'ios'\n): Promise {\n const runtimeVersion = config[platform]?.runtimeVersion ?? config.runtimeVersion;\n if (!runtimeVersion) {\n return null;\n }\n\n if (typeof runtimeVersion === 'string') {\n if (runtimeVersion === FINGERPRINT_RUNTIME_VERSION_SENTINEL) {\n throw new Error(\n `${FINGERPRINT_RUNTIME_VERSION_SENTINEL} is a reserved value for runtime version. To use a fingerprint runtime version, use the \"fingerprint\" runtime version policy.`\n );\n }\n return runtimeVersion;\n } else if (!runtimeVersion.policy) {\n throw new Error(\n `\"${runtimeVersion}\" is not a valid runtime version. Only a string or a runtime version policy is supported.`\n );\n } else if (runtimeVersion.policy === 'fingerprint') {\n return FINGERPRINT_RUNTIME_VERSION_SENTINEL;\n } else {\n return await resolveRuntimeVersionPolicyAsync(runtimeVersion.policy, config, platform);\n }\n}\n\nexport async function resolveRuntimeVersionPolicyAsync(\n policy: 'appVersion' | 'nativeVersion' | 'sdkVersion',\n config: Pick & {\n android?: Pick;\n ios?: Pick;\n },\n platform: 'android' | 'ios'\n): Promise {\n if (policy === 'appVersion') {\n return getAppVersion(config);\n } else if (policy === 'nativeVersion') {\n return getNativeVersion(config, platform);\n } else if (policy === 'sdkVersion') {\n if (!config.sdkVersion) {\n throw new Error(\"An SDK version must be defined when using the 'sdkVersion' runtime policy.\");\n }\n return getRuntimeVersionForSDKVersion(config.sdkVersion);\n } else {\n // fingerprint is resolvable only at build time (not in config plugin).\n throw new Error(`\"${policy}\" is not a valid runtime version policy type.`);\n }\n}\n\nexport function getSDKVersion(config: Pick): string | null {\n return typeof config.sdkVersion === 'string' ? config.sdkVersion : null;\n}\n\nexport function getUpdatesEnabled(config: Pick): boolean {\n // allow override of enabled property\n if (config.updates?.enabled !== undefined) {\n return config.updates.enabled;\n }\n\n return getUpdateUrl(config) !== null;\n}\n\nexport function getUpdatesUseEmbeddedUpdate(config: Pick): boolean {\n if (config.updates?.useEmbeddedUpdate !== undefined) {\n return config.updates.useEmbeddedUpdate;\n }\n\n return true;\n}\n\nexport function getUpdatesBsdiffPatchSupportEnabled(\n config: Pick\n): boolean {\n if (config.updates?.enableBsdiffPatchSupport !== undefined) {\n return config.updates.enableBsdiffPatchSupport;\n }\n return true;\n}\n\nexport function getUpdatesTimeout(config: Pick): number {\n return config.updates?.fallbackToCacheTimeout ?? 0;\n}\n\nexport function getUpdatesCheckOnLaunch(\n config: Pick,\n expoUpdatesPackageVersion?: string | null\n): 'NEVER' | 'ERROR_RECOVERY_ONLY' | 'ALWAYS' | 'WIFI_ONLY' {\n if (config.updates?.checkAutomatically === 'ON_ERROR_RECOVERY') {\n // native 'ERROR_RECOVERY_ONLY' option was only introduced in 0.11.x\n if (expoUpdatesPackageVersion && semver.gte(expoUpdatesPackageVersion, '0.11.0')) {\n return 'ERROR_RECOVERY_ONLY';\n }\n return 'NEVER';\n } else if (config.updates?.checkAutomatically === 'ON_LOAD') {\n return 'ALWAYS';\n } else if (config.updates?.checkAutomatically === 'WIFI_ONLY') {\n return 'WIFI_ONLY';\n } else if (config.updates?.checkAutomatically === 'NEVER') {\n return 'NEVER';\n }\n return 'ALWAYS';\n}\n\nexport function getUpdatesCodeSigningCertificate(\n projectRoot: string,\n config: Pick\n): string | undefined {\n const codeSigningCertificatePath = config.updates?.codeSigningCertificate;\n if (!codeSigningCertificatePath) {\n return undefined;\n }\n\n const finalPath = path.join(projectRoot, codeSigningCertificatePath);\n if (!fs.existsSync(finalPath)) {\n throw new Error(`File not found at \\`updates.codeSigningCertificate\\` path: ${finalPath}`);\n }\n\n return fs.readFileSync(finalPath, 'utf8');\n}\n\nexport function getUpdatesCodeSigningMetadata(\n config: Pick\n): NonNullable['codeSigningMetadata'] {\n return config.updates?.codeSigningMetadata;\n}\n\nexport function getUpdatesCodeSigningMetadataStringified(\n config: Pick\n): string | undefined {\n const metadata = getUpdatesCodeSigningMetadata(config);\n if (!metadata) {\n return undefined;\n }\n\n return JSON.stringify(metadata);\n}\n\nexport function getUpdatesRequestHeaders(\n config: Pick\n): NonNullable['requestHeaders'] {\n return config.updates?.requestHeaders;\n}\n\nexport function getUpdatesRequestHeadersStringified(\n config: Pick\n): string | undefined {\n const metadata = getUpdatesRequestHeaders(config);\n if (!metadata) {\n return undefined;\n }\n\n return JSON.stringify(metadata);\n}\n\nexport function getDisableAntiBrickingMeasures(\n config: Pick\n): boolean | undefined {\n return config.updates?.disableAntiBrickingMeasures;\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;AACA,SAAAA,oBAAA;EAAA,MAAAC,IAAA,GAAAC,OAAA;EAAAF,mBAAA,YAAAA,CAAA;IAAA,OAAAC,IAAA;EAAA;EAAA,OAAAA,IAAA;AAAA;AACA,SAAAE,IAAA;EAAA,MAAAF,IAAA,GAAAG,sBAAA,CAAAF,OAAA;EAAAC,GAAA,YAAAA,CAAA;IAAA,OAAAF,IAAA;EAAA;EAAA,OAAAA,IAAA;AAAA;AACA,SAAAI,QAAA;EAAA,MAAAJ,IAAA,GAAAC,OAAA;EAAAG,OAAA,YAAAA,CAAA;IAAA,OAAAJ,IAAA;EAAA;EAAA,OAAAA,IAAA;AAAA;AACA,SAAAK,MAAA;EAAA,MAAAL,IAAA,GAAAG,sBAAA,CAAAF,OAAA;EAAAI,KAAA,YAAAA,CAAA;IAAA,OAAAL,IAAA;EAAA;EAAA,OAAAA,IAAA;AAAA;AACA,SAAAM,aAAA;EAAA,MAAAN,IAAA,GAAAG,sBAAA,CAAAF,OAAA;EAAAK,YAAA,YAAAA,CAAA;IAAA,OAAAN,IAAA;EAAA;EAAA,OAAAA,IAAA;AAAA;AACA,SAAAO,QAAA;EAAA,MAAAP,IAAA,GAAAG,sBAAA,CAAAF,OAAA;EAAAM,OAAA,YAAAA,CAAA;IAAA,OAAAP,IAAA;EAAA;EAAA,OAAAA,IAAA;AAAA;AAEA,SAAAQ,eAAA;EAAA,MAAAR,IAAA,GAAAS,uBAAA,CAAAR,OAAA;EAAAO,cAAA,YAAAA,CAAA;IAAA,OAAAR,IAAA;EAAA;EAAA,OAAAA,IAAA;AAAA;AACA,SAAAU,WAAA;EAAA,MAAAV,IAAA,GAAAS,uBAAA,CAAAR,OAAA;EAAAS,UAAA,YAAAA,CAAA;IAAA,OAAAV,IAAA;EAAA;EAAA,OAAAA,IAAA;AAAA;AAA6C,SAAAS,wBAAAE,CAAA,EAAAC,CAAA,6BAAAC,OAAA,MAAAC,CAAA,OAAAD,OAAA,IAAAE,CAAA,OAAAF,OAAA,YAAAJ,uBAAA,YAAAA,CAAAE,CAAA,EAAAC,CAAA,SAAAA,CAAA,IAAAD,CAAA,IAAAA,CAAA,CAAAK,UAAA,SAAAL,CAAA,MAAAM,CAAA,EAAAC,CAAA,EAAAC,CAAA,KAAAC,SAAA,QAAAC,OAAA,EAAAV,CAAA,iBAAAA,CAAA,uBAAAA,CAAA,yBAAAA,CAAA,SAAAQ,CAAA,MAAAF,CAAA,GAAAL,CAAA,GAAAG,CAAA,GAAAD,CAAA,QAAAG,CAAA,CAAAK,GAAA,CAAAX,CAAA,UAAAM,CAAA,CAAAM,GAAA,CAAAZ,CAAA,GAAAM,CAAA,CAAAO,GAAA,CAAAb,CAAA,EAAAQ,CAAA,gBAAAP,CAAA,IAAAD,CAAA,gBAAAC,CAAA,OAAAa,cAAA,CAAAC,IAAA,CAAAf,CAAA,EAAAC,CAAA,OAAAM,CAAA,IAAAD,CAAA,GAAAU,MAAA,CAAAC,cAAA,KAAAD,MAAA,CAAAE,wBAAA,CAAAlB,CAAA,EAAAC,CAAA,OAAAM,CAAA,CAAAK,GAAA,IAAAL,CAAA,CAAAM,GAAA,IAAAP,CAAA,CAAAE,CAAA,EAAAP,CAAA,EAAAM,CAAA,IAAAC,CAAA,CAAAP,CAAA,IAAAD,CAAA,CAAAC,CAAA,WAAAO,CAAA,KAAAR,CAAA,EAAAC,CAAA;AAAA,SAAAT,uBAAAQ,CAAA,WAAAA,CAAA,IAAAA,CAAA,CAAAK,UAAA,GAAAL,CAAA,KAAAU,OAAA,EAAAV,CAAA;AAOtC,MAAMmB,oCAAoC,GAAAC,OAAA,CAAAD,oCAAA,GAAG,kBAAkB;AAE/D,SAASE,4BAA4BA,CAACC,WAAmB,EAAiB;EAC/E,MAAMC,0BAA0B,GAAGC,sBAAW,CAACC,MAAM,CAACH,WAAW,EAAE,2BAA2B,CAAC;EAC/F,IAAI,CAACC,0BAA0B,IAAI,CAACG,aAAE,CAACC,UAAU,CAACJ,0BAA0B,CAAC,EAAE;IAC7E,OAAO,IAAI;EACb;EACA,MAAMK,WAAW,GAAGC,IAAI,CAACC,KAAK,CAACJ,aAAE,CAACK,YAAY,CAACR,0BAA0B,EAAE,MAAM,CAAC,CAAC;EACnF,OAAOK,WAAW,CAACI,OAAO;AAC5B;AAEO,SAASC,YAAYA,CAACC,MAA0C,EAAiB;EACtF,OAAOA,MAAM,CAACC,OAAO,EAAEC,GAAG,IAAI,IAAI;AACpC;AAEO,SAASC,aAAaA,CAACH,MAAmC,EAAU;EACzE,OAAOA,MAAM,CAACF,OAAO,IAAI,OAAO;AAClC;AAEO,SAASM,gBAAgBA,CAC9BJ,MAGC,EACDK,QAA2B,EACnB;EACR,MAAMP,OAAO,GAAGjC,UAAU,CAAD,CAAC,CAACyC,UAAU,CAACN,MAAM,CAAC;EAC7C,QAAQK,QAAQ;IACd,KAAK,KAAK;MAAE;QACV,MAAME,WAAW,GAAG1C,UAAU,CAAD,CAAC,CAAC2C,cAAc,CAACR,MAAM,CAAC;QACrD,OAAO,GAAGF,OAAO,IAAIS,WAAW,GAAG;MACrC;IACA,KAAK,SAAS;MAAE;QACd,MAAME,WAAW,GAAG9C,cAAc,CAAD,CAAC,CAAC+C,cAAc,CAACV,MAAM,CAAC;QACzD,OAAO,GAAGF,OAAO,IAAIW,WAAW,GAAG;MACrC;IACA;MAAS;QACP,MAAM,IAAIE,KAAK,CACb,IAAIN,QAAQ,kEACd,CAAC;MACH;EACF;AACF;AAEO,eAAeO,8BAA8BA,CAClD,GAAG,CAACxB,WAAW,EAAEY,MAAM,EAAEK,QAAQ,CAA4C,EACrD;EACxB,IAAI;IACF,OAAO,MAAMQ,sBAAsB,CAACzB,WAAW,EAAEY,MAAM,EAAEK,QAAQ,CAAC;EACpE,CAAC,CAAC,OAAOvC,CAAC,EAAE;IACV,IAAI,IAAAgD,iBAAO,EAAC,YAAY,EAAE,KAAK,CAAC,EAAE;MAChCC,OAAO,CAACC,GAAG,CAAClD,CAAC,CAAC;IAChB;IACA,OAAO,IAAI;EACb;AACF;AAEO,eAAe+C,sBAAsBA,CAC1CzB,WAAmB,EACnBY,MAGC,EACDK,QAA2B,EACH;EACxB,MAAMY,cAAc,GAAGjB,MAAM,CAACK,QAAQ,CAAC,EAAEY,cAAc,IAAIjB,MAAM,CAACiB,cAAc;EAChF,IAAI,CAACA,cAAc,EAAE;IACnB,OAAO,IAAI;EACb;EAEA,IAAI,OAAOA,cAAc,KAAK,QAAQ,EAAE;IACtC,IAAIA,cAAc,KAAKhC,oCAAoC,EAAE;MAC3D,MAAM,IAAI0B,KAAK,CACb,GAAG1B,oCAAoC,+HACzC,CAAC;IACH;IACA,OAAOgC,cAAc;EACvB,CAAC,MAAM,IAAI,CAACA,cAAc,CAACC,MAAM,EAAE;IACjC,MAAM,IAAIP,KAAK,CACb,IAAIM,cAAc,2FACpB,CAAC;EACH,CAAC,MAAM,IAAIA,cAAc,CAACC,MAAM,KAAK,aAAa,EAAE;IAClD,OAAOjC,oCAAoC;EAC7C,CAAC,MAAM;IACL,OAAO,MAAMkC,gCAAgC,CAACF,cAAc,CAACC,MAAM,EAAElB,MAAM,EAAEK,QAAQ,CAAC;EACxF;AACF;AAEO,eAAec,gCAAgCA,CACpDD,MAAqD,EACrDlB,MAGC,EACDK,QAA2B,EACV;EACjB,IAAIa,MAAM,KAAK,YAAY,EAAE;IAC3B,OAAOf,aAAa,CAACH,MAAM,CAAC;EAC9B,CAAC,MAAM,IAAIkB,MAAM,KAAK,eAAe,EAAE;IACrC,OAAOd,gBAAgB,CAACJ,MAAM,EAAEK,QAAQ,CAAC;EAC3C,CAAC,MAAM,IAAIa,MAAM,KAAK,YAAY,EAAE;IAClC,IAAI,CAAClB,MAAM,CAACoB,UAAU,EAAE;MACtB,MAAM,IAAIT,KAAK,CAAC,4EAA4E,CAAC;IAC/F;IACA,OAAO,IAAAU,oDAA8B,EAACrB,MAAM,CAACoB,UAAU,CAAC;EAC1D,CAAC,MAAM;IACL;IACA,MAAM,IAAIT,KAAK,CAAC,IAAIO,MAAM,+CAA+C,CAAC;EAC5E;AACF;AAEO,SAASI,aAAaA,CAACtB,MAA6C,EAAiB;EAC1F,OAAO,OAAOA,MAAM,CAACoB,UAAU,KAAK,QAAQ,GAAGpB,MAAM,CAACoB,UAAU,GAAG,IAAI;AACzE;AAEO,SAASG,iBAAiBA,CAACvB,MAA0C,EAAW;EACrF;EACA,IAAIA,MAAM,CAACC,OAAO,EAAEuB,OAAO,KAAKC,SAAS,EAAE;IACzC,OAAOzB,MAAM,CAACC,OAAO,CAACuB,OAAO;EAC/B;EAEA,OAAOzB,YAAY,CAACC,MAAM,CAAC,KAAK,IAAI;AACtC;AAEO,SAAS0B,2BAA2BA,CAAC1B,MAA0C,EAAW;EAC/F,IAAIA,MAAM,CAACC,OAAO,EAAE0B,iBAAiB,KAAKF,SAAS,EAAE;IACnD,OAAOzB,MAAM,CAACC,OAAO,CAAC0B,iBAAiB;EACzC;EAEA,OAAO,IAAI;AACb;AAEO,SAASC,mCAAmCA,CACjD5B,MAA0C,EACjC;EACT,IAAIA,MAAM,CAACC,OAAO,EAAE4B,wBAAwB,KAAKJ,SAAS,EAAE;IAC1D,OAAOzB,MAAM,CAACC,OAAO,CAAC4B,wBAAwB;EAChD;EACA,OAAO,IAAI;AACb;AAEO,SAASC,iBAAiBA,CAAC9B,MAA0C,EAAU;EACpF,OAAOA,MAAM,CAACC,OAAO,EAAE8B,sBAAsB,IAAI,CAAC;AACpD;AAEO,SAASC,uBAAuBA,CACrChC,MAA0C,EAC1CiC,yBAAyC,EACiB;EAC1D,IAAIjC,MAAM,CAACC,OAAO,EAAEiC,kBAAkB,KAAK,mBAAmB,EAAE;IAC9D;IACA,IAAID,yBAAyB,IAAIE,iBAAM,CAACC,GAAG,CAACH,yBAAyB,EAAE,QAAQ,CAAC,EAAE;MAChF,OAAO,qBAAqB;IAC9B;IACA,OAAO,OAAO;EAChB,CAAC,MAAM,IAAIjC,MAAM,CAACC,OAAO,EAAEiC,kBAAkB,KAAK,SAAS,EAAE;IAC3D,OAAO,QAAQ;EACjB,CAAC,MAAM,IAAIlC,MAAM,CAACC,OAAO,EAAEiC,kBAAkB,KAAK,WAAW,EAAE;IAC7D,OAAO,WAAW;EACpB,CAAC,MAAM,IAAIlC,MAAM,CAACC,OAAO,EAAEiC,kBAAkB,KAAK,OAAO,EAAE;IACzD,OAAO,OAAO;EAChB;EACA,OAAO,QAAQ;AACjB;AAEO,SAASG,gCAAgCA,CAC9CjD,WAAmB,EACnBY,MAA0C,EACtB;EACpB,MAAMsC,0BAA0B,GAAGtC,MAAM,CAACC,OAAO,EAAEsC,sBAAsB;EACzE,IAAI,CAACD,0BAA0B,EAAE;IAC/B,OAAOb,SAAS;EAClB;EAEA,MAAMe,SAAS,GAAGC,eAAI,CAACC,IAAI,CAACtD,WAAW,EAAEkD,0BAA0B,CAAC;EACpE,IAAI,CAAC9C,aAAE,CAACC,UAAU,CAAC+C,SAAS,CAAC,EAAE;IAC7B,MAAM,IAAI7B,KAAK,CAAC,8DAA8D6B,SAAS,EAAE,CAAC;EAC5F;EAEA,OAAOhD,aAAE,CAACK,YAAY,CAAC2C,SAAS,EAAE,MAAM,CAAC;AAC3C;AAEO,SAASG,6BAA6BA,CAC3C3C,MAA0C,EACwB;EAClE,OAAOA,MAAM,CAACC,OAAO,EAAE2C,mBAAmB;AAC5C;AAEO,SAASC,wCAAwCA,CACtD7C,MAA0C,EACtB;EACpB,MAAM8C,QAAQ,GAAGH,6BAA6B,CAAC3C,MAAM,CAAC;EACtD,IAAI,CAAC8C,QAAQ,EAAE;IACb,OAAOrB,SAAS;EAClB;EAEA,OAAO9B,IAAI,CAACoD,SAAS,CAACD,QAAQ,CAAC;AACjC;AAEO,SAASE,wBAAwBA,CACtChD,MAA0C,EACmB;EAC7D,OAAOA,MAAM,CAACC,OAAO,EAAEgD,cAAc;AACvC;AAEO,SAASC,mCAAmCA,CACjDlD,MAA0C,EACtB;EACpB,MAAM8C,QAAQ,GAAGE,wBAAwB,CAAChD,MAAM,CAAC;EACjD,IAAI,CAAC8C,QAAQ,EAAE;IACb,OAAOrB,SAAS;EAClB;EAEA,OAAO9B,IAAI,CAACoD,SAAS,CAACD,QAAQ,CAAC;AACjC;AAEO,SAASK,8BAA8BA,CAC5CnD,MAA0C,EACrB;EACrB,OAAOA,MAAM,CAACC,OAAO,EAAEmD,2BAA2B;AACpD","ignoreList":[]} \ No newline at end of file +{"version":3,"file":"Updates.js","names":["_requireUtils","data","require","_sdkRuntimeVersions","_fs","_interopRequireDefault","_getenv","_path","_semver","AndroidVersion","_interopRequireWildcard","IOSVersion","e","t","WeakMap","r","n","__esModule","o","i","f","__proto__","default","has","get","set","hasOwnProperty","call","Object","defineProperty","getOwnPropertyDescriptor","FINGERPRINT_RUNTIME_VERSION_SENTINEL","exports","getExpoUpdatesPackageVersion","projectRoot","expoUpdatesPackageJsonPath","resolveFrom","packageJson","JSON","parse","fs","readFileSync","version","getUpdateUrl","config","updates","url","getAppVersion","getNativeVersion","platform","getVersion","buildNumber","getBuildNumber","versionCode","getVersionCode","Error","getRuntimeVersionNullableAsync","getRuntimeVersionAsync","boolish","console","log","runtimeVersion","policy","resolveRuntimeVersionPolicyAsync","sdkVersion","getRuntimeVersionForSDKVersion","getSDKVersion","getUpdatesEnabled","enabled","undefined","getUpdatesUseEmbeddedUpdate","useEmbeddedUpdate","getUpdatesBsdiffPatchSupportEnabled","enableBsdiffPatchSupport","getUpdatesTimeout","fallbackToCacheTimeout","getUpdatesCheckOnLaunch","expoUpdatesPackageVersion","checkAutomatically","semver","gte","getUpdatesCodeSigningCertificate","codeSigningCertificatePath","codeSigningCertificate","finalPath","path","join","existsSync","getUpdatesCodeSigningMetadata","codeSigningMetadata","getUpdatesCodeSigningMetadataStringified","metadata","stringify","getUpdatesRequestHeaders","requestHeaders","getUpdatesRequestHeadersStringified","getDisableAntiBrickingMeasures","disableAntiBrickingMeasures"],"sources":["../../src/utils/Updates.ts"],"sourcesContent":["import type { Android, ExpoConfig, IOS } from '@expo/config-types';\nimport { resolveFrom } from '@expo/require-utils';\nimport { getRuntimeVersionForSDKVersion } from '@expo/sdk-runtime-versions';\nimport fs from 'fs';\nimport { boolish } from 'getenv';\nimport path from 'path';\nimport semver from 'semver';\n\nimport * as AndroidVersion from '../android/Version';\nimport * as IOSVersion from '../ios/Version';\n\nexport type ExpoConfigUpdates = Pick<\n ExpoConfig,\n 'sdkVersion' | 'runtimeVersion' | 'updates' | 'slug'\n>;\n\nexport const FINGERPRINT_RUNTIME_VERSION_SENTINEL = 'file:fingerprint';\n\nexport function getExpoUpdatesPackageVersion(projectRoot: string): string | null {\n const expoUpdatesPackageJsonPath = resolveFrom(projectRoot, 'expo-updates/package.json');\n if (!expoUpdatesPackageJsonPath) {\n return null;\n }\n const packageJson = JSON.parse(fs.readFileSync(expoUpdatesPackageJsonPath, 'utf8'));\n return packageJson.version;\n}\n\nexport function getUpdateUrl(config: Pick): string | null {\n return config.updates?.url ?? null;\n}\n\nexport function getAppVersion(config: Pick): string {\n return config.version ?? '1.0.0';\n}\n\nexport function getNativeVersion(\n config: Pick & {\n android?: Pick;\n ios?: Pick;\n },\n platform: 'android' | 'ios'\n): string {\n const version = IOSVersion.getVersion(config);\n switch (platform) {\n case 'ios': {\n const buildNumber = IOSVersion.getBuildNumber(config);\n return `${version}(${buildNumber})`;\n }\n case 'android': {\n const versionCode = AndroidVersion.getVersionCode(config);\n return `${version}(${versionCode})`;\n }\n default: {\n throw new Error(\n `\"${platform}\" is not a supported platform. Choose either \"ios\" or \"android\".`\n );\n }\n }\n}\n\nexport async function getRuntimeVersionNullableAsync(\n ...[projectRoot, config, platform]: Parameters\n): Promise {\n try {\n return await getRuntimeVersionAsync(projectRoot, config, platform);\n } catch (e) {\n if (boolish('EXPO_DEBUG', false)) {\n console.log(e);\n }\n return null;\n }\n}\n\nexport async function getRuntimeVersionAsync(\n projectRoot: string,\n config: Pick & {\n android?: Pick;\n ios?: Pick;\n },\n platform: 'android' | 'ios'\n): Promise {\n const runtimeVersion = config[platform]?.runtimeVersion ?? config.runtimeVersion;\n if (!runtimeVersion) {\n return null;\n }\n\n if (typeof runtimeVersion === 'string') {\n if (runtimeVersion === FINGERPRINT_RUNTIME_VERSION_SENTINEL) {\n throw new Error(\n `${FINGERPRINT_RUNTIME_VERSION_SENTINEL} is a reserved value for runtime version. To use a fingerprint runtime version, use the \"fingerprint\" runtime version policy.`\n );\n }\n return runtimeVersion;\n } else if (!runtimeVersion.policy) {\n throw new Error(\n `\"${runtimeVersion}\" is not a valid runtime version. Only a string or a runtime version policy is supported.`\n );\n } else if (runtimeVersion.policy === 'fingerprint') {\n return FINGERPRINT_RUNTIME_VERSION_SENTINEL;\n } else {\n return await resolveRuntimeVersionPolicyAsync(runtimeVersion.policy, config, platform);\n }\n}\n\nexport async function resolveRuntimeVersionPolicyAsync(\n policy: 'appVersion' | 'nativeVersion' | 'sdkVersion',\n config: Pick & {\n android?: Pick;\n ios?: Pick;\n },\n platform: 'android' | 'ios'\n): Promise {\n if (policy === 'appVersion') {\n return getAppVersion(config);\n } else if (policy === 'nativeVersion') {\n return getNativeVersion(config, platform);\n } else if (policy === 'sdkVersion') {\n if (!config.sdkVersion) {\n throw new Error(\"An SDK version must be defined when using the 'sdkVersion' runtime policy.\");\n }\n return getRuntimeVersionForSDKVersion(config.sdkVersion);\n } else {\n // fingerprint is resolvable only at build time (not in config plugin).\n throw new Error(`\"${policy}\" is not a valid runtime version policy type.`);\n }\n}\n\nexport function getSDKVersion(config: Pick): string | null {\n return typeof config.sdkVersion === 'string' ? config.sdkVersion : null;\n}\n\nexport function getUpdatesEnabled(config: Pick): boolean {\n // allow override of enabled property\n if (config.updates?.enabled !== undefined) {\n return config.updates.enabled;\n }\n\n return getUpdateUrl(config) !== null;\n}\n\nexport function getUpdatesUseEmbeddedUpdate(config: Pick): boolean {\n if (config.updates?.useEmbeddedUpdate !== undefined) {\n return config.updates.useEmbeddedUpdate;\n }\n\n return true;\n}\n\nexport function getUpdatesBsdiffPatchSupportEnabled(\n config: Pick\n): boolean {\n if (config.updates?.enableBsdiffPatchSupport !== undefined) {\n return config.updates.enableBsdiffPatchSupport;\n }\n return true;\n}\n\nexport function getUpdatesTimeout(config: Pick): number {\n return config.updates?.fallbackToCacheTimeout ?? 0;\n}\n\nexport function getUpdatesCheckOnLaunch(\n config: Pick,\n expoUpdatesPackageVersion?: string | null\n): 'NEVER' | 'ERROR_RECOVERY_ONLY' | 'ALWAYS' | 'WIFI_ONLY' {\n if (config.updates?.checkAutomatically === 'ON_ERROR_RECOVERY') {\n // native 'ERROR_RECOVERY_ONLY' option was only introduced in 0.11.x\n if (expoUpdatesPackageVersion && semver.gte(expoUpdatesPackageVersion, '0.11.0')) {\n return 'ERROR_RECOVERY_ONLY';\n }\n return 'NEVER';\n } else if (config.updates?.checkAutomatically === 'ON_LOAD') {\n return 'ALWAYS';\n } else if (config.updates?.checkAutomatically === 'WIFI_ONLY') {\n return 'WIFI_ONLY';\n } else if (config.updates?.checkAutomatically === 'NEVER') {\n return 'NEVER';\n }\n return 'ALWAYS';\n}\n\nexport function getUpdatesCodeSigningCertificate(\n projectRoot: string,\n config: Pick\n): string | undefined {\n const codeSigningCertificatePath = config.updates?.codeSigningCertificate;\n if (!codeSigningCertificatePath) {\n return undefined;\n }\n\n const finalPath = path.join(projectRoot, codeSigningCertificatePath);\n if (!fs.existsSync(finalPath)) {\n throw new Error(`File not found at \\`updates.codeSigningCertificate\\` path: ${finalPath}`);\n }\n\n return fs.readFileSync(finalPath, 'utf8');\n}\n\nexport function getUpdatesCodeSigningMetadata(\n config: Pick\n): NonNullable['codeSigningMetadata'] {\n return config.updates?.codeSigningMetadata;\n}\n\nexport function getUpdatesCodeSigningMetadataStringified(\n config: Pick\n): string | undefined {\n const metadata = getUpdatesCodeSigningMetadata(config);\n if (!metadata) {\n return undefined;\n }\n\n return JSON.stringify(metadata);\n}\n\nexport function getUpdatesRequestHeaders(\n config: Pick\n): NonNullable['requestHeaders'] {\n return config.updates?.requestHeaders;\n}\n\nexport function getUpdatesRequestHeadersStringified(\n config: Pick\n): string | undefined {\n const metadata = getUpdatesRequestHeaders(config);\n if (!metadata) {\n return undefined;\n }\n\n return JSON.stringify(metadata);\n}\n\nexport function getDisableAntiBrickingMeasures(\n config: Pick\n): boolean | undefined {\n return config.updates?.disableAntiBrickingMeasures;\n}\n"],"mappings":"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","ignoreList":[]} \ No newline at end of file diff --git a/packages/@expo/config-plugins/build/utils/modules.js b/packages/@expo/config-plugins/build/utils/modules.js index 15452ccc2d1717..bae826bb72afc2 100644 --- a/packages/@expo/config-plugins/build/utils/modules.js +++ b/packages/@expo/config-plugins/build/utils/modules.js @@ -34,7 +34,28 @@ async function directoryExistsAsync(file) { } function fileExists(file) { try { - return _fs().default.statSync(file).isFile(); + const stat = _fs().default.lstatSync(file, { + throwIfNoEntry: false + }); + if (!stat) { + return false; + } else if (stat.isFile()) { + return true; + } else if (stat.isSymbolicLink()) { + return isRealpathFileSync(file); + } else { + return false; + } + } catch { + return false; + } +} +function isRealpathFileSync(target) { + try { + const realpath = _fs().default.realpathSync(target); + return !!_fs().default.lstatSync(realpath, { + throwIfNoEntry: false + })?.isFile(); } catch { return false; } diff --git a/packages/@expo/config-plugins/build/utils/modules.js.map b/packages/@expo/config-plugins/build/utils/modules.js.map index 7f9a358e9fd513..21cb7822aa9113 100644 --- a/packages/@expo/config-plugins/build/utils/modules.js.map +++ b/packages/@expo/config-plugins/build/utils/modules.js.map @@ -1 +1 @@ -{"version":3,"file":"modules.js","names":["_fs","data","_interopRequireDefault","require","e","__esModule","default","statAsync","file","fs","promises","stat","fileExistsAsync","isFile","directoryExistsAsync","isDirectory","fileExists","statSync"],"sources":["../../src/utils/modules.ts"],"sourcesContent":["import fs from 'fs';\n\n/**\n * A non-failing version of async FS stat.\n *\n * @param file\n */\nasync function statAsync(file: string): Promise {\n try {\n return await fs.promises.stat(file);\n } catch {\n return null;\n }\n}\n\nexport async function fileExistsAsync(file: string): Promise {\n return (await statAsync(file))?.isFile() ?? false;\n}\n\nexport async function directoryExistsAsync(file: string): Promise {\n return (await statAsync(file))?.isDirectory() ?? false;\n}\n\nexport function fileExists(file: string): boolean {\n try {\n return fs.statSync(file).isFile();\n } catch {\n return false;\n }\n}\n"],"mappings":";;;;;;;;AAAA,SAAAA,IAAA;EAAA,MAAAC,IAAA,GAAAC,sBAAA,CAAAC,OAAA;EAAAH,GAAA,YAAAA,CAAA;IAAA,OAAAC,IAAA;EAAA;EAAA,OAAAA,IAAA;AAAA;AAAoB,SAAAC,uBAAAE,CAAA,WAAAA,CAAA,IAAAA,CAAA,CAAAC,UAAA,GAAAD,CAAA,KAAAE,OAAA,EAAAF,CAAA;AAEpB;AACA;AACA;AACA;AACA;AACA,eAAeG,SAASA,CAACC,IAAY,EAA4B;EAC/D,IAAI;IACF,OAAO,MAAMC,aAAE,CAACC,QAAQ,CAACC,IAAI,CAACH,IAAI,CAAC;EACrC,CAAC,CAAC,MAAM;IACN,OAAO,IAAI;EACb;AACF;AAEO,eAAeI,eAAeA,CAACJ,IAAY,EAAoB;EACpE,OAAO,CAAC,MAAMD,SAAS,CAACC,IAAI,CAAC,GAAGK,MAAM,CAAC,CAAC,IAAI,KAAK;AACnD;AAEO,eAAeC,oBAAoBA,CAACN,IAAY,EAAoB;EACzE,OAAO,CAAC,MAAMD,SAAS,CAACC,IAAI,CAAC,GAAGO,WAAW,CAAC,CAAC,IAAI,KAAK;AACxD;AAEO,SAASC,UAAUA,CAACR,IAAY,EAAW;EAChD,IAAI;IACF,OAAOC,aAAE,CAACQ,QAAQ,CAACT,IAAI,CAAC,CAACK,MAAM,CAAC,CAAC;EACnC,CAAC,CAAC,MAAM;IACN,OAAO,KAAK;EACd;AACF","ignoreList":[]} \ No newline at end of file +{"version":3,"file":"modules.js","names":["_fs","data","_interopRequireDefault","require","e","__esModule","default","statAsync","file","fs","promises","stat","fileExistsAsync","isFile","directoryExistsAsync","isDirectory","fileExists","lstatSync","throwIfNoEntry","isSymbolicLink","isRealpathFileSync","target","realpath","realpathSync"],"sources":["../../src/utils/modules.ts"],"sourcesContent":["import fs from 'fs';\n\n/**\n * A non-failing version of async FS stat.\n *\n * @param file\n */\nasync function statAsync(file: string): Promise {\n try {\n return await fs.promises.stat(file);\n } catch {\n return null;\n }\n}\n\nexport async function fileExistsAsync(file: string): Promise {\n return (await statAsync(file))?.isFile() ?? false;\n}\n\nexport async function directoryExistsAsync(file: string): Promise {\n return (await statAsync(file))?.isDirectory() ?? false;\n}\n\nexport function fileExists(file: string): boolean {\n try {\n const stat = fs.lstatSync(file, { throwIfNoEntry: false });\n if (!stat) {\n return false;\n } else if (stat.isFile()) {\n return true;\n } else if (stat.isSymbolicLink()) {\n return isRealpathFileSync(file);\n } else {\n return false;\n }\n } catch {\n return false;\n }\n}\n\nfunction isRealpathFileSync(target: string): boolean {\n try {\n const realpath = fs.realpathSync(target);\n return !!fs.lstatSync(realpath, { throwIfNoEntry: false })?.isFile();\n } catch {\n return false;\n }\n}\n"],"mappings":";;;;;;;;AAAA,SAAAA,IAAA;EAAA,MAAAC,IAAA,GAAAC,sBAAA,CAAAC,OAAA;EAAAH,GAAA,YAAAA,CAAA;IAAA,OAAAC,IAAA;EAAA;EAAA,OAAAA,IAAA;AAAA;AAAoB,SAAAC,uBAAAE,CAAA,WAAAA,CAAA,IAAAA,CAAA,CAAAC,UAAA,GAAAD,CAAA,KAAAE,OAAA,EAAAF,CAAA;AAEpB;AACA;AACA;AACA;AACA;AACA,eAAeG,SAASA,CAACC,IAAY,EAA4B;EAC/D,IAAI;IACF,OAAO,MAAMC,aAAE,CAACC,QAAQ,CAACC,IAAI,CAACH,IAAI,CAAC;EACrC,CAAC,CAAC,MAAM;IACN,OAAO,IAAI;EACb;AACF;AAEO,eAAeI,eAAeA,CAACJ,IAAY,EAAoB;EACpE,OAAO,CAAC,MAAMD,SAAS,CAACC,IAAI,CAAC,GAAGK,MAAM,CAAC,CAAC,IAAI,KAAK;AACnD;AAEO,eAAeC,oBAAoBA,CAACN,IAAY,EAAoB;EACzE,OAAO,CAAC,MAAMD,SAAS,CAACC,IAAI,CAAC,GAAGO,WAAW,CAAC,CAAC,IAAI,KAAK;AACxD;AAEO,SAASC,UAAUA,CAACR,IAAY,EAAW;EAChD,IAAI;IACF,MAAMG,IAAI,GAAGF,aAAE,CAACQ,SAAS,CAACT,IAAI,EAAE;MAAEU,cAAc,EAAE;IAAM,CAAC,CAAC;IAC1D,IAAI,CAACP,IAAI,EAAE;MACT,OAAO,KAAK;IACd,CAAC,MAAM,IAAIA,IAAI,CAACE,MAAM,CAAC,CAAC,EAAE;MACxB,OAAO,IAAI;IACb,CAAC,MAAM,IAAIF,IAAI,CAACQ,cAAc,CAAC,CAAC,EAAE;MAChC,OAAOC,kBAAkB,CAACZ,IAAI,CAAC;IACjC,CAAC,MAAM;MACL,OAAO,KAAK;IACd;EACF,CAAC,CAAC,MAAM;IACN,OAAO,KAAK;EACd;AACF;AAEA,SAASY,kBAAkBA,CAACC,MAAc,EAAW;EACnD,IAAI;IACF,MAAMC,QAAQ,GAAGb,aAAE,CAACc,YAAY,CAACF,MAAM,CAAC;IACxC,OAAO,CAAC,CAACZ,aAAE,CAACQ,SAAS,CAACK,QAAQ,EAAE;MAAEJ,cAAc,EAAE;IAAM,CAAC,CAAC,EAAEL,MAAM,CAAC,CAAC;EACtE,CAAC,CAAC,MAAM;IACN,OAAO,KAAK;EACd;AACF","ignoreList":[]} \ No newline at end of file diff --git a/packages/@expo/config-plugins/build/utils/plugin-resolver.d.ts b/packages/@expo/config-plugins/build/utils/plugin-resolver.d.ts index 3fa8682fdfe36a..6c346b14230ede 100644 --- a/packages/@expo/config-plugins/build/utils/plugin-resolver.d.ts +++ b/packages/@expo/config-plugins/build/utils/plugin-resolver.d.ts @@ -7,7 +7,7 @@ export declare const pluginFileName = "app.plugin.js"; * 1. Is the reference a relative file path or an import specifier with file path? e.g. `./file.js`, `pkg/file.js` or `@org/pkg/file.js`? * - Resolve the config plugin as-is * 2. If the reference a module? e.g. `expo-font` - * - Resolve the root `app.plugin.js` file within the module, e.g. `expo-font/app.plugin.js` + * - Resolve the root `app.plugin.{js,cjs,mjs,ts,cts,mts}` file within the module * 3. Does the module have a valid config plugin in the `main` field? * - Resolve the `main` entry point as config plugin */ diff --git a/packages/@expo/config-plugins/build/utils/plugin-resolver.js b/packages/@expo/config-plugins/build/utils/plugin-resolver.js index 9a9725f89fa7e7..9e7cd4017a8b7b 100644 --- a/packages/@expo/config-plugins/build/utils/plugin-resolver.js +++ b/packages/@expo/config-plugins/build/utils/plugin-resolver.js @@ -12,23 +12,16 @@ exports.resolveConfigPluginExport = resolveConfigPluginExport; exports.resolveConfigPluginFunction = resolveConfigPluginFunction; exports.resolveConfigPluginFunctionWithInfo = resolveConfigPluginFunctionWithInfo; exports.resolvePluginForModule = resolvePluginForModule; -function _assert() { - const data = _interopRequireDefault(require("assert")); - _assert = function () { +function _requireUtils() { + const data = require("@expo/require-utils"); + _requireUtils = function () { return data; }; return data; } -function path() { - const data = _interopRequireWildcard(require("path")); - path = function () { - return data; - }; - return data; -} -function _resolveFrom() { - const data = _interopRequireDefault(require("resolve-from")); - _resolveFrom = function () { +function _assert() { + const data = _interopRequireDefault(require("assert")); + _assert = function () { return data; }; return data; @@ -40,18 +33,13 @@ function _errors() { }; return data; } -function _modules() { - const data = require("./modules"); - _modules = function () { - return data; - }; - return data; -} -function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r = new WeakMap(), n = new WeakMap(); return (_interopRequireWildcard = function (e, t) { if (!t && e && e.__esModule) return e; var o, i, f = { __proto__: null, default: e }; if (null === e || "object" != typeof e && "function" != typeof e) return f; if (o = t ? n : r) { if (o.has(e)) return o.get(e); o.set(e, f); } for (const t in e) "default" !== t && {}.hasOwnProperty.call(e, t) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, t)) && (i.get || i.set) ? o(f, t, i) : f[t] = e[t]); return f; })(e, t); } function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; } -// Default plugin entry file name. +// Re-exported for back-compat with external consumers. const pluginFileName = exports.pluginFileName = 'app.plugin.js'; +// `.js` first keeps the published-artifact case at one stat. +const pluginExtensions = ['.js', '.cjs', '.mjs', '.ts', '.cts', '.mts']; + /** * Resolve the config plugin from a node module or package. * If the module or package does not include a config plugin, this function throws a `PluginError`. @@ -59,32 +47,35 @@ const pluginFileName = exports.pluginFileName = 'app.plugin.js'; * 1. Is the reference a relative file path or an import specifier with file path? e.g. `./file.js`, `pkg/file.js` or `@org/pkg/file.js`? * - Resolve the config plugin as-is * 2. If the reference a module? e.g. `expo-font` - * - Resolve the root `app.plugin.js` file within the module, e.g. `expo-font/app.plugin.js` + * - Resolve the root `app.plugin.{js,cjs,mjs,ts,cts,mts}` file within the module * 3. Does the module have a valid config plugin in the `main` field? * - Resolve the `main` entry point as config plugin */ function resolvePluginForModule(projectRoot, pluginReference) { if (moduleNameIsDirectFileReference(pluginReference)) { - // Only resolve `./file.js`, `package/file.js`, `@org/package/file.js` - const pluginScriptFile = _resolveFrom().default.silent(projectRoot, pluginReference); + const pluginScriptFile = (0, _requireUtils().resolveFrom)(projectRoot, pluginReference, { + extensions: pluginExtensions + }); if (pluginScriptFile) { return { - // NOTE(cedric): `path.sep` is required here, we are resolving the absolute path, not the plugin reference - isPluginFile: pluginScriptFile.endsWith(path().sep + pluginFileName), + isPluginFile: false, filePath: pluginScriptFile }; } } else if (moduleNameIsPackageReference(pluginReference)) { - // Only resolve `package -> package/app.plugin.js`, `@org/package -> @org/package/app.plugin.js` - const pluginPackageFile = _resolveFrom().default.silent(projectRoot, `${pluginReference}/${pluginFileName}`); - if (pluginPackageFile && (0, _modules().fileExists)(pluginPackageFile)) { + const pluginPackageFile = (0, _requireUtils().resolveFrom)(projectRoot, `${pluginReference}/app.plugin`, { + extensions: pluginExtensions + }); + if (pluginPackageFile) { return { isPluginFile: true, filePath: pluginPackageFile }; } - // Try to resole the `main` entry as config plugin - const packageMainEntry = _resolveFrom().default.silent(projectRoot, pluginReference); + // Skip the extension/index probes — Node's resolver (step 4) handles `main`. + const packageMainEntry = (0, _requireUtils().resolveFrom)(projectRoot, pluginReference, { + extensions: [] + }); if (packageMainEntry) { return { isPluginFile: false, @@ -144,27 +135,16 @@ function resolveConfigPluginFunctionWithInfo(projectRoot, pluginReference) { } = resolvePluginForModule(projectRoot, pluginReference); let result; try { - result = requirePluginFile(pluginFile); + result = (0, _requireUtils().loadModuleSync)(pluginFile); } catch (error) { - const learnMoreLink = 'Learn more: https://docs.expo.dev/guides/config-plugins/'; - let underlyingError; - let stack; - if (error instanceof Error) { - const errorWithCode = error; - underlyingError = `${errorWithCode.message} ${errorWithCode.code ?? ''}`; - stack = errorWithCode.stack; - } else { - underlyingError = String(error); - } - let errorMessage = `Unable to resolve a valid config plugin for ${pluginReference}.\n`; - if (!isPluginFile) { - errorMessage += `• No "${pluginFileName}" file found in ${pluginReference}: config plugins are typically exported from an "${pluginFileName}" file in the package root.\n`; + let message = error instanceof Error ? error.message : String(error); + // Don't clobber `loadModuleSync`'s code-framed error + if (!isPluginFile && !moduleNameIsDirectFileReference(pluginReference)) { + message += `\n\nNo "app.plugin.{js,cjs,mjs,ts,cts,mts}" file was found in "${pluginReference}", so the package's main entry was loaded instead. Config plugins are typically exported from an "${pluginFileName}" file in the package root.\nLearn more: https://docs.expo.dev/guides/config-plugins/`; } - errorMessage += `• main export of ${pluginReference} does not appear to be a config plugin: the following error was thrown when importing ${pluginFile}: ${underlyingError}\n`; - errorMessage += `Verify that ${pluginReference} includes a config plugin. If it does not, then remove the entry from plugins in your app config file. ${learnMoreLink}`; - const pluginError = new (_errors().PluginError)(errorMessage, 'INVALID_PLUGIN_IMPORT'); - if (stack) { - pluginError.stack = stack; + const pluginError = new (_errors().PluginError)(message, 'INVALID_PLUGIN_IMPORT'); + if (error instanceof Error && error.stack) { + pluginError.stack = error.stack; } throw pluginError; } @@ -212,12 +192,4 @@ function resolveConfigPluginExport({ } return plugin; } -function requirePluginFile(filePath) { - try { - return require(filePath); - } catch (error) { - // TODO: Improve error messages - throw error; - } -} //# sourceMappingURL=plugin-resolver.js.map \ No newline at end of file diff --git a/packages/@expo/config-plugins/build/utils/plugin-resolver.js.map b/packages/@expo/config-plugins/build/utils/plugin-resolver.js.map index 92b6d8c0dce626..1b177969cbd290 100644 --- a/packages/@expo/config-plugins/build/utils/plugin-resolver.js.map +++ b/packages/@expo/config-plugins/build/utils/plugin-resolver.js.map @@ -1 +1 @@ -{"version":3,"file":"plugin-resolver.js","names":["_assert","data","_interopRequireDefault","require","path","_interopRequireWildcard","_resolveFrom","_errors","_modules","e","t","WeakMap","r","n","__esModule","o","i","f","__proto__","default","has","get","set","hasOwnProperty","call","Object","defineProperty","getOwnPropertyDescriptor","pluginFileName","exports","resolvePluginForModule","projectRoot","pluginReference","moduleNameIsDirectFileReference","pluginScriptFile","resolveFrom","silent","isPluginFile","endsWith","sep","filePath","moduleNameIsPackageReference","pluginPackageFile","fileExists","packageMainEntry","PluginError","pathIsFilePath","name","match","slashCount","split","length","startsWith","normalizeStaticPlugin","plugin","Array","isArray","assert","undefined","assertInternalProjectRoot","resolveConfigPluginFunction","resolveConfigPluginFunctionWithInfo","pluginFile","result","requirePluginFile","error","learnMoreLink","underlyingError","stack","Error","errorWithCode","message","code","String","errorMessage","pluginError","resolveConfigPluginExport"],"sources":["../../src/utils/plugin-resolver.ts"],"sourcesContent":["import assert from 'assert';\nimport * as path from 'path';\nimport resolveFrom from 'resolve-from';\n\nimport { PluginError } from './errors';\nimport type { ConfigPlugin, StaticPlugin } from '../Plugin.types';\nimport { fileExists } from './modules';\n// Default plugin entry file name.\nexport const pluginFileName = 'app.plugin.js';\n\n/**\n * Resolve the config plugin from a node module or package.\n * If the module or package does not include a config plugin, this function throws a `PluginError`.\n * The resolution is done in following order:\n * 1. Is the reference a relative file path or an import specifier with file path? e.g. `./file.js`, `pkg/file.js` or `@org/pkg/file.js`?\n * - Resolve the config plugin as-is\n * 2. If the reference a module? e.g. `expo-font`\n * - Resolve the root `app.plugin.js` file within the module, e.g. `expo-font/app.plugin.js`\n * 3. Does the module have a valid config plugin in the `main` field?\n * - Resolve the `main` entry point as config plugin\n */\nexport function resolvePluginForModule(\n projectRoot: string,\n pluginReference: string\n): { filePath: string; isPluginFile: boolean } {\n if (moduleNameIsDirectFileReference(pluginReference)) {\n // Only resolve `./file.js`, `package/file.js`, `@org/package/file.js`\n const pluginScriptFile = resolveFrom.silent(projectRoot, pluginReference);\n if (pluginScriptFile) {\n return {\n // NOTE(cedric): `path.sep` is required here, we are resolving the absolute path, not the plugin reference\n isPluginFile: pluginScriptFile.endsWith(path.sep + pluginFileName),\n filePath: pluginScriptFile,\n };\n }\n } else if (moduleNameIsPackageReference(pluginReference)) {\n // Only resolve `package -> package/app.plugin.js`, `@org/package -> @org/package/app.plugin.js`\n const pluginPackageFile = resolveFrom.silent(\n projectRoot,\n `${pluginReference}/${pluginFileName}`\n );\n if (pluginPackageFile && fileExists(pluginPackageFile)) {\n return { isPluginFile: true, filePath: pluginPackageFile };\n }\n // Try to resole the `main` entry as config plugin\n const packageMainEntry = resolveFrom.silent(projectRoot, pluginReference);\n if (packageMainEntry) {\n return { isPluginFile: false, filePath: packageMainEntry };\n }\n }\n\n throw new PluginError(\n `Failed to resolve plugin for module \"${pluginReference}\" relative to \"${projectRoot}\". Do you have node modules installed?`,\n 'PLUGIN_NOT_FOUND'\n );\n}\n\n// TODO: Test windows\nfunction pathIsFilePath(name: string): boolean {\n // Matches lines starting with: . / ~/\n return !!name.match(/^(\\.|~\\/|\\/)/g);\n}\n\nexport function moduleNameIsDirectFileReference(name: string): boolean {\n if (pathIsFilePath(name)) {\n return true;\n }\n\n const slashCount = name.split('/')?.length;\n // Orgs (like @expo/config ) should have more than one slash to be a direct file.\n if (name.startsWith('@')) {\n return slashCount > 2;\n }\n\n // Regular packages should be considered direct reference if they have more than one slash.\n return slashCount > 1;\n}\n\nexport function moduleNameIsPackageReference(name: string): boolean {\n const slashCount = name.split('/')?.length;\n return name.startsWith('@') ? slashCount === 2 : slashCount === 1;\n}\n\nexport function normalizeStaticPlugin(plugin: StaticPlugin | ConfigPlugin | string): StaticPlugin {\n if (Array.isArray(plugin)) {\n assert(\n plugin.length > 0 && plugin.length < 3,\n `Wrong number of arguments provided for static config plugin, expected either 1 or 2, got ${plugin.length}`\n );\n return plugin;\n }\n return [plugin, undefined];\n}\n\nexport function assertInternalProjectRoot(projectRoot?: string): asserts projectRoot {\n assert(\n projectRoot,\n `Unexpected: Config \\`_internal.projectRoot\\` isn't defined by expo-cli, this is a bug.`\n );\n}\n\n// Resolve the module function and assert type\nexport function resolveConfigPluginFunction(projectRoot: string, pluginReference: string) {\n const { plugin } = resolveConfigPluginFunctionWithInfo(projectRoot, pluginReference);\n return plugin;\n}\n\n// Resolve the module function and assert type\nexport function resolveConfigPluginFunctionWithInfo(projectRoot: string, pluginReference: string) {\n const { filePath: pluginFile, isPluginFile } = resolvePluginForModule(\n projectRoot,\n pluginReference\n );\n let result: any;\n try {\n result = requirePluginFile(pluginFile);\n } catch (error) {\n const learnMoreLink = 'Learn more: https://docs.expo.dev/guides/config-plugins/';\n\n let underlyingError: string;\n let stack: string | undefined;\n\n if (error instanceof Error) {\n const errorWithCode = error as Error & { code?: string };\n underlyingError = `${errorWithCode.message} ${errorWithCode.code ?? ''}`;\n stack = errorWithCode.stack;\n } else {\n underlyingError = String(error);\n }\n\n let errorMessage = `Unable to resolve a valid config plugin for ${pluginReference}.\\n`;\n\n if (!isPluginFile) {\n errorMessage += `• No \"${pluginFileName}\" file found in ${pluginReference}: config plugins are typically exported from an \"${pluginFileName}\" file in the package root.\\n`;\n }\n\n errorMessage += `• main export of ${pluginReference} does not appear to be a config plugin: the following error was thrown when importing ${pluginFile}: ${underlyingError}\\n`;\n errorMessage += `Verify that ${pluginReference} includes a config plugin. If it does not, then remove the entry from plugins in your app config file. ${learnMoreLink}`;\n\n const pluginError = new PluginError(errorMessage, 'INVALID_PLUGIN_IMPORT');\n\n if (stack) {\n pluginError.stack = stack;\n }\n throw pluginError;\n }\n\n const plugin = resolveConfigPluginExport({\n plugin: result,\n pluginFile,\n pluginReference,\n isPluginFile,\n });\n return { plugin, pluginFile, pluginReference, isPluginFile };\n}\n\n/**\n * - Resolve the exported contents of an Expo config (be it default or module.exports)\n * - Assert no promise exports\n * - Return config type\n * - Serialize config\n *\n * @param props.plugin plugin results\n * @param props.pluginFile plugin file path\n * @param props.pluginReference the string used to reference the plugin\n * @param props.isPluginFile is file path from the app.plugin.js module root\n */\nexport function resolveConfigPluginExport({\n plugin,\n pluginFile,\n pluginReference,\n isPluginFile,\n}: {\n plugin: any;\n pluginFile: string;\n pluginReference: string;\n isPluginFile: boolean;\n}): ConfigPlugin {\n if (plugin.default != null) {\n plugin = plugin.default;\n }\n if (typeof plugin !== 'function') {\n const learnMoreLink = `Learn more: https://docs.expo.dev/guides/config-plugins/`;\n // If the plugin reference is a node module, and that node module does not export a function then it probably doesn't have a config plugin.\n if (!isPluginFile && !moduleNameIsDirectFileReference(pluginReference)) {\n throw new PluginError(\n `Package \"${pluginReference}\" does not contain a valid config plugin. Module must export a function from file: ${pluginFile}\\n${learnMoreLink}`,\n 'INVALID_PLUGIN_TYPE'\n );\n }\n throw new PluginError(\n `Plugin \"${pluginReference}\" must export a function from file: ${pluginFile}. ${learnMoreLink}`,\n 'INVALID_PLUGIN_TYPE'\n );\n }\n\n return plugin;\n}\n\nfunction requirePluginFile(filePath: string): any {\n try {\n return require(filePath);\n } catch (error) {\n // TODO: Improve error messages\n throw error;\n }\n}\n"],"mappings":"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","ignoreList":[]} \ No newline at end of file +{"version":3,"file":"plugin-resolver.js","names":["_requireUtils","data","require","_assert","_interopRequireDefault","_errors","e","__esModule","default","pluginFileName","exports","pluginExtensions","resolvePluginForModule","projectRoot","pluginReference","moduleNameIsDirectFileReference","pluginScriptFile","resolveFrom","extensions","isPluginFile","filePath","moduleNameIsPackageReference","pluginPackageFile","packageMainEntry","PluginError","pathIsFilePath","name","match","slashCount","split","length","startsWith","normalizeStaticPlugin","plugin","Array","isArray","assert","undefined","assertInternalProjectRoot","resolveConfigPluginFunction","resolveConfigPluginFunctionWithInfo","pluginFile","result","loadModuleSync","error","message","Error","String","pluginError","stack","resolveConfigPluginExport","learnMoreLink"],"sources":["../../src/utils/plugin-resolver.ts"],"sourcesContent":["import { loadModuleSync, resolveFrom } from '@expo/require-utils';\nimport assert from 'assert';\n\nimport { PluginError } from './errors';\nimport type { ConfigPlugin, StaticPlugin } from '../Plugin.types';\n\n// Re-exported for back-compat with external consumers.\nexport const pluginFileName = 'app.plugin.js';\n\n// `.js` first keeps the published-artifact case at one stat.\nconst pluginExtensions = ['.js', '.cjs', '.mjs', '.ts', '.cts', '.mts'];\n\n/**\n * Resolve the config plugin from a node module or package.\n * If the module or package does not include a config plugin, this function throws a `PluginError`.\n * The resolution is done in following order:\n * 1. Is the reference a relative file path or an import specifier with file path? e.g. `./file.js`, `pkg/file.js` or `@org/pkg/file.js`?\n * - Resolve the config plugin as-is\n * 2. If the reference a module? e.g. `expo-font`\n * - Resolve the root `app.plugin.{js,cjs,mjs,ts,cts,mts}` file within the module\n * 3. Does the module have a valid config plugin in the `main` field?\n * - Resolve the `main` entry point as config plugin\n */\nexport function resolvePluginForModule(\n projectRoot: string,\n pluginReference: string\n): { filePath: string; isPluginFile: boolean } {\n if (moduleNameIsDirectFileReference(pluginReference)) {\n const pluginScriptFile = resolveFrom(projectRoot, pluginReference, {\n extensions: pluginExtensions,\n });\n if (pluginScriptFile) {\n return { isPluginFile: false, filePath: pluginScriptFile };\n }\n } else if (moduleNameIsPackageReference(pluginReference)) {\n const pluginPackageFile = resolveFrom(projectRoot, `${pluginReference}/app.plugin`, {\n extensions: pluginExtensions,\n });\n if (pluginPackageFile) {\n return { isPluginFile: true, filePath: pluginPackageFile };\n }\n // Skip the extension/index probes — Node's resolver (step 4) handles `main`.\n const packageMainEntry = resolveFrom(projectRoot, pluginReference, { extensions: [] });\n if (packageMainEntry) {\n return { isPluginFile: false, filePath: packageMainEntry };\n }\n }\n\n throw new PluginError(\n `Failed to resolve plugin for module \"${pluginReference}\" relative to \"${projectRoot}\". Do you have node modules installed?`,\n 'PLUGIN_NOT_FOUND'\n );\n}\n\n// TODO: Test windows\nfunction pathIsFilePath(name: string): boolean {\n // Matches lines starting with: . / ~/\n return !!name.match(/^(\\.|~\\/|\\/)/g);\n}\n\nexport function moduleNameIsDirectFileReference(name: string): boolean {\n if (pathIsFilePath(name)) {\n return true;\n }\n\n const slashCount = name.split('/')?.length;\n // Orgs (like @expo/config ) should have more than one slash to be a direct file.\n if (name.startsWith('@')) {\n return slashCount > 2;\n }\n\n // Regular packages should be considered direct reference if they have more than one slash.\n return slashCount > 1;\n}\n\nexport function moduleNameIsPackageReference(name: string): boolean {\n const slashCount = name.split('/')?.length;\n return name.startsWith('@') ? slashCount === 2 : slashCount === 1;\n}\n\nexport function normalizeStaticPlugin(plugin: StaticPlugin | ConfigPlugin | string): StaticPlugin {\n if (Array.isArray(plugin)) {\n assert(\n plugin.length > 0 && plugin.length < 3,\n `Wrong number of arguments provided for static config plugin, expected either 1 or 2, got ${plugin.length}`\n );\n return plugin;\n }\n return [plugin, undefined];\n}\n\nexport function assertInternalProjectRoot(projectRoot?: string): asserts projectRoot {\n assert(\n projectRoot,\n `Unexpected: Config \\`_internal.projectRoot\\` isn't defined by expo-cli, this is a bug.`\n );\n}\n\n// Resolve the module function and assert type\nexport function resolveConfigPluginFunction(projectRoot: string, pluginReference: string) {\n const { plugin } = resolveConfigPluginFunctionWithInfo(projectRoot, pluginReference);\n return plugin;\n}\n\n// Resolve the module function and assert type\nexport function resolveConfigPluginFunctionWithInfo(projectRoot: string, pluginReference: string) {\n const { filePath: pluginFile, isPluginFile } = resolvePluginForModule(\n projectRoot,\n pluginReference\n );\n let result: any;\n try {\n result = loadModuleSync(pluginFile);\n } catch (error) {\n let message = error instanceof Error ? error.message : String(error);\n // Don't clobber `loadModuleSync`'s code-framed error\n if (!isPluginFile && !moduleNameIsDirectFileReference(pluginReference)) {\n message += `\\n\\nNo \"app.plugin.{js,cjs,mjs,ts,cts,mts}\" file was found in \"${pluginReference}\", so the package's main entry was loaded instead. Config plugins are typically exported from an \"${pluginFileName}\" file in the package root.\\nLearn more: https://docs.expo.dev/guides/config-plugins/`;\n }\n\n const pluginError = new PluginError(message, 'INVALID_PLUGIN_IMPORT');\n if (error instanceof Error && error.stack) {\n pluginError.stack = error.stack;\n }\n throw pluginError;\n }\n\n const plugin = resolveConfigPluginExport({\n plugin: result,\n pluginFile,\n pluginReference,\n isPluginFile,\n });\n return { plugin, pluginFile, pluginReference, isPluginFile };\n}\n\n/**\n * - Resolve the exported contents of an Expo config (be it default or module.exports)\n * - Assert no promise exports\n * - Return config type\n * - Serialize config\n *\n * @param props.plugin plugin results\n * @param props.pluginFile plugin file path\n * @param props.pluginReference the string used to reference the plugin\n * @param props.isPluginFile is file path from the app.plugin.js module root\n */\nexport function resolveConfigPluginExport({\n plugin,\n pluginFile,\n pluginReference,\n isPluginFile,\n}: {\n plugin: any;\n pluginFile: string;\n pluginReference: string;\n isPluginFile: boolean;\n}): ConfigPlugin {\n if (plugin.default != null) {\n plugin = plugin.default;\n }\n if (typeof plugin !== 'function') {\n const learnMoreLink = `Learn more: https://docs.expo.dev/guides/config-plugins/`;\n // If the plugin reference is a node module, and that node module does not export a function then it probably doesn't have a config plugin.\n if (!isPluginFile && !moduleNameIsDirectFileReference(pluginReference)) {\n throw new PluginError(\n `Package \"${pluginReference}\" does not contain a valid config plugin. Module must export a function from file: ${pluginFile}\\n${learnMoreLink}`,\n 'INVALID_PLUGIN_TYPE'\n );\n }\n throw new PluginError(\n `Plugin \"${pluginReference}\" must export a function from file: ${pluginFile}. ${learnMoreLink}`,\n 'INVALID_PLUGIN_TYPE'\n );\n }\n\n return plugin;\n}\n"],"mappings":"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","ignoreList":[]} \ No newline at end of file diff --git a/packages/@expo/config-plugins/package.json b/packages/@expo/config-plugins/package.json index 42ccc614b77880..0fc2f47ce6b760 100644 --- a/packages/@expo/config-plugins/package.json +++ b/packages/@expo/config-plugins/package.json @@ -57,12 +57,12 @@ "@expo/config-types": "workspace:^56.0.4", "@expo/json-file": "workspace:~10.1.0", "@expo/plist": "workspace:^0.6.0", + "@expo/require-utils": "workspace:^56.1.1", "@expo/sdk-runtime-versions": "^1.0.0", "chalk": "^4.1.2", "debug": "^4.3.5", "getenv": "^2.0.0", "glob": "^13.0.0", - "resolve-from": "^5.0.0", "semver": "^7.5.4", "slugify": "^1.6.6", "xcode": "^3.0.1", diff --git a/packages/@expo/config-plugins/src/android/__tests__/Updates-test.ts b/packages/@expo/config-plugins/src/android/__tests__/Updates-test.ts index 174fe96cbd2158..6925a4eb472130 100644 --- a/packages/@expo/config-plugins/src/android/__tests__/Updates-test.ts +++ b/packages/@expo/config-plugins/src/android/__tests__/Updates-test.ts @@ -20,16 +20,11 @@ const fixturesPath = path.resolve(__dirname, 'fixtures'); const sampleCodeSigningCertificatePath = path.resolve(fixturesPath, 'codeSigningCertificate.pem'); jest.mock('fs'); -jest.mock('resolve-from'); - -const { silent } = require('resolve-from'); const fsReal = jest.requireActual('fs') as typeof import('fs'); describe('Android Updates config', () => { beforeEach(() => { - const resolveFrom = require('resolve-from'); - resolveFrom.silent = silent; vol.reset(); }); diff --git a/packages/@expo/config-plugins/src/ios/Maps.ts b/packages/@expo/config-plugins/src/ios/Maps.ts index 4fd9d6ba919a30..6d83a65d837725 100644 --- a/packages/@expo/config-plugins/src/ios/Maps.ts +++ b/packages/@expo/config-plugins/src/ios/Maps.ts @@ -1,6 +1,6 @@ import type { ExpoConfig } from '@expo/config-types'; +import { resolveFrom } from '@expo/require-utils'; import path from 'path'; -import resolveFrom from 'resolve-from'; import type { ConfigPlugin, InfoPlist } from '../Plugin.types'; import { createInfoPlistPlugin, withAppDelegate, withPodfile } from '../plugins/ios-plugins'; @@ -111,7 +111,7 @@ export function removeMapsCocoaPods(src: string): MergeResults { } function isReactNativeMapsInstalled(projectRoot: string): string | null { - const resolved = resolveFrom.silent(projectRoot, 'react-native-maps/package.json'); + const resolved = resolveFrom(projectRoot, 'react-native-maps/package.json'); return resolved ? path.dirname(resolved) : null; } diff --git a/packages/@expo/config-plugins/src/ios/__tests__/Updates-test.ts b/packages/@expo/config-plugins/src/ios/__tests__/Updates-test.ts index c3c38ac75b27ce..4cbc56fb99a020 100644 --- a/packages/@expo/config-plugins/src/ios/__tests__/Updates-test.ts +++ b/packages/@expo/config-plugins/src/ios/__tests__/Updates-test.ts @@ -6,17 +6,12 @@ import * as Updates from '../Updates'; const fsReal = jest.requireActual('fs') as typeof fs; jest.mock('fs'); -jest.mock('resolve-from'); - -const { silent } = require('resolve-from'); const fixturesPath = path.resolve(__dirname, 'fixtures'); const sampleCodeSigningCertificatePath = path.resolve(fixturesPath, 'codeSigningCertificate.pem'); describe('iOS Updates config', () => { beforeEach(() => { - const resolveFrom = require('resolve-from'); - resolveFrom.silent = silent; vol.reset(); }); diff --git a/packages/@expo/config-plugins/src/plugins/__tests__/withStaticPlugin-test.ts b/packages/@expo/config-plugins/src/plugins/__tests__/withStaticPlugin-test.ts index 28354b37296537..f023e39e5725f7 100644 --- a/packages/@expo/config-plugins/src/plugins/__tests__/withStaticPlugin-test.ts +++ b/packages/@expo/config-plugins/src/plugins/__tests__/withStaticPlugin-test.ts @@ -15,8 +15,6 @@ function withInternalRemoved(config: ExpoConfig) { return config; } -jest.unmock('resolve-from'); - const projectRoot = join(__dirname, 'fixtures/project-files'); // Not using in-memory fs because the node resolution isn't mocked out. diff --git a/packages/@expo/config-plugins/src/utils/Updates.ts b/packages/@expo/config-plugins/src/utils/Updates.ts index 0a83256633421c..f06e282c73f0cd 100644 --- a/packages/@expo/config-plugins/src/utils/Updates.ts +++ b/packages/@expo/config-plugins/src/utils/Updates.ts @@ -1,9 +1,9 @@ import type { Android, ExpoConfig, IOS } from '@expo/config-types'; +import { resolveFrom } from '@expo/require-utils'; import { getRuntimeVersionForSDKVersion } from '@expo/sdk-runtime-versions'; import fs from 'fs'; import { boolish } from 'getenv'; import path from 'path'; -import resolveFrom from 'resolve-from'; import semver from 'semver'; import * as AndroidVersion from '../android/Version'; @@ -17,8 +17,8 @@ export type ExpoConfigUpdates = Pick< export const FINGERPRINT_RUNTIME_VERSION_SENTINEL = 'file:fingerprint'; export function getExpoUpdatesPackageVersion(projectRoot: string): string | null { - const expoUpdatesPackageJsonPath = resolveFrom.silent(projectRoot, 'expo-updates/package.json'); - if (!expoUpdatesPackageJsonPath || !fs.existsSync(expoUpdatesPackageJsonPath)) { + const expoUpdatesPackageJsonPath = resolveFrom(projectRoot, 'expo-updates/package.json'); + if (!expoUpdatesPackageJsonPath) { return null; } const packageJson = JSON.parse(fs.readFileSync(expoUpdatesPackageJsonPath, 'utf8')); diff --git a/packages/@expo/config-plugins/src/utils/__tests__/Updates-test.ts b/packages/@expo/config-plugins/src/utils/__tests__/Updates-test.ts index 3189ace81a2e9e..e21d6dbb4329a3 100644 --- a/packages/@expo/config-plugins/src/utils/__tests__/Updates-test.ts +++ b/packages/@expo/config-plugins/src/utils/__tests__/Updates-test.ts @@ -21,9 +21,6 @@ import { const fsReal = jest.requireActual('fs') as typeof fs; jest.mock('fs'); -jest.mock('resolve-from'); - -const { silent } = require('resolve-from'); const fixturesPath = path.resolve(__dirname, 'fixtures'); const sampleCodeSigningCertificatePath = path.resolve(fixturesPath, 'codeSigningCertificate.pem'); @@ -32,8 +29,6 @@ console.warn = jest.fn(); describe('shared config getters', () => { beforeEach(() => { - const resolveFrom = require('resolve-from'); - resolveFrom.silent = silent; vol.reset(); }); diff --git a/packages/@expo/config-plugins/src/utils/__tests__/fixtures/.gitignore b/packages/@expo/config-plugins/src/utils/__tests__/fixtures/.gitignore index f41138f151a180..ef20ea7f2aa3d5 100644 --- a/packages/@expo/config-plugins/src/utils/__tests__/fixtures/.gitignore +++ b/packages/@expo/config-plugins/src/utils/__tests__/fixtures/.gitignore @@ -1,2 +1,2 @@ -# the fixtures are placed inside node_modules so that `resolve-from` finds them +# the fixtures are placed inside node_modules so that module resolution finds them !node_modules diff --git a/packages/@expo/config-plugins/src/utils/__tests__/fixtures/localTsPlugin.ts b/packages/@expo/config-plugins/src/utils/__tests__/fixtures/localTsPlugin.ts new file mode 100644 index 00000000000000..c4321f1bc09ba7 --- /dev/null +++ b/packages/@expo/config-plugins/src/utils/__tests__/fixtures/localTsPlugin.ts @@ -0,0 +1,2 @@ +const testPlugin = (config: unknown): unknown => config; +export default testPlugin; diff --git a/packages/@expo/config-plugins/src/utils/__tests__/fixtures/node_modules/test-lib-esm/app.plugin.mjs b/packages/@expo/config-plugins/src/utils/__tests__/fixtures/node_modules/test-lib-esm/app.plugin.mjs new file mode 100644 index 00000000000000..4cf155a9cea6ce --- /dev/null +++ b/packages/@expo/config-plugins/src/utils/__tests__/fixtures/node_modules/test-lib-esm/app.plugin.mjs @@ -0,0 +1,2 @@ +const testPlugin = (config) => config; +export default testPlugin; diff --git a/packages/@expo/config-plugins/src/utils/__tests__/fixtures/node_modules/test-lib-esm/package.json b/packages/@expo/config-plugins/src/utils/__tests__/fixtures/node_modules/test-lib-esm/package.json new file mode 100644 index 00000000000000..40d30f0fc64e15 --- /dev/null +++ b/packages/@expo/config-plugins/src/utils/__tests__/fixtures/node_modules/test-lib-esm/package.json @@ -0,0 +1,5 @@ +{ + "name": "test-lib-esm", + "version": "1.0.0", + "description": "fixture for tests" +} diff --git a/packages/@expo/config-plugins/src/utils/__tests__/fixtures/node_modules/test-lib-ts/app.plugin.ts b/packages/@expo/config-plugins/src/utils/__tests__/fixtures/node_modules/test-lib-ts/app.plugin.ts new file mode 100644 index 00000000000000..c4321f1bc09ba7 --- /dev/null +++ b/packages/@expo/config-plugins/src/utils/__tests__/fixtures/node_modules/test-lib-ts/app.plugin.ts @@ -0,0 +1,2 @@ +const testPlugin = (config: unknown): unknown => config; +export default testPlugin; diff --git a/packages/@expo/config-plugins/src/utils/__tests__/fixtures/node_modules/test-lib-ts/package.json b/packages/@expo/config-plugins/src/utils/__tests__/fixtures/node_modules/test-lib-ts/package.json new file mode 100644 index 00000000000000..f8d431ca950b93 --- /dev/null +++ b/packages/@expo/config-plugins/src/utils/__tests__/fixtures/node_modules/test-lib-ts/package.json @@ -0,0 +1,5 @@ +{ + "name": "test-lib-ts", + "version": "1.0.0", + "description": "fixture for tests" +} diff --git a/packages/@expo/config-plugins/src/utils/__tests__/plugin-resolver-test.ts b/packages/@expo/config-plugins/src/utils/__tests__/plugin-resolver-test.ts index b2753f682314d1..76cd30cf21a8dd 100644 --- a/packages/@expo/config-plugins/src/utils/__tests__/plugin-resolver-test.ts +++ b/packages/@expo/config-plugins/src/utils/__tests__/plugin-resolver-test.ts @@ -3,9 +3,9 @@ import * as path from 'path'; import { moduleNameIsDirectFileReference, moduleNameIsPackageReference, + resolveConfigPluginFunction, resolvePluginForModule, } from '../plugin-resolver'; -jest.unmock('resolve-from'); describe('plugin resolver', () => { describe(moduleNameIsDirectFileReference, () => { @@ -67,6 +67,13 @@ describe('plugin resolver', () => { }); }); + it('./localTsPlugin module path resolves the TypeScript file', () => { + expect(resolvePluginForModule(projectRoot, './localTsPlugin')).toStrictEqual({ + filePath: `${projectRoot}/localTsPlugin.ts`, + isPluginFile: false, + }); + }); + it('./node_modules/test-plugin/lib/commonjs/index.js direct file path', () => { expect( resolvePluginForModule(projectRoot, './node_modules/test-plugin/lib/commonjs/index.js') @@ -83,6 +90,20 @@ describe('plugin resolver', () => { }); }); + it('test-lib-ts library name with TypeScript plugin entry', () => { + expect(resolvePluginForModule(projectRoot, 'test-lib-ts')).toStrictEqual({ + filePath: `${projectRoot}/node_modules/test-lib-ts/app.plugin.ts`, + isPluginFile: true, + }); + }); + + it('test-lib-esm library name with ESM plugin entry', () => { + expect(resolvePluginForModule(projectRoot, 'test-lib-esm')).toStrictEqual({ + filePath: `${projectRoot}/node_modules/test-lib-esm/app.plugin.mjs`, + isPluginFile: true, + }); + }); + it('test library which does not have app.plugin.js file but has main entry', () => { expect(resolvePluginForModule(projectRoot, 'test-plugin')).toStrictEqual({ filePath: `${projectRoot}/node_modules/test-plugin/lib/commonjs/index.js`, @@ -93,7 +114,7 @@ describe('plugin resolver', () => { it('test-lib library name with file path', () => { expect(resolvePluginForModule(projectRoot, 'test-lib/app.plugin.js')).toStrictEqual({ filePath: `${projectRoot}/node_modules/test-lib/app.plugin.js`, - isPluginFile: true, + isPluginFile: false, }); expect(resolvePluginForModule(projectRoot, 'test-lib/not.app.plugin.js')).toStrictEqual({ filePath: `${projectRoot}/node_modules/test-lib/not.app.plugin.js`, @@ -102,4 +123,15 @@ describe('plugin resolver', () => { }); }); }); + + describe(resolveConfigPluginFunction, () => { + const projectRoot = path.resolve(__dirname, 'fixtures'); + + it('loads and transpiles a TypeScript plugin entry', () => { + const plugin = resolveConfigPluginFunction(projectRoot, 'test-lib-ts'); + expect(typeof plugin).toBe('function'); + const input = { name: 'app' }; + expect(plugin(input)).toBe(input); + }); + }); }); diff --git a/packages/@expo/config-plugins/src/utils/modules.ts b/packages/@expo/config-plugins/src/utils/modules.ts index 8e27c5810097c3..673f34054a492b 100644 --- a/packages/@expo/config-plugins/src/utils/modules.ts +++ b/packages/@expo/config-plugins/src/utils/modules.ts @@ -23,7 +23,25 @@ export async function directoryExistsAsync(file: string): Promise { export function fileExists(file: string): boolean { try { - return fs.statSync(file).isFile(); + const stat = fs.lstatSync(file, { throwIfNoEntry: false }); + if (!stat) { + return false; + } else if (stat.isFile()) { + return true; + } else if (stat.isSymbolicLink()) { + return isRealpathFileSync(file); + } else { + return false; + } + } catch { + return false; + } +} + +function isRealpathFileSync(target: string): boolean { + try { + const realpath = fs.realpathSync(target); + return !!fs.lstatSync(realpath, { throwIfNoEntry: false })?.isFile(); } catch { return false; } diff --git a/packages/@expo/config-plugins/src/utils/plugin-resolver.ts b/packages/@expo/config-plugins/src/utils/plugin-resolver.ts index f879f2a5e61490..f41530f7059d1e 100644 --- a/packages/@expo/config-plugins/src/utils/plugin-resolver.ts +++ b/packages/@expo/config-plugins/src/utils/plugin-resolver.ts @@ -1,13 +1,15 @@ +import { loadModuleSync, resolveFrom } from '@expo/require-utils'; import assert from 'assert'; -import * as path from 'path'; -import resolveFrom from 'resolve-from'; import { PluginError } from './errors'; import type { ConfigPlugin, StaticPlugin } from '../Plugin.types'; -import { fileExists } from './modules'; -// Default plugin entry file name. + +// Re-exported for back-compat with external consumers. export const pluginFileName = 'app.plugin.js'; +// `.js` first keeps the published-artifact case at one stat. +const pluginExtensions = ['.js', '.cjs', '.mjs', '.ts', '.cts', '.mts']; + /** * Resolve the config plugin from a node module or package. * If the module or package does not include a config plugin, this function throws a `PluginError`. @@ -15,7 +17,7 @@ export const pluginFileName = 'app.plugin.js'; * 1. Is the reference a relative file path or an import specifier with file path? e.g. `./file.js`, `pkg/file.js` or `@org/pkg/file.js`? * - Resolve the config plugin as-is * 2. If the reference a module? e.g. `expo-font` - * - Resolve the root `app.plugin.js` file within the module, e.g. `expo-font/app.plugin.js` + * - Resolve the root `app.plugin.{js,cjs,mjs,ts,cts,mts}` file within the module * 3. Does the module have a valid config plugin in the `main` field? * - Resolve the `main` entry point as config plugin */ @@ -24,26 +26,21 @@ export function resolvePluginForModule( pluginReference: string ): { filePath: string; isPluginFile: boolean } { if (moduleNameIsDirectFileReference(pluginReference)) { - // Only resolve `./file.js`, `package/file.js`, `@org/package/file.js` - const pluginScriptFile = resolveFrom.silent(projectRoot, pluginReference); + const pluginScriptFile = resolveFrom(projectRoot, pluginReference, { + extensions: pluginExtensions, + }); if (pluginScriptFile) { - return { - // NOTE(cedric): `path.sep` is required here, we are resolving the absolute path, not the plugin reference - isPluginFile: pluginScriptFile.endsWith(path.sep + pluginFileName), - filePath: pluginScriptFile, - }; + return { isPluginFile: false, filePath: pluginScriptFile }; } } else if (moduleNameIsPackageReference(pluginReference)) { - // Only resolve `package -> package/app.plugin.js`, `@org/package -> @org/package/app.plugin.js` - const pluginPackageFile = resolveFrom.silent( - projectRoot, - `${pluginReference}/${pluginFileName}` - ); - if (pluginPackageFile && fileExists(pluginPackageFile)) { + const pluginPackageFile = resolveFrom(projectRoot, `${pluginReference}/app.plugin`, { + extensions: pluginExtensions, + }); + if (pluginPackageFile) { return { isPluginFile: true, filePath: pluginPackageFile }; } - // Try to resole the `main` entry as config plugin - const packageMainEntry = resolveFrom.silent(projectRoot, pluginReference); + // Skip the extension/index probes — Node's resolver (step 4) handles `main`. + const packageMainEntry = resolveFrom(projectRoot, pluginReference, { extensions: [] }); if (packageMainEntry) { return { isPluginFile: false, filePath: packageMainEntry }; } @@ -113,34 +110,17 @@ export function resolveConfigPluginFunctionWithInfo(projectRoot: string, pluginR ); let result: any; try { - result = requirePluginFile(pluginFile); + result = loadModuleSync(pluginFile); } catch (error) { - const learnMoreLink = 'Learn more: https://docs.expo.dev/guides/config-plugins/'; - - let underlyingError: string; - let stack: string | undefined; - - if (error instanceof Error) { - const errorWithCode = error as Error & { code?: string }; - underlyingError = `${errorWithCode.message} ${errorWithCode.code ?? ''}`; - stack = errorWithCode.stack; - } else { - underlyingError = String(error); - } - - let errorMessage = `Unable to resolve a valid config plugin for ${pluginReference}.\n`; - - if (!isPluginFile) { - errorMessage += `• No "${pluginFileName}" file found in ${pluginReference}: config plugins are typically exported from an "${pluginFileName}" file in the package root.\n`; + let message = error instanceof Error ? error.message : String(error); + // Don't clobber `loadModuleSync`'s code-framed error + if (!isPluginFile && !moduleNameIsDirectFileReference(pluginReference)) { + message += `\n\nNo "app.plugin.{js,cjs,mjs,ts,cts,mts}" file was found in "${pluginReference}", so the package's main entry was loaded instead. Config plugins are typically exported from an "${pluginFileName}" file in the package root.\nLearn more: https://docs.expo.dev/guides/config-plugins/`; } - errorMessage += `• main export of ${pluginReference} does not appear to be a config plugin: the following error was thrown when importing ${pluginFile}: ${underlyingError}\n`; - errorMessage += `Verify that ${pluginReference} includes a config plugin. If it does not, then remove the entry from plugins in your app config file. ${learnMoreLink}`; - - const pluginError = new PluginError(errorMessage, 'INVALID_PLUGIN_IMPORT'); - - if (stack) { - pluginError.stack = stack; + const pluginError = new PluginError(message, 'INVALID_PLUGIN_IMPORT'); + if (error instanceof Error && error.stack) { + pluginError.stack = error.stack; } throw pluginError; } @@ -196,12 +176,3 @@ export function resolveConfigPluginExport({ return plugin; } - -function requirePluginFile(filePath: string): any { - try { - return require(filePath); - } catch (error) { - // TODO: Improve error messages - throw error; - } -} diff --git a/packages/@expo/config/CHANGELOG.md b/packages/@expo/config/CHANGELOG.md index 8135da45a398e9..f94dc0cf26e301 100644 --- a/packages/@expo/config/CHANGELOG.md +++ b/packages/@expo/config/CHANGELOG.md @@ -10,6 +10,8 @@ ### 💡 Others +- [Internal] Switch app config resolution to `@expo/require-utils` ([#45989](https://github.com/expo/expo/pull/45989) by [@kitten](https://github.com/kitten)) + ## 56.0.7 — 2026-05-19 _This version does not introduce any user-facing changes._ diff --git a/packages/@expo/config/build/Config.js b/packages/@expo/config/build/Config.js index fafc485a89a94c..97f7e2dfd02cde 100644 --- a/packages/@expo/config/build/Config.js +++ b/packages/@expo/config/build/Config.js @@ -44,13 +44,6 @@ function _deepmerge() { }; return data; } -function _fs() { - const data = _interopRequireDefault(require("fs")); - _fs = function () { - return data; - }; - return data; -} function _glob() { const data = require("glob"); _glob = function () { @@ -314,29 +307,12 @@ function getConfigFilePaths(projectRoot) { } const DYNAMIC_CONFIG_EXTS = ['.ts', '.mts', '.cts', '.mjs', '.cjs', '.js']; function getDynamicConfigFilePath(projectRoot) { - const fileNames = DYNAMIC_CONFIG_EXTS.map(ext => `app.config${ext}`); - for (const fileName of fileNames) { - const configPath = _path().default.join(projectRoot, fileName); - try { - const stat = _fs().default.statSync(configPath); - if (stat.isFile()) { - return configPath; - } - } catch {} - } - return null; + return (0, _requireUtils().resolveFrom)(projectRoot, './app.config', { + extensions: DYNAMIC_CONFIG_EXTS + }); } function getStaticConfigFilePath(projectRoot) { - for (const fileName of ['app.config.json', 'app.json']) { - const configPath = _path().default.join(projectRoot, fileName); - try { - const stat = _fs().default.statSync(configPath); - if (stat.isFile()) { - return configPath; - } - } catch {} - } - return null; + return (0, _requireUtils().resolveFrom)(projectRoot, './app.config.json') ?? (0, _requireUtils().resolveFrom)(projectRoot, './app.json'); } /** diff --git a/packages/@expo/config/build/Config.js.map b/packages/@expo/config/build/Config.js.map index fe83ad99053264..83345129e6511b 100644 --- a/packages/@expo/config/build/Config.js.map +++ b/packages/@expo/config/build/Config.js.map @@ -1 +1 @@ -{"version":3,"file":"Config.js","names":["_jsonFile","data","_interopRequireDefault","require","_requireUtils","_deepmerge","_fs","_glob","_path","_semver","_slugify","_getConfig","_getExpoSDKVersion","_withConfigPlugins","_withInternal","_resolvePackageJson","_Config","Object","keys","forEach","key","prototype","hasOwnProperty","call","_exportNames","exports","defineProperty","enumerable","get","e","__esModule","default","hasWarnedAboutRootConfig","reduceExpoObject","config","expo","filter","length","ansiYellow","str","ansiGray","ansiBold","plural","console","warn","map","join","mods","getSupportedPlatforms","projectRoot","platforms","resolveFrom","push","getConfig","options","paths","getConfigFilePaths","rawStaticConfig","staticConfigPath","getStaticConfig","rootConfig","staticConfig","packageJson","packageJsonPath","getPackageJsonAndPath","fillAndReturnConfig","dynamicConfigObjectType","mayHaveUnusedStaticConfig","configWithDefaultValues","ensureConfigHasDefaultValues","exp","pkg","skipSDKVersionRequirement","dynamicConfigPath","hasUnusedStaticConfig","isModdedConfig","withConfigPlugins","skipPlugins","isPublicConfig","_internal","hooks","ios","android","updates","codeSigningCertificate","codeSigningMetadata","getContextConfig","exportedObjectType","rawDynamicConfig","getDynamicConfig","dynamicConfig","getPackageJson","getRootPackageJsonPath","JsonFile","read","getDynamicConfigFilePath","getStaticConfigFilePath","DYNAMIC_CONFIG_EXTS","fileNames","ext","fileName","configPath","path","stat","fs","statSync","isFile","modifyConfigAsync","modifications","readOptions","writeOptions","isDryRun","dryRun","outputConfig","mergeConfigModifications","writeAsync","json5","type","message","relative","newConfig","newConfighasModifications","isMatchingObject","plugins","modifiedExpoConfig","deepMerge","existingPlugins","fromEntries","definition","undefined","plugin","pluginName","pluginProps","Array","isArray","existingPlugin","existingPluginName","finalizedConfig","expectedValues","actualValues","withInternal","pkgName","name","basename","pkgVersion","version","pkgWithDefaults","slug","slugify","toLowerCase","description","expWithDefaults","sdkVersion","getExpoSDKVersion","error","DEFAULT_BUILD_PATH","getWebOutputPath","process","env","WEBPACK_BUILD_OUTPUT_PATH","web","build","output","getNameFromConfig","appManifest","appName","displayName","webName","getDefaultTarget","semver","lt","isBareWorkflowProject","dependencies","expokit","xcodeprojFiles","globSync","absolute","cwd","gradleFiles","getProjectConfigDescription","getProjectConfigDescriptionWithPaths","projectConfig","relativeDynamicConfigPath"],"sources":["../src/Config.ts"],"sourcesContent":["import type { ModConfig } from '@expo/config-plugins';\nimport type { JSONObject } from '@expo/json-file';\nimport JsonFile from '@expo/json-file';\nimport { resolveFrom } from '@expo/require-utils';\nimport deepMerge from 'deepmerge';\nimport fs from 'fs';\nimport { sync as globSync } from 'glob';\nimport path from 'path';\nimport semver from 'semver';\nimport slugify from 'slugify';\n\nimport type {\n AppJSONConfig,\n ConfigFilePaths,\n ExpoConfig,\n GetConfigOptions,\n PackageJSONConfig,\n Platform,\n ProjectConfig,\n ProjectTarget,\n WriteConfigOptions,\n} from './Config.types';\nimport { getDynamicConfig, getStaticConfig } from './getConfig';\nimport { getExpoSDKVersion } from './getExpoSDKVersion';\nimport { withConfigPlugins } from './plugins/withConfigPlugins';\nimport { withInternal } from './plugins/withInternal';\nimport { getRootPackageJsonPath } from './resolvePackageJson';\n\ntype SplitConfigs = { expo?: ExpoConfig; mods?: ModConfig };\n\nlet hasWarnedAboutRootConfig = false;\n\n/**\n * If a config has an `expo` object then that will be used as the config.\n * This method reduces out other top level values if an `expo` object exists.\n *\n * @param config Input config object to reduce\n */\nfunction reduceExpoObject(config?: any): SplitConfigs | null {\n if (!config) return config || null;\n\n if (config.expo && !hasWarnedAboutRootConfig) {\n const keys = Object.keys(config).filter((key) => key !== 'expo');\n if (keys.length) {\n hasWarnedAboutRootConfig = true;\n const ansiYellow = (str: string) => `\\u001B[33m${str}\\u001B[0m`;\n const ansiGray = (str: string) => `\\u001B[90m${str}\\u001B[0m`;\n const ansiBold = (str: string) => `\\u001B[1m${str}\\u001B[22m`;\n const plural = keys.length > 1;\n console.warn(\n ansiYellow(\n ansiBold('Warning: ') +\n `Root-level ${ansiBold(`\"expo\"`)} object found. Ignoring extra key${plural ? 's' : ''} in Expo config: ${keys\n .map((key) => `\"${key}\"`)\n .join(', ')}\\n` +\n ansiGray(`Learn more: https://expo.fyi/root-expo-object`)\n )\n );\n }\n }\n\n const { mods, ...expo } = config.expo ?? config;\n\n return {\n expo,\n mods,\n };\n}\n\n/**\n * Get all platforms that a project is currently capable of running.\n *\n * @param projectRoot\n * @param exp\n */\nfunction getSupportedPlatforms(projectRoot: string): Platform[] {\n const platforms: Platform[] = [];\n if (resolveFrom(projectRoot, 'react-native/package.json')) {\n platforms.push('ios', 'android');\n }\n if (resolveFrom(projectRoot, 'react-dom/package.json')) {\n platforms.push('web');\n }\n return platforms;\n}\n\n/**\n * Evaluate the config for an Expo project.\n * If a function is exported from the `app.config.js` then a partial config will be passed as an argument.\n * The partial config is composed from any existing app.json, and certain fields from the `package.json` like name and description.\n *\n * If options.isPublicConfig is true, the Expo config will include only public-facing options (omitting private keys).\n * The resulting config should be suitable for hosting or embedding in a publicly readable location.\n *\n * **Example**\n * ```js\n * module.exports = function({ config }) {\n * // mutate the config before returning it.\n * config.slug = 'new slug'\n * return { expo: config };\n * }\n * ```\n *\n * **Supports**\n * - `app.config.ts`\n * - `app.config.js`\n * - `app.config.json`\n * - `app.json`\n *\n * @param projectRoot the root folder containing all of your application code\n * @param options enforce criteria for a project config\n */\nexport function getConfig(projectRoot: string, options: GetConfigOptions = {}): ProjectConfig {\n const paths = getConfigFilePaths(projectRoot);\n\n const rawStaticConfig = paths.staticConfigPath ? getStaticConfig(paths.staticConfigPath) : null;\n // For legacy reasons, always return an object.\n const rootConfig = (rawStaticConfig || {}) as AppJSONConfig;\n const staticConfig = reduceExpoObject(rawStaticConfig) || {};\n\n // Can only change the package.json location if an app.json or app.config.json exists\n const [packageJson, packageJsonPath] = getPackageJsonAndPath(projectRoot);\n\n function fillAndReturnConfig(\n config: SplitConfigs,\n dynamicConfigObjectType: string | null,\n mayHaveUnusedStaticConfig: boolean = false\n ) {\n const configWithDefaultValues = {\n ...ensureConfigHasDefaultValues({\n projectRoot,\n exp: config.expo || {},\n pkg: packageJson,\n skipSDKVersionRequirement: options.skipSDKVersionRequirement,\n paths,\n packageJsonPath,\n }),\n mods: config.mods,\n dynamicConfigObjectType,\n rootConfig,\n dynamicConfigPath: paths.dynamicConfigPath,\n staticConfigPath: paths.staticConfigPath,\n hasUnusedStaticConfig:\n !!paths.staticConfigPath && !!paths.dynamicConfigPath && mayHaveUnusedStaticConfig,\n };\n\n if (options.isModdedConfig) {\n // @ts-ignore: Add the mods back to the object.\n configWithDefaultValues.exp.mods = config.mods ?? null;\n }\n\n // Apply static json plugins, should be done after _internal\n configWithDefaultValues.exp = withConfigPlugins(\n configWithDefaultValues.exp,\n !!options.skipPlugins\n );\n\n if (!options.isModdedConfig) {\n // @ts-ignore: Delete mods added by static plugins when they won't have a chance to be evaluated\n delete configWithDefaultValues.exp.mods;\n }\n\n if (options.isPublicConfig) {\n // TODD(EvanBacon): Drop plugins array after it's been resolved.\n\n // Remove internal values with references to user's file paths from the public config.\n delete configWithDefaultValues.exp._internal;\n\n // hooks no longer exists in the typescript type but should still be removed\n if ('hooks' in configWithDefaultValues.exp) {\n delete configWithDefaultValues.exp.hooks;\n }\n if (configWithDefaultValues.exp.ios?.config) {\n delete configWithDefaultValues.exp.ios.config;\n }\n if (configWithDefaultValues.exp.android?.config) {\n delete configWithDefaultValues.exp.android.config;\n }\n\n delete configWithDefaultValues.exp.updates?.codeSigningCertificate;\n delete configWithDefaultValues.exp.updates?.codeSigningMetadata;\n }\n\n return configWithDefaultValues;\n }\n\n // Fill in the static config\n function getContextConfig(config: SplitConfigs) {\n return ensureConfigHasDefaultValues({\n projectRoot,\n exp: config.expo || {},\n pkg: packageJson,\n skipSDKVersionRequirement: true,\n paths,\n packageJsonPath,\n }).exp;\n }\n\n if (paths.dynamicConfigPath) {\n // No app.config.json or app.json but app.config.js\n const {\n exportedObjectType,\n config: rawDynamicConfig,\n mayHaveUnusedStaticConfig,\n } = getDynamicConfig(paths.dynamicConfigPath, {\n projectRoot,\n staticConfigPath: paths.staticConfigPath,\n packageJsonPath,\n config: getContextConfig(staticConfig),\n });\n // Allow for the app.config.js to `export default null;`\n // Use `dynamicConfigPath` to detect if a dynamic config exists.\n const dynamicConfig = reduceExpoObject(rawDynamicConfig) || {};\n return fillAndReturnConfig(dynamicConfig, exportedObjectType, mayHaveUnusedStaticConfig);\n }\n\n // No app.config.js but json or no config\n return fillAndReturnConfig(staticConfig || {}, null);\n}\n\nexport function getPackageJson(projectRoot: string): PackageJSONConfig {\n const [pkg] = getPackageJsonAndPath(projectRoot);\n return pkg;\n}\n\nfunction getPackageJsonAndPath(projectRoot: string): [PackageJSONConfig, string] {\n const packageJsonPath = getRootPackageJsonPath(projectRoot);\n return [JsonFile.read(packageJsonPath), packageJsonPath];\n}\n\n/**\n * Get the static and dynamic config paths for a project. Also accounts for custom paths.\n *\n * @param projectRoot\n */\nexport function getConfigFilePaths(projectRoot: string): ConfigFilePaths {\n return {\n dynamicConfigPath: getDynamicConfigFilePath(projectRoot),\n staticConfigPath: getStaticConfigFilePath(projectRoot),\n };\n}\n\nconst DYNAMIC_CONFIG_EXTS = ['.ts', '.mts', '.cts', '.mjs', '.cjs', '.js'];\n\nfunction getDynamicConfigFilePath(projectRoot: string): string | null {\n const fileNames = DYNAMIC_CONFIG_EXTS.map((ext) => `app.config${ext}`);\n for (const fileName of fileNames) {\n const configPath = path.join(projectRoot, fileName);\n try {\n const stat = fs.statSync(configPath);\n if (stat.isFile()) {\n return configPath;\n }\n } catch {}\n }\n return null;\n}\n\nfunction getStaticConfigFilePath(projectRoot: string): string | null {\n for (const fileName of ['app.config.json', 'app.json']) {\n const configPath = path.join(projectRoot, fileName);\n try {\n const stat = fs.statSync(configPath);\n if (stat.isFile()) {\n return configPath;\n }\n } catch {}\n }\n return null;\n}\n\n/**\n * Attempt to modify an Expo project config.\n * This will only fully work if the project is using static configs only.\n * Otherwise 'warn' | 'fail' will return with a message about why the config couldn't be updated.\n * The potentially modified config object will be returned for testing purposes.\n *\n * @param projectRoot\n * @param modifications modifications to make to an existing config\n * @param readOptions options for reading the current config file\n * @param writeOptions If true, the static config file will not be rewritten\n */\nexport async function modifyConfigAsync(\n projectRoot: string,\n modifications: Partial,\n readOptions: GetConfigOptions = {},\n writeOptions: WriteConfigOptions = {}\n): Promise<{\n type: 'success' | 'warn' | 'fail';\n message?: string;\n config: ExpoConfig | null;\n}> {\n const config = getConfig(projectRoot, readOptions);\n const isDryRun = writeOptions.dryRun;\n\n // Create or modify the static config, when not using dynamic config\n if (!config.dynamicConfigPath) {\n const outputConfig = mergeConfigModifications(config, modifications);\n\n if (!isDryRun) {\n const configPath = config.staticConfigPath ?? path.join(projectRoot, 'app.json');\n await JsonFile.writeAsync(configPath, outputConfig, { json5: false });\n }\n\n return { type: 'success', config: outputConfig.expo ?? outputConfig };\n }\n\n // Attempt to write to a function-like dynamic config, when used with a static config\n if (\n config.staticConfigPath &&\n config.dynamicConfigObjectType === 'function' &&\n !modifications.hasOwnProperty('plugins') // We don't know what plugins are in dynamic configs\n ) {\n const outputConfig = mergeConfigModifications(config, modifications);\n\n if (isDryRun) {\n return {\n type: 'warn',\n message: `Cannot verify config modifications in dry-run mode for config at: ${path.relative(projectRoot, config.dynamicConfigPath)}`,\n config: null,\n };\n }\n\n // Attempt to write the static config with the config modifications\n await JsonFile.writeAsync(config.staticConfigPath, outputConfig, { json5: false });\n\n // Verify that the dynamic config is using the static config\n const newConfig = getConfig(projectRoot, readOptions);\n const newConfighasModifications = isMatchingObject(modifications, newConfig.exp);\n if (newConfighasModifications) {\n return {\n type: 'success',\n config: newConfig.exp,\n };\n }\n\n // Rollback the changes when the reloaded config did not include the modifications\n await JsonFile.writeAsync(config.staticConfigPath, config.rootConfig, { json5: false });\n }\n\n // We cannot automatically write to a dynamic config\n return {\n type: 'warn',\n message: `Cannot automatically write to dynamic config at: ${path.relative(\n projectRoot,\n config.dynamicConfigPath\n )}`,\n config: null,\n };\n}\n\n/**\n * Merge the config modifications, using an optional possible top-level `expo` object.\n * Note, changes in the plugins are merged differently to avoid duplicate entries.\n */\nfunction mergeConfigModifications(\n config: ProjectConfig,\n { plugins, ...modifications }: Partial\n): AppJSONConfig {\n const modifiedExpoConfig: ExpoConfig = !config.rootConfig.expo\n ? deepMerge(config.rootConfig, modifications)\n : deepMerge(config.rootConfig.expo, modifications);\n\n if (plugins?.length) {\n // When adding plugins, ensure the config has a plugin list\n if (!modifiedExpoConfig.plugins) {\n modifiedExpoConfig.plugins = [];\n }\n\n // Create a plugin lookup map\n const existingPlugins: Record = Object.fromEntries(\n modifiedExpoConfig.plugins.map((definition) =>\n typeof definition === 'string' ? [definition, undefined] : definition\n )\n );\n\n for (const plugin of plugins) {\n // Unpack the plugin definition, using either the short (string) or normal (array) notation\n const [pluginName, pluginProps] = Array.isArray(plugin) ? plugin : [plugin];\n // Abort if the plugin definition is empty\n if (!pluginName) continue;\n\n // Add the plugin if it doesn't exist yet, including its properties\n if (!(pluginName in existingPlugins)) {\n modifiedExpoConfig.plugins.push(plugin);\n continue;\n }\n\n // If the plugin has properties, and it exists, merge the properties\n if (pluginProps) {\n modifiedExpoConfig.plugins = modifiedExpoConfig.plugins.map((existingPlugin) => {\n const [existingPluginName] = Array.isArray(existingPlugin)\n ? existingPlugin\n : [existingPlugin];\n\n // Do not modify other plugins\n if (existingPluginName !== pluginName) {\n return existingPlugin;\n }\n\n // Add the props to the existing plugin entry\n if (typeof existingPlugin === 'string') {\n return [existingPlugin, pluginProps];\n }\n\n // Merge the props to the existing plugin properties\n if (Array.isArray(existingPlugin) && existingPlugin[0]) {\n return [existingPlugin[0], deepMerge(existingPlugin[1] ?? {}, pluginProps)];\n }\n\n return existingPlugin;\n });\n continue;\n }\n\n // If the same plugin exists with properties, and the modification does not contain properties, ignore\n }\n }\n\n const finalizedConfig = !config.rootConfig.expo\n ? modifiedExpoConfig\n : { ...config.rootConfig, expo: modifiedExpoConfig };\n\n return finalizedConfig as AppJSONConfig;\n}\n\nfunction isMatchingObject>(\n expectedValues: T,\n actualValues: T\n): boolean {\n for (const key in expectedValues) {\n if (!expectedValues.hasOwnProperty(key)) {\n continue;\n }\n\n if (typeof expectedValues[key] === 'object' && actualValues[key] !== null) {\n if (!isMatchingObject(expectedValues[key], actualValues[key])) {\n return false;\n }\n } else {\n if (expectedValues[key] !== actualValues[key]) {\n return false;\n }\n }\n }\n return true;\n}\n\nfunction ensureConfigHasDefaultValues({\n projectRoot,\n exp,\n pkg,\n paths,\n packageJsonPath,\n skipSDKVersionRequirement = false,\n}: {\n projectRoot: string;\n exp: Partial | null;\n pkg: JSONObject;\n skipSDKVersionRequirement?: boolean;\n paths?: ConfigFilePaths;\n packageJsonPath?: string;\n}): { exp: ExpoConfig; pkg: PackageJSONConfig } {\n if (!exp) {\n exp = {};\n }\n exp = withInternal(exp as any, {\n projectRoot,\n ...(paths ?? {}),\n packageJsonPath,\n });\n // Defaults for package.json fields\n const pkgName = typeof pkg.name === 'string' ? pkg.name : path.basename(projectRoot);\n const pkgVersion = typeof pkg.version === 'string' ? pkg.version : '1.0.0';\n\n const pkgWithDefaults = { ...pkg, name: pkgName, version: pkgVersion };\n\n // Defaults for app.json/app.config.js fields\n const name = exp.name ?? pkgName;\n const slug = exp.slug ?? slugify(name.toLowerCase());\n const version = exp.version ?? pkgVersion;\n let description = exp.description;\n if (!description && typeof pkg.description === 'string') {\n description = pkg.description;\n }\n\n const expWithDefaults = { ...exp, name, slug, version, description };\n\n let sdkVersion;\n try {\n sdkVersion = getExpoSDKVersion(projectRoot, expWithDefaults);\n } catch (error) {\n if (!skipSDKVersionRequirement) throw error;\n }\n\n let platforms = exp.platforms;\n if (!platforms) {\n platforms = getSupportedPlatforms(projectRoot);\n }\n\n return {\n exp: { ...expWithDefaults, sdkVersion, platforms },\n pkg: pkgWithDefaults,\n };\n}\n\nconst DEFAULT_BUILD_PATH = `web-build`;\n\nexport function getWebOutputPath(config: { [key: string]: any } = {}): string {\n if (process.env.WEBPACK_BUILD_OUTPUT_PATH) {\n return process.env.WEBPACK_BUILD_OUTPUT_PATH;\n }\n const expo = config.expo || config || {};\n return expo?.web?.build?.output || DEFAULT_BUILD_PATH;\n}\n\nexport function getNameFromConfig(exp: Record = {}): {\n appName?: string;\n webName?: string;\n} {\n // For RN CLI support\n const appManifest = exp.expo || exp;\n const { web = {} } = appManifest;\n\n // rn-cli apps use a displayName value as well.\n const appName = exp.displayName || appManifest.displayName || appManifest.name;\n const webName = web.name || appName;\n\n return {\n appName,\n webName,\n };\n}\n\nexport function getDefaultTarget(\n projectRoot: string,\n exp?: Pick\n): ProjectTarget {\n exp ??= getConfig(projectRoot, { skipSDKVersionRequirement: true }).exp;\n\n // before SDK 37, always default to managed to preserve previous behavior\n if (exp.sdkVersion && exp.sdkVersion !== 'UNVERSIONED' && semver.lt(exp.sdkVersion, '37.0.0')) {\n return 'managed';\n }\n return isBareWorkflowProject(projectRoot) ? 'bare' : 'managed';\n}\n\nfunction isBareWorkflowProject(projectRoot: string): boolean {\n const [pkg] = getPackageJsonAndPath(projectRoot);\n\n // TODO: Drop this\n if (pkg.dependencies && pkg.dependencies.expokit) {\n return false;\n }\n\n const xcodeprojFiles = globSync('ios/**/*.xcodeproj', {\n absolute: true,\n cwd: projectRoot,\n });\n if (xcodeprojFiles.length) {\n return true;\n }\n const gradleFiles = globSync('android/**/*.gradle', {\n absolute: true,\n cwd: projectRoot,\n });\n if (gradleFiles.length) {\n return true;\n }\n\n return false;\n}\n\n/**\n * Return a useful name describing the project config.\n * - dynamic: app.config.js\n * - static: app.json\n * - custom path app config relative to root folder\n * - both: app.config.js or app.json\n */\nexport function getProjectConfigDescription(projectRoot: string): string {\n const paths = getConfigFilePaths(projectRoot);\n return getProjectConfigDescriptionWithPaths(projectRoot, paths);\n}\n\n/**\n * Returns a string describing the configurations used for the given project root.\n * Will return null if no config is found.\n *\n * @param projectRoot\n * @param projectConfig\n */\nexport function getProjectConfigDescriptionWithPaths(\n projectRoot: string,\n projectConfig: ConfigFilePaths\n): string {\n if (projectConfig.dynamicConfigPath) {\n const relativeDynamicConfigPath = path.relative(projectRoot, projectConfig.dynamicConfigPath);\n if (projectConfig.staticConfigPath) {\n return `${relativeDynamicConfigPath} or ${path.relative(\n projectRoot,\n projectConfig.staticConfigPath\n )}`;\n }\n return relativeDynamicConfigPath;\n } else if (projectConfig.staticConfigPath) {\n return path.relative(projectRoot, projectConfig.staticConfigPath);\n }\n // If a config doesn't exist, our tooling will generate a static app.json\n return 'app.json';\n}\n\nexport * from './Config.types';\n"],"mappings":"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","ignoreList":[]} \ No newline at end of file +{"version":3,"file":"Config.js","names":["_jsonFile","data","_interopRequireDefault","require","_requireUtils","_deepmerge","_glob","_path","_semver","_slugify","_getConfig","_getExpoSDKVersion","_withConfigPlugins","_withInternal","_resolvePackageJson","_Config","Object","keys","forEach","key","prototype","hasOwnProperty","call","_exportNames","exports","defineProperty","enumerable","get","e","__esModule","default","hasWarnedAboutRootConfig","reduceExpoObject","config","expo","filter","length","ansiYellow","str","ansiGray","ansiBold","plural","console","warn","map","join","mods","getSupportedPlatforms","projectRoot","platforms","resolveFrom","push","getConfig","options","paths","getConfigFilePaths","rawStaticConfig","staticConfigPath","getStaticConfig","rootConfig","staticConfig","packageJson","packageJsonPath","getPackageJsonAndPath","fillAndReturnConfig","dynamicConfigObjectType","mayHaveUnusedStaticConfig","configWithDefaultValues","ensureConfigHasDefaultValues","exp","pkg","skipSDKVersionRequirement","dynamicConfigPath","hasUnusedStaticConfig","isModdedConfig","withConfigPlugins","skipPlugins","isPublicConfig","_internal","hooks","ios","android","updates","codeSigningCertificate","codeSigningMetadata","getContextConfig","exportedObjectType","rawDynamicConfig","getDynamicConfig","dynamicConfig","getPackageJson","getRootPackageJsonPath","JsonFile","read","getDynamicConfigFilePath","getStaticConfigFilePath","DYNAMIC_CONFIG_EXTS","extensions","modifyConfigAsync","modifications","readOptions","writeOptions","isDryRun","dryRun","outputConfig","mergeConfigModifications","configPath","path","writeAsync","json5","type","message","relative","newConfig","newConfighasModifications","isMatchingObject","plugins","modifiedExpoConfig","deepMerge","existingPlugins","fromEntries","definition","undefined","plugin","pluginName","pluginProps","Array","isArray","existingPlugin","existingPluginName","finalizedConfig","expectedValues","actualValues","withInternal","pkgName","name","basename","pkgVersion","version","pkgWithDefaults","slug","slugify","toLowerCase","description","expWithDefaults","sdkVersion","getExpoSDKVersion","error","DEFAULT_BUILD_PATH","getWebOutputPath","process","env","WEBPACK_BUILD_OUTPUT_PATH","web","build","output","getNameFromConfig","appManifest","appName","displayName","webName","getDefaultTarget","semver","lt","isBareWorkflowProject","dependencies","expokit","xcodeprojFiles","globSync","absolute","cwd","gradleFiles","getProjectConfigDescription","getProjectConfigDescriptionWithPaths","projectConfig","relativeDynamicConfigPath"],"sources":["../src/Config.ts"],"sourcesContent":["import type { ModConfig } from '@expo/config-plugins';\nimport type { JSONObject } from '@expo/json-file';\nimport JsonFile from '@expo/json-file';\nimport { resolveFrom } from '@expo/require-utils';\nimport deepMerge from 'deepmerge';\nimport { sync as globSync } from 'glob';\nimport path from 'path';\nimport semver from 'semver';\nimport slugify from 'slugify';\n\nimport type {\n AppJSONConfig,\n ConfigFilePaths,\n ExpoConfig,\n GetConfigOptions,\n PackageJSONConfig,\n Platform,\n ProjectConfig,\n ProjectTarget,\n WriteConfigOptions,\n} from './Config.types';\nimport { getDynamicConfig, getStaticConfig } from './getConfig';\nimport { getExpoSDKVersion } from './getExpoSDKVersion';\nimport { withConfigPlugins } from './plugins/withConfigPlugins';\nimport { withInternal } from './plugins/withInternal';\nimport { getRootPackageJsonPath } from './resolvePackageJson';\n\ntype SplitConfigs = { expo?: ExpoConfig; mods?: ModConfig };\n\nlet hasWarnedAboutRootConfig = false;\n\n/**\n * If a config has an `expo` object then that will be used as the config.\n * This method reduces out other top level values if an `expo` object exists.\n *\n * @param config Input config object to reduce\n */\nfunction reduceExpoObject(config?: any): SplitConfigs | null {\n if (!config) return config || null;\n\n if (config.expo && !hasWarnedAboutRootConfig) {\n const keys = Object.keys(config).filter((key) => key !== 'expo');\n if (keys.length) {\n hasWarnedAboutRootConfig = true;\n const ansiYellow = (str: string) => `\\u001B[33m${str}\\u001B[0m`;\n const ansiGray = (str: string) => `\\u001B[90m${str}\\u001B[0m`;\n const ansiBold = (str: string) => `\\u001B[1m${str}\\u001B[22m`;\n const plural = keys.length > 1;\n console.warn(\n ansiYellow(\n ansiBold('Warning: ') +\n `Root-level ${ansiBold(`\"expo\"`)} object found. Ignoring extra key${plural ? 's' : ''} in Expo config: ${keys\n .map((key) => `\"${key}\"`)\n .join(', ')}\\n` +\n ansiGray(`Learn more: https://expo.fyi/root-expo-object`)\n )\n );\n }\n }\n\n const { mods, ...expo } = config.expo ?? config;\n\n return {\n expo,\n mods,\n };\n}\n\n/**\n * Get all platforms that a project is currently capable of running.\n *\n * @param projectRoot\n * @param exp\n */\nfunction getSupportedPlatforms(projectRoot: string): Platform[] {\n const platforms: Platform[] = [];\n if (resolveFrom(projectRoot, 'react-native/package.json')) {\n platforms.push('ios', 'android');\n }\n if (resolveFrom(projectRoot, 'react-dom/package.json')) {\n platforms.push('web');\n }\n return platforms;\n}\n\n/**\n * Evaluate the config for an Expo project.\n * If a function is exported from the `app.config.js` then a partial config will be passed as an argument.\n * The partial config is composed from any existing app.json, and certain fields from the `package.json` like name and description.\n *\n * If options.isPublicConfig is true, the Expo config will include only public-facing options (omitting private keys).\n * The resulting config should be suitable for hosting or embedding in a publicly readable location.\n *\n * **Example**\n * ```js\n * module.exports = function({ config }) {\n * // mutate the config before returning it.\n * config.slug = 'new slug'\n * return { expo: config };\n * }\n * ```\n *\n * **Supports**\n * - `app.config.ts`\n * - `app.config.js`\n * - `app.config.json`\n * - `app.json`\n *\n * @param projectRoot the root folder containing all of your application code\n * @param options enforce criteria for a project config\n */\nexport function getConfig(projectRoot: string, options: GetConfigOptions = {}): ProjectConfig {\n const paths = getConfigFilePaths(projectRoot);\n\n const rawStaticConfig = paths.staticConfigPath ? getStaticConfig(paths.staticConfigPath) : null;\n // For legacy reasons, always return an object.\n const rootConfig = (rawStaticConfig || {}) as AppJSONConfig;\n const staticConfig = reduceExpoObject(rawStaticConfig) || {};\n\n // Can only change the package.json location if an app.json or app.config.json exists\n const [packageJson, packageJsonPath] = getPackageJsonAndPath(projectRoot);\n\n function fillAndReturnConfig(\n config: SplitConfigs,\n dynamicConfigObjectType: string | null,\n mayHaveUnusedStaticConfig: boolean = false\n ) {\n const configWithDefaultValues = {\n ...ensureConfigHasDefaultValues({\n projectRoot,\n exp: config.expo || {},\n pkg: packageJson,\n skipSDKVersionRequirement: options.skipSDKVersionRequirement,\n paths,\n packageJsonPath,\n }),\n mods: config.mods,\n dynamicConfigObjectType,\n rootConfig,\n dynamicConfigPath: paths.dynamicConfigPath,\n staticConfigPath: paths.staticConfigPath,\n hasUnusedStaticConfig:\n !!paths.staticConfigPath && !!paths.dynamicConfigPath && mayHaveUnusedStaticConfig,\n };\n\n if (options.isModdedConfig) {\n // @ts-ignore: Add the mods back to the object.\n configWithDefaultValues.exp.mods = config.mods ?? null;\n }\n\n // Apply static json plugins, should be done after _internal\n configWithDefaultValues.exp = withConfigPlugins(\n configWithDefaultValues.exp,\n !!options.skipPlugins\n );\n\n if (!options.isModdedConfig) {\n // @ts-ignore: Delete mods added by static plugins when they won't have a chance to be evaluated\n delete configWithDefaultValues.exp.mods;\n }\n\n if (options.isPublicConfig) {\n // TODD(EvanBacon): Drop plugins array after it's been resolved.\n\n // Remove internal values with references to user's file paths from the public config.\n delete configWithDefaultValues.exp._internal;\n\n // hooks no longer exists in the typescript type but should still be removed\n if ('hooks' in configWithDefaultValues.exp) {\n delete configWithDefaultValues.exp.hooks;\n }\n if (configWithDefaultValues.exp.ios?.config) {\n delete configWithDefaultValues.exp.ios.config;\n }\n if (configWithDefaultValues.exp.android?.config) {\n delete configWithDefaultValues.exp.android.config;\n }\n\n delete configWithDefaultValues.exp.updates?.codeSigningCertificate;\n delete configWithDefaultValues.exp.updates?.codeSigningMetadata;\n }\n\n return configWithDefaultValues;\n }\n\n // Fill in the static config\n function getContextConfig(config: SplitConfigs) {\n return ensureConfigHasDefaultValues({\n projectRoot,\n exp: config.expo || {},\n pkg: packageJson,\n skipSDKVersionRequirement: true,\n paths,\n packageJsonPath,\n }).exp;\n }\n\n if (paths.dynamicConfigPath) {\n // No app.config.json or app.json but app.config.js\n const {\n exportedObjectType,\n config: rawDynamicConfig,\n mayHaveUnusedStaticConfig,\n } = getDynamicConfig(paths.dynamicConfigPath, {\n projectRoot,\n staticConfigPath: paths.staticConfigPath,\n packageJsonPath,\n config: getContextConfig(staticConfig),\n });\n // Allow for the app.config.js to `export default null;`\n // Use `dynamicConfigPath` to detect if a dynamic config exists.\n const dynamicConfig = reduceExpoObject(rawDynamicConfig) || {};\n return fillAndReturnConfig(dynamicConfig, exportedObjectType, mayHaveUnusedStaticConfig);\n }\n\n // No app.config.js but json or no config\n return fillAndReturnConfig(staticConfig || {}, null);\n}\n\nexport function getPackageJson(projectRoot: string): PackageJSONConfig {\n const [pkg] = getPackageJsonAndPath(projectRoot);\n return pkg;\n}\n\nfunction getPackageJsonAndPath(projectRoot: string): [PackageJSONConfig, string] {\n const packageJsonPath = getRootPackageJsonPath(projectRoot);\n return [JsonFile.read(packageJsonPath), packageJsonPath];\n}\n\n/**\n * Get the static and dynamic config paths for a project. Also accounts for custom paths.\n *\n * @param projectRoot\n */\nexport function getConfigFilePaths(projectRoot: string): ConfigFilePaths {\n return {\n dynamicConfigPath: getDynamicConfigFilePath(projectRoot),\n staticConfigPath: getStaticConfigFilePath(projectRoot),\n };\n}\n\nconst DYNAMIC_CONFIG_EXTS = ['.ts', '.mts', '.cts', '.mjs', '.cjs', '.js'];\n\nfunction getDynamicConfigFilePath(projectRoot: string): string | null {\n return resolveFrom(projectRoot, './app.config', { extensions: DYNAMIC_CONFIG_EXTS });\n}\n\nfunction getStaticConfigFilePath(projectRoot: string): string | null {\n return resolveFrom(projectRoot, './app.config.json') ?? resolveFrom(projectRoot, './app.json');\n}\n\n/**\n * Attempt to modify an Expo project config.\n * This will only fully work if the project is using static configs only.\n * Otherwise 'warn' | 'fail' will return with a message about why the config couldn't be updated.\n * The potentially modified config object will be returned for testing purposes.\n *\n * @param projectRoot\n * @param modifications modifications to make to an existing config\n * @param readOptions options for reading the current config file\n * @param writeOptions If true, the static config file will not be rewritten\n */\nexport async function modifyConfigAsync(\n projectRoot: string,\n modifications: Partial,\n readOptions: GetConfigOptions = {},\n writeOptions: WriteConfigOptions = {}\n): Promise<{\n type: 'success' | 'warn' | 'fail';\n message?: string;\n config: ExpoConfig | null;\n}> {\n const config = getConfig(projectRoot, readOptions);\n const isDryRun = writeOptions.dryRun;\n\n // Create or modify the static config, when not using dynamic config\n if (!config.dynamicConfigPath) {\n const outputConfig = mergeConfigModifications(config, modifications);\n\n if (!isDryRun) {\n const configPath = config.staticConfigPath ?? path.join(projectRoot, 'app.json');\n await JsonFile.writeAsync(configPath, outputConfig, { json5: false });\n }\n\n return { type: 'success', config: outputConfig.expo ?? outputConfig };\n }\n\n // Attempt to write to a function-like dynamic config, when used with a static config\n if (\n config.staticConfigPath &&\n config.dynamicConfigObjectType === 'function' &&\n !modifications.hasOwnProperty('plugins') // We don't know what plugins are in dynamic configs\n ) {\n const outputConfig = mergeConfigModifications(config, modifications);\n\n if (isDryRun) {\n return {\n type: 'warn',\n message: `Cannot verify config modifications in dry-run mode for config at: ${path.relative(projectRoot, config.dynamicConfigPath)}`,\n config: null,\n };\n }\n\n // Attempt to write the static config with the config modifications\n await JsonFile.writeAsync(config.staticConfigPath, outputConfig, { json5: false });\n\n // Verify that the dynamic config is using the static config\n const newConfig = getConfig(projectRoot, readOptions);\n const newConfighasModifications = isMatchingObject(modifications, newConfig.exp);\n if (newConfighasModifications) {\n return {\n type: 'success',\n config: newConfig.exp,\n };\n }\n\n // Rollback the changes when the reloaded config did not include the modifications\n await JsonFile.writeAsync(config.staticConfigPath, config.rootConfig, { json5: false });\n }\n\n // We cannot automatically write to a dynamic config\n return {\n type: 'warn',\n message: `Cannot automatically write to dynamic config at: ${path.relative(\n projectRoot,\n config.dynamicConfigPath\n )}`,\n config: null,\n };\n}\n\n/**\n * Merge the config modifications, using an optional possible top-level `expo` object.\n * Note, changes in the plugins are merged differently to avoid duplicate entries.\n */\nfunction mergeConfigModifications(\n config: ProjectConfig,\n { plugins, ...modifications }: Partial\n): AppJSONConfig {\n const modifiedExpoConfig: ExpoConfig = !config.rootConfig.expo\n ? deepMerge(config.rootConfig, modifications)\n : deepMerge(config.rootConfig.expo, modifications);\n\n if (plugins?.length) {\n // When adding plugins, ensure the config has a plugin list\n if (!modifiedExpoConfig.plugins) {\n modifiedExpoConfig.plugins = [];\n }\n\n // Create a plugin lookup map\n const existingPlugins: Record = Object.fromEntries(\n modifiedExpoConfig.plugins.map((definition) =>\n typeof definition === 'string' ? [definition, undefined] : definition\n )\n );\n\n for (const plugin of plugins) {\n // Unpack the plugin definition, using either the short (string) or normal (array) notation\n const [pluginName, pluginProps] = Array.isArray(plugin) ? plugin : [plugin];\n // Abort if the plugin definition is empty\n if (!pluginName) continue;\n\n // Add the plugin if it doesn't exist yet, including its properties\n if (!(pluginName in existingPlugins)) {\n modifiedExpoConfig.plugins.push(plugin);\n continue;\n }\n\n // If the plugin has properties, and it exists, merge the properties\n if (pluginProps) {\n modifiedExpoConfig.plugins = modifiedExpoConfig.plugins.map((existingPlugin) => {\n const [existingPluginName] = Array.isArray(existingPlugin)\n ? existingPlugin\n : [existingPlugin];\n\n // Do not modify other plugins\n if (existingPluginName !== pluginName) {\n return existingPlugin;\n }\n\n // Add the props to the existing plugin entry\n if (typeof existingPlugin === 'string') {\n return [existingPlugin, pluginProps];\n }\n\n // Merge the props to the existing plugin properties\n if (Array.isArray(existingPlugin) && existingPlugin[0]) {\n return [existingPlugin[0], deepMerge(existingPlugin[1] ?? {}, pluginProps)];\n }\n\n return existingPlugin;\n });\n continue;\n }\n\n // If the same plugin exists with properties, and the modification does not contain properties, ignore\n }\n }\n\n const finalizedConfig = !config.rootConfig.expo\n ? modifiedExpoConfig\n : { ...config.rootConfig, expo: modifiedExpoConfig };\n\n return finalizedConfig as AppJSONConfig;\n}\n\nfunction isMatchingObject>(\n expectedValues: T,\n actualValues: T\n): boolean {\n for (const key in expectedValues) {\n if (!expectedValues.hasOwnProperty(key)) {\n continue;\n }\n\n if (typeof expectedValues[key] === 'object' && actualValues[key] !== null) {\n if (!isMatchingObject(expectedValues[key], actualValues[key])) {\n return false;\n }\n } else {\n if (expectedValues[key] !== actualValues[key]) {\n return false;\n }\n }\n }\n return true;\n}\n\nfunction ensureConfigHasDefaultValues({\n projectRoot,\n exp,\n pkg,\n paths,\n packageJsonPath,\n skipSDKVersionRequirement = false,\n}: {\n projectRoot: string;\n exp: Partial | null;\n pkg: JSONObject;\n skipSDKVersionRequirement?: boolean;\n paths?: ConfigFilePaths;\n packageJsonPath?: string;\n}): { exp: ExpoConfig; pkg: PackageJSONConfig } {\n if (!exp) {\n exp = {};\n }\n exp = withInternal(exp as any, {\n projectRoot,\n ...(paths ?? {}),\n packageJsonPath,\n });\n // Defaults for package.json fields\n const pkgName = typeof pkg.name === 'string' ? pkg.name : path.basename(projectRoot);\n const pkgVersion = typeof pkg.version === 'string' ? pkg.version : '1.0.0';\n\n const pkgWithDefaults = { ...pkg, name: pkgName, version: pkgVersion };\n\n // Defaults for app.json/app.config.js fields\n const name = exp.name ?? pkgName;\n const slug = exp.slug ?? slugify(name.toLowerCase());\n const version = exp.version ?? pkgVersion;\n let description = exp.description;\n if (!description && typeof pkg.description === 'string') {\n description = pkg.description;\n }\n\n const expWithDefaults = { ...exp, name, slug, version, description };\n\n let sdkVersion;\n try {\n sdkVersion = getExpoSDKVersion(projectRoot, expWithDefaults);\n } catch (error) {\n if (!skipSDKVersionRequirement) throw error;\n }\n\n let platforms = exp.platforms;\n if (!platforms) {\n platforms = getSupportedPlatforms(projectRoot);\n }\n\n return {\n exp: { ...expWithDefaults, sdkVersion, platforms },\n pkg: pkgWithDefaults,\n };\n}\n\nconst DEFAULT_BUILD_PATH = `web-build`;\n\nexport function getWebOutputPath(config: { [key: string]: any } = {}): string {\n if (process.env.WEBPACK_BUILD_OUTPUT_PATH) {\n return process.env.WEBPACK_BUILD_OUTPUT_PATH;\n }\n const expo = config.expo || config || {};\n return expo?.web?.build?.output || DEFAULT_BUILD_PATH;\n}\n\nexport function getNameFromConfig(exp: Record = {}): {\n appName?: string;\n webName?: string;\n} {\n // For RN CLI support\n const appManifest = exp.expo || exp;\n const { web = {} } = appManifest;\n\n // rn-cli apps use a displayName value as well.\n const appName = exp.displayName || appManifest.displayName || appManifest.name;\n const webName = web.name || appName;\n\n return {\n appName,\n webName,\n };\n}\n\nexport function getDefaultTarget(\n projectRoot: string,\n exp?: Pick\n): ProjectTarget {\n exp ??= getConfig(projectRoot, { skipSDKVersionRequirement: true }).exp;\n\n // before SDK 37, always default to managed to preserve previous behavior\n if (exp.sdkVersion && exp.sdkVersion !== 'UNVERSIONED' && semver.lt(exp.sdkVersion, '37.0.0')) {\n return 'managed';\n }\n return isBareWorkflowProject(projectRoot) ? 'bare' : 'managed';\n}\n\nfunction isBareWorkflowProject(projectRoot: string): boolean {\n const [pkg] = getPackageJsonAndPath(projectRoot);\n\n // TODO: Drop this\n if (pkg.dependencies && pkg.dependencies.expokit) {\n return false;\n }\n\n const xcodeprojFiles = globSync('ios/**/*.xcodeproj', {\n absolute: true,\n cwd: projectRoot,\n });\n if (xcodeprojFiles.length) {\n return true;\n }\n const gradleFiles = globSync('android/**/*.gradle', {\n absolute: true,\n cwd: projectRoot,\n });\n if (gradleFiles.length) {\n return true;\n }\n\n return false;\n}\n\n/**\n * Return a useful name describing the project config.\n * - dynamic: app.config.js\n * - static: app.json\n * - custom path app config relative to root folder\n * - both: app.config.js or app.json\n */\nexport function getProjectConfigDescription(projectRoot: string): string {\n const paths = getConfigFilePaths(projectRoot);\n return getProjectConfigDescriptionWithPaths(projectRoot, paths);\n}\n\n/**\n * Returns a string describing the configurations used for the given project root.\n * Will return null if no config is found.\n *\n * @param projectRoot\n * @param projectConfig\n */\nexport function getProjectConfigDescriptionWithPaths(\n projectRoot: string,\n projectConfig: ConfigFilePaths\n): string {\n if (projectConfig.dynamicConfigPath) {\n const relativeDynamicConfigPath = path.relative(projectRoot, projectConfig.dynamicConfigPath);\n if (projectConfig.staticConfigPath) {\n return `${relativeDynamicConfigPath} or ${path.relative(\n projectRoot,\n projectConfig.staticConfigPath\n )}`;\n }\n return relativeDynamicConfigPath;\n } else if (projectConfig.staticConfigPath) {\n return path.relative(projectRoot, projectConfig.staticConfigPath);\n }\n // If a config doesn't exist, our tooling will generate a static app.json\n return 'app.json';\n}\n\nexport * from './Config.types';\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;AAEA,SAAAA,UAAA;EAAA,MAAAC,IAAA,GAAAC,sBAAA,CAAAC,OAAA;EAAAH,SAAA,YAAAA,CAAA;IAAA,OAAAC,IAAA;EAAA;EAAA,OAAAA,IAAA;AAAA;AACA,SAAAG,cAAA;EAAA,MAAAH,IAAA,GAAAE,OAAA;EAAAC,aAAA,YAAAA,CAAA;IAAA,OAAAH,IAAA;EAAA;EAAA,OAAAA,IAAA;AAAA;AACA,SAAAI,WAAA;EAAA,MAAAJ,IAAA,GAAAC,sBAAA,CAAAC,OAAA;EAAAE,UAAA,YAAAA,CAAA;IAAA,OAAAJ,IAAA;EAAA;EAAA,OAAAA,IAAA;AAAA;AACA,SAAAK,MAAA;EAAA,MAAAL,IAAA,GAAAE,OAAA;EAAAG,KAAA,YAAAA,CAAA;IAAA,OAAAL,IAAA;EAAA;EAAA,OAAAA,IAAA;AAAA;AACA,SAAAM,MAAA;EAAA,MAAAN,IAAA,GAAAC,sBAAA,CAAAC,OAAA;EAAAI,KAAA,YAAAA,CAAA;IAAA,OAAAN,IAAA;EAAA;EAAA,OAAAA,IAAA;AAAA;AACA,SAAAO,QAAA;EAAA,MAAAP,IAAA,GAAAC,sBAAA,CAAAC,OAAA;EAAAK,OAAA,YAAAA,CAAA;IAAA,OAAAP,IAAA;EAAA;EAAA,OAAAA,IAAA;AAAA;AACA,SAAAQ,SAAA;EAAA,MAAAR,IAAA,GAAAC,sBAAA,CAAAC,OAAA;EAAAM,QAAA,YAAAA,CAAA;IAAA,OAAAR,IAAA;EAAA;EAAA,OAAAA,IAAA;AAAA;AAaA,SAAAS,WAAA;EAAA,MAAAT,IAAA,GAAAE,OAAA;EAAAO,UAAA,YAAAA,CAAA;IAAA,OAAAT,IAAA;EAAA;EAAA,OAAAA,IAAA;AAAA;AACA,SAAAU,mBAAA;EAAA,MAAAV,IAAA,GAAAE,OAAA;EAAAQ,kBAAA,YAAAA,CAAA;IAAA,OAAAV,IAAA;EAAA;EAAA,OAAAA,IAAA;AAAA;AACA,SAAAW,mBAAA;EAAA,MAAAX,IAAA,GAAAE,OAAA;EAAAS,kBAAA,YAAAA,CAAA;IAAA,OAAAX,IAAA;EAAA;EAAA,OAAAA,IAAA;AAAA;AACA,SAAAY,cAAA;EAAA,MAAAZ,IAAA,GAAAE,OAAA;EAAAU,aAAA,YAAAA,CAAA;IAAA,OAAAZ,IAAA;EAAA;EAAA,OAAAA,IAAA;AAAA;AACA,SAAAa,oBAAA;EAAA,MAAAb,IAAA,GAAAE,OAAA;EAAAW,mBAAA,YAAAA,CAAA;IAAA,OAAAb,IAAA;EAAA;EAAA,OAAAA,IAAA;AAAA;AAujBA,IAAAc,OAAA,GAAAZ,OAAA;AAAAa,MAAA,CAAAC,IAAA,CAAAF,OAAA,EAAAG,OAAA,WAAAC,GAAA;EAAA,IAAAA,GAAA,kBAAAA,GAAA;EAAA,IAAAH,MAAA,CAAAI,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAAC,YAAA,EAAAJ,GAAA;EAAA,IAAAA,GAAA,IAAAK,OAAA,IAAAA,OAAA,CAAAL,GAAA,MAAAJ,OAAA,CAAAI,GAAA;EAAAH,MAAA,CAAAS,cAAA,CAAAD,OAAA,EAAAL,GAAA;IAAAO,UAAA;IAAAC,GAAA,WAAAA,CAAA;MAAA,OAAAZ,OAAA,CAAAI,GAAA;IAAA;EAAA;AAAA;AAA+B,SAAAjB,uBAAA0B,CAAA,WAAAA,CAAA,IAAAA,CAAA,CAAAC,UAAA,GAAAD,CAAA,KAAAE,OAAA,EAAAF,CAAA;AAnjB/B,IAAIG,wBAAwB,GAAG,KAAK;;AAEpC;AACA;AACA;AACA;AACA;AACA;AACA,SAASC,gBAAgBA,CAACC,MAAY,EAAuB;EAC3D,IAAI,CAACA,MAAM,EAAE,OAAOA,MAAM,IAAI,IAAI;EAElC,IAAIA,MAAM,CAACC,IAAI,IAAI,CAACH,wBAAwB,EAAE;IAC5C,MAAMd,IAAI,GAAGD,MAAM,CAACC,IAAI,CAACgB,MAAM,CAAC,CAACE,MAAM,CAAEhB,GAAG,IAAKA,GAAG,KAAK,MAAM,CAAC;IAChE,IAAIF,IAAI,CAACmB,MAAM,EAAE;MACfL,wBAAwB,GAAG,IAAI;MAC/B,MAAMM,UAAU,GAAIC,GAAW,IAAK,aAAaA,GAAG,WAAW;MAC/D,MAAMC,QAAQ,GAAID,GAAW,IAAK,aAAaA,GAAG,WAAW;MAC7D,MAAME,QAAQ,GAAIF,GAAW,IAAK,YAAYA,GAAG,YAAY;MAC7D,MAAMG,MAAM,GAAGxB,IAAI,CAACmB,MAAM,GAAG,CAAC;MAC9BM,OAAO,CAACC,IAAI,CACVN,UAAU,CACRG,QAAQ,CAAC,WAAW,CAAC,GACnB,cAAcA,QAAQ,CAAC,QAAQ,CAAC,oCAAoCC,MAAM,GAAG,GAAG,GAAG,EAAE,oBAAoBxB,IAAI,CAC1G2B,GAAG,CAAEzB,GAAG,IAAK,IAAIA,GAAG,GAAG,CAAC,CACxB0B,IAAI,CAAC,IAAI,CAAC,IAAI,GACjBN,QAAQ,CAAC,+CAA+C,CAC5D,CACF,CAAC;IACH;EACF;EAEA,MAAM;IAAEO,IAAI;IAAE,GAAGZ;EAAK,CAAC,GAAGD,MAAM,CAACC,IAAI,IAAID,MAAM;EAE/C,OAAO;IACLC,IAAI;IACJY;EACF,CAAC;AACH;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,SAASC,qBAAqBA,CAACC,WAAmB,EAAc;EAC9D,MAAMC,SAAqB,GAAG,EAAE;EAChC,IAAI,IAAAC,2BAAW,EAACF,WAAW,EAAE,2BAA2B,CAAC,EAAE;IACzDC,SAAS,CAACE,IAAI,CAAC,KAAK,EAAE,SAAS,CAAC;EAClC;EACA,IAAI,IAAAD,2BAAW,EAACF,WAAW,EAAE,wBAAwB,CAAC,EAAE;IACtDC,SAAS,CAACE,IAAI,CAAC,KAAK,CAAC;EACvB;EACA,OAAOF,SAAS;AAClB;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO,SAASG,SAASA,CAACJ,WAAmB,EAAEK,OAAyB,GAAG,CAAC,CAAC,EAAiB;EAC5F,MAAMC,KAAK,GAAGC,kBAAkB,CAACP,WAAW,CAAC;EAE7C,MAAMQ,eAAe,GAAGF,KAAK,CAACG,gBAAgB,GAAG,IAAAC,4BAAe,EAACJ,KAAK,CAACG,gBAAgB,CAAC,GAAG,IAAI;EAC/F;EACA,MAAME,UAAU,GAAIH,eAAe,IAAI,CAAC,CAAmB;EAC3D,MAAMI,YAAY,GAAG5B,gBAAgB,CAACwB,eAAe,CAAC,IAAI,CAAC,CAAC;;EAE5D;EACA,MAAM,CAACK,WAAW,EAAEC,eAAe,CAAC,GAAGC,qBAAqB,CAACf,WAAW,CAAC;EAEzE,SAASgB,mBAAmBA,CAC1B/B,MAAoB,EACpBgC,uBAAsC,EACtCC,yBAAkC,GAAG,KAAK,EAC1C;IACA,MAAMC,uBAAuB,GAAG;MAC9B,GAAGC,4BAA4B,CAAC;QAC9BpB,WAAW;QACXqB,GAAG,EAAEpC,MAAM,CAACC,IAAI,IAAI,CAAC,CAAC;QACtBoC,GAAG,EAAET,WAAW;QAChBU,yBAAyB,EAAElB,OAAO,CAACkB,yBAAyB;QAC5DjB,KAAK;QACLQ;MACF,CAAC,CAAC;MACFhB,IAAI,EAAEb,MAAM,CAACa,IAAI;MACjBmB,uBAAuB;MACvBN,UAAU;MACVa,iBAAiB,EAAElB,KAAK,CAACkB,iBAAiB;MAC1Cf,gBAAgB,EAAEH,KAAK,CAACG,gBAAgB;MACxCgB,qBAAqB,EACnB,CAAC,CAACnB,KAAK,CAACG,gBAAgB,IAAI,CAAC,CAACH,KAAK,CAACkB,iBAAiB,IAAIN;IAC7D,CAAC;IAED,IAAIb,OAAO,CAACqB,cAAc,EAAE;MAC1B;MACAP,uBAAuB,CAACE,GAAG,CAACvB,IAAI,GAAGb,MAAM,CAACa,IAAI,IAAI,IAAI;IACxD;;IAEA;IACAqB,uBAAuB,CAACE,GAAG,GAAG,IAAAM,sCAAiB,EAC7CR,uBAAuB,CAACE,GAAG,EAC3B,CAAC,CAAChB,OAAO,CAACuB,WACZ,CAAC;IAED,IAAI,CAACvB,OAAO,CAACqB,cAAc,EAAE;MAC3B;MACA,OAAOP,uBAAuB,CAACE,GAAG,CAACvB,IAAI;IACzC;IAEA,IAAIO,OAAO,CAACwB,cAAc,EAAE;MAC1B;;MAEA;MACA,OAAOV,uBAAuB,CAACE,GAAG,CAACS,SAAS;;MAE5C;MACA,IAAI,OAAO,IAAIX,uBAAuB,CAACE,GAAG,EAAE;QAC1C,OAAOF,uBAAuB,CAACE,GAAG,CAACU,KAAK;MAC1C;MACA,IAAIZ,uBAAuB,CAACE,GAAG,CAACW,GAAG,EAAE/C,MAAM,EAAE;QAC3C,OAAOkC,uBAAuB,CAACE,GAAG,CAACW,GAAG,CAAC/C,MAAM;MAC/C;MACA,IAAIkC,uBAAuB,CAACE,GAAG,CAACY,OAAO,EAAEhD,MAAM,EAAE;QAC/C,OAAOkC,uBAAuB,CAACE,GAAG,CAACY,OAAO,CAAChD,MAAM;MACnD;MAEA,OAAOkC,uBAAuB,CAACE,GAAG,CAACa,OAAO,EAAEC,sBAAsB;MAClE,OAAOhB,uBAAuB,CAACE,GAAG,CAACa,OAAO,EAAEE,mBAAmB;IACjE;IAEA,OAAOjB,uBAAuB;EAChC;;EAEA;EACA,SAASkB,gBAAgBA,CAACpD,MAAoB,EAAE;IAC9C,OAAOmC,4BAA4B,CAAC;MAClCpB,WAAW;MACXqB,GAAG,EAAEpC,MAAM,CAACC,IAAI,IAAI,CAAC,CAAC;MACtBoC,GAAG,EAAET,WAAW;MAChBU,yBAAyB,EAAE,IAAI;MAC/BjB,KAAK;MACLQ;IACF,CAAC,CAAC,CAACO,GAAG;EACR;EAEA,IAAIf,KAAK,CAACkB,iBAAiB,EAAE;IAC3B;IACA,MAAM;MACJc,kBAAkB;MAClBrD,MAAM,EAAEsD,gBAAgB;MACxBrB;IACF,CAAC,GAAG,IAAAsB,6BAAgB,EAAClC,KAAK,CAACkB,iBAAiB,EAAE;MAC5CxB,WAAW;MACXS,gBAAgB,EAAEH,KAAK,CAACG,gBAAgB;MACxCK,eAAe;MACf7B,MAAM,EAAEoD,gBAAgB,CAACzB,YAAY;IACvC,CAAC,CAAC;IACF;IACA;IACA,MAAM6B,aAAa,GAAGzD,gBAAgB,CAACuD,gBAAgB,CAAC,IAAI,CAAC,CAAC;IAC9D,OAAOvB,mBAAmB,CAACyB,aAAa,EAAEH,kBAAkB,EAAEpB,yBAAyB,CAAC;EAC1F;;EAEA;EACA,OAAOF,mBAAmB,CAACJ,YAAY,IAAI,CAAC,CAAC,EAAE,IAAI,CAAC;AACtD;AAEO,SAAS8B,cAAcA,CAAC1C,WAAmB,EAAqB;EACrE,MAAM,CAACsB,GAAG,CAAC,GAAGP,qBAAqB,CAACf,WAAW,CAAC;EAChD,OAAOsB,GAAG;AACZ;AAEA,SAASP,qBAAqBA,CAACf,WAAmB,EAA+B;EAC/E,MAAMc,eAAe,GAAG,IAAA6B,4CAAsB,EAAC3C,WAAW,CAAC;EAC3D,OAAO,CAAC4C,mBAAQ,CAACC,IAAI,CAAC/B,eAAe,CAAC,EAAEA,eAAe,CAAC;AAC1D;;AAEA;AACA;AACA;AACA;AACA;AACO,SAASP,kBAAkBA,CAACP,WAAmB,EAAmB;EACvE,OAAO;IACLwB,iBAAiB,EAAEsB,wBAAwB,CAAC9C,WAAW,CAAC;IACxDS,gBAAgB,EAAEsC,uBAAuB,CAAC/C,WAAW;EACvD,CAAC;AACH;AAEA,MAAMgD,mBAAmB,GAAG,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,CAAC;AAE1E,SAASF,wBAAwBA,CAAC9C,WAAmB,EAAiB;EACpE,OAAO,IAAAE,2BAAW,EAACF,WAAW,EAAE,cAAc,EAAE;IAAEiD,UAAU,EAAED;EAAoB,CAAC,CAAC;AACtF;AAEA,SAASD,uBAAuBA,CAAC/C,WAAmB,EAAiB;EACnE,OAAO,IAAAE,2BAAW,EAACF,WAAW,EAAE,mBAAmB,CAAC,IAAI,IAAAE,2BAAW,EAACF,WAAW,EAAE,YAAY,CAAC;AAChG;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO,eAAekD,iBAAiBA,CACrClD,WAAmB,EACnBmD,aAAkC,EAClCC,WAA6B,GAAG,CAAC,CAAC,EAClCC,YAAgC,GAAG,CAAC,CAAC,EAKpC;EACD,MAAMpE,MAAM,GAAGmB,SAAS,CAACJ,WAAW,EAAEoD,WAAW,CAAC;EAClD,MAAME,QAAQ,GAAGD,YAAY,CAACE,MAAM;;EAEpC;EACA,IAAI,CAACtE,MAAM,CAACuC,iBAAiB,EAAE;IAC7B,MAAMgC,YAAY,GAAGC,wBAAwB,CAACxE,MAAM,EAAEkE,aAAa,CAAC;IAEpE,IAAI,CAACG,QAAQ,EAAE;MACb,MAAMI,UAAU,GAAGzE,MAAM,CAACwB,gBAAgB,IAAIkD,eAAI,CAAC9D,IAAI,CAACG,WAAW,EAAE,UAAU,CAAC;MAChF,MAAM4C,mBAAQ,CAACgB,UAAU,CAACF,UAAU,EAAEF,YAAY,EAAE;QAAEK,KAAK,EAAE;MAAM,CAAC,CAAC;IACvE;IAEA,OAAO;MAAEC,IAAI,EAAE,SAAS;MAAE7E,MAAM,EAAEuE,YAAY,CAACtE,IAAI,IAAIsE;IAAa,CAAC;EACvE;;EAEA;EACA,IACEvE,MAAM,CAACwB,gBAAgB,IACvBxB,MAAM,CAACgC,uBAAuB,KAAK,UAAU,IAC7C,CAACkC,aAAa,CAAC9E,cAAc,CAAC,SAAS,CAAC,CAAC;EAAA,EACzC;IACA,MAAMmF,YAAY,GAAGC,wBAAwB,CAACxE,MAAM,EAAEkE,aAAa,CAAC;IAEpE,IAAIG,QAAQ,EAAE;MACZ,OAAO;QACLQ,IAAI,EAAE,MAAM;QACZC,OAAO,EAAE,qEAAqEJ,eAAI,CAACK,QAAQ,CAAChE,WAAW,EAAEf,MAAM,CAACuC,iBAAiB,CAAC,EAAE;QACpIvC,MAAM,EAAE;MACV,CAAC;IACH;;IAEA;IACA,MAAM2D,mBAAQ,CAACgB,UAAU,CAAC3E,MAAM,CAACwB,gBAAgB,EAAE+C,YAAY,EAAE;MAAEK,KAAK,EAAE;IAAM,CAAC,CAAC;;IAElF;IACA,MAAMI,SAAS,GAAG7D,SAAS,CAACJ,WAAW,EAAEoD,WAAW,CAAC;IACrD,MAAMc,yBAAyB,GAAGC,gBAAgB,CAAChB,aAAa,EAAEc,SAAS,CAAC5C,GAAG,CAAC;IAChF,IAAI6C,yBAAyB,EAAE;MAC7B,OAAO;QACLJ,IAAI,EAAE,SAAS;QACf7E,MAAM,EAAEgF,SAAS,CAAC5C;MACpB,CAAC;IACH;;IAEA;IACA,MAAMuB,mBAAQ,CAACgB,UAAU,CAAC3E,MAAM,CAACwB,gBAAgB,EAAExB,MAAM,CAAC0B,UAAU,EAAE;MAAEkD,KAAK,EAAE;IAAM,CAAC,CAAC;EACzF;;EAEA;EACA,OAAO;IACLC,IAAI,EAAE,MAAM;IACZC,OAAO,EAAE,oDAAoDJ,eAAI,CAACK,QAAQ,CACxEhE,WAAW,EACXf,MAAM,CAACuC,iBACT,CAAC,EAAE;IACHvC,MAAM,EAAE;EACV,CAAC;AACH;;AAEA;AACA;AACA;AACA;AACA,SAASwE,wBAAwBA,CAC/BxE,MAAqB,EACrB;EAAEmF,OAAO;EAAE,GAAGjB;AAAmC,CAAC,EACnC;EACf,MAAMkB,kBAA8B,GAAG,CAACpF,MAAM,CAAC0B,UAAU,CAACzB,IAAI,GAC1D,IAAAoF,oBAAS,EAACrF,MAAM,CAAC0B,UAAU,EAAEwC,aAAa,CAAC,GAC3C,IAAAmB,oBAAS,EAACrF,MAAM,CAAC0B,UAAU,CAACzB,IAAI,EAAEiE,aAAa,CAAC;EAEpD,IAAIiB,OAAO,EAAEhF,MAAM,EAAE;IACnB;IACA,IAAI,CAACiF,kBAAkB,CAACD,OAAO,EAAE;MAC/BC,kBAAkB,CAACD,OAAO,GAAG,EAAE;IACjC;;IAEA;IACA,MAAMG,eAAoC,GAAGvG,MAAM,CAACwG,WAAW,CAC7DH,kBAAkB,CAACD,OAAO,CAACxE,GAAG,CAAE6E,UAAU,IACxC,OAAOA,UAAU,KAAK,QAAQ,GAAG,CAACA,UAAU,EAAEC,SAAS,CAAC,GAAGD,UAC7D,CACF,CAAC;IAED,KAAK,MAAME,MAAM,IAAIP,OAAO,EAAE;MAC5B;MACA,MAAM,CAACQ,UAAU,EAAEC,WAAW,CAAC,GAAGC,KAAK,CAACC,OAAO,CAACJ,MAAM,CAAC,GAAGA,MAAM,GAAG,CAACA,MAAM,CAAC;MAC3E;MACA,IAAI,CAACC,UAAU,EAAE;;MAEjB;MACA,IAAI,EAAEA,UAAU,IAAIL,eAAe,CAAC,EAAE;QACpCF,kBAAkB,CAACD,OAAO,CAACjE,IAAI,CAACwE,MAAM,CAAC;QACvC;MACF;;MAEA;MACA,IAAIE,WAAW,EAAE;QACfR,kBAAkB,CAACD,OAAO,GAAGC,kBAAkB,CAACD,OAAO,CAACxE,GAAG,CAAEoF,cAAc,IAAK;UAC9E,MAAM,CAACC,kBAAkB,CAAC,GAAGH,KAAK,CAACC,OAAO,CAACC,cAAc,CAAC,GACtDA,cAAc,GACd,CAACA,cAAc,CAAC;;UAEpB;UACA,IAAIC,kBAAkB,KAAKL,UAAU,EAAE;YACrC,OAAOI,cAAc;UACvB;;UAEA;UACA,IAAI,OAAOA,cAAc,KAAK,QAAQ,EAAE;YACtC,OAAO,CAACA,cAAc,EAAEH,WAAW,CAAC;UACtC;;UAEA;UACA,IAAIC,KAAK,CAACC,OAAO,CAACC,cAAc,CAAC,IAAIA,cAAc,CAAC,CAAC,CAAC,EAAE;YACtD,OAAO,CAACA,cAAc,CAAC,CAAC,CAAC,EAAE,IAAAV,oBAAS,EAACU,cAAc,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,EAAEH,WAAW,CAAC,CAAC;UAC7E;UAEA,OAAOG,cAAc;QACvB,CAAC,CAAC;QACF;MACF;;MAEA;IACF;EACF;EAEA,MAAME,eAAe,GAAG,CAACjG,MAAM,CAAC0B,UAAU,CAACzB,IAAI,GAC3CmF,kBAAkB,GAClB;IAAE,GAAGpF,MAAM,CAAC0B,UAAU;IAAEzB,IAAI,EAAEmF;EAAmB,CAAC;EAEtD,OAAOa,eAAe;AACxB;AAEA,SAASf,gBAAgBA,CACvBgB,cAAiB,EACjBC,YAAe,EACN;EACT,KAAK,MAAMjH,GAAG,IAAIgH,cAAc,EAAE;IAChC,IAAI,CAACA,cAAc,CAAC9G,cAAc,CAACF,GAAG,CAAC,EAAE;MACvC;IACF;IAEA,IAAI,OAAOgH,cAAc,CAAChH,GAAG,CAAC,KAAK,QAAQ,IAAIiH,YAAY,CAACjH,GAAG,CAAC,KAAK,IAAI,EAAE;MACzE,IAAI,CAACgG,gBAAgB,CAACgB,cAAc,CAAChH,GAAG,CAAC,EAAEiH,YAAY,CAACjH,GAAG,CAAC,CAAC,EAAE;QAC7D,OAAO,KAAK;MACd;IACF,CAAC,MAAM;MACL,IAAIgH,cAAc,CAAChH,GAAG,CAAC,KAAKiH,YAAY,CAACjH,GAAG,CAAC,EAAE;QAC7C,OAAO,KAAK;MACd;IACF;EACF;EACA,OAAO,IAAI;AACb;AAEA,SAASiD,4BAA4BA,CAAC;EACpCpB,WAAW;EACXqB,GAAG;EACHC,GAAG;EACHhB,KAAK;EACLQ,eAAe;EACfS,yBAAyB,GAAG;AAQ9B,CAAC,EAA+C;EAC9C,IAAI,CAACF,GAAG,EAAE;IACRA,GAAG,GAAG,CAAC,CAAC;EACV;EACAA,GAAG,GAAG,IAAAgE,4BAAY,EAAChE,GAAG,EAAS;IAC7BrB,WAAW;IACX,IAAIM,KAAK,IAAI,CAAC,CAAC,CAAC;IAChBQ;EACF,CAAC,CAAC;EACF;EACA,MAAMwE,OAAO,GAAG,OAAOhE,GAAG,CAACiE,IAAI,KAAK,QAAQ,GAAGjE,GAAG,CAACiE,IAAI,GAAG5B,eAAI,CAAC6B,QAAQ,CAACxF,WAAW,CAAC;EACpF,MAAMyF,UAAU,GAAG,OAAOnE,GAAG,CAACoE,OAAO,KAAK,QAAQ,GAAGpE,GAAG,CAACoE,OAAO,GAAG,OAAO;EAE1E,MAAMC,eAAe,GAAG;IAAE,GAAGrE,GAAG;IAAEiE,IAAI,EAAED,OAAO;IAAEI,OAAO,EAAED;EAAW,CAAC;;EAEtE;EACA,MAAMF,IAAI,GAAGlE,GAAG,CAACkE,IAAI,IAAID,OAAO;EAChC,MAAMM,IAAI,GAAGvE,GAAG,CAACuE,IAAI,IAAI,IAAAC,kBAAO,EAACN,IAAI,CAACO,WAAW,CAAC,CAAC,CAAC;EACpD,MAAMJ,OAAO,GAAGrE,GAAG,CAACqE,OAAO,IAAID,UAAU;EACzC,IAAIM,WAAW,GAAG1E,GAAG,CAAC0E,WAAW;EACjC,IAAI,CAACA,WAAW,IAAI,OAAOzE,GAAG,CAACyE,WAAW,KAAK,QAAQ,EAAE;IACvDA,WAAW,GAAGzE,GAAG,CAACyE,WAAW;EAC/B;EAEA,MAAMC,eAAe,GAAG;IAAE,GAAG3E,GAAG;IAAEkE,IAAI;IAAEK,IAAI;IAAEF,OAAO;IAAEK;EAAY,CAAC;EAEpE,IAAIE,UAAU;EACd,IAAI;IACFA,UAAU,GAAG,IAAAC,sCAAiB,EAAClG,WAAW,EAAEgG,eAAe,CAAC;EAC9D,CAAC,CAAC,OAAOG,KAAK,EAAE;IACd,IAAI,CAAC5E,yBAAyB,EAAE,MAAM4E,KAAK;EAC7C;EAEA,IAAIlG,SAAS,GAAGoB,GAAG,CAACpB,SAAS;EAC7B,IAAI,CAACA,SAAS,EAAE;IACdA,SAAS,GAAGF,qBAAqB,CAACC,WAAW,CAAC;EAChD;EAEA,OAAO;IACLqB,GAAG,EAAE;MAAE,GAAG2E,eAAe;MAAEC,UAAU;MAAEhG;IAAU,CAAC;IAClDqB,GAAG,EAAEqE;EACP,CAAC;AACH;AAEA,MAAMS,kBAAkB,GAAG,WAAW;AAE/B,SAASC,gBAAgBA,CAACpH,MAA8B,GAAG,CAAC,CAAC,EAAU;EAC5E,IAAIqH,OAAO,CAACC,GAAG,CAACC,yBAAyB,EAAE;IACzC,OAAOF,OAAO,CAACC,GAAG,CAACC,yBAAyB;EAC9C;EACA,MAAMtH,IAAI,GAAGD,MAAM,CAACC,IAAI,IAAID,MAAM,IAAI,CAAC,CAAC;EACxC,OAAOC,IAAI,EAAEuH,GAAG,EAAEC,KAAK,EAAEC,MAAM,IAAIP,kBAAkB;AACvD;AAEO,SAASQ,iBAAiBA,CAACvF,GAAwB,GAAG,CAAC,CAAC,EAG7D;EACA;EACA,MAAMwF,WAAW,GAAGxF,GAAG,CAACnC,IAAI,IAAImC,GAAG;EACnC,MAAM;IAAEoF,GAAG,GAAG,CAAC;EAAE,CAAC,GAAGI,WAAW;;EAEhC;EACA,MAAMC,OAAO,GAAGzF,GAAG,CAAC0F,WAAW,IAAIF,WAAW,CAACE,WAAW,IAAIF,WAAW,CAACtB,IAAI;EAC9E,MAAMyB,OAAO,GAAGP,GAAG,CAAClB,IAAI,IAAIuB,OAAO;EAEnC,OAAO;IACLA,OAAO;IACPE;EACF,CAAC;AACH;AAEO,SAASC,gBAAgBA,CAC9BjH,WAAmB,EACnBqB,GAAoC,EACrB;EACfA,GAAG,KAAKjB,SAAS,CAACJ,WAAW,EAAE;IAAEuB,yBAAyB,EAAE;EAAK,CAAC,CAAC,CAACF,GAAG;;EAEvE;EACA,IAAIA,GAAG,CAAC4E,UAAU,IAAI5E,GAAG,CAAC4E,UAAU,KAAK,aAAa,IAAIiB,iBAAM,CAACC,EAAE,CAAC9F,GAAG,CAAC4E,UAAU,EAAE,QAAQ,CAAC,EAAE;IAC7F,OAAO,SAAS;EAClB;EACA,OAAOmB,qBAAqB,CAACpH,WAAW,CAAC,GAAG,MAAM,GAAG,SAAS;AAChE;AAEA,SAASoH,qBAAqBA,CAACpH,WAAmB,EAAW;EAC3D,MAAM,CAACsB,GAAG,CAAC,GAAGP,qBAAqB,CAACf,WAAW,CAAC;;EAEhD;EACA,IAAIsB,GAAG,CAAC+F,YAAY,IAAI/F,GAAG,CAAC+F,YAAY,CAACC,OAAO,EAAE;IAChD,OAAO,KAAK;EACd;EAEA,MAAMC,cAAc,GAAG,IAAAC,YAAQ,EAAC,oBAAoB,EAAE;IACpDC,QAAQ,EAAE,IAAI;IACdC,GAAG,EAAE1H;EACP,CAAC,CAAC;EACF,IAAIuH,cAAc,CAACnI,MAAM,EAAE;IACzB,OAAO,IAAI;EACb;EACA,MAAMuI,WAAW,GAAG,IAAAH,YAAQ,EAAC,qBAAqB,EAAE;IAClDC,QAAQ,EAAE,IAAI;IACdC,GAAG,EAAE1H;EACP,CAAC,CAAC;EACF,IAAI2H,WAAW,CAACvI,MAAM,EAAE;IACtB,OAAO,IAAI;EACb;EAEA,OAAO,KAAK;AACd;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACO,SAASwI,2BAA2BA,CAAC5H,WAAmB,EAAU;EACvE,MAAMM,KAAK,GAAGC,kBAAkB,CAACP,WAAW,CAAC;EAC7C,OAAO6H,oCAAoC,CAAC7H,WAAW,EAAEM,KAAK,CAAC;AACjE;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACO,SAASuH,oCAAoCA,CAClD7H,WAAmB,EACnB8H,aAA8B,EACtB;EACR,IAAIA,aAAa,CAACtG,iBAAiB,EAAE;IACnC,MAAMuG,yBAAyB,GAAGpE,eAAI,CAACK,QAAQ,CAAChE,WAAW,EAAE8H,aAAa,CAACtG,iBAAiB,CAAC;IAC7F,IAAIsG,aAAa,CAACrH,gBAAgB,EAAE;MAClC,OAAO,GAAGsH,yBAAyB,OAAOpE,eAAI,CAACK,QAAQ,CACrDhE,WAAW,EACX8H,aAAa,CAACrH,gBAChB,CAAC,EAAE;IACL;IACA,OAAOsH,yBAAyB;EAClC,CAAC,MAAM,IAAID,aAAa,CAACrH,gBAAgB,EAAE;IACzC,OAAOkD,eAAI,CAACK,QAAQ,CAAChE,WAAW,EAAE8H,aAAa,CAACrH,gBAAgB,CAAC;EACnE;EACA;EACA,OAAO,UAAU;AACnB","ignoreList":[]} \ No newline at end of file diff --git a/packages/@expo/config/src/Config.ts b/packages/@expo/config/src/Config.ts index 72f900ef39babf..1f73fd7181b471 100644 --- a/packages/@expo/config/src/Config.ts +++ b/packages/@expo/config/src/Config.ts @@ -3,7 +3,6 @@ import type { JSONObject } from '@expo/json-file'; import JsonFile from '@expo/json-file'; import { resolveFrom } from '@expo/require-utils'; import deepMerge from 'deepmerge'; -import fs from 'fs'; import { sync as globSync } from 'glob'; import path from 'path'; import semver from 'semver'; @@ -243,30 +242,11 @@ export function getConfigFilePaths(projectRoot: string): ConfigFilePaths { const DYNAMIC_CONFIG_EXTS = ['.ts', '.mts', '.cts', '.mjs', '.cjs', '.js']; function getDynamicConfigFilePath(projectRoot: string): string | null { - const fileNames = DYNAMIC_CONFIG_EXTS.map((ext) => `app.config${ext}`); - for (const fileName of fileNames) { - const configPath = path.join(projectRoot, fileName); - try { - const stat = fs.statSync(configPath); - if (stat.isFile()) { - return configPath; - } - } catch {} - } - return null; + return resolveFrom(projectRoot, './app.config', { extensions: DYNAMIC_CONFIG_EXTS }); } function getStaticConfigFilePath(projectRoot: string): string | null { - for (const fileName of ['app.config.json', 'app.json']) { - const configPath = path.join(projectRoot, fileName); - try { - const stat = fs.statSync(configPath); - if (stat.isFile()) { - return configPath; - } - } catch {} - } - return null; + return resolveFrom(projectRoot, './app.config.json') ?? resolveFrom(projectRoot, './app.json'); } /** diff --git a/packages/@expo/require-utils/CHANGELOG.md b/packages/@expo/require-utils/CHANGELOG.md index 52a32b84b85d17..3bc1444e81ccc1 100644 --- a/packages/@expo/require-utils/CHANGELOG.md +++ b/packages/@expo/require-utils/CHANGELOG.md @@ -6,10 +6,14 @@ ### 🎉 New features +- Add special case for file specifiers, like relative and absolute paths, to `resolveFrom` ([#45983](https://github.com/expo/expo/pull/45983) by [@kitten](https://github.com/kitten)) + ### 🐛 Bug fixes ### 💡 Others +- Add `/index` Node resolution logic for non-JSON `resolveFrom` calls ([#45983](https://github.com/expo/expo/pull/45983) by [@kitten](https://github.com/kitten)) + ## 56.1.1 — 2026-05-15 ### 🐛 Bug fixes diff --git a/packages/@expo/require-utils/build/resolve.js b/packages/@expo/require-utils/build/resolve.js index e9dc800c1e10b5..ffb333899df952 100644 --- a/packages/@expo/require-utils/build/resolve.js +++ b/packages/@expo/require-utils/build/resolve.js @@ -32,9 +32,11 @@ function resolveFrom(fromDirectory, moduleId, params) { const exts = !isJSON ? params?.extensions ?? Object.keys(_nodeModule().default._extensions) : []; const skipNodePath = !!params?.skipNodePath; const followSymlinks = params?.followSymlinks ?? skipNodePath; - const resolved = _nodePath().default.resolve(fromDirectory, moduleId); + let resolved = _nodePath().default.resolve(fromDirectory, moduleId); + // (1) check direct path / exact match - if (_nodeFs().default.existsSync(resolved)) { + const resolveType = resolveTypeSync(resolved); + if (resolveType === ResolveType.FILE) { return resolved; } @@ -42,29 +44,67 @@ function resolveFrom(fromDirectory, moduleId, params) { for (let ext of exts) { ext = ext[0] !== '.' ? `.${ext}` : ext; const withExt = resolved + ext; - if (_nodeFs().default.existsSync(withExt)) { + if (resolveTypeSync(withExt) === ResolveType.FILE) { return withExt; } } + const isFileSpecifier = /^\.\.?(?:$|[/\\])/.test(moduleId) || _nodePath().default.isAbsolute(moduleId); + + // (2.2) check against `/index` paths if we've disabled Node resolution or if we're resolving a relative path directly + if ((isFileSpecifier || skipNodePath) && !isJSON && resolveType === ResolveType.DIR) { + resolved = _nodePath().default.join(resolved, 'index'); + for (let ext of exts) { + ext = ext[0] !== '.' ? `.${ext}` : ext; + const withExt = resolved + ext; + if (resolveTypeSync(withExt) === ResolveType.FILE) { + // NOTE(@kitten): Like above, we don't resolve symlinks when we're not in a node_modules resolution path + return withExt; + } + } + } + + // We won't need to continue with Node resolution if we're only resolving paths + if (isFileSpecifier) { + return null; + } // (3) if we're not following symlinks, we try to resolve against `node_modules` folders unresolved if (!followSymlinks || skipNodePath) { const resolvedDir = _nodePath().default.resolve(fromDirectory); const moduleDirs = _nodeModule().default._nodeModulePaths(resolvedDir); for (const modulesDir of moduleDirs) { - const candidate = _nodePath().default.join(modulesDir, moduleId); + let candidate = _nodePath().default.join(modulesDir, moduleId); + const resolveType = resolveTypeSync(candidate); // (3.1) direct match - if (_nodeFs().default.existsSync(candidate)) { + if (resolveType === ResolveType.FILE) { return candidate; + } else if (resolveType === ResolveType.ENOENT) { + // Optimization: If the directory itself doesn't exist, there's no point in us continuing + // to check for more files in this directory + const dirname = _nodePath().default.dirname(candidate); + if (dirname !== modulesDir && !_nodeFs().default.existsSync(dirname)) { + continue; + } } // (3.2) check against match with extensions for (let ext of exts) { ext = ext[0] !== '.' ? `.${ext}` : ext; const candidateWithExt = candidate + ext; - if (_nodeFs().default.existsSync(candidateWithExt)) { + if (resolveTypeSync(candidateWithExt) === ResolveType.FILE) { return followSymlinks ? maybeResolve(candidateWithExt) : candidateWithExt; } } + // (3.3) check against `/index` paths + if (!isJSON && resolveType === ResolveType.DIR) { + candidate = _nodePath().default.join(candidate, 'index'); + for (let ext of exts) { + ext = ext[0] !== '.' ? `.${ext}` : ext; + const candidateWithExt = candidate + ext; + if (resolveTypeSync(candidateWithExt) === ResolveType.FILE) { + return followSymlinks ? maybeResolve(candidateWithExt) : candidateWithExt; + } + } + } } } @@ -84,6 +124,47 @@ function nativeResolveFrom(fromDirectory, moduleId) { return null; } } +function isRealpathFileSync(target) { + try { + const realpath = _nodeFs().default.realpathSync(target); + return !!_nodeFs().default.lstatSync(realpath, { + throwIfNoEntry: false + })?.isFile(); + } catch { + return false; + } +} +var ResolveType = /*#__PURE__*/function (ResolveType) { + ResolveType[ResolveType["FILE"] = 1] = "FILE"; + ResolveType[ResolveType["DIR"] = 2] = "DIR"; + ResolveType[ResolveType["ENOENT"] = 0] = "ENOENT"; + return ResolveType; +}(ResolveType || {}); +function resolveTypeSync(target) { + try { + const stat = _nodeFs().default.lstatSync(target, { + throwIfNoEntry: false + }); + if (stat) { + if (stat.isSymbolicLink()) { + return isRealpathFileSync(target) ? ResolveType.FILE : ResolveType.ENOENT; + } else if (stat.isFile()) { + return ResolveType.FILE; + } else if (stat.isDirectory()) { + // NOTE(@kitten): We don't support symlinked directories for resolution + // Realistically, when we disable Node resolution, symlinked directory resolution + // for `/index` is rare, and can be used to exploit symlinks + return ResolveType.DIR; + } else { + return ResolveType.ENOENT; + } + } else { + return ResolveType.ENOENT; + } + } catch { + return ResolveType.ENOENT; + } +} function maybeResolve(target) { target = _nodePath().default.resolve(process.cwd(), target); try { diff --git a/packages/@expo/require-utils/build/resolve.js.map b/packages/@expo/require-utils/build/resolve.js.map index 6bcfc57ba29aa8..ec5b6d50f7fe83 100644 --- a/packages/@expo/require-utils/build/resolve.js.map +++ b/packages/@expo/require-utils/build/resolve.js.map @@ -1 +1 @@ -{"version":3,"file":"resolve.js","names":["_nodeFs","data","_interopRequireDefault","require","_nodeModule","_nodePath","e","__esModule","default","resolveFrom","fromDirectory","moduleId","params","isJSON","endsWith","exts","extensions","Object","keys","Module","_extensions","skipNodePath","followSymlinks","resolved","path","resolve","fs","existsSync","ext","withExt","resolvedDir","moduleDirs","_nodeModulePaths","modulesDir","candidate","join","candidateWithExt","maybeResolve","nativeResolveFrom","fromFile","_resolveFilename","id","filename","paths","target","process","cwd","realpathSync"],"sources":["../src/resolve.ts"],"sourcesContent":["import fs from 'node:fs';\nimport Module from 'node:module';\nimport path from 'node:path';\n\ndeclare module 'node:module' {\n export function _nodeModulePaths(base: string): readonly string[];\n export function _resolveFilename(mod: string, parent?: Partial): string;\n export const _extensions: Record;\n}\n\nexport interface ResolveFromParams {\n followSymlinks?: boolean;\n skipNodePath?: boolean;\n extensions?: readonly string[];\n}\n\nexport function resolveFrom(\n fromDirectory: string,\n moduleId: string,\n params?: ResolveFromParams\n): string | null {\n // We exclude extension resolution, if we're resolving a plain JSON file\n const isJSON = moduleId.endsWith('.json');\n const exts = !isJSON ? (params?.extensions ?? Object.keys(Module._extensions)) : [];\n\n const skipNodePath = !!params?.skipNodePath;\n const followSymlinks = params?.followSymlinks ?? skipNodePath;\n\n const resolved = path.resolve(fromDirectory, moduleId);\n // (1) check direct path / exact match\n if (fs.existsSync(resolved)) {\n return resolved;\n }\n\n // (2) check against direct path matches with extensions\n for (let ext of exts) {\n ext = ext[0] !== '.' ? `.${ext}` : ext;\n const withExt = resolved + ext;\n if (fs.existsSync(withExt)) {\n return withExt;\n }\n }\n\n // (3) if we're not following symlinks, we try to resolve against `node_modules` folders unresolved\n if (!followSymlinks || skipNodePath) {\n const resolvedDir = path.resolve(fromDirectory);\n const moduleDirs = Module._nodeModulePaths(resolvedDir);\n for (const modulesDir of moduleDirs) {\n const candidate = path.join(modulesDir, moduleId);\n // (3.1) direct match\n if (fs.existsSync(candidate)) {\n return candidate;\n }\n // (3.2) check against match with extensions\n for (let ext of exts) {\n ext = ext[0] !== '.' ? `.${ext}` : ext;\n const candidateWithExt = candidate + ext;\n if (fs.existsSync(candidateWithExt)) {\n return followSymlinks ? maybeResolve(candidateWithExt) : candidateWithExt;\n }\n }\n }\n }\n\n // (4): Fallback to native Node resolution, if `skipNodePath` is disabled\n return !skipNodePath ? nativeResolveFrom(fromDirectory, moduleId) : null;\n}\n\nfunction nativeResolveFrom(fromDirectory: string, moduleId: string): string | null {\n try {\n const resolvedDir = maybeResolve(fromDirectory);\n const fromFile = path.join(resolvedDir, 'index.js');\n return Module._resolveFilename(moduleId, {\n id: fromFile,\n filename: fromFile,\n paths: [...Module._nodeModulePaths(resolvedDir)],\n });\n } catch {\n return null;\n }\n}\n\nfunction maybeResolve(target: string): string {\n target = path.resolve(process.cwd(), target);\n try {\n return fs.realpathSync(target);\n } catch {\n return target;\n }\n}\n"],"mappings":"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","ignoreList":[]} \ No newline at end of file +{"version":3,"file":"resolve.js","names":["_nodeFs","data","_interopRequireDefault","require","_nodeModule","_nodePath","e","__esModule","default","resolveFrom","fromDirectory","moduleId","params","isJSON","endsWith","exts","extensions","Object","keys","Module","_extensions","skipNodePath","followSymlinks","resolved","path","resolve","resolveType","resolveTypeSync","ResolveType","FILE","ext","withExt","isFileSpecifier","test","isAbsolute","DIR","join","resolvedDir","moduleDirs","_nodeModulePaths","modulesDir","candidate","ENOENT","dirname","fs","existsSync","candidateWithExt","maybeResolve","nativeResolveFrom","fromFile","_resolveFilename","id","filename","paths","isRealpathFileSync","target","realpath","realpathSync","lstatSync","throwIfNoEntry","isFile","stat","isSymbolicLink","isDirectory","process","cwd"],"sources":["../src/resolve.ts"],"sourcesContent":["import fs from 'node:fs';\nimport Module from 'node:module';\nimport path from 'node:path';\n\ndeclare module 'node:module' {\n export function _nodeModulePaths(base: string): readonly string[];\n export function _resolveFilename(mod: string, parent?: Partial): string;\n export const _extensions: Record;\n}\n\nexport interface ResolveFromParams {\n followSymlinks?: boolean;\n skipNodePath?: boolean;\n extensions?: readonly string[];\n}\n\nexport function resolveFrom(\n fromDirectory: string,\n moduleId: string,\n params?: ResolveFromParams\n): string | null {\n // We exclude extension resolution, if we're resolving a plain JSON file\n const isJSON = moduleId.endsWith('.json');\n const exts = !isJSON ? (params?.extensions ?? Object.keys(Module._extensions)) : [];\n\n const skipNodePath = !!params?.skipNodePath;\n const followSymlinks = params?.followSymlinks ?? skipNodePath;\n\n let resolved = path.resolve(fromDirectory, moduleId);\n\n // (1) check direct path / exact match\n const resolveType = resolveTypeSync(resolved);\n if (resolveType === ResolveType.FILE) {\n return resolved;\n }\n\n // (2) check against direct path matches with extensions\n for (let ext of exts) {\n ext = ext[0] !== '.' ? `.${ext}` : ext;\n const withExt = resolved + ext;\n if (resolveTypeSync(withExt) === ResolveType.FILE) {\n return withExt;\n }\n }\n\n const isFileSpecifier = /^\\.\\.?(?:$|[/\\\\])/.test(moduleId) || path.isAbsolute(moduleId);\n\n // (2.2) check against `/index` paths if we've disabled Node resolution or if we're resolving a relative path directly\n if ((isFileSpecifier || skipNodePath) && !isJSON && resolveType === ResolveType.DIR) {\n resolved = path.join(resolved, 'index');\n for (let ext of exts) {\n ext = ext[0] !== '.' ? `.${ext}` : ext;\n const withExt = resolved + ext;\n if (resolveTypeSync(withExt) === ResolveType.FILE) {\n // NOTE(@kitten): Like above, we don't resolve symlinks when we're not in a node_modules resolution path\n return withExt;\n }\n }\n }\n\n // We won't need to continue with Node resolution if we're only resolving paths\n if (isFileSpecifier) {\n return null;\n }\n\n // (3) if we're not following symlinks, we try to resolve against `node_modules` folders unresolved\n if (!followSymlinks || skipNodePath) {\n const resolvedDir = path.resolve(fromDirectory);\n const moduleDirs = Module._nodeModulePaths(resolvedDir);\n for (const modulesDir of moduleDirs) {\n let candidate = path.join(modulesDir, moduleId);\n const resolveType = resolveTypeSync(candidate);\n // (3.1) direct match\n if (resolveType === ResolveType.FILE) {\n return candidate;\n } else if (resolveType === ResolveType.ENOENT) {\n // Optimization: If the directory itself doesn't exist, there's no point in us continuing\n // to check for more files in this directory\n const dirname = path.dirname(candidate);\n if (dirname !== modulesDir && !fs.existsSync(dirname)) {\n continue;\n }\n }\n // (3.2) check against match with extensions\n for (let ext of exts) {\n ext = ext[0] !== '.' ? `.${ext}` : ext;\n const candidateWithExt = candidate + ext;\n if (resolveTypeSync(candidateWithExt) === ResolveType.FILE) {\n return followSymlinks ? maybeResolve(candidateWithExt) : candidateWithExt;\n }\n }\n // (3.3) check against `/index` paths\n if (!isJSON && resolveType === ResolveType.DIR) {\n candidate = path.join(candidate, 'index');\n for (let ext of exts) {\n ext = ext[0] !== '.' ? `.${ext}` : ext;\n const candidateWithExt = candidate + ext;\n if (resolveTypeSync(candidateWithExt) === ResolveType.FILE) {\n return followSymlinks ? maybeResolve(candidateWithExt) : candidateWithExt;\n }\n }\n }\n }\n }\n\n // (4): Fallback to native Node resolution, if `skipNodePath` is disabled\n return !skipNodePath ? nativeResolveFrom(fromDirectory, moduleId) : null;\n}\n\nfunction nativeResolveFrom(fromDirectory: string, moduleId: string): string | null {\n try {\n const resolvedDir = maybeResolve(fromDirectory);\n const fromFile = path.join(resolvedDir, 'index.js');\n return Module._resolveFilename(moduleId, {\n id: fromFile,\n filename: fromFile,\n paths: [...Module._nodeModulePaths(resolvedDir)],\n });\n } catch {\n return null;\n }\n}\n\nfunction isRealpathFileSync(target: string): boolean {\n try {\n const realpath = fs.realpathSync(target);\n return !!fs.lstatSync(realpath, { throwIfNoEntry: false })?.isFile();\n } catch {\n return false;\n }\n}\n\nconst enum ResolveType {\n FILE = 1,\n DIR = 2,\n ENOENT = 0,\n}\n\nfunction resolveTypeSync(target: string): ResolveType {\n try {\n const stat = fs.lstatSync(target, { throwIfNoEntry: false });\n if (stat) {\n if (stat.isSymbolicLink()) {\n return isRealpathFileSync(target) ? ResolveType.FILE : ResolveType.ENOENT;\n } else if (stat.isFile()) {\n return ResolveType.FILE;\n } else if (stat.isDirectory()) {\n // NOTE(@kitten): We don't support symlinked directories for resolution\n // Realistically, when we disable Node resolution, symlinked directory resolution\n // for `/index` is rare, and can be used to exploit symlinks\n return ResolveType.DIR;\n } else {\n return ResolveType.ENOENT;\n }\n } else {\n return ResolveType.ENOENT;\n }\n } catch {\n return ResolveType.ENOENT;\n }\n}\n\nfunction maybeResolve(target: string): string {\n target = path.resolve(process.cwd(), target);\n try {\n return fs.realpathSync(target);\n } catch {\n return target;\n }\n}\n"],"mappings":"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","ignoreList":[]} \ No newline at end of file diff --git a/packages/@expo/require-utils/src/__tests__/resolve-test.ts b/packages/@expo/require-utils/src/__tests__/resolve-test.ts new file mode 100644 index 00000000000000..2d8a35ba6982e5 --- /dev/null +++ b/packages/@expo/require-utils/src/__tests__/resolve-test.ts @@ -0,0 +1,323 @@ +import { vol } from 'memfs'; +import Module from 'node:module'; + +import { resolveFrom } from '../resolve'; + +beforeEach(() => { + vol.reset(); +}); + +describe('direct path resolution', () => { + it('returns the exact resolved path when the file exists', () => { + vol.fromJSON({ '/proj/a.js': '' }); + expect(resolveFrom('/proj', './a.js')).toBe('/proj/a.js'); + }); + + it('resolves moduleId relative to fromDirectory', () => { + vol.fromJSON({ '/proj/sub/a.js': '' }); + expect(resolveFrom('/proj/sub', './a.js')).toBe('/proj/sub/a.js'); + }); + + it('resolves a parent-relative specifier', () => { + vol.fromJSON({ '/proj/a.js': '' }); + expect(resolveFrom('/proj/sub', '../a.js')).toBe('/proj/a.js'); + }); + + it('accepts an absolute moduleId', () => { + vol.fromJSON({ '/abs/a.js': '' }); + expect(resolveFrom('/proj', '/abs/a.js')).toBe('/abs/a.js'); + }); + + it('does not return a directory as a direct match', () => { + vol.fromJSON({ '/proj/dir/keep': '' }); + expect(resolveFrom('/proj', './dir')).toBeNull(); + }); +}); + +describe('extension fallback', () => { + it('appends each provided extension and returns the first match', () => { + vol.fromJSON({ '/proj/a.js': '' }); + expect(resolveFrom('/proj', './a', { extensions: ['.ts', '.js'] })).toBe('/proj/a.js'); + }); + + it('respects the order of the provided extensions', () => { + vol.fromJSON({ '/proj/a.ts': '', '/proj/a.js': '' }); + expect(resolveFrom('/proj', './a', { extensions: ['.ts', '.js'] })).toBe('/proj/a.ts'); + expect(resolveFrom('/proj', './a', { extensions: ['.js', '.ts'] })).toBe('/proj/a.js'); + }); + + it('normalizes extensions that omit the leading dot', () => { + vol.fromJSON({ '/proj/a.ts': '' }); + expect(resolveFrom('/proj', './a', { extensions: ['ts'] })).toBe('/proj/a.ts'); + }); + + it('falls back to default extensions when none are provided', () => { + vol.fromJSON({ '/proj/a.js': '' }); + expect(Object.keys(Module._extensions)).toContain('.js'); + expect(resolveFrom('/proj', './a')).toBe('/proj/a.js'); + }); + + it('returns null for an unresolved file specifier with no extension match', () => { + vol.fromJSON({ '/proj/a.ts': '' }); + expect(resolveFrom('/proj', './a', { extensions: ['.js'] })).toBeNull(); + }); + + it('accepts an empty extensions array', () => { + vol.fromJSON({ '/proj/a.js': '' }); + expect(resolveFrom('/proj', './a', { extensions: [] })).toBeNull(); + expect(resolveFrom('/proj', './a.js', { extensions: [] })).toBe('/proj/a.js'); + }); +}); + +describe('/index fallback for file specifiers', () => { + it('returns /index. when the file specifier resolves to a directory', () => { + vol.fromJSON({ '/proj/pkg/index.js': '' }); + expect(resolveFrom('/proj', './pkg')).toBe('/proj/pkg/index.js'); + }); + + it('returns the /index file for moduleId "."', () => { + vol.fromJSON({ '/proj/index.js': '' }); + expect(resolveFrom('/proj', '.')).toBe('/proj/index.js'); + }); + + it('returns the /index file for moduleId ".."', () => { + vol.fromJSON({ '/index.js': '' }); + expect(resolveFrom('/proj', '..')).toBe('/index.js'); + }); + + it('returns the /index file for an absolute directory moduleId', () => { + vol.fromJSON({ '/abs/pkg/index.js': '' }); + expect(resolveFrom('/proj', '/abs/pkg')).toBe('/abs/pkg/index.js'); + }); + + it('honors the order of extensions for /index resolution', () => { + vol.fromJSON({ '/proj/pkg/index.ts': '', '/proj/pkg/index.js': '' }); + expect(resolveFrom('/proj', './pkg', { extensions: ['.ts', '.js'] })).toBe( + '/proj/pkg/index.ts' + ); + expect(resolveFrom('/proj', './pkg', { extensions: ['.js', '.ts'] })).toBe( + '/proj/pkg/index.js' + ); + }); + + it('does not try /index when the directory does not exist', () => { + vol.fromJSON({ '/proj/keep': '' }); + expect(resolveFrom('/proj', './missing')).toBeNull(); + }); + + it('does not try /index for .json moduleIds', () => { + vol.fromJSON({ '/proj/pkg/index.json': '' }); + expect(resolveFrom('/proj', './pkg.json')).toBeNull(); + }); + + it('tries /index when skipNodePath is enabled even for non-file specifiers', () => { + vol.fromJSON({ '/proj/pkg/index.js': '' }); + expect(resolveFrom('/proj', 'pkg', { skipNodePath: true })).toBe('/proj/pkg/index.js'); + }); +}); + +describe('file specifier short-circuit', () => { + it('returns null for relative specifiers that miss, without consulting node_modules', () => { + vol.fromJSON({ '/proj/node_modules/missing/index.js': '' }); + expect(resolveFrom('/proj', './missing')).toBeNull(); + }); + + it('returns null for absolute specifiers that miss, without consulting node_modules', () => { + vol.fromJSON({ '/proj/node_modules/missing/index.js': '' }); + expect(resolveFrom('/proj', '/absent/missing')).toBeNull(); + }); +}); + +describe('node_modules walking', () => { + it('resolves a bare specifier with an extension from node_modules', () => { + vol.fromJSON({ '/proj/node_modules/pkg.js': '' }); + expect(resolveFrom('/proj', 'pkg')).toBe('/proj/node_modules/pkg.js'); + }); + + it('resolves the /index file of a package directory from node_modules', () => { + vol.fromJSON({ '/proj/node_modules/pkg/index.js': '' }); + expect(resolveFrom('/proj', 'pkg')).toBe('/proj/node_modules/pkg/index.js'); + }); + + it('resolves a subpath inside a package', () => { + vol.fromJSON({ '/proj/node_modules/pkg/sub.js': '' }); + expect(resolveFrom('/proj', 'pkg/sub')).toBe('/proj/node_modules/pkg/sub.js'); + }); + + it('resolves a subpath /index inside a package', () => { + vol.fromJSON({ '/proj/node_modules/pkg/sub/index.js': '' }); + expect(resolveFrom('/proj', 'pkg/sub')).toBe('/proj/node_modules/pkg/sub/index.js'); + }); + + it('resolves a scoped package', () => { + vol.fromJSON({ '/proj/node_modules/@scope/pkg/index.js': '' }); + expect(resolveFrom('/proj', '@scope/pkg')).toBe('/proj/node_modules/@scope/pkg/index.js'); + }); + + it('walks up to ancestor node_modules folders', () => { + vol.fromJSON({ '/proj/sub/dir/keep': '', '/node_modules/pkg/index.js': '' }); + expect(resolveFrom('/proj/sub/dir', 'pkg')).toBe('/node_modules/pkg/index.js'); + }); + + it('returns the direct file match path as-is', () => { + vol.fromJSON({ '/proj/node_modules/pkg': '' }); + expect(resolveFrom('/proj', 'pkg')).toBe('/proj/node_modules/pkg'); + }); + + it('does not /index-resolve inside node_modules for .json moduleIds', () => { + vol.fromJSON({ '/proj/node_modules/pkg/index.json': '' }); + expect(resolveFrom('/proj', 'pkg.json')).toBeNull(); + }); + + it('skips node_modules walking when followSymlinks is true and skipNodePath is false', () => { + vol.fromJSON({ '/proj/node_modules/pkg/index.js': '' }); + const spy = jest.spyOn(Module, '_resolveFilename').mockReturnValue('/native'); + try { + expect(resolveFrom('/proj', 'pkg', { followSymlinks: true })).toBe('/native'); + } finally { + spy.mockRestore(); + } + }); + + it('walks node_modules when followSymlinks is true and skipNodePath is true', () => { + vol.fromJSON({ '/proj/node_modules/pkg/index.js': '' }); + expect(resolveFrom('/proj', 'pkg', { followSymlinks: true, skipNodePath: true })).toBe( + '/proj/node_modules/pkg/index.js' + ); + }); +}); + +describe('followSymlinks option', () => { + it('returns the symlinked extension match when followSymlinks is false', () => { + vol.fromJSON({ '/real/pkg.js': '' }); + vol.mkdirSync('/proj/node_modules', { recursive: true }); + vol.symlinkSync('/real/pkg.js', '/proj/node_modules/pkg.js'); + expect(resolveFrom('/proj', 'pkg', { followSymlinks: false, skipNodePath: true })).toBe( + '/proj/node_modules/pkg.js' + ); + }); + + it('returns the realpath of an extension match when followSymlinks is true', () => { + vol.fromJSON({ '/real/pkg.js': '' }); + vol.mkdirSync('/proj/node_modules', { recursive: true }); + vol.symlinkSync('/real/pkg.js', '/proj/node_modules/pkg.js'); + expect(resolveFrom('/proj', 'pkg', { followSymlinks: true, skipNodePath: true })).toBe( + '/real/pkg.js' + ); + }); + + it('returns the realpath of an /index match in node_modules when followSymlinks is true', () => { + vol.fromJSON({ '/real/index.js': '' }); + vol.mkdirSync('/proj/node_modules/pkg', { recursive: true }); + vol.symlinkSync('/real/index.js', '/proj/node_modules/pkg/index.js'); + expect(resolveFrom('/proj', 'pkg', { followSymlinks: true, skipNodePath: true })).toBe( + '/real/index.js' + ); + }); + + it('does not realpath /index matches in the file specifier path', () => { + vol.fromJSON({ '/real/index.js': '' }); + vol.mkdirSync('/proj/pkg', { recursive: true }); + vol.symlinkSync('/real/index.js', '/proj/pkg/index.js'); + expect(resolveFrom('/proj', './pkg', { followSymlinks: true })).toBe('/proj/pkg/index.js'); + }); + + it('defaults followSymlinks to the resolved skipNodePath value', () => { + vol.fromJSON({ '/real/pkg.js': '' }); + vol.mkdirSync('/proj/node_modules', { recursive: true }); + vol.symlinkSync('/real/pkg.js', '/proj/node_modules/pkg.js'); + expect(resolveFrom('/proj', 'pkg', { skipNodePath: true })).toBe('/real/pkg.js'); + }); +}); + +describe('JSON handling', () => { + it('resolves a .json file by exact path without trying extensions', () => { + vol.fromJSON({ '/proj/a.json': '' }); + expect(resolveFrom('/proj', './a.json')).toBe('/proj/a.json'); + }); + + it('does not append extensions for .json moduleIds', () => { + vol.fromJSON({ '/proj/a.json.js': '' }); + expect(resolveFrom('/proj', './a.json')).toBeNull(); + }); + + it('resolves a .json file from node_modules', () => { + vol.fromJSON({ '/proj/node_modules/pkg/data.json': '' }); + expect(resolveFrom('/proj', 'pkg/data.json')).toBe('/proj/node_modules/pkg/data.json'); + }); + + it('allows skipNodePath=false to consult native resolution for /package.json', () => { + const spy = jest.spyOn(Module, '_resolveFilename').mockReturnValue('/native/pkg/package.json'); + try { + expect(resolveFrom('/proj', 'pkg/package.json', { skipNodePath: false })).toBe( + '/native/pkg/package.json' + ); + } finally { + spy.mockRestore(); + } + }); + + it('keeps skipNodePath at false for bare .json moduleIds without a /package.json suffix', () => { + const spy = jest.spyOn(Module, '_resolveFilename').mockReturnValue('/native/a.json'); + try { + expect(resolveFrom('/proj', 'a.json')).toBe('/native/a.json'); + } finally { + spy.mockRestore(); + } + }); +}); + +describe('native Node fallback', () => { + it('invokes Module._resolveFilename when internal lookup fails', () => { + const spy = jest.spyOn(Module, '_resolveFilename').mockReturnValue('/native/pkg.js'); + try { + expect(resolveFrom('/proj', 'pkg')).toBe('/native/pkg.js'); + expect(spy).toHaveBeenCalledTimes(1); + } finally { + spy.mockRestore(); + } + }); + + it('returns null when Module._resolveFilename throws', () => { + const spy = jest.spyOn(Module, '_resolveFilename').mockImplementation(() => { + throw new Error('MODULE_NOT_FOUND'); + }); + try { + expect(resolveFrom('/proj', 'pkg')).toBeNull(); + } finally { + spy.mockRestore(); + } + }); + + it('skips the native fallback when skipNodePath is true', () => { + const spy = jest.spyOn(Module, '_resolveFilename'); + try { + expect(resolveFrom('/proj', 'pkg', { skipNodePath: true })).toBeNull(); + expect(spy).not.toHaveBeenCalled(); + } finally { + spy.mockRestore(); + } + }); +}); + +describe('symlink type detection', () => { + it('treats a symlink-to-file as a file in the direct match path', () => { + vol.fromJSON({ '/real/a.js': '' }); + vol.mkdirSync('/proj', { recursive: true }); + vol.symlinkSync('/real/a.js', '/proj/a.js'); + expect(resolveFrom('/proj', './a.js')).toBe('/proj/a.js'); + }); + + it('treats a symlink-to-directory as not existing for /index fallback', () => { + vol.fromJSON({ '/real/pkg/index.js': '' }); + vol.mkdirSync('/proj', { recursive: true }); + vol.symlinkSync('/real/pkg', '/proj/pkg'); + expect(resolveFrom('/proj', './pkg')).toBeNull(); + }); + + it('treats a broken symlink as not existing', () => { + vol.mkdirSync('/proj', { recursive: true }); + vol.symlinkSync('/real/missing.js', '/proj/a.js'); + expect(resolveFrom('/proj', './a.js')).toBeNull(); + }); +}); diff --git a/packages/@expo/require-utils/src/resolve.ts b/packages/@expo/require-utils/src/resolve.ts index a96beb9289a5a8..b4ded23dd03517 100644 --- a/packages/@expo/require-utils/src/resolve.ts +++ b/packages/@expo/require-utils/src/resolve.ts @@ -26,9 +26,11 @@ export function resolveFrom( const skipNodePath = !!params?.skipNodePath; const followSymlinks = params?.followSymlinks ?? skipNodePath; - const resolved = path.resolve(fromDirectory, moduleId); + let resolved = path.resolve(fromDirectory, moduleId); + // (1) check direct path / exact match - if (fs.existsSync(resolved)) { + const resolveType = resolveTypeSync(resolved); + if (resolveType === ResolveType.FILE) { return resolved; } @@ -36,29 +38,68 @@ export function resolveFrom( for (let ext of exts) { ext = ext[0] !== '.' ? `.${ext}` : ext; const withExt = resolved + ext; - if (fs.existsSync(withExt)) { + if (resolveTypeSync(withExt) === ResolveType.FILE) { return withExt; } } + const isFileSpecifier = /^\.\.?(?:$|[/\\])/.test(moduleId) || path.isAbsolute(moduleId); + + // (2.2) check against `/index` paths if we've disabled Node resolution or if we're resolving a relative path directly + if ((isFileSpecifier || skipNodePath) && !isJSON && resolveType === ResolveType.DIR) { + resolved = path.join(resolved, 'index'); + for (let ext of exts) { + ext = ext[0] !== '.' ? `.${ext}` : ext; + const withExt = resolved + ext; + if (resolveTypeSync(withExt) === ResolveType.FILE) { + // NOTE(@kitten): Like above, we don't resolve symlinks when we're not in a node_modules resolution path + return withExt; + } + } + } + + // We won't need to continue with Node resolution if we're only resolving paths + if (isFileSpecifier) { + return null; + } + // (3) if we're not following symlinks, we try to resolve against `node_modules` folders unresolved if (!followSymlinks || skipNodePath) { const resolvedDir = path.resolve(fromDirectory); const moduleDirs = Module._nodeModulePaths(resolvedDir); for (const modulesDir of moduleDirs) { - const candidate = path.join(modulesDir, moduleId); + let candidate = path.join(modulesDir, moduleId); + const resolveType = resolveTypeSync(candidate); // (3.1) direct match - if (fs.existsSync(candidate)) { + if (resolveType === ResolveType.FILE) { return candidate; + } else if (resolveType === ResolveType.ENOENT) { + // Optimization: If the directory itself doesn't exist, there's no point in us continuing + // to check for more files in this directory + const dirname = path.dirname(candidate); + if (dirname !== modulesDir && !fs.existsSync(dirname)) { + continue; + } } // (3.2) check against match with extensions for (let ext of exts) { ext = ext[0] !== '.' ? `.${ext}` : ext; const candidateWithExt = candidate + ext; - if (fs.existsSync(candidateWithExt)) { + if (resolveTypeSync(candidateWithExt) === ResolveType.FILE) { return followSymlinks ? maybeResolve(candidateWithExt) : candidateWithExt; } } + // (3.3) check against `/index` paths + if (!isJSON && resolveType === ResolveType.DIR) { + candidate = path.join(candidate, 'index'); + for (let ext of exts) { + ext = ext[0] !== '.' ? `.${ext}` : ext; + const candidateWithExt = candidate + ext; + if (resolveTypeSync(candidateWithExt) === ResolveType.FILE) { + return followSymlinks ? maybeResolve(candidateWithExt) : candidateWithExt; + } + } + } } } @@ -80,6 +121,45 @@ function nativeResolveFrom(fromDirectory: string, moduleId: string): string | nu } } +function isRealpathFileSync(target: string): boolean { + try { + const realpath = fs.realpathSync(target); + return !!fs.lstatSync(realpath, { throwIfNoEntry: false })?.isFile(); + } catch { + return false; + } +} + +const enum ResolveType { + FILE = 1, + DIR = 2, + ENOENT = 0, +} + +function resolveTypeSync(target: string): ResolveType { + try { + const stat = fs.lstatSync(target, { throwIfNoEntry: false }); + if (stat) { + if (stat.isSymbolicLink()) { + return isRealpathFileSync(target) ? ResolveType.FILE : ResolveType.ENOENT; + } else if (stat.isFile()) { + return ResolveType.FILE; + } else if (stat.isDirectory()) { + // NOTE(@kitten): We don't support symlinked directories for resolution + // Realistically, when we disable Node resolution, symlinked directory resolution + // for `/index` is rare, and can be used to exploit symlinks + return ResolveType.DIR; + } else { + return ResolveType.ENOENT; + } + } else { + return ResolveType.ENOENT; + } + } catch { + return ResolveType.ENOENT; + } +} + function maybeResolve(target: string): string { target = path.resolve(process.cwd(), target); try { diff --git a/packages/expo-app-metrics/android/src/main/java/expo/modules/appmetrics/AppMetricsModule.kt b/packages/expo-app-metrics/android/src/main/java/expo/modules/appmetrics/AppMetricsModule.kt index 7bf7fb5842676b..5c86ae62f37025 100644 --- a/packages/expo-app-metrics/android/src/main/java/expo/modules/appmetrics/AppMetricsModule.kt +++ b/packages/expo-app-metrics/android/src/main/java/expo/modules/appmetrics/AppMetricsModule.kt @@ -24,6 +24,7 @@ import expo.modules.kotlin.modules.Module import expo.modules.kotlin.modules.ModuleDefinition import expo.modules.kotlin.records.Field import expo.modules.kotlin.records.Record +import expo.modules.kotlin.types.OptimizedRecord import expo.modules.updatesinterface.UpdatesControllerRegistry import expo.modules.updatesinterface.UpdatesStateChangeListener import expo.modules.updatesinterface.UpdatesStateChangeSubscription @@ -209,6 +210,7 @@ class AppMetricsModule : Module(), UpdatesStateChangeListener { } } +@OptimizedRecord data class MetricAttributes( @Field val routeName: String? = null, @Field val params: Map? = null diff --git a/packages/expo-app-metrics/android/src/main/java/expo/modules/appmetrics/logevents/LogEventOptions.kt b/packages/expo-app-metrics/android/src/main/java/expo/modules/appmetrics/logevents/LogEventOptions.kt index 6ea78dbb19c5b7..8a0b4e08e0ac74 100644 --- a/packages/expo-app-metrics/android/src/main/java/expo/modules/appmetrics/logevents/LogEventOptions.kt +++ b/packages/expo-app-metrics/android/src/main/java/expo/modules/appmetrics/logevents/LogEventOptions.kt @@ -2,12 +2,14 @@ package expo.modules.appmetrics.logevents import expo.modules.kotlin.records.Field import expo.modules.kotlin.records.Record +import expo.modules.kotlin.types.OptimizedRecord /** * Options accepted by the `logEvent` module function. The event name is * passed as a separate positional argument and is therefore not part of this * record. */ +@OptimizedRecord data class LogEventOptions( @Field val body: String? = null, @Field val attributes: Map? = null, diff --git a/packages/expo-app-metrics/android/src/main/java/expo/modules/appmetrics/memory/MemoryMetricsManager.kt b/packages/expo-app-metrics/android/src/main/java/expo/modules/appmetrics/memory/MemoryMetricsManager.kt index 683fe56cae2fd9..5bb731772aba33 100644 --- a/packages/expo-app-metrics/android/src/main/java/expo/modules/appmetrics/memory/MemoryMetricsManager.kt +++ b/packages/expo-app-metrics/android/src/main/java/expo/modules/appmetrics/memory/MemoryMetricsManager.kt @@ -9,6 +9,7 @@ import expo.modules.appmetrics.storage.SessionManager import expo.modules.appmetrics.utils.TimeUtils import expo.modules.kotlin.records.Field import expo.modules.kotlin.records.Record +import expo.modules.kotlin.types.OptimizedRecord import kotlinx.serialization.Serializable class MemoryMetricsManager( @@ -42,6 +43,7 @@ class MemoryMetricsManager( } @Serializable +@OptimizedRecord data class MemoryUsageSnapshot( /** * Physical memory in bytes pages currently in use (resident size). diff --git a/packages/expo-app-metrics/android/src/main/java/expo/modules/appmetrics/storage/SessionMappers.kt b/packages/expo-app-metrics/android/src/main/java/expo/modules/appmetrics/storage/SessionMappers.kt index 6cdcf45579e894..0b4b66990f8736 100644 --- a/packages/expo-app-metrics/android/src/main/java/expo/modules/appmetrics/storage/SessionMappers.kt +++ b/packages/expo-app-metrics/android/src/main/java/expo/modules/appmetrics/storage/SessionMappers.kt @@ -4,6 +4,7 @@ import expo.modules.appmetrics.utils.JsonAny import expo.modules.appmetrics.utils.TimeUtils import expo.modules.kotlin.records.Field import expo.modules.kotlin.records.Record +import expo.modules.kotlin.types.OptimizedRecord import java.util.UUID import kotlinx.serialization.json.Json import kotlinx.serialization.json.JsonElement @@ -19,6 +20,7 @@ import kotlinx.serialization.json.JsonObject * should add a real `type` column and lifecycle hooks for * foreground/screen/custom sessions. */ +@OptimizedRecord data class JsSession( @Field val id: String, @Field val type: String, @@ -40,6 +42,7 @@ data class JsSession( } } +@OptimizedRecord data class JsMetric( @Field val sessionId: String, @Field val category: String, @@ -89,6 +92,7 @@ data class JsMetric( * `Session.logs` (so the parent ID is implicit), and the dropped-attribute * bookkeeping is only meaningful on the OTel wire payload. */ +@OptimizedRecord data class JsLogRecord( @Field val timestamp: String, @Field val name: String, diff --git a/packages/expo-app-metrics/build/types.d.ts b/packages/expo-app-metrics/build/types.d.ts index a32491608effad..4869826e2010b9 100644 --- a/packages/expo-app-metrics/build/types.d.ts +++ b/packages/expo-app-metrics/build/types.d.ts @@ -92,7 +92,7 @@ export interface Metric { name: string; value: number; sessionId: string; - routeName?: string; + routeName?: string | null; params?: Record; } export type MetricAttributes = { @@ -101,7 +101,7 @@ export type MetricAttributes = { * with a sensible default when omitted — for example, the TTI metric falls * back to the initial route name detected from the router. */ - routeName?: string; + routeName?: string | null; /** * Custom parameters to attach to the metric. */ diff --git a/packages/expo-app-metrics/build/types.d.ts.map b/packages/expo-app-metrics/build/types.d.ts.map index a4a60ae7dc31c6..c86ec9a3633229 100644 --- a/packages/expo-app-metrics/build/types.d.ts.map +++ b/packages/expo-app-metrics/build/types.d.ts.map @@ -1 +1 @@ -{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/packages/expo-app-metrics/src/types.ts b/packages/expo-app-metrics/src/types.ts index e8817ca703943c..02f926aa53f6f1 100644 --- a/packages/expo-app-metrics/src/types.ts +++ b/packages/expo-app-metrics/src/types.ts @@ -95,7 +95,7 @@ export interface Metric { name: string; value: number; sessionId: string; - routeName?: string; + routeName?: string | null; params?: Record; } @@ -105,7 +105,7 @@ export type MetricAttributes = { * with a sensible default when omitted — for example, the TTI metric falls * back to the initial route name detected from the router. */ - routeName?: string; + routeName?: string | null; /** * Custom parameters to attach to the metric. */ diff --git a/packages/expo-audio/android/src/main/java/expo/modules/audio/AudioRecords.kt b/packages/expo-audio/android/src/main/java/expo/modules/audio/AudioRecords.kt index c66ba7da6c7061..5157ef3b5f3a1c 100644 --- a/packages/expo-audio/android/src/main/java/expo/modules/audio/AudioRecords.kt +++ b/packages/expo-audio/android/src/main/java/expo/modules/audio/AudioRecords.kt @@ -124,6 +124,7 @@ enum class AudioStreamEncoding(val value: String) : Enumerable { INT16("int16") } +@OptimizedRecord class AudioStreamOptions : Record { @Field var sampleRate: Int = 48000 diff --git a/packages/expo-dev-launcher/CHANGELOG.md b/packages/expo-dev-launcher/CHANGELOG.md index 152564d852e652..fb9c0a24748d15 100644 --- a/packages/expo-dev-launcher/CHANGELOG.md +++ b/packages/expo-dev-launcher/CHANGELOG.md @@ -8,6 +8,8 @@ ### 🐛 Bug fixes +- [iOS] Apply dev launcher gesture and auto-launch settings immediately instead of requiring an app restart. ([#XXXXX](https://github.com/expo/expo/pull/XXXXX) by [@gabrieldonadel](https://github.com/gabrieldonadel)) ([#46000](https://github.com/expo/expo/pull/46000) by [@gabrieldonadel](https://github.com/gabrieldonadel)) + ### 💡 Others ## 56.0.12 — 2026-05-19 diff --git a/packages/expo-dev-launcher/ios/SwiftUI/DevLauncherViewModel.swift b/packages/expo-dev-launcher/ios/SwiftUI/DevLauncherViewModel.swift index 2b9d13290724dc..e99832621cf7d8 100644 --- a/packages/expo-dev-launcher/ios/SwiftUI/DevLauncherViewModel.swift +++ b/packages/expo-dev-launcher/ios/SwiftUI/DevLauncherViewModel.swift @@ -4,6 +4,7 @@ import ExpoModulesCore import Foundation import AuthenticationServices import Network +import EXDevMenu private let selectedAccountKey = "expo-selected-account-id" private let sessionKey = "expo-session-secret" @@ -34,17 +35,19 @@ class DevLauncherViewModel: ObservableObject { @Published var hasStoredCrash = false @Published var shakeDevice = true { didSet { - saveMenuPreference(key: "EXDevMenuMotionGestureEnabled", value: shakeDevice) + DevMenuManager.shared.setMotionGestureEnabled(shakeDevice) } } @Published var threeFingerLongPress = false { didSet { - saveMenuPreference(key: "EXDevMenuTouchGestureEnabled", value: threeFingerLongPress) + // Route through DevMenuManager so the recognizer is installed/uninstalled immediately + DevMenuManager.shared.setTouchGestureEnabled(threeFingerLongPress) } } @Published var showOnLaunch = false { didSet { - saveMenuPreference(key: "EXDevMenuShowsAtLaunch", value: showOnLaunch) + // Route through DevMenuManager so the auto-launch observer is refreshed immediately + DevMenuManager.shared.setShowsAtLaunch(showOnLaunch) } } @Published var isAuthenticated = false @@ -202,7 +205,7 @@ class DevLauncherViewModel: ObservableObject { stopServerDiscovery() startDevServerBrowser() } - + func markNetworkPermissionGranted() { UserDefaults.standard.set(true, forKey: networkPermissionGrantedKey) permissionStatus = .granted @@ -410,10 +413,6 @@ class DevLauncherViewModel: ObservableObject { showOnLaunch = defaults.object(forKey: "EXDevMenuShowsAtLaunch") as? Bool ?? false } - private func saveMenuPreference(key: String, value: Bool) { - UserDefaults.standard.set(value, forKey: key) - } - private func checkAuthenticationStatus() { let sessionSecret = UserDefaults.standard.string(forKey: sessionKey) diff --git a/packages/expo-dev-menu/CHANGELOG.md b/packages/expo-dev-menu/CHANGELOG.md index 77c5401ab78c93..78ab640ecc46b5 100644 --- a/packages/expo-dev-menu/CHANGELOG.md +++ b/packages/expo-dev-menu/CHANGELOG.md @@ -6,6 +6,8 @@ ### 🎉 New features +- [iOS] Add `setShowsAtLaunch`/`getShowsAtLaunch` to `DevMenuManager` so preferences can be toggled at runtime and applied immediately. ([#XXXXX](https://github.com/expo/expo/pull/XXXXX) by [@gabrieldonadel](https://github.com/gabrieldonadel)) ([#46000](https://github.com/expo/expo/pull/46000) by [@gabrieldonadel](https://github.com/gabrieldonadel)) + ### 🐛 Bug fixes - Fix FAB resizing on label disappearance ([#45869](https://github.com/expo/expo/pull/45869) by [@Wenszel](https://github.com/Wenszel)) diff --git a/packages/expo-dev-menu/ios/DevMenuManager.swift b/packages/expo-dev-menu/ios/DevMenuManager.swift index 2d26f179fb1974..38a994bc12d249 100644 --- a/packages/expo-dev-menu/ios/DevMenuManager.swift +++ b/packages/expo-dev-menu/ios/DevMenuManager.swift @@ -195,6 +195,16 @@ open class DevMenuManager: NSObject { return DevMenuPreferences.touchGestureEnabled } + @objc + public func setShowsAtLaunch(_ enabled: Bool) { + DevMenuPreferences.showsAtLaunch = enabled + } + + @objc + public func getShowsAtLaunch() -> Bool { + return DevMenuPreferences.showsAtLaunch + } + @objc public func setShowFloatingActionButton(_ enabled: Bool) { DevMenuPreferences.showFloatingActionButton = enabled diff --git a/packages/expo-doctor/CHANGELOG.md b/packages/expo-doctor/CHANGELOG.md index 11485ad6d930bf..8b4b42dba690b4 100644 --- a/packages/expo-doctor/CHANGELOG.md +++ b/packages/expo-doctor/CHANGELOG.md @@ -15,6 +15,7 @@ ### 💡 Others - Bump to `@expo/spawn-async@^1.8.0` ([#45999](https://github.com/expo/expo/pull/45999) by [@kitten](https://github.com/kitten)) +- Switch React Native Directory compatibility check request from POST to GET. ([#45673](https://github.com/expo/expo/pull/45673) by [@simek](https://github.com/simek)) ## 1.19.6 — 2026-05-11 diff --git a/packages/expo-doctor/src/utils/reactNativeDirectoryApi.ts b/packages/expo-doctor/src/utils/reactNativeDirectoryApi.ts index ff0971cf86710c..a54769f3c758a4 100644 --- a/packages/expo-doctor/src/utils/reactNativeDirectoryApi.ts +++ b/packages/expo-doctor/src/utils/reactNativeDirectoryApi.ts @@ -1,25 +1,51 @@ +// note(Simek): reference https://github.com/react-native-community/directory/blob/main/pages/api/libraries/check.ts +export type ReactNativeDirectoryCheckResult = { + unmaintained: boolean; + newArchitecture: 'supported' | 'unsupported' | 'untested'; +}; + +export type DirectoryCheckResponse = Record; + +const MAX_PACKAGES_PER_QUERY = 50; +const ERROR_MESSAGE = 'Could not fetch packages metadata. Please try again later.'; + export const checkLibraries = async ( packageNames: string[] -): Promise | null> => { +): Promise => { try { - const response = await fetch('https://reactnative.directory/api/libraries/check', { - method: 'POST', - headers: { 'Content-Type': 'application/json' }, - body: JSON.stringify({ packages: packageNames }), - }); - if (response.ok) { - return (await response.json()) as Record; - } else { - return null; - } + const chunkedPackages = chunk(packageNames, MAX_PACKAGES_PER_QUERY); + + const results = await Promise.allSettled( + chunkedPackages.map(async (packageChunk) => { + const response = await fetch( + `https://reactnative.directory/api/libraries/check?${new URLSearchParams({ packages: packageChunk.join(',') })}` + ); + + if (!response.ok) { + throw new Error(ERROR_MESSAGE); + } + + return (await response.json()) as DirectoryCheckResponse; + }) + ); + + return results.reduce((acc, result) => { + if (result.status === 'fulfilled') { + return { ...acc, ...result.value }; + } + throw new Error(ERROR_MESSAGE); + }, {}); } catch { return null; } }; -// See: https://github.com/react-native-community/directory/blob/1fb5e7b899e021a18f14b3c32b79d8d5995022d6/pages/api/libraries/check.ts#L8-L17 -export type ReactNativeDirectoryCheckResult = { - unmaintained: boolean; - // See: https://github.com/react-native-community/directory/blob/1fb5e7b899e021a18f14b3c32b79d8d5995022d6/util/newArchStatus.ts#L3-L7 - newArchitecture: 'supported' | 'unsupported' | 'untested'; -}; +// `lodash.chunk` +export function chunk(array: T[], size: number): T[][] { + const chunked = []; + let index = 0; + while (index < array.length) { + chunked.push(array.slice(index, (index += size))); + } + return chunked; +} diff --git a/packages/expo-observe/android/src/main/java/expo/modules/observe/ObserveModule.kt b/packages/expo-observe/android/src/main/java/expo/modules/observe/ObserveModule.kt index bf08456b6caf7c..e9aeac1bddafcd 100644 --- a/packages/expo-observe/android/src/main/java/expo/modules/observe/ObserveModule.kt +++ b/packages/expo-observe/android/src/main/java/expo/modules/observe/ObserveModule.kt @@ -10,7 +10,9 @@ import expo.modules.kotlin.modules.Module import expo.modules.kotlin.modules.ModuleDefinition import expo.modules.kotlin.records.Field import expo.modules.kotlin.records.Record +import expo.modules.kotlin.types.OptimizedRecord +@OptimizedRecord class Config( @Field val environment: String? = null, @Field val dispatchingEnabled: Boolean? = null, @@ -18,6 +20,7 @@ class Config( @Field val sampleRate: Double? = null ) : Record +@OptimizedRecord class BundleDefaults( @Field val environment: String = "", @Field val isJsDev: Boolean = false diff --git a/packages/expo-observe/build/integrations/expo-router/init.d.ts.map b/packages/expo-observe/build/integrations/expo-router/init.d.ts.map index 63edfcf8922bea..65e369939a8aac 100644 --- a/packages/expo-observe/build/integrations/expo-router/init.d.ts.map +++ b/packages/expo-observe/build/integrations/expo-router/init.d.ts.map @@ -1 +1 @@ -{"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../../src/integrations/expo-router/init.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAC1C,OAAO,EAAE,KAAK,wBAAwB,EAAE,MAAM,WAAW,CAAC;AAS1D,eAAO,MAAM,aAAa,eAAoB,CAAC;AAE/C,wBAAgB,qBAAqB,SAGpC;AAED,KAAK,gBAAgB,GAAG,WAAW,CAAC,OAAO,cAAc,CAAC,CAAC,2BAA2B,CAAC,CAAC;AAExF,wBAAgB,aAAa,CAC3B,OAAO,EAAE,wBAAwB,EACjC,gBAAgB,EAAE,gBAAgB,GACjC,MAAM,IAAI,CAgFZ"} \ No newline at end of file +{"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../../src/integrations/expo-router/init.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAC1C,OAAO,EAAE,KAAK,wBAAwB,EAAE,MAAM,WAAW,CAAC;AAS1D,eAAO,MAAM,aAAa,eAAoB,CAAC;AAE/C,wBAAgB,qBAAqB,SAGpC;AAED,KAAK,gBAAgB,GAAG,WAAW,CAAC,OAAO,cAAc,CAAC,CAAC,2BAA2B,CAAC,CAAC;AAExF,wBAAgB,aAAa,CAC3B,OAAO,EAAE,wBAAwB,EACjC,gBAAgB,EAAE,gBAAgB,GACjC,MAAM,IAAI,CAkFZ"} \ No newline at end of file diff --git a/packages/expo-observe/build/integrations/expo-router/routeName.d.ts b/packages/expo-observe/build/integrations/expo-router/routeName.d.ts new file mode 100644 index 00000000000000..e6798087e4d963 --- /dev/null +++ b/packages/expo-observe/build/integrations/expo-router/routeName.d.ts @@ -0,0 +1,2 @@ +export declare function buildRoutePattern(segments: string[] | undefined | null): string | null; +//# sourceMappingURL=routeName.d.ts.map \ No newline at end of file diff --git a/packages/expo-observe/build/integrations/expo-router/routeName.d.ts.map b/packages/expo-observe/build/integrations/expo-router/routeName.d.ts.map new file mode 100644 index 00000000000000..6ed0395863173a --- /dev/null +++ b/packages/expo-observe/build/integrations/expo-router/routeName.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"routeName.d.ts","sourceRoot":"","sources":["../../../src/integrations/expo-router/routeName.ts"],"names":[],"mappings":"AAAA,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,SAAS,GAAG,IAAI,GAAG,MAAM,GAAG,IAAI,CAKtF"} \ No newline at end of file diff --git a/packages/expo-observe/build/integrations/expo-router/useObserveForRouter.d.ts.map b/packages/expo-observe/build/integrations/expo-router/useObserveForRouter.d.ts.map index 8a897857fe0873..3cf60807177096 100644 --- a/packages/expo-observe/build/integrations/expo-router/useObserveForRouter.d.ts.map +++ b/packages/expo-observe/build/integrations/expo-router/useObserveForRouter.d.ts.map @@ -1 +1 @@ -{"version":3,"file":"useObserveForRouter.d.ts","sourceRoot":"","sources":["../../../src/integrations/expo-router/useObserveForRouter.ts"],"names":[],"mappings":"AAAA,OAAO,UAAqC,MAAM,kBAAkB,CAAC;AAQrE,KAAK,eAAe,GAAG,CAAC,OAAO,UAAU,CAAC,CAAC,iBAAiB,CAAC,CAAC;AAE9D,wBAAgB,mBAAmB,IAAI,eAAe,GAAG,IAAI,CA0G5D"} \ No newline at end of file +{"version":3,"file":"useObserveForRouter.d.ts","sourceRoot":"","sources":["../../../src/integrations/expo-router/useObserveForRouter.ts"],"names":[],"mappings":"AAAA,OAAO,UAAqC,MAAM,kBAAkB,CAAC;AASrE,KAAK,eAAe,GAAG,CAAC,OAAO,UAAU,CAAC,CAAC,iBAAiB,CAAC,CAAC;AAE9D,wBAAgB,mBAAmB,IAAI,eAAe,GAAG,IAAI,CA2G5D"} \ No newline at end of file diff --git a/packages/expo-observe/src/integrations/expo-router/__tests__/init.test.native.ts b/packages/expo-observe/src/integrations/expo-router/__tests__/init.test.native.ts index dec49de2adcc17..dcb84601ce0a69 100644 --- a/packages/expo-observe/src/integrations/expo-router/__tests__/init.test.native.ts +++ b/packages/expo-observe/src/integrations/expo-router/__tests__/init.test.native.ts @@ -52,21 +52,33 @@ function dispatch(events: FakeNavigationEvents, actionType: string) { }); } -function focus(events: FakeNavigationEvents, screenId: string) { +function focus( + events: FakeNavigationEvents, + screenId: string, + overrides?: Partial +) { events.emit>('pageFocused', { type: 'pageFocused', screenId, pathname: `/${screenId}`, params: {}, + segments: [screenId], + ...overrides, }); } -function preload(events: FakeNavigationEvents, screenId: string) { +function preload( + events: FakeNavigationEvents, + screenId: string, + overrides?: Partial +) { events.emit>('pagePreloaded', { type: 'pagePreloaded', screenId, pathname: `/${screenId}`, params: {}, + segments: [screenId], + ...overrides, }); } @@ -111,7 +123,7 @@ describe('initListeners', () => { name: 'cold_ttr', routeName: '/a', value: expect.closeTo(0.1, 2), - params: { isAppLaunch: true, routeParams: {} }, + params: { isAppLaunch: true, routeParams: {}, url: '/a' }, }); }); @@ -130,6 +142,7 @@ describe('initListeners', () => { expect(mockAddCustomMetric.mock.calls[0][0].params).toEqual({ isAppLaunch: false, routeParams: {}, + url: '/b', }); }); @@ -150,19 +163,54 @@ describe('initListeners', () => { expect(mockAddCustomMetric.mock.calls[0][0].params).toEqual({ isAppLaunch: true, routeParams: {}, + url: '/a', }); expect(mockAddCustomMetric.mock.calls[1][0].name).toBe('cold_ttr'); expect(mockAddCustomMetric.mock.calls[1][0].params).toEqual({ isAppLaunch: false, routeParams: {}, + url: '/b', }); expect(mockAddCustomMetric.mock.calls[2][0].name).toBe('warm_ttr'); expect(mockAddCustomMetric.mock.calls[2][0].params).toEqual({ isAppLaunch: false, routeParams: {}, + url: '/a', }); }); + it.each<[string[], string, Record, string]>([ + [[], '/', {}, '/'], + [['(tabs)'], '/', {}, '/(tabs)'], + [['(tabs)', '(home)'], '/', {}, '/(tabs)/(home)'], + [['users', '[id]'], '/users/42', { id: '42' }, '/users/[id]'], + [['files', '[...path]'], '/files/a/b/c', { path: ['a', 'b', 'c'] }, '/files/[...path]'], + [ + ['(tabs)', 'sessions', '[sessionId]'], + '/sessions/1234', + { sessionId: '1234' }, + '/(tabs)/sessions/[sessionId]', + ], + ])( + 'pageFocused(segments=%s, pathname=%s, params=%s) records routeName=%s', + async (segments, pathname, routeParams, expectedRouteName) => { + dispatch(events, 'NAVIGATE'); + focus(events, 'screen', { pathname, params: routeParams, segments }); + await flushAsync(); + + expect(mockAddCustomMetric).toHaveBeenCalledTimes(1); + expect(mockAddCustomMetric).toHaveBeenCalledWith( + expect.objectContaining({ + routeName: expectedRouteName, + params: expect.objectContaining({ + url: pathname, + routeParams, + }), + }) + ); + } + ); + it('does not record a TTR for a PRELOAD action', async () => { storage.hasRecordedInitialTtr = true; diff --git a/packages/expo-observe/src/integrations/expo-router/__tests__/routeName.test.ts b/packages/expo-observe/src/integrations/expo-router/__tests__/routeName.test.ts new file mode 100644 index 00000000000000..1e178dd81a8875 --- /dev/null +++ b/packages/expo-observe/src/integrations/expo-router/__tests__/routeName.test.ts @@ -0,0 +1,18 @@ +import { buildRoutePattern } from '../routeName'; + +describe('buildRoutePattern', () => { + it('returns undefined when segments is undefined', () => { + expect(buildRoutePattern(undefined)).toBeNull(); + }); + + it.each([ + [[], '/'], + [['(tabs)'], '/(tabs)'], + [['(tabs)', '(home)'], '/(tabs)/(home)'], + [['users', '[id]'], '/users/[id]'], + [['files', '[...path]'], '/files/[...path]'], + [['(tabs)', 'sessions', '[sessionId]'], '/(tabs)/sessions/[sessionId]'], + ])('buildRoutePattern(%s) = %s', (segments, expected) => { + expect(buildRoutePattern(segments as string[])).toBe(expected); + }); +}); diff --git a/packages/expo-observe/src/integrations/expo-router/__tests__/useObserveForRouter.test.native.tsx b/packages/expo-observe/src/integrations/expo-router/__tests__/useObserveForRouter.test.native.tsx index 3781a95653ef30..ad7d3dfbf2b830 100644 --- a/packages/expo-observe/src/integrations/expo-router/__tests__/useObserveForRouter.test.native.tsx +++ b/packages/expo-observe/src/integrations/expo-router/__tests__/useObserveForRouter.test.native.tsx @@ -42,6 +42,7 @@ jest.mock('../router', () => { isRouterInstalled: true, __useRoute: useRoute, __useNavigation: useNavigation, + __useCurrentRouteInfo: useCurrentRouteInfo, }; }); @@ -49,6 +50,8 @@ const mockAddCustomMetric = AppMetrics.addCustomMetricToSession as jest.Mock; const mockUseRoute = (routerModule as unknown as { __useRoute: jest.Mock }).__useRoute; const mockUseNavigation = (routerModule as unknown as { __useNavigation: jest.Mock }) .__useNavigation; +const mockUseCurrentRouteInfo = (routerModule as unknown as { __useCurrentRouteInfo: jest.Mock }) + .__useCurrentRouteInfo; function wrapper(storage: RouterIntegrationStorage | null) { return ({ children }: { children: ReactNode }) => ( @@ -66,6 +69,11 @@ beforeEach(() => { jest.spyOn(console, 'warn').mockImplementation(() => {}); mockUseRoute.mockReturnValue({ key: 'screen-a' }); mockUseNavigation.mockReturnValue({ isFocused: () => true }); + mockUseCurrentRouteInfo.mockReturnValue({ + pathname: '/test', + params: { x: '1' }, + segments: ['test'], + }); storage = createRouterIntegrationStorage(); }); @@ -87,10 +95,50 @@ describe('useObserveForRouter', () => { routeName: '/test', name: 'tti', value: 0.3, - params: { routeParams: { x: '1' } }, + params: { routeParams: { x: '1' }, url: '/test' }, }); }); + it.each<[string[], string, Record, string]>([ + [[], '/', {}, '/'], + [['(tabs)'], '/', {}, '/(tabs)'], + [['(tabs)', '(home)'], '/', {}, '/(tabs)/(home)'], + [['users', '[id]'], '/users/42', { id: '42' }, '/users/[id]'], + [['files', '[...path]'], '/files/a/b/c', { path: ['a', 'b', 'c'] }, '/files/[...path]'], + [ + ['(tabs)', 'sessions', '[sessionId]'], + '/sessions/1234', + { sessionId: '1234' }, + '/(tabs)/sessions/[sessionId]', + ], + ])( + 'useCurrentRouteInfo(segments=%s, pathname=%s, params=%s) records routeName=%s', + async (segments, pathname, routeParams, expectedRouteName) => { + mockUseCurrentRouteInfo.mockReturnValue({ pathname, params: routeParams, segments }); + storage.screenTimes['screen-a'] = { dispatchTime: 1000 }; + jest.spyOn(performance, 'now').mockReturnValue(1300); + + const { result } = renderHook(() => useObserveForRouter(), { wrapper: wrapper(storage) }); + await act(async () => { + await result.current!(); + }); + + expect(AppMetrics.markInteractive).toHaveBeenCalledWith({ + routeName: expectedRouteName, + params: { url: pathname }, + }); + expect(mockAddCustomMetric).toHaveBeenCalledWith({ + sessionId: 'session-1', + timestamp: expect.any(String), + category: 'navigation', + routeName: expectedRouteName, + name: 'tti', + value: 0.3, + params: { routeParams, url: pathname }, + }); + } + ); + it('calls AppMetrics.markInteractive when the screen is focused', async () => { storage.screenTimes['screen-a'] = { dispatchTime: 1000 }; const { result } = renderHook(() => useObserveForRouter(), { wrapper: wrapper(storage) }); @@ -98,7 +146,10 @@ describe('useObserveForRouter', () => { await act(async () => { await result.current!({ ...arg }); }); - expect(AppMetrics.markInteractive).toHaveBeenCalledWith({ ...arg, routeName: '/test' }); + expect(AppMetrics.markInteractive).toHaveBeenCalledWith({ + params: { x: 'payload', url: '/test' }, + routeName: '/test', + }); }); it('does not call AppMetrics.markInteractive when the screen is not focused, but still computes TTI', async () => { @@ -119,7 +170,7 @@ describe('useObserveForRouter', () => { routeName: '/test', name: 'tti', value: 0.3, - params: { routeParams: { x: '1' } }, + params: { routeParams: { x: '1' }, url: '/test' }, }); }); diff --git a/packages/expo-observe/src/integrations/expo-router/init.ts b/packages/expo-observe/src/integrations/expo-router/init.ts index b15cc66cea89b0..ab67a6af3f5074 100644 --- a/packages/expo-observe/src/integrations/expo-router/init.ts +++ b/packages/expo-observe/src/integrations/expo-router/init.ts @@ -1,5 +1,6 @@ import AppMetrics from 'expo-app-metrics'; +import { buildRoutePattern } from './routeName'; import { optionalRouter } from './router'; import { type RouterIntegrationStorage } from './storage'; @@ -58,6 +59,8 @@ export function initListeners( return; } + const routePattern = buildRoutePattern(e.segments); + if (!storage.hasRecordedInitialTtr) { // Stored in seconds to match the OTel `unit = "s"` convention const appLaunchTtrSeconds = (now - appLaunchTime) / 1000; @@ -67,9 +70,9 @@ export function initListeners( timestamp, category: 'navigation', name, - routeName: e.pathname, + routeName: routePattern, value: appLaunchTtrSeconds, - params: { isAppLaunch: true, routeParams: e.params }, + params: { isAppLaunch: true, routeParams: e.params, url: e.pathname }, }); return; } @@ -89,9 +92,9 @@ export function initListeners( timestamp, category: 'navigation', name, - routeName: e.pathname, + routeName: routePattern, value: (now - dispatchTime) / 1000, - params: { isAppLaunch: false, routeParams: e.params }, + params: { isAppLaunch: false, routeParams: e.params, url: e.pathname }, }); } storage.pendingActions.length = 0; diff --git a/packages/expo-observe/src/integrations/expo-router/routeName.ts b/packages/expo-observe/src/integrations/expo-router/routeName.ts new file mode 100644 index 00000000000000..3f1d505394ca54 --- /dev/null +++ b/packages/expo-observe/src/integrations/expo-router/routeName.ts @@ -0,0 +1,6 @@ +export function buildRoutePattern(segments: string[] | undefined | null): string | null { + // eslint-disable-next-line eqeqeq + if (segments == undefined) return null; + if (segments.length === 0) return '/'; + return '/' + segments.join('/'); +} diff --git a/packages/expo-observe/src/integrations/expo-router/useObserveForRouter.ts b/packages/expo-observe/src/integrations/expo-router/useObserveForRouter.ts index ad34274fcd84f5..542c5152701206 100644 --- a/packages/expo-observe/src/integrations/expo-router/useObserveForRouter.ts +++ b/packages/expo-observe/src/integrations/expo-router/useObserveForRouter.ts @@ -3,6 +3,7 @@ import { use, useCallback, useEffect, useRef } from 'react'; import { ObserveRouterIntegrationContext } from './ObserveRouterIntegrationProvider'; import { isInitialized } from './init'; +import { buildRoutePattern } from './routeName'; import { optionalRouter } from './router'; import { useAssertValueDoesNotChange } from '../../useAssertValueDoesNotChange'; @@ -15,7 +16,8 @@ export function useObserveForRouter(): MarkInteractive | null { const route = optionalRouter?.useRoute(); const navigation = optionalRouter?.useNavigation(); const routeInfo = optionalRouter?.useCurrentRouteInfo(); - const { pathname, params: routeParams } = routeInfo ?? {}; + const { pathname, params: routeParams, segments } = routeInfo ?? {}; + const routePattern = buildRoutePattern(segments); useAssertValueDoesNotChange( initialized, @@ -59,7 +61,8 @@ export function useObserveForRouter(): MarkInteractive | null { if (navigation?.isFocused()) { AppMetrics.markInteractive({ ...(attributes ?? {}), - routeName: pathname, + routeName: routePattern, + params: { ...(attributes?.params ?? {}), url: pathname }, }); } @@ -102,15 +105,14 @@ export function useObserveForRouter(): MarkInteractive | null { sessionId: mainSessionId, timestamp, category: 'navigation', - // TODO(@ubax): Use segments.join here to get full routeName and pass pathname and params via params - routeName: pathname, + routeName: routePattern, name: 'tti', value: interactiveTimeSeconds, - params: { routeParams }, + params: { routeParams, url: pathname }, }); } }, - [screenId, navigation, pathname, storage, routeParams] + [screenId, navigation, pathname, routePattern, storage, routeParams] ); return initialized ? markInteractive : null; diff --git a/packages/expo-router/CHANGELOG.md b/packages/expo-router/CHANGELOG.md index f7244caf037117..96303dbea057b9 100644 --- a/packages/expo-router/CHANGELOG.md +++ b/packages/expo-router/CHANGELOG.md @@ -15,6 +15,8 @@ ### 💡 Others +- Add `segments` to `unstable_navigationEvents` page events `pagePreloaded`, `pageFocused`, `pageBlurred`, `pageRemoved` ([#46019](https://github.com/expo/expo/pull/46019) by [@Ubax](https://github.com/Ubax)) + ## 56.2.2 — 2026-05-19 ### 🎉 New features diff --git a/packages/expo-router/build/navigationEvents/types.d.ts b/packages/expo-router/build/navigationEvents/types.d.ts index f94e5ff0c4165d..10689ca7861618 100644 --- a/packages/expo-router/build/navigationEvents/types.d.ts +++ b/packages/expo-router/build/navigationEvents/types.d.ts @@ -4,6 +4,7 @@ export interface BasePageEvent { pathname: string; params: Record; screenId: string; + segments: string[]; } /** * The page rendered as part of a preload (e.g. `router.prefetch()`) and is not diff --git a/packages/expo-router/build/navigationEvents/types.d.ts.map b/packages/expo-router/build/navigationEvents/types.d.ts.map index dd61a416da0b53..86c0ce44d4d9ec 100644 --- a/packages/expo-router/build/navigationEvents/types.d.ts.map +++ b/packages/expo-router/build/navigationEvents/types.d.ts.map @@ -1 +1 @@ -{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/navigationEvents/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAC;AAClE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAE5D,MAAM,WAAW,aAAa;IAC5B,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC,CAAC;IAC1C,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED;;;;;GAKG;AACH,MAAM,WAAW,kBAAmB,SAAQ,aAAa;IACvD,IAAI,EAAE,eAAe,CAAC;CACvB;AAED,MAAM,WAAW,gBAAiB,SAAQ,aAAa;IACrD,IAAI,EAAE,aAAa,CAAC;CACrB;AAED,MAAM,WAAW,gBAAiB,SAAQ,aAAa;IACrD,IAAI,EAAE,aAAa,CAAC;CACrB;AAED,MAAM,WAAW,WAAY,SAAQ,aAAa;IAChD,IAAI,EAAE,aAAa,CAAC;CACrB;AAED,MAAM,WAAW,qBAAqB;IACpC,IAAI,EAAE,kBAAkB,CAAC;IACzB,8EAA8E;IAC9E,UAAU,EAAE,gBAAgB,CAAC,MAAM,CAAC,CAAC;IACrC,OAAO,EAAE,gBAAgB,CAAC,SAAS,CAAC,CAAC;IACrC,KAAK,EAAE,oBAAoB,CAAC;CAC7B"} \ No newline at end of file +{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/navigationEvents/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAC;AAClE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAE5D,MAAM,WAAW,aAAa;IAC5B,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC,CAAC;IAC1C,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB;AAED;;;;;GAKG;AACH,MAAM,WAAW,kBAAmB,SAAQ,aAAa;IACvD,IAAI,EAAE,eAAe,CAAC;CACvB;AAED,MAAM,WAAW,gBAAiB,SAAQ,aAAa;IACrD,IAAI,EAAE,aAAa,CAAC;CACrB;AAED,MAAM,WAAW,gBAAiB,SAAQ,aAAa;IACrD,IAAI,EAAE,aAAa,CAAC;CACrB;AAED,MAAM,WAAW,WAAY,SAAQ,aAAa;IAChD,IAAI,EAAE,aAAa,CAAC;CACrB;AAED,MAAM,WAAW,qBAAqB;IACpC,IAAI,EAAE,kBAAkB,CAAC;IACzB,8EAA8E;IAC9E,UAAU,EAAE,gBAAgB,CAAC,MAAM,CAAC,CAAC;IACrC,OAAO,EAAE,gBAAgB,CAAC,SAAS,CAAC,CAAC;IACrC,KAAK,EAAE,oBAAoB,CAAC;CAC7B"} \ No newline at end of file diff --git a/packages/expo-router/build/navigationEvents/types.js.map b/packages/expo-router/build/navigationEvents/types.js.map index d442cd8db932fb..2fd32899757ea8 100644 --- a/packages/expo-router/build/navigationEvents/types.js.map +++ b/packages/expo-router/build/navigationEvents/types.js.map @@ -1 +1 @@ -{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/navigationEvents/types.ts"],"names":[],"mappings":"","sourcesContent":["import type { ReactNavigationState } from '../global-state/types';\nimport type { NavigationAction } from '../react-navigation';\n\nexport interface BasePageEvent {\n pathname: string;\n params: Record;\n screenId: string;\n}\n\n/**\n * The page rendered as part of a preload (e.g. `router.prefetch()`) and is not\n * currently focused. If the user later navigates to this route, the matching\n * `pageFocused` will fire then; the preload may also be invalidated or the\n * route unmounted (`pageRemoved`) without a focus.\n */\nexport interface PagePreloadedEvent extends BasePageEvent {\n type: 'pagePreloaded';\n}\n\nexport interface PageFocusedEvent extends BasePageEvent {\n type: 'pageFocused';\n}\n\nexport interface PageBlurredEvent extends BasePageEvent {\n type: 'pageBlurred';\n}\n\nexport interface PageRemoved extends BasePageEvent {\n type: 'pageRemoved';\n}\n\nexport interface ActionDispatchedEvent {\n type: 'actionDispatched';\n /** The action type from the dispatched NavigationAction (e.g. `NAVIGATE`). */\n actionType: NavigationAction['type'];\n payload: NavigationAction['payload'];\n state: ReactNavigationState;\n}\n"]} \ No newline at end of file +{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/navigationEvents/types.ts"],"names":[],"mappings":"","sourcesContent":["import type { ReactNavigationState } from '../global-state/types';\nimport type { NavigationAction } from '../react-navigation';\n\nexport interface BasePageEvent {\n pathname: string;\n params: Record;\n screenId: string;\n segments: string[];\n}\n\n/**\n * The page rendered as part of a preload (e.g. `router.prefetch()`) and is not\n * currently focused. If the user later navigates to this route, the matching\n * `pageFocused` will fire then; the preload may also be invalidated or the\n * route unmounted (`pageRemoved`) without a focus.\n */\nexport interface PagePreloadedEvent extends BasePageEvent {\n type: 'pagePreloaded';\n}\n\nexport interface PageFocusedEvent extends BasePageEvent {\n type: 'pageFocused';\n}\n\nexport interface PageBlurredEvent extends BasePageEvent {\n type: 'pageBlurred';\n}\n\nexport interface PageRemoved extends BasePageEvent {\n type: 'pageRemoved';\n}\n\nexport interface ActionDispatchedEvent {\n type: 'actionDispatched';\n /** The action type from the dispatched NavigationAction (e.g. `NAVIGATE`). */\n actionType: NavigationAction['type'];\n payload: NavigationAction['payload'];\n state: ReactNavigationState;\n}\n"]} \ No newline at end of file diff --git a/packages/expo-router/build/useScreens.d.ts.map b/packages/expo-router/build/useScreens.d.ts.map index c6be1588a95b7b..fe8f45be4360db 100644 --- a/packages/expo-router/build/useScreens.d.ts.map +++ b/packages/expo-router/build/useScreens.d.ts.map @@ -1 +1 @@ -{"version":3,"file":"useScreens.d.ts","sourceRoot":"","sources":["../src/useScreens.tsx"],"names":[],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"useScreens.d.ts","sourceRoot":"","sources":["../src/useScreens.tsx"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/packages/expo-router/build/useScreens.js b/packages/expo-router/build/useScreens.js index cfd25e019dd449..191882d4e7f89c 100644 --- a/packages/expo-router/build/useScreens.js +++ b/packages/expo-router/build/useScreens.js @@ -271,6 +271,7 @@ function AnalyticsListeners({ navigation, screenId, }) { navigationEvents_1.unstable_navigationEvents.emit('pagePreloaded', { pathname: routeInfo.pathname, params: routeInfo.params, + segments: routeInfo.segments, screenId, }); } @@ -281,12 +282,13 @@ function AnalyticsListeners({ navigation, screenId, }) { navigationEvents_1.unstable_navigationEvents.emit('pageRemoved', { pathname: routeInfo.pathname, params: routeInfo.params, + segments: routeInfo.segments, screenId, }); }; } return () => { }; - }, [routeInfo?.params, routeInfo?.pathname, screenId]); + }, [routeInfo?.params, routeInfo?.pathname, routeInfo?.segments, screenId]); // Emit `pageFocused` from an effect — not during render — so it fires after the // focused screen's content has committed. `hasBlurredRef` deduplicates across both paths. (0, react_2.useEffect)(() => { @@ -294,11 +296,12 @@ function AnalyticsListeners({ navigation, screenId, }) { navigationEvents_1.unstable_navigationEvents.emit('pageFocused', { pathname: routeInfo.pathname, params: routeInfo.params, + segments: routeInfo.segments, screenId, }); hasBlurredRef.current = false; } - }, [isFocused, routeInfo?.pathname, routeInfo?.params, screenId]); + }, [isFocused, routeInfo?.pathname, routeInfo?.params, routeInfo?.segments, screenId]); (0, react_2.useEffect)(() => { if (routeInfo) { const cleanFocus = navigation.addListener('focus', () => { @@ -308,6 +311,7 @@ function AnalyticsListeners({ navigation, screenId, }) { navigationEvents_1.unstable_navigationEvents.emit('pageFocused', { pathname: routeInfo.pathname, params: routeInfo.params, + segments: routeInfo.segments, screenId, }); hasBlurredRef.current = false; @@ -317,6 +321,7 @@ function AnalyticsListeners({ navigation, screenId, }) { navigationEvents_1.unstable_navigationEvents.emit('pageBlurred', { pathname: routeInfo.pathname, params: routeInfo.params, + segments: routeInfo.segments, screenId, }); hasBlurredRef.current = true; @@ -327,7 +332,7 @@ function AnalyticsListeners({ navigation, screenId, }) { }; } return () => { }; - }, [navigation, routeInfo?.pathname, routeInfo?.params, screenId]); + }, [navigation, routeInfo?.pathname, routeInfo?.params, routeInfo?.segments, screenId]); return null; } function screenOptionsFactory(route, options) { diff --git a/packages/expo-router/build/useScreens.js.map b/packages/expo-router/build/useScreens.js.map index e28d66ec4c9b4c..a5ecc2de663604 100644 --- a/packages/expo-router/build/useScreens.js.map +++ b/packages/expo-router/build/useScreens.js.map @@ -1 +1 @@ -{"version":3,"file":"useScreens.js","sourceRoot":"","sources":["../src/useScreens.tsx"],"names":[],"mappings":"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","sourcesContent":["'use client';\n\nimport React, { use, useEffect } from 'react';\n\nimport type { LoadedRoute, RouteNode } from './Route';\nimport { SuspenseFallbackContext, Route, sortRoutesWithInitial, useRouteNode } from './Route';\nimport { useExpoRouterStore } from './global-state/storeContext';\nimport { useColorSchemeChangesIfNeeded } from './global-state/utils';\n// Direct import to prevent a require cycle\nimport { useCurrentRouteInfo } from './hooks/useCurrentRouteInfo';\nimport EXPO_ROUTER_IMPORT_MODE from './import-mode';\nimport { ZoomTransitionEnabler } from './link/zoom/ZoomTransitionEnabler';\nimport { ZoomTransitionTargetContextProvider } from './link/zoom/zoom-transition-context-providers';\nimport { unstable_navigationEvents } from './navigationEvents';\nimport {\n hasParam,\n INTERNAL_EXPO_ROUTER_NO_ANIMATION_PARAM_NAME,\n removeParams,\n} from './navigationParams';\nimport { Screen } from './primitives';\nimport type { BottomTabNavigationEventMap } from './react-navigation/bottom-tabs';\nimport {\n useStateForPath,\n type EventConsumer,\n type EventMapBase,\n type NavigationProp,\n type NavigationState,\n type ParamListBase,\n type RouteProp,\n type ScreenListeners,\n} from './react-navigation/native';\nimport type { NativeStackNavigationEventMap } from './react-navigation/native-stack';\nimport type { UnknownOutputParams } from './types';\nimport { EmptyRoute } from './views/EmptyRoute';\nimport {\n SuspenseFallback as DefaultSuspenseFallback,\n type SuspenseFallbackProps,\n} from './views/SuspenseFallback';\nimport { Try } from './views/Try';\n\nexport type ScreenProps<\n TOptions extends Record = Record,\n TState extends NavigationState = NavigationState,\n TEventMap extends EventMapBase = EventMapBase,\n> = {\n /** Name is required when used inside a Layout component. */\n name?: string;\n /**\n * Redirect to the nearest sibling route.\n * If all children are `redirect={true}`, the layout will render `null` as there are no children to render.\n */\n redirect?: boolean;\n initialParams?: Record;\n options?:\n | TOptions\n | ((prop: { route: RouteProp; navigation: any }) => TOptions);\n\n listeners?:\n | ScreenListeners\n | ((prop: {\n route: RouteProp;\n navigation: any;\n }) => ScreenListeners);\n\n getId?: ({ params }: { params?: Record }) => string | undefined;\n\n dangerouslySingular?: SingularOptions;\n};\n\nexport type SingularOptions =\n | boolean\n | ((name: string, params: UnknownOutputParams) => string | undefined);\n\nfunction getSortedChildren(\n children: RouteNode[],\n order: ScreenProps[] = [],\n initialRouteName?: string\n): { route: RouteNode; props: Partial }[] {\n if (!order?.length) {\n return children\n .sort(sortRoutesWithInitial(initialRouteName))\n .map((route) => ({ route, props: {} }));\n }\n const entries = [...children];\n\n const ordered = order\n .map(\n ({\n name,\n redirect,\n initialParams,\n listeners,\n options,\n getId,\n dangerouslySingular: singular,\n }) => {\n if (!entries.length) {\n console.warn(\n `[Layout children]: Too many screens defined. Route \"${name}\" is extraneous.`\n );\n return null;\n }\n const matchIndex = entries.findIndex(\n (child) => child.route === name || child.route === `${name}/index`\n );\n if (matchIndex === -1) {\n console.warn(\n `[Layout children]: No route named \"${name}\" exists in nested children:`,\n children.map(({ route }) => route)\n );\n return null;\n } else {\n // Get match and remove from entries\n const match = entries[matchIndex];\n entries.splice(matchIndex, 1);\n\n // Ensure to return null after removing from entries.\n if (redirect) {\n if (typeof redirect === 'string') {\n throw new Error(`Redirecting to a specific route is not supported yet.`);\n }\n return null;\n }\n\n if (getId) {\n console.warn(\n `Deprecated: prop 'getId' on screen ${name} is deprecated. Please rename the prop to 'dangerouslySingular'`\n );\n if (singular) {\n console.warn(\n `Screen ${name} cannot use both getId and dangerouslySingular together.`\n );\n }\n } else if (singular) {\n // If singular is set, use it as the getId function.\n if (typeof singular === 'string') {\n getId = () => singular;\n } else if (typeof singular === 'function' && name) {\n getId = (options) => singular(name, options.params || {});\n } else if (singular === true && name) {\n getId = (options) => getSingularId(name, options);\n }\n }\n\n return {\n route: match,\n props: { initialParams, listeners, options, getId },\n };\n }\n }\n )\n .filter(Boolean) as {\n route: RouteNode;\n props: Partial;\n }[];\n\n // Add any remaining children\n ordered.push(\n ...entries.sort(sortRoutesWithInitial(initialRouteName)).map((route) => ({ route, props: {} }))\n );\n\n return ordered;\n}\n\n/**\n * @returns React Navigation screens sorted by the `route` property.\n */\nexport function useSortedScreens(\n order: ScreenProps[],\n protectedScreens: Set,\n useOnlyUserDefinedScreens: boolean = false\n): React.ReactNode[] {\n const node = useRouteNode();\n\n const nodeChildren = node?.children ?? [];\n const children = useOnlyUserDefinedScreens\n ? nodeChildren.filter((child) =>\n order.some(\n (userDefinedScreen) =>\n userDefinedScreen.name === child.route ||\n `${userDefinedScreen.name}/index` === child.route\n )\n )\n : nodeChildren;\n\n const sorted = children.length ? getSortedChildren(children, order, node?.initialRouteName) : [];\n return React.useMemo(\n () =>\n sorted\n .filter((item) => {\n const route = item.route.route;\n return (\n !protectedScreens.has(route) && !protectedScreens.has(route.replace(/\\/index$/, ''))\n );\n })\n .map((value) => {\n return routeToScreen(value.route, value.props);\n }),\n [sorted, protectedScreens]\n );\n}\n\nfunction fromImport(\n value: RouteNode,\n { ErrorBoundary, SuspenseFallback, ...component }: LoadedRoute\n) {\n // If possible, add a more helpful display name for the component stack to improve debugging of React errors such as `Text strings must be rendered within a component.`.\n if (component?.default && __DEV__) {\n component.default.displayName ??= `${component.default.name ?? 'Route'}(${value.contextKey})`;\n }\n\n if (ErrorBoundary) {\n const Wrapped = React.forwardRef((props: any, ref: any) => {\n const children = React.createElement(component.default || EmptyRoute, {\n ...props,\n ref,\n });\n return {children};\n });\n\n if (__DEV__) {\n Wrapped.displayName = `ErrorBoundary(${value.contextKey})`;\n }\n\n return {\n default: Wrapped,\n SuspenseFallback,\n };\n }\n if (process.env.NODE_ENV !== 'production') {\n if (\n typeof component.default === 'object' &&\n component.default &&\n Object.keys(component.default).length === 0\n ) {\n return { default: EmptyRoute, SuspenseFallback };\n }\n }\n\n return { default: component.default, SuspenseFallback };\n}\n\nfunction fromLoadedRoute(value: RouteNode, res: LoadedRoute) {\n if (!(res instanceof Promise)) {\n return fromImport(value, res);\n }\n\n return res.then(fromImport.bind(null, value));\n}\n\n// TODO: Maybe there's a more React-y way to do this?\n// Without this store, the process enters a recursive loop.\nconst qualifiedStore = new WeakMap>();\n\n/** Wrap the component with various enhancements and add access to child routes. */\nexport function getQualifiedRouteComponent(value: RouteNode) {\n if (qualifiedStore.has(value)) {\n return qualifiedStore.get(value)!;\n }\n\n let ScreenComponent:\n | React.ForwardRefExoticComponent>\n | React.ComponentType<{ segment?: string }>;\n\n let LayoutSuspenseFallback: React.ComponentType | undefined;\n\n // TODO: This ensures sync doesn't use React.lazy, but it's not ideal.\n if (EXPO_ROUTER_IMPORT_MODE === 'lazy') {\n ScreenComponent = React.lazy(async () => {\n const res = value.loadRoute();\n return fromLoadedRoute(value, res) as Promise<{\n default: React.ComponentType;\n }>;\n });\n\n if (__DEV__) {\n ScreenComponent.displayName = `AsyncRoute(${value.route})`;\n }\n } else {\n const res = value.loadRoute();\n const result = fromImport(value, res);\n ScreenComponent = result.default!;\n LayoutSuspenseFallback = value.type === 'layout' ? result.SuspenseFallback : undefined;\n }\n const WrappedScreenComponent: typeof ScreenComponent = (props: object) => {\n useColorSchemeChangesIfNeeded();\n return ;\n };\n function BaseRoute({\n // Remove these React Navigation props to\n // enforce usage of expo-router hooks (where the query params are correct).\n route,\n navigation,\n\n // Pass all other props to the component\n ...props\n }: {\n route?: RouteProp;\n navigation: Omit<\n NavigationProp<\n ParamListBase,\n string,\n undefined,\n NavigationState,\n object,\n NativeStackNavigationEventMap | BottomTabNavigationEventMap\n >,\n 'getState'\n > & {\n getState(): NavigationState | undefined;\n };\n }) {\n const stateForPath = useStateForPath();\n const isFocused = navigation.isFocused();\n const store = useExpoRouterStore();\n const InheritedSuspenseFallback = use(SuspenseFallbackContext);\n\n const ResolvedSuspenseFallback =\n EXPO_ROUTER_IMPORT_MODE === 'lazy'\n ? DefaultSuspenseFallback\n : (LayoutSuspenseFallback ?? InheritedSuspenseFallback ?? DefaultSuspenseFallback);\n const providedSuspenseFallback =\n value.type === 'layout'\n ? (LayoutSuspenseFallback ?? InheritedSuspenseFallback)\n : InheritedSuspenseFallback;\n\n if (isFocused) {\n const state = navigation.getState();\n const isLeaf = !(state && 'state' in state.routes[state.index]!);\n if (isLeaf && stateForPath) store.setFocusedState(stateForPath);\n }\n\n useEffect(\n () =>\n navigation.addListener('focus', () => {\n const state = navigation.getState();\n const isLeaf = !(state && 'state' in state.routes[state.index]!);\n // Because setFocusedState caches the route info, this call will only trigger rerenders\n // if the component itself didn’t rerender and the route info changed.\n // Otherwise, the update from the `if` above will handle it,\n // and this won’t cause a redundant second update.\n if (isLeaf && stateForPath) store.setFocusedState(stateForPath);\n }),\n [navigation]\n );\n\n useEffect(() => {\n return navigation.addListener('transitionEnd', (e) => {\n if (!e?.data?.closing) {\n // When navigating to a screen, remove the no animation param to re-enable animations\n // Otherwise the navigation back would also have no animation\n if (hasParam(route?.params, INTERNAL_EXPO_ROUTER_NO_ANIMATION_PARAM_NAME)) {\n navigation.replaceParams(\n removeParams(route?.params, [INTERNAL_EXPO_ROUTER_NO_ANIMATION_PARAM_NAME])\n );\n }\n }\n });\n }, [navigation]);\n\n const isRouteType = value.type === 'route';\n const hasRouteKey = !!route?.key;\n\n return (\n \n \n {unstable_navigationEvents.isEnabled() && isRouteType && hasRouteKey && (\n \n )}\n \n \n \n }>\n \n \n \n \n \n );\n }\n\n if (__DEV__) {\n BaseRoute.displayName = `Route(${value.route})`;\n }\n\n qualifiedStore.set(value, BaseRoute);\n return BaseRoute;\n}\n\nfunction AnalyticsListeners({\n navigation,\n screenId,\n}: {\n navigation: EventConsumer & {\n isFocused(): boolean;\n };\n screenId: string;\n}) {\n const isFirstRenderRef = React.useRef(true);\n const hasBlurredRef = React.useRef(true);\n const routeInfo = useCurrentRouteInfo();\n\n const isFocused = navigation.isFocused();\n\n if (isFirstRenderRef.current) {\n isFirstRenderRef.current = false;\n if (routeInfo && !isFocused) {\n unstable_navigationEvents.emit('pagePreloaded', {\n pathname: routeInfo.pathname,\n params: routeInfo.params,\n screenId,\n });\n }\n }\n\n useEffect(() => {\n if (routeInfo) {\n return () => {\n unstable_navigationEvents.emit('pageRemoved', {\n pathname: routeInfo.pathname,\n params: routeInfo.params,\n screenId,\n });\n };\n }\n return () => {};\n }, [routeInfo?.params, routeInfo?.pathname, screenId]);\n\n // Emit `pageFocused` from an effect — not during render — so it fires after the\n // focused screen's content has committed. `hasBlurredRef` deduplicates across both paths.\n useEffect(() => {\n if (isFocused && routeInfo && hasBlurredRef.current) {\n unstable_navigationEvents.emit('pageFocused', {\n pathname: routeInfo.pathname,\n params: routeInfo.params,\n screenId,\n });\n hasBlurredRef.current = false;\n }\n }, [isFocused, routeInfo?.pathname, routeInfo?.params, screenId]);\n\n useEffect(() => {\n if (routeInfo) {\n const cleanFocus = navigation.addListener('focus', () => {\n // If the screen was not blurred, don't emit focused again\n // hasBlurredRef will be false when the screen was initially focused\n if (hasBlurredRef.current) {\n unstable_navigationEvents.emit('pageFocused', {\n pathname: routeInfo.pathname,\n params: routeInfo.params,\n screenId,\n });\n hasBlurredRef.current = false;\n }\n });\n const cleanBlur = navigation.addListener('blur', () => {\n unstable_navigationEvents.emit('pageBlurred', {\n pathname: routeInfo.pathname,\n params: routeInfo.params,\n screenId,\n });\n hasBlurredRef.current = true;\n });\n return () => {\n cleanFocus();\n cleanBlur();\n };\n }\n return () => {};\n }, [navigation, routeInfo?.pathname, routeInfo?.params, screenId]);\n\n return null;\n}\n\nexport function screenOptionsFactory(\n route: RouteNode,\n options?: ScreenProps['options']\n): ScreenProps['options'] {\n return (args) => {\n // Only eager load generated components\n const staticOptions = route.generated ? route.loadRoute()?.getNavOptions : null;\n const staticResult = typeof staticOptions === 'function' ? staticOptions(args) : staticOptions;\n const dynamicResult = typeof options === 'function' ? options?.(args) : options;\n const output = {\n ...staticResult,\n ...dynamicResult,\n };\n\n // Prevent generated screens from showing up in the tab bar.\n if (route.internal) {\n output.tabBarItemStyle = { display: 'none' };\n output.tabBarButton = () => null;\n // TODO: React Navigation doesn't provide a way to prevent rendering the drawer item.\n output.drawerItemStyle = { height: 0, display: 'none' };\n }\n\n return output;\n };\n}\n\nexport function routeToScreen(\n route: RouteNode,\n { options, getId, ...props }: Partial = {}\n) {\n return (\n getQualifiedRouteComponent(route)}\n />\n );\n}\n\nexport function getSingularId(name: string, options: Record = {}) {\n return name\n .split('/')\n .map((segment) => {\n if (segment.startsWith('[...')) {\n return options.params?.[segment.slice(4, -1)]?.join('/') || segment;\n } else if (segment.startsWith('[') && segment.endsWith(']')) {\n return options.params?.[segment.slice(1, -1)] || segment;\n } else {\n return segment;\n }\n })\n .join('/');\n}\n"]} \ No newline at end of file +{"version":3,"file":"useScreens.js","sourceRoot":"","sources":["../src/useScreens.tsx"],"names":[],"mappings":"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","sourcesContent":["'use client';\n\nimport React, { use, useEffect } from 'react';\n\nimport type { LoadedRoute, RouteNode } from './Route';\nimport { SuspenseFallbackContext, Route, sortRoutesWithInitial, useRouteNode } from './Route';\nimport { useExpoRouterStore } from './global-state/storeContext';\nimport { useColorSchemeChangesIfNeeded } from './global-state/utils';\n// Direct import to prevent a require cycle\nimport { useCurrentRouteInfo } from './hooks/useCurrentRouteInfo';\nimport EXPO_ROUTER_IMPORT_MODE from './import-mode';\nimport { ZoomTransitionEnabler } from './link/zoom/ZoomTransitionEnabler';\nimport { ZoomTransitionTargetContextProvider } from './link/zoom/zoom-transition-context-providers';\nimport { unstable_navigationEvents } from './navigationEvents';\nimport {\n hasParam,\n INTERNAL_EXPO_ROUTER_NO_ANIMATION_PARAM_NAME,\n removeParams,\n} from './navigationParams';\nimport { Screen } from './primitives';\nimport type { BottomTabNavigationEventMap } from './react-navigation/bottom-tabs';\nimport {\n useStateForPath,\n type EventConsumer,\n type EventMapBase,\n type NavigationProp,\n type NavigationState,\n type ParamListBase,\n type RouteProp,\n type ScreenListeners,\n} from './react-navigation/native';\nimport type { NativeStackNavigationEventMap } from './react-navigation/native-stack';\nimport type { UnknownOutputParams } from './types';\nimport { EmptyRoute } from './views/EmptyRoute';\nimport {\n SuspenseFallback as DefaultSuspenseFallback,\n type SuspenseFallbackProps,\n} from './views/SuspenseFallback';\nimport { Try } from './views/Try';\n\nexport type ScreenProps<\n TOptions extends Record = Record,\n TState extends NavigationState = NavigationState,\n TEventMap extends EventMapBase = EventMapBase,\n> = {\n /** Name is required when used inside a Layout component. */\n name?: string;\n /**\n * Redirect to the nearest sibling route.\n * If all children are `redirect={true}`, the layout will render `null` as there are no children to render.\n */\n redirect?: boolean;\n initialParams?: Record;\n options?:\n | TOptions\n | ((prop: { route: RouteProp; navigation: any }) => TOptions);\n\n listeners?:\n | ScreenListeners\n | ((prop: {\n route: RouteProp;\n navigation: any;\n }) => ScreenListeners);\n\n getId?: ({ params }: { params?: Record }) => string | undefined;\n\n dangerouslySingular?: SingularOptions;\n};\n\nexport type SingularOptions =\n | boolean\n | ((name: string, params: UnknownOutputParams) => string | undefined);\n\nfunction getSortedChildren(\n children: RouteNode[],\n order: ScreenProps[] = [],\n initialRouteName?: string\n): { route: RouteNode; props: Partial }[] {\n if (!order?.length) {\n return children\n .sort(sortRoutesWithInitial(initialRouteName))\n .map((route) => ({ route, props: {} }));\n }\n const entries = [...children];\n\n const ordered = order\n .map(\n ({\n name,\n redirect,\n initialParams,\n listeners,\n options,\n getId,\n dangerouslySingular: singular,\n }) => {\n if (!entries.length) {\n console.warn(\n `[Layout children]: Too many screens defined. Route \"${name}\" is extraneous.`\n );\n return null;\n }\n const matchIndex = entries.findIndex(\n (child) => child.route === name || child.route === `${name}/index`\n );\n if (matchIndex === -1) {\n console.warn(\n `[Layout children]: No route named \"${name}\" exists in nested children:`,\n children.map(({ route }) => route)\n );\n return null;\n } else {\n // Get match and remove from entries\n const match = entries[matchIndex];\n entries.splice(matchIndex, 1);\n\n // Ensure to return null after removing from entries.\n if (redirect) {\n if (typeof redirect === 'string') {\n throw new Error(`Redirecting to a specific route is not supported yet.`);\n }\n return null;\n }\n\n if (getId) {\n console.warn(\n `Deprecated: prop 'getId' on screen ${name} is deprecated. Please rename the prop to 'dangerouslySingular'`\n );\n if (singular) {\n console.warn(\n `Screen ${name} cannot use both getId and dangerouslySingular together.`\n );\n }\n } else if (singular) {\n // If singular is set, use it as the getId function.\n if (typeof singular === 'string') {\n getId = () => singular;\n } else if (typeof singular === 'function' && name) {\n getId = (options) => singular(name, options.params || {});\n } else if (singular === true && name) {\n getId = (options) => getSingularId(name, options);\n }\n }\n\n return {\n route: match,\n props: { initialParams, listeners, options, getId },\n };\n }\n }\n )\n .filter(Boolean) as {\n route: RouteNode;\n props: Partial;\n }[];\n\n // Add any remaining children\n ordered.push(\n ...entries.sort(sortRoutesWithInitial(initialRouteName)).map((route) => ({ route, props: {} }))\n );\n\n return ordered;\n}\n\n/**\n * @returns React Navigation screens sorted by the `route` property.\n */\nexport function useSortedScreens(\n order: ScreenProps[],\n protectedScreens: Set,\n useOnlyUserDefinedScreens: boolean = false\n): React.ReactNode[] {\n const node = useRouteNode();\n\n const nodeChildren = node?.children ?? [];\n const children = useOnlyUserDefinedScreens\n ? nodeChildren.filter((child) =>\n order.some(\n (userDefinedScreen) =>\n userDefinedScreen.name === child.route ||\n `${userDefinedScreen.name}/index` === child.route\n )\n )\n : nodeChildren;\n\n const sorted = children.length ? getSortedChildren(children, order, node?.initialRouteName) : [];\n return React.useMemo(\n () =>\n sorted\n .filter((item) => {\n const route = item.route.route;\n return (\n !protectedScreens.has(route) && !protectedScreens.has(route.replace(/\\/index$/, ''))\n );\n })\n .map((value) => {\n return routeToScreen(value.route, value.props);\n }),\n [sorted, protectedScreens]\n );\n}\n\nfunction fromImport(\n value: RouteNode,\n { ErrorBoundary, SuspenseFallback, ...component }: LoadedRoute\n) {\n // If possible, add a more helpful display name for the component stack to improve debugging of React errors such as `Text strings must be rendered within a component.`.\n if (component?.default && __DEV__) {\n component.default.displayName ??= `${component.default.name ?? 'Route'}(${value.contextKey})`;\n }\n\n if (ErrorBoundary) {\n const Wrapped = React.forwardRef((props: any, ref: any) => {\n const children = React.createElement(component.default || EmptyRoute, {\n ...props,\n ref,\n });\n return {children};\n });\n\n if (__DEV__) {\n Wrapped.displayName = `ErrorBoundary(${value.contextKey})`;\n }\n\n return {\n default: Wrapped,\n SuspenseFallback,\n };\n }\n if (process.env.NODE_ENV !== 'production') {\n if (\n typeof component.default === 'object' &&\n component.default &&\n Object.keys(component.default).length === 0\n ) {\n return { default: EmptyRoute, SuspenseFallback };\n }\n }\n\n return { default: component.default, SuspenseFallback };\n}\n\nfunction fromLoadedRoute(value: RouteNode, res: LoadedRoute) {\n if (!(res instanceof Promise)) {\n return fromImport(value, res);\n }\n\n return res.then(fromImport.bind(null, value));\n}\n\n// TODO: Maybe there's a more React-y way to do this?\n// Without this store, the process enters a recursive loop.\nconst qualifiedStore = new WeakMap>();\n\n/** Wrap the component with various enhancements and add access to child routes. */\nexport function getQualifiedRouteComponent(value: RouteNode) {\n if (qualifiedStore.has(value)) {\n return qualifiedStore.get(value)!;\n }\n\n let ScreenComponent:\n | React.ForwardRefExoticComponent>\n | React.ComponentType<{ segment?: string }>;\n\n let LayoutSuspenseFallback: React.ComponentType | undefined;\n\n // TODO: This ensures sync doesn't use React.lazy, but it's not ideal.\n if (EXPO_ROUTER_IMPORT_MODE === 'lazy') {\n ScreenComponent = React.lazy(async () => {\n const res = value.loadRoute();\n return fromLoadedRoute(value, res) as Promise<{\n default: React.ComponentType;\n }>;\n });\n\n if (__DEV__) {\n ScreenComponent.displayName = `AsyncRoute(${value.route})`;\n }\n } else {\n const res = value.loadRoute();\n const result = fromImport(value, res);\n ScreenComponent = result.default!;\n LayoutSuspenseFallback = value.type === 'layout' ? result.SuspenseFallback : undefined;\n }\n const WrappedScreenComponent: typeof ScreenComponent = (props: object) => {\n useColorSchemeChangesIfNeeded();\n return ;\n };\n function BaseRoute({\n // Remove these React Navigation props to\n // enforce usage of expo-router hooks (where the query params are correct).\n route,\n navigation,\n\n // Pass all other props to the component\n ...props\n }: {\n route?: RouteProp;\n navigation: Omit<\n NavigationProp<\n ParamListBase,\n string,\n undefined,\n NavigationState,\n object,\n NativeStackNavigationEventMap | BottomTabNavigationEventMap\n >,\n 'getState'\n > & {\n getState(): NavigationState | undefined;\n };\n }) {\n const stateForPath = useStateForPath();\n const isFocused = navigation.isFocused();\n const store = useExpoRouterStore();\n const InheritedSuspenseFallback = use(SuspenseFallbackContext);\n\n const ResolvedSuspenseFallback =\n EXPO_ROUTER_IMPORT_MODE === 'lazy'\n ? DefaultSuspenseFallback\n : (LayoutSuspenseFallback ?? InheritedSuspenseFallback ?? DefaultSuspenseFallback);\n const providedSuspenseFallback =\n value.type === 'layout'\n ? (LayoutSuspenseFallback ?? InheritedSuspenseFallback)\n : InheritedSuspenseFallback;\n\n if (isFocused) {\n const state = navigation.getState();\n const isLeaf = !(state && 'state' in state.routes[state.index]!);\n if (isLeaf && stateForPath) store.setFocusedState(stateForPath);\n }\n\n useEffect(\n () =>\n navigation.addListener('focus', () => {\n const state = navigation.getState();\n const isLeaf = !(state && 'state' in state.routes[state.index]!);\n // Because setFocusedState caches the route info, this call will only trigger rerenders\n // if the component itself didn’t rerender and the route info changed.\n // Otherwise, the update from the `if` above will handle it,\n // and this won’t cause a redundant second update.\n if (isLeaf && stateForPath) store.setFocusedState(stateForPath);\n }),\n [navigation]\n );\n\n useEffect(() => {\n return navigation.addListener('transitionEnd', (e) => {\n if (!e?.data?.closing) {\n // When navigating to a screen, remove the no animation param to re-enable animations\n // Otherwise the navigation back would also have no animation\n if (hasParam(route?.params, INTERNAL_EXPO_ROUTER_NO_ANIMATION_PARAM_NAME)) {\n navigation.replaceParams(\n removeParams(route?.params, [INTERNAL_EXPO_ROUTER_NO_ANIMATION_PARAM_NAME])\n );\n }\n }\n });\n }, [navigation]);\n\n const isRouteType = value.type === 'route';\n const hasRouteKey = !!route?.key;\n\n return (\n \n \n {unstable_navigationEvents.isEnabled() && isRouteType && hasRouteKey && (\n \n )}\n \n \n \n }>\n \n \n \n \n \n );\n }\n\n if (__DEV__) {\n BaseRoute.displayName = `Route(${value.route})`;\n }\n\n qualifiedStore.set(value, BaseRoute);\n return BaseRoute;\n}\n\nfunction AnalyticsListeners({\n navigation,\n screenId,\n}: {\n navigation: EventConsumer & {\n isFocused(): boolean;\n };\n screenId: string;\n}) {\n const isFirstRenderRef = React.useRef(true);\n const hasBlurredRef = React.useRef(true);\n const routeInfo = useCurrentRouteInfo();\n\n const isFocused = navigation.isFocused();\n\n if (isFirstRenderRef.current) {\n isFirstRenderRef.current = false;\n if (routeInfo && !isFocused) {\n unstable_navigationEvents.emit('pagePreloaded', {\n pathname: routeInfo.pathname,\n params: routeInfo.params,\n segments: routeInfo.segments,\n screenId,\n });\n }\n }\n\n useEffect(() => {\n if (routeInfo) {\n return () => {\n unstable_navigationEvents.emit('pageRemoved', {\n pathname: routeInfo.pathname,\n params: routeInfo.params,\n segments: routeInfo.segments,\n screenId,\n });\n };\n }\n return () => {};\n }, [routeInfo?.params, routeInfo?.pathname, routeInfo?.segments, screenId]);\n\n // Emit `pageFocused` from an effect — not during render — so it fires after the\n // focused screen's content has committed. `hasBlurredRef` deduplicates across both paths.\n useEffect(() => {\n if (isFocused && routeInfo && hasBlurredRef.current) {\n unstable_navigationEvents.emit('pageFocused', {\n pathname: routeInfo.pathname,\n params: routeInfo.params,\n segments: routeInfo.segments,\n screenId,\n });\n hasBlurredRef.current = false;\n }\n }, [isFocused, routeInfo?.pathname, routeInfo?.params, routeInfo?.segments, screenId]);\n\n useEffect(() => {\n if (routeInfo) {\n const cleanFocus = navigation.addListener('focus', () => {\n // If the screen was not blurred, don't emit focused again\n // hasBlurredRef will be false when the screen was initially focused\n if (hasBlurredRef.current) {\n unstable_navigationEvents.emit('pageFocused', {\n pathname: routeInfo.pathname,\n params: routeInfo.params,\n segments: routeInfo.segments,\n screenId,\n });\n hasBlurredRef.current = false;\n }\n });\n const cleanBlur = navigation.addListener('blur', () => {\n unstable_navigationEvents.emit('pageBlurred', {\n pathname: routeInfo.pathname,\n params: routeInfo.params,\n segments: routeInfo.segments,\n screenId,\n });\n hasBlurredRef.current = true;\n });\n return () => {\n cleanFocus();\n cleanBlur();\n };\n }\n return () => {};\n }, [navigation, routeInfo?.pathname, routeInfo?.params, routeInfo?.segments, screenId]);\n\n return null;\n}\n\nexport function screenOptionsFactory(\n route: RouteNode,\n options?: ScreenProps['options']\n): ScreenProps['options'] {\n return (args) => {\n // Only eager load generated components\n const staticOptions = route.generated ? route.loadRoute()?.getNavOptions : null;\n const staticResult = typeof staticOptions === 'function' ? staticOptions(args) : staticOptions;\n const dynamicResult = typeof options === 'function' ? options?.(args) : options;\n const output = {\n ...staticResult,\n ...dynamicResult,\n };\n\n // Prevent generated screens from showing up in the tab bar.\n if (route.internal) {\n output.tabBarItemStyle = { display: 'none' };\n output.tabBarButton = () => null;\n // TODO: React Navigation doesn't provide a way to prevent rendering the drawer item.\n output.drawerItemStyle = { height: 0, display: 'none' };\n }\n\n return output;\n };\n}\n\nexport function routeToScreen(\n route: RouteNode,\n { options, getId, ...props }: Partial = {}\n) {\n return (\n getQualifiedRouteComponent(route)}\n />\n );\n}\n\nexport function getSingularId(name: string, options: Record = {}) {\n return name\n .split('/')\n .map((segment) => {\n if (segment.startsWith('[...')) {\n return options.params?.[segment.slice(4, -1)]?.join('/') || segment;\n } else if (segment.startsWith('[') && segment.endsWith(']')) {\n return options.params?.[segment.slice(1, -1)] || segment;\n } else {\n return segment;\n }\n })\n .join('/');\n}\n"]} \ No newline at end of file diff --git a/packages/expo-router/src/navigationEvents/types.ts b/packages/expo-router/src/navigationEvents/types.ts index 822fd353d0a19b..fd2757e1693ee0 100644 --- a/packages/expo-router/src/navigationEvents/types.ts +++ b/packages/expo-router/src/navigationEvents/types.ts @@ -5,6 +5,7 @@ export interface BasePageEvent { pathname: string; params: Record; screenId: string; + segments: string[]; } /** diff --git a/packages/expo-router/src/useScreens.tsx b/packages/expo-router/src/useScreens.tsx index eb7b90f7f0e4ff..f233c430bbf22d 100644 --- a/packages/expo-router/src/useScreens.tsx +++ b/packages/expo-router/src/useScreens.tsx @@ -419,6 +419,7 @@ function AnalyticsListeners({ unstable_navigationEvents.emit('pagePreloaded', { pathname: routeInfo.pathname, params: routeInfo.params, + segments: routeInfo.segments, screenId, }); } @@ -430,12 +431,13 @@ function AnalyticsListeners({ unstable_navigationEvents.emit('pageRemoved', { pathname: routeInfo.pathname, params: routeInfo.params, + segments: routeInfo.segments, screenId, }); }; } return () => {}; - }, [routeInfo?.params, routeInfo?.pathname, screenId]); + }, [routeInfo?.params, routeInfo?.pathname, routeInfo?.segments, screenId]); // Emit `pageFocused` from an effect — not during render — so it fires after the // focused screen's content has committed. `hasBlurredRef` deduplicates across both paths. @@ -444,11 +446,12 @@ function AnalyticsListeners({ unstable_navigationEvents.emit('pageFocused', { pathname: routeInfo.pathname, params: routeInfo.params, + segments: routeInfo.segments, screenId, }); hasBlurredRef.current = false; } - }, [isFocused, routeInfo?.pathname, routeInfo?.params, screenId]); + }, [isFocused, routeInfo?.pathname, routeInfo?.params, routeInfo?.segments, screenId]); useEffect(() => { if (routeInfo) { @@ -459,6 +462,7 @@ function AnalyticsListeners({ unstable_navigationEvents.emit('pageFocused', { pathname: routeInfo.pathname, params: routeInfo.params, + segments: routeInfo.segments, screenId, }); hasBlurredRef.current = false; @@ -468,6 +472,7 @@ function AnalyticsListeners({ unstable_navigationEvents.emit('pageBlurred', { pathname: routeInfo.pathname, params: routeInfo.params, + segments: routeInfo.segments, screenId, }); hasBlurredRef.current = true; @@ -478,7 +483,7 @@ function AnalyticsListeners({ }; } return () => {}; - }, [navigation, routeInfo?.pathname, routeInfo?.params, screenId]); + }, [navigation, routeInfo?.pathname, routeInfo?.params, routeInfo?.segments, screenId]); return null; } diff --git a/packages/expo-type-information/build/cli.js b/packages/expo-type-information/build/cli.js index 2a792c179a41de..82c60cf490976f 100644 --- a/packages/expo-type-information/build/cli.js +++ b/packages/expo-type-information/build/cli.js @@ -8,6 +8,7 @@ const generateModuleTypesCommand_1 = require("./commands/generateModuleTypesComm const generateViewTypesCommand_1 = require("./commands/generateViewTypesCommand"); const inlineModulesInterfaceCommand_1 = require("./commands/inlineModulesInterfaceCommand"); const moduleInterfaceCommand_1 = require("./commands/moduleInterfaceCommand"); +const preprocessFileCommand_1 = require("./commands/preprocessFileCommand"); const shortModuleInterfaceCommand_1 = require("./commands/shortModuleInterfaceCommand"); const typeInformationCommand_1 = require("./commands/typeInformationCommand"); async function main(args) { @@ -29,6 +30,7 @@ async function main(args) { (0, generateModuleTypesCommand_1.generateModuleTypesCommand)(otherCommands); (0, generateViewTypesCommand_1.generateViewTypesCommand)(otherCommands); (0, generateJSXIntrinsicsCommand_1.generateJsxIntrinsics)(otherCommands); + (0, preprocessFileCommand_1.preprocessFileCommand)(otherCommands); await cli.parseAsync(args, { from: 'user' }); } main(process.argv.slice(2)); diff --git a/packages/expo-type-information/build/cli.js.map b/packages/expo-type-information/build/cli.js.map index 137b6a130c5105..2907fedc795a2e 100644 --- a/packages/expo-type-information/build/cli.js.map +++ b/packages/expo-type-information/build/cli.js.map @@ -1 +1 @@ -{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";;AAAA,yCAAoC;AAEpC,0DAAkE;AAClE,0FAAgF;AAChF,wFAAqF;AACrF,sFAAmF;AACnF,kFAA+E;AAC/E,4FAAyF;AACzF,8EAA2E;AAC3E,wFAAqF;AACrF,8EAA2E;AAE3E,KAAK,UAAU,IAAI,CAAC,IAAc;IAChC,IAAI,CAAC,IAAA,sCAAuB,GAAE,EAAE,CAAC;QAC/B,OAAO,CAAC,KAAK,CAAC,uEAAuE,CAAC,CAAC;QACvF,OAAO;IACT,CAAC;IACD,MAAM,GAAG,GAAG,IAAI,mBAAO,EAAE,CAAC;IAC1B,GAAG;SACA,IAAI,CAAC,uBAAuB,CAAC;SAC7B,OAAO,CAAC,OAAO,CAAC,iBAAiB,CAAC,CAAC,OAAO,CAAC;SAC3C,WAAW,CAAC,2EAA2E,CAAC,CAAC;IAE5F,IAAA,+CAAsB,EAAC,GAAG,CAAC,CAAC;IAC5B,IAAA,6DAA6B,EAAC,GAAG,CAAC,CAAC;IACnC,IAAA,yDAA2B,EAAC,GAAG,CAAC,CAAC;IACjC,IAAA,yDAA2B,EAAC,GAAG,CAAC,CAAC;IAEjC,MAAM,aAAa,GAAG,GAAG,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,WAAW,CAAC,oCAAoC,CAAC,CAAC;IAC7F,IAAA,+CAAsB,EAAC,aAAa,CAAC,CAAC;IACtC,IAAA,uDAA0B,EAAC,aAAa,CAAC,CAAC;IAC1C,IAAA,mDAAwB,EAAC,aAAa,CAAC,CAAC;IACxC,IAAA,oDAAqB,EAAC,aAAa,CAAC,CAAC;IACrC,MAAM,GAAG,CAAC,UAAU,CAAC,IAAI,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;AAC/C,CAAC;AAED,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC"} \ No newline at end of file +{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";;AAAA,yCAAoC;AAEpC,0DAAkE;AAClE,0FAAgF;AAChF,wFAAqF;AACrF,sFAAmF;AACnF,kFAA+E;AAC/E,4FAAyF;AACzF,8EAA2E;AAC3E,4EAAyE;AACzE,wFAAqF;AACrF,8EAA2E;AAE3E,KAAK,UAAU,IAAI,CAAC,IAAc;IAChC,IAAI,CAAC,IAAA,sCAAuB,GAAE,EAAE,CAAC;QAC/B,OAAO,CAAC,KAAK,CAAC,uEAAuE,CAAC,CAAC;QACvF,OAAO;IACT,CAAC;IACD,MAAM,GAAG,GAAG,IAAI,mBAAO,EAAE,CAAC;IAC1B,GAAG;SACA,IAAI,CAAC,uBAAuB,CAAC;SAC7B,OAAO,CAAC,OAAO,CAAC,iBAAiB,CAAC,CAAC,OAAO,CAAC;SAC3C,WAAW,CAAC,2EAA2E,CAAC,CAAC;IAE5F,IAAA,+CAAsB,EAAC,GAAG,CAAC,CAAC;IAC5B,IAAA,6DAA6B,EAAC,GAAG,CAAC,CAAC;IACnC,IAAA,yDAA2B,EAAC,GAAG,CAAC,CAAC;IACjC,IAAA,yDAA2B,EAAC,GAAG,CAAC,CAAC;IAEjC,MAAM,aAAa,GAAG,GAAG,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,WAAW,CAAC,oCAAoC,CAAC,CAAC;IAC7F,IAAA,+CAAsB,EAAC,aAAa,CAAC,CAAC;IACtC,IAAA,uDAA0B,EAAC,aAAa,CAAC,CAAC;IAC1C,IAAA,mDAAwB,EAAC,aAAa,CAAC,CAAC;IACxC,IAAA,oDAAqB,EAAC,aAAa,CAAC,CAAC;IACrC,IAAA,6CAAqB,EAAC,aAAa,CAAC,CAAC;IAErC,MAAM,GAAG,CAAC,UAAU,CAAC,IAAI,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;AAC/C,CAAC;AAED,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC"} \ No newline at end of file diff --git a/packages/expo-type-information/build/commands/preprocessFileCommand.d.ts b/packages/expo-type-information/build/commands/preprocessFileCommand.d.ts new file mode 100644 index 00000000000000..e185442d408bac --- /dev/null +++ b/packages/expo-type-information/build/commands/preprocessFileCommand.d.ts @@ -0,0 +1,2 @@ +import commander from 'commander'; +export declare function preprocessFileCommand(cli: commander.Command): commander.Command; diff --git a/packages/expo-type-information/build/commands/preprocessFileCommand.js b/packages/expo-type-information/build/commands/preprocessFileCommand.js new file mode 100644 index 00000000000000..5da8f3caaedea9 --- /dev/null +++ b/packages/expo-type-information/build/commands/preprocessFileCommand.js @@ -0,0 +1,31 @@ +"use strict"; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.preprocessFileCommand = preprocessFileCommand; +const fs_1 = __importDefault(require("fs")); +const commandUtils_1 = require("./commandUtils"); +const typeInformation_1 = require("../typeInformation"); +function preprocessFileCommand(cli) { + return (0, commandUtils_1.addCommonOptions)(cli.command('preprocess-file')) + .description('Print the preprocessed file(s) in the state right before parsing them using `sourcekitten`. It helps with checking how the `--module-path`, `--input-path`, and `--type-inference` options affect the parsed file.') + .summary('Print the preprocessed file(s) in the state right before parsing them using `sourcekitten`.') + .action(async (options) => { + const parsedArgs = await (0, commandUtils_1.parseCommandArguments)(options); + if (!parsedArgs) { + return; + } + const { realInputPaths, typeInference } = parsedArgs; + const command = async () => { + (0, typeInformation_1.withPreparedSingleFile)({ + input: { type: 'file', inputFileAbsolutePaths: realInputPaths }, + typeInference, + }, async (filePath) => { + console.log(await fs_1.default.promises.readFile(filePath, 'utf-8')); + }); + }; + (0, commandUtils_1.runCommandOnWatch)(parsedArgs, command); + }); +} +//# sourceMappingURL=preprocessFileCommand.js.map \ No newline at end of file diff --git a/packages/expo-type-information/build/commands/preprocessFileCommand.js.map b/packages/expo-type-information/build/commands/preprocessFileCommand.js.map new file mode 100644 index 00000000000000..df1eb8676a01a4 --- /dev/null +++ b/packages/expo-type-information/build/commands/preprocessFileCommand.js.map @@ -0,0 +1 @@ +{"version":3,"file":"preprocessFileCommand.js","sourceRoot":"","sources":["../../src/commands/preprocessFileCommand.ts"],"names":[],"mappings":";;;;;AAWA,sDA6BC;AAvCD,4CAAoB;AAEpB,iDAKwB;AACxB,wDAA4D;AAE5D,SAAgB,qBAAqB,CAAC,GAAsB;IAC1D,OAAO,IAAA,+BAAgB,EAAC,GAAG,CAAC,OAAO,CAAC,iBAAiB,CAAC,CAAC;SACpD,WAAW,CACV,oNAAoN,CACrN;SACA,OAAO,CACN,6FAA6F,CAC9F;SACA,MAAM,CAAC,KAAK,EAAE,OAAiD,EAAE,EAAE;QAClE,MAAM,UAAU,GAAG,MAAM,IAAA,oCAAqB,EAAC,OAAO,CAAC,CAAC;QACxD,IAAI,CAAC,UAAU,EAAE,CAAC;YAChB,OAAO;QACT,CAAC;QACD,MAAM,EAAE,cAAc,EAAE,aAAa,EAAE,GAAG,UAAU,CAAC;QAErD,MAAM,OAAO,GAAG,KAAK,IAAI,EAAE;YACzB,IAAA,wCAAsB,EACpB;gBACE,KAAK,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,sBAAsB,EAAE,cAAc,EAAE;gBAC/D,aAAa;aACd,EACD,KAAK,EAAE,QAAQ,EAAE,EAAE;gBACjB,OAAO,CAAC,GAAG,CAAC,MAAM,YAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC,CAAC;YAC7D,CAAC,CACF,CAAC;QACJ,CAAC,CAAC;QAEF,IAAA,gCAAiB,EAAC,UAAU,EAAE,OAAO,CAAC,CAAC;IACzC,CAAC,CAAC,CAAC;AACP,CAAC"} \ No newline at end of file diff --git a/packages/expo-type-information/build/typeInformation.d.ts b/packages/expo-type-information/build/typeInformation.d.ts index 482183ae219672..6553e513c06cf2 100644 --- a/packages/expo-type-information/build/typeInformation.d.ts +++ b/packages/expo-type-information/build/typeInformation.d.ts @@ -300,6 +300,7 @@ export type GetFileTypeInformationOptions = { /** The desired level of type inference. Defaults to PREPROCESS_AND_INFERENCE if omitted. */ typeInference?: TypeInferenceOption; }; +export declare function withPreparedSingleFile({ input, typeInference }: GetFileTypeInformationOptions, fn: (filePath: string) => Promise): Promise; /** * Reads and extracts `FileTypeInformation` from either a provided file path or a raw string of source code. * If a raw string is provided, or if the `PREPROCESS_AND_INFERENCE` inference option is selected, diff --git a/packages/expo-type-information/build/typeInformation.js b/packages/expo-type-information/build/typeInformation.js index 7cfbb8f7a9fc16..9a6f2a73b7ecb8 100644 --- a/packages/expo-type-information/build/typeInformation.js +++ b/packages/expo-type-information/build/typeInformation.js @@ -36,6 +36,7 @@ Object.defineProperty(exports, "__esModule", { value: true }); exports.TypeInferenceOption = exports.BasicType = exports.TypeKind = exports.IdentifierKind = void 0; exports.serializeTypeInformation = serializeTypeInformation; exports.deserializeTypeInformation = deserializeTypeInformation; +exports.withPreparedSingleFile = withPreparedSingleFile; exports.getFileTypeInformation = getFileTypeInformation; const fs = __importStar(require("fs")); const os = __importStar(require("os")); @@ -141,6 +142,19 @@ async function withTempFile(content, fn) { await fs.promises.rm(tempDir, { recursive: true, force: true }); } } +async function withPreparedSingleFile({ input, typeInference }, fn) { + const shouldPreprocessFile = typeInference === TypeInferenceOption.PREPROCESS_AND_INFERENCE; + if (!shouldPreprocessFile && input.type === 'file' && input.inputFileAbsolutePaths.length === 0) { + return fn(input.inputFileAbsolutePaths[0]); + } + const fileContent = input.type === 'file' + ? await mergeFileContents(input.inputFileAbsolutePaths) + : input.fileContent; + if (shouldPreprocessFile) { + return withTempFile((0, sourcekittenTypeInformation_1.preprocessSwiftFile)(fileContent), fn); + } + return withTempFile(fileContent, fn); +} /** * Reads and extracts `FileTypeInformation` from either a provided file path or a raw string of source code. * If a raw string is provided, or if the `PREPROCESS_AND_INFERENCE` inference option is selected, @@ -157,14 +171,8 @@ async function getFileTypeInformation({ input, typeInference, }) { typeInference: typeInferenceOn, }); } - const fileContent = input.type === 'file' - ? await mergeFileContents(input.inputFileAbsolutePaths) - : input.fileContent; - const preprocessedContent = shouldPreprocessFile ? (0, sourcekittenTypeInformation_1.preprocessSwiftFile)(fileContent) : fileContent; - return withTempFile(preprocessedContent, async (tempFilePath) => { - return (0, sourcekittenTypeInformation_1.getSwiftFileTypeInformation)(tempFilePath, { - typeInference: typeInferenceOn, - }); + return withPreparedSingleFile({ input, typeInference }, async (tempFilePath) => { + return (0, sourcekittenTypeInformation_1.getSwiftFileTypeInformation)(tempFilePath, { typeInference: typeInferenceOn }); }); } //# sourceMappingURL=typeInformation.js.map \ No newline at end of file diff --git a/packages/expo-type-information/build/typeInformation.js.map b/packages/expo-type-information/build/typeInformation.js.map index 0d9d6a1e3eeced..ea27a77350621f 100644 --- a/packages/expo-type-information/build/typeInformation.js.map +++ b/packages/expo-type-information/build/typeInformation.js.map @@ -1 +1 @@ -{"version":3,"file":"typeInformation.js","sourceRoot":"","sources":["../src/typeInformation.ts"],"names":[],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"typeInformation.js","sourceRoot":"","sources":["../src/typeInformation.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/packages/expo-type-information/src/cli.ts b/packages/expo-type-information/src/cli.ts index a3d0a1755b823c..df630dccccf3c9 100644 --- a/packages/expo-type-information/src/cli.ts +++ b/packages/expo-type-information/src/cli.ts @@ -7,6 +7,7 @@ import { generateModuleTypesCommand } from './commands/generateModuleTypesComman import { generateViewTypesCommand } from './commands/generateViewTypesCommand'; import { inlineModulesInterfaceCommand } from './commands/inlineModulesInterfaceCommand'; import { moduleInterfaceCommand } from './commands/moduleInterfaceCommand'; +import { preprocessFileCommand } from './commands/preprocessFileCommand'; import { shortModuleInterfaceCommand } from './commands/shortModuleInterfaceCommand'; import { typeInformationCommand } from './commands/typeInformationCommand'; @@ -31,6 +32,8 @@ async function main(args: string[]) { generateModuleTypesCommand(otherCommands); generateViewTypesCommand(otherCommands); generateJsxIntrinsics(otherCommands); + preprocessFileCommand(otherCommands); + await cli.parseAsync(args, { from: 'user' }); } diff --git a/packages/expo-type-information/src/commands/preprocessFileCommand.ts b/packages/expo-type-information/src/commands/preprocessFileCommand.ts new file mode 100644 index 00000000000000..9221f6c050419c --- /dev/null +++ b/packages/expo-type-information/src/commands/preprocessFileCommand.ts @@ -0,0 +1,41 @@ +import commander from 'commander'; +import fs from 'fs'; + +import { + addCommonOptions, + parseCommandArguments, + runCommandOnWatch, + TypeInformationCommandCommonAllArguments, +} from './commandUtils'; +import { withPreparedSingleFile } from '../typeInformation'; + +export function preprocessFileCommand(cli: commander.Command) { + return addCommonOptions(cli.command('preprocess-file')) + .description( + 'Print the preprocessed file(s) in the state right before parsing them using `sourcekitten`. It helps with checking how the `--module-path`, `--input-path`, and `--type-inference` options affect the parsed file.' + ) + .summary( + 'Print the preprocessed file(s) in the state right before parsing them using `sourcekitten`.' + ) + .action(async (options: TypeInformationCommandCommonAllArguments) => { + const parsedArgs = await parseCommandArguments(options); + if (!parsedArgs) { + return; + } + const { realInputPaths, typeInference } = parsedArgs; + + const command = async () => { + withPreparedSingleFile( + { + input: { type: 'file', inputFileAbsolutePaths: realInputPaths }, + typeInference, + }, + async (filePath) => { + console.log(await fs.promises.readFile(filePath, 'utf-8')); + } + ); + }; + + runCommandOnWatch(parsedArgs, command); + }); +} diff --git a/packages/expo-type-information/src/typeInformation.ts b/packages/expo-type-information/src/typeInformation.ts index 9d08a6b3af7478..7b19905c7e59e2 100644 --- a/packages/expo-type-information/src/typeInformation.ts +++ b/packages/expo-type-information/src/typeInformation.ts @@ -399,6 +399,26 @@ async function withTempFile(content: string, fn: (filePath: string) => Promis } } +export async function withPreparedSingleFile( + { input, typeInference }: GetFileTypeInformationOptions, + fn: (filePath: string) => Promise +): Promise { + const shouldPreprocessFile = typeInference === TypeInferenceOption.PREPROCESS_AND_INFERENCE; + if (!shouldPreprocessFile && input.type === 'file' && input.inputFileAbsolutePaths.length === 0) { + return fn(input.inputFileAbsolutePaths[0] as string); + } + + const fileContent = + input.type === 'file' + ? await mergeFileContents(input.inputFileAbsolutePaths) + : input.fileContent; + + if (shouldPreprocessFile) { + return withTempFile(preprocessSwiftFile(fileContent), fn); + } + return withTempFile(fileContent, fn); +} + /** * Reads and extracts `FileTypeInformation` from either a provided file path or a raw string of source code. * If a raw string is provided, or if the `PREPROCESS_AND_INFERENCE` inference option is selected, @@ -419,16 +439,7 @@ export async function getFileTypeInformation({ }); } - const fileContent = - input.type === 'file' - ? await mergeFileContents(input.inputFileAbsolutePaths) - : input.fileContent; - - const preprocessedContent = shouldPreprocessFile ? preprocessSwiftFile(fileContent) : fileContent; - - return withTempFile(preprocessedContent, async (tempFilePath) => { - return getSwiftFileTypeInformation(tempFilePath, { - typeInference: typeInferenceOn, - }); + return withPreparedSingleFile({ input, typeInference }, async (tempFilePath) => { + return getSwiftFileTypeInformation(tempFilePath, { typeInference: typeInferenceOn }); }); } diff --git a/packages/expo-ui/CHANGELOG.md b/packages/expo-ui/CHANGELOG.md index 79ea7916cde92a..1da1abc9534ec7 100644 --- a/packages/expo-ui/CHANGELOG.md +++ b/packages/expo-ui/CHANGELOG.md @@ -6,9 +6,13 @@ ### 🎉 New features +- Added `@expo/ui/community/pager-view` — a drop-in replacement for `react-native-pager-view`. ([#45499](https://github.com/expo/expo/pull/45499) by [@vonovak](https://github.com/vonovak)) +- [iOS] Added `textStyle` option to `font` modifier in `@expo/ui/swift-ui` for iOS Dynamic Type scaling. ([#46007](https://github.com/expo/expo/pull/46007) by [@ramonclaudio](https://github.com/ramonclaudio)) + ### 🐛 Bug fixes - [universal] Fix universal components dark theme ([#45969](https://github.com/expo/expo/pull/45969) by [@zoontek](https://github.com/zoontek)) +- [universal] Fix `BottomSheet` behavior by making `Host` optional, and fix Android exit animation. ([#46031](https://github.com/expo/expo/pull/46031) by [@nishan](https://github.com/intergalacticspacehighway)) ### 💡 Others diff --git a/packages/expo-ui/CLAUDE.md b/packages/expo-ui/CLAUDE.md index 2aeaba58c337b4..105a95a545122f 100644 --- a/packages/expo-ui/CLAUDE.md +++ b/packages/expo-ui/CLAUDE.md @@ -6,7 +6,7 @@ expo-ui is a library of native UI components for React Native, bridging SwiftUI Bridge native components to JavaScript with as little abstraction as possible. Native views should be thin wrappers — no added logic, state management, or behavior beyond what the platform component provides. Everything that can be set or controlled from JavaScript should be controlled from JavaScript. -Prefer controlled components: state lives in JS and is passed as props, not managed internally by the native view. Use a prop + callback pattern (e.g. `page` + `onPageChange`) instead of imperative ref methods (e.g. `setPage(index)`). This keeps the source of truth in React and makes components predictable and composable. +Mirror the native API shape. If the underlying SwiftUI / Compose component exposes imperative methods (e.g. SwiftUI's `ScrollViewProxy.scrollTo`, Compose's `PagerState.animateScrollToPage`), expose them as imperative methods in JS — don't paper them over with a controlled prop + sync layer just for the sake of a "React-y" API. ## Naming diff --git a/packages/expo-ui/android/src/main/java/expo/modules/ui/ExpoUIModule.kt b/packages/expo-ui/android/src/main/java/expo/modules/ui/ExpoUIModule.kt index 6457d5f71bc22a..b4cd917655cb3f 100644 --- a/packages/expo-ui/android/src/main/java/expo/modules/ui/ExpoUIModule.kt +++ b/packages/expo-ui/android/src/main/java/expo/modules/ui/ExpoUIModule.kt @@ -458,14 +458,20 @@ class ExpoUIModule : Module() { val scrollToPage by AsyncFunction() val onCurrentPageChange by Event() val onSettledPageChange by Event() + val onPageScroll by Event() + val onScrollInProgressChange by Event() + val onDragInteraction by Event() Content { props -> HorizontalPagerContent( - props, - animateScrollToPage, - scrollToPage, - { onCurrentPageChange(it) }, - { onSettledPageChange(it) } + props = props, + animateScrollToPage = animateScrollToPage, + scrollToPage = scrollToPage, + onCurrentPageChange = { onCurrentPageChange(it) }, + onSettledPageChange = { onSettledPageChange(it) }, + onPageScroll = { onPageScroll(it) }, + onScrollInProgressChange = { onScrollInProgressChange(it) }, + onDragInteraction = { onDragInteraction(it) } ) } } diff --git a/packages/expo-ui/android/src/main/java/expo/modules/ui/HorizontalPagerView.kt b/packages/expo-ui/android/src/main/java/expo/modules/ui/HorizontalPagerView.kt index 30e5497984e973..1c9f79a9f3b966 100644 --- a/packages/expo-ui/android/src/main/java/expo/modules/ui/HorizontalPagerView.kt +++ b/packages/expo-ui/android/src/main/java/expo/modules/ui/HorizontalPagerView.kt @@ -2,6 +2,7 @@ package expo.modules.ui import android.view.View import android.view.ViewGroup +import androidx.compose.foundation.interaction.DragInteraction import androidx.compose.foundation.pager.HorizontalPager import androidx.compose.foundation.pager.rememberPagerState import androidx.compose.runtime.Composable @@ -23,6 +24,7 @@ import expo.modules.kotlin.views.FunctionalComposableScope import expo.modules.kotlin.types.Either import expo.modules.kotlin.types.OptimizedRecord import expo.modules.kotlin.views.OptimizedComposeProps +import expo.modules.ui.state.WorkletCallback @OptimizedRecord data class HorizontalPagerCurrentPageChangeEvent( @@ -34,6 +36,22 @@ data class HorizontalPagerSettledPageChangeEvent( @Field val position: Int = 0 ) : Record +@OptimizedRecord +data class HorizontalPagerPageScrollEvent( + @Field val currentPage: Int = 0, + @Field val currentPageOffsetFraction: Float = 0f +) : Record + +@OptimizedRecord +data class HorizontalPagerScrollInProgressChangeEvent( + @Field val isScrollInProgress: Boolean = false +) : Record + +@OptimizedRecord +data class HorizontalPagerDragInteractionEvent( + @Field val kind: String = "start" +) : Record + @OptimizedComposeProps data class HorizontalPagerProps( val initialPage: Int = 0, @@ -42,6 +60,7 @@ data class HorizontalPagerProps( val userScrollEnabled: Boolean = true, val reverseLayout: Boolean = false, val beyondViewportPageCount: Int = 0, + val onPageScrollSync: WorkletCallback? = null, val modifiers: ModifierList = emptyList() ) : ComposeProps @@ -51,7 +70,10 @@ fun FunctionalComposableScope.HorizontalPagerContent( animateScrollToPage: AsyncFunctionHandle, scrollToPage: AsyncFunctionHandle, onCurrentPageChange: (HorizontalPagerCurrentPageChangeEvent) -> Unit, - onSettledPageChange: (HorizontalPagerSettledPageChangeEvent) -> Unit + onSettledPageChange: (HorizontalPagerSettledPageChangeEvent) -> Unit, + onPageScroll: (HorizontalPagerPageScrollEvent) -> Unit, + onScrollInProgressChange: (HorizontalPagerScrollInProgressChangeEvent) -> Unit, + onDragInteraction: (HorizontalPagerDragInteractionEvent) -> Unit ) { // Mirror view.size into snapshot state so the outer scope recomposes when // children are added/removed. Without this, Compose's pager caches its @@ -59,6 +81,9 @@ fun FunctionalComposableScope.HorizontalPagerContent( // and crashes on scroll past the last index it knew about, because reading // view.size — a plain Java property — registers no snapshot dependency. val pageCountState = remember { mutableIntStateOf(view.size) } + // Assumes sole ownership of `view`'s OnHierarchyChangeListener — there is + // only one slot per ViewGroup, and `onDispose` resets it to null. Safe + // because `view` is the expo Host's private container. DisposableEffect(view) { view.setOnHierarchyChangeListener(object : ViewGroup.OnHierarchyChangeListener { override fun onChildViewAdded(parent: View?, child: View?) { @@ -72,35 +97,91 @@ fun FunctionalComposableScope.HorizontalPagerContent( onDispose { view.setOnHierarchyChangeListener(null) } } - val pageCount = pageCountState.intValue - if (pageCount == 0) return + // Register the imperative handles before the empty-children early return, so + // in case there ever are JS calls dispatched while `view.size` is still 0, they bind to a handler. + // `coerceAtLeast(0)` guards against `coerceIn(0, -1)` throwing in that gap. val pagerState = rememberPagerState( - initialPage = props.initialPage.coerceIn(0, pageCount - 1) + initialPage = props.initialPage.coerceAtLeast(0) ) { pageCountState.intValue } val scope = rememberCoroutineScope() // Dispatch into the composition's scope so the scroll runs with Compose's // MonotonicFrameClock; .join() lets the JS-side promise await completion. + // Clamp page indices here because Compose throws on out-of-range values. animateScrollToPage.handle { page -> - scope.launch { pagerState.animateScrollToPage(page) }.join() + val count = pageCountState.intValue + if (count > 0) { + val clamped = page.coerceIn(0, count - 1) + scope.launch { pagerState.animateScrollToPage(clamped) }.join() + } } scrollToPage.handle { page -> - scope.launch { pagerState.scrollToPage(page) }.join() + val count = pageCountState.intValue + if (count > 0) { + val clamped = page.coerceIn(0, count - 1) + scope.launch { pagerState.scrollToPage(clamped) }.join() + } } - // Mirror Compose's PagerState observable fields to JS callbacks. Drop the - // first emission so we don't echo the initial value back on mount. - LaunchedEffect(pagerState) { - snapshotFlow { pagerState.currentPage } - .drop(1) - .collect { onCurrentPageChange(HorizontalPagerCurrentPageChangeEvent(it)) } - } + val pageCount = pageCountState.intValue + if (pageCount == 0) return + // Mirror Compose's PagerState observable fields to JS callbacks. Each + // state-backed snapshotFlow drops its first emission so we don't echo the + // initial value back on mount; the interactionSource flow doesn't drop + // because its emissions are discrete events, not state values. LaunchedEffect(pagerState) { - snapshotFlow { pagerState.settledPage } - .drop(1) - .collect { onSettledPageChange(HorizontalPagerSettledPageChangeEvent(it)) } + launch { + snapshotFlow { pagerState.currentPage } + .drop(1) + .collect { onCurrentPageChange(HorizontalPagerCurrentPageChangeEvent(it)) } + } + launch { + snapshotFlow { pagerState.settledPage } + .drop(1) + .collect { onSettledPageChange(HorizontalPagerSettledPageChangeEvent(it)) } + } + launch { + snapshotFlow { + pagerState.currentPage to pagerState.currentPageOffsetFraction + } + .drop(1) + .collect { (currentPage, fraction) -> + // Mutually exclusive: the JS wrapper only wires one path at a time. + // Skipping the regular event when a worklet is attached avoids the + // per-frame Record allocation + async JS-thread event dispatch. + val sync = props.onPageScrollSync + if (sync != null) { + sync.invoke(currentPage, fraction) + } else { + onPageScroll( + HorizontalPagerPageScrollEvent( + currentPage = currentPage, + currentPageOffsetFraction = fraction + ) + ) + } + } + } + launch { + snapshotFlow { pagerState.isScrollInProgress } + .drop(1) + .collect { + onScrollInProgressChange(HorizontalPagerScrollInProgressChangeEvent(isScrollInProgress = it)) + } + } + launch { + pagerState.interactionSource.interactions.collect { interaction -> + val kind = when (interaction) { + is DragInteraction.Start -> "start" + is DragInteraction.Stop -> "stop" + is DragInteraction.Cancel -> "cancel" + else -> return@collect + } + onDragInteraction(HorizontalPagerDragInteractionEvent(kind = kind)) + } + } } val contentPadding = props.contentPadding.toPaddingValues() diff --git a/packages/expo-ui/android/src/main/java/expo/modules/ui/colors/MaterialColors.kt b/packages/expo-ui/android/src/main/java/expo/modules/ui/colors/MaterialColors.kt index 2dd359c098e436..9b3a8b3a72f727 100644 --- a/packages/expo-ui/android/src/main/java/expo/modules/ui/colors/MaterialColors.kt +++ b/packages/expo-ui/android/src/main/java/expo/modules/ui/colors/MaterialColors.kt @@ -13,6 +13,7 @@ import com.google.android.material.color.utilities.MaterialDynamicColors import com.google.android.material.color.utilities.SchemeTonalSpot import expo.modules.kotlin.records.Field import expo.modules.kotlin.records.Record +import expo.modules.kotlin.types.OptimizedRecord import expo.modules.ui.ExpoColorScheme /** @@ -21,6 +22,7 @@ import expo.modules.ui.ExpoColorScheme */ internal val isDynamicColorSupported: Boolean = Build.VERSION.SDK_INT >= Build.VERSION_CODES.S +@OptimizedRecord internal class MaterialColorsOptions : Record { @Field val scheme: ExpoColorScheme? = null diff --git a/packages/expo-ui/build/State/index.d.ts b/packages/expo-ui/build/State/index.d.ts new file mode 100644 index 00000000000000..19a1c88bc45850 --- /dev/null +++ b/packages/expo-ui/build/State/index.d.ts @@ -0,0 +1,6 @@ +import './index.fx'; +export { useNativeState, type ObservableState } from './useNativeState'; +export { useWorkletProp } from './useWorkletProp'; +export { worklets } from './optionalWorklets'; +export { getStateId } from './utils'; +//# sourceMappingURL=index.d.ts.map \ No newline at end of file diff --git a/packages/expo-ui/build/State/index.d.ts.map b/packages/expo-ui/build/State/index.d.ts.map new file mode 100644 index 00000000000000..43c9548dc63754 --- /dev/null +++ b/packages/expo-ui/build/State/index.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/State/index.ts"],"names":[],"mappings":"AAIA,OAAO,YAAY,CAAC;AAEpB,OAAO,EAAE,cAAc,EAAE,KAAK,eAAe,EAAE,MAAM,kBAAkB,CAAC;AACxE,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC"} \ No newline at end of file diff --git a/packages/expo-ui/build/community/pager-view/PagerView.android.d.ts b/packages/expo-ui/build/community/pager-view/PagerView.android.d.ts new file mode 100644 index 00000000000000..0b16ee42b8cd78 --- /dev/null +++ b/packages/expo-ui/build/community/pager-view/PagerView.android.d.ts @@ -0,0 +1,7 @@ +import { type PagerViewProps } from './types'; +/** + * Drop-in replacement for `react-native-pager-view` on Android. + * Renders a Jetpack Compose `HorizontalPager`. + */ +export declare function PagerView(props: PagerViewProps): import("react/jsx-runtime").JSX.Element; +//# sourceMappingURL=PagerView.android.d.ts.map \ No newline at end of file diff --git a/packages/expo-ui/build/community/pager-view/PagerView.android.d.ts.map b/packages/expo-ui/build/community/pager-view/PagerView.android.d.ts.map new file mode 100644 index 00000000000000..34ee94ba421fe5 --- /dev/null +++ b/packages/expo-ui/build/community/pager-view/PagerView.android.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"PagerView.android.d.ts","sourceRoot":"","sources":["../../../src/community/pager-view/PagerView.android.tsx"],"names":[],"mappings":"AAYA,OAAO,EAAmB,KAAK,cAAc,EAAE,MAAM,SAAS,CAAC;AAO/D;;;GAGG;AACH,wBAAgB,SAAS,CAAC,KAAK,EAAE,cAAc,2CA+G9C"} \ No newline at end of file diff --git a/packages/expo-ui/build/community/pager-view/PagerView.d.ts b/packages/expo-ui/build/community/pager-view/PagerView.d.ts new file mode 100644 index 00000000000000..be2a92039f114b --- /dev/null +++ b/packages/expo-ui/build/community/pager-view/PagerView.d.ts @@ -0,0 +1,8 @@ +import type { PagerViewProps } from './types'; +/** + * A drop-in replacement for `react-native-pager-view`. Renders a horizontally + * paged view backed by Jetpack Compose's `HorizontalPager` on Android and + * SwiftUI on iOS. Each child is treated as a separate page. + */ +export declare function PagerView(_props: PagerViewProps): never; +//# sourceMappingURL=PagerView.d.ts.map \ No newline at end of file diff --git a/packages/expo-ui/build/community/pager-view/PagerView.d.ts.map b/packages/expo-ui/build/community/pager-view/PagerView.d.ts.map new file mode 100644 index 00000000000000..160ec24553b924 --- /dev/null +++ b/packages/expo-ui/build/community/pager-view/PagerView.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"PagerView.d.ts","sourceRoot":"","sources":["../../../src/community/pager-view/PagerView.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAE9C;;;;GAIG;AACH,wBAAgB,SAAS,CAAC,MAAM,EAAE,cAAc,GAAG,KAAK,CAIvD"} \ No newline at end of file diff --git a/packages/expo-ui/build/community/pager-view/PagerView.ios.d.ts b/packages/expo-ui/build/community/pager-view/PagerView.ios.d.ts new file mode 100644 index 00000000000000..745840f8cb3794 --- /dev/null +++ b/packages/expo-ui/build/community/pager-view/PagerView.ios.d.ts @@ -0,0 +1,15 @@ +import { type PagerViewProps } from './types'; +/** + * Drop-in replacement for `react-native-pager-view` on iOS. + * + * Renders a SwiftUI `ScrollView` with paging behavior. Scroll position is the + * single source of truth: an `ObservableState` bound through the + * `scrollPosition` modifier drives initial placement, user-swipe writeback, + * and imperative `setPage` / `setPageWithoutAnimation`. The animated path + * routes the write through `withAnimation`; if `react-native-worklets` isn't + * installed, `setPage` falls back to a non-animated jump. Requires iOS 17+. + * Continuous progress (`onPageScroll`) and scroll state + * (`onPageScrollStateChanged`) events require iOS 18+. + */ +export declare function PagerView(props: PagerViewProps): import("react/jsx-runtime").JSX.Element; +//# sourceMappingURL=PagerView.ios.d.ts.map \ No newline at end of file diff --git a/packages/expo-ui/build/community/pager-view/PagerView.ios.d.ts.map b/packages/expo-ui/build/community/pager-view/PagerView.ios.d.ts.map new file mode 100644 index 00000000000000..f62af9408b17bf --- /dev/null +++ b/packages/expo-ui/build/community/pager-view/PagerView.ios.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"PagerView.ios.d.ts","sourceRoot":"","sources":["../../../src/community/pager-view/PagerView.ios.tsx"],"names":[],"mappings":"AAaA,OAAO,EAAmB,KAAK,cAAc,EAAE,MAAM,SAAS,CAAC;AAiC/D;;;;;;;;;;;GAWG;AACH,wBAAgB,SAAS,CAAC,KAAK,EAAE,cAAc,2CA+J9C"} \ No newline at end of file diff --git a/packages/expo-ui/build/community/pager-view/index.d.ts b/packages/expo-ui/build/community/pager-view/index.d.ts new file mode 100644 index 00000000000000..cd0c2005ccf9c2 --- /dev/null +++ b/packages/expo-ui/build/community/pager-view/index.d.ts @@ -0,0 +1,3 @@ +export type { PagerViewProps, PagerViewRef, PagerViewOnPageScrollEventData, PagerViewOnPageSelectedEventData, PageScrollStateChangedEventData, PagerViewOnPageScrollEvent, PagerViewOnPageSelectedEvent, PageScrollStateChangedEvent, } from './types'; +export { PagerView, PagerView as default } from './PagerView'; +//# sourceMappingURL=index.d.ts.map \ No newline at end of file diff --git a/packages/expo-ui/build/community/pager-view/index.d.ts.map b/packages/expo-ui/build/community/pager-view/index.d.ts.map new file mode 100644 index 00000000000000..a6e4e3c1bc4d48 --- /dev/null +++ b/packages/expo-ui/build/community/pager-view/index.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/community/pager-view/index.tsx"],"names":[],"mappings":"AAAA,YAAY,EACV,cAAc,EACd,YAAY,EACZ,8BAA8B,EAC9B,gCAAgC,EAChC,+BAA+B,EAC/B,0BAA0B,EAC1B,4BAA4B,EAC5B,2BAA2B,GAC5B,MAAM,SAAS,CAAC;AAGjB,OAAO,EAAE,SAAS,EAAE,SAAS,IAAI,OAAO,EAAE,MAAM,aAAa,CAAC"} \ No newline at end of file diff --git a/packages/expo-ui/build/community/pager-view/types.d.ts b/packages/expo-ui/build/community/pager-view/types.d.ts new file mode 100644 index 00000000000000..7cbdb845ee46fd --- /dev/null +++ b/packages/expo-ui/build/community/pager-view/types.d.ts @@ -0,0 +1,128 @@ +import type { ReactNode, Ref } from 'react'; +import type { NativeSyntheticEvent, ViewProps } from 'react-native'; +/** + * Event payload for `onPageScroll`. Mirrors the upstream + * `react-native-pager-view` shape. + */ +export type PagerViewOnPageScrollEventData = Readonly<{ + position: number; + offset: number; +}>; +/** + * Event payload for `onPageSelected`. Mirrors the upstream + * `react-native-pager-view` shape. + */ +export type PagerViewOnPageSelectedEventData = Readonly<{ + position: number; +}>; +/** + * Event payload for `onPageScrollStateChanged`. Mirrors the upstream + * `react-native-pager-view` shape. + */ +export type PageScrollStateChangedEventData = Readonly<{ + pageScrollState: 'idle' | 'dragging' | 'settling'; +}>; +export type PagerViewOnPageScrollEvent = NativeSyntheticEvent; +export type PagerViewOnPageSelectedEvent = NativeSyntheticEvent; +export type PageScrollStateChangedEvent = NativeSyntheticEvent; +/** + * Wraps a payload as `NativeSyntheticEvent`. We only populate `nativeEvent` + * since our consumers (mirroring upstream `react-native-pager-view`) read + * only `event.nativeEvent.X`; the unset SyntheticEvent fields would never + * be observed in practice. + */ +export declare const wrapNativeEvent: (nativeEvent: T) => NativeSyntheticEvent; +/** + * Props for the `PagerView` component. + * Compatible with `react-native-pager-view`. + */ +export type PagerViewProps = ViewProps & { + /** + * Ref handle exposing imperative `setPage`, `setPageWithoutAnimation`, + * and `setScrollEnabled` methods. + */ + ref?: Ref; + /** + * Index of the page that is initially selected. Read **once** on mount; + * later changes are ignored. To navigate after mount, call + * `ref.setPage()` or `ref.setPageWithoutAnimation()`. + * @default 0 + */ + initialPage?: number; + /** + * Whether the user can swipe between pages. + * @default true + */ + scrollEnabled?: boolean; + /** + * Layout direction for paging. + * @default 'ltr' + * @platform android + */ + layoutDirection?: 'ltr' | 'rtl'; + /** + * Number of pages kept off-screen on each side of the visible page. + * @platform android + */ + offscreenPageLimit?: number; + /** + * Pixels of padding between pages. + * @platform android + */ + pageMargin?: number; + /** + * Fires continuously while a swipe is in progress. The event's `position` + * is the index of the leading visible page; `offset` is the fractional + * progress toward the next page in the `[0, 1)` range. + * + * **iOS 18+ only.** + */ + onPageScroll?: (event: PagerViewOnPageScrollEvent) => void; + /** + * Fires when a page is fully selected. The event's `position` is the + * index of the new page. + */ + onPageSelected?: (event: PagerViewOnPageSelectedEvent) => void; + /** + * Fires when the scroll state changes between `idle`, `dragging`, + * and `settling`. + * + * **iOS 18+ only.** + */ + onPageScrollStateChanged?: (event: PageScrollStateChangedEvent) => void; + /** + * Pages of the pager. Each child is treated as a separate page and + * stretched to fill the pager. Each child should have a stable `key`. + */ + children?: ReactNode; +}; +/** + * Ref handle for the `PagerView` component. + * Compatible with `react-native-pager-view`. + */ +export type PagerViewRef = { + /** + * Animate the pager to the given page index. Out-of-range indices are + * silently ignored. On iOS the animation requires `react-native-worklets`; + * without it, `setPage` falls back to a non-animated jump. + */ + setPage: (selectedPage: number) => void; + /** + * Jump to the given page index without an animation. + */ + setPageWithoutAnimation: (selectedPage: number) => void; + /** + * Imperatively enable or disable user scrolling — convenient when + * toggling from a non-React context like a ref-based gesture handler. + * + * > **Note:** If the `scrollEnabled` prop is also provided, subsequent + * > prop changes win and reset the value set imperatively. To use the + * > imperative path exclusively, omit the prop. + * + * > Unlike upstream `react-native-pager-view` (which calls UIManager + * > directly), this triggers a re-render of `PagerView` so the new + * > flag flows through to the native view via props. + */ + setScrollEnabled: (scrollEnabled: boolean) => void; +}; +//# sourceMappingURL=types.d.ts.map \ No newline at end of file diff --git a/packages/expo-ui/build/community/pager-view/types.d.ts.map b/packages/expo-ui/build/community/pager-view/types.d.ts.map new file mode 100644 index 00000000000000..17cdaab07f555a --- /dev/null +++ b/packages/expo-ui/build/community/pager-view/types.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/community/pager-view/types.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,GAAG,EAAE,MAAM,OAAO,CAAC;AAC5C,OAAO,KAAK,EAAE,oBAAoB,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAEpE;;;GAGG;AACH,MAAM,MAAM,8BAA8B,GAAG,QAAQ,CAAC;IACpD,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;CAChB,CAAC,CAAC;AAEH;;;GAGG;AACH,MAAM,MAAM,gCAAgC,GAAG,QAAQ,CAAC;IACtD,QAAQ,EAAE,MAAM,CAAC;CAClB,CAAC,CAAC;AAEH;;;GAGG;AACH,MAAM,MAAM,+BAA+B,GAAG,QAAQ,CAAC;IACrD,eAAe,EAAE,MAAM,GAAG,UAAU,GAAG,UAAU,CAAC;CACnD,CAAC,CAAC;AAEH,MAAM,MAAM,0BAA0B,GAAG,oBAAoB,CAAC,8BAA8B,CAAC,CAAC;AAC9F,MAAM,MAAM,4BAA4B,GAAG,oBAAoB,CAAC,gCAAgC,CAAC,CAAC;AAClG,MAAM,MAAM,2BAA2B,GAAG,oBAAoB,CAAC,+BAA+B,CAAC,CAAC;AAEhG;;;;;GAKG;AACH,eAAO,MAAM,eAAe,GAAI,CAAC,EAAG,aAAa,CAAC,KAAG,oBAAoB,CAAC,CAAC,CAG1E,CAAC;AAEF;;;GAGG;AACH,MAAM,MAAM,cAAc,GAAG,SAAS,GAAG;IACvC;;;OAGG;IACH,GAAG,CAAC,EAAE,GAAG,CAAC,YAAY,CAAC,CAAC;IACxB;;;;;OAKG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB;;;OAGG;IACH,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB;;;;OAIG;IACH,eAAe,CAAC,EAAE,KAAK,GAAG,KAAK,CAAC;IAChC;;;OAGG;IACH,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B;;;OAGG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB;;;;;;OAMG;IACH,YAAY,CAAC,EAAE,CAAC,KAAK,EAAE,0BAA0B,KAAK,IAAI,CAAC;IAC3D;;;OAGG;IACH,cAAc,CAAC,EAAE,CAAC,KAAK,EAAE,4BAA4B,KAAK,IAAI,CAAC;IAC/D;;;;;OAKG;IACH,wBAAwB,CAAC,EAAE,CAAC,KAAK,EAAE,2BAA2B,KAAK,IAAI,CAAC;IACxE;;;OAGG;IACH,QAAQ,CAAC,EAAE,SAAS,CAAC;CACtB,CAAC;AAEF;;;GAGG;AACH,MAAM,MAAM,YAAY,GAAG;IACzB;;;;OAIG;IACH,OAAO,EAAE,CAAC,YAAY,EAAE,MAAM,KAAK,IAAI,CAAC;IACxC;;OAEG;IACH,uBAAuB,EAAE,CAAC,YAAY,EAAE,MAAM,KAAK,IAAI,CAAC;IACxD;;;;;;;;;;;OAWG;IACH,gBAAgB,EAAE,CAAC,aAAa,EAAE,OAAO,KAAK,IAAI,CAAC;CACpD,CAAC"} \ No newline at end of file diff --git a/packages/expo-ui/build/jetpack-compose/HorizontalPager/index.d.ts b/packages/expo-ui/build/jetpack-compose/HorizontalPager/index.d.ts index 93b234f43e5667..bb5214fd8ee65b 100644 --- a/packages/expo-ui/build/jetpack-compose/HorizontalPager/index.d.ts +++ b/packages/expo-ui/build/jetpack-compose/HorizontalPager/index.d.ts @@ -13,6 +13,11 @@ export type HorizontalPagerHandle = { */ scrollToPage: (page: number) => Promise; }; +/** + * Kind of drag interaction reported by `onDragInteraction`. Mirrors Compose's + * `DragInteraction.Start` / `DragInteraction.Stop` / `DragInteraction.Cancel`. + */ +export type HorizontalPagerDragInteraction = 'start' | 'stop' | 'cancel'; export type HorizontalPagerProps = { /** * Imperative handle for programmatic navigation. Mirrors the methods on @@ -36,6 +41,28 @@ export type HorizontalPagerProps = { * swipe or programmatic scroll has fully settled. */ onSettledPageChange?: (page: number) => void; + /** + * Fires continuously while a swipe is in progress. Mirrors Compose's + * `PagerState.currentPage` and `currentPageOffsetFraction` — the latter is + * the signed fractional offset from `currentPage`, in the `[-0.5, 0.5]` range. + * + * If the callback is marked with the `'worklet'` directive, it runs + * synchronously on the UI thread; otherwise it is delivered asynchronously + * as a regular JS event. + */ + onPageScroll?: (currentPage: number, currentPageOffsetFraction: number) => void; + /** + * Fires when Compose's `PagerState.isScrollInProgress` toggles — true while + * the pager is being dragged or animating to a snap target, false once it + * has settled. + */ + onScrollInProgressChange?: (isScrollInProgress: boolean) => void; + /** + * Fires for each drag interaction emitted by `PagerState.interactionSource`. + * Combine with `onScrollInProgressChange` to distinguish user dragging from + * fling/snap-settling. + */ + onDragInteraction?: (kind: HorizontalPagerDragInteraction) => void; /** * Spacing between pages in dp. * @default 0 diff --git a/packages/expo-ui/build/jetpack-compose/HorizontalPager/index.d.ts.map b/packages/expo-ui/build/jetpack-compose/HorizontalPager/index.d.ts.map index 6f69c7a0e2c854..c0d4b58c8fe4c0 100644 --- a/packages/expo-ui/build/jetpack-compose/HorizontalPager/index.d.ts.map +++ b/packages/expo-ui/build/jetpack-compose/HorizontalPager/index.d.ts.map @@ -1 +1 @@ -{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/jetpack-compose/HorizontalPager/index.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,OAAO,CAAC;AAEjC,OAAO,EAAE,KAAK,cAAc,EAAkB,MAAM,aAAa,CAAC;AAClE,OAAO,EAAE,KAAK,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAGvD,YAAY,EAAE,mBAAmB,EAAE,CAAC;AAEpC,MAAM,MAAM,qBAAqB,GAAG;IAClC;;;OAGG;IACH,mBAAmB,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACrD;;OAEG;IACH,YAAY,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CAC/C,CAAC;AAEF,MAAM,MAAM,oBAAoB,GAAG;IACjC;;;OAGG;IACH,GAAG,CAAC,EAAE,GAAG,CAAC,qBAAqB,CAAC,CAAC;IACjC;;;;OAIG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB;;;;OAIG;IACH,mBAAmB,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IAC7C;;;OAGG;IACH,mBAAmB,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IAC7C;;;OAGG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB;;;OAGG;IACH,cAAc,CAAC,EAAE,MAAM,GAAG,mBAAmB,CAAC;IAC9C;;;OAGG;IACH,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B;;;OAGG;IACH,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB;;;OAGG;IACH,uBAAuB,CAAC,EAAE,MAAM,CAAC;IACjC;;OAEG;IACH,SAAS,CAAC,EAAE,cAAc,EAAE,CAAC;IAC7B;;OAEG;IACH,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;CAC3B,CAAC;AA6BF;;;GAGG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,oBAAoB,2CAE1D"} \ No newline at end of file +{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/jetpack-compose/HorizontalPager/index.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,OAAO,CAAC;AAGjC,OAAO,EAAE,KAAK,cAAc,EAAkB,MAAM,aAAa,CAAC;AAClE,OAAO,EAAE,KAAK,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAGvD,YAAY,EAAE,mBAAmB,EAAE,CAAC;AAEpC,MAAM,MAAM,qBAAqB,GAAG;IAClC;;;OAGG;IACH,mBAAmB,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACrD;;OAEG;IACH,YAAY,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CAC/C,CAAC;AAEF;;;GAGG;AACH,MAAM,MAAM,8BAA8B,GAAG,OAAO,GAAG,MAAM,GAAG,QAAQ,CAAC;AAEzE,MAAM,MAAM,oBAAoB,GAAG;IACjC;;;OAGG;IACH,GAAG,CAAC,EAAE,GAAG,CAAC,qBAAqB,CAAC,CAAC;IACjC;;;;OAIG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB;;;;OAIG;IACH,mBAAmB,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IAC7C;;;OAGG;IACH,mBAAmB,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IAC7C;;;;;;;;OAQG;IACH,YAAY,CAAC,EAAE,CAAC,WAAW,EAAE,MAAM,EAAE,yBAAyB,EAAE,MAAM,KAAK,IAAI,CAAC;IAChF;;;;OAIG;IACH,wBAAwB,CAAC,EAAE,CAAC,kBAAkB,EAAE,OAAO,KAAK,IAAI,CAAC;IACjE;;;;OAIG;IACH,iBAAiB,CAAC,EAAE,CAAC,IAAI,EAAE,8BAA8B,KAAK,IAAI,CAAC;IACnE;;;OAGG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB;;;OAGG;IACH,cAAc,CAAC,EAAE,MAAM,GAAG,mBAAmB,CAAC;IAC9C;;;OAGG;IACH,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B;;;OAGG;IACH,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB;;;OAGG;IACH,uBAAuB,CAAC,EAAE,MAAM,CAAC;IACjC;;OAEG;IACH,SAAS,CAAC,EAAE,cAAc,EAAE,CAAC;IAC7B;;OAEG;IACH,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;CAC3B,CAAC;AAuBF;;;GAGG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,oBAAoB,2CAkD1D"} \ No newline at end of file diff --git a/packages/expo-ui/build/jetpack-compose/Host/index.d.ts b/packages/expo-ui/build/jetpack-compose/Host/index.d.ts index 1964b83f7d4c73..d29c5ac74a5223 100644 --- a/packages/expo-ui/build/jetpack-compose/Host/index.d.ts +++ b/packages/expo-ui/build/jetpack-compose/Host/index.d.ts @@ -53,6 +53,7 @@ export type HostProps = { ignoreSafeAreaKeyboardInsets?: boolean; children: React.ReactNode; style?: StyleProp; + pointerEvents?: 'box-none' | 'none' | 'box-only' | 'auto'; } & PrimitiveBaseProps; export declare function Host(props: HostProps): import("react/jsx-runtime").JSX.Element; //# sourceMappingURL=index.d.ts.map \ No newline at end of file diff --git a/packages/expo-ui/build/jetpack-compose/Host/index.d.ts.map b/packages/expo-ui/build/jetpack-compose/Host/index.d.ts.map index 4c337e5439039a..942c8703f9a156 100644 --- a/packages/expo-ui/build/jetpack-compose/Host/index.d.ts.map +++ b/packages/expo-ui/build/jetpack-compose/Host/index.d.ts.map @@ -1 +1 @@ -{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/jetpack-compose/Host/index.tsx"],"names":[],"mappings":"AAEA,OAAO,EACL,KAAK,eAAe,EACpB,KAAK,UAAU,EACf,KAAK,SAAS,EACd,KAAK,SAAS,EAGf,MAAM,cAAc,CAAC;AAGtB,OAAO,EAAE,KAAK,kBAAkB,EAAE,MAAM,WAAW,CAAC;AAEpD,MAAM,MAAM,SAAS,GAAG;IACtB;;;;OAIG;IACH,aAAa,CAAC,EAAE,OAAO,GAAG;QAAE,QAAQ,CAAC,EAAE,OAAO,CAAC;QAAC,UAAU,CAAC,EAAE,OAAO,CAAA;KAAE,CAAC;IAEvE;;;OAGG;IACH,eAAe,CAAC,EAAE,CAAC,KAAK,EAAE;QAAE,WAAW,EAAE;YAAE,KAAK,EAAE,MAAM,CAAC;YAAC,MAAM,EAAE,MAAM,CAAA;SAAE,CAAA;KAAE,KAAK,IAAI,CAAC;IAEtF;;;;OAIG;IACH,0BAA0B,CAAC,EAAE,OAAO,CAAC;IAErC;;;;;OAKG;IACH,WAAW,CAAC,EAAE,eAAe,CAAC;IAE9B;;;;;OAKG;IACH,SAAS,CAAC,EAAE,UAAU,CAAC;IAEvB;;;OAGG;IACH,eAAe,CAAC,EAAE,aAAa,GAAG,aAAa,CAAC;IAEhD;;;;OAIG;IACH,4BAA4B,CAAC,EAAE,OAAO,CAAC;IAEvC,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;IAC1B,KAAK,CAAC,EAAE,SAAS,CAAC,SAAS,CAAC,CAAC;CAC9B,GAAG,kBAAkB,CAAC;AAcvB,wBAAgB,IAAI,CAAC,KAAK,EAAE,SAAS,2CAuCpC"} \ No newline at end of file +{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/jetpack-compose/Host/index.tsx"],"names":[],"mappings":"AAEA,OAAO,EACL,KAAK,eAAe,EACpB,KAAK,UAAU,EACf,KAAK,SAAS,EACd,KAAK,SAAS,EAGf,MAAM,cAAc,CAAC;AAGtB,OAAO,EAAE,KAAK,kBAAkB,EAAE,MAAM,WAAW,CAAC;AAEpD,MAAM,MAAM,SAAS,GAAG;IACtB;;;;OAIG;IACH,aAAa,CAAC,EAAE,OAAO,GAAG;QAAE,QAAQ,CAAC,EAAE,OAAO,CAAC;QAAC,UAAU,CAAC,EAAE,OAAO,CAAA;KAAE,CAAC;IAEvE;;;OAGG;IACH,eAAe,CAAC,EAAE,CAAC,KAAK,EAAE;QAAE,WAAW,EAAE;YAAE,KAAK,EAAE,MAAM,CAAC;YAAC,MAAM,EAAE,MAAM,CAAA;SAAE,CAAA;KAAE,KAAK,IAAI,CAAC;IAEtF;;;;OAIG;IACH,0BAA0B,CAAC,EAAE,OAAO,CAAC;IAErC;;;;;OAKG;IACH,WAAW,CAAC,EAAE,eAAe,CAAC;IAE9B;;;;;OAKG;IACH,SAAS,CAAC,EAAE,UAAU,CAAC;IAEvB;;;OAGG;IACH,eAAe,CAAC,EAAE,aAAa,GAAG,aAAa,CAAC;IAEhD;;;;OAIG;IACH,4BAA4B,CAAC,EAAE,OAAO,CAAC;IAEvC,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;IAC1B,KAAK,CAAC,EAAE,SAAS,CAAC,SAAS,CAAC,CAAC;IAC7B,aAAa,CAAC,EAAE,UAAU,GAAG,MAAM,GAAG,UAAU,GAAG,MAAM,CAAC;CAC3D,GAAG,kBAAkB,CAAC;AAcvB,wBAAgB,IAAI,CAAC,KAAK,EAAE,SAAS,2CAuCpC"} \ No newline at end of file diff --git a/packages/expo-ui/build/jetpack-compose/LoadingIndicator/index.d.ts b/packages/expo-ui/build/jetpack-compose/LoadingIndicator/index.d.ts index c71ac2a44db7fa..ea50303c8b86c0 100644 --- a/packages/expo-ui/build/jetpack-compose/LoadingIndicator/index.d.ts +++ b/packages/expo-ui/build/jetpack-compose/LoadingIndicator/index.d.ts @@ -1,5 +1,5 @@ import { type ColorValue } from 'react-native'; -import type { ObservableState } from '../../State/useNativeState'; +import { type ObservableState } from '../../State'; import { type ModifierConfig } from '../../types'; /** * Common props shared by loading indicator variants. diff --git a/packages/expo-ui/build/jetpack-compose/LoadingIndicator/index.d.ts.map b/packages/expo-ui/build/jetpack-compose/LoadingIndicator/index.d.ts.map index 131f166559b280..829f4dfb66e52e 100644 --- a/packages/expo-ui/build/jetpack-compose/LoadingIndicator/index.d.ts.map +++ b/packages/expo-ui/build/jetpack-compose/LoadingIndicator/index.d.ts.map @@ -1 +1 @@ -{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/jetpack-compose/LoadingIndicator/index.tsx"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,UAAU,EAAE,MAAM,cAAc,CAAC;AAE/C,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAC;AAElE,OAAO,EAAE,KAAK,cAAc,EAAE,MAAM,aAAa,CAAC;AAGlD;;GAEG;AACH,MAAM,MAAM,4BAA4B,GAAG;IACzC;;;OAGG;IACH,QAAQ,CAAC,EAAE,eAAe,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;IAC1C;;OAEG;IACH,KAAK,CAAC,EAAE,UAAU,CAAC;IACnB;;OAEG;IACH,SAAS,CAAC,EAAE,cAAc,EAAE,CAAC;CAC9B,CAAC;AAsCF;;;;GAIG;AACH,eAAO,MAAM,gBAAgB,6DAA0D,CAAC;AAMxF,MAAM,MAAM,8BAA8B,GAAG,4BAA4B,GAAG;IAC1E;;OAEG;IACH,cAAc,CAAC,EAAE,UAAU,CAAC;CAC7B,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,yBAAyB,+DAC4D,CAAC;AAInG,OAAO,EAAE,KAAK,eAAe,EAAE,CAAC"} \ No newline at end of file +{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/jetpack-compose/LoadingIndicator/index.tsx"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,UAAU,EAAE,MAAM,cAAc,CAAC;AAE/C,OAAO,EAAc,KAAK,eAAe,EAAE,MAAM,aAAa,CAAC;AAC/D,OAAO,EAAE,KAAK,cAAc,EAAE,MAAM,aAAa,CAAC;AAGlD;;GAEG;AACH,MAAM,MAAM,4BAA4B,GAAG;IACzC;;;OAGG;IACH,QAAQ,CAAC,EAAE,eAAe,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;IAC1C;;OAEG;IACH,KAAK,CAAC,EAAE,UAAU,CAAC;IACnB;;OAEG;IACH,SAAS,CAAC,EAAE,cAAc,EAAE,CAAC;CAC9B,CAAC;AAsCF;;;;GAIG;AACH,eAAO,MAAM,gBAAgB,6DAA0D,CAAC;AAMxF,MAAM,MAAM,8BAA8B,GAAG,4BAA4B,GAAG;IAC1E;;OAEG;IACH,cAAc,CAAC,EAAE,UAAU,CAAC;CAC7B,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,yBAAyB,+DAC4D,CAAC;AAInG,OAAO,EAAE,KAAK,eAAe,EAAE,CAAC"} \ No newline at end of file diff --git a/packages/expo-ui/build/jetpack-compose/SyncSwitch/index.d.ts b/packages/expo-ui/build/jetpack-compose/SyncSwitch/index.d.ts index e33da036fd9357..802f1d4760c663 100644 --- a/packages/expo-ui/build/jetpack-compose/SyncSwitch/index.d.ts +++ b/packages/expo-ui/build/jetpack-compose/SyncSwitch/index.d.ts @@ -1,4 +1,4 @@ -import { type ObservableState } from '../../State/useNativeState'; +import { type ObservableState } from '../../State'; import { type ModifierConfig } from '../../types'; export type SyncSwitchProps = { /** diff --git a/packages/expo-ui/build/jetpack-compose/SyncSwitch/index.d.ts.map b/packages/expo-ui/build/jetpack-compose/SyncSwitch/index.d.ts.map index 990f4ee447af58..0185c90c15fa1e 100644 --- a/packages/expo-ui/build/jetpack-compose/SyncSwitch/index.d.ts.map +++ b/packages/expo-ui/build/jetpack-compose/SyncSwitch/index.d.ts.map @@ -1 +1 @@ -{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/jetpack-compose/SyncSwitch/index.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,eAAe,EAAE,MAAM,4BAA4B,CAAC;AAGlE,OAAO,EAAE,KAAK,cAAc,EAAE,MAAM,aAAa,CAAC;AAGlD,MAAM,MAAM,eAAe,GAAG;IAC5B;;;OAGG;IACH,IAAI,EAAE,eAAe,CAAC,OAAO,CAAC,CAAC;IAC/B;;;OAGG;IACH,mBAAmB,CAAC,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,IAAI,CAAC;IACjD;;;OAGG;IACH,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB;;OAEG;IACH,SAAS,CAAC,EAAE,cAAc,EAAE,CAAC;CAC9B,CAAC;AAYF;;;GAGG;AACH,wBAAgB,UAAU,CAAC,KAAK,EAAE,eAAe,2CAahD"} \ No newline at end of file +{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/jetpack-compose/SyncSwitch/index.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAc,KAAK,eAAe,EAAkB,MAAM,aAAa,CAAC;AAC/E,OAAO,EAAE,KAAK,cAAc,EAAE,MAAM,aAAa,CAAC;AAGlD,MAAM,MAAM,eAAe,GAAG;IAC5B;;;OAGG;IACH,IAAI,EAAE,eAAe,CAAC,OAAO,CAAC,CAAC;IAC/B;;;OAGG;IACH,mBAAmB,CAAC,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,IAAI,CAAC;IACjD;;;OAGG;IACH,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB;;OAEG;IACH,SAAS,CAAC,EAAE,cAAc,EAAE,CAAC;CAC9B,CAAC;AAYF;;;GAGG;AACH,wBAAgB,UAAU,CAAC,KAAK,EAAE,eAAe,2CAahD"} \ No newline at end of file diff --git a/packages/expo-ui/build/jetpack-compose/TextField/index.d.ts b/packages/expo-ui/build/jetpack-compose/TextField/index.d.ts index 7547d8d9389af3..53f8fa66b20b24 100644 --- a/packages/expo-ui/build/jetpack-compose/TextField/index.d.ts +++ b/packages/expo-ui/build/jetpack-compose/TextField/index.d.ts @@ -1,6 +1,6 @@ import type { Ref } from 'react'; import type { ColorValue } from 'react-native'; -import type { ObservableState } from '../../State/useNativeState'; +import { type ObservableState } from '../../State'; import type { ModifierConfig } from '../../types'; /** * Can be used for imperatively focusing and setting text/selection on the `TextField` component. diff --git a/packages/expo-ui/build/jetpack-compose/TextField/index.d.ts.map b/packages/expo-ui/build/jetpack-compose/TextField/index.d.ts.map index be972aacc7a46a..0c44dc5e8b8d6d 100644 --- a/packages/expo-ui/build/jetpack-compose/TextField/index.d.ts.map +++ b/packages/expo-ui/build/jetpack-compose/TextField/index.d.ts.map @@ -1 +1 @@ -{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/jetpack-compose/TextField/index.tsx"],"names":[],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/jetpack-compose/TextField/index.tsx"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/packages/expo-ui/build/jetpack-compose/index.d.ts b/packages/expo-ui/build/jetpack-compose/index.d.ts index 2c64177433e044..1046f05fef6b24 100644 --- a/packages/expo-ui/build/jetpack-compose/index.d.ts +++ b/packages/expo-ui/build/jetpack-compose/index.d.ts @@ -1,4 +1,3 @@ -import '../State/index.fx'; import './MaterialSymbolsAssetsTransformer.fx'; export * from './AlertDialog'; export * from './Badge'; @@ -48,7 +47,7 @@ export * from './Box'; export * from './Row'; export * from './Column'; export * from './FlowRow'; -export { useNativeState } from '../State/useNativeState'; +export { useNativeState } from '../State'; export type { ViewEvent } from '../types'; export type { PrimitiveBaseProps } from './layout-types'; //# sourceMappingURL=index.d.ts.map \ No newline at end of file diff --git a/packages/expo-ui/build/jetpack-compose/index.d.ts.map b/packages/expo-ui/build/jetpack-compose/index.d.ts.map index f525d4916759fb..9523984cfd4b5f 100644 --- a/packages/expo-ui/build/jetpack-compose/index.d.ts.map +++ b/packages/expo-ui/build/jetpack-compose/index.d.ts.map @@ -1 +1 @@ -{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/jetpack-compose/index.ts"],"names":[],"mappings":"AAAA,OAAO,mBAAmB,CAAC;AAC3B,OAAO,uCAAuC,CAAC;AAE/C,cAAc,eAAe,CAAC;AAC9B,cAAc,SAAS,CAAC;AACxB,cAAc,aAAa,CAAC;AAC5B,OAAO,EAAE,gBAAgB,EAAE,KAAK,qBAAqB,EAAE,MAAM,oBAAoB,CAAC;AAClF,cAAc,QAAQ,CAAC;AACvB,cAAc,YAAY,CAAC;AAC3B,cAAc,QAAQ,CAAC;AACvB,cAAc,UAAU,CAAC;AACzB,cAAc,UAAU,CAAC;AACzB,cAAc,QAAQ,CAAC;AACvB,cAAc,cAAc,CAAC;AAC7B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,0BAA0B,CAAC;AACzC,cAAc,WAAW,CAAC;AAC1B,cAAc,QAAQ,CAAC;AACvB,cAAc,cAAc,CAAC;AAC7B,cAAc,WAAW,CAAC;AAC1B,cAAc,YAAY,CAAC;AAC3B,cAAc,cAAc,CAAC;AAC7B,cAAc,cAAc,CAAC;AAC7B,cAAc,mBAAmB,CAAC;AAClC,cAAc,YAAY,CAAC;AAC3B,cAAc,UAAU,CAAC;AACzB,cAAc,UAAU,CAAC;AACzB,cAAc,UAAU,CAAC;AACzB,cAAc,cAAc,CAAC;AAC7B,OAAO,EACL,SAAS,EACT,iBAAiB,EACjB,KAAK,cAAc,EACnB,KAAK,YAAY,EACjB,KAAK,uBAAuB,EAC5B,KAAK,kBAAkB,EACvB,KAAK,wBAAwB,EAC7B,KAAK,qBAAqB,EAC1B,KAAK,wBAAwB,EAC7B,KAAK,eAAe,GACrB,MAAM,aAAa,CAAC;AACrB,cAAc,gBAAgB,CAAC;AAC/B,cAAc,SAAS,CAAC;AACxB,cAAc,oBAAoB,CAAC;AACnC,cAAc,YAAY,CAAC;AAC3B,OAAO,EACL,eAAe,EACf,KAAK,qBAAqB,EAC1B,KAAK,oBAAoB,GAC1B,MAAM,mBAAmB,CAAC;AAC3B,cAAc,aAAa,CAAC;AAC5B,cAAc,YAAY,CAAC;AAC3B,cAAc,mBAAmB,CAAC;AAClC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,wBAAwB,CAAC;AACvC,cAAc,oBAAoB,CAAC;AACnC,cAAc,eAAe,CAAC;AAC9B,cAAc,WAAW,CAAC;AAC1B,OAAO,EAAE,KAAK,SAAS,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAC;AAC9C,cAAc,WAAW,CAAC;AAC1B,cAAc,oBAAoB,CAAC;AAEnC,cAAc,sBAAsB,CAAC;AACrC,cAAc,OAAO,CAAC;AACtB,cAAc,OAAO,CAAC;AACtB,cAAc,UAAU,CAAC;AACzB,cAAc,WAAW,CAAC;AAC1B,OAAO,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AACzD,YAAY,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AAC1C,YAAY,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC"} \ No newline at end of file +{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/jetpack-compose/index.ts"],"names":[],"mappings":"AAAA,OAAO,uCAAuC,CAAC;AAE/C,cAAc,eAAe,CAAC;AAC9B,cAAc,SAAS,CAAC;AACxB,cAAc,aAAa,CAAC;AAC5B,OAAO,EAAE,gBAAgB,EAAE,KAAK,qBAAqB,EAAE,MAAM,oBAAoB,CAAC;AAClF,cAAc,QAAQ,CAAC;AACvB,cAAc,YAAY,CAAC;AAC3B,cAAc,QAAQ,CAAC;AACvB,cAAc,UAAU,CAAC;AACzB,cAAc,UAAU,CAAC;AACzB,cAAc,QAAQ,CAAC;AACvB,cAAc,cAAc,CAAC;AAC7B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,0BAA0B,CAAC;AACzC,cAAc,WAAW,CAAC;AAC1B,cAAc,QAAQ,CAAC;AACvB,cAAc,cAAc,CAAC;AAC7B,cAAc,WAAW,CAAC;AAC1B,cAAc,YAAY,CAAC;AAC3B,cAAc,cAAc,CAAC;AAC7B,cAAc,cAAc,CAAC;AAC7B,cAAc,mBAAmB,CAAC;AAClC,cAAc,YAAY,CAAC;AAC3B,cAAc,UAAU,CAAC;AACzB,cAAc,UAAU,CAAC;AACzB,cAAc,UAAU,CAAC;AACzB,cAAc,cAAc,CAAC;AAC7B,OAAO,EACL,SAAS,EACT,iBAAiB,EACjB,KAAK,cAAc,EACnB,KAAK,YAAY,EACjB,KAAK,uBAAuB,EAC5B,KAAK,kBAAkB,EACvB,KAAK,wBAAwB,EAC7B,KAAK,qBAAqB,EAC1B,KAAK,wBAAwB,EAC7B,KAAK,eAAe,GACrB,MAAM,aAAa,CAAC;AACrB,cAAc,gBAAgB,CAAC;AAC/B,cAAc,SAAS,CAAC;AACxB,cAAc,oBAAoB,CAAC;AACnC,cAAc,YAAY,CAAC;AAC3B,OAAO,EACL,eAAe,EACf,KAAK,qBAAqB,EAC1B,KAAK,oBAAoB,GAC1B,MAAM,mBAAmB,CAAC;AAC3B,cAAc,aAAa,CAAC;AAC5B,cAAc,YAAY,CAAC;AAC3B,cAAc,mBAAmB,CAAC;AAClC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,wBAAwB,CAAC;AACvC,cAAc,oBAAoB,CAAC;AACnC,cAAc,eAAe,CAAC;AAC9B,cAAc,WAAW,CAAC;AAC1B,OAAO,EAAE,KAAK,SAAS,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAC;AAC9C,cAAc,WAAW,CAAC;AAC1B,cAAc,oBAAoB,CAAC;AAEnC,cAAc,sBAAsB,CAAC;AACrC,cAAc,OAAO,CAAC;AACtB,cAAc,OAAO,CAAC;AACtB,cAAc,UAAU,CAAC;AACzB,cAAc,WAAW,CAAC;AAC1B,OAAO,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAC1C,YAAY,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AAC1C,YAAY,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC"} \ No newline at end of file diff --git a/packages/expo-ui/build/swift-ui/Host/index.d.ts b/packages/expo-ui/build/swift-ui/Host/index.d.ts index 4708b5015b2601..8263e756e5de3e 100644 --- a/packages/expo-ui/build/swift-ui/Host/index.d.ts +++ b/packages/expo-ui/build/swift-ui/Host/index.d.ts @@ -43,6 +43,7 @@ export type HostProps = { ignoreSafeArea?: 'all' | 'keyboard'; children: React.ReactNode; style?: StyleProp; + pointerEvents?: 'box-none' | 'none' | 'box-only' | 'auto'; } & CommonViewModifierProps; /** * A hosting component for SwiftUI views. diff --git a/packages/expo-ui/build/swift-ui/Host/index.d.ts.map b/packages/expo-ui/build/swift-ui/Host/index.d.ts.map index 210b584dcff362..fe7a470ba408bc 100644 --- a/packages/expo-ui/build/swift-ui/Host/index.d.ts.map +++ b/packages/expo-ui/build/swift-ui/Host/index.d.ts.map @@ -1 +1 @@ -{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/swift-ui/Host/index.tsx"],"names":[],"mappings":"AACA,OAAO,EAAe,KAAK,SAAS,EAAE,KAAK,SAAS,EAAE,MAAM,cAAc,CAAC;AAG3E,OAAO,EAAE,KAAK,uBAAuB,EAAE,MAAM,UAAU,CAAC;AAExD,MAAM,MAAM,SAAS,GAAG;IACtB;;;;OAIG;IACH,aAAa,CAAC,EAAE,OAAO,GAAG;QAAE,QAAQ,CAAC,EAAE,OAAO,CAAC;QAAC,UAAU,CAAC,EAAE,OAAO,CAAA;KAAE,CAAC;IAEvE;;;;OAIG;IACH,0BAA0B,CAAC,EAAE,OAAO,CAAC;IAErC;;;OAGG;IACH,eAAe,CAAC,EAAE,CAAC,KAAK,EAAE;QAAE,WAAW,EAAE;YAAE,KAAK,EAAE,MAAM,CAAC;YAAC,MAAM,EAAE,MAAM,CAAA;SAAE,CAAA;KAAE,KAAK,IAAI,CAAC;IAEtF;;OAEG;IACH,WAAW,CAAC,EAAE,OAAO,GAAG,MAAM,CAAC;IAE/B;;;OAGG;IACH,eAAe,CAAC,EAAE,aAAa,GAAG,aAAa,CAAC;IAEhD;;;;OAIG;IACH,cAAc,CAAC,EAAE,KAAK,GAAG,UAAU,CAAC;IAEpC,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;IAC1B,KAAK,CAAC,EAAE,SAAS,CAAC,SAAS,CAAC,CAAC;CAC9B,GAAG,uBAAuB,CAAC;AAM5B;;GAEG;AACH,wBAAgB,IAAI,CAAC,KAAK,EAAE,SAAS,2CA4BpC"} \ No newline at end of file +{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/swift-ui/Host/index.tsx"],"names":[],"mappings":"AACA,OAAO,EAAe,KAAK,SAAS,EAAE,KAAK,SAAS,EAAE,MAAM,cAAc,CAAC;AAG3E,OAAO,EAAE,KAAK,uBAAuB,EAAE,MAAM,UAAU,CAAC;AAExD,MAAM,MAAM,SAAS,GAAG;IACtB;;;;OAIG;IACH,aAAa,CAAC,EAAE,OAAO,GAAG;QAAE,QAAQ,CAAC,EAAE,OAAO,CAAC;QAAC,UAAU,CAAC,EAAE,OAAO,CAAA;KAAE,CAAC;IAEvE;;;;OAIG;IACH,0BAA0B,CAAC,EAAE,OAAO,CAAC;IAErC;;;OAGG;IACH,eAAe,CAAC,EAAE,CAAC,KAAK,EAAE;QAAE,WAAW,EAAE;YAAE,KAAK,EAAE,MAAM,CAAC;YAAC,MAAM,EAAE,MAAM,CAAA;SAAE,CAAA;KAAE,KAAK,IAAI,CAAC;IAEtF;;OAEG;IACH,WAAW,CAAC,EAAE,OAAO,GAAG,MAAM,CAAC;IAE/B;;;OAGG;IACH,eAAe,CAAC,EAAE,aAAa,GAAG,aAAa,CAAC;IAEhD;;;;OAIG;IACH,cAAc,CAAC,EAAE,KAAK,GAAG,UAAU,CAAC;IAEpC,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;IAC1B,KAAK,CAAC,EAAE,SAAS,CAAC,SAAS,CAAC,CAAC;IAC7B,aAAa,CAAC,EAAE,UAAU,GAAG,MAAM,GAAG,UAAU,GAAG,MAAM,CAAC;CAC3D,GAAG,uBAAuB,CAAC;AAM5B;;GAEG;AACH,wBAAgB,IAAI,CAAC,KAAK,EAAE,SAAS,2CA4BpC"} \ No newline at end of file diff --git a/packages/expo-ui/build/swift-ui/ScrollView/index.d.ts b/packages/expo-ui/build/swift-ui/ScrollView/index.d.ts index 343e6d7959f86c..6732f28801b26c 100644 --- a/packages/expo-ui/build/swift-ui/ScrollView/index.d.ts +++ b/packages/expo-ui/build/swift-ui/ScrollView/index.d.ts @@ -1,4 +1,28 @@ import { type CommonViewModifierProps } from '../types'; +/** + * Scroll phase emitted by the `onScrollPhaseChange(...)` modifier. Mirrors + * SwiftUI's `ScrollPhase` (iOS 18+). + */ +export type ScrollPhase = 'idle' | 'tracking' | 'interacting' | 'animating' | 'decelerating'; +/** + * Snapshot of a `ScrollView`'s scroll geometry, emitted by the + * `useScrollGeometryChange(...)` and `onScrollPhaseChange(...)` modifiers + * (iOS 18+). + */ +export type ScrollGeometry = { + /** Horizontal content offset, in points. */ + contentOffsetX: number; + /** Vertical content offset, in points. */ + contentOffsetY: number; + /** Width of the visible scroll container, in points. */ + containerWidth: number; + /** Height of the visible scroll container, in points. */ + containerHeight: number; + /** Total width of the scrollable content, in points. */ + contentWidth: number; + /** Total height of the scrollable content, in points. */ + contentHeight: number; +}; export type ScrollViewProps = { children: React.ReactNode; /** @@ -13,5 +37,11 @@ export type ScrollViewProps = { */ showsIndicators?: boolean; } & CommonViewModifierProps; +/** + * SwiftUI `ScrollView` wrapper. To control scroll position, pair this with the + * `scrollPosition(state, { onChange })` modifier and a `useNativeState`-backed + * id. Write `state.value = targetId` for an instant scroll, or wrap the write + * in `withAnimation(...)` from `@expo/ui/swift-ui` for an animated one. + */ export declare function ScrollView(props: ScrollViewProps): import("react/jsx-runtime").JSX.Element; //# sourceMappingURL=index.d.ts.map \ No newline at end of file diff --git a/packages/expo-ui/build/swift-ui/ScrollView/index.d.ts.map b/packages/expo-ui/build/swift-ui/ScrollView/index.d.ts.map index 118c7627a5dbc5..e3477bee143825 100644 --- a/packages/expo-ui/build/swift-ui/ScrollView/index.d.ts.map +++ b/packages/expo-ui/build/swift-ui/ScrollView/index.d.ts.map @@ -1 +1 @@ -{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/swift-ui/ScrollView/index.tsx"],"names":[],"mappings":"AAGA,OAAO,EAAE,KAAK,uBAAuB,EAAE,MAAM,UAAU,CAAC;AAExD,MAAM,MAAM,eAAe,GAAG;IAC5B,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;IAC1B;;;OAGG;IACH,IAAI,CAAC,EAAE,UAAU,GAAG,YAAY,GAAG,MAAM,CAAC;IAC1C;;;;OAIG;IACH,eAAe,CAAC,EAAE,OAAO,CAAC;CAC3B,GAAG,uBAAuB,CAAC;AAO5B,wBAAgB,UAAU,CAAC,KAAK,EAAE,eAAe,2CAShD"} \ No newline at end of file +{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/swift-ui/ScrollView/index.tsx"],"names":[],"mappings":"AAGA,OAAO,EAAE,KAAK,uBAAuB,EAAE,MAAM,UAAU,CAAC;AAExD;;;GAGG;AACH,MAAM,MAAM,WAAW,GAAG,MAAM,GAAG,UAAU,GAAG,aAAa,GAAG,WAAW,GAAG,cAAc,CAAC;AAE7F;;;;GAIG;AACH,MAAM,MAAM,cAAc,GAAG;IAC3B,4CAA4C;IAC5C,cAAc,EAAE,MAAM,CAAC;IACvB,0CAA0C;IAC1C,cAAc,EAAE,MAAM,CAAC;IACvB,wDAAwD;IACxD,cAAc,EAAE,MAAM,CAAC;IACvB,yDAAyD;IACzD,eAAe,EAAE,MAAM,CAAC;IACxB,wDAAwD;IACxD,YAAY,EAAE,MAAM,CAAC;IACrB,yDAAyD;IACzD,aAAa,EAAE,MAAM,CAAC;CACvB,CAAC;AAEF,MAAM,MAAM,eAAe,GAAG;IAC5B,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;IAC1B;;;OAGG;IACH,IAAI,CAAC,EAAE,UAAU,GAAG,YAAY,GAAG,MAAM,CAAC;IAC1C;;;;OAIG;IACH,eAAe,CAAC,EAAE,OAAO,CAAC;CAC3B,GAAG,uBAAuB,CAAC;AAO5B;;;;;GAKG;AACH,wBAAgB,UAAU,CAAC,KAAK,EAAE,eAAe,2CAUhD"} \ No newline at end of file diff --git a/packages/expo-ui/build/swift-ui/SecureField/index.d.ts b/packages/expo-ui/build/swift-ui/SecureField/index.d.ts index 838494df0ccbc6..b9e1bdf560e00f 100644 --- a/packages/expo-ui/build/swift-ui/SecureField/index.d.ts +++ b/packages/expo-ui/build/swift-ui/SecureField/index.d.ts @@ -1,5 +1,5 @@ import type { Ref } from 'react'; -import type { ObservableState } from '../../State/useNativeState'; +import { type ObservableState } from '../../State'; import type { ViewEvent } from '../../types'; import type { CommonViewModifierProps } from '../types'; /** diff --git a/packages/expo-ui/build/swift-ui/SecureField/index.d.ts.map b/packages/expo-ui/build/swift-ui/SecureField/index.d.ts.map index 14f9f2720c525a..406c32e6be0842 100644 --- a/packages/expo-ui/build/swift-ui/SecureField/index.d.ts.map +++ b/packages/expo-ui/build/swift-ui/SecureField/index.d.ts.map @@ -1 +1 @@ -{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/swift-ui/SecureField/index.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,OAAO,CAAC;AAGjC,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAC;AAGlE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAG7C,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,UAAU,CAAC;AAExD;;GAEG;AACH,MAAM,MAAM,cAAc,GAAG;IAC3B,OAAO,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAC5C,8BAA8B;IAC9B,KAAK,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC3B,KAAK,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC3B,IAAI,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CAC3B,CAAC;AAEF,MAAM,MAAM,gBAAgB,GAAG;IAC7B,GAAG,CAAC,EAAE,GAAG,CAAC,cAAc,CAAC,CAAC;IAC1B;;;;OAIG;IACH,IAAI,CAAC,EAAE,eAAe,CAAC,MAAM,CAAC,CAAC;IAC/B,kFAAkF;IAClF,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,2FAA2F;IAC3F,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB;;OAEG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB;;;;;OAKG;IACH,YAAY,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IACtC;;OAEG;IACH,aAAa,CAAC,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,IAAI,CAAC;IAC3C;;OAEG;IACH,QAAQ,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;CAC5B,GAAG,uBAAuB,CAAC;AAE5B,MAAM,MAAM,sBAAsB,GAAG,IAAI,CACvC,gBAAgB,EAChB,MAAM,GAAG,cAAc,GAAG,eAAe,CAC1C,GACC,SAAS,CAAC,cAAc,EAAE;IAAE,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC,GAC5C,SAAS,CAAC,eAAe,EAAE;IAAE,KAAK,EAAE,OAAO,CAAA;CAAE,CAAC,GAAG;IAC/C,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,gBAAgB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAClC,CAAC;AAWJ;;GAEG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,gBAAgB,2CAmBlD;yBAnBe,WAAW;oCAPQ;QAAE,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAA;KAAE"} \ No newline at end of file +{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/swift-ui/SecureField/index.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,OAAO,CAAC;AAEjC,OAAO,EAAc,KAAK,eAAe,EAA4B,MAAM,aAAa,CAAC;AACzF,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAG7C,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,UAAU,CAAC;AAExD;;GAEG;AACH,MAAM,MAAM,cAAc,GAAG;IAC3B,OAAO,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAC5C,8BAA8B;IAC9B,KAAK,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC3B,KAAK,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC3B,IAAI,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CAC3B,CAAC;AAEF,MAAM,MAAM,gBAAgB,GAAG;IAC7B,GAAG,CAAC,EAAE,GAAG,CAAC,cAAc,CAAC,CAAC;IAC1B;;;;OAIG;IACH,IAAI,CAAC,EAAE,eAAe,CAAC,MAAM,CAAC,CAAC;IAC/B,kFAAkF;IAClF,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,2FAA2F;IAC3F,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB;;OAEG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB;;;;;OAKG;IACH,YAAY,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IACtC;;OAEG;IACH,aAAa,CAAC,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,IAAI,CAAC;IAC3C;;OAEG;IACH,QAAQ,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;CAC5B,GAAG,uBAAuB,CAAC;AAE5B,MAAM,MAAM,sBAAsB,GAAG,IAAI,CACvC,gBAAgB,EAChB,MAAM,GAAG,cAAc,GAAG,eAAe,CAC1C,GACC,SAAS,CAAC,cAAc,EAAE;IAAE,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC,GAC5C,SAAS,CAAC,eAAe,EAAE;IAAE,KAAK,EAAE,OAAO,CAAA;CAAE,CAAC,GAAG;IAC/C,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,gBAAgB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAClC,CAAC;AAWJ;;GAEG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,gBAAgB,2CAmBlD;yBAnBe,WAAW;oCAPQ;QAAE,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAA;KAAE"} \ No newline at end of file diff --git a/packages/expo-ui/build/swift-ui/SyncToggle/index.d.ts b/packages/expo-ui/build/swift-ui/SyncToggle/index.d.ts index ac277d6bcd9fbb..0eb8905814b3b4 100644 --- a/packages/expo-ui/build/swift-ui/SyncToggle/index.d.ts +++ b/packages/expo-ui/build/swift-ui/SyncToggle/index.d.ts @@ -1,5 +1,5 @@ import { type SFSymbol } from 'sf-symbols-typescript'; -import { type ObservableState } from '../../State/useNativeState'; +import { type ObservableState } from '../../State'; import { type CommonViewModifierProps } from '../types'; export type SyncToggleProps = { /** diff --git a/packages/expo-ui/build/swift-ui/SyncToggle/index.d.ts.map b/packages/expo-ui/build/swift-ui/SyncToggle/index.d.ts.map index 843c63e7a897a7..1311d9cba590cf 100644 --- a/packages/expo-ui/build/swift-ui/SyncToggle/index.d.ts.map +++ b/packages/expo-ui/build/swift-ui/SyncToggle/index.d.ts.map @@ -1 +1 @@ -{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/swift-ui/SyncToggle/index.tsx"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AAEtD,OAAO,EAAE,KAAK,eAAe,EAAE,MAAM,4BAA4B,CAAC;AAIlE,OAAO,EAAE,KAAK,uBAAuB,EAAE,MAAM,UAAU,CAAC;AAExD,MAAM,MAAM,eAAe,GAAG;IAC5B;;;OAGG;IACH,IAAI,EAAE,eAAe,CAAC,OAAO,CAAC,CAAC;IAC/B;;OAEG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC;IACf;;OAEG;IACH,WAAW,CAAC,EAAE,QAAQ,CAAC;IACvB;;;OAGG;IACH,gBAAgB,CAAC,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAC;CAC5C,GAAG,uBAAuB,CAAC;AAY5B;;;GAGG;AACH,wBAAgB,UAAU,CAAC,KAAK,EAAE,eAAe,2CAahD"} \ No newline at end of file +{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/swift-ui/SyncToggle/index.tsx"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AAEtD,OAAO,EAAc,KAAK,eAAe,EAAkB,MAAM,aAAa,CAAC;AAE/E,OAAO,EAAE,KAAK,uBAAuB,EAAE,MAAM,UAAU,CAAC;AAExD,MAAM,MAAM,eAAe,GAAG;IAC5B;;;OAGG;IACH,IAAI,EAAE,eAAe,CAAC,OAAO,CAAC,CAAC;IAC/B;;OAEG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC;IACf;;OAEG;IACH,WAAW,CAAC,EAAE,QAAQ,CAAC;IACvB;;;OAGG;IACH,gBAAgB,CAAC,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAC;CAC5C,GAAG,uBAAuB,CAAC;AAY5B;;;GAGG;AACH,wBAAgB,UAAU,CAAC,KAAK,EAAE,eAAe,2CAahD"} \ No newline at end of file diff --git a/packages/expo-ui/build/swift-ui/TextField/index.d.ts b/packages/expo-ui/build/swift-ui/TextField/index.d.ts index fa678d2f3e799d..64de9193b53ce3 100644 --- a/packages/expo-ui/build/swift-ui/TextField/index.d.ts +++ b/packages/expo-ui/build/swift-ui/TextField/index.d.ts @@ -1,5 +1,5 @@ import type { Ref } from 'react'; -import type { ObservableState } from '../../State/useNativeState'; +import { type ObservableState } from '../../State'; import type { ViewEvent } from '../../types'; import type { CommonViewModifierProps } from '../types'; /** diff --git a/packages/expo-ui/build/swift-ui/TextField/index.d.ts.map b/packages/expo-ui/build/swift-ui/TextField/index.d.ts.map index 0005336e960c5b..c2dfdad1f52440 100644 --- a/packages/expo-ui/build/swift-ui/TextField/index.d.ts.map +++ b/packages/expo-ui/build/swift-ui/TextField/index.d.ts.map @@ -1 +1 @@ -{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/swift-ui/TextField/index.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,OAAO,CAAC;AAGjC,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAC;AAGlE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAG7C,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,UAAU,CAAC;AAExD;;GAEG;AACH,MAAM,MAAM,YAAY,GAAG;IACzB,OAAO,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAC5C,8BAA8B;IAC9B,KAAK,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC3B,KAAK,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC3B,IAAI,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC1B;;;OAGG;IACH,YAAY,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CAC7D,CAAC;AAEF;;GAEG;AACH,MAAM,MAAM,kBAAkB,GAAG;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,CAAC;AAEhE,MAAM,MAAM,cAAc,GAAG;IAC3B,GAAG,CAAC,EAAE,GAAG,CAAC,YAAY,CAAC,CAAC;IACxB;;;;OAIG;IACH,IAAI,CAAC,EAAE,eAAe,CAAC,MAAM,CAAC,CAAC;IAC/B;;;;;OAKG;IACH,SAAS,CAAC,EAAE,eAAe,CAAC,kBAAkB,CAAC,CAAC;IAChD,kFAAkF;IAClF,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,yFAAyF;IACzF,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB;;OAEG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB;;;;;OAKG;IACH,YAAY,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IACtC;;OAEG;IACH,aAAa,CAAC,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,IAAI,CAAC;IAC3C;;;OAGG;IACH,iBAAiB,CAAC,EAAE,CAAC,SAAS,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAA;KAAE,KAAK,IAAI,CAAC;IACxE;;;;;OAKG;IACH,IAAI,CAAC,EAAE,YAAY,GAAG,UAAU,CAAC;IACjC;;;;OAIG;IACH,QAAQ,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;CAC5B,GAAG,uBAAuB,CAAC;AAE5B,MAAM,MAAM,oBAAoB,GAAG,IAAI,CACrC,cAAc,EACd,MAAM,GAAG,WAAW,GAAG,cAAc,GAAG,eAAe,GAAG,mBAAmB,CAC9E,GACC,SAAS,CAAC,cAAc,EAAE;IAAE,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC,GAC5C,SAAS,CAAC,eAAe,EAAE;IAAE,KAAK,EAAE,OAAO,CAAA;CAAE,CAAC,GAC9C,SAAS,CAAC,mBAAmB,EAAE;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,CAAC,GAAG;IAC/D,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,gBAAgB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAClC,CAAC;AAWJ;;GAEG;AACH,wBAAgB,SAAS,CAAC,KAAK,EAAE,cAAc,2CAkC9C;yBAlCe,SAAS;oCAPU;QAAE,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAA;KAAE;;AA8ChE,OAAO,EAAE,KAAK,eAAe,EAAE,CAAC"} \ No newline at end of file +{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/swift-ui/TextField/index.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,OAAO,CAAC;AAEjC,OAAO,EAAc,KAAK,eAAe,EAA4B,MAAM,aAAa,CAAC;AACzF,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAG7C,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,UAAU,CAAC;AAExD;;GAEG;AACH,MAAM,MAAM,YAAY,GAAG;IACzB,OAAO,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAC5C,8BAA8B;IAC9B,KAAK,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC3B,KAAK,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC3B,IAAI,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC1B;;;OAGG;IACH,YAAY,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CAC7D,CAAC;AAEF;;GAEG;AACH,MAAM,MAAM,kBAAkB,GAAG;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,CAAC;AAEhE,MAAM,MAAM,cAAc,GAAG;IAC3B,GAAG,CAAC,EAAE,GAAG,CAAC,YAAY,CAAC,CAAC;IACxB;;;;OAIG;IACH,IAAI,CAAC,EAAE,eAAe,CAAC,MAAM,CAAC,CAAC;IAC/B;;;;;OAKG;IACH,SAAS,CAAC,EAAE,eAAe,CAAC,kBAAkB,CAAC,CAAC;IAChD,kFAAkF;IAClF,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,yFAAyF;IACzF,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB;;OAEG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB;;;;;OAKG;IACH,YAAY,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IACtC;;OAEG;IACH,aAAa,CAAC,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,IAAI,CAAC;IAC3C;;;OAGG;IACH,iBAAiB,CAAC,EAAE,CAAC,SAAS,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAA;KAAE,KAAK,IAAI,CAAC;IACxE;;;;;OAKG;IACH,IAAI,CAAC,EAAE,YAAY,GAAG,UAAU,CAAC;IACjC;;;;OAIG;IACH,QAAQ,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;CAC5B,GAAG,uBAAuB,CAAC;AAE5B,MAAM,MAAM,oBAAoB,GAAG,IAAI,CACrC,cAAc,EACd,MAAM,GAAG,WAAW,GAAG,cAAc,GAAG,eAAe,GAAG,mBAAmB,CAC9E,GACC,SAAS,CAAC,cAAc,EAAE;IAAE,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC,GAC5C,SAAS,CAAC,eAAe,EAAE;IAAE,KAAK,EAAE,OAAO,CAAA;CAAE,CAAC,GAC9C,SAAS,CAAC,mBAAmB,EAAE;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,CAAC,GAAG;IAC/D,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,gBAAgB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAClC,CAAC;AAWJ;;GAEG;AACH,wBAAgB,SAAS,CAAC,KAAK,EAAE,cAAc,2CAkC9C;yBAlCe,SAAS;oCAPU;QAAE,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAA;KAAE;;AA8ChE,OAAO,EAAE,KAAK,eAAe,EAAE,CAAC"} \ No newline at end of file diff --git a/packages/expo-ui/build/swift-ui/index.d.ts b/packages/expo-ui/build/swift-ui/index.d.ts index 14e95afa52a953..e6cc4d731c6bc7 100644 --- a/packages/expo-ui/build/swift-ui/index.d.ts +++ b/packages/expo-ui/build/swift-ui/index.d.ts @@ -1,4 +1,3 @@ -import '../State/index.fx'; export * from './AccessoryWidgetBackground'; export * from './Alert'; export * from './BottomSheet'; @@ -35,7 +34,7 @@ export * from './Spacer'; export * from './Stepper'; export * from './SwipeActions'; export * from './Text'; -export { useNativeState } from '../State/useNativeState'; +export { useNativeState } from '../State'; export { withAnimation, type WithAnimationCompletionCriteria } from './withAnimation'; export * from './SyncToggle'; export * from './TabView'; diff --git a/packages/expo-ui/build/swift-ui/index.d.ts.map b/packages/expo-ui/build/swift-ui/index.d.ts.map index 6d31dde6d3e364..9d687d50003b9e 100644 --- a/packages/expo-ui/build/swift-ui/index.d.ts.map +++ b/packages/expo-ui/build/swift-ui/index.d.ts.map @@ -1 +1 @@ -{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/swift-ui/index.tsx"],"names":[],"mappings":"AAAA,OAAO,mBAAmB,CAAC;AAE3B,cAAc,6BAA6B,CAAC;AAC5C,cAAc,SAAS,CAAC;AACxB,cAAc,eAAe,CAAC;AAC9B,cAAc,UAAU,CAAC;AACzB,cAAc,SAAS,CAAC;AACxB,cAAc,eAAe,CAAC;AAC9B,cAAc,0BAA0B,CAAC;AACzC,cAAc,sBAAsB,CAAC;AACrC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,eAAe,CAAC;AAC9B,cAAc,cAAc,CAAC;AAC7B,cAAc,WAAW,CAAC;AAC1B,cAAc,mBAAmB,CAAC;AAClC,cAAc,QAAQ,CAAC;AACvB,cAAc,SAAS,CAAC;AACxB,cAAc,QAAQ,CAAC;AACvB,cAAc,SAAS,CAAC;AACxB,cAAc,SAAS,CAAC;AACxB,cAAc,kBAAkB,CAAC;AACjC,cAAc,UAAU,CAAC;AACzB,cAAc,cAAc,CAAC;AAC7B,cAAc,cAAc,CAAC;AAC7B,cAAc,UAAU,CAAC;AACzB,cAAc,UAAU,CAAC;AACzB,cAAc,SAAS,CAAC;AACxB,cAAc,QAAQ,CAAC;AACvB,cAAc,QAAQ,CAAC;AACvB,cAAc,UAAU,CAAC;AACzB,cAAc,gBAAgB,CAAC;AAC/B,cAAc,WAAW,CAAC;AAC1B,cAAc,aAAa,CAAC;AAC5B,cAAc,UAAU,CAAC;AACzB,cAAc,UAAU,CAAC;AACzB,cAAc,WAAW,CAAC;AAC1B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,QAAQ,CAAC;AACvB,OAAO,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AACzD,OAAO,EAAE,aAAa,EAAE,KAAK,+BAA+B,EAAE,MAAM,iBAAiB,CAAC;AACtF,cAAc,cAAc,CAAC;AAC7B,cAAc,WAAW,CAAC;AAC1B,cAAc,UAAU,CAAC;AACzB,OAAO,EACL,SAAS,EACT,KAAK,cAAc,EACnB,KAAK,YAAY,EACjB,KAAK,kBAAkB,GACxB,MAAM,aAAa,CAAC;AACrB,cAAc,eAAe,CAAC;AAC9B,cAAc,aAAa,CAAC;AAC5B,cAAc,wBAAwB,CAAC;AACvC,cAAc,cAAc,CAAC;AAC7B,cAAc,UAAU,CAAC;AACzB,cAAc,QAAQ,CAAC;AACvB,cAAc,WAAW,CAAC;AAC1B,cAAc,WAAW,CAAC;AAC1B,cAAc,QAAQ,CAAC;AACvB,cAAc,cAAc,CAAC;AAC7B,cAAc,QAAQ,CAAC;AACvB,OAAO,EAAE,KAAK,SAAS,EAAE,KAAK,uBAAuB,EAAE,MAAM,SAAS,CAAC"} \ No newline at end of file +{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/swift-ui/index.tsx"],"names":[],"mappings":"AAAA,cAAc,6BAA6B,CAAC;AAC5C,cAAc,SAAS,CAAC;AACxB,cAAc,eAAe,CAAC;AAC9B,cAAc,UAAU,CAAC;AACzB,cAAc,SAAS,CAAC;AACxB,cAAc,eAAe,CAAC;AAC9B,cAAc,0BAA0B,CAAC;AACzC,cAAc,sBAAsB,CAAC;AACrC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,eAAe,CAAC;AAC9B,cAAc,cAAc,CAAC;AAC7B,cAAc,WAAW,CAAC;AAC1B,cAAc,mBAAmB,CAAC;AAClC,cAAc,QAAQ,CAAC;AACvB,cAAc,SAAS,CAAC;AACxB,cAAc,QAAQ,CAAC;AACvB,cAAc,SAAS,CAAC;AACxB,cAAc,SAAS,CAAC;AACxB,cAAc,kBAAkB,CAAC;AACjC,cAAc,UAAU,CAAC;AACzB,cAAc,cAAc,CAAC;AAC7B,cAAc,cAAc,CAAC;AAC7B,cAAc,UAAU,CAAC;AACzB,cAAc,UAAU,CAAC;AACzB,cAAc,SAAS,CAAC;AACxB,cAAc,QAAQ,CAAC;AACvB,cAAc,QAAQ,CAAC;AACvB,cAAc,UAAU,CAAC;AACzB,cAAc,gBAAgB,CAAC;AAC/B,cAAc,WAAW,CAAC;AAC1B,cAAc,aAAa,CAAC;AAC5B,cAAc,UAAU,CAAC;AACzB,cAAc,UAAU,CAAC;AACzB,cAAc,WAAW,CAAC;AAC1B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,QAAQ,CAAC;AACvB,OAAO,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAC1C,OAAO,EAAE,aAAa,EAAE,KAAK,+BAA+B,EAAE,MAAM,iBAAiB,CAAC;AACtF,cAAc,cAAc,CAAC;AAC7B,cAAc,WAAW,CAAC;AAC1B,cAAc,UAAU,CAAC;AACzB,OAAO,EACL,SAAS,EACT,KAAK,cAAc,EACnB,KAAK,YAAY,EACjB,KAAK,kBAAkB,GACxB,MAAM,aAAa,CAAC;AACrB,cAAc,eAAe,CAAC;AAC9B,cAAc,aAAa,CAAC;AAC5B,cAAc,wBAAwB,CAAC;AACvC,cAAc,cAAc,CAAC;AAC7B,cAAc,UAAU,CAAC;AACzB,cAAc,QAAQ,CAAC;AACvB,cAAc,WAAW,CAAC;AAC1B,cAAc,WAAW,CAAC;AAC1B,cAAc,QAAQ,CAAC;AACvB,cAAc,cAAc,CAAC;AAC7B,cAAc,QAAQ,CAAC;AACvB,OAAO,EAAE,KAAK,SAAS,EAAE,KAAK,uBAAuB,EAAE,MAAM,SAAS,CAAC"} \ No newline at end of file diff --git a/packages/expo-ui/build/swift-ui/modifiers/index.d.ts b/packages/expo-ui/build/swift-ui/modifiers/index.d.ts index adb7293e29cac6..4f7e827ad2161b 100644 --- a/packages/expo-ui/build/swift-ui/modifiers/index.d.ts +++ b/packages/expo-ui/build/swift-ui/modifiers/index.d.ts @@ -12,6 +12,7 @@ import { datePickerStyle } from './datePickerStyle'; import { environment } from './environment'; import { gaugeStyle } from './gaugeStyle'; import { progressViewStyle } from './progressViewStyle'; +import { onScrollPhaseChange, useScrollGeometryChange } from './scrollObservation'; import { id, scrollPosition } from './scrollPosition'; import { symbolEffect } from './symbolEffect'; import type { Color } from './types'; @@ -779,33 +780,41 @@ export declare const listSectionMargins: (params?: { }) => ModifierConfig; /** * Sets the font properties of a view. - * Supports both custom font families and system fonts with weight and design options. * - * @param params - The font configuration. When `family` is provided, it uses Font.custom(). - * When `family` is not provided, it uses Font.system() with the specified weight and design. + * Pass `textStyle` to scale with the user's Dynamic Type setting. Combine + * it with `family` to scale a custom font. * * @example * ```tsx - * // Custom font family - * Custom Font Text + * // Scales with Dynamic Type + * Hello * - * // System font with weight and design - * System Font Text + * // Custom font that scales relative to the body text style + * Hi + * + * // Fixed-size system font (no Dynamic Type scaling) + * Static * ``` - * @see Official [SwiftUI documentation for `custom(_:size:)`](https://developer.apple.com/documentation/swiftui/font/custom(_:size:)) and Official [SwiftUI documentation for `system(size:weight:design:)`](https://developer.apple.com/documentation/swiftui/font/system(size:weight:design:)). + * @see Official SwiftUI documentation for [`system(_:design:weight:)`](https://developer.apple.com/documentation/swiftui/font/system(_:design:weight:)), and [`custom(_:size:relativeTo:)`](https://developer.apple.com/documentation/swiftui/font/custom(_:size:relativeto:)). */ export declare const font: (params: { + /** Custom font family name. */ + family?: string; /** - * Custom font family name. - * If provided, uses `Font.custom()`. + * Font size in points. Ignored when only `textStyle` is set. + * + * @default 17 */ - family?: string; - /** Font size in points. */ size?: number; - /** Font weight for system fonts. */ + /** Font weight. */ weight?: "ultraLight" | "thin" | "light" | "regular" | "medium" | "semibold" | "bold" | "heavy" | "black"; - /** Font design for system fonts */ + /** Font design. Applied when no `family` is provided. `Font.custom` always uses the embedded font's own design. */ design?: "default" | "rounded" | "serif" | "monospaced"; + /** + * SwiftUI text style. When set, the resulting font scales with the user's + * Dynamic Type setting. + */ + textStyle?: "largeTitle" | "title" | "title2" | "title3" | "headline" | "subheadline" | "body" | "callout" | "footnote" | "caption" | "caption2"; }) => ModifierConfig; /** * Asks grid layouts not to offer the view extra size in the specified axes. @@ -960,7 +969,7 @@ export declare const resizable: (capInsets?: { * This provides type safety for the modifiers array. * @hidden */ -export type BuiltInModifier = ReturnType | ReturnType | ReturnType | ReturnType | ReturnType | ReturnType | ReturnType | ReturnType | ReturnType | ReturnType | ReturnType | ReturnType | ReturnType | ReturnType | ReturnType | ReturnType | ReturnType | ReturnType | ReturnType | ReturnType | ReturnType | ReturnType | ReturnType | ReturnType | ReturnType | ReturnType | ReturnType | ReturnType + * // Scales with Dynamic Type + * Hello * - * // System font with weight and design - * System Font Text + * // Custom font that scales relative to the body text style + * Hi + * + * // Fixed-size system font (no Dynamic Type scaling) + * Static * ``` - * @see Official [SwiftUI documentation for `custom(_:size:)`](https://developer.apple.com/documentation/swiftui/font/custom(_:size:)) and Official [SwiftUI documentation for `system(size:weight:design:)`](https://developer.apple.com/documentation/swiftui/font/system(size:weight:design:)). + * @see Official SwiftUI documentation for [`system(_:design:weight:)`](https://developer.apple.com/documentation/swiftui/font/system(_:design:weight:)), and [`custom(_:size:relativeTo:)`](https://developer.apple.com/documentation/swiftui/font/custom(_:size:relativeto:)). */ export const font = (params: { + /** Custom font family name. */ + family?: string; /** - * Custom font family name. - * If provided, uses `Font.custom()`. + * Font size in points. Ignored when only `textStyle` is set. + * + * @default 17 */ - family?: string; - /** Font size in points. */ size?: number; - /** Font weight for system fonts. */ + /** Font weight. */ weight?: | 'ultraLight' | 'thin' @@ -1015,8 +1019,24 @@ export const font = (params: { | 'bold' | 'heavy' | 'black'; - /** Font design for system fonts */ + /** Font design. Applied when no `family` is provided. `Font.custom` always uses the embedded font's own design. */ design?: 'default' | 'rounded' | 'serif' | 'monospaced'; + /** + * SwiftUI text style. When set, the resulting font scales with the user's + * Dynamic Type setting. + */ + textStyle?: + | 'largeTitle' + | 'title' + | 'title2' + | 'title3' + | 'headline' + | 'subheadline' + | 'body' + | 'callout' + | 'footnote' + | 'caption' + | 'caption2'; }) => createModifier('font', params); /** * Asks grid layouts not to offer the view extra size in the specified axes. @@ -1339,6 +1359,8 @@ export type BuiltInModifier = | ReturnType | ReturnType | ReturnType + | ReturnType + | NonNullable> | ReturnType | ReturnType | ReturnType @@ -1429,6 +1451,7 @@ export * from './presentationModifiers'; export * from './environment'; export * from './scrollPosition'; export * from './symbolEffect'; +export * from './scrollObservation'; export * from './widgets'; export type { TimingAnimationParams, diff --git a/packages/expo-ui/src/swift-ui/modifiers/scrollObservation.ts b/packages/expo-ui/src/swift-ui/modifiers/scrollObservation.ts new file mode 100644 index 00000000000000..8068f665b0a9d6 --- /dev/null +++ b/packages/expo-ui/src/swift-ui/modifiers/scrollObservation.ts @@ -0,0 +1,80 @@ +import { getStateId, useWorkletProp, worklets } from '../../State'; +import type { ScrollGeometry, ScrollPhase } from '../ScrollView'; +import { createModifier, createModifierWithEventListener } from './createModifier'; + +/** + * Fires when the scroll geometry changes — i.e., on every scroll update and + * on container/content size changes. Use to drive continuous progress UI + * such as page indicators, parallax, or fractional offsets. + * + * If the callback is marked with the `'worklet'` directive, it runs + * synchronously on the UI thread (no JS-thread round-trip); otherwise it is + * delivered asynchronously as a regular JS event. Both paths share the same + * native modifier — the worklet variant is automatically wrapped in a + * `WorkletCallback` shared object whose lifetime is managed by the hook. + * + * This is a hook because the worklet path requires a stable shared-object + * reference across renders. Call it at the top of your component, then + * include the returned modifier in your `modifiers` array. + * + * Apply to a SwiftUI `ScrollView` (and other scrollable views). On iOS below + * 18.0 the modifier is a no-op. + * + * @platform ios 18.0+ + * @platform tvos 18.0+ + * + * @see Official [SwiftUI documentation](https://developer.apple.com/documentation/swiftui/view/onscrollgeometrychange(for:of:_:)). + * + * @example + * ```tsx + * const geometryModifier = useScrollGeometryChange((g) => { + * 'worklet'; + * progress.value = g.contentOffsetX / g.containerWidth; + * }); + * + * + * ``` + */ +export function useScrollGeometryChange(callback?: (geometry: ScrollGeometry) => void) { + const isWorklet = !!callback && !!worklets?.isWorkletFunction?.(callback); + const workletCallback = useWorkletProp( + isWorklet ? callback : undefined, + 'onScrollGeometryChange' + ); + + if (!callback) { + return null; + } + if (isWorklet && workletCallback) { + return createModifier('onScrollGeometryChange', { + workletCallback: getStateId(workletCallback), + }); + } + return createModifierWithEventListener('onScrollGeometryChange', (event: ScrollGeometry) => + callback(event) + ); +} + +/** + * Fires when SwiftUI's scroll phase changes (e.g., the user begins dragging, + * the scroll view starts decelerating, or scrolling settles to idle). The + * second argument is the scroll geometry sampled at the phase transition, + * useful for reading the final offset on settle without subscribing to + * per-frame `onScrollGeometryChange`. + * + * Apply to a SwiftUI `ScrollView` (and other scrollable views). On iOS below + * 18.0 the modifier is a no-op. + * + * @platform ios 18.0+ + * @platform tvos 18.0+ + * + * @see Official [SwiftUI documentation](https://developer.apple.com/documentation/swiftui/view/onscrollphasechange(_:)). + */ +export const onScrollPhaseChange = ( + callback: (phase: ScrollPhase, geometry: ScrollGeometry) => void +) => + createModifierWithEventListener( + 'onScrollPhaseChange', + (event: { phase: ScrollPhase; geometry: ScrollGeometry }) => + callback(event.phase, event.geometry) + ); diff --git a/packages/expo-ui/src/swift-ui/modifiers/scrollPosition.ts b/packages/expo-ui/src/swift-ui/modifiers/scrollPosition.ts index f495448350047a..998cb6a52d61b0 100644 --- a/packages/expo-ui/src/swift-ui/modifiers/scrollPosition.ts +++ b/packages/expo-ui/src/swift-ui/modifiers/scrollPosition.ts @@ -1,7 +1,6 @@ import type { UnitPointValue } from '.'; import { createModifier, createModifierWithEventListener } from './createModifier'; -import { type ObservableState } from '../../State/useNativeState'; -import { getStateId } from '../../State/utils'; +import { getStateId, type ObservableState } from '../../State'; /** * Attaches a stable identifier to a view so it can be referenced by scroll target bindings. diff --git a/packages/expo-ui/src/swift-ui/modifiers/symbolEffect.ts b/packages/expo-ui/src/swift-ui/modifiers/symbolEffect.ts index f6cac11cf60d3c..e6641e816e1d15 100644 --- a/packages/expo-ui/src/swift-ui/modifiers/symbolEffect.ts +++ b/packages/expo-ui/src/swift-ui/modifiers/symbolEffect.ts @@ -1,6 +1,5 @@ import { createModifier } from './createModifier'; -import { type ObservableState } from '../../State/useNativeState'; -import { getStateId } from '../../State/utils'; +import { getStateId, type ObservableState } from '../../State'; // https://developer.apple.com/documentation/symbols/appearsymboleffect type AppearSymbolEffect = { diff --git a/packages/expo-ui/src/swift-ui/withAnimation.ts b/packages/expo-ui/src/swift-ui/withAnimation.ts index fb3cbd2927f81c..a7d63a6a77a578 100644 --- a/packages/expo-ui/src/swift-ui/withAnimation.ts +++ b/packages/expo-ui/src/swift-ui/withAnimation.ts @@ -1,6 +1,6 @@ import { requireNativeModule } from 'expo'; -import { worklets } from '../State/optionalWorklets'; +import { worklets } from '../State'; import { VALUE_SYMBOL } from './modifiers/animation/constants'; import type { AnimationObject, ChainableAnimationType } from './modifiers/animation/types'; diff --git a/packages/expo-ui/src/universal/BottomSheet/index.android.tsx b/packages/expo-ui/src/universal/BottomSheet/index.android.tsx index 1ea52483187c88..bcf5e6e2f5a435 100644 --- a/packages/expo-ui/src/universal/BottomSheet/index.android.tsx +++ b/packages/expo-ui/src/universal/BottomSheet/index.android.tsx @@ -1,10 +1,11 @@ -import { Column, ModalBottomSheet } from '@expo/ui/jetpack-compose'; +import { Column, Host, ModalBottomSheet, type ModalBottomSheetRef } from '@expo/ui/jetpack-compose'; import { fillMaxHeight, padding, testID as testIDModifier, type ModifierConfig, } from '@expo/ui/jetpack-compose/modifiers'; +import { useEffect, useRef, useState } from 'react'; import type { BottomSheetProps, SnapPoint } from './types'; @@ -38,21 +39,43 @@ export function BottomSheet({ testID, modifiers, }: BottomSheetProps) { - if (!isPresented) return null; + const sheetRef = useRef(null); + const [mount, setMount] = useState(isPresented); + + useEffect(() => { + if (isPresented) { + setMount(true); + return; + } + let cancelled = false; + sheetRef.current?.hide().then(() => { + if (!cancelled) setMount(false); + }); + return () => { + cancelled = true; + }; + }, [isPresented]); + + if (!mount) { + return null; + } const contentModifiers: ModifierConfig[] = [padding(16, showDragIndicator ? 0 : 16, 16, 0)]; if (shouldFillMaxHeight(snapPoints)) contentModifiers.push(fillMaxHeight()); if (testID) contentModifiers.push(testIDModifier(testID)); return ( - - {/* When the drag handle is hidden, add top padding so content doesn't crop against the top edge of the sheet. */} - {children} - + + + {/* When the drag handle is hidden, add top padding so content doesn't crop against the top edge of the sheet. */} + {children} + + ); } diff --git a/packages/expo-ui/src/universal/BottomSheet/index.ios.tsx b/packages/expo-ui/src/universal/BottomSheet/index.ios.tsx index 1a64a8c132ca90..e237c14843ed91 100644 --- a/packages/expo-ui/src/universal/BottomSheet/index.ios.tsx +++ b/packages/expo-ui/src/universal/BottomSheet/index.ios.tsx @@ -1,4 +1,4 @@ -import { BottomSheet as SwiftUIBottomSheet, Group } from '@expo/ui/swift-ui'; +import { BottomSheet as SwiftUIBottomSheet, Group, Host } from '@expo/ui/swift-ui'; import { frame, padding, @@ -38,15 +38,17 @@ export function BottomSheet({ } return ( - { - if (!presented) onDismiss(); - }} - fitToContents={!snapPoints || snapPoints.length === 0} - testID={testID}> - {children} - + + { + if (!presented) onDismiss(); + }} + fitToContents={!snapPoints || snapPoints.length === 0} + testID={testID}> + {children} + + ); } diff --git a/packages/expo-ui/src/universal/RNHostView/index.tsx b/packages/expo-ui/src/universal/RNHostView/index.tsx index afdaa3518a8844..1e2ca9b23b9bbc 100644 --- a/packages/expo-ui/src/universal/RNHostView/index.tsx +++ b/packages/expo-ui/src/universal/RNHostView/index.tsx @@ -10,7 +10,7 @@ const styles = StyleSheet.create({ }); /** - * Hosts React Native views inside SwiftUI or Jetpack Compose views. + * Hosts React Native views inside Jetpack Compose or SwiftUI views. */ export function RNHostView({ children, diff --git a/packages/expo/CHANGELOG.md b/packages/expo/CHANGELOG.md index 0a6a2feea0a17d..1062f568958678 100644 --- a/packages/expo/CHANGELOG.md +++ b/packages/expo/CHANGELOG.md @@ -11,6 +11,8 @@ ### 🐛 Bug fixes +- Fix `expo/fetch` not threading through `Request#body` for `whatwg-fetch` request inputs ([#46027](https://github.com/expo/expo/pull/46027) by [@kitten](https://github.com/kitten)) + ### 💡 Others ## 56.0.0-preview.13 — 2026-05-19 diff --git a/packages/expo/build/winter/fetch/fetch.d.ts.map b/packages/expo/build/winter/fetch/fetch.d.ts.map index 9a6decb3b8eee4..9ac3ff039852a9 100644 --- a/packages/expo/build/winter/fetch/fetch.d.ts.map +++ b/packages/expo/build/winter/fetch/fetch.d.ts.map @@ -1 +1 @@ -{"version":3,"file":"fetch.d.ts","sourceRoot":"","sources":["../../../src/winter/fetch/fetch.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,aAAa,EAAyC,MAAM,iBAAiB,CAAC;AAQvF,OAAO,KAAK,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AAYxE,wBAAsB,KAAK,CACzB,KAAK,EAAE,MAAM,GAAG,GAAG,GAAG,gBAAgB,EACtC,IAAI,CAAC,EAAE,gBAAgB,GACtB,OAAO,CAAC,aAAa,CAAC,CAqDxB"} \ No newline at end of file +{"version":3,"file":"fetch.d.ts","sourceRoot":"","sources":["../../../src/winter/fetch/fetch.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,aAAa,EAAyC,MAAM,iBAAiB,CAAC;AAQvF,OAAO,KAAK,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AAwBxE,wBAAsB,KAAK,CACzB,KAAK,EAAE,MAAM,GAAG,GAAG,GAAG,gBAAgB,EACtC,IAAI,CAAC,EAAE,gBAAgB,GACtB,OAAO,CAAC,aAAa,CAAC,CAuDxB"} \ No newline at end of file diff --git a/packages/expo/src/winter/fetch/fetch.ts b/packages/expo/src/winter/fetch/fetch.ts index fc19c7e8beaf26..ac789c024c9637 100644 --- a/packages/expo/src/winter/fetch/fetch.ts +++ b/packages/expo/src/winter/fetch/fetch.ts @@ -19,6 +19,18 @@ const isRequest = (input: any): input is FetchRequestLike => { } }; +const dangerouslyGetBodyFromRequest = ( + input: FetchRequestLike | FetchRequestInit | undefined +): BodyInit | null => { + if (input != null && input instanceof Request && '_bodyInit' in input) { + // NOTE(@kitten): whatwg-fetch has a hidden property for the body input + // TODO(@kitten): We should have our own Request class implementation + return (input as any)._noBody !== true ? (input as any)._bodyInit : null; + } else { + return input?.body ?? null; + } +}; + // TODO(@kitten): Do we really want to use our own types for web standards? export async function fetch( input: string | URL | FetchRequestLike, @@ -26,7 +38,9 @@ export async function fetch( ): Promise { const initFromRequest = isRequest(input); const url = initFromRequest ? input.url : input; - const body = init?.body ?? (initFromRequest ? input.body : null); + const body = + dangerouslyGetBodyFromRequest(init) ?? + (initFromRequest ? dangerouslyGetBodyFromRequest(input) : null); const signal = init?.signal ?? (initFromRequest ? input.signal : undefined); const redirect = init?.redirect ?? (initFromRequest ? input.redirect : undefined); const method = init?.method ?? (initFromRequest ? input.method : undefined); diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 36f9a330635e01..1a0e6e9f496f10 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -1309,12 +1309,18 @@ importers: react-native-gesture-handler: specifier: ~2.30.0 version: 2.30.0(react-native@0.85.3(@babel/core@7.29.0)(@react-native/jest-preset@0.85.3(@babel/core@7.29.0)(react@19.2.3))(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.2.14)(react@19.2.3))(react@19.2.3) + react-native-reanimated: + specifier: 4.3.0 + version: 4.3.0(patch_hash=1e34e4238541638db96b94d5a2e974e73f3b801788a3d8f5c3f4b237a0559138)(react-native-worklets@0.8.3(patch_hash=3f49a21b44ba558989a3366eeff9c92ee331e18b736dbe89c5962ecc6f2802f1)(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(react-native@0.85.3(@babel/core@7.29.0)(@react-native/jest-preset@0.85.3(@babel/core@7.29.0)(react@19.2.3))(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.2.14)(react@19.2.3))(react@19.2.3))(react-native@0.85.3(@babel/core@7.29.0)(@react-native/jest-preset@0.85.3(@babel/core@7.29.0)(react@19.2.3))(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.2.14)(react@19.2.3))(react@19.2.3) react-native-safe-area-context: specifier: 5.6.2 version: 5.6.2(react-native@0.85.3(@babel/core@7.29.0)(@react-native/jest-preset@0.85.3(@babel/core@7.29.0)(react@19.2.3))(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.2.14)(react@19.2.3))(react@19.2.3) react-native-screens: specifier: 4.25.1 version: 4.25.1(react-native@0.85.3(@babel/core@7.29.0)(@react-native/jest-preset@0.85.3(@babel/core@7.29.0)(react@19.2.3))(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.2.14)(react@19.2.3))(react@19.2.3) + react-native-worklets: + specifier: 0.8.3 + version: 0.8.3(patch_hash=3f49a21b44ba558989a3366eeff9c92ee331e18b736dbe89c5962ecc6f2802f1)(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(react-native@0.85.3(@babel/core@7.29.0)(@react-native/jest-preset@0.85.3(@babel/core@7.29.0)(react@19.2.3))(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.2.14)(react@19.2.3))(react@19.2.3) test-suite: specifier: workspace:* version: link:../test-suite @@ -2168,6 +2174,9 @@ importers: '@expo/plist': specifier: workspace:^0.6.0 version: link:../plist + '@expo/require-utils': + specifier: workspace:^56.1.1 + version: link:../require-utils '@expo/sdk-runtime-versions': specifier: ^1.0.0 version: 1.0.0 @@ -2183,9 +2192,6 @@ importers: glob: specifier: ^13.0.0 version: 13.0.6 - resolve-from: - specifier: ^5.0.0 - version: 5.0.0 semver: specifier: ^7.5.4 version: 7.7.4 @@ -14261,6 +14267,13 @@ packages: react-native: 0.85.3 react-native-safe-area-context: '*' + react-native-reanimated@4.3.0: + resolution: {integrity: sha512-HOTTPdKtddXTOsmQxDASXEwLS3lqEHrKERD3XOgzSqWJ7L3x81Pnx7mTcKx1FKdkgomMug/XSmm1C6Z7GIowxA==} + peerDependencies: + react: 19.2.3 + react-native: 0.85.3 + react-native-worklets: 0.8.x + react-native-reanimated@4.3.1: resolution: {integrity: sha512-KhGsS0YkCA+gusgyzlf9hnqzVPIR398KTpqXyqq/+yYJJPAvyEEPKcxlB0xtOOXSMrR2A9uRKVARVQhZwrOh+Q==} peerDependencies: @@ -25213,6 +25226,14 @@ snapshots: react-native-safe-area-context: 5.6.2(react-native@0.85.3(@babel/core@7.29.0)(@react-native/jest-preset@0.85.3(@babel/core@7.29.0)(react@19.2.3))(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.2.14)(react@19.2.3))(react@19.2.3) use-latest-callback: 0.2.6(react@19.2.3) + react-native-reanimated@4.3.0(patch_hash=1e34e4238541638db96b94d5a2e974e73f3b801788a3d8f5c3f4b237a0559138)(react-native-worklets@0.8.3(patch_hash=3f49a21b44ba558989a3366eeff9c92ee331e18b736dbe89c5962ecc6f2802f1)(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(react-native@0.85.3(@babel/core@7.29.0)(@react-native/jest-preset@0.85.3(@babel/core@7.29.0)(react@19.2.3))(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.2.14)(react@19.2.3))(react@19.2.3))(react-native@0.85.3(@babel/core@7.29.0)(@react-native/jest-preset@0.85.3(@babel/core@7.29.0)(react@19.2.3))(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.2.14)(react@19.2.3))(react@19.2.3): + dependencies: + react: 19.2.3 + react-native: 0.85.3(@babel/core@7.29.0)(@react-native/jest-preset@0.85.3(@babel/core@7.29.0)(react@19.2.3))(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.2.14)(react@19.2.3) + react-native-is-edge-to-edge: 1.3.1(react-native@0.85.3(@babel/core@7.29.0)(@react-native/jest-preset@0.85.3(@babel/core@7.29.0)(react@19.2.3))(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.2.14)(react@19.2.3))(react@19.2.3) + react-native-worklets: 0.8.3(patch_hash=3f49a21b44ba558989a3366eeff9c92ee331e18b736dbe89c5962ecc6f2802f1)(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(react-native@0.85.3(@babel/core@7.29.0)(@react-native/jest-preset@0.85.3(@babel/core@7.29.0)(react@19.2.3))(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.2.14)(react@19.2.3))(react@19.2.3) + semver: 7.7.4 + react-native-reanimated@4.3.1(patch_hash=1e34e4238541638db96b94d5a2e974e73f3b801788a3d8f5c3f4b237a0559138)(react-native-worklets@0.8.3(patch_hash=3f49a21b44ba558989a3366eeff9c92ee331e18b736dbe89c5962ecc6f2802f1)(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(react-native@0.85.3(@babel/core@7.29.0)(@react-native/jest-preset@0.85.3(@babel/core@7.29.0)(react@19.2.3))(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.2.14)(react@19.2.3))(react@19.2.3))(react-native@0.85.3(@babel/core@7.29.0)(@react-native/jest-preset@0.85.3(@babel/core@7.29.0)(react@19.2.3))(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.2.14)(react@19.2.3))(react@19.2.3): dependencies: react: 19.2.3 diff --git a/tools/src/commands/GenerateDocsAPIData.ts b/tools/src/commands/GenerateDocsAPIData.ts index 3279a153ec2988..2950b8dc2891cf 100644 --- a/tools/src/commands/GenerateDocsAPIData.ts +++ b/tools/src/commands/GenerateDocsAPIData.ts @@ -177,6 +177,7 @@ const uiPackagesMapping: Record = { 'expo-ui/universal/list': ['universal/List/index.tsx', 'expo-ui'], 'expo-ui/universal/listitem': ['universal/ListItem/index.ts', 'expo-ui'], 'expo-ui/universal/picker': ['universal/Picker/index.ts', 'expo-ui'], + 'expo-ui/universal/rnhostview': ['universal/RNHostView/index.tsx', 'expo-ui'], }; const PACKAGES_MAPPING: Record = {