<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:
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
Adding a new slot
If a built-in page should expose a new injection point:- Pick a name (
<resource>.<area>, e.g.,order.timeline) - Add
<Slot name="..." context={{ resource: order, /* ... */ }} />at the call site - Document the slot here — host, intent, context shape
- Open the PR
Reference
<Slot>sourceslot-registry—registerSlot,removeSlot,updateSlot,useSlotEntries- Slots customization page — how to register against a slot

