Admin contribution zones
Zone ids are a CLOSED, platform-owned enum and a public contract (ADR 0026 §8): breaking a zone's context shape means a new id, never mutation. An extension declares WHICH zone a panel mounts in (ui.panels[].zone), never its position — the platform owns arrangement. when is a closed predicate vocabulary (orderStatusIn, requiresShipping, testOnly) evaluated before the panel's code loads.
| zone | kind | status | context passed |
|---|---|---|---|
settings.payments | list | active | none — the platform renders the whole card from the manifest |
settings.cargo | list | active | none — the platform renders the whole card from the manifest |
order.detail.ship | panel | active | { order: OrderView, store: StoreCtx, onDone, onChanged } |
order.detail.panel | panel | active | { order: OrderView, store: StoreCtx, onChanged } |
extension.settings.action | action | active | { store: StoreCtx, extension: InstalledView, close, refresh } |
product.detail.panel | panel | reserved | { product, store } (reserved) |
dashboard.widget | panel | reserved | { store } (reserved) |
returns.detail.panel | panel | reserved | { return, order, store } (reserved) |
Kind-derived list zones render every installed extension of the provider kind as a platform card (description, secrets, the auto-generated config form, actions, enable) — most extensions ship zero UI code. panel zones mount an extension's compiled panel (runtime:platform at E1; server-driven component trees for sandboxed extensions at P1+). action = a modal opened from the extension's settings card (ui.actions[], with doneWhen.configSet for a "done" badge).