import { ReactNode } from 'react'; export interface TaxonomyNode { id: string; displayName: string; selectable: boolean; hasChildren: boolean; level: number; ancestors?: TaxonomyAncestor[]; } export interface TaxonomySearchResult { id: string; displayName: string; selectable: boolean; hasChildren: boolean; level: number; ancestors: TaxonomyAncestor[]; } /** When `ancestors` is set, the level stack is rebuilt from it; otherwise the target is appended. */ export interface DrillDownTarget { id: string; displayName: string; ancestors?: TaxonomyAncestor[]; } export interface TaxonomyAncestor { id: string; displayName: string; level: number; } export interface TaxonomyValue { id: string; displayName: string; level: number; ancestors?: TaxonomyAncestor[]; } export interface TaxonomyLevel { level: number; displayName: string; selectable?: boolean; } export interface BreadcrumbEntry { id: string; displayName: string; } export interface FetchParams { limit: number; marker?: string; signal?: AbortSignal; } export interface FetchResponse { entries: T[]; next_marker?: string; } export interface SearchParams extends FetchParams { parentId?: string | null; levelFilter?: number; } export interface TaxonomyItemsService { getNodes(parentId: string | null, params: FetchParams): Promise>; searchNodes(query: string, params: SearchParams): Promise>; } export interface TaxonomyPickerEventService { onNavigate?: (parentId: string | null, path: BreadcrumbEntry[]) => void; onSearch?: (query: string) => void; onOpenChange?: (isOpen: boolean) => void; } export declare enum TaxonomyPickerMode { SingleLevel = "single-level", MultiLevel = "multi-level" } export interface MetadataTaxonomyPickerProps { mode: TaxonomyPickerMode; multiSelect: boolean; value: TaxonomyValue[]; onValueChange: (values: TaxonomyValue[]) => void; itemsService: TaxonomyItemsService; eventService?: TaxonomyPickerEventService; /** * Taxonomy levels for the level-filter dropdown and search auto-scope. * Pass `[]` (or omit) to hide the filter and skip auto-scoping. */ levels?: TaxonomyLevel[]; placeholder?: string; disabled?: boolean; /** * Visible field label rendered above the trigger and associated with the * combobox input via `htmlFor` for accessibility. When omitted, no label * element is rendered — the caller is then responsible for providing an * accessible name via `aria-label` / `aria-labelledby` on the picker. * * Accepts a `ReactNode` so callers can compose decorated labels (badges, * tooltips, etc.). The picker owns the wrapping `