fix(sync): remediation pass on Sync tab redesign stack#967
Merged
kunickiaj merged 1 commit intoApr 23, 2026
Merged
Conversation
Owner
Author
This was referenced Apr 23, 2026
57ee882 to
501ae9d
Compare
Owner
Author
Merge activity
|
501ae9d to
edd79c5
Compare
7aa2173 to
0eee1da
Compare
edd79c5 to
8fa568c
Compare
2 tasks
kunickiaj
added a commit
that referenced
this pull request
Apr 24, 2026
## Description Dogfood of the merged Sync tab redesign (PRs #963-#967) surfaced five real issues. Fixing them together since they're all the same "Sync tab polish" story. - **Device list was a 2-column grid above 900px**, so expansion rendered inside a narrow sidebar column while the other row sat empty. Switched to single-column full-width rows; outer border/radius/background now live on `.peer-card`, the row head is transparent content, and the drawer has a `border-top` separator inside the same card. - **Row head was a grid that broke when the direction glyph was absent**, causing the chevron to wrap to a second line. Switched to flex; `.device-row-toggle { margin-left: auto }` keeps the toggle right-edge regardless of which middle children render. - **Row expand toggle was a hand-rolled `<button>` with a unicode ▸/▾** that was nearly invisible against `--surface-1`. Replaced with Radix Collapsible (`@radix-ui/react-collapsible`, already installed) + a properly sized inline Lucide chevron SVG that rotates on `data-state="open"`. Radix gives us correct `aria-expanded`/`aria-controls` wiring and keyboard handling for free. Module-level `expandedPeerId` still enforces single-open-at-a-time; `handleOpenChange` reads the live module state (not a stale closure) so one row taking over doesn't clobber the new pointer. - **`View diagnostics →` and `← Back to sync` had different styles**. Collapsed into one `.sync-subview-link` class used for both directions — utility-nav treatment, quieter than any nearby button. - **`work is offline` surfaced as a Needs Attention item.** Computers power-cycle; the row already carries the Offline badge + pip. Dropped the `peerStatus === "offline"` branch from `sync-view-model.ts`'s attention-item derivation. Auth/trust/repair failures still fire. - **Pairing payload was double-hidden** ("Show pairing command" → revealed a card that just said "Pairing payload hidden" unless diagnostics were on). The payload is a local command shared with your own other device, not a secret. The outer disclosure is enough gating; removed the redaction branch in `diagnostics/helpers.ts`. - **Sync tab cards had no gap between them** while Feed did. The redesign's `#syncMainView` / `#syncDiagnosticsView` wrappers broke the `.tab-panel` flex-gap inheritance; restored the same gap inside each sub-view wrapper. ## Type of Change - [x] Bug fix - [x] UX polish ## Testing - \`pnpm run tsc && pnpm run lint && pnpm run test\` (1475 passing) - Manual: Sync tab — device row toggle is visible mint-on-surface chevron that rotates 90° on open; expand/collapse one row cleanly stacks in a single column; View diagnostics / Back to sync read as the same utility link; offline peer no longer shows up in Needs attention; "Show pairing command" reveals the command directly.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.

Description
Remediation PR on top of #963–#966. Addresses the findings from four
brutal reviews across the stack. Batched here so reviewers see one
coherent "Ramsay fix" diff instead of amending four in-flight PRs.
Bugs fixed
no longer lands on the main view. `setActiveTab` now only rewrites
the hash when the top-level tab actually changed; a new
`parseTabFromHash` helper centralizes the sub-view-aware split.
`parseTabFromHash` too, so sub-view hash transitions (e.g. back
button from `#sync` → `#sync/diagnostics`) fire `switchTab`
correctly.
from `TeamSyncPanelProps` and `render-team-sync.ts`. The old
`listHeading = list?.previousElementSibling` was toggling the wrong
sibling's `hidden` after the `#syncTeamStatus` element was
removed — silent visibility corruption.
longer a ``. The chevron is now the only interactive
element (`.device-row-toggle`), with a clean accessible name
("Expand device {name}"). Badges, direction glyphs, and the name
with its `title` attribute no longer pollute the button's
accessible-name computation.
Deleted both; along with their dead CSS (`.action-shelf`,
`.settings-button.sync-btn-primary`, `.peer-scope-chip`
tone variants). Reintroduce when a consumer actually needs them.
local `syncBusy` state only fires on the per-row Sync-now button;
global Sync now never flipped any row, and the backend has no
per-peer in-flight signal. The pulse CSS stays so the state is
ready when a real signal lands. Filed as follow-up.
Doc drift fixed (#966)
(PresencePip sizes are just `6 | 8` literals).
use a distinct hue — they don't, the CSS falls back to
`--accent-warm`. Pulse alone distinguishes attention from offline.
real component is still `SyncPeerCard`.
inline sub-disclosures inside a drawer are fine
(`PeerScopeCollapsible` inside the device drawer is the example).
Code smell sweep (#964)
`_effectiveExclude`, `_inheritsGlobal`, `_summaryText`).
Type of Change
Testing
386 files linted — 2 fewer than before thanks to the primitive
deletions).
sub-view loads; tab through the device row, verify only the chevron
receives focus.
Stacks on #966. Closes out the Ramsay review feedback across the
redesign stack.