import { ComponentPropsWithoutRef, ReactNode } from 'react';
/**
 * Represents an item in the listview with a label and optional disabled state.
 * @template T - The type of additional properties for the item
 */
export type ItemType<T> = T & {
    /** The display label for the item */
    label: string;
    /** Whether the item is disabled and cannot be selected */
    disabled?: boolean;
};
/**
 * Props for the ListView component
 * @template T - The type of additional properties for items
 * @extends LayoutUtilProps
 */
export type ListViewWithItems<T> = Omit<ComponentPropsWithoutRef<"div">, "children"> & {
    /** Array of items to render */
    items: ItemType<T>[];
    /** Default selected items (uncontrolled) */
    defaultSelected?: ItemType<T>[];
    /** Currently selected items (controlled) */
    selected?: ItemType<T>[];
    /** Optional render function for items */
    children?: ({ items }: {
        items: ItemType<T>[];
    }) => ReactNode;
    /** Callback when selection changes */
    onSelectionChange?: (value: ItemType<T>[]) => void;
    /** Currently indeterminate items (controlled) */
    indeterminate?: ItemType<T>[];
};
/**
 * Props for the ListView component without items array
 * @extends ComponentPropsWithoutRef<"div">
 */
export type ListViewWithOutItems = Omit<ComponentPropsWithoutRef<"div">, "children"> & {
    items?: undefined;
    children?: ReactNode;
    /** Default selected items (uncontrolled) */
    defaultSelected?: string[];
    /** Currently selected items (controlled) */
    selected?: string[];
    /** Callback when selection changes */
    onSelectionChange?: (value: string[]) => void;
    /** Currently indeterminate items (controlled) */
    indeterminate?: string[];
};
/**
 * Option object for internal focus and selection management
 */
export type Option = {
    /** The DOM node for the option */
    node: Element;
    /** Focusable elements within the option */
    focusables: NodeListOf<Element>;
};
/**
 * Represents the focused item in the listview
 */
export type FocusedItem = {
    /** Row index of the focused item */
    row: number;
    /** Column index of the focused item */
    col: number;
};
