import type { OrdinalCustomLayout } from "../stream/ordinalCustomLayout";
import type { Datum } from "../charts/shared/datumTypes";
export interface BulletConfig {
    /** Field (or function) yielding the row label per datum. Each row is one bullet. */
    categoryAccessor: string | ((d: Datum) => string);
    /** Field (or function) yielding the actual measured value (the dark bar). */
    valueAccessor: string | ((d: Datum) => number);
    /** Field (or function) yielding the target marker value (the perpendicular tick). */
    targetAccessor: string | ((d: Datum) => number);
    /**
     * Field (or function) yielding the qualitative range thresholds — an
     * ascending array of cutoffs ([poor, satisfactory, good]) per datum.
     * The ranges paint as background bars in successively darker shades.
     */
    rangesAccessor: string | ((d: Datum) => number[]);
    /** Pixel height of each row's bullet. @default 28 */
    rowHeight?: number;
    /** Pixel gap between rows. @default 12 */
    rowGap?: number;
    /** Color for the actual-value bar. Defaults to theme primary. */
    actualColor?: string;
    /** Color for the target tick. Defaults to theme text. */
    targetColor?: string;
    /**
     * Render the metric name to the left of each row. Reserves
     * `labelWidth` from the bullet area. @default true
     */
    showLabels?: boolean;
    /**
     * Pixel width reserved on the left for row labels. Only used when
     * `showLabels` is true. @default 120
     */
    labelWidth?: number;
    /**
     * Render value-axis tick marks below each bullet (since each row is
     * independently scaled, ticks are per-row). @default true
     */
    showTicks?: boolean;
    /**
     * Format function for the per-row tick labels rendered below each
     * bullet. @default v => v.toLocaleString()
     */
    tickFormat?: (v: number) => string;
}
/**
 * Bullet chart (Stephen Few, 2005) — a compact replacement for KPI gauges.
 * Each row stacks three layers along the value axis:
 *
 *   1. Three background bars in successively darker shades (poor →
 *      satisfactory → good zones) sized by `rangesAccessor` values.
 *   2. The actual measured value as a thinner dark bar.
 *   3. A perpendicular tick at the target.
 *
 * Reads from low to high left-to-right. Far better than a half-circle
 * gauge for dashboards — same information, ~5× the data density, no
 * pie-shaped overhead.
 *
 * All inputs (`actual`, `target`, range thresholds) are treated as
 * non-negative — values < 0 or non-finite are clamped to 0. Range
 * thresholds are also sorted ascending so band order is always
 * deterministic regardless of input order.
 *
 * @example
 * ```tsx
 * import { OrdinalCustomChart } from "semiotic/ordinal"
 * import { bulletLayout } from "semiotic/recipes"
 *
 * <OrdinalCustomChart
 *   data={[
 *     { metric: "Revenue",   actual: 270, target: 250, ranges: [150, 225, 300] },
 *     { metric: "Profit",    actual:  23, target:  27, ranges: [ 20,  25,  30] },
 *     { metric: "Order Size", actual: 102, target: 120, ranges: [ 80, 110, 140] },
 *   ]}
 *   layout={bulletLayout}
 *   layoutConfig={{
 *     categoryAccessor: "metric",
 *     valueAccessor: "actual",
 *     targetAccessor: "target",
 *     rangesAccessor: "ranges",
 *   }}
 *   width={500}
 *   height={180}
 * />
 * ```
 */
export declare const bulletLayout: OrdinalCustomLayout<BulletConfig>;
