import type { CustomLayout } from "../stream/customLayout";
import type { Datum } from "../charts/shared/datumTypes";
export interface WaffleConfig {
    /** Number of rows in the grid. @default 10 */
    rows?: number;
    /** Number of columns in the grid. @default 10 */
    columns?: number;
    /** Pixel gap between cells. @default 2 */
    gutter?: number;
    /** Field name (or function) yielding the category for each datum. */
    categoryAccessor?: string | ((d: Datum) => string);
    /** Field name (or function) yielding the cell count per datum. If omitted, each datum counts as 1. */
    valueAccessor?: string | ((d: Datum) => number);
    /**
     * Optional ordering hint. Categories listed here render first, in the
     * order given (duplicates removed). Categories present in the data but
     * not in this list follow in insertion order. Categories listed here
     * but absent from the data are silently skipped.
     */
    categoryOrder?: string[];
}
/**
 * Waffle chart — a grid of cells where each cell represents one share of the
 * total. Categories are filled in row-major order, scaled so the count of
 * cells per category is proportional to its value (rounded to nearest cell).
 *
 * Layouts that don't drive scales (waffle, calendar) ignore them — the grid
 * is sized to the plot rect directly.
 *
 * @example
 * ```tsx
 * import { XYCustomChart } from "semiotic/xy"
 * import { waffleLayout } from "semiotic/recipes"
 *
 * <XYCustomChart
 *   data={[
 *     { region: "AMER", value: 42 },
 *     { region: "EMEA", value: 33 },
 *     { region: "APAC", value: 25 },
 *   ]}
 *   layout={waffleLayout}
 *   layoutConfig={{ rows: 10, columns: 10, categoryAccessor: "region", valueAccessor: "value" }}
 * />
 * ```
 */
export declare const waffleLayout: CustomLayout<WaffleConfig>;
