Alex Dunmow ea45d2ddb6 fix(brutalist): hero styled-text fields tolerate bare strings (0.6.1)
Coordinator lesson from the art-deco lane: `field.text` attribute access on a
bare-string seed/settings value errors the whole block to empty (dead band).
eyebrow/headline/subheadline/description now use `|get:"text"|default:` so the
hero accepts {text,...} objects OR bare strings — same fix art-deco shipped in
f2c8b36. cta/logoText object fields are builtin-typed and stay direct.

Also audited per coordinator: no ::icon:: shortcodes in any template/block
(only CSS ::-webkit pseudo-elements); master_pages.json untouched this lane.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-06 16:02:51 +08:00

25 lines
2.8 KiB
Plaintext

{# brutalist hero override — oversized display headline (the studio masthead identity). Styled-text fields accept {text} object OR bare string. Fields: eyebrow, headline, subheadline, description, ctaPrimary{.text,.url}, ctaSecondary{.text,.url}, template, backgroundImage. {% img %} takes no nested {% if %} so the bg is one unconditional call. #}
{% set eyebrowText = eyebrow|get:"text"|default:eyebrow %}
{% set headlineText = headline|get:"text"|default:headline %}
{% set subText = subheadline|get:"text"|default:subheadline %}
{% set descText = description|get:"text"|default:description %}
{% set pText = ctaPrimary.text %}
{% set pUrl = ctaPrimary.url %}
{% set sText = ctaSecondary.text %}
{% set sUrl = ctaSecondary.url %}
{% set variant = template|default:"centered" %}
{% set hasImage = backgroundImage %}
<section class="brutalist-hero relative overflow-hidden bg-background text-foreground{% if class %} {{ class }}{% endif %}" data-has-media="{% if hasImage %}true{% else %}false{% endif %}">
{% if hasImage %}<div class="absolute inset-0 z-0">{% img backgroundImage alt=headlineText class="h-full w-full object-cover" layout="hero" %}</div>{% endif %}
<div class="bru-wrap relative z-10 {% if variant == "centered" %}text-center{% endif %}">
<div style="max-width:70rem;{% if variant == "centered" %}margin:0 auto{% endif %}">
{% if eyebrowText %}<span class="bru-tag mb-6">{{ eyebrowText }}</span>{% endif %}
{% if headlineText %}<h1 class="headline">{{ headlineText }}</h1>{% endif %}
{% if subText %}<p class="mt-6" style="font-family:var(--font-heading,'Space Grotesk',sans-serif);font-weight:400;font-size:clamp(1.1rem,2vw,1.6rem);color:hsl(var(--muted-foreground));max-width:42rem;{% if variant == "centered" %}margin-left:auto;margin-right:auto{% endif %}">{{ subText }}</p>{% endif %}
{% if descText %}<p class="mt-4 text-lg text-muted-foreground" style="max-width:42rem;{% if variant == "centered" %}margin-left:auto;margin-right:auto{% endif %}">{{ descText }}</p>{% endif %}
{% if pText or sText %}<div class="mt-9 flex flex-col sm:flex-row gap-4 {% if variant == "centered" %}justify-center{% endif %}">{% if pText and pUrl %}<a href="{{ pUrl }}" class="bru-btn bru-btn-solid">{{ pText }}</a>{% endif %}{% if sText and sUrl %}<a href="{{ sUrl }}" class="bru-btn bru-btn-ghost">{{ sText }}</a>{% endif %}</div>{% endif %}
{% if trustLogos %}<div class="mt-12"><p class="bru-meta mb-4">Trusted by</p><div class="flex flex-wrap items-center gap-8 {% if variant == "centered" %}justify-center{% endif %}">{% for logo in trustLogos %}{% if logo.url %}<a href="{{ logo.url }}" target="_blank" rel="noopener noreferrer" class="opacity-70 hover:opacity-100 transition-opacity">{% img logo.image alt=logo.alt class="h-8 w-auto" %}</a>{% else %}{% img logo.image alt=logo.alt class="h-8 w-auto opacity-70" %}{% endif %}{% endfor %}</div></div>{% endif %}
</div>
</div>
</section>