Overview
How an entity page opens: the stage, with identity panelled in.
How an entity page opens: the Gallery stage with the entity's identity panelled into it. Overview and gallery are one block, not two (ADR 0028) — nothing could reorder or omit them independently, which is this system's test for whether two things are one section.
Three pages used to hold a copy of this apiece, and their chrome was byte-identical. They differed only in the foot, which is the whole of the branching here, in precedence order: authoredhighlights win when somebody wrote them, thenpriceLabel for a home, then stats for a development, which shows what it holds rather than what it costs.
stageTransitionName and panelTransitionName are absent here and that is deliberate. They are half of the listings → detail morph (ADR 0017) and mean nothing outside a real navigation — andtransition:name={undefined} would still claim a generated name, which two pages would then pair by accident.
A home — price, status and the New flag
A development — stats instead of a price
No floor plan either: a development is not one unit, so there is no single plan to append as the gallery's last frame.
Authored highlights win
When somebody has written highlights, they take the foot and the price steps aside. This is the top of the precedence order, not an addition to it.
Props
| Prop | Type | Required |
|---|---|---|
| kindLabel | string | yes |
| title | string | yes |
| subtitle | string | yes |
| accent | string | — |
| availability | "available" | "reserved" | "let" | "coming-soon" | — |
| statusLabel | string | — |
| highlights Foot, in precedence order. | string[] | — |
| priceLabel | string | — |
| stats | { label: string; value: string }[] | — |
| isNew A home can carry a "new" flag beside its price. | boolean | — |
| newLabel | string | — |
| ctaLabel | string | yes |
| ctaHref | string | yes |
| contactLabel | string | yes |
| contactHref | string | yes |
| gallery | GalleryImage[] | yes |
| floorPlan Optional floor plan, appended as the gallery's last slide — labelled on its thumbnail and shown contained (a cropped plan is useless). A development isn't one unit, so it has none. | GalleryImage | — |
| floorPlanLabel | string | — |
| galleryLabel | string | yes |
| galleryPrevLabel | string | yes |
| galleryNextLabel | string | yes |
| galleryZoomLabel | string | yes |
| galleryCloseLabel | string | yes |
| stageTransitionName View-transition names for the listings → detail morph (ADR 0017). Absent on pages that aren't a morph target — and absent has to mean NO name at all, not an unnamed opt-in: Astro's `transition:name` directive assigns a generated name whenever it is present, even with an undefined value, and a generated name is the same on every page rendering this component. Two detail pages would then pair their panels (and every gallery slide) as shared elements by accident — and named elements escape their clipping container mid-transition, so the carousel's off-screen slides would fly across the viewport. Hence the inline `view-transition-name` below. | string | — |
| panelTransitionName | string | — |
| headingLevel | 1 | 2 | 3 | 4 | 5 | 6 | — |
| Field | Type | Required |
|---|---|---|
| src | string | yes |
| alt | string | yes |
| full | string | — |