import { CategoryCombinationOperator, ZeniDate, ZeniUrl } from '@zeniai/client-epic-state';
type DropdownOptionTypeBase = {
    [key: string]: any;
};
export type ValuesDropdownOption = DropdownOptionTypeBase & {
    label: string;
    value: string | number | ZeniDate;
    email?: string;
    iconColor?: string;
    iconType?: string;
    photo?: ZeniUrl;
};
/**
 * How a category's selected values combine when matching:
 *   - `"ANY"` — match a row if any value in `values[]` matches (OR semantics).
 *   - `"ALL"` — match a row only if every value in `values[]` matches (AND).
 *
 * Exposed as a named type so callsites that store or narrow this field
 * (e.g. TC's `TransactionFilterCategory`, which pins it to literal `"ANY"`)
 * reference one source of truth rather than redeclaring the union.
 */
export type ValuesCombinationOperator = "ANY" | "ALL";
export type GenericFilterCategory<TField extends string = string> = {
    values: Array<string | number | ZeniDate>;
    field?: TField;
    matchingOperator?: string;
    valuesCombinationOperator?: ValuesCombinationOperator;
};
export type GenericFiltersType<TField extends string = string> = {
    categories: GenericFilterCategory<TField>[];
    categoryCombinationOperator: CategoryCombinationOperator;
};
/**
 * Type shape for `NEW_CATEGORY_BODY` below. Carries three deliberate
 * narrowing choices:
 *
 *   - `valuesCombinationOperator: "ANY"` — the literal type, not the wider
 *     `ValuesCombinationOperator` union, because TC's
 *     `TransactionFilterCategory` narrows the field further to exactly
 *     `"ANY"`. Without the literal here, the `...NEW_CATEGORY_BODY` spread
 *     would produce `string` and fail the downstream assignment.
 *   - `values: never[]` — narrowest possible array type, so the spread is
 *     assignable to any concrete `values` (e.g. TC's `(string | number)[]`,
 *     SM's `Array<string | number | ZeniDate>`).
 *   - `matchingOperator: string` — widely usable placeholder; every caller
 *     overrides this field after the spread.
 *
 * Using an explicit type annotation rather than `as const` keeps the
 * narrowing without scattering `as const` through callsites.
 */
type NewCategoryBody = {
    matchingOperator: string;
    values: never[];
    valuesCombinationOperator: "ANY";
};
export declare const NEW_CATEGORY_BODY: NewCategoryBody;
export type GenericFilterCategoryDropdownOption<TField extends string = string> = {
    value: TField;
    multiple?: boolean;
    type?: string;
};
export {};
