Expo UI and Router for iOS
Components

Text

A SwiftUI Text component for displaying styled text with support for nested texts.

Expo UI Text matches the official SwiftUI Text API.

Usage

Basic text

import { Host, Text } from '@expo/ui/swift-ui';

export default function BasicTextExample() {
  return (
    <Host style={{ flex: 1 }}>
      <Text>Hello world</Text>
    </Host>
  );
}

Text with modifiers

Use modifiers to style the entire text.

import { Host, Text } from '@expo/ui/swift-ui';
import { font, foregroundStyle } from '@expo/ui/swift-ui/modifiers';

export default function StyledTextExample() {
  return (
    <Host style={{ flex: 1 }}>
      <Text
        modifiers={[
          font({ size: 24, weight: 'bold' }),
          foregroundStyle('blue'),
        ]}>
        Large Bold Blue Text
      </Text>
    </Host>
  );
}

Nested text (per-segment styling)

Nest Text components to style individual segments differently. This is useful for inline formatting, such as bold or colored words within a sentence.

Note: Nested text uses SwiftUI's Text concatenation, so only modifiers that return Text (such as bold, italic, font, foregroundColor, and foregroundStyle with color) will apply to nested segments.

import { Host, Text } from '@expo/ui/swift-ui';
import {
  bold,
  italic,
  foregroundStyle,
} from '@expo/ui/swift-ui/modifiers';

export default function NestedTextExample() {
  return (
    <Host style={{ flex: 1 }}>
      <Text>
        Hello{' '}
        <Text modifiers={[bold(), foregroundStyle('red')]}>
          world
        </Text>
        !
      </Text>
    </Host>
  );
}

Mixed inline styles

Combine multiple styled segments for rich text formatting.

import { Host, Text } from '@expo/ui/swift-ui';
import {
  bold,
  italic,
  foregroundStyle,
  font,
} from '@expo/ui/swift-ui/modifiers';

export default function MixedStylesExample() {
  return (
    <Host style={{ flex: 1 }}>
      <Text>
        This is <Text modifiers={[bold()]}>bold</Text>,{' '}
        <Text modifiers={[italic()]}>italic</Text>, and{' '}
        <Text modifiers={[foregroundStyle('orange')]}>colored</Text>{' '}
        text.
      </Text>
    </Host>
  );
}

Font weights

Use the font modifier to apply different font weights.

import { Host, Text, VStack } from '@expo/ui/swift-ui';
import { font } from '@expo/ui/swift-ui/modifiers';

export default function FontWeightsExample() {
  return (
    <Host style={{ flex: 1 }}>
      <VStack spacing={4}>
        <Text modifiers={[font({ weight: 'ultraLight' })]}>
          Ultra Light
        </Text>
        <Text modifiers={[font({ weight: 'light' })]}>Light</Text>
        <Text modifiers={[font({ weight: 'regular' })]}>
          Regular
        </Text>
        <Text modifiers={[font({ weight: 'medium' })]}>Medium</Text>
        <Text modifiers={[font({ weight: 'semibold' })]}>
          Semibold
        </Text>
        <Text modifiers={[font({ weight: 'bold' })]}>Bold</Text>
        <Text modifiers={[font({ weight: 'heavy' })]}>Heavy</Text>
        <Text modifiers={[font({ weight: 'black' })]}>Black</Text>
      </VStack>
    </Host>
  );
}

Font designs

Use the font modifier to apply different font designs.

import { Host, Text, VStack } from '@expo/ui/swift-ui';
import { font } from '@expo/ui/swift-ui/modifiers';

export default function FontDesignsExample() {
  return (
    <Host style={{ flex: 1 }}>
      <VStack spacing={4}>
        <Text modifiers={[font({ design: 'default', size: 18 })]}>
          Default Design
        </Text>
        <Text modifiers={[font({ design: 'rounded', size: 18 })]}>
          Rounded Design
        </Text>
        <Text modifiers={[font({ design: 'serif', size: 18 })]}>
          Serif Design
        </Text>
        <Text
          modifiers={[font({ design: 'monospaced', size: 18 })]}>
          Monospaced Design
        </Text>
      </VStack>
    </Host>
  );
}

Custom fonts

Use the font modifier with a family parameter to use custom fonts. You can load custom fonts using expo-font library.

import { Host, Text, VStack } from '@expo/ui/swift-ui';
import { font } from '@expo/ui/swift-ui/modifiers';

export default function CustomFontExample() {
  return (
    <Host matchContents style={{ alignSelf: 'center' }}>
      <VStack spacing={4}>
        <Text
          modifiers={[font({ family: 'Inter-Bold', size: 18 })]}>
          Inter Bold
        </Text>
        <Text
          modifiers={[font({ family: 'Inter-Regular', size: 18 })]}>
          Inter Regular
        </Text>
      </VStack>
    </Host>
  );
}

Text with line limit

Use the lineLimit modifier to truncate text after a certain number of lines.

import { Host, Text } from '@expo/ui/swift-ui';
import { lineLimit } from '@expo/ui/swift-ui/modifiers';

export default function LineLimitExample() {
  const longText =
    'This is a very long text that will be truncated after two lines. '.repeat(
      5
    );

  return (
    <Host style={{ flex: 1 }}>
      <Text modifiers={[lineLimit(2)]}>{longText}</Text>
    </Host>
  );
}

Markdown

Use the markdownEnabled property to enable Markdown formatting for the text content.

import { Host, Text, VStack } from '@expo/ui/swift-ui';

export default function MarkdownTextExample() {
  return (
    <Host style={{ flex: 1 }}>
      <VStack spacing={4}>
        <Text markdownEnabled>Regular text.</Text>
        <Text markdownEnabled>
          This is **bold text**, *italic text* and ***text in both
          bold and italic***.
        </Text>
        <Text markdownEnabled>~~Strikethrough text~~</Text>
        <Text markdownEnabled>`This is monospaced text`</Text>
        <Text markdownEnabled>
          Visit the [Expo
          Docs](https://docs.expo.dev/versions/latest/sdk/ui/) to
          learn more about Expo UI
        </Text>
      </VStack>
    </Host>
  );
}

Auto-updating date

Use the date and dateStyle props to display a date that automatically updates as time passes. This is especially useful in widgets and Live Activities.

import { Host, Text } from '@expo/ui/swift-ui';

export default function DateTextExample() {
  return (
    <Host style={{ flex: 1 }}>
      <Text
        date={new Date(Date.now() + 300000)}
        dateStyle="timer"
      />
    </Host>
  );
}

Timer interval

Use timerInterval to display a live countdown or count-up timer. This requires iOS/tvOS 16+.

import { Host, Text } from '@expo/ui/swift-ui';

export default function TimerIntervalExample() {
  return (
    <Host style={{ flex: 1 }}>
      <Text
        timerInterval={{
          lower: new Date(),
          upper: new Date(Date.now() + 600000),
        }}
        countsDown
      />
    </Host>
  );
}

Note: timerInterval, countsDown, and pauseTime require iOS 16.0+ / tvOS 16.0+. On older versions, the timer interval will not render.

API

import { Text } from '@expo/ui/swift-ui';

Component

Text

Type: React.Element<TextProps>

TextProps

children

Optional • Type: ReactNode

Text content or nested Text components.

countsDown

iOS 16+

Optional • Type: boolean • Default: true

Whether the timer counts down (true) or up (false).

date

Optional • Type: Date

A date to display using the specified dateStyle. The text auto-updates as time passes.

dateStyle

Optional • Type: TextDateStyle • Default: 'date'

The style used to format the date prop.

markdownEnabled

Optional • Type: boolean

Enables Markdown formatting for the text content using SwiftUI LocalizedStringKey.

pauseTime

iOS 16+

Optional • Type: Date

A date at which the timer should appear paused.

timerInterval

iOS 16+

Optional • Type: ClosedRangeDate

A time interval to display as a live-updating timer.

Inherited props

Types

TextDateStyle

Literal type: string

The style used to format a date in a SwiftUI Text view.

Acceptable values are: 'timer' | 'relative' | 'offset' | 'date' | 'time'

Modifiers

Use these modifiers in the modifiers prop of the SwiftUI and Universal version.

Modifiers for Text

Modifiers for any view

Sources

The original Expo docs for this page:

  • Text (SwiftUI) (source-of-truth/versions/v57.0.0/sdk/ui/swift-ui/text.md)
  • Text (Universal) (source-of-truth/versions/v57.0.0/sdk/ui/universal/text.md)

On this page