ObjectStackObjectStack

Action components — component reference

The action:* components that put an action on a page: a button, an icon, a group or a menu.

The action:* components put an action on a page as a button, an icon button, a group of buttons or a menu.

This page is generated from the repo-root sdui.manifest.json, the component manifest CI regenerates from the renderer registry. Regenerate it with node scripts/gen-sdui-reference.mjs; node scripts/gen-sdui-reference.mjs --check fails when it is stale.

action:button

Namespace action.

InputTypeRequiredDescription
namestring—
labelstring—
iconstring—
actionTypeenum: script, url, modal, flow, api—
targetstring—
variantenum: default, primary, secondary, danger, outline, ghost—
sizeenum: default, sm, md, lg, iconButton size: the Button primitive's default, sm, lg or icon, plus md, which renders as default (default: default)
classNamestring—
visibleboolean | string | objectVisibility predicate: true/false, a bare CEL expression, or the { dialect: 'cel', source } envelope, evaluated against the row the host binds; the button is not rendered when it is false, nor when the predicate fails to evaluate. Omit for always-visible
disabledboolean | string | objectDisabled predicate, in the same three shapes as visible: the button is shown but cannot be pressed while it holds. Omit for never-disabled
paramsarrayThe parameters to collect from the user before the action runs (ActionParam objects: name, type, label, …); each collected value reaches the executor under its parameter name. Static execution values ride properties.params instead
descriptionstringAction description — the parameter dialog shows it under its title
openInenum: self, new-tabFor a url action: self navigates in place, new-tab opens a new browser tab
methodstringHTTP method of an api action (POST when omitted)
bodyExtraobjectStatic request-body fields of an api action, merged last, so a constant here overrides a collected value of the same name
bodyShapeenum | object: flatHow an api action shapes its request body: flat (the default) or { wrap: KEY } to nest the collected values under that key, with bodyExtra beside it
operationenum: updateupdate declares a single-record field write: the row runs the declared action its name names, so it needs a name. The runner posts the collected values to the platform action route under that name, and the route writes that action's own patch
confirmTextstringConfirmation question asked before the action runs; the action runs only if it is confirmed
successMessagestringToast text when the action succeeds; a ${result.*} token reads the handler's answer (e.g. ${result.id})
errorMessagestringToast text when the action fails, in place of the raw error
refreshAfterbooleanRefresh the surrounding data after the action succeeds
locationsarray of stringThe placements the action declares (list_toolbar, list_item, record_header, …). A script or flow action declared record-scoped (list_item, record_header, record_more or record_section) refuses to run when no record or single selection is in scope, instead of running without one
toastobjectToast behaviour: { showOnSuccess?, showOnError?, duration? } — false suppresses that toast, duration is handed to the toast
resultDialogobjectOne-shot result dialog for a value the response shows exactly once (a 2FA code, a fresh secret); it replaces the success toast
onSuccessobjectPost-success navigation { navigate, openIn? }: navigate is a route template that can read ${result.*}, openIn is self (the default) or newTab
objectNamestringObject the action acts on — dispatch goes to this object instead of the page's. Omit to act on the page's object
recordIdFieldstringFor a script action run against a single selected row: the row field whose value is sent as the record id (default id)
undoablebooleanOffer an Undo affordance after an update action: once an operation: update succeeds, its success toast offers Undo, which writes back the values the fields it wrote held on the record in scope (the record page's record, or the row the host binds), provided that record carries each of them. The one limit: a button with no record in scope (standalone, or writing a record other than the one in scope) offers no Undo, because there is no row to restore

action:group

Namespace action.

InputTypeRequiredDescription
labelstring—
iconstring—
actionsarray of objectThe actions in this group, in order. Each member is an action object the group draws and runs itself (name, label, icon, type, target, locations, visible, disabled, …); a member's executor is its own type
displayenum: inline, dropdown—
locationenum: list_toolbar, list_item, record_header, record_more, record_related, record_sectionRender only the members whose locations include this location. Omit to render every member
variantenum: default, secondary, outline, ghost—
sizeenum: default, sm, lg, iconButton size for the dropdown trigger and for every inline member that sets none
visibleboolean | string | objectVisibility predicate for the whole group: true/false, a bare CEL expression, or the { dialect: 'cel', source } envelope, evaluated against the row the host binds. Omit for always-visible
classNamestring—

action:icon

Namespace action.

InputTypeRequiredDescription
namestring—
labelstring—
iconstring—
actionTypeenum: script, url, modal, flow, api—
targetstring—
variantenum: default, secondary, danger, outline, ghost—
classNamestring—
visibleboolean | string | objectVisibility predicate: true/false, a bare CEL expression, or the { dialect: 'cel', source } envelope, evaluated against the row the host binds; the icon is not rendered when it is false. Omit for always-visible
disabledboolean | string | objectDisabled predicate, in the same three shapes as visible: the icon is shown but cannot be pressed while it holds. Omit for never-disabled
paramsarrayThe parameters to collect from the user before the action runs (ActionParam objects: name, type, label, …); each collected value reaches the executor under its parameter name. Static execution values ride properties.params instead
descriptionstringAction description — the tooltip text when there is no label, and what the parameter dialog shows under its title
openInenum: self, new-tabFor a url action: self navigates in place, new-tab opens a new browser tab
methodstringHTTP method of an api action (POST when omitted)
bodyExtraobjectStatic request-body fields of an api action, merged last, so a constant here overrides a collected value of the same name
bodyShapeenum | object: flatHow an api action shapes its request body: flat (the default) or { wrap: KEY } to nest the collected values under that key, with bodyExtra beside it
operationenum: updateupdate declares a single-record field write: the row runs the declared action its name names, so it needs a name. The runner posts the collected values to the platform action route under that name, and the route writes that action's own patch
confirmTextstringConfirmation question asked before the action runs; the action runs only if it is confirmed
successMessagestringToast text when the action succeeds; a ${result.*} token reads the handler's answer (e.g. ${result.id})
errorMessagestringToast text when the action fails, in place of the raw error
refreshAfterbooleanRefresh the surrounding data after the action succeeds
locationsarray of stringThe placements the action declares (list_toolbar, list_item, record_header, …). A script or flow action declared record-scoped (list_item, record_header, record_more or record_section) refuses to run when no record or single selection is in scope, instead of running without one
toastobjectToast behaviour: { showOnSuccess?, showOnError?, duration? } — false suppresses that toast, duration is handed to the toast
resultDialogobjectOne-shot result dialog for a value the response shows exactly once (a 2FA code, a fresh secret); it replaces the success toast
onSuccessobjectPost-success navigation { navigate, openIn? }: navigate is a route template that can read ${result.*}, openIn is self (the default) or newTab
objectNamestringObject the action acts on — dispatch goes to this object instead of the page's. Omit to act on the page's object

action:menu

Namespace action.

InputTypeRequiredDescription
labelstring—
iconstring—
actionsarray of objectThe menu's actions, in order. Each member is an action object the menu draws and runs itself (name, label, icon, type, target, visible, disabled, tags, …); a member's executor is its own type
variantenum: default, secondary, outline, ghost—
sizeenum: default, sm, lg, iconTrigger button size (renderer default: icon)
visibleboolean | string | objectVisibility predicate for the whole menu: true/false, a bare CEL expression, or the { dialect: 'cel', source } envelope, evaluated against the row the host binds; a predicate that fails to evaluate hides it. Omit for always-visible
classNamestring—

On this page