fix: strengthen visible content accessibility proof

This commit is contained in:
2026-09-02 03:37:58 +03:00
parent 829fed53aa
commit 8dabd9a6df
4 changed files with 338 additions and 53 deletions

View File

@@ -1,7 +1,7 @@
import { readFile, realpath, stat } from 'node:fs/promises';
import { createServer, type ServerResponse } from 'node:http';
import { extname, isAbsolute, relative, resolve, sep } from 'node:path';
import { expect, test as base } from '@playwright/test';
import { expect, test as base, type Page } from '@playwright/test';
const LOOPBACK_HOST = '127.0.0.1';
@@ -82,6 +82,40 @@ export interface DistPreviewServer {
close(): Promise<void>;
}
export async function expectInsetFocusIndicator(
page: Page,
selector: string,
): Promise<void> {
await expect
.poll(() =>
page.locator(selector).evaluate((element) => {
const rect = element.getBoundingClientRect();
const viewport = window.visualViewport;
const viewportLeft = viewport?.offsetLeft ?? 0;
const viewportTop = viewport?.offsetTop ?? 0;
const viewportRight =
viewportLeft + (viewport?.width ?? window.innerWidth);
const viewportBottom =
viewportTop + (viewport?.height ?? window.innerHeight);
const style = getComputedStyle(element);
return {
focused: document.activeElement === element,
intersectsViewport:
rect.right > viewportLeft &&
rect.left < viewportRight &&
rect.bottom > viewportTop &&
rect.top < viewportBottom,
insetIndicator: /\binset\b/iu.test(style.boxShadow),
};
}),
)
.toEqual({
focused: true,
intersectsViewport: true,
insetIndicator: true,
});
}
export async function startDistServer(
distRoot = resolve(process.cwd(), 'dist'),
): Promise<DistPreviewServer> {