export interface MultiselectItem<T = string> {
    value: T;
    label: string;
    /** Optional 1-line description below the label. */
    description?: string;
    /** Optional grouping — items with the same group are rendered under a header. */
    group?: string;
    /** Default-selected state. */
    preselected?: boolean;
    /** When true, item is rendered dim and cannot be toggled (used for hard policy constraints). */
    disabled?: boolean;
    /** Reason text shown next to disabled items. */
    disabledReason?: string;
}
export interface MultiselectOptions<T = string> {
    title: string;
    items: MultiselectItem<T>[];
    /** Group display order — items not matching a listed group go to the end. */
    groupOrder?: string[];
    /** Group labels — `{groupKey: "display label"}`. */
    groupLabels?: Record<string, string>;
    /** Minimum number of selections required (default: 0). */
    minSelections?: number;
    /** Maximum number of selections allowed (default: items.length). */
    maxSelections?: number;
}
/**
 * Renders the multi-select, awaits user, returns the chosen values.
 * Returns `null` if the user cancels (ESC / Ctrl-C).
 */
export declare function multiselect<T = string>(opts: MultiselectOptions<T>): Promise<T[] | null>;
