From 382856e170ccec8c6429279c3182dfaa65e19d7c Mon Sep 17 00:00:00 2001 From: nesquena-hermes Date: Sun, 21 Jun 2026 08:44:06 +0000 Subject: [PATCH 1/2] =?UTF-8?q?stage=20#4592=20onto=20master=20(v0.51.555)?= =?UTF-8?q?=20=E2=80=94=20keep=20per-turn=20question-jump=20button=20disco?= =?UTF-8?q?verable=20on=20desktop=20(#2246=20follow-up)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit santastabber: desktop ≥641px keeps the jump-to-question affordance visible (it's navigation) while timestamp/actions chrome stays hover/focus-only, via :has(.msg-question-jump-btn) selectors. CSS+test only. Co-authored-by: santastabber --- static/style.css | 32 +++++++++++++++++++++++++++ tests/test_issue2246_question_jump.py | 22 ++++++++++++++++++ 2 files changed, 54 insertions(+) diff --git a/static/style.css b/static/style.css index 60d5d891..08583fab 100644 --- a/static/style.css +++ b/static/style.css @@ -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; + } + .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; diff --git a/tests/test_issue2246_question_jump.py b/tests/test_issue2246_question_jump.py index 5c26e72d..d14a885c 100644 --- a/tests/test_issue2246_question_jump.py +++ b/tests/test_issue2246_question_jump.py @@ -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 From f763b8adf85e95c0a62367295a7f99a9648ab945 Mon Sep 17 00:00:00 2001 From: nesquena-hermes Date: Sun, 21 Jun 2026 08:53:10 +0000 Subject: [PATCH 2/2] =?UTF-8?q?docs(release):=20stamp=20v0.51.557=20?= =?UTF-8?q?=E2=80=94=20desktop=20question-jump=20discoverable=20(#4592)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CHANGELOG.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 48171bd5..9881fe19 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -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