diff --git a/templates/bn/head.templ b/templates/bn/head.templ index 6545888..a5c42bb 100644 --- a/templates/bn/head.templ +++ b/templates/bn/head.templ @@ -51,7 +51,6 @@ type SiteSettingsData struct { AdminBypassMode string // "maintenance", "coming_soon", or "" if not bypassing Toolbar ToolbarData LLMsTxtEnabled bool // Whether llms.txt is enabled for AI content discovery - TurnstileSiteKey string // Cloudflare Turnstile site key for bot protection RSSFeedURL string // URL to the RSS feed (e.g., "/rss"), empty to disable RSSFeedTitle string // Feed title for discovery link } @@ -229,16 +228,6 @@ func ParseSiteSettings(doc map[string]any) SiteSettingsData { } } - // Turnstile bot protection (from site settings) - if turnstileData, ok := siteData["turnstile"].(map[string]any); ok { - // Only set site key if Turnstile is enabled - if enabled, ok := turnstileData["enabled"].(bool); ok && enabled { - if v, ok := turnstileData["site_key"].(string); ok { - settings.TurnstileSiteKey = v - } - } - } - // RSS feed auto-discovery (injected by page handler from system page) if v, ok := siteData["rss_feed_url"].(string); ok { settings.RSSFeedURL = v @@ -541,10 +530,6 @@ templ Head(data HeadData) { if data.Settings.CustomHeadScripts != "" { @templ.Raw(data.Settings.CustomHeadScripts) } - // Cloudflare Turnstile invisible bot protection - if data.Settings.TurnstileSiteKey != "" { - @turnstileScript(data.Settings.TurnstileSiteKey) - } if data.StructuredData != "" { @structuredDataScript(data.StructuredData) } @@ -557,117 +542,6 @@ func structuredDataScript(jsonLD string) templ.Component { return templ.Raw(``) } -// turnstileScript renders the Cloudflare Turnstile invisible bot protection -templ turnstileScript(siteKey string) { - - -} - // AdminBypassBanner renders a banner when admin is bypassing maintenance/coming_soon mode // This should be rendered at the very start of the to push down all content templ AdminBypassBanner(settings SiteSettingsData) { diff --git a/templates/bn/head_templ.go b/templates/bn/head_templ.go index 99b37c7..07a69f5 100644 --- a/templates/bn/head_templ.go +++ b/templates/bn/head_templ.go @@ -1,6 +1,6 @@ // Code generated by templ - DO NOT EDIT. -// templ: version: v0.3.1001 +// templ: version: v0.3.1020 package bn //lint:file-ignore SA4006 This context is only used if a nested component is present. @@ -59,7 +59,6 @@ type SiteSettingsData struct { AdminBypassMode string // "maintenance", "coming_soon", or "" if not bypassing Toolbar ToolbarData LLMsTxtEnabled bool // Whether llms.txt is enabled for AI content discovery - TurnstileSiteKey string // Cloudflare Turnstile site key for bot protection RSSFeedURL string // URL to the RSS feed (e.g., "/rss"), empty to disable RSSFeedTitle string // Feed title for discovery link } @@ -237,16 +236,6 @@ func ParseSiteSettings(doc map[string]any) SiteSettingsData { } } - // Turnstile bot protection (from site settings) - if turnstileData, ok := siteData["turnstile"].(map[string]any); ok { - // Only set site key if Turnstile is enabled - if enabled, ok := turnstileData["enabled"].(bool); ok && enabled { - if v, ok := turnstileData["site_key"].(string); ok { - settings.TurnstileSiteKey = v - } - } - } - // RSS feed auto-discovery (injected by page handler from system page) if v, ok := siteData["rss_feed_url"].(string); ok { settings.RSSFeedURL = v @@ -427,7 +416,7 @@ func Head(data HeadData) templ.Component { var templ_7745c5c3_Var2 string templ_7745c5c3_Var2, templ_7745c5c3_Err = templ.JoinStringErrs(data.EffectiveTitle()) if templ_7745c5c3_Err != nil { - return templ.Error{Err: templ_7745c5c3_Err, FileName: `head.templ`, Line: 395, Col: 32} + return templ.Error{Err: templ_7745c5c3_Err, FileName: `bn/head.templ`, Line: 384, Col: 32} } _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var2)) if templ_7745c5c3_Err != nil { @@ -445,7 +434,7 @@ func Head(data HeadData) templ.Component { var templ_7745c5c3_Var3 templ.SafeURL templ_7745c5c3_Var3, templ_7745c5c3_Err = templ.JoinURLErrs("/data/styles/styles.css?v=" + data.CSSHash) if templ_7745c5c3_Err != nil { - return templ.Error{Err: templ_7745c5c3_Err, FileName: `head.templ`, Line: 397, Col: 76} + return templ.Error{Err: templ_7745c5c3_Err, FileName: `bn/head.templ`, Line: 386, Col: 76} } _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var3)) if templ_7745c5c3_Err != nil { @@ -477,7 +466,7 @@ func Head(data HeadData) templ.Component { var templ_7745c5c3_Var4 templ.SafeURL templ_7745c5c3_Var4, templ_7745c5c3_Err = templ.JoinURLErrs(data.Settings.Branding.FaviconICO) if templ_7745c5c3_Err != nil { - return templ.Error{Err: templ_7745c5c3_Err, FileName: `head.templ`, Line: 405, Col: 80} + return templ.Error{Err: templ_7745c5c3_Err, FileName: `bn/head.templ`, Line: 394, Col: 80} } _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var4)) if templ_7745c5c3_Err != nil { @@ -490,7 +479,7 @@ func Head(data HeadData) templ.Component { var templ_7745c5c3_Var5 templ.SafeURL templ_7745c5c3_Var5, templ_7745c5c3_Err = templ.JoinURLErrs(data.Settings.Branding.Favicon16) if templ_7745c5c3_Err != nil { - return templ.Error{Err: templ_7745c5c3_Err, FileName: `head.templ`, Line: 406, Col: 90} + return templ.Error{Err: templ_7745c5c3_Err, FileName: `bn/head.templ`, Line: 395, Col: 90} } _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var5)) if templ_7745c5c3_Err != nil { @@ -503,7 +492,7 @@ func Head(data HeadData) templ.Component { var templ_7745c5c3_Var6 templ.SafeURL templ_7745c5c3_Var6, templ_7745c5c3_Err = templ.JoinURLErrs(data.Settings.Branding.Favicon32) if templ_7745c5c3_Err != nil { - return templ.Error{Err: templ_7745c5c3_Err, FileName: `head.templ`, Line: 407, Col: 90} + return templ.Error{Err: templ_7745c5c3_Err, FileName: `bn/head.templ`, Line: 396, Col: 90} } _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var6)) if templ_7745c5c3_Err != nil { @@ -516,7 +505,7 @@ func Head(data HeadData) templ.Component { var templ_7745c5c3_Var7 templ.SafeURL templ_7745c5c3_Var7, templ_7745c5c3_Err = templ.JoinURLErrs(data.Settings.Branding.AppleTouchIcon) if templ_7745c5c3_Err != nil { - return templ.Error{Err: templ_7745c5c3_Err, FileName: `head.templ`, Line: 408, Col: 92} + return templ.Error{Err: templ_7745c5c3_Err, FileName: `bn/head.templ`, Line: 397, Col: 92} } _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var7)) if templ_7745c5c3_Err != nil { @@ -529,7 +518,7 @@ func Head(data HeadData) templ.Component { var templ_7745c5c3_Var8 templ.SafeURL templ_7745c5c3_Var8, templ_7745c5c3_Err = templ.JoinURLErrs(data.Settings.Branding.ManifestURL) if templ_7745c5c3_Err != nil { - return templ.Error{Err: templ_7745c5c3_Err, FileName: `head.templ`, Line: 409, Col: 65} + return templ.Error{Err: templ_7745c5c3_Err, FileName: `bn/head.templ`, Line: 398, Col: 65} } _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var8)) if templ_7745c5c3_Err != nil { @@ -545,11 +534,11 @@ func Head(data HeadData) templ.Component { return templ_7745c5c3_Err } var templ_7745c5c3_Var9 string - templ_7745c5c3_Var9, templ_7745c5c3_Err = templ.JoinStringErrs(data.Settings.Branding.ThemeColor) + templ_7745c5c3_Var9, templ_7745c5c3_Err = templ.ResolveAttributeValue(data.Settings.Branding.ThemeColor) if templ_7745c5c3_Err != nil { - return templ.Error{Err: templ_7745c5c3_Err, FileName: `head.templ`, Line: 411, Col: 72} + return templ.Error{Err: templ_7745c5c3_Err, FileName: `bn/head.templ`, Line: 400, Col: 72} } - _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var9)) + _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var9) if templ_7745c5c3_Err != nil { return templ_7745c5c3_Err } @@ -571,7 +560,7 @@ func Head(data HeadData) templ.Component { var templ_7745c5c3_Var10 templ.SafeURL templ_7745c5c3_Var10, templ_7745c5c3_Err = templ.JoinURLErrs(data.Settings.Favicon) if templ_7745c5c3_Err != nil { - return templ.Error{Err: templ_7745c5c3_Err, FileName: `head.templ`, Line: 416, Col: 49} + return templ.Error{Err: templ_7745c5c3_Err, FileName: `bn/head.templ`, Line: 405, Col: 49} } _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var10)) if templ_7745c5c3_Err != nil { @@ -594,7 +583,7 @@ func Head(data HeadData) templ.Component { var templ_7745c5c3_Var11 templ.SafeURL templ_7745c5c3_Var11, templ_7745c5c3_Err = templ.JoinURLErrs(data.Settings.AppleTouchIcon) if templ_7745c5c3_Err != nil { - return templ.Error{Err: templ_7745c5c3_Err, FileName: `head.templ`, Line: 419, Col: 68} + return templ.Error{Err: templ_7745c5c3_Err, FileName: `bn/head.templ`, Line: 408, Col: 68} } _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var11)) if templ_7745c5c3_Err != nil { @@ -612,11 +601,11 @@ func Head(data HeadData) templ.Component { return templ_7745c5c3_Err } var templ_7745c5c3_Var12 string - templ_7745c5c3_Var12, templ_7745c5c3_Err = templ.JoinStringErrs(data.PageMeta.MetaDescription) + templ_7745c5c3_Var12, templ_7745c5c3_Err = templ.ResolveAttributeValue(data.PageMeta.MetaDescription) if templ_7745c5c3_Err != nil { - return templ.Error{Err: templ_7745c5c3_Err, FileName: `head.templ`, Line: 427, Col: 67} + return templ.Error{Err: templ_7745c5c3_Err, FileName: `bn/head.templ`, Line: 416, Col: 67} } - _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var12)) + _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var12) if templ_7745c5c3_Err != nil { return templ_7745c5c3_Err } @@ -630,11 +619,11 @@ func Head(data HeadData) templ.Component { return templ_7745c5c3_Err } var templ_7745c5c3_Var13 string - templ_7745c5c3_Var13, templ_7745c5c3_Err = templ.JoinStringErrs(data.Settings.MetaDescription) + templ_7745c5c3_Var13, templ_7745c5c3_Err = templ.ResolveAttributeValue(data.Settings.MetaDescription) if templ_7745c5c3_Err != nil { - return templ.Error{Err: templ_7745c5c3_Err, FileName: `head.templ`, Line: 429, Col: 67} + return templ.Error{Err: templ_7745c5c3_Err, FileName: `bn/head.templ`, Line: 418, Col: 67} } - _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var13)) + _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var13) if templ_7745c5c3_Err != nil { return templ_7745c5c3_Err } @@ -651,7 +640,7 @@ func Head(data HeadData) templ.Component { var templ_7745c5c3_Var14 templ.SafeURL templ_7745c5c3_Var14, templ_7745c5c3_Err = templ.JoinURLErrs(data.PageMeta.CanonicalURL) if templ_7745c5c3_Err != nil { - return templ.Error{Err: templ_7745c5c3_Err, FileName: `head.templ`, Line: 434, Col: 58} + return templ.Error{Err: templ_7745c5c3_Err, FileName: `bn/head.templ`, Line: 423, Col: 58} } _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var14)) if templ_7745c5c3_Err != nil { @@ -668,11 +657,11 @@ func Head(data HeadData) templ.Component { return templ_7745c5c3_Err } var templ_7745c5c3_Var15 string - templ_7745c5c3_Var15, templ_7745c5c3_Err = templ.JoinStringErrs(data.PageMeta.RobotsDirective) + templ_7745c5c3_Var15, templ_7745c5c3_Err = templ.ResolveAttributeValue(data.PageMeta.RobotsDirective) if templ_7745c5c3_Err != nil { - return templ.Error{Err: templ_7745c5c3_Err, FileName: `head.templ`, Line: 439, Col: 62} + return templ.Error{Err: templ_7745c5c3_Err, FileName: `bn/head.templ`, Line: 428, Col: 62} } - _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var15)) + _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var15) if templ_7745c5c3_Err != nil { return templ_7745c5c3_Err } @@ -687,11 +676,11 @@ func Head(data HeadData) templ.Component { return templ_7745c5c3_Err } var templ_7745c5c3_Var16 string - templ_7745c5c3_Var16, templ_7745c5c3_Err = templ.JoinStringErrs(data.Settings.OGSiteName) + templ_7745c5c3_Var16, templ_7745c5c3_Err = templ.ResolveAttributeValue(data.Settings.OGSiteName) if templ_7745c5c3_Err != nil { - return templ.Error{Err: templ_7745c5c3_Err, FileName: `head.templ`, Line: 445, Col: 67} + return templ.Error{Err: templ_7745c5c3_Err, FileName: `bn/head.templ`, Line: 434, Col: 67} } - _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var16)) + _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var16) if templ_7745c5c3_Err != nil { return templ_7745c5c3_Err } @@ -706,11 +695,11 @@ func Head(data HeadData) templ.Component { return templ_7745c5c3_Err } var templ_7745c5c3_Var17 string - templ_7745c5c3_Var17, templ_7745c5c3_Err = templ.JoinStringErrs(data.PageMeta.OGTitle) + templ_7745c5c3_Var17, templ_7745c5c3_Err = templ.ResolveAttributeValue(data.PageMeta.OGTitle) if templ_7745c5c3_Err != nil { - return templ.Error{Err: templ_7745c5c3_Err, FileName: `head.templ`, Line: 450, Col: 60} + return templ.Error{Err: templ_7745c5c3_Err, FileName: `bn/head.templ`, Line: 439, Col: 60} } - _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var17)) + _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var17) if templ_7745c5c3_Err != nil { return templ_7745c5c3_Err } @@ -724,11 +713,11 @@ func Head(data HeadData) templ.Component { return templ_7745c5c3_Err } var templ_7745c5c3_Var18 string - templ_7745c5c3_Var18, templ_7745c5c3_Err = templ.JoinStringErrs(data.PageMeta.MetaTitle) + templ_7745c5c3_Var18, templ_7745c5c3_Err = templ.ResolveAttributeValue(data.PageMeta.MetaTitle) if templ_7745c5c3_Err != nil { - return templ.Error{Err: templ_7745c5c3_Err, FileName: `head.templ`, Line: 452, Col: 62} + return templ.Error{Err: templ_7745c5c3_Err, FileName: `bn/head.templ`, Line: 441, Col: 62} } - _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var18)) + _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var18) if templ_7745c5c3_Err != nil { return templ_7745c5c3_Err } @@ -742,11 +731,11 @@ func Head(data HeadData) templ.Component { return templ_7745c5c3_Err } var templ_7745c5c3_Var19 string - templ_7745c5c3_Var19, templ_7745c5c3_Err = templ.JoinStringErrs(data.Title) + templ_7745c5c3_Var19, templ_7745c5c3_Err = templ.ResolveAttributeValue(data.Title) if templ_7745c5c3_Err != nil { - return templ.Error{Err: templ_7745c5c3_Err, FileName: `head.templ`, Line: 454, Col: 49} + return templ.Error{Err: templ_7745c5c3_Err, FileName: `bn/head.templ`, Line: 443, Col: 49} } - _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var19)) + _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var19) if templ_7745c5c3_Err != nil { return templ_7745c5c3_Err } @@ -761,11 +750,11 @@ func Head(data HeadData) templ.Component { return templ_7745c5c3_Err } var templ_7745c5c3_Var20 string - templ_7745c5c3_Var20, templ_7745c5c3_Err = templ.JoinStringErrs(data.PageMeta.OGDescription) + templ_7745c5c3_Var20, templ_7745c5c3_Err = templ.ResolveAttributeValue(data.PageMeta.OGDescription) if templ_7745c5c3_Err != nil { - return templ.Error{Err: templ_7745c5c3_Err, FileName: `head.templ`, Line: 459, Col: 72} + return templ.Error{Err: templ_7745c5c3_Err, FileName: `bn/head.templ`, Line: 448, Col: 72} } - _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var20)) + _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var20) if templ_7745c5c3_Err != nil { return templ_7745c5c3_Err } @@ -779,11 +768,11 @@ func Head(data HeadData) templ.Component { return templ_7745c5c3_Err } var templ_7745c5c3_Var21 string - templ_7745c5c3_Var21, templ_7745c5c3_Err = templ.JoinStringErrs(data.PageMeta.MetaDescription) + templ_7745c5c3_Var21, templ_7745c5c3_Err = templ.ResolveAttributeValue(data.PageMeta.MetaDescription) if templ_7745c5c3_Err != nil { - return templ.Error{Err: templ_7745c5c3_Err, FileName: `head.templ`, Line: 461, Col: 74} + return templ.Error{Err: templ_7745c5c3_Err, FileName: `bn/head.templ`, Line: 450, Col: 74} } - _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var21)) + _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var21) if templ_7745c5c3_Err != nil { return templ_7745c5c3_Err } @@ -797,11 +786,11 @@ func Head(data HeadData) templ.Component { return templ_7745c5c3_Err } var templ_7745c5c3_Var22 string - templ_7745c5c3_Var22, templ_7745c5c3_Err = templ.JoinStringErrs(data.Settings.MetaDescription) + templ_7745c5c3_Var22, templ_7745c5c3_Err = templ.ResolveAttributeValue(data.Settings.MetaDescription) if templ_7745c5c3_Err != nil { - return templ.Error{Err: templ_7745c5c3_Err, FileName: `head.templ`, Line: 463, Col: 74} + return templ.Error{Err: templ_7745c5c3_Err, FileName: `bn/head.templ`, Line: 452, Col: 74} } - _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var22)) + _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var22) if templ_7745c5c3_Err != nil { return templ_7745c5c3_Err } @@ -816,11 +805,11 @@ func Head(data HeadData) templ.Component { return templ_7745c5c3_Err } var templ_7745c5c3_Var23 string - templ_7745c5c3_Var23, templ_7745c5c3_Err = templ.JoinStringErrs(resolveMediaURL(data.PageMeta.OGImage)) + templ_7745c5c3_Var23, templ_7745c5c3_Err = templ.ResolveAttributeValue(resolveMediaURL(data.PageMeta.OGImage)) if templ_7745c5c3_Err != nil { - return templ.Error{Err: templ_7745c5c3_Err, FileName: `head.templ`, Line: 468, Col: 77} + return templ.Error{Err: templ_7745c5c3_Err, FileName: `bn/head.templ`, Line: 457, Col: 77} } - _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var23)) + _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var23) if templ_7745c5c3_Err != nil { return templ_7745c5c3_Err } @@ -834,11 +823,11 @@ func Head(data HeadData) templ.Component { return templ_7745c5c3_Err } var templ_7745c5c3_Var24 string - templ_7745c5c3_Var24, templ_7745c5c3_Err = templ.JoinStringErrs(resolveMediaURL(data.Settings.DefaultOGImage)) + templ_7745c5c3_Var24, templ_7745c5c3_Err = templ.ResolveAttributeValue(resolveMediaURL(data.Settings.DefaultOGImage)) if templ_7745c5c3_Err != nil { - return templ.Error{Err: templ_7745c5c3_Err, FileName: `head.templ`, Line: 470, Col: 84} + return templ.Error{Err: templ_7745c5c3_Err, FileName: `bn/head.templ`, Line: 459, Col: 84} } - _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var24)) + _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var24) if templ_7745c5c3_Err != nil { return templ_7745c5c3_Err } @@ -857,11 +846,11 @@ func Head(data HeadData) templ.Component { return templ_7745c5c3_Err } var templ_7745c5c3_Var25 string - templ_7745c5c3_Var25, templ_7745c5c3_Err = templ.JoinStringErrs(data.Settings.TwitterHandle) + templ_7745c5c3_Var25, templ_7745c5c3_Err = templ.ResolveAttributeValue(data.Settings.TwitterHandle) if templ_7745c5c3_Err != nil { - return templ.Error{Err: templ_7745c5c3_Err, FileName: `head.templ`, Line: 478, Col: 66} + return templ.Error{Err: templ_7745c5c3_Err, FileName: `bn/head.templ`, Line: 467, Col: 66} } - _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var25)) + _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var25) if templ_7745c5c3_Err != nil { return templ_7745c5c3_Err } @@ -880,11 +869,11 @@ func Head(data HeadData) templ.Component { return templ_7745c5c3_Err } var templ_7745c5c3_Var26 string - templ_7745c5c3_Var26, templ_7745c5c3_Err = templ.JoinStringErrs(data.PageMeta.TwitterTitle) + templ_7745c5c3_Var26, templ_7745c5c3_Err = templ.ResolveAttributeValue(data.PageMeta.TwitterTitle) if templ_7745c5c3_Err != nil { - return templ.Error{Err: templ_7745c5c3_Err, FileName: `head.templ`, Line: 484, Col: 66} + return templ.Error{Err: templ_7745c5c3_Err, FileName: `bn/head.templ`, Line: 473, Col: 66} } - _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var26)) + _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var26) if templ_7745c5c3_Err != nil { return templ_7745c5c3_Err } @@ -898,11 +887,11 @@ func Head(data HeadData) templ.Component { return templ_7745c5c3_Err } var templ_7745c5c3_Var27 string - templ_7745c5c3_Var27, templ_7745c5c3_Err = templ.JoinStringErrs(data.PageMeta.OGTitle) + templ_7745c5c3_Var27, templ_7745c5c3_Err = templ.ResolveAttributeValue(data.PageMeta.OGTitle) if templ_7745c5c3_Err != nil { - return templ.Error{Err: templ_7745c5c3_Err, FileName: `head.templ`, Line: 486, Col: 61} + return templ.Error{Err: templ_7745c5c3_Err, FileName: `bn/head.templ`, Line: 475, Col: 61} } - _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var27)) + _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var27) if templ_7745c5c3_Err != nil { return templ_7745c5c3_Err } @@ -916,11 +905,11 @@ func Head(data HeadData) templ.Component { return templ_7745c5c3_Err } var templ_7745c5c3_Var28 string - templ_7745c5c3_Var28, templ_7745c5c3_Err = templ.JoinStringErrs(data.PageMeta.MetaTitle) + templ_7745c5c3_Var28, templ_7745c5c3_Err = templ.ResolveAttributeValue(data.PageMeta.MetaTitle) if templ_7745c5c3_Err != nil { - return templ.Error{Err: templ_7745c5c3_Err, FileName: `head.templ`, Line: 488, Col: 63} + return templ.Error{Err: templ_7745c5c3_Err, FileName: `bn/head.templ`, Line: 477, Col: 63} } - _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var28)) + _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var28) if templ_7745c5c3_Err != nil { return templ_7745c5c3_Err } @@ -934,11 +923,11 @@ func Head(data HeadData) templ.Component { return templ_7745c5c3_Err } var templ_7745c5c3_Var29 string - templ_7745c5c3_Var29, templ_7745c5c3_Err = templ.JoinStringErrs(data.Title) + templ_7745c5c3_Var29, templ_7745c5c3_Err = templ.ResolveAttributeValue(data.Title) if templ_7745c5c3_Err != nil { - return templ.Error{Err: templ_7745c5c3_Err, FileName: `head.templ`, Line: 490, Col: 50} + return templ.Error{Err: templ_7745c5c3_Err, FileName: `bn/head.templ`, Line: 479, Col: 50} } - _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var29)) + _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var29) if templ_7745c5c3_Err != nil { return templ_7745c5c3_Err } @@ -953,11 +942,11 @@ func Head(data HeadData) templ.Component { return templ_7745c5c3_Err } var templ_7745c5c3_Var30 string - templ_7745c5c3_Var30, templ_7745c5c3_Err = templ.JoinStringErrs(data.PageMeta.TwitterDescription) + templ_7745c5c3_Var30, templ_7745c5c3_Err = templ.ResolveAttributeValue(data.PageMeta.TwitterDescription) if templ_7745c5c3_Err != nil { - return templ.Error{Err: templ_7745c5c3_Err, FileName: `head.templ`, Line: 495, Col: 78} + return templ.Error{Err: templ_7745c5c3_Err, FileName: `bn/head.templ`, Line: 484, Col: 78} } - _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var30)) + _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var30) if templ_7745c5c3_Err != nil { return templ_7745c5c3_Err } @@ -971,11 +960,11 @@ func Head(data HeadData) templ.Component { return templ_7745c5c3_Err } var templ_7745c5c3_Var31 string - templ_7745c5c3_Var31, templ_7745c5c3_Err = templ.JoinStringErrs(data.PageMeta.OGDescription) + templ_7745c5c3_Var31, templ_7745c5c3_Err = templ.ResolveAttributeValue(data.PageMeta.OGDescription) if templ_7745c5c3_Err != nil { - return templ.Error{Err: templ_7745c5c3_Err, FileName: `head.templ`, Line: 497, Col: 73} + return templ.Error{Err: templ_7745c5c3_Err, FileName: `bn/head.templ`, Line: 486, Col: 73} } - _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var31)) + _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var31) if templ_7745c5c3_Err != nil { return templ_7745c5c3_Err } @@ -989,11 +978,11 @@ func Head(data HeadData) templ.Component { return templ_7745c5c3_Err } var templ_7745c5c3_Var32 string - templ_7745c5c3_Var32, templ_7745c5c3_Err = templ.JoinStringErrs(data.PageMeta.MetaDescription) + templ_7745c5c3_Var32, templ_7745c5c3_Err = templ.ResolveAttributeValue(data.PageMeta.MetaDescription) if templ_7745c5c3_Err != nil { - return templ.Error{Err: templ_7745c5c3_Err, FileName: `head.templ`, Line: 499, Col: 75} + return templ.Error{Err: templ_7745c5c3_Err, FileName: `bn/head.templ`, Line: 488, Col: 75} } - _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var32)) + _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var32) if templ_7745c5c3_Err != nil { return templ_7745c5c3_Err } @@ -1007,11 +996,11 @@ func Head(data HeadData) templ.Component { return templ_7745c5c3_Err } var templ_7745c5c3_Var33 string - templ_7745c5c3_Var33, templ_7745c5c3_Err = templ.JoinStringErrs(data.Settings.MetaDescription) + templ_7745c5c3_Var33, templ_7745c5c3_Err = templ.ResolveAttributeValue(data.Settings.MetaDescription) if templ_7745c5c3_Err != nil { - return templ.Error{Err: templ_7745c5c3_Err, FileName: `head.templ`, Line: 501, Col: 75} + return templ.Error{Err: templ_7745c5c3_Err, FileName: `bn/head.templ`, Line: 490, Col: 75} } - _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var33)) + _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var33) if templ_7745c5c3_Err != nil { return templ_7745c5c3_Err } @@ -1026,11 +1015,11 @@ func Head(data HeadData) templ.Component { return templ_7745c5c3_Err } var templ_7745c5c3_Var34 string - templ_7745c5c3_Var34, templ_7745c5c3_Err = templ.JoinStringErrs(resolveMediaURL(data.PageMeta.TwitterImage)) + templ_7745c5c3_Var34, templ_7745c5c3_Err = templ.ResolveAttributeValue(resolveMediaURL(data.PageMeta.TwitterImage)) if templ_7745c5c3_Err != nil { - return templ.Error{Err: templ_7745c5c3_Err, FileName: `head.templ`, Line: 506, Col: 83} + return templ.Error{Err: templ_7745c5c3_Err, FileName: `bn/head.templ`, Line: 495, Col: 83} } - _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var34)) + _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var34) if templ_7745c5c3_Err != nil { return templ_7745c5c3_Err } @@ -1044,11 +1033,11 @@ func Head(data HeadData) templ.Component { return templ_7745c5c3_Err } var templ_7745c5c3_Var35 string - templ_7745c5c3_Var35, templ_7745c5c3_Err = templ.JoinStringErrs(resolveMediaURL(data.PageMeta.OGImage)) + templ_7745c5c3_Var35, templ_7745c5c3_Err = templ.ResolveAttributeValue(resolveMediaURL(data.PageMeta.OGImage)) if templ_7745c5c3_Err != nil { - return templ.Error{Err: templ_7745c5c3_Err, FileName: `head.templ`, Line: 508, Col: 78} + return templ.Error{Err: templ_7745c5c3_Err, FileName: `bn/head.templ`, Line: 497, Col: 78} } - _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var35)) + _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var35) if templ_7745c5c3_Err != nil { return templ_7745c5c3_Err } @@ -1062,11 +1051,11 @@ func Head(data HeadData) templ.Component { return templ_7745c5c3_Err } var templ_7745c5c3_Var36 string - templ_7745c5c3_Var36, templ_7745c5c3_Err = templ.JoinStringErrs(resolveMediaURL(data.Settings.DefaultOGImage)) + templ_7745c5c3_Var36, templ_7745c5c3_Err = templ.ResolveAttributeValue(resolveMediaURL(data.Settings.DefaultOGImage)) if templ_7745c5c3_Err != nil { - return templ.Error{Err: templ_7745c5c3_Err, FileName: `head.templ`, Line: 510, Col: 85} + return templ.Error{Err: templ_7745c5c3_Err, FileName: `bn/head.templ`, Line: 499, Col: 85} } - _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var36)) + _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var36) if templ_7745c5c3_Err != nil { return templ_7745c5c3_Err } @@ -1087,11 +1076,11 @@ func Head(data HeadData) templ.Component { return templ_7745c5c3_Err } var templ_7745c5c3_Var37 string - templ_7745c5c3_Var37, templ_7745c5c3_Err = templ.JoinStringErrs(data.Settings.RSSFeedTitle + " (RSS)") + templ_7745c5c3_Var37, templ_7745c5c3_Err = templ.ResolveAttributeValue(data.Settings.RSSFeedTitle + " (RSS)") if templ_7745c5c3_Err != nil { - return templ.Error{Err: templ_7745c5c3_Err, FileName: `head.templ`, Line: 522, Col: 97} + return templ.Error{Err: templ_7745c5c3_Err, FileName: `bn/head.templ`, Line: 511, Col: 97} } - _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var37)) + _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var37) if templ_7745c5c3_Err != nil { return templ_7745c5c3_Err } @@ -1102,7 +1091,7 @@ func Head(data HeadData) templ.Component { var templ_7745c5c3_Var38 templ.SafeURL templ_7745c5c3_Var38, templ_7745c5c3_Err = templ.JoinURLErrs(data.Settings.RSSFeedURL) if templ_7745c5c3_Err != nil { - return templ.Error{Err: templ_7745c5c3_Err, FileName: `head.templ`, Line: 522, Col: 131} + return templ.Error{Err: templ_7745c5c3_Err, FileName: `bn/head.templ`, Line: 511, Col: 131} } _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var38)) if templ_7745c5c3_Err != nil { @@ -1113,11 +1102,11 @@ func Head(data HeadData) templ.Component { return templ_7745c5c3_Err } var templ_7745c5c3_Var39 string - templ_7745c5c3_Var39, templ_7745c5c3_Err = templ.JoinStringErrs(data.Settings.RSSFeedTitle + " (Atom)") + templ_7745c5c3_Var39, templ_7745c5c3_Err = templ.ResolveAttributeValue(data.Settings.RSSFeedTitle + " (Atom)") if templ_7745c5c3_Err != nil { - return templ.Error{Err: templ_7745c5c3_Err, FileName: `head.templ`, Line: 523, Col: 99} + return templ.Error{Err: templ_7745c5c3_Err, FileName: `bn/head.templ`, Line: 512, Col: 99} } - _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var39)) + _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var39) if templ_7745c5c3_Err != nil { return templ_7745c5c3_Err } @@ -1128,7 +1117,7 @@ func Head(data HeadData) templ.Component { var templ_7745c5c3_Var40 templ.SafeURL templ_7745c5c3_Var40, templ_7745c5c3_Err = templ.JoinURLErrs(data.Settings.RSSFeedURL + "/atom") if templ_7745c5c3_Err != nil { - return templ.Error{Err: templ_7745c5c3_Err, FileName: `head.templ`, Line: 523, Col: 143} + return templ.Error{Err: templ_7745c5c3_Err, FileName: `bn/head.templ`, Line: 512, Col: 143} } _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var40)) if templ_7745c5c3_Err != nil { @@ -1145,11 +1134,11 @@ func Head(data HeadData) templ.Component { return templ_7745c5c3_Err } var templ_7745c5c3_Var41 string - templ_7745c5c3_Var41, templ_7745c5c3_Err = templ.JoinStringErrs("https://www.googletagmanager.com/gtag/js?id=" + data.Settings.GoogleAnalyticsID) + templ_7745c5c3_Var41, templ_7745c5c3_Err = templ.ResolveAttributeValue("https://www.googletagmanager.com/gtag/js?id=" + data.Settings.GoogleAnalyticsID) if templ_7745c5c3_Err != nil { - return templ.Error{Err: templ_7745c5c3_Err, FileName: `head.templ`, Line: 527, Col: 103} + return templ.Error{Err: templ_7745c5c3_Err, FileName: `bn/head.templ`, Line: 516, Col: 103} } - _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var41)) + _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var41) if templ_7745c5c3_Err != nil { return templ_7745c5c3_Err } @@ -1178,7 +1167,7 @@ func Head(data HeadData) templ.Component { var templ_7745c5c3_Var42 templ.SafeURL templ_7745c5c3_Var42, templ_7745c5c3_Err = templ.JoinURLErrs(style) if templ_7745c5c3_Err != nil { - return templ.Error{Err: templ_7745c5c3_Err, FileName: `head.templ`, Line: 535, Col: 38} + return templ.Error{Err: templ_7745c5c3_Err, FileName: `bn/head.templ`, Line: 524, Col: 38} } _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var42)) if templ_7745c5c3_Err != nil { @@ -1201,12 +1190,6 @@ func Head(data HeadData) templ.Component { return templ_7745c5c3_Err } } - if data.Settings.TurnstileSiteKey != "" { - templ_7745c5c3_Err = turnstileScript(data.Settings.TurnstileSiteKey).Render(ctx, templ_7745c5c3_Buffer) - if templ_7745c5c3_Err != nil { - return templ_7745c5c3_Err - } - } if data.StructuredData != "" { templ_7745c5c3_Err = structuredDataScript(data.StructuredData).Render(ctx, templ_7745c5c3_Buffer) if templ_7745c5c3_Err != nil { @@ -1230,8 +1213,9 @@ func structuredDataScript(jsonLD string) templ.Component { return templ.Raw(``) } -// turnstileScript renders the Cloudflare Turnstile invisible bot protection -func turnstileScript(siteKey string) templ.Component { +// AdminBypassBanner renders a banner when admin is bypassing maintenance/coming_soon mode +// This should be rendered at the very start of the to push down all content +func AdminBypassBanner(settings SiteSettingsData) templ.Component { return templruntime.GeneratedTemplate(func(templ_7745c5c3_Input templruntime.GeneratedComponentInput) (templ_7745c5c3_Err error) { templ_7745c5c3_W, ctx := templ_7745c5c3_Input.Writer, templ_7745c5c3_Input.Context if templ_7745c5c3_CtxErr := ctx.Err(); templ_7745c5c3_CtxErr != nil { @@ -1252,67 +1236,23 @@ func turnstileScript(siteKey string) templ.Component { templ_7745c5c3_Var43 = templ.NopComponent } ctx = templ.ClearChildren(ctx) - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 84, "") - if templ_7745c5c3_Err != nil { - return templ_7745c5c3_Err - } - return nil - }) -} - -// AdminBypassBanner renders a banner when admin is bypassing maintenance/coming_soon mode -// This should be rendered at the very start of the to push down all content -func AdminBypassBanner(settings SiteSettingsData) templ.Component { - return templruntime.GeneratedTemplate(func(templ_7745c5c3_Input templruntime.GeneratedComponentInput) (templ_7745c5c3_Err error) { - templ_7745c5c3_W, ctx := templ_7745c5c3_Input.Writer, templ_7745c5c3_Input.Context - if templ_7745c5c3_CtxErr := ctx.Err(); templ_7745c5c3_CtxErr != nil { - return templ_7745c5c3_CtxErr - } - templ_7745c5c3_Buffer, templ_7745c5c3_IsBuffer := templruntime.GetBuffer(templ_7745c5c3_W) - if !templ_7745c5c3_IsBuffer { - defer func() { - templ_7745c5c3_BufErr := templruntime.ReleaseBuffer(templ_7745c5c3_Buffer) - if templ_7745c5c3_Err == nil { - templ_7745c5c3_Err = templ_7745c5c3_BufErr - } - }() - } - ctx = templ.InitializeContext(ctx) - templ_7745c5c3_Var45 := templ.GetChildren(ctx) - if templ_7745c5c3_Var45 == nil { - templ_7745c5c3_Var45 = templ.NopComponent - } - ctx = templ.ClearChildren(ctx) if settings.AdminBypassMode != "" { - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 86, "
") + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 84, "
") if templ_7745c5c3_Err != nil { return templ_7745c5c3_Err } if settings.AdminBypassMode == "maintenance" { - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 87, "Maintenance Mode Active — You're seeing the normal site because you're logged in as admin. Manage") + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 85, "Maintenance Mode Active — You're seeing the normal site because you're logged in as admin. Manage") if templ_7745c5c3_Err != nil { return templ_7745c5c3_Err } } else if settings.AdminBypassMode == "coming_soon" { - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 88, "Coming Soon Mode Active — You're seeing the normal site because you're logged in as admin. Manage") + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 86, "Coming Soon Mode Active — You're seeing the normal site because you're logged in as admin. Manage") if templ_7745c5c3_Err != nil { return templ_7745c5c3_Err } } - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 89, "
") + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 87, "
") if templ_7745c5c3_Err != nil { return templ_7745c5c3_Err } @@ -1338,9 +1278,9 @@ func BodyEnd(settings SiteSettingsData) templ.Component { }() } ctx = templ.InitializeContext(ctx) - templ_7745c5c3_Var46 := templ.GetChildren(ctx) - if templ_7745c5c3_Var46 == nil { - templ_7745c5c3_Var46 = templ.NopComponent + templ_7745c5c3_Var44 := templ.GetChildren(ctx) + if templ_7745c5c3_Var44 == nil { + templ_7745c5c3_Var44 = templ.NopComponent } ctx = templ.ClearChildren(ctx) templ_7745c5c3_Err = recordValidationCall(ctx, "BodyEnd").Render(ctx, templ_7745c5c3_Buffer) @@ -1357,7 +1297,7 @@ func BodyEnd(settings SiteSettingsData) templ.Component { if templ_7745c5c3_Err != nil { return templ_7745c5c3_Err } - templ_7745c5c3_Err = templ_7745c5c3_Var46.Render(ctx, templ_7745c5c3_Buffer) + templ_7745c5c3_Err = templ_7745c5c3_Var44.Render(ctx, templ_7745c5c3_Buffer) if templ_7745c5c3_Err != nil { return templ_7745c5c3_Err } @@ -1386,9 +1326,9 @@ func themeStyle(css string) templ.Component { }() } ctx = templ.InitializeContext(ctx) - templ_7745c5c3_Var47 := templ.GetChildren(ctx) - if templ_7745c5c3_Var47 == nil { - templ_7745c5c3_Var47 = templ.NopComponent + templ_7745c5c3_Var45 := templ.GetChildren(ctx) + if templ_7745c5c3_Var45 == nil { + templ_7745c5c3_Var45 = templ.NopComponent } ctx = templ.ClearChildren(ctx) templ_7745c5c3_Err = themeStyleComponent(css).Render(ctx, templ_7745c5c3_Buffer) @@ -1422,25 +1362,25 @@ func analyticsScript(nonce string) templ.Component { }() } ctx = templ.InitializeContext(ctx) - templ_7745c5c3_Var48 := templ.GetChildren(ctx) - if templ_7745c5c3_Var48 == nil { - templ_7745c5c3_Var48 = templ.NopComponent + templ_7745c5c3_Var46 := templ.GetChildren(ctx) + if templ_7745c5c3_Var46 == nil { + templ_7745c5c3_Var46 = templ.NopComponent } ctx = templ.ClearChildren(ctx) - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 90, "") + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 89, "\">\n\t\t(function(){\n\t\t\t// Don't track admin pages\n\t\t\tif(location.pathname.startsWith('/admin'))return;\n\n\t\t\t// CRITICAL: Capture nonce immediately while document.currentScript is valid\n\t\t\t// document.currentScript is only available during script parsing, not later\n\t\t\tvar _nonce = document.currentScript ? document.currentScript.getAttribute('data-nonce') : '';\n\n\t\t\t// Persistent session ID (survives page navigation within session)\n\t\t\tvar sid=sessionStorage.getItem('_bn_sid');\n\t\t\tif(!sid){sid=crypto.randomUUID();sessionStorage.setItem('_bn_sid',sid);}\n\n\t\t\t// ============================================================\n\t\t\t// Advanced Bot Detection - Client-Side Signals\n\t\t\t// See docs/BOT_DETECTION.md for full documentation\n\t\t\t// ============================================================\n\t\t\tvar botSignals={},botScore=0;\n\t\t\ttry{\n\t\t\t\t// 1. WebDriver property (30 points) - automation frameworks set this\n\t\t\t\tbotSignals.webdriver=!!navigator.webdriver;\n\t\t\t\tif(botSignals.webdriver)botScore+=30;\n\n\t\t\t\t// 2. CDP Detection (25 points) - detects Puppeteer/Playwright/Selenium\n\t\t\t\tbotSignals.cdp=false;\n\t\t\t\ttry{\n\t\t\t\t\tvar e=new Error();\n\t\t\t\t\tObject.defineProperty(e,'stack',{get:function(){botSignals.cdp=true;}});\n\t\t\t\t\tconsole.debug(e);\n\t\t\t\t\tif(botSignals.cdp)botScore+=25;\n\t\t\t\t}catch(x){}\n\n\t\t\t\t// 3. Plugin count (15 points) - headless often has no plugins\n\t\t\t\tbotSignals.plugins=navigator.plugins?navigator.plugins.length:0;\n\t\t\t\tif(botSignals.plugins===0)botScore+=15;\n\n\t\t\t\t// 4. Languages (15 points) - headless often has empty languages\n\t\t\t\tbotSignals.languages=navigator.languages?navigator.languages.length:0;\n\t\t\t\tif(botSignals.languages===0)botScore+=15;\n\n\t\t\t\t// 5. Chrome runtime (10 points) - real Chrome has chrome.runtime\n\t\t\t\tbotSignals.chromeRuntime=!!(window.chrome&&window.chrome.runtime);\n\t\t\t\tif(window.chrome&&!window.chrome.runtime)botScore+=10;\n\n\t\t\t\t// 6. WebGL renderer (20 points) - headless uses SwiftShader/llvmpipe\n\t\t\t\ttry{\n\t\t\t\t\tvar c=document.createElement('canvas');\n\t\t\t\t\tvar gl=c.getContext('webgl')||c.getContext('experimental-webgl');\n\t\t\t\t\tif(gl){\n\t\t\t\t\t\tvar dbg=gl.getExtension('WEBGL_debug_renderer_info');\n\t\t\t\t\t\tif(dbg){\n\t\t\t\t\t\t\tbotSignals.webglRenderer=gl.getParameter(dbg.UNMASKED_RENDERER_WEBGL)||'';\n\t\t\t\t\t\t\tvar r=botSignals.webglRenderer.toLowerCase();\n\t\t\t\t\t\t\tif(r.includes('swiftshader')||r.includes('llvmpipe')||r.includes('software'))botScore+=20;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}catch(x){}\n\n\t\t\t\t// 7. Permission anomalies (15 points) - inconsistent API states\n\t\t\t\tif(window.Notification&&navigator.permissions){\n\t\t\t\t\tnavigator.permissions.query({name:'notifications'}).then(function(p){\n\t\t\t\t\t\tif(p.state==='denied'&&Notification.permission==='default'){\n\t\t\t\t\t\t\tbotSignals.permissionAnomaly=true;\n\t\t\t\t\t\t\tbotScore+=15;\n\t\t\t\t\t\t}\n\t\t\t\t\t}).catch(function(){});\n\t\t\t\t}\n\n\t\t\t\t// 8. Headless in Client Hints (20 points)\n\t\t\t\tif(navigator.userAgentData&&navigator.userAgentData.getHighEntropyValues){\n\t\t\t\t\tnavigator.userAgentData.getHighEntropyValues(['fullVersionList','platform']).then(function(h){\n\t\t\t\t\t\tif(h.brands&&h.brands.some(function(b){return b.brand.toLowerCase().includes('headless');})){\n\t\t\t\t\t\t\tbotSignals.headlessHints=true;\n\t\t\t\t\t\t\tbotScore+=20;\n\t\t\t\t\t\t}\n\t\t\t\t\t}).catch(function(){});\n\t\t\t\t}\n\n\t\t\t\t// 9. Automation variables (10 points each)\n\t\t\t\tif(window._phantom||window.__nightmare||window.callPhantom){botSignals.phantomjs=true;botScore+=10;}\n\t\t\t\tif(window.__selenium_unwrapped||window.__webdriver_evaluate||document.__selenium_evaluate){botSignals.selenium=true;botScore+=10;}\n\t\t\t\tif(window.__fxdriver_evaluate||window.__webdriver_script_fn){botSignals.selenium=true;botScore+=10;}\n\n\t\t\t\t// 10. Broken image dimensions (10 points) - headless often fails to render\n\t\t\t\ttry{\n\t\t\t\t\tvar img=new Image();\n\t\t\t\t\timg.src='data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7';\n\t\t\t\t\tif(img.height===0){botSignals.brokenImage=true;botScore+=10;}\n\t\t\t\t}catch(x){}\n\n\t\t\t\t// Cap at 100\n\t\t\t\tbotScore=Math.min(botScore,100);\n\t\t\t\tbotSignals.score=botScore;\n\t\t\t}catch(x){botSignals.error=x.message;}\n\n\t\t\t// ============================================================\n\t\t\t// Web Vitals collection\n\t\t\t// ============================================================\n\t\t\tvar _lcp=0,_fcp=0,_cls=0,_ttfb=0;\n\t\t\tif('PerformanceObserver'in window){\n\t\t\t\ttry{\n\t\t\t\t\tnew PerformanceObserver(function(l){var e=l.getEntries().pop();if(e)_lcp=Math.round(e.startTime);}).observe({type:'largest-contentful-paint',buffered:true});\n\t\t\t\t\tnew PerformanceObserver(function(l){l.getEntries().forEach(function(e){if(e.name==='first-contentful-paint')_fcp=Math.round(e.startTime);});}).observe({type:'paint',buffered:true});\n\t\t\t\t\tnew PerformanceObserver(function(l){l.getEntries().forEach(function(e){if(!e.hadRecentInput)_cls+=e.value;});}).observe({type:'layout-shift',buffered:true});\n\t\t\t\t}catch(e){}\n\t\t\t}\n\t\t\ttry{var nav=performance.getEntriesByType('navigation')[0];if(nav)_ttfb=Math.round(nav.responseStart);}catch(e){}\n\n\t\t\t// Scroll depth tracking\n\t\t\tvar _maxScroll=0;\n\t\t\tfunction updateScroll(){\n\t\t\t\tvar h=document.documentElement.scrollHeight-window.innerHeight;\n\t\t\t\tif(h>0){var pct=Math.round((window.scrollY/h)*100);if(pct>_maxScroll)_maxScroll=pct;}\n\t\t\t}\n\t\t\twindow.addEventListener('scroll',updateScroll,{passive:true});\n\n\t\t\t// Send beacon with fallback to fetch\n\t\t\tfunction send(url,data){\n\t\t\t\tvar payload=JSON.stringify(data);\n\t\t\t\tif(!navigator.sendBeacon(url,payload)){\n\t\t\t\t\tfetch(url,{method:'POST',body:payload,keepalive:true}).catch(function(){});\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Track pageview with server-side deduplication nonce\n\t\t\tfunction t(){\n\t\t\t\tvar d={\n\t\t\t\t\tp:location.pathname+location.search,\n\t\t\t\t\tr:document.referrer,\n\t\t\t\t\tsw:screen.width,\n\t\t\t\t\tsh:screen.height,\n\t\t\t\t\tvw:window.innerWidth,\n\t\t\t\t\tvh:window.innerHeight,\n\t\t\t\t\tpr:window.devicePixelRatio||1,\n\t\t\t\t\ttz:new Date().getTimezoneOffset(),\n\t\t\t\t\tcs:window.matchMedia('(prefers-color-scheme:dark)').matches?'dark':'light',\n\t\t\t\t\t// Bot detection signals\n\t\t\t\t\tbs:botSignals,\n\t\t\t\t\tbsc:botScore\n\t\t\t\t};\n\t\t\t\tif(navigator.connection){\n\t\t\t\t\td.ct=navigator.connection.effectiveType||'';\n\t\t\t\t\td.cd=navigator.connection.downlink||0;\n\t\t\t\t}\n\t\t\t\t// Use the nonce captured at parse time for server-side deduplication\n\t\t\t\tif(_nonce)d.n=_nonce;\n\t\t\t\tvar u=new URLSearchParams(location.search);\n\t\t\t\tif(u.get('s'))d.st=u.get('s');\n\t\t\t\tsend('/api/track',d);\n\t\t\t}\n\n\t\t\t// Exit beacon with time on page and web vitals\n\t\t\tvar pageStart=Date.now();\n\t\t\tfunction sendExit(){\n\t\t\t\tsend('/api/track/exit',{\n\t\t\t\t\tsid:sid,\n\t\t\t\t\ttop:Date.now()-pageStart,\n\t\t\t\t\tsd:_maxScroll,\n\t\t\t\t\tlcp:_lcp,\n\t\t\t\t\tfcp:_fcp,\n\t\t\t\t\tcls:Math.round(_cls*1000)/1000,\n\t\t\t\t\tttfb:_ttfb\n\t\t\t\t});\n\t\t\t}\n\t\t\tdocument.addEventListener('visibilitychange',function(){\n\t\t\t\tif(document.visibilityState==='hidden')sendExit();\n\t\t\t});\n\n\t\t\t// Track on load\n\t\t\tif(document.readyState==='complete'){t();}else{window.addEventListener('load',t);}\n\t\t})();\n\t") if templ_7745c5c3_Err != nil { return templ_7745c5c3_Err }