gocast icon indicating copy to clipboard operation
gocast copied to clipboard

Add extensible site theme system with Christmas theme

Open Copilot opened this issue 2 months ago • 0 comments

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: SiteSetting key-value model, Theme struct, AvailableThemes() registry
  • dao/site-settings.go: SiteSettingsDao for persistence
  • api/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 globally
  • web/assets/css/themes.css: Snowflake animations with prefers-reduced-motion support
  • Admin UI in Maintenance page for theme selection

Adding new themes:

// 1. model/site-settings.go
const ThemeHalloween ThemeID = "halloween"

// In AvailableThemes():
{ID: ThemeHalloween, Name: "Halloween", Description: "Spooky theme", Icon: "fa-ghost"}
// 2. web/ts/theme-manager.ts
class HalloweenTheme implements ThemeEffects { ... }
// Register in themeEffects map

Steps for Testing

Prerequisites:

  • 1 Admin user
  1. Log in as admin
  2. Navigate to Admin → Maintenance
  3. In "Site Theme" section, select "Christmas"
  4. Verify snowflakes appear across all pages
  5. Open in incognito/different browser to confirm theme applies to all users
  6. Select "Default" to disable

Screenshots

Christmas theme with admin UI

[!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
    • Triggering command: /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)
    • Triggering command: /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)
    • Triggering command: /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
    • Triggering command: /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)
    • Triggering command: /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)
    • Triggering command: /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
    • Triggering command: /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)
    • Triggering command: /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)
    • Triggering command: /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
    • Triggering command: /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)
    • Triggering command: /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)
    • Triggering command: /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
    • Triggering command: /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)
    • Triggering command: /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)
    • Triggering command: /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
    • Triggering command: /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)
    • Triggering command: /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)
    • Triggering command: /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
    • Triggering command: /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)
    • Triggering command: /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)
    • Triggering command: /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
    • Triggering command: /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)
    • Triggering command: /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)
    • Triggering command: /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
    • Triggering command: /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)
    • Triggering command: /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)
    • Triggering command: /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
    • Triggering command: /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)
    • Triggering command: /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)
    • Triggering command: /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
    • Triggering command: /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)
    • Triggering command: /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)
    • Triggering command: /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
    • Triggering command: /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)
    • Triggering command: /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)
    • Triggering command: /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

Create a christmas theme on all of the pages that could be activated in the admin UI but for all users


💡 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.

Copilot avatar Dec 05 '25 20:12 Copilot