- Shipped
- August 30, 2026 at 1:52 AM UTC
- Author
- Kamo
- Commit
- abd4c1c
Five requests from a member, all of them about the same gap: the Chats panel could show you conversations but gave you nothing to do with them. Chats is now the first tab and the one the panel opens on. The button that opens this panel is the Chat button — landing on the Directory made the common case, carrying on a conversation you are already having, a tab switch away every single time. A collapsible Favourites section sits above the list, per sub-tab, and it is fetched separately on purpose. The list pages by last activity, so a conversation starred precisely because it matters but quiet for a month is several pages down; a section assembled from whatever had already been scrolled into view would show that person some days and not others. The fold is remembered per pane instance, for the same reason preferenceKey is a prop — the Interaction Center and a maximized window's switcher column are two live mounts and would otherwise clobber each other. The star is offered only where the server can record one, which is CHAT: a social conversation has no membership row for the viewer at all. Group chats can be named. A name the members chose is checked BEFORE the derived one everywhere it is read — the row, the window title, the roster header — because otherwise "Some chat" reverts to "Sage, Claudius +1" the moment somebody is added, which is the case naming exists for. A blank name is not a name; it falls back rather than blanking the title. A roster button on a group window opens the popover that answers "who else is in here" — until now the title bar's "+1 more" was the whole answer and there was nowhere to expand it. Naming and removal live in there too, because both are things you decide while looking at the list of people. The window title already ellipsized; what was missing was the way to see past it. Somebody can be removed. The transcript line for it has existed since the beginning — SystemMessage has always rendered "{actor} removed {target}" for a transit with isJoin=false — and nothing had ever written one. Removal is confirmed inside the row rather than in a dialog: a modal over a popover is two layers of chrome for a two-word question, asked about a list it would cover up. Being removed yourself closes the window, because every request it could make from that point answers 403 and a chat that has silently stopped working is worse left open. Every rule about who may do what is the server's, and its wording is shown verbatim when it refuses. A rule stated generically reads as a bug. Needs @kamo/chat-core 0.1.12 and MediaService aed30b1.