Show a focus ring on sidebar thread and draft rows - #13344
Conversation
Thread and draft rows are role=button with tabIndex=0 but set outline-none with no replacement, so keyboard focus is invisible. Add the inset ring the tool-call region and turn-fold button already use. Verify: Tab into the sidebar; the focused row shows a ring.
ApprovabilityVerdict: Approved at Macroscope's review found this PR approvable — This single-file change adds a keyboard-visible focus ring to two already focusable sidebar rows. It is a small, self-contained visual accessibility improvement that leaves mouse behavior and application workflows unchanged. You can add or adjust custom eligibility rules. Learn more. |
|
Navigate logical layers of code changes, visualize relationships, and explore their blast radius. No actionable comments were generated in the recent review. 🎉 ℹ️ Recent review info⚙️ Run configurationConfiguration used: Repository: pingdotgg/t3code/.coderabbit.yaml Review profile: CHILL Plan: Advanced Run ID: 📒 Files selected for processing (1)
Included review availability: Your plan provides up to 10 included reviews per hour; 9 remain after this review. 📝 WalkthroughWalkthroughDraft and thread sidebar rows now include focus-visible ring styles. The styles apply to draft rows and to both card and slim thread rows. ChangesSidebar focus visibility
Priority: ⬇️ Low Estimated code review effort: 1 (Trivial) | ~3 minutes Change: Bug fix Suggested reviewers: Merge Risk: ⚪ Minimal · up to The sidebar rows gain the intended keyboard focus indication; no material merge risk remains. 🚥 Pre-merge checks | ✅ 4 | ❌ 1❌ Failed checks (1 warning)
✅ Passed checks (4 passed)
✨ Finishing Touches🧪 Generate unit tests (beta)
Comment |
## What's Changed * feat(observability): write a server heap snapshot on SIGUSR2 by @t3dotgg in pingdotgg/t3code#13694 * perf(server): shutdown no longer rewrites every stopped session row by @t3dotgg in pingdotgg/t3code#13688 * perf(server): build the thread list snapshot without decoding it twice by @t3dotgg in pingdotgg/t3code#13693 * fix(client): slow servers finish loading the thread list instead of loading it twice by @t3dotgg in pingdotgg/t3code#13683 * perf(web): hidden terminal drawers no longer keep full thread history in memory by @t3dotgg in pingdotgg/t3code#13686 * perf(server): per-thread settlement and PR checks no longer rebuild the whole thread list by @t3dotgg in pingdotgg/t3code#13691 * fix(mobile): running threads open at the latest message by @AKolenda in pingdotgg/t3code#13530 * feat(observability): record event loop stalls in the server trace by @t3dotgg in pingdotgg/t3code#13697 * perf(server): stop re-running git for every project each minute by @t3dotgg in pingdotgg/t3code#13689 * fix(usage): hide the Cursor keychain prompt when Cursor isn't set up by @Gigioxx in pingdotgg/t3code#13714 * feat(web): add chat width setting for wide screens by @otavio in pingdotgg/t3code#11594 * fix(opencode): accept v2 serve ready line when spawning server by @shirishpothi in pingdotgg/t3code#13651 * fix(editors): stop treating the agy CLI as the Antigravity IDE by @ishaanko in pingdotgg/t3code#7079 * fix(web): make the empty workspace draggable on desktop by @otavio in pingdotgg/t3code#13713 * fix(server): installed editors no longer vanish when discovery is slow by @bfowler in pingdotgg/t3code#13669 * fix(git): exclude SSH ports from provider URLs by @GaMeRaM in pingdotgg/t3code#12537 * fix(web): Mod+B bolds on non-Latin layouts by @ValeraZSD in pingdotgg/t3code#13409 * fix(server): prune expired replay-protection files from the secrets directory by @t3dotgg in pingdotgg/t3code#13695 * fix(web): terminal links drop a trailing colon by @ValeraZSD in pingdotgg/t3code#13408 * fix(server): bump node-pty to 1.2.0-beta.15 for linux-arm64 prebuild by @Ephraim-9 in pingdotgg/t3code#13748 * Show a focus ring on sidebar thread and draft rows by @ryanilano in pingdotgg/t3code#13344 * fix(mobile): keep composer within folded screen after resume by @PixPMusic in pingdotgg/t3code#13310 * fix(server): let OpenCode generate session titles by @macodev00 in pingdotgg/t3code#13368 * fix(server): let Antigravity inspect unsupported files by path by @Bil0000 in pingdotgg/t3code#13339 * fix(mobile): link URLs with ports and single-label hosts by @Yash-Singh1 in pingdotgg/t3code#13795 * feat(web): add keyboard navigation for usage by @tris203 in pingdotgg/t3code#10158 * perf(observability): stop writing empty spans on spawns, projected events, and idle polls by @t3dotgg in pingdotgg/t3code#13756 * perf(server): opening Diagnostics no longer loads the whole trace ring into memory by @t3dotgg in pingdotgg/t3code#13763 * perf(clients): sort projects and settled threads without re-parsing dates per comparison by @t3dotgg in pingdotgg/t3code#13759 * fix(observability): the renderer trace proxy stops tracing itself by @t3dotgg in pingdotgg/t3code#13761 * perf(server): background sweeps only read threads that can still settle by @t3dotgg in pingdotgg/t3code#13765 * perf(clients): saving the thread list cache no longer freezes the UI by @t3dotgg in pingdotgg/t3code#13767 * perf(server): cut idle wakeups from the Connect relay and session reaper by @t3dotgg in pingdotgg/t3code#13774 * fix(mobile): keep trailing underscores and tildes in autolinked URLs by @Yash-Singh1 in pingdotgg/t3code#13807 * fix(web): queued messages send while their thread is not open by @t3dotgg in pingdotgg/t3code#13764 * fix(server): background git status fetches no longer fill the disk with failed repacks by @t3dotgg in pingdotgg/t3code#13812 * fix(mobile): thread list shows the pull request icon instead of # by @flamboh in pingdotgg/t3code#13742 * fix(accessibility): correct control announcements and sidebar traversal by @blinding-pixels in pingdotgg/t3code#13491 * fix(usage): tolerate newer provider variants by @tris203 in pingdotgg/t3code#10076 * fix(usage): omit Cursor warning when no login is saved by @tris203 in pingdotgg/t3code#13820 * fix(usage): identify client version mismatches by @tris203 in pingdotgg/t3code#8208 * fix(web): stop mistaking offline servers for updates by @tris203 in pingdotgg/t3code#13083 * test(usage): assert contract mismatch details by @Yash-Singh1 in pingdotgg/t3code#13861 * fix(build): validate Linux node-pty prebuilds in Windows artifacts by @Yash-Singh1 in pingdotgg/t3code#13867 ## New Contributors * @otavio made their first contribution in pingdotgg/t3code#11594 * @shirishpothi made their first contribution in pingdotgg/t3code#13651 * @bfowler made their first contribution in pingdotgg/t3code#13669 * @GaMeRaM made their first contribution in pingdotgg/t3code#12537 * @ValeraZSD made their first contribution in pingdotgg/t3code#13409 * @Ephraim-9 made their first contribution in pingdotgg/t3code#13748 * @ryanilano made their first contribution in pingdotgg/t3code#13344 * @macodev00 made their first contribution in pingdotgg/t3code#13368 * @blinding-pixels made their first contribution in pingdotgg/t3code#13491 **Full Changelog**: pingdotgg/t3code@v0.0.43-nightly.20260926.2282...v0.0.43-nightly.20260926.2318 Upstream release: https://github.com/pingdotgg/t3code/releases/tag/v0.0.43-nightly.20260926.2318
Merges `pingdotgg/t3code` `main` into the fork: `eeea71a88` → `ab099178a` (35 commits). Branched from `main`; no open merge PR to stack on. ## Merge - **Conflicts:** only `pnpm-lock.yaml`. I took upstream's copy and re-ran `install.mjs`, which put the fork's own entries back (`moatless-api`, `mermaid`). - **Silent merges:** git merged nine other files both sides had changed without stopping (`ChatView.tsx`, `Sidebar.tsx`, `MessagesTimeline.tsx`, `ui/sidebar.tsx`, `__root.tsx`, `settings.tsx`, `entities.ts`, `apps/web/package.json`, `GitVcsDriverCore.test.ts`). The duplicate-line and dropped-side checks found nothing, and every delta guard held, including `FEATURES.serverUpdateBanner` after pingdotgg#13083 rewrote the offline banner code. - **File counts:** 126 files landed, exactly the 126 upstream changed. The fork delta is 756 files, unchanged. - **New upstream files in fork-owned areas:** three matched the sweep. `auth/replayMarkers.ts` and its test are upstream's own server auth; `ConnectionFormField.test.tsx` is a mobile test. Neither touches a fork-owned surface. - **`UnsupportedMethodError` union:** no methods to add or drop. ## Verification `verify.mjs` (full run) passed all 10 checks: duplicate-adds, tripwires, resolution-check, unsupported-methods, lockfile, fmt, lint, typecheck, build and test. ## Usable as-is - Queued messages now send while their thread is not open (`QueuedMessageSender`, `sendQueuedMessage.ts`, pingdotgg#13764). - Keyboard navigation for Usage, plus `useNavigateBack` (pingdotgg#10158). - Usage identifies which side has the version mismatch (pingdotgg#8208) and tolerates newer provider variants (pingdotgg#10076). - Accessibility fixes: control announcements, sidebar traversal, focus rings (pingdotgg#13491, pingdotgg#13344). - Other web fixes: reasoning-arrow alignment, tooltip resize, Mod+B on non-Latin keyboard layouts, terminal links dropping a trailing colon. - Faster project and thread sorting, and saving the thread-list cache no longer freezes the UI (pingdotgg#13759, pingdotgg#13767). - Mobile link and composer fixes. ## Unsupported in Moatless / needs implementation - Nothing new. The upstream changes in this range to editor discovery (pingdotgg#13669), Cursor Keychain prompts (pingdotgg#13870) and device tools (pingdotgg#13908) sit behind surfaces the fork already gates (`openInEditor`, `providerConfiguration`, `deviceHub`). ## Backend behavior to consider reproducing in Moatless Added to `docs/fork/gaps.md` under *Runtime fixes upstream made to its own server*: - **pingdotgg#13812:** the background git status fetch passes `--no-auto-gc`. Without it, a failing auto gc leaves a full-size `tmp_pack_*` behind on every fetch and can fill the disk. - **pingdotgg#13765:** the settlement and PR sweeps read only threads that can still settle. - **pingdotgg#13774:** the relay and session reaper no longer wake up on idle sessions. Also relevant but not recorded as gaps: pingdotgg#13736 (`OTEL_*_EXPORTER=none` honoured per signal) and pingdotgg#13695 (expired replay-protection files pruned from the secrets directory). ## Caveat Running `vp install` again after committing changes two `type-fest` entries in the lockfile (5.7.0 → 5.10.0). I kept the committed re-derived lockfile, which passes the `lockfile` check. 🤖 Generated with [Claude Code](https://claude.com/claude-code) --- Moatless task: https://moatless.soaplabstest.com/tasks/06f86e30-4ca2-4771-bf22-feb0699349ff

Sidebar thread and draft rows are focusable (
role="button",tabIndex={0}) but setoutline-nonewith no replacement, so keyboard focus is invisible. This adds the same insetfocus-visiblering the tool-call region already uses.Verify: press Tab into the sidebar; the focused row shows a ring. Mouse users see no change.
Screenshots to follow.
Summary by CodeRabbit