import { ObservableValue } from '@furystack/utils';
import type { ListServiceOptions } from './list-service.js';
import { ListService } from './list-service.js';
export type TreeServiceOptions<T> = ListServiceOptions<T> & {
    /**
     * Returns the children of a given node
     * @param item The parent node
     * @returns The child nodes, or an empty array if the node has no children
     */
    getChildren: (item: T) => T[];
};
export type FlattenedTreeNode<T> = {
    item: T;
    level: number;
    hasChildren: boolean;
    isExpanded: boolean;
};
/**
 * Service for managing tree state including expand/collapse, hierarchy navigation,
 * and flattening the tree into a visible items list for rendering
 */
export declare class TreeService<T> extends ListService<T> {
    private treeOptions;
    expandedNodes: ObservableValue<Set<T>>;
    rootItems: ObservableValue<T[]>;
    flattenedNodes: ObservableValue<FlattenedTreeNode<T>[]>;
    [Symbol.dispose](): void;
    /**
     * Checks whether a node is currently expanded
     */
    isExpanded: (item: T) => boolean;
    /**
     * Expands a node, making its children visible
     */
    expand: (item: T) => void;
    /**
     * Collapses a node, hiding its children
     */
    collapse: (item: T) => void;
    /**
     * Toggles the expanded state of a node
     */
    toggleExpanded: (item: T) => void;
    /**
     * Finds the parent of a given item in the tree
     */
    getParent(item: T): T | undefined;
    /**
     * Flattens the tree based on which nodes are expanded, and syncs the result
     * to both flattenedNodes and the inherited ListService items
     */
    updateFlattenedNodes(): void;
    /**
     * Gets the FlattenedTreeNode for a given item
     */
    getNodeInfo(item: T): FlattenedTreeNode<T> | undefined;
    handleKeyDown(ev: KeyboardEvent): void;
    handleItemDoubleClick(item: T): void;
    constructor(treeOptions: TreeServiceOptions<T>);
}
//# sourceMappingURL=tree-service.d.ts.map