Install

Works with Drupal: ^11.2

Using Composer to manage Drupal site dependencies

Alternative installation files

Download tar.gz 27.21 MB
MD5: c157b8ea3ff70974a21a3443145faab2
SHA-1: e634dec84860500d85e33774651c264207f6fd88
SHA-256: e48ae561e4bfa980cb81ab7d7dd0c0898c76fc1a86e2610a6304b84faa90ade0
Download zip 28.32 MB
MD5: a79275876489fcbb7e5386e41e21935e
SHA-1: c3113a56bce98dbf910c13a0df4c34accc087d0d
SHA-256: 2e4bb58c482561360167999d9cdb540922ff52da5a2a5fb5a198dbd246d7676a

Release notes

Canvas 1.2 introduces Automatic Component Instance Updates, enabling changes for props/slots on in-use components without breaking content. It also features SPA navigation for instant page switching, full optimization for Drupal 11.3, and a resizable sidebar.

🚀 Key Features

  • Seamless SPA Navigation: Users can now navigate between editing different pages and content without full browser reloads.
  • Changing Props & Slots: Props and slots can be edited for SDCs and code components. Existing pages with old component versions are updated automatically to the latest version.
  • AI Agents & Tools: Initial introduction of AI agents capable of creating entire page structures based on prompts, including improved feedback loops where agents confirm tool success.
  • Library Categorization: Components can be arranged to folders using the Canvas interface.
  • Resizable Sidebar: The right sidebar in the Canvas editor is now resizable, providing more flexibility for tasks that require more space.
  • Code Component Improvements: Added Date and Datetime prop types to the Code Component Editor.

