Skip to content

Action blocks ​

Things a person presses or triggers: buttons, toggles, floating buttons, toolbars, and approval and workflow controls.

This page is generated from the block registry, so it lists exactly what the Page Designer accepts. 27 blocks.

BlockWhat it is for
core.action-menuMenu of actions opened from a trigger; fires selected.
core.approval-panelA list of pending approval items with approve/reject actions.
core.approve-buttonButton labelled for approving a record. Pressing it fires clicked; the action to run is bound in the page.
core.buttonA clickable action trigger with a text label — the default control for submitting forms, confirming dialogs, and firing action chains from a Page/Form/Container.
core.button-groupA row of button-shaped choices where picking one fires a single "selected" event carrying that option's value — for a small set of mutually exclusive action-style choices (e.g.
core.cancel-buttonButton labelled for cancelling. Pressing it fires clicked; the action to run is bound in the page.
core.command-buttonButton with an icon and a keyboard shortcut; fires clicked.
core.delete-buttonButton labelled for deleting a record. Pressing it fires clicked; the action to run is bound in the page.
core.dropdown-buttonButton that opens a menu of options; fires selected.
core.email-composerComposer to write and send a email message (to, subject, body) through the communications service; can draft the text with an AI prompt; fires sent.
core.export-buttonButton labelled for exporting data. Pressing it fires clicked; the action to run is bound in the page.
core.fabA single, always-visible primary action rendered as a floating circular (or extended pill) button — typically the one dominant "create new" action on a page or dashboard.
core.file-downloadButton that downloads a file by URL and file name.
core.icon-buttonA compact, icon-only action trigger — a core.button variant with no visible text caption, for toolbar/grid-row actions where space is tight but the action still needs an accessible name.
core.import-buttonButton labelled for importing data. Pressing it fires clicked; the action to run is bound in the page.
core.link-buttonButton styled as a link; fires clicked.
core.print-buttonButton labelled for printing. Pressing it fires clicked; the action to run is bound in the page.
core.quick-action-cardCard that shows shortcuts the person can start from a record, with a title, selected fields and an icon; fires clicked when pressed.
core.quick-actionsA multi-action speed-dial: a single FAB-like trigger icon that, on click, reveals a stack of sub-actions — used where several related "create/import/etc." shortcuts should live behind one control instead of cluttering the page with several FABs.
core.refresh-buttonButton labelled for reloading data. Pressing it fires clicked; the action to run is bound in the page.
core.reject-buttonButton labelled for rejecting a record. Pressing it fires clicked; the action to run is bound in the page.
core.save-buttonButton labelled for saving. Pressing it fires clicked; the action to run is bound in the page.
core.share-buttonButton labelled for sharing. Pressing it fires clicked; the action to run is bound in the page.
core.sms-composerComposer to write and send a text (SMS) message (to, subject, body) through the communications service; can draft the text with an AI prompt; fires sent.
core.split-buttonButton with a main action and a menu of alternatives; fires clicked and selected.
core.submit-buttonButton labelled for submitting a form or record. Pressing it fires clicked; the action to run is bound in the page.
core.whatsapp-composerComposer to write and send a WhatsApp message (to, subject, body) through the communications service; can draft the text with an AI prompt; fires sent.

core.action-menu ​

