export interface WidgetBounds { width: number; height: number; pad: number; innerWidth: number; innerHeight: number; dialSize: number; } /** Resolve widget box from props — dials use dialSize, panels use width/height. */ export declare function resolveBounds(props: Record, defaultWidth: number, defaultHeight: number, pad?: number): WidgetBounds; /** True when widget should use compact LCD layout instead of analog dial. */ export declare function isCompactBounds(bounds: WidgetBounds): boolean; /** Estimate rendered text width for automotive monospace/sans labels. */ export declare function estimateTextWidth(text: string, fontSize: number): number; /** Estimate left-x so text fits inside a box (avoids center-anchor bounds overflow). */ export declare function fitTextX(text: string, fontSize: number, boxW: number, pad?: number): number; /** Shrink font until text fits inside a box; returns centered left-x. */ export declare function fitFontSizeToWidth(text: string, boxW: number, maxSize: number, minSize?: number, pad?: number): { fontSize: number; x: number; }; /** Convert a desired anchor y into canvas top-y (renderer uses textBaseline top). */ export declare function textYForBaseline(y: number, fontSize: number, baseline?: CanvasTextBaseline): number; /** Centered text with stable box for HTML + bounds. */ export declare function autoCenteredText(app: import('../App').App, text: string, boxW: number, y: number, options?: { fontSize?: number; fontWeight?: string; fill?: string; fontFamily?: string; textBaseline?: CanvasTextBaseline; insetX?: number; insetY?: number; }): import("..").TextNode; export declare function fluidFont(base: number, bounds: WidgetBounds, min?: number, max?: number): number; export declare function centerInBounds(bounds: WidgetBounds, contentW: number, contentH: number): { x: number; y: number; }; export type GaugeDisplay = 'analog' | 'digital'; /** Resolve analog needle dial vs digital LCD readout. */ export declare function resolveDisplay(props: Record, fallback?: GaugeDisplay): GaugeDisplay; export interface ClusterSlot { type: string; x: number; y: number; width: number; height: number; size?: number; } export interface ClusterLayoutOptions { callScreen?: boolean; } /** Proportional instrument-cluster layout — all child widgets scale to cluster bounds. */ export declare function resolveClusterLayout(rawW: number, rawH: number, options?: ClusterLayoutOptions): ClusterSlot[];