Plugins
Settings Overlay

Configuration

Every option the plugin takes, in one place.

Plugin options

settingsOverlay({
  overlays: [...],
  defaults: { layout: 'compact', searchable: false },
  disabled: process.env.NODE_ENV === 'test',
  translations: { de: { 'settingsOverlay:close': 'Zu' } },
})
OptionTypeDefaultWhat it does
overlaysSettingsOverlayConfig[]requiredThe panels.
defaultsPick<SettingsOverlayConfig, 'addressable' | 'components' | 'hideEntities' | 'history' | 'layout' | 'mergeListHeader' | 'searchable'>{}Applied under each overlay's own settings. components merges per slot.
disabledbooleanfalseReturns the incoming config untouched.
lazyTransport'widget' | 'server-function''widget'How a view or lazy item reaches the server. See Lazy items.
translationsTranslationsOptionPer-locale string overrides. See i18n.

Overlay

OptionTypeDefaultWhat it does
idstringrequiredUnique. Appears in the URL and in the CSS class.
labelLocalizedLabelrequiredThe rail's heading.
itemsSettingsOverlayItem[]requiredThe rows. See Items.
iconPayloadComponentDrawn beside the rail heading.
access({ overlay, req }) => booleanopenThe door to the whole panel. See Access.
addressablebooleantrueWhether the panel is reachable by URL.
history'push' | 'replace''push''push' makes every navigation in the panel a history entry, closing included, so the back button walks it like pages. 'replace' adds none, and the back button leaves the page. No effect when addressable is false. See Link to it.
layout'compact' | 'wide''compact'Width preset.
searchablebooleanfalseAdds a search box that filters the rail.
hideEntitiesbooleanfalseSets admin.hidden on every collection and global the overlay lists, removing it from the nav and from its own route. Off by default because drawer mode leaves things out. Overlays listing the same entity must agree on this.
mergeListHeaderbooleantrueFolds a collection list's title row into the pane header and lifts its Create button up beside Close. false leaves Payload's list header as it renders on a page.
classNamestringExtra class beside settings-overlay and settings-overlay--<id>.
componentsSettingsOverlayComponentsSlot replacements. See Customization.
sortSettingsSortConfigGroup and item ordering functions.

A wide panel: a search box above a grouped rail with Workspace, Data and Help sections, and Payload's own list header for the Secrets collection kept inside the pane

That one is layout: 'wide' with searchable: true and mergeListHeader: false, so Payload's list header stays where it renders on a page.

Item

Shared by every type:

OptionTypeWhat it does
slugstringUnique within the overlay. Appears in the URL.
labelLocalizedLabelRequired for component, view and link; inherited from the entity otherwise.
groupLocalizedLabelRail heading. Overrides the entity's own admin.group.
iconPayloadComponentDrawn in the row.
ordernumberSugar for the common ordering case.
keywordsstring[]Extra terms the search box matches.
badgeBadgeConfigA count or value beside the label.
access({ item, req }) => booleanThe door to this row.

Per type:

TypeExtra
collectionslug: CollectionSlug, resolveDocID?
globalslug: GlobalSlug
componentcomponent: PayloadComponent, lazy?: boolean
viewviewKey: string
linkhref, a template-literal type pinned to a leading slash

Plugin order

settingsOverlay goes after anything that registers an admin view you list as a view item, and after anything that rewrites a collection you list, such as @payloadcms/plugin-multi-tenant. A viewKey that is not registered when this plugin runs is a boot error naming the overlay, the item and the key.

URL parameters

ParameterHolds
settings<overlay>/<item>[/<id>]
settingsQueryThe open list's filters, search, sort, page and limit, as JSON

The list query travels as one opaque value rather than as Payload's where[...] names, so it cannot collide with a list view on the page underneath. A half-built filter row is kept in memory but never written to the URL, so a reload does not drop the finished rows beside it.

Installation surface

The plugin registers, on your config:

  • admin.components.providers: one entry
  • admin.dependencies: one entry per component path it needs to resolve, including the ones inside your overlays
  • admin.dashboard.widgets: one internal entry, and only when the config holds a view item or a lazy component and lazyTransport is left at 'widget'. It appears in the dashboard's "Add widget" drawer while a reader is editing their dashboard.
  • admin.components.edit.beforeDocumentControls on each listed collection (the form-modified reporter and the document actions) and admin.components.elements.beforeDocumentControls on each listed global (the reporter alone)
  • admin.hidden: true on each listed collection and global, only under hideEntities
  • config.custom, under @10x-media/settings-overlay
  • i18n.translations

Nothing in app/(payload)/layout.tsx changes, unless you choose lazyTransport: 'server-function'.

On this page