import { DerivedFieldState, FieldDescriptor, FieldOption, Registry, ValidationError } from './types.js'; /** Text with nothing visible in it: what `required` treats as empty. */ export declare function isBlank(text: string): boolean; /** Star count of a rating field: `max` when it is a whole number 1–10, else 5. */ export declare function ratingMax(field: FieldDescriptor): number; /** A range field's slider bounds: numeric `min`/`max`/`step` or 0 / 100 / 1. */ export declare function rangeBounds(field: FieldDescriptor): { min: number; max: number; step: number; }; /** * Canonical tags value (spec 01 §4 — tags): trimmed, non-empty strings, * de-duplicated case-insensitively (first spelling wins), in entry order. * With `options`, a tag matching an option key case-insensitively takes the * option's key spelling, so case-sensitive rules (`contains "urgent"`) match. * Non-array input (or non-string entries) never reaches canonical data — * they're dropped rather than thrown, same as a stray non-string slipping * into a `multiselect` array would be filtered by option-key matching. * Exported: bank20baht-validator applies the identical normalisation to the * canonical `data` it persists, so client and server agree byte-for-byte. */ export declare function normalizeTagsValue(value: unknown, options?: readonly Pick[]): string[]; /** lower-cased option key -> the option's own key (first one wins). */ export declare function optionKeyLookup(options: readonly Pick[] | undefined): Map; /** * `rowStates` (repeaters only) are the rule-derived states of the row sub-fields, * keyed `key[i].sub` (spec 02 §2a): a hidden one is skipped, a `required` * override replaces the descriptor's. */ export declare function validateField(field: FieldDescriptor, value: unknown, registry?: Registry, data?: Record, rowStates?: Record): ValidationError[];