import type { Datum } from "./datumTypes";
import type { Accessor } from "./types";
export interface EncodingDomainOptions<TDatum extends Datum = Datum> {
    /** Encoding accessor (string field name or function). */
    accessor: Accessor<number> | undefined;
    /** Bounded chart data. Ignored when `isPushMode` is true. */
    data: TDatum[];
    /** When true, the hook tracks pushed values via the returned
     *  `trackPushed` helper instead of reading `data`. */
    isPushMode: boolean;
}
export interface EncodingDomainResult<TDatum extends Datum = Datum> {
    /** `[min, max]` tuple over seen values. Undefined when no data has
     *  been seen yet (push mode initial state, or bounded mode with
     *  empty data + no accessor). */
    domain: [number, number] | undefined;
    /** Walk `items` and update the running domain. Bumps the version
     *  counter when any min/max actually moves. No-op in bounded mode
     *  — the hook reads from `data` directly there. */
    trackPushed: (items: TDatum[]) => void;
    /** Reset the running domain to empty. Paired with the HOC's
     *  `clear()` override. No-op in bounded mode. */
    reset: () => void;
}
/**
 * Track a numeric encoding's `[min, max]` domain across bounded and
 * push data sources.
 *
 * @example
 * ```tsx
 * // BubbleChart-style usage:
 * const { domain: sizeDomain, trackPushed, reset } = useEncodingDomain({
 *   accessor: sizeBy,
 *   data: safeData,
 *   isPushMode: data === undefined,
 * })
 *
 * useFrameImperativeHandle(ref, {
 *   variant: "xy", frameRef,
 *   overrides: {
 *     push: (d) => { trackPushed([d]); frameRef.current?.push(d) },
 *     pushMany: (ds) => { trackPushed(ds); frameRef.current?.pushMany(ds) },
 *     clear: () => { reset(); frameRef.current?.clear() },
 *   },
 * })
 * ```
 */
export declare function useEncodingDomain<TDatum extends Datum = Datum>(options: EncodingDomainOptions<TDatum>): EncodingDomainResult<TDatum>;
