fe1dfe472ae1c77c4253722c2b24028cc310005a
Keys, secrets, audit, steps and workflows each carried the same loading/error/empty ternary with its own copy of the spinner and its own wording for a failed fetch — five of them had drifted to five different sentences for "the request did not come back". They go through AsyncBoundary now, which means a skeleton in place of a spinner, a retry button on failure, and backend messages passed through friendlyMessage rather than printed raw. Steps gets the filtered-empty state the fleet just got: "no steps match that filter" is not "no steps yet", and only one of them should offer to create the first one. Two more from review: Modal's effect ran before `mounted` flipped, so a dialog rendered already open found null refs and took no focus at all. It depends on `mounted` now. aria-modal was a claim with no mechanism behind it — portalled to the body, the app tree is a sibling of the dialog and a screen reader's virtual cursor still browsed the page underneath. The body's other children are marked aria-hidden while any dialog is open, refcounted alongside the scroll lock. This does mean a toast raised while a dialog is open is not announced, which is the correct trade for a modal: ConfirmDialog shows its own errors inline.
Description
No description provided
14 MiB
Releases
29
agent/v1.3.4
Latest
Languages
JavaScript
71.9%
TypeScript
15.1%
Go
12.8%