Release v0.51.557 — desktop question-jump discoverable (#4592)#4609
Conversation
…ton discoverable on desktop (#2246 follow-up) 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 <santastabber@users.noreply.github.com>
|
| Filename | Overview |
|---|---|
| static/style.css | Adds a @media (min-width: 641px) block that pins .msg-foot opacity to 1 when it contains a jump button, then hides .msg-time/.msg-actions at rest and restores them on hover/focus-within; two consecutive identical selector blocks can be merged. |
| tests/test_issue2246_question_jump.py | Adds a new string-presence test that anchors on the CSS comment to extract the desktop block and asserts the required selectors and properties are present; consistent with the existing test style in this file. |
| CHANGELOG.md | Adds v0.51.557 release entry for this change, following the established release-agent changelog format. |
Flowchart
%%{init: {'theme': 'neutral'}}%%
flowchart TD
A["msg-foot rendered"] --> B{"Contains .msg-question-jump-btn?"}
B -- No --> C["opacity: 0 at rest\nRevealed on hover/focus-within\n(existing behaviour, all viewports)"]
B -- Yes --> D{"Viewport ≥ 641px?"}
D -- No --> E["Mobile: footer already\nalways-visible (existing rule)"]
D -- Yes --> F[".msg-foot opacity: 1\n(jump button visible at rest)"]
F --> G[".msg-time & .msg-actions\nopacity: 0 + pointer-events: none"]
G --> H{"Row hover or focus-within?"}
H -- No --> I["timestamp/actions stay hidden"]
H -- Yes --> J[".msg-time & .msg-actions\nopacity: 1 + pointer-events: auto"]
%%{init: {'theme': 'base', 'themeVariables': {"darkMode": true, "background": "#0d1117", "primaryColor": "#21262d", "primaryTextColor": "#e6edf3", "primaryBorderColor": "#8b949e", "lineColor": "#8b949e", "textColor": "#e6edf3", "edgeLabelBackground": "#161b22", "actorBkg": "#21262d", "actorBorder": "#8b949e", "actorTextColor": "#e6edf3", "actorLineColor": "#8b949e", "signalColor": "#8b949e", "signalTextColor": "#e6edf3", "noteBkgColor": "#373320", "noteBorderColor": "#d4a72c", "noteTextColor": "#f0e6c0", "labelBoxBkgColor": "#21262d", "labelBoxBorderColor": "#8b949e", "labelTextColor": "#e6edf3", "loopTextColor": "#e6edf3", "activationBkgColor": "#30363d", "activationBorderColor": "#8b949e"}}}%%
flowchart TD
A["msg-foot rendered"] --> B{"Contains .msg-question-jump-btn?"}
B -- No --> C["opacity: 0 at rest\nRevealed on hover/focus-within\n(existing behaviour, all viewports)"]
B -- Yes --> D{"Viewport ≥ 641px?"}
D -- No --> E["Mobile: footer already\nalways-visible (existing rule)"]
D -- Yes --> F[".msg-foot opacity: 1\n(jump button visible at rest)"]
F --> G[".msg-time & .msg-actions\nopacity: 0 + pointer-events: none"]
G --> H{"Row hover or focus-within?"}
H -- No --> I["timestamp/actions stay hidden"]
H -- Yes --> J[".msg-time & .msg-actions\nopacity: 1 + pointer-events: auto"]
Reviews (1): Last reviewed commit: "docs(release): stamp v0.51.557 — desktop..." | Re-trigger Greptile
| .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; | ||
| } |
There was a problem hiding this comment.
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.
| .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!
🎬 Cutter preview — PR #4609
|

Release v0.51.557 — Release TP (jump-to-question discoverable on desktop)
Ships #4592 (santastabber). CSS-only + test.
Changed
:has(.msg-question-jump-btn)selectors, ≥641px). Preserves the clean-transcript / actions-on-hover preference. Thanks @santastabber.Gate