Reference version

Surface

A Jetpack Compose Surface component for styled content containers.

Android
Bundled version:
~55.0.9

Expo UI Surface matches the official Jetpack Compose Surface API and provides a container that applies Material Design surface styling including color, elevation, and content color.

Installation

Terminal
npx expo install @expo/ui

If you are installing this in an existing React Native app, make sure to install expo in your project.

Usage

Basic surface

BasicSurfaceExample.tsx
import { Host, Surface, Text } from '@expo/ui/jetpack-compose'; import { paddingAll } from '@expo/ui/jetpack-compose/modifiers'; export default function BasicSurfaceExample() { return ( <Host matchContents> <Surface modifiers={[paddingAll(16)]}> <Text>Content on a surface</Text> </Surface> </Host> ); }

Surface with elevation

Use tonalElevation and shadowElevation to control the visual depth of the surface.

SurfaceElevationExample.tsx
import { Host, Surface, Column, Text } from '@expo/ui/jetpack-compose'; import { paddingAll } from '@expo/ui/jetpack-compose/modifiers'; export default function SurfaceElevationExample() { return ( <Host matchContents> <Column modifiers={[paddingAll(16)]}> <Surface tonalElevation={1} shadowElevation={2} modifiers={[paddingAll(16)]}> <Text>Low elevation</Text> </Surface> <Surface tonalElevation={4} shadowElevation={8} modifiers={[paddingAll(16)]}> <Text>High elevation</Text> </Surface> </Column> </Host> ); }

Surface with custom colors

Use the color and contentColor props to override the default Material theme colors.

SurfaceCustomColorsExample.tsx
import { Host, Surface, Text } from '@expo/ui/jetpack-compose'; import { paddingAll } from '@expo/ui/jetpack-compose/modifiers'; export default function SurfaceCustomColorsExample() { return ( <Host matchContents> <Surface color="#1E3A5F" contentColor="#FFFFFF" tonalElevation={2} modifiers={[paddingAll(16)]}> <Text color="#FFFFFF">Custom colored surface</Text> </Surface> </Host> ); }

Surface with shape and border

Use the shape prop to clip content and border to draw a stroke around the surface.

SurfaceShapeBorderExample.tsx
import { Host, Surface, Shape, Text } from '@expo/ui/jetpack-compose'; import { paddingAll } from '@expo/ui/jetpack-compose/modifiers'; export default function SurfaceShapeBorderExample() { return ( <Host matchContents> <Surface shape={Shape.RoundedCorner({ cornerRadii: { topStart: 16, topEnd: 16, bottomStart: 16, bottomEnd: 16 }, })} border={{ width: 2, color: '#6200EE' }} modifiers={[paddingAll(16)]}> <Text>Rounded surface with border</Text> </Surface> </Host> ); }

API

import { Surface } from '@expo/ui/jetpack-compose';

Component

Surface

Android

Type: React.Element<SurfaceProps>

A Material Design surface container. Surface is responsible for:

  • Clipping content to the shape
  • Applying background color based on tonal elevation
  • Providing content color to its children

SurfaceProps

border

Android
Optional • Type: SurfaceBorder

Border stroke drawn around the surface.

checked

Android
Optional • Type: boolean

Whether the surface is in a checked (toggled on) state. When provided together with onCheckedChange, the surface becomes a toggleable surface.

children

Android
Optional • Type: React.ReactNode

The content to display inside the surface.

color

Android
Optional • Type: ColorValue

The background color of the surface. Defaults to MaterialTheme.colorScheme.surface.

contentColor

Android
Optional • Type: ColorValue

The color of the content inside the surface. Defaults to contentColorFor(color).

enabled

Android
Optional • Type: boolean • Default: true

Whether the surface is enabled and responds to user interaction.

modifiers

Android
Optional • Type: ModifierConfig[]

Modifiers for the component.

onCheckedChange

Android
Optional • Type: (checked: boolean) => void

Called when the checked state of a toggleable surface changes. Providing this callback together with checked enables the toggleable variant.

onClick

Android
Optional • Type: () => void

Called when the surface is clicked. Providing this callback makes the surface clickable. When combined with selected, the surface becomes a selectable variant.

selected

Android
Optional • Type: boolean

Whether the surface is in a selected state. When provided together with onClick, the surface becomes a selectable surface that visually reflects its selection state.

shadowElevation

Android
Optional • Type: number • Default: 0

The shadow elevation of the surface. Value in dp.

shape

Android
Optional • Type: ShapeJSXElement

Shape configuration for clipping the surface.

tonalElevation

Android
Optional • Type: number • Default: 0

The tonal elevation of the surface, which affects its background color based on the color scheme. Value in dp.

Types

SurfaceBorder

Android

Border stroke configuration.

PropertyTypeDescription
color(optional)ColorValue

Border color.

Default:MaterialTheme.colorScheme.outline
width(optional)number

Border width in dp.

Default:1