feat(room): give the 1:1 peer name its own dark chip matching the message bubble and round both with a minimal all-corners radius

This commit is contained in:
heaven 2026-05-30 00:52:47 +03:00
parent f6e374d551
commit 170c78fb83
2 changed files with 31 additions and 5 deletions

View file

@ -225,7 +225,12 @@ export const StreamLayout = as<'div', StreamLayoutProps>(
</span>
<div className={css.StreamColumn}>
{header && (
<div className={css.StreamName} ref={headerRef}>
<div
// Peer (incoming) names render in a chip the same dark surface as
// their message bubble; own names stay plain (own = plain text).
className={classNames(css.StreamName, !isOwn && css.StreamNamePeerBubble)}
ref={headerRef}
>
{header}
</div>
)}

View file

@ -191,6 +191,9 @@ const StreamSyslineDotSize = toRem(6);
const StreamDayDotSize = toRem(12.1);
const StreamRailLineWidth = '1px';
const StreamBubbleBorderWidth = '1px';
// Minimal, all-corners rounding for the incoming bubble + the peer name chip
// (user request — like the VS Code reference, no sharp/notched corner).
const StreamBubbleRadius = toRem(6);
const StreamTimeLineHeight = toRem(13);
const StreamRailBridgeY = config.space.S400;
@ -199,7 +202,10 @@ const StreamRailBridgeY = config.space.S400;
// larger than chat body (T400 = 15px). The dot + timestamp vertically centre
// on this line, so its line-height drives the rail geometry below.
const StreamNameFontSize = toRem(16);
const StreamNameLineHeight = toRem(20);
// Line-height (not font) drives the name-chip height: 26.4px (20 × 1.2 × 1.1)
// gives the peer name bubble more vertical breathing room around the 16px nick
// while the dot + timestamp follow automatically via StreamHeaderInnerCenterY.
const StreamNameLineHeight = toRem(26.4);
// Vertical centre of the author-name line, measured from the row's
// content-area top. The name is now the FIRST child of StreamColumn (track 3)
@ -444,13 +450,13 @@ export const StreamBubble = recipe({
// Incoming (peer) bubble — filled with the SAME surface as the composer
// card (`color.Surface.Container`, see RoomView.css.ts) so the bubble and
// the input form read as one material; it sits a step darker than the
// `SurfaceVariant.Container` page background. Top-left corner flat, other
// three rounded (user point 7). Own messages override to a no-chrome
// `SurfaceVariant.Container` page background. Minimal rounding on ALL four
// corners (no sharp/notched corner). Own messages override to a no-chrome
// plain block below.
backgroundColor: color.Surface.Container,
color: color.SurfaceVariant.OnContainer,
border: `${StreamBubbleBorderWidth} solid ${color.Surface.ContainerLine}`,
borderRadius: `${toRem(4)} ${toRem(16)} ${toRem(16)} ${toRem(16)}`,
borderRadius: StreamBubbleRadius,
// Padding bumped ~1.1× (user request) so the bubble reads a touch larger
// around the text: vertical 8→8.8px, horizontal 15→16.5px.
paddingTop: toRem(8.8),
@ -571,6 +577,21 @@ globalStyle(`${StreamName} > *`, {
minWidth: 0,
});
// Peer (incoming) author name rendered as a chip in the SAME surface as the
// message bubble (`color.Surface.Container`) — a mini incoming-bubble for the
// label, with the same minimal all-corners rounding (user request). Own names
// stay plain (own messages are plain text). Horizontal padding only — NO
// vertical padding, so the name's line box (and the dot/timestamp aligned to
// its centre) doesn't shift; the fill spans the line height.
export const StreamNamePeerBubble = style({
backgroundColor: color.Surface.Container,
// Slightly larger rounding than the message bubble (user request) + wider
// horizontal padding to match the taller chip.
borderRadius: toRem(9),
paddingLeft: toRem(11),
paddingRight: toRem(11),
});
// Message-row timestamp — grid item in track 1, content-sized. Pushed
// down by the same Y as StreamHeaderDotHalo so timestamp / dot / Username
// share one baseline.