export interface TreeNode { id: string; label: string; icon?: React.ReactNode; children?: TreeNode[]; } export interface UseTreeViewProps { /** The tree data to manage. */ data: TreeNode[]; /** Node IDs that are expanded by default (uncontrolled). */ defaultExpanded?: string[]; /** * Controlled selected node ID. * When provided, selection state is managed externally. */ selectedNodeId?: string; /** Called when a node is clicked or activated via keyboard. */ onNodeClick?: (node: TreeNode) => void; /** Called when a node becomes the selected item. */ onNodeSelect?: (node: TreeNode) => void; } export interface UseTreeViewReturn { /** Set of currently expanded node IDs. */ expanded: Set; /** The currently selected node ID (controlled or internal). */ effectiveSelectedId: string | undefined; /** * Map of node ID → button element. * Attach via the `setRef` helper returned by `getNodeRef`. */ nodeRefs: React.MutableRefObject>; /** Returns a ref-setter callback for a given node ID. */ getNodeRef: (nodeId: string) => (el: HTMLButtonElement | null) => void; /** Toggle the expanded state of a node. */ toggleExpand: (nodeId: string) => void; /** Select a node (updates internal state if uncontrolled, fires callbacks). */ handleSelect: (node: TreeNode) => void; /** * Full WAI-ARIA keyboard handler. * Attach to `onKeyDown` of each tree-item button. */ handleKeyDown: (e: React.KeyboardEvent, node: TreeNode) => void; /** Returns the ordered list of all currently visible nodes (respects expand state). */ getVisibleNodes: () => TreeNode[]; } /** * Headless hook for hierarchical tree-view logic. * * @description * Manages expand/collapse state, selection (controlled or uncontrolled), * WAI-ARIA keyboard navigation (Arrow keys, Home, End, Enter/Space), * and focus management via node refs. Pair with any custom tree UI. * * @example * ```tsx * const { expanded, effectiveSelectedId, toggleExpand, handleSelect, handleKeyDown, getNodeRef } = * useTreeView({ data, onNodeSelect }); * ``` */ export declare function useTreeView({ data, defaultExpanded, selectedNodeId, onNodeClick, onNodeSelect, }: UseTreeViewProps): UseTreeViewReturn;