Skip to main content
/ Droost CMS & Theme

Building pages with Canvas

Droost draws one line through display work. Structured entities (a content type whose every node looks the same) are composed through UI Patterns component formatters on the entity's view display. Freeform pages (a landing page, a campaign) are Canvas component trees. Droost Theme's components are valid in both, and the methodology guidelines topic teaches the decision.

Structured: the display composer

droost_ui_patterns orchestrates Manage Display without the UI:

  • droost_sdc_components lists the components the theme and modules provide, with their prop and slot schemas.
  • droost_display_sources says what can feed a prop or slot for a given field, filtered exactly as the UI filters.
  • droost_display_get reads a display back as an abstract model.
  • droost_display_compose (gated by allow_scaffold) writes it deterministically. The recipe's shipped event display round-trips byte-identically through it.

Views listings work the same way: droost_views_compose turns an intent spec into a complete, schema-valid view (page or block, fields or rendered entities, filters with exposure, sorts, relationships, contextual filters), and block displays register as Canvas-placeable components, so a composed listing drops straight into a Canvas page.

Freeform: the component tree

droost_canvas is the Canvas half:

  • A placeable-component registry and a Canvas-requirements lint, so an agent knows which components qualify before it tries to place one.
  • component_tree read, validate and write: all-or-nothing, versions auto-stamped.
  • Introspection of the canvas_ai and ai_agents orchestration a site may already have.

The coexistence bridge

Canvas and UI Patterns both take over plugin.manager.sdc, and until #3561618 lands upstream that pair fatals on the next cache rebuild. droost_canvas bridges the conflict from its own service provider while it is enabled and stands down automatically once Canvas ships the fix. drush droost:doctor has a coexistence row that reports the live state rather than guessing.

How droost.org uses it

This site is the reference build for exactly this split. Its docs are structured content rendered through components; its landing page is a Canvas composition of the theme's components with the tokens you see here. Every page was a workflow ticket on the recipe, and every gap it hit became a fix in droost_cms or droost_theme before the page shipped.

Verified against droost 2.0.0-alpha4 · workflow 0.6.9 · 2026-09-03