The page builder's chrome: top bar, the two side panels, the crumb bar, the code drawer and the
overlays — everything around the canvas, which is its own LiveView inside an iframe
(MishkaCmsCoreWeb.Live.Admin.Builder.CanvasLive).
Both LiveViews share one MishkaCmsCore.Runtime.PageBuilder.EditorSession, keyed by a token in
the canvas URL, and stay in step over that session's PubSub topic. This module owns the editing
context — what is selected, which breakpoint is being edited, what the palette shows — and the
canvas owns the document's pixels.
Sections
One editor, four resources: page, layout, error_page and component. They differ in which
Ash actions load and save them and in a handful of panels; everything else — tree, canvas,
inspector, history — is identical, which is the point of modelling the document as a tree rather
than as four bespoke forms.
Extension points
Every panel region is a MishkaCmsCore.Builder.Events registry, seeded with the core's own
entries. The rails, the inspector's sections, the command palette and the canvas toolbar are all
collected the same way a plugin's contribution would be, so the seam is exercised on every mount
rather than being a promise.
Summary
Functions
The device options the top bar offers, with their canvas widths.
The palette entry the examples modal is open for, or nil.
The three frame widths the all-breakpoints view renders side by side.
Drops the selection, so the code pane goes back to the whole document.
The URL that invites someone else into THIS editing session — the same page plus the session token, so both browsers drive one document and each sees the other in the avatar row.
Functions
The device options the top bar offers, with their canvas widths.
The palette entry the examples modal is open for, or nil.
Exposed so the panel components can read it without threading another assign through every render.
The three frame widths the all-breakpoints view renders side by side.
Drops the selection, so the code pane goes back to the whole document.
The same two calls shortcut("escape", …) makes, reachable by clicking rather than only by a key
nothing advertises — the code pane's scope chip is the button. A picked component is dropped with
it: the author asking for the whole document back is not mid-placement.