Skip to content

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.

BlockWhat it is for
core.accordionA single-expand collapsible panel group.
core.advanced-searchSearch box with facets; fires select for the chosen result.
core.anchor-navLinks that scroll to sections of the same page; fires clicked.
core.auto-layoutFlex layout with direction, gap, wrap, alignment and justification.
core.bottom-navA mobile-only app footer — a single evenly-spaced icon+label row, for primary mobile app navigation (Home/Search/Create/Profile-style tab bars).
core.breadcrumbA static, author-supplied breadcrumb trail.
core.command-menuSearchable command palette; fires selected and dismissed.
core.containerA generic composition surface for grouping and structuring content.
core.dialogAn 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.dividerA simple visual separator line between content, horizontal or vertical.
core.favorites-listShows the current user's real, durably-persisted favorited pages, with an optional toggle for the current page.
core.global-searchThe platform's cross-artifact search — one search box that finds Pages/Forms/Widgets/etc.
core.language-switcherControl for changing the display language; fires changed.
core.lineA 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-gridLayout that places children in columns of uneven height.
core.master-detailMaster list on one side and the selected record's detail on the other; fires recordSelected.
core.mega-menuMenu that opens a wide panel of grouped links from a trigger; fires selected.
core.menuA 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-breadcrumbDerives a real breadcrumb trail from a published Menu's own hierarchy + the current page's route.
core.menu-navRenders 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-navRenders 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.paginationA standalone page-number control, for pairing with a custom list/grid that doesn't have its own built-in pagination.
core.popupPopup surface that opens and closes by open, with placement and optional dismissal; fires dismissed.
core.recent-pagesShows the current user's recently-visited pages, most-recent-first.
core.recent-searchesLists the last searches the person ran; fires select.
core.repeaterRepeats its child blocks once per item of a data source.
core.resizable-panelPanel the person can resize by dragging, within minimum and maximum sizes.
core.saved-searchSaves the current query and filters under a name and lists saved searches; fires apply and saved.
core.scroll-containerConstrains its children to a fixed height/width with scrolling.
core.shapeA 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.sidebarA 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.sitemapList of site links grouped by section; fires clicked.
core.spacerA fixed-size empty spacing block, for deliberate gaps a layout's own row/column gutter doesn't provide.
core.split-paneA two-pane (master/detail-style) resizable layout.
core.stepperA multi-step wizard progress indicator.
core.tabsA multi-panel tab composition surface.
core.toolbarA composition surface for a row of action controls (buttons, filters) with an optional title — the same children slot idiom as core.container.
core.tree-navNested navigation tree; fires navigate.
core.wizardMulti-step container that shows one step at a time; fires changed and completed.
core.workspace-navRenders the contextual side-navigation for a Workspace artifact (a curated launcher/context grouping).
core.workspace-switcherLets 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.

