/** * Pure layout for region labels. * * Picks one of six positions (TL/TR/BR/BL/TC/BC) inside the region's * bounding box, skipping any whose representative cell sits outside * the cell-union (so labels don't float in empty L-shape gaps). */ import type { RegionDef } from '../types.js'; import type { GridLayout } from '../geometry/grid.js'; import type { LabelRect, LineSeg, CanvasBounds, Circle } from '../geometry/collision.js'; import { type AttemptRecord } from '../geometry/label-placer.js'; import type { Blob } from '../geometry/blob.js'; export type RegionPosition = 'top-left' | 'top-right' | 'bottom-right' | 'bottom-left' | 'top-center' | 'bottom-center'; /** Fixed order: TL → TR → BR → BL → TC → BC */ export declare const POSITION_ORDER: RegionPosition[]; export interface LabelSlot { lx: number; ly: number; anchor: 'start' | 'middle' | 'end'; rect: LabelRect; } /** * Place the label rect inside the bbox with `pad` clearance from the * inset rounded corner. Since the arc eats `~0.29 * radius` from the * corner, pad must account for inset + that arc bite + a small margin. */ export declare function computeRegionSlot(minX: number, maxX: number, minY: number, maxY: number, fontSize: number, estW: number, labelH: number, position: RegionPosition, pad: number): LabelSlot; export declare function bboxInPixels(blob: Blob, layout: GridLayout): { minX: number; maxX: number; minY: number; maxY: number; }; /** * Padding from bbox corner to label rect. The rounded corner eats * ~(1 − 1/√2) × radius ≈ 0.293 × radius into the bbox. Add inset and * a small extra margin so the label sits visibly clear of the arc. */ export declare function labelPadding(inset: number, radius: number, fontSize: number): number; export interface RegionLabelMetrics { fs: number; estW: number; labelH: number; pad: number; inset: number; radius: number; } export declare function regionLabelMetrics(region: RegionDef, layout: GridLayout): RegionLabelMetrics; export interface RegionLabelResult { rect: LabelRect; position: RegionPosition; error: boolean; /** Every position the placer tried, for diagnostic emission. */ attempts: AttemptRecord[]; } /** Pre-compute region label placement. Order: TL → TR → BR → BL → TC → BC */ export declare function computeRegionLabelRect(region: RegionDef, layout: GridLayout, placedLabels: LabelRect[], connLines: LineSeg[], bounds?: CanvasBounds, iconCircles?: Circle[]): RegionLabelResult | null; //# sourceMappingURL=region-label.d.ts.map