---
title: "ShelfWidgetEmptyState, DroppyKit"
description: "What a widget shows when it has nothing to show yet (DroppyKit 1.23.0): a symbol, a title and a line, centred, and its one action."
canonical: "https://getdroppy.app/docs/droppykit/api/shelf-widget-empty-state"
last-updated: "2026-09-09"
---

# ShelfWidgetEmptyState

What a widget shows when it has nothing to show yet (DroppyKit 1.23.0): a symbol, a title and a line, centred, and its one action.

`@MainActor struct ShelfWidgetEmptyState`

What a widget shows when it has nothing to show yet (DroppyKit 1.23.0): a symbol, a title and a line, centred, and its one action. In a row the action sits on the row's bottom line, beside its neighbours' last rows.

Droppy draws its own "not running" slot with it.

Available from DroppyKit 1.23.0.

## Initializers

### init(_:systemImage:message:action:dso:)

`@MainActor init(_ title: String, systemImage: String, message: String? = nil, action: Action? = nil, dso: UnsafeRawPointer = #dsohandle)`

Creates the empty state. The title and the message are looked up in your droplet's own String Catalog first, then Droppy's.

### init(_:systemImage:tone:dso:handler:)

`init(_ title: String, systemImage: String? = nil, tone: DroppyWashTone = .neutral, dso: UnsafeRawPointer = #dsohandle, handler: @escaping () -> Void)`

Creates the action. The title is looked up in your droplet's own String Catalog first, then Droppy's.

## Properties

### body

`@MainActor var body: some View { get }`

### handler

`let handler: () -> Void`

### systemImage

`let systemImage: String?`

### title

`let title: String`

### tone

`let tone: DroppyWashTone`
