fix(editorial): remediate hero dead-space, tiny titles, media balloon + mobile

Layout/whitespace:
- Hero: gate min-h-[75vh] + vertical-centering on hasImage so the text-only
  masthead no longer floats in ~800px of dead space; large display headline
  via CSS class (was collapsed to 0.72rem by editorial-caps clobbering text-6xl).
- Restore heading hierarchy: swap editorial-caps -> editorial-heading on every
  title/headline element (hero, card, newsletter, contact-form, cta, countdown,
  feature-grid, team, featured-posts, post-hero, menu-list, hours-location,
  author-bio-hero, password-reset-form). Masthead wordmarks (navbar/footer)
  keep editorial-caps by design.
- Home "river": constrain to a 48rem reading measure and add vertical rhythm
  (editorial-river/editorial-flow CSS) so stacked essay cards stop fusing into
  one seam-y block and body text no longer runs full-bleed wide.
- Newsletter: remove stray empty double-hairline artifact (single centered rule).
- Image: guard empty src so absent media no longer renders an empty muted box.

Mobile / JIT-safety:
- New width/spacing/hero-title behavior defined as theme CSS in manifest
  input_css_append (not JIT-scanned Tailwind), so it always compiles.
- Marginalia stack breakpoint widened 768px -> 1023px to match the article
  grid collapse, so the rail always gets its separator when stacked.

Build + check-safety green (32 checks: 19 ok 13 skip). No version bump.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
Alex Dunmow 2026-07-05 17:25:31 +08:00
parent 28a201a33a
commit 10cecadef6
17 changed files with 48 additions and 21 deletions

View File

