/**
 * Repeater field helpers — the single source of truth for "structured array"
 * fields shared by the admin inspector (rendering) and the validator
 * (publish-time checks), so both treat the generic `repeater` type and the
 * `stats` / `gallery` shorthands identically.
 *
 * Isomorphic (no DOM/React/Node APIs) — it runs in the browser editor, the
 * REST API, and the MCP server.
 */
import type { SectionFieldDef } from './types.js';
/** Sub-field schema for the legacy `stats` shorthand ({value,label,description}). */
export declare const STATS_ROW_FIELDS: SectionFieldDef[];
/** Sub-field schema for the legacy `gallery` shorthand ({url,alt,caption}). */
export declare const GALLERY_ROW_FIELDS: SectionFieldDef[];
/** A repeater field resolved to its row model. */
export interface ResolvedRepeater {
    /** singular noun for one row (e.g. "Stat", "Image", "Plan") */
    rowLabel: string;
    /** ordered sub-field schema for each row */
    fields: SectionFieldDef[];
    minRows?: number;
    maxRows?: number;
}
/**
 * Resolve a field into its repeater configuration, or `null` when it isn't a
 * repeater-like field. Handles the generic `repeater` type plus the `stats`
 * and `gallery` shorthands (kept as presets over the same row model) so the
 * inspector and validator share ONE path.
 */
export declare function resolveRepeaterField(field: SectionFieldDef): ResolvedRepeater | null;
/** True when a field renders/validates as a repeatable group of rows. */
export declare function isRepeaterField(field: SectionFieldDef): boolean;
/** One repeater row: an object keyed by the repeater's sub-field keys. */
export type RepeaterRow = Record<string, unknown>;
/** Build a blank row seeded with empty values for each sub-field. */
export declare function blankRepeaterRow(fields: SectionFieldDef[]): RepeaterRow;
//# sourceMappingURL=fields.d.ts.map