PropertyTypeSet fromDefault
expandedIndexnumberstatic-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: -1 for a fully-collapsed default; use 0 (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
PropertyTypeSet fromDefault
placeholderstringstatic, expressionSearch...
facetsjsonstatic[]
limitnumberstatic20

Events: select

core.anchor-nav ​

PropertyTypeSet fromDefault
itemsjsonstatic, expression, binding[{"label":"Overview","targetId":"overview"},{"l...
orientationstringstaticvertical

Events: clicked

core.auto-layout ​

PropertyTypeSet fromDefault
directionstringstaticcolumn
gapnumberstatic8
wrapbooleanstaticfalse
alignstringstaticstretch
justifystringstaticflex-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).

PropertyTypeSet fromDefault
itemsjsonstatic, expression, binding[{"label":"Home","icon":"home","color":"#4F46E5...
primaryPathstringstaticlabel
iconPathstringstaticicon
colorPathstringstaticcolor
variantPathstringstaticvariant

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 page targets (its designer.allowedTargets is ["page"]) — not valid inside forms, containers, or dashboards.
  • Prefer core.mobile-nav over authoring core.bottom-nav directly when the tab set should be centrally managed as a published Mobile Nav artifact.

core.breadcrumb ​

A static, author-supplied breadcrumb trail.

PropertyTypeSet fromDefault
itemsjsonstatic, 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-breadcrumb instead if the trail should follow the real Menu hierarchy automatically.

core.command-menu ​

PropertyTypeSet fromDefault
openbooleanstatic, bindingfalse
itemsjsonstatic, expression, binding[{"id":"home","label":"Go to Home"},{"id":"sett...
placeholderstringstaticType 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.

PropertyTypeSet fromDefault
hiddenbooleanstatic, expression, bindingfalse
variantstringstaticplain
titlestringstatic, expression, binding
titleKeystringstatic
iconstringstatic, expression, binding
collapsiblebooleanstaticfalse
htmlAttributesjsonstatic

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: true only where the animated open/close is actually
  • When authoring a core.tabs/core.accordion panel, 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.

PropertyTypeSet fromDefault
openbooleanstatic, bindingfalse
titleKeystringstatic
overlayKindstringstaticmodal
dismissiblebooleanstatictrue
fullscreenbooleanstaticfalse

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 open to a page-scope key rather than a static literal — a static
  • Use overlayKind: "drawer" for wizard/step flows and modal for
  • Set dismissible: false only when you provide an explicit in-content close

core.divider ​

A simple visual separator line between content, horizontal or vertical.

PropertyTypeSet fromDefault
orientationstringstatichorizontal
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.

PropertyTypeSet fromDefault
currentRoutestringstatic, expression, binding
currentLabelstringstatic, 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/currentLabel so the toggle row is meaningful; omit both for a read-only favorites list.

The platform's cross-artifact search — one search box that finds Pages/Forms/Widgets/etc. by name.

PropertyTypeSet fromDefault
placeholderstringstatic, expressionSearch...
limitnumberstatic20

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 select to a navigate action reading ${event.route} when artifactType === "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.

PropertyTypeSet fromDefault
orientationstringstatichorizontal
strokestringstatic, expression#9e9e9e
strokeWidthnumberstatic1
strokeStylestringstaticsolid
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 diagonal sparingly — it is intended for canvas-style layouts (e.g. connectors), not standard row/column content.
  • Valid on report targets (Report Designer bands) as well as page/form/container/dashboard.

core.masonry-grid ​

PropertyTypeSet fromDefault
columnsnumberstatic3
gapnumberstatic16

core.master-detail ​

PropertyTypeSet fromDefault
dataSourcejsonstatic, expression, binding[{"id":1,"name":"Acme Corp","status":"Active"},...
masterLabelPathstringstaticname
masterSecondaryPathstringstaticstatus

Events: recordSelected

core.mega-menu ​

PropertyTypeSet fromDefault
triggerLabelstringstatic, expression, bindingMenu
columnsjsonstatic, 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.

PropertyTypeSet fromDefault
itemsjsonstatic, 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.menu for a flat action/choice list; use core.sidebar when items need parent/child hierarchy.
  • Always give each item a stable id — selected's payload carries only the id, not the item object.
  • Set disabled: true on 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.

PropertyTypeSet fromDefault
menuNamestringstatic, expression, binding
currentRoutestringstatic, 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 currentRoute to ${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).

PropertyTypeSet fromDefault
menuNamestringstatic, expression, binding
collapsedbooleanstatic, bindingfalse
displayModestringstatic, bindinglist

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 menuName to 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 a navigate action rather than re-deriving them.
  • Supply getMyRoles/getMyOrgUnits/getMenuAccess in production wiring whenever the published Menu actually uses security.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).

PropertyTypeSet fromDefault
mobileNavNamestringstatic, expression, binding
renderAsstringstaticbottom-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-tabs and, if needed, one separate drawer instance against the same mobileNavName for a hybrid pattern — never expect one instance to render both.
  • Restrict its allowedTargets awareness: this block is only valid on page targets, matching its mobile-app-shell role.
  • Use MobileNavItem.surfaces to 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.

PropertyTypeSet fromDefault
pagenumberstatic, binding1
pageCountnumberstatic, expression, binding1

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 page to the same scope key your custom list/query reads to fetch the right page of data.

core.popup ​

PropertyTypeSet fromDefault
openbooleanstatic, bindingfalse
variantstringstaticpopup
titleKeystringstatic
placementstringstaticbottom-end
dismissiblebooleanstatictrue

Events: dismissed

Outputs: open (boolean)

core.recent-pages ​

Shows the current user's recently-visited pages, most-recent-first.

PropertyTypeSet fromDefault
currentRoutestringstatic, expression, binding
currentLabelstringstatic, expression, binding
maxItemsnumberstatic10

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 currentRoute on pages that should count as a "visit" — omit it on a dashboard just displaying the list.

core.recent-searches ​

PropertyTypeSet fromDefault
currentQuerystringstatic, expression, binding
maxItemsnumberstatic10

Events: select

core.repeater ​

PropertyTypeSet fromDefault
dataSourcejsonstatic, expression, binding[{"id":1,"name":"First record"},{"id":2,"name":...
directionstringstaticcolumn
gapnumberstatic8
wrapbooleanstaticfalse
emptyTextKeystringstaticcore.repeater.empty

core.resizable-panel ​

PropertyTypeSet fromDefault
resizeDirectionstringstaticboth
initialWidthnumberstatic320
initialHeightnumberstatic240
minWidthnumberstatic120
minHeightnumberstatic80
PropertyTypeSet fromDefault
currentQuerystringstatic, expression, binding
currentFiltersjsonstatic, expression, binding[]

Events: apply, saved

core.scroll-container ​

Constrains its children to a fixed height/width with scrolling.

PropertyTypeSet fromDefault
maxHeightstringstatic320px
directionstringstaticvertical
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.

PropertyTypeSet fromDefault
variantstringstaticrectangle
fillstringstatic, expression#e0e0e0
strokestringstatic, expression#9e9e9e
strokeWidthnumberstatic1
cornerRadiusnumberstatic0
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.container for anything that needs to host child content — core.shape has no slots.
  • Valid on report targets (Report Designer bands) as well as page/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.

PropertyTypeSet fromDefault
itemsjsonstatic, expression, binding[{"id":"home","label":"Home","icon":"home"},{"i...
collapsedbooleanstatic, bindingfalse

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 and expandedIds tracking both key off it.
  • Prefer core.menu-nav over authoring core.sidebar directly when the navigation tree should be centrally managed as a published Menu artifact.
  • Bind collapsed to session/page state when the rail's collapsed state should persist across navigation.

core.sitemap ​

PropertyTypeSet fromDefault
itemsjsonstatic, 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.

PropertyTypeSet fromDefault
sizenumberstatic16
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 size within the declared 0–400 range — values outside it are

core.split-pane ​

A two-pane (master/detail-style) resizable layout.

PropertyTypeSet fromDefault
orientationstringstatichorizontal
rationumberstatic50
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.

PropertyTypeSet fromDefault
stepsjsonstatic, expression, binding[{"label":"Details"},{"label":"Review"},{"label...
activeStepnumberstatic, binding0
orientationstringstatichorizontal

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 activeStep to 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.

PropertyTypeSet fromDefault
activeIndexnumberstatic0
headerCardbooleanstaticfalse

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.container with a title — do not invent a
  • Use activeIndex only to set which tab opens first; wire changed if you
  • Keep panel count stable where possible — activeIndex clamping 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.

PropertyTypeSet fromDefault
titlestringstatic, 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.list for the classic "title + action buttons + list" layout.

core.tree-nav ​

PropertyTypeSet fromDefault
itemsjsonstatic, expression, binding[{"id":"docs","label":"Documentation","href":"/...

Events: navigate

core.wizard ​

PropertyTypeSet fromDefault
activeIndexnumberstatic0

Events: changed, completed

Outputs: activeIndex (number)

core.workspace-nav ​

Renders the contextual side-navigation for a Workspace artifact (a curated launcher/context grouping).

PropertyTypeSet fromDefault
workspaceNamestringstatic, expression, binding
collapsedbooleanstatic, bindingfalse

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-switcher writing 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.