import { type Color3Value } from "@skenora/contracts"; import type { ScenePlanDiagnostic } from "../diagnostics/diagnostics.js"; import type { JsonValue } from "../model/json.js"; import type { ScenePatch } from "../model/types.js"; import type { SceneFragmentContext, SceneFragmentIdentityMapping, SceneFragmentInsertionContext, SceneFragmentData } from "./types.js"; export declare const SCENE_FRAGMENT_TEMPLATE_LIMITS: Readonly<{ parameters: 64; variants: 32; overrides: 256; bindingsPerParameter: 16; bindings: 256; }>; export interface SceneFragmentParameter { readonly id: string; readonly entityId: string; readonly property: "position" | "scaling"; readonly axis: "x" | "y" | "z"; readonly min: number; readonly max: number; readonly default: number; } export type SceneFragmentParameterBinding = ({ readonly kind: "transform"; readonly entityId: string; readonly property: "position" | "scaling"; readonly axis: "x" | "y" | "z"; } | { readonly kind: "programNumber"; readonly materialId: string; readonly parameter: string; }) & { readonly multiplier?: number; readonly offset?: number; }; export interface SceneFragmentBoundParameter { readonly id: string; readonly min: number; readonly max: number; readonly default: number; readonly bindings: readonly SceneFragmentParameterBinding[]; } export type SceneFragmentVariantOverride = { readonly kind: "visibility"; readonly entityId: string; readonly visible: boolean; } | { readonly kind: "color"; readonly materialId: string; readonly property: "baseColor" | "emissiveColor"; readonly color: Color3Value; }; export interface SceneFragmentTemplate { readonly schema: "skenora.scene.fragment-template"; readonly version: 1 | 2; readonly fragment: SceneFragmentData; readonly parameters: readonly (SceneFragmentParameter | SceneFragmentBoundParameter)[]; readonly variants: readonly { readonly id: string; readonly overrides: readonly SceneFragmentVariantOverride[]; }[]; } export interface SceneFragmentSelection { readonly parameters?: Readonly>; readonly variant?: string; } type Failure = { readonly ok: false; readonly diagnostics: readonly ScenePlanDiagnostic[]; }; export type SceneFragmentExpansionResult = Failure | { readonly ok: true; readonly fragment: SceneFragmentData; readonly selection: SceneFragmentSelection; readonly diagnostics: readonly ScenePlanDiagnostic[]; }; export interface SceneFragmentChangePreview { readonly kind: "entity" | "material"; readonly sourceId: string; readonly targetId: string; readonly path: readonly string[]; readonly before: JsonValue; readonly after: JsonValue; } /** Data expansion only. The returned fragment uses the existing insertion API. */ export declare function expandSceneFragmentTemplate(input: unknown, selection?: SceneFragmentSelection, context?: SceneFragmentContext): SceneFragmentExpansionResult; /** Explicit, revision-bound updates to an earlier insertion. No live instance store. */ export declare function planSceneFragmentReexpansion(input: unknown, previous: SceneFragmentSelection, next: SceneFragmentSelection, mappings: readonly SceneFragmentIdentityMapping[], context: SceneFragmentInsertionContext): Failure | { readonly ok: true; readonly patch: ScenePatch; readonly preview: readonly SceneFragmentChangePreview[]; readonly diagnostics: readonly ScenePlanDiagnostic[]; }; export {}; //# sourceMappingURL=variants.d.ts.map