/**
 * Tipos base para componentes de entrada (EliEntrada*)
 *
 * Objetivo:
 * - Padronizar o shape de dados de todos os componentes de entrada.
 * - Cada entrada possui sempre:
 *   1) `value`: o valor atual (tipado)
 *   2) `opcoes`: configuração do componente (rótulo, placeholder e extras por tipo)
 *
 * Como usar:
 * - `PadroesEntradas[tipo]` retorna a tipagem completa (value + opcoes) daquele tipo.
 * - `TipoEntrada` é a união com todos os tipos suportados (ex.: "texto" | "numero").
 */
/**
 * Contrato padrão de uma entrada.
 *
 * @typeParam T - tipo do `value` (ex.: string | null | undefined)
 * @typeParam Mais - campos adicionais dentro de `opcoes`, específicos do tipo de entrada
 */
export type tipoPadraoEntrada<T, Mais extends Record<string, unknown> = {}> = {
    /** Valor atual do campo (pode aceitar null/undefined quando aplicável) */
    value: T;
    /** Configurações do componente (visuais + regras simples do tipo) */
    opcoes: {
        /** Rótulo exibido ao usuário */
        rotulo: string;
        /** Texto de ajuda dentro do input quando vazio */
        placeholder?: string;
    } & Mais;
};
/**
 * Mapa de tipos de entrada suportados e suas configurações específicas.
 *
 * Observação importante:
 * - As chaves deste objeto (ex.: "texto", "numero") viram o tipo `TipoEntrada`.
 * - Cada item define:
 *   - `value`: tipo do valor
 *   - `opcoes`: opções comuns + extras específicas
 */
export type PadroesEntradas = {
    texto: tipoPadraoEntrada<string | null | undefined, {
        /** Limite máximo de caracteres permitidos (se definido) */
        limiteCaracteres?: number;
        /**
         * Formato/máscara aplicada ao texto.
         * Obs: o `value` SEMPRE será o texto formatado (o que aparece no input).
         */
        formato?: "texto" | "email" | "url" | "telefone" | "cpfCnpj" | "cep";
    }>;
    numero: tipoPadraoEntrada<number | null | undefined, {
        /** Unidade de medida (ex.: "kg", "m³") */
        sufixo?: string;
        /** Moéda (ex.: "R$") */
        prefixo?: string;
        /**
         * Passo/precisão do valor numérico.
         * - 1    => somente inteiros
         * - 0.1  => 1 casa decimal
         * - 0.01 => 2 casas decimais
         *
         * Dica: este conceito corresponde ao atributo HTML `step`.
         */
        precisao?: number;
    }>;
    dataHora: tipoPadraoEntrada<string | null | undefined, {
        /** Define o tipo de entrada. - `dataHora`: datetime-local - `data`: date */
        modo?: "data" | "dataHora";
        /** Se true, mostra ícone para limpar o valor (Vuetify clearable). */
        limpavel?: boolean;
        /** Estado de erro (visual). */
        erro?: boolean;
        /** Mensagens de erro. */
        mensagensErro?: string | string[];
        /** Texto de apoio. */
        dica?: string;
        /** Mantém a dica sempre visível. */
        dicaPersistente?: boolean;
        /** Valor mínimo permitido (ISO 8601 - offset ou Z). */
        min?: string;
        /** Valor máximo permitido (ISO 8601 - offset ou Z). */
        max?: string;
        /** Densidade do campo (Vuetify). */
        densidade?: import("../../tipos").CampoDensidade;
        /** Variante do v-text-field (Vuetify). */
        variante?: import("../../tipos").CampoVariante;
    }>;
    paragrafo: tipoPadraoEntrada<string | null | undefined, {
        /** Quantidade de linhas visíveis no textarea (Vuetify `rows`). */
        linhas?: number;
        /** Limite máximo de caracteres permitidos (se definido). */
        limiteCaracteres?: number;
        /** Se true, mostra ícone para limpar o valor (Vuetify clearable). */
        limpavel?: boolean;
        /** Estado de erro (visual). */
        erro?: boolean;
        /** Mensagens de erro. */
        mensagensErro?: string | string[];
        /** Texto de apoio. */
        dica?: string;
        /** Mantém a dica sempre visível. */
        dicaPersistente?: boolean;
        /** Densidade do campo (Vuetify). */
        densidade?: import("../../tipos").CampoDensidade;
        /** Variante do v-text-field (Vuetify). */
        variante?: import("../../tipos").CampoVariante;
    }>;
    selecao: tipoPadraoEntrada<string | null | undefined, {
        /**
         * Carrega os itens da seleção (sincrono ou async).
         * - Cada item precisa ter uma chave estável (value) e um rótulo (title).
         */
        itens: () => {
            chave: string;
            rotulo: string;
        }[] | Promise<{
            chave: string;
            rotulo: string;
        }[]>;
        /** Se true, mostra ícone para limpar o valor (Vuetify clearable). */
        limpavel?: boolean;
        /** Estado de erro (visual). */
        erro?: boolean;
        /** Mensagens de erro. */
        mensagensErro?: string | string[];
        /** Texto de apoio. */
        dica?: string;
        /** Mantém a dica sempre visível. */
        dicaPersistente?: boolean;
        /** Densidade do campo (Vuetify). */
        densidade?: import("../../tipos").CampoDensidade;
        /** Variante do v-text-field (Vuetify). */
        variante?: import("../../tipos").CampoVariante;
    }>;
};
/**
 * União dos tipos de entrada suportados.
 * Ex.: "texto" | "numero"
 */
export type TipoEntrada = keyof PadroesEntradas;
export type PadraoComponenteEntrada<T extends TipoEntrada> = readonly [T, PadroesEntradas[T]['opcoes']];
export type ComponenteEntrada = {
    [K in TipoEntrada]: PadraoComponenteEntrada<K>;
}[TipoEntrada];
