the lead photograph, and names for the subject blocks

`collection-cover` draws the FIRST photograph in the gallery, large, beside the words — the shape the
client's sitemap draws. Not a second way to choose one: a gallery is ordered and reordering it is how
the lead changes, which is the rule everywhere else here.

The five subject blocks are places-only, like the contact form and the partner row. They hold nothing
at all — what they draw is the collection the URL names.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-09-04 14:58:54 +01:00
co-authored by Claude Opus 5
parent 331e615c7c
commit 671f049fb3
2 changed files with 19 additions and 1 deletions
+3
View File
@@ -30,6 +30,7 @@ export type ComponentKind =
| 'contact-form' | 'contact-form'
| 'partners' | 'partners'
| 'collections' | 'collections'
| 'collection-cover'
| 'collection-title' | 'collection-title'
| 'collection-description' | 'collection-description'
| 'collection-specs' | 'collection-specs'
@@ -42,6 +43,7 @@ export type ComponentKind =
block: one that is available, adds cleanly, and silently does nothing. block: one that is available, adds cleanly, and silently does nothing.
*/ */
export const SUBJECT_KINDS: ComponentKind[] = [ export const SUBJECT_KINDS: ComponentKind[] = [
'collection-cover',
'collection-title', 'collection-title',
'collection-description', 'collection-description',
'collection-specs', 'collection-specs',
@@ -96,6 +98,7 @@ export const CHOICES: Choice[] = [
They hold nothing — not even a reference. The subject is the URL, so one block draws a different They hold nothing — not even a reference. The subject is the URL, so one block draws a different
collection on every request, and that is what lets one arrangement serve all of them. collection on every request, and that is what lets one arrangement serve all of them.
*/ */
{ kind: 'collection-cover', label: 'Its lead photograph', hint: 'The first in its gallery, large', Icon: Image },
{ kind: 'collection-title', label: 'Its name', hint: 'The collection this page is about', Icon: Heading }, { kind: 'collection-title', label: 'Its name', hint: 'The collection this page is about', Icon: Heading },
{ kind: 'collection-description', label: 'Its description', hint: 'What was written about it', Icon: Type }, { kind: 'collection-description', label: 'Its description', hint: 'What was written about it', Icon: Type },
{ kind: 'collection-specs', label: 'Its specs', hint: 'Measurement, material, colours, delivery', Icon: Ruler }, { kind: 'collection-specs', label: 'Its specs', hint: 'Measurement, material, colours, delivery', Icon: Ruler },
+16 -1
View File
@@ -23,6 +23,11 @@ const LABELS: Record<string, string> = {
'contact-form': 'Contact form', 'contact-form': 'Contact form',
partners: 'Partners', partners: 'Partners',
collections: 'Collections', collections: 'Collections',
'collection-cover': 'Lead photograph',
'collection-title': 'Name',
'collection-description': 'Description',
'collection-specs': 'Specs',
'collection-gallery': 'Photographs',
}; };
/* /*
@@ -31,7 +36,17 @@ const LABELS: Record<string, string> = {
Both the picker and the canvas ask the same question — one to decide whether to open an editor, the Both the picker and the canvas ask the same question — one to decide whether to open an editor, the
other whether to draw an Edit button — and two lists would drift into a button that opens nothing. other whether to draw an Edit button — and two lists would drift into a button that opens nothing.
*/ */
const PLACES_ONLY: string[] = ['contact-form', 'partners', 'collections']; const PLACES_ONLY: string[] = [
'contact-form',
'partners',
'collections',
// The subject blocks hold nothing either: what they draw is the collection the URL names.
'collection-cover',
'collection-title',
'collection-description',
'collection-specs',
'collection-gallery',
];
import { AddSectionDialog, type SectionLayout } from './AddSectionDialog'; import { AddSectionDialog, type SectionLayout } from './AddSectionDialog';
import { FreeTextEditor } from './FreeTextEditor'; import { FreeTextEditor } from './FreeTextEditor';
import { SpacingEditor, type Padding } from './SpacingEditor'; import { SpacingEditor, type Padding } from './SpacingEditor';