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
*
*
*
*
*
*
*/
export declare class PoThemeService {
private readonly document;
private readonly 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;
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} [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): 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;
}