---
title: "ExpandedSurfacePresentationRequest, DroppyKit"
description: "A request to take the expanded shelf over with one of your surfaces."
canonical: "https://getdroppy.app/docs/droppykit/api/expanded-surface-presentation-request"
last-updated: "2026-09-09"
---

# ExpandedSurfacePresentationRequest

A request to take the expanded shelf over with one of your surfaces.

`struct ExpandedSurfacePresentationRequest`

## Initializers

### init(surfaceID:displayID:opensShelf:autoCollapseGrace:triggersHaptic:)

`init(surfaceID: ExpandedSurfaceID, displayID: UInt32? = nil, opensShelf: Bool = true, autoCollapseGrace: TimeInterval? = nil, triggersHaptic: Bool = true)`

Creates a request.

## Properties

### autoCollapseGrace

`let autoCollapseGrace: TimeInterval?`

How long the host holds the shelf open against its own auto-collapse timer, in seconds. `nil` uses the host's standard grace period, and it is ignored entirely by a descriptor that suppresses [`autoCollapse`](https://getdroppy.app/docs/droppykit/api/expanded-surface-host-suppression#auto-collapse).

### displayID

`let displayID: UInt32?`

Which display to present on. `nil` lets the host choose, which is almost always what you want: it resolves the same display its own surfaces would open on, following the pointer.

### opensShelf

`let opensShelf: Bool`

Whether the host should open its shelf if it is currently closed.

`true` is the takeover shape: the user pressed a shortcut and expects something to appear. `false` is for a surface that only makes sense inside a shelf the user already opened, and makes the call a no-op rather than a summons when the shelf is closed.

### surfaceID

`let surfaceID: ExpandedSurfaceID`

The surface to present. Must be an id the droplet publishes through [`expandedSurfaces`](https://getdroppy.app/docs/droppykit/api/expanded-surface-providing#expanded-surfaces); the host refuses ids it does not recognize.

### triggersHaptic

`let triggersHaptic: Bool`

True when the presentation should fire the host's standard open haptic.
