react-native-screens
Version:
Native navigation primitives for your React Native app.
214 lines (208 loc) • 7.35 kB
text/typescript
import type { ReactNode } from 'react';
import type { ColorValue } from 'react-native';
import type { StackHeaderSubviewCollapseModeAndroid } from './android/StackHeaderSubview.android.types';
import type { PlatformIconAndroid } from '../../../../types';
export type StackHeaderTypeAndroid = 'small' | 'medium' | 'large';
export type StackHeaderBackgroundSubviewCollapseModeAndroid =
StackHeaderSubviewCollapseModeAndroid;
export interface StackHeaderToolbarSubviewAndroid {
/**
* @summary The React component rendered in this toolbar slot.
*
* The subview is sized by React Native's layout engine but positioned by the
* platform native layout. Each subview is placed independently — subviews do
* not participate in a shared flex layout and cannot influence each other's
* sizing.
*
*
* @remarks
* Intrinsic sizing and explicit dimensions work as expected. Avoid
* parent-relative sizing (e.g. `flex: 1`) on the root element — it will
* produce incorrect dimensions. Flex layout within a root that has a known
* size works as expected.
*
* @platform android
*/
Component: NonNullable<ReactNode>;
}
export interface StackHeaderBackgroundSubviewAndroid {
/**
* @summary Controls how the background subview behaves when the app bar
* collapses.
*
* The following values are available:
* - `off` - the subview scrolls away with the app bar,
* - `parallax` - the subview scrolls at a slower rate, creating a parallax
* effect.
*
* @remarks
* `pin` is not currently supported because the background subview is
* stretched to match the entire `AppBarLayout`, which causes pinned content
* to move immediately rather than staying fixed. Support for `pin` collapse
* mode might be added in the future.
*
* @default off
*
* @platform android
*/
collapseMode?: StackHeaderSubviewCollapseModeAndroid | undefined;
/**
* @summary The React component rendered as the header background.
*
* The subview is stretched to match the header (`AppBarLayout`) dimensions,
* so parent-relative sizing (e.g. `flex: 1`) works correctly.
*
* @platform android
*/
Component: NonNullable<ReactNode>;
}
export interface StackHeaderConfigPropsAndroid {
/**
* @summary Specifies the type of the Material 3 app bar.
*
* The following values are available:
* - `small` - small app bar with fixed title,
* - `medium` - medium app bar with collapsing title,
* - `large` - large app bar with collapsing title.
*
* @remarks
* M3 Expressive headers aren't currently supported (there is no stable
* `MDC-Android` version yet).
*
* @see {@link https://m3.material.io/components/app-bars/overview|Material Design 3: App bars}
*
* @default small
*
* @platform android
*/
type?: StackHeaderTypeAndroid | undefined;
/**
* @summary Custom view rendered behind the header content.
*
* @platform android
*/
backgroundSubview?: StackHeaderBackgroundSubviewAndroid | undefined;
/**
* @summary Custom view placed in the leading (start) slot of the toolbar.
*
* @platform android
*/
leadingSubview?: StackHeaderToolbarSubviewAndroid | undefined;
/**
* @summary Custom view placed in the center slot of the toolbar.
*
* @platform android
*/
centerSubview?: StackHeaderToolbarSubviewAndroid | undefined;
/**
* @summary Custom view placed in the trailing (end) slot of the toolbar.
*
* @platform android
*/
trailingSubview?: StackHeaderToolbarSubviewAndroid | undefined;
/**
* @summary Tint color applied to the back button icon.
*
* When `undefined`, the default tint color is used. This applies to the
* native back arrow and `drawableResource` icons that have an associated
* tint. For `imageSource` icons, no tint is applied by default.
*
* @platform android
*/
backButtonTintColor?: ColorValue | undefined;
/**
* @summary Custom icon for the back button.
*
* When `undefined`, the native back arrow (`homeAsUpIndicator`) is used.
*
* Supported values:
* - `{ type: 'imageSource', imageSource }`
* Uses an image from the provided resource.
*
* Remarks: `imageSource` type doesn't support SVGs on Android.
* For loading SVGs use `drawableResource` type.
*
* - `{ type: 'drawableResource', name }`
* Uses a drawable resource with the given name.
*
* Remarks: Requires passing a drawable to resources via Android Studio.
*
* @platform android
*/
backButtonIcon?: PlatformIconAndroid | undefined;
/**
* @summary Whether the header reacts to nested scroll. Required for any
* other `scrollFlag*` prop to take effect.
*
* When `undefined`, falls back to the type-specific default:
* - `small` -> `false`
* - `medium` / `large` -> `true`
*
* @remarks
* Changing any `scrollFlag*` at runtime forces the header back to
* its fully expanded state, which produces a visible snap. Treat these
* props as a static configuration.
*
* @platform android
*/
scrollFlagScroll?: boolean | undefined;
/**
* @summary When enabled, the header re-expands as soon as the user scrolls
* back toward the top of the content, regardless of the ScrollView's current
* scroll position. Without this flag, the header only begins expanding once
* the list has reached the top of its content. Requires `scrollFlagScroll`.
*
* When `undefined`, falls back to the type-specific default (`false` for
* all types).
*
* @platform android
*/
scrollFlagEnterAlways?: boolean | undefined;
/**
* @summary Modifies `scrollFlagEnterAlways` so that the initial re-entry
* stops at the header's collapsed height (the toolbar); the remainder
* expands only after the ScrollView reaches the top of its content. Requires
* `scrollFlagEnterAlways`.
*
* When `undefined`, falls back to the type-specific default (`false` for
* all types).
*
* @remarks
* This flag does not have any effect for `small` header.
*
* @platform android
*/
scrollFlagEnterAlwaysCollapsed?: boolean | undefined;
/**
* @summary When enabled, the header collapses only until its minimum height
* (the toolbar) remains pinned at the top. Without this flag, the entire
* header scrolls off the screen. Requires `scrollFlagScroll`.
*
* When `undefined`, falls back to the type-specific default:
* - `small` -> `false`
* - `medium` / `large` -> `true`
*
* @remarks
* Setting this flag for `small` header is equivalent to disabling
* `scrollFlagScroll`.
*
* Even when this flag is disabled, a strip with the height of the system top
* inset (status bar and display cutout) remains visible at the top.
*
* @platform android
*/
scrollFlagExitUntilCollapsed?: boolean | undefined;
/**
* @summary When enabled, the header snaps to its nearest edge (fully
* expanded, or fully collapsed as defined by `scrollFlagExitUntilCollapsed`)
* after a scroll gesture ends, instead of resting partway. Requires
* `scrollFlagScroll`.
*
* When `undefined`, falls back to the type-specific default:
* - `small` -> `false`
* - `medium` / `large` -> `true`
*
* @platform android
*/
scrollFlagSnap?: boolean | undefined;
}