Skip to content

Empty states

EmptyState renders a centered placeholder when lists, repeaters, or standalone schema slots have no items. Reuse the same component in tables (via table empty-state helpers) or drop it directly into a schema when a region has nothing to show yet.

app/orbit/schemas/empty_basic.py
from almasix.orbit.schemas import EmptyState
EmptyState.make()
.heading("No drafts")
.description("Create one when you are ready.")

Basic empty state (light) Basic empty state (dark)

Add a heroicon above the heading to reinforce the empty context:

app/orbit/schemas/empty_icon.py
EmptyState.make()
.heading("No posts yet")
.description("Create your first post to get going.")
.icon("heroicon-o-document-text")

Attach primary / secondary actions under the body — typically a create button:

app/orbit/schemas/empty_actions.py
from almasix.orbit.actions import Action
from almasix.orbit.schemas import EmptyState
EmptyState.make()
.heading("No posts yet")
.description("Create your first post to get going.")
.icon("heroicon-o-document-text")
.actions([
Action.make("create").label("New post").icon("heroicon-o-plus"),
])

Empty state (light) Empty state (dark)

.schema([...]) children render between the description and the actions row — useful for primes or secondary hints:

app/orbit/schemas/empty_nested.py
from almasix.orbit.schemas import EmptyState, Text
EmptyState.make()
.heading("Inbox zero")
.schema([
Text.make().content("You're all caught up.").color("gray"),
])

If you omit .heading(...), the empty state falls back to .label(...) or the string “Nothing here”.

Method Role
.heading Primary title
.description Supporting copy
.icon Heroicon above the heading
.actions Action components under the body
.schema Optional nested body components

See also table-level empty state helpers on Tables overview.