---
title: "ShelfWidgetCompositionProviding, DroppyKit"
description: "Adopt to let Droppy own the widget&#x27;s box (DroppyKit 1.23.0)."
canonical: "https://getdroppy.app/docs/droppykit/api/shelf-widget-composition-providing"
last-updated: "2026-09-09"
---

# ShelfWidgetCompositionProviding

Adopt to let Droppy own the widget's box (DroppyKit 1.23.0).

`@MainActor protocol ShelfWidgetCompositionProviding : ShelfWidgetProviding`

The droplet supplies the content of each composition; Droppy pads it by the clearance its clip needs, makes it fill the card, clips it, gives it the mount's font, ink and wash controls (a `Button` with no style of its own is the wash), blocks a second entrance transition and takes no clicks while the shelf springs. None of that can be forgotten, doubled or overridden, because the droplet is never asked for it.

```
extension WorldClockDroplet: ShelfWidgetCompositionProviding {
    public func makeWidgetContent(_ id: ShelfWidgetID, layout: ShelfWidgetLayout) -> AnyView {
        // Its traits declare `header: .standard`: the scaffold's
        // header row wraps beside the camera.
        AnyView(DropletWidgetComposition {
            ShelfWidgetScaffold("World Clock", systemImage: "globe") { clocks }
        } split: {
            ShelfWidgetScaffold("World Clock", systemImage: "globe") { firstClock }
        })
    }
}
```

The protocol's extension implements [`makeWidgetView(_:context:)`](https://getdroppy.app/docs/droppykit/api/shelf-widget-providing#make-widget-view-context) with the same box, so the harness and any host draw the widget the same way. Droppy calls `makeWidgetContent(_:layout:)` itself and ignores a `makeWidgetView` of your own.

Available from DroppyKit 1.23.0; a droplet that adopts it declares `minAPI` 1.23.0.

## Methods

### makeWidgetContent(_:layout:)

`@MainActor func makeWidgetContent(_ id: ShelfWidgetID, layout: ShelfWidgetLayout) -> AnyView`

The widget's content for one mount. Content only: no padding, no root frame, no background, no transition, no hit-testing gate.

### makeWidgetView(_:context:)

`@MainActor func makeWidgetView(_ id: ShelfWidgetID, context: ShelfWidgetContext) -> AnyView`

The content in the host's box, for a host that mounts the classic way (the harness).
