Addresses UXDesigner review against the approved design spec:
- Placement: move the discovery affordance into a calm action row at the
bottom of IssueWorkspaceCard ("Browse files…" + "Open file by path…"),
removing the orphaned button between Artifacts and Tabs. The existing
top-right toolbar / `g f` entry stays as the secondary affordance.
- Single sheet, two modes: opening a result from browse now shows a
"← Back to files" affordance (and a separate × close) in the view header,
with Esc returning to the list. Browse state is URL-backed (`browse=1`,
`q`) via FileViewerContext (open(...{fromBrowse}), openBrowse, backToFiles).
- Remove the Recent/All toggle: empty query → Recently changed (silent
fallback to full listing when git change-tracking is unavailable);
populated query → Files matching. Search field accepts `path:line` and
Enter opens the highlighted row or the typed path.
- Mobile (<sm) two-line rows (basename / dirname, no timestamp, 44px tap
targets); desktop single-line with dir-truncate. Recently-changed shows
relative timestamps; search results omit them to maximise path width.
- Keyboard: listbox/option roles, ↑/↓ + Enter, aria-activedescendant,
combobox search field.
- Align unavailable copy with describeDenial (remote / cleaned-up);
debounce 150ms; documented the 100-row cap.
- Stories now render the real FileViewerSheet / IssueWorkspaceCard for
truthful light+dark, desktop+360px, view-mode, and placement captures.
Co-Authored-By: Paperclip <noreply@paperclip.ing>
Adds a discoverable "Browse workspace" control near the issue output/
artifacts area that opens the existing FileViewerSheet. The sheet's empty
state now hosts a WorkspaceFileBrowser: debounced path/name search, a
workspace selector (auto/execution/project) and a recent-changes/all
toggle, backed by the GET /file-resources/list API. Rows show the
workspace label, file kind and size with long-path-safe truncation
(directory truncates, basename stays visible), and clicking a file opens
the viewer via a URL-backed deep link. Distinct calm states cover no
workspace, remote workspace, cleaned-up workspace, and recent-changes
unavailable, plus transport/denied errors.
- WorkspaceFileBrowser component + describeUnavailable reason mapping
- Integrate into FileViewerSheet empty state with manual-path fallback
- "Browse workspace" affordance on the issue page
- Unit tests for list/states/open + Storybook stories for review
Co-Authored-By: Paperclip <noreply@paperclip.ing>