UNPKG

@praxisui/core

Version:

Core library for Praxis UI Workspace: types, tokens, services and utilities shared across @praxisui/* packages.

1,626 lines (1,620 loc) 235 kB
import * as i0 from '@angular/core'; import { InjectionToken, Provider, Type, EnvironmentProviders, OnInit, OnChanges, OnDestroy, EventEmitter, SimpleChanges, ElementRef, Renderer2 } from '@angular/core'; import { HttpHeaders, HttpClient, HttpParams } from '@angular/common/http'; import * as rxjs from 'rxjs'; import { Observable, BehaviorSubject } from 'rxjs'; import { ValidationErrors, ValidatorFn, AsyncValidatorFn, FormControl, FormGroup } from '@angular/forms'; import { ThemePalette } from '@angular/material/core'; import { MatDialogRef } from '@angular/material/dialog'; declare class PraxisCore { static ɵfac: i0.ɵɵFactoryDeclaration<PraxisCore, never>; static ɵcmp: i0.ɵɵComponentDeclaration<PraxisCore, "praxis-praxis-core", never, {}, {}, never, never, true, never>; } interface ApiUrlEntry { baseUrl?: string; path?: string; fullUrl?: string; version?: string; headers?: HttpHeaders | Record<string, string | string[]>; } interface ApiUrlConfig { [key: string]: ApiUrlEntry; } declare const API_URL: InjectionToken<ApiUrlConfig>; declare function buildApiUrl(entry: ApiUrlEntry): string; declare function buildHeaders(entry: ApiUrlEntry): HttpHeaders | undefined; /** * Nova arquitetura modular do TableConfig v2.0 * Preparada para crescimento exponencial e alinhada com as 5 abas do editor */ interface ColumnDefinition { /** Campo da fonte de dados */ field: string; /** Cabeçalho da coluna */ header: string; /** Tipo de dados para formatação */ type?: 'string' | 'number' | 'date' | 'boolean' | 'currency' | 'percentage' | 'custom'; /** Largura da coluna */ width?: string; /** Visibilidade da coluna */ visible?: boolean; /** Permitir ordenação */ sortable?: boolean; /** Permitir filtragem */ filterable?: boolean; /** Permitir redimensionamento */ resizable?: boolean; /** Coluna fixa (sticky). true/"start" fixa no início; "end" fixa no fim */ sticky?: boolean | 'start' | 'end'; /** Alinhamento do conteúdo */ align?: 'left' | 'center' | 'right'; /** Ordem de exibição */ order?: number; /** Campo do backend usado para ordenação (quando diferente de field) */ sortField?: string; /** Estilo CSS personalizado */ style?: string; /** Estilo CSS do cabeçalho */ headerStyle?: string; /** Classe CSS personalizada */ cssClass?: string; /** Classe CSS do cabeçalho */ headerCssClass?: string; /** Formato de exibição dos dados */ format?: any; /** Mapeamento de valores para exibição */ valueMapping?: { [key: string | number]: string; }; /** * Renderizador de célula (Fase 1): opções básicas para ícone, imagem ou badge. * Fase 2: expandido com tipos interativos/ricos (link, button, chip, progress, avatar, toggle, menu, html). * Mantém compatibilidade com type/format/valueMapping; quando definido, tem precedência na exibição. */ renderer?: { /** Tipo calculado por expressão (tem precedência sobre o tipo estático) */ typeExpr?: string | { expr: string; }; /** Tipo do renderizador */ type: 'icon' | 'image' | 'badge' | 'link' | 'button' | 'chip' | 'progress' | 'avatar' | 'toggle' | 'menu' | 'html' | 'compose'; /** Configuração de ícone (Material/SVG por nome) */ icon?: { /** Nome fixo do ícone (ex.: 'check_circle') */ name?: string; /** Campo do row que contém o nome do ícone */ nameField?: string; /** Cor do ícone (primary/accent/warn ou CSS color) */ color?: string; /** Tamanho em px (opcional) */ size?: number; /** Label acessível (fixo) */ ariaLabel?: string; }; /** Configuração de imagem */ image?: { /** URL fixa da imagem */ src?: string; /** Campo do row com a URL da imagem */ srcField?: string; /** Texto alternativo fixo */ alt?: string; /** Campo do row com ALT */ altField?: string; /** Dimensões */ width?: number; height?: number; /** Forma de recorte */ shape?: 'square' | 'rounded' | 'circle'; /** Ajuste do objeto */ fit?: 'cover' | 'contain'; /** Lazy loading */ lazy?: boolean; }; /** Configuração de badge */ badge?: { /** Texto fixo */ text?: string; /** Campo do row com texto */ textField?: string; /** Cor do badge (primary/accent/warn ou CSS) */ color?: string; /** Variante visual */ variant?: 'filled' | 'outlined' | 'soft'; /** Ícone opcional dentro do badge */ icon?: string; }; /** Link (sanitizado) */ link?: { text?: string; textField?: string; href?: string; hrefField?: string; target?: '_blank' | '_self' | '_parent' | '_top'; rel?: string; }; /** Botão (ação por linha) */ button?: { label?: string; labelField?: string; icon?: string; color?: 'primary' | 'accent' | 'warn' | string; variant?: 'filled' | 'outlined' | 'text'; size?: 'sm' | 'md' | 'lg'; ariaLabel?: string; disabledCondition?: string; action?: { id: string; payloadExpr?: string; }; }; /** Chip (etiqueta leve) */ chip?: { text?: string; textField?: string; color?: string; icon?: string; variant?: 'filled' | 'outlined' | 'soft'; }; /** Barra de progresso leve */ progress?: { valueExpr: string; color?: string; showLabel?: boolean; }; /** Avatar (imagem ou iniciais) */ avatar?: { src?: string; srcField?: string; alt?: string; altField?: string; initialsExpr?: string; shape?: 'square' | 'rounded' | 'circle'; size?: number; }; /** Alternância (toggle) com ação */ toggle?: { stateExpr: string; disabledCondition?: string; action?: { id: string; payloadExpr?: string; }; ariaLabel?: string; }; /** Menu de ações * itemsExpr → Array<{ label: string; icon?: string; id: string; payloadExpr?: string; visibleCondition?: string }> */ menu?: { itemsExpr: string; ariaLabel?: string; }; /** HTML (sanitizado) com tokens [[field]] */ html?: { template: string; sanitize?: 'strict' | 'basic'; emptyFallback?: string; }; /** Compose (multi-itens) */ compose?: { items: Array<{ type: 'icon'; icon?: { name?: string; nameField?: string; color?: string; size?: number; ariaLabel?: string; }; } | { type: 'image'; image?: { src?: string; srcField?: string; alt?: string; altField?: string; width?: number; height?: number; shape?: 'square' | 'rounded' | 'circle'; fit?: 'cover' | 'contain'; lazy?: boolean; }; } | { type: 'badge'; badge?: { text?: string; textField?: string; color?: string; variant?: 'filled' | 'outlined' | 'soft'; icon?: string; }; } | { type: 'link'; link?: { text?: string; textField?: string; href?: string; hrefField?: string; target?: '_blank' | '_self' | '_parent' | '_top'; rel?: string; }; } | { type: 'button'; button?: { label?: string; labelField?: string; icon?: string; color?: string; variant?: 'filled' | 'outlined' | 'text'; size?: 'sm' | 'md' | 'lg'; disabledCondition?: string; action?: { id: string; payloadExpr?: string; }; }; } | { type: 'chip'; chip?: { text?: string; textField?: string; color?: string; icon?: string; variant?: 'filled' | 'outlined' | 'soft'; }; } | { type: 'progress'; progress?: { valueExpr: string; color?: string; showLabel?: boolean; }; } | { type: 'avatar'; avatar?: { src?: string; srcField?: string; alt?: string; altField?: string; initialsExpr?: string; shape?: 'square' | 'rounded' | 'circle'; size?: number; }; } | { type: 'toggle'; toggle?: { stateExpr: string; disabledCondition?: string; action?: { id: string; payloadExpr?: string; }; }; } | { type: 'menu'; menu?: { itemsExpr: string; ariaLabel?: string; }; } | { type: 'html'; html?: { template: string; sanitize?: 'strict' | 'basic'; emptyFallback?: string; }; }>; layout?: { direction?: 'row' | 'column'; gap?: number; align?: 'start' | 'center' | 'end'; wrap?: boolean; ellipsis?: boolean; }; }; }; /** Overrides condicionais do renderer por linha (first‑match wins) */ conditionalRenderers?: Array<{ condition: string; renderer: Partial<ColumnDefinition['renderer']>; description?: string; enabled?: boolean; }>; /** * Regras de estilo condicionais por coluna (experimental) * Cada regra contém uma expressão/DSL em `condition` e o efeito visual a aplicar. */ conditionalStyles?: Array<{ condition: string; cssClass?: string; style?: { [key: string]: string; }; description?: string; }>; /** Estado serializado do construtor visual de regras (round‑trip) */ _styleRulesState?: any; /** Getter personalizado para valor calculado */ _generatedValueGetter?: string; /** Tipo original da API */ _originalApiType?: string; /** Flag indicando se veio da API */ _isApiField?: boolean; } interface ConfigMetadata { /** Versão da configuração para migração automática */ version?: string; /** Identificador único da configuração */ id?: string; /** Nome amigável da configuração */ name?: string; /** Descrição da configuração */ description?: string; /** Tags para categorização e busca */ tags?: string[]; /** Data de criação */ createdAt?: string; /** Data de última modificação */ updatedAt?: string; /** Autor da configuração */ author?: string; /** Se é um template ou configuração específica */ isTemplate?: boolean; /** Configuração derivada de outra (parent ID) */ derivedFrom?: string; /** Identidade do schema de origem (path|operation|schemaType|internal:<bool>|tenant|locale) */ schemaId?: string; /** ETag/hash do schema do servidor usado para a última reconciliação */ serverHash?: string; /** Campo identificador preferido pelo usuário para o recurso (ex.: 'id', 'codigo') */ idField?: string; /** Contexto de schema associado (útil para auditoria/telemetria) */ schemaContext?: { path: string; operation: string; schemaType: 'response' | 'request'; internal?: boolean; tenant?: string; locale?: string; }; } interface TableBehaviorConfig { /** Configurações de paginação */ pagination?: PaginationConfig; /** Configurações de ordenação */ sorting?: SortingConfig; /** Configurações de filtragem */ filtering?: FilteringConfig; /** Configurações de seleção de linhas */ selection?: SelectionConfig; /** Configurações de interação do usuário */ interaction?: InteractionConfig; /** Configurações de carregamento e estados */ loading?: LoadingConfig; /** Configurações para estado vazio */ emptyState?: EmptyStateConfig; /** Configurações de virtualização para performance */ virtualization?: VirtualizationConfig; /** Configurações de redimensionamento */ resizing?: ResizingConfig; /** Configurações de reorganização por drag & drop */ dragging?: DraggingConfig; } interface PaginationConfig { /** Habilitar paginação */ enabled: boolean; /** Tamanho inicial da página */ pageSize: number; /** Opções de tamanho de página disponíveis */ pageSizeOptions: number[]; /** Mostrar botões primeira/última página */ showFirstLastButtons: boolean; /** Mostrar números das páginas */ showPageNumbers: boolean; /** Mostrar info de página (ex: "1-10 de 100") */ showPageInfo: boolean; /** Posição da paginação */ position: 'top' | 'bottom' | 'both'; /** Estilo da paginação */ style: 'default' | 'simple' | 'advanced' | 'compact'; /** Total de itens (para paginação server-side) */ totalItems?: number; /** Estratégia de paginação */ strategy: 'client' | 'server'; /** Configurações avançadas */ advanced?: { /** Jump to page input */ showJumpToPage?: boolean; /** Page size customization */ allowCustomPageSize?: boolean; /** Maximum page size allowed */ maxPageSize?: number; }; } interface SortingConfig { /** Habilitar ordenação */ enabled: boolean; /** Ordenação padrão inicial (suporta múltiplas entradas) */ defaultSort?: { column: string; direction: 'asc' | 'desc'; } | Array<{ column: string; direction: 'asc' | 'desc'; }>; /** Permitir ordenação múltipla */ multiSort: boolean; /** Estratégia de ordenação */ strategy: 'client' | 'server'; /** Mostrar indicadores visuais de ordenação */ showSortIndicators: boolean; /** Posição dos indicadores */ indicatorPosition: 'start' | 'end'; /** Permitir remover ordenação (terceiro clique) */ allowClearSort: boolean; /** Configurações avançadas */ advanced?: { /** Função de comparação customizada para ordenação client-side */ customComparators?: { [column: string]: (a: any, b: any) => number; }; /** Preservar ordenação entre atualizações de dados */ preserveSort?: boolean; }; } interface FilteringConfig { /** Habilitar filtragem */ enabled: boolean; /** Filtros por coluna */ columnFilters?: { enabled: boolean; /** Tipo de filtro padrão */ defaultType: 'text' | 'select' | 'date' | 'number' | 'boolean'; /** Posição dos filtros */ position: 'header' | 'subheader' | 'sidebar'; }; /** Filtros avançados */ advancedFilters?: { enabled: boolean; /** Interface de query builder */ queryBuilder?: boolean; /** Salvar filtros como presets */ savePresets?: boolean; /** Configurações específicas do componente praxis-filter */ settings?: { /** Campo de busca rápida */ quickField?: string; /** Campos sempre visíveis */ alwaysVisibleFields?: string[]; /** Placeholder da busca */ placeholder?: string; /** Exibir opções avançadas por padrão */ showAdvanced?: boolean; /** Permitir salvar tags/atalhos de filtro */ allowSaveTags?: boolean; /** Debounce de alterações para auto-aplicar filtros (ms) */ changeDebounceMs?: number; /** Modo de exibição do componente de filtro */ mode?: 'auto' | 'filter' | 'card'; }; }; /** Estratégia de filtragem */ strategy: 'client' | 'server'; /** Debounce para filtros em tempo real (ms) */ debounceTime: number; } interface SelectionConfig { /** Habilitar seleção de linhas */ enabled: boolean; /** Tipo de seleção */ type: 'single' | 'multiple'; /** Modo de seleção */ mode: 'checkbox' | 'row' | 'both'; /** Permitir selecionar todas as linhas */ allowSelectAll: boolean; /** Posição do checkbox de seleção */ checkboxPosition: 'start' | 'end'; /** Manter seleção entre páginas */ persistSelection: boolean; /** Manter seleção entre atualizações de dados */ persistOnDataUpdate: boolean; /** Máximo de itens selecionáveis */ maxSelections?: number; /** Configurações visuais */ visual?: { /** Highlight da linha selecionada */ highlightSelected: boolean; /** Cor do highlight */ highlightColor?: string; /** Mostrar contador de selecionados */ showSelectionCount: boolean; }; } interface InteractionConfig { /** Ação ao clicar na linha */ rowClick?: { enabled: boolean; action: 'select' | 'edit' | 'view' | 'custom'; /** Função customizada para row click */ customAction?: string; }; /** Ação ao dar duplo clique na linha */ rowDoubleClick?: { enabled: boolean; action: 'edit' | 'view' | 'custom'; customAction?: string; }; /** Hover effects */ hover?: { enabled: boolean; /** Highlight na linha */ highlightRow: boolean; /** Mostrar ações no hover */ showActionsOnHover: boolean; }; /** Configurações de teclado */ keyboard?: { enabled: boolean; /** Navegação com setas */ arrowNavigation: boolean; /** Seleção com espaço */ spaceSelection: boolean; /** Atalhos personalizados */ customShortcuts?: { [key: string]: string; }; }; } interface LoadingConfig { /** Tipo de loading indicator */ type: 'spinner' | 'skeleton' | 'progress' | 'custom'; /** Posição do loading */ position: 'overlay' | 'inline' | 'replace'; /** Texto durante carregamento */ text?: string; /** Mostrar loading para operações rápidas */ showForQuickOperations: boolean; /** Delay antes de mostrar loading (ms) */ delay: number; /** Configurações de skeleton loading */ skeleton?: { rows: number; /** Animar skeleton */ animated: boolean; /** Cor base do skeleton */ baseColor?: string; /** Cor do highlight */ highlightColor?: string; }; } interface EmptyStateConfig { /** Mensagem para estado vazio */ message: string; /** Ícone para estado vazio */ icon?: string; /** Imagem para estado vazio */ image?: string; /** Ações disponíveis no estado vazio */ actions?: Array<{ label: string; action: string; icon?: string; primary?: boolean; }>; /** Template customizado */ customTemplate?: string; /** Configurações específicas por contexto */ contexts?: { /** Estado inicial (sem dados carregados) */ initial?: Partial<EmptyStateConfig>; /** Após filtros aplicados */ filtered?: Partial<EmptyStateConfig>; /** Após busca sem resultados */ searched?: Partial<EmptyStateConfig>; }; } interface VirtualizationConfig { /** Habilitar virtualização */ enabled?: boolean; /** Altura de cada linha (px) */ itemHeight?: number; /** Número de itens para buffer */ bufferSize?: number; /** Altura mínima do container (px ou CSS) */ minContainerHeight?: number | string; /** Estratégia de virtualização */ strategy?: 'fixed' | 'dynamic'; } interface ResizingConfig { /** Habilitar redimensionamento de colunas */ enabled: boolean; /** Largura mínima das colunas */ minColumnWidth: number; /** Largura máxima das colunas */ maxColumnWidth?: number; /** Auto-fit ao conteúdo */ autoFit: boolean; /** Preservar larguras entre sessões */ persistWidths: boolean; } interface DraggingConfig { /** Habilitar reorganização de colunas */ columns: boolean; /** Habilitar reorganização de linhas */ rows: boolean; /** Indicador visual durante drag */ showDragIndicator: boolean; /** Zona de drop para colunas */ columnDropZones?: string[]; } interface TableAppearanceConfig { /** Densidade da tabela */ density: 'compact' | 'comfortable' | 'spacious'; /** Configurações de bordas */ borders?: BorderConfig; /** Configurações de cores */ colors?: ColorConfig; /** Configurações de fonte */ typography?: TypographyConfig; /** Configurações de espaçamento */ spacing?: SpacingConfig; /** Configurações de animações */ animations?: AnimationConfig; /** Configurações de responsividade */ responsive?: ResponsiveConfig; /** Configurações de elevação/sombra */ elevation?: ElevationConfig; } interface BorderConfig { /** Mostrar bordas entre linhas */ showRowBorders: boolean; /** Mostrar bordas entre colunas */ showColumnBorders: boolean; /** Mostrar borda externa */ showOuterBorder: boolean; /** Estilo da borda */ style: 'solid' | 'dashed' | 'dotted'; /** Largura da borda */ width: number; /** Cor da borda */ color?: string; /** Bordas específicas */ specific?: { header?: Partial<BorderConfig>; footer?: Partial<BorderConfig>; sticky?: Partial<BorderConfig>; }; } interface ColorConfig { /** Cor de fundo da tabela */ background?: string; /** Cor de fundo do cabeçalho */ headerBackground?: string; /** Cor de fundo de linhas alternadas */ alternateRowBackground?: string; /** Cor de fundo no hover */ hoverBackground?: string; /** Cor de fundo para linhas selecionadas */ selectedBackground?: string; /** Cor do texto */ textColor?: string; /** Cor do texto do cabeçalho */ headerTextColor?: string; /** Paleta de cores para estados */ states?: { error?: string; warning?: string; success?: string; info?: string; }; } interface TypographyConfig { /** Família da fonte */ fontFamily?: string; /** Tamanho da fonte do conteúdo */ fontSize?: string; /** Tamanho da fonte do cabeçalho */ headerFontSize?: string; /** Peso da fonte */ fontWeight?: number | string; /** Peso da fonte do cabeçalho */ headerFontWeight?: number | string; /** Altura da linha */ lineHeight?: string; /** Espaçamento entre letras */ letterSpacing?: string; /** Transformação do texto do cabeçalho */ headerCase?: 'none' | 'uppercase' | 'lowercase' | 'capitalize'; } interface SpacingConfig { /** Padding das células */ cellPadding?: string; /** Padding do cabeçalho */ headerPadding?: string; /** Altura das linhas */ rowHeight?: number; /** Altura do cabeçalho */ headerHeight?: number; /** Espaçamento entre tabela e container */ containerSpacing?: string; } interface AnimationConfig { /** Habilitar animações */ enabled: boolean; /** Duração das animações (ms) */ duration: number; /** Função de easing */ easing: string; /** Animações específicas */ specific?: { /** Animação ao carregar */ loading?: boolean; /** Animação de hover */ hover?: boolean; /** Animação de seleção */ selection?: boolean; /** Animação de ordenação */ sorting?: boolean; }; } interface ResponsiveConfig { /** Pontos de quebra */ breakpoints?: { mobile?: number; tablet?: number; desktop?: number; }; /** Comportamento em dispositivos móveis */ mobile?: { /** Scroll horizontal */ horizontalScroll?: boolean; /** Colapsar colunas */ collapseColumns?: boolean; /** Colunas prioritárias */ priorityColumns?: string[]; /** Modo de cards em mobile */ cardMode?: boolean; }; /** Ajustes automáticos */ autoAdjust?: { /** Ocultar colunas automaticamente */ hideColumns?: boolean; /** Reduzir font size */ scaleFontSize?: boolean; /** Ajustar padding */ adjustPadding?: boolean; }; } interface ElevationConfig { /** Nível de elevação */ level: number; /** Cor da sombra */ shadowColor?: string; /** Elevação no hover */ hoverElevation?: number; } interface ToolbarConfig { /** Visibilidade da toolbar */ visible: boolean; /** Posição da toolbar */ position: 'top' | 'bottom' | 'both'; /** Configurações de layout */ layout?: ToolbarLayoutConfig; /** Título da tabela */ title?: string; /** Subtítulo da tabela */ subtitle?: string; /** Ações da toolbar */ actions?: ToolbarAction[]; /** Configurações de filtros na toolbar */ filters?: ToolbarFilterConfig; /** Menu de configurações */ settingsMenu?: ToolbarSettingsConfig; } interface ToolbarLayoutConfig { /** Alinhamento do conteúdo */ alignment: 'start' | 'center' | 'end' | 'space-between'; /** Altura da toolbar */ height?: number; /** Padding da toolbar */ padding?: string; /** Cor de fundo */ backgroundColor?: string; /** Mostrar separador */ showSeparator: boolean; } interface ToolbarAction { /** ID único da ação */ id: string; /** Label da ação */ label: string; /** Ícone da ação */ icon?: string; /** Tipo do botão */ type: 'button' | 'icon' | 'fab' | 'menu'; /** Cor do Material */ color?: 'primary' | 'accent' | 'warn'; /** Aparência do botão Material: filled (flat), outlined (stroked), elevated (raised), text, tonal (custom) */ appearance?: 'filled' | 'outlined' | 'elevated' | 'text' | 'tonal'; /** Ação desabilitada */ disabled?: boolean; /** Função a executar */ action: string; /** Tooltip */ tooltip?: string; /** Tecla de atalho */ shortcut?: string; /** Posição na toolbar */ position: 'start' | 'end'; /** Ordem de exibição */ order?: number; /** Visibilidade condicional */ visibleWhen?: string; /** Sub-ações (para menus) */ children?: ToolbarAction[]; } interface ToolbarFilterConfig { /** Habilitar filtros rápidos na toolbar */ enabled: boolean; /** Filtros rápidos disponíveis */ quickFilters?: Array<{ id: string; label: string; filter: any; icon?: string; }>; /** Mostrar botão de filtros avançados */ showAdvancedButton: boolean; } interface ToolbarSettingsConfig { /** Habilitar menu de configurações */ enabled: boolean; /** Configurações disponíveis */ options?: Array<{ id: string; label: string; type: 'toggle' | 'select' | 'action'; value?: any; options?: any[]; }>; } interface TableActionsConfig { /** Ações por linha */ row?: RowActionsConfig; /** Ações em lote */ bulk?: BulkActionsConfig; /** Ações de contexto (menu com botão direito) */ context?: ContextActionsConfig; /** Configurações de confirmação */ confirmations?: ConfirmationConfig; } interface RowActionsConfig { /** Habilitar ações por linha */ enabled: boolean; /** Posição das ações */ position: 'start' | 'end'; /** Largura da coluna de ações */ width?: string; /** Fixar a coluna de ações */ sticky?: boolean | 'start' | 'end'; /** Ações disponíveis */ actions: RowAction[]; /** Formato de exibição */ display: 'menu' | 'buttons' | 'icons'; /** Trigger para mostrar ações */ trigger: 'hover' | 'always' | 'click'; /** Ícone do menu de ações */ menuIcon?: string; /** Cor do botão do menu de ações (overflow) */ menuButtonColor?: 'basic' | 'primary' | 'accent' | 'warn'; /** Configurações do cabeçalho da coluna de ações */ header?: { /** Texto exibido no cabeçalho (ex.: "Ações") */ label?: string; /** Ícone exibido ao lado do texto */ icon?: string; /** Tooltip do cabeçalho */ tooltip?: string; /** Alinhamento do conteúdo no cabeçalho */ align?: 'start' | 'center' | 'end'; }; /** Número máximo de ações visíveis */ maxVisibleActions?: number; /** Comportamento de overflow de ações */ behavior?: { /** Habilitar comportamento de overflow */ enabled?: boolean; /** Número máximo de ações inline */ maxInline?: number | 'auto' | { xs?: number; sm?: number; md?: number; lg?: number; }; /** Estratégia para auto determinar número de ações inline */ autoStrategy?: 'measure' | 'breakpoints'; }; } interface RowAction { /** ID único da ação */ id: string; /** Label da ação */ label: string; /** Ícone da ação */ icon?: string; /** Cor da ação */ color?: string; /** Ação desabilitada */ disabled?: boolean; /** Função a executar */ action: string; /** Tooltip */ tooltip?: string; /** Requer confirmação */ requiresConfirmation?: boolean; /** Visibilidade condicional */ visibleWhen?: string; /** Separador após esta ação */ separator?: boolean; /** Habilita exclusão automática ao acionar */ autoDelete?: boolean; /** Endpoint personalizado para exclusão */ deleteEndpoint?: string; } interface BulkActionsConfig { /** Habilitar ações em lote */ enabled: boolean; /** Posição das ações em lote */ position: 'toolbar' | 'floating' | 'both'; /** Ações disponíveis */ actions: BulkAction[]; /** Configurações do floating action button */ floating?: { position: 'bottom-right' | 'bottom-left' | 'top-right' | 'top-left'; /** Ocultar quando nada selecionado */ hideWhenEmpty: boolean; }; } interface BulkAction { /** ID único da ação */ id: string; /** Label da ação */ label: string; /** Ícone da ação */ icon?: string; /** Cor da ação */ color?: string; /** Função a executar */ action: string; /** Requer confirmação */ requiresConfirmation?: boolean; /** Mínimo de itens selecionados */ minSelections?: number; /** Máximo de itens selecionados */ maxSelections?: number; /** Habilita exclusão automática ao acionar */ autoDelete?: boolean; /** Endpoint personalizado para exclusão */ deleteEndpoint?: string; } interface ContextActionsConfig { /** Habilitar menu de contexto */ enabled: boolean; /** Ações do menu de contexto */ actions: ContextAction[]; /** Trigger para menu de contexto */ trigger: 'right-click' | 'long-press' | 'both'; } interface ContextAction { /** ID único da ação */ id: string; /** Label da ação */ label: string; /** Ícone da ação */ icon?: string; /** Função a executar */ action: string; /** Separador após esta ação */ separator?: boolean; /** Visibilidade condicional */ visibleWhen?: string; } interface ConfirmationConfig { /** Configurações padrão de confirmação */ default?: { title: string; message: string; confirmText: string; cancelText: string; }; /** Configurações específicas por ação */ specific?: { [actionId: string]: Partial<ConfirmationConfig['default']>; }; } interface ExportConfig { /** Habilitar exportação */ enabled: boolean; /** Formatos disponíveis */ formats: ExportFormat[]; /** Configurações por formato */ excel?: ExcelExportConfig; pdf?: PdfExportConfig; csv?: CsvExportConfig; json?: JsonExportConfig; /** Configurações gerais */ general?: GeneralExportConfig; /** Templates personalizados */ templates?: ExportTemplate[]; } type ExportFormat = 'excel' | 'pdf' | 'csv' | 'json' | 'print'; interface GeneralExportConfig { /** Incluir cabeçalhos */ includeHeaders: boolean; /** Incluir filtros aplicados na exportação */ respectFilters: boolean; /** Incluir apenas linhas selecionadas */ selectedRowsOnly?: boolean; /** Máximo de linhas para exportar */ maxRows?: number; /** Nome do arquivo padrão */ defaultFileName?: string; /** Colunas a incluir na exportação */ includeColumns?: string[] | 'all' | 'visible'; /** Aplicar formatações das colunas */ applyFormatting: boolean; } interface ExcelExportConfig { /** Nome da planilha */ sheetName: string; /** Incluir fórmulas nas células */ includeFormulas: boolean; /** Congelar linha de cabeçalho */ freezeHeaders: boolean; /** Auto-ajustar largura das colunas */ autoFitColumns: boolean; /** Configurações de estilo */ styling?: ExcelStylingConfig; /** Múltiplas planilhas */ multipleSheets?: boolean; } interface ExcelStylingConfig { /** Estilo do cabeçalho */ headerStyle?: { backgroundColor?: string; fontColor?: string; fontWeight?: 'bold' | 'normal'; fontSize?: number; }; /** Estilo das células */ cellStyle?: { fontSize?: number; borderStyle?: 'thin' | 'medium' | 'thick'; }; /** Linhas alternadas */ alternateRows?: { enabled: boolean; color?: string; }; } interface PdfExportConfig { /** Orientação da página */ orientation: 'portrait' | 'landscape'; /** Tamanho da página */ pageSize: 'A4' | 'A3' | 'Letter' | 'Legal'; /** Margens da página */ margins: MarginConfig; /** Cabeçalho do documento */ header?: string; /** Rodapé do documento */ footer?: string; /** Marca d'água */ watermark?: string; /** Configurações de fonte */ font?: { family?: string; size?: number; }; /** Quebra de página automática */ autoPageBreak: boolean; } interface MarginConfig { top: number; right: number; bottom: number; left: number; } interface CsvExportConfig { /** Separador de campos */ delimiter: ',' | ';' | '|' | '\t'; /** Caractere de escape */ escapeChar: string; /** Encoding do arquivo */ encoding: 'utf-8' | 'utf-16' | 'iso-8859-1'; /** Incluir BOM */ includeBOM: boolean; } interface JsonExportConfig { /** Formato do JSON */ format: 'pretty' | 'compact'; /** Incluir metadados */ includeMetadata: boolean; /** Estrutura dos dados */ structure: 'array' | 'object'; } interface ExportTemplate { /** ID único do template */ id: string; /** Nome do template */ name: string; /** Descrição */ description?: string; /** Formato do template */ format: ExportFormat; /** Configurações específicas */ config: any; /** Template padrão do sistema */ isDefault?: boolean; } interface MessagesConfig { /** Mensagens de estado */ states?: StateMessagesConfig; /** Mensagens de ações */ actions?: ActionMessagesConfig; /** Mensagens de validação */ validation?: ValidationMessagesConfig; /** Mensagens de exportação */ export?: ExportMessagesConfig; /** Mensagens customizadas */ custom?: { [key: string]: string; }; /** Templates de mensagem com interpolação */ templates?: MessageTemplate[]; } interface StateMessagesConfig { /** Carregando dados */ loading: string; /** Nenhum dado disponível */ empty: string; /** Erro ao carregar */ error: string; /** Nenhum resultado encontrado */ noResults: string; /** Carregando mais dados */ loadingMore: string; /** Mensagens dinâmicas com contador */ dynamic?: { /** Função para mensagem de loading com contagem */ loadingWithCount?: (count: number) => string; /** Função para estado vazio com filtros */ emptyWithFilter?: (filterCount: number) => string; /** Função para resultado de busca */ searchResults?: (resultCount: number, searchTerm: string) => string; }; } interface ActionMessagesConfig { /** Mensagens de confirmação */ confirmations?: { delete: string; deleteMultiple: string; save: string; cancel: string; export: string; }; /** Mensagens de sucesso */ success?: { save: string; delete: string; export: string; import: string; }; /** Mensagens de progresso */ progress?: { delete: string; deleteMultiple: string; }; /** Mensagens de cancelamento */ canceled?: { delete: string; deleteMultiple: string; }; /** Mensagens de erro */ errors?: { save: string; delete: string; export: string; network: string; permission: string; }; } interface ValidationMessagesConfig { /** Mensagens de validação de dados */ required: string; invalid: string; tooLong: string; tooShort: string; /** Mensagens específicas por tipo */ types?: { email: string; url: string; number: string; date: string; }; } interface ExportMessagesConfig { /** Iniciando exportação */ starting: string; /** Processando dados */ processing: string; /** Download pronto */ ready: string; /** Erro na exportação */ error: string; /** Mensagens por formato */ formats?: { excel: string; pdf: string; csv: string; json: string; }; } interface MessageTemplate { /** ID único do template */ id: string; /** Template da mensagem com placeholders */ template: string; /** Variáveis disponíveis */ variables?: string[]; /** Função de interpolação customizada */ interpolate?: (template: string, data: any) => string; } interface LocalizationConfig { /** Idioma principal */ locale: string; /** Idiomas disponíveis */ availableLocales?: string[]; /** Direção do texto */ direction: 'ltr' | 'rtl'; /** Configurações de data/hora */ dateTime?: DateTimeLocaleConfig; /** Configurações de números */ number?: NumberLocaleConfig; /** Configurações de moeda */ currency?: CurrencyLocaleConfig; /** Dicionário de traduções */ translations?: { [locale: string]: { [key: string]: string; }; }; /** Configurações de formatação */ formatting?: FormattingLocaleConfig; } interface DateTimeLocaleConfig { /** Formato de data padrão */ dateFormat: string; /** Formato de hora padrão */ timeFormat: string; /** Formato de data e hora */ dateTimeFormat: string; /** Primeiro dia da semana (0 = domingo) */ firstDayOfWeek: number; /** Nomes dos meses */ monthNames?: string[]; /** Nomes dos dias da semana */ dayNames?: string[]; /** Formato relativo (há 2 dias) */ relativeTime?: boolean; } interface NumberLocaleConfig { /** Separador decimal */ decimalSeparator: string; /** Separador de milhares */ thousandsSeparator: string; /** Número de casas decimais padrão */ defaultPrecision: number; /** Símbolo de negativo */ negativeSign: string; /** Posição do símbolo de negativo */ negativeSignPosition: 'before' | 'after'; } interface CurrencyLocaleConfig { /** Código da moeda (ISO 4217) */ code: string; /** Símbolo da moeda */ symbol: string; /** Posição do símbolo */ position: 'before' | 'after'; /** Espaço entre símbolo e valor */ spacing: boolean; /** Precisão padrão */ precision: number; } interface FormattingLocaleConfig { /** Formato de porcentagem */ percentageFormat: string; /** Formato de arquivos/tamanhos */ fileSizeFormat: 'binary' | 'decimal'; /** Unidades de medida */ units?: { [type: string]: { [unit: string]: string; }; }; } interface DataConfig { /** Estratégia de carregamento */ loadingStrategy: 'eager' | 'lazy' | 'on-demand'; /** Configurações de cache */ cache?: CacheConfig; /** Configurações de sincronização */ sync?: SyncConfig; /** Configurações de validação */ validation?: DataValidationConfig; /** Transformações de dados */ transformations?: DataTransformation[]; /** Configurações de polling */ polling?: PollingConfig; } interface CacheConfig { /** Habilitar cache */ enabled: boolean; /** Tempo de vida do cache (ms) */ ttl: number; /** Tamanho máximo do cache */ maxSize: number; /** Estratégia de invalidação */ invalidationStrategy: 'ttl' | 'manual' | 'on-update'; } interface SyncConfig { /** Sincronização automática */ autoSync: boolean; /** Intervalo de sincronização (ms) */ interval: number; /** Sincronizar apenas mudanças */ deltaSync: boolean; /** Resolver conflitos */ conflictResolution: 'client' | 'server' | 'manual'; } interface DataValidationConfig { /** Validação no cliente */ clientSide: boolean; /** Validação no servidor */ serverSide: boolean; /** Regras de validação */ rules?: ValidationRule[]; /** Mostrar erros inline */ showInlineErrors: boolean; } interface ValidationRule { /** Campo a validar */ field: string; /** Tipo de validação */ type: 'required' | 'format' | 'range' | 'custom'; /** Parâmetros da validação */ params?: any; /** Mensagem de erro */ message: string; } interface DataTransformation { /** ID da transformação */ id: string; /** Campo a transformar */ field: string; /** Tipo de transformação */ type: 'format' | 'calculate' | 'aggregate' | 'custom'; /** Função de transformação */ transform: string; /** Aplicar na exibição ou nos dados */ applyTo: 'display' | 'data' | 'both'; } interface PollingConfig { /** Habilitar polling */ enabled: boolean; /** Intervalo de polling (ms) */ interval: number; /** Polling apenas quando ativo */ onlyWhenActive: boolean; /** Backoff exponencial em caso de erro */ exponentialBackoff: boolean; } interface ThemeConfig { /** Tema principal */ primary?: string; /** Tema secundário */ secondary?: string; /** Modo escuro */ darkMode?: boolean; /** Tema customizado */ custom?: { [property: string]: string; }; /** Variáveis CSS personalizadas */ cssVariables?: { [variable: string]: string; }; } interface PerformanceConfig { /** Configurações de virtualização */ virtualization?: VirtualizationConfig; /** Configurações de debounce */ debounce?: DebounceConfig; /** Configurações de memória */ memory?: MemoryConfig; /** Otimizações de renderização */ rendering?: RenderingConfig; /** Lazy loading de recursos */ lazyLoading?: LazyLoadingConfig; } interface DebounceConfig { /** Debounce para busca (ms) */ search: number; /** Debounce para filtros (ms) */ filter: number; /** Debounce para redimensionamento (ms) */ resize: number; /** Debounce para scroll (ms) */ scroll: number; } interface MemoryConfig { /** Máximo de linhas em memória */ maxRows: number; /** Limpeza automática */ autoCleanup: boolean; /** Intervalo de limpeza (ms) */ cleanupInterval: number; } interface RenderingConfig { /** Usar requestAnimationFrame */ useRAF: boolean; /** Batch de updates */ batchUpdates: boolean; /** Tamanho do batch */ batchSize: number; /** Otimizar re-renders */ optimizeReRenders: boolean; } interface LazyLoadingConfig { /** Lazy loading de imagens */ images: boolean; /** Lazy loading de componentes */ components: boolean; /** Distância para carregar (px) */ threshold: number; } interface PluginConfig { /** ID único do plugin */ id: string; /** Nome do plugin */ name: string; /** Versão do plugin */ version: string; /** Plugin habilitado */ enabled: boolean; /** Configurações específicas do plugin */ settings?: any; /** Hooks do plugin */ hooks?: { [eventName: string]: string; }; } interface AccessibilityConfig { /** Habilitar recursos de acessibilidade */ enabled: boolean; /** Anúncios para screen readers */ announcements?: AnnouncementConfig; /** Navegação por teclado */ keyboard?: KeyboardAccessibilityConfig; /** Contraste alto */ highContrast?: boolean; /** Reduzir movimento */ reduceMotion?: boolean; /** Labels ARIA personalizados */ ariaLabels?: { [key: string]: string; }; } interface AnnouncementConfig { /** Anunciar mudanças de dados */ dataChanges: boolean; /** Anunciar ações do usuário */ userActions: boolean; /** Anunciar estados de carregamento */ loadingStates: boolean; /** Região live para anúncios */ liveRegion: 'polite' | 'assertive'; } interface KeyboardAccessibilityConfig { /** Navegação com Tab */ tabNavigation: boolean; /** Navegação com setas */ arrowNavigation: boolean; /** Atalhos de teclado */ shortcuts: boolean; /** Skip links */ skipLinks: boolean; /** Focus trap em modais */ focusTrap: boolean; } /** * Configuração principal da tabela - Nova arquitetura v2.0 * Estrutura modular alinhada com as 5 abas do editor * Preparada para crescimento exponencial */ interface TableConfigV2 { /** Metadados da configuração */ meta?: ConfigMetadata; /** Definições de colunas */ columns: ColumnDefinition[]; /** Comportamento geral da tabela (Aba: Visão Geral & Comportamento) */ behavior?: TableBehaviorConfig; /** Configurações de aparência e layout (Aba: Visão Geral & Comportamento) */ appearance?: TableAppearanceConfig; /** Barra de ferramentas (Aba: Barra de Ferramentas & Ações) */ toolbar?: ToolbarConfig; /** Ações por linha e em lote (Aba: Barra de Ferramentas & Ações) */ actions?: TableActionsConfig; /** Configurações de exportação (Aba: Barra de Ferramentas & Ações) */ export?: ExportConfig; /** Mensagens personalizadas (Aba: Mensagens & Localização) */ messages?: MessagesConfig; /** Localização e i18n (Aba: Mensagens & Localização) */ localization?: LocalizationConfig; /** Configurações avançadas de dados */ data?: DataConfig; /** Temas e customização visual */ theme?: ThemeConfig; /** Configurações de performance */ performance?: PerformanceConfig; /** Plugins e extensões */ plugins?: PluginConfig[]; /** Configurações de acessibilidade */ accessibility?: AccessibilityConfig; /** * Regras de estilo condicionais aplicadas à linha inteira (escopo global) */ rowConditionalStyles?: Array<{ condition: string; cssClass?: string; style?: { [key: string]: string; }; description?: string; }>; /** Estado serializado do construtor para regras de linha (round‑trip) */ _rowStyleRulesState?: any; } /** * Type guard to check if config is V2 */ declare function isTableConfigV2(config: any): config is TableConfigV2; type TableConfig = TableConfigV2; /** * Cria uma configuração padrão para TableConfig */ declare function createDefaultTableConfig(): TableConfig; /** * Valida se uma configuração TableConfig é válida */ declare function isValidTableConfig(config: any): config is TableConfig; /** * Clona profundamente uma configuração TableConfig */ declare function cloneTableConfig(config: TableConfig): TableConfig; /** * Merge duas configurações TableConfig, priorizando a segunda */ declare function mergeTableConfigs(base: TableConfig, override: Partial<TableConfig>): TableConfig; /** * Extrai apenas as configurações essenciais para compatibilidade */ declare function getEssentialConfig(config: TableConfig): Partial<TableConfig>; /** * @deprecated Use TableConfig instead */ type LegacyTableConfig = TableConfig; /** * @deprecated Use createDefaultTableConfig instead */ declare const DEFAULT_TABLE_CONFIG: TableConfigV2; type GlobalDi