import type { ChangeSignal } from "../store/changeSignal.js"; import { type AngleUnit, type DevtoolsControlKind, type ResolvedAxisBounds, type TunableChoice, type TunableOptions } from "./tunableSchema.js"; import type { Devtools, Tunable } from "./types.js"; /** Internal mutable record backing a registered control: schema metadata, current value, and change listeners. */ export interface ControlRecord { name: string; kind: DevtoolsControlKind; label: string; group: string; initial: unknown; value: unknown; min?: number; max?: number; step?: number; options?: readonly unknown[]; choices?: readonly TunableChoice[]; unit?: AngleUnit; displayUnit?: AngleUnit; wrap?: boolean; integer?: boolean; axisBounds?: ResolvedAxisBounds; hasAlpha?: boolean; schemaVersion: number; listeners: Set<(value: unknown) => void>; } /** @internal */ export declare function isStructuralKind(kind: DevtoolsControlKind): boolean; /** Controls subsystem: the public controls facade plus internal register/write helpers and the record map. */ export interface ControlsModule { controls: Devtools["controls"]; register: (name: string, initial: T, options?: TunableOptions) => Tunable; writeControl: (record: ControlRecord, raw: unknown) => boolean; controlRecords: Map; } /** Create the controls subsystem that registers, validates, and mutates tunable controls, notifying on change. */ export declare const createControlsModule: (deps: { signal: ChangeSignal; }) => ControlsModule;