export type LayoutOutcome = "pass" | "fail" | "unknown"; export type LayoutAxis = "auto" | "x" | "y"; export interface LayoutRect { x: number; y: number; width: number; height: number; top: number; right: number; bottom: number; left: number; } export interface LayoutElementMeasurement { index: number; tag: string; label: string; snippet: string; source: "text" | "svg" | "box"; rect: LayoutRect; } export interface LayoutExclusion { index: number; tag: string; reason: "hidden" | "zero-area" | "out-of-flow" | "limit" | "visually-hidden" | "ellipsis-truncation"; } export interface AlignChild extends LayoutElementMeasurement { mid: number; deltaPx: number; fail: boolean; } export interface AlignCluster { referenceMid: number; referenceSource: "text-median" | "all-median"; children: AlignChild[]; } export interface AlignResult { rule: "align"; selector: string; found: boolean; outcome: LayoutOutcome; axis: "x" | "y"; tolerancePx: number; clusters: AlignCluster[]; excluded: LayoutExclusion[]; } export interface GapPair { before: LayoutElementMeasurement; after: LayoutElementMeasurement; observedGapPx: number; referenceGapPx: number | null; deltaPx: number | null; fail: boolean; } export interface GapCluster { referenceGapPx: number | null; referenceSource: "explicit" | "median" | "unavailable"; outcome: LayoutOutcome; pairs: GapPair[]; } export interface GapResult { rule: "gap"; selector: string; found: boolean; outcome: LayoutOutcome; axis: "x" | "y"; tolerancePx: number; expectedGapPx: number | null; clusters: GapCluster[]; excluded: LayoutExclusion[]; } export interface ClipIssue { element: LayoutElementMeasurement; clippedBy: string; overrun: { top: number; right: number; bottom: number; left: number; }; maxOverrunPx: number; } export interface ClipResult { rule: "clip"; selector: string; found: boolean; outcome: LayoutOutcome; tolerancePx: number; issues: ClipIssue[]; unsupported: string[]; excluded: LayoutExclusion[]; truncated: boolean; } export interface OverlapIssue { first: LayoutElementMeasurement; second: LayoutElementMeasurement; intersection: LayoutRect; areaPx: number; } export interface OverlapResult { rule: "overlap"; selector: string; found: boolean; outcome: LayoutOutcome; tolerancePx: number; issues: OverlapIssue[]; excluded: LayoutExclusion[]; truncated: boolean; } export interface CrowdPair { before: LayoutElementMeasurement; after: LayoutElementMeasurement; /** Edge separation along `axis` in CSS px; negative means the panels overlap. */ separationPx: number; /** "y" = stacked, "x" = side by side, "overlap" = they intersect in 2D. */ axis: "x" | "y" | "overlap"; minGapPx: number; /** DOM label of the shared parent, so the fix location is obvious. */ parentLabel: string; /** * Whether each consecutive sibling peer was a leaf panel or a wrapper that * contains panels. `before`/`after` always measure the nearest face panels * (a descendant when the peer is composite). */ beforeKind: "panel" | "composite"; afterKind: "panel" | "composite"; } export interface CrowdResult { rule: "crowd"; selector: string; found: boolean; outcome: LayoutOutcome; minGapPx: number; issues: CrowdPair[]; truncated: boolean; } export interface LayoutLintRequest { align: Array<{ selector: string; axis: LayoutAxis; tolerancePx: number; }>; gap: Array<{ selector: string; axis: LayoutAxis; tolerancePx: number; expectedGapPx: number | null; }>; clip: Array<{ selector: string; tolerancePx: number; }>; overlap: Array<{ selector: string; tolerancePx: number; }>; crowd: Array<{ selector: string; minGapPx: number; }>; } export interface LayoutLintResult { align: AlignResult[]; gap: GapResult[]; clip: ClipResult[]; overlap: OverlapResult[]; crowd: CrowdResult[]; } export declare function median(values: number[]): number; export declare function intersectRects(a: LayoutRect, b: LayoutRect): LayoutRect | null; /** * One self-contained page evaluator for the rendered-geometry rule family. * Helpers are nested because Playwright serializes the returned function and * cannot follow module-level closures into the browser context. */ export declare function buildLayoutLintCheck(): (request: LayoutLintRequest) => LayoutLintResult; export declare function buildLayoutLintAnnotateScript(): (result: LayoutLintResult) => void; export declare function buildClearLayoutLintAnnotationsScript(): () => void; //# sourceMappingURL=geometry.d.ts.map