Repository navigation
(ui): shared control styles, Touched list above its editor, middle-truncated file paths (#467) - #468
Merged
Merged
Conversation
Harness-Claim: true Agent: switchboard-dev Host: ANCHOR Base-Ref: origin/main Base-SHA: 43e7d4a Claimed-At: 2026-10-04T14:04:29.3153722Z Nonce: 887f60fb3d8a3450
…uncated file paths (#467) The Touched sort used the browser's select and its explanation took several lines. The sort now shares the Settings select style, the explanation sits behind an (i) modal, and Touched keeps its list above the open file with a resizable split instead of a Back control. Editor headers show the start and end of a path with the full path on hover. Closes #467
Owner
Author
|
Review round 1 at 952f3c9: nothing blocking. The dirty prompt holds on every path tried. Checked by reading, and by 4 mutations, all caught:
Also checked:
CI is green on 952f3c9. Minor fixes in progress:
|
…le names Observe the Touched and Changes containers so opening the panel shell reapplies the stored ratio, let the path tail shrink with its own ellipsis, take the tail from the last non-empty segment, and note the shared Settings select styles in the changelog.
Owner
Author
|
Review round 2 at cc08a74: approve. The five round-1 findings are fixed:
CI is green on cc08a74, and the host suite passes with 0 failures. |
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.
(file panel): Keep Touched visible above its editor and preserve header filenames
Touched now keeps its file list above the shared Changes editor and splitter. Close and editor Escape restore the full-height list; row switching uses the existing dirty prompt, including edits made while the next file is being read. Changes keeps its Back behavior, and each list retains its own unsaved-buffer stash.
The sort control shares the unchanged Settings select style. The explanation sits behind an info button in a modal with Escape, outside-click and close-button dismissal, focus return and Escape isolation. All file/diff headers share a shrinking path head and a fixed filename tail, with the complete path available on hover. The Touched panel header remains Touched files.
Validation
python .work-files/check-related.pyexpands tonode --testover all 27 touched, changes, file-panel, settings, theme and viewer test files. Final result: 833 tests, 829 passed, 2 failed, 2 skipped; exit 1. Output:.work-files/related-tests.log.git-changes-file-real-git.test.js:732cannot create the custom Git-directory HEAD lock, andgit-changes-runner-real-git.test.js:512cannot create the linked worktree.gitpath (Permission denied). Their runtime modules are also unchanged. The sandbox restrictions remain unresolved; the suite is not fully green..work-files/eslint.log.git diff --check: exit 0..work-files/red-touched.log,.work-files/red-path.log,.work-files/red-pending-switch.log. The Settings fixture was corrected before its class mutation was verified.python .work-files/mutations-467.py. Details:.work-files/mutations.json.e2e/changes.spec.jsande2e/theme-controls.spec.js; journeys not run. Electron was not launched. Visual width behavior, modal appearance and actual splitter geometry were not verified live.Mutation guards
Each row is one injected mutation and the targeted test that rejected it. Every command uses
node --test --test-name-pattern=<pattern> <file>and is bounded to 180 seconds.public/touched-files-view.js:sort.className = 'control-select'; -> sort.className = '';Touched uses the shared select styleintest/dom-file-panel-touched.test.jspublic/settings-panel.js:settings-select control-select -> settings-selectSettings selects retainintest/viewer-header-path.test.jspublic/touched-files-view.js:document.body.appendChild(overlay); -> button.appendChild(overlay);Touched info closes by closeintest/dom-file-panel-touched.test.jspublic/touched-files-view.js:if (event.key === 'Escape') { -> if (event.key === 'Never') {Touched info closes by escapeintest/dom-file-panel-touched.test.jspublic/touched-files-view.js:if (event.target === overlay) close(); -> if (false) close();Touched info closes by outsideintest/dom-file-panel-touched.test.jspublic/touched-files-view.js:closeButton.addEventListener('click', close); -> closeButton.addEventListener('click', () => {});Touched info closes by closeintest/dom-file-panel-touched.test.jspublic/touched-files-view.js:button.focus(); -> document.body.focus();Touched info closes by closeintest/dom-file-panel-touched.test.jspublic/touched-files-view.js:event.stopImmediatePropagation(); ->Touched info closes by escapeintest/dom-file-panel-touched.test.jspublic/touched-files-view.js:const shown = listTab?.type === 'touched'; -> const shown = tab?.type === 'touched';Touched keeps its list aboveintest/dom-file-panel-touched.test.jspublic/file-panel.js:clampChangesListHeight(startSize + delta, available) / available -> clampChangesListHeight(startSize, available) / availableTouched keeps its list aboveintest/dom-file-panel-touched.test.jspublic/file-panel.js:String(touched ? touchedListRatio : changesListDesiredHeight) -> String(touched ? DEFAULT_TOUCHED_LIST_RATIO : changesListDesiredHeight)Touched keeps its list aboveintest/dom-file-panel-touched.test.jspublic/file-panel.js:if (value > 0 && value < 1) return value; -> if (false) return value;defaults on 0.6intest/dom-file-panel-touched.test.jspublic/file-panel.js:} catch {} return DEFAULT_TOUCHED_LIST_RATIO; -> } catch { throw new Error("storage unavailable"); } return DEFAULT_TOUCHED_LIST_RATIO;localStorage refuses readsintest/dom-file-panel-touched.test.jspublic/file-panel.js:String(touched ? touchedListRatio : changesListDesiredHeight)); } catch {} -> String(touched ? touchedListRatio : changesListDesiredHeight)); } catch { throw new Error("storage unavailable"); }localStorage refuses readsintest/dom-file-panel-touched.test.jspublic/file-panel.js:if (tab?.selectedFile) applyChangesListHeight(); -> if (false) applyChangesListHeight();defaults on 0.6intest/dom-file-panel-touched.test.jspublic/file-panel.js:else layout.list.style.height = ''; -> else layout.list.style.height = '240px';Touched keeps its list aboveintest/dom-file-panel-touched.test.jspublic/file-panel.js:if (!confirmDiscardChangesEdits(tab)) return false; -> if (false) return false;Touched dirty closeintest/dom-file-panel-touched.test.jspublic/file-panel.js:if (!confirmDiscardChangesEdits(tab)) return false; -> if (false) return false;Touched dirty escapeintest/dom-file-panel-touched.test.jspublic/touched-files-view.js:if (!confirmDiscardChangesEdits(current)) return; -> if (false) return;Touched dirty switchintest/dom-file-panel-touched.test.jspublic/touched-files-view.js:if (readChangesEditorContent(current) !== agreedContent && !confirmDiscardChangesEdits(current)) return; -> if (false) return;Touched asks againintest/dom-file-panel-touched.test.jspublic/touched-files-view.js:if (current.absolutePath === filePath) return; -> if (current.absolutePath) return;Touched rows can switch cleanintest/dom-file-panel-touched.test.jspublic/file-panel.js:tab.returnList?.type !== 'touched' && ->Touched keeps its list aboveintest/dom-file-panel-touched.test.jspublic/touched-files-view.js:title.textContent = 'Touched files'; -> title.textContent = 'Changes';Touched keeps its list aboveintest/dom-file-panel-touched.test.jspublic/file-panel.js:renderPanel(currentPanelSessionId); return true; -> refreshTouched(currentPanelSessionId); renderPanel(currentPanelSessionId); return true;Touched keeps its list aboveintest/dom-file-panel-touched.test.jspublic/viewer-toolbar.js:el.title = value; -> el.title = '';shared viewer path keepsintest/viewer-header-path.test.jspublic/viewer-toolbar.js:tail.textContent = value.slice(split); -> tail.textContent = '';shared viewer path keepsintest/viewer-header-path.test.jspublic/style.css:.viewer-path-tail { flex: 0 0 auto; -> .viewer-path-tail { flex: 1 1 auto;shared path CSSintest/viewer-header-path.test.jspublic/file-panel.js:window.setViewerPath(changesDiffTitleEl, tab.selectedFile.path); -> changesDiffTitleEl.textContent = tab.selectedFile.path;file and diff editor headersintest/dom-file-panel-touched.test.jspublic/file-panel.js:if (pathEl) window.setViewerPath(pathEl, tab.filePath || ''); -> if (pathEl) pathEl.textContent = tab.filePath || '';file and diff editor headersintest/dom-file-panel-touched.test.jspublic/viewer-toolbar.js:setPath(text) { setViewerPath(pathEl, text); } -> setPath(text) { pathEl.textContent = text; }ViewerPanel headersintest/viewer-header-path.test.jsDelivery
(#467)are updated.wt/467. No stash, installation, app launch, push or external application write was performed.374afe85d72d497bf2c22f026112e86d3f16ffd3; the brief states43e7d4a, but the worktree was clean at start. Branch and worktree were retained.implementer, but the external.harness/.sessions.lockwas inaccessible. Readback reports the session is not registered; no checkpoint was created.