Preview cards in sections (Community, the file's own @section, Seasonal, Haven). Members see built-ins and published themes; admins also get an Available to publish section with a publish switch on every theme file's card.
* Themes: Glassy Neon and seasonal themes (Christmas, Halloween, Thanksgiving)
- Add themes/glassy-neon.theme.css: Tron-inspired cyberpunk glassmorphism with perspective neon floor grid, laser glow borders, and rotating identity disc.
- Add themes/christmas.theme.css: Festive evergreen pine with twinkling string lights, falling snow, candy-cane borders, and glowing Christmas tree (@section Seasonal).
- Add themes/halloween.theme.css: Eerie gothic midnight with drifting ghostly mist, flying witch moon, carved jack-o'-lantern, blinking black cat, and dripping toxic slime borders (@section Seasonal).
- Add themes/thanksgiving.theme.css: Warm autumn harvest with tumbling fall leaves, waddling turkey watermark, harvest garland, and striped borders (@section Seasonal).
- Parse optional @section and @category metadata tags in src/themeMetadata.js.
- Organize theme pickers and admin settings so seasonal themes appear in a dedicated 'Seasonal' group.
- Support prefers-reduced-motion in all four new themes.
- Document bundled additions in GUIDE.md.
* Themes: rebuild Glassy Neon and the seasonal themes as full scenes
Restyle every surface of the four themes (server rail, sidebars, header,
topic bar, message list, composer, buttons, inputs, scrollbars, modals,
theme popup and the login page) and give each a layered, animated scene
drawn with self-contained SVG data URIs.
- Glassy Neon: Haven on the Grid. Opaque holo-glass panels with lit cyan
and orange edge rails, circuit traces, data streams running down the
rails, light-cycle trails along the header and composer, a perspective
light floor that races toward the viewer, horizon ridges, a scan sweep,
counter-rotating identity disc rings and glitch hover accents.
- Christmas: a cozy cabin looking out on a moonlit pine forest. Plaid
walls, a fireplace with stockings and flickering flames, a decorated tree
with twinkling lights and presents, garland and string lights on the
header, snow caps, frosted window corners and three parallax snow layers.
- Halloween: a cartoony haunted night. Bats crossing a big moon, graveyard
fog, a floating ghost, flickering jack-o'-lanterns, a black cat with
glowing eyes and a swishing tail, a bubbling cauldron, cobwebs, a
dangling spider and green goo that drips from the header and composer.
- Thanksgiving: a harvest evening. Two parallax layers of falling leaves,
swaying maple trees, a farmstead sunset, a leaf garland, flannel and
barn-wood panels, hay bales, corn shocks, pumpkins, and two turkeys that
wobble, gobble and strut.
Decorations use pointer-events: none and sit behind content in negative
z-index layers, the message column keeps a dark veil so message text stays
above WCAG AA, animations only change transform and opacity, and
prefers-reduced-motion stops every animation. Pseudo-element rules raise
their specificity so the effects overlay system does not strip them.
Move the seasonal-theme check into HavenThemeCompat.isSeasonalTheme so the
theme bar, plugin loader and admin list share one implementation, and test
it.
`default_theme` holds `file:<name>` for a theme that ships as a file. A bare filename is
the same intent — it is what someone writes by hand — but the client branches on that
prefix to tell a file theme from a built-in name, so a bare name is applied as an unknown
built-in: the page sets \`data-theme\` and loads no stylesheet, and nothing reports an
error.
Normalise when the name resolves to a published, compatible theme. A name that could only
be a theme file, and does not resolve to one, now yields \x27\x27 instead of reaching the client.
Built-in names are untouched.
File themes that set the page background (Braid, Braid Light, Compact) are treated as full palettes: turning one on in Settings selects it in the picker instead of layering its colours on top of Matrix or another built-in theme. The theme popup gains a Layout section with Braid and Compact switches so the chrome can be changed without touching the picker colours. Picking a built-in theme now saves first and then reapplies only the real CSS tweaks, so the Settings toggles and the picker agree.