Use list for navigations

This example demonstrates how to build a navigable list-based interface in the Scripting app. It organizes structured data into expandable sections using DisclosureGroup, and allows users to navigate to detail views using NavigationLink.


Overview

You will learn how to:

  • Use List to display a directory of departments and staff
  • Use DisclosureGroup to group related items under collapsible headers
  • Use NavigationLink to navigate to a detailed view for each item
  • Build reusable view components for clarity and modularity

Data Model

The example defines a nested data structure representing a company, its departments, and the staff within each department.

1type Person = {
2  name: string
3  phoneNumber: string
4}
5
6type Department = {
7  name: string
8  staff: Person[]
9}
10
11type Company = {
12  name: string
13  departments: Department[]
14}

Sample Data

1const companyA: Company = {
2  name: "Company A",
3  departments: [
4    {
5      name: "Sales",
6      staff: [
7        { name: "Juan Chavez", phoneNumber: "(408) 555-4301" },
8        { name: "Mei Chen", phoneNumber: "(919) 555-2481" }
9      ]
10    },
11    {
12      name: "Engineering",
13      staff: [
14        { name: "Bill James", phoneNumber: "(408) 555-4450" },
15        { name: "Anne Johnson", phoneNumber: "(417) 555-9311" }
16      ]
17    }
18  ]
19}

View Components

PersonRowView

A reusable component to display a person's name and phone number in a vertically stacked layout.

1function PersonRowView({ person }: { person: Person }) {
2  return <VStack alignment={"leading"} spacing={3}>
3    <Text font={"headline"} foregroundStyle={"label"}>{person.name}</Text>
4    <HStack spacing={3} font={"subheadline"} foregroundStyle={"secondaryLabel"}>
5      <Label title={person.phoneNumber} systemImage={"phone"} />
6    </HStack>
7  </VStack>
8}

PersonDetailView

Displays detailed information about a selected person.

1function PersonDetailView({ person }: { person: Person }) {
2  return <VStack>
3    <Text font={"title"} foregroundStyle={"label"}>{person.name}</Text>
4    <HStack foregroundStyle={"secondaryLabel"}>
5      <Label title={person.phoneNumber} systemImage={"phone"} />
6    </HStack>
7  </VStack>
8}

Main View Layout

The root view uses a NavigationStack and displays departments grouped in a List. Each DisclosureGroup expands to show staff members. Selecting a person navigates to their detail view.

1function Example() {
2  return <NavigationStack>
3    <List
4      navigationTitle={"Staff Directory"}
5      navigationBarTitleDisplayMode={"inline"}
6    >
7      {companyA.departments.map(department =>
8        <DisclosureGroup title={department.name}>
9          {department.staff.map(person =>
10            <NavigationLink
11              destination={<PersonDetailView person={person} />}
12            >
13              <PersonRowView person={person} />
14            </NavigationLink>
15          )}
16        </DisclosureGroup>
17      )}
18    </List>
19  </NavigationStack>
20}

Launching the View

1async function run() {
2  await Navigation.present({
3    element: <Example />
4  })
5
6  Script.exit()
7}
8
9run()

Key Components

  • List: Displays a vertically scrollable list of items.
  • DisclosureGroup: Organizes content into expandable/collapsible sections.
  • NavigationLink: Enables navigation to another view when tapped.
  • NavigationStack: Provides navigation context for view transitions.

Use Cases

  • Building directory-style interfaces (e.g., org charts, contact lists)
  • Organizing hierarchical data with drill-down navigation
  • Providing a structured browsing experience

This example offers a clean and scalable pattern for navigating through structured lists and accessing detailed information with ease.