/**
 * Resolve a composition's variables — produce a deep-cloned composition
 * with every `${id}` token in string fields replaced by its concrete
 * value.
 *
 * Order of precedence (later wins):
 *   1. Declared `default`
 *   2. Composition-level overrides (currently none; reserved for future)
 *   3. Caller-supplied overrides (the `--variables` CLI flag, or a per-
 *      instance `data-variable-values` map)
 *
 * Non-string fields are passed through unchanged. Numeric/boolean variable
 * values stringify at substitution sites — this lets you write
 * `style.color: "${themeColor}"` (the variable's hex value lands there) or
 * `text: "Q4 ${year}"` (number stringifies).
 *
 * The function NEVER mutates the input composition; it returns a fresh
 * object that's safe to pass to the renderer.
 */
import type { Composition } from "../../shared/composition.js";
import type { VariableValues, VariableIssue } from "./types.js";
export interface ResolveOptions {
    /** Caller-supplied overrides (e.g. CLI `--variables '{}'`). */
    overrides?: VariableValues;
    /** If true, throw on validation errors or interpolation misses. */
    strict?: boolean;
}
export interface ResolveResult {
    /** Deep-cloned composition with interpolations applied. */
    composition: Composition;
    /** Merged values map (declared defaults + overrides). */
    resolvedValues: VariableValues;
    /** Validation issues from declarations + overrides. Empty when clean. */
    issues: VariableIssue[];
}
export declare class VariableResolutionError extends Error {
    readonly issues: VariableIssue[];
    constructor(issues: VariableIssue[], msg?: string);
}
export declare function resolve(composition: Composition, opts?: ResolveOptions): ResolveResult;
//# sourceMappingURL=resolve.d.ts.map