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_componentslists the components the theme and modules provide, with their prop and slot schemas.droost_display_sourcessays what can feed a prop or slot for a given field, filtered exactly as the UI filters.droost_display_getreads a display back as an abstract model.droost_display_compose(gated byallow_scaffold) writes it deterministically. The recipe's shippedeventdisplay 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_treeread, 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.