export declare const getNextSelectionAfterToggle: (selectedValues: string[], value: string) => string[]; export declare const getNextSelectionForScope: (selectedValues: string[], scopedValues: string[], selectAll: boolean) => string[]; /** * True when picking `value` would exceed `maxSelections`. Deselecting an * already-selected value is never blocked. * * Both the row-level disable check and the toggle handler must consult this: * disabling alone leaves the cap unenforced for programmatic and synthetic * gestures, which is how the desktop and mobile dropdowns came to disagree * (desktop disables without guarding, mobile guards without sharing the rule). */ export declare const isBlockedByMaxSelections: (selectedValues: string[], value: string, maxSelections?: number) => boolean; /** * Narrows a Select All scope to what `maxSelections` still allows. Deselecting * is never capped, so callers only apply this on the select branch. */ export declare const clampScopeToMaxSelections: (selectedValues: string[], scopedValues: string[], maxSelections?: number) => string[]; /** * Emits the legacy per-item callbacks for a bulk gesture. Takes the already * resolved scope so the legacy calls and the aggregate snapshot can never * disagree about which values the gesture covers. */ export declare const emitLegacyScopeChanges: (selectAll: boolean, scopedValues: string[], selectedValues: string[], onChange?: (value: string) => void) => void;