diff --git a/examples/basic-server-preact/src/global.css b/examples/basic-server-preact/src/global.css index 97cda440..08d4da16 100644 --- a/examples/basic-server-preact/src/global.css +++ b/examples/basic-server-preact/src/global.css @@ -10,3 +10,9 @@ html, body { code { font-size: 1em; } + +/* Server time fills remaining width for consistent E2E screenshot masking */ +#server-time { + flex: 1; + min-width: 0; +} diff --git a/examples/basic-server-preact/src/mcp-app.module.css b/examples/basic-server-preact/src/mcp-app.module.css index 0c6429aa..41a04565 100644 --- a/examples/basic-server-preact/src/mcp-app.module.css +++ b/examples/basic-server-preact/src/mcp-app.module.css @@ -28,6 +28,13 @@ margin-top: 0.5rem; } + /* Server time row: flex layout for consistent mask width in E2E tests */ + > p { + display: flex; + align-items: baseline; + gap: 0.25em; + } + /* Consistent font for form inputs (inherits from global.css) */ textarea, input { diff --git a/examples/basic-server-react/src/global.css b/examples/basic-server-react/src/global.css index 97cda440..08d4da16 100644 --- a/examples/basic-server-react/src/global.css +++ b/examples/basic-server-react/src/global.css @@ -10,3 +10,9 @@ html, body { code { font-size: 1em; } + +/* Server time fills remaining width for consistent E2E screenshot masking */ +#server-time { + flex: 1; + min-width: 0; +} diff --git a/examples/basic-server-react/src/mcp-app.module.css b/examples/basic-server-react/src/mcp-app.module.css index 0c6429aa..41a04565 100644 --- a/examples/basic-server-react/src/mcp-app.module.css +++ b/examples/basic-server-react/src/mcp-app.module.css @@ -28,6 +28,13 @@ margin-top: 0.5rem; } + /* Server time row: flex layout for consistent mask width in E2E tests */ + > p { + display: flex; + align-items: baseline; + gap: 0.25em; + } + /* Consistent font for form inputs (inherits from global.css) */ textarea, input { diff --git a/examples/basic-server-solid/src/global.css b/examples/basic-server-solid/src/global.css index 97cda440..08d4da16 100644 --- a/examples/basic-server-solid/src/global.css +++ b/examples/basic-server-solid/src/global.css @@ -10,3 +10,9 @@ html, body { code { font-size: 1em; } + +/* Server time fills remaining width for consistent E2E screenshot masking */ +#server-time { + flex: 1; + min-width: 0; +} diff --git a/examples/basic-server-solid/src/mcp-app.module.css b/examples/basic-server-solid/src/mcp-app.module.css index 0c6429aa..41a04565 100644 --- a/examples/basic-server-solid/src/mcp-app.module.css +++ b/examples/basic-server-solid/src/mcp-app.module.css @@ -28,6 +28,13 @@ margin-top: 0.5rem; } + /* Server time row: flex layout for consistent mask width in E2E tests */ + > p { + display: flex; + align-items: baseline; + gap: 0.25em; + } + /* Consistent font for form inputs (inherits from global.css) */ textarea, input { diff --git a/examples/basic-server-svelte/src/App.svelte b/examples/basic-server-svelte/src/App.svelte index 31fe9726..48fbe66c 100644 --- a/examples/basic-server-svelte/src/App.svelte +++ b/examples/basic-server-svelte/src/App.svelte @@ -162,6 +162,13 @@ async function handleOpenLink() { margin-top: 0.5rem; } + /* Server time row: flex layout for consistent mask width in E2E tests */ + > p { + display: flex; + align-items: baseline; + gap: 0.25em; + } + textarea, input { font-family: inherit; @@ -196,4 +203,10 @@ async function handleOpenLink() { font-style: normal; } } + +/* Server time fills remaining width for consistent E2E screenshot masking */ +:global(#server-time) { + flex: 1; + min-width: 0; +} diff --git a/examples/basic-server-vanillajs/src/global.css b/examples/basic-server-vanillajs/src/global.css index 97cda440..08d4da16 100644 --- a/examples/basic-server-vanillajs/src/global.css +++ b/examples/basic-server-vanillajs/src/global.css @@ -10,3 +10,9 @@ html, body { code { font-size: 1em; } + +/* Server time fills remaining width for consistent E2E screenshot masking */ +#server-time { + flex: 1; + min-width: 0; +} diff --git a/examples/basic-server-vanillajs/src/mcp-app.css b/examples/basic-server-vanillajs/src/mcp-app.css index 0c6429aa..41a04565 100644 --- a/examples/basic-server-vanillajs/src/mcp-app.css +++ b/examples/basic-server-vanillajs/src/mcp-app.css @@ -28,6 +28,13 @@ margin-top: 0.5rem; } + /* Server time row: flex layout for consistent mask width in E2E tests */ + > p { + display: flex; + align-items: baseline; + gap: 0.25em; + } + /* Consistent font for form inputs (inherits from global.css) */ textarea, input { diff --git a/examples/basic-server-vue/src/App.vue b/examples/basic-server-vue/src/App.vue index bfffaeea..acf88c4d 100644 --- a/examples/basic-server-vue/src/App.vue +++ b/examples/basic-server-vue/src/App.vue @@ -170,6 +170,13 @@ async function handleOpenLink() { margin-top: 0.5rem; } + /* Server time row: flex layout for consistent mask width in E2E tests */ + > p { + display: flex; + align-items: baseline; + gap: 0.25em; + } + textarea, input { font-family: inherit; @@ -204,4 +211,10 @@ async function handleOpenLink() { font-style: normal; } } + +/* Server time fills remaining width for consistent E2E screenshot masking */ +:deep(#server-time) { + flex: 1; + min-width: 0; +} diff --git a/examples/integration-server/src/global.css b/examples/integration-server/src/global.css index 97cda440..08d4da16 100644 --- a/examples/integration-server/src/global.css +++ b/examples/integration-server/src/global.css @@ -10,3 +10,9 @@ html, body { code { font-size: 1em; } + +/* Server time fills remaining width for consistent E2E screenshot masking */ +#server-time { + flex: 1; + min-width: 0; +} diff --git a/examples/integration-server/src/mcp-app.module.css b/examples/integration-server/src/mcp-app.module.css index 0c6429aa..41a04565 100644 --- a/examples/integration-server/src/mcp-app.module.css +++ b/examples/integration-server/src/mcp-app.module.css @@ -28,6 +28,13 @@ margin-top: 0.5rem; } + /* Server time row: flex layout for consistent mask width in E2E tests */ + > p { + display: flex; + align-items: baseline; + gap: 0.25em; + } + /* Consistent font for form inputs (inherits from global.css) */ textarea, input { diff --git a/tests/e2e/generate-grid-screenshots.spec.ts b/tests/e2e/generate-grid-screenshots.spec.ts index 3f326303..a127e700 100644 --- a/tests/e2e/generate-grid-screenshots.spec.ts +++ b/tests/e2e/generate-grid-screenshots.spec.ts @@ -10,7 +10,7 @@ * integration-server is excluded (it's for E2E testing, same UI as basic-server-react). */ -import { test, type Page } from "@playwright/test"; +import { test, expect, type Page } from "@playwright/test"; import * as path from "path"; import * as fs from "fs"; import sharp from "sharp"; @@ -95,12 +95,9 @@ async function waitForAppLoad(page: Page) { */ async function loadServer(page: Page, serverName: string) { await page.goto("/"); - await page - .locator("select") - .nth(0) - .waitFor({ state: "visible", timeout: 30000 }); - await page.waitForTimeout(500); - await page.locator("select").nth(0).selectOption({ label: serverName }); + // Wait for servers to connect (select becomes enabled when servers are ready) + await expect(page.locator("select").first()).toBeEnabled({ timeout: 30000 }); + await page.locator("select").first().selectOption({ label: serverName }); await page.click('button:has-text("Call Tool")'); await waitForAppLoad(page); } diff --git a/tests/e2e/servers.spec.ts-snapshots/basic-preact.png b/tests/e2e/servers.spec.ts-snapshots/basic-preact.png index 96d22f08..a1b5560b 100644 Binary files a/tests/e2e/servers.spec.ts-snapshots/basic-preact.png and b/tests/e2e/servers.spec.ts-snapshots/basic-preact.png differ diff --git a/tests/e2e/servers.spec.ts-snapshots/basic-react.png b/tests/e2e/servers.spec.ts-snapshots/basic-react.png index 6aaf42c0..bfc28bb1 100644 Binary files a/tests/e2e/servers.spec.ts-snapshots/basic-react.png and b/tests/e2e/servers.spec.ts-snapshots/basic-react.png differ diff --git a/tests/e2e/servers.spec.ts-snapshots/basic-solid.png b/tests/e2e/servers.spec.ts-snapshots/basic-solid.png index 5b5b8128..4f5c806b 100644 Binary files a/tests/e2e/servers.spec.ts-snapshots/basic-solid.png and b/tests/e2e/servers.spec.ts-snapshots/basic-solid.png differ diff --git a/tests/e2e/servers.spec.ts-snapshots/basic-svelte.png b/tests/e2e/servers.spec.ts-snapshots/basic-svelte.png index b2a95f5f..2c64b238 100644 Binary files a/tests/e2e/servers.spec.ts-snapshots/basic-svelte.png and b/tests/e2e/servers.spec.ts-snapshots/basic-svelte.png differ diff --git a/tests/e2e/servers.spec.ts-snapshots/basic-vanillajs.png b/tests/e2e/servers.spec.ts-snapshots/basic-vanillajs.png index d6e87716..57586967 100644 Binary files a/tests/e2e/servers.spec.ts-snapshots/basic-vanillajs.png and b/tests/e2e/servers.spec.ts-snapshots/basic-vanillajs.png differ diff --git a/tests/e2e/servers.spec.ts-snapshots/basic-vue.png b/tests/e2e/servers.spec.ts-snapshots/basic-vue.png index b4cb257a..6d7df204 100644 Binary files a/tests/e2e/servers.spec.ts-snapshots/basic-vue.png and b/tests/e2e/servers.spec.ts-snapshots/basic-vue.png differ diff --git a/tests/e2e/servers.spec.ts-snapshots/integration.png b/tests/e2e/servers.spec.ts-snapshots/integration.png index c7350401..60b52e7c 100644 Binary files a/tests/e2e/servers.spec.ts-snapshots/integration.png and b/tests/e2e/servers.spec.ts-snapshots/integration.png differ diff --git a/tests/e2e/servers.spec.ts-snapshots/system-monitor.png b/tests/e2e/servers.spec.ts-snapshots/system-monitor.png index 4d6ef118..dbb054f4 100644 Binary files a/tests/e2e/servers.spec.ts-snapshots/system-monitor.png and b/tests/e2e/servers.spec.ts-snapshots/system-monitor.png differ