🐛 Bug Fixes

  • Theme Builder: Fixed an issue where PageRegion cache tags were not bubbling correctly, causing stale content. (#3571116)
  • AI Orchestrator: Resolved a bug where agents would produce duplicate final messages. (#3548718)
  • Browser Compatibility: Fixed component preview failures specifically affecting Safari. (#3575072)
  • Data Model: Fixed a fatal error on the "Manage Display" page for non-Canvas view modes in Drupal CMS. (#3571881)
  • UI/UX: Corrected the vertical alignment of the "Add Media" button in Firefox. (#3557221)

Contributors (60)

AkhilBabu, GURNOOR_KAUR, Marcus_Johansson, NarendraR, Utkarsh_33, akhil babu, attilatilman, balintbrews, bnjmnm, brianperry, chandu7929, effulgentsia, f.mazeikis, f0ns, fago, greggles, gurnoor kaur, gábor hojtsy, hooroomoo, interx, isholgueras, ivan zugec, jessebaker, jibran, jonathan1055, jptaranto, justafish, kunal.sachdev, larowlan, lauriii, marcus_johansson, mayur-sose, mcdruid, mglaman, mherchel, mortona2k, mradcliffe, mstrelan, nagwani, narendrar, neha_bawankar, nickolaj, penyaskito, peterrubin, phenaproxima, priyankapatel, q0rban, scott falconer, spleshka, sujal kshatri, tedbow, tim.plunkett, utkarsh_33, vipin.mittal18, vishal.khode, vishalkhode, wimleers, wotnak

Changelog

Issues: 76 issues resolved.

Changes since 1.1.1 (compare):

Bug

  • fix(Theme builder): #3571116 PageRegion's cache tags not bubbling, resulting in stale results being served by (Dynamic) Page Cache
  • fix: #3571881 Fatal error on Manage Display page for non-Canvas view modes in Drupal CMS
  • fix(Theme builder): #3571598 Block layout warning is displayed even when a theme has no blocks enabled
  • fix(AI): #3568950 Let the agent know that the tools were successful
  • fix(AI): #3548718 Orchestrator and sub-agents produce duplicate final messages
  • fix(Page): #3566119 [upstream bug] `views.view.canvas_pages` triggers validation error when installed outside Drupal CMS: "Missing text format: content_format."
  • feat: #3557221 "Add media" button text not vertically centered in Firefox
  • fix(Page builder): #3571599 Fix regression "Template for Basic page not found" error after adding new template
  • feat: #3566260 Can't move component out of folder
  • chore: #3573473 Fix HEAD
  • fix: #3573491 Default template SSH URLs fail without GitHub SSH access; use HTTPS URLs instead
  • fix(Shape matching): #3573796 `json-schema-definitions://canvas.module/stream-wrapper-uri` known prop shape is incorrectly mapped to link field type, causing error
  • fix(Redux-integrated field widgets): #3550848 Linker works for `type: string, format: date-time`, but `DateTimeDefaultWidget` renders the linker twice
  • fix(Data model): #3566433 `Component::getVersions()` must cast all version hashes to string: 1 in 4 million probability that it fails due to all-digit version hash
  • fix(Component Sources): #3539147 JsComponent::getScopedDependencies() and ::getDependencyLibraries() shouldn't get auto-saves unless previewing
  • fix(Component sources): #3574743 500 error for code component preview after deleting required prop from in-use Code Component
  • fix: #3575072 Component preview doesn't work for code components in Safari
  • fix(AI): Harden image download
  • fix: #3569884 The `target_uuid` property that Canvas adds to entity reference fields should be excluded from default content exports
  • fix(Component sources): #3574743 Follow-up 500 error for code component preview after deleting required prop from in-use Code Component: ensure unexposed components that were exposed previously can still pass required props validation if required props were removed

Feature

  • feat(Page builder): #3538104 Add seamless SPA navigation between editing different pages/content
  • chore: #3550750 Update deprecation error messages to match actual Canvas release this shipped in: 1.1.0
  • feat: #3567481 Fix access control logic to only display a CTA on "manage" when appropriate
  • feat(Data model): #3567413 When editing a Canvas entity with a component tree (e.g., page, template, or region), automatically upgrade component instance versions for cases where there's no impact on existing data
  • feat: #3540582 Moving folders with drag & drop
  • chore(Page builder): #3538104 Add minor comments from SPA navigation feedback
  • feat(Theme builder): #3566541 Code Component Editor: Add a Date and Datetime prop type
  • feat: #3553356 Allow @plugins support in Global CSS
  • feat(AI): #3533079 Introduce AI Agents and tools to create entire page templates using available component entities
  • feat: #3570305 Make links and meta available by default in data returned by the preconfigured JsonApiClient
  • fix: #3572292 Implement SPA navigation improvements in Publishing UX
  • feat(Data model): #3568906 Handle upgrading and rendering not yet upgraded component instances of components with newly removed props or slots
  • feat: #3573480 Add agent skills compatibility setup in @drupal-canvas/create
  • feat(CLI Tool): #3566458 OAuth scopes only work for client_credentials flow
  • chore(Data model): #3568906 Add missing @todo that will be necessary once we do #3498525
  • feat(Data model): #3568602 Handle upgrading and rendering not yet upgraded component instances of components with new(ly) required props that include an example value
  • feat(Data model): #3568602 Follow-up doc improvements for Handle upgrading and rendering not yet upgraded component instances of components with new(ly) required props that include an example value
  • fix: #3574994 Resizable right sidebar for Drupal Canvas
  • feat: #3574994 Resizable right sidebar for Drupal Canvas
  • feat: #3573996 Add utils for converting between Canvas component trees and json-render
  • feat: #3573867 Prototype Canvas Workbench
  • fix: #3572292 Implement SPA navigation improvements in Publishing UX (part 2)

Task

  • chore(CLI Tool): Set acquia/nebula as the recommended template in @drupal-canvas/create
  • ci: Fix CSpell check
  • chore(CLI Tool): Bump version of @drupal-canvas/create to 1.1.0
  • chore(CI): #3566392 Keep Canvas' own `.prettierrc.json` only for linting JS, ignore it for linting CSS
  • feat: #3571232 Create canvas_dev_translation module
  • chore(Project management): #3562026 Consolidate JS workspaces, ESLint, and TypeScript config
  • chore: #3571839 Update vulnerable `glob` version from ^11.1.0 to ^13.0.1
  • feat: #3571460 Test AutoSaveManager language-aware behavior
  • chore(Data model): #3555229 Rename DynamicPropSource to EntityFieldPropSource
  • chore: #3572377 Update references to new github organization name "drupal-canvas"
  • feat: #3571232 Make config component_tree props translatable when canvas_dev_translation module enabled.
  • chore(Project management): #3563216 Add a base class for kernel tests to improve DX: `CanvasKernelTestBase`
  • chore: #3552788 Run the release process on CI
  • chore(CI): #3571997 CI: auto-retry known random Cypress E2E failures + PHPUnit's dreaded "RecursiveDirectoryIterator failed to open directory" (since Drupal 11.2)
  • chore(CI): #3570562 PHPCS: array_map() → \array_map()
  • chore(Project management): #3572401 PHPCS: require CanvasKernelTestBase to be extended, forbid extending KernelTestBase
  • feat: #3552788 Fix release job
  • chore(Project management): #3572777 PHPCS: require `declare(strict_types=1);`
  • chore: #3572876 Update Canvas JS package licensing
  • chore: #3561392 Test Canvas on Drupal 11.3
  • docs: #3572681 Update CONTRIBUTING.md after drupal-canvas/ddev-drupal-xb-dev rename
  • feat: #3572533 Library categorization - remove from behind feature flag
  • docs(user): #3572652 Document how to use @tailwindcss/typography in Code Components
  • feat(Page builder): #3561912 Frontend changes to allow editing props and slots for code components
  • chore(Project management): #3570563 PHPCS: array_keys() → \array_keys()
  • chore(CI): #3561392 Test Canvas on Drupal 11.3.3, not 11.3.x-dev
  • chore(CI): #3571997 CI: coarser auto-retry for PHPUnit's dreaded "RecursiveDirectoryIterator failed to open directory" (since Drupal 11.2)
  • chore(Project management): #3570561 PHPCS: array_key_exists() → \array_key_exists()
  • chore(Component sources): #3574120 Validate props for code components when rendering, like SDCs do
  • chore(Data model): #3571997 Fix random CI failure due to DB-dependent result order in `ComponentAudit`
  • chore(CI): #3571997 Auto-retry when a single Playwright test fails.
  • chore(Data model): #3574514 Document what exposed slots will be
  • docs: #3575055 Missing Documentation for Link Prop
  • chore: #3575232 Fix PHPStan errors in HEAD after 2.1.40 release
  • fix(Redux-integrated field widgets): #3559751 Description for checkboxes should go into the next line
  • chore(Project management): #3533845 PHPStan: stop ignoring invalid @covers annotations
  • feat(Project management): #3575399 DX+CI: Add `composer run phpstan-regenerate-ignores-for-11.3-and-higher` — to simplify updating baseline errors due to PHPStan running on 11.2, fail CI job if out of sync
  • feat(Theme builder): #3574668 User has no way of knowing that a required prop needs an example value

Change Records

Created by: balintbrews
Created on: 26 Feb 2026 at 22:21 UTC
Last updated: 26 Feb 2026 at 22:35 UTC
Bug fixes
New features
Insecure
Unsupported

Other releases