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 }