themes-earthen/partner_logos.templ
Alex Dunmow 49401f1b41 initial: theme plugin earthen
Bootstrapped during the 2026-06-06 BlockNinja consolidation. Was previously
an unversioned directory inside ~/src/blockninja-themes/earthen.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-06-06 14:11:27 +08:00

96 lines
2.4 KiB
Plaintext

package main
// partnerLogosComponent renders a grayscale logo grid that restores colour on hover.
templ partnerLogosComponent(data PartnerLogosData) {
<section
data-block="earthen:partner_logos"
data-empty?={ data.Empty }
class="earthen-partner-logos py-16 px-4"
style="background-color: hsl(var(--background)); color: hsl(var(--foreground));"
>
<div class="max-w-5xl mx-auto">
if data.Title != "" {
<h2
class="earthen-display text-2xl md:text-3xl text-center mb-10"
style={ "font-family: var(--font-heading, \"Fraunces\", \"Playfair Display\", Georgia, serif); color: hsl(var(--primary));" }
>
{ data.Title }
</h2>
}
if len(data.Logos) > 0 {
<div class="grid grid-cols-2 sm:grid-cols-3 md:grid-cols-4 lg:grid-cols-5 gap-8 items-center">
for _, logo := range data.Logos {
<div class="earthen-partner-tile flex justify-center items-center">
@partnerLogoTile(logo)
</div>
}
</div>
} else {
<p class="text-center" style="color: hsl(var(--muted-foreground));">
Add partner logos to fill this grid.
</p>
}
</div>
</section>
}
templ partnerLogoTile(logo PartnerLogo) {
if logo.URL != "" {
<a
href={ templ.SafeURL(logo.URL) }
class="earthen-partner-link block transition-colors"
title={ logo.Name }
aria-label={ logo.Name }
>
@partnerLogoImage(logo)
</a>
} else {
<div class="earthen-partner-link block" title={ logo.Name } aria-label={ logo.Name }>
@partnerLogoImage(logo)
</div>
}
}
templ partnerLogoImage(logo PartnerLogo) {
if logo.Image != "" {
<img
src={ resolveMedia(logo.Image) }
alt={ logo.Name }
class="earthen-partner-img max-h-12 object-contain w-full"
/>
} else {
<div
class="earthen-partner-fallback w-full h-12 flex items-center justify-center rounded"
style="background-color: hsl(var(--muted)); color: hsl(var(--muted-foreground));"
>
<span class="text-sm">{ partnerInitials(logo.Name) }</span>
</div>
}
}
// partnerInitials returns up to two initials for an initials-only fallback tile.
func partnerInitials(name string) string {
if name == "" {
return "?"
}
letters := []rune{}
prevSpace := true
for _, r := range name {
if r == ' ' || r == '-' || r == '_' {
prevSpace = true
continue
}
if prevSpace {
letters = append(letters, r)
prevSpace = false
if len(letters) >= 2 {
break
}
}
}
if len(letters) == 0 {
return "?"
}
return string(letters)
}