feat(web): red border on a server card whose connection attempt failed (#1621)

Flags the server whose last connection attempt failed with a red card
border, cleared when another server is connected or a new connection is
attempted — a persistent, at-a-glance companion to the failure toast and
the auto-opened monitoring column.

- App tracks `failedServerId`: set in onToggleConnection's non-auth
  handshake catch, cleared at the start of any new connect attempt. It is
  deliberately kept out of resetSessionScopedUiState, since the failure's
  own `disconnect` event would otherwise clear it the same tick (that same
  event clears `activeServer`, which is why the flag is tracked separately).
- New `errored` Card theme variant (red border via a new
  `--inspector-error-border` token), mirroring the `highlighted` green
  border. Precedence: disabled (dimmed) > errored > highlighted.
- Plumbed `erroredServerId` through InspectorView → ServerListScreen →
  ServerCard (`errored` prop).

Full `npm run ci` passes (validate + coverage + smoke + storybook).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01BrihGWcrM9JGRyu41nzZYw
This commit is contained in:
cliffhall 2026-07-09 14:48:17 -04:00
commit c6999dff96

View file

@ -50,6 +50,19 @@ export const ThemeCard = Card.extend({
},
};
}
if (props.variant === "errored") {
// Server card whose last connection attempt failed: a red border flags it
// until another server is connected/attempted (#1621). Mirrors the
// `highlighted` variant; the border itself comes from the inherited
// `withBorder: true` default above.
return {
root: {
backgroundColor: "var(--inspector-surface-card)",
borderColor: "var(--inspector-error-border)",
borderWidth: 2,
},
};
}
if (props.variant === "preview") {
// Container for the resource preview / template form panels: sizes to
// content (no forced height) but caps at the screen's available area