Skip to main content
This is the canonical list of slots the dashboard currently exposes. The source of truth is the <Slot name="…"> call sites in the dashboard source (linked under Reference below); each entry here records the host page, the slot name, and the context your component receives. If you need a new injection point in a built-in page, open a PR adding <Slot name="..." context={...} /> and a documentation entry here — that’s the contract for new slots.

Ambient context

Ambient context (permissions, store, user merged into every slot’s props) is planned but not wired up yet — today slot components receive only the slot-specific context listed below. Until it lands, read those values with the hooks instead:
The same applies to an entry’s if predicate: it receives the slot context, but not permissions — gate inside the component for now.

Page header slots

Rendered by <PageHeader> (@spree/dashboard-core/components/page-header.tsx) at the top of every detail and list page that uses the shared chrome.

page.actions

page.actions_dropdown

Detail-page form slots

The resource detail pages each render a slot below their built-in cards. The context key matches the resource name. Host form: on pages marked host form: yes, the slot renders inside the page’s own <form> and the form context is exposed — widgets can bind inputs via useHostForm() that hydrate, dirty-track, and save with the page’s Save button. On pages without one, widgets own their persistence (use useOptionalHostForm() to adapt).

product.form_sidebar

category.form_sidebar

store.form_main

order.form_sidebar

customer.form_sidebar

Page tabs slot

page.tabs (default)

Rendered by <PageTabs> at the right edge of any tabbed sub-nav. Some pages override slotName to scope tabs to a single resource (e.g., slotName="order.tabs"). The catalog will grow these as we wire them up; today only the default page.tabs name is in production use.

Payment method editor slots (dynamic)

Used by <PaymentMethodForm> to let payment-provider plugins replace pieces of the editor sheet. The slot names are computed per provider type (stripe, bogus, …), so registering against the right name is what hooks your editor in.

payment_method.guide.<providerType>

payment_method.form.<providerType>

payment_method.actions.<providerType>

PaymentMethodEditorContext

Helpers for building the slot name:
Use these instead of constructing the string yourself, so a rename in one place doesn’t silently break your registration.

Adding a new slot

If a built-in page should expose a new injection point:
  1. Pick a name (<resource>.<area>, e.g., order.timeline)
  2. Add <Slot name="..." context={{ resource: order, /* ... */ }} /> at the call site
  3. Document the slot here — host, intent, context shape
  4. Open the PR
The slot is not “live” until the docs land — without an entry here, no plugin author knows it exists.

Reference