PropertyTypeSet fromDefault
triggerstringstaticoverflow
labelstringstatic, expressionActions
itemsjsonstatic, expression, binding[{"id":"edit","label":"Edit","icon":"edit"},{"i...

Events: selected

core.approval-panel ​

A list of pending approval items with approve/reject actions.

PropertyTypeSet fromDefault
itemsjsonstatic, expression, binding[{"id":"1","title":"Expense report — July","req...

Events: approved, rejected

json
{ "blockType": "core.approval-panel", "instanceId": "leave-approvals", "blockVersion": "1.0.0", "contractVersion": 1,
  "properties": { "items": {"source":"binding","binding":{"scope":"page","key":"pendingApprovals"}} } }
  • Wire approved/rejected to a callApi/workflow-task-completion action — never treat the widget's own optimistic UI as the real decision record.

core.approve-button ​

PropertyTypeSet fromDefault
labelstringstatic, expression, bindingApprove
hiddenbooleanstatic, expression, bindingfalse

Events: clicked

core.button ​

A clickable action trigger with a text label — the default control for submitting forms, confirming dialogs, and firing action chains from a Page/Form/Container.

PropertyTypeSet fromDefault
labelstringstatic, expression, binding
labelKeystringstatic
iconstringstatic
endIconstringstatic
expandablebooleanstaticfalse
htmlAttributesjsonstatic
highlightedbooleanstatic, expression, binding
variantstringstaticcontained
hiddenbooleanstatic, expression, bindingfalse
cartItemNamestringstatic, expression, binding
cartItemPricestringstatic, expression, binding
cartItemImagestringstatic, expression, binding
cartItemSkustringstatic, expression, binding

Events: clicked, focus, blur

json
{
  "instanceId": "btn-save-employee",
  "blockType": "core.button",
  "blockVersion": "1.0.0",
  "contractVersion": 1,
  "properties": {
    "label": { "source": "static", "value": "Save Employee" },
    "icon": { "source": "static", "value": "save" }
  }
}
  • Use labelKey (not label) for any button text that must be translated.
  • Reserve highlighted for state that genuinely reflects selection/active-ness (e.g. current nav item) — don't use it as a general color override.
  • Prefer core.icon-button instead when there is no visible caption to show.

core.button-group ​

A row of button-shaped choices where picking one fires a single "selected" event carrying that option's value — for a small set of mutually exclusive action-style choices (e.g. a view-mode switcher) that don't need to persist a bound value the way core.toggle-button does.

PropertyTypeSet fromDefault
optionsjsonstatic, expression, binding[{"value":"option-1","labelKey":"core.sampleOpt...

Events: selected

json
{
  "instanceId": "btn-group-employee-status-filter",
  "blockType": "core.button-group",
  "blockVersion": "1.0.0",
  "contractVersion": 1,
  "properties": {
    "options": {
      "source": "static",
      "value": [
        { "value": "active", "labelKey": "hcm.employeeStatus.active" },
        { "value": "on-leave", "labelKey": "hcm.employeeStatus.onLeave" },
        { "value": "terminated", "labelKey": "hcm.employeeStatus.terminated" }
      ]
    }
  }
}
  • Use for short, action-style choice sets (typically 2-5 options); for a long list prefer core.select.
  • Use core.toggle-button instead when the choice must be bound/persisted as a field value.
  • Always author real labelKey entries for production use — the shared sample options are placeholders only.

core.cancel-button ​

PropertyTypeSet fromDefault
labelstringstatic, expression, bindingCancel
hiddenbooleanstatic, expression, bindingfalse

Events: clicked

core.command-button ​

PropertyTypeSet fromDefault
labelstringstatic, expression, binding
iconstringstatic
shortcutstringstatic

Events: clicked

core.delete-button ​

PropertyTypeSet fromDefault
labelstringstatic, expression, bindingDelete
hiddenbooleanstatic, expression, bindingfalse

Events: clicked

core.dropdown-button ​

PropertyTypeSet fromDefault
labelstringstatic, expression, binding
iconstringstatic
optionsjsonstatic, expression, binding[{"value":"option-1","label":"Choice 1"},{"valu...

Events: selected

core.email-composer ​

PropertyTypeSet fromDefault
channelstringstaticEMAIL_SMTP
tostringstatic, expression, bindingsomeone@example.com
subjectstringstatic, expression, bindingQuick update
bodystringstatic, expression, bindingHi,
sendLabelstringstaticSend
aiDraftPromptCodestringstatic
aiDraftResultjsonstatic, expression, binding
aiDraftLoadingbooleanstatic, expression, bindingfalse

Events: sent, aiDraftRequested

core.export-button ​

PropertyTypeSet fromDefault
labelstringstatic, expression, bindingExport
hiddenbooleanstatic, expression, bindingfalse

Events: clicked

core.fab ​

A single, always-visible primary action rendered as a floating circular (or extended pill) button — typically the one dominant "create new" action on a page or dashboard.

PropertyTypeSet fromDefault
iconstringstatic
labelstringstatic, expression
extendedbooleanstaticfalse

Events: clicked

json
{
  "instanceId": "fab-new-employee",
  "blockType": "core.fab",
  "blockVersion": "1.0.0",
  "contractVersion": 1,
  "properties": {
    "icon": { "source": "static", "value": "add" },
    "label": { "source": "static", "value": "New Employee" }
  }
}
  • Use at most one FAB per page/dashboard for the single dominant action — for multiple related actions use core.quick-actions instead.
  • Set extended: true only when there is enough horizontal room and the extra clarity is worth the space.
  • It is valid on dashboard targets as well as page/form/container.

core.file-download ​

PropertyTypeSet fromDefault
labelstringstatic, expression, bindingDownload
fileUrlstringstatic, expression, binding
fileNamestringstatic, expression, binding

Events: clicked

core.icon-button ​

A compact, icon-only action trigger — a core.button variant with no visible text caption, for toolbar/grid-row actions where space is tight but the action still needs an accessible name.

PropertyTypeSet fromDefault
iconstringstatic
labelstringstatic, expression

Events: clicked

json
{
  "instanceId": "icon-btn-delete-row",
  "blockType": "core.icon-button",
  "blockVersion": "1.0.0",
  "contractVersion": 1,
  "properties": {
    "icon": { "source": "static", "value": "delete" },
    "label": { "source": "static", "value": "Delete employee record" }
  }
}
  • Always author a real, descriptive label — it is the button's only accessible name, not a decorative fallback.
  • Use for dense toolbars/grid-row actions where a full core.button label would not fit.
  • Pick an icon name that is unambiguous without accompanying text (e.g. a trash can for delete, not a generic dot).

core.import-button ​

PropertyTypeSet fromDefault
labelstringstatic, expression, bindingImport
hiddenbooleanstatic, expression, bindingfalse

Events: clicked

PropertyTypeSet fromDefault
labelstringstatic, expression, bindingLearn more
hiddenbooleanstatic, expression, bindingfalse

Events: clicked

core.print-button ​

PropertyTypeSet fromDefault
labelstringstatic, expression, bindingPrint
hiddenbooleanstatic, expression, bindingfalse

Events: clicked

core.quick-action-card ​

PropertyTypeSet fromDefault
recordjsonstatic, binding
titlePathstringstatictitle
fieldsjsonstatic[]
itemsjsonstatic, expression, binding[{"primary":"New record","icon":"add"},{"primar...
iconstringstatic, expression, bindingbolt

Events: itemClicked

core.quick-actions ​

A multi-action speed-dial: a single FAB-like trigger icon that, on click, reveals a stack of sub-actions — used where several related "create/import/etc." shortcuts should live behind one control instead of cluttering the page with several FABs.

PropertyTypeSet fromDefault
iconstringstaticadd
actionsjsonstatic, expression, binding[{"id":"new-record","icon":"add","label":"New r...

Events: selected

json
{
  "instanceId": "quick-actions-hr-dashboard",
  "blockType": "core.quick-actions",
  "blockVersion": "1.0.0",
  "contractVersion": 1,
  "properties": {
    "icon": { "source": "static", "value": "add" },
    "actions": {
      "source": "static",
      "value": [
        { "id": "new-employee", "icon": "person_add", "label": "New Employee" },
        { "id": "new-leave-request", "icon": "event_available", "label": "New Leave Request" },
        { "id": "bulk-import", "icon": "upload", "label": "Bulk Import", "roles": ["hr-admin"] }
      ]
    }
  }
}
  • Use when a page needs 2+ related shortcut actions that would otherwise require several separate FABs.
  • Keep roles filtering as a UX convenience only — always enforce the real authorization check server-side/via the actual permission model, never rely on this list alone.
  • Give every action a distinct, recognizable icon since the sub-actions expand in a compact stack.

core.refresh-button ​

PropertyTypeSet fromDefault
labelstringstatic, expression, bindingRefresh
hiddenbooleanstatic, expression, bindingfalse

Events: clicked

core.reject-button ​

PropertyTypeSet fromDefault
labelstringstatic, expression, bindingReject
hiddenbooleanstatic, expression, bindingfalse

Events: clicked

core.save-button ​

PropertyTypeSet fromDefault
labelstringstatic, expression, bindingSave
hiddenbooleanstatic, expression, bindingfalse

Events: clicked

core.share-button ​

PropertyTypeSet fromDefault
labelstringstatic, expression, bindingShare
hiddenbooleanstatic, expression, bindingfalse

Events: clicked

core.sms-composer ​

PropertyTypeSet fromDefault
channelstringstaticSMS_GENERIC
tostringstatic, expression, binding+15551234567
subjectstringstatic, expression, binding
bodystringstatic, expression, bindingOn my way, be there in 10 minutes.
sendLabelstringstaticSend
aiDraftPromptCodestringstatic
aiDraftResultjsonstatic, expression, binding
aiDraftLoadingbooleanstatic, expression, bindingfalse

Events: sent, aiDraftRequested

core.split-button ​

PropertyTypeSet fromDefault
labelstringstatic, expression, binding
optionsjsonstatic, expression, binding[{"value":"option-1","label":"Secondary action ...

Events: clicked, selected

core.submit-button ​

PropertyTypeSet fromDefault
labelstringstatic, expression, bindingSubmit
hiddenbooleanstatic, expression, bindingfalse

Events: clicked

core.whatsapp-composer ​

PropertyTypeSet fromDefault
channelstringstaticWHATSAPP_CLOUD_API
tostringstatic, expression, binding+15551234567
subjectstringstatic, expression, binding
bodystringstatic, expression, bindingHi! Following up on our order.
sendLabelstringstaticSend
aiDraftPromptCodestringstatic
aiDraftResultjsonstatic, expression, binding
aiDraftLoadingbooleanstatic, expression, bindingfalse

Events: sent, aiDraftRequested