Skip to content

Conversation

Copy link
Contributor

Copilot AI commented Dec 5, 2025

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 AI and others added 2 commits December 5, 2025 21:06
- Create SiteSetting model for storing site-wide settings
- Add SiteSettingsDao for database operations
- Create API endpoints for theme management (/api/theme/*)
- Add theme manager TypeScript for applying themes on all pages
- Create Christmas theme with snowflake animation effects
- Add admin UI for theme selection in maintenance page
- System is extensible - new themes can be added by:
  1. Adding a ThemeID constant and Theme in model/site-settings.go
  2. Creating theme effects in web/ts/theme-manager.ts
  3. Adding CSS in web/assets/css/themes.css

Co-authored-by: SebiWrn <[email protected]>
- Use modern element.remove() instead of parentNode.removeChild()
- Simplify redundant condition check for themeId
- Keep snowflakes visible (with reduced opacity) for prefers-reduced-motion users instead of hiding entirely

Co-authored-by: SebiWrn <[email protected]>
Copilot AI changed the title [WIP] Add Christmas theme for all user pages Add extensible site theme system with Christmas theme Dec 5, 2025
Copilot AI requested a review from SebiWrn December 5, 2025 21:23
@SebiWrn SebiWrn marked this pull request as ready for review December 5, 2025 21:50
Copy link
Member

@joschahenningsen joschahenningsen left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Honestly I think this is a bit much for a theme. Let's just throw a css file into headimports if we want to make this festive. For other site-settings/configurations in the future, let's consider putting them behind a simple feature flag and not try to over-engineer something now that we don't have a usecase for yet.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants