package ersteller_lib import ( "github.com/labstack/echo/v4" . "maragu.dev/gomponents" . "maragu.dev/gomponents/html" ) const DeIndexUrl = "/de/index" const EnIndexUrl = "/en/index" const DefaultLanguage = En type NavItem struct { Label string Url string } type WebsiteMetaData struct { AppTitle string Title string Lang Language Description string NavItems []NavItem } type PageWebsiteMetaData struct { AppTitle string Title I18nText Lang Language Description I18nText NavItems []ActivePath FooterNavItems []ActivePath AllRoutes []HtmxRoute ScriptSrcs []string StyleSrcs []string ActiveNavPath string HideNavigation bool UserEmail string } type CreatePageFunc func(c echo.Context, metadata PageWebsiteMetaData, content ...Node) error type CreateHtmxPageFunc func(req HtmxContext, metadata PageWebsiteMetaData, content ...Node) func AddLanguageSelectScript(metadata PageWebsiteMetaData) Node { script := InlineTemplate(` (function() { const langs = { de: "$.DeUrl$", en: "$.EnUrl$", }; const currentLang = "$.CurrentLang$"; const defaultLang = "$.DefaultLang$"; selectWebsiteLanguage(currentLang, langs, defaultLang); })();`, struct { CurrentLang string DeUrl string EnUrl string DefaultLang string }{ CurrentLang: string(metadata.Lang), DeUrl: DeIndexUrl, EnUrl: EnIndexUrl, DefaultLang: string(DefaultLanguage), }) return Script(Type("text/javascript"), Raw(script)) } func GetNav(c HtmxContext, metadata PageWebsiteMetaData) Node { return Nav(Class("nav"), Aria("label", "Main Menu"), Map(metadata.NavItems, func(path ActivePath) Node { return CreateNavItem(c, path) }), ) } func CreateNavItem(c HtmxContext, activePath ActivePath) Node { isActive := activePath.IsActive(c) return A( Href(activePath.GetPath(c.GetLanguage())), Text(activePath.From(c)), If(isActive, Attr("aria-current", "page")), If(isActive, Class("selected")), ) } func GetLanguageSwitcher(c HtmxContext, metadata PageWebsiteMetaData) Node { currentLang := c.GetLanguage() var currentRoute HtmxRoute for _, route := range c.GetAllRoutes() { if route.IsCurrentRoute(c) { currentRoute = route break } } return Div(Class("language-switcher"), CreateLanguageButton(En, currentLang, currentRoute, c), CreateLanguageButton(De, currentLang, currentRoute, c), ) } func GetFooterMenu(c HtmxContext, metadata PageWebsiteMetaData) Node { lang := c.GetLanguage() return Div( Map(metadata.FooterNavItems, func(path ActivePath) Node { return Span( A(Href(path.GetPath(lang)), Class("footer-link"), Text(path.From(c))), ) }), ) } func CreateLanguageButton(lang Language, currentLang Language, route HtmxRoute, c HtmxContext) Node { isActive := lang == currentLang var href string if route != nil { href = route.ToUrlFromContext(c, lang) } else { // Fallback to index page if no active path found if lang == En { href = EnIndexUrl } else { href = DeIndexUrl } } var langText string if lang == En { langText = "EN" } else { langText = "DE" } // Combine classes properly var classes string if isActive { classes = "language-button active" } else { classes = "language-button inactive" } return A( Href(href), Text(langText), Class(classes), ) }