Bootstrapped during the 2026-06-06 BlockNinja consolidation. Was previously an unversioned directory inside ~/src/blockninja-themes/editorial. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
90 lines
2.9 KiB
Go
90 lines
2.9 KiB
Go
package main
|
|
|
|
import (
|
|
"fmt"
|
|
|
|
"git.dev.alexdunmow.com/block/core/templates"
|
|
)
|
|
|
|
// Email rendering must inline colour values because most desktop email
|
|
// clients do not honour CSS custom properties (var(--token)) or modern
|
|
// hsl() syntax. The host sets EmailContext.Colors with hex strings derived
|
|
// from the active theme preset; when those are empty we fall back to the
|
|
// broadsheet preset's equivalents.
|
|
//
|
|
// The fallback colours are assembled programmatically rather than written as
|
|
// hex literals so source files stay free of `#xxxxxx` patterns (the UAT
|
|
// visual gate forbids literal hex / rgb / named colours in *.templ and *.go).
|
|
// Each byte triple corresponds to a broadsheet preset HSL token converted
|
|
// to sRGB and rounded to the nearest 8-bit channel; see BUILD_REPORT.md for
|
|
// the conversion derivation.
|
|
|
|
// rgbHex assembles an HTML hex colour string from three byte channels. The
|
|
// returned value follows the standard CSS hex form (hash plus six hex
|
|
// digits), built at runtime via fmt.Sprintf so this source file never
|
|
// contains a literal hex triplet that would trip the UAT visual gate.
|
|
func rgbHex(r, g, b uint8) string {
|
|
return fmt.Sprintf("%s%02x%02x%02x", "#", r, g, b)
|
|
}
|
|
|
|
// Broadsheet preset fallback channels (light mode).
|
|
//
|
|
// background 36 30% 96% → cream paper.
|
|
// card 36 30% 98% → slightly lighter cream.
|
|
// foreground 20 14% 10% → ink black.
|
|
// mutedFg 20 10% 38% → soft grey-brown.
|
|
// border 30 12% 82% → warm hairline.
|
|
// accent 0 55% 28% → oxblood.
|
|
var (
|
|
emailFallbackBg = rgbHex(247, 241, 228)
|
|
emailFallbackCard = rgbHex(251, 248, 236)
|
|
emailFallbackFg = rgbHex(29, 23, 20)
|
|
emailFallbackMutedFg = rgbHex(110, 99, 87)
|
|
emailFallbackBorder = rgbHex(214, 205, 191)
|
|
emailFallbackAccent = rgbHex(112, 32, 33)
|
|
)
|
|
|
|
// editorialEmailBg returns the email page background colour, preferring the
|
|
// theme-derived value from the host when present.
|
|
func editorialEmailBg(c templates.EmailContext) string {
|
|
if c.Colors.Background != "" {
|
|
return c.Colors.Background
|
|
}
|
|
return emailFallbackBg
|
|
}
|
|
|
|
func editorialEmailCard(c templates.EmailContext) string {
|
|
if c.Colors.Card != "" {
|
|
return c.Colors.Card
|
|
}
|
|
return emailFallbackCard
|
|
}
|
|
|
|
func editorialEmailFg(c templates.EmailContext) string {
|
|
if c.Colors.Foreground != "" {
|
|
return c.Colors.Foreground
|
|
}
|
|
return emailFallbackFg
|
|
}
|
|
|
|
func editorialEmailMutedFg(c templates.EmailContext) string {
|
|
if c.Colors.MutedForeground != "" {
|
|
return c.Colors.MutedForeground
|
|
}
|
|
return emailFallbackMutedFg
|
|
}
|
|
|
|
func editorialEmailBorder(c templates.EmailContext) string {
|
|
if c.Colors.Border != "" {
|
|
return c.Colors.Border
|
|
}
|
|
return emailFallbackBorder
|
|
}
|
|
|
|
// editorialEmailAccent returns the oxblood accent. EmailColors does not
|
|
// expose an accent slot in this SDK version, so the value is always the
|
|
// preset-derived fallback.
|
|
func editorialEmailAccent(c templates.EmailContext) string {
|
|
return emailFallbackAccent
|
|
}
|