Skip to content

v1.35.0

Choose a tag to compare

@github-actions github-actions released this 30 Sep 08:43
· 4 commits to master since this release

Page states, on-canvas gap handles and a folder-aware editor lead this release, alongside a Bob that checks its own work before calling it done.

Page states

A page is now Draft, Staging or Live, with badges on the dashboard and a status filter to match (#819, #825).

Gap handles on the canvas

Flex and grid containers could only have their gap changed from the Layout panel. Padding already had draggable on-canvas handles, and gap now has the equivalent: one handle per gap between children, or drag the whole band (#792).

builder-spacing-handles.mp4

Working across a folder's pages

When the open page belongs to a folder, the Layers tab starts with that folder's pages, so switching between related pages is one click instead of a trip through the dashboard. Titles drop a template's site-name suffix and routes drop the shared prefix, and right-clicking a row gives rename, duplicate, move, view live and delete (#890).

The open folder's pages above the layers tree

Importing a template group now puts its pages in their own folder under one route, so the links between them resolve (#892). Importing Mono used to leave three loose pages at /pages/<hash>, where the template's own href="about" led to a 404. They now land as Mono/ with /mono/home, /mono/about and /mono/contact.

An imported template group in its own folder

Canvas zoom and pan survive switching pages too, so hopping between related pages no longer re-fits the canvas every time (#886).

Bob

Bob's only visual check was a 1280px light-mode screenshot, and it could not look at an individual image. It can now preview dark mode and mobile and read an image block, and it is told which theme the editor is showing the page in (#859, #860).

The prompt rules changed to match (#863): claim only what it saw land, check a mobile or dark-mode change in that mode before calling it done, and when told something did not work, look before trying again rather than re-announcing the same fix.

Bob also edits components and lets the sync update pages (#823), renders tables in its replies (#868), and says plainly when a failed turn is the user's to fix (#865).

Colours and tokens

The colour token dropdown moved out of the picker popover and into the Background field, so a token is one click from where the value lives. Colours can be typed straight into the field, and the New Token dialog shows the value it is about to save (#813, #816, #818).

Colour tokens in the Background field

Editor and dashboard polish

Duplicating a page used to keep the original title and its publish state, and renaming meant opening the page. Copies now arrive as numbered drafts, "Home (Copy)" then "Home (Copy 2)", and rename is a page action (#896, #916).

Recording.2026-09-24.230325.mp4
  • Real italic faces load in the editor, at inherited weights. Italic text used to render as a browser-slanted roman on the canvas while the published page showed the real face (#879)
  • The preview reloads when the page is saved elsewhere (#873)
  • Form controls render in the canvas as real but inert elements (#806)
  • Keyboard shortcut fixes, and the block context menu closes when a keyboard command runs (#796, #795, #828)
  • Popovers and dialogs: the Items popover keeps its header and Add button, the settings modal no longer shifts on scroll, the command palette backdrop matches other dialogs, and popovers hide on small screens (#840, #838, #836, #807)
  • The template picker opens fully painted (#837)
  • Consistent title casing across shortcut and menu labels (#801)
  • The dashboard sidebar header menu is back, and the pages list drops its scrollbar and redundant loads (#878, #899)
  • Editor console warnings and errors cleared (#810)

Fixes

  • A duplicated page no longer copies the client script's public_url, which let a copy overwrite the source page's live JS and CSS (#849)
  • Stale cached pages are no longer served (#909)
  • One malformed dynamic route no longer breaks the others (#908)
  • Block client-script CSS is scoped in the canvas the way it is on the published page (#912)
  • data.page_data carries dates and decimals, and whole-number props render without a trailing .0 (#911, #910)
  • Absolute and data: URLs are left alone in image sources (#850)
  • Favicons and meta images upload as public files (#835)
  • Route variable values are escaped in the route preview (#833)
  • Blocks copied in another browser paste correctly, including blocks nested in a component (#821)
  • dynamicValues wins over the legacy dataKey when publishing (#847)
  • Inline span colours clear when Text Color is set from the panel (#913)
  • Images missing alt text get it, and _(...) is callable in page data scripts (#748, #745)

Maintenance

frappe-ui 1.0.0-beta.76 (#845), a 14-package dependency group bump (#826), Crowdin syncs, and two reverts: the frappe-ui code editor migration (#893) and the scoped settings dialog (#894).


Full generated changelog

Bug Fixes

  • a11y: add alt text to images missing it (33dd80f)
  • ai: ask to sign in again when the ChatGPT credential fails (d23ceb8)
  • ai: bound what a record query can put in Bob's context (64a0e5e)
  • ai: drop a darkSrc previously filed as custom when setting it (9f5e836)
  • ai: guard show_image URLs, force light previews, attach renders atomically (0336291)
  • ai: inline remote images so the renderer never fetches them (190a028)
  • ai: keep AI message traces out of the HTML sanitizer (c18e94c)
  • ai: keep the canvas theme when resuming after a confirmed action (5b6ba82)
  • ai: let Bob edit components and make sync update pages (8f97e90)
  • ai: reject indirect component cycles in edit_component (81957b5)
  • ai: render tables in Bob's chat replies (abe19b4)
  • ai: tell the user when a failed turn is theirs to fix (b65a2ed)
  • ai: write darkSrc to the image's attributes, not customAttributes (53e6366)
  • align padding and gap handles (cb854ce)
  • align padding handle styling with gap handle (b3b6caa)
  • apply dynamicValues over the legacy dataKey when publishing (2e9bb90)
  • bound the pages list, guard locked pages, save before switching (41ed984)
  • build page rows on SidebarItem for the sidebar's hover and active states (248ba24)
  • cap spacing handle size when zoomed in (ffeb829)
  • centre padding handles on the box edges instead of the content (2bff8b8)
  • clear inline span colours when Text Color is set from the panel (98e2859)
  • colour padding handles blue to tell them apart from gap handles (8468530)
  • contain only the page scripts' own errors (5b856ad)
  • copy blocks nested inside a component (591f3cf)
  • create duplicate pages as drafts (8f77497)
  • dashboard: Keep the actions trigger visible while its menu is open (0c81f2d)
  • dashboard: Keep the tree row from overflowing at narrow widths (f7e2b7e)
  • dashboard: Lift the unpublished-changes lookup cap (167c154)
  • Delete builder/locale/eo.po (c0b0a33)
  • don't copy a client script's public_url when duplicating a page (#849) (b83bf99)
  • draw spacing bands in a darker, more transparent purple (26855f3)
  • drop colour from the retained textStyle style when clearing text colour (c6dd568)
  • drop the globe next to the home icon in the page title (5a9fb26)
  • drop the margin handles from the block editor (5826223)
  • drop the redundant globe and stop page text clipping in the dashboard (b070982)
  • duplicate a standard page as a plain page (184d625)
  • escape route variable values rendered in the route preview (fb71ce8)
  • fall back to empty route variables when saved value is null (1c86386)
  • fall back to the prop default when a guarded binding is missing (4ecdb46)
  • find the next page on the server when the list lacks it, name the section for screen readers (79c0de4)
  • fit the gradient presets in two rows (b8fe29f)
  • forward attributes to the border radius handle (b29d8c4)
  • gap handles land on wrong seams when flex order reorders children (a22330b)
  • give every chat panel control the same tooltip (b51cc29)
  • give every page title status icon the same size and gap (37ad58f)
  • give every spacing handle the same larger size (e79fe34)
  • give preview renders their own form_dict (a0428da)
  • hand a slow connection over to the demo page instead of dropping the click (47d3dba)
  • head the pages section with the folder, not a Pages label (41bd8a6)
  • hide popovers and dialogs on small screens (79c3934)
  • hide the pages list scrollbar and skip redundant list loads (ed3ebf3)
  • highlight every band a spacing drag changes (47e9985)
  • i18n: keep token confirmation strings extractable (d7b347e)
  • i18n: restore Danish and Uzbek zoom labels, fix Swedish page head wording (96e9387)
  • ignore a nested block when its ancestor is selected (c914222)
  • increase height of Items popover (2479de1)
  • keep a late pages load from refilling a collapsed section (9162437)
  • keep a switched page in view when the kept viewport overshoots (66ce7d8)
  • keep an empty object prop distinct from a missing binding (a9150e7)
  • keep an open template page out of the pages list (8bbae56)
  • keep canvas overlays below the side panels (e8c8b5e)
  • keep gap bands draggable when zoomed out (918bbb9)
  • keep gap handles on the seams in aligned grids (42b939c)
  • keep Items popover header and Add button visible (9a16226)
  • keep large whole numbers as floats (c87bbd1)
  • keep live pages ahead of staging ones on dynamic routes (a29072a)
  • keep Mark as Staging on the page it started from (4a30964)
  • keep one malformed dynamic route from breaking the others (6fc43b3)
  • keep padding handles in their band (328b44d)
  • keep padding handles inside the selection ring (fc81791)
  • keep property inputs from painting over the sticky property search (31b2b53)
  • keep registry components out of reactive state (a6fa3cd)
  • keep spacing handles visible while the block is selected (2a79e20)
  • keep the color picker anchor full width (fb783ef)
  • keep the column-gap handle off the row gap (eb06218)
  • keep the editor demo from capturing the page's edit link (9086d90)
  • keep the legacy dataKey as a fallback behind dynamicValues (0222c89)
  • keep the row-gap handle when a grid item spans rows (e6b9906)
  • keep the selected block's handles above hovered block outlines (89468bd)
  • keep Version History disabled in read-only mode (d31158c)
  • label the array and object editors "Items" (71dc579)
  • let a demo launch that never gets ready give up so it can be retried (28a9afe)
  • let component prop rows use the panel width (4b06702)
  • let data.page_data carry dates and decimals (a5ce806)
  • let page CSS and start-up scripts treat the demo canvas as the document root (bd7e31d)
  • line the page status dots up under the section chevron (73d8618)
  • load real italic faces in the editor and at inherited weights (6c7f1ae)
  • make spacing handles quieter and show the value at the cursor (0fe43bc)
  • make spacing pills easy to grab (12eb805)
  • make the color swatch a button so the picker opens from the keyboard (8885914)
  • make the whole gap band draggable (952a5ce)
  • mark a published page with a Live badge instead of a globe icon (f5f79ac)
  • match the command palette backdrop to other dialogs (46ef51d)
  • match the open page against the search on the client (537b32e)
  • move Version History from the publish menu to the toolbar (b39bb76)
  • normalize nested block selections (2b7cb21)
  • normalize route variables before HTML escaping (1647b91)
  • number copy titles inside the parentheses (a810f63)
  • open every color picker from its swatch, not on focus (54427a2)
  • open the background picker on focus only for a gradient or image (76fe91f)
  • open the demo when the canvas is ready before the page finishes loading (e04dadf)
  • padding drags hitting the wrong side, and drag from the whole band (156c2ed)
  • page-data-script: make translation actually callable as _(...) (9d9104e), closes #626
  • pass propertyKey and typed defaults for component prop controls (f25cd01)
  • paste blocks copied in another browser (dd161a2)
  • pick color tokens from the Background field, not the picker's dropdown (bc897ec)
  • preview: stop tearing down PageBuilder's doc subscription (eb9d43c)
  • publish a staging page's changes to staging and move Go Live to the menu (d62ee2c)
  • re-run the pages search after the open page is renamed (72bdab2)
  • refresh the pages list after a delete and open the next page (f583779)
  • reject malformed colors typed into the Background field (0d38878), closes #zzz
  • reject unknown route converters too (8afecb9)
  • remember an interaction that happens while the page is still loading (efd9d5b)
  • remove nested blocks from a marquee selection (35724d7)
  • remove the Created By filter for now (402b1fd)
  • Remove unnecessary alt (ea9eb8b)
  • render dotted data keys whose root is missing (4465232)
  • render whole-number props without a trailing .0 (f03dd12)
  • report a page script's canvas mismatch as a warning, not a crash (5659ae8)
  • request only catalog fonts from Google Fonts (a649d0e)
  • reserve mono for code literals in the AI debug UI (22eaca2)
  • resolve dotted data keys through subscripts, not .get() (171d842)
  • resolve ESLint parameter reassignment in PageTitlePopover (ce8c377)
  • resolve fonts per canvas breakpoint, allow space before colon (ba00467)
  • restore dashboard sidebar header menu (babca24)
  • restore the develop frontend build (f8882c3)
  • ring the whole page row and keep row shadows unclipped (e642d79)
  • scope block client-script CSS in the canvas like the published page (b1253bd)
  • search the whole folder, not just its first 500 pages (b83483c)
  • select the arrowed-to option with Enter in autocomplete inputs (c6fb1c2)
  • send only the tokens the page uses to the editor demo, shorten its tooltip (33ebbbe)
  • set block colour from Text Color while the text is being edited (64b9e86)
  • set the route variable example in monospace (62cce30)
  • settings: show Domains only on Frappe Cloud sites (033bc68)
  • show a live dot instead of the globe for a published page (ce11973)
  • show creation timestamp when sorting pages by Last Created (b9a3eea)
  • show only the handle when the gap is 0px (75196d4)
  • show padding handles at 0px (2e3ddce)
  • show spacing handles only while hovering the selected block (eb3d1e2)
  • show spacing values only on the bands being changed (8574216)
  • show the Staging badge in violet (9b9f653)
  • show the value being saved in the New Token dialog (b5af182)
  • sit the grid status badge an even distance from the thumbnail corner (8448411)
  • stop dark-mode image sources adding an extra layout gap (cb9885c)
  • stop mangling absolute and data: URLs in image sources (#850) (f6a60d8)
  • stop serving stale cached pages (93fc608)
  • stop settings modal from shifting on scroll (b0726b8)
  • stop spacing bands darkening where they overlap (88dc3e9)
  • strip the legacy suffix too (c16c4cb)
  • take a grid's gap bands from its tracks (6c375cc)
  • templates: cap warmed thumbnails and catch a failed catalog prefetch (96636f3)
  • tighter social preview card in page meta settings (a17afe3)
  • type colors into the Background field and keep its label in sync (5e8c55e)
  • ui: round the outline on an inherited toggle option (78dd937)
  • upload favicons and meta images as public files (b9d86b0), closes #834
  • use append_number_if_name_exists for copy titles (0c36cae)
  • Use consistent title casing for shortcut and menu labels (d2a95e1)
  • use stock frappe-ui badges for page status (ac70596)
  • version the demo launcher's URL so a deploy reaches visitors (340ddd7)

Features

  • add a Staging status for pages (187ee9a)
  • add gap handlers for flex and grid containers (1898deb)
  • ai: let Bob preview dark mode and mobile, and see an image block (13e71b8)
  • ai: let Bob preview dark mode and mobile, and see an image block (#859) (3fc8e76)
  • ai: make Bob look before it claims, and keep what it didn't write (2c6fa5b)
  • ai: tell Bob which theme the editor shows the page in (bdb8660)
  • collapse the pages section when a canvas block is clicked (12152fb)
  • dashboard: Give the route tree a status rail and quieter rows (8f7f99f)
  • dashboard: Make the draft status dot hollow (5e9020c)
  • dashboard: Show page status as a dot in the meta line (b480bf6)
  • import a template group into its own folder (5671131)
  • keep canvas zoom and pan when switching pages (70fb35b)
  • label the components panel (ec98c1a)
  • mark a live page as staging from the publish menu (d66cecf)
  • open the editor demo in the theme the page is showing (5879007)
  • preview: reload preview when the page is saved elsewhere (27c2605)
  • sandboxed editor demo that opens a published page from #editor-demo links (69ce335), closes #editor-demo #editor-demo
  • show the open folder's pages above the layers tree (d0f6fc9)

Performance Improvements

  • fetch template bundles before creating the import folder (5445e64)
  • limit duplicate title lookup to one row (868b2bc)
  • load the AI panel when it is opened (78bc92d)
  • load the editor's Inter from the path published pages use (5c36b5d)
  • look up taken folder names and route prefixes once per import (f6c0ee2)
  • read demo component names from the document cache (8aee506)
  • templates: open the template picker fully painted (a63980b)
  • warm the editor demo up on arrival, not on hover (6e77b39)

Reverts

  • "chore: sync translations from crowdin" (#855) (97606d1)

Full diff: v1.34.0...v1.35.0