From 345741f83fc6b0e20e8d6efe2b9182ae9c9c47ca Mon Sep 17 00:00:00 2001 From: Alex Dunmow Date: Mon, 6 Jul 2026 20:05:50 +0800 Subject: [PATCH] fix(noir): full-bleed hero in hero slot, drop cream vignette over hero image, caption below frame, 9-para case file MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Seed: home hero -> landing 'hero' slot (full-bleed) and cta -> 'cta' slot; reconcile_blocks on home + harbour-light so demo re-install rewrites them. - Hero: remove noir-spotlight from the image wrapper and the landing hero-slot wrapper — its radial vignette fades the photo to --background (cream in light mode) exactly where the onImg white text sits. Image + black scrim now carry legibility in both modes. - Image override: figure is column-flex so the typed caption sits under the evidence frame (was landing beside it); frames render grayscale to match the dossier persona. - Harbour Light article extended to 9 paragraphs (case-file voice) per the seed length gate. Co-Authored-By: Claude Fable 5 --- seed/seed.json | 10 ++++++---- templates/noir/landing.ninjatpl | 2 +- templates/overrides/noir/hero.ninjatpl | 2 +- templates/overrides/noir/image.ninjatpl | 4 ++-- 4 files changed, 10 insertions(+), 8 deletions(-) diff --git a/seed/seed.json b/seed/seed.json index c5eb7d3..32f9898 100644 --- a/seed/seed.json +++ b/seed/seed.json @@ -32,11 +32,12 @@ "slug": "/", "title": "The Cold File", "template_key": "landing", + "reconcile_blocks": true, "blocks": [ { "block_key": "hero", "title": "Hero", - "slot": "main", + "slot": "hero", "sort_order": 1, "content": { "template": "centered", @@ -103,8 +104,8 @@ { "block_key": "cta", "title": "Closing CTA", - "slot": "main", - "sort_order": 5, + "slot": "cta", + "sort_order": 1, "content": { "background": "band", "heading": "Know something we don't?", @@ -144,10 +145,11 @@ "title": "The Harbour Light", "template_key": "article", "parent_slug": "/blog", + "reconcile_blocks": true, "blocks": [ { "block_key": "heading", "title": "Title", "slot": "main", "sort_order": 1, "content": { "text": "The Harbour Light", "level": 1 } }, { "block_key": "image", "title": "The pier", "slot": "main", "sort_order": 2, "content": { "src": "7a1c0001-0000-4000-8000-000000000002", "alt": "The East Dock lost in night fog", "caption": "Pier 9, East Dock — the same hour we walked it.", "aspectRatio": "video", "size": "full", "objectFit": "cover" } }, - { "block_key": "rich-text", "title": "Body", "slot": "main", "sort_order": 3, "content": { "html": "

The watchman made his last radio check at four minutes past two. He was due at the gate by half past. He never signed out.

The lamp on Pier 9 was still lit at dawn. The tide had turned twice. No boat was reported missing. No body was found. The file was opened, worked for a season, and set aside.

We pulled the harbour master's log and the tide tables for that week. The two do not agree on when the water turned. One of them was written up after the fact, and we think we know which.

We walked the pier at the same hour. The lamp throws light about forty feet. The gate is ninety. For six of those steps a man is in the dark. We are still checking what stands in them.

" } }, + { "block_key": "rich-text", "title": "Body", "slot": "main", "sort_order": 3, "content": { "html": "

The watchman made his last radio check at four minutes past two. He was due at the gate by half past. He never signed out.

The lamp on Pier 9 was still lit at dawn. The tide had turned twice. No boat was reported missing. No body was found. The file was opened, worked for a season, and set aside.

Start with what the record holds. A duty roster with his name in the two-to-six column. A radio log with four entries in his hand, the last at 02:04, marked routine. A gate ledger that shows every man off the dock by three — every man but one.

The season it was worked, the file gathered the usual paper. Two dozen interviews. A diver's report for the water off the pier head, twice. A note from the gate man, who swore the light was burning when he cycled past at ten to three and swore just as hard that nobody stood under it.

Then the file stops. Not closed — stopped. The last page is a requisition for more diving time that nobody signed.

We pulled the harbour master's log and the tide tables for that week. The two do not agree on when the water turned. One of them was written up after the fact, and we think we know which.

We walked the pier at the same hour. The lamp throws light about forty feet. The gate is ninety. For six of those steps a man is in the dark. We are still checking what stands in them.

There is one more thing the record holds, and we set it down here exactly as it appears. The radio log's final line, in a different hand, timed 02:31: checked pier, all quiet. Nobody at the harbour that season would say whose hand it was.

The file is open. If you worked the East Dock in March 1998, or knew someone who did, the tip line is at the end of this page.

" } }, { "block_key": "heading", "title": "Rail heading", "slot": "aside", "sort_order": 1, "content": { "text": "Case File", "level": 3 } }, { "block_key": "text", "title": "Case metadata", "slot": "aside", "sort_order": 2, "content": { "text": "
Case No.
CF-0451
Filed
March 1998
Location
Pier 9, East Dock
Last contact
02:04, radio check
Status
Open, unsolved
" } } ] diff --git a/templates/noir/landing.ninjatpl b/templates/noir/landing.ninjatpl index 9fb3099..4e795d1 100644 --- a/templates/noir/landing.ninjatpl +++ b/templates/noir/landing.ninjatpl @@ -3,7 +3,7 @@ {{ head_html|safe }} {{ admin_banner_html|safe }} -
{{ slots.hero|safe }}
+
{{ slots.hero|safe }}
{% if slots.main %}
{{ slots.main|safe }}
{% endif %}
diff --git a/templates/overrides/noir/hero.ninjatpl b/templates/overrides/noir/hero.ninjatpl index 94145ed..137de26 100644 --- a/templates/overrides/noir/hero.ninjatpl +++ b/templates/overrides/noir/hero.ninjatpl @@ -34,7 +34,7 @@ {% set align = "center" %} {% if variant == "left-aligned" %}{% set align = "left" %}{% endif %}
-{% if hasImage %}
{% img backgroundImage alt=headlineText class="h-full w-full object-cover" layout="hero" %}{% if showOverlay %}
{% endif %}
{% endif %} +{% if hasImage %}
{% img backgroundImage alt=headlineText class="h-full w-full object-cover" layout="hero" %}{% if showOverlay %}
{% endif %}
{% endif %}
{{ herocontent(align, hasImage) }}
{% endif %} diff --git a/templates/overrides/noir/image.ninjatpl b/templates/overrides/noir/image.ninjatpl index 9f2b7aa..2644ce1 100644 --- a/templates/overrides/noir/image.ninjatpl +++ b/templates/overrides/noir/image.ninjatpl @@ -1,8 +1,8 @@ {# image override — square evidence frame with a typed mono caption. Fields mirror builtin: src, alt, caption, size, align, aspectRatio, objectFit. Media resolved via {% img %} (the media filter is not registered in the block render path). #} {% with size=size|default:"full" align=align|default:"center" objectFit=objectFit|default:"cover" %} -
+
-
+
{% if objectFit == "contain" %}{% img src alt=alt class="w-full h-full object-contain" layout=size %}{% elif objectFit == "fill" %}{% img src alt=alt class="w-full h-full object-fill" layout=size %}{% elif objectFit == "none" %}{% img src alt=alt class="w-full h-full object-none" layout=size %}{% else %}{% img src alt=alt class="w-full h-full object-cover" layout=size %}{% endif %}