/** Schema-driven filter builder types & helpers. */ export type FilterControlType = 'checkbox' | 'radio' | 'range' | 'toggle' | 'rating' | 'select'; export interface FilterOption { id: string; label: string; count?: number; disabled?: boolean; } export interface FilterFieldSchema { id: string; label: string; type: FilterControlType; /** Optional section / category heading for grouping fields */ category?: string; options?: FilterOption[]; /** range */ min?: number; max?: number; step?: number; unit?: string; /** checkbox default true; ignored for radio */ multiple?: boolean; /** show-more limit for option lists */ limit?: number; /** rating max stars */ maxRating?: number; } export type FilterValue = string | string[] | number | boolean | [number, number] | undefined; /** Single bag of values keyed by field id — one bind for everything. */ export type FilterValues = Record; export interface FilterCategoryGroup { category: string | null; fields: FilterFieldSchema[]; } export declare function emptyFilterValues(schema?: FilterFieldSchema[]): FilterValues; export declare function groupFilterSchema(schema: FilterFieldSchema[]): FilterCategoryGroup[]; export declare function isFilterValueActive(field: FilterFieldSchema, value: FilterValue): boolean; export declare function countActiveFilters(schema: FilterFieldSchema[], values: FilterValues): number; export declare function clearFilterValues(schema: FilterFieldSchema[], values?: FilterValues): FilterValues; /** Build schema from a plain JSON-like config (runtime-safe-ish). */ export declare function parseFilterSchema(input: unknown): FilterFieldSchema[]; /** Serialize filter values → compact query params (`v.brand=a,b`, `v.price=10~99`). */ export declare function serializeFilterValues(values: FilterValues): URLSearchParams; export declare function parseFilterValues(search: string | URLSearchParams, schema?: FilterFieldSchema[]): FilterValues;