From decd23975065b876fc3eb8f702c247da3d7817ab Mon Sep 17 00:00:00 2001 From: Salastil Date: Sat, 22 Aug 2026 17:52:38 -0400 Subject: [PATCH] Give Sneedchat its brand mark, and drop rail entries nothing can reach The account entry is the home for buffers no backend grouped, which is how IRC, Sneedchat and Matrix reach the rail at all. Discord never uses it - every channel belongs to a guild and every DM to the DM entry - so it drew a tile that opened an empty pane. Emptiness alone is not grounds for hiding one: IRC and Sneedchat have no buffers either until they finish connecting, and Sneedchat's Tor bootstrap makes that several seconds. So an entry survives if something is under it, or if its account has no buffers anywhere yet, and only one whose buffers all live elsewhere is dropped. The rail and the channel pane share that rule rather than each applying its own - if they disagreed the selected group could be one with no tile, leaving a pane with no way out of it. Sneedchat replaces its vpn_lock placeholder with the real mark. The supplied artwork was a screenshot with the background baked in, which would have masked to a solid square, so the background is keyed out to alpha - keeping the eye as a hole so the silhouette still reads. Since serviceIcon's artwork is no longer always an SVG, its field is renamed to `mark`, and a `colour` flag marks artwork worth showing unflattened: the rail has room and already sits beside full-colour guild icons, while the same file still masks to a monochrome glyph in the buffer rows. --- src/renderer/src/app.css | 10 ++++++ src/renderer/src/assets/sneedchat.png | Bin 0 -> 28718 bytes src/renderer/src/components/AccountsPanel.tsx | 6 ++-- src/renderer/src/components/BufferList.tsx | 8 +++-- src/renderer/src/components/ServerRail.tsx | 16 ++++++--- src/renderer/src/lib/groups.ts | 33 ++++++++++++++++++ src/renderer/src/lib/util.ts | 27 +++++++++++--- 7 files changed, 86 insertions(+), 14 deletions(-) create mode 100644 src/renderer/src/assets/sneedchat.png create mode 100644 src/renderer/src/lib/groups.ts diff --git a/src/renderer/src/app.css b/src/renderer/src/app.css index 21dc5bd..9567fca 100644 --- a/src/renderer/src/app.css +++ b/src/renderer/src/app.css @@ -1735,3 +1735,13 @@ video.lightbox-media { min-width: 0; font-weight: 600; } + +/* A brand mark kept in its own colours. Unlike a guild icon it is a logo + rather than a photo, so it is fitted with breathing room instead of cropped + to fill the tile. */ +.rail-mark { + width: 74%; + height: 74%; + object-fit: contain; + display: block; +} diff --git a/src/renderer/src/assets/sneedchat.png b/src/renderer/src/assets/sneedchat.png new file mode 100644 index 0000000000000000000000000000000000000000..a3c568d4a15fd315e5881351dc006d92b38cca1c GIT binary patch literal 28718 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 setAdding(adding === service ? null : service)} > - {icon.svg ? : } + {icon.mark ? : } {serviceLabel(service)} ) @@ -72,8 +72,8 @@ function AccountRow({ account }: { account: Account }): JSX.Element {
{account.avatarUrl ? ( - ) : icon.svg ? ( - + ) : icon.mark ? ( + ) : ( )} diff --git a/src/renderer/src/components/BufferList.tsx b/src/renderer/src/components/BufferList.tsx index d956318..0d35863 100644 --- a/src/renderer/src/components/BufferList.tsx +++ b/src/renderer/src/components/BufferList.tsx @@ -2,6 +2,7 @@ import { useMemo } from 'react' import { Icon, IconButton, MaskIcon } from './Icon' import { ContextMenu, useContextMenu, type MenuEntry } from './ContextMenu' import { useChat, useIdSetPref, usePref, useStore } from '../state/hooks' +import { visibleGroups } from '../lib/groups' import type { BufferEntry } from '../state/store' import { bufferDisplayName, @@ -38,7 +39,8 @@ export function BufferList(): JSX.Element { // A stale selection (a guild that went away, a first run) resolves to the // first entry rather than an empty pane. - const activeGroup = groups.find((g) => g.id === activeGroupId) || groups[0] + const shownGroups = useMemo(() => visibleGroups(groups, visible), [groups, visible]) + const activeGroup = shownGroups.find((g) => g.id === activeGroupId) || shownGroups[0] const groupAccount = accounts.find((a) => a.id === activeGroup?.accountId) // Server buffer first, then most recent activity - the ordering nobilis's @@ -243,8 +245,8 @@ function BufferRow({ // name as text in front of every entry. const service = serviceIcon(account?.service ?? '') const leading = showServiceIcon ? ( - service.svg ? ( - + service.mark ? ( + ) : ( ) diff --git a/src/renderer/src/components/ServerRail.tsx b/src/renderer/src/components/ServerRail.tsx index e18a1fd..5668884 100644 --- a/src/renderer/src/components/ServerRail.tsx +++ b/src/renderer/src/components/ServerRail.tsx @@ -1,6 +1,7 @@ import { Icon, MaskIcon } from './Icon' import { useChat, useStore } from '../state/hooks' import { nickColor, resolveMediaUrl, serviceIcon } from '../lib/util' +import { visibleGroups } from '../lib/groups' import type { BufferGroup } from '../../../shared/wire' import type { BufferEntry } from '../state/store' @@ -41,8 +42,13 @@ function RailTile({ group, active, unread, highlight, onSelect }: TileProps): JS content = } else if (group.kind === 'dms') { content = + } else if (group.kind === 'account' && service.mark && service.colour) { + // Artwork with colour worth keeping, shown as-is rather than flattened to + // a silhouette - it sits beside full-colour guild icons here, and this is + // the one place with room for it. + content = } else if (group.kind === 'account') { - content = service.svg ? : + content = service.mark ? : } else { content = ( @@ -82,8 +88,6 @@ export function ServerRail(): JSX.Element | null { const activeGroupId = useChat((s) => s.activeGroupId) const buffers = useChat((s) => s.buffers) - if (groups.length <= 1) return null - // Unread rolls up from the buffers under each entry, so a guild whose // channels are all collapsed away still shows it has something waiting. const totals = new Map() @@ -95,9 +99,13 @@ export function ServerRail(): JSX.Element | null { totals.set(b.groupId, t) } + const visible = visibleGroups(groups, buffers as BufferEntry[]) + + if (visible.length <= 1) return null + return (