import { type Aabb, type Footprint, type Vec2 } from "./geometry.js"; export interface PlacementObstacle { aabb: Aabb; id?: string; } export interface PlacementRequest { center: Vec2; footprint: Footprint; quarterTurns?: number; } export interface PlacementRules { bounds?: Aabb; obstacles?: readonly PlacementObstacle[]; snap?: number; /** Authoritative ownership/claim validation for this footprint. */ territory?: (aabb: Aabb) => { ok: boolean; }; } export type PlacementResult = { status: "ok"; center: Vec2; aabb: Aabb; } | { status: "rejected"; reason: "out-of-bounds"; } | { status: "rejected"; reason: "territory.blocked"; } | { status: "rejected"; reason: "overlap"; obstacle: PlacementObstacle; index: number; }; /** * Footprint validity: bounds + obstacle overlap after optional grid snap. * @capability placement-math grid/surface footprint validity for build mode */ export declare function validatePlacement(request: PlacementRequest, rules?: PlacementRules): PlacementResult; export declare function footprintObstacle(request: PlacementRequest, id?: string): PlacementObstacle;