feat(chat): suppress adjacent quote-stub, soften thread panel edge (LC-462) #445

Merged
longjacksonle merged 1 commit from feat/reply-adjacency-suppress into main 2026-06-25 03:46:13 +02:00

What

Two polish items on the room reply/thread rendering (follow-up to LC-461). Ref data/ref-room-thread_1.png.

1. Suppress the redundant inline quote-reference for adjacent parents (Slack-style)

A quote-reply showed its "Replying to … [quoted text]" stub even when the quoted message was the row directly above it, so the same text appeared twice in adjacent rows.

The main-timeline list builder already tracks per-row context (is_follow_up, day dividers). It now also tracks the previous rendered message id and sets a new MessageView.suppress_quote_preview when quote_id == previous_message_id; the template omits the stub in that case.

Kept when the parent is further up, in a different group, or not currently rendered: every non-list construction site (single-message, WS, thread-reply renders) leaves the flag false, so those render exactly as before. Inline timeline reference only - the thread panel, the "N replies" pill, and what is stored as a reply are untouched.

2. Soften the thread panel's left edge

The replies list had a heavy accent left rail that read as a wall. The parent block + count divider already convey hierarchy, so the rail is dropped; the scroll region instead gets a thin, unobtrusive overlay scrollbar (scrollbar-width: thin + a low-contrast webkit thumb). The panel now feels attached to the conversation rather than walled off.

Scope / safety

Rendering/CSS only. No change to storage, reply/thread server functions, WS events, or hx-swap-oob targets. The new bool was threaded through all 11 MessageView constructors (compiler-enforced).

Verification

just build-css, just check (clippy + fmt clean), just test, just test-saas all green (the LC-77 render fixtures were unaffected - the suppression branch only exists inside the already-conditional quote block). just verify built the release binary clean; its server-up harness lacks the mandatory LETS_CHAT_BUNYIP_SSO_* startup vars, so the standalone server cannot boot to serve /login in this sandbox (environmental, not a regression).

🤖 Generated with Claude Code

## What Two polish items on the room reply/thread rendering (follow-up to LC-461). Ref `data/ref-room-thread_1.png`. ## 1. Suppress the redundant inline quote-reference for adjacent parents (Slack-style) A quote-reply showed its "Replying to … [quoted text]" stub even when the quoted message was the row directly above it, so the same text appeared twice in adjacent rows. The main-timeline list builder already tracks per-row context (`is_follow_up`, day dividers). It now also tracks the previous rendered message id and sets a new `MessageView.suppress_quote_preview` when `quote_id == previous_message_id`; the template omits the stub in that case. Kept when the parent is further up, in a different group, or not currently rendered: every non-list construction site (single-message, WS, thread-reply renders) leaves the flag `false`, so those render exactly as before. **Inline timeline reference only** - the thread panel, the "N replies" pill, and what is stored as a reply are untouched. ## 2. Soften the thread panel's left edge The replies list had a heavy accent left rail that read as a wall. The parent block + count divider already convey hierarchy, so the rail is dropped; the scroll region instead gets a thin, unobtrusive overlay scrollbar (`scrollbar-width: thin` + a low-contrast webkit thumb). The panel now feels attached to the conversation rather than walled off. ## Scope / safety Rendering/CSS only. No change to storage, reply/thread server functions, WS events, or `hx-swap-oob` targets. The new bool was threaded through all 11 `MessageView` constructors (compiler-enforced). ## Verification `just build-css`, `just check` (clippy + fmt clean), `just test`, `just test-saas` all green (the LC-77 render fixtures were unaffected - the suppression branch only exists inside the already-conditional quote block). `just verify` built the release binary clean; its `server-up` harness lacks the mandatory `LETS_CHAT_BUNYIP_SSO_*` startup vars, so the standalone server cannot boot to serve `/login` in this sandbox (environmental, not a regression). 🤖 Generated with [Claude Code](https://claude.com/claude-code)
feat(chat): suppress adjacent quote-stub, soften thread panel edge (LC-462)
All checks were successful
check-secrets / Nosey parker (push) Successful in 6s
check-secrets / Kingfisher (push) Successful in 8s
check-secrets / TruffleHog (push) Successful in 9s
check-secrets / Nosey parker (pull_request) Successful in 6s
check-secrets / TruffleHog (pull_request) Successful in 9s
check-secrets / Kingfisher (pull_request) Successful in 10s
Check / clippy + fmt + tests (pull_request) Successful in 5m36s
Create release / Create release from merged PR (pull_request) Has been skipped
db3dda619b
Two polish items on the room reply/thread rendering (follow-up to LC-461).

1. Slack-style adjacency suppression for the inline quote-reference. A quote-reply showed its "Replying to ... [quoted text]" stub even when the quoted message was the row directly above it, duplicating the same text in adjacent rows. The main timeline list builder already tracks per-row context (is_follow_up, day dividers); it now also tracks the previous rendered message id and sets a new MessageView.suppress_quote_preview when quote_id == previous_message_id, and the template omits the stub in that case. The reference is kept when the parent is further up, in a different group, or not currently rendered: every non-list construction site (single-message, WS, thread-reply renders) leaves the flag false, so they render exactly as before. This is the inline timeline reference only - the thread panel, the "N replies" pill, and what is stored as a reply are untouched.

2. Softened the thread panel's left edge. The replies list had a heavy accent left rail that read as a wall; the parent block + count divider already convey hierarchy, so the rail is dropped and the scroll region instead gets a thin, unobtrusive overlay scrollbar (scrollbar-width: thin + a low-contrast webkit thumb). The panel now feels attached to the conversation.

Rendering/CSS only: no change to storage, reply/thread server functions, WS events, or hx-swap-oob targets. Verified with just build-css, just check, just test, just test-saas. just verify built the release binary clean; its server-up harness lacks the mandatory LETS_CHAT_BUNYIP_SSO_* startup vars so the standalone server cannot boot to serve /login in this sandbox (environmental).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
longjacksonle scheduled this pull request to auto merge when all checks succeed 2026-06-25 03:41:02 +02:00
longjacksonle scheduled this pull request to auto merge when all checks succeed 2026-06-25 03:44:56 +02:00
longjacksonle deleted branch feat/reply-adjacency-suppress 2026-06-25 03:46:13 +02:00
Sign in to join this conversation.
No reviewers
No labels
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set

Reference
psa-systems/lets-chat!445
No description provided.