Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 6 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,12 @@

## [Unreleased]

## [v0.51.557] — 2026-06-21 — Release TP (jump-to-question stays discoverable on desktop)

### Changed

- **The per-turn "jump to question" button now stays visible on desktop/tablet, while the timestamp and action icons remain hover-only.** That affordance is navigation, not routine action chrome, so it no longer requires hovering to discover (mobile already showed it). The quieter timestamp/copy/action controls still reveal on hover or keyboard focus, keeping the transcript clean. Thanks @santastabber.

## [v0.51.556] — 2026-06-21 — Release TO (Indonesian Edge TTS voice + Listen button state fix)

### Added
Expand Down
32 changes: 32 additions & 0 deletions static/style.css
Original file line number Diff line number Diff line change
Expand Up @@ -5127,6 +5127,38 @@ main.main > #mainPlugin{display:none;}
.msg-row[data-role="assistant"]:hover .msg-foot,
.assistant-turn:hover .msg-foot,
.assistant-turn:focus-within .msg-foot { opacity: 1; }
/* Desktop/tablet keeps the per-turn jump affordance discoverable without
exposing the quieter timestamp/action chrome until hover or keyboard focus. */
@media (min-width: 641px) {
.msg-row[data-role="assistant"] .msg-foot:has(.msg-question-jump-btn),
.assistant-turn .msg-foot:has(.msg-question-jump-btn) {
opacity: 1;
}
.msg-row[data-role="assistant"] .msg-foot:has(.msg-question-jump-btn) .msg-time,
.msg-row[data-role="assistant"] .msg-foot:has(.msg-question-jump-btn) .msg-actions,
.assistant-turn .msg-foot:has(.msg-question-jump-btn) .msg-time,
.assistant-turn .msg-foot:has(.msg-question-jump-btn) .msg-actions {
opacity: 0;
transition: opacity .15s;
}
.msg-row[data-role="assistant"] .msg-foot:has(.msg-question-jump-btn) .msg-time,
.msg-row[data-role="assistant"] .msg-foot:has(.msg-question-jump-btn) .msg-actions,
.assistant-turn .msg-foot:has(.msg-question-jump-btn) .msg-time,
.assistant-turn .msg-foot:has(.msg-question-jump-btn) .msg-actions {
pointer-events: none;
}
Comment on lines +5137 to +5149

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 The two consecutive rule blocks at lines 5137–5149 target the exact same four selectors but declare opacity/transition in the first block and pointer-events in the second. They can be merged into one block without changing specificity or cascade order, reducing selector repetition by half.

Suggested change
.msg-row[data-role="assistant"] .msg-foot:has(.msg-question-jump-btn) .msg-time,
.msg-row[data-role="assistant"] .msg-foot:has(.msg-question-jump-btn) .msg-actions,
.assistant-turn .msg-foot:has(.msg-question-jump-btn) .msg-time,
.assistant-turn .msg-foot:has(.msg-question-jump-btn) .msg-actions {
opacity: 0;
transition: opacity .15s;
}
.msg-row[data-role="assistant"] .msg-foot:has(.msg-question-jump-btn) .msg-time,
.msg-row[data-role="assistant"] .msg-foot:has(.msg-question-jump-btn) .msg-actions,
.assistant-turn .msg-foot:has(.msg-question-jump-btn) .msg-time,
.assistant-turn .msg-foot:has(.msg-question-jump-btn) .msg-actions {
pointer-events: none;
}
.msg-row[data-role="assistant"] .msg-foot:has(.msg-question-jump-btn) .msg-time,
.msg-row[data-role="assistant"] .msg-foot:has(.msg-question-jump-btn) .msg-actions,
.assistant-turn .msg-foot:has(.msg-question-jump-btn) .msg-time,
.assistant-turn .msg-foot:has(.msg-question-jump-btn) .msg-actions {
opacity: 0;
transition: opacity .15s;
pointer-events: none;
}

Note: If this suggestion doesn't match your team's coding style, reply to this and let me know. I'll remember it for next time!

.msg-row[data-role="assistant"]:hover .msg-foot:has(.msg-question-jump-btn) .msg-time,
.msg-row[data-role="assistant"]:hover .msg-foot:has(.msg-question-jump-btn) .msg-actions,
.msg-row[data-role="assistant"]:focus-within .msg-foot:has(.msg-question-jump-btn) .msg-time,
.msg-row[data-role="assistant"]:focus-within .msg-foot:has(.msg-question-jump-btn) .msg-actions,
.assistant-turn:hover .msg-foot:has(.msg-question-jump-btn) .msg-time,
.assistant-turn:hover .msg-foot:has(.msg-question-jump-btn) .msg-actions,
.assistant-turn:focus-within .msg-foot:has(.msg-question-jump-btn) .msg-time,
.assistant-turn:focus-within .msg-foot:has(.msg-question-jump-btn) .msg-actions {
opacity: 1;
pointer-events: auto;
}
}
.assistant-turn .msg-foot-with-usage,
.msg-row[data-role="assistant"] .msg-foot-with-usage {
opacity: 1;
Expand Down
22 changes: 22 additions & 0 deletions tests/test_issue2246_question_jump.py
Original file line number Diff line number Diff line change
Expand Up @@ -63,6 +63,28 @@ def test_question_jump_button_matches_bottom_button_size_on_mobile():
assert ".msg-question-jump-btn span:last-child { display: none; }" in STYLE_CSS


def test_question_jump_footer_is_discoverable_on_desktop_without_exposing_actions():
# Desktop cannot rely on the mobile always-visible footer override, but the
# per-turn jump affordance is navigation, not quiet action chrome. Keep only
# the jump button discoverable at rest; reveal timestamp/actions on hover or
# keyboard focus.
block_anchor = "Desktop/tablet keeps the per-turn jump affordance discoverable"
block_start = STYLE_CSS.index(block_anchor)
block_end = STYLE_CSS.index(".assistant-turn .msg-foot-with-usage", block_start)
desktop_jump_block = STYLE_CSS[block_start:block_end]

assert "@media (min-width: 641px)" in desktop_jump_block

assert ".assistant-turn .msg-foot:has(.msg-question-jump-btn)" in desktop_jump_block
assert "opacity: 1;" in desktop_jump_block
assert ".msg-foot:has(.msg-question-jump-btn) .msg-time" in desktop_jump_block
assert ".msg-foot:has(.msg-question-jump-btn) .msg-actions" in desktop_jump_block
assert "pointer-events: none;" in desktop_jump_block
assert ".assistant-turn:hover .msg-foot:has(.msg-question-jump-btn) .msg-actions" in desktop_jump_block
assert ".assistant-turn:focus-within .msg-foot:has(.msg-question-jump-btn) .msg-actions" in desktop_jump_block
assert "pointer-events: auto;" in desktop_jump_block


def test_question_jump_text_is_localized():
for key in ("jump_to_question", "jump_to_question_label"):
assert I18N_JS.count(f"{key}:") >= 12
Expand Down
Loading