import type { Rect } from '../utils/vision.js'; export interface DetectedBox extends Rect { id: number; /** Text found inside the box on the blank screenshot (buttons, dropdowns, tabs). Absent when empty. */ value?: string; } export interface BoxCluster { /** Box IDs that are spatially adjacent on the same visual row. */ boxIds: number[]; } export declare function kebab(name: string): string; export declare function unionRects(rects: Rect[]): Rect; export declare function insetRect(rect: Rect, pad?: number): Rect; /** Move a screen-space rect into the crop's coordinate system. */ export declare function relativeToCrop(rect: Rect, crop: Rect): Rect; /** Slice a rect by horizontal fractions in [0, 1]. */ export declare function sliceRectHorizontal(rect: Rect, start: number, end: number): Rect; export declare function evenHorizontalSlices(rect: Rect, count: number): Rect[]; /** Bright column runs inside a merged field (cells vs `/` gutters). */ export declare function findAlignedCells(columnMeans: number[], count: number, minWidth?: number, bright?: number): Array<{ start: number; end: number; }> | null; /** Bright cells in a row separated by dark gutters (dates, id + name). */ export declare function findCellRow(columnMeans: number[], minCount?: number, minWidth?: number, bright?: number): Array<{ start: number; end: number; }> | null; /** Short mid-gray bands between bright rows (repeating row gutters). */ export declare function findHairlineDividers(rowMeans: number[], midLo?: number, midHi?: number, bright?: number): number[]; /** Slice a tall rect into rows when hairlines repeat. */ export declare function splitRowGutters(parent: Rect, rowMeans: number[]): Rect[] | null; /** Split a rect on visible gutters: columns if short, rows if tall. */ export declare function splitBoxGutters(box: Rect, columnMeans: number[], rowMeans: number[]): Rect[] | null; export declare function cellRunsToRects(parent: Rect, runs: Array<{ start: number; end: number; }>, inset?: number): Rect[]; /** Value box relative to the match crop. Dropdowns drop the spinner on the right. */ export declare function ocrRectFromBoxes(crop: Rect, fieldBoxes: Rect[], type?: string, pad?: number): Rect; export declare function includeLabelForType(type?: string, override?: boolean): boolean; /** First in-form x walking left from the field — stop before window chrome. */ export declare function formLeftEdge(png: { width: number; height: number; data: Buffer | Uint8Array; }, rect: Rect, dark?: number): number | null; /** Grow the crop left from the value box(es) to include the label. */ export declare function expandLeftForLabel(boxes: DetectedBox[], fieldBoxes: DetectedBox[], pad?: number, maxLabel?: number, png?: { width: number; height: number; data: Buffer | Uint8Array; }): Rect; export declare function containedRatio(inner: Rect, outer: Rect): number; /** Drop a container that already has inner cells. Keep the inners. */ export declare function splitMergedFields(boxes: Rect[], minKids?: number): Rect[]; /** Drop boxes that sit mostly inside a larger box (text scraps inside a button). */ export declare function dropNestedBoxes(boxes: Rect[], ratio?: number): Rect[]; export declare function dedupeBoxes(raw: Rect[]): Rect[]; export declare function numberBoxes(boxes: Rect[]): DetectedBox[]; //# sourceMappingURL=geometry.d.ts.map