User footer: red muted states and a real status popout #290

Closed
opened 2026-10-07 20:43:06 -04:00 by Salastil · 1 comment
Owner
  • Mic/deafen buttons get a muted class (UserFooter.tsx:96, 108) but there's no .user-audio-button.muted CSS; only the glyph changes. Discord turns them red.
  • The voice buttons appear only for Discord/Matrix accounts (74), so the footer changes layout per server.
  • Status is a context menu with monochrome glyphs (22-34); the current one is marked by appending " ✓" to its label (139) because the menu has no checked state. Status is per account only, with no custom status text.

Fix: red muted/deafened states; a fixed footer layout (voice buttons disabled, not removed); a status popout with coloured dots, a real checked state, "Apply to all accounts", and custom status text. Daemon work: Discord custom status (gateway presence activity type 4) and Matrix presence status_msg.

Part of the v1.0 UI pass.

- Mic/deafen buttons get a `muted` class (UserFooter.tsx:96, 108) but there's no `.user-audio-button.muted` CSS; only the glyph changes. Discord turns them red. - The voice buttons appear only for Discord/Matrix accounts (74), so the footer changes layout per server. - Status is a context menu with monochrome glyphs (22-34); the current one is marked by appending " ✓" to its label (139) because the menu has no checked state. Status is per account only, with no custom status text. **Fix:** red muted/deafened states; a fixed footer layout (voice buttons disabled, not removed); a status popout with coloured dots, a real checked state, "Apply to all accounts", and custom status text. **Daemon work:** Discord custom status (gateway presence activity type 4) and Matrix presence `status_msg`. _Part of the v1.0 UI pass._
Salastil added this to the v1.0 milestone 2026-10-07 20:43:06 -04:00
Salastil added the feature label 2026-10-07 20:43:06 -04:00
Author
Owner

Finished: c026609.

The footer now says what state you are in, keeps its shape, and the status has a proper home.

  • Muted and deafened are red (.user-audio-button.muted did not exist: only the glyph changed). A tinted red button with a red glyph, brighter on hover.
  • One footer layout on every service: the mic and deafen buttons are always drawn; where there is nothing to apply them to (IRC, Kick, Sneedchat with no call up) they are greyed with "Voice isn't available on X" on hover, instead of vanishing and shifting the row.
  • Status popout (replaces the context menu with " ✓" in its labels): each status in its own colour dot with a real checked state (menuitemradio, aria-checked), "You will appear offline" under Invisible, Sign out apart at the bottom; opens above the footer, Esc and outside-click close it. It is in the layout check too, at both window sizes.
  • Custom status where the service has somewhere to put one - Discord and Matrix; Enter saves, the cross clears. Daemon (nobilis f280563): setAccountStatus takes an optional statusText; Discord sends it as the gateway presence's type-4 activity and, when it is being changed, as custom_status in the account settings (a plain change of colour leaves the account's own custom status alone); Matrix puts it in the presence status_msg. listAccounts reports it as statusText. Held per daemon session, like the status itself.
  • Apply to all accounts: a switch (remembered, status.applyToAll) that makes the next choice go to every signed-in account, without connecting any that are signed out.
  • Tests: Discord presence payload and settings body in nobilis; behaviour checked in the app (choices and tick, no custom status on IRC, choosing closes and applies, the switch persists, Esc closes, voice buttons disabled not removed on IRC). Clippy and 860 daemon tests pass.
  • Not exercised live: sending a custom status to Discord or Matrix (the test account is receive-only).

The popout - before (left), after (right):

popout

Muted/deafened (top row: before, after) and the IRC footer (bottom row: before, after):

states

Finished: [c026609](https://git.salastil.com/Salastil/moho/commit/c026609e4bb6094cc244ba8c4fee133fa56840b6). The footer now says what state you are in, keeps its shape, and the status has a proper home. - **Muted and deafened are red** (`.user-audio-button.muted` did not exist: only the glyph changed). A tinted red button with a red glyph, brighter on hover. - **One footer layout on every service:** the mic and deafen buttons are always drawn; where there is nothing to apply them to (IRC, Kick, Sneedchat with no call up) they are greyed with "Voice isn't available on X" on hover, instead of vanishing and shifting the row. - **Status popout** (replaces the context menu with " ✓" in its labels): each status in its own colour dot with a real checked state (`menuitemradio`, `aria-checked`), "You will appear offline" under Invisible, Sign out apart at the bottom; opens above the footer, Esc and outside-click close it. It is in the layout check too, at both window sizes. - **Custom status** where the service has somewhere to put one - Discord and Matrix; Enter saves, the cross clears. **Daemon (nobilis f280563):** `setAccountStatus` takes an optional `statusText`; Discord sends it as the gateway presence's type-4 activity and, when it is being changed, as `custom_status` in the account settings (a plain change of colour leaves the account's own custom status alone); Matrix puts it in the presence `status_msg`. `listAccounts` reports it as `statusText`. Held per daemon session, like the status itself. - **Apply to all accounts:** a switch (remembered, `status.applyToAll`) that makes the next choice go to every signed-in account, without connecting any that are signed out. - Tests: Discord presence payload and settings body in nobilis; behaviour checked in the app (choices and tick, no custom status on IRC, choosing closes and applies, the switch persists, Esc closes, voice buttons disabled not removed on IRC). Clippy and 860 daemon tests pass. - Not exercised live: sending a custom status to Discord or Matrix (the test account is receive-only). The popout - before (left), after (right): ![popout](https://git.salastil.com/attachments/4082ef34-ba4b-4c88-b4f3-3b17a061580a) Muted/deafened (top row: before, after) and the IRC footer (bottom row: before, after): ![states](https://git.salastil.com/attachments/4cc8adac-99ba-4246-92f0-6c541a189d40)
Sign in to join this conversation.
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: Salastil/moho#290