Zoom moves into a new Accessibility section (the section keeps its
section-zoom id, which layout plugins anchor to) next to:
- Message text size, 80 to 200 %, separate from Zoom: messages, threads,
forum posts, code blocks and the message boxes.
- Line spacing (normal, relaxed, loose) and letter spacing (normal, wide).
- Font: the theme's, the system's, Atkinson Hyperlegible or OpenDyslexic,
self-hosted under SIL OFL 1.1 with their licenses in /fonts.
- High contrast: secondary text and borders pulled toward each theme's own
text color, and a thick focus ring.
- Reduce motion: follow system, on or off. One html.reduce-motion class now
covers every animation, the theme effects, the shimmering role colors,
smooth scrolling, and GIFs, animated emoji and profile pictures, which
wait for hover or tap. The old prefers-reduced-motion rules use it too.
- Underline links, and larger click targets.
Everything is per device and applied by theme-init.js before first paint,
which hands the same read/apply functions to the settings page.
Also: keyboard focus rings, keyboard-reachable settings nav rows,
aria-labels on the icon buttons in the channel header and message box, and
aria-pressed on the picker buttons.
Co-authored-by: ancsemi <ancsemi@gmail.com>
All opt-in; nothing changes until someone picks a setting.
- Keep official mode on (Settings > Chat, saved on the account as
users.official_mode, every device follows through set-official-mode /
official-mode-changed). The megaphone then rests armed, so staff don't
re-arm it for every message; pressing it sends just the next message
plain. The client still sends highlight: true per message, so the wire
format and the server's checks are unchanged.
- Official messages look (Settings > Chat, per device): Badge (the default,
as before), Colored text (the text and a lighter wash in the role's color,
a thinner bar, no badge; text mixed with the theme's own text color, more
of it on light themes), or Off.
- With Colored text, consecutive official messages from one person group
into one block. Badge keeps every official message's own header.
- session-info carries features: ['highlight_messages', 'official_mode'] and
officialMode, so apps can tell what a server supports.
A Blog mode row in Channel Functions for forums, next to Votes on posts.
When it is on, the list, gallery and feed cards show the number of comments
(or "Comment" when there are none) instead of replies. An open topic shows
the post first, with the author's own follow-ups under it as more of the
post, then a Comments heading with its count and everyone else's replies,
newest last. The message box says "Add to your post..." for the author and
"Write a comment..." for everyone else. New replies land in the right
section live, deleting a comment updates the count, and switching the mode
redraws the forum and any open topic for everyone viewing it. It works the
same in the side panel, full width and pop-out thread views.
Starting topics, reactions and votes are unchanged, and with Blog mode off a
forum behaves exactly as before. The client side is a new app-forum-blog.js
module.
A new Channel Functions row for forums, "Votes on posts", picks Off (the
default), Likes, or Likes and dislikes. Anyone who can change the channel's
settings can set it.
When votes are on, every topic shows a like button with its count, plus a
dislike button when dislikes are allowed, in the list, gallery and feed views
and in the bar above an open topic. Each member has one vote per topic:
clicking it again takes it back, and liking replaces a dislike (and the other
way round). Counts update live for everyone viewing the forum without saying
who voted. Only members who can see the forum can vote, muted members cannot,
and votes are refused while the setting is Off (stored votes are kept and come
back if it is turned on again). The forum's sort menu gains "Most liked" while
votes are on.
Votes live in a new forum_votes table set up by src/forumVotes.js; the socket
handlers are in src/socketHandlers/forumVotes.js and the client side in a new
app-forum-votes.js module. Reactions are unchanged.
Admins tick which of their own look-and-feel settings to share and save
them with one button, can clear them, and can apply them once to
everyone. Members get the settings kept in the browser once at their
first load, only where the browser still has Haven's built-in value or
the value an earlier set put there, so their own changes always win.
Admins download the template under Settings > Admin > Server Template, and import
one with a preview of what it will create or update. Add missing leaves existing
channels, roles and settings alone; Replace layout updates them to match. Neither
mode deletes anything. Members, messages, DMs, keys, invite and channel codes,
webhook tokens and secret settings are never exported. Settings go through an
allowlist, and imports are validated strictly: sizes, names, references, image
types and checksums.
The channel-name rule, built-in theme list, automod word and escalation checks
and image sniffing now each live in one place, since the template code shares
them.
Co-authored-by: ancsemi <ancsemi@gmail.com>
The Braid and Compact switches become a single picker: Original (Haven's
own layout) and every <Name>Layout.plugin.js on the server, one at a time.
A new layout plugin shows up without any change to Haven, so alternative
sidebars can ship as layouts while Original stays the default. The picker
shows the chosen layout even while it waits (Compact needs a wide window,
Braid waits for Mod Mode), and follows Braid's own shortcut and menu.
theme-authoring.md says what a plugin needs to appear there.