.main-header has no fixed height and no divider (app.css:116-131); at ~38px it doesn't line up with the sidebar's .group-title (4394) or .nicklist-header (1841). Discord uses one 48px row with a single divider across all columns.
Toggles are inconsistent: the member list swaps group/group_off icons (App.tsx:213) while other header toggles use an active class (ConversationTools.tsx:147, 221).
No channel topic is shown. The Buffer wire type has no topic (only VoiceChannel.topic).
Fix: one 48px header row aligned across columns; every toggle uses active + filled icon; the topic shown on one line, click for the full text. Daemon work: add topic to Buffer (nobilis/src/model.rs:236) from IRC 332/TOPIC, Matrix m.room.topic, Discord channel.topic.
Part of the v1.0 UI pass.
- `.main-header` has no fixed height and no divider (app.css:116-131); at ~38px it doesn't line up with the sidebar's `.group-title` (4394) or `.nicklist-header` (1841). Discord uses one 48px row with a single divider across all columns.
- Toggles are inconsistent: the member list swaps `group`/`group_off` icons (App.tsx:213) while other header toggles use an `active` class (ConversationTools.tsx:147, 221).
- No channel topic is shown. The `Buffer` wire type has no topic (only `VoiceChannel.topic`).
**Fix:** one 48px header row aligned across columns; every toggle uses `active` + filled icon; the topic shown on one line, click for the full text. **Daemon work:** add `topic` to `Buffer` (`nobilis/src/model.rs:236`) from IRC 332/TOPIC, Matrix `m.room.topic`, Discord `channel.topic`.
_Part of the v1.0 UI pass._
Salastil
added this to the v1.0 milestone 2026-10-07 20:43:05 -04:00
The header is one row across the window, and it now says what the conversation is for.
48px, aligned: the server name, the conversation header and the member list header share --header-height (48px) and each has the same divider under it, so it is one line across the window. Measured in the running app: all three at 44→92. (The channel list had 4px of padding above its heading, which put it 4px low; gone.)
Toggles are consistent: the member list no longer swaps group/group_off; it is the group glyph with the active class like the others, and any IconButton with active is now drawn filled as well as tinted, so every header toggle reads as on without relying on colour.
Topic: shown on one line beside the name with a divider; clicking opens the whole of it with live links. Daemon (nobilis 44d1611):Buffer.topic, set from IRC 332 / 331 / TOPIC, Matrix m.room.topic (kept against the room so a buffer made later gets it), and Discord channel topic (including the edit that arrives as a channel update with the name unchanged). Broadcast only when it changes, and a cleared topic is carried through to the window.
Clippy and the 860 daemon tests pass; the layout check is unchanged.
Not exercised live: the topic itself coming from a real server - the pictures use a staged topic. IRC 332/TOPIC and Matrix are the parts that have no test beyond compiling.
The row - before (top), after (bottom):
The topic opened:
Finished: [2ef9e35](https://git.salastil.com/Salastil/moho/commit/2ef9e35c9e8c3cf72f92dd373bcab36dff63c94a).
The header is one row across the window, and it now says what the conversation is for.
- **48px, aligned:** the server name, the conversation header and the member list header share `--header-height` (48px) and each has the same divider under it, so it is one line across the window. Measured in the running app: all three at 44→92. (The channel list had 4px of padding above its heading, which put it 4px low; gone.)
- **Toggles are consistent:** the member list no longer swaps `group`/`group_off`; it is the `group` glyph with the `active` class like the others, and any `IconButton` with `active` is now drawn filled as well as tinted, so every header toggle reads as on without relying on colour.
- **Topic:** shown on one line beside the name with a divider; clicking opens the whole of it with live links. **Daemon (nobilis 44d1611):** `Buffer.topic`, set from IRC 332 / 331 / TOPIC, Matrix `m.room.topic` (kept against the room so a buffer made later gets it), and Discord channel `topic` (including the edit that arrives as a channel update with the name unchanged). Broadcast only when it changes, and a cleared topic is carried through to the window.
- Clippy and the 860 daemon tests pass; the layout check is unchanged.
- Not exercised live: the topic itself coming from a real server - the pictures use a staged topic. IRC 332/TOPIC and Matrix are the parts that have no test beyond compiling.
The row - before (top), after (bottom):

The topic opened:

Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
.main-headerhas no fixed height and no divider (app.css:116-131); at ~38px it doesn't line up with the sidebar's.group-title(4394) or.nicklist-header(1841). Discord uses one 48px row with a single divider across all columns.group/group_officons (App.tsx:213) while other header toggles use anactiveclass (ConversationTools.tsx:147, 221).Bufferwire type has no topic (onlyVoiceChannel.topic).Fix: one 48px header row aligned across columns; every toggle uses
active+ filled icon; the topic shown on one line, click for the full text. Daemon work: addtopictoBuffer(nobilis/src/model.rs:236) from IRC 332/TOPIC, Matrixm.room.topic, Discordchannel.topic.Part of the v1.0 UI pass.
Finished: 2ef9e35.
The header is one row across the window, and it now says what the conversation is for.
--header-height(48px) and each has the same divider under it, so it is one line across the window. Measured in the running app: all three at 44→92. (The channel list had 4px of padding above its heading, which put it 4px low; gone.)group/group_off; it is thegroupglyph with theactiveclass like the others, and anyIconButtonwithactiveis now drawn filled as well as tinted, so every header toggle reads as on without relying on colour.Buffer.topic, set from IRC 332 / 331 / TOPIC, Matrixm.room.topic(kept against the room so a buffer made later gets it), and Discord channeltopic(including the edit that arrives as a channel update with the name unchanged). Broadcast only when it changes, and a cleared topic is carried through to the window.The row - before (top), after (bottom):
The topic opened: