Install
Works with Drupal: ^11.2Using Composer to manage Drupal site dependencies
Alternative installation files
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
- `DynamicPropSource` renamed to `EntityFieldPropSource`
- Component instances will auto-update to active version of the Component config entity when the upgrade has no data storage implications
- Date and datetime props can be added to a code component in the code editor
- Code component props are now validated during rendering to match SDC behavior