From 8953f57d887c060c3b58f83c38d2010d27a45ef3 Mon Sep 17 00:00:00 2001 From: tobi <31960611+tsmethurst@users.noreply.github.com> Date: Mon, 25 Mar 2024 18:32:24 +0100 Subject: [feature] User-selectable preset CSS themes for accounts (#2777) * [feature] User-selectable preset themes * docs, more theme stuff * lint, tests * fix css name * correct some little issues * add another theme * fix poll background * okay last theme i swear * make retrieval of apimodel themes more conventional * preallocate stylesheet slices --- internal/web/profile.go | 42 +++++++++++++++++++++++++++++++++--------- internal/web/thread.go | 41 ++++++++++++++++++++++++++++++++--------- internal/web/web.go | 1 + 3 files changed, 66 insertions(+), 18 deletions(-) (limited to 'internal/web') diff --git a/internal/web/profile.go b/internal/web/profile.go index b629c98b9..a4809a72d 100644 --- a/internal/web/profile.go +++ b/internal/web/profile.go @@ -140,16 +140,40 @@ func (m *Module) profileGETHandler(c *gin.Context) { return } + // Prepare stylesheets for profile. + stylesheets := make([]string, 0, 6) + + // Basic profile stylesheets. + stylesheets = append( + stylesheets, + []string{ + cssFA, + cssStatus, + cssThread, + cssProfile, + }..., + ) + + // User-selected theme if set. + if theme := targetAccount.Theme; theme != "" { + stylesheets = append( + stylesheets, + themesPathPrefix+"/"+theme, + ) + } + + // Custom CSS for this user last in cascade. + stylesheets = append( + stylesheets, + "/@"+targetAccount.Username+"/custom.css", + ) + page := apiutil.WebPage{ - Template: "profile.tmpl", - Instance: instance, - OGMeta: apiutil.OGBase(instance).WithAccount(targetAccount), - Stylesheets: []string{ - cssFA, cssStatus, cssThread, cssProfile, - // Custom CSS for this user last in cascade. - "/@" + targetAccount.Username + "/custom.css", - }, - Javascript: []string{jsFrontend}, + Template: "profile.tmpl", + Instance: instance, + OGMeta: apiutil.OGBase(instance).WithAccount(targetAccount), + Stylesheets: stylesheets, + Javascript: []string{jsFrontend}, Extra: map[string]any{ "account": targetAccount, "rssFeed": rssFeed, diff --git a/internal/web/thread.go b/internal/web/thread.go index 4dcd1d221..ffec565e6 100644 --- a/internal/web/thread.go +++ b/internal/web/thread.go @@ -138,16 +138,39 @@ func (m *Module) threadGETHandler(c *gin.Context) { return } + // Prepare stylesheets for thread. + stylesheets := make([]string, 0, 5) + + // Basic thread stylesheets. + stylesheets = append( + stylesheets, + []string{ + cssFA, + cssStatus, + cssThread, + }..., + ) + + // User-selected theme if set. + if theme := targetAccount.Theme; theme != "" { + stylesheets = append( + stylesheets, + themesPathPrefix+"/"+theme, + ) + } + + // Custom CSS for this user last in cascade. + stylesheets = append( + stylesheets, + "/@"+targetAccount.Username+"/custom.css", + ) + page := apiutil.WebPage{ - Template: "thread.tmpl", - Instance: instance, - OGMeta: apiutil.OGBase(instance).WithStatus(status), - Stylesheets: []string{ - cssFA, cssStatus, cssThread, - // Custom CSS for this user last in cascade. - "/@" + targetUsername + "/custom.css", - }, - Javascript: []string{jsFrontend}, + Template: "thread.tmpl", + Instance: instance, + OGMeta: apiutil.OGBase(instance).WithStatus(status), + Stylesheets: stylesheets, + Javascript: []string{jsFrontend}, Extra: map[string]any{ "status": status, "context": context, diff --git a/internal/web/web.go b/internal/web/web.go index 5e57d08c6..19df63332 100644 --- a/internal/web/web.go +++ b/internal/web/web.go @@ -44,6 +44,7 @@ const ( rssFeedPath = profileGroupPath + "/feed.rss" assetsPathPrefix = "/assets" distPathPrefix = assetsPathPrefix + "/dist" + themesPathPrefix = assetsPathPrefix + "/themes" settingsPathPrefix = "/settings" settingsPanelGlob = settingsPathPrefix + "/*panel" userPanelPath = settingsPathPrefix + "/user" -- cgit v1.2.3