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>
96 lines
2.4 KiB
Plaintext
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)
|
|
}
|