Whispers are purple, and stay where you are

Sending one used to go and find the Whispers buffer and open it, which
took you out of the room you were talking in every time you answered.
There is no such conversation on Sneedchat anyway - the whisper now
appears in the room, marked as one, which is where the site puts it and
where the person who sent it is still looking.

Purple, and its own tint rather than the mention blue. Every inbound
whisper is highlighted, so without this the two said the same thing in the
same colour and a private message was indistinguishable from the room
saying your name. Styled on the kind rather than the highlight, so a
whisper written into a second room - deliberately not highlighted, to keep
one whisper to one alert - still reads as one.

The tag said "whisper to {from}", which on our own whisper is us. Who it
went to is in the line itself now, written the way the site writes it.

Co-Authored-By: Claude Opus 5 <[email protected]>
This commit is contained in:
2026-09-01 22:59:20 -04:00
co-authored by Claude Opus 5
parent ee26fbb2cf
commit b83a7d5830
5 changed files with 33 additions and 16 deletions
+1 -1
Submodule nobilis updated: 6237ad9292...615c2ac96b
+15 -7
View File
@@ -3867,11 +3867,19 @@ video.lightbox-media {
font-style: italic;
}
/* An edge rather than a fill: the highlight already tints the row, and two
backgrounds fighting would leave the text harder to read than an ordinary
message, which is the wrong way round for one that matters more. */
.message-row.whisper {
border-left: 2px solid var(--secondary);
/* Purple, and its own tint rather than the mention's. Written after the
highlight rule so it wins on a whisper that is also highlighted, which every
inbound one is - otherwise the two say the same thing in the same colour and
a private message is indistinguishable from the room saying your name.
Styled on the kind rather than the highlight, so a whisper written into a
second room - where it is deliberately not highlighted, to keep one whisper
to one alert - still reads as a whisper. */
.message-row.whisper,
.message-row.whisper.highlight {
background: var(--whisper-tint);
box-shadow: inset 2px 0 0 var(--whisper);
border-left: none;
}
.whisper-tag {
@@ -3881,8 +3889,8 @@ video.lightbox-media {
margin-left: var(--spacing-xs);
padding: 0 6px;
border-radius: 999px;
background: var(--primary-hover);
color: var(--secondary);
background: var(--whisper-tint);
color: var(--whisper);
font-style: normal;
text-transform: lowercase;
vertical-align: middle;
+5 -1
View File
@@ -350,7 +350,11 @@ export function MessageRow({
{whispered && (
<span className="whisper-tag small">
<Icon name="lock" size={11} />
<span>whisper{own ? ` to ${message.from}` : ''}</span>
{/* Who it went to is in the line itself for one we sent - the
daemon writes the "@name" the site writes - so the tag says
only what kind of message this is. It used to name
`message.from`, which on our own whisper is us. */}
<span>whisper</span>
</span>
)}
+5 -7
View File
@@ -854,18 +854,16 @@ export class ChatStore {
/**
* Sends a private message to one person on Sneedchat.
*
* Not the same as opening a conversation with them: Sneedchat has no such
* thing, and every whisper - sent or received, whoever it was with - lands
* in the one Whispers buffer. Going there afterwards is what makes the
* message visible, since a whisper is not echoed back into the room it was
* sent from.
* Stays where you are. This used to go and find a "Whispers" buffer and open
* it, which took somebody out of the room they were talking in every time
* they answered a whisper - and Sneedchat has no such conversation anyway.
* The whisper now appears in the room, marked as one, which is where the
* site puts it and where the person who sent it is still looking.
*/
async sendWhisper(accountId: string, target: string, body: string): Promise<void> {
if (!body.trim()) return
try {
await window.moho.rpc('sendWhisper', { accountId, target, body })
const whispers = this.state.buffers.find((b) => b.accountId === accountId && b.name === 'Whispers')
if (whispers) this.selectBuffer(whispers.id)
} catch (e) {
this.toast('error', `Couldn't whisper ${target}: ${(e as Error).message}`)
}
+7
View File
@@ -30,6 +30,13 @@
--primary-hover: rgba(66, 165, 245, 0.12);
--primary-pressed: rgba(66, 165, 245, 0.16);
--primary-selected: rgba(66, 165, 245, 0.3);
/* Whispers. Their own colour rather than the mention blue, because they are
a different kind of "this one is yours": a mention is the room saying your
name, a whisper is somebody speaking only to you, and a row that cannot
tell them apart is one where a private message reads as a public one. */
--whisper: #b388ff;
--whisper-tint: rgba(179, 136, 255, 0.14);
--surface-hover: rgba(66, 71, 78, 0.08);
--surface-pressed: rgba(66, 71, 78, 0.12);
--surface-selected: rgba(66, 71, 78, 0.15);