Every block the mockups introduce — fourteen new, plus one new option on a CTA that already exists — with the Payload field schema I would write for each and the component those fields produce. This is the spec to sign off before any config.ts gets written.
Existing blocks are not listed here — supportHero, helpDoors, cardGrid, aboutSplit, accordion, iconTabs, trustBar, textImageChecklist, contactBlock, ctaBanner, noticeBanner, newsIndex, archive, membershipIntro and membershipCheckout already have their schemas and need no changes. affectedAreasMap and redressCalculator are built and only need registering.
Every block, at a glance
Fourteen new blocks, one new variant of an existing one, two already built and waiting to be registered, and fifteen that carry live content unchanged.
Every block also carries the shared Settings group
The existing meta field from src/blocks/_shared/meta.ts. It is assumed on all thirteen and is not repeated in the tables below.
Field
Type
Notes
meta.hidden
checkbox
optional
Hide the block without deleting it. Still renders in draft preview.
meta.background
select
optional
none · primary · accent · pattern. Stored as bg.
meta.paddingTop / paddingBottom
select
optional
none · small · medium · large. Stored as pt / pb.
meta.marginTop / marginBottom
select
optional
Same scale. Stored as mt / mb.
Postgres note. Every select below carries a short dbName for the same reason meta does — generated enum identifiers must stay under the 63-character limit.
01 · Journey Phases
journeyPhasesServer component
The four scheme phases with a “you are here” state. Sits at the top of the scheme hub and repeats on every phase page, so a reader always knows how far through they are.
Editable fields
Field
Type
Notes
heading
text
optional
Defaults to a visually-hidden “Where you are in the process”.
phases
array2–6
required
One entry per phase.
title
text
required
“Preparing your application”
caption
text
optional
“Steps 1–7 · Pre-application to decision”. Replaced by the state label when the phase is current.
state
select
required
upcoming · current · done. Stored as st. Only one phase should be current per page.
link
link
optional
The whole tile is the link. Omit on the current phase.
Numerals are generated from array order, not authored — reordering phases renumbers them. Design: a four-cell bento row. Done sits on soft pink with a check, current is the plum tile that anchors the row, upcoming is white with the hairline.
The flagship. Numbered steps inside a phase, each with the portal status it maps to, the documents needed, and the tips that make it survivable. This is the site’s most task-critical content.
Editable fields
Field
Type
Notes
eyebrow
text
optional
“Phase 1 of 4 · Steps 1–7”
heading
text
optional
Omit when the page title already says it.
startNumber
number
default 1
Phase 2 starts at 16, phase 3 at 23. Numerals continue from here.
steps
arraymin 1
required
One card per step.
title
text
required
“Get professional advice — the Building Condition Assessment”
portalStatus
text
optional
The literal status shown in the council portal, e.g. “BCA required”. Rendered as a pill chip.
body
textarea
required
Plain prose. No rich text — the panels below carry the structure.
documents
array of text
optional
“Documents needed”. Omitting the array hides the panel.
tips
array of text
optional
“Tips”. Same — empty means no panel.
links
linkGroupmax 3
optional
Descriptive labels only. The link component already forbids “Find out more”.
Each step renders with id="step-{n}" so pageAnchorNav can target it. Design: a white card with the numeral in a 52px soft-pink icon tile, and an inner two-cell bento — admin on the neutral band, reassurance on soft pink — so paperwork and human help are visibly separated.
Resulting component
03
Get professional advice — the Building Condition Assessment
Portal status: BCA required
A Building Condition Assessment must be carried out by a registered engineer, architect or chartered surveyor. This is the document the whole application rests on.
Anchor navigation for the long evidence pages — The Science, Finance, Exclusions, the EU dimension. Needs a client component for scroll-spy.
Editable fields
Field
Type
Notes
heading
text
default On this page
Renders as the nav landmark’s <h2>.
items
arraymin 2
required
Authored rather than derived, so the labels can be shorter than the headings.
label
text
required
“Statutory exclusions”
anchor
text
required
The target id, without the #.
sticky
checkbox
default true
Sticky rail on desktop. Always a scrolling pill row below 1000px.
Uses the existing HashScroll component, and respects prefers-reduced-motion by jumping rather than smooth-scrolling. Design: pills sit on soft pink at rest and flip to plum when their section is in view.
Resulting component
04 · Previous / Next
pagerNavServer component
Moves a reader through an ordered sequence — the four scheme phases, or step ranges within them.
Editable fields
Field
Type
Notes
previous
group
optional
Omit on the first page in a sequence — the next card then spans full width.
title
text
required
“Phase 1 — Preparing your application”
link
link
required
Internal page reference.
next
group
optional
Same shape. Omit on the last page.
title
text
required
link
link
required
The “Back” / “Next” direction labels are generated, not authored, so they stay consistent across every sequence.
Year-grouped, newest first, with sources attached to each event. Carries The Science page and the EU dimension — the two places where the evidence trail is the argument.
Editable fields
Field
Type
Notes
eyebrow
text
optional
heading
text
optional
intro
textarea
optional
groups
arraymin 1
required
One per year or year range.
year
text
required
Text, not a date — it has to hold “2020–2022”.
events
arraymin 1
required
events.badge
text
optional
“March 2023 · Peer review”
events.title
text
required
events.points
array of text
optional
Bullet summary of what happened.
events.noteLabel
select
optional
critique · limitation · impact · why. Stored as nl. Drives the bolded lead-in.
events.note
textarea
optional
The analysis panel. Hidden if empty.
events.sources
array
optional
label + url. Rendered as underlined inline links.
Groups render in authored order — the editor controls chronology, the block does not sort. Design: sticky year in rose beside event cards joined by a hairline with rose dots; the note panel sits on soft pink.
Resulting component
2023
March 2023 · Peer review
Peer-reviewed research overturns the mica hypothesis
Muscovite mica shown not to be the principal cause of block failure
Pyrrhotite and other iron sulphides identified as the driver
Critique: the State had built a decade of policy and public messaging around “mica”.
Two-sided eligibility: what the scheme covers against what it does not. The single most-asked question on the site.
Editable fields
Field
Type
Notes
heading
text
optional
intro
textarea
optional
includedTitle
text
default Covered
Editable so it can read “Eligible” or “In scope” elsewhere.
included
arraymin 1
required
title
text
required
“Private homes”
description
text
optional
The qualifying condition, one line.
excludedTitle
text
default Not covered
excluded
arraymin 1
required
Same shape as included.
Design: uses the two poles of the palette — soft pink for covered, plum for not covered. The distinction is carried by the column heading and the ✓ / ✕ glyph as well, never by colour alone.
Resulting component
Covered
Private homesYour principal private residence
Social housingCouncil and approved housing body dwellings
Not covered
Apartments and duplexesA separate scheme has been promised, not delivered
Holiday and second homesOnly a principal private residence qualifies
07 · Callout Box
calloutBoxServer component
A page-level aside. The existing banner block only works inside rich text; this is its sibling for the layout builder.
Editable fields
Field
Type
Notes
variant
select
required
info · support · urgent · success. Stored as var. Default info.
heading
text
optional
Renders as <h3>. Omit for a single-paragraph note.
body
richText
required
Rich text so inline links work — the “if this feels like too much” note needs to link to support mid-sentence.
Rich text is restricted to paragraphs, links and emphasis — no headings, no nested blocks. Design: 16px radius, deliberately under card scale so it reads as a note rather than a section.
Resulting component — all four variants
Information
Neutral, on the alternate band. Context and definitions.
What we can and can’t help with
Soft pink. Reassurance and limits honestly stated, help before caveats.
Time limits apply
Plum with an inset rose bar. Deadlines and appeal windows — anything with a cost to missing it.
Scheme now open in your county
Positive status, using the success token as a dot rather than a fill.
08 · Crisis Banner
crisisBannerServer component
The helpline strip. The audit’s loudest finding was that this pathway rendered at 2.9:1 with no focus ring; this block makes it the heaviest element on any page it appears on.
Editable fields
Field
Type
Notes
eyebrow
text
optional
“Helplines & immediate support”
heading
text
required
Default “You are not alone.”
intro
textarea
optional
lines
array1–4
required
Capped at four — past that it stops reading as urgent.
name
text
required
“Pieta House”
value
text
required
What the reader sees: “1800 247 247”.
type
select
required
phone · text · web. Stored as ty. Chooses tel: / sms: / https:.
target
text
required
The dialable form, e.g. 1800247247. Kept separate so the display value can be spaced for legibility.
link
link
optional
“More emotional and mental-health support”.
fullBleed
checkbox
default false
Edge-to-edge band instead of a rounded panel. Used at the top of the support page.
Design: solid rose pills on plum — the one deliberate exception in the system. White on rose is 5.05:1; every helpline is a real link with a visible focus ring.
Resulting component
Helplines & immediate support
You are not alone.
Free, open now, and you do not need to be in crisis to call.
peopleGridServer componentNeeds the People collection
The TD and four councillors. Queries a new People collection so a councillor’s phone number is edited once and correct everywhere.
Editable fields
Field
Type
Notes
eyebrow
text
optional
heading
text
optional
intro
textarea
optional
populateBy
select
default collection
collection · selection. Stored as pop. Mirrors the existing archive block exactly.
limit
number
default 5
Only when populating by collection.
selectedDocs
relationship
conditional
→ people, hasMany. Only when populating by selection.
featureFirst
checkbox
default true
First result renders as the large feature card. Off gives an even grid.
The People collection holds name, role, area (LEA), portrait, bio, priorities[], email, phone, socials[], featured, slug and an SEO tab — and gives each person a detail page at /people/<slug>. Design: an asymmetric bento — one large feature card beside a 2×2.
Two of five shown. The full asymmetric layout is on Our people.
11 · Pull Quote
pullQuoteServer component
Resident testimony and campaign lines. Two tones so the human register and the campaigning one never blur together.
Editable fields
Field
Type
Notes
quote
textarea
required
Plain text. Quotation marks are supplied by the component.
attribution
text
optional
“A homeowner in Letterkenny”. Kept non-identifying by default.
tone
select
default support
support (soft pink) · campaign (plum). Stored as tn.
The mark behind the text is the Tabler quote glyph rendered inline at 104px and low opacity, inheriting currentColor — not a typographic “ character, which sets inconsistently across the two typefaces.
Resulting component — all three tones
I started with just one phone call a week.
A homeowner in Letterkenny
It felt good just to be heard by someone who knew exactly what we were going through.
A homeowner in Carndonagh
Homeowners did nothing wrong.
100% Redress Party
12 · References
referencesServer component
Citations and further reading. The Science page rests on six peer-reviewed studies, and the credibility of the whole argument rests on them being visible.
Editable fields
Field
Type
Notes
eyebrow
text
optional
heading
text
default Further reading
intro
textarea
optional
items
arraymin 1
required
Numbering is generated from array order.
title
text
required
The paper title. Becomes the link text.
url
text
optional
DOI or publisher URL. Without one, the title renders as plain text.
source
text
optional
Journal, author or DOI string, shown beneath.
Design: reuses the article prose style’s leading-zero numerals, on the neutral band so it reads as an appendix rather than body copy.
The numbers that carry the argument — 1,000+ social homes cracking, 3,150+ households waiting, 43 homeowners left behind by a cut-off date.
Editable fields
Field
Type
Notes
eyebrow
text
optional
heading
text
optional
figures
array2–4
required
Capped at four — a fifth stops being a headline.
value
text
required
Text, not a number — it has to hold “3,150+”, “29%” and “ISA”.
caption
text
required
What the figure counts. Should stand alone out of context.
highlight
checkbox
default false
Inverts that one tile to soft pink.
source
text
optional
Where the figure comes from. Rendered as a footnote under the row.
Design: generalises the hero’s plum stat tile into a row of two to four. One highlighted cell breaks the rhythm — the same asymmetry the hero uses.
Resulting component
1,000+social homes showing visible cracking
3,150+households on Donegal waiting lists
29%rise in average weekly rents, 2016–2022
43homeowners left behind by the cut-off
14 · Media Banner
mediaBannerServer component+ small client script
A full-bleed photograph carrying a headline and a CTA. The audit’s sharpest criticism of the current site was that it shows none of the subject matter — cracked walls, families in limbo — on a site whose whole reason for existing is that homes are falling down. This is the block that fixes that.
Editable fields
Field
Type
Notes
image
upload → media
required
Alt text is enforced by the Media collection. Decorative is not an option here — the image is the argument.
eyebrow
text
optional
“Ballybofey, February”. Doubles as a place-and-date caption.
heading
text
required
body
textarea
optional
Two lines at most over an image.
links
linkGroupmax 2
optional
First renders solid rose, second white.
effect
select
default static
static · parallax. Stored as fx.
parallaxRange
number
default 70
Pixels of drift across a full viewport of scroll. Only when effect is parallax.
height
select
default standard
standard · tall. Stored as h.
fullBleed
checkbox
default false
Edge-to-edge rather than a rounded panel inside the content width.
scrim
select
default standard
light · standard · heavy. Stored as sc. Raise it when the photograph is bright enough to threaten the 4.5:1 on the headline.
Parallax is transform-based, not background-attachment: fixed — that is ignored on iOS and cannot be disabled per element. The media layer is inset -14% so the drift never exposes an edge, the scroll handler is requestAnimationFrame-throttled and passive, and the whole effect is switched off under prefers-reduced-motion. That is the only client-side JavaScript in the thirteen.
Resulting component — effect: static
◎ Photo
Ballybofey, February
Every one of these homes was signed off as safe.
Stepped cracking through the outer leaf, widening every winter.
Not a new block. A third value on the style select that ctaBanner already has, for the one call to action per page that has to outrank everything else on it.
The change
Field
Type
Notes
style
select
existing
Currently plain · panel. Add accent. One migration, no new table.
Plum panel stays the default; deep red is the escalation, and a page should carry at most one. White on #C1443A is 5.05:1, so headline and body are both plain white and the buttons invert to #A5372F-on-white at 6.4:1.
Resulting component
Join the people fighting for full redress.
€10 a year. No corporate money, no special interests, every euro accounted for.
A MapLibre choropleth of Ireland showing the affected counties, with a legend and a figures table. Already written and staged on /debug — it needs promoting, not building.
Existing fields
Field
Type
Notes
eyebrow / heading / intro
text
optional
Standard section head.
focus
select
existing
ireland · west · donegal. Stored as foc.
showTable
checkbox
existing
Figures table beneath the map.
caption
text
existing
To promote: add to the layout array in Pages/index.ts, to blockComponentsandselfSpaced in RenderBlocks.tsx, then migrate and regenerate types. The checklist is already written in the block’s own config.ts.
Redress Calculator
redressCalculatorBuilt · not registered
Grant estimate against the published statutory rates, with the shortfall against real rebuild cost. Also staged on /debug. Shown in place on Applying to the scheme.
Existing fields
Field
Type
Notes
eyebrow / heading / intro
text
optional
showShortfall
checkbox
existing
Whether to show the gap against real rebuild cost as well as the grant.
footnote
text
existing
The rates themselves live in rates.ts as hard-coded statutory figures and are deliberately not CMS-editable — they are set by regulation, not by us, and an editable copy would drift.
Fourteen blocks, one new collection, one promotion pass.
Sign off this spec and the next step is config.ts + Component.tsx for each, preview SVGs, migrations, then the seed.