inspector/clients/web/src/test/scrollAreaStoryAssertions.ts
cliffhall ace4250d31 refactor(web): rename "History" tab/feature to "Protocol" (#1623)
Rename the web client's History tab and its supporting code to Protocol
so the feature reads as the MCP "Protocol" view.

- Tab renders as "Protocol"; INSPECTOR_TAB_IDS, InspectorView tab
  constants/MonitorTab, TAB_UI_REGISTRY key, and navigation.ts tab id all
  updated to Protocol.
- Rename components + folders: HistoryScreen -> ProtocolScreen,
  HistoryListPanel -> ProtocolListPanel, HistoryEntry -> ProtocolEntry,
  HistoryControls -> ProtocolControls, historyUtils -> protocolUtils
  (plus their tests and stories, and exported types).
- Rename App/InspectorView plumbing: historyUi, pinnedHistoryIds,
  on*History* handlers/props, replayHistoryRequest,
  isReplayableHistoryMethod, sort/compact scopes, etc. -> Protocol names.
- Export filenames use the "protocol" slug (buildExportFilename +
  ExportKind).

Preserved (per issue #1623 decisions):
- The in-panel section discriminator keeps its "pinned" | "history"
  values, and the sub-sections stay labeled Pinned / History.
- window.history and core message-log/replay concepts are untouched.

npm run ci passes (format, lint, build, unit tests, >=90 per-file
coverage gate, smoke, Storybook).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01BrihGWcrM9JGRyu41nzZYw
2026-07-09 19:04:54 -04:00

27 lines
1.2 KiB
TypeScript

import { expect } from "storybook/test";
/**
* Assert a list `ScrollArea.Autosize` reserves a scrollbar gutter
* (`offsetScrollbars`, so the bar never overlays the cards) and keeps the bar
* hidden when idle (`type="scroll"`, so it shows only while scrolling rather
* than on hover). Shared by the Protocol/Network/Logging panel stories (#1474).
*/
export function expectScrollbarGutterIdleHidden(canvasElement: HTMLElement) {
const viewport = canvasElement.querySelector(".mantine-ScrollArea-viewport");
if (!(viewport instanceof HTMLElement)) {
throw new Error("scroll viewport not found");
}
// offsetScrollbars reserves a non-zero inline-end gutter for the scrollbar.
const pad = parseFloat(getComputedStyle(viewport).paddingInlineEnd);
expect(pad).toBeGreaterThan(0);
// type="scroll" → scrollbars are mounted but hidden until the user scrolls.
// Assert at least one exists first so the loop isn't trivially-true if a
// future change stops rendering the scrollbar element.
const scrollbars = canvasElement.querySelectorAll(
".mantine-ScrollArea-scrollbar",
);
expect(scrollbars.length).toBeGreaterThan(0);
for (const bar of scrollbars) {
expect(bar.getAttribute("data-state")).toBe("hidden");
}
}