import { type CompositionBudget, type CompositionDensityBudget, type CompositionTransitionMixBudget, type DecorativeCompositionIntent, type DesignBlockId, type DesignIssueSeverity, type DesignRepairAction, type DesignResolutionPolicy, type MediaCompositionIntent, type ResolvedPageDesignPlan } from './types';
export type BlockCompositionContext<TBlockId extends string = DesignBlockId> = Readonly<{
    blockId: TBlockId;
    primaryCtaCount?: number;
    mediaIntent?: MediaCompositionIntent;
    decorativeIntent?: DecorativeCompositionIntent;
}>;
export type RatioCompositionBudgetKind = 'accent-density-exceeded' | 'panel-density-exceeded' | 'transition-mix-exceeded' | 'media-density-exceeded' | 'decorative-repetition-exceeded';
type CompositionBudgetIssueMetadata = Readonly<{
    policy: DesignResolutionPolicy;
    severity: DesignIssueSeverity;
    allowedRepairActions: readonly DesignRepairAction[];
}>;
export type RatioCompositionBudgetIssue<TKind extends RatioCompositionBudgetKind, TBlockId extends string, TBudget extends string> = Readonly<{
    kind: TKind;
    budget: TBudget;
    actualRatio: number;
    allowedRatio: number;
    blockIds: readonly TBlockId[];
}> & CompositionBudgetIssueMetadata;
export type PrimaryCtaLimitExceededIssue<TBlockId extends string = DesignBlockId> = Readonly<{
    kind: 'primary-cta-limit-exceeded';
    actualCount: number;
    allowedCount: number;
    blockIds: readonly TBlockId[];
}> & CompositionBudgetIssueMetadata;
export type UnknownCompositionContextBlockIssue<TBlockId extends string = DesignBlockId> = Readonly<{
    kind: 'unknown-composition-context-block';
    blockIds: readonly TBlockId[];
}> & CompositionBudgetIssueMetadata;
export type CompositionBudgetIssue<TBlockId extends string = DesignBlockId> = RatioCompositionBudgetIssue<'accent-density-exceeded', TBlockId, CompositionDensityBudget> | RatioCompositionBudgetIssue<'panel-density-exceeded', TBlockId, CompositionDensityBudget> | RatioCompositionBudgetIssue<'transition-mix-exceeded', TBlockId, CompositionTransitionMixBudget> | PrimaryCtaLimitExceededIssue<TBlockId> | RatioCompositionBudgetIssue<'media-density-exceeded', TBlockId, CompositionDensityBudget> | RatioCompositionBudgetIssue<'decorative-repetition-exceeded', TBlockId, CompositionDensityBudget> | UnknownCompositionContextBlockIssue<TBlockId>;
export type CompositionBudgetValidationInput<TBlockId extends string = DesignBlockId, TPurpose extends string = string> = Readonly<{
    policy: DesignResolutionPolicy;
    budget: CompositionBudget;
    resolved: ResolvedPageDesignPlan<TBlockId, TPurpose>;
    blockContexts?: readonly BlockCompositionContext<TBlockId>[];
}>;
export declare function validateCompositionBudget<TBlockId extends string, TPurpose extends string>(input: CompositionBudgetValidationInput<TBlockId, TPurpose>): readonly CompositionBudgetIssue<TBlockId>[];
export {};
