fix: prevent sticky sidebar hover drag state#1730
Conversation
SummaryPulled the diff for this branch ( Code referenceReading let _pointerActive=false;
// ...
el.onpointerdown=(e)=>{
if(e.pointerType==='mouse' && e.button!==0) return;
_pointerActive=true;
// ...
if(_clearDragTimer){clearTimeout(_clearDragTimer);_clearDragTimer=null;}
el.classList.remove('dragging');
};
el.onpointermove=(e)=>{
// Plain hover also dispatches pointermove. Only mark a row as dragging
// after an actual press starts on this row [...]
if(!_pointerActive) return;
// ...
};
el.onpointercancel=_clearPointerDragState;
el.onpointerleave=()=>{ if(_pointerActive) _clearPointerDragState(); };The behavior matches the existing DiagnosisA few observations:
Verification
All three CI checks (3.11/3.12/3.13) are green. Looks good to merge. |
85d0279
…p + test-isolation fix Constituent PRs: - nesquena#1725 (@Michaelyklam) — simplify compact Activity row summary - nesquena#1726 (@Michaelyklam) — delegate generic provider catalogs to Hermes CLI (slice of nesquena#1240) - nesquena#1727 (@Michaelyklam) — link Claude Code OAuth in onboarding (closes nesquena#1362) - nesquena#1728 (@starship-s) — preserve profile context when starting chats - nesquena#1729 (@Michaelyklam) — persist compact Activity disclosure state - nesquena#1730 (@Michaelyklam) — prevent sticky sidebar hover drag state - nesquena#1732 (@Sanjays2402) — unpin scroll on small upward motion during streaming (closes nesquena#1731) Plus 2 in-stage absorbed fixes: - test-isolation fix: monkeypatch.setattr(config, 'cfg', X) survives PR nesquena#1728's path/mtime-aware get_config() reload. Mandatory before tag (Opus stage-302). - Opus SHOULD-FIX #1: _lastScrollTop reset on session switch (nesquena#1732 follow-up). Tests: 4537 → 4584 passing (+47). 0 regressions. Full suite ~128s. Stably green. Pre-release verification: - All 7 PRs CI-green individually + rebased onto master - pytest 4584 passed, 0 failed (multiple runs) - node -c clean on all 4 modified .js files - 11/11 browser API endpoints PASS on isolated port 8789 - 20 QA tests via webui_qa_agent.sh PASS - Opus advisor: SHIP, 5/5 verification clean, 0 MUST-FIX, 1 SHOULD-FIX absorbed (_lastScrollTop reset), 1 SHOULD-FIX deferred (nesquena#1736 — _clear_anthropic_env_values race, onboarding-time-only) Closes nesquena#1362, nesquena#1731.
Thinking Path
pointermove, so the previous implementation could mark a row as.draggingbefore any press started.What Changed
_pointerActivetracking to sidebar session rows.pointermoveto add.draggingafter a validpointerdownstarts on that row.pointerup,pointercancel, andpointerleave..cjsscripts instead of passing the fullsessions.jssource throughnode -e, which now exceeds the shell argument limit during the full suite.Why It Matters
sessions.jsgrows.Verification
browser_consolesynthetic QA on an isolated WebUI server:PointerEvent('pointermove')on a session row:hoverDrag: falsepointerdown+ movement on the same row:pressDrag: truesourceHasGuard: true/home/michael/.hermes/hermes-agent/venv/bin/python -m pytest tests/test_issue856_pinned_indicator_layout.py tests/test_issue500_session_list_virtualization.py -q→12 passedenv -u HERMES_CONFIG_PATH -u HERMES_WEBUI_HOST /home/michael/.hermes/hermes-agent/venv/bin/python -m pytest tests/ -q→4551 passed, 2 skipped, 3 xpassed, 1 warning, 8 subtests passedgit diff --check→ cleanRisks / Follow-ups
Model Used
gpt-5.5