import { RendererFactory2 } from '@angular/core';
import { PoDensityMode } from '../../enums/po-density-mode.enum';
import { PoThemeA11yEnum } from './enum/po-theme-a11y.enum';
import { PoThemeTypeEnum } from './enum/po-theme-type.enum';
import { PoTheme, PoThemeActive } from './interfaces/po-theme.interface';
/**
 * @description
 *
 * O serviço `PoThemeService` permite customizar as cores do tema padrão do `PO-UI` e definir o nível de acessibilidade
 * mais adequado ao projeto.
 *
 * O nível **AAA** (padrão) garante maior contraste, áreas clicáveis amplas e espaçamentos maiores entre os elementos,
 * enquanto o nível **AA** mantém a conformidade com as diretrizes de acessibilidade, mas com proporções mais equilibradas
 * e contornos mais sutis.
 *
 * O serviço também possibilita configurar a **densidade de espaçamentos**, permitindo ajustar o espaço entre e dentro dos
 * componentes. Essa configuração pode ser utilizada com qualquer nível de acessibilidade.
 *
 * > Observação: a customização das cores de `feedback` não é recomendada por motivos de acessibilidade e usabilidade.
 *
 * > Para saber mais sobre como customizar o tema padrão, consulte o item
 * [Customização de Temas usando o serviço PO-UI](guides/theme-service) na aba `Guias`.
 */
/**
 * @example
 *
 * <example name="po-theme-labs" title="PO Theme Labs">
 *  <file name="sample-po-theme-labs/sample-po-theme-labs.component.html"> </file>
 *  <file name="sample-po-theme-labs/sample-po-theme-labs.component.ts"> </file>
 * </example>
 *
 */
