export type DevtoolsControlKind = "slider" | "toggle" | "color" | "select" | "text" | "vec2" | "vec3" | "vec4" | "interval" | "angle" | "enum"; export type AngleUnit = "rad" | "deg"; export type TunableVec2 = [number, number]; export type TunableVec3 = [number, number, number]; export type TunableVec4 = [number, number, number, number]; export type TunableInterval = { min: number; max: number; }; export interface TunableChoice { readonly value: T; readonly label?: string; } export interface TunableOptions { min?: number; max?: number; step?: number; options?: readonly T[]; choices?: readonly TunableChoice[]; label?: string; group?: string; onChange?: (value: T) => void; kind?: DevtoolsControlKind; unit?: AngleUnit; displayUnit?: AngleUnit; wrap?: boolean; integer?: boolean; axisLabels?: readonly string[]; axisMin?: number | readonly number[]; axisMax?: number | readonly number[]; axisStep?: number | readonly number[]; alpha?: boolean; } export interface DiscoverySkip { readonly path: string; readonly reason: string; } export interface ScanFieldMeta extends TunableOptions { kind?: DevtoolsControlKind; } export type ScanMeta = Readonly>; export declare const OVERRIDES_FORMAT_VERSION = 1; export declare const CONTROL_SCHEMA_VERSION = 1; export declare const MAX_TABLE_ENTRIES = 64; export declare const MAX_SCAN_DEPTH = 5; export declare const MAX_SCAN_TARGETS = 512; export interface NormalizedColor { readonly hex: string; readonly rgb: string; readonly alpha: number; readonly hasAlpha: boolean; } export interface ResolvedAxisBounds { readonly labels: readonly string[]; readonly min: readonly number[]; readonly max: readonly number[]; readonly step: readonly number[]; } /** @internal */ export declare function isFiniteNumber(value: unknown): value is number; /** @internal */ export declare function escapePathSegment(segment: string): string; /** @internal */ export declare function unescapePathSegment(segment: string): string; /** @internal */ export declare function joinTunablePath(parent: string, segment: string): string; /** @internal */ export declare function splitTunablePath(path: string): string[]; /** @internal */ export declare function parseColor(input: unknown): NormalizedColor | null; /** @internal */ export declare function formatColor(rgb: string, alpha: number, withAlpha: boolean): string | null; /** @internal */ export declare function normalizeColorValue(input: unknown, forceAlpha?: boolean): string | null; /** @internal */ export declare function isColorString(value: unknown): value is string; /** @internal */ export declare function vecLength(kind: "vec2" | "vec3" | "vec4"): number; /** @internal */ export declare function isNumericTuple(value: unknown, length: number): value is number[]; /** @internal */ export declare function isIntervalShape(value: unknown): value is TunableInterval; /** @internal */ export declare function expandAxisMeta(length: number, labels: readonly string[] | undefined, min: number | readonly number[] | undefined, max: number | readonly number[] | undefined, step: number | readonly number[] | undefined, sample: readonly number[]): ResolvedAxisBounds; /** @internal */ export declare function clampAxisValue(value: number, min: number, max: number): number; /** @internal */ export declare function parseVec(kind: "vec2" | "vec3" | "vec4", raw: unknown, bounds: ResolvedAxisBounds): number[] | null; /** @internal */ export declare function parseInterval(raw: unknown, options: { min?: number; max?: number; step?: number; integer?: boolean; }): TunableInterval | null; /** @internal */ export declare function convertAngle(value: number, from: AngleUnit, to: AngleUnit): number; /** @internal */ export declare function normalizeAngle(value: number, unit: AngleUnit, options: { min?: number; max?: number; wrap?: boolean; }): number; /** @internal */ export declare function resolveChoices(options: readonly T[] | undefined, choices: readonly TunableChoice[] | undefined): readonly TunableChoice[] | undefined; /** @internal */ export declare function choiceValues(choices: readonly TunableChoice[] | undefined): readonly unknown[] | undefined; /** @internal */ export declare function findChoice(choices: readonly TunableChoice[] | undefined, raw: unknown): TunableChoice | undefined; /** @internal */ export declare function parseEnumValue(raw: unknown, choices: readonly TunableChoice[] | undefined): unknown | null; /** @internal */ export declare function coerceSelectWrite(raw: unknown, choices: readonly TunableChoice[] | undefined, options: readonly unknown[] | undefined): unknown | null; /** @internal */ export declare function inferKind(initial: unknown, options?: TunableOptions): DevtoolsControlKind; /** @internal */ export declare function discoverableKind(value: unknown, meta?: ScanFieldMeta): DevtoolsControlKind | null; /** @internal */ export declare function isScannableContainer(value: unknown): value is Record; /** @internal */ export declare function ownWritableDataKeys(target: Record): string[]; /** @internal */ export declare function sliderBounds(initial: number, options: { min?: number; max?: number; step?: number; } | undefined): { min: number; max: number; step: number; }; /** @internal */ export declare function validateControlValue(kind: DevtoolsControlKind, raw: unknown, context: { min?: number; max?: number; step?: number; integer?: boolean; unit?: AngleUnit; wrap?: boolean; choices?: readonly TunableChoice[]; options?: readonly unknown[]; axisBounds?: ResolvedAxisBounds; alpha?: boolean; }): { ok: true; value: unknown; } | { ok: false; reason: string; }; export interface DevtoolsOverrides { version: number; enabled: string[]; values: Record; schemas?: Record; } export interface OverrideApplyDiagnostic { readonly id: string; readonly reason: string; } export interface OverrideParseResult { readonly overrides: DevtoolsOverrides | null; readonly diagnostics: readonly string[]; } /** @internal */ export declare function parseOverridesPayload(raw: unknown): OverrideParseResult; /** @internal */ export declare function cloneValue(value: T): T;