@ -159,6 +159,33 @@ css:
} }
} }
/* --- Home "river" reading column + vertical rhythm ---
* CSS-defined (not JIT Tailwind) so width + spacing always compile.
* Keeps the essay list at a comfortable measure and stops stacked
* cards from fusing into one seam-y block. */
.editorial-river {
max-width: 48rem;
margin-left: auto;
margin-right: auto;
padding-left: 1rem;
padding-right: 1rem;
}
.editorial-flow > * + * { margin-top: 2rem; }
/* --- Hero display title — responsive size via media queries so it is
* independent of the host Tailwind JIT (large text-* combos in theme
* templates are not reliably scanned). --- */
.editorial-hero-title {
font-family: var(--font-heading, "Playfair Display", Georgia, serif);
font-weight: 700;
letter-spacing: -0.015em;
line-height: 1.1;
color: hsl(var(--foreground));
font-size: 2.25rem;
}
@media (min-width: 640px) { .editorial-hero-title { font-size: 3rem; } }
@media (min-width: 1024px) { .editorial-hero-title { font-size: 3.5rem; } }
/* --- Narrow prose column with indented continuation paragraphs --- */ /* --- Narrow prose column with indented continuation paragraphs --- */
.prose-editorial { .prose-editorial {
max-width: var(--editorial-measure); max-width: var(--editorial-measure);
@ -381,7 +408,7 @@ css:
@media (prefers-reduced-motion: reduce) { @media (prefers-reduced-motion: reduce) {
.editorial-marginalia aside { animation: none; opacity: 1; } .editorial-marginalia aside { animation: none; opacity: 1; }
} }
@media (max-width: 768px) { @media (max-width: 1023px) {
.editorial-marginalia { .editorial-marginalia {
margin-top: 1.5rem; margin-top: 1.5rem;
border-top: var(--editorial-rule); border-top: var(--editorial-rule);

View File

@ -6,7 +6,7 @@
{% if slots.masthead %}<header class="w-full">{{ slots.masthead|safe }}</header>{% endif %} {% if slots.masthead %}<header class="w-full">{{ slots.masthead|safe }}</header>{% endif %}
<main class="flex-grow w-full"> <main class="flex-grow w-full">
{% if slots.lead %}<section class="editorial-wide py-10 md:py-14">{{ slots.lead|safe }}</section>{% endif %} {% if slots.lead %}<section class="editorial-wide py-10 md:py-14">{{ slots.lead|safe }}</section>{% endif %}
{% if slots.river %}<section class="editorial-wide pb-10 md:pb-16"><hr class="editorial-rule mb-10">{{ slots.river|safe }}</section>{% endif %} {% if slots.river %}<section class="pb-10 md:pb-16"><div class="editorial-river editorial-flow"><hr class="editorial-rule">{{ slots.river|safe }}</div></section>{% endif %}
</main> </main>
{% if slots.footer %}<footer class="w-full mt-auto">{{ slots.footer|safe }}</footer>{% endif %} {% if slots.footer %}<footer class="w-full mt-auto">{{ slots.footer|safe }}</footer>{% endif %}
{{ body_end_html|safe }} {{ body_end_html|safe }}

View File

@ -4,7 +4,7 @@
<div class="mx-auto flex max-w-3xl flex-col items-center px-4 text-center"> <div class="mx-auto flex max-w-3xl flex-col items-center px-4 text-center">
{% if showAvatar and author.avatar_url %}<div class="mb-6 h-24 w-24 overflow-hidden rounded-full bg-muted ring-1 ring-[hsl(var(--border))]">{% img author.avatar_url alt=author.display_name class="h-full w-full object-cover" %}</div>{% endif %} {% if showAvatar and author.avatar_url %}<div class="mb-6 h-24 w-24 overflow-hidden rounded-full bg-muted ring-1 ring-[hsl(var(--border))]">{% img author.avatar_url alt=author.display_name class="h-full w-full object-cover" %}</div>{% endif %}
<div class="mb-4 flex items-center justify-center gap-4"><span class="editorial-rule w-12"></span><span class="editorial-rule w-12"></span></div> <div class="mb-4 flex items-center justify-center gap-4"><span class="editorial-rule w-12"></span><span class="editorial-rule w-12"></span></div>
<h1 class="editorial-caps text-3xl md:text-4xl text-foreground" style="font-family:var(--font-heading, &quot;Playfair Display&quot;, Georgia, serif)">{{ author.display_name }}</h1> <h1 class="editorial-heading text-3xl md:text-4xl text-foreground" style="font-family:var(--font-heading, &quot;Playfair Display&quot;, Georgia, serif)">{{ author.display_name }}</h1>
{% if author.job_title or author.company %}<p class="editorial-caps mt-2 text-sm text-muted-foreground">{{ author.job_title }}{% if author.job_title and author.company %} · {% endif %}{{ author.company }}</p>{% endif %} {% if author.job_title or author.company %}<p class="editorial-caps mt-2 text-sm text-muted-foreground">{{ author.job_title }}{% if author.job_title and author.company %} · {% endif %}{{ author.company }}</p>{% endif %}
{% if author.bio %}<p class="mt-5 max-w-2xl leading-relaxed text-muted-foreground" style="font-family:var(--font-body, &quot;Source Serif 4&quot;, &quot;Source Serif Pro&quot;, Georgia, serif)">{{ author.bio }}</p>{% endif %} {% if author.bio %}<p class="mt-5 max-w-2xl leading-relaxed text-muted-foreground" style="font-family:var(--font-body, &quot;Source Serif 4&quot;, &quot;Source Serif Pro&quot;, Georgia, serif)">{{ author.bio }}</p>{% endif %}
<div class="mt-6 flex flex-wrap items-center justify-center gap-4 text-sm text-muted-foreground"> <div class="mt-6 flex flex-wrap items-center justify-center gap-4 text-sm text-muted-foreground">

View File

@ -1,4 +1,4 @@
{# card override — editorial hairline panel; accent border on hover, oxblood link. Fields mirror builtin: layout, link, media, title, text, linkLabel. Media via {% img %}. #} {# card override — editorial hairline panel; accent border on hover, oxblood link. Fields mirror builtin: layout, link, media, title, text, linkLabel. Media via {% img %}. #}
{% with layout=layout|default:"vertical" %} {% with layout=layout|default:"vertical" %}
<article data-block-override="editorial:card" class="bn-card editorial-panel overflow-hidden bg-card text-card-foreground transition-colors hover:border-[hsl(var(--accent))] {% if layout == "horizontal" %}flex flex-col sm:flex-row{% endif %}{% if class %} {{ class }}{% endif %}">{% if link %}<a href="{{ link }}" class="contents">{% endif %}{% if media %}<div class="overflow-hidden bg-muted {% if layout == "horizontal" %}sm:w-2/5 sm:shrink-0{% endif %}">{% if layout == "horizontal" %}{% img media alt=title|default:"" class="h-full w-full object-cover" %}{% else %}{% img media alt=title|default:"" class="aspect-video h-full w-full object-cover" %}{% endif %}</div>{% endif %}<div class="flex flex-col gap-2 p-5 md:p-6 {% if layout == "horizontal" %}justify-center{% endif %}">{% if title %}<h3 class="editorial-caps text-lg" style="font-family:var(--font-heading, 'Playfair Display', Georgia, serif);color:hsl(var(--foreground));">{{ title }}</h3>{% endif %}{% if text %}<div class="text-sm leading-relaxed" style="color:hsl(var(--muted-foreground));font-family:var(--font-body, 'Source Serif 4', 'Source Serif Pro', Georgia, serif);">{{ text|safe }}</div>{% endif %}{% if linkLabel and link %}<span class="mt-2 inline-flex items-center gap-1 text-sm editorial-link">{{ linkLabel }}::lucide:arrow-right:sm::</span>{% endif %}</div>{% if link %}</a>{% endif %}</article> <article data-block-override="editorial:card" class="bn-card editorial-panel overflow-hidden bg-card text-card-foreground transition-colors hover:border-[hsl(var(--accent))] {% if layout == "horizontal" %}flex flex-col sm:flex-row{% endif %}{% if class %} {{ class }}{% endif %}">{% if link %}<a href="{{ link }}" class="contents">{% endif %}{% if media %}<div class="overflow-hidden bg-muted {% if layout == "horizontal" %}sm:w-2/5 sm:shrink-0{% endif %}">{% if layout == "horizontal" %}{% img media alt=title|default:"" class="h-full w-full object-cover" %}{% else %}{% img media alt=title|default:"" class="aspect-video h-full w-full object-cover" %}{% endif %}</div>{% endif %}<div class="flex flex-col gap-2 p-5 md:p-6 {% if layout == "horizontal" %}justify-center{% endif %}">{% if title %}<h3 class="editorial-heading text-lg" style="font-family:var(--font-heading, 'Playfair Display', Georgia, serif);color:hsl(var(--foreground));">{{ title }}</h3>{% endif %}{% if text %}<div class="text-sm leading-relaxed" style="color:hsl(var(--muted-foreground));font-family:var(--font-body, 'Source Serif 4', 'Source Serif Pro', Georgia, serif);">{{ text|safe }}</div>{% endif %}{% if linkLabel and link %}<span class="mt-2 inline-flex items-center gap-1 text-sm editorial-link">{{ linkLabel }}::lucide:arrow-right:sm::</span>{% endif %}</div>{% if link %}</a>{% endif %}</article>
{% endwith %} {% endwith %}

View File

@ -9,7 +9,7 @@
</div> </div>
{% else %} {% else %}
<div class="text-center"> <div class="text-center">
{% if heading %}<h2 class="editorial-caps text-3xl md:text-4xl" style="font-family:var(--font-heading, 'Playfair Display', Georgia, serif);color:hsl(var(--foreground));">{{ heading }}</h2>{% endif %} {% if heading %}<h2 class="editorial-heading text-3xl md:text-4xl" style="font-family:var(--font-heading, 'Playfair Display', Georgia, serif);color:hsl(var(--foreground));">{{ heading }}</h2>{% endif %}
{% if description %}<p class="mt-3 text-lg italic" style="color:hsl(var(--muted-foreground));font-family:var(--font-body, 'Source Serif 4', 'Source Serif Pro', Georgia, serif);">{{ description }}</p>{% endif %} {% if description %}<p class="mt-3 text-lg italic" style="color:hsl(var(--muted-foreground));font-family:var(--font-body, 'Source Serif 4', 'Source Serif Pro', Georgia, serif);">{{ description }}</p>{% endif %}
<span class="editorial-rule w-16 mx-auto mt-5 mb-2 block" aria-hidden="true"></span> <span class="editorial-rule w-16 mx-auto mt-5 mb-2 block" aria-hidden="true"></span>
</div> </div>

View File

@ -1,6 +1,6 @@
<section data-block-override="editorial:countdown" class="py-16 md:py-24 bg-background text-foreground{% if class %} {{ class }}{% endif %}"> <section data-block-override="editorial:countdown" class="py-16 md:py-24 bg-background text-foreground{% if class %} {{ class }}{% endif %}">
<div class="mx-auto max-w-4xl px-4 text-center"> <div class="mx-auto max-w-4xl px-4 text-center">
{% if heading %}<h2 class="editorial-caps text-3xl tracking-tight md:text-4xl" style="font-family:var(--font-heading, 'Playfair Display', Georgia, serif)">{{ heading }}</h2>{% endif %} {% if heading %}<h2 class="editorial-heading text-3xl tracking-tight md:text-4xl" style="font-family:var(--font-heading, 'Playfair Display', Georgia, serif)">{{ heading }}</h2>{% endif %}
{% if intro %}<p class="mx-auto mt-4 max-w-2xl text-lg text-muted-foreground" style="font-family:var(--font-body, 'Source Serif 4', 'Source Serif Pro', Georgia, serif)">{{ intro }}</p>{% endif %} {% if intro %}<p class="mx-auto mt-4 max-w-2xl text-lg text-muted-foreground" style="font-family:var(--font-body, 'Source Serif 4', 'Source Serif Pro', Georgia, serif)">{{ intro }}</p>{% endif %}
<div class="mt-10" data-countdown> <div class="mt-10" data-countdown>
<div class="flex items-start justify-center gap-3 sm:gap-6" data-countdown-timer data-target="{{ target }}" role="timer" aria-label="Time remaining"> <div class="flex items-start justify-center gap-3 sm:gap-6" data-countdown-timer data-target="{{ target }}" role="timer" aria-label="Time remaining">
@ -10,7 +10,7 @@
<div class="flex flex-col items-center {% if variant == "boxes" %}editorial-panel min-w-[4.5rem] bg-card px-3 py-4 text-card-foreground{% endif %}"><span class="text-4xl font-bold tabular-nums text-[hsl(var(--accent))] sm:text-5xl" style="font-family:var(--font-mono)" data-unit="seconds">--</span><span class="editorial-caps mt-1 text-xs text-muted-foreground">{{ labelSeconds|default:"Seconds" }}</span></div> <div class="flex flex-col items-center {% if variant == "boxes" %}editorial-panel min-w-[4.5rem] bg-card px-3 py-4 text-card-foreground{% endif %}"><span class="text-4xl font-bold tabular-nums text-[hsl(var(--accent))] sm:text-5xl" style="font-family:var(--font-mono)" data-unit="seconds">--</span><span class="editorial-caps mt-1 text-xs text-muted-foreground">{{ labelSeconds|default:"Seconds" }}</span></div>
</div> </div>
<div class="mt-8 hidden" data-countdown-expired> <div class="mt-8 hidden" data-countdown-expired>
<p class="editorial-caps text-xl" style="font-family:var(--font-heading, 'Playfair Display', Georgia, serif)">{{ expiredMessage|default:"This has started." }}</p> <p class="editorial-heading text-xl" style="font-family:var(--font-heading, 'Playfair Display', Georgia, serif)">{{ expiredMessage|default:"This has started." }}</p>
{% if expiredUrl and expiredLabel %}<a href="{{ expiredUrl }}" class="editorial-button mt-4 inline-flex items-center gap-2">{{ expiredLabel }}<svg class="h-4 w-4" aria-hidden="true"><use href="/icons/lucide.svg#arrow-right"></use></svg></a>{% endif %} {% if expiredUrl and expiredLabel %}<a href="{{ expiredUrl }}" class="editorial-button mt-4 inline-flex items-center gap-2">{{ expiredLabel }}<svg class="h-4 w-4" aria-hidden="true"><use href="/icons/lucide.svg#arrow-right"></use></svg></a>{% endif %}
</div> </div>
</div> </div>

View File

@ -2,7 +2,7 @@
<div class="mx-auto max-w-6xl px-4"> <div class="mx-auto max-w-6xl px-4">
<div class="{% if background == "band" %}editorial-panel px-6 py-14 text-center text-card-foreground md:px-12{% elif background == "card" %}editorial-panel bg-card px-6 py-14 text-center text-card-foreground md:px-12{% else %}editorial-panel flex flex-col items-center gap-8 bg-muted px-6 py-12 text-foreground md:flex-row md:justify-between md:px-12 md:text-left{% endif %}"> <div class="{% if background == "band" %}editorial-panel px-6 py-14 text-center text-card-foreground md:px-12{% elif background == "card" %}editorial-panel bg-card px-6 py-14 text-center text-card-foreground md:px-12{% else %}editorial-panel flex flex-col items-center gap-8 bg-muted px-6 py-12 text-foreground md:flex-row md:justify-between md:px-12 md:text-left{% endif %}">
<div class="{% if background != "split" %}mx-auto max-w-2xl{% endif %}"> <div class="{% if background != "split" %}mx-auto max-w-2xl{% endif %}">
{% if heading %}<h2 class="editorial-caps text-3xl tracking-tight md:text-4xl" style="font-family:var(--font-heading, 'Playfair Display', Georgia, serif)">{{ heading }}</h2>{% endif %} {% if heading %}<h2 class="editorial-heading text-3xl tracking-tight md:text-4xl" style="font-family:var(--font-heading, 'Playfair Display', Georgia, serif)">{{ heading }}</h2>{% endif %}
{% if text %}<p class="mt-3 text-lg {% if background == "band" %}text-muted-foreground{% else %}text-muted-foreground{% endif %}" style="font-family:var(--font-body, 'Source Serif 4', 'Source Serif Pro', Georgia, serif)">{{ text }}</p>{% endif %} {% if text %}<p class="mt-3 text-lg {% if background == "band" %}text-muted-foreground{% else %}text-muted-foreground{% endif %}" style="font-family:var(--font-body, 'Source Serif 4', 'Source Serif Pro', Georgia, serif)">{{ text }}</p>{% endif %}
</div> </div>
<div class="flex flex-wrap items-center justify-center gap-3 {% if background != "split" %}mt-8{% else %}shrink-0{% endif %}"> <div class="flex flex-wrap items-center justify-center gap-3 {% if background != "split" %}mt-8{% else %}shrink-0{% endif %}">

View File

@ -7,7 +7,7 @@
{% for item in items %} {% for item in items %}
<div class="{% if layout == "card" %}editorial-panel bg-card p-6 text-card-foreground hover:border-[hsl(var(--accent))] transition-shadow{% elif layout == "centered" %}text-center{% endif %}"> <div class="{% if layout == "card" %}editorial-panel bg-card p-6 text-card-foreground hover:border-[hsl(var(--accent))] transition-shadow{% elif layout == "centered" %}text-center{% endif %}">
{% if item.icon %}<div class="mb-4 inline-flex h-11 w-11 items-center justify-center border border-[hsl(var(--border))] bg-muted text-[hsl(var(--accent))]{% if layout == "centered" %} mx-auto{% endif %}"><svg class="h-6 w-6" aria-hidden="true"><use href="/icons/{{ item.icon|split:":"|first }}.svg#{{ item.icon|split:":"|last }}"></use></svg></div>{% endif %} {% if item.icon %}<div class="mb-4 inline-flex h-11 w-11 items-center justify-center border border-[hsl(var(--border))] bg-muted text-[hsl(var(--accent))]{% if layout == "centered" %} mx-auto{% endif %}"><svg class="h-6 w-6" aria-hidden="true"><use href="/icons/{{ item.icon|split:":"|first }}.svg#{{ item.icon|split:":"|last }}"></use></svg></div>{% endif %}
<h3 class="editorial-caps text-lg text-foreground" style="font-family:var(--font-heading, 'Playfair Display', Georgia, serif)">{% if item.linkUrl %}<a href="{{ item.linkUrl }}" class="transition-colors hover:text-[hsl(var(--accent))]">{{ item.title }}</a>{% else %}{{ item.title }}{% endif %}</h3> <h3 class="editorial-heading text-lg text-foreground" style="font-family:var(--font-heading, 'Playfair Display', Georgia, serif)">{% if item.linkUrl %}<a href="{{ item.linkUrl }}" class="transition-colors hover:text-[hsl(var(--accent))]">{{ item.title }}</a>{% else %}{{ item.title }}{% endif %}</h3>
{% if item.text %}<p class="mt-2 text-muted-foreground" style="font-family:var(--font-body, 'Source Serif 4', 'Source Serif Pro', Georgia, serif)">{{ item.text }}</p>{% endif %} {% if item.text %}<p class="mt-2 text-muted-foreground" style="font-family:var(--font-body, 'Source Serif 4', 'Source Serif Pro', Georgia, serif)">{{ item.text }}</p>{% endif %}
{% if item.linkUrl and item.linkLabel %}<a href="{{ item.linkUrl }}" class="editorial-link mt-3 inline-flex items-center gap-1 text-sm">{{ item.linkLabel }}<svg class="h-4 w-4" aria-hidden="true"><use href="/icons/lucide.svg#arrow-right"></use></svg></a>{% endif %} {% if item.linkUrl and item.linkLabel %}<a href="{{ item.linkUrl }}" class="editorial-link mt-3 inline-flex items-center gap-1 text-sm">{{ item.linkLabel }}<svg class="h-4 w-4" aria-hidden="true"><use href="/icons/lucide.svg#arrow-right"></use></svg></a>{% endif %}
</div> </div>

View File

@ -8,7 +8,7 @@
<article class="editorial-panel group flex flex-col overflow-hidden bg-card text-card-foreground transition-shadow"> <article class="editorial-panel group flex flex-col overflow-hidden bg-card text-card-foreground transition-shadow">
{% if showFeaturedImage and post.featured_image_url %}<a href="{{ post.url }}" class="block aspect-video overflow-hidden bg-muted">{% img post.featured_image_url alt=post.title class="h-full w-full object-cover transition-transform duration-500 group-hover:scale-105" %}</a>{% endif %} {% if showFeaturedImage and post.featured_image_url %}<a href="{{ post.url }}" class="block aspect-video overflow-hidden bg-muted">{% img post.featured_image_url alt=post.title class="h-full w-full object-cover transition-transform duration-500 group-hover:scale-105" %}</a>{% endif %}
<div class="flex flex-1 flex-col p-6 text-center"> <div class="flex flex-1 flex-col p-6 text-center">
<h3 class="editorial-caps text-lg leading-snug text-card-foreground" style="font-family:var(--font-heading, &quot;Playfair Display&quot;, Georgia, serif)"><a href="{{ post.url }}" class="transition-colors hover:text-[hsl(var(--accent))]">{{ post.title }}</a></h3> <h3 class="editorial-heading text-lg leading-snug text-card-foreground" style="font-family:var(--font-heading, &quot;Playfair Display&quot;, Georgia, serif)"><a href="{{ post.url }}" class="transition-colors hover:text-[hsl(var(--accent))]">{{ post.title }}</a></h3>
<span class="editorial-rule mx-auto mt-3 block w-10"></span> <span class="editorial-rule mx-auto mt-3 block w-10"></span>
{% if showExcerpt and post.excerpt %}<p class="mt-3 flex-1 text-sm text-muted-foreground" style="font-family:var(--font-body, &quot;Source Serif 4&quot;, &quot;Source Serif Pro&quot;, Georgia, serif)">{{ post.excerpt }}</p>{% endif %} {% if showExcerpt and post.excerpt %}<p class="mt-3 flex-1 text-sm text-muted-foreground" style="font-family:var(--font-body, &quot;Source Serif 4&quot;, &quot;Source Serif Pro&quot;, Georgia, serif)">{{ post.excerpt }}</p>{% endif %}
<div class="mt-4 flex flex-wrap items-center justify-center gap-x-3 gap-y-1 text-xs text-muted-foreground"> <div class="mt-4 flex flex-wrap items-center justify-center gap-x-3 gap-y-1 text-xs text-muted-foreground">

View File

@ -12,7 +12,7 @@
{% set showOverlay = hasImage and overlayColor != "none" and overlayColor != "" %} {% set showOverlay = hasImage and overlayColor != "none" and overlayColor != "" %}
{% macro herocontent(align) %} {% macro herocontent(align) %}
{% if eyebrowText %}<div class="mb-5 flex items-center gap-4 {% if align == "center" %}justify-center{% endif %}"><span class="editorial-rule w-10"></span><span class="editorial-caps text-xs text-muted-foreground">{{ eyebrowText }}</span><span class="editorial-rule w-10"></span></div>{% endif %} {% if eyebrowText %}<div class="mb-5 flex items-center gap-4 {% if align == "center" %}justify-center{% endif %}"><span class="editorial-rule w-10"></span><span class="editorial-caps text-xs text-muted-foreground">{{ eyebrowText }}</span><span class="editorial-rule w-10"></span></div>{% endif %}
{% if headlineText %}<h1 class="editorial-caps text-4xl sm:text-5xl lg:text-6xl leading-tight" style="font-family:var(--font-heading, 'Playfair Display', Georgia, serif);color:hsl(var(--foreground));">{{ headlineText }}</h1>{% endif %} {% if headlineText %}<h1 class="editorial-hero-title" style="font-family:var(--font-heading, 'Playfair Display', Georgia, serif);color:hsl(var(--foreground));">{{ headlineText }}</h1>{% endif %}
{% if subText %}<h2 class="mt-5 text-xl sm:text-2xl italic max-w-2xl{% if align == "center" %} mx-auto{% endif %}" style="color:hsl(var(--muted-foreground));font-family:var(--font-body, 'Source Serif 4', 'Source Serif Pro', Georgia, serif);">{{ subText }}</h2>{% endif %} {% if subText %}<h2 class="mt-5 text-xl sm:text-2xl italic max-w-2xl{% if align == "center" %} mx-auto{% endif %}" style="color:hsl(var(--muted-foreground));font-family:var(--font-body, 'Source Serif 4', 'Source Serif Pro', Georgia, serif);">{{ subText }}</h2>{% endif %}
{% if descText %}<p class="mt-4 max-w-xl leading-relaxed{% if align == "center" %} mx-auto{% endif %}" style="color:hsl(var(--muted-foreground));">{{ descText }}</p>{% endif %} {% if descText %}<p class="mt-4 max-w-xl leading-relaxed{% if align == "center" %} mx-auto{% endif %}" style="color:hsl(var(--muted-foreground));">{{ descText }}</p>{% endif %}
{% if pText or sText %}<div class="mt-8 flex flex-col sm:flex-row gap-4{% if align == "center" %} justify-center{% endif %}"> {% if pText or sText %}<div class="mt-8 flex flex-col sm:flex-row gap-4{% if align == "center" %} justify-center{% endif %}">
@ -32,7 +32,7 @@
{% else %} {% else %}
{% set align = "center" %} {% set align = "center" %}
{% if variant == "left-aligned" %}{% set align = "left" %}{% endif %} {% if variant == "left-aligned" %}{% set align = "left" %}{% endif %}
<section data-block-override="editorial:hero" class="hero relative flex flex-col overflow-hidden bg-background text-foreground {% if minHeight == "screen" %}min-h-screen{% elif minHeight == "50vh" %}min-h-[50vh]{% elif minHeight == "auto" %}min-h-[400px]{% else %}min-h-[75vh]{% endif %} {% if verticalAlign == "top" %}justify-start pt-20{% elif verticalAlign == "bottom" %}justify-end pb-20{% else %}justify-center{% endif %}{% if class %} {{ class }}{% endif %}"> <section data-block-override="editorial:hero" class="hero relative flex flex-col overflow-hidden bg-background text-foreground {% if hasImage %}{% if minHeight == "screen" %}min-h-screen{% elif minHeight == "50vh" %}min-h-[50vh]{% elif minHeight == "auto" %}min-h-[400px]{% else %}min-h-[75vh]{% endif %} {% if verticalAlign == "top" %}justify-start pt-20{% elif verticalAlign == "bottom" %}justify-end pb-20{% else %}justify-center{% endif %}{% endif %}{% if class %} {{ class }}{% endif %}">
{% if hasImage %}<div class="absolute inset-0 z-0">{% img backgroundImage alt=headlineText class="h-full w-full object-cover" layout="hero" %}{% if showOverlay %}<div class="absolute inset-0 {% if overlayColor == "light" %}bg-background/60{% elif overlayColor == "primary" %}bg-primary/50{% elif overlayOpacity <= 30 %}bg-black/30{% elif overlayOpacity <= 50 %}bg-black/50{% elif overlayOpacity <= 70 %}bg-black/70{% else %}bg-black/80{% endif %}"></div>{% endif %}</div>{% endif %} {% if hasImage %}<div class="absolute inset-0 z-0">{% img backgroundImage alt=headlineText class="h-full w-full object-cover" layout="hero" %}{% if showOverlay %}<div class="absolute inset-0 {% if overlayColor == "light" %}bg-background/60{% elif overlayColor == "primary" %}bg-primary/50{% elif overlayOpacity <= 30 %}bg-black/30{% elif overlayOpacity <= 50 %}bg-black/50{% elif overlayOpacity <= 70 %}bg-black/70{% else %}bg-black/80{% endif %}"></div>{% endif %}</div>{% endif %}
<div class="relative z-10 mx-auto w-full max-w-4xl px-4 sm:px-6 lg:px-8 {% if variant == "left-aligned" %}text-left{% else %}text-center{% endif %}"><div class="editorial-panel px-6 py-10 sm:px-10 sm:py-14">{{ herocontent(align) }}</div></div> <div class="relative z-10 mx-auto w-full max-w-4xl px-4 sm:px-6 lg:px-8 {% if variant == "left-aligned" %}text-left{% else %}text-center{% endif %}"><div class="editorial-panel px-6 py-10 sm:px-10 sm:py-14">{{ herocontent(align) }}</div></div>
</section> </section>

View File

@ -1,7 +1,7 @@
{# hours-location override (editorial) — typographic hours ledger + hairline-framed map. Map facade <button onclick> preserved verbatim. Fields mirror builtin: heading, hours[].day/.hours/.closed, specialHoursNote, address, phone, directionsUrl, mapEmbedUrl, mapButtonLabel. #} {# hours-location override (editorial) — typographic hours ledger + hairline-framed map. Map facade <button onclick> preserved verbatim. Fields mirror builtin: heading, hours[].day/.hours/.closed, specialHoursNote, address, phone, directionsUrl, mapEmbedUrl, mapButtonLabel. #}
<section data-block-override="editorial:hours-location" class="py-16 md:py-24 bg-background text-foreground{% if class %} {{ class }}{% endif %}"> <section data-block-override="editorial:hours-location" class="py-16 md:py-24 bg-background text-foreground{% if class %} {{ class }}{% endif %}">
<div class="mx-auto max-w-5xl px-4"> <div class="mx-auto max-w-5xl px-4">
{% if heading %}<h2 class="editorial-caps text-3xl md:text-4xl text-center" style="font-family:var(--font-heading, 'Playfair Display', Georgia, serif);color:hsl(var(--foreground));">{{ heading }}</h2>{% endif %} {% if heading %}<h2 class="editorial-heading text-3xl md:text-4xl text-center" style="font-family:var(--font-heading, 'Playfair Display', Georgia, serif);color:hsl(var(--foreground));">{{ heading }}</h2>{% endif %}
<div class="mt-10 grid grid-cols-1 gap-10 md:grid-cols-2"> <div class="mt-10 grid grid-cols-1 gap-10 md:grid-cols-2">
<div class="editorial-panel bg-card p-6 md:p-8"> <div class="editorial-panel bg-card p-6 md:p-8">
{% if hours %} {% if hours %}

View File

@ -1,11 +1,11 @@
{# image override — plain editorial plate, no ornament frame. Fields mirror builtin: src, alt, caption, size, align, aspectRatio, objectFit. Media resolved via {% img %} (media filter is not registered in the block render path). #} {# image override — plain editorial plate, no ornament frame. Fields mirror builtin: src, alt, caption, size, align, aspectRatio, objectFit. Media resolved via {% img %} (media filter is not registered in the block render path). #}
{% with size=size|default:"full" align=align|default:"center" objectFit=objectFit|default:"cover" %} {% with size=size|default:"full" align=align|default:"center" objectFit=objectFit|default:"cover" %}
<figure data-block-override="editorial:image" class="my-8 flex-1 {% if align == "left" %}flex justify-start{% elif align == "right" %}flex justify-end{% else %}flex justify-center{% endif %}{% if class %} {{ class }}{% endif %}"> <figure data-block-override="editorial:image" class="my-8 flex-1 {% if align == "left" %}flex justify-start{% elif align == "right" %}flex justify-end{% else %}flex justify-center{% endif %}{% if class %} {{ class }}{% endif %}">
<div class="{% if size == "xs" %}max-w-[200px] w-full{% elif size == "sm" %}max-w-[400px] w-full{% elif size == "md" %}max-w-[600px] w-full{% elif size == "lg" %}max-w-[800px] w-full{% else %}w-full{% endif %}"> {% if src %}<div class="{% if size == "xs" %}max-w-[200px] w-full{% elif size == "sm" %}max-w-[400px] w-full{% elif size == "md" %}max-w-[600px] w-full{% elif size == "lg" %}max-w-[800px] w-full{% else %}w-full{% endif %}">
<div class="relative overflow-hidden bg-muted {% if aspectRatio == "square" %}aspect-square{% elif aspectRatio == "video" %}aspect-video{% elif aspectRatio == "portrait" %}aspect-[3/4]{% elif aspectRatio == "wide" %}aspect-[21/9]{% endif %}"> <div class="relative overflow-hidden bg-muted {% if aspectRatio == "square" %}aspect-square{% elif aspectRatio == "video" %}aspect-video{% elif aspectRatio == "portrait" %}aspect-[3/4]{% elif aspectRatio == "wide" %}aspect-[21/9]{% endif %}">
{% 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 %} {% 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 %}
</div> </div>
</div> </div>{% endif %}
{% if caption %}<figcaption class="mt-3 text-center text-sm italic" style="color:hsl(var(--muted-foreground));font-family:var(--font-body, 'Source Serif 4', Georgia, serif);">{{ caption }}</figcaption>{% endif %} {% if caption %}<figcaption class="mt-3 text-center text-sm italic" style="color:hsl(var(--muted-foreground));font-family:var(--font-body, 'Source Serif 4', Georgia, serif);">{{ caption }}</figcaption>{% endif %}
</figure> </figure>
{% endwith %} {% endwith %}

View File

@ -1,7 +1,7 @@
{# menu-list override — editorial menu: Playfair section titles, hairline leader rules, generous columns. Fields mirror builtin: heading, intro, columns, sections[].title/.note/.items[].name/.badges/.description/.price, currency, footnote. #} {# menu-list override — editorial menu: Playfair section titles, hairline leader rules, generous columns. Fields mirror builtin: heading, intro, columns, sections[].title/.note/.items[].name/.badges/.description/.price, currency, footnote. #}
<section data-block-override="editorial:menu-list" class="py-16 md:py-24 bg-background text-foreground{% if class %} {{ class }}{% endif %}"> <section data-block-override="editorial:menu-list" class="py-16 md:py-24 bg-background text-foreground{% if class %} {{ class }}{% endif %}">
<div class="mx-auto max-w-5xl px-4 text-center"> <div class="mx-auto max-w-5xl px-4 text-center">
{% if heading %}<h2 class="editorial-caps text-3xl md:text-4xl" style="font-family:var(--font-heading, 'Playfair Display', Georgia, serif);color:hsl(var(--foreground));">{{ heading }}</h2>{% endif %} {% if heading %}<h2 class="editorial-heading text-3xl md:text-4xl" style="font-family:var(--font-heading, 'Playfair Display', Georgia, serif);color:hsl(var(--foreground));">{{ heading }}</h2>{% endif %}
{% if intro %}<p class="mx-auto mt-3 max-w-2xl text-lg italic" style="color:hsl(var(--muted-foreground));font-family:var(--font-body, 'Source Serif 4', 'Source Serif Pro', Georgia, serif);">{{ intro }}</p>{% endif %} {% if intro %}<p class="mx-auto mt-3 max-w-2xl text-lg italic" style="color:hsl(var(--muted-foreground));font-family:var(--font-body, 'Source Serif 4', 'Source Serif Pro', Georgia, serif);">{{ intro }}</p>{% endif %}
<span class="editorial-rule w-16 mx-auto mt-6 mb-4 block" aria-hidden="true"></span> <span class="editorial-rule w-16 mx-auto mt-6 mb-4 block" aria-hidden="true"></span>
<div class="mt-6 grid grid-cols-1 gap-x-14 gap-y-12 text-left {% if columns == 2 %}md:grid-cols-2{% endif %}"> <div class="mt-6 grid grid-cols-1 gap-x-14 gap-y-12 text-left {% if columns == 2 %}md:grid-cols-2{% endif %}">

View File

@ -4,8 +4,8 @@
<section data-block-override="editorial:newsletter-signup" class="py-12 bg-background text-foreground md:py-16{% if class %} {{ class }}{% endif %}"> <section data-block-override="editorial:newsletter-signup" class="py-12 bg-background text-foreground md:py-16{% if class %} {{ class }}{% endif %}">
<div class="mx-auto max-w-3xl px-4"> <div class="mx-auto max-w-3xl px-4">
<div class="editorial-panel {% if layout == "inline" %}bg-card px-6 py-12 text-card-foreground md:px-12{% else %}bg-card px-6 py-12 text-card-foreground md:px-10{% endif %} text-center"> <div class="editorial-panel {% if layout == "inline" %}bg-card px-6 py-12 text-card-foreground md:px-12{% else %}bg-card px-6 py-12 text-card-foreground md:px-10{% endif %} text-center">
<div class="mb-4 flex items-center justify-center gap-4"><span class="editorial-rule w-12"></span><span class="editorial-rule w-12"></span></div> <div class="mb-5 flex justify-center"><span class="editorial-rule w-12"></span></div>
{% if title %}<h2 class="editorial-caps text-2xl md:text-3xl" style="font-family:var(--font-heading, &quot;Playfair Display&quot;, Georgia, serif)">{{ title }}</h2>{% endif %} {% if title %}<h2 class="editorial-heading text-2xl md:text-3xl" style="font-family:var(--font-heading, &quot;Playfair Display&quot;, Georgia, serif)">{{ title }}</h2>{% endif %}
{% if description %}<p class="mx-auto mt-4 max-w-xl {% if layout == "inline" %}text-muted-foreground{% else %}text-muted-foreground{% endif %}" style="font-family:var(--font-body, &quot;Source Serif 4&quot;, &quot;Source Serif Pro&quot;, Georgia, serif)">{{ description }}</p>{% endif %} {% if description %}<p class="mx-auto mt-4 max-w-xl {% if layout == "inline" %}text-muted-foreground{% else %}text-muted-foreground{% endif %}" style="font-family:var(--font-body, &quot;Source Serif 4&quot;, &quot;Source Serif Pro&quot;, Georgia, serif)">{{ description }}</p>{% endif %}
<div class="mx-auto mt-6 max-w-md">{% signup_form list=listSlug source=source submit=submitText success_message=successMessage placeholder=placeholder %}</div> <div class="mx-auto mt-6 max-w-md">{% signup_form list=listSlug source=source submit=submitText success_message=successMessage placeholder=placeholder %}</div>
</div> </div>

View File

@ -2,7 +2,7 @@
<div data-block-override="editorial:password-reset-form" class="password-reset-form editorial-panel mx-auto max-w-md bg-card p-8"> <div data-block-override="editorial:password-reset-form" class="password-reset-form editorial-panel mx-auto max-w-md bg-card p-8">
<div id="reset-message"></div> <div id="reset-message"></div>
<div id="request-reset-panel" class="text-center"> <div id="request-reset-panel" class="text-center">
<h2 class="editorial-caps text-2xl" style="font-family:var(--font-heading, 'Playfair Display', Georgia, serif);color:hsl(var(--foreground));">Reset password</h2> <h2 class="editorial-heading text-2xl" style="font-family:var(--font-heading, 'Playfair Display', Georgia, serif);color:hsl(var(--foreground));">Reset password</h2>
<p class="mt-3 text-sm italic" style="color:hsl(var(--muted-foreground));font-family:var(--font-body, 'Source Serif 4', 'Source Serif Pro', Georgia, serif);">Enter your email and we will send a link to reset your password.</p> <p class="mt-3 text-sm italic" style="color:hsl(var(--muted-foreground));font-family:var(--font-body, 'Source Serif 4', 'Source Serif Pro', Georgia, serif);">Enter your email and we will send a link to reset your password.</p>
<form hx-post="/api/auth/request-password-reset" hx-target="#reset-message" hx-swap="innerHTML" class="mt-6 text-left"> <form hx-post="/api/auth/request-password-reset" hx-target="#reset-message" hx-swap="innerHTML" class="mt-6 text-left">
<div class="mb-4"><label class="editorial-caps text-muted-foreground block text-xs mb-1">Email</label><input type="email" name="email" required class="w-full editorial-input" /></div> <div class="mb-4"><label class="editorial-caps text-muted-foreground block text-xs mb-1">Email</label><input type="email" name="email" required class="w-full editorial-input" /></div>

View File

@ -6,7 +6,7 @@
<div class="absolute inset-0 z-0">{% img post.featured_image_url alt=post.featured_image_alt class="h-full w-full object-cover" layout="hero" %}<div class="absolute inset-0 bg-black/70"></div></div> <div class="absolute inset-0 z-0">{% img post.featured_image_url alt=post.featured_image_alt class="h-full w-full object-cover" layout="hero" %}<div class="absolute inset-0 bg-black/70"></div></div>
<div class="relative z-10 mx-auto w-full max-w-4xl px-4 py-14 sm:px-6 lg:px-8 {% if center %}text-center{% endif %}"> <div class="relative z-10 mx-auto w-full max-w-4xl px-4 py-14 sm:px-6 lg:px-8 {% if center %}text-center{% endif %}">
{% if center %}<div class="mb-4 flex items-center justify-center gap-4"><span class="editorial-rule w-12"></span><span class="editorial-rule w-12"></span></div>{% endif %} {% if center %}<div class="mb-4 flex items-center justify-center gap-4"><span class="editorial-rule w-12"></span><span class="editorial-rule w-12"></span></div>{% endif %}
<h1 class="editorial-caps text-3xl leading-tight text-white sm:text-4xl lg:text-5xl" style="font-family:var(--font-heading, &quot;Playfair Display&quot;, Georgia, serif)">{{ post.title }}</h1> <h1 class="editorial-heading text-3xl leading-tight text-white sm:text-4xl lg:text-5xl" style="font-family:var(--font-heading, &quot;Playfair Display&quot;, Georgia, serif)">{{ post.title }}</h1>
{% if showExcerpt and post.excerpt %}<p class="mt-5 max-w-2xl text-lg text-white/80{% if center %} mx-auto{% endif %}" style="font-family:var(--font-body, &quot;Source Serif 4&quot;, &quot;Source Serif Pro&quot;, Georgia, serif)">{{ post.excerpt }}</p>{% endif %} {% if showExcerpt and post.excerpt %}<p class="mt-5 max-w-2xl text-lg text-white/80{% if center %} mx-auto{% endif %}" style="font-family:var(--font-body, &quot;Source Serif 4&quot;, &quot;Source Serif Pro&quot;, Georgia, serif)">{{ post.excerpt }}</p>{% endif %}
{% if showMeta %}<div class="mt-6 flex flex-wrap items-center gap-x-3 gap-y-1 text-sm text-white/80{% if center %} justify-center{% endif %}">{% if post.author_name %}<span class="editorial-caps text-white">{{ post.author_name }}</span>{% endif %}{% if post.published_at %}<span>{{ post.published_at|date:"F j, Y" }}</span>{% endif %}{% if post.reading_time %}<span>{{ post.reading_time }} min read</span>{% endif %}</div>{% endif %} {% if showMeta %}<div class="mt-6 flex flex-wrap items-center gap-x-3 gap-y-1 text-sm text-white/80{% if center %} justify-center{% endif %}">{% if post.author_name %}<span class="editorial-caps text-white">{{ post.author_name }}</span>{% endif %}{% if post.published_at %}<span>{{ post.published_at|date:"F j, Y" }}</span>{% endif %}{% if post.reading_time %}<span>{{ post.reading_time }} min read</span>{% endif %}</div>{% endif %}
</div> </div>

View File

@ -7,7 +7,7 @@
<div class="{% if layout == "list" %}editorial-panel flex items-start gap-5 bg-card p-5 text-card-foreground{% else %}text-center{% endif %}"> <div class="{% if layout == "list" %}editorial-panel flex items-start gap-5 bg-card p-5 text-card-foreground{% else %}text-center{% endif %}">
{% if member.photo %}<span class="{% if layout == "list" %}h-20 w-20{% else %}mx-auto h-28 w-28{% endif %} block shrink-0 overflow-hidden border border-[hsl(var(--border))] bg-muted">{% img member.photo alt=member.name class="h-full w-full object-cover" %}</span>{% endif %} {% if member.photo %}<span class="{% if layout == "list" %}h-20 w-20{% else %}mx-auto h-28 w-28{% endif %} block shrink-0 overflow-hidden border border-[hsl(var(--border))] bg-muted">{% img member.photo alt=member.name class="h-full w-full object-cover" %}</span>{% endif %}
<div class="{% if layout != "list" %}mt-4{% endif %}"> <div class="{% if layout != "list" %}mt-4{% endif %}">
{% if member.name %}<h3 class="editorial-caps text-lg text-foreground" style="font-family:var(--font-heading, 'Playfair Display', Georgia, serif)">{{ member.name }}</h3>{% endif %} {% if member.name %}<h3 class="editorial-heading text-lg text-foreground" style="font-family:var(--font-heading, 'Playfair Display', Georgia, serif)">{{ member.name }}</h3>{% endif %}
{% if member.role %}<p class="editorial-caps text-xs text-muted-foreground">{{ member.role }}</p>{% endif %} {% if member.role %}<p class="editorial-caps text-xs text-muted-foreground">{{ member.role }}</p>{% endif %}
{% if member.bio %}<p class="mt-2 text-sm text-muted-foreground" style="font-family:var(--font-body, 'Source Serif 4', 'Source Serif Pro', Georgia, serif)">{{ member.bio }}</p>{% endif %} {% if member.bio %}<p class="mt-2 text-sm text-muted-foreground" style="font-family:var(--font-body, 'Source Serif 4', 'Source Serif Pro', Georgia, serif)">{{ member.bio }}</p>{% endif %}
{% if member.socials %}<div class="mt-3 flex gap-3 {% if layout != "list" %}justify-center{% endif %}"> {% if member.socials %}<div class="mt-3 flex gap-3 {% if layout != "list" %}justify-center{% endif %}">