Left, Centred, Right on the selected block. Left writes nothing, so a block that
has never been touched inherits the page.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Two of these were live: PageBuilderPanel still compared kind === 'gallery' in
two places, so a carousel block's editor and its Choose button were both dead
branches. The type checker could not see them — both compare against string.
The rest is copy somebody reads: "Change gallery", "Name a new gallery",
"Reading the gallery", "Add to this gallery", Home's Gallery heading, and the
"Create Gallery" file action, now "Carousel from folder".
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Every heading — a band's and a block's — was `type-title`, so the only way to make one bigger was to
resize Headings for the whole site.
A ROLE rather than a size. The four are named and sized under Layout, so a heading set to Titles
follows whatever Titles is set to and keeps following it. Offering point sizes here would be a second
place to change one, and the two would part company the first time somebody used the panel that exists
for it. Same `ROLES` list Fonts and Font Sizes read, so all three name the same four things in the same
order.
Choosing Headings stores nothing. A heading nobody has thought about and one deliberately set to the
default should not be two different rows.
Disabled with no heading, because the size of a heading that does not exist is not a question — and
written on its own rather than through the draft, because a select has one value and waiting 600ms to
watch a heading change size reads as a control that has not responded.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Inside the band, whole width of main, or whole page width. The negatives are
gone from the padding select — padding is padding again.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
React nulls `currentTarget` once the handler returns, and a functional state
updater runs after that — so typing one character into a band's name threw and
took the whole editor panel down.
Three places, all mine from today. Everything older read the value eagerly.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
The measure was drawn on Layout only, and this is the screen where things are
placed against it. It also answers the question a negative margin asks: a block
escaping the gutter has to be seen escaping it, against the line it crossed.
Horizontal padding now offers negatives, built from the same scale so there is
still one list.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Spacing had a link in the chrome painted onto the page and lost its door with the
rest of it. It belongs beside the heading: both are properties of the selected
block, and one of the two is not worth a place of its own to go to.
The page's name and address now show only when the page row itself is selected.
With a band or a block open they sat above an editor about something else and
read as belonging to it.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
canEditComponent answers "is there content to type", and a heading is not
content — so the blocks with no editor of their own are now selectable too, and
get the heading alone.
The live draft writes into [data-block] when there is one. A titled component
renders as a wrapper, and writing into the wrapper would replace the heading with
the paragraph as somebody typed.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>