Appearance
Layout and navigation blocks
Arrange other blocks and move between screens: containers, tabs, dialogs, menus, breadcrumbs, and the sign-in building blocks.
This page is generated from the block registry, so it lists exactly what the Page Designer accepts. 41 blocks.
| Block | What it is for |
|---|---|
core.accordion | A single-expand collapsible panel group. |
core.advanced-search | Search box with facets; fires select for the chosen result. |
core.anchor-nav | Links that scroll to sections of the same page; fires clicked. |
core.auto-layout | Flex layout with direction, gap, wrap, alignment and justification. |
core.bottom-nav | A mobile-only app footer — a single evenly-spaced icon+label row, for primary mobile app navigation (Home/Search/Create/Profile-style tab bars). |
core.breadcrumb | A static, author-supplied breadcrumb trail. |
core.command-menu | Searchable command palette; fires selected and dismissed. |
core.container | A generic composition surface for grouping and structuring content. |
core.dialog | An overlay composition surface — modal or drawer — that shows or hides its content slot based on a bindable open property, and reports its own dismissal back to the page. |
core.divider | A simple visual separator line between content, horizontal or vertical. |
core.favorites-list | Shows the current user's real, durably-persisted favorited pages, with an optional toggle for the current page. |
core.global-search | The platform's cross-artifact search — one search box that finds Pages/Forms/Widgets/etc. |
core.language-switcher | Control for changing the display language; fires changed. |
core.line | A generic positionable line primitive (horizontal, vertical, or diagonal) for freeform layout on a Page, Block canvas, or Report band — distinct from core.divider's fixed full-width horizontal rule. |
core.masonry-grid | Layout that places children in columns of uneven height. |
core.master-detail | Master list on one side and the selected record's detail on the other; fires recordSelected. |
core.mega-menu | Menu that opens a wide panel of grouped links from a trigger; fires selected. |
core.menu | A simple flat list of selectable menu items (id/label/icon/disabled) — a lightweight menu control, distinct from core.sidebar's hierarchical, expandable tree. |
core.menu-breadcrumb | Derives a real breadcrumb trail from a published Menu's own hierarchy + the current page's route. |
core.menu-nav | Renders a published @erp/menu-engine Menu artifact as real runtime side navigation — the "wire a Menu Designer artifact into a live page" bridge, added 2026-07-25 (Navigation Designer Phase). |
core.mobile-nav | Renders a published @erp/mobile-nav-engine Mobile Nav artifact as real bottom-tab or drawer navigation — added 2026-07-27 (Navigation Designer Phase 3). |
core.pagination | A standalone page-number control, for pairing with a custom list/grid that doesn't have its own built-in pagination. |
core.popup | Popup surface that opens and closes by open, with placement and optional dismissal; fires dismissed. |
core.recent-pages | Shows the current user's recently-visited pages, most-recent-first. |
core.recent-searches | Lists the last searches the person ran; fires select. |
core.repeater | Repeats its child blocks once per item of a data source. |
core.resizable-panel | Panel the person can resize by dragging, within minimum and maximum sizes. |
core.saved-search | Saves the current query and filters under a name and lists saved searches; fires apply and saved. |
core.scroll-container | Constrains its children to a fixed height/width with scrolling. |
core.shape | A generic freeform shape primitive (rectangle or ellipse) for decorative/structural use on a Page, Block canvas, or Report band — distinct from core.divider's fixed full-width horizontal rule. |
core.sidebar | A hierarchical, expandable navigation tree — an author-authored, static-items alternative to core.menu-nav's published-Menu-backed sidebar, following core.tree-view's own expand/select convention applied to navigation. |
core.sitemap | List of site links grouped by section; fires clicked. |
core.spacer | A fixed-size empty spacing block, for deliberate gaps a layout's own row/column gutter doesn't provide. |
core.split-pane | A two-pane (master/detail-style) resizable layout. |
core.stepper | A multi-step wizard progress indicator. |
core.tabs | A multi-panel tab composition surface. |
core.toolbar | A composition surface for a row of action controls (buttons, filters) with an optional title — the same children slot idiom as core.container. |
core.tree-nav | Nested navigation tree; fires navigate. |
core.wizard | Multi-step container that shows one step at a time; fires changed and completed. |
core.workspace-nav | Renders the contextual side-navigation for a Workspace artifact (a curated launcher/context grouping). |
core.workspace-switcher | Lets a user pick which Workspace to enter. |
core.accordion
A single-expand collapsible panel group. Each panel is a core.container instance placed in the panels slot — the same panel-reuse idiom core.tabs uses for its own slot.
| Property | Type | Set from | Default |
|---|---|---|---|
expandedIndex | number | static | -1 |
Events: changed
json
{
"contractVersion": 1,
"instanceId": "faq-accordion",
"blockType": "core.accordion",
"blockVersion": "1.0.0",
"properties": {
"expandedIndex": { "source": "static", "value": -1 }
},
"children": {
"panels": [
{
"contractVersion": 1,
"instanceId": "faq-panel-billing",
"blockType": "core.container",
"blockVersion": "1.0.0",
"properties": { "title": { "source": "static", "value": "Billing" } },
"children": { "children": [] }
},
{
"contractVersion": 1,
"instanceId": "faq-panel-shipping",
"blockType": "core.container",
"blockVersion": "1.0.0",
"properties": { "title": { "source": "static", "value": "Shipping" } },
"children": { "children": [] }
}
]
}
}- Set
expandedIndex: -1for a fully-collapsed default; use0(or another - Author each panel as a titled
core.container— do not build a custom - Do not rely on this block for a multi-expand ("all panels can stay open at
core.advanced-search
| Property | Type | Set from | Default |
|---|---|---|---|
placeholder | string | static, expression | Search... |
facets | json | static | [] |
limit | number | static | 20 |
Events: select
core.anchor-nav
| Property | Type | Set from | Default |
|---|---|---|---|
items | json | static, expression, binding | [{"label":"Overview","targetId":"overview"},{"l... |
orientation | string | static | vertical |
Events: clicked
core.auto-layout
| Property | Type | Set from | Default |
|---|---|---|---|
direction | string | static | column |
gap | number | static | 8 |
wrap | boolean | static | false |
align | string | static | stretch |
justify | string | static | flex-start |
core.bottom-nav
A mobile-only app footer — a single evenly-spaced icon+label row, for primary mobile app navigation (Home/Search/Create/Profile-style tab bars).
| Property | Type | Set from | Default |
|---|---|---|---|
items | json | static, expression, binding | [{"label":"Home","icon":"home","color":"#4F46E5... |
primaryPath | string | static | label |
iconPath | string | static | icon |
colorPath | string | static | color |
variantPath | string | static | variant |
Events: selected
json
{
"instanceId": "bottomnav-mobile-home",
"blockType": "core.bottom-nav",
"blockVersion": "1.0.0",
"contractVersion": 1,
"properties": {
"items": {
"source": "static",
"value": [
{ "label": "Home", "icon": "home", "color": "#4F46E5" },
{ "label": "Tasks", "icon": "checklist", "color": "#0EA5E9" },
{ "label": "Add", "icon": "plus", "color": "#16A34A", "variant": "fab" },
{ "label": "Alerts", "icon": "bell", "color": "#F59E0B" },
{ "label": "Profile", "icon": "person", "color": "#7C3AED" }
]
}
}
}- Reserve at most one
variant: "fab"item per bar for a single primary create action. - Only place on
pagetargets (itsdesigner.allowedTargetsis["page"]) — not valid inside forms, containers, or dashboards. - Prefer
core.mobile-navover authoringcore.bottom-navdirectly when the tab set should be centrally managed as a published Mobile Nav artifact.
core.breadcrumb
A static, author-supplied breadcrumb trail.
| Property | Type | Set from | Default |
|---|---|---|---|
items | json | static, expression, binding | [{"label":"Home","href":"#"},{"label":"Section"... |
Events: clicked
json
{ "blockType": "core.breadcrumb", "instanceId": "bc-1", "blockVersion": "1.0.0", "contractVersion": 1,
"properties": { "items": { "source": "static", "value": [{"label":"HCM","href":"/app/hcm"},{"label":"Employees"}] } } }- Use
core.menu-breadcrumbinstead if the trail should follow the real Menu hierarchy automatically.
core.command-menu
| Property | Type | Set from | Default |
|---|---|---|---|
open | boolean | static, binding | false |
items | json | static, expression, binding | [{"id":"home","label":"Go to Home"},{"id":"sett... |
placeholder | string | static | Type a command or search... |
Events: selected, dismissed
Outputs: open (boolean)
core.container
A generic composition surface for grouping and structuring content. Used both as a plain layout wrapper and — via its variant property — as a "Section" or "Card" visual style, avoiding the need for separate core.section/ core.card block types.
| Property | Type | Set from | Default |
|---|---|---|---|
hidden | boolean | static, expression, binding | false |
variant | string | static | plain |
title | string | static, expression, binding | |
titleKey | string | static | |
icon | string | static, expression, binding | |
collapsible | boolean | static | false |
htmlAttributes | json | static |
Events: mounted
json
{
"contractVersion": 1,
"instanceId": "employee-name-group",
"blockType": "core.container",
"blockVersion": "1.0.0",
"properties": {
"variant": { "source": "static", "value": "plain" }
},
"children": {
"children": []
}
}- Prefer
variant: "section"/"card"over composing your own divider + - Use
collapsible: trueonly where the animated open/close is actually - When authoring a
core.tabs/core.accordionpanel, set the container's
core.dialog
An overlay composition surface — modal or drawer — that shows or hides its content slot based on a bindable open property, and reports its own dismissal back to the page.
| Property | Type | Set from | Default |
|---|---|---|---|
open | boolean | static, binding | false |
titleKey | string | static | |
overlayKind | string | static | modal |
dismissible | boolean | static | true |
fullscreen | boolean | static | false |
Events: dismissed
Outputs: open (boolean)
json
{
"contractVersion": 1,
"instanceId": "confirm-delete-dialog",
"blockType": "core.dialog",
"blockVersion": "1.0.0",
"properties": {
"titleKey": { "source": "static", "value": "Confirm Delete" },
"overlayKind": { "source": "static", "value": "modal" },
"dismissible": { "source": "static", "value": true },
"open": { "source": "binding", "binding": { "scope": "page", "key": "deleteDialogOpen" } }
},
"children": { "content": [] }
}- Bind
opento a page-scope key rather than a static literal — a static - Use
overlayKind: "drawer"for wizard/step flows andmodalfor - Set
dismissible: falseonly when you provide an explicit in-content close
core.divider
A simple visual separator line between content, horizontal or vertical.
| Property | Type | Set from | Default |
|---|---|---|---|
orientation | string | static | horizontal |
json
{
"contractVersion": 1,
"instanceId": "section-divider-1",
"blockType": "core.divider",
"blockVersion": "1.0.0",
"properties": {
"orientation": { "source": "static", "value": "horizontal" }
}
}- Use
orientation: "vertical"only inside a flex-row/horizontal layout - Prefer a divider over ad-hoc border styling on an adjacent block — it
core.favorites-list
Shows the current user's real, durably-persisted favorited pages, with an optional toggle for the current page.
| Property | Type | Set from | Default |
|---|---|---|---|
currentRoute | string | static, expression, binding | |
currentLabel | string | static, expression, binding |
Events: select
json
{ "blockType": "core.favorites-list", "instanceId": "fav-1", "blockVersion": "1.0.0", "contractVersion": 1,
"properties": {
"currentRoute": { "source": "expression", "expression": "${page.route}" },
"currentLabel": { "source": "static", "value": "Employee Directory" }
} }- Bind
currentRoute/currentLabelso the toggle row is meaningful; omit both for a read-only favorites list.
core.global-search
The platform's cross-artifact search — one search box that finds Pages/Forms/Widgets/etc. by name.
| Property | Type | Set from | Default |
|---|---|---|---|
placeholder | string | static, expression | Search... |
limit | number | static | 20 |
Events: select
json
{ "blockType": "core.global-search", "instanceId": "search-1", "blockVersion": "1.0.0", "contractVersion": 1,
"properties": { "placeholder": { "source": "static", "value": "Search employees, forms, pages..." }, "limit": { "source": "static", "value": 20 } } }- Wire
selectto anavigateaction reading${event.route}whenartifactType === "page".
core.language-switcher
No properties.
Events: changed
core.line
A generic positionable line primitive (horizontal, vertical, or diagonal) for freeform layout on a Page, Block canvas, or Report band — distinct from core.divider's fixed full-width horizontal rule.
| Property | Type | Set from | Default |
|---|---|---|---|
orientation | string | static | horizontal |
stroke | string | static, expression | #9e9e9e |
strokeWidth | number | static | 1 |
strokeStyle | string | static | solid |
json
{
"instanceId": "line-section-separator",
"blockType": "core.line",
"blockVersion": "1.0.0",
"contractVersion": 1,
"properties": {
"orientation": { "source": "static", "value": "horizontal" },
"strokeStyle": { "source": "static", "value": "dashed" }
}
}- Use for freeform decorative/structural lines; for a standard full-width section rule prefer
core.divider. - Use
diagonalsparingly — it is intended for canvas-style layouts (e.g. connectors), not standard row/column content. - Valid on
reporttargets (Report Designer bands) as well aspage/form/container/dashboard.
core.masonry-grid
| Property | Type | Set from | Default |
|---|---|---|---|
columns | number | static | 3 |
gap | number | static | 16 |
core.master-detail
| Property | Type | Set from | Default |
|---|---|---|---|
dataSource | json | static, expression, binding | [{"id":1,"name":"Acme Corp","status":"Active"},... |
masterLabelPath | string | static | name |
masterSecondaryPath | string | static | status |
Events: recordSelected
core.mega-menu
| Property | Type | Set from | Default |
|---|---|---|---|
triggerLabel | string | static, expression, binding | Menu |
columns | json | static, expression, binding | [{"heading":"Products","items":[{"id":"p1","lab... |
Events: selected
core.menu
A simple flat list of selectable menu items (id/label/icon/disabled) — a lightweight menu control, distinct from core.sidebar's hierarchical, expandable tree.
| Property | Type | Set from | Default |
|---|---|---|---|
items | json | static, expression, binding | [{"id":"1","label":"Dashboard","icon":"dashboar... |
Events: selected
json
{
"instanceId": "menu-context-actions",
"blockType": "core.menu",
"blockVersion": "1.0.0",
"contractVersion": 1,
"properties": {
"items": {
"source": "static",
"value": [
{ "id": "edit", "label": "Edit" },
{ "id": "duplicate", "label": "Duplicate" },
{ "id": "delete", "label": "Delete", "disabled": false }
]
}
}
}- Use
core.menufor a flat action/choice list; usecore.sidebarwhen items need parent/child hierarchy. - Always give each item a stable
id—selected's payload carries only theid, not the item object. - Set
disabled: trueon items that shouldn't be selectable rather than omitting them, if the item should remain visible.
core.menu-breadcrumb
Derives a real breadcrumb trail from a published Menu's own hierarchy + the current page's route.
| Property | Type | Set from | Default |
|---|---|---|---|
menuName | string | static, expression, binding | |
currentRoute | string | static, expression, binding |
Events: clicked
json
{ "blockType": "core.menu-breadcrumb", "instanceId": "mbc-1", "blockVersion": "1.0.0", "contractVersion": 1,
"properties": {
"menuName": { "source": "static", "value": "hcm-main-menu" },
"currentRoute": { "source": "expression", "expression": "${page.route}" }
} }- Bind
currentRouteto${page.route}, not a hardcoded value.
core.menu-nav
Renders a published @erp/menu-engine Menu artifact as real runtime side navigation — the "wire a Menu Designer artifact into a live page" bridge, added 2026-07-25 (Navigation Designer Phase).
| Property | Type | Set from | Default |
|---|---|---|---|
menuName | string | static, expression, binding | |
collapsed | boolean | static, binding | false |
displayMode | string | static, binding | list |
Events: select
json
{
"instanceId": "menunav-primary-side-nav",
"blockType": "core.menu-nav",
"blockVersion": "1.0.0",
"contractVersion": 1,
"properties": {
"menuName": { "source": "static", "value": "hcm-main-menu" }
}
}- Bind
menuNameto a fixed artifact name per page, not a frequently-changing expression — each change re-triggers a full fetch. - Wire
select's payload fields (route/targetPage/openMode/externalUrl) directly into anavigateaction rather than re-deriving them. - Supply
getMyRoles/getMyOrgUnits/getMenuAccessin production wiring whenever the published Menu actually usessecurity.roles/org-scope/Permission Designer grants — omitting them silently fails open (every row shows).
core.mobile-nav
Renders a published @erp/mobile-nav-engine Mobile Nav artifact as real bottom-tab or drawer navigation — added 2026-07-27 (Navigation Designer Phase 3).
| Property | Type | Set from | Default |
|---|---|---|---|
mobileNavName | string | static, expression, binding | |
renderAs | string | static | bottom-tabs |
Events: select
json
{
"instanceId": "mobilenav-bottom-tabs",
"blockType": "core.mobile-nav",
"blockVersion": "1.0.0",
"contractVersion": 1,
"properties": {
"mobileNavName": { "source": "static", "value": "field-service-mobile-nav" },
"renderAs": { "source": "static", "value": "bottom-tabs" }
}
}- Place exactly one
bottom-tabsand, if needed, one separatedrawerinstance against the samemobileNavNamefor a hybrid pattern — never expect one instance to render both. - Restrict its
allowedTargetsawareness: this block is only valid onpagetargets, matching its mobile-app-shell role. - Use
MobileNavItem.surfacesto scope items intentionally rather than authoring two near-duplicate Mobile Nav artifacts.
core.pagination
A standalone page-number control, for pairing with a custom list/grid that doesn't have its own built-in pagination.
| Property | Type | Set from | Default |
|---|---|---|---|
page | number | static, binding | 1 |
pageCount | number | static, expression, binding | 1 |
Events: changed
Outputs: page (number)
json
{ "blockType": "core.pagination", "instanceId": "pg-1", "blockVersion": "1.0.0", "contractVersion": 1,
"properties": { "page": { "source": "binding", "binding": { "scope": "page", "key": "currentPage" } }, "pageCount": { "source": "expression", "expression": "${page.totalPages}" } } }- Bind
pageto the same scope key your custom list/query reads to fetch the right page of data.
core.popup
| Property | Type | Set from | Default |
|---|---|---|---|
open | boolean | static, binding | false |
variant | string | static | popup |
titleKey | string | static | |
placement | string | static | bottom-end |
dismissible | boolean | static | true |
Events: dismissed
Outputs: open (boolean)
core.recent-pages
Shows the current user's recently-visited pages, most-recent-first.
| Property | Type | Set from | Default |
|---|---|---|---|
currentRoute | string | static, expression, binding | |
currentLabel | string | static, expression, binding | |
maxItems | number | static | 10 |
Events: select
json
{ "blockType": "core.recent-pages", "instanceId": "recent-1", "blockVersion": "1.0.0", "contractVersion": 1,
"properties": {
"currentRoute": { "source": "expression", "expression": "${page.route}" },
"currentLabel": { "source": "static", "value": "Employee Profile" },
"maxItems": { "source": "static", "value": 10 }
} }- Only bind
currentRouteon pages that should count as a "visit" — omit it on a dashboard just displaying the list.
core.recent-searches
| Property | Type | Set from | Default |
|---|---|---|---|
currentQuery | string | static, expression, binding | |
maxItems | number | static | 10 |
Events: select
core.repeater
| Property | Type | Set from | Default |
|---|---|---|---|
dataSource | json | static, expression, binding | [{"id":1,"name":"First record"},{"id":2,"name":... |
direction | string | static | column |
gap | number | static | 8 |
wrap | boolean | static | false |
emptyTextKey | string | static | core.repeater.empty |
core.resizable-panel
| Property | Type | Set from | Default |
|---|---|---|---|
resizeDirection | string | static | both |
initialWidth | number | static | 320 |
initialHeight | number | static | 240 |
minWidth | number | static | 120 |
minHeight | number | static | 80 |
core.saved-search
| Property | Type | Set from | Default |
|---|---|---|---|
currentQuery | string | static, expression, binding | |
currentFilters | json | static, expression, binding | [] |
Events: apply, saved
core.scroll-container
Constrains its children to a fixed height/width with scrolling.
| Property | Type | Set from | Default |
|---|---|---|---|
maxHeight | string | static | 320px |
direction | string | static | vertical |
json
{ "blockType": "core.scroll-container", "instanceId": "activity-scroll", "blockVersion": "1.0.0", "contractVersion": 1,
"properties": { "maxHeight": {"source":"static","value":"400px"}, "direction": {"source":"static","value":"vertical"} } }- Good for a fixed-height sidebar panel of variable-length content (e.g. an activity feed).
core.shape
A generic freeform shape primitive (rectangle or ellipse) for decorative/structural use on a Page, Block canvas, or Report band — distinct from core.divider's fixed full-width horizontal rule.
| Property | Type | Set from | Default |
|---|---|---|---|
variant | string | static | rectangle |
fill | string | static, expression | #e0e0e0 |
stroke | string | static, expression | #9e9e9e |
strokeWidth | number | static | 1 |
cornerRadius | number | static | 0 |
json
{
"instanceId": "shape-org-chart-background",
"blockType": "core.shape",
"blockVersion": "1.0.0",
"contractVersion": 1,
"properties": {
"variant": { "source": "static", "value": "rectangle" },
"fill": { "source": "static", "value": "#f5f5f5" },
"cornerRadius": { "source": "static", "value": 12 }
}
}- Use for purely decorative/structural backgrounds; do not attach interaction handlers, as this widget has none.
- Prefer
core.containerfor anything that needs to host child content —core.shapehas no slots. - Valid on
reporttargets (Report Designer bands) as well aspage/form/container/dashboard.
core.sidebar
A hierarchical, expandable navigation tree — an author-authored, static-items alternative to core.menu-nav's published-Menu-backed sidebar, following core.tree-view's own expand/select convention applied to navigation.
| Property | Type | Set from | Default |
|---|---|---|---|
items | json | static, expression, binding | [{"id":"home","label":"Home","icon":"home"},{"i... |
collapsed | boolean | static, binding | false |
Events: select
json
{
"instanceId": "sidebar-static-nav",
"blockType": "core.sidebar",
"blockVersion": "1.0.0",
"contractVersion": 1,
"properties": {
"items": {
"source": "static",
"value": [
{ "id": "home", "label": "Home", "icon": "home" },
{
"id": "people",
"label": "People",
"icon": "group",
"children": [
{ "id": "employees", "label": "Employees" },
{ "id": "teams", "label": "Teams" }
]
},
{ "id": "settings", "label": "Settings", "icon": "settings" }
]
}
}
}- Give every node (including nested children) a stable, unique
id—select's payload andexpandedIdstracking both key off it. - Prefer
core.menu-navover authoringcore.sidebardirectly when the navigation tree should be centrally managed as a published Menu artifact. - Bind
collapsedto session/page state when the rail's collapsed state should persist across navigation.
core.sitemap
| Property | Type | Set from | Default |
|---|---|---|---|
items | json | static, expression, binding | [{"title":"Product","route":"/product","childre... |
Events: clicked
core.spacer
A fixed-size empty spacing block, for deliberate gaps a layout's own row/column gutter doesn't provide.
| Property | Type | Set from | Default |
|---|---|---|---|
size | number | static | 16 |
json
{
"contractVersion": 1,
"instanceId": "field-gap-small",
"blockType": "core.spacer",
"blockVersion": "1.0.0",
"properties": {
"size": { "source": "static", "value": 8 }
}
}- Prefer a layout's own row/column gutter/gap settings for regular rhythm;
- Keep
sizewithin the declared0–400range — values outside it are
core.split-pane
A two-pane (master/detail-style) resizable layout.
| Property | Type | Set from | Default |
|---|---|---|---|
orientation | string | static | horizontal |
ratio | number | static | 50 |
json
{ "blockType": "core.split-pane", "instanceId": "employee-master-detail", "blockVersion": "1.0.0", "contractVersion": 1,
"properties": { "orientation": {"source":"static","value":"horizontal"}, "ratio": {"source":"static","value":35} } }- The canonical layout for the Master-Detail pattern (see
ai/patterns/master-detail.md) — a list in the smaller pane, detail content in the larger.
core.stepper
A multi-step wizard progress indicator.
| Property | Type | Set from | Default |
|---|---|---|---|
steps | json | static, expression, binding | [{"label":"Details"},{"label":"Review"},{"label... |
activeStep | number | static, binding | 0 |
orientation | string | static | horizontal |
Events: changed
Outputs: activeStep (number)
json
{ "blockType": "core.stepper", "instanceId": "stepper-1", "blockVersion": "1.0.0", "contractVersion": 1,
"properties": {
"steps": { "source": "static", "value": [{"label":"Personal Details"},{"label":"Employment Info"},{"label":"Review"}] },
"activeStep": { "source": "binding", "binding": { "scope": "page", "key": "wizardStep" } }
} }- Bind
activeStepto a page-scope variable shared with the actual step content, not managed independently.
core.tabs
A multi-panel tab composition surface. Each panel is a core.container instance placed in the panels slot — there is no dedicated tab-panel block type.
| Property | Type | Set from | Default |
|---|---|---|---|
activeIndex | number | static | 0 |
headerCard | boolean | static | false |
Events: changed
json
{
"contractVersion": 1,
"instanceId": "employee-profile-tabs",
"blockType": "core.tabs",
"blockVersion": "1.0.0",
"properties": {
"activeIndex": { "source": "static", "value": 0 }
},
"children": {
"panels": [
{
"contractVersion": 1,
"instanceId": "profile-overview-panel",
"blockType": "core.container",
"blockVersion": "1.0.0",
"properties": { "title": { "source": "static", "value": "Overview" } },
"children": { "children": [] }
},
{
"contractVersion": 1,
"instanceId": "profile-documents-panel",
"blockType": "core.container",
"blockVersion": "1.0.0",
"properties": { "title": { "source": "static", "value": "Documents" } },
"children": { "children": [] }
}
]
}
}- Author each panel as a
core.containerwith atitle— do not invent a - Use
activeIndexonly to set which tab opens first; wirechangedif you - Keep panel count stable where possible —
activeIndexclamping means a
core.toolbar
A composition surface for a row of action controls (buttons, filters) with an optional title — the same children slot idiom as core.container.
| Property | Type | Set from | Default |
|---|---|---|---|
title | string | static, expression, binding |
json
{ "blockType": "core.toolbar", "instanceId": "toolbar-1", "blockVersion": "1.0.0", "contractVersion": 1,
"properties": { "title": { "source": "static", "value": "Employee Directory" } },
"children": { "children": [ { "blockType": "core.button", "instanceId": "add-employee-btn", "blockVersion": "1.0.0", "contractVersion": 1, "properties": { "label": { "source": "static", "value": "Add Employee" } } } ] } }- Use above a
core.grid/core.listfor the classic "title + action buttons + list" layout.
core.tree-nav
| Property | Type | Set from | Default |
|---|---|---|---|
items | json | static, expression, binding | [{"id":"docs","label":"Documentation","href":"/... |
Events: navigate
core.wizard
| Property | Type | Set from | Default |
|---|---|---|---|
activeIndex | number | static | 0 |
Events: changed, completed
Outputs: activeIndex (number)
core.workspace-nav
Renders the contextual side-navigation for a Workspace artifact (a curated launcher/context grouping).
| Property | Type | Set from | Default |
|---|---|---|---|
workspaceName | string | static, expression, binding | |
collapsed | boolean | static, binding | false |
Events: select
json
{ "blockType": "core.workspace-nav", "instanceId": "ws-nav-1", "blockVersion": "1.0.0", "contractVersion": 1,
"properties": { "workspaceName": { "source": "binding", "binding": { "scope": "session", "key": "currentWorkspace" } } } }- Pair with
core.workspace-switcherwriting to the same bound scope key.
core.workspace-switcher
Lets a user pick which Workspace to enter.
No properties.
Events: select
json
{ "blockType": "core.workspace-switcher", "instanceId": "ws-switch-1", "blockVersion": "1.0.0", "contractVersion": 1, "properties": {} }- Always pair with
core.workspace-nav— this widget alone doesn't show any workspace content.