export declare class PoThemeService {
    private document;
    private renderer;
    private theme;
    constructor(document: Document, rendererFactory: RendererFactory2);
    /**
     * Aplica um tema ao componente de acordo com o tipo de tema e o nível de acessibilidade especificados.
     *
     * Este método configura o tema do componente com base no objeto `themeConfig` fornecido, no `themeType` e no `a11yLevel`.
     * Além disso, ele pode opcionalmente salvar a preferência de tema no localStorage, se solicitado.
     *
     * @param {PoTheme} themeConfig - Configuração de tema a ser aplicada ao componente.
     * @param {PoThemeTypeEnum} [themeType=PoThemeTypeEnum.light] - (Opcional) Tipo de tema, podendo ser 'light' (claro) ou 'dark' (escuro). O tema claro é o padrão.
     * @param {PoThemeA11yEnum} [a11yLevel=PoThemeA11yEnum.AAA] - (Opcional) Nível de acessibilidade dos componentes, podendo ser AA ou AAA. Padrão é AAA.
     * @param {boolean} [persistPreference=true] - (Opcional) Define se a preferência de tema deve ser salva no
     * localStorage para persistência. Por padrão é `true`, ou seja, a preferência será salva automaticamente.
     */
    setTheme(themeConfig: PoTheme, themeType?: PoThemeTypeEnum, a11yLevel?: PoThemeA11yEnum, persistPreference?: boolean): Promise<void>;
    private setDataDefaultSizeHTML;
    /**
     * Retorna o nível de acessibilidade configurado no tema.
     * Se não estiver configurado, retorna `AAA` como padrão.
     * @returns {PoThemeA11yEnum} O nível de acessibilidade, que pode ser `AA` ou `AAA`.
     */
    getA11yLevel(): PoThemeA11yEnum;
    /**
     * Define o tamanho `small` como padrão para componentes que não possuem um tamanho definido. Essa configuração é
     * aplicada globalmente apenas quando o nível de acessibilidade for `AA`. O valor definido é salvo no
     * `localStorage` sob a chave `po-default-size` e o atributo `data-default-size` é adicionado ao elemento HTML
     * para que os componentes possam aplicar o tamanho
     *
     * Exemplo de uso:
     *
     * ```typescript
     * import { poThemeDefault, PoThemeService, PoThemeTypeEnum, PoThemeA11yEnum } from '@po-ui/ng-components';
     *
     * private themeService = inject(PoThemeService);
     *
     * constructor() {
     *  this.themeService.setA11yDefaultSizeSmall(true);
     *  this.themeService.setTheme(poThemeDefault, PoThemeTypeEnum.light, PoThemeA11yEnum.AA);
     * }
     * ```
     *
     * > Para garantir que o tamanho `small` seja aplicado corretamente a todos os componentes, recomendamos
     * definir esta configuração **junto com o nível de acessibilidade `AA` na inicialização da aplicação**.
     * > Para ajustar a densidade visual dos componentes agrupadores (como pages, container, etc.), utilize também
     * o método `setDensityMode` conforme necessário.
     *
     * @param {boolean} enable Habilita ou desabilita o tamanho `small` globalmente.
     */
    setA11yDefaultSizeSmall(enable: boolean): boolean;
    /**
     * Retorna o modo de adensamento dos componentes agrupadores.
     * Se não estiver configurado, retorna `medium` como padrão.
     * @returns {PoDensityMode} O modo de adensamento, que pode ser `small` ou `medium`.
     */
    getDensityMode(): PoDensityMode;
    /**
     * Aplica o modo de adensamento compacto (`small`) ou espaçoso (`medium`) para os componentes agrupadores,
     * independentemente do nível de acessibilidade. O valor definido é salvo no `localStorage` sob a chave
     * `po-density-mode`.
     *
     * @param {'small' | 'medium'} mode Define o modo de densidade: `small` para compacto, `medium` para espaçoso.
     * O valor padrão é `medium`.
     */
    setDensityMode(mode: string): void;
    /**
     * @docsPrivate
     * Retorna a preferência global de tamanho dos componentes.
     *
     * @returns `'small'` ou `'medium'`.
     */
    getA11yDefaultSize(): string;
    /**
     * @docsPrivate
     *
     * Aplica estilos customizados para o componente e para o root HTML, utilizando os tokens definidos.
     *
     * Esse método é chamado para inserir ou atualizar estilos no DOM, aplicando tanto tokens de `onRoot` (ex: `--font-family: 'Roboto'`)
     * quanto estilos específicos de componentes (`perComponent`, como `po-listbox [hidden]: { display: 'flex !important' }`).
     *
     * O seletor CSS gerado leva em consideração o tema (`type`) e as configurações de acessibilidade (`a11y`) do tema ativo.
     * A classe do tema é aplicada no HTML e pode ser formatada como `html[class*="-light-AA"]` para personalizações
     * em temas específicos.
     *
     * @param {PoThemeActive} active - Configuração do tema ativo:
     * @param {any} perComponent - Objeto contendo os estilos específicos para componentes a serem aplicados.
     * @param {any} onRoot - Objeto contendo tokens de estilo que serão aplicados diretamente no seletor `:root` do HTML.
     * @param {string | Array<string>} [classPrefix] - Prefixo(s) de classe para direcionamento preciso.
     *
     * @example
     * #### 1. Com prefixo único
     * ```typescript
     * setPerComponentAndOnRoot(
     *   { type: 'dark', a11y: 'AA' },
     *   { 'po-input': { background: '#222' } },
     *   { '--text-color': '#fff' },
     *   'myTheme'
     * );
     * ```
     * **Saída:**
     * ```css
     * :root[class*="-dark-AA"][class*="myTheme"] {
     *   --text-color: #fff;
     *   po-input { background: #222; }
     * }
     * ```
     *
     * #### 2. Com múltiplos prefixos
     * ```typescript
     * setPerComponentAndOnRoot(
     *   { type: 'light' },
     *   null,
     *   { '--primary': '#3e8ed0' },
     *   ['myTheme', 'portal-v2']
     * );
     * ```
     * **Saída:**
     * ```css
     * :root[class*="-light"][class*="myTheme"],
     * :root[class*="-light"][class*="portal-v2"] {
     *   --primary: #3e8ed0;
     * }
     * ```
     *
     * - Quando usado com array, gera um seletor CSS com múltiplos targets (separados por vírgula).
     * - Mantém a especificidade original do tema (`[class*="-type-a11y"]`) combinada com cada prefixo.
     *
     */
    setPerComponentAndOnRoot(active: PoThemeActive, perComponent: any, onRoot: any, classPrefix?: string | Array<string>): void;
    /**
     * @docsPrivate
     *
     * Gera estilos adicionais com base nos tokens de tema fornecidos, excluindo os tokens de cor.
     * @param theme Os tokens de tema contendo os estilos adicionais a serem gerados.
     * @returns Uma string contendo os estilos adicionais formatados.
     */
    private generateAdditionalStyles;
    /**
     * @docsPrivate
     *
     * Aplica os estilos de tema ao documento.
     * @param styleCss Os estilos CSS a serem aplicados.
     */
    private applyThemeStyles;
    private changeThemeType;
    /**
     * Restaura e aplica as preferências visuais do usuário para o tema da aplicação, garantindo que essas preferências
     * sejam persistidas no `localStorage` para uso em recarregamentos futuros.
     *
     * @returns {PoTheme} O tema atualmente aplicado.
     */
    persistThemeActive(): PoTheme;
    private formatTheme;
    applyTheme(theme?: any): any;
    /**
     * Altera o tipo do tema armazenado e aplica os novos estilos ao documento.
     *
     * Este método altera o tipo do tema armazenado ativo (light/dark)
     *
     * @param {PoThemeTypeEnum} themeType O tipo de tema a ser aplicado, light ou dark.
     */
    changeCurrentThemeType(type: PoThemeTypeEnum): void;
    /**
     * Método remove o tema armazenado e limpa todos os estilos de tema
     * aplicados ao documento.
     *
     * @param {boolean} [persistPreference=true] - (Opcional) Define se a preferência de tema não deve ser mantida no localStorage para persistência. `true` para remover, `false` para manter.
     */
    cleanThemeActive(persistPreference?: boolean): void;
    private getActiveTypeFromTheme;
    private getActiveA11yFromTheme;
    private isValidA11yLevel;
    /**
     * @docsPrivate
     *
     * Este método define um dados do tema e o armazena.
     * @param theme Os tokens de tema contendo os estilos adicionais a serem gerados.
     */
    private setThemeLocal;
    /**
     * Retorna o tema ativo como um observable. Este método funcionará apenas se o tema estiver armazenado no `localStorage`.
     *
     * @returns {PoTheme} Tema ativo.
     */
    getThemeActive(): PoTheme;
    /**
     * @docsPrivate
     *
     * Gera estilos CSS com base nos tokens de cores fornecidos.
     * @param css Os tokens de cor a serem usados para gerar os estilos.
     * @param id id do style a ser aplicado.
     * @returns Uma string contendo os estilos CSS gerados.
     */
    private createStyleElement;
    /**
     * @docsPrivate
     *
     * Gera estilos CSS com base nos tokens de cores fornecidos.
     * @param themeColor Os tokens de cor a serem usados para gerar os estilos.
     * @returns Uma string contendo os estilos CSS gerados.
     */
    private generateThemeStyles;
    /**
     * @docsPrivate
     *
     * Gera estilos CSS com base nos tokens per Component fornecidos.
     * @param themePerComponent Os tokens de cor a serem usados para gerar os estilos.
     * @returns Uma string contendo os estilos CSS gerados.
     */
    private generatePerComponentStyles;
    /**
     * Define o tema atual como o tema "PoUI Padrão".
     *
     * @param {PoThemeTypeEnum} type O tipo de Tema a ser aplicado, light / dark.
     */
    setDefaultTheme(type: PoThemeTypeEnum): void;
    /**
     * @docsPrivate
     *
     * Retorna o estilo CSS para o fundo dos ícones do componente po-select, com base nas cores do tema.
     *
     * @param {PoThemeColor} themeColor - Objeto contendo as cores do tema.
     * @returns {string} - Estilo CSS para o fundo dos ícones do po-select.
     */
    private getSelectBgIconsStyle;
    /**
     * @docsPrivate
     *
     * Retorna a imagem SVG utilizada como fundo do po-select.
     *
     * @param {string} color Cor da Imagem - Utilizada no atributo 'fill'.
     * @returns {string} Imagem SVG utilizada no po-select.
     */
    private getSelectBgIcon;
    private dispatchEvent;
    /**
     * Define o tipo (light/dark) quando um tema está sendo aplicado.
     *
     * @param {PoTheme} theme - Objeto contendo as definições de tema a serem aplicadas no componente.
     * @param {PoThemeTypeEnum} [themeType=PoThemeTypeEnum.light] - (Opcional) Tipo de tema a ser aplicado, podendo ser 'light' (claro) ou 'dark' (escuro). Por padrão, o tema claro é aplicado.
     */
    setThemeType(theme: PoTheme, themeType?: PoThemeTypeEnum): void;
    /**
     *  Define o tipo (light/dark) para um tema já ativo.
     *
     * @param {PoThemeTypeEnum} [themeType=PoThemeTypeEnum.light] - (Opcional) Tipo de tema a ser aplicado, podendo ser 'light' (claro) ou 'dark' (escuro). Por padrão, o tema claro é aplicado.
     */
    setCurrentThemeType(themeType?: PoThemeTypeEnum): void;
    /**
     * Define o nível de acessibilidade quando um tema está sendo aplicado.
     *
     * @param {PoTheme} theme - Objeto contendo as definições de tema a serem aplicadas no componente.
     * @param {PoThemeA11yEnum} [a11y=PoThemeA11yEnum.AAA] - (Opcional) Nível de acessibilidade dos componentes podendo ser
     * AA ou AAA. Por padrão a acessibilidade é AAA.
     */
    setThemeA11y(theme: PoTheme, a11y?: PoThemeA11yEnum): void;
    /**
     * Define o nível de acessibilidade para um tema já ativo.
     *
     * @param {PoThemeA11yEnum} [a11y=PoThemeA11yEnum.AAA] - (Opcional) Nível de acessibilidade dos componentes podendo ser
     * AA ou AAA. Por padrão a acessibilidade é AAA.
     */
    setCurrentThemeA11y(a11y?: PoThemeA11yEnum): void;
    resetBaseTheme(): void;
    private setDefaultBaseStyle;
}
