Add extensible site theme system with Christmas theme #1716
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Motivation and Context
Enable admins to activate seasonal themes (e.g., Christmas) site-wide for all users, with an extensible architecture for adding future themes.
Description
Implements a theme system with admin controls and a Christmas theme featuring animated snowflakes.
Backend:
model/site-settings.go:SiteSettingkey-value model,Themestruct,AvailableThemes()registrydao/site-settings.go:SiteSettingsDaofor persistenceapi/site-settings.go: Theme endpoints (GET /api/theme/active,GET /api/theme/available,PUT /api/theme/active)Frontend:
web/ts/theme-manager.ts: Singleton that fetches active theme on page load, applies effects globallyweb/assets/css/themes.css: Snowflake animations withprefers-reduced-motionsupportAdding new themes:
Steps for Testing
Prerequisites:
Screenshots
Warning
Firewall rules blocked me from connecting to one or more addresses (expand for details)
I tried to connect to the following addresses, but was blocked by firewall rules:
dario.cat/update-job-proxy /update-job-proxy github.com/TUM-D-c -lang=go1.24 /opt/hostedtoolclog -uns�� _base.go r/runc-log.json bash -c=4 -nolocalimports -importcfg /opt/hostedtoolcHEAD -ato�� -bool r/runc-log.json /opt/hostedtoolcache/go/1.24.10/x64/pkg/tool/linux_amd64/vet -errorsas -ifaceassert -nilfunc /opt/hostedtoolcfilter(dns block)/update-job-proxy /update-job-proxy conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT 5495d30143fbecc5--format=format:%H %ct %D /bin/git --detach od /bin/git /usr/bin/git init�� a89987915194adde--depth=1 ce50ae9e:go.mod /bin/git om/spf13/cobra 42642302:go.mod /usr/lib/git-cor-t git(dns block)/update-job-proxy /update-job-proxy conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT bbc7f005:go.mod /home/dependabotrefs/tags/v2.4.0 --pack_header=2,/usr/bin/git REDACTED /bin/git git conf�� tformat /usr/bin/git e/git =2 d7cf7b34:go.mod /bin/git e/git(dns block)filippo.io/update-job-proxy /update-job-proxy github.com/TUM-D-c -lang=go1.24 /opt/hostedtoolclog -uns�� _base.go r/runc-log.json bash -c=4 -nolocalimports -importcfg /opt/hostedtoolcHEAD -ato�� -bool r/runc-log.json /opt/hostedtoolcache/go/1.24.10/x64/pkg/tool/linux_amd64/vet -errorsas -ifaceassert -nilfunc /opt/hostedtoolcfilter(dns block)/update-job-proxy /update-job-proxy conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT 5495d30143fbecc5--format=format:%H %ct %D /bin/git --detach od /bin/git /usr/bin/git init�� a89987915194adde--depth=1 ce50ae9e:go.mod /bin/git om/spf13/cobra 42642302:go.mod /usr/lib/git-cor-t git(dns block)/update-job-proxy /update-job-proxy conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT bbc7f005:go.mod /home/dependabotrefs/tags/v2.4.0 --pack_header=2,/usr/bin/git REDACTED /bin/git git conf�� tformat /usr/bin/git e/git =2 d7cf7b34:go.mod /bin/git e/git(dns block)go.etcd.io/update-job-proxy /update-job-proxy github.com/TUM-D-c -lang=go1.24 /opt/hostedtoolclog -uns�� _base.go r/runc-log.json bash -c=4 -nolocalimports -importcfg /opt/hostedtoolcHEAD -ato�� -bool r/runc-log.json /opt/hostedtoolcache/go/1.24.10/x64/pkg/tool/linux_amd64/vet -errorsas -ifaceassert -nilfunc /opt/hostedtoolcfilter(dns block)/update-job-proxy /update-job-proxy conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT 5495d30143fbecc5--format=format:%H %ct %D /bin/git --detach od /bin/git /usr/bin/git init�� a89987915194adde--depth=1 ce50ae9e:go.mod /bin/git om/spf13/cobra 42642302:go.mod /usr/lib/git-cor-t git(dns block)/update-job-proxy /update-job-proxy conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT bbc7f005:go.mod /home/dependabotrefs/tags/v2.4.0 --pack_header=2,/usr/bin/git REDACTED /bin/git git conf�� tformat /usr/bin/git e/git =2 d7cf7b34:go.mod /bin/git e/git(dns block)go.googlesource.com/update-job-proxy /update-job-proxy github.com/TUM-D-c -lang=go1.24 /opt/hostedtoolclog -uns�� _base.go r/runc-log.json bash -c=4 -nolocalimports -importcfg /opt/hostedtoolcHEAD -ato�� -bool r/runc-log.json /opt/hostedtoolcache/go/1.24.10/x64/pkg/tool/linux_amd64/vet -errorsas -ifaceassert -nilfunc /opt/hostedtoolcfilter(dns block)/update-job-proxy /update-job-proxy conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT 5495d30143fbecc5--format=format:%H %ct %D /bin/git --detach od /bin/git /usr/bin/git init�� a89987915194adde--depth=1 ce50ae9e:go.mod /bin/git om/spf13/cobra 42642302:go.mod /usr/lib/git-cor-t git(dns block)/update-job-proxy /update-job-proxy conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT bbc7f005:go.mod /home/dependabotrefs/tags/v2.4.0 --pack_header=2,/usr/bin/git REDACTED /bin/git git conf�� tformat /usr/bin/git e/git =2 d7cf7b34:go.mod /bin/git e/git(dns block)go.uber.org/update-job-proxy /update-job-proxy github.com/TUM-D-c -lang=go1.24 /opt/hostedtoolclog -uns�� _base.go r/runc-log.json bash -c=4 -nolocalimports -importcfg /opt/hostedtoolcHEAD -ato�� -bool r/runc-log.json /opt/hostedtoolcache/go/1.24.10/x64/pkg/tool/linux_amd64/vet -errorsas -ifaceassert -nilfunc /opt/hostedtoolcfilter(dns block)/update-job-proxy /update-job-proxy conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT 5495d30143fbecc5--format=format:%H %ct %D /bin/git --detach od /bin/git /usr/bin/git init�� a89987915194adde--depth=1 ce50ae9e:go.mod /bin/git om/spf13/cobra 42642302:go.mod /usr/lib/git-cor-t git(dns block)/update-job-proxy /update-job-proxy conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT bbc7f005:go.mod /home/dependabotrefs/tags/v2.4.0 --pack_header=2,/usr/bin/git REDACTED /bin/git git conf�� tformat /usr/bin/git e/git =2 d7cf7b34:go.mod /bin/git e/git(dns block)google.golang.org/update-job-proxy /update-job-proxy github.com/TUM-D-c -lang=go1.24 /opt/hostedtoolclog -uns�� _base.go r/runc-log.json bash -c=4 -nolocalimports -importcfg /opt/hostedtoolcHEAD -ato�� -bool r/runc-log.json /opt/hostedtoolcache/go/1.24.10/x64/pkg/tool/linux_amd64/vet -errorsas -ifaceassert -nilfunc /opt/hostedtoolcfilter(dns block)/update-job-proxy /update-job-proxy conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT 5495d30143fbecc5--format=format:%H %ct %D /bin/git --detach od /bin/git /usr/bin/git init�� a89987915194adde--depth=1 ce50ae9e:go.mod /bin/git om/spf13/cobra 42642302:go.mod /usr/lib/git-cor-t git(dns block)/update-job-proxy /update-job-proxy conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT bbc7f005:go.mod /home/dependabotrefs/tags/v2.4.0 --pack_header=2,/usr/bin/git REDACTED /bin/git git conf�� tformat /usr/bin/git e/git =2 d7cf7b34:go.mod /bin/git e/git(dns block)gopkg.in/update-job-proxy /update-job-proxy github.com/TUM-D-c -lang=go1.24 /opt/hostedtoolclog -uns�� _base.go r/runc-log.json bash -c=4 -nolocalimports -importcfg /opt/hostedtoolcHEAD -ato�� -bool r/runc-log.json /opt/hostedtoolcache/go/1.24.10/x64/pkg/tool/linux_amd64/vet -errorsas -ifaceassert -nilfunc /opt/hostedtoolcfilter(dns block)/update-job-proxy /update-job-proxy conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT 5495d30143fbecc5--format=format:%H %ct %D /bin/git --detach od /bin/git /usr/bin/git init�� a89987915194adde--depth=1 ce50ae9e:go.mod /bin/git om/spf13/cobra 42642302:go.mod /usr/lib/git-cor-t git(dns block)/update-job-proxy /update-job-proxy conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT bbc7f005:go.mod /home/dependabotrefs/tags/v2.4.0 --pack_header=2,/usr/bin/git REDACTED /bin/git git conf�� tformat /usr/bin/git e/git =2 d7cf7b34:go.mod /bin/git e/git(dns block)gorm.io/update-job-proxy /update-job-proxy github.com/TUM-D-c -lang=go1.24 /opt/hostedtoolclog -uns�� _base.go r/runc-log.json bash -c=4 -nolocalimports -importcfg /opt/hostedtoolcHEAD -ato�� -bool r/runc-log.json /opt/hostedtoolcache/go/1.24.10/x64/pkg/tool/linux_amd64/vet -errorsas -ifaceassert -nilfunc /opt/hostedtoolcfilter(dns block)/update-job-proxy /update-job-proxy conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT 5495d30143fbecc5--format=format:%H %ct %D /bin/git --detach od /bin/git /usr/bin/git init�� a89987915194adde--depth=1 ce50ae9e:go.mod /bin/git om/spf13/cobra 42642302:go.mod /usr/lib/git-cor-t git(dns block)/update-job-proxy /update-job-proxy conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT bbc7f005:go.mod /home/dependabotrefs/tags/v2.4.0 --pack_header=2,/usr/bin/git REDACTED /bin/git git conf�� tformat /usr/bin/git e/git =2 d7cf7b34:go.mod /bin/git e/git(dns block)moul.io/update-job-proxy /update-job-proxy github.com/TUM-D-c -lang=go1.24 /opt/hostedtoolclog -uns�� _base.go r/runc-log.json bash -c=4 -nolocalimports -importcfg /opt/hostedtoolcHEAD -ato�� -bool r/runc-log.json /opt/hostedtoolcache/go/1.24.10/x64/pkg/tool/linux_amd64/vet -errorsas -ifaceassert -nilfunc /opt/hostedtoolcfilter(dns block)/update-job-proxy /update-job-proxy conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT 5495d30143fbecc5--format=format:%H %ct %D /bin/git --detach od /bin/git /usr/bin/git init�� a89987915194adde--depth=1 ce50ae9e:go.mod /bin/git om/spf13/cobra 42642302:go.mod /usr/lib/git-cor-t git(dns block)/update-job-proxy /update-job-proxy conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT bbc7f005:go.mod /home/dependabotrefs/tags/v2.4.0 --pack_header=2,/usr/bin/git REDACTED /bin/git git conf�� tformat /usr/bin/git e/git =2 d7cf7b34:go.mod /bin/git e/git(dns block)mvdan.cc/update-job-proxy /update-job-proxy github.com/TUM-D-c -lang=go1.24 /opt/hostedtoolclog -uns�� _base.go r/runc-log.json bash -c=4 -nolocalimports -importcfg /opt/hostedtoolcHEAD -ato�� -bool r/runc-log.json /opt/hostedtoolcache/go/1.24.10/x64/pkg/tool/linux_amd64/vet -errorsas -ifaceassert -nilfunc /opt/hostedtoolcfilter(dns block)/update-job-proxy /update-job-proxy conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT 5495d30143fbecc5--format=format:%H %ct %D /bin/git --detach od /bin/git /usr/bin/git init�� a89987915194adde--depth=1 ce50ae9e:go.mod /bin/git om/spf13/cobra 42642302:go.mod /usr/lib/git-cor-t git(dns block)/update-job-proxy /update-job-proxy conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT bbc7f005:go.mod /home/dependabotrefs/tags/v2.4.0 --pack_header=2,/usr/bin/git REDACTED /bin/git git conf�� tformat /usr/bin/git e/git =2 d7cf7b34:go.mod /bin/git e/git(dns block)nullprogram.com/update-job-proxy /update-job-proxy github.com/TUM-D-c -lang=go1.24 /opt/hostedtoolclog -uns�� _base.go r/runc-log.json bash -c=4 -nolocalimports -importcfg /opt/hostedtoolcHEAD -ato�� -bool r/runc-log.json /opt/hostedtoolcache/go/1.24.10/x64/pkg/tool/linux_amd64/vet -errorsas -ifaceassert -nilfunc /opt/hostedtoolcfilter(dns block)/update-job-proxy /update-job-proxy conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT 5495d30143fbecc5--format=format:%H %ct %D /bin/git --detach od /bin/git /usr/bin/git init�� a89987915194adde--depth=1 ce50ae9e:go.mod /bin/git om/spf13/cobra 42642302:go.mod /usr/lib/git-cor-t git(dns block)/update-job-proxy /update-job-proxy conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT bbc7f005:go.mod /home/dependabotrefs/tags/v2.4.0 --pack_header=2,/usr/bin/git REDACTED /bin/git git conf�� tformat /usr/bin/git e/git =2 d7cf7b34:go.mod /bin/git e/git(dns block)sigs.k8s.io/update-job-proxy /update-job-proxy github.com/TUM-D-c -lang=go1.24 /opt/hostedtoolclog -uns�� _base.go r/runc-log.json bash -c=4 -nolocalimports -importcfg /opt/hostedtoolcHEAD -ato�� -bool r/runc-log.json /opt/hostedtoolcache/go/1.24.10/x64/pkg/tool/linux_amd64/vet -errorsas -ifaceassert -nilfunc /opt/hostedtoolcfilter(dns block)/update-job-proxy /update-job-proxy conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT 5495d30143fbecc5--format=format:%H %ct %D /bin/git --detach od /bin/git /usr/bin/git init�� a89987915194adde--depth=1 ce50ae9e:go.mod /bin/git om/spf13/cobra 42642302:go.mod /usr/lib/git-cor-t git(dns block)/update-job-proxy /update-job-proxy conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT bbc7f005:go.mod /home/dependabotrefs/tags/v2.4.0 --pack_header=2,/usr/bin/git REDACTED /bin/git git conf�� tformat /usr/bin/git e/git =2 d7cf7b34:go.mod /bin/git e/git(dns block)If you need me to access, download, or install something from one of these locations, you can either:
Original prompt
💡 You can make Copilot smarter by setting up custom instructions, customizing its development environment and configuring Model Context Protocol (MCP) servers. Learn more Copilot coding agent tips in the docs.