import type { ParamSchema } from "../scene/sceneKinds.js"; import type { HudAnchor, HudPlacement, HudSize } from "./hudLayout.js"; /** * Which axes a panel type may grow when resized in canvas mode. Resize is semantic — * content reflows (longer track, more rows) — never a CSS scale of the whole panel. */ export type HudResizeAxes = "none" | "x" | "y" | "both"; /** Authored layout for one HUD panel inside `editor.scene.json` → `ui.panels`. */ export interface EditorUiPanelLayout { anchor: HudAnchor; dx: number; dy: number; width?: number; height?: number; visible?: boolean; /** Panel type id registered via {@link registerHudPanelType}; drives resize + schema. */ type?: string; } /** Scene-document HUD section: panel id → layout. Single source of truth for placement. */ export interface EditorUiDocument { panels: Record; } /** TSX-declared fallback when the document has no entry for a panel. */ export interface HudPanelFallback { anchor: HudAnchor; inset?: { x: number; y: number; }; width?: number; height?: number; visible?: boolean; type?: string; } /** Fully resolved panel layout after document + fallback merge. */ export interface ResolvedHudPanelLayout { placement: HudPlacement; width?: number; height?: number; visible: boolean; type?: string; /** True when the document owned at least one field (not pure TSX fallback). */ fromDocument: boolean; } /** Declared panel type: growable axes, size limits, optional ParamSchema for the editor. */ export interface HudPanelTypeDef { id: string; label: string; resize: HudResizeAxes; minWidth?: number; maxWidth?: number; minHeight?: number; maxHeight?: number; defaultWidth?: number; defaultHeight?: number; schema?: ParamSchema; } /** Register a HUD panel type so the editor can list/add/configure it and canvas resize knows axes. */ export declare function registerHudPanelType(def: HudPanelTypeDef): void; /** @internal Look up a registered panel type by id. */ export declare function getHudPanelType(id: string): HudPanelTypeDef | undefined; /** Every registered panel type, sorted by id — editor palette / agent listing. */ export declare function listHudPanelTypes(): HudPanelTypeDef[]; /** @internal Test seam — clear the registry between tests. */ export declare function clearHudPanelTypes(): void; /** @internal Convert a document panel layout into a runtime placement. */ export declare function placementFromUiPanel(panel: EditorUiPanelLayout): HudPlacement; /** @internal Build a document panel layout from a runtime placement plus optional size/visibility. */ export declare function uiPanelFromPlacement(placement: HudPlacement, options?: { width?: number; height?: number; visible?: boolean; type?: string; }): EditorUiPanelLayout; /** * Resolve a panel's layout: document entry wins field-by-field over TSX fallback. * TSX props are fallback-only — the scene document is the source of truth once authored. */ export declare function resolveHudPanelLayout(docPanel: EditorUiPanelLayout | undefined, fallback: HudPanelFallback): ResolvedHudPanelLayout; /** @internal Read a panel layout from a document ui section, or undefined when absent. */ export declare function findUiPanel(ui: EditorUiDocument | undefined, id: string): EditorUiPanelLayout | undefined; /** @internal Immutable patch of one panel into a ui section (creates the section when missing). */ export declare function patchUiPanel(ui: EditorUiDocument | undefined, id: string, patch: Partial): EditorUiDocument; /** @internal Remove a panel entry from the ui section; returns undefined when the section empties. */ export declare function removeUiPanel(ui: EditorUiDocument | undefined, id: string): EditorUiDocument | undefined; /** * Semantic resize: apply pixel deltas only on growable axes, clamped to min/max. * Never scales content — callers reflow layout size (track length, list rows). */ export declare function resizePanelSize(current: HudSize, delta: { dw: number; dh: number; }, axes: HudResizeAxes, limits?: { minWidth?: number; maxWidth?: number; minHeight?: number; maxHeight?: number; }): HudSize; /** @internal Resolve resize axes + limits for a panel type id (defaults to none when unregistered). */ export declare function resolvePanelResize(typeId: string | undefined): { axes: HudResizeAxes; minWidth?: number; maxWidth?: number; minHeight?: number; maxHeight?: number; }; /** @internal Decode a single panel layout from untrusted JSON; null when invalid. */ export declare function decodeUiPanelLayout(raw: unknown): EditorUiPanelLayout | null; /** @internal Decode a ui section from untrusted JSON; undefined when absent, empty object when empty panels. */ export declare function decodeEditorUiDocument(raw: unknown): EditorUiDocument | undefined; /** @internal Deep-clone a ui section for document history snapshots. */ export declare function cloneEditorUiDocument(ui: EditorUiDocument | undefined): EditorUiDocument | undefined; /** @internal Convert a layout store-style placement map into a document ui section. */ export declare function uiDocumentFromPlacements(panels: Record): EditorUiDocument;