T-LR5B-focused-vault-view-without-rail
State: planning/proposed · Impact: medium · Complexity: small
Entering in-window vault focus today only tints the chrome and highlights one card in an otherwise fully visible vault rail — every other vault’s picker stays on screen while the point of focusing is to narrow attention to one. This task hides the rail entirely while focused, stops Escape from exiting focus so the key is free for other uses, and gives the vault switcher an explicit way back.
| Location | Role today |
|---|---|
packages/ts/app-frame/app/components/ScopeFocusBand.vue | Owns an exitOnEscape prop (default true) and a window keydown listener that emits exit on Escape |
solutions/determined/packages/shell/app/components/ShellVaultFocusBand.vue | Mounts ScopeFocusBand with no exitOnEscape override, so it defaults on; calls setFocused(null) on exit |
solutions/determined/packages/shell/app/components/ShellVaultScopePane.vue | Renders the frame’s ScopeItemPane with :focused="focused"; a focused item only gets a CSS highlight, the pane and every other card stay fully rendered |
solutions/determined/packages/shell/app/composables/useVaultWorkspace.ts | focus(vaultId)/unfocus() stash and restore the scope; focused has no rail-visibility consequence today |
solutions/determined/packages/shell/app/app.vue | #scope/#scope-collapsed mount the scope pane and rail only when NOT a separate isFocusedWindow; in-window focused has no effect on this mount |
packages/ts/panes/src/usePaneGroup.ts | collapse/expand/isCollapsed toggle a pane to its collapsedWidth rail; no state removes a pane’s DOM and width claim entirely |
solutions/determined/packages/shell/app/components/ShellVaultSwitcher.vue | Opens ShellVaultsModal to add, rename, or remove vaults; no item to leave focus |
Proposed
Section titled “Proposed”ShellVaultFocusBand.vue passes exit-on-escape="false" to ScopeFocusBand, so Escape while
focused falls through to whatever else wants it. The scope pane’s controller gains a genuine
hidden state — distinct from collapsed, claiming no width and rendering no DOM — and the shell
puts the scope pane into it while in-window focused is set, restoring it on unfocus().
ShellVaultSwitcher.vue gains an “All vaults” item that calls useVaultWorkspace().unfocus().
Approach
Section titled “Approach”usePaneGroup.ts: add ahiddenstate alongsidecollapsed, settable and clearable by a controller, with no rendered rail and no width claim — distinct from the existingcollapsedWidthOfpath.app.vue(orlayouts/default.vue): watch in-windowfocusedfromuseVaultWorkspace()and call the controller’s new hide/show for thescopepane’s id; leave the separateisFocusedWindowcase, already un-mounted at setup, untouched.ShellVaultFocusBand.vue: passexit-on-escape="false"toScopeFocusBand.ShellVaultSwitcher.vue: add an “All vaults” row, visible only whilefocusedis set, that callsunfocus().- Verify the collapsed-rail slot does not render while hidden — it disappears, it does not fold to its collapsed width.
- Capture light and dark screenshots of the focused state with the rail gone and the switcher’s new item.
| Area | Note |
|---|---|
packages/ts/panes/src/usePaneGroup.ts | Add a hidden pane state, distinct from collapsed |
solutions/determined/packages/shell/app/app.vue | Hide and show the scope pane on in-window focus and unfocus |
solutions/determined/packages/shell/app/components/ShellVaultFocusBand.vue | exit-on-escape="false" |
solutions/determined/packages/shell/app/components/ShellVaultSwitcher.vue | ”All vaults” item calling unfocus() |
Acceptance criteria
Section titled “Acceptance criteria”- AC-1: Entering in-window vault focus removes the scope rail from the DOM rather than
collapsing it, and
unfocus()restores it exactly as it was. - AC-2: Pressing Escape while focused does not exit focus.
- AC-3:
ShellVaultSwitcher.vueshows an “All vaults” item only while focused; clicking it callsunfocus()and restores the rail. - AC-4:
usePaneGroup.tsgains a test asserting thehiddenstate claims zero width and renders neither the pane nor its collapsed slot. - AC-5: Light and dark screenshots of the focused state are added to the S-0012 contact sheet.
Out of scope
Section titled “Out of scope”- The separate
isFocusedWindowcase (a dedicated OS window scoped to one vault), already un-mounting the scope pane at setup time. - Any other pane adopting the new
hiddenstate; only the vault scope pane is wired to it here.
Dependencies
Section titled “Dependencies”- T-PL39-stories-shell-chrome-directions: mocks the focused window without a rail and the switcher’s “All vaults” item.
Discovery context
Section titled “Discovery context”From the user’s planning request of 2026-09-07.