---
title: "ExpandedSurfacePresentation, DroppyKit"
description: "One live presentation of an expanded surface, as the host records it."
canonical: "https://getdroppy.app/docs/droppykit/api/expanded-surface-presentation"
last-updated: "2026-09-09"
---

# ExpandedSurfacePresentation

One live presentation of an expanded surface, as the host records it.

`struct ExpandedSurfacePresentation`

Constructed by hosts. A droplet receives one back from [`presentExpandedSurface(_:)`](https://getdroppy.app/docs/droppykit/api/droplet-notch-surface-service#present-expanded-surface) and reads others out of [`DropletExpandedShelfState`](https://getdroppy.app/docs/droppykit/api/droplet-expanded-shelf-state).

`id` identifies the presentation, not the surface, and the two are different on purpose. Tearing a takeover down runs after the host's close spring settles, and by then the user may have summoned the same surface again; a teardown keyed on the surface id would then kill the fresh one. The shipping code this aperture replaces carries a hand-rolled `presentationID` for exactly that reason. Capture the presentation you started with and compare before you act on a delayed callback.

## Initializers

### init(id:surfaceID:dropletID:displayID:)

`init(id: UUID = UUID(), surfaceID: ExpandedSurfaceID, dropletID: DropletID, displayID: UInt32)`

Creates a presentation record. Constructed by hosts, read by droplets.

## Properties

### displayID

`let displayID: UInt32`

The display hosting it, resolved by the host.

### dropletID

`let dropletID: DropletID`

The droplet that owns it. Present so a droplet reading [`DropletExpandedShelfState`](https://getdroppy.app/docs/droppykit/api/droplet-expanded-shelf-state) can tell its own takeover from somebody else's, since the shelf is one surface shared by every droplet.

### id

`let id: UUID`

Identity of this presentation.

### surfaceID

`let surfaceID: ExpandedSurfaceID`

The surface being